qtinternetradio/irqnwkinfoobserver/src/irqnwkinfoobserver.cpp
changeset 14 896e9dbc5f19
parent 0 09774dfdd46b
equal deleted inserted replaced
12:608f67c22514 14:896e9dbc5f19
    13 *
    13 *
    14 * Description:
    14 * Description:
    15 *
    15 *
    16 */
    16 */
    17 #include "irqnwkinfoobserver.h"
    17 #include "irqnwkinfoobserver.h"
    18 #include "irqnwkinfoobserverimpl.h"
    18 #include "irqnwkinfoobserver_p.h"
       
    19 
       
    20 IRQNwkInfoObserver * IRQNwkInfoObserver::mInstance = NULL;
       
    21 QMutex IRQNwkInfoObserver::mMutex;
    19 
    22 
    20 // ---------------------------------------------------------------------------
    23 // ---------------------------------------------------------------------------
    21 // IRQNwkInfoObserver::openInstance()
    24 // IRQNwkInfoObserver::openInstance()
    22 // Static function to get a singleton instance of IRQNwkInfoObserver
    25 // Static function to get a singleton instance of IRQNwkInfoObserver
    23 // ---------------------------------------------------------------------------
    26 // ---------------------------------------------------------------------------
    24 //
    27 //
    25 EXPORT_C IRQNwkInfoObserver* IRQNwkInfoObserver::openInstance()
    28 IRQNwkInfoObserver* IRQNwkInfoObserver::openInstance()
    26 {
    29 {
    27     // Get singleton instance
    30     mMutex.lock();
    28     IRQNwkInfoObserver* nwkInfoObserver =
       
    29                            reinterpret_cast<IRQNwkInfoObserver*>(Dll::Tls());
       
    30 
    31 
    31     if(NULL == nwkInfoObserver)
    32     if (NULL == mInstance) 
    32     {
    33     {
    33         TRAPD(error, nwkInfoObserver = createInstanceL());
    34         mInstance = new IRQNwkInfoObserver();
    34         if (KErrNone != error)
    35 
       
    36         if (!mInstance->mInitPrivateSuccess) 
    35         {
    37         {
    36             delete nwkInfoObserver;
    38             delete mInstance;
    37             nwkInfoObserver = NULL;
    39             mInstance = NULL;
    38             Dll::SetTls(NULL);
       
    39         }
    40         }
    40     }
    41     }
    41     else
    42     else
    42     {
    43     {
    43         nwkInfoObserver->iSingletonInstances++;
    44         mInstance->mRefCount++;
    44     }
    45     }
    45 
    46 
    46     return nwkInfoObserver;
    47     mMutex.unlock();
       
    48 
       
    49     return mInstance;
    47 }
    50 }
    48 
    51 
    49 // ---------------------------------------------------------------------------
    52 // ---------------------------------------------------------------------------
    50 // IRQNwkInfoObserver::closeInstance()
    53 // IRQNwkInfoObserver::closeInstance()
    51 // Close a singleton instance of IRQNwkInfoObserver
    54 // Close a singleton instance of IRQNwkInfoObserver
    52 // ---------------------------------------------------------------------------
    55 // ---------------------------------------------------------------------------
    53 //
    56 //
    54 EXPORT_C void IRQNwkInfoObserver::closeInstance()
    57 void IRQNwkInfoObserver::closeInstance()
    55 {
    58 {
    56     iSingletonInstances--;
    59     mMutex.lock();
    57 
    60     if ((--mRefCount) == 0)
    58     if (0 == iSingletonInstances)
       
    59     {
    61     {
    60         Dll::SetTls(NULL);
    62         mInstance = NULL;
    61         delete this;
    63         delete this;
    62     }
    64     }
       
    65     mMutex.unlock();
    63 }
    66 }
    64 
    67 
    65 
    68 
    66 // ---------------------------------------------------------------------------
    69 // ---------------------------------------------------------------------------
    67 // Constructor
    70 // Constructor
    68 // ---------------------------------------------------------------------------
    71 // ---------------------------------------------------------------------------
    69 //
    72 //
    70 IRQNwkInfoObserver::IRQNwkInfoObserver():iBody(NULL),
    73 IRQNwkInfoObserver::IRQNwkInfoObserver():
    71                                          iSingletonInstances(0)
    74         mRefCount(1), d_ptr(new IRQNwkInfoObserverPrivate(this)), mInitPrivateSuccess(false)
    72 {
    75 {
    73     
    76     if (NULL != d_ptr) 
       
    77     {
       
    78         mInitPrivateSuccess = d_ptr->Construct();
       
    79     }
    74 }
    80 }
    75 
    81 
    76 // ---------------------------------------------------------------------------
    82 // ---------------------------------------------------------------------------
    77 // Destructor
    83 // Destructor
    78 // ---------------------------------------------------------------------------
    84 // ---------------------------------------------------------------------------
    79 //
    85 //
    80 IRQNwkInfoObserver::~IRQNwkInfoObserver()
    86 IRQNwkInfoObserver::~IRQNwkInfoObserver()
    81 {
    87 {
    82     stopMonitorNwkInfo();
    88     stopMonitorNwkInfo();
    83     
    89     
    84     delete iBody;
    90     delete d_ptr;
    85     iBody = NULL;
       
    86 }
       
    87 
       
    88 // ---------------------------------------------------------------------------
       
    89 // IRQNwkInfoObserver::createInstanceL()
       
    90 // Creates IRQNwkInfoObserver instance
       
    91 // @return IRQNwkInfoObserver*
       
    92 // ---------------------------------------------------------------------------
       
    93 //
       
    94 IRQNwkInfoObserver* IRQNwkInfoObserver::createInstanceL()
       
    95 {
       
    96     IRQNwkInfoObserver* nwkInfoObserver = new (ELeave) IRQNwkInfoObserver();
       
    97     nwkInfoObserver->constructL();
       
    98     User::LeaveIfError(Dll::SetTls(nwkInfoObserver));
       
    99     nwkInfoObserver->iSingletonInstances = 1;
       
   100 
       
   101     return nwkInfoObserver;
       
   102 }
       
   103 
       
   104 // ---------------------------------------------------------------------------
       
   105 // IRQNwkInfoObserver::constructL()
       
   106 // Two-Phase Constructor.
       
   107 // ---------------------------------------------------------------------------
       
   108 //
       
   109 void IRQNwkInfoObserver::constructL()
       
   110 {
       
   111     iBody = IRQNwkInfoObserverImpl::NewL(this);
       
   112 }
    91 }
   113 
    92 
   114 // ---------------------------------------------------------------------------
    93 // ---------------------------------------------------------------------------
   115 // IRQNwkInfoObserver::startMonitorNwkInfo()
    94 // IRQNwkInfoObserver::startMonitorNwkInfo()
   116 // start monitoring network info change
    95 // start monitoring network info change
   117 // ---------------------------------------------------------------------------
    96 // ---------------------------------------------------------------------------
   118 //
    97 //
   119 EXPORT_C void IRQNwkInfoObserver::startMonitorNwkInfo()
    98 void IRQNwkInfoObserver::startMonitorNwkInfo()
   120 {
    99 {
   121     if(iBody)
   100     if(d_ptr)
   122     {
   101     {
   123         iBody->startNwkInfoMonitor();
   102         d_ptr->startNwkInfoMonitor();
   124     }
   103     }
   125 }
   104 }
   126 
   105 
   127 // ---------------------------------------------------------------------------
   106 // ---------------------------------------------------------------------------
   128 // IRQNwkInfoObserver::stopMonitorNwkInfo()
   107 // IRQNwkInfoObserver::stopMonitorNwkInfo()
   129 // stop monitoring network info change
   108 // stop monitoring network info change
   130 // ---------------------------------------------------------------------------
   109 // ---------------------------------------------------------------------------
   131 //
   110 //
   132 EXPORT_C void IRQNwkInfoObserver::stopMonitorNwkInfo()
   111 void IRQNwkInfoObserver::stopMonitorNwkInfo()
   133 {
   112 {
   134     if(iBody)
   113     if(d_ptr)
   135     {
   114     {
   136         iBody->Cancel();
   115         d_ptr->Cancel();
   137     }
   116     }
   138 }
   117 }
   139 
       
   140 // ---------------------------------------------------------------------------
       
   141 // From MIRQNwkInfoUpdate.
       
   142 // ---------------------------------------------------------------------------
       
   143 //
       
   144 void IRQNwkInfoObserver::updateCurrentNwkInfo(const QString &aCurrentNwkMCC, const QString &aCurrentNwkMNC)
       
   145 {
       
   146     emit currentNwkChanged(aCurrentNwkMCC,aCurrentNwkMNC);
       
   147 }
       
   148 
       
   149 
       
   150 // ---------------------------------------------------------------------------
       
   151 // From MIRQNwkInfoUpdate.
       
   152 // ---------------------------------------------------------------------------
       
   153 //
       
   154 void IRQNwkInfoObserver::updateHomeNwkInfo(const QString &aHomeNetworkMCC, const QString &aHomeNetworkMNC)
       
   155 {
       
   156     emit homeNwkChanged(aHomeNetworkMCC,aHomeNetworkMNC);
       
   157 }