pkiutilities/DeviceToken/Src/Generic/Client/DTClient.cpp
changeset 0 164170e6151a
--- /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
+