genericservices/activebackupclient/src/abclientsession.cpp
changeset 0 e4d67989cc36
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/genericservices/activebackupclient/src/abclientsession.cpp	Tue Feb 02 02:01:42 2010 +0200
@@ -0,0 +1,315 @@
+// Copyright (c) 2004-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:
+// Implementation of RABClientSession class.
+// 
+//
+
+/**
+ @file
+*/
+
+#include "abclientsession.h"
+#include "abclientserver.h"
+#include "panic.h"
+
+namespace conn
+	{
+	HBufC8* RABClientSession::GetDataFromServerLC(const TInt aDataLength, 
+		TABCallbackCommands aCallbackRequestingData)
+	/**
+	Following a callback call to the Active Backup Callback Handler, this method requests the data 
+	from the server. aDataLength will have been supplied by the original callback call from the server 
+	and all that remains is to make a synchronous call to get it copied over
+	
+	@param aDataLength The length of the data that will be received
+	@param aCallbackRequestingData The callback enum identifying the callback requesting this data
+	@return Pointer to a heap allocated descriptor containing data from the server
+	*/
+		{
+		HBufC8* pReturnedData = HBufC8::NewLC(aDataLength);
+		
+		TPtr8 returnedData(pReturnedData->Des());
+		
+		// Request that the server returns the promised data to the client for the specified callback 
+		User::LeaveIfError(SendReceive(EABMsgGetDataSync, 
+			TIpcArgs(static_cast<TInt>(aCallbackRequestingData), &returnedData)));
+		
+		return pReturnedData;
+		}
+
+	HBufC8* RABClientSession::GetDataFromServerLC(const TInt aDataLength, 
+		TABCallbackCommands aCallbackRequestingData, TDriveNumber& aDriveNum)
+	/**
+	Following a callback call to the Active Backup Callback Handler, this method requests the data 
+	from the server. aDataLength will have been supplied by the original callback call from the server 
+	and all that remains is to make a synchronous call to get it copied over. This should only be called 
+	from a ReceiveSnapshot callback
+	
+	@param aDataLength The length of the data that will be received
+	@param aCallbackRequestingData The callback enum identifying the callback requesting this data
+	@param aDriveNum The drive number
+
+	@return Pointer to a heap allocated descriptor containing data from the server
+	*/
+		{
+		TPckg<TDriveNumber> drvPkg(aDriveNum);
+		HBufC8* pReturnedData = HBufC8::NewLC(aDataLength);
+		
+		TPtr8 returnedData(pReturnedData->Des());
+		
+		// Request that the server returns the promised data to the client for the specified callback 
+		User::LeaveIfError(SendReceive(EABMsgGetDataSync, 
+			TIpcArgs(static_cast<TInt>(aCallbackRequestingData), &returnedData)));
+		
+		// Request that the server returns the drive number to the client for the specified callback 
+		TInt retVal = SendReceive(EABMsgGetDriveNumForSuppliedSnapshot);
+		
+		User::LeaveIfError(retVal);
+		
+		aDriveNum = static_cast<TDriveNumber>(retVal);
+		
+		return pReturnedData;
+		}
+
+	void RABClientSession::SendDataLengthToServerL(TDesC8& aData, TBool aFinished, 
+		TABCallbackCommands aCallbackSendingData)
+	/**
+	Send the length and finished flag back to the server. Limitations of IPC mean that we can only send 
+	fixed size data to the server, hence the length and finished flag are sent first so that the server 
+	may allocate the appropriate amount of space prior to the response containing the data
+	
+	@param aData 		Descriptor containing the data to send back to the server. Only the length of this 
+						is sent in this message
+	@param aFinished 	Flag indicating that this is the last transfer from the client to server. If EFalse, 
+						the server must call the callback again
+	@param aCallbackSendingData This 
+	*/
+		{
+		// Make the synchronous call back to the server telling it to allocate a big enough buffer
+		// to handle the data transfer that will follow this 
+		User::LeaveIfError(SendReceive(EABMsgSendDataLength, TIpcArgs(
+										static_cast<TInt>(aData.Size()),
+										static_cast<TInt>(aFinished),
+										static_cast<TInt>(aCallbackSendingData))));
+		}
+
+	void RABClientSession::PrimeServerForCallbackL(TPckgBuf<TABCallbackCommands>& aCallback, 
+		TPckgBuf<TInt>& aArg1, TPckgBuf<TInt>& aArg2, TRequestStatus& aStatus)
+	/** 
+	Send an async message to the server so that it can call us back when it's ready to make callback's
+	
+	@param aCallback This modifiable package buf is set by the server to indicate which callback to call
+	@param aArg1 This is the first argument for the callback, set by the server
+	@param aArg2 This is the second argument for the callback, set by the server
+	@param aStatus The status 
+	*/
+		{
+		SendReceive(EABMsgPrimeForCallback, TIpcArgs(&aCallback, &aArg1, &aArg2), aStatus);
+		}
+		
+	void RABClientSession::PrimeServerForCallbackWithResponseL(TPckgBuf<TABCallbackCommands>& aCallback, 
+		TPckgBuf<TInt>& aArg1, TPckgBuf<TInt>& aArg2, TInt aResult, TRequestStatus& aStatus)
+	/** 
+	Send an async message to the server so that it can call us back when it's ready to make callback's.
+	This call also returns a result from the previous callback for the server to respond to/return to the PC etc.
+	
+	@param aCallback This modifiable package buf is set by the server to indicate which callback to call
+	@param aArg1 This is the first argument for the callback, set by the server
+	@param aArg2 This is the second argument for the callback, set by the server
+	@param aResult The return value of the previous callback to pass back to the server
+	@param aStatus The status 
+	*/
+		{
+		SendReceive(EABMsgPrimeForCallbackAndResponse, TIpcArgs(&aCallback, &aArg1, &aArg2, aResult), aStatus);
+		}
+
+	void RABClientSession::PrimeServerForCallbackWithResponseL(TPckgBuf<TABCallbackCommands>& aCallback, 
+		TPckgBuf<TInt>& aArg1, TPckgBuf<TInt>& aArg2, TDesC8& aResult, TRequestStatus& aStatus)
+	/** 
+	Send an async message to the server so that it can call us back when it's ready to make callback's.
+	This call also returns a result from the previous callback for the server to respond to/return to the PC etc.
+	
+	@param aCallback This modifiable package buf is set by the server to indicate which callback to call
+	@param aArg1 This is the first argument for the callback, set by the server
+	@param aArg2 This is the second argument for the callback, set by the server
+	@param aResult Data to send back to the server
+	@param aStatus The status 
+	
+	@pre A call to SendDataLengthToServerL must have preceeded this call so that the server may prepare to receive data
+	*/
+		{
+		SendReceive(EABMsgPrimeForCallbackAndResponseDes, TIpcArgs(&aCallback, &aArg1, &aArg2, &aResult), aStatus);
+		}
+
+	void RABClientSession::PropagateLeave(TInt aLeaveCode)		
+	/**
+	Send a synchronous IPC message to the server indicating that a leave has ocurred whilst executing a callback
+	
+	@param aLeaveCode The code to leave back to the server with
+	@param aStatus The status 
+	*/
+		{
+		SendReceive(EABMsgPropagateLeave, TIpcArgs(aLeaveCode));
+		}
+		
+    void RABClientSession::BURModeInfoL(TDriveList& aDriveList, TBURPartType& aBackupType, TBackupIncType& aIncBackupType)
+    /**
+    This method returns the type(s) of backup / restore operation currently active
+
+    @param aDriveList list of drives involved in backup and restore
+    @param aBackupType enumerated type indicating whether a backup or restore
+    is in progress and whether full or partial.
+    @param aIncBackupType enumerated type indicating whetherr a backup is base
+    or incremental.
+    */
+		{
+		TPckg<TBURPartType> partTypePkg(aBackupType);
+		TPckg<TBackupIncType> incTypePkg(aIncBackupType);
+		
+		User::LeaveIfError(SendReceive(EABMsgBURModeInfo, TIpcArgs(&aDriveList, &partTypePkg, &incTypePkg)));
+		}
+
+
+    TBool RABClientSession::DoesPartialBURAffectMeL()
+    /**
+    This method can be called when a partial backup or restore is active and will indicate
+    whether the calling process is expected to take part.  If a full backup or restore is 
+    active then this method will return ETrue for all data owners.  If no backup or restore
+    is active then this method will return EFalse for all data owners.
+
+    @return ETrue if the calling data owner is involved in the current backup or restore
+    operation.
+    */
+		{
+		TPckgBuf<TBool> partialAffectsMe;
+		
+		User::LeaveIfError(SendReceive(EABMsgDoesPartialAffectMe, TIpcArgs(&partialAffectsMe)));
+		
+		return partialAffectsMe();
+		}
+
+
+    void RABClientSession::ConfirmReadyForBURL(TInt aErrorCode)
+    /**
+    This method is called to indicate to the Secure Backup Server that the data owner is ready
+    to participate in backup or restore.  The data owner must call this method to indicate
+    readiness or the Secure Backup Server will not request or supply backup data.
+
+    N.B. The Secure Backup Server will supply snapshot data (if relevant) before a data 
+    owner indicates readiness as it assumes that the data owner requires snapshot data in
+    order to prepare for a backp or restore.
+
+    @param aErrorCode this should be set to KErrNone when the client is ready for
+    backup or restore. If it is set to any other value then it indicates that the client
+    cannot continue with the backup or restore and the error code will be supplied to
+    the remote backup client.
+    */
+		{
+		User::LeaveIfError(SendReceive(EABMsgConfirmReadyForBUR, TIpcArgs(aErrorCode)));
+		}
+		
+	void RABClientSession::CancelServerCallbackL()
+	/**
+	Inform the server that it can no longer call callbacks on the client
+	*/
+		{
+		User::LeaveIfError(SendReceive(EABMsgClosingDownCallback));
+		}
+		
+	RABClientSession::RABClientSession()
+	/** Class constructor. */
+		{
+		}
+
+	void RABClientSession::Close()
+	/** Closes the Secure Backup Engine handle. */
+		{
+		RSessionBase::Close();
+		}
+
+	TInt RABClientSession::Connect()
+	/** Connects the handle to the Secure Backup Engine.
+
+	@return KErrNone if successful, KErrCouldNotConnect otherwise
+	*/
+		{
+		TInt nRetry = KABRetryCount;
+		TInt nRet = KErrNotFound;
+
+		while(nRetry > 0 && nRet != KErrNone)
+			{
+		    const TSecurityPolicy policy(static_cast<TSecureId>(KSBServerUID3));
+			nRet = CreateSession(KABServerName, Version(), KABASyncMessageSlots, EIpcSession_Unsharable,&policy);
+			if(nRet == KErrNotFound || nRet == KErrServerTerminated)
+				{
+				StartServer();
+				}
+			nRetry--;
+			}
+
+		return nRet;
+		}
+
+	TVersion RABClientSession::Version() const
+	/** Returns the version of this API
+
+	@return The version of this API
+	*/
+		{
+	    return TVersion (KABMajorVersionNumber,
+							KABMinorVersionNumber,
+							KABBuildVersionNumber);
+	  	}
+
+	//
+	// Server startup code
+	TInt RABClientSession::StartServer()
+	/** Start the server as a thread on WINS or a process on ARM.
+	
+	Called by Connect when the kernel is unable to create a session
+	with the AB server (if the process hosting it is not running).
+
+	@return Standard Symbian OS code from RProcess/RThread create.
+	*/
+		{
+		//
+		// Servers UID
+		const TUidType serverUid(KNullUid, KNullUid, KSBServerUID3);
+		
+	
+		RProcess server;
+    	TInt nRet=server.Create(KSBImageName,KNullDesC,serverUid);
+    	if (nRet != KErrNone)
+    	    {
+    		return nRet;
+    		}
+    		
+    	TRequestStatus stat;
+    	server.Rendezvous(stat);
+    	if (stat != KRequestPending)
+    	{
+    		server.Kill(0);
+    	}
+    	else
+    	{
+    		server.Resume();
+    	}
+    	User::WaitForRequest(stat);
+    	return (server.ExitType() == EExitPanic) ? KErrGeneral : stat.Int();
+		
+		}
+
+
+
+	} // conn namespace