// Copyright (c) 2008-2009 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:
//

#include <ctsy/rmmcustomapi.h>
#include "csecuritydispatcher.h"

#include <ctsy/ltsy/mltsydispatchsecurityinterface.h>
#include <ctsy/pluginapi/mmmessagemanagercallback.h>
#include <ctsy/serviceapi/mmtsy_ipcdefs.h>
#include <ctsy/serviceapi/cmmutility.h>

#include <ctsy/ltsy/ltsylogger.h>
#include "ctsydispatcherpanic.h"
#include "tdispatcherholder.h"

CSecurityDispatcher::CSecurityDispatcher(
		MLtsyDispatchFactoryV1& aLtsyFactory,
		MmMessageManagerCallback& aMessageManagerCallback,
		CRequestQueueOneShot& aRequestAsyncOneShot)
	: 	iLtsyFactoryV1(aLtsyFactory),
		iMessageManagerCallback(aMessageManagerCallback),
		iRequestAsyncOneShot(aRequestAsyncOneShot)
	{
	} // CSecurityDispatcher::CSecurityDispatcher

	  
CSecurityDispatcher::~CSecurityDispatcher()
	{
	} // CSecurityDispatcher::~CSecurityDispatcher


CSecurityDispatcher* CSecurityDispatcher::NewLC(
	MLtsyDispatchFactoryV1& aLtsyFactory,
	MmMessageManagerCallback& aMessageManagerCallback,
	CRequestQueueOneShot& aRequestAsyncOneShot)
	{
	TSYLOGENTRYEXIT;
	CSecurityDispatcher* self =
		new (ELeave) CSecurityDispatcher(aLtsyFactory, aMessageManagerCallback, aRequestAsyncOneShot);
	CleanupStack::PushL(self);
	self->ConstructL();
	return self;
	} // CSecurityDispatcher::NewLC


CSecurityDispatcher* CSecurityDispatcher::NewL(
	MLtsyDispatchFactoryV1& aLtsyFactory,
	MmMessageManagerCallback& aMessageManagerCallback,
	CRequestQueueOneShot& aRequestAsyncOneShot)
	{
	TSYLOGENTRYEXIT;
	CSecurityDispatcher* self =
		CSecurityDispatcher::NewLC(aLtsyFactory, aMessageManagerCallback, aRequestAsyncOneShot);
	CleanupStack::Pop (self);
	return self;
	} // CSecurityDispatcher::NewL


