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/build.symbian/pjlibU.def b/build.symbian/pjlibU.def
index 40d0a32..30365a4 100644
--- a/build.symbian/pjlibU.def
+++ b/build.symbian/pjlibU.def
@@ -260,37 +260,38 @@
 	pj_strtoul2                              @ 259 NONAME
 	pj_strtrim                               @ 260 NONAME
 	pj_symbianos_poll                        @ 261 NONAME
-	pj_thread_create                         @ 262 NONAME
-	pj_thread_destroy                        @ 263 NONAME
-	pj_thread_get_name                       @ 264 NONAME
-	pj_thread_join                           @ 265 NONAME
-	pj_thread_local_alloc                    @ 266 NONAME
-	pj_thread_local_free                     @ 267 NONAME
-	pj_thread_local_get                      @ 268 NONAME
-	pj_thread_local_set                      @ 269 NONAME
-	pj_thread_register                       @ 270 NONAME
-	pj_thread_resume                         @ 271 NONAME
-	pj_thread_sleep                          @ 272 NONAME
-	pj_thread_this                           @ 273 NONAME
-	pj_time_decode                           @ 274 NONAME
-	pj_time_encode                           @ 275 NONAME
-	pj_time_gmt_to_local                     @ 276 NONAME
-	pj_time_local_to_gmt                     @ 277 NONAME
-	pj_time_val_normalize                    @ 278 NONAME
-	pj_timer_entry_init                      @ 279 NONAME
-	pj_timer_heap_cancel                     @ 280 NONAME
-	pj_timer_heap_count                      @ 281 NONAME
-	pj_timer_heap_create                     @ 282 NONAME
-	pj_timer_heap_destroy                    @ 283 NONAME
-	pj_timer_heap_earliest_time              @ 284 NONAME
-	pj_timer_heap_mem_size                   @ 285 NONAME
-	pj_timer_heap_poll                       @ 286 NONAME
-	pj_timer_heap_schedule                   @ 287 NONAME
-	pj_timer_heap_set_lock                   @ 288 NONAME
-	pj_timer_heap_set_max_timed_out_per_poll @ 289 NONAME
-	pj_unicode_to_ansi                       @ 290 NONAME
-	pj_utoa                                  @ 291 NONAME
-	pj_utoa_pad                              @ 292 NONAME
-	platform_strerror                        @ 293 NONAME
-	snprintf                                 @ 294 NONAME
-	vsnprintf                                @ 295 NONAME
+	pj_symbianos_set_params                  @ 262 NONAME
+	pj_thread_create                         @ 263 NONAME
+	pj_thread_destroy                        @ 264 NONAME
+	pj_thread_get_name                       @ 265 NONAME
+	pj_thread_join                           @ 266 NONAME
+	pj_thread_local_alloc                    @ 267 NONAME
+	pj_thread_local_free                     @ 268 NONAME
+	pj_thread_local_get                      @ 269 NONAME
+	pj_thread_local_set                      @ 270 NONAME
+	pj_thread_register                       @ 271 NONAME
+	pj_thread_resume                         @ 272 NONAME
+	pj_thread_sleep                          @ 273 NONAME
+	pj_thread_this                           @ 274 NONAME
+	pj_time_decode                           @ 275 NONAME
+	pj_time_encode                           @ 276 NONAME
+	pj_time_gmt_to_local                     @ 277 NONAME
+	pj_time_local_to_gmt                     @ 278 NONAME
+	pj_time_val_normalize                    @ 279 NONAME
+	pj_timer_entry_init                      @ 280 NONAME
+	pj_timer_heap_cancel                     @ 281 NONAME
+	pj_timer_heap_count                      @ 282 NONAME
+	pj_timer_heap_create                     @ 283 NONAME
+	pj_timer_heap_destroy                    @ 284 NONAME
+	pj_timer_heap_earliest_time              @ 285 NONAME
+	pj_timer_heap_mem_size                   @ 286 NONAME
+	pj_timer_heap_poll                       @ 287 NONAME
+	pj_timer_heap_schedule                   @ 288 NONAME
+	pj_timer_heap_set_lock                   @ 289 NONAME
+	pj_timer_heap_set_max_timed_out_per_poll @ 290 NONAME
+	pj_unicode_to_ansi                       @ 291 NONAME
+	pj_utoa                                  @ 292 NONAME
+	pj_utoa_pad                              @ 293 NONAME
+	platform_strerror                        @ 294 NONAME
+	snprintf                                 @ 295 NONAME
+	vsnprintf                                @ 296 NONAME
diff --git a/build.symbian/pjproject.cww b/build.symbian/pjproject.cww
index f5b7eea..6d2fd3e 100644
--- a/build.symbian/pjproject.cww
+++ b/build.symbian/pjproject.cww
@@ -312,17 +312,68 @@
         </DOCKINFO>

     </WINDOW>

     <WINDOW>

