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/os_symbian.h

    r1525 r1601  
    2020#define __OS_SYMBIAN_H__ 
    2121 
     22#include <pj/assert.h> 
     23#include <pj/errno.h> 
    2224#include <pj/sock.h> 
    2325#include <pj/os.h> 
     
    5254 
    5355    // Construct CPjSocket 
    54     CPjSocket(RSocket &sock) 
    55         : sock_(sock), connected_(false), sockReader_(NULL) 
     56    CPjSocket(int af, RSocket &sock) 
     57        : af_(af), sock_(sock), connected_(false), sockReader_(NULL) 
    5658    {  
    5759    } 
     
    6062    ~CPjSocket(); 
    6163 
     64    // Get address family 
     65    int GetAf() const  
     66    { 
     67        return af_;      
     68    } 
     69     
    6270    // Get the internal RSocket 
    6371    RSocket& Socket() 
     
    92100     
    93101private: 
     102    int              af_; 
    94103    RSocket          sock_;         // Must not be reference, or otherwise 
    95104                                    // it may point to local variable! 
     
    229238     
    230239    // Convert TInetAddr to pj_sockaddr_in 
    231     static inline void Addr2pj(const TInetAddr & sym_addr, 
    232                                pj_sockaddr_in &pj_addr) 
    233     { 
    234         pj_bzero(&pj_addr, sizeof(pj_sockaddr_in)); 
    235         pj_addr.sin_family = pj_AF_INET(); 
    236         pj_addr.sin_addr.s_addr = pj_htonl(sym_addr.Address()); 
    237         pj_addr.sin_port = pj_htons((pj_uint16_t) sym_addr.Port()); 
     240    static inline pj_status_t Addr2pj(const TInetAddr & sym_addr, 
     241                                      pj_sockaddr &pj_addr, 
     242                                      int *addr_len) 
     243    { 
     244        pj_bzero(&pj_addr, sizeof(pj_sockaddr)); 
     245        pj_addr.addr.sa_family = (pj_uint16_t)sym_addr.Family(); 
     246        if (pj_addr.addr.sa_family == PJ_AF_INET) { 
     247            PJ_ASSERT_RETURN(*addr_len >= sizeof(pj_sockaddr_in), PJ_ETOOSMALL); 
     248            pj_addr.ipv4.sin_addr.s_addr = pj_htonl(sym_addr.Address()); 
     249            pj_addr.ipv4.sin_port = pj_htons((pj_uint16_t) sym_addr.Port()); 
     250            *addr_len = sizeof(pj_sockaddr_in); 
     251        } else if (pj_addr.addr.sa_family == PJ_AF_INET6) { 
     252            PJ_ASSERT_RETURN(*addr_len >= sizeof(pj_sockaddr_in6), PJ_ETOOSMALL); 
     253            const TIp6Addr & ip6 = sym_addr.Ip6Address(); 
     254            pj_memcpy(&pj_addr.ipv6.sin6_addr, ip6.u.iAddr8, 16); 
     255            pj_addr.ipv6.sin6_port = pj_htons((pj_uint16_t) sym_addr.Port()); 
     256            pj_addr.ipv6.sin6_scope_id = pj_htonl(sym_addr.Scope()); 
     257            pj_addr.ipv6.sin6_flowinfo = pj_htonl(sym_addr.FlowLabel()); 
     258            *addr_len = sizeof(pj_sockaddr_in6); 
     259        } else { 
     260            pj_assert(!"Unsupported address family"); 
     261            return PJ_EAFNOTSUP; 
     262        } 
     263         
     264        return PJ_SUCCESS; 
    238265    } 
    239266 
    240267 
    241268    // Convert pj_sockaddr_in to TInetAddr 
    242     static inline void pj2Addr(const pj_sockaddr_in &pj_addr, 
    243                                TInetAddr & sym_addr) 
    244     { 
    245         sym_addr.Init(KAfInet); 
    246         sym_addr.SetAddress((TUint32)pj_ntohl(pj_addr.sin_addr.s_addr)); 
    247         sym_addr.SetPort(pj_ntohs(pj_addr.sin_port)); 
     269    static inline pj_status_t pj2Addr(const pj_sockaddr &pj_addr, 
     270                                      int addrlen, 
     271                                      TInetAddr & sym_addr) 
     272    { 
     273        if (pj_addr.addr.sa_family == PJ_AF_INET) { 
     274            PJ_ASSERT_RETURN(addrlen >= sizeof(pj_sockaddr_in), PJ_EINVAL); 
     275            sym_addr.Init(KAfInet); 
     276            sym_addr.SetAddress((TUint32)pj_ntohl(pj_addr.ipv4.sin_addr.s_addr)); 
     277            sym_addr.SetPort(pj_ntohs(pj_addr.ipv4.sin_port)); 
     278        } else if (pj_addr.addr.sa_family == PJ_AF_INET6) { 
     279            TIp6Addr ip6; 
     280         
     281            PJ_ASSERT_RETURN(addrlen >= sizeof(pj_sockaddr_in6), PJ_EINVAL); 
     282            pj_memcpy(ip6.u.iAddr8, &pj_addr.ipv6.sin6_addr, 16); 
     283            sym_addr.Init(KAfInet6); 
     284            sym_addr.SetAddress(ip6); 
     285            sym_addr.SetScope(pj_ntohl(pj_addr.ipv6.sin6_scope_id)); 
     286            sym_addr.SetFlowLabel(pj_ntohl(pj_addr.ipv6.sin6_flowinfo)); 
     287        } else { 
     288            pj_assert(!"Unsupported address family"); 
     289        } 
     290        return PJ_SUCCESS; 
    248291    } 
    249292 
     
    254297 
    255298    // Get RHostResolver instance 
    256     RHostResolver & GetResolver() 
    257     { 
    258         return appHostResolver_ ? *appHostResolver_ : hostResolver_; 
     299    RHostResolver & GetResolver(int af) 
     300    { 
     301        if (af==PJ_AF_INET6) { 
     302            return appHostResolver6_ ? *appHostResolver6_ : hostResolver6_; 
     303        } else { 
     304            return appHostResolver_ ? *appHostResolver_ : hostResolver_; 
     305        } 
    259306    } 
    260307 
     
    304351    bool isResolverInitialized_; 
    305352    RHostResolver hostResolver_; 
     353    RHostResolver hostResolver6_; 
    306354 
    307355    CConsoleBase* console_; 
     
    313361    RConnection *appConnection_; 
    314362    RHostResolver *appHostResolver_; 
     363    RHostResolver *appHostResolver6_; 
    315364     
    316365private: 
Note: See TracChangeset for help on using the changeset viewer.