diff -r 000000000000 -r 62f9d29f7211 webservices/wsframework/inc/senserviceinvocationframework.inl --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/webservices/wsframework/inc/senserviceinvocationframework.inl Thu Jan 07 16:19:19 2010 +0200 @@ -0,0 +1,158 @@ +/* +* Copyright (c) 2002-2005 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: Defines the ECom interface for Sen Service Invocation +* Framework plug-ins +* +*/ + + + + + + + + +#include + +// Interface's (abstract base class's) static factory method implementation. +// Asks ECOM plug-in framework to instantiate appropriate concrete plug-in +// implementation. +inline CSIF* CSIF::NewL(MSenCoreServiceManager& aManager) + { + // Caller wants to instantiate the default plug-in - ID-WSF +#ifndef RD_SEN_COMPILE_SIS_PACKAGE_FILES + const TUid KIDWSFInterfaceUid = {0x101F96FA}; +#else + const TUid KIDWSFInterfaceUid = {0x101F9731}; +#endif + + TAny* constructorParameters = reinterpret_cast(&aManager); + + // Find implementation for our interface. + // - KIDWSFInterfaceUid is the UID of our custom ECOM interface. + // - This call will leave, if the plugin architecture cannot find any implementation. + // - The returned pointer points to one of the interface implementations. + TUid dtor_id_key; + TAny* intf = REComSession::CreateImplementationL ( KIDWSFInterfaceUid, dtor_id_key, constructorParameters ); + //TAny* intf = REComSession::CreateImplementationL ( KIDWSFUid, _FOFF (CSIF, dtor_id_key), constructorParameters ); + CSIF* sif = reinterpret_cast (intf); + if ( sif ) + { + + // Resolve the DataType of this plug-in (ECOM cue): + RImplInfoPtrArray ecomInfoArray; + REComSession::ListImplementationsL( KIDWSFInterfaceUid, ecomInfoArray ); + + TInt infoCount(ecomInfoArray.Count()); + // NOTE: current code uses the plug-in that has highest version number + //TInt index_with_highest_version(0); + CImplementationInformation* match = NULL; + for (TInt i=0; iVersion() > match->Version() ) + { + match = candidate; + // index of plug-in with highest version number + //index_with_highest_version = i; + } + } + CleanupStack::PushL( sif ); + sif->iData = new (ELeave) TSifData(); + sif->iData->iDtor_ID_Key = dtor_id_key; + if( match ) + { + sif->iData->iCue = match->DataType().AllocL(); + } + CleanupStack::Pop( sif ); + ecomInfoArray.ResetAndDestroy(); + } + + return sif; + } + +// Interface's (abstract base class's) static factory method implementation. +// Asks ECOM plug-in framework to instantiate appropriate concrete plug-in +// implementation. +inline CSIF* CSIF::NewL(const TDesC8& aCue, MSenCoreServiceManager& aManager) + { +#ifndef RD_SEN_COMPILE_SIS_PACKAGE_FILES + const TUid KCSIFInterfaceUid = {0x101F96F9}; +#else + const TUid KCSIFInterfaceUid = {0x101F9730}; +#endif + //const TUid KCSIFResolverUid = {0x101F614E}; // default resolver used, not needed.. + + TEComResolverParams resolverParams; + resolverParams.SetDataType( aCue ); + //resolverParams.SetWildcardMatch(ETrue); + resolverParams.SetWildcardMatch(EFalse); + + TAny* constructorParameters = reinterpret_cast(&aManager); + + + // Find implementation for our interface. + // - XXX is the UID of our custom ECOM + // interface. It is defined in EComInterfaceDefinition.h + // - This call will leave, if the plugin architecture cannot find implementation. + // - The returned pointer points to one of the interface implementations + TUid dtor_id_key; + TAny* intf = REComSession::CreateImplementationL (KCSIFInterfaceUid, dtor_id_key, constructorParameters, resolverParams); + // TAny* intf = REComSession::CreateImplementationL (KCSIFInterfaceUid, _FOFF (CSIF, dtor_id_key), constructorParameters, resolverParams); + + CSIF* sif = reinterpret_cast (intf); + if ( sif ) + { + CleanupStack::PushL( sif ); + sif->iData = new (ELeave) TSifData(); + sif->iData->iDtor_ID_Key = dtor_id_key; + sif->iData->iCue = aCue.AllocL(); + CleanupStack::Pop( sif ); + } + + return sif; + } + +// Interface's (abstract base class's) destructor +inline CSIF::~CSIF() + { + // If in the NewL some memory is reserved for member data, it must be + // released here. + if( iData ) // actually, this MUST always be true + { + // Inform the ECOM framework that this specific instance of the + // interface has been destroyed. + REComSession::DestroyedImplementation ( iData->iDtor_ID_Key ); + iData->Close(); // de-allocates iData members + delete iData; + iData = NULL; + } + } + +inline TPtrC8 CSIF::Cue() const + { + if(iData && iData->iCue) + return *(iData->iCue); + else + return KNullDesC8(); + } + +inline void CSIF::TSifData::Close() + { + delete iCue; + iCue = NULL; + } + + +// End of File