void CSecurityDispatcher::ConstructL()
/**
 * Second phase constructor.
 */
	{
	TSYLOGENTRYEXIT;
	
	// Get the Licensee LTSY interfaces related to Security functionality
	// from the factory
	
	
	if(iLtsyFactoryV1.IsDispatchInterfaceSupported(KDispatchSecurityFuncUnitId, MLtsyDispatchSecurityGetSecurityCodeInfo::KLtsyDispatchSecurityGetSecurityCodeInfoApiId))
		{
		TAny* getSecurityCodeInfoInterface = NULL;
		iLtsyFactoryV1.GetDispatchHandler(
		       	MLtsyDispatchSecurityGetSecurityCodeInfo::KLtsyDispatchSecurityGetSecurityCodeInfoApiId,
		       	getSecurityCodeInfoInterface);
		iLtsyDispatchSecurityGetSecurityCodeInfo =
				static_cast<MLtsyDispatchSecurityGetSecurityCodeInfo*>(getSecurityCodeInfoInterface);
        __ASSERT_DEBUG(iLtsyDispatchSecurityGetSecurityCodeInfo, CtsyDispatcherPanic(EInvalidNullPtr));
  		}
	
	if(iLtsyFactoryV1.IsDispatchInterfaceSupported(KDispatchSecurityFuncUnitId, MLtsyDispatchSecurityGetLockInfo::KLtsyDispatchSecurityGetLockInfoApiId))
		{
		TAny* getLockInfoInterface = NULL;
		iLtsyFactoryV1.GetDispatchHandler(
		       	MLtsyDispatchSecurityGetLockInfo::KLtsyDispatchSecurityGetLockInfoApiId,
		       	getLockInfoInterface);
		iLtsyDispatchSecurityGetLockInfo =
				static_cast<MLtsyDispatchSecurityGetLockInfo*>(getLockInfoInterface);
        __ASSERT_DEBUG(iLtsyDispatchSecurityGetLockInfo, CtsyDispatcherPanic(EInvalidNullPtr));
  		}
	
	if(iLtsyFactoryV1.IsDispatchInterfaceSupported(KDispatchSecurityFuncUnitId, MLtsyDispatchSecurityAbortSecurityCode::KLtsyDispatchSecurityAbortSecurityCodeApiId))
		{
		TAny* abortSecurityCodeInterface = NULL;
		iLtsyFactoryV1.GetDispatchHandler(
		       	MLtsyDispatchSecurityAbortSecurityCode::KLtsyDispatchSecurityAbortSecurityCodeApiId,
		       	abortSecurityCodeInterface);
		iLtsyDispatchSecurityAbortSecurityCode =
				static_cast<MLtsyDispatchSecurityAbortSecurityCode*>(abortSecurityCodeInterface);
        __ASSERT_DEBUG(iLtsyDispatchSecurityAbortSecurityCode, CtsyDispatcherPanic(EInvalidNullPtr));
  		}
	
	if(iLtsyFactoryV1.IsDispatchInterfaceSupported(KDispatchSecurityFuncUnitId, MLtsyDispatchSecurityGetCurrentActivePin::KLtsyDispatchSecurityGetCurrentActivePinApiId))
		{
		TAny* getCurrentActivePinInterface = NULL;
		iLtsyFactoryV1.GetDispatchHandler(
		       	MLtsyDispatchSecurityGetCurrentActivePin::KLtsyDispatchSecurityGetCurrentActivePinApiId,
		       	getCurrentActivePinInterface);
		iLtsyDispatchSecurityGetCurrentActivePin =
				static_cast<MLtsyDispatchSecurityGetCurrentActivePin*>(getCurrentActivePinInterface);
        __ASSERT_DEBUG(iLtsyDispatchSecurityGetCurrentActivePin, CtsyDispatcherPanic(EInvalidNullPtr));
  		}
	
	if(iLtsyFactoryV1.IsDispatchInterfaceSupported(KDispatchSecurityFuncUnitId, MLtsyDispatchSecuritySetLockSetting::KLtsyDispatchSecuritySetLockSettingApiId))
		{
		TAny* setLockSettingInterface = NULL;
		iLtsyFactoryV1.GetDispatchHandler(
		       	MLtsyDispatchSecuritySetLockSetting::KLtsyDispatchSecuritySetLockSettingApiId,
		       	setLockSettingInterface);
		iLtsyDispatchSecuritySetLockSetting =
				static_cast<MLtsyDispatchSecuritySetLockSetting*>(setLockSettingInterface);
        __ASSERT_DEBUG(iLtsyDispatchSecuritySetLockSetting, CtsyDispatcherPanic(EInvalidNullPtr));
  		}
	
	if(iLtsyFactoryV1.IsDispatchInterfaceSupported(KDispatchSecurityFuncUnitId, MLtsyDispatchSecurityVerifySecurityCode::KLtsyDispatchSecurityVerifySecurityCodeApiId))
		{
		TAny* verifySecurityCodeInterface = NULL;
		iLtsyFactoryV1.GetDispatchHandler(
		       	MLtsyDispatchSecurityVerifySecurityCode::KLtsyDispatchSecurityVerifySecurityCodeApiId,
		       	verifySecurityCodeInterface);
		iLtsyDispatchSecurityVerifySecurityCode =
				static_cast<MLtsyDispatchSecurityVerifySecurityCode*>(verifySecurityCodeInterface);
        __ASSERT_DEBUG(iLtsyDispatchSecurityVerifySecurityCode, CtsyDispatcherPanic(EInvalidNullPtr));
  		}
	
	if(iLtsyFactoryV1.IsDispatchInterfaceSupported(KDispatchSecurityFuncUnitId, MLtsyDispatchSecurityGetPin1DisableSupported::KLtsyDispatchSecurityGetPin1DisableSupportedApiId))
		{
		TAny* getPin1DisableSupportedInterface = NULL;
		iLtsyFactoryV1.GetDispatchHandler(
		       	MLtsyDispatchSecurityGetPin1DisableSupported::KLtsyDispatchSecurityGetPin1DisableSupportedApiId,
		       	getPin1DisableSupportedInterface);
		iLtsyDispatchSecurityGetPin1DisableSupported =
			static_cast<MLtsyDispatchSecurityGetPin1DisableSupported*>(getPin1DisableSupportedInterface);
  		__ASSERT_DEBUG(iLtsyDispatchSecurityGetPin1DisableSupported, CtsyDispatcherPanic(EInvalidNullPtr));
  		}
  		
	if(iLtsyFactoryV1.IsDispatchInterfaceSupported(KDispatchSecurityFuncUnitId, MLtsyDispatchSecurityCheckSecurityCode::KLtsyDispatchSecurityCheckSecurityCodeApiId))
		{
		TAny* checkSecurityCodeInterface = NULL;
		iLtsyFactoryV1.GetDispatchHandler(
				MLtsyDispatchSecurityCheckSecurityCode::KLtsyDispatchSecurityCheckSecurityCodeApiId,
		       	checkSecurityCodeInterface);
		iLtsyDispatchSecurityCheckSecurityCode =
				static_cast<MLtsyDispatchSecurityCheckSecurityCode*>(checkSecurityCodeInterface);
        __ASSERT_DEBUG(iLtsyDispatchSecurityCheckSecurityCode, CtsyDispatcherPanic(EInvalidNullPtr));
  		}
	
	if(iLtsyFactoryV1.IsDispatchInterfaceSupported(KDispatchSecurityFuncUnitId, MLtsyDispatchSecurityDisablePhoneLock::KLtsyDispatchSecurityDisablePhoneLockApiId))
		{
		TAny* disablePhoneLockInterface = NULL;
		iLtsyFactoryV1.GetDispatchHandler(
				MLtsyDispatchSecurityDisablePhoneLock::KLtsyDispatchSecurityDisablePhoneLockApiId,
		       	disablePhoneLockInterface);
		iLtsyDispatchSecurityDisablePhoneLock =
				static_cast<MLtsyDispatchSecurityDisablePhoneLock*>(disablePhoneLockInterface);
        __ASSERT_DEBUG(iLtsyDispatchSecurityDisablePhoneLock, CtsyDispatcherPanic(EInvalidNullPtr));
  		}
	
	if(iLtsyFactoryV1.IsDispatchInterfaceSupported(KDispatchSecurityFuncUnitId, MLtsyDispatchSecurityGetCipheringInfo::KLtsyDispatchSecurityGetCipheringInfoApiId))
		{
		TAny* getCipheringInfoInterface = NULL;
		iLtsyFactoryV1.GetDispatchHandler(
				MLtsyDispatchSecurityGetCipheringInfo::KLtsyDispatchSecurityGetCipheringInfoApiId,
		       	getCipheringInfoInterface);
		iLtsyDispatchSecurityGetCipheringInfo =
				static_cast<MLtsyDispatchSecurityGetCipheringInfo*>(getCipheringInfoInterface);
        __ASSERT_DEBUG(iLtsyDispatchSecurityGetCipheringInfo, CtsyDispatcherPanic(EInvalidNullPtr));
  		}
	
	if(iLtsyFactoryV1.IsDispatchInterfaceSupported(KDispatchSecurityFuncUnitId, MLtsyDispatchSecurityIsSecurityCodeBlocked::KLtsyDispatchSecurityIsSecurityCodeBlockedApiId))
		{
		TAny* isSecurityCodeBlockedInterface = NULL;
		iLtsyFactoryV1.GetDispatchHandler(
				MLtsyDispatchSecurityIsSecurityCodeBlocked::KLtsyDispatchSecurityIsSecurityCodeBlockedApiId,
		       	isSecurityCodeBlockedInterface);
		iLtsyDispatchSecurityIsSecurityCodeBlocked =
				static_cast<MLtsyDispatchSecurityIsSecurityCodeBlocked*>(isSecurityCodeBlockedInterface);
        __ASSERT_DEBUG(iLtsyDispatchSecurityIsSecurityCodeBlocked, CtsyDispatcherPanic(EInvalidNullPtr));
  		}
	
	if(iLtsyFactoryV1.IsDispatchInterfaceSupported(KDispatchSecurityFuncUnitId, MLtsyDispatchSecurityCheckSecurityCodeCancel::KLtsyDispatchSecurityCheckSecurityCodeCancelApiId))
		{
		TAny* checkSecurityCodeCancelInterface = NULL;
		iLtsyFactoryV1.GetDispatchHandler(
				MLtsyDispatchSecurityCheckSecurityCodeCancel::KLtsyDispatchSecurityCheckSecurityCodeCancelApiId,
		       	checkSecurityCodeCancelInterface);
		iLtsyDispatchSecurityCheckSecurityCodeCancel =
				static_cast<MLtsyDispatchSecurityCheckSecurityCodeCancel*>(checkSecurityCodeCancelInterface);
        __ASSERT_DEBUG(iLtsyDispatchSecurityCheckSecurityCodeCancel, CtsyDispatcherPanic(EInvalidNullPtr));
  		}
	  		
	} // CSecurityDispatcher::ConstructL

