psmservices/psmserver/src/server/psmsrvsession.cpp
changeset 0 4e1aa6a622a0
child 12 4a5c47a50617
--- /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 <psmsettingsprovider.h>
+#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<TUint8*>(&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