Ignore:
Timestamp:
Dec 1, 2007 8:52:57 AM (16 years ago)
Author:
bennylp
Message:

More ticket #415: more IPv6 and some reorganization of the source codes

File:
1 edited

Legend:

Unmodified
Added
Removed
  • pjproject/trunk/pjlib/src/pj/ioqueue_symbian.cpp

    r1384 r1601  
    233233    PJ_ASSERT_RETURN(pending_data_.common_.op_key_==NULL, PJ_EBUSY); 
    234234 
     235    // addrlen must be specified if local or remote is specified 
     236    PJ_ASSERT_RETURN((!local && !remote) || 
     237                     (addrlen && *addrlen), PJ_EINVAL); 
     238     
    235239    pending_data_.accept_.op_key_ = op_key; 
    236240    pending_data_.accept_.new_sock_ = new_sock; 
     
    255259void CIoqueueCallback::HandleReadCompletion()  
    256260{ 
    257     if (pending_data_.read_.addr_) { 
     261    if (pending_data_.read_.addr_ && pending_data_.read_.addrlen_) { 
    258262        PjSymbianOS::Addr2pj(aAddress_,  
    259                              *(pj_sockaddr_in*)pending_data_.read_.addr_); 
     263                             *(pj_sockaddr*)pending_data_.read_.addr_, 
     264                             pending_data_.read_.addrlen_); 
    260265        pending_data_.read_.addr_ = NULL; 
    261     } 
    262     if (pending_data_.read_.addrlen_) { 
    263         *pending_data_.read_.addrlen_ = sizeof(pj_sockaddr_in); 
    264266        pending_data_.read_.addrlen_ = NULL; 
    265267    } 
     
    274276CPjSocket *CIoqueueCallback::HandleAcceptCompletion()  
    275277{ 
    276         CPjSocket *pjNewSock = new CPjSocket(blank_sock_); 
    277  
     278        CPjSocket *pjNewSock = new CPjSocket(get_pj_socket()->GetAf(),  
     279                                             blank_sock_); 
     280        int addrlen = 0; 
     281         
    278282        if (pending_data_.accept_.new_sock_) { 
    279283            *pending_data_.accept_.new_sock_ = (pj_sock_t)pjNewSock; 
     
    283287        if (pending_data_.accept_.local_) { 
    284288            TInetAddr aAddr; 
    285             pj_sockaddr_in *ptr_sockaddr; 
    286  
     289            pj_sockaddr *ptr_sockaddr; 
     290             
    287291            blank_sock_.LocalName(aAddr); 
    288             ptr_sockaddr = (pj_sockaddr_in*)pending_data_.accept_.local_; 
    289             PjSymbianOS::Addr2pj(aAddr, *ptr_sockaddr); 
     292            ptr_sockaddr = (pj_sockaddr*)pending_data_.accept_.local_; 
     293            addrlen = *pending_data_.accept_.addrlen_; 
     294            PjSymbianOS::Addr2pj(aAddr, *ptr_sockaddr, &addrlen); 
    290295            pending_data_.accept_.local_ = NULL; 
    291296        } 
     
    293298        if (pending_data_.accept_.remote_) { 
    294299            TInetAddr aAddr; 
    295             pj_sockaddr_in *ptr_sockaddr; 
     300            pj_sockaddr *ptr_sockaddr; 
    296301 
    297302            blank_sock_.RemoteName(aAddr); 
    298             ptr_sockaddr = (pj_sockaddr_in*)pending_data_.accept_.remote_; 
    299             PjSymbianOS::Addr2pj(aAddr, *ptr_sockaddr); 
     303            ptr_sockaddr = (pj_sockaddr*)pending_data_.accept_.remote_; 
     304            addrlen = *pending_data_.accept_.addrlen_; 
     305            PjSymbianOS::Addr2pj(aAddr, *ptr_sockaddr, &addrlen); 
    300306            pending_data_.accept_.remote_ = NULL; 
    301307        } 
    302308 
    303309        if (pending_data_.accept_.addrlen_) { 
    304             *pending_data_.accept_.addrlen_ = sizeof(pj_sockaddr_in); 
     310            if (addrlen == 0) { 
     311                if (pjNewSock->GetAf() == PJ_AF_INET) 
     312                    addrlen = sizeof(pj_sockaddr_in); 
     313                else if (pjNewSock->GetAf() == PJ_AF_INET6) 
     314                    addrlen = sizeof(pj_sockaddr_in6); 
     315                else { 
     316                    pj_assert(!"Unsupported address family"); 
     317                } 
     318            } 
     319            *pending_data_.accept_.addrlen_ = addrlen; 
    305320            pending_data_.accept_.addrlen_ = NULL; 
    306321        } 
     
    606621                                        int addrlen ) 
    607622{ 
    608     PJ_ASSERT_RETURN(addrlen == sizeof(pj_sockaddr_in), PJ_EINVAL); 
    609  
     623    pj_status_t status; 
     624     
    610625    RSocket &rSock = key->cbObj->get_pj_socket()->Socket(); 
    611626    TInetAddr inetAddr; 
    612     PjSymbianOS::pj2Addr(*(const pj_sockaddr_in*)addr, inetAddr); 
    613627    TRequestStatus reqStatus; 
    614628 
     629    // Convert address 
     630    status = PjSymbianOS::pj2Addr(*(const pj_sockaddr*)addr, addrlen,  
     631                                  inetAddr); 
     632    if (status != PJ_SUCCESS) 
     633        return status; 
     634     
    615635    // We don't support async connect for now. 
    616636    PJ_TODO(IOQUEUE_SUPPORT_ASYNC_CONNECT); 
     
    675695                                         int *addrlen) 
    676696{ 
     697    CPjSocket *sock = key->cbObj->get_pj_socket(); 
     698     
     699    // If address is specified, check that the length match the 
     700    // address family 
     701    if (addr || addrlen) { 
     702        PJ_ASSERT_RETURN(addr && addrlen && *addrlen, PJ_EINVAL); 
     703        if (sock->GetAf() == PJ_AF_INET) { 
     704            PJ_ASSERT_RETURN(*addrlen >= sizeof(pj_sockaddr_in), PJ_EINVAL); 
     705        } else if (sock->GetAf() == PJ_AF_INET6) { 
     706            PJ_ASSERT_RETURN(*addrlen >= sizeof(pj_sockaddr_in6), PJ_EINVAL); 
     707        } 
     708    } 
     709     
    677710    // If socket has reader, delete it. 
    678     if (key->cbObj->get_pj_socket()->Reader()) 
    679         key->cbObj->get_pj_socket()->DestroyReader(); 
     711    if (sock->Reader()) 
     712        sock->DestroyReader(); 
    680713     
    681714    if (key->cbObj->IsActive()) 
     
    737770    TInetAddr inetAddr; 
    738771    TSockXfrLength aLen; 
     772    pj_status_t status; 
    739773     
    740774    PJ_UNUSED_ARG(op_key); 
     
    743777    PJ_ASSERT_RETURN((flags & PJ_IOQUEUE_ALWAYS_ASYNC)==0, PJ_EINVAL); 
    744778 
    745     // Must be pj_sockaddr_in for now. 
    746     PJ_ASSERT_RETURN(addrlen == sizeof(pj_sockaddr_in), PJ_EINVAL); 
    747  
     779    // Convert address 
     780    status = PjSymbianOS::pj2Addr(*(const pj_sockaddr*)addr, addrlen,  
     781                                  inetAddr); 
     782    if (status != PJ_SUCCESS) 
     783        return status; 
     784     
    748785    // Clear flag 
    749786    flags &= ~PJ_IOQUEUE_ALWAYS_ASYNC; 
    750787 
    751788    aBuffer.Set((const TUint8*)data, (TInt)*length); 
    752     PjSymbianOS::pj2Addr(*(const pj_sockaddr_in*)addr, inetAddr); 
    753789    CPjSocket *pjSock = key->cbObj->get_pj_socket(); 
    754790 
Note: See TracChangeset for help on using the changeset viewer.