genericopenlibs/openenvcore/backend/src/corebackend/localif.cpp
branchRCL_3
changeset 64 c44f36bb61a3
parent 57 2efc27d87e1c
child 75 254b651f304e
--- a/genericopenlibs/openenvcore/backend/src/corebackend/localif.cpp	Wed Sep 15 00:31:55 2010 +0300
+++ b/genericopenlibs/openenvcore/backend/src/corebackend/localif.cpp	Wed Sep 15 14:02:55 2010 +0300
@@ -79,10 +79,42 @@
 		return &backend;
 #endif
 		}
+		
+EXPORT_C RTz& CLocalSystemInterface::TZServer(TInt &aStatus)
+	{
+	aStatus = OnDemandTZServerConnection();
+	return iTzServer;
+	} 
+		
+TInt CLocalSystemInterface::OnDemandTZServerConnection()
+        {
+		TInt v = EFalse;
+		TInt err = KErrNone;
+		
+		if(__e32_atomic_load_acq32(&iIsRTzConnected))
+			return err;
+			
+		iTzServerLock.Wait();
+		if (!iIsRTzConnected) 
+			{
+			err = iTzServer.Connect();
+			if ( err == KErrNone ) 
+				{
+				err = iTzServer.ShareAuto();
+				if( err == KErrNone) {
+					v = ETrue;
+					}
+				}
+			__e32_atomic_store_rel32(&iIsRTzConnected, v); 
+			}
+		iTzServerLock.Signal();
+		
+        return err;
+        } 
 
 // Construction of Backend Object which is going to be singleton object for the process
 EXPORT_C CLocalSystemInterface::CLocalSystemInterface() : iOpenDirList(CLocalSystemInterface::KDirGran),
-iTLDInfoList(CLocalSystemInterface::KTLDInfoListGran), iDefConnResurrect(ETrue), iDefConnPref(NULL)
+iTLDInfoList(CLocalSystemInterface::KTLDInfoListGran), iDefConnResurrect(ETrue), iDefConnPref(NULL), iIsRTzConnected(EFalse)
 		{
 #ifdef SYMBIAN_OE_POSIX_SIGNALS
 		iSignalsInitialized = EFalse;
@@ -165,25 +197,17 @@
 			err |=  iASelectLock.CreateLocal();
 	        //Protect the iDefConnection from concurrent GetDefaultConnection calls
 	        err |= iDefConnLock.CreateLocal();
+			//Protect the time zone server while connecting
+			err |= iTzServerLock.CreateLocal();
 			}
 
-        if(err == KErrNone)
-            {
-            err = iTzServer.Connect();
-            if(!err)
-                {
-                err = iTzServer.ShareAuto();
-                }
-            }
-
-
 		//Panic if any of the above operation returns with error
 		if (err)
 			{
 			User::Panic(KEstlibInit, err);
 			}
 
-		iCleanup.StorePtrs(iPrivateHeap, &iFs, &iSs, &iCs, &iSSLock, &iCSLock,&iDefConnLock,&iASelectLock);
+		iCleanup.StorePtrs(iPrivateHeap, &iFs, &iSs, &iCs, &iSSLock, &iCSLock,&iDefConnLock,&iASelectLock,&iTzServerLock);
 
 		}
 
@@ -219,7 +243,6 @@
 	//close the RTz connection
 	iTzServer.Close();
 
-
 	if( iDefConnPref )
 	    {
 	    switch( iDefConnPref->ExtensionId() )
@@ -1740,6 +1763,11 @@
 	return MapError(err,anErrno);
 	}
 
+EXPORT_C void CLocalSystemInterface::freednssuffixes(if_dns_suffixes * suffixes)
+    {
+    CSocketDesc::FreeDNSSuffixes(suffixes->suffixes);
+    }
+
 int CLocalSystemInterface::ioctl_complete (int fid, int cmd, void* param, TRequestStatus& aStatus, int& anErrno)
 	{
 	return iFids.ioctlcomplete(fid,cmd,param,aStatus,anErrno);
@@ -2166,7 +2194,7 @@
         { 
         timer.After(*reqarray[numReqs+arraycount], timeout); 
         // Wait for any request to complete 
-        CLocalSystemInterface::WaitForNRequest(*reqarray, numReqs+arraycount+1);     
+        CLocalSystemInterface::WaitForNRequest(reqarray, numReqs+arraycount+1);     
         if( (*reqarray[numReqs+arraycount]).Int() == KRequestPending) 
             {
             // The timer hasn't fired yet.
@@ -2181,7 +2209,7 @@
         } 
     else 
         { 
-        CLocalSystemInterface::WaitForNRequest(*reqarray, numReqs+arraycount);
+        CLocalSystemInterface::WaitForNRequest(reqarray, numReqs+arraycount);
         // Completion Status of one request has been gathered
         onedown = ETrue;
         }
@@ -3627,6 +3655,47 @@
 // Used in lieu of User::WaitForNRequest because of need to support pre-Argus builds
 // ---------------------------------------------------------------------------------
 //
+void CLocalSystemInterface::WaitForNRequest(TRequestStatus **aStatusArray, TInt aNum)
+	{
+	if (aNum)
+		{
+		// used to keep count of requests we have not been asked to wait for
+		TInt nOther = -1;
+		TBool done = EFalse;
+
+		do
+			{
+			++nOther;
+			User::WaitForAnyRequest();
+			for (TInt i = 0; i < aNum; ++i)
+				{
+				if ((*aStatusArray[i]).Int() != KRequestPending)
+					{
+					done = ETrue;
+					break;
+					}
+				}
+			} while (!done);
+
+		if (nOther)
+			{
+			// Adjust the thread's signal semaphore to account for the requests
+			// we were not asked to wait for.
+			RThread thrd;
+			for (TInt i = 0; i < nOther; ++i)
+				{
+				thrd.RequestSignal();
+				}
+			}
+		}
+	}
+
+// ---------------------------------------------------------------------------------
+// CLocalSystemInterface::WaitForNRequest
+// Wait for any one of the input asynchronous requests to complete
+// Used in lieu of User::WaitForNRequest because of need to support pre-Argus builds
+// ---------------------------------------------------------------------------------
+//
 void CLocalSystemInterface::WaitForNRequest(TRequestStatus aStatusArray[], TInt aNum)
 	{
 	if (aNum)