-        <SESSION>-1</SESSION>

-        <EDOCTYPE>1</EDOCTYPE>

-        <PATH USERELATIVEPATHS = "true">..\pjsip-apps\src\symbian_ua\ua.cpp</PATH>

+        <SESSION>-2147483648</SESSION>

+        <EDOCTYPE>20</EDOCTYPE>

+        <DEFAULT>true</DEFAULT>

         <MAXIMIZED>true</MAXIMIZED>

         <FRAMELOC>

             <X>4</X>

-            <Y>4</Y>

+            <Y>23</Y>

         </FRAMELOC>

         <FRAMESIZE>

-            <W>557</W>

-            <H>627</H>

+            <W>1464</W>

+            <H>3681</H>

+        </FRAMESIZE>

+        <DOCKINFO>

+            <STATUS>0</STATUS>

+            <ROW></ROW>

+            <COLUMN></COLUMN>

+            <DOCKBARID></DOCKBARID>

+            <PCTWIDTH></PCTWIDTH>

+            <HGT></HGT>

+            <GROUPID>

+                <GIDHIGHPART></GIDHIGHPART>

+                <GIDLOWPART></GIDLOWPART>

+            </GROUPID>

+        </DOCKINFO>

+    </WINDOW>

+    <WINDOW>

+        <SESSION>-2147483648</SESSION>

+        <EDOCTYPE>36</EDOCTYPE>

+        <DEFAULT>true</DEFAULT>

+        <FRAMELOC>

+            <X>4</X>

+            <Y>23</Y>

+        </FRAMELOC>

+        <FRAMESIZE>

+            <W>366</W>

+            <H>354</H>

+        </FRAMESIZE>

+        <DOCKINFO>

+            <STATUS>0</STATUS>

+            <ROW></ROW>

+            <COLUMN></COLUMN>

+            <DOCKBARID></DOCKBARID>

+            <PCTWIDTH></PCTWIDTH>

+            <HGT></HGT>

+            <GROUPID>

+                <GIDHIGHPART></GIDHIGHPART>

+                <GIDLOWPART></GIDLOWPART>

+            </GROUPID>

+        </DOCKINFO>

+    </WINDOW>

+    <WINDOW>

+        <SESSION>-2147483648</SESSION>

+        <EDOCTYPE>23</EDOCTYPE>

+        <DEFAULT>true</DEFAULT>

+        <MAXIMIZED>true</MAXIMIZED>

+        <FRAMELOC>

+            <X>6</X>

+            <Y>81</Y>

+        </FRAMELOC>

+        <FRAMESIZE>

+            <W>566</W>

+            <H>477</H>

         </FRAMESIZE>

         <DOCKINFO>

             <STATUS>0</STATUS>

diff --git a/pjlib/include/pj/os.h b/pjlib/include/pj/os.h
index 10cc552..3529c46 100644
--- a/pjlib/include/pj/os.h
+++ b/pjlib/include/pj/os.h
@@ -293,6 +293,48 @@
  */
 PJ_DECL(pj_bool_t) pj_symbianos_poll(int priority, int ms_timeout);
 
+
+/**
+ * This structure declares Symbian OS specific parameters that can be
+ * specified when calling #pj_symbianos_set_params().
+ */
+typedef struct pj_symbianos_params 
+{
+    /**
+     * Optional RSocketServ instance to be used by PJLIB. If this
+     * value is NULL, PJLIB will create a new RSocketServ instance
+     * when pj_init() is called.
+     */
+    void	*rsocketserv;
+    
+    /**
+     * Optional RConnection instance to be used by PJLIB when creating
+     * sockets. If this value is NULL, no RConnection will be
+     * specified when creating sockets.
+     */
+    void	*rconnection;
+    
+    /**
+     * Optional RHostResolver instance to be used by PJLIB. If this value
+     * is NULL, a new RHostResolver instance will be created when
+     * pj_init() is called.
+     */
+    void 	*rhostresolver;
+     
+} pj_symbianos_params;
+
+/**
+ * Specify Symbian OS parameters to be used by PJLIB. This function MUST
+ * be called before #pj_init() is called.
+ *
+ * @param prm		Symbian specific parameters.
+ *
+ * @return		PJ_SUCCESS if the parameters can be applied
+ *			successfully.
+ */
+PJ_DECL(pj_status_t) pj_symbianos_set_params(pj_symbianos_params *prm);
+
+
 /**
  * @}
  */
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);