--- /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 <e32base.h>
+#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<TInt32>( 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<TInt32>( this ) );
+ break;
+ }
+
+ /*********************************************************************/
+ /* Asynchronous Requests Management */
+ /*********************************************************************/
+
+ // Cancel Asynchronous request Request
+ case EMainSessCancelRequest:
+ {
+ iStorageServer.CancelRequestL( aMessage,
+ reinterpret_cast<TInt32>( this ) );
+ break;
+ }
+
+ // Reload Asynchronous Scout on the Server side
+ case EMainSessReloadAsynchronousScout:
+ {
+ iStorageServer.ReloadAsynchronousScoutL( aMessage,
+ reinterpret_cast<TInt32>( 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<TInt32>( 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<TInt> 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<TInt32>( 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<TInt> 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<CPEngStorageSubSession*> (
+ iSubSessions->AtL( aHandle ) );
+ }
+
+
+// -----------------------------------------------------------------------------
+// CPEngStorageSession::FindAdminSubSessionL()
+// -----------------------------------------------------------------------------
+//
+CPEngAdminSubSession* CPEngStorageSession::FindAdminSubSessionL(
+ TUint aHandle )
+ {
+ // if there is no sub-session, it leaves with KErrBadHandle
+ return static_cast<CPEngAdminSubSession*> (
+ iSubSessions->AtL( aHandle ) );
+ }
+
+
+// -----------------------------------------------------------------------------
+// CPEngStorageSession::PanicClient()
+// -----------------------------------------------------------------------------
+//
+void CPEngStorageSession::PanicClient( const RPEngMessage& aMessage,
+ const TInt aPanic ) const
+ {
+ aMessage.Panic( KStorageSessionName, aPanic );
+ }
+
+
+// End of File
+
+
+
+
+
+
+
+
+