qtinternetradio/irqnetworkcontroller/src/irqnetworkcontroller.cpp
changeset 14 896e9dbc5f19
parent 11 f683e24efca3
--- a/qtinternetradio/irqnetworkcontroller/src/irqnetworkcontroller.cpp	Tue Jul 06 14:07:20 2010 +0300
+++ b/qtinternetradio/irqnetworkcontroller/src/irqnetworkcontroller.cpp	Wed Aug 18 09:40:26 2010 +0300
@@ -17,7 +17,11 @@
 #include <QStringList>
 
 #include "irqnetworkcontroller.h"
-#include "irqnetworkcontrollerbody.h" 
+#include "irqnetworkcontroller_p.h" 
+
+
+IRQNetworkController * IRQNetworkController::mInstance = NULL;
+QMutex IRQNetworkController::mMutex;
 
 // ---------------------------------------------------------------------------
 // IRQNetworkController::openInstance()
@@ -25,28 +29,28 @@
 // @return IRQNetworkController *
 // ---------------------------------------------------------------------------
 //
-EXPORT_C IRQNetworkController* IRQNetworkController::openInstance()
+IRQNetworkController* IRQNetworkController::openInstance()
 {
-    // Get singleton instance
-    IRQNetworkController* irqnetworkcontroller =
-                           reinterpret_cast<IRQNetworkController*>(Dll::Tls());
+    mMutex.lock();
+    
+    if (NULL == mInstance) 
+    {
+        mInstance = new IRQNetworkController();
 
-    if (NULL == irqnetworkcontroller)
-    {
-        TRAPD(error, irqnetworkcontroller = createInstanceL());
-        if (KErrNone != error)
+        if (!mInstance->mInitPrivateSuccess) 
         {
-            delete irqnetworkcontroller;
-            irqnetworkcontroller = NULL;
-            Dll::SetTls(NULL);
+            delete mInstance;
+            mInstance = NULL;
         }
     }
     else
     {
-        irqnetworkcontroller->iSingletonInstances++;
+        mInstance->mRefCount++;
     }
 
-    return irqnetworkcontroller;
+    mMutex.unlock();
+
+    return mInstance;
 }
 
 // ---------------------------------------------------------------------------
@@ -54,15 +58,18 @@
 // Close a singleton instance of IRQNetworkController
 // ---------------------------------------------------------------------------
 //
-EXPORT_C void IRQNetworkController::closeInstance()
+void IRQNetworkController::closeInstance()
 {
-    iSingletonInstances--;
-
-    if (0 == iSingletonInstances)
+    mMutex.lock();
+    if ((--mRefCount) == 0)
     {
-        Dll::SetTls(NULL);
+        if(this == mInstance)
+        {
+            mInstance = NULL;
+        }
         delete this;
     }
+    mMutex.unlock();
 }
 
 // ---------------------------------------------------------------------------
@@ -71,9 +78,9 @@
 // @return bool
 // ---------------------------------------------------------------------------
 //
-EXPORT_C bool IRQNetworkController::getNetworkStatus() const
+bool IRQNetworkController::getNetworkStatus() const
 {
-    return iBody->getNetworkStatus();
+    return d_ptr->getNetworkStatus();
 }
 
 // ---------------------------------------------------------------------------
@@ -82,9 +89,9 @@
 // @return IRQError
 // ---------------------------------------------------------------------------
 //
-EXPORT_C IRQError IRQNetworkController::getIAPId(unsigned long& aIapId) const
+IRQError IRQNetworkController::getIAPId(unsigned long& aIapId) const
 {
-    return iBody->getIAPId(aIapId);
+    return d_ptr->getIAPId(aIapId);
 }
 
 // ---------------------------------------------------------------------------
@@ -93,18 +100,18 @@
 // connectivity
 // ---------------------------------------------------------------------------
 //
-EXPORT_C void IRQNetworkController::chooseAccessPoint()
+void IRQNetworkController::chooseAccessPoint()
 {
-    iBody->chooseAccessPoint();
+    d_ptr->chooseAccessPoint();
 }
 
 /*
  * Cancel configuring access point
  */
-EXPORT_C void IRQNetworkController::cancelConnecting()
+void IRQNetworkController::cancelConnecting()
 {
-    iBody->cancelConnecting();
-    iBody->resetConnectionStatus();
+    d_ptr->cancelConnecting();
+    d_ptr->resetConnectionStatus();
 }
 
 // ---------------------------------------------------------------------------
@@ -113,9 +120,9 @@
 // @return True if the phone is in offline mode else False
 // ---------------------------------------------------------------------------
 //
-EXPORT_C bool IRQNetworkController::isOfflineMode()
+bool IRQNetworkController::isOfflineMode()
 {
-    return iBody->isOfflineMode();
+    return d_ptr->isOfflineMode();
 }
 
 // ---------------------------------------------------------------------------
@@ -124,9 +131,9 @@
 // @return True if the phone supports else False
 // ---------------------------------------------------------------------------
 //
-EXPORT_C bool IRQNetworkController::isWlanSupported() const
+bool IRQNetworkController::isWlanSupported() const
 {
-    return iBody->isWlanSupported();
+    return d_ptr->isWlanSupported();
 }
 
 // ---------------------------------------------------------------------------
@@ -134,9 +141,9 @@
 // Resets the connection status to Disconnected state
 // ---------------------------------------------------------------------------
 //
-EXPORT_C void IRQNetworkController::resetConnectionStatus()
+void IRQNetworkController::resetConnectionStatus()
 {
-    iBody->resetConnectionStatus();
+    d_ptr->resetConnectionStatus();
 }
 
 // ---------------------------------------------------------------------------
@@ -145,9 +152,9 @@
 // @return enum describing the type of connection ( GPRS/3G/WiFi )
 // ---------------------------------------------------------------------------
 //
-EXPORT_C IRQConnectionType IRQNetworkController::identifyConnectionType() const
+IRQConnectionType IRQNetworkController::identifyConnectionType() const
 {
-    return iBody->identifyConnectionType();
+    return d_ptr->identifyConnectionType();
 }
 
 // ---------------------------------------------------------------------------
@@ -155,9 +162,9 @@
 // Notifies all observers whose network request is active to reissue the request
 // ---------------------------------------------------------------------------
 //
-EXPORT_C void IRQNetworkController::notifyActiveNetworkObservers(IRQNetworkEvent aEvent)
+void IRQNetworkController::notifyActiveNetworkObservers(IRQNetworkEvent aEvent)
 {
-    iBody->notifyActiveNetworkObservers(aEvent);
+    d_ptr->notifyActiveNetworkObservers(aEvent);
 }
 
 // ---------------------------------------------------------------------------
@@ -166,9 +173,9 @@
 // @return bool
 // ---------------------------------------------------------------------------
 //
-EXPORT_C bool IRQNetworkController::isHandlingOverConnection()
+bool IRQNetworkController::isHandlingOverConnection()
 {
-    return iBody->isHandlingOverConnection();
+    return d_ptr->isHandlingOverConnection();
 }
 
 // ---------------------------------------------------------------------------
@@ -177,9 +184,9 @@
 // @return bool
 // ---------------------------------------------------------------------------
 //
-EXPORT_C bool IRQNetworkController::isConnectRequestIssued() const
+bool IRQNetworkController::isConnectRequestIssued() const
 {
-    return iBody->isConnectRequestIssued();
+    return d_ptr->isConnectRequestIssued();
 }
 
 // ---------------------------------------------------------------------------
@@ -187,8 +194,14 @@
 // Default constructor
 // ---------------------------------------------------------------------------
 //
-IRQNetworkController::IRQNetworkController()
+IRQNetworkController::IRQNetworkController() :
+    mRefCount(1), d_ptr(new IRQNetworkControllerPrivate(this)), mInitPrivateSuccess(false)
 {
+    Q_ASSERT(d_ptr);
+    if (d_ptr) 
+    {
+        mInitPrivateSuccess = d_ptr->init();
+    }
 }
 
 // ---------------------------------------------------------------------------
@@ -199,41 +212,6 @@
 //
 IRQNetworkController::~IRQNetworkController()
 {
-    delete iBody;
-    iBody = NULL;
+    delete d_ptr;
 }
 
-// ---------------------------------------------------------------------------
-// IRQNetworkController::constructL()
-// Two-Phase Constructor.
-// ---------------------------------------------------------------------------
-//
-void IRQNetworkController::constructL()
-{
-    iBody = new (ELeave) IRQNetworkControllerBody();
-    Q_ASSERT(iBody);
-    iBody->initL();
-    
-    connect(iBody, SIGNAL(networkRequestNotified(IRQNetworkEvent)),
-            this, SIGNAL(networkRequestNotified(IRQNetworkEvent)));
-    connect(iBody, SIGNAL(pendingRequestsReset(bool)),
-            this, SIGNAL(pendingRequestsReset(bool)));
-    connect(iBody, SIGNAL(networkEventNotified(IRQNetworkEvent)),
-            this, SIGNAL(networkEventNotified(IRQNetworkEvent)));
-    connect(iBody, SIGNAL(errorOccured(IRQError)),
-            this, SIGNAL(errorOccured(IRQError)));
-}
-
-// ---------------------------------------------------------------------------
-// IRQNetworkController::createInstanceL()
-// Creates IRQNetworkController instance
-// ---------------------------------------------------------------------------
-//
-IRQNetworkController* IRQNetworkController::createInstanceL()
-{
-    IRQNetworkController* nwkController = new (ELeave) IRQNetworkController();
-    nwkController->constructL();
-    User::LeaveIfError(Dll::SetTls(nwkController));
-    nwkController->iSingletonInstances = 1;
-    return nwkController;
-}