summaryrefslogtreecommitdiff
path: root/pjlib/src/pj/os_symbian.h
diff options
context:
space:
mode:
authorBenny Prijono <bennylp@teluu.com>2007-12-01 08:52:57 +0000
committerBenny Prijono <bennylp@teluu.com>2007-12-01 08:52:57 +0000
commit2e6a62f43b622320d69971cfc07a68ab59e29f1b (patch)
treee123dbdeb138f64618e9c5bba112798becec5547 /pjlib/src/pj/os_symbian.h
parent4ee49ed9e7fda6b2150c400cbe5a10dda99867db (diff)
More ticket #415: more IPv6 and some reorganization of the source codes
git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@1601 74dad513-b988-da41-8d7b-12977e46ad98
Diffstat (limited to 'pjlib/src/pj/os_symbian.h')
-rw-r--r--pjlib/src/pj/os_symbian.h79
1 files changed, 64 insertions, 15 deletions
diff --git a/pjlib/src/pj/os_symbian.h b/pjlib/src/pj/os_symbian.h
index 2b14ecd6..f564075f 100644
--- a/pjlib/src/pj/os_symbian.h
+++ b/pjlib/src/pj/os_symbian.h
@@ -19,6 +19,8 @@
#ifndef __OS_SYMBIAN_H__
#define __OS_SYMBIAN_H__
+#include <pj/assert.h>
+#include <pj/errno.h>
#include <pj/sock.h>
#include <pj/os.h>
#include <pj/string.h>
@@ -51,14 +53,20 @@ public:
};
// Construct CPjSocket
- CPjSocket(RSocket &sock)
- : sock_(sock), connected_(false), sockReader_(NULL)
+ CPjSocket(int af, RSocket &sock)
+ : af_(af), sock_(sock), connected_(false), sockReader_(NULL)
{
}
// Destroy CPjSocket
~CPjSocket();
+ // Get address family
+ int GetAf() const
+ {
+ return af_;
+ }
+
// Get the internal RSocket
RSocket& Socket()
{
@@ -91,6 +99,7 @@ public:
void DestroyReader();
private:
+ int af_;
RSocket sock_; // Must not be reference, or otherwise
// it may point to local variable!
bool connected_;
@@ -228,23 +237,57 @@ public:
}
// Convert TInetAddr to pj_sockaddr_in
- static inline void Addr2pj(const TInetAddr & sym_addr,
- pj_sockaddr_in &pj_addr)
+ static inline pj_status_t Addr2pj(const TInetAddr & sym_addr,
+ pj_sockaddr &pj_addr,
+ int *addr_len)
{
- pj_bzero(&pj_addr, sizeof(pj_sockaddr_in));
- pj_addr.sin_family = pj_AF_INET();
- pj_addr.sin_addr.s_addr = pj_htonl(sym_addr.Address());
- pj_addr.sin_port = pj_htons((pj_uint16_t) sym_addr.Port());
+ pj_bzero(&pj_addr, sizeof(pj_sockaddr));
+ pj_addr.addr.sa_family = (pj_uint16_t)sym_addr.Family();
+ if (pj_addr.addr.sa_family == PJ_AF_INET) {
+ PJ_ASSERT_RETURN(*addr_len >= sizeof(pj_sockaddr_in), PJ_ETOOSMALL);
+ pj_addr.ipv4.sin_addr.s_addr = pj_htonl(sym_addr.Address());
+ pj_addr.ipv4.sin_port = pj_htons((pj_uint16_t) sym_addr.Port());
+ *addr_len = sizeof(pj_sockaddr_in);
+ } else if (pj_addr.addr.sa_family == PJ_AF_INET6) {
+ PJ_ASSERT_RETURN(*addr_len >= sizeof(pj_sockaddr_in6), PJ_ETOOSMALL);
+ const TIp6Addr & ip6 = sym_addr.Ip6Address();
+ pj_memcpy(&pj_addr.ipv6.sin6_addr, ip6.u.iAddr8, 16);
+ pj_addr.ipv6.sin6_port = pj_htons((pj_uint16_t) sym_addr.Port());
+ pj_addr.ipv6.sin6_scope_id = pj_htonl(sym_addr.Scope());
+ pj_addr.ipv6.sin6_flowinfo = pj_htonl(sym_addr.FlowLabel());
+ *addr_len = sizeof(pj_sockaddr_in6);
+ } else {
+ pj_assert(!"Unsupported address family");
+ return PJ_EAFNOTSUP;
+ }
+
+ return PJ_SUCCESS;
}
// Convert pj_sockaddr_in to TInetAddr
- static inline void pj2Addr(const pj_sockaddr_in &pj_addr,
- TInetAddr & sym_addr)
+ static inline pj_status_t pj2Addr(const pj_sockaddr &pj_addr,
+ int addrlen,
+ TInetAddr & sym_addr)
{
- sym_addr.Init(KAfInet);
- sym_addr.SetAddress((TUint32)pj_ntohl(pj_addr.sin_addr.s_addr));
- sym_addr.SetPort(pj_ntohs(pj_addr.sin_port));
+ if (pj_addr.addr.sa_family == PJ_AF_INET) {
+ PJ_ASSERT_RETURN(addrlen >= sizeof(pj_sockaddr_in), PJ_EINVAL);
+ sym_addr.Init(KAfInet);
+ sym_addr.SetAddress((TUint32)pj_ntohl(pj_addr.ipv4.sin_addr.s_addr));
+ sym_addr.SetPort(pj_ntohs(pj_addr.ipv4.sin_port));
+ } else if (pj_addr.addr.sa_family == PJ_AF_INET6) {
+ TIp6Addr ip6;
+
+ PJ_ASSERT_RETURN(addrlen >= sizeof(pj_sockaddr_in6), PJ_EINVAL);
+ pj_memcpy(ip6.u.iAddr8, &pj_addr.ipv6.sin6_addr, 16);
+ sym_addr.Init(KAfInet6);
+ sym_addr.SetAddress(ip6);
+ sym_addr.SetScope(pj_ntohl(pj_addr.ipv6.sin6_scope_id));
+ sym_addr.SetFlowLabel(pj_ntohl(pj_addr.ipv6.sin6_flowinfo));
+ } else {
+ pj_assert(!"Unsupported address family");
+ }
+ return PJ_SUCCESS;
}
@@ -253,9 +296,13 @@ public:
//
// Get RHostResolver instance
- RHostResolver & GetResolver()
+ RHostResolver & GetResolver(int af)
{
- return appHostResolver_ ? *appHostResolver_ : hostResolver_;
+ if (af==PJ_AF_INET6) {
+ return appHostResolver6_ ? *appHostResolver6_ : hostResolver6_;
+ } else {
+ return appHostResolver_ ? *appHostResolver_ : hostResolver_;
+ }
}
@@ -303,6 +350,7 @@ private:
bool isResolverInitialized_;
RHostResolver hostResolver_;
+ RHostResolver hostResolver6_;
CConsoleBase* console_;
@@ -312,6 +360,7 @@ private:
RSocketServ *appSocketServ_;
RConnection *appConnection_;
RHostResolver *appHostResolver_;
+ RHostResolver *appHostResolver6_;
private:
PjSymbianOS();