sysstatemgmt/systemstatemgr/sus/src/ssmsuscli.cpp
changeset 0 4e1aa6a622a0
child 21 ccb4f6b3db21
--- /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 <ssm/ssmsuscli.h>
+#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<TSsmSupInfo> 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<TSsmSupInfo>* infoBuf = new (ELeave) TPckgC<TSsmSupInfo>(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<TSsmSupInfo> pckg(aUtilityPluginDetails);
+		return SendReceive(ERequestUnLoadSup, TIpcArgs(&pckg));
+		}
+	
+	return KErrDisconnected;
+	}