srsf/nssvasapi/nssvasdb/src/nssvascdbtagselectnotifier.cpp
branchRCL_3
changeset 23 e36f3802f733
parent 0 bf1d17376201
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srsf/nssvasapi/nssvasdb/src/nssvascdbtagselectnotifier.cpp	Wed Sep 01 12:29:17 2010 +0100
@@ -0,0 +1,227 @@
+/*
+* Copyright (c) 2002-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:  CNssDBTagSelectNotifier provides tag select notification to 
+*               its clients (observers). It itslef receives tag select notification
+*               from Recognition Handler.
+*
+*/
+
+
+// includes
+#include "nssvascdbtagselectnotifier.h"
+#include "nssvascoreconstant.h"
+#include <e32property.h>
+
+
+// ================= MEMBER FUNCTIONS =======================
+
+// ---------------------------------------------------------
+// CNssDBTagSelectNotifier::CNssDBTagSelectNotifier
+// C++ constructor can NOT contain any code that might leave.
+// ---------------------------------------------------------
+//
+CNssDBTagSelectNotifier::CNssDBTagSelectNotifier(): CActive( EPriorityStandard )
+    {
+    // Nothing
+    }
+
+// ---------------------------------------------------------
+// CNssDBTagSelectNotifier::CNssDBTagSelectNotifier
+// overloaded constructor
+// ---------------------------------------------------------
+//
+CNssDBTagSelectNotifier::CNssDBTagSelectNotifier( CNssVASDatabase* aVasDatabase ): 
+                         CActive( EPriorityStandard ), iVasDatabase( aVasDatabase )
+    {
+    // Nothing
+    }
+
+// ---------------------------------------------------------
+// CNssDBTagSelectNotifier::ConstructL
+// symbian constructor
+// ---------------------------------------------------------
+//
+void CNssDBTagSelectNotifier::ConstructL()
+    {
+	iObserverList = new (ELeave) CArrayPtrFlat<MNssDBTagSelectNotifierClient>(1);
+	
+    // Define P&S properties
+    TInt err = RProperty::Define( KSINDUID, EVoiceTagSelectionTagId, RProperty::EInt );
+    if ( err != KErrAlreadyExists )
+        {
+        User::LeaveIfError( err );
+        }
+    err = RProperty::Define( KSINDUID, EVoiceTagSelectionContextId, RProperty::EInt );
+    if ( err != KErrAlreadyExists )
+        {
+        User::LeaveIfError( err );
+        }
+        
+    User::LeaveIfError( iProperty.Attach( KSINDUID, EVoiceTagSelectionTagId ) );
+    CActiveScheduler::Add( this );
+    // Subsrcibe for change notifications
+    iProperty.Subscribe( iStatus );
+    SetActive();
+    }
+
+// ---------------------------------------------------------
+// CNssDBTagSelectNotifier::NewL
+// 2 phase Construction
+// ---------------------------------------------------------
+//
+CNssDBTagSelectNotifier* CNssDBTagSelectNotifier::NewL( CNssVASDatabase* aVasDatabase )
+    {
+	CNssDBTagSelectNotifier* self = NewLC( aVasDatabase );
+	CleanupStack::Pop( self );
+	return ( self );
+    }
+
+// ---------------------------------------------------------
+// CNssDBTagSelectNotifier::NewLC
+// 2 phase Construction
+// ---------------------------------------------------------
+//
+CNssDBTagSelectNotifier* CNssDBTagSelectNotifier::NewLC( CNssVASDatabase* aVasDatabase )
+    {
+	CNssDBTagSelectNotifier* self = new ( ELeave )CNssDBTagSelectNotifier( aVasDatabase );
+	CleanupStack::PushL( self );
+	self->ConstructL();
+	return ( self );
+    }
+
+// ---------------------------------------------------------
+// CNssDBTagSelectNotifier::~CNssDBTagSelectNotifier
+// destructor
+// ---------------------------------------------------------
+//
+CNssDBTagSelectNotifier::~CNssDBTagSelectNotifier()
+    {
+	if ( iObserverList )
+	    {
+		iObserverList->ResetAndDestroy();
+		delete iObserverList;
+		iObserverList = NULL;
+    	}
+    Cancel();
+    iProperty.Close();
+    }
+
+// ---------------------------------------------------------
+// CNssDBTagSelectNotifier::RegisterForNotification
+// registers a client for notification 
+// ---------------------------------------------------------
+//
+TInt CNssDBTagSelectNotifier::RegisterForNotification( MNssDBTagSelectNotifierClient* aObserver )
+    {
+    TRAPD( err, iObserverList->AppendL( aObserver ) );
+    return err;
+    }
+
+// ---------------------------------------------------------
+// CNssDBTagSelectNotifier::Deregister
+// Deregister a client from notification
+// ---------------------------------------------------------
+//
+TInt CNssDBTagSelectNotifier::Deregister( MNssDBTagSelectNotifierClient* aObserver )
+    {
+    TBool ret = EFalse;
+    if ( iObserverList )
+	      {
+		    for ( TInt i = 0;i < iObserverList->Count(); i++ )
+			    if ( (*iObserverList)[i] == aObserver )
+			        {
+				      iObserverList->Delete( i );
+				      ret = ETrue;
+			        }
+    	   }
+	  if ( ret )
+	      {
+		    iObserverList->Compress();
+	      }
+	  return (ret ? KErrNone : KErrGeneral);
+    }
+
+// ---------------------------------------------------------
+// CNssDBTagSelectNotifier::HandleSelection
+// calls all its clients, when notified of a tag slection.
+// ---------------------------------------------------------
+//
+void CNssDBTagSelectNotifier::HandleSelection( CNssTag* aTag )
+    {
+    CNssContext* context = ( CNssContext* ) aTag->Context();
+    RProperty::Set( KSINDUID, EVoiceTagSelectionContextId, context->ContextId() );
+    RProperty::Set( KSINDUID, EVoiceTagSelectionTagId, aTag->TagId() );
+    }
+
+// ---------------------------------------------------------
+// CNssDBTagSelectNotifier::DoHandleSelectionCallback
+// Forwards the tag selection callback
+// ---------------------------------------------------------
+//
+void CNssDBTagSelectNotifier::DoHandleSelectionCallback( TInt aTagId, TInt aContextId )
+    {
+    if ( iObserverList->Count() )
+        {
+        // Go through all observers that have been registered to this instance
+        for ( TInt i = 0; i < iObserverList->Count(); i++ )
+            {
+            // Find the tags based on ID
+            MNssTagListArray* array = iVasDatabase->GetTag( aTagId );
+            
+            for ( TInt j = 0; j < array->Count(); j++ )
+                {
+                CNssTag* tag = ( CNssTag* )array->At( j );
+                CNssContext* context = ( CNssContext* ) tag->Context();
+                // Check that context IDs match
+                if ( context->ContextId() == aContextId )
+                    {
+                    // Do the callback
+                    (*iObserverList)[i]->HandleSelection( tag );
+                    }
+                }
+                       
+            array->ResetAndDestroy();
+            delete array;
+	        }
+        }
+    }
+    
+// ---------------------------------------------------------
+// CNssDBTagSelectNotifier::DoCancel
+// From CActive
+// ---------------------------------------------------------
+//
+void CNssDBTagSelectNotifier::DoCancel()
+    {
+    iProperty.Cancel();
+    }
+
+// ---------------------------------------------------------
+// CNssDBTagSelectNotifier::RunL
+// From CActive
+// ---------------------------------------------------------
+//
+void CNssDBTagSelectNotifier::RunL()
+    {
+    // resubscribe before processing new value to prevent missing updates
+    iProperty.Subscribe( iStatus );
+    SetActive();
+
+    // property updated, get new value
+   iProperty.Get( KSINDUID, EVoiceTagSelectionTagId, iTagId );
+   iProperty.Get( KSINDUID, EVoiceTagSelectionContextId, iContextId );
+   DoHandleSelectionCallback( iTagId, iContextId );
+   }
+   
+// End of file