cryptoservices/filebasedcertificateandkeystores/source/generic/client/CFSClient.cpp
changeset 0 2c201484c85f
child 8 35751d3474b7
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/cryptoservices/filebasedcertificateandkeystores/source/generic/client/CFSClient.cpp	Wed Jul 08 11:25:26 2009 +0100
@@ -0,0 +1,129 @@
+/*
+* 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 the License "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 "CFSClient.h"
+#include "clientutils.h"
+#include "clientsession.h"
+
+CFSClient::CFSClient(TInt aUID,
+					 MCTToken& aToken, 
+					 RFileStoreClientSession& aClient)
+	:	CActive(EPriorityNormal),
+		iToken(aToken), 	
+		iInterfaceUID(aUID),	
+		iClient(aClient),
+		iRequestPtr(NULL, 0, 0)
+	{
+	}
+
+CFSClient::~CFSClient()
+	{
+    Cancel(); 
+    delete iRequestDataBuf;
+	}
+
+CFSClient::TAsyncRequest::~TAsyncRequest()
+	{
+	__ASSERT_DEBUG(EIdle==iRequest, FSTokenPanic(ERequestOutstanding));
+	}
+
+void CFSClient::TAsyncRequest::operator()(TFSTokenMessages aRequest, TRequestStatus* aStatus)
+	{
+	__ASSERT_DEBUG(EIdle==iRequest, FSTokenPanic(ERequestOutstanding));
+
+	iRequest = aRequest; 
+	iClientStatus = aStatus;
+	*aStatus = KRequestPending;
+	}
+
+void CFSClient::TAsyncRequest::Complete(TInt aCompletionResult)
+	{
+	__ASSERT_DEBUG(EIdle!=iRequest, FSTokenPanic(ENoRequestOutstanding));
+	User::RequestComplete(iClientStatus, aCompletionResult);
+	iRequest = EIdle;
+	}
+
+void CFSClient::TAsyncRequest::Cancel()
+	{
+	User::RequestComplete(iClientStatus, KErrCancel);
+	iRequest = EIdle;
+	}
+
+void CFSClient::FreeRequestBuffer() const
+	{
+    delete iRequestDataBuf; 
+	iRequestDataBuf = NULL;
+	iRequestPtr.Set(NULL, 0, 0);
+	}
+
+TInt CFSClient::AllocRequestBuffer(TInt aReqdSize) const
+	{
+    ASSERT(aReqdSize > 0);
+	TInt result = KErrNoMemory;
+	
+	FreeRequestBuffer();
+	iRequestDataBuf = HBufC8::NewMax(aReqdSize);
+	if (iRequestDataBuf)
+		{
+	    iRequestPtr.Set(iRequestDataBuf->Des());
+		iRequestPtr.FillZ();
+		result = KErrNone;
+		}
+
+	return result;
+	}
+
+/**
+ * Execute a synchronous request that returns a buffer of indetermintate length.
+ *
+ * If the initial buffer is too short, the server leaves with KErrOverflow and
+ * passes us the required length - the reuest is then re-sent.
+ */
+void CFSClient::SendSyncRequestAndHandleOverflowL(TFSTokenMessages aMessage,
+												  TInt aInitialBufSize,
+												  const TIpcArgs& aArgs) const
+	{
+	User::LeaveIfError(AllocRequestBuffer(aInitialBufSize));
+	
+	TInt err = iClient.SendRequest(aMessage, aArgs);
+	if (err == KErrOverflow)
+		{
+		TInt sizeReqd = 0;
+		TPckg<TInt> theSize(sizeReqd);
+		theSize.Copy(iRequestPtr);
+		User::LeaveIfError(AllocRequestBuffer(sizeReqd));			
+		err = iClient.SendRequest(aMessage, aArgs);
+		}
+
+	User::LeaveIfError(err);
+	}
+
+//	*********************************************************************************
+//	CActive implementation
+//	*********************************************************************************
+
+void CFSClient::DoCancel()
+	{
+	iCurrentRequest.Cancel();
+	}
+
+TInt CFSClient::RunError(TInt aError)
+	{
+	iCurrentRequest.Complete(aError);
+	return KErrNone; // Handled
+	}