--- /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<TInt> 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
+