homescreensrv_plat/sapi_contentpublishing/src/cpclientactivenotifier.cpp
changeset 0 79c6a41cd166
child 16 b276298d5729
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/homescreensrv_plat/sapi_contentpublishing/src/cpclientactivenotifier.cpp	Thu Dec 17 08:54:17 2009 +0200
@@ -0,0 +1,342 @@
+/*
+* Copyright (c) 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:  
+*
+*/
+
+
+#include <s32mem.h>
+#include <liwcommon.h>
+#include "cpclientactivenotifier.h"
+#include "ccontentmap.h"
+#include "cpdebug.h"
+#include "cpglobals.h"
+#include "cpserverdef.h"
+#include "cdatasourceinterface.h"
+
+using namespace LIW;
+
+// ======== MEMBER FUNCTIONS ========
+
+// ----------------------------------------------------------------------------
+//
+// ----------------------------------------------------------------------------
+//
+CCPActiveNotifier* CCPActiveNotifier::NewL( RCPServerClient& aServerClient )
+    {
+    CCPActiveNotifier* self = new( ELeave ) 
+            CCPActiveNotifier ( aServerClient );
+    CleanupStack::PushL( self );
+    self->ConstructL( );
+    CleanupStack::Pop( self );
+    return self;
+    }
+
+// ---------------------------------------------------------------------------
+// destructor
+// ---------------------------------------------------------------------------
+CCPActiveNotifier::~CCPActiveNotifier()
+    {
+    CP_DEBUG( _L8("CCPActiveNotifier::CCPActiveNotifier()" ) );
+    Cancel( );
+    iObservers.Close( );
+    delete iObserverBuf;
+    delete iSizeDes;
+    }
+
+// ----------------------------------------------------------------------------
+//
+// ----------------------------------------------------------------------------
+//
+void CCPActiveNotifier::RegisterL( MLiwNotifyCallback* aObserver, 
+		TInt32 aTransactionId, CCPLiwMap* aMap )
+    {
+    CP_DEBUG( _L8("CCPActiveNotifier::RegisterL()" ) );
+    TIpcArgs args;
+    
+   	if(iObservers.Find( aTransactionId ))
+   		{
+   		User::Leave( KErrInUse );
+   		}
+    
+   	iObservers.InsertL( aTransactionId, aObserver );
+	delete iObserverBuf;
+	iObserverBuf = NULL;
+ 	iObserverBuf = aMap->PackForServerLC( );
+   	CleanupStack::Pop( iObserverBuf );
+   	args.Set( KDescriptorPosition, &*iObserverBuf );
+	args.Set( KTransactionPosition, aTransactionId );
+    
+    if ( !IsActive( ) )
+        {
+        iSizeDes = new (ELeave) TPckgBuf<TInt>( );
+        args.Set( KReturnPosition, iSizeDes );
+        iServerClient.RegisterObserverL( iStatus, args );
+        SetActive( );
+        }
+    else
+        {
+        iServerClient.AddObserver( args );
+        }
+    }
+
+
+// ----------------------------------------------------------------------------
+//
+// ----------------------------------------------------------------------------
+//
+void CCPActiveNotifier::UnregisterL()
+    {
+    CP_DEBUG( _L8("CCPActiveNotifier::UnregisterL()" ) );
+    if ( !IsActive( ) )
+        {
+        User::Leave( KErrNotFound );
+        }
+    else
+        {
+        Cancel( );
+        delete iSizeDes;
+        iSizeDes = NULL;
+        }
+    }
+
+// ----------------------------------------------------------------------------
+//
+// ----------------------------------------------------------------------------
+//
+TBool CCPActiveNotifier::UnregisterL( TInt32 aTransactionId )
+    {
+    TBool last(EFalse);
+    CP_DEBUG( _L8("CCPActiveNotifier::UnregisterL()" ) );
+
+    MLiwNotifyCallback** observer = iObservers.Find(aTransactionId);
+    if (observer)
+        {
+        CLiwGenericParamList* changeInfoList = 
+                 CLiwGenericParamList::NewL( );
+        CleanupStack::PushL( changeInfoList );
+        CLiwGenericParamList* inParamList = CLiwGenericParamList::NewL( );
+        CleanupStack::PushL( inParamList );
+        
+        changeInfoList->AppendL(TLiwGenericParam(EGenericParamError,
+                TLiwVariant(CDataSourceInterface::ErrCodeConversion(KErrNone))));
+        changeInfoList->AppendL(TLiwGenericParam(KErrorCode, TLiwVariant(
+                CDataSourceInterface::ErrCodeConversion(KErrNone))));
+        
+		(*observer)->HandleNotifyL( aTransactionId, KLiwEventCanceled, *changeInfoList,
+            *inParamList );     
+        
+        CleanupStack::PopAndDestroy( inParamList );
+        CleanupStack::PopAndDestroy( changeInfoList );
+        }
+    else
+        {
+        User::Leave(KErrNotFound);
+        }
+    
+    TIpcArgs args;
+	args.Set( KTransactionPosition, aTransactionId );
+    iServerClient.RemoveObserver( args );
+
+    iObservers.Remove( aTransactionId );
+        
+	if( !iObservers.Count() )
+		{
+		UnregisterL();
+		last = ETrue;
+		}
+	return last;
+    }
+
+// ----------------------------------------------------------------------------
+//
+// ----------------------------------------------------------------------------
+//
+void CCPActiveNotifier::UnregisterAllL(  )
+    {
+    CP_DEBUG( _L8("CCPActiveNotifier::UnregisterAllL()" ) );
+    if (!iObservers.Count())
+    	{
+    	User::Leave( KErrNotFound );
+    	}
+    THashMapIter<TInt32, MLiwNotifyCallback*> iter( iObservers );
+    const TInt32* transaction = iter.NextKey();
+    while( transaction )
+        {
+        UnregisterL( *transaction );
+        transaction = iter.NextKey( );
+        }    
+    }
+
+// ----------------------------------------------------------------------------
+//
+// ----------------------------------------------------------------------------
+//
+void CCPActiveNotifier::RunL()
+    {
+    CP_DEBUG( _L8("CCPActiveNotifier::RunL()" ) );
+    CLiwGenericParamList* eventParamList = CLiwGenericParamList::NewL();
+    CleanupStack::PushL(eventParamList);
+
+    TInt error = iStatus.Int();
+    if (KErrNone == error)
+        {
+        RBuf8 outbuf;
+        outbuf.CleanupClosePushL();
+        outbuf.CreateL((*iSizeDes)());
+        error = iServerClient.GetChangeInfoData(outbuf);
+        RDesReadStream stream(outbuf);
+        CleanupClosePushL(stream);
+        eventParamList->InternalizeL(stream);
+        CleanupStack::PopAndDestroy(&stream);
+        delete iSizeDes;
+        iSizeDes = NULL;
+        CleanupStack::PopAndDestroy(&outbuf);
+        }
+    RegisterAgainL();
+
+    NotifyObserversL(error, eventParamList);
+    CleanupStack::PopAndDestroy(eventParamList);
+    }
+
+// ----------------------------------------------------------------------------
+//
+// ----------------------------------------------------------------------------
+//
+void CCPActiveNotifier::NotifyObserversL( TInt aErrorCode, 
+		CLiwGenericParamList* aEventParamList  )
+	{
+    TInt event( KLiwEventInProgress );
+    if ( aErrorCode == KErrCancel )
+        {
+        event = KLiwEventCanceled;
+        }
+    else if ( aErrorCode != KErrNone )
+        {
+        event = KLiwEventStopped;
+        }	
+ 
+    for ( TInt i = 0; i<aEventParamList->Count(); i++ )
+    	{
+    	TLiwGenericParam param;
+    	param.PushL();
+    	TLiwVariant mapsV;
+    	mapsV.PushL();
+    	aEventParamList->AtL( i, param );
+    	mapsV = param.Value();
+    	CLiwDefaultList* listOfMatchingMaps = CLiwDefaultList::NewLC( );
+    	if (mapsV.Get( *listOfMatchingMaps ))
+    		{
+    		TLiwVariant transV;
+    		transV.PushL();
+    		TInt transIndex (listOfMatchingMaps->Count()-1);
+    		listOfMatchingMaps->AtL(transIndex ,transV);
+    		TInt32 transactionId ( KErrNotFound );
+    		transV.Get( transactionId );
+    		MLiwNotifyCallback** observer = iObservers.Find( transactionId );
+    		
+    		if ( observer )
+    			{
+    			listOfMatchingMaps->Remove( transIndex );
+    			CLiwGenericParamList* changeInfoList = 
+											CLiwGenericParamList::NewL( );
+    			CleanupStack::PushL( changeInfoList );
+    		    CLiwGenericParamList* inParamList = CLiwGenericParamList::NewL( );
+    		    CleanupStack::PushL( inParamList );
+    			
+    			changeInfoList->AppendL( TLiwGenericParam( KChangeInfo,
+    							TLiwVariant( listOfMatchingMaps ) ) );
+    			
+    			changeInfoList->AppendL( TLiwGenericParam( EGenericParamError,
+    			    TLiwVariant( CDataSourceInterface::ErrCodeConversion( aErrorCode ) ) ) );
+    			changeInfoList->AppendL( TLiwGenericParam( KErrorCode,
+    			    TLiwVariant( CDataSourceInterface::ErrCodeConversion( aErrorCode ) ) ) );
+    			(*observer)->HandleNotifyL( transactionId, event, *changeInfoList,
+    			        *inParamList );
+    			
+    		    CleanupStack::PopAndDestroy( inParamList );
+    		    CleanupStack::PopAndDestroy( changeInfoList );
+    			}//if
+
+    		CleanupStack::PopAndDestroy( &transV );
+    		}//if
+    	CleanupStack::PopAndDestroy( listOfMatchingMaps );
+    	CleanupStack::PopAndDestroy( &mapsV );
+    	CleanupStack::PopAndDestroy( &param );
+    	}//for
+	}
+
+
+// ----------------------------------------------------------------------------
+//
+// ----------------------------------------------------------------------------
+//
+void CCPActiveNotifier::DoCancel()
+    {
+    CP_DEBUG( _L8("CCPActiveNotifier::DoCancel()" ) );
+    iServerClient.UnregisterObserver( );
+    }
+
+// ----------------------------------------------------------------------------
+//
+// ----------------------------------------------------------------------------
+//
+TInt CCPActiveNotifier::RunError( TInt /*aError*/)
+    {
+    TRAP_IGNORE( RegisterAgainL( ) );
+    return KErrNone;
+    }
+// ----------------------------------------------------------------------------
+//
+// ----------------------------------------------------------------------------
+//
+CCPActiveNotifier::CCPActiveNotifier( RCPServerClient& aServerClient ) :
+    CActive(EPriorityStandard)
+    {
+    iServerClient = aServerClient;
+    CActiveScheduler::Add( this );
+    }
+
+// ----------------------------------------------------------------------------
+//
+// ----------------------------------------------------------------------------
+//
+void CCPActiveNotifier::ConstructL()
+    {
+
+    }
+
+// ----------------------------------------------------------------------------
+//
+// ----------------------------------------------------------------------------
+//
+void CCPActiveNotifier::RegisterAgainL()
+    {
+    CP_DEBUG( _L8("CCPActiveNotifier::RegisterAgainL()" ) );
+
+    if (!IsActive())
+        {
+        TIpcArgs args;
+        args.Set(KTransactionPosition, KErrAlreadyExists);
+        if (iSizeDes)
+            {
+            delete iSizeDes;
+            iSizeDes = NULL;
+            }
+        iSizeDes = new (ELeave) TPckgBuf<TInt> ();
+        args.Set(KReturnPosition, iSizeDes);
+        iServerClient.RegisterObserverL(iStatus, args);
+        SetActive();
+        }
+    }