backupandrestore/backupengine/src/abserver.cpp
changeset 0 d0791faffa3f
child 15 f85613f12947
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/backupandrestore/backupengine/src/abserver.cpp	Tue Feb 02 01:11:40 2010 +0200
@@ -0,0 +1,355 @@
+// 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 CABServer class.
+// 
+//
+
+/**
+ @file
+*/
+
+#include <e32std.h>
+#include <e32base.h>
+#include <connect/abclientserver.h>
+#include "abserver.h"
+#include "absession.h"
+#include "absessionmap.h"
+#include "sbedataownermanager.h"
+#include <connect/panic.h>
+#include "sblog.h"
+
+namespace conn
+	{
+
+
+	/** Active Backup security request ranges
+	
+	This is a breakdown of the active backup requests into ranges
+	for security checking purposes.
+
+	@internalComponent
+	*/
+	const TInt myABRanges[] = {0,11};
+
+	/** Active Backup range count
+
+	The number of different security ranges for active backup request numbers
+
+	@internalComponent
+	*/
+	const TUint myABRangeCount = sizeof(myABRanges)/sizeof(myABRanges[0]);
+
+	/** Active Backup security action array
+
+	An array with a one-to-one mapping with the range array
+	specifiying what security action to take for each server request.
+
+	@internalComponent
+	*/
+	const TUint8 myABElementsIndex[myABRangeCount] =
+		{
+		CPolicyServer::EAlwaysPass,
+		CPolicyServer::ENotSupported
+		};
+
+	/**
+	@internalComponent
+	*/
+	const CPolicyServer::TPolicyElement myABElements[] =
+		{_INIT_SECURITY_POLICY_PASS};
+
+	/**
+	@internalComponent
+	*/
+	const CPolicyServer::TPolicy myABPolicy =
+		{
+		CPolicyServer::EAlwaysPass,
+		myABRangeCount,
+		myABRanges,
+		myABElementsIndex,
+		myABElements,
+		};
+
+	CABServer::CABServer(CDataOwnerManager* aDOM)
+		: CPolicyServer(EPriorityNormal,myABPolicy), iDOM(aDOM)
+    /** 
+    Class constructor
+    */
+		{
+		__ASSERT_DEBUG(iDOM, Panic(KErrArgument));
+		}
+
+	CABServer::~CABServer()
+    /**
+    Class destructor
+    */
+		{
+		delete iSessionMap;
+		}
+		
+	CABServer* CABServer::NewLC(CDataOwnerManager* aDOM)
+	/**
+	Constructs a new instance of the CABServer, calls ConstructL, 
+	and returns it to the caller leaving it on the cleanup stack.
+
+	@return The new instance of CABServer.
+	*/
+		{
+		CABServer* pSelf = new (ELeave) CABServer(aDOM);
+		CleanupStack::PushL(pSelf);
+		pSelf->ConstructL();
+		return pSelf;
+		}
+
+	void CABServer::ConstructL()
+	/**
+	Construct this instance of CABServer.
+	*/
+		{
+		iSessionMap = CABSessionMap::NewL();
+		//
+		// Start the server 
+		StartL(KABServerName);
+		}
+
+	void CABServer::AddSession()
+	/** Increments the server session count.
+	
+	The server will shutdown when its 
+	session count drops to zero.
+	*/
+		{
+		++iSessionCount;
+		}
+
+	void CABServer::DropSession()
+	/** Decrements the server session count.  
+	
+	The server will shutdown when its 
+	session count drops to zero.
+	*/
+		{		
+		--iSessionCount;
+		}
+		
+	void CABServer::RemoveElement(TSecureId aSecureId)
+	/**
+	Remove the element with key aSecureId from the session map
+	
+	@param aSecureId The key of the element to be removed
+	*/
+		{
+		iSessionMap->Delete(aSecureId);
+		}
+
+	void CABServer::SupplyDataL(TSecureId aSID, TDriveNumber aDriveNumber, TTransferDataType aTransferType, 
+		TDesC8& aBuffer, TBool aLastSection, TBool aSuppressInitDataOwner, TSecureId aProxySID)
+	/**
+	Supply data to the data owner
+	
+	@param aSID The secure ID of the data owner to signal
+	@param aDriveNumber The drive number that the data corresponds to
+	@param aTransferType The type of operation to perform on the data
+	@param aBuffer The buffer containing data for the operation
+	@param aLastSection Flag to indicate whether this is the last operation in a multi-part transfer
+	@param aSuppressInitDataOwner Suppress the initialisation of Data Owner
+	@param aProxySID The secure ID of the proxy
+	*/
+		{
+		CABSession& session = iSessionMap->SessionL(aSID);
+		
+		session.SupplyDataL(aDriveNumber, aTransferType, aBuffer, aLastSection, aSuppressInitDataOwner, aProxySID);
+		}
+
+	void CABServer::RequestDataL(TSecureId aSID, TDriveNumber aDriveNumber, TTransferDataType aTransferType, 
+		TPtr8& aBuffer, TBool& aLastSection, TBool aSuppressInitDataOwner, TSecureId aProxySID)
+	/**
+	Request data from the data owner
+	
+	@param aSID The secure ID of the data owner to signal
+	@param aDriveNumber The drive number that the data corresponds to
+	@param aTransferType The type of operation to perform on the data
+	@param aBuffer The buffer containing data for the operation
+	@param aLastSection Flag to indicate whether this is the last operation in a multi-part transfer
+	@param aSuppressInitDataOwner Suppress the initialisation of Data Owner
+	@param aProxySID The secure ID of the proxy
+	*/
+		{
+		CABSession& session = iSessionMap->SessionL(aSID);
+		
+		session.RequestDataL(aDriveNumber, aTransferType, aBuffer, aLastSection, aSuppressInitDataOwner, aProxySID);
+		}
+
+	void CABServer::GetExpectedDataSizeL(TSecureId aSID, TDriveNumber aDriveNumber, TUint& aSize)
+	/**
+	Get the expected size of the data that will be returned
+	
+	@param aSID The secure ID of the data owner to signal
+	@param aDriveNumber The drive number that the data corresponds to
+	@param aSize The size of the data owner's data
+	*/
+		{
+		CABSession& session = iSessionMap->SessionL(aSID);
+		
+		session.GetExpectedDataSizeL(aDriveNumber, aSize);
+		}
+		
+	void CABServer::AllSnapshotsSuppliedL(TSecureId aSID)
+	/** Lets the client know that all its snapshots have been supplied
+	
+	@param aSID The secure ID of the data owner to signal
+	*/
+		{
+		CABSession& session = iSessionMap->SessionL(aSID);
+		
+		session.AllSnapshotsSuppliedL();
+		}
+
+	void CABServer::InvalidateABSessions()
+	/** Set each CABSession currently hold for each active backup
+	 * client as invalid, since there maybe some delay for the
+	 * arrival of disconnect request from client. Within this time,
+	 * this session can not be used for another backup/restore.
+	 */
+		{
+		iSessionMap->InvalidateABSessions();
+		}
+	
+	TDataOwnerStatus CABServer::SessionReadyStateL(TSecureId aSID)
+	/**
+	Returns the status of the active backup client
+	
+	@param aSID The SecureId of the session to query for
+	@return Data owner status of the session
+	*/
+		{
+		CABSession& session = iSessionMap->SessionL(aSID);
+		
+		TDataOwnerStatus doStatus = EDataOwnerNotConnected;
+		if (session.Invalidated())
+			{
+			__LOG1("CABServer::SessionReadyStateL session for 0x%08x has been invalidated, return NotConnected",
+					aSID.iId);
+			
+			return doStatus;	
+			}
+		
+		if (session.CallbackInterfaceAvailable())
+			{
+			__LOG2("CABServer::SessionReadyStateL session for 0x%08x already have interface, confirmed:%d ",
+					aSID.iId, session.ConfirmedReadyForBUR());
+			
+			doStatus = EDataOwnerNotReady;
+			
+			if (session.ConfirmedReadyForBUR())
+				{
+				doStatus = EDataOwnerReady;
+				}
+			}
+		else 
+			{
+			__LOG2("CABServer::SessionReadyStateL session for 0x%08x does not have interface, confimed:%d",
+								aSID.iId, session.ConfirmedReadyForBUR());
+			
+			doStatus = EDataOwnerNotReady;
+			
+			if (session.ConfirmedReadyForBUR())
+				{
+				doStatus = EDataOwnerReadyNoImpl;
+				}				
+			}
+			
+		return doStatus;
+		}
+		
+	void CABServer::RestoreCompleteL(TSecureId aSID, TDriveNumber aDrive)
+	/**
+	Called to indicate to the active backup client that a restore has completed
+	
+	@param aSID The secure Id of the active client for which the restore has completed
+	@param aDrive The drive number for which the restore has completed
+	*/
+		{
+		CABSession& session = iSessionMap->SessionL(aSID);
+
+		session.RestoreCompleteL(aDrive);
+		}
+		
+	CSession2* CABServer::NewSessionL(const TVersion& aVersion,
+		const RMessage2& aMessage) const
+	/** Constructs a new AB session.
+	
+	Querys the supplied version infomation from the client
+	with that of this server, and leaves if they are incompatable.
+
+	@param aVersion The clients version information
+	@param aMessage Is ignored
+	@return A new instance of CABSession
+	@leave KErrNotSupported if the version passed in aVersion is not the same as this one
+	*/
+		{
+		TVersion thisVersion(KABMajorVersionNumber, 
+								KABMinorVersionNumber,
+								KABBuildVersionNumber);
+		
+	    if (!User::QueryVersionSupported(thisVersion, aVersion))
+			{
+			User::Leave(KErrNotSupported);
+			}
+			
+		TSecureId sid = aMessage.SecureId();
+
+		// The map creates the session and a map entry, then session ownership is passed to the server
+		return &(iSessionMap->CreateL(sid));
+		}
+
+	TInt CABServer::RunError(TInt aError)
+	/** Called when this active objects RunL leaves. 
+	
+	May be due to a bad client or the server itself.  In either 
+	case, complete the last outstanding message with the error 
+	code and continue handling client requests.
+
+    @param aError  Standard Symbian OS error code
+	@return The error code to be passed back to the active scheduler framework.
+	*/
+		{
+		//
+		// A Bad descriptor is a bad client - panic it.
+		if(aError == KErrBadDescriptor)
+			{
+			PanicClient(KErrBadDescriptor);
+			}
+
+		//
+		// Complete the message and continue handling requests.
+		Message().Complete(aError);
+		ReStart();
+		return KErrNone;
+		}
+
+	void CABServer::PanicClient(TInt aPanic) const
+	/** Panic a client.
+
+	@param aPanic The panic code.
+	*/
+		{
+		__DEBUGGER()
+		_LIT(KPanicCategory,"AB Server");
+		RThread client;
+		Message().Client(client);
+		client.Panic(KPanicCategory, aPanic);
+		}
+
+	} // end namespace