diff -r 000000000000 -r 094583676ce7 PECengine/StorageManager2/ServerSrc/CPEngStorageSession.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/PECengine/StorageManager2/ServerSrc/CPEngStorageSession.cpp Thu Dec 17 08:41:52 2009 +0200 @@ -0,0 +1,415 @@ +/* +* Copyright (c) 2002 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: Implementation of class CPEngStorageSession +* +*/ + + +// Include Files +#include +#include "CPEngStorageSession.h" +#include "MPEngStorageServer.h" +#include "CPEngStorageSubSession.h" +#include "CPEngAdminSubSession.h" +#include "RPEngMessage.h" +#include "PEngStorageServerCommon.h" +#include "PEngInternalGlobalConsts.h" + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CPEngStorageSession::CPEngStorageSession +// C++ default constructor can NOT contain any code, that might leave. +// ----------------------------------------------------------------------------- +// +CPEngStorageSession::CPEngStorageSession( MPEngStorageServer& aServer ) + : iStorageServer( aServer ) + { + iStorageServer.SessionCreated(); + } + + +// ----------------------------------------------------------------------------- +// CPEngStorageSession::ConstructL +// Symbian 2nd phase constructor can leave. +// ----------------------------------------------------------------------------- +// +void CPEngStorageSession::ConstructL() + { + iSubSessions = CObjectIx::NewL(); + } + + +// Static constructor +CPEngStorageSession* CPEngStorageSession::NewL( MPEngStorageServer& aServer ) + { + CPEngStorageSession* self = CPEngStorageSession::NewLC( aServer ); + CleanupStack::Pop(); + + return self; + } + + +// ----------------------------------------------------------------------------- +// CPEngStorageSession::NewLC +// Symbian 2nd phase constructor can leave.leaves pointer to cleanup-stack +// ----------------------------------------------------------------------------- +// +CPEngStorageSession* CPEngStorageSession::NewLC( MPEngStorageServer& aServer ) + { + CPEngStorageSession* self = new( ELeave ) CPEngStorageSession( aServer ); + CleanupStack::PushL( self ); + self->ConstructL(); + return self; + } + + +// Destructor (virtual by CBase) +CPEngStorageSession::~CPEngStorageSession() + { + delete iSubSessions; + iStorageServer.CancelAllSessionRequests( reinterpret_cast( this ) ); + iStorageServer.SessionDied(); + + +#if _BullseyeCoverage + cov_write(); +#endif + } + + +// ============================================================================= +// =============== Functions from CSession2 base class ========================= +// ============================================================================= + +// ----------------------------------------------------------------------------- +// CPEngStorageSession::ServiceL() +// ----------------------------------------------------------------------------- +// +void CPEngStorageSession::ServiceL( const RMessage2 &aMessage ) + { + iCompleteMessage = ETrue; + DispatchMessageL( RPEngMessage( aMessage ) ); + if ( iCompleteMessage ) + { + aMessage.Complete( KErrNone ); + } + } + + +// ----------------------------------------------------------------------------- +// CPEngStorageSession::ServiceError() +// ----------------------------------------------------------------------------- +// +void CPEngStorageSession::ServiceError( const RMessage2& aMessage, TInt aError ) + { + aMessage.Complete( aError ); + } + + + +// ============================================================================= +// =============== Private functions of the Session class ====================== +// ============================================================================= + +// ----------------------------------------------------------------------------- +// CPEngStorageSession::DispatchMessageL() +// ----------------------------------------------------------------------------- +// +void CPEngStorageSession::DispatchMessageL( const RPEngMessage& aMessage ) + { + if ( iStorageServer.BackUpActive() ) + { + User::Leave( KErrServerBusy ); + } + TInt request( aMessage.Function() ); + switch ( request ) + { + /*********************************************************************/ + /* Server Management */ + /*********************************************************************/ + + // shut down the server + case EMainSessShutdownServer: + { + + break; + } + + /*********************************************************************/ + /* Sub Session management */ + /*********************************************************************/ + + // Create new sub-session + case EMainSessCreateFolderSubSession: + { + CreateNewFolderSubSessionL( aMessage ); + break; + } + + // Create new Administrator sub-session + case EMainSessCreateAdminSubSession: + { + CreateNewAdminSubSessionL( aMessage ); + break; + } + + // close sub-session + case EMainSessCloseSubSession: + { + RemoveSubSessionL( aMessage.Int3() ); + break; + } + + /*********************************************************************/ + /* Global Event Notification */ + /*********************************************************************/ + + // start listening of global event + case EMainSessListenGlobalEvents: + { + iStorageServer.RegisterGlobEventListenerL( aMessage, + reinterpret_cast( this ) ); + break; + } + + /*********************************************************************/ + /* Asynchronous Requests Management */ + /*********************************************************************/ + + // Cancel Asynchronous request Request + case EMainSessCancelRequest: + { + iStorageServer.CancelRequestL( aMessage, + reinterpret_cast( this ) ); + break; + } + + // Reload Asynchronous Scout on the Server side + case EMainSessReloadAsynchronousScout: + { + iStorageServer.ReloadAsynchronousScoutL( aMessage, + reinterpret_cast( this ) ); + iCompleteMessage = EFalse; + break; + } + + /*********************************************************************/ + /* Session Slot Management */ + /*********************************************************************/ + + // Create Session Slot Folder + case EMainSessCreateSessionFolder: + { + iStorageServer.CreateSessionFolderL( aMessage ); + break; + } + + // Remove Session Slot Folder + case EMainSessRemoveSessionFolder: + { + iStorageServer.RemoveSessionFolderL( aMessage ); + break; + } + + // Get Session Slot State + case EMainSessGetSessionState: + { + iStorageServer.SessionStateL( aMessage ); + break; + } + + // Get States of all sessions + case EMainSessGetAllSessionStates: + { + iStorageServer.AllSessionStatesL( aMessage ); + break; + } + + /*********************************************************************/ + /* Admin sub session requests */ + /*********************************************************************/ + + // Wipe session slot folder from storage + case EMainSessWipeSessionFolder: + { + iStorageServer.WipeSessionSlotFolderL( aMessage ); + break; + } + + /*********************************************************************/ + /* Admin sub session requests */ + /*********************************************************************/ + + // Is this request meant to be for admin client + case EAdminSubSessNotifyNewEvent: + case EAdminSubSessCheckAppIdRegistration: + { + iCompleteMessage = + FindAdminSubSessionL( aMessage.Int3() )->DispatchMessageL( + aMessage, + request ); + break; + } + + default: + { + // try to handle message in sub-session + iCompleteMessage = + FindFolderSubSessionL( aMessage.Int3() )->DispatchMessageL( + aMessage, + request ); + break; + } + } + iCompleteMessage &= aMessage.MessageValid(); + } + + + +// ----------------------------------------------------------------------------- +// CPEngStorageSession::CreateNewSubSessionL() +// ----------------------------------------------------------------------------- +// +void CPEngStorageSession::CreateNewFolderSubSessionL( + const RPEngMessage& aMessage ) + { + CPEngStorageSubSession* subSession = + CPEngStorageSubSession::NewLC( iStorageServer, + aMessage, + reinterpret_cast( this ) ); + iStorageServer.AddSubSessionL( *subSession ); + CleanupStack::Pop( ); // subSession + + TInt handle( 0 ); + TRAPD( err, handle = iSubSessions->AddL( subSession ) ); + if ( err != KErrNone ) + { + iStorageServer.RemoveSubSessionL( *subSession ); + User::Leave( err ); + } + + subSession->SetSubSesionHandle( handle ); + + // write back handle of the sub-session + TPckg handlePckg( handle ); + err = aMessage.WriteOneDescriptor( KMessageSlot3 , + handlePckg ); + if ( err != KErrNone ) + { + iSubSessions->Remove( handle ); + PanicClient( aMessage, ESSBadDescriptor ); + } + } + + + +// ----------------------------------------------------------------------------- +// CPEngStorageSession::CreateAdminSubSessionL() +// ----------------------------------------------------------------------------- +// +void CPEngStorageSession::CreateNewAdminSubSessionL( + const RPEngMessage& aMessage ) + { + CPEngAdminSubSession* subSession = + CPEngAdminSubSession::NewLC( iStorageServer, + aMessage, + reinterpret_cast( this ) ); + + iStorageServer.AddSubSessionL( *subSession ); + CleanupStack::Pop( ); // newSubsSession + + TInt handle( 0 ); + TRAPD( err, handle = iSubSessions->AddL( subSession ) ); + if ( err != KErrNone ) + { + iStorageServer.RemoveSubSessionL( *subSession ); + User::Leave( err ); + } + + subSession->SetSubSesionHandle( handle ); + + // write back handle of the sub-session + TPckg handlePckg( handle ); + err = aMessage.WriteOneDescriptor( KMessageSlot3, + handlePckg ); + if ( err != KErrNone ) + { + iSubSessions->Remove( handle ); + PanicClient( aMessage, ESSBadDescriptor ); + } + } + + + +// ----------------------------------------------------------------------------- +// CPEngStorageSession::RemoveSubSession() +// ----------------------------------------------------------------------------- +// +void CPEngStorageSession::RemoveSubSessionL( + TUint aHandle ) + { + // this will leave if there is such a sub-session + iSubSessions->AtL( aHandle ); + iSubSessions->Remove( aHandle ); + } + + +// ----------------------------------------------------------------------------- +// CPEngStorageSession::FindSubSession() +// ----------------------------------------------------------------------------- +// +CPEngStorageSubSession* CPEngStorageSession::FindFolderSubSessionL( + TUint aHandle ) + { + // if there is no sub-session, it leaves with KErrBadHandle + return static_cast ( + iSubSessions->AtL( aHandle ) ); + } + + +// ----------------------------------------------------------------------------- +// CPEngStorageSession::FindAdminSubSessionL() +// ----------------------------------------------------------------------------- +// +CPEngAdminSubSession* CPEngStorageSession::FindAdminSubSessionL( + TUint aHandle ) + { + // if there is no sub-session, it leaves with KErrBadHandle + return static_cast ( + iSubSessions->AtL( aHandle ) ); + } + + +// ----------------------------------------------------------------------------- +// CPEngStorageSession::PanicClient() +// ----------------------------------------------------------------------------- +// +void CPEngStorageSession::PanicClient( const RPEngMessage& aMessage, + const TInt aPanic ) const + { + aMessage.Panic( KStorageSessionName, aPanic ); + } + + +// End of File + + + + + + + + +