Ignore:
Timestamp:
Nov 19, 2006 2:59:13 PM (14 years ago)
Author:
bennylp
Message:

Fixes for S60 3rd edition:

  • it seems there is a problem with sending UDP packet inside connected UDP socket. This (still) causes pjlib-test to fail. No workaround yet.
  • fixed bug in Symbian's ioqueue when data is immediately available.
  • UDP connect()/getsockname() doesn't return the correct interface IP address, causing pj_gethostip() to fail, and subsequently SIP transport's name determination to fail. Because of this, for now SIP transport's name must be initialized properly (see sipstateless.c)
File:
1 edited

Legend:

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

    r789 r806  
    115115    pj_ioqueue_key_t            *key_; 
    116116    CPjSocket                   *sock_; 
    117     const pj_ioqueue_callback   *cb_; 
     117    pj_ioqueue_callback          cb_; 
    118118    void                        *user_data_; 
    119119 
     
    156156                     const pj_ioqueue_callback *cb, void *user_data) 
    157157    : CActive(CActive::EPriorityStandard), 
    158           ioqueue_(ioqueue), key_(key), sock_((CPjSocket*)sock), cb_(cb),  
     158          ioqueue_(ioqueue), key_(key), sock_((CPjSocket*)sock),  
    159159          user_data_(user_data), aBufferPtr_(NULL, 0), type_(TYPE_NONE) 
    160160    { 
     161        pj_memcpy(&cb_, cb, sizeof(*cb)); 
    161162    } 
    162163 
     
    166167        CActiveScheduler::Add(this); 
    167168    } 
     169     
     170    void HandleReadCompletion(); 
     171    CPjSocket *HandleAcceptCompletion(); 
    168172}; 
    169173 
     
    217221        return PJ_EPENDING; 
    218222    } else { 
    219         return PJ_RETURN_OS_ERROR(iStatus.Int()); 
     223        // Complete immediately (with success or error) 
     224        if (iStatus == KErrNone) { 
     225            *size = aBufferPtr_.Length(); 
     226            HandleReadCompletion(); 
     227            return PJ_SUCCESS; 
     228        } 
     229        else { 
     230            pending_data_.read_.op_key_ = NULL; 
     231            pending_data_.read_.addr_ = NULL; 
     232            pending_data_.read_.addrlen_ = NULL; 
     233            return PJ_RETURN_OS_ERROR(iStatus.Int()); 
     234        } 
    220235    } 
    221236} 
     
    250265        return PJ_EPENDING; 
    251266    } else { 
    252         return PJ_RETURN_OS_ERROR(iStatus.Int()); 
    253     } 
     267        // Accept() completed immediately (with success or error). 
     268        if (iStatus == KErrNone) { 
     269            HandleAcceptCompletion(); 
     270            return PJ_SUCCESS; 
     271        } 
     272        else { 
     273            pending_data_.accept_.op_key_ = NULL; 
     274            pending_data_.accept_.new_sock_ = NULL; 
     275            pending_data_.accept_.local_ = NULL; 
     276            pending_data_.accept_.remote_ = NULL; 
     277            pending_data_.accept_.addrlen_ = NULL; 
     278            return PJ_RETURN_OS_ERROR(iStatus.Int()); 
     279        } 
     280    } 
     281} 
     282 
     283 
     284// 
     285// Handle asynchronous RecvFrom() completion 
     286// 
     287void CIoqueueCallback::HandleReadCompletion()  
     288{ 
     289        if (pending_data_.read_.addr_) { 
     290            PjSymbianOS::Addr2pj(aAddress_,  
     291                                 *(pj_sockaddr_in*)pending_data_.read_.addr_); 
     292            pending_data_.read_.addr_ = NULL; 
     293        } 
     294        if (pending_data_.read_.addrlen_) { 
     295            *pending_data_.read_.addrlen_ = sizeof(pj_sockaddr_in); 
     296            pending_data_.read_.addrlen_ = NULL; 
     297        } 
     298         
     299        pending_data_.read_.op_key_ = NULL; 
     300} 
     301 
     302 
     303// 
     304// Handle asynchronous Accept() completion. 
     305// 
     306CPjSocket *CIoqueueCallback::HandleAcceptCompletion()  
     307{ 
     308        CPjSocket *pjNewSock = new CPjSocket(blank_sock_); 
     309 
     310        if (pending_data_.accept_.new_sock_) { 
     311            *pending_data_.accept_.new_sock_ = (pj_sock_t)pjNewSock; 
     312            pending_data_.accept_.new_sock_ = NULL; 
     313        } 
     314 
     315        if (pending_data_.accept_.local_) { 
     316            TInetAddr aAddr; 
     317            pj_sockaddr_in *ptr_sockaddr; 
     318 
     319            blank_sock_.LocalName(aAddr); 
     320            ptr_sockaddr = (pj_sockaddr_in*)pending_data_.accept_.local_; 
     321            PjSymbianOS::Addr2pj(aAddr, *ptr_sockaddr); 
     322            pending_data_.accept_.local_ = NULL; 
     323        } 
     324 
     325        if (pending_data_.accept_.remote_) { 
     326            TInetAddr aAddr; 
     327            pj_sockaddr_in *ptr_sockaddr; 
     328 
     329            blank_sock_.RemoteName(aAddr); 
     330            ptr_sockaddr = (pj_sockaddr_in*)pending_data_.accept_.remote_; 
     331            PjSymbianOS::Addr2pj(aAddr, *ptr_sockaddr); 
     332            pending_data_.accept_.remote_ = NULL; 
     333        } 
     334 
     335        if (pending_data_.accept_.addrlen_) { 
     336            *pending_data_.accept_.addrlen_ = sizeof(pj_sockaddr_in); 
     337            pending_data_.accept_.addrlen_ = NULL; 
     338        } 
     339         
     340        return pjNewSock; 
    254341} 
    255342 
     
    275362        // Handle failure condition 
    276363        if (iStatus != KErrNone) { 
    277             cb_->on_read_complete(key_, op_key,  
    278                                   -PJ_RETURN_OS_ERROR(iStatus.Int())); 
     364            if (cb_.on_read_complete) { 
     365                cb_.on_read_complete( key_, op_key,  
     366                                      -PJ_RETURN_OS_ERROR(iStatus.Int())); 
     367            } 
    279368            return; 
    280369        } 
    281370 
    282         if (pending_data_.read_.addr_) { 
    283             PjSymbianOS::Addr2pj(aAddress_,  
    284                                  *(pj_sockaddr_in*)pending_data_.read_.addr_); 
    285             pending_data_.read_.addr_ = NULL; 
    286         } 
    287         if (pending_data_.read_.addrlen_) { 
    288             *pending_data_.read_.addrlen_ = sizeof(pj_sockaddr_in); 
    289             pending_data_.read_.addrlen_ = NULL; 
    290         } 
     371        HandleReadCompletion(); 
    291372 
    292373        /* Call callback */ 
    293         cb_->on_read_complete(key_, op_key, aBufferPtr_.Length()); 
     374        if (cb_.on_read_complete) { 
     375            cb_.on_read_complete(key_, op_key, aBufferPtr_.Length()); 
     376        } 
    294377 
    295378    } else if (cur_type == TYPE_ACCEPT) { 
     
    306389            if (pending_data_.accept_.new_sock_) 
    307390                *pending_data_.accept_.new_sock_ = PJ_INVALID_SOCKET; 
    308  
    309             cb_->on_accept_complete(key_, op_key, PJ_INVALID_SOCKET, 
    310                                     -PJ_RETURN_OS_ERROR(iStatus.Int())); 
     391             
     392            if (cb_.on_accept_complete) { 
     393                cb_.on_accept_complete( key_, op_key, PJ_INVALID_SOCKET, 
     394                                        -PJ_RETURN_OS_ERROR(iStatus.Int())); 
     395            } 
    311396            return; 
    312397        } 
    313398 
    314         CPjSocket *pjNewSock = new CPjSocket(blank_sock_); 
    315  
    316         if (pending_data_.accept_.new_sock_) { 
    317             *pending_data_.accept_.new_sock_ = (pj_sock_t)pjNewSock; 
    318             pending_data_.accept_.new_sock_ = NULL; 
    319         } 
    320  
    321         if (pending_data_.accept_.local_) { 
    322             TInetAddr aAddr; 
    323             pj_sockaddr_in *ptr_sockaddr; 
    324  
    325             blank_sock_.LocalName(aAddr); 
    326             ptr_sockaddr = (pj_sockaddr_in*)pending_data_.accept_.local_; 
    327             PjSymbianOS::Addr2pj(aAddr, *ptr_sockaddr); 
    328             pending_data_.accept_.local_ = NULL; 
    329         } 
    330  
    331         if (pending_data_.accept_.remote_) { 
    332             TInetAddr aAddr; 
    333             pj_sockaddr_in *ptr_sockaddr; 
    334  
    335             blank_sock_.RemoteName(aAddr); 
    336             ptr_sockaddr = (pj_sockaddr_in*)pending_data_.accept_.remote_; 
    337             PjSymbianOS::Addr2pj(aAddr, *ptr_sockaddr); 
    338             pending_data_.accept_.remote_ = NULL; 
    339         } 
    340  
    341         if (pending_data_.accept_.addrlen_) { 
    342             *pending_data_.accept_.addrlen_ = sizeof(pj_sockaddr_in); 
    343             pending_data_.accept_.addrlen_ = NULL; 
    344         } 
    345  
     399        CPjSocket *pjNewSock = HandleAcceptCompletion(); 
     400         
    346401        // Call callback. 
    347         cb_->on_accept_complete(key_, op_key, (pj_sock_t)pjNewSock,  
    348                                 PJ_SUCCESS); 
     402        if (cb_.on_accept_complete) { 
     403            cb_.on_accept_complete( key_, op_key, (pj_sock_t)pjNewSock,  
     404                                    PJ_SUCCESS); 
     405        } 
    349406    } 
    350407 
     
    375432    Cancel(); 
    376433 
    377     if (cur_type == TYPE_READ) 
    378         cb_->on_read_complete(key_, op_key, bytes_status); 
    379     else if (cur_type == TYPE_ACCEPT) 
     434    if (cur_type == TYPE_READ) { 
     435        if (cb_.on_read_complete) 
     436            cb_.on_read_complete(key_, op_key, bytes_status); 
     437    } else if (cur_type == TYPE_ACCEPT) 
    380438        ; 
    381439} 
Note: See TracChangeset for help on using the changeset viewer.