diff -r 000000000000 -r 79c6a41cd166 contentpublishingsrv/contentpublishingserver/cpserver/src/cpserversession.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/contentpublishingsrv/contentpublishingserver/cpserver/src/cpserversession.cpp Thu Dec 17 08:54:17 2009 +0200 @@ -0,0 +1,501 @@ +/* +* 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: Content Publisher Server Session + * +*/ + + +// INCLUDE FILES +#include +// for CleanupResetAndDestroyPushL +#include +#include + +#include "cpserversession.h" +#include "cpliwmap.h" +#include "cpublisherregistrymap.h" +#include "cpsecuritypolicy.h" +#include "cpserverdef.h" +#include "cpdebug.h" +#include "cpserver.h" +#include "cpserverdatamanager.h" +#include "cpactionhandlerthread.h" +#include "cpnotificationhandler.h" + + +using namespace LIW; + +// ================= MEMBER FUNCTIONS ======================= + +// ----------------------------------------------------------------------------- +// CCPServerSession::NewL +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +CCPServerSession* CCPServerSession::NewL( TPointersForSession& aPasser ) + { + CCPServerSession* self = CCPServerSession::NewLC( aPasser ); + CleanupStack::Pop( self ) ; + return self; + } + +// ----------------------------------------------------------------------------- +// CCPServerSession::NewLC +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +CCPServerSession* CCPServerSession::NewLC( TPointersForSession& aPasser ) + { + CCPServerSession* self = new ( ELeave ) CCPServerSession(); + CleanupStack::PushL( self ); + self->ConstructL( aPasser ) ; + return self; + } + +// ----------------------------------------------------------------------------- +// CCPServerSession::~CCPServerSession +// Destructor. +// ----------------------------------------------------------------------------- +// +CCPServerSession::~CCPServerSession() + { + //remove notification handler from an array of sessions in data manager + if ( iNotificationHandler && iDataManager ) + { + iDataManager->RemoveObserver( iNotificationHandler ); + } + if ( isRegister && iNotificationHandler ) + { + iNotificationHandler->ErrorComplete( KErrCancel ); + } + if ( iServer ) + { + iServer->RemoveSession( ); + } + delete iNotificationHandler; + delete iParamList; + } + +// ----------------------------------------------------------------------------- +// CCPServerSession::CCPServerSession +// C++ default constructor can NOT contain any code, that +// might leave. +// ----------------------------------------------------------------------------- +// +CCPServerSession::CCPServerSession() : + CSession2() + { + + } + +// ----------------------------------------------------------------------------- +// CCPServerSession::ConstructL +// Symbian 2nd phase constructor can leave. +// ----------------------------------------------------------------------------- +// +void CCPServerSession::ConstructL( TPointersForSession& aPasser ) + { + CP_DEBUG( _L8("CCPServerSession::ConstructL()") ); + iDataManager = aPasser.iDataManager; + iServer = aPasser.iServer; + iActionHandlerThread = aPasser.iActionHandlerThread; + iServer->AddSession( ); + isRegister = EFalse; + } + +// ----------------------------------------------------------------------------- +// CCPServerSession::ServiceL +// Handle client requests. +// ----------------------------------------------------------------------------- +// +void CCPServerSession::ServiceL( const RMessage2& aMessage ) + { + CP_DEBUG( _L8("CCPServerSession::ServiceL()" ) ); + TBool serverLocked = GetServerLock( aMessage ); + if ( serverLocked ) + { + aMessage.Complete( KErrLocked ); + } + else + { + TInt err(KErrNone); + TBool panicedClient(EFalse); + TRAP( err , DispatchMessageL( aMessage, panicedClient ) ); + if ( (!(aMessage.Function( ) == ECpServerRegisterObserver ) + || err == KErrInUse) && !panicedClient ) + { + aMessage.Complete( err ); + } + } + } + +// ----------------------------------------------------------------------------- +// CCPServerSession::ServiceL +// Handle client requests. +// ----------------------------------------------------------------------------- +// +void CCPServerSession::DispatchMessageL( const RMessage2& aMessage, TBool& aPanicedClient ) + { + CP_DEBUG( _L8("CCPServerSession::DispatchMessageL()" ) ); + switch ( aMessage.Function( ) ) + { + case ECpServerAddData: + AddDataL( aMessage ); + break; + case ECpServerAddDataNonPersistent: + AddDataNonPersistentL( aMessage ); + break; + case ECpServerGetListSize: + GetListSizeL( aMessage ); + break; + case ECpServerGetListData: + GetListDataL( aMessage ); + break; + case ECpServerRemoveData: + RemoveDataL( aMessage ); + break; + case ECpServerRegisterObserver: + RegisterObserverL( aMessage ); + break; + case ECpServerAddObserver: + AddObserverL( aMessage ); + break; + case ECpServerRemoveObserver: + RemoveObserverL( aMessage ); + break; + case ECpServerUnRegisterObserver: + UnregisterObserverL( ); + break; + case ECpServerGetChangeInfoData: + GetChangeInfoDataL( aMessage ); + break; + case ECpServerExecuteAction: + ExecuteActionL( aMessage ); + break; + default: + iServer->PanicClient( aMessage, ECPServerBadRequest ); + aPanicedClient = ETrue; + break; + } + } + +// ----------------------------------------------------------------------------- +// CCPServerSession::AddDataL +// --------------- -------------------------------------------------------------- +// +void CCPServerSession::AddDataL( const RMessage2& aMessage ) + { + CP_DEBUG( _L8("CCPServerSession::AddDataL()" ) ); + CCPLiwMap* map = UnpackFromClientLC( aMessage ); + map->SetSecurityL( aMessage ); + TBool activateSupport = map->ActivateActionSupport( ); + TUint id( 0 ); + id = iDataManager->AddDataL( *map ); + TPckg idData(id); + aMessage.WriteL( KReturnPosition, idData ); + if(activateSupport) + { + CLiwDefaultList* list = CLiwDefaultList::NewLC( ); + // execute activation or deactivation action for publisher + TRAP_IGNORE( GetAndExecuteActionL( map, list ) ); + TRAP_IGNORE( SendNotificationL( map, list ) ); + CleanupStack::PopAndDestroy( list ); + } + CleanupStack::PopAndDestroy( map ); + } + +// ----------------------------------------------------------------------------- +// CCPServerSession::AddDataNonPersistentL +// --------------- -------------------------------------------------------------- +// +void CCPServerSession::AddDataNonPersistentL( const RMessage2& aMessage ) + { + CP_DEBUG( _L8("CCPServerSession::AddDataL()" ) ); + CCPLiwMap* map = UnpackFromClientLC( aMessage ); + map->SetSecurityL( aMessage ); + TUint id( 0 ); + TPckg idData(id); + iDataManager->AddNonPersistentDataL( map ); + aMessage.WriteL( KReturnPosition, idData ); + CleanupStack::PopAndDestroy( map ); + } +// ----------------------------------------------------------------------------- +// CCPServerSession::GetListL +// --------------- -------------------------------------------------------------- +// +void CCPServerSession::GetListSizeL( const RMessage2& aMessage ) + { + CP_DEBUG( _L8("CCPServerSession::GetListSizeL()" ) ); + CCPLiwMap* map = UnpackFromClientLC( aMessage ); + map->SetSecurityL( aMessage ); + delete iParamList; + iParamList = NULL; + iParamList = CLiwGenericParamList::NewL( ); + iDataManager->GetListL( *map, *iParamList ); + TPckg sizeDes(iParamList->Size( ) ); + aMessage.WriteL( KReturnPosition, sizeDes ); + CleanupStack::PopAndDestroy( map ); + } + +// ----------------------------------------------------------------------------- +// CCPServerSession::GetListDataL +// --------------- -------------------------------------------------------------- +// +void CCPServerSession::GetListDataL( const RMessage2& aMessage ) + { + CP_DEBUG( _L8("CCPServerSession::GetListDataL()" ) ); + if( iParamList ) + { + ExternalizeAndWriteToClientL( aMessage, iParamList ); + delete iParamList; + } + iParamList = NULL; + } + +// ----------------------------------------------------------------------------- +// CCPServerSession::RemoveDataL +// --------------- -------------------------------------------------------------- +// +void CCPServerSession::RemoveDataL( const RMessage2& aMessage ) + { + CP_DEBUG( _L8("CCPServerSession::RemoveDataL()" ) ); + CCPLiwMap* map = UnpackFromClientLC( aMessage ); + map->SetSecurityL( aMessage ); + iDataManager->RemoveDataL( *map ); + CleanupStack::PopAndDestroy( map ); + } + +// ----------------------------------------------------------------------------- +// CCPServerSession::ExecuteActionL +// --------------- -------------------------------------------------------------- +// +void CCPServerSession::ExecuteActionL( const RMessage2& aMessage ) + { + TInt error(KErrNone); + CP_DEBUG( _L8("CCPServerSession::ExecuteActionSizeL()" ) ); + CCPLiwMap* map = UnpackFromClientLC( aMessage ); + CLiwGenericParamList* paramList = CLiwGenericParamList::NewLC( ); + CLiwDefaultList* list = CLiwDefaultList::NewLC(); + error = iDataManager->GetActionL( *map, *paramList, list ); + //we notify apart from action execution result. So in fact + //notification means there was an attempt to execute action + iDataManager->HandleChangeL( list ); + User::LeaveIfError( error ); + ExecuteL( *paramList ); + CleanupStack::PopAndDestroy( list ); + CleanupStack::PopAndDestroy( paramList ); + CleanupStack::PopAndDestroy( map ); + } + +// ----------------------------------------------------------------------------- +// CCPServerSession::ExecuteL +// --------------- -------------------------------------------------------------- +// +void CCPServerSession::ExecuteL( + const CLiwGenericParamList& aActionParams ) + { + for ( TInt i = 0; i < aActionParams.Count(); i++ ) + { + TLiwGenericParam param; + param.PushL(); + aActionParams.AtL( i, param ); + CLiwGenericParamList* singleAction = CLiwGenericParamList::NewLC(); + singleAction->AppendL( param ); + TRAP_IGNORE( iActionHandlerThread->ExecuteL( *singleAction ) ); + CleanupStack::PopAndDestroy( singleAction ); + CleanupStack::PopAndDestroy( ¶m ); + } + } + +// ----------------------------------------------------------------------------- +// CCPServerSession::RegisterObserverL +// --------------- -------------------------------------------------------------- +// +void CCPServerSession::RegisterObserverL( const RMessage2& aMessage ) + { + CP_DEBUG( _L8("CCPServerSession::RegisterObserverL()" ) ); + if ( !isRegister ) + { + if (aMessage.Int3() != KErrAlreadyExists && + aMessage.GetDesLength( KDescriptorPosition) < KErrNone ) + { + iServer->PanicClient( aMessage, ECPServerBadRequest ); + User::Leave( KErrGeneral ); + } + if ( !iNotificationHandler ) + { + iNotificationHandler = CCPNotificationHandler::NewL( + iServer->GetNotifications()); + iDataManager->AddObserverL( iNotificationHandler ); + } + iNotificationHandler->SaveMessageL( aMessage ); + isRegister = ETrue; + } + else + { + User::Leave( KErrInUse ); + } + } + +// ----------------------------------------------------------------------------- +// CCPServerSession::AddObserverL +// --------------- -------------------------------------------------------------- +// +void CCPServerSession::AddObserverL( const RMessage2& aMessage ) + { + CP_DEBUG( _L8("CCPServerSession::AddObserverL()" ) ); + if( iNotificationHandler ) + { + iNotificationHandler->AddObserverL( aMessage ); + } + } + +// ----------------------------------------------------------------------------- +// CCPServerSession::RemoveObserverL +// --------------- -------------------------------------------------------------- +// +void CCPServerSession::RemoveObserverL( const RMessage2& aMessage ) + { + CP_DEBUG( _L8("CCPServerSession::RemoveObserverL()" ) ); + if( iNotificationHandler ) + { + iNotificationHandler->RemoveObserverL( aMessage ); + } + } + + +// ----------------------------------------------------------------------------- +// CCPServerSession::UnregisterObserverL +// --------------- -------------------------------------------------------------- +// +void CCPServerSession::UnregisterObserverL() + { + CP_DEBUG( _L8("CCPServerSession::UnregisterObserverL()" ) ); + if ( isRegister ) + { + //remove notification handler from an array of sessions in data manager + iDataManager->RemoveObserver( iNotificationHandler ); + //reset filter for this session + iNotificationHandler->ErrorComplete( KErrCancel ); + delete iNotificationHandler; + iNotificationHandler = NULL; + isRegister = EFalse; + } + else + { + User::Leave( KErrNotFound ); + } + } + +// ----------------------------------------------------------------------------- +// CCPServerSession::GetChangeInfoDataL +// ----------------------------------------------------------------------------- +// +void CCPServerSession::GetChangeInfoDataL( const RMessage2& aMessage ) + { + CP_DEBUG( _L8("CCPServerSession::GetChangeInfoData()" ) ); + if( iNotificationHandler ) + { + isRegister = EFalse; + ExternalizeAndWriteToClientL( aMessage, + iNotificationHandler->GetPointerToChangeInfoList( ) ); + iNotificationHandler->Reset( ); + } + } + +// ----------------------------------------------------------------------------- +// CCPServerSession::ExternalizeAndWriteToClient +// ----------------------------------------------------------------------------- +// +void CCPServerSession::ExternalizeAndWriteToClientL( + const RMessage2& aMessage, const CLiwGenericParamList* outParamList ) + { + CP_DEBUG( _L8("CCPServerSession::ExternalizeAndWriteToClientL()" ) ); + HBufC8* buf = HBufC8::NewLC( outParamList->Size( ) ); + TPtr8 des = buf->Des( ); + RDesWriteStream writeStream(des); + CleanupClosePushL( writeStream ); + outParamList->ExternalizeL( writeStream ); + writeStream.CommitL( ); + aMessage.WriteL( KDescriptorPosition, des ); + CleanupStack::PopAndDestroy( &writeStream ); + CleanupStack::PopAndDestroy( buf ); + } + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +CCPLiwMap* CCPServerSession::UnpackFromClientLC( const RMessage2& aMessage ) + { + CP_DEBUG( _L8("CCPServerSession::UnpackFromClientLC()") ); + TInt deslen = aMessage.GetDesLengthL( KDescriptorPosition ); + HBufC8* buffer = HBufC8::NewLC( deslen ); + TPtr8 tempDes = buffer->Des( ); + aMessage.Read( KDescriptorPosition, tempDes ); + RDesReadStream datastrm( *buffer); + CleanupClosePushL( datastrm ); + CCPLiwMap* inParamList = CCPLiwMap::NewL( datastrm ); + CleanupStack::PopAndDestroy( &datastrm ); + CleanupStack::PopAndDestroy( buffer ); + inParamList->PushL( ); + return inParamList; + } + +// ----------------------------------------------------------------------------- +// CCPServerSession::SendNotificationL +// ----------------------------------------------------------------------------- +// +void CCPServerSession::SendNotificationL( CCPLiwMap* aMap, + CLiwDefaultList* aNotificationList ) + { + RBuf8 trigger; + trigger.CleanupClosePushL(); + aMap->GetPropertyL( KActionTrigger, trigger ); + if( ( trigger == KActivateTrigger ) || ( trigger == KDeactivateTrigger ) ) + { + iDataManager->HandleChangeL( aNotificationList ); + } + CleanupStack::PopAndDestroy( &trigger ); + } + +// ----------------------------------------------------------------------------- +// CCPServerSession::GetAndExecuteActionL +// --------------- -------------------------------------------------------------- +// +void CCPServerSession::GetAndExecuteActionL( CCPLiwMap* aMap, + CLiwDefaultList* aNotificationList, TBool aInsertTrigger ) + { + if (aInsertTrigger) + { + aMap->InsertL( KActionTrigger, TLiwVariant( KActivateTrigger ) ); + } + CLiwGenericParamList* paramList = CLiwGenericParamList::NewLC(); + iDataManager->GetActionL( *aMap, *paramList, aNotificationList ); + iActionHandlerThread->ExecuteL( *paramList ); + CleanupStack::PopAndDestroy( paramList ); + } + +// ----------------------------------------------------------------------------- +// CCPServerSession::GetServerLock +// --------------- -------------------------------------------------------------- +// +TBool CCPServerSession::GetServerLock( const RMessage2& aMessage ) + { + // Allways allow to unregister + return ( (aMessage.Function() != ECpServerUnRegisterObserver) + && iServer->GetLock() ); + + } +// End of File