void CSecurityDispatcher::SetDispatcherHolder(TDispatcherHolder& aDispatcherHolder)
/**
 * Set the dispatcher holder.  
 * 
 * @param aDispatcherHolder Reference to dispatcher holder.
 */
	{
	TSYLOGENTRYEXIT;
	
	iDispatcherHolder = &aDispatcherHolder;
	} // CSecurityDispatcher::SetDispatcherHolder

TInt CSecurityDispatcher::DispatchGetSecurityCodeInfoL(const CMmDataPackage* aDataPackage)
/**
 * Unpack data related to EMobilePhoneGetSecurityCodeInfo
 * and pass request on to Licensee LTSY.
 *
 * @return Returns error code returned by the Licensee LTSY or KErrNotSupported if
 * the Licensee LTSY does not support this request.
 */
	{
	TSYLOGENTRYEXIT;
	TInt ret = KErrNotSupported;
   
    __ASSERT_DEBUG(aDataPackage, CtsyDispatcherPanic(EInvalidNullPtr));

	// Call Handle... method in Licensee LTSY
	if (iLtsyDispatchSecurityGetSecurityCodeInfo)
		{
		RMobilePhone::TMobilePhoneSecurityCode secCode;
		aDataPackage->UnPackData(secCode);
		ret = iLtsyDispatchSecurityGetSecurityCodeInfo->HandleGetSecurityCodeInfoReqL(secCode);				
		}		

	return TSYLOGSETEXITERR(ret);
	} // CSecurityDispatcher::DispatchGetSecurityCodeInfoL

TInt CSecurityDispatcher::DispatchGetLockInfoL(const CMmDataPackage* aDataPackage)
/**
 * Unpack data related to EMobilePhoneGetLockInfo
 * and pass request on to Licensee LTSY.
 *
 * @return Returns error code returned by the Licensee LTSY or KErrNotSupported if
 * the Licensee LTSY does not support this request.
 */
	{
	TSYLOGENTRYEXIT;
	TInt ret = KErrNotSupported;

    __ASSERT_DEBUG(aDataPackage, CtsyDispatcherPanic(EInvalidNullPtr));

	// Call Handle... method in Licensee LTSY
	if (iLtsyDispatchSecurityGetLockInfo)
		{
		RMobilePhone::TMobilePhoneLock lockType;
		aDataPackage->UnPackData(lockType);
		ret = iLtsyDispatchSecurityGetLockInfo->HandleGetLockInfoReqL(lockType);				
		}
			
	return TSYLOGSETEXITERR(ret);
	} // CSecurityDispatcher::DispatchGetLockInfoL

