diff -r 000000000000 -r 79c6a41cd166 contentcontrolsrv/hsccclient/hsccapiclient/src/hsccapiclient.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/contentcontrolsrv/hsccclient/hsccapiclient/src/hsccapiclient.cpp Thu Dec 17 08:54:17 2009 +0200 @@ -0,0 +1,739 @@ +/* + * 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 +#include +#include +#include +#include + +// User include files +#include "hsccapiclient.h" +#include "ccresource.h" +#include "ccsrvapi.h" +#include "hsccapi.h" + +// Local constants + +// ======== MEMBER FUNCTIONS ======== + +// ----------------------------------------------------------------------------- +// CHsCcApiClient::NewL() +// Two-phased constructor. +// ----------------------------------------------------------------------------- +EXPORT_C CHsCcApiClient* CHsCcApiClient::NewL( + MHsContentControl* aControlIf ) + { + CHsCcApiClient* self = new ( ELeave ) CHsCcApiClient( aControlIf ); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + return( self ) ; + } + +// ----------------------------------------------------------------------- +// CHsCcApiClient::ConstructL() +// ----------------------------------------------------------------------- +// +void CHsCcApiClient::ConstructL() + { + User::LeaveIfError( iSession.Connect() ); + + if ( iObserver ) + { + TPckgBuf provider( ECcHomescreen ); + TPckgBuf address; + User::LeaveIfError( iSession.RegisterObserver( + provider, + address ) ); + iAddress = address(); + + WaitForApiNtfL(); + } + } + +// ----------------------------------------------------------------------- +// CHsCcApiClient::CHsCcApiClient() +// ----------------------------------------------------------------------- +// +CHsCcApiClient::CHsCcApiClient( + MHsContentControl* aControlIf ) + :CActive( EPriorityStandard ) + ,iObserver( aControlIf ) + ,iAddress( 0 ) + ,iApiHeader( NULL ) + ,iApiHeaderPtr( NULL, 0 ) + ,iApiData( NULL ) + ,iApiDataPtr( NULL, 0 ) + { + CActiveScheduler::Add( this ); + } + +// ----------------------------------------------------------------------- +// CHsCcApiClient::~CHsCcApiClient() +// ----------------------------------------------------------------------- +// +CHsCcApiClient::~CHsCcApiClient() + { + Cancel(); + iSession.Close(); + delete iApiHeader; + delete iApiData; + } + +// ----------------------------------------------------------------------------- +// CHsCcApiClient::RunL() +// ----------------------------------------------------------------------------- +// +void CHsCcApiClient::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 ); + + switch ( message->MsgId() ) + { + case EHsCcWidgetListChangedNtf: + if ( iObserver ) + { + iObserver->NotifyWidgetListChanged(); + } + break; + case EHsCcViewListChangedNtf: + if ( iObserver ) + { + iObserver->NotifyViewListChanged(); + } + break; + case EHsCcAppListChangedNtf: + if ( iObserver ) + { + iObserver->NotifyAppListChanged(); + } + break; + default: + // No action required + break; + } + CleanupStack::PopAndDestroy( message ); + } + + // Receive next API notification + WaitForApiNtfL(); + + } + +// ----------------------------------------------------------------------------- +// CHsCcApiClient::DoCancel() +// ----------------------------------------------------------------------------- +// +void CHsCcApiClient::DoCancel() + { + if ( IsActive() ) + { + TPckgBuf function( ECcWaitForApiNtf ); + iSession.CancelReq( function ); + } + } + +// ----------------------------------------------------------------------------- +// CHsCcApiClient::WidgetListL +// ----------------------------------------------------------------------------- +// +TInt CHsCcApiClient::WidgetListL( CHsContentInfoArray& aArray ) + { + TInt err( KErrNone ); + + // Create WidgetListReq API request + CCcSrvMsg* reqMsg = CCcSrvMsg::NewL(); + CleanupStack::PushL( reqMsg ); + reqMsg->SetMsgId( EHsCcWidgetListReq ); + reqMsg->SetTrId( 0 ); + reqMsg->SetData( KNullDesC8() ); + + // Marshal API request + HBufC8* msgBuf = reqMsg->MarshalL(); + CleanupStack::PushL( msgBuf ); + TPtr8 msgPtr( NULL, 0 ); + msgPtr.Set( msgBuf->Des() ); + + // Send API request + // Sender and receiver address not defined -> message is routed + // according to the provider id + TPckgBuf provider( ECcHomescreen ); + TPckgBuf sender; + TPckgBuf receiver; + err = iSession.Send( ECcApiReq, provider, sender, receiver, msgPtr ); + + if ( !err ) + { + // Internalize WidgetListResp API response + CCcSrvMsg* respMsg = CCcSrvMsg::NewL(); + CleanupStack::PushL( respMsg ); + RDesReadStream respStream( msgPtr ); + CleanupClosePushL( respStream ); + respMsg->InternalizeHeaderL( respStream ); + CleanupStack::PopAndDestroy( &respStream ); + err = respMsg->Status(); + if ( !err ) + { + if ( respMsg->DataSize() ) + { + // Get API response data + HBufC8* dataBuf = HBufC8::NewL( respMsg->DataSize() ); + CleanupStack::PushL( dataBuf ); + TPtr8 dataPtr( NULL, 0 ); + dataPtr.Set( dataBuf->Des() ); + TPckgBuf trId( respMsg->TrId() ); + err = iSession.GetMsgData( trId, dataPtr ); + if ( !err ) + { + // Internalize API response data + RDesReadStream dataStream( dataPtr ); + CleanupClosePushL( dataStream ); + aArray.InternalizeL( dataStream ); + CleanupStack::PopAndDestroy( &dataStream ); + } + CleanupStack::PopAndDestroy( dataBuf ); + } + } + CleanupStack::PopAndDestroy( respMsg ); + } + + // Cleanup + CleanupStack::PopAndDestroy( msgBuf ); + CleanupStack::PopAndDestroy( reqMsg ); + + return err; + } + +// ----------------------------------------------------------------------------- +// CHsCcApiClient::ViewListL +// ----------------------------------------------------------------------------- +// +TInt CHsCcApiClient::ViewListL( CHsContentInfoArray& aArray ) + { + TInt err( KErrNone ); + + // Create ViewListReq API request + CCcSrvMsg* reqMsg = CCcSrvMsg::NewL(); + CleanupStack::PushL( reqMsg ); + reqMsg->SetMsgId( EHsCcViewListReq ); + reqMsg->SetTrId( 0 ); + reqMsg->SetData( KNullDesC8() ); + + // Marshal API request + HBufC8* msgBuf = reqMsg->MarshalL(); + CleanupStack::PushL( msgBuf ); + TPtr8 msgPtr( NULL, 0 ); + msgPtr.Set( msgBuf->Des() ); + + // Send API request + // Sender and receiver address not defined -> message is routed + // according to the provider id + TPckgBuf provider( ECcHomescreen ); + TPckgBuf sender; + TPckgBuf receiver; + err = iSession.Send( ECcApiReq, provider, sender, receiver, msgPtr ); + + if ( !err ) + { + // Internalize ViewListResp API response + CCcSrvMsg* respMsg = CCcSrvMsg::NewL(); + CleanupStack::PushL( respMsg ); + RDesReadStream respStream( msgPtr ); + CleanupClosePushL( respStream ); + respMsg->InternalizeHeaderL( respStream ); + CleanupStack::PopAndDestroy( &respStream ); + err = respMsg->Status(); + if ( !err ) + { + if ( respMsg->DataSize() ) + { + // Get API response data + HBufC8* dataBuf = HBufC8::NewL( respMsg->DataSize() ); + CleanupStack::PushL( dataBuf ); + TPtr8 dataPtr( NULL, 0 ); + dataPtr.Set( dataBuf->Des() ); + TPckgBuf trId( respMsg->TrId() ); + err = iSession.GetMsgData( trId, dataPtr ); + if ( !err ) + { + // Internalize API response data + RDesReadStream dataStream( dataPtr ); + CleanupClosePushL( dataStream ); + aArray.InternalizeL( dataStream ); + CleanupStack::PopAndDestroy( &dataStream ); + } + CleanupStack::PopAndDestroy( dataBuf ); + } + } + CleanupStack::PopAndDestroy( respMsg ); + } + + // Cleanup + CleanupStack::PopAndDestroy( msgBuf ); + CleanupStack::PopAndDestroy( reqMsg ); + + return err; + } + +// ----------------------------------------------------------------------------- +// CHsCcApiClient::AppListL +// ----------------------------------------------------------------------------- +// +TInt CHsCcApiClient::AppListL( CHsContentInfoArray& aArray ) + { + TInt err( KErrNone ); + + // Create AppListReq API request + CCcSrvMsg* reqMsg = CCcSrvMsg::NewL(); + CleanupStack::PushL( reqMsg ); + reqMsg->SetMsgId( EHsCcAppListReq ); + reqMsg->SetTrId( 0 ); + reqMsg->SetData( KNullDesC8() ); + + // Marshal API request + HBufC8* msgBuf = reqMsg->MarshalL(); + CleanupStack::PushL( msgBuf ); + TPtr8 msgPtr( NULL, 0 ); + msgPtr.Set( msgBuf->Des() ); + + // Send API request + // Sender and receiver address not defined -> message is routed + // according to the provider id + TPckgBuf provider( ECcHomescreen ); + TPckgBuf sender; + TPckgBuf receiver; + err = iSession.Send( ECcApiReq, provider, sender, receiver, msgPtr ); + + if ( !err ) + { + // Internalize AppListResp API response + CCcSrvMsg* respMsg = CCcSrvMsg::NewL(); + CleanupStack::PushL( respMsg ); + RDesReadStream respStream( msgPtr ); + CleanupClosePushL( respStream ); + respMsg->InternalizeHeaderL( respStream ); + CleanupStack::PopAndDestroy( &respStream ); + err = respMsg->Status(); + if ( !err ) + { + if ( respMsg->DataSize() ) + { + // Get API response data + HBufC8* dataBuf = HBufC8::NewL( respMsg->DataSize() ); + CleanupStack::PushL( dataBuf ); + TPtr8 dataPtr( NULL, 0 ); + dataPtr.Set( dataBuf->Des() ); + TPckgBuf trId( respMsg->TrId() ); + err = iSession.GetMsgData( trId, dataPtr ); + if ( !err ) + { + // Internalize API response data + RDesReadStream dataStream( dataPtr ); + CleanupClosePushL( dataStream ); + aArray.InternalizeL( dataStream ); + CleanupStack::PopAndDestroy( &dataStream ); + } + CleanupStack::PopAndDestroy( dataBuf ); + } + } + CleanupStack::PopAndDestroy( respMsg ); + } + + // Cleanup + CleanupStack::PopAndDestroy( msgBuf ); + CleanupStack::PopAndDestroy( reqMsg ); + + return err; + } + +// ----------------------------------------------------------------------------- +// CHsCcApiClient::AddWidgetL +// ----------------------------------------------------------------------------- +// +TInt CHsCcApiClient::AddWidgetL( CHsContentInfo& aInfo ) + { + TInt err( KErrNone ); + + // Create AddWidgetReq API request + CCcSrvMsg* reqMsg = CCcSrvMsg::NewL(); + CleanupStack::PushL( reqMsg ); + reqMsg->SetMsgId( EHsCcAddWidgetReq ); + reqMsg->SetTrId( 0 ); + + // Marshal AddWidgetReq data to a descriptor + HBufC8* dataBuf = aInfo.MarshalL(); + TPtr8 dataPtr( NULL, 0 ); + dataPtr.Set( dataBuf->Des() ); + reqMsg->SetData( dataPtr ); + + delete dataBuf; + dataBuf = NULL; + + // Marshal API request + HBufC8* msgBuf = reqMsg->MarshalL(); + CleanupStack::PushL( msgBuf ); + TPtr8 msgPtr( NULL, 0 ); + msgPtr.Set( msgBuf->Des() ); + + // Send API request + // Sender and receiver address not defined -> message is routed + // according to the provider id + TPckgBuf provider( ECcHomescreen ); + TPckgBuf sender; + TPckgBuf receiver; + err = iSession.Send( ECcApiReq, provider, sender, receiver, msgPtr ); + + if ( !err ) + { + // Internalize AddWidgetResp API response + CCcSrvMsg* respMsg = CCcSrvMsg::NewL(); + CleanupStack::PushL( respMsg ); + RDesReadStream respStream( msgPtr ); + CleanupClosePushL( respStream ); + respMsg->InternalizeHeaderL( respStream ); + CleanupStack::PopAndDestroy( &respStream ); + err = respMsg->Status(); + CleanupStack::PopAndDestroy( respMsg ); + } + + // Cleanup + CleanupStack::PopAndDestroy( msgBuf ); + CleanupStack::PopAndDestroy( reqMsg ); + + return err; + } + +// ----------------------------------------------------------------------------- +// CHsCcApiClient::RemoveWidgetL +// ----------------------------------------------------------------------------- +// +TInt CHsCcApiClient::RemoveWidgetL( CHsContentInfo& aInfo ) + { + TInt err( KErrNone ); + + // Create RemoveWidgetReq API request + CCcSrvMsg* reqMsg = CCcSrvMsg::NewL(); + CleanupStack::PushL( reqMsg ); + reqMsg->SetMsgId( EHsCcRemoveWidgetReq ); + reqMsg->SetTrId( 0 ); + + // Marshal RemoveWidgetReq data to a descriptor + HBufC8* dataBuf = aInfo.MarshalL(); + TPtr8 dataPtr( NULL, 0 ); + dataPtr.Set( dataBuf->Des() ); + reqMsg->SetData( dataPtr ); + + delete dataBuf; + dataBuf = NULL; + + // Marshal API request + HBufC8* msgBuf = reqMsg->MarshalL(); + CleanupStack::PushL( msgBuf ); + TPtr8 msgPtr( NULL, 0 ); + msgPtr.Set( msgBuf->Des() ); + + // Send API request + // Sender and receiver address not defined -> message is routed + // according to the provider id + TPckgBuf provider( ECcHomescreen ); + TPckgBuf sender; + TPckgBuf receiver; + err = iSession.Send( ECcApiReq, provider, sender, receiver, msgPtr ); + + if ( !err ) + { + // Internalize RemoveWidgetResp API response + CCcSrvMsg* respMsg = CCcSrvMsg::NewL(); + CleanupStack::PushL( respMsg ); + RDesReadStream respStream( msgPtr ); + CleanupClosePushL( respStream ); + respMsg->InternalizeHeaderL( respStream ); + CleanupStack::PopAndDestroy( &respStream ); + err = respMsg->Status(); + CleanupStack::PopAndDestroy( respMsg ); + } + + // Cleanup + CleanupStack::PopAndDestroy( msgBuf ); + CleanupStack::PopAndDestroy( reqMsg ); + + return err; + } + +// ----------------------------------------------------------------------------- +// CHsCcApiClient::AddViewL +// ----------------------------------------------------------------------------- +// +TInt CHsCcApiClient::AddViewL( CHsContentInfo& aInfo ) + { + TInt err( KErrNone ); + + // Create AddViewReq API request + CCcSrvMsg* reqMsg = CCcSrvMsg::NewL(); + CleanupStack::PushL( reqMsg ); + reqMsg->SetMsgId( EHsCcAddViewReq ); + reqMsg->SetTrId( 0 ); + + // Marshal AddViewReq data to a descriptor + HBufC8* dataBuf = aInfo.MarshalL(); + TPtr8 dataPtr( NULL, 0 ); + dataPtr.Set( dataBuf->Des() ); + reqMsg->SetData( dataPtr ); + + delete dataBuf; + dataBuf = NULL; + + // Marshal API request + HBufC8* msgBuf = reqMsg->MarshalL(); + CleanupStack::PushL( msgBuf ); + TPtr8 msgPtr( NULL, 0 ); + msgPtr.Set( msgBuf->Des() ); + + // Send API request + // Sender and receiver address not defined -> message is routed + // according to the provider id + TPckgBuf provider( ECcHomescreen ); + TPckgBuf sender; + TPckgBuf receiver; + err = iSession.Send( ECcApiReq, provider, sender, receiver, msgPtr ); + + if ( !err ) + { + // Internalize AddViewResp API response + CCcSrvMsg* respMsg = CCcSrvMsg::NewL(); + CleanupStack::PushL( respMsg ); + RDesReadStream respStream( msgPtr ); + CleanupClosePushL( respStream ); + respMsg->InternalizeHeaderL( respStream ); + CleanupStack::PopAndDestroy( &respStream ); + err = respMsg->Status(); + CleanupStack::PopAndDestroy( respMsg ); + } + + // Cleanup + CleanupStack::PopAndDestroy( msgBuf ); + CleanupStack::PopAndDestroy( reqMsg ); + + return err; + } + +// ----------------------------------------------------------------------------- +// CHsCcApiClient::RemoveViewL +// ----------------------------------------------------------------------------- +// +TInt CHsCcApiClient::RemoveViewL( CHsContentInfo& aInfo ) + { + TInt err( KErrNone ); + + // Create RemoveViewReq API request + CCcSrvMsg* reqMsg = CCcSrvMsg::NewL(); + CleanupStack::PushL( reqMsg ); + reqMsg->SetMsgId( EHsCcRemoveViewReq ); + reqMsg->SetTrId( 0 ); + + // Marshal RemoveViewReq data to a descriptor + HBufC8* dataBuf = aInfo.MarshalL(); + TPtr8 dataPtr( NULL, 0 ); + dataPtr.Set( dataBuf->Des() ); + reqMsg->SetData( dataPtr ); + + delete dataBuf; + dataBuf = NULL; + + // Marshal API request + HBufC8* msgBuf = reqMsg->MarshalL(); + CleanupStack::PushL( msgBuf ); + TPtr8 msgPtr( NULL, 0 ); + msgPtr.Set( msgBuf->Des() ); + + // Send API request + // Sender and receiver address not defined -> message is routed + // according to the provider id + TPckgBuf provider( ECcHomescreen ); + TPckgBuf sender; + TPckgBuf receiver; + err = iSession.Send( ECcApiReq, provider, sender, receiver, msgPtr ); + + if ( !err ) + { + // Internalize RemoveViewResp API response + CCcSrvMsg* respMsg = CCcSrvMsg::NewL(); + CleanupStack::PushL( respMsg ); + RDesReadStream respStream( msgPtr ); + CleanupClosePushL( respStream ); + respMsg->InternalizeHeaderL( respStream ); + CleanupStack::PopAndDestroy( &respStream ); + err = respMsg->Status(); + CleanupStack::PopAndDestroy( respMsg ); + } + + // Cleanup + CleanupStack::PopAndDestroy( msgBuf ); + CleanupStack::PopAndDestroy( reqMsg ); + + return err; + } + +// ----------------------------------------------------------------------------- +// CHsCcApiClient::ActivateViewL +// ----------------------------------------------------------------------------- +// +TInt CHsCcApiClient::ActivateViewL( CHsContentInfo& aInfo ) + { + TInt err( KErrNone ); + + // Create ActivateViewReq API request + CCcSrvMsg* reqMsg = CCcSrvMsg::NewL(); + CleanupStack::PushL( reqMsg ); + reqMsg->SetMsgId( EHsCcActivateViewReq ); + reqMsg->SetTrId( 0 ); + + // Marshal ActivateViewReq data to a descriptor + HBufC8* dataBuf = aInfo.MarshalL(); + TPtr8 dataPtr( NULL, 0 ); + dataPtr.Set( dataBuf->Des() ); + reqMsg->SetData( dataPtr ); + + delete dataBuf; + dataBuf = NULL; + + // Marshal API request + HBufC8* msgBuf = reqMsg->MarshalL(); + CleanupStack::PushL( msgBuf ); + TPtr8 msgPtr( NULL, 0 ); + msgPtr.Set( msgBuf->Des() ); + + // Send API request + // Sender and receiver address not defined -> message is routed + // according to the provider id + TPckgBuf provider( ECcHomescreen ); + TPckgBuf sender; + TPckgBuf receiver; + err = iSession.Send( ECcApiReq, provider, sender, receiver, msgPtr ); + + if ( !err ) + { + // Internalize ActivateViewResp API response + CCcSrvMsg* respMsg = CCcSrvMsg::NewL(); + CleanupStack::PushL( respMsg ); + RDesReadStream respStream( msgPtr ); + CleanupClosePushL( respStream ); + respMsg->InternalizeHeaderL( respStream ); + CleanupStack::PopAndDestroy( &respStream ); + err = respMsg->Status(); + CleanupStack::PopAndDestroy( respMsg ); + } + + // Cleanup + CleanupStack::PopAndDestroy( msgBuf ); + CleanupStack::PopAndDestroy( reqMsg ); + + return err; + } + +// ----------------------------------------------------------------------------- +// CHsCcApiClient::ActivateAppL +// ----------------------------------------------------------------------------- +// +TInt CHsCcApiClient::ActivateAppL( CHsContentInfo& aInfo ) + { + TInt err( KErrNone ); + + // Create ActivateAppReq API request + CCcSrvMsg* reqMsg = CCcSrvMsg::NewL(); + CleanupStack::PushL( reqMsg ); + reqMsg->SetMsgId( EHsCcActivateAppReq ); + reqMsg->SetTrId( 0 ); + + // Marshal ActivateAppReq data to a descriptor + HBufC8* dataBuf = aInfo.MarshalL(); + TPtr8 dataPtr( NULL, 0 ); + dataPtr.Set( dataBuf->Des() ); + reqMsg->SetData( dataPtr ); + + delete dataBuf; + dataBuf = NULL; + + // Marshal API request + HBufC8* msgBuf = reqMsg->MarshalL(); + CleanupStack::PushL( msgBuf ); + TPtr8 msgPtr( NULL, 0 ); + msgPtr.Set( msgBuf->Des() ); + + // Send API request + // Sender and receiver address not defined -> message is routed + // according to the provider id + TPckgBuf provider( ECcHomescreen ); + TPckgBuf sender; + TPckgBuf receiver; + err = iSession.Send( ECcApiReq, provider, sender, receiver, msgPtr ); + + if ( !err ) + { + // Internalize ActivateAppResp API response + CCcSrvMsg* respMsg = CCcSrvMsg::NewL(); + CleanupStack::PushL( respMsg ); + RDesReadStream respStream( msgPtr ); + CleanupClosePushL( respStream ); + respMsg->InternalizeHeaderL( respStream ); + CleanupStack::PopAndDestroy( &respStream ); + err = respMsg->Status(); + CleanupStack::PopAndDestroy( respMsg ); + } + + // Cleanup + CleanupStack::PopAndDestroy( msgBuf ); + CleanupStack::PopAndDestroy( reqMsg ); + + return err; + } + +// ----------------------------------------------------------------------------- +// CHsCcApiClient::WaitForApiNtfL() +// ----------------------------------------------------------------------------- +// +void CHsCcApiClient::WaitForApiNtfL() + { + + if ( iApiHeader ) + { + delete iApiHeader; + iApiHeader = NULL; + } + iApiHeader = HBufC8::NewL( KCcHeaderSize ); + iApiHeaderPtr.Set( iApiHeader->Des() ); + + TPckgBuf provider( ECcHomescreen ); + iPckgSender = 0; + iPckgReceiver = 0; + + iSession.WaitForApiNtf( provider, iPckgSender, iPckgReceiver, iApiHeaderPtr, iStatus ); + SetActive(); + + } + +// End of file