Ticket #403: Ability to specify RConnection instance etc in PJLIB Symbian

git-svn-id: https://svn.pjsip.org/repos/pjproject/trunk@1525 74dad513-b988-da41-8d7b-12977e46ad98
diff --git a/pjlib/src/pj/os_core_symbian.cpp b/pjlib/src/pj/os_core_symbian.cpp
index f13365a..8f96ce0 100644
--- a/pjlib/src/pj/os_core_symbian.cpp
+++ b/pjlib/src/pj/os_core_symbian.cpp
@@ -153,10 +153,19 @@
 
 PjSymbianOS::PjSymbianOS()
 : isSocketServInitialized_(false), isResolverInitialized_(false),
-  console_(NULL), selectTimeoutTimer_(NULL)
+  console_(NULL), selectTimeoutTimer_(NULL),
+  appSocketServ_(NULL), appConnection_(NULL), appHostResolver_(NULL)
 {
 }
 
+// Set parameters
+void PjSymbianOS::SetParameters(pj_symbianos_params *params) 
+{
+    appSocketServ_ = (RSocketServ*) params->rsocketserv;
+    appConnection_ = (RConnection*) params->rconnection;
+    appHostResolver_ = (RHostResolver*) params->rhostresolver;
+}
+
 // Get PjSymbianOS instance
 PjSymbianOS *PjSymbianOS::Instance()
 {
@@ -179,7 +188,10 @@
     return err;
 #endif
 
-    if (!isSocketServInitialized_) {
+    /* Only create RSocketServ if application doesn't specify it
+     * in the parameters
+     */
+    if (!isSocketServInitialized_ && appSocketServ_ == NULL) {
 	err = socketServ_.Connect();
 	if (err != KErrNone)
 	    goto on_error;
@@ -187,8 +199,13 @@
 	isSocketServInitialized_ = true;
     }
 
-    if (!isResolverInitialized_) {
-	err = hostResolver_.Open(SocketServ(), KAfInet, KSockStream);
+    if (!isResolverInitialized_ && appHostResolver_ == NULL) {
+    	if (Connection())
+    	    err = hostResolver_.Open(SocketServ(), KAfInet, KSockStream,
+    	    			     *Connection());
+    	else
+	    err = hostResolver_.Open(SocketServ(), KAfInet, KSockStream);
+    	
 	if (err != KErrNone)
 	    goto on_error;
 
@@ -260,6 +277,15 @@
 }
 
 
+/* Set Symbian specific parameters */
+PJ_DEF(pj_status_t) pj_symbianos_set_params(pj_symbianos_params *prm) 
+{
+    PJ_ASSERT_RETURN(prm != NULL, PJ_EINVAL);
+    PjSymbianOS::Instance()->SetParameters(prm);
+    return PJ_SUCCESS;
+}
+
+
 /*
  * pj_init(void).
  * Init PJLIB!
diff --git a/pjlib/src/pj/os_symbian.h b/pjlib/src/pj/os_symbian.h
index 5fabdc6..2b14ecd 100644
--- a/pjlib/src/pj/os_symbian.h
+++ b/pjlib/src/pj/os_symbian.h
@@ -20,6 +20,7 @@
 #define __OS_SYMBIAN_H__
 
 #include <pj/sock.h>
+#include <pj/os.h>
 #include <pj/string.h>
 
 #include <e32base.h>
@@ -195,6 +196,11 @@
     static PjSymbianOS *Instance();
 
     //
+    // Set parameters
+    //
+    void SetParameters(pj_symbianos_params *params);
+    
+    //
     // Initialize.
     //
     TInt Initialize();
@@ -212,9 +218,15 @@
     // Get RSocketServ instance to be used by all sockets.
     RSocketServ &SocketServ()
     {
-	return socketServ_;
+	return appSocketServ_ ? *appSocketServ_ : socketServ_;
     }
 
+    // Get RConnection instance, if any.
+    RConnection *Connection() 
+    {
+    	return appConnection_;
+    }
+    
     // Convert TInetAddr to pj_sockaddr_in
     static inline void Addr2pj(const TInetAddr & sym_addr,
 			       pj_sockaddr_in &pj_addr)
@@ -243,7 +255,7 @@
     // Get RHostResolver instance
     RHostResolver & GetResolver()
     {
-	return hostResolver_;
+	return appHostResolver_ ? *appHostResolver_ : hostResolver_;
     }
 
 
@@ -296,6 +308,11 @@
 
     CPjTimeoutTimer *selectTimeoutTimer_;
 
+    // App parameters
+    RSocketServ *appSocketServ_;
+    RConnection *appConnection_;
+    RHostResolver *appHostResolver_;
+    
 private:
     PjSymbianOS();
 };
diff --git a/pjlib/src/pj/sock_symbian.cpp b/pjlib/src/pj/sock_symbian.cpp
index 7c7680a..4a1da7b 100644
--- a/pjlib/src/pj/sock_symbian.cpp
+++ b/pjlib/src/pj/sock_symbian.cpp
@@ -474,7 +474,14 @@
 
     /* Create Symbian RSocket */
     RSocket rSock;
-    rc = rSock.Open(PjSymbianOS::Instance()->SocketServ(), af, type, proto);
+    if (PjSymbianOS::Instance()->Connection())
+    	rc = rSock.Open(PjSymbianOS::Instance()->SocketServ(), 
+    			af, type, proto,
+    			*PjSymbianOS::Instance()->Connection());
+    else
+    	rc = rSock.Open(PjSymbianOS::Instance()->SocketServ(), 
+    			af, type, proto);
+        
     if (rc != KErrNone)
 	return PJ_RETURN_OS_ERROR(rc);