multimediacommsengine/mmcefloorctrlengine/src/fcpluginengine.cpp
changeset 0 1bce908db942
--- /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<CSdpFmtAttributeField>& 
+	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<CSdpFmtAttributeField>* 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<RImplInfoPtrArray*>(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