TInt CSecurityDispatcher::DispatchAbortSecurityCodeL(const CMmDataPackage* aDataPackage)
/**
 * Unpack data related to EMobilePhoneAbortSecurityCode
 * and pass request on to Licensee LTSY.
 *
 * @return Returns error code returned by the Licensee LTSY or KErrNotSupported if
 * the Licensee LTSY does not support this request.
 */
	{
	TSYLOGENTRYEXIT;
	TInt ret = KErrNotSupported;

   __ASSERT_DEBUG(aDataPackage, CtsyDispatcherPanic(EInvalidNullPtr));

	// Call Handle... method in Licensee LTSY
	if (iLtsyDispatchSecurityAbortSecurityCode)
		{
		RMobilePhone::TMobilePhoneSecurityCode secCode;
		aDataPackage->UnPackData(secCode);
		ret = iLtsyDispatchSecurityAbortSecurityCode->HandleAbortSecurityCodeReqL(secCode);				
		}

	return TSYLOGSETEXITERR(ret);
	} // CSecurityDispatcher::DispatchAbortSecurityCodeL

TInt CSecurityDispatcher::DispatchGetCurrentActivePinL()
/**
 * Pass request on to Licensee LTSY.
 *
 * @return Returns error code returned by the Licensee LTSY or KErrNotSupported if
 * the Licensee LTSY does not support this request.
 */
	{
	TSYLOGENTRYEXIT;
	TInt ret = KErrNotSupported;

	// Call Handle... method in Licensee LTSY
	
	if (iLtsyDispatchSecurityGetCurrentActivePin)
		{
		ret = iLtsyDispatchSecurityGetCurrentActivePin->HandleGetCurrentActivePinReqL();
		}
	 	 
	return TSYLOGSETEXITERR(ret);
	} // CSecurityDispatcher::DispatchGetCurrentActivePinL

TInt CSecurityDispatcher::DispatchSetLockSettingL(const CMmDataPackage* aDataPackage)
/**
 * Unpack data related to EMobilePhoneSetLockSetting
 * and pass request on to Licensee LTSY.
 *
 * @return Returns error code returned by the Licensee LTSY or KErrNotSupported if
 * the Licensee LTSY does not support this request.
 */
	{
	TSYLOGENTRYEXIT;
	TInt ret = KErrNotSupported;

    __ASSERT_DEBUG(aDataPackage, CtsyDispatcherPanic(EInvalidNullPtr));

	// Call Handle... method in Licensee LTSY
	if (iLtsyDispatchSecuritySetLockSetting)
		{
		TLockAndSetting* lockAndSetting = NULL;
		RMobilePhone::TMobilePassword* mobilePassword = NULL;
		aDataPackage->UnPackData(&lockAndSetting,&mobilePassword);
		
		//these should never be NULL
		__ASSERT_DEBUG(lockAndSetting, CtsyDispatcherPanic(EInvalidNullPtr));
		__ASSERT_DEBUG(lockAndSetting->iLock, CtsyDispatcherPanic(EInvalidNullPtr));
		__ASSERT_DEBUG(lockAndSetting->iSetting, CtsyDispatcherPanic(EInvalidNullPtr));
		
		//mobile password maybe null, as the CTSY has not packed one, if so pass 
		//down a reference to a null descriptor
		//ternary operator used so that KNullDesC does not have to have its const cast away
		const TDesC* mobilePasswordPtr = mobilePassword ? mobilePassword : &KNullDesC;

		ret = iLtsyDispatchSecuritySetLockSetting->HandleSetLockSettingReqL(*(lockAndSetting->iLock),*(lockAndSetting->iSetting),*mobilePasswordPtr);				
		}		

	return TSYLOGSETEXITERR(ret);
	} // CSecurityDispatcher::DispatchSetLockSettingL

TInt CSecurityDispatcher::DispatchVerifySecurityCodeL(const CMmDataPackage* aDataPackage)
/**
 * Unpack data related to EMobilePhoneVerifySecurityCode
 * and pass request on to Licensee LTSY.
 *
 * @return Returns error code returned by the Licensee LTSY or KErrNotSupported if
 * the Licensee LTSY does not support this request.
 */
	{
	TSYLOGENTRYEXIT;
	TInt ret = KErrNotSupported;

    __ASSERT_DEBUG(aDataPackage, CtsyDispatcherPanic(EInvalidNullPtr));

	// Call Handle... method in Licensee LTSY
	if (iLtsyDispatchSecurityVerifySecurityCode)
		{
		//sec code also has to be unpacked as a pointer due to CMmDataPackage's
		RMobilePhone::TMobilePhoneSecurityCode* secCode = NULL;
		RMobilePhone::TCodeAndUnblockCode* codes = NULL;
		aDataPackage->UnPackData(&secCode, &codes);
			
		//should never be NULL
		__ASSERT_DEBUG(codes, CtsyDispatcherPanic(EInvalidNullPtr));
		__ASSERT_DEBUG(secCode, CtsyDispatcherPanic(EInvalidNullPtr));
			
		ret = iLtsyDispatchSecurityVerifySecurityCode->HandleVerifySecurityCodeReqL(*secCode, *codes);
		}

	return TSYLOGSETEXITERR(ret);
	} // CSecurityDispatcher::DispatchVerifySecurityCodeL

