--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/contentcontrolsrv/hsccclient/hsccproviderclient/src/hsccproviderclient.cpp Thu Dec 17 08:54:17 2009 +0200
@@ -0,0 +1,696 @@
+/*
+ * Copyright (c) 2008 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:
+ *
+ */
+
+// System include files
+#include <s32strm.h>
+#include <s32mem.h>
+#include <hscontentcontroller.h>
+#include <hscontentinfoarray.h>
+#include <hscontentinfo.h>
+
+// User include files
+#include "hsccproviderclient.h"
+#include "ccresource.h"
+#include "ccsrvapi.h"
+#include "hsccapi.h"
+
+// Local constants
+
+// ======== MEMBER FUNCTIONS ========
+
+// -----------------------------------------------------------------------------
+// CHsCcProviderClient::NewL()
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+EXPORT_C CHsCcProviderClient* CHsCcProviderClient::NewL(
+ MHsContentController& aController )
+ {
+ CHsCcProviderClient* self = new ( ELeave ) CHsCcProviderClient( aController );
+ CleanupStack::PushL( self );
+ self->ConstructL();
+ CleanupStack::Pop( self );
+ return( self ) ;
+ }
+
+// -----------------------------------------------------------------------
+// CHsCcProviderClient::ConstructL()
+// -----------------------------------------------------------------------
+//
+void CHsCcProviderClient::ConstructL()
+ {
+ User::LeaveIfError( iSession.Connect() );
+
+ TPckgBuf<TUint32> provider( ECcHomescreen );
+ TPckgBuf<TUint32> address;
+ User::LeaveIfError( iSession.RegisterProvider(
+ provider,
+ address ) );
+ iAddress = address();
+
+ WaitForApiReqL();
+
+ }
+
+// -----------------------------------------------------------------------
+// CHsCcProviderClient::CHsCcProviderClient()
+// -----------------------------------------------------------------------
+//
+CHsCcProviderClient::CHsCcProviderClient(
+ MHsContentController& aController )
+ :CActive( EPriorityStandard )
+ ,iController( aController )
+ ,iAddress( 0 )
+ ,iApiHeader( NULL )
+ ,iApiHeaderPtr( NULL, 0 )
+ ,iApiData( NULL )
+ ,iApiDataPtr( NULL, 0 )
+ {
+ CActiveScheduler::Add( this );
+ }
+
+// -----------------------------------------------------------------------
+// CHsCcProviderClient::~CHsCcProviderClient()
+// -----------------------------------------------------------------------
+//
+ CHsCcProviderClient::~CHsCcProviderClient()
+ {
+ Cancel();
+ iSession.Close();
+ delete iApiHeader;
+ delete iApiData;
+ iObservers.Close();
+ }
+
+// -----------------------------------------------------------------------------
+// CHsCcClient::RunL()
+// -----------------------------------------------------------------------------
+//
+void CHsCcProviderClient::RunL()
+ {
+
+ if ( !iStatus.Int() )
+ {
+ // Get received message header
+ CCcSrvMsg* message = CCcSrvMsg::NewL();
+ CleanupStack::PushL( message );
+ RDesReadStream stream( iApiHeaderPtr );
+ CleanupClosePushL( stream );
+ message->InternalizeHeaderL( stream );
+ CleanupStack::PopAndDestroy( &stream );
+ if ( message->DataSize() )
+ {
+ // Get message data
+ HBufC8* dataBuf = HBufC8::NewL( message->DataSize() );
+ CleanupStack::PushL( dataBuf );
+ TPtr8 dataPtr( NULL, 0 );
+ dataPtr.Set( dataBuf->Des() );
+ TPckgBuf<TUint32> trId( message->TrId() );
+ iSession.GetMsgData( trId, dataPtr );
+ message->SetData( dataPtr );
+ CleanupStack::PopAndDestroy( dataBuf );
+ }
+
+ switch ( message->MsgId() )
+ {
+ case ECcRegisterObserverNtf:
+ HandleRegisterObserverNtfL( *message );
+ break;
+ case ECcUnregisterObserverNtf:
+ HandleUnregisterObserverNtfL( *message );
+ break;
+ case EHsCcWidgetListReq:
+ HandleWidgetListReqL( *message );
+ break;
+ case EHsCcAddWidgetReq:
+ HandleAddWidgetReqL( *message );
+ break;
+ case EHsCcRemoveWidgetReq:
+ HandleRemoveWidgetReqL( *message );
+ break;
+ case EHsCcViewListReq:
+ HandleViewListReqL( *message );
+ break;
+ case EHsCcAddViewReq:
+ HandleAddViewReqL( *message );
+ break;
+ case EHsCcRemoveViewReq:
+ HandleRemoveViewReqL( *message );
+ break;
+ case EHsCcActivateViewReq:
+ HandleActivateViewReqL( *message );
+ break;
+ case EHsCcAppListReq:
+ HandleAppListReqL( *message );
+ break;
+ case EHsCcActivateAppReq:
+ HandleActivateAppReqL( *message );
+ break;
+ default:
+ HandleNotSupportedReqL( *message );
+ break;
+ }
+ CleanupStack::PopAndDestroy( message );
+ }
+
+ // Receive next API request
+ WaitForApiReqL();
+
+ }
+
+// -----------------------------------------------------------------------------
+// CHsCcProviderClient::DoCancel()
+// -----------------------------------------------------------------------------
+//
+void CHsCcProviderClient::DoCancel()
+ {
+ if ( IsActive() )
+ {
+ TPckgBuf<TInt> function( ECcWaitForApiReq );
+ iSession.CancelReq( function );
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CHsCcProviderClient::NotifyWidgetListChanged()
+// -----------------------------------------------------------------------------
+//
+void CHsCcProviderClient::NotifyWidgetListChanged()
+ {
+ if ( iObservers.Count() )
+ {
+ TRAP_IGNORE( SendNtfL( EHsCcWidgetListChangedNtf ) );
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CHsCcProviderClient::NotifyViewListChanged()
+// -----------------------------------------------------------------------------
+//
+void CHsCcProviderClient::NotifyViewListChanged()
+ {
+ if ( iObservers.Count() )
+ {
+ TRAP_IGNORE( SendNtfL( EHsCcViewListChangedNtf ) );
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CHsCcProviderClient::NotifyAppListChanged()
+// -----------------------------------------------------------------------------
+//
+void CHsCcProviderClient::NotifyAppListChanged()
+ {
+ if ( iObservers.Count() )
+ {
+ TRAP_IGNORE( SendNtfL( EHsCcAppListChangedNtf ) );
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CHsCcProviderClient::WaitForApiReqL()
+// -----------------------------------------------------------------------------
+//
+void CHsCcProviderClient::WaitForApiReqL()
+ {
+
+ if ( iApiHeader )
+ {
+ delete iApiHeader;
+ iApiHeader = NULL;
+ }
+ iApiHeader = HBufC8::NewL( KCcHeaderSize );
+ iApiHeaderPtr.Set( iApiHeader->Des() );
+
+ TPckgBuf<TUint32> provider( ECcHomescreen );
+ iPckgSender = 0;
+ iPckgReceiver = 0;
+
+ iSession.WaitForApiReq( provider, iPckgSender, iPckgReceiver, iApiHeaderPtr, iStatus );
+ SetActive();
+
+ }
+
+// -----------------------------------------------------------------------------
+// CHsCcProviderClient::HandleRegisterObserverNtfL()
+// -----------------------------------------------------------------------------
+//
+void CHsCcProviderClient::HandleRegisterObserverNtfL(
+ CCcSrvMsg& /* aMessage */ )
+ {
+ TUint32 observer = iPckgSender();
+ iObservers.AppendL( observer );
+ }
+
+// -----------------------------------------------------------------------------
+// CHsCcProviderClient::HandleUnregisterObserverNtfL()
+// -----------------------------------------------------------------------------
+//
+void CHsCcProviderClient::HandleUnregisterObserverNtfL(
+ CCcSrvMsg& /* aMessage */ )
+ {
+ TUint32 observer = iPckgSender();
+ for ( TInt i = 0; i < iObservers.Count(); i++ )
+ {
+ if ( iObservers[ i ] == observer )
+ {
+ iObservers.Remove( i );
+ break;
+ }
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CHsCcProviderClient::HandleWidgetListReqL()
+// -----------------------------------------------------------------------------
+//
+void CHsCcProviderClient::HandleWidgetListReqL(
+ CCcSrvMsg& aMessage )
+ {
+ // Get widget list
+ CHsContentInfoArray* widgets = CHsContentInfoArray::NewL();
+ CleanupStack::PushL( widgets );
+ TInt err = iController.WidgetListL( *widgets );
+
+ // Create and send WidgetListResp
+ CCcSrvMsg* message = CCcSrvMsg::NewL();
+ CleanupStack::PushL( message );
+ message->SetMsgId( EHsCcWidgetListResp );
+ message->SetTrId( aMessage.TrId() );
+ message->SetStatus( err );
+
+ if ( !err )
+ {
+ // Externalize widget list
+ HBufC8* dataBuf = widgets->MarshalL();
+ CleanupStack::PushL( dataBuf );
+ TPtr8 dataPtr( NULL, 0 );
+ dataPtr.Set( dataBuf->Des() );
+ message->SetData( dataPtr );
+ CleanupStack::PopAndDestroy( dataBuf );
+ }
+
+ SendRespL( *message );
+
+ CleanupStack::PopAndDestroy( message );
+ CleanupStack::PopAndDestroy( widgets );
+
+ }
+
+// -----------------------------------------------------------------------------
+// CHsCcProviderClient::HandleAddWidgetReqL()
+// -----------------------------------------------------------------------------
+//
+void CHsCcProviderClient::HandleAddWidgetReqL(
+ CCcSrvMsg& aMessage )
+ {
+ TInt err( KErrNone );
+ if ( aMessage.DataSize() )
+ {
+ // Internalize message data
+ RDesReadStream dataStream( aMessage.Data() );
+ CleanupClosePushL( dataStream );
+ CHsContentInfo* info = CHsContentInfo::NewL( dataStream );
+ CleanupStack::PopAndDestroy( &dataStream );
+ CleanupStack::PushL( info );
+
+ // Add widget
+ err = iController.AddWidgetL( *info );
+
+ CleanupStack::PopAndDestroy( info );
+ }
+ else
+ {
+ // Mandatory message data missing
+ err = KErrArgument;
+ }
+
+ // Create and send AddWidgetResp
+ CCcSrvMsg* message = CCcSrvMsg::NewL();
+ CleanupStack::PushL( message );
+ message->SetMsgId( EHsCcAddWidgetResp );
+ message->SetTrId( aMessage.TrId() );
+ message->SetStatus( err );
+ message->SetData( KNullDesC8() );
+
+ SendRespL( *message );
+
+ CleanupStack::PopAndDestroy( message );
+ }
+
+// -----------------------------------------------------------------------------
+// CHsCcProviderClient::HandleRemoveWidgetReqL()
+// -----------------------------------------------------------------------------
+//
+void CHsCcProviderClient::HandleRemoveWidgetReqL(
+ CCcSrvMsg& aMessage )
+ {
+ TInt err( KErrNone );
+ if ( aMessage.DataSize() )
+ {
+ // Internalize message data
+ RDesReadStream dataStream( aMessage.Data() );
+ CleanupClosePushL( dataStream );
+ CHsContentInfo* info = CHsContentInfo::NewL( dataStream );
+ CleanupStack::PopAndDestroy( &dataStream );
+ CleanupStack::PushL( info );
+
+ // Remove widget
+ err = iController.RemoveWidgetL( *info );
+
+ CleanupStack::PopAndDestroy( info );
+ }
+ else
+ {
+ // Mandatory message data missing
+ err = KErrArgument;
+ }
+
+ // Create and send RemoveWidgetResp
+ CCcSrvMsg* message = CCcSrvMsg::NewL();
+ CleanupStack::PushL( message );
+ message->SetMsgId( EHsCcRemoveWidgetResp );
+ message->SetTrId( aMessage.TrId() );
+ message->SetStatus( err );
+ message->SetData( KNullDesC8() );
+
+ SendRespL( *message );
+
+ CleanupStack::PopAndDestroy( message );
+ }
+
+// -----------------------------------------------------------------------------
+// CHsCcProviderClient::HandleViewListReqL()
+// -----------------------------------------------------------------------------
+//
+void CHsCcProviderClient::HandleViewListReqL(
+ CCcSrvMsg& aMessage )
+ {
+ // Get view list
+ CHsContentInfoArray* views = CHsContentInfoArray::NewL();
+ CleanupStack::PushL( views );
+ TInt err = iController.ViewListL( *views );
+
+ // Create and send ViewListResp
+ CCcSrvMsg* message = CCcSrvMsg::NewL();
+ CleanupStack::PushL( message );
+ message->SetMsgId( EHsCcViewListResp );
+ message->SetTrId( aMessage.TrId() );
+ message->SetStatus( err );
+
+ if ( !err )
+ {
+ // Externalize view list
+ HBufC8* dataBuf = views->MarshalL();
+ CleanupStack::PushL( dataBuf );
+ TPtr8 dataPtr( NULL, 0 );
+ dataPtr.Set( dataBuf->Des() );
+ message->SetData( dataPtr );
+ CleanupStack::PopAndDestroy( dataBuf );
+ }
+
+ SendRespL( *message );
+
+ CleanupStack::PopAndDestroy( message );
+ CleanupStack::PopAndDestroy( views );
+
+ }
+
+// -----------------------------------------------------------------------------
+// CHsCcProviderClient::HandleAddViewReqL()
+// -----------------------------------------------------------------------------
+//
+void CHsCcProviderClient::HandleAddViewReqL(
+ CCcSrvMsg& aMessage )
+ {
+ TInt err( KErrNone );
+ if ( aMessage.DataSize() )
+ {
+ // Internalize message data
+ RDesReadStream dataStream( aMessage.Data() );
+ CleanupClosePushL( dataStream );
+ CHsContentInfo* info = CHsContentInfo::NewL( dataStream );
+ CleanupStack::PopAndDestroy( &dataStream );
+ CleanupStack::PushL( info );
+
+ // Add view
+ err = iController.AddViewL( *info );
+
+ CleanupStack::PopAndDestroy( info );
+ }
+ else
+ {
+ // Mandatory message data missing
+ err = KErrArgument;
+ }
+
+ // Create and send AddViewResp
+ CCcSrvMsg* message = CCcSrvMsg::NewL();
+ CleanupStack::PushL( message );
+ message->SetMsgId( EHsCcAddViewResp );
+ message->SetTrId( aMessage.TrId() );
+ message->SetStatus( err );
+ message->SetData( KNullDesC8() );
+
+ SendRespL( *message );
+
+ CleanupStack::PopAndDestroy( message );
+ }
+
+// -----------------------------------------------------------------------------
+// CHsCcProviderClient::HandleRemoveViewReqL()
+// -----------------------------------------------------------------------------
+//
+void CHsCcProviderClient::HandleRemoveViewReqL(
+ CCcSrvMsg& aMessage )
+ {
+ TInt err( KErrNone );
+ if ( aMessage.DataSize() )
+ {
+ // Internalize message data
+ RDesReadStream dataStream( aMessage.Data() );
+ CleanupClosePushL( dataStream );
+ CHsContentInfo* info = CHsContentInfo::NewL( dataStream );
+ CleanupStack::PopAndDestroy( &dataStream );
+ CleanupStack::PushL( info );
+
+ // Remove view
+ err = iController.RemoveViewL( *info );
+
+ CleanupStack::PopAndDestroy( info );
+ }
+ else
+ {
+ // Mandatory message data missing
+ err = KErrArgument;
+ }
+
+ // Create and send RemoveViewResp
+ CCcSrvMsg* message = CCcSrvMsg::NewL();
+ CleanupStack::PushL( message );
+ message->SetMsgId( EHsCcRemoveViewResp );
+ message->SetTrId( aMessage.TrId() );
+ message->SetStatus( err );
+ message->SetData( KNullDesC8() );
+
+ SendRespL( *message );
+
+ CleanupStack::PopAndDestroy( message );
+ }
+
+// -----------------------------------------------------------------------------
+// CHsCcProviderClient::HandleActivateViewReqL()
+// -----------------------------------------------------------------------------
+//
+void CHsCcProviderClient::HandleActivateViewReqL(
+ CCcSrvMsg& aMessage )
+ {
+ TInt err( KErrNone );
+ if ( aMessage.DataSize() )
+ {
+ // Internalize message data
+ RDesReadStream dataStream( aMessage.Data() );
+ CleanupClosePushL( dataStream );
+ CHsContentInfo* info = CHsContentInfo::NewL( dataStream );
+ CleanupStack::PopAndDestroy( &dataStream );
+ CleanupStack::PushL( info );
+
+ // Activate view
+ err = iController.ActivateViewL( *info );
+
+ CleanupStack::PopAndDestroy( info );
+ }
+ else
+ {
+ // Mandatory message data missing
+ err = KErrArgument;
+ }
+
+ // Create and send ActivateViewResp
+ CCcSrvMsg* message = CCcSrvMsg::NewL();
+ CleanupStack::PushL( message );
+ message->SetMsgId( EHsCcActivateViewResp );
+ message->SetTrId( aMessage.TrId() );
+ message->SetStatus( err );
+ message->SetData( KNullDesC8() );
+
+ SendRespL( *message );
+
+ CleanupStack::PopAndDestroy( message );
+ }
+
+// -----------------------------------------------------------------------------
+// CHsCcProviderClient::HandleAppListReqL()
+// -----------------------------------------------------------------------------
+//
+void CHsCcProviderClient::HandleAppListReqL(
+ CCcSrvMsg& aMessage )
+ {
+ // Get app list
+ CHsContentInfoArray* apps = CHsContentInfoArray::NewL();
+ CleanupStack::PushL( apps );
+ TInt err = iController.AppListL( *apps );
+
+ // Create and send AppListResp
+ CCcSrvMsg* message = CCcSrvMsg::NewL();
+ CleanupStack::PushL( message );
+ message->SetMsgId( EHsCcAppListResp );
+ message->SetTrId( aMessage.TrId() );
+ message->SetStatus( err );
+ if ( !err )
+ {
+ // Externalize app list
+ HBufC8* dataBuf = apps->MarshalL();
+ CleanupStack::PushL( dataBuf );
+ TPtr8 dataPtr( NULL, 0 );
+ dataPtr.Set( dataBuf->Des() );
+ message->SetData( dataPtr );
+ CleanupStack::PopAndDestroy( dataBuf );
+ }
+
+ SendRespL( *message );
+
+ CleanupStack::PopAndDestroy( message );
+ CleanupStack::PopAndDestroy( apps );
+
+ }
+
+// -----------------------------------------------------------------------------
+// CHsCcProviderClient::HandleActivateAppReqL()
+// -----------------------------------------------------------------------------
+//
+void CHsCcProviderClient::HandleActivateAppReqL(
+ CCcSrvMsg& aMessage )
+ {
+ TInt err( KErrNone );
+ if ( aMessage.DataSize() )
+ {
+ // Internalize message data
+ RDesReadStream dataStream( aMessage.Data() );
+ CleanupClosePushL( dataStream );
+ CHsContentInfo* info = CHsContentInfo::NewL( dataStream );
+ CleanupStack::PopAndDestroy( &dataStream );
+ CleanupStack::PushL( info );
+
+ // Activate view
+ err = iController.ActivateAppL( *info );
+
+ CleanupStack::PopAndDestroy( info );
+ }
+ else
+ {
+ // Mandatory message data missing
+ err = KErrArgument;
+ }
+
+ // Create and send ActivateAppResp
+ CCcSrvMsg* message = CCcSrvMsg::NewL();
+ CleanupStack::PushL( message );
+ message->SetMsgId( EHsCcActivateAppResp );
+ message->SetTrId( aMessage.TrId() );
+ message->SetStatus( err );
+ message->SetData( KNullDesC8() );
+
+ SendRespL( *message );
+
+ CleanupStack::PopAndDestroy( message );
+ }
+
+// -----------------------------------------------------------------------------
+// CHsCcProviderClient::HandleNotSupportedReqL()
+// -----------------------------------------------------------------------------
+//
+void CHsCcProviderClient::HandleNotSupportedReqL(
+ CCcSrvMsg& aMessage )
+ {
+ // Create and send NotSupportedResp
+ CCcSrvMsg* message = CCcSrvMsg::NewL();
+ CleanupStack::PushL( message );
+ message->SetMsgId( EHsCcNotSupportedResp );
+ message->SetTrId( aMessage.TrId() );
+ message->SetStatus( KErrNone );
+ message->SetData( KNullDesC8() );
+
+ SendRespL( *message );
+
+ CleanupStack::PopAndDestroy( message );
+
+ }
+
+// -----------------------------------------------------------------------------
+// CHsCcProviderClient::SendNtfL()
+// -----------------------------------------------------------------------------
+//
+void CHsCcProviderClient::SendNtfL(
+ TUint32 aNtf )
+ {
+ // Notify registered observers
+ CCcSrvMsg* ntf = CCcSrvMsg::NewL();
+ CleanupStack::PushL( ntf );
+ ntf->SetMsgId( aNtf );
+ HBufC8* ntfBuf = ntf->MarshalL();
+ CleanupStack::PushL( ntfBuf );
+ TPtr8 ntfPtr( NULL, 0 );
+ ntfPtr.Set( ntfBuf->Des() );
+
+ TPckgBuf<TUint32> provider( ECcHomescreen );
+ TPckgBuf<TUint32> sender( iAddress );
+ TPckgBuf<TUint32> receiver( 0 );
+ iSession.Send( ECcApiNtf, provider, sender, receiver, ntfPtr );
+
+ CleanupStack::PopAndDestroy( ntfBuf );
+ CleanupStack::PopAndDestroy( ntf );
+ }
+
+// -----------------------------------------------------------------------------
+// CHsCcProviderClient::SendRespL()
+// -----------------------------------------------------------------------------
+//
+void CHsCcProviderClient::SendRespL(
+ CCcSrvMsg& aMessage )
+ {
+ HBufC8* msgBuf = aMessage.MarshalL();
+ CleanupStack::PushL( msgBuf );
+ TPtr8 msgPtr( NULL, 0 );
+ msgPtr.Set( msgBuf->Des() );
+
+ TPckgBuf<TUint32> provider( ECcHomescreen );
+ iSession.Send( ECcApiResp, provider, iPckgReceiver, iPckgSender, msgPtr );
+
+ CleanupStack::PopAndDestroy( msgBuf );
+ }
+
+// End of file