diff -r 000000000000 -r 164170e6151a pkiutilities/DeviceToken/Src/Generic/Client/DTClient.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pkiutilities/DeviceToken/Src/Generic/Client/DTClient.cpp Tue Jan 26 15:20:08 2010 +0200 @@ -0,0 +1,181 @@ +/* +* Copyright (c) 2006 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 DTClient +* +*/ + + + +#include "DTClient.h" +#include "DevTokenUtils.h" +#include "DevTokenClientSession.h" + + +// ======== MEMBER FUNCTIONS ======== + +// ----------------------------------------------------------------------------- +// CDTClient::CDTClient() +// ----------------------------------------------------------------------------- +// +CDTClient::CDTClient(TInt aUID, + MCTToken& aToken, + RDevTokenClientSession& aClient) + : CActive(EPriorityNormal), + iToken(aToken), + iInterfaceUID(aUID), + iClientSession(aClient), + iRequestPtr(NULL, 0, 0) + { + } + + +// ----------------------------------------------------------------------------- +// CDTClient::~CDTClient() +// ----------------------------------------------------------------------------- +// +CDTClient::~CDTClient() + { + Cancel(); + delete iRequestDataBuf; + } + + +// ----------------------------------------------------------------------------- +// CDTClient::TAsyncRequest::~TAsyncRequest() +// ----------------------------------------------------------------------------- +// +CDTClient::TAsyncRequest::~TAsyncRequest() + { + __ASSERT_DEBUG(EIdle==iRequest, DevTokenPanic(ERequestOutstanding)); + } + + +// ----------------------------------------------------------------------------- +// CDTClient::TAsyncRequest::operator() +// ----------------------------------------------------------------------------- +// +void CDTClient::TAsyncRequest::operator()(TDevTokenMessages aRequest, + TRequestStatus* aStatus) + { + __ASSERT_DEBUG(EIdle==iRequest, DevTokenPanic(ERequestOutstanding)); + iRequest = aRequest; + iClientStatus = aStatus; + *aStatus = KRequestPending; + } + + +// ----------------------------------------------------------------------------- +// CDTClient::TAsyncRequest::Complete() +// ----------------------------------------------------------------------------- +// +void CDTClient::TAsyncRequest::Complete(TInt aCompletionResult) + { + __ASSERT_DEBUG(EIdle!=iRequest, DevTokenPanic(ENoRequestOutstanding)); + User::RequestComplete(iClientStatus, aCompletionResult); + iRequest = EIdle; + } + + +// ----------------------------------------------------------------------------- +// CDTClient::TAsyncRequest::Cancel() +// ----------------------------------------------------------------------------- +// +void CDTClient::TAsyncRequest::Cancel() + { + User::RequestComplete(iClientStatus, KErrCancel); + iRequest = EIdle; + } + + +// ----------------------------------------------------------------------------- +// CDTClient::TAsyncRequest::FreeRequestBuffer() +// ----------------------------------------------------------------------------- +// +void CDTClient::FreeRequestBuffer() const + { + delete iRequestDataBuf; + iRequestDataBuf = NULL; + iRequestPtr.Set(NULL, 0, 0); + } + + +// ----------------------------------------------------------------------------- +// CDTClient::AllocRequestBuffer(TInt aReqdSize) const +// ----------------------------------------------------------------------------- +// +TInt CDTClient::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; + } + + +// ----------------------------------------------------------------------------- +// CDTClient::SendSyncRequestAndHandleOverflowL() +// 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 CDTClient::SendSyncRequestAndHandleOverflowL(TDevTokenMessages aMessage, + TInt aInitialBufSize, + const TIpcArgs& aArgs) const + { + User::LeaveIfError(AllocRequestBuffer(aInitialBufSize)); + + TInt err = iClientSession.SendRequest(aMessage, aArgs); + if ( err == KErrOverflow ) + { + TInt sizeReqd = 0; + TPckg theSize(sizeReqd); + theSize.Copy(iRequestPtr); + User::LeaveIfError(AllocRequestBuffer(sizeReqd)); + err = iClientSession.SendRequest(aMessage, aArgs); + } + User::LeaveIfError(err); + } + + +// ----------------------------------------------------------------------------- +// CDTClient::DoCancel() +// ----------------------------------------------------------------------------- +// +void CDTClient::DoCancel() + { + iCurrentRequest.Cancel(); + } + + +// ----------------------------------------------------------------------------- +// CDTClient::RunError() +// ----------------------------------------------------------------------------- +// +TInt CDTClient::RunError(TInt aError) + { + iCurrentRequest.Complete(aError); + return KErrNone; // Handled + } + +//EOF +