srsf/nssvasapi/nssvasdb/nssvasdbeventnotifier/src/nssvascvasdbeventmonitor.cpp
branchRCL_3
changeset 19 e36f3802f733
parent 0 bf1d17376201
--- /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<MNssVASDatabaseObserver>( 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