diff -r 000000000000 -r bde4ae8d615e os/persistentdata/featuremgmt/featuremgr/src/serverexe/featmgrpluginhandler.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/os/persistentdata/featuremgmt/featuremgr/src/serverexe/featmgrpluginhandler.cpp Fri Jun 15 03:10:57 2012 +0200 @@ -0,0 +1,252 @@ +// Copyright (c) 2007-2010 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 FILES +#include +#include "featmgrpluginhandler.h" +#include "featmgrclientserver.h" +#include "featmgrdebug.h" +#include "featmgrserver.h" + +// LOCAL CONSTANTS +_LIT(KPanicCategory, "FeatMgrPluginHandler"); + +// ============================= LOCAL FUNCTIONS =============================== + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CFeatMgrPluginHandler::CFeatMgrPluginHandler +// C++ constructor +// ----------------------------------------------------------------------------- +// +CFeatMgrPluginHandler::CFeatMgrPluginHandler( CFeatMgrServer& aServer ) + : iPlugin( NULL ), + iServer( aServer ), + iTransId( 0 ) // Is always 0 because there is only one transaction between handler and plugin. + { + } + +// ----------------------------------------------------------------------------- +// CFeatMgrPluginHandler::ConstructL +// 2nd phase constructor gets plugin instance. +// ----------------------------------------------------------------------------- +// +void CFeatMgrPluginHandler::ConstructL( TUid aImplementationUid ) + { + FUNC_LOG + + // get plugin instance + iPlugin = CFeatureInfoPlugin::NewL( aImplementationUid, *this ); + } + +// ----------------------------------------------------------------------------- +// CFeatMgrPluginHandler::NewL +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +CFeatMgrPluginHandler* CFeatMgrPluginHandler::NewL( TUid aImplementationUid, + CFeatMgrServer& aServer ) + { + CFeatMgrPluginHandler* self = new( ELeave ) CFeatMgrPluginHandler( aServer ); + + CleanupStack::PushL( self ); + self->ConstructL( aImplementationUid ); + CleanupStack::Pop( self ); + + return self; + } + +// --------------------------------------------------------- +// Destructor +// --------------------------------------------------------- +// +CFeatMgrPluginHandler::~CFeatMgrPluginHandler() + { + FUNC_LOG + delete iPlugin; + } + +// ----------------------------------------------------------------------------- +// CFeatMgrPluginHandler::SendCommandL +// Sends a command to plugin for processing. +// ----------------------------------------------------------------------------- +// +void CFeatMgrPluginHandler::SendCommandL( FeatureInfoCommand::TFeatureInfoCmd aCommandId ) + { + // Load feature info. + iCommandId = aCommandId; + iTransId++; + TPtrC8 ptr(KNullDesC8); + iPlugin->ProcessCommandL( iCommandId, iTransId, ptr ); + } + +// ----------------------------------------------------------------------------- +// CFeatMgrPluginHandler::ProcessResponseL +// Routes response from plugin to server +// ----------------------------------------------------------------------------- +// +void CFeatMgrPluginHandler::ProcessResponseL( FeatureInfoCommand::TFeatureInfoCmd aCommandId, + TUint8 aTransId, + TDesC8& aData ) + { + FUNC_LOG + + INFO_LOG2( "CFeatMgrPluginHandler::ProcessResponseL( aCommandId 0x%x, aTransId 0x%x )", + aCommandId, aTransId ); + + if ( iTransId == aTransId && + ( aCommandId == FeatureInfoCommand::ELoadFeatureInfoCmdId || + aCommandId == FeatureInfoCommand::ELoadEnhancedFeatureInfoCmdId ) && + iCommandId == aCommandId ) + { + // Copy response and ask server to process it + if( aCommandId == FeatureInfoCommand::ELoadFeatureInfoCmdId ) + { + RArray featureList; + CleanupClosePushL( featureList ); + FeatureInfoCommand::TFeatureInfoRespPckg response; + response.Copy( aData ); + ProcessFeatureInfoL(featureList, response); + CleanupStack::PopAndDestroy( &featureList ); + } + else if( aCommandId == FeatureInfoCommand::ELoadEnhancedFeatureInfoCmdId ) + { + RFeatureArray featureList; + CleanupClosePushL( featureList ); + FeatureInfoCommand::TEnhancedFeatureInfoRespPckg response; + response.Copy( aData ); + ProcessFeatureInfoL(featureList, response); + CleanupStack::PopAndDestroy( &featureList ); + } + } + else + { + ERROR_LOG2( "CFeatMgrPluginHandler::ProcessResponseL - Command ID , expected: 0x%x, got 0x%x", + iCommandId, aCommandId ); + ERROR_LOG2( "CFeatMgrPluginHandler::ProcessResponseL - Transaction ID , expected: 0x%x, got 0x%x", + iTransId, aTransId ); + User::Leave( KErrArgument ); + } + } + +// ----------------------------------------------------------------------------- +// CFeatMgrPluginHandler::ProcessFeatureInfoL +// Asks server to process specified response from plugin +// ----------------------------------------------------------------------------- +// +void CFeatMgrPluginHandler::ProcessFeatureInfoL( + RArray& aList, + FeatureInfoCommand::TFeatureInfoRespPckg aResponse ) + { + FUNC_LOG + + // Go through dynamic feature list. Possible multiple same entries resolved by server. + TInt err( KErrNone ); + TInt count = aResponse().iList.Count(); + + if ( aResponse().iErrorCode == KErrNone ) + { + for( TInt i = 0 ; i < count; i++) + { + INFO_LOG2( "CFeatMgrPluginHandler::ProcessFeatureInfoL - featureID %d, value %d", + aResponse().iList[i].iFeatureID, aResponse().iList[i].iValue ); + + err = aList.Append( aResponse().iList[i] ); + + if ( err != KErrNone ) + { + ERROR_LOG1( "CFeatMgrPluginHandler::ProcessFeatureInfoL - Error %d when saving feature info", + err ); + break; + } + } + + if ( err == KErrNone ) + { + // Send feature info to the server + iServer.FeatureInfoL( aList, this ); + } + else + { + INFO_LOG1( "CFeatMgrPluginHandler::ProcessFeatureInfoL - FeatureInfoL not called %d", err ); + } + } + else + { + ERROR_LOG2( "CFeatMgrPluginHandler::ProcessFeatureInfoL - pluginhandler %x, error %d - going to panic", + this, aResponse().iErrorCode ); + // This is considered fatal enough reason to panic + ::FmgrFatalErrorL(aResponse().iErrorCode, KPanicCategory, EPanicInvalidFeatureInfo); + } + } + +// ----------------------------------------------------------------------------- +// CFeatMgrPluginHandler::ProcessFeatureInfoL +// Asks server to process specified response from plugin +// ----------------------------------------------------------------------------- +// +void CFeatMgrPluginHandler::ProcessFeatureInfoL( + RFeatureArray& aList, + FeatureInfoCommand::TEnhancedFeatureInfoRespPckg aResponse ) + { + FUNC_LOG + + // Go through dynamic feature list. Possible multiple same entries resolved by server. + TInt err( KErrNone ); + TInt count = aResponse().iList.Count(); + + if ( aResponse().iErrorCode == KErrNone ) + { + for( TInt i = 0 ; i < count; i++) + { + INFO_LOG2( "CFeatMgrPluginHandler::ProcessFeatureInfoL - featureID %d, data %d", + aResponse().iList[i].FeatureUid(), aResponse().iList[i].FeatureData() ); + + err = aList.Append( aResponse().iList[i] ); + + if ( err != KErrNone ) + { + ERROR_LOG1( "CFeatMgrPluginHandler::ProcessFeatureInfoL - Error %d when saving feature info", + err ); + break; + } + } + + if ( err == KErrNone ) + { + // Send feature info to the server + iServer.FeatureInfoL( aList, this ); + } + else + { + INFO_LOG1( "CFeatMgrPluginHandler::ProcessFeatureInfoL - FeatureInfoL not called %d", err ); + } + } + else + { + ERROR_LOG2( "CFeatMgrPluginHandler::ProcessFeatureInfoL - pluginhandler %x, error %d - going to panic", + this, aResponse().iErrorCode ); + // This is considered fatal enough reason to panic + ::FmgrFatalErrorL(aResponse().iErrorCode, KPanicCategory, EPanicInvalidFeatureInfo); + } + } + +// ========================== OTHER EXPORTED FUNCTIONS ========================= + +// End of File