pkiutilities/CTSecurityDialogs/ClientSrc/CTsecuritydialogrequestor.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Wed, 18 Aug 2010 10:40:08 +0300
changeset 45 5d3e34b7618a
parent 0 164170e6151a
permissions -rw-r--r--
Revision: 201031 Kit: 201033

/*
* Copyright (c) 2003 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:   Definition of dialog requester
*
*/


// INCLUDE FILES
#include "CTSecurityDialogRequestor.h"
#include "CTSecurityDialogDefs.h"
#include <secdlgimpldefs.h>

// ============================ MEMBER FUNCTIONS ===============================

// -----------------------------------------------------------------------------
// CCTSecurityDialogs::CCTSecurityDialogs()
// C++ default constructor can NOT contain any code, that
// might leave.
// -----------------------------------------------------------------------------
//
CCTSecurityDialogRequestor::CCTSecurityDialogRequestor(MSecurityDialogResponse& aSecurityDialogs): 
	CActive(EPriorityStandard),
	iSecurityDialogs(aSecurityDialogs)
{
}

// -----------------------------------------------------------------------------
// CCTSecurityDialogs::~CCTSecurityDialogs()
// -----------------------------------------------------------------------------
//
CCTSecurityDialogRequestor::~CCTSecurityDialogRequestor()
{
	Cancel();
	iNotifier.Close();
}

// -----------------------------------------------------------------------------
// CCTSecurityDialogs::NewL()
// Two-phased constructor.
// -----------------------------------------------------------------------------
//
CCTSecurityDialogRequestor* CCTSecurityDialogRequestor::NewL(MSecurityDialogResponse& aSecurityDialogs)
{
	CCTSecurityDialogRequestor* self = new (ELeave) CCTSecurityDialogRequestor(aSecurityDialogs);
	CleanupStack::PushL(self);
	self->ConstructL();
	CleanupStack::Pop(); // self
	return self;
}

// -----------------------------------------------------------------------------
// CCTSecurityDialogs::ConstructL()
// Symbian 2nd phase constructor can leave.
// -----------------------------------------------------------------------------
//
void CCTSecurityDialogRequestor::ConstructL()
{
	User::LeaveIfError(iNotifier.Connect());
	CActiveScheduler::Add(this);
}

// -----------------------------------------------------------------------------
// CCTSecurityDialogs::RequestDialog()
// -----------------------------------------------------------------------------
//
void CCTSecurityDialogRequestor::RequestDialog(const TDesC8& aData, TDes8& aResponse)
    {
	iNotifier.StartNotifierAndGetResponse(iStatus, KUidSecurityDialogNotifier, aData, aResponse);
	iState = EMakingRequest;
	SetActive();
    }

// -----------------------------------------------------------------------------
// CCTSecurityDialogs::RequestVariableBufferDialog()
// -----------------------------------------------------------------------------
//    
void CCTSecurityDialogRequestor::RequestVariableBufferDialog( const TDesC8& aOperationData,
										const TDesC8& aVariableData,
										const RArray<TCTTokenObjectHandle>& aCertHandleList,
										TDes8& aResponse )
	{
	iOperationDataPtr = &aOperationData;
	iVariableDataPtr = &aVariableData;
	iCertHandleListPtr = &aCertHandleList;
	iResponsePtr = &aResponse;
	iState = EFillingVariableInputBuffer;
	SetActive();
	// Complete the AO immediately so that buffer processing can occur in RunL().
	TRequestStatus* statusPtr = &iStatus;
	User::RequestComplete( statusPtr, KErrNone );
	}    

// -----------------------------------------------------------------------------
// CCTSecurityDialogs::DoCancel()
// -----------------------------------------------------------------------------
//
void CCTSecurityDialogRequestor::DoCancel()
    {
	iNotifier.CancelNotifier(KUidSecurityDialogNotifier);
    }

// -----------------------------------------------------------------------------
// CCTSecurityDialogs::RunL()
// -----------------------------------------------------------------------------
//
void CCTSecurityDialogRequestor::RunL()
    {
    switch ( iState )
		{
		case EFillingVariableInputBuffer:
			{
			TInt operationDataSize = iOperationDataPtr->Size();
			TInt variableDataSize = iVariableDataPtr->Size();
			TInt arraySize = sizeof( TCTTokenObjectHandle ) * iCertHandleListPtr->Count();
			TInt bufferSize = operationDataSize + variableDataSize + arraySize;
			iInputBuffer = HBufC8::NewL( bufferSize );
			TPtr8 inputBufferPtr( iInputBuffer->Des() );
			inputBufferPtr.Append( *iOperationDataPtr );
			for ( TInt h = 0, total = iCertHandleListPtr->Count(); h < total; ++h )
				{
				const TCTTokenObjectHandle& certHandle = (*iCertHandleListPtr)[h];
				TPckgC<TCTTokenObjectHandle> certHandleBuf( certHandle );
				inputBufferPtr.Append( certHandleBuf );
				}
			inputBufferPtr.Append( *iVariableDataPtr );
			RequestDialog( *iInputBuffer, *iResponsePtr );
			break;
			}
		case EMakingRequest:
			{
			delete iInputBuffer;
			iInputBuffer = NULL;
			iSecurityDialogs.HandleResponse(iStatus.Int());
			break;
			}
		default:
			__ASSERT_DEBUG( EFalse, _L( "Invalid state" ) );
		}
    }

// -----------------------------------------------------------------------------
// CCTSecurityDialogs::RunError()
// -----------------------------------------------------------------------------
//
TInt CCTSecurityDialogRequestor::RunError(TInt aError)
{
	iSecurityDialogs.HandleResponse(aError);
	return KErrNone;
}

// End of File