diff -r 000000000000 -r 4e1aa6a622a0 sysstatemgmt/systemstatemgr/sus/src/ssmsuscli.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/sysstatemgmt/systemstatemgr/sus/src/ssmsuscli.cpp Tue Feb 02 00:53:00 2010 +0200 @@ -0,0 +1,175 @@ +// 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 "susutilclisrv.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 should use the global pool, reducing the kernel memory required to create the session. + This is the best value 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 you need to work out the maximum number of concurrent asynchronous messages that may + be outstanding on a single session and use that value. + + @capability DiskAdmin PowerMgmt ProtServ SwEvent WriteDeviceData ReadDeviceData + */ +EXPORT_C TInt RSsmSusCli::Connect() + { + const TInt KTryAllocSlotsFromSystemPoolInRuntime = -1; + return Connect(KTryAllocSlotsFromSystemPoolInRuntime); + } + +/** + Connect this session and pre-allcocate the number of async message slots you will need. + I.e. the max number of async calls to @c RequestLoadSup waiting for completion you will ever need. + + Use this version of @c Connect if you want to be quaranteed slots rather than relying + on slots being allocated in runtime from the system wide pool. + + @see RSessionBase::CreateSession + @publishedPartner + @released + @capability DiskAdmin PowerMgmt ProtServ SwEvent WriteDeviceData ReadDeviceData +*/ +EXPORT_C TInt RSsmSusCli::Connect(TInt aAsyncMessageSlots) + { + return DoConnect(KSusUtilServerName, Version(), aAsyncMessageSlots); + } + +/** + This exists for testing purposes only. + @internalComponent + */ +TInt RSsmSusCli::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. + @publishedPartner + @released +*/ +EXPORT_C void RSsmSusCli::Close() + { + RSessionBase::Close(); + } + +/** +*/ +TVersion RSsmSusCli::Version() const + { + return(TVersion(KSusUtilServMajorVersionNumber, KSusUtilServMinorVersionNumber, KSusUtilServBuildVersionNumber)); + } + +/** + Use this function to synchronously load a utility plugin. When this function returns, + the plugin have been loaded, initialized and started in the Utility Server thread. + + @param aUtilityPluginDetails The information needed to identify and load the utility plugin. + @return KErrNone or one of the system wide errorcodes. + @publishedPartner + @released + @capability DiskAdmin PowerMgmt ProtServ SwEvent WriteDeviceData ReadDeviceData +*/ +EXPORT_C TInt RSsmSusCli::RequestLoadSup(const TSsmSupInfo& aUtilityPluginDetails) + { + if(Handle()) + { + const TPckgC pckg(aUtilityPluginDetails); + return SendReceive(ERequestLoadSup, TIpcArgs(&pckg)); + } + + return KErrDisconnected; + } + +/** + Use this function to request asynchronous loading of a utility plugin. + + Usage pattern: + @code + RSsmSusCli session; + session.Connect(); + CleanupStackClosePushL(session); + TPckgC* infoBuf = new (ELeave) TPckgC(info); + session.RequestLoadSup(*infoBuf, status); + ... + //It is expected that production code will use an active-object instead of User::WaitForRequest. + //You might be interested in the technique employed in CSsmStartSafe. See activewaiter.h/cpp and its usage in ssmstartsafe.cpp + User::WaitForRequest(status); + delete infoBuf; + CleanupStack::PopAndDestroy(&session); + @endcode + + @param aTSsmSupInfoPckgC A TSsmSupInfo wrapped in a TPckgC descriptor. Needs to be + valid until this request (@c aStatus) has been completed. + @param aStatus The status for this request. Will when completed contain + KErrNone or one of the system wide errorcodes. + @publishedPartner + @released + @capability DiskAdmin PowerMgmt ProtServ SwEvent WriteDeviceData ReadDeviceData +*/ +EXPORT_C void RSsmSusCli::RequestLoadSup(const TDesC8& aTSsmSupInfoPckgC, TRequestStatus& aStatus) + { + if(Handle()) + { + SendReceive(ERequestLoadSup, TIpcArgs(&aTSsmSupInfoPckgC), aStatus); + } + else + { + aStatus = KRequestPending; + TRequestStatus* clientStatus = &aStatus; + User::RequestComplete(clientStatus, KErrDisconnected); + } + } + +/** + Cancel an asynchronous request to load a utility plugin. Note that a preceding asynchronous request + to load a plugin will still be handled before this request to cancel. + @publishedPartner + @released + @capability DiskAdmin PowerMgmt ProtServ SwEvent WriteDeviceData ReadDeviceData +*/ +EXPORT_C void RSsmSusCli::RequestLoadSupCancel() + { + if(Handle()) + { + SendReceive(ERequestLoadSupCancel); + } + } + +/** + @internalComponent + @released + @capability DiskAdmin PowerMgmt ProtServ SwEvent WriteDeviceData ReadDeviceData + */ +TInt RSsmSusCli::RequestUnLoadSup(const TSsmSupInfo& aUtilityPluginDetails) + { + if(Handle()) + { + const TPckgC pckg(aUtilityPluginDetails); + return SendReceive(ERequestUnLoadSup, TIpcArgs(&pckg)); + } + + return KErrDisconnected; + }