diff -r 000000000000 -r 1bce908db942 multimediacommsengine/mmcefloorctrlengine/src/fcpluginengine.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/multimediacommsengine/mmcefloorctrlengine/src/fcpluginengine.cpp Tue Feb 02 01:04:58 2010 +0200 @@ -0,0 +1,401 @@ +/* +* Copyright (c) 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: +* +*/ + + + + +#include "fcpluginengine.h" +#include "fcplugininfo.h" +#include "fcinterfaceinitparams.h" +#include "fcpluginiter.h" +#include "fcsession.h" + +// ---------------------------------------------------------------------------- +// CFCPlugInEngine::NewL +// ---------------------------------------------------------------------------- +// +EXPORT_C CFCPlugInEngine* CFCPlugInEngine::NewL(MFCObserver& aFCObserver) + { + CFCPlugInEngine* self = CFCPlugInEngine::NewLC(aFCObserver); + CleanupStack::Pop(self); + return self; + } + +// ---------------------------------------------------------------------------- +// CFCPlugInEngine::NewLC +// ---------------------------------------------------------------------------- +// +EXPORT_C CFCPlugInEngine* CFCPlugInEngine::NewLC(MFCObserver& aFCObserver) + { + CFCPlugInEngine* self = new (ELeave) CFCPlugInEngine(aFCObserver); + CleanupStack::PushL(self); + self->ConstructL(); + return self; + } + +// ---------------------------------------------------------------------------- +// Destructor +// ---------------------------------------------------------------------------- +// +EXPORT_C CFCPlugInEngine::~CFCPlugInEngine() + { + iFCSessions.ResetAndDestroy(); + iFCPlugIns.ResetAndDestroy(); + REComSession::FinalClose(); + } + +// ---------------------------------------------------------------------------- +// CFCPlugInEngine::ConstructL +// ---------------------------------------------------------------------------- +// +void CFCPlugInEngine::ConstructL() + { + ListMechanismImplementationsL(); + } + +// ---------------------------------------------------------------------------- +// CFCPlugInEngine::ConstructL +// ---------------------------------------------------------------------------- +// +CFCPlugInEngine::CFCPlugInEngine(MFCObserver& aFCObserver) +: iFCObserver(aFCObserver), + iFCPlugInIter(iFCPlugIns) + { + } + +// ---------------------------------------------------------------------------- +// CFCPlugInEngine::FCPlugInIter +// ---------------------------------------------------------------------------- +// +TFCPlugInIter& CFCPlugInEngine::FCPlugInIter() + { + return iFCPlugInIter; + } + +// ---------------------------------------------------------------------------- +// CFCPlugInEngine:: SupportedProtocolL +// ---------------------------------------------------------------------------- +// +EXPORT_C CDesC8Array* CFCPlugInEngine::SupportedProtocolL() + { + CDesC8ArrayFlat* protocols = new (ELeave) CDesC8ArrayFlat(1); + CleanupStack::PushL(protocols); + TFCPlugInIter plugInIter(iFCPlugIns); + CFCPlugInInfo* plugin = plugInIter.First(); + + while (plugin) + { + HBufC8* name = HBufC8::NewLC(plugin->Name().Length()); + name->Des().Copy(plugin->Name()); + protocols->AppendL(*name); + plugin = plugInIter.Next(); + CleanupStack::PopAndDestroy(name); + } + CleanupStack::Pop(protocols); + return protocols; + } + +// ---------------------------------------------------------------------------- +// CFCPlugInEngine:: PlugInByNameL +// ---------------------------------------------------------------------------- +// + +EXPORT_C MFCPlugIn* CFCPlugInEngine::PlugInByNameL(const TDesC8& aProtocolName) + { + TFCPlugInIter plugInIter(iFCPlugIns); + CFCPlugInInfo* plugin = NULL; + plugin = plugInIter.First(); + while (plugin) + { + if (aProtocolName.CompareF(plugin->Name()) == KErrNone) + { + TFCInterfaceInitParams initParam( *this ); + // Instantiate plug-in with UID + return CFCInterface::NewL( plugin->Uid(), initParam ); + } + plugin = plugInIter.Next(); + } + return NULL; + } + +// ---------------------------------------------------------------------------- +// CFCPlugInEngine:: CreateNewSessionL +// ---------------------------------------------------------------------------- +// + +EXPORT_C CFCSession& CFCPlugInEngine::CreateNewSessionL( + const TDesC8& aType, + TUint32 aIapId, + TUint32 aPort ) + { + CFCInterface* plugIn = ( CFCInterface* ) PlugInByNameL( aType ); + CleanupStack::PushL( plugIn ); + CFCSession* fcSession = CFCSession::NewL( plugIn, aIapId, aPort ); + CleanupStack::Pop( plugIn ); + CleanupStack::PushL( fcSession ); + iFCSessions.AppendL( fcSession ); + CleanupStack::Pop( fcSession ); + return *fcSession; + } + +// ---------------------------------------------------------------------------- +// CFCPlugInEngine:: ReleaseSession +// ---------------------------------------------------------------------------- +// + +EXPORT_C void CFCPlugInEngine::ReleaseSession(const CFCSession& aSession) + { + TInt ind = iFCSessions.Find( &aSession ); + if ( ind != KErrNotFound ) + { + CFCSession* fcSession = iFCSessions[ ind ]; + fcSession->ReleaseSession(); + iFCSessions.Remove( ind ); + delete fcSession; + fcSession = NULL; + } + } + +// ---------------------------------------------------------------------------- +// CFCPlugInEngine::FormatAttributeFieldsL +// Attribute must set first +// ---------------------------------------------------------------------------- +// +EXPORT_C RPointerArray& + CFCPlugInEngine::FormatAttributeFieldsL(const CFCSession& aSession) + { + TInt ind = iFCSessions.Find( &aSession ); + User::LeaveIfError( ind ); + return iFCSessions[ ind ]->FormatAttributeFields(); + } + +// ---------------------------------------------------------------------------- +// CFCPlugInEngine:: SetFormatAttributeFieldsL +// Sets the formateAttributeFields +// ---------------------------------------------------------------------------- +// +EXPORT_C void CFCPlugInEngine::SetFormatAttributeFieldsL( + const CFCSession& aSession, + RPointerArray* aAttributes ) + { + TInt ind = iFCSessions.Find( &aSession ); + User::LeaveIfError( ind ); + return iFCSessions[ ind ]->SetFormatAttributeFieldsL(aAttributes); + } + +// ---------------------------------------------------------------------------- +// CFCPlugInEngine::UpdateOfferL +// Modifies local parameters of FC to offer document +// ---------------------------------------------------------------------------- +// +EXPORT_C void CFCPlugInEngine::UpdateOfferL( const CFCSession& aSession, + CSdpDocument& aSdpDocument ) + { + TInt ind = iFCSessions.Find( &aSession ); + User::LeaveIfError( ind ); + iFCSessions[ ind ]->UpdateSDPL( aSdpDocument ); + } + +// ---------------------------------------------------------------------------- +// CFCPlugInEngine::SetSessionPortL() +// ---------------------------------------------------------------------------- +// +EXPORT_C void CFCPlugInEngine::SetSessionPortL( CFCSession& aFCSession, + TUint32 aNewPort ) + { + TInt ind = iFCSessions.Find( &aFCSession ); + User::LeaveIfError( ind ); + iFCSessions[ ind ]->SetPort( aNewPort ); + } + +// ---------------------------------------------------------------------------- +// CFCPlugInEngine::UpdateSession +// Modifies local parameters of FC to offer document +// ---------------------------------------------------------------------------- +// +EXPORT_C void CFCPlugInEngine::UpdateSessionL( CFCSession& aFCSession, + TUint32 aNewPort ) + { + TInt ind = iFCSessions.Find( &aFCSession ); + User::LeaveIfError( ind ); + iFCSessions[ ind ]->Update( aNewPort ); + } + +// ---------------------------------------------------------------------------- +// CFCPlugInEngine::UpdateAnswerL +// Modifies local parameters of FC to anser document +// ---------------------------------------------------------------------------- +// +EXPORT_C void CFCPlugInEngine::UpdateAnswerL( const CFCSession& aSession, + CSdpDocument& aSdpDocument ) + { + // Updating the remote port and address using the original + // port and own address into the SDP doc + TInt ind = iFCSessions.Find( &aSession ); + User::LeaveIfError( ind ); + iFCSessions[ ind ]->UpdateSDPL( aSdpDocument ); + } + +// ---------------------------------------------------------------------------- +// CFCPlugInEngine::PeekDocumentL +// Reads remote parameters of FC from offer/answer document. +// ---------------------------------------------------------------------------- +// +EXPORT_C void CFCPlugInEngine::PeekDocumentL( + const CFCSession& aSession, + const CSdpDocument& aSdpDocument ) + { + //Store the value inside of the SDP remote address and port value + TInt ind = iFCSessions.Find( &aSession ); + User::LeaveIfError( ind ); + iFCSessions[ ind ]->StoreInfoL(aSdpDocument); + } + +// ---------------------------------------------------------------------------- +// CFCPlugInEngine::StartConnectionL +// ---------------------------------------------------------------------------- +// +EXPORT_C void CFCPlugInEngine::StartConnectionL( const CFCSession& aSession ) + { + TInt ind = iFCSessions.Find( &aSession ); + User::LeaveIfError( ind ); + iFCSessions[ ind ]->ConnectionReadyL(); + } + +// ---------------------------------------------------------------------------- +// CFCPlugInEngine::SendToNetL +// ---------------------------------------------------------------------------- +// +EXPORT_C void CFCPlugInEngine::SendToNetL( const CFCSession& aSession, + HBufC8* aData) + { + TInt ind = iFCSessions.Find( &aSession ); + User::LeaveIfError( ind ); + iFCSessions[ ind ]->SendToNetL(aData); + } + +// ---------------------------------------------------------------------------- +// CFCPlugInEngine::IsReceiverL +// ---------------------------------------------------------------------------- +// +EXPORT_C TBool CFCPlugInEngine::IsReceiverL( const CFCSession& aSession ) + { + TInt ind = iFCSessions.Find( &aSession ); + User::LeaveIfError( ind ); + return iFCSessions[ ind ]->IsReceiver(); + } + +// ---------------------------------------------------------------------------- +// CFCPlugInEngine:: UpdateNeeded +// ---------------------------------------------------------------------------- +// +EXPORT_C TBool CFCPlugInEngine::UpdateNeededL( const CFCSession& aSession ) + { + TInt ind = iFCSessions.Find( &aSession ); + User::LeaveIfError( ind ); + return iFCSessions[ ind ]->UpdateNeeded(); + } + +// ---------------------------------------------------------------------------- +// CFCPlugInEngine::ReceivedData +// ---------------------------------------------------------------------------- +// +void CFCPlugInEngine::ReceivedData( HBufC8* aData, MFCPlugIn* aPlugIn ) + { + CFCSession* fcSession = FindFCSession( aPlugIn ); + if ( fcSession ) + { + iFCObserver.FCReceivedData( aData, fcSession ); + } + } + +// ---------------------------------------------------------------------------- +// CFCPlugInEngine:: ReceivedData +// ---------------------------------------------------------------------------- +// +void CFCPlugInEngine::ErrorNotify( TInt aErrCode, MFCPlugIn* aPlugIn ) + { + CFCSession* fcSession = FindFCSession( aPlugIn ); + if ( fcSession ) + { + iFCObserver.FCErrorNotify( aErrCode, fcSession ); + } + } + +// ---------------------------------------------------------------------------- +// CFCPlugInEngine::ListMechanismImplementationsL +// ---------------------------------------------------------------------------- +// +void CFCPlugInEngine::ListMechanismImplementationsL() + { + // List implementations in ECom registry for our launcher interface + RImplInfoPtrArray infoArray; + CleanupStack::PushL( TCleanupItem( ArrayCleanup, &infoArray ) ); + REComSession::ListImplementationsL( KCFCInterfaceUid, + infoArray ); + + // Go trough the ECom entries and parse them into TFCPlugInInfo objects + for( TInt i = 0; i < infoArray.Count(); i++ ) + { + CFCPlugInInfo* plugin = + CFCPlugInInfo::NewL( infoArray[i]->ImplementationUid(), + infoArray[i]->DataType() ); + CleanupStack::PushL( plugin ); + //add to the Plugin Iter + User::LeaveIfError( iFCPlugIns.Append( plugin ) ); + CleanupStack::Pop( plugin ); + + } + + CleanupStack::PopAndDestroy(&infoArray); //TCleanupItem + } + +// ----------------------------------------------------------------------------- +// CFCPlugInEngine::ArrayCleanup +// ----------------------------------------------------------------------------- +// +void CFCPlugInEngine::ArrayCleanup(TAny* aArray) + { + RImplInfoPtrArray* array = reinterpret_cast(aArray); + if (array) + { + array->ResetAndDestroy(); + } + } + + +// ----------------------------------------------------------------------------- +// CFCPlugInEngine::FindFCSession +// ----------------------------------------------------------------------------- +// +CFCSession* CFCPlugInEngine::FindFCSession( MFCPlugIn* aPlugIn ) + { + CFCSession* fcSession = NULL; + TBool found = EFalse; + for ( TInt ind = 0; !found && ind < iFCSessions.Count(); ind++ ) + { + fcSession = iFCSessions[ ind ]; + if ( aPlugIn == fcSession->PlugIn() ) + { + found = ETrue; + } + } + return fcSession; + } + + +// End of File