cmmanager/cmmgr/cmmserver/src/cmmdbchangelistener.cpp
changeset 20 9c97ad6591ae
child 44 a0c4ceac30d0
equal deleted inserted replaced
18:fcbbe021d614 20:9c97ad6591ae
       
     1 /*
       
     2 * Copyright (c) 2009-2010 Nokia Corporation and/or its subsidiary(-ies).
       
     3 * All rights reserved.
       
     4 * This component and the accompanying materials are made available
       
     5 * under the terms of "Eclipse Public License v1.0"
       
     6 * which accompanies this distribution, and is available
       
     7 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     8 *
       
     9 * Initial Contributors:
       
    10 * Nokia Corporation - initial contribution.
       
    11 *
       
    12 * Contributors:
       
    13 *
       
    14 * Description:
       
    15 * Listens for changes in one CommsDat table through CenRep.
       
    16 *
       
    17 */
       
    18 
       
    19 
       
    20 #include <commsdat.h>
       
    21 #include <centralrepository.h>
       
    22 
       
    23 #include "cmmdbchangelistener.h"
       
    24 #include "cmmlistenermanager.h"
       
    25 #include "OstTraceDefinitions.h"
       
    26 #ifdef OST_TRACE_COMPILER_IN_USE
       
    27 #include "cmmdbchangelistenerTraces.h"
       
    28 #endif
       
    29 
       
    30 
       
    31 
       
    32 // ---------------------------------------------------------------------------
       
    33 // Two phased construction.
       
    34 // ---------------------------------------------------------------------------
       
    35 //
       
    36 CCmmDbChangeListener* CCmmDbChangeListener::NewL(
       
    37         CCmmListenerManager* aListenerManager,
       
    38         TUint32 aTableId )
       
    39     {
       
    40     OstTraceFunctionEntry0( CCMMDBCHANGELISTENER_NEWL_ENTRY );
       
    41 
       
    42     CCmmDbChangeListener* self = CCmmDbChangeListener::NewLC( aListenerManager, aTableId );
       
    43     CleanupStack::Pop( self );
       
    44 
       
    45     OstTraceFunctionExit0( CCMMDBCHANGELISTENER_NEWL_EXIT );
       
    46 
       
    47     return self;
       
    48     }
       
    49 
       
    50 // ---------------------------------------------------------------------------
       
    51 // Two phased construction.
       
    52 // ---------------------------------------------------------------------------
       
    53 //
       
    54 CCmmDbChangeListener* CCmmDbChangeListener::NewLC(
       
    55         CCmmListenerManager* aListenerManager,
       
    56         TUint32 aTableId )
       
    57     {
       
    58     OstTraceFunctionEntry0( CCMMDBCHANGELISTENER_NEWLC_ENTRY );
       
    59 
       
    60     CCmmDbChangeListener* self = new( ELeave ) CCmmDbChangeListener( aListenerManager, aTableId );
       
    61     CleanupStack::PushL( self );
       
    62     self->ConstructL();
       
    63 
       
    64     OstTraceFunctionExit0( CCMMDBCHANGELISTENER_NEWLC_EXIT );
       
    65 
       
    66     return self;
       
    67     }
       
    68 
       
    69 // ---------------------------------------------------------------------------
       
    70 // Destructor.
       
    71 // Cancels any active requests.
       
    72 // ---------------------------------------------------------------------------
       
    73 //
       
    74 CCmmDbChangeListener::~CCmmDbChangeListener()
       
    75     {
       
    76     OstTraceFunctionEntry0( CCMMDBCHANGELISTENER_CCMMDBCHANGELISTENER_ENTRY );
       
    77 
       
    78     // Cancel outstanding request, if exists
       
    79     Cancel();
       
    80     delete iRepository;
       
    81 
       
    82     OstTraceFunctionExit0( CCMMDBCHANGELISTENER_CCMMDBCHANGELISTENER_EXIT );
       
    83     }
       
    84 
       
    85 // ---------------------------------------------------------------------------
       
    86 // Constructor.
       
    87 // ---------------------------------------------------------------------------
       
    88 //
       
    89 CCmmDbChangeListener::CCmmDbChangeListener(
       
    90         CCmmListenerManager* aListenerManager,
       
    91         TUint32 aTableId )
       
    92         :
       
    93         CActive( 0 ),
       
    94         iListenerManager( aListenerManager ),
       
    95         iTableId( aTableId )
       
    96     {
       
    97     OstTraceFunctionEntry0( DUP1_CCMMDBCHANGELISTENER_CCMMDBCHANGELISTENER_ENTRY );
       
    98 
       
    99     iRepository = NULL;
       
   100     iErrorCounter = 0;
       
   101 
       
   102     OstTraceFunctionExit0( DUP1_CCMMDBCHANGELISTENER_CCMMDBCHANGELISTENER_EXIT );
       
   103     }
       
   104 
       
   105 // ---------------------------------------------------------------------------
       
   106 // Second phase constructor.
       
   107 // ---------------------------------------------------------------------------
       
   108 //
       
   109 void CCmmDbChangeListener::ConstructL()
       
   110     {
       
   111     OstTraceFunctionEntry0( CCMMDBCHANGELISTENER_CONSTRUCTL_ENTRY );
       
   112 
       
   113     iRepository = CRepository::NewL( KCDCommsRepositoryId );
       
   114     CActiveScheduler::Add( this );
       
   115     // Not started yet.
       
   116     OstTraceFunctionExit0( CCMMDBCHANGELISTENER_CONSTRUCTL_EXIT );
       
   117     }
       
   118 
       
   119 // ---------------------------------------------------------------------------
       
   120 // Get the database table ID that this listener is monitoring.
       
   121 // ---------------------------------------------------------------------------
       
   122 //
       
   123 TUint32 CCmmDbChangeListener::GetTableId()
       
   124     {
       
   125     OstTraceFunctionEntry0( CCMMDBCHANGELISTENER_GETTABLEID_ENTRY );
       
   126     OstTraceFunctionExit0( CCMMDBCHANGELISTENER_GETTABLEID_EXIT );
       
   127 
       
   128     return iTableId;
       
   129     }
       
   130 
       
   131 // ---------------------------------------------------------------------------
       
   132 // Start the listener if not yet started.
       
   133 // ---------------------------------------------------------------------------
       
   134 //
       
   135 TInt CCmmDbChangeListener::Start()
       
   136     {
       
   137     OstTraceFunctionEntry0( CCMMDBCHANGELISTENER_START_ENTRY );
       
   138 
       
   139     TInt err( KErrNone );
       
   140     if ( !IsActive() )
       
   141         {
       
   142         err = RequestNotification();
       
   143         }
       
   144     OstTraceFunctionExit0( CCMMDBCHANGELISTENER_START_EXIT );
       
   145 
       
   146     return err;
       
   147     }
       
   148 
       
   149 // ---------------------------------------------------------------------------
       
   150 // Cancels an outstanding request.
       
   151 // ---------------------------------------------------------------------------
       
   152 //
       
   153 void CCmmDbChangeListener::DoCancel()
       
   154     {
       
   155     OstTraceFunctionEntry0( CCMMDBCHANGELISTENER_DOCANCEL_ENTRY );
       
   156 
       
   157     iRepository->NotifyCancel( iTableId, KCDMaskShowRecordType );
       
   158 
       
   159     OstTraceFunctionExit0( CCMMDBCHANGELISTENER_DOCANCEL_EXIT );
       
   160     }
       
   161 
       
   162 // ---------------------------------------------------------------------------
       
   163 // Handles the asynchronous request completion event.
       
   164 // ---------------------------------------------------------------------------
       
   165 //
       
   166 void CCmmDbChangeListener::RunL()
       
   167     {
       
   168     OstTraceFunctionEntry0( CCMMDBCHANGELISTENER_RUNL_ENTRY );
       
   169 
       
   170     // Don't leave, or implement RunError()
       
   171     if ( iStatus.Int() < KErrNone )
       
   172         {
       
   173         // Error: iStatus.Int()
       
   174         iErrorCounter++;
       
   175         if ( iErrorCounter > KCmmCenRepErrorThreshold )
       
   176             {
       
   177             // Too many errors
       
   178             iListenerManager->DbChangeError( iTableId );
       
   179             OstTraceFunctionExit0( CCMMDBCHANGELISTENER_RUNL_EXIT );
       
   180             return;
       
   181             }
       
   182         }
       
   183     else
       
   184         {
       
   185         iErrorCounter = 0;
       
   186         }
       
   187 
       
   188     TInt err = RequestNotification(); // Start to listen for next change.
       
   189 
       
   190     // React to current change notification
       
   191     iListenerManager->DbChangeDetected( iTableId );
       
   192 
       
   193     if ( err )
       
   194         {
       
   195         iListenerManager->DbChangeError( iTableId );
       
   196         }
       
   197     OstTraceFunctionExit0( DUP1_CCMMDBCHANGELISTENER_RUNL_EXIT );
       
   198     }
       
   199 
       
   200 // ---------------------------------------------------------------------------
       
   201 // Initiates an asynchronous request to be notified of any change in the
       
   202 // monitored database table.
       
   203 // ---------------------------------------------------------------------------
       
   204 //
       
   205 TInt CCmmDbChangeListener::RequestNotification()
       
   206     {
       
   207     OstTraceFunctionEntry0( CCMMDBCHANGELISTENER_REQUESTNOTIFICATION_ENTRY );
       
   208 
       
   209     TInt err( KErrNone );
       
   210     err = iRepository->NotifyRequest( iTableId, KCDMaskShowRecordType, iStatus );
       
   211     if ( !err )
       
   212         {
       
   213         SetActive();
       
   214         }
       
   215     OstTraceFunctionExit0( CCMMDBCHANGELISTENER_REQUESTNOTIFICATION_EXIT );
       
   216 
       
   217     return err;
       
   218     }
       
   219 
       
   220 // End of file