diff -r 000000000000 -r 4e1aa6a622a0 sysstatemgmt/systemstatemgr/cmn/src/ssmstatemanager.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/sysstatemgmt/systemstatemgr/cmn/src/ssmstatemanager.cpp Tue Feb 02 00:53:00 2010 +0200 @@ -0,0 +1,226 @@ +// Copyright (c) 2007-2009 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: +// + +#include +#include "ssmclisrv.h" + +/** + Connect this session without pre-allocating any async message slots. + This version of @c Connect signifies that the session has no dedicated pool of asynchronous message + objects but uses the global pool, reducing the kernel memory required to create the session. + This is the best version to use unless either: + 1. The session never sends asynchronous messages, in which case you should specify '0', OR + 2. The session makes guarantees on at least one asynchronous API that it cannot fail with KErrNoMemory - + in which case the maximum number of concurrent asynchronous messages that may + be outstanding on a single session must be used. + +@return KErrNone or a system wide errorcode + */ + EXPORT_C TInt RSsmStateManager::Connect() + { + const TInt KTryAllocSlotsFromSystemPoolInRuntime = -1; + return Connect(KTryAllocSlotsFromSystemPoolInRuntime); + } + +/** + Connect this session with pre-allocated async message slots. + + In theory a maximum of 3 slots is required for state transition requests because + the server can only have two requests queued but must still be able to handle an incoming + request to ESsmFail. There is no upper limit for the number of slots that might be + required for Swp change requests. + + @return KErrNone or a system wide errorcode +*/ +EXPORT_C TInt RSsmStateManager::Connect(TInt aAsyncMessageSlots) + { + return DoConnect(KSsmServerName, Version(), aAsyncMessageSlots); + } + +/** + This exists for testing purposes only. + @internalComponent + */ +TInt RSsmStateManager::DoConnect(const TDesC& aServerName, TVersion aVersion, TInt aAsyncMessageSlots) + { + if(!Handle()) + { + return CreateSession(aServerName, aVersion, aAsyncMessageSlots); + } + + return KErrAlreadyExists; + } //lint !e1746 Suppress parameter 'aVersion' could be made const reference + +/** + Close this session. + */ +EXPORT_C void RSsmStateManager::Close() + { + RSessionBase::Close(); + } + +/** + Used as part of connect requests to ensure compatibility between client and server binaries. + @internalComponent + */ +TVersion RSsmStateManager::Version() const + { + return(TVersion(KSsmServMajorVersionNumber, KSsmServMinorVersionNumber, KSsmServBuildVersionNumber)); + } + +/** +Issues a synchronous request for a transition from current system state to @c aRequest. +The request does not return until the transition has been started (or been rejected). + +@param aRequest The requested target system state together with a reason. +@return Returns either @c KErrNone if the request was accepted or @c KErrNotSupported + if the request could not be allowed. If the SendReceive operation + failed, a system wide errorcode is returned. +*/ +EXPORT_C TInt RSsmStateManager::RequestStateTransition(TSsmStateTransition aRequest) + { + if(Handle()) + { + const TUint32 stateAsInt = aRequest.State().Int(); + const TInt reason = aRequest.Reason(); + return SendReceive(ERequestStateTransition, TIpcArgs(stateAsInt, reason)); + } + + return KErrDisconnected; + } //lint !e1746 Suppress parameter 'aRequest' could be made const reference + +/** +Issues an asynchronous request for a transition from current system state to @c aRequest. +The @c TRequestStatus will be completed when the transition has been started (or +earlier if it is rejected by the policy). + +@param aRequest The requested target system state together with a reason. +@param aStatus The request status object used to contain the completion status of the request. + The completion status will be either @c KErrNone when the tansition is started or + @c KErrNotSupported if the request could not be allowed. + One of the system wide error-codes if the @c SendReceive operation failed. +*/ +EXPORT_C void RSsmStateManager::RequestStateTransition(TSsmStateTransition aRequest, TRequestStatus& aStatus) + { + if(Handle()) + { + const TUint32 stateAsInt = aRequest.State().Int(); + const TInt reason = aRequest.Reason(); + SendReceive(ERequestStateTransition, TIpcArgs(stateAsInt, reason), aStatus); + return; + } + + TRequestStatus* clientStatus = &aStatus; + User::RequestComplete(clientStatus, KErrDisconnected); + } //lint !e1746 Suppress parameter 'aRequest' could be made const reference + +/** +Issues a synchronous request to cancel all pending transitions which have been requested +from this session. Refer to the @c TRequestStatus that was passed into the async +@c RequestStateTransition to see if a request was Cancelled. + +It is not possible to Cancel an ongoing system state transition with this function +If you want to abort a transition that is already in progress you need to request +another transition, it is then up to the system state policy DLL implementation to finish +the ongoing transition as early as possible and start on the new transition. +*/ +EXPORT_C void RSsmStateManager::RequestStateTransitionCancel() + { + if(Handle()) + { + const TInt kErrNone = SendReceive(ERequestStateTransitionCancel); + } //lint !e529 Suppress symbol not subsequently referenced. Because synchronous IPC never fails + } + +/** +Issues a synchronous request to change the value of a System Wide Property. +The request does not return until the request has been started (or been rejected). + +@param aSwp The identifier for the Swp and its new value. +@return Returns either @c KErrNone if the request was accepted or @c KErrNotSupported + if the request could not be allowed. If the SendReceive operation + failed, a system wide errorcode is returned. +*/ +EXPORT_C TInt RSsmStateManager::RequestSwpChange(TSsmSwp aSwp) + { + if(Handle()) + { + TUint32 key = aSwp.Key(); + TInt value = aSwp.Value(); + return SendReceive(ERequestSwpChange, TIpcArgs(key, value)); + } + + return KErrDisconnected; + } //lint !e1746 Suppress parameter 'aSwp' could be made const reference + +/** +Issues an asynchronous request to change the value of a System Wide Property. +The @c TRequestStatus will be completed when the request has been started (or been rejected). + +@param aSwp The identifier for the Swp and its new value. +@param aStatus The request status object used to contain the completion status of the request. + The completion status will be either @c KErrNone if the request was accepted or + @c KErrNotSupported if the request could not be allowed. + One of the system wide error-codes if the @c SendReceive operation failed. +*/ +EXPORT_C void RSsmStateManager::RequestSwpChange(TSsmSwp aSwp, TRequestStatus& aStatus) + { + if(Handle()) + { + TUint32 key = aSwp.Key(); + TInt value = aSwp.Value(); + SendReceive(ERequestSwpChange, TIpcArgs(key, value), aStatus); + return; + } + + TRequestStatus* clientStatus = &aStatus; + User::RequestComplete(clientStatus, KErrDisconnected); + } //lint !e1746 Suppress parameter 'aSwp' could be made const reference + +/** +Request to Cancel any request originating from this session for which the @c TRequestStatus +has not yet been completed. +*/ +EXPORT_C void RSsmStateManager::RequestSwpChangeCancel() + { + if(Handle()) + { + const TInt kErrNone = SendReceive(ERequestSwpChangeCancel); + } //lint !e529 Suppress symbol not subsequently referenced. Because synchronous IPC never fails + } + +/** +Establish a mapping between the identifier key of a System Wide Property and the DLL that implements +the MSsmSwpPolicy interface for the System Wide Property in question. + +These DLLs can only be loaded from ROM (Z:). There will be no attempt to load or verify the existence of +the given file until the first time it is used (i.e. the first time there is a call to @c RequestSwpChange()) + +@param aSwp The identifier key of a System Wide Property +@param aFilename The filename of the MSsmSwpPolicy DLL for this property. Should be given with no path, + with or without extension. +@return KErrNone or a system wide errorcode +@internalTechnology +*/ +EXPORT_C TInt RSsmStateManager::RegisterSwpMapping(TUint aSwpKey, const TDesC& aFilename) + { + if(Handle()) + { + TIpcArgs args(aSwpKey, &aFilename); + return SendReceive(ERequestRegisterSwpMapping, args); + } + + return KErrDisconnected; + } //lint !e1746 Suppress parameter 'aSwpKey' could be made const reference