emailservices/emailclientapi/src/emailclientapiimpl.cpp
branchRCL_3
changeset 12 4ce476e64c59
parent 11 0396474f30f5
child 24 d189ee25cf9d
--- a/emailservices/emailclientapi/src/emailclientapiimpl.cpp	Mon Mar 15 12:39:10 2010 +0200
+++ b/emailservices/emailclientapi/src/emailclientapiimpl.cpp	Wed Mar 31 21:08:33 2010 +0300
@@ -39,6 +39,7 @@
 #include "emailclientapi.hrh"
 #include "freestyleemailcenrepkeys.h"
 #include "FreestyleEmailUiConstants.h"
+
 // ---------------------------------------------------------------------------
 // CEmailClientApi::MailboxL
 // ---------------------------------------------------------------------------
@@ -201,11 +202,20 @@
 // -----------------------------------------------------------------------------
 CEmailClientApi* CEmailClientApi::NewL()
     {
-    CEmailClientApi* self = new ( ELeave ) CEmailClientApi();
-    CleanupStack::PushL( self );
-    self->ConstructL();
-    CleanupStack::Pop();
-    return self;
+    CEmailClientApi* instance = static_cast<CEmailClientApi*>( Dll::Tls() );
+    
+    if ( instance == NULL )
+        {
+        instance = new ( ELeave ) CEmailClientApi();
+        CleanupStack::PushL( instance );
+        instance->ConstructL();
+        User::LeaveIfError( Dll::SetTls( instance ) );
+        CleanupStack::Pop();
+        }
+
+    instance->iInstanceCounter++;
+        
+    return instance;
     }
 
 // -----------------------------------------------------------------------------
@@ -226,12 +236,13 @@
     iLoadedPluginsArray.Close();
     delete iMailboxCache;
     delete iClientAPI;
+    Dll::FreeTls();
     }
 
 // -----------------------------------------------------------------------------
 // 
 // -----------------------------------------------------------------------------
-CEmailClientApi::CEmailClientApi()
+CEmailClientApi::CEmailClientApi() : iInstanceCounter( 0 )
     {        
     }
 
@@ -297,7 +308,14 @@
 // -----------------------------------------------------------------------------
 void CEmailClientApi::Release()
     {
-    delete this;
+    if( this->iInstanceCounter == 1 )
+        {
+        delete this;
+        }
+    else
+        {
+        this->iInstanceCounter--;
+        }
     }
        
 // -----------------------------------------------------------------------------