diff -r 000000000000 -r 4e1aa6a622a0 psmservices/psmserver/src/server/psmsrvsession.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/psmservices/psmserver/src/server/psmsrvsession.cpp Tue Feb 02 00:53:00 2010 +0200 @@ -0,0 +1,317 @@ +/* +* Copyright (c) 2007 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: PSM Server session +* +*/ + + +#include +#include "psmmanager.h" +#include "psmsrvserver.h" +#include "psmsrvsession.h" +#include "psmsrvmessage.h" +#include "psmclientserver.h" +#include "psmtrace.h" + +// ----------------------------------------------------------------------------- +// CPsmSession::NewL +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +CPsmSession* CPsmSession::NewL( CPsmManager& aPsmManager, CPsmSrvServer& aServer ) + { + COMPONENT_TRACE( ( _L( "PSM Server - CPsmSession::NewL()" ) ) ); + + CPsmSession* self = CPsmSession::NewLC( aPsmManager, aServer ); + CleanupStack::Pop( self ); + + COMPONENT_TRACE( ( _L( "PSM Server - CPsmSession::NewL - return 0x%x" ), self ) ); + + return self; + } + +// ----------------------------------------------------------------------------- +// CPsmSession::NewLC +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +CPsmSession* CPsmSession::NewLC( CPsmManager& aPsmManager, CPsmSrvServer& aServer ) + { + COMPONENT_TRACE( ( _L( "PSM Server - CPsmSession::NewLC()" ) ) ); + + CPsmSession* self = new( ELeave ) CPsmSession( aPsmManager, aServer ); + + CleanupStack::PushL( self ); + self->ConstructL(); + + COMPONENT_TRACE( ( _L( "PSM Server - CPsmSession::NewLC - return 0x%x" ), self ) ); + + return self; + } + +// ----------------------------------------------------------------------------- +// CPsmSession::CPsmSession +// C++ default constructor can NOT contain any code, that +// might leave. +// ----------------------------------------------------------------------------- +// +CPsmSession::CPsmSession( CPsmManager& aPsmManager, CPsmSrvServer& aServer ) : + iPsmServer( aServer ), + iPsmManager( aPsmManager ) + { + // Nothing to do + } + +// ----------------------------------------------------------------------------- +// CPsmSession::ConstructL +// Symbian 2nd phase constructor can leave. +// ----------------------------------------------------------------------------- +// +void CPsmSession::ConstructL() + { + COMPONENT_TRACE( ( _L( "PSM Server - CPsmSession::ConstructL()" ) ) ); + COMPONENT_TRACE( ( _L( "PSM Server - CPsmSession::ConstructL - return" ) ) ); + } + +// ----------------------------------------------------------------------------- +// Destructor +// ----------------------------------------------------------------------------- +// +CPsmSession::~CPsmSession() + { + COMPONENT_TRACE( ( _L( "PSM Server - CPsmSession::~CPsmSession()" ) ) ); + + // Notify server that session is closed + iPsmServer.SessionClosed(); + + // Complete notify message if it is not null + if ( iNotifyModeMessage ) + { + iNotifyModeMessage->Complete( KErrCancel ); + // Unregister observer from manager + iPsmManager.UnregisterObserver( iNotifyModeMessage ); + // Finally delete message + delete iNotifyModeMessage; + } + + else + { + COMPONENT_TRACE( ( _L( "PSM Server - CPsmSession::~CPsmSession - No pending requests") ) ); + } + + // Reset and close config array + iConfigArray.Reset(); + iConfigArray.Close(); + + COMPONENT_TRACE( ( _L( "PSM Server - CPsmSession::~CPsmSession - return") ) ); + } + +// ----------------------------------------------------------------------------- +// CPsmSession::ServiceL +// ----------------------------------------------------------------------------- +// +void CPsmSession::ServiceL( const RMessage2& aMessage ) + { + COMPONENT_TRACE( ( _L( "PSM Server - CPsmSession::ServiceL()" ) ) ); + + TRAPD( error, DispatchL( aMessage ) ); + + // Complete message with error code if there were errors + if ( KErrNone != error ) + { + COMPONENT_TRACE( ( _L( "PSM Server - CPsmSession::ServiceL() - Error: %i" ), error ) ); + aMessage.Complete( error ); + } + + COMPONENT_TRACE( ( _L( "PSM Server - CPsmSession::ServiceL - return" ) ) ); + } + +// ----------------------------------------------------------------------------- +// CPsmSession::DispatchL +// ----------------------------------------------------------------------------- +// +void CPsmSession::DispatchL( const RMessage2& aMessage ) + { + COMPONENT_TRACE( ( _L( "PSM Server - CPsmSession::DispatchL()" ) ) ); + + switch ( aMessage.Function() ) + { + case EPsmServerNotifyModeChange: // For power save mode change + { + TInt mode = aMessage.Int0(); + if ( !iNotifyModeMessage ) + { + // Create message wrapper if not yet created + iNotifyModeMessage = CPsmMessage::NewL( iPsmManager ); + iPsmManager.RegisterObserver( iNotifyModeMessage ); + } + + // Check that mode to be set is valid, otherwise error code. + if( mode == iPsmManager.SettingsProvider().Mode() ) + { + User::Leave( KErrAlreadyExists ); + } + + if( ( mode > EPsmsrvPartialMode ) || ( mode < EPsmsrvModeNormal ) ) + { + User::Leave( KErrArgument ); + } + + iNotifyModeMessage->Initialize( aMessage ); + iPsmManager.NotifyPowerSaveModeChangeL( mode ); + break; + } + case EPsmServerChangeSettings: // For PSM settings + case EPsmServerGetSettings: // For PSM settings + case EPsmServerBackupSettings: // For PSM settings + { + // Check previous config + if ( iConfigArray.Count() > 0 ) + { + iConfigArray.Reset(); + } + + // Handle settings requests in different function + HandleSettingsRequestL( aMessage ); + break; + } + + case EPsmServerCancelModeChange: // For cancelling PSM change + { + // Cancel PSM change and return previous mode + if ( iNotifyModeMessage ) + { + // Unregister observer from manager + iPsmManager.UnregisterObserver( iNotifyModeMessage ); + // Cancel pending message + iNotifyModeMessage->Complete( KErrCancel ); + // Finally delete message + delete iNotifyModeMessage; + iNotifyModeMessage = NULL; + } + + // Call PsmManager to stop mode change and to go back to previous + iPsmManager.CancelPowerSaveModeChangeL(); + // Complete message + aMessage.Complete( KErrNone ); + break; + } + case EPsmServerModeChangeNotificationRequest: // PSM Change notification request + { + if ( !iNotifyModeMessage ) + { + // Create message wrapper if not yet created + iNotifyModeMessage = CPsmMessage::NewL( iPsmManager ); + iPsmManager.RegisterObserver( iNotifyModeMessage ); + } + iNotifyModeMessage->Initialize( aMessage ); + break; + } + case EPsmServerCancelModeChangeNotificationRequest: // For cancelling PSM change notification + { + // Cancel PSM change notification request + if ( iNotifyModeMessage ) + { + // Unregister observer from manager + iPsmManager.UnregisterObserver( iNotifyModeMessage ); + // Cancel pending message + iNotifyModeMessage->Complete( KErrCancel ); + // Finally delete message + delete iNotifyModeMessage; + iNotifyModeMessage = NULL; + } + // Complete message + aMessage.Complete( KErrNone ); + break; + } + default: + { + COMPONENT_TRACE( ( _L( "PSM Server - CPsmSession::ServiceL() - unknown request: %i - ERROR" ), aMessage.Function() ) ); + User::Leave( KErrUnknown ); + } + } + + COMPONENT_TRACE( ( _L( "PSM Server - CPsmSession::DispatchL - return" ) ) ); + } + +// ----------------------------------------------------------------------------- +// CPsmSession::HandleSettingsRequestL +// ----------------------------------------------------------------------------- +// +void CPsmSession::HandleSettingsRequestL( const RMessage2& aMessage ) + { + COMPONENT_TRACE( ( _L( "PSM Server - CPsmSession::HandleSettingsRequestL()" ) ) ); + + // read config array from message + ReadConfigArrayL( iConfigArray, aMessage ); + // Get storage UID + TUint32 storage = aMessage.Int2(); + + TInt err( KErrNone ); + + if ( aMessage.Function() == EPsmServerBackupSettings ) + { + iPsmManager.SettingsProvider().BackupSettingsL( iConfigArray, storage ); + } + else + { + if ( aMessage.Function() == EPsmServerGetSettings ) + { + iPsmManager.SettingsProvider().GetSettingsL( iConfigArray, storage ); + } + else + { + // EPsmServerChangeSettings + iPsmManager.SettingsProvider().BackupAndGetSettingsL( iConfigArray, storage ); + } + + // We have to write changed values back to message + TInt arraySize( iConfigArray.Count() * sizeof( TPsmsrvConfigInfo ) ); + TPtr8 arrayPtr( reinterpret_cast(&iConfigArray[0]), arraySize, arraySize ); + err = aMessage.Write( 0, arrayPtr ); + ERROR_TRACE( ( _L( "PSM Server - CPsmSession::HandleSettingsRequestL - New data wrote to message: %i" ), err ) ); + } + // Complete message before destroying local config array + aMessage.Complete( err ); + COMPONENT_TRACE( ( _L( "PSM Server - CPsmSession::HandleSettingsRequestL - return" ) ) ); + } + +// ----------------------------------------------------------------------------- +// CPsmSession::ReadConfigArrayL +// ----------------------------------------------------------------------------- +// +void CPsmSession::ReadConfigArrayL( RConfigInfoArray& aArray, const RMessage2& aMessage ) + { + COMPONENT_TRACE( ( _L( "PSM Server - CPsmSession::ReadConfigArrayL()" ) ) ); + + const TInt configCount( aMessage.Int1() ); + TInt arrayLength( configCount * sizeof( TPsmsrvConfigInfo ) ); + + // There is no ResizeL() for RArray + // ReserveL() does not change iCount, which will + // result array[0] failure (access beyond array index) + // That is why we fill the array with dummy items + for(TInt x = 0; x < configCount; ++x ) + { + // Append empty config infos to array + aArray.AppendL( TPsmsrvConfigInfo() ); + } + + TPtr8 arrayPtr( ( TUint8* )&aArray[0], arrayLength, arrayLength ); + aMessage.ReadL( 0, arrayPtr, 0 ); + + COMPONENT_TRACE( ( _L( "PSM Server - CPsmSession::ReadConfigArrayL - return" ) ) ); + } + +// End of file