diff -r cad71a31b7fc -r e36f3802f733 srsf/nssvasapi/nssvasdb/nssvasdbeventnotifier/src/nssvascvasdbeventmonitor.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/srsf/nssvasapi/nssvasdb/nssvasdbeventnotifier/src/nssvascvasdbeventmonitor.cpp Wed Sep 01 12:29:17 2010 +0100 @@ -0,0 +1,254 @@ +/* +* Copyright (c) 2005-2006 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: CVASDBMonitor class is an active object that is a wrapper around +* the RDBNotifier class. Events from RDBNotifier are handled by +* encapsulating them in a CNssVASDBEvent object and passing it to all +* its observers. In addition to the events provided by RDBNotifier, +* CVASDBMonitor also provides additional events when a entry is added, +* changed or deleted from the VAS DB. CVASDBMonitor owns the list of +* observers of the VAS DB. +* +*/ + + +// INCLUDE FILES +#include "nssvascresourcehandler.h" +#include "nssvascvasdbeventmonitor.h" + + +// ================= MEMBER FUNCTIONS ======================= + +// --------------------------------------------------------- +// CNssVASDBEventMonitor::ConstructL +// C++ constructor can NOT contain any code that +// might leave. +// --------------------------------------------------------- +// +CNssVASDBEventMonitor::CNssVASDBEventMonitor() : CActive( CActive::EPriorityStandard) + { + } + + +// --------------------------------------------------------- +// CNssVASDBEventMonitor::ConstructL +// EPOC constructor can leave. +// --------------------------------------------------------- +// +void CNssVASDBEventMonitor::ConstructL() + { + iObservers = new ( ELeave ) CArrayPtrFlat( 1 ); + + TFileName serverSideFilename; + + User::LeaveIfError( iDbSession.Connect() ); + + // Open the database. + User::LeaveIfError( iDatabase.Open( iDbSession, KVasDatabaseName, KVasDatabaseFormatString ) ); + + User::LeaveIfError( iNotifier.Open( iDatabase ) ); + StartMonitoring(); + } + +// --------------------------------------------------------- +// CNssVASDBEventMonitor::NewL +// Two-phased constructor. +// --------------------------------------------------------- +// +CNssVASDBEventMonitor* CNssVASDBEventMonitor::NewL() + { + CNssVASDBEventMonitor* self = new (ELeave) CNssVASDBEventMonitor; + + CleanupStack::PushL( self ); + CActiveScheduler::Add( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + return self; + } + + +// --------------------------------------------------------- +// CNssVASDBEventMonitor::~CNssVASDBEventMonitor +// Destructor +// --------------------------------------------------------- +// +CNssVASDBEventMonitor::~CNssVASDBEventMonitor() + { + Cancel(); + iNotifier.Close(); + iDatabase.Close(); + iDbSession.Close(); + if ( iObservers ) + { + iObservers->Reset(); + delete iObservers; + } + } + + +// --------------------------------------------------------- +// CNssVASDBEventMonitor::StartMonitoring +// Request function to start monitoring +// (other items were commented in a header). +// --------------------------------------------------------- +// +void CNssVASDBEventMonitor::StartMonitoring() + { + if ( IsActive() ) + { + return; + } + iStatus=KRequestPending; + SetActive(); + iNotifier.NotifyChange( iStatus ); + } + + +// --------------------------------------------------------- +// CNssVASDBEventMonitor::AddObserverL +// add observer to its list +// (other items were commented in a header). +// --------------------------------------------------------- +// +void CNssVASDBEventMonitor::AddObserverL(MNssVASDatabaseObserver* aObserver) + { + iObservers->AppendL( aObserver ); + } + + +// --------------------------------------------------------- +// CNssVASDBEventMonitor::RemoveObserver +// remove observer from its list +// (other items were commented in a header). +// --------------------------------------------------------- +// +TInt CNssVASDBEventMonitor::RemoveObserver(MNssVASDatabaseObserver* aObserver) + { + TBool ret = EFalse; + if ( iObservers ) + { + for ( TInt i = 0;i < iObservers->Count(); i++ ) + { + if ( ( *iObservers )[i] == aObserver ) + { + iObservers->Delete( i ); + ret = ETrue; + break; + } + } + } + if ( ret ) + { + iObservers->Compress(); + } + return ( ret? KErrNone : KErrGeneral ); + } + + +// --------------------------------------------------------- +// CNssVASDBEventMonitor::RunL +// called when standard symbian DBMS events occur +// (other items were commented in a header). +// --------------------------------------------------------- +// +void CNssVASDBEventMonitor::RunL() + { + RDbNotifier::TEvent event = STATIC_CAST( RDbNotifier::TEvent,iStatus.Int() ); + HandleDatabaseEventL( event ); + StartMonitoring(); + } + + +// --------------------------------------------------------- +// CNssVASDBEventMonitor::DoCancel +// cancel outstanding requests to RDBNotifier +// (other items were commented in a header). +// --------------------------------------------------------- +// +void CNssVASDBEventMonitor::DoCancel() + { + iNotifier.Cancel(); + } + + +// --------------------------------------------------------- +// CNssVASDBEventMonitor::HandleDatabaseEventL +// Standard Symbian DBMS events handling +// (other items were commented in a header). +// --------------------------------------------------------- +// +void CNssVASDBEventMonitor::HandleDatabaseEventL( RDbNotifier::TEvent aEvent ) + { + if(!iObservers->Count()) + { + return; + } + + CNssVASDBEvent::TVASDBEventType type = CNssVASDBEvent::EVASDatabaseEventNull; + switch( aEvent ) + { + case RDbNotifier::EClose: + type = CNssVASDBEvent::EVASDatabaseEventDatabaseClose; + break; + case RDbNotifier::EUnlock: + type = CNssVASDBEvent::EVASDatabaseEventDatabaseUnlock; + break; + case RDbNotifier::ECommit: + type = CNssVASDBEvent::EVASDatabaseEventDatabaseCommit; + break; + case RDbNotifier::ERollback: + type = CNssVASDBEvent::EVASDatabaseEventDatabaseRollback; + break; + case RDbNotifier::ERecover: + type = CNssVASDBEvent::EVASDatabaseEventDatabaseRecover; + break; + default: + break; + } + // for standard symbian DBMS events, the parameter aTag + // does not have any significance, so create a dummy one + MNssTag *dummyTag = NULL; + CNssVASDBEvent *vasDBEvent = CNssVASDBEvent::NewL( type, dummyTag ); + + for(TInt i = 0; i < iObservers->Count(); i++) + { + ( *iObservers )[i]->HandleVASDBEvent( vasDBEvent ); + } + } + + +// --------------------------------------------------------- +// CNssVASDBEventMonitor::HandleDatabaseEventL() +// handling of addional events ( tag added, tag deleted, tag changed) +// wk 15 release has limited functionality where these events can be +// reported only when the events occur on the same thread as that +// of the observer (client monitoring the event). +// (other items were commented in a header). +// --------------------------------------------------------- +// +void CNssVASDBEventMonitor::HandleDatabaseEventL( + CNssVASDBEvent::TVASDBEventType type, CNssTag *aTag ) +{ + if ( !iObservers->Count() ) + { + return; + } + + for ( TInt i = 0; i < iObservers->Count(); i++ ) + { + CNssVASDBEvent *vasDBEvent = CNssVASDBEvent::NewL( type, aTag ); + ( *iObservers )[i]->HandleVASDBEvent( vasDBEvent ); + } +} + +// End of File