TInt CSecurityDispatcher::DispatchGetPin1DisableSupportedL()
/**
 * Pass request on to Licensee LTSY.
 * 
 * @return Returns error code returned by the Licensee LTSY or KErrNotSupported if
 * the Licensee LTSY does not support this request.
 */
	{
	TSYLOGENTRYEXIT;
	TInt ret = KErrNotSupported;

	// Call Handle... method in Licensee LTSY
	if (iLtsyDispatchSecurityGetPin1DisableSupported)
		{
		ret = iLtsyDispatchSecurityGetPin1DisableSupported->HandleGetPin1DisableSupportedReqL();
		}
			
	return TSYLOGSETEXITERR(ret);	
	} // CPhoneDispatcher::DispatchGetPin1DisableSupportedL
	
TInt CSecurityDispatcher::DispatchCheckSecurityCodeL(const CMmDataPackage* aDataPackage)
/**
 * Unpack data related to ECustomCheckSecurityCodeIPC
 * and pass request on to Licensee LTSY.
 *
 * @return Returns error code returned by the Licensee LTSY or KErrNotSupported if
 * the Licensee LTSY does not support this request.
 */
	{
	TSYLOGENTRYEXIT;
	TInt ret = KErrNotSupported;
	
	__ASSERT_DEBUG(aDataPackage, CtsyDispatcherPanic(EInvalidNullPtr));	

	// Call Handle... method in Licensee LTSY
	if (iLtsyDispatchSecurityCheckSecurityCode)
		{
		TUint8* codeID = NULL;
		RMobilePhone::TMobilePassword* secCode = NULL;
		aDataPackage->UnPackData(&codeID, &secCode);
			
		__ASSERT_DEBUG(codeID, CtsyDispatcherPanic(EInvalidNullPtr));	
		__ASSERT_DEBUG(secCode, CtsyDispatcherPanic(EInvalidNullPtr));	
			
		DispatcherSecurity::TSecurityCodeId secCodeId = static_cast<DispatcherSecurity::TSecurityCodeId> (*codeID);
		ret = iLtsyDispatchSecurityCheckSecurityCode->HandleCheckSecurityCodeReqL(secCodeId, *secCode);
		}	

	return TSYLOGSETEXITERR(ret);
	} // CSecurityDispatcher::DispatchCheckSecurityCodeL

TInt CSecurityDispatcher::DispatchDisablePhoneLockL(const CMmDataPackage* aDataPackage)
/**
 * Unpack data related to ECustomDisablePhoneLockIPC
 * and pass request on to Licensee LTSY.
 *
 * @return Returns error code returned by the Licensee LTSY or KErrNotSupported if
 * the Licensee LTSY does not support this request.
 */
	{
	TSYLOGENTRYEXIT;
	TInt ret = KErrNotSupported;
	
	__ASSERT_DEBUG(aDataPackage, CtsyDispatcherPanic(EInvalidNullPtr));		

	// Can Handle... method in Licensee LTSY
	if (iLtsyDispatchSecurityDisablePhoneLock)
		{		
		RMobilePhone::TMobilePassword* secCode = NULL;
		aDataPackage->UnPackData(&secCode);
		__ASSERT_DEBUG(secCode, CtsyDispatcherPanic(EInvalidNullPtr));
			
		ret = iLtsyDispatchSecurityDisablePhoneLock->HandleDisablePhoneLockReqL(*secCode);			
		}

	return TSYLOGSETEXITERR(ret);
	} // CSecurityDispatcher::DispatchDisablePhoneLockL

TInt CSecurityDispatcher::DispatchGetCipheringInfoL()
/**
 * Pass request on to Licensee LTSY.
 *
 * @return Returns error code returned by the Licensee LTSY or KErrNotSupported if
 * the Licensee LTSY does not support this request.
 */
	{
	TSYLOGENTRYEXIT;
	TInt ret = KErrNotSupported;

	// Can Handle... method in Licensee LTSY
	if (iLtsyDispatchSecurityGetCipheringInfo)
		{
		ret = iLtsyDispatchSecurityGetCipheringInfo->HandleGetCipheringInfoReqL();
		}

	return TSYLOGSETEXITERR(ret);
	} // CSecurityDispatcher::DispatchGetCipheringInfoL

TInt CSecurityDispatcher::DispatchIsSecurityCodeBlockedL(const CMmDataPackage* aDataPackage)
/**
 * Unpack data related to ECustomIsBlockedIPC
 * and pass request on to Licensee LTSY.
 *
 * @return Returns error code returned by the Licensee LTSY or KErrNotSupported if
 * the Licensee LTSY does not support this request.
 */
	{
	TSYLOGENTRYEXIT;
	TInt ret = KErrNotSupported;
	
	__ASSERT_DEBUG(aDataPackage, CtsyDispatcherPanic(EInvalidNullPtr));			

	// Can Handle... method in Licensee LTSY
	if (iLtsyDispatchSecurityIsSecurityCodeBlocked)
		{
		TUint8 codeID;
		aDataPackage->UnPackData(codeID);
		DispatcherSecurity::TSecurityCodeId secCodeId = static_cast<DispatcherSecurity::TSecurityCodeId> (codeID);
		ret = iLtsyDispatchSecurityIsSecurityCodeBlocked->HandleIsSecurityCodeBlockedReqL(secCodeId);			
		}
		
	return TSYLOGSETEXITERR(ret);
	} // CSecurityDispatcher::DispatchIsSecurityCodeBlockedL

TInt CSecurityDispatcher::DispatchCheckSecurityCodeCancelL(const CMmDataPackage* aDataPackage)
/**
 * Unpack data related to ECustomCheckSecurityCodeCancelIPC
 * and pass request on to Licensee LTSY.
 *
 * @return Returns error code returned by the Licensee LTSY or KErrNotSupported if
 * the Licensee LTSY does not support this request.
 */
	{
	TSYLOGENTRYEXIT;
	TInt ret = KErrNotSupported;
	
	__ASSERT_DEBUG(aDataPackage, CtsyDispatcherPanic(EInvalidNullPtr));		

	// Can Handle... method in Licensee LTSY
	if (iLtsyDispatchSecurityCheckSecurityCodeCancel)
		{
		TUint8 codeID;
		TBool flag; // it will not be sent to the LTSY
		aDataPackage->UnPackData(codeID, flag);
		DispatcherSecurity::TSecurityCodeId secCodeId = static_cast<DispatcherSecurity::TSecurityCodeId> (codeID);
		ret = iLtsyDispatchSecurityCheckSecurityCodeCancel->HandleCheckSecurityCodeCancelReqL(secCodeId);			
		}
	
	return TSYLOGSETEXITERR(ret);
	} // CSecurityDispatcher::DispatchCheckSecurityCodeCancelL


//
// Callback handlers follow
//



void CSecurityDispatcher::CallbackBootNotifySecurityReady(TInt aError)
/**
 * Callback function to be used by the request to complete
 * CCtsyDispatcherCallback::CallbackSecurityBootNotifySecurityReadyInd()
 *
 * @param aError The error code to be returned to the CTSY Dispatcher.
 */
	{
	TSYLOGENTRYEXITARGS(_L8("aError=%d"), aError);
	
	iMessageManagerCallback.Complete(EMmTsyBootNotifySecurityReadyIPC, aError);
	
	} // CSecurityDispatcher::CallbackBootNotifySecurityReady

void CSecurityDispatcher::CallbackNotifySecurityEvent(TInt aError, RMobilePhone::TMobilePhoneSecurityEvent aSecEvent)
/**
 * Callback function to be used by the request to complete
 * CCtsyDispatcherCallback::CallbackSecurityNotifySecurityEventInd()
 *
 * @param aError The error code to be returned to the CTSY Dispatcher.
 * @param aSecEvent Security event.
 */
	{
	TSYLOGENTRYEXITARGS(_L8("aError=%d, aSecEvent=%d"), aError, aSecEvent);

	CMmDataPackage dataPackage;		
	dataPackage.PackData(&aSecEvent);			             
	
	iMessageManagerCallback.Complete(EMobilePhoneNotifySecurityEvent, &dataPackage, aError);
	
	} // CSecurityDispatcher::CallbackNotifySecurityEvent

void CSecurityDispatcher::CallbackNotifyLockInfoChange(TInt aError,
				RMobilePhone::TMobilePhoneLockStatus aStatus, RMobilePhone::TMobilePhoneLockSetting aSetting, RMobilePhone::TMobilePhoneLock aLock)
/**
 * Callback function to be used by the request to complete
 * CCtsyDispatcherCallback::CallbackSecurityNotifyLockInfoChangeInd()
 *
 * @param aError The error code to be returned to the CTSY Dispatcher.
 * @param aStatus Status of the lock (unknown, locked, unlocked or blocked).
 * @param aSetting Lock setting (unknown, enabled, disabled or replaced).
 * @param aLock Lock information.
 */
	{
	TSYLOGENTRYEXITARGS(_L8("aError=%d, aStatus=%d, aSetting=%d, aLock=%d"), 
			                 aError, aStatus, aSetting, aLock);

    RMobilePhone::TMobilePhoneLockInfoV1 lockInfo;
    lockInfo.iStatus = aStatus;
    lockInfo.iSetting = aSetting;
	CMmDataPackage dataPackage;		
	dataPackage.PackData(&lockInfo, &aLock);			             
	
	iMessageManagerCallback.Complete(EMobilePhoneNotifyLockInfoChange, &dataPackage, aError);
	
	} // CSecurityDispatcher::CallbackNotifyLockInfoChange

void CSecurityDispatcher::CallbackGetSecurityCodeInfo(TInt aError,
				RMobilePhone::TMobilePhoneSecurityCode aSecCode, TInt aRemainingEntryAttempts)
/**
 * Callback function to be used by the request to complete
 * CCtsyDispatcherCallback::CallbackSecurityGetSecurityCodeInfoComp()
 *
 * @param aError The error code to be returned to the CTSY Dispatcher.
 * @param aSecCode Security code.
 * @param aRemainingEntryAttempts Number of remaining security code entry attempts before the corresponding lock gets blocked.
 */
	{
	TSYLOGENTRYEXITARGS(_L8("aError=%d, aSecCode=%d, aRemainingEntryAttempts=%d"), aError, aSecCode, aRemainingEntryAttempts);

	RMobilePhone::TMobilePhoneSecurityCodeInfoV5 codeInfo;
    codeInfo.iRemainingEntryAttempts = aRemainingEntryAttempts;
	CMmDataPackage dataPackage;		
	dataPackage.PackData(&aSecCode, &codeInfo);			             
	
	iMessageManagerCallback.Complete(EMobilePhoneGetSecurityCodeInfo, &dataPackage, aError);
	
	} // CSecurityDispatcher::CallbackGetSecurityCodeInfo

void CSecurityDispatcher::CallbackGetLockInfo(TInt aError,
				RMobilePhone::TMobilePhoneLockStatus aLockStatus, RMobilePhone::TMobilePhoneLockSetting aLockSetting)
/**
 * Callback function to be used by the request to complete
 * CCtsyDispatcherCallback::CallbackSecurityGetLockInfoComp()
 *
 * @param aError The error code to be returned to the CTSY Dispatcher.
 * @param aLockStatus Lock status (unknown, locked, unlocked or blocked).
 * @param aLockSetting Lock setting (unknown, enabled, disabled or replaced).
 */
	{
	TSYLOGENTRYEXITARGS(_L8("aError=%d, aLockStatus=%d, aLockSetting=%d"), aError, aLockStatus, aLockSetting);

	CMmDataPackage dataPackage;
	dataPackage.PackData(&aLockStatus, &aLockSetting);
		
	iMessageManagerCallback.Complete(EMobilePhoneGetLockInfo, &dataPackage,  aError);
	
	} // CSecurityDispatcher::CallbackGetLockInfo

void CSecurityDispatcher::CallbackAbortSecurityCode(TInt aError)
/**
 * Callback function to be used by the request to complete
 * CCtsyDispatcherCallback::CallbackSecurityAbortSecurityCodeComp()
 *
 * @param aError The error code to be returned to the CTSY Dispatcher.
 */
	{
	TSYLOGENTRYEXITARGS(_L8("aError=%d"), aError);

	iMessageManagerCallback.Complete(EMobilePhoneAbortSecurityCode, aError);
	
	} // CSecurityDispatcher::CallbackAbortSecurityCode

void CSecurityDispatcher::CallbackGetCurrentActivePin(TInt aError, RMobilePhone::TMobilePhoneSecurityCode aSecCode)				
/**
 * Callback function to be used by the request to complete
 * CCtsyDispatcherCallback::CallbackSecurityGetCurrentActivePinComp()
 *
 * @param aError The error code to be returned to the CTSY Dispatcher.
 * @param aSecCode Security code.
 */
	{
	TSYLOGENTRYEXITARGS(_L8("aError=%d, aSecCode=%d"), aError, aSecCode);
	
	CMmDataPackage dataPackage;
	dataPackage.PackData(&aSecCode);	
	
	iMessageManagerCallback.Complete(EMmTsySecurityGetSimActivePinStateIPC, &dataPackage, aError);
	
	} // CSecurityDispatcher::CallbackGetCurrentActivePin

void CSecurityDispatcher::CallbackSetLockSetting(TInt aError)
/**
 * Callback function to be used by the request to complete
 * CCtsyDispatcherCallback::CallbackSecuritySetLockSettingComp()
 *
 * @param aError The error code to be returned to the CTSY Dispatcher.
 * @param aLockStatus Phone lock status.
 * @param aLockSetting The phone lock setting.
 */
	{
	TSYLOGENTRYEXITARGS(_L8("aError=%d"), aError);

    // next 2 params are ignored by the CTSY:
    RMobilePhone::TMobilePhoneLockStatus lockStatus = RMobilePhone::EStatusLocked;
    RMobilePhone::TMobilePhoneLockSetting lockSetting = RMobilePhone::ELockSetEnabled;
	CMmDataPackage dataPackage;
	dataPackage.PackData(&lockStatus, &lockSetting);
		
	iMessageManagerCallback.Complete(EMobilePhoneSetLockSetting, &dataPackage,  aError);
		
	} // CSecurityDispatcher::CallbackSetLockSetting

void CSecurityDispatcher::CallbackVerifySecurityCode(TInt aError)
/**
 * Callback function to be used by the request to complete
 * CCtsyDispatcherCallback::CallbackSecurityVerifySecurityCodeComp().
 *
 * @param aError The error code to be returned to the CTSY Dispatcher.
 */
	{
	TSYLOGENTRYEXITARGS(_L8("aError=%d"), aError);

	iMessageManagerCallback.Complete(EMobilePhoneVerifySecurityCode, aError);
	
	} // CSecurityDispatcher::CallbackVerifySecurityCode
	
void CSecurityDispatcher::CallbackGetPin1DisableSupported(TInt aError, TBool aIsSupported)
/**
 * Packages the data returned by the Licensee LTSY and completes the 
 * EMmTsyPhoneGetPin1DisableSupportedIPC back to the Common TSY.
 * 
 * @param aError The error code to complete back. 
 * @param aIsSupported Is SIM support disabling of PIN1.
 */
	{
	TSYLOGENTRYEXITARGS(_L8("aError=%d aIsSupported=%d"), aError, aIsSupported);

	// Package up data to return to Common TSY
	CMmDataPackage dataPackage;
	dataPackage.PackData(&aIsSupported);

	// Now complete the actual get request
	iMessageManagerCallback.Complete(EMmTsyPhoneGetPin1DisableSupportedIPC, &dataPackage, aError);		
	} // CSecurityDispatcher::CallbackGetPin1DisableSupported
	
void CSecurityDispatcher::CallbackNotifyCipheringInfoChange(TInt aError, const RMmCustomAPI::TCipheringInfo& aInfo)				
/**
 * Callback function to be used by the request to complete
 * CCtsyDispatcherCallback::CallbackSecurityNotifyCipheringInfoChangeInd().
 *
 * @param aError The error code to be returned to the CTSY Dispatcher.
 * @param aInfo Ciphering information data structure: ciphering indicator and ciphering status.
 */
	{
	TSYLOGENTRYEXITARGS(_L8("aError=%d, aInfo.iIndStatus=%d, aInfo.iCiphStatus=%d"), aError, aInfo.iIndStatus, aInfo.iCiphStatus);
	
	// Package up data to return to Common TSY
	CMmDataPackage dataPackage;
	dataPackage.PackData(const_cast<TBool*>(&aInfo.iIndStatus), 
			             const_cast<TBool*>(&aInfo.iCiphStatus));	
	
	iMessageManagerCallback.Complete(ECustomNotifyCipheringInfoChangeIPC, &dataPackage, aError);
	
	} // CSecurityDispatcher::CallbackNotifyCipheringInfoChange

void CSecurityDispatcher::CallbackCheckSecurityCode(TInt aError)
/**
 * Callback function to be used by the request to complete
 * CCtsyDispatcherCallback::CallbackSecurityCheckSecurityCodeComp().
 *
 * @param aError The error code to be returned to the CTSY Dispatcher.
 */
	{
	TSYLOGENTRYEXITARGS(_L8("aError=%d"), aError);

	iMessageManagerCallback.Complete(ECustomCheckSecurityCodeIPC, aError);
	
	} // CSecurityDispatcher::CallbackCheckSecurityCode

void CSecurityDispatcher::CallbackDisablePhoneLock(TInt aError)
/**
 * Callback function to be used by the request to complete
 * CCtsyDispatcherCallback::CallbackSecurityDisablePhoneLockComp().
 *
 * @param aError The error code to be returned to the CTSY Dispatcher.
 */
	{
	TSYLOGENTRYEXITARGS(_L8("aError=%d"), aError);

	iMessageManagerCallback.Complete(ECustomDisablePhoneLockIPC, aError);
	
	} // CSecurityDispatcher::CallbackDisablePhoneLock

void CSecurityDispatcher::CallbackGetCipheringInfo(TInt aError, TBool aIndStatus)				
/**
 * Callback function to be used by the request to complete
 * CCtsyDispatcherCallback::CallbackSecurityGetCipheringInfoComp().
 *
 * @param aError The error code to be returned to the CTSY Dispatcher.
 * @param aIndStatus Ciphering indicator status.
 */
	{
	TSYLOGENTRYEXITARGS(_L8("aError=%d, aIndStatus=%d"), aError, aIndStatus);
	
	CMmDataPackage dataPackage;
	dataPackage.PackData(&aIndStatus);	

	// Pack the data to return to the Common TSY
	iMessageManagerCallback.Complete(ECustomGetCipheringInfoIPC, &dataPackage, aError);
	
	} // CSecurityDispatcher::CallbackGetCipheringInfo

void CSecurityDispatcher::CallbackIsSecurityCodeBlocked(TInt aError, TBool aIsBlocked)				
/**
 * Callback function to be used by the request to complete
 * CCtsyDispatcherCallback::CallbackSecurityIsSecurityCodeBlockedComp().
 *
 * @param aError The error code to be returned to the CTSY Dispatcher.
 * @param aIsBlocked Is security code blocked.
 */
	{
	TSYLOGENTRYEXITARGS(_L8("aError=%d, aIsBlocked=%d"), aError, aIsBlocked);
	
	CMmDataPackage dataPackage;
	dataPackage.PackData(&aIsBlocked);		
	
	iMessageManagerCallback.Complete(ECustomIsBlockedIPC, &dataPackage, aError);
	
	} // CSecurityDispatcher::CallbackIsSecurityCodeBlocked	

void CSecurityDispatcher::CallbackCheckSecurityCodeCancel(TInt aError)
/**
 * Callback function to be used by the request to complete
 * CCtsyDispatcherCallback::CallbackSecurityCheckSecurityCodeCancelComp().
 *
 * @param aError The error code to be returned to the CTSY Dispatcher.
 */
	{
	TSYLOGENTRYEXITARGS(_L8("aError=%d"), aError);

	iMessageManagerCallback.Complete(ECustomCheckSecurityCodeCancelIPC, aError);
	
	} // CSecurityDispatcher::CallbackCheckSecurityCodeCancel

void CSecurityDispatcher::CallbackSync(CRequestQueueOneShot::TIpcDataPackage& aIpcDataPackage)
/**
 * Part of the MDispatcherCallback interface. Used to complete requests handled
 * synchronously by the Licensee LTSY asynchronously back to the Common TSY.
 *  
 * @param aIpcDataPackage Package encapsulating the request.
 * 
 * @see MDispatcherCallback::CallbackSync
 */
	{
	TSYLOGENTRYEXIT;
	
	switch (aIpcDataPackage.iIpc)
		{
	
	default:
		LOG(_L8("WARNING: CSecurityDispatcher::CallbackSync unhandled IPC=%d"), aIpcDataPackage.iIpc);
		__ASSERT_DEBUG(NULL, CtsyDispatcherPanic(EUnhandledCtsyIpc));
		break;		
		} // switch (aIpcDataPackage.iIpc)
	
	} // CSecurityDispatcher::CallbackSync



