diff -r 000000000000 -r 2c201484c85f cryptoservices/filebasedcertificateandkeystores/source/generic/client/CFSClient.cpp --- /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 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 + }