diff -r 6ca72c0fe49a -r a941bc465d9f PECengine/StorageManager2/ServerSrc/CPEngStorageSubSession.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/PECengine/StorageManager2/ServerSrc/CPEngStorageSubSession.cpp Wed Sep 01 12:31:13 2010 +0100 @@ -0,0 +1,352 @@ +/* +* 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: Sub-session class of the Storage Server +* +*/ + + + +// INCLUDE FILES +#include +#include "CPEngStorageSubSession.h" +#include "PEngStorageServerCommon.h" + +#include "CPEngStorageFolder.h" +#include "MPEngStorageServer.h" +#include "RPEngMessage.h" + + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CPEngStorageSubSession::CPEngStorageSubSession +// C++ default constructor can NOT contain any code, that might leave. +// ----------------------------------------------------------------------------- +// +CPEngStorageSubSession::CPEngStorageSubSession( TInt32 aSessionId ) + : iBufferedNotif( 10 ), // 10 as value to grow array + iSessionId( aSessionId ) + { + } + + +// ----------------------------------------------------------------------------- +// CPEngStorageSubSession::ConstructL +// Symbian 2nd phase constructor can leave. +// ----------------------------------------------------------------------------- +// +void CPEngStorageSubSession::ConstructL( + MPEngStorageServer& aServer, + const RPEngMessage& aMessage ) + { + iStorageFolder = aServer.StorageFolderL( aMessage ); + } + + +// ----------------------------------------------------------------------------- +// CPEngStorageSubSession::NewL +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +CPEngStorageSubSession* CPEngStorageSubSession::NewL( + MPEngStorageServer& aServer, + const RPEngMessage& aMessage, + TInt32 aSessionId ) + { + CPEngStorageSubSession* self = NewLC( aServer, aMessage, aSessionId ); + + CleanupStack::Pop(); // self + + return self; + } + + +// ----------------------------------------------------------------------------- +// CPEngStorageSubSession::NewLC +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +CPEngStorageSubSession* CPEngStorageSubSession::NewLC( + MPEngStorageServer& aServer, + const RPEngMessage& aMessage, + TInt32 aSessionId ) + { + CPEngStorageSubSession* self = new( ELeave ) CPEngStorageSubSession( aSessionId ); + + CleanupClosePushL( *self ); + self->ConstructL( aServer, aMessage ); + return self; + } + + +// Destructor +CPEngStorageSubSession::~CPEngStorageSubSession() + { + iBufferedNotif.Reset(); + // decrease count of the storage Folder + if ( iStorageFolder ) + { + iStorageFolder->CancelSubSessionRequests( iSessionId, iHandle ); + iStorageFolder->Close(); + } + } + + + +// ============================================================================= +// =============== Functions from base class =================================== +// ============================================================================= + + +// ----------------------------------------------------------------------------- +// CPEngStorageSubSession::DisplayName() +// ----------------------------------------------------------------------------- +// +TBool CPEngStorageSubSession::DispatchMessageL( + const RPEngMessage& aMessage, + TInt aRequest ) + { + TBool completeMessage( ETrue ); + switch ( aRequest ) + { + /*********************************************************************/ + /* Asynchronous Requests Management */ + /*********************************************************************/ + + // Cancel Asynchronous request Request + case EFolderSubSessCancelRequest: + { + iStorageFolder->CancelRequest( aMessage, + iSessionId, + iHandle ); + break; + } + + // Reload Asynchronous Scout on the Server side + case EFolderSubSessReloadAsynchronousScout: + { + iStorageFolder->ReloadAsyncScoutL( aMessage, + iSessionId, + iHandle ); + completeMessage = EFalse; + break; + } + + /*********************************************************************/ + /* Store Entry management */ + /*********************************************************************/ + + // Write store entry + case EFolderSubSessWriteEntry: + { + const CPEngDataEntry* entry = iStorageFolder->WriteStoreEntryL( + aMessage, + !iBufferingActiveCounter, + iSessionId, + iHandle ); + if ( entry ) + { + TInt err( iBufferedNotif.InsertInAddressOrder( entry ) ); + err = err == KErrAlreadyExists ? KErrNone : err; + User::LeaveIfError( err ); + } + break; + } + + // Read store Entry + case EFolderSubSessReadEntry: + { + iStorageFolder->ReadStoreEntryL( aMessage ); + break; + } + + // Get Entry size + case EFolderSubSessGetEntryLength: + { + iStorageFolder->GetStoreEntryLengthL( aMessage ); + break; + } + + // Remove Store entry from the storage + case EFolderSubSessRemoveEntry: + { + iStorageFolder->RemoveStoreEntryL( aMessage ); + break; + } + + // Lock Store Entry + case EFolderSubSessLockEntry: + { + iStorageFolder->LockStoreEntryL( aMessage, + iSessionId, + iHandle ); + completeMessage = EFalse; + break; + } + + // Unlock the Store entry + case EFolderSubSessUnlockEntry: + { + // check if it is needed to buffer notification + const CPEngDataEntry* entry = + iStorageFolder->UnlockStoreEntryL( + aMessage, + !iBufferingActiveCounter, + iSessionId, + iHandle ); + if ( entry ) + { + TInt err( iBufferedNotif.InsertInAddressOrder( entry ) ); + err = err == KErrAlreadyExists ? KErrNone : err; + User::LeaveIfError( err ); + } + completeMessage = EFalse; + break; + } + + // Is Store entry locked + case EFolderSubSessIsEntryLocked: + { + iStorageFolder->IsStoreEntryLockedL( aMessage ); + completeMessage = EFalse; + break; + } + + // Suspend notification to the client + case EFolderSubSessSuspendNotification: + { + iBufferingActiveCounter += aMessage.Int0(); + aMessage.Complete( iBufferingActiveCounter ); + completeMessage = EFalse; + break; + } + + // Resume notification to the client + case EFolderSubSessResumeNotification: + { + ResumeSIDsNotification( aMessage.Int0() ); + aMessage.Complete( iBufferingActiveCounter ); + completeMessage = EFalse; + break; + } + + /*********************************************************************/ + /* Storage ID changes notify management */ + /*********************************************************************/ + + // Synchronous Request to register for notification + case EFolderSubSessListenSIDsChanges: + { + iStorageFolder->ListenSIDsChangesL( aMessage, + iSessionId, + iHandle ); + break; + } + + // Synchronous Request to update set of SIDs client + case EFolderSubSessUpdateListenSIDsScout: + { + iStorageFolder->UpdateListenSIDsScoutL( aMessage, + iSessionId, + iHandle ); + break; + } + + // Fetch indexes of changed SIds + case EFolderSubSessFetchChangedSIDsIndexes: + { + iStorageFolder->FetchChangedIdsIndexesL( aMessage, + iSessionId, + iHandle ); + break; + } + + // Synchronous Request to force notify Store Entry change + case EFolderSubSessNotifyChangedSIDs: + { + // check if it is needed to buffer notification + const CPEngDataEntry* entry = + iStorageFolder->NotifyChangedStorageIdL( + aMessage, + !iBufferingActiveCounter ); + if ( entry ) + { + TInt err( iBufferedNotif.InsertInAddressOrder( entry ) ); + err = err == KErrAlreadyExists ? KErrNone : err; + User::LeaveIfError( err ); + } + + break; + } + + default: + { + PanicClient( aMessage, ESSBadRequest ); + break; + } + } + // check if message can be completed + completeMessage &= aMessage.MessageValid(); + return completeMessage; + } + +// ----------------------------------------------------------------------------- +// CPEngStorageSubSession::SetSubSesionHandle() +// ----------------------------------------------------------------------------- +// +void CPEngStorageSubSession::SetSubSesionHandle( + TInt aHandle ) + { + iHandle = aHandle; + } + + +// ============================================================================= +// =============== Private Functions from base class =========================== +// ============================================================================= + +// ----------------------------------------------------------------------------- +// CPEngStorageSubSession::PanicClient() +// Panic client +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CPEngStorageSubSession::PanicClient( + const RPEngMessage& aMessage, + const TInt aPanic ) const + { + aMessage.Panic( KStorageSessionName, aPanic ); + } + + +// ----------------------------------------------------------------------------- +// CPEngStorageSubSession::ResumeSIDsNotificationL() +// Resume Notification of the SIDs +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CPEngStorageSubSession::ResumeSIDsNotification( + TInt aCount ) + { + iBufferingActiveCounter -= aCount; + if ( iBufferingActiveCounter <= KErrNone ) + { + // notify buffered SIDs + iBufferingActiveCounter = KErrNone; + iStorageFolder->NotifySIDChanges( iBufferedNotif ); + iBufferedNotif.Reset(); + } + } + +// End of File