authenticationservices/authenticationserver/source/client/asyncresponsedecoder.cpp
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/authenticationservices/authenticationserver/source/client/asyncresponsedecoder.cpp Tue Nov 24 09:06:03 2009 +0200
@@ -0,0 +1,188 @@
+/*
+* Copyright (c) 2005-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:
+* CAsyncResponseDecoder - Auth Client helper class
+*
+*/
+
+
+/**
+ @file
+*/
+
+#include <e32debug.h>
+#include <s32mem.h>
+#include "authclient_impl.h"
+
+using namespace AuthServer;
+
+namespace AuthServer
+{
+HBufC8* ExternalizeExpressionL(const CAuthExpression* aExpr);
+
+enum { EPanicBadCmd = 1 };
+
+_LIT(KAsyncDecoderBusy, "AuthClient busy");
+
+}
+
+CAsyncResponseDecoder::CAsyncResponseDecoder(const RAuthClient& aSession) :
+ CActive(EPriorityStandard), iSession(aSession),
+ iBufDes(0,0), iParamsPtr(0,0)
+ {
+ CActiveScheduler::Add(this);
+ }
+
+CAsyncResponseDecoder::~CAsyncResponseDecoder()
+ {
+ Cleanup();
+ }
+
+
+void CAsyncResponseDecoder::AuthenticateL(
+ const CAuthExpression& aExpression,
+ TTimeIntervalSeconds aTimeout,
+ TBool aClientSpecificKey,
+ TUid aClientSid,
+ TBool aWithString,
+ const TDesC& aClientMessage,
+ CIdentity*& aIdentityResult,
+ TRequestStatus& aClientStatus)
+ {
+ __ASSERT_ALWAYS(!IsActive(), User::Panic(AuthServer::KAsyncDecoderBusy, 0));
+
+ iExpression = &aExpression;
+ iResult = &aIdentityResult;
+ iClientStatus = &aClientStatus;
+
+ //Create a flat buffer.
+ CBufFlat* flatBuffer = CBufFlat::NewL(KDefaultBufferSize);
+ CleanupStack::PushL(flatBuffer);
+
+ //Initialize the CAuthParams object.
+ CAuthParams* params = CAuthParams::NewL(aTimeout,
+ aClientSpecificKey,
+ aClientSid,
+ aWithString,
+ aClientMessage);
+ CleanupStack::PushL(params);
+
+ //Externalize params.
+ RBufWriteStream stream(*flatBuffer);
+ CleanupClosePushL(stream);
+ params->ExternalizeL(stream);
+ CleanupStack::PopAndDestroy(2, params);
+
+ iParamsBuffer = HBufC8::NewL(flatBuffer->Size());
+ iParamsPtr.Set(iParamsBuffer->Des());
+ flatBuffer->Read(0, iParamsPtr, flatBuffer->Size());
+ CleanupStack::PopAndDestroy(flatBuffer);
+
+ //Externalize the expression.
+ iExprBuf = ExternalizeExpressionL(iExpression);
+
+ // allocate buffer for identity result.
+ iBuffer = HBufC8::NewL(KDefaultBufferSize);
+ iBufDes.Set(iBuffer->Des());
+
+ iArgs = new (ELeave)TIpcArgs(iExprBuf,
+ &iParamsPtr,
+ &iBufDes);
+ StartCall(EAuthenticate);
+ }
+void CAsyncResponseDecoder::RegisterIdentityL(CIdentity*& aIdentity,
+ const TDesC& aDescription,
+ TRequestStatus& aClientStatus)
+ {
+ __ASSERT_ALWAYS(!IsActive(), User::Panic(KAsyncDecoderBusy, 0));
+
+ iBuffer = HBufC8::NewL(KDefaultBufferSize);
+ iBufDes.Set(iBuffer->Des());
+ iResult = &aIdentity;
+ iDescription = HBufC::NewL(aDescription.Size());
+ *iDescription = aDescription;
+ iClientStatus = &aClientStatus;
+ iArgs = new (ELeave)TIpcArgs(&iBufDes, iDescription);
+
+ StartCall(ERegisterIdentity);
+ }
+
+void CAsyncResponseDecoder::StartCall(TAuthServerMessages aCmd)
+ {
+ iCmd = aCmd;
+ iStatus = KRequestPending;
+ *iClientStatus = KRequestPending;
+ SetActive();
+ iSession.CallSessionFunction(iCmd, *iArgs, iStatus);
+ }
+
+void CAsyncResponseDecoder::RunL()
+ {
+ if (iStatus.Int() == KErrNone)
+ {
+ RDesReadStream readStream(*iBuffer);
+ switch (iCmd)
+ {
+ case EAuthenticate:
+ *iResult = CIdentity::InternalizeL(readStream);
+ break;
+ case ERegisterIdentity:
+ *iResult = CIdentity::InternalizeL(readStream);
+ break;
+ default:
+ User::Panic(_L("AuthClient-AsyncResponseDecoder"),
+ EPanicBadCmd);
+ }
+ }
+ User::RequestComplete(iClientStatus,iStatus.Int());
+ Cleanup();
+ }
+
+TInt CAsyncResponseDecoder::RunError(TInt aError)
+ {
+ User::RequestComplete(iClientStatus, aError);
+ Cleanup();
+ return KErrNone;
+
+ }
+
+void CAsyncResponseDecoder::DoCancel()
+ {
+ switch (iCmd)
+ {
+ case EAuthenticate:
+ case ERegisterIdentity:
+ User::RequestComplete(iClientStatus, KErrCancel);
+ break;
+ default:
+ break;
+ }
+ Cleanup();
+ }
+
+void CAsyncResponseDecoder::Cleanup()
+ {
+ delete iArgs;
+ iArgs = 0;
+ delete iExprBuf;
+ iExprBuf = 0;
+ delete iBuffer;
+ iBuffer = 0;
+ delete iDescription;
+ iDescription = 0;
+ delete iParamsBuffer;
+ iParamsBuffer = 0;
+ iCmd = ELastService;
+ iClientStatus = 0;
+ }