diff -r 000000000000 -r c40eb8fe8501 wlan_bearer/wlanengine/wlan_symbian/wlanengine_symbian_3.1/src/wlangenericplugin.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/wlan_bearer/wlanengine/wlan_symbian/wlanengine_symbian_3.1/src/wlangenericplugin.cpp Tue Feb 02 02:03:13 2010 +0200 @@ -0,0 +1,211 @@ +/* +* Copyright (c) 2008-2008 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "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: Class for instantiating Generic WLAN Plugins +* +*/ + + +#include +#include "wlangenericplugin.h" +#include "am_debug.h" + + +// ----------------------------------------------------------------------------- +// CGenericWlanPlugin::CGenericWlanPlugin +// +// ----------------------------------------------------------------------------- +// +CGenericWlanPlugin::CGenericWlanPlugin() + { + DEBUG("CGenericWlanPlugin::CGenericWlanPlugin"); + iPluginArray.Reset(); + } + +// ----------------------------------------------------------------------------- +// CGenericWlanPlugin::~CGenericWlanPlugin +// +// ----------------------------------------------------------------------------- +// +CGenericWlanPlugin::~CGenericWlanPlugin() + { + DEBUG("CGenericWlanPlugin::~CGenericWlanPlugin"); + StopPlugins(); + iPluginArray.Close(); + } + +// ----------------------------------------------------------------------------- +// CGenericWlanPlugin::StopPlugins +// +// ----------------------------------------------------------------------------- +// +void CGenericWlanPlugin::StopPlugins() + { + DEBUG("CGenericWlanPlugin::StopPlugins"); + for (TInt i = 0; i < iPluginArray.Count(); ++i) + { + if ( iPluginArray[i].iActiveScheduler ) + { + DEBUG3("CGenericWlanPlugin::StopPlugins - iPluginArray[%d] = UID: 0x%08X, ActiveScheduler 0x%08X", + i, + iPluginArray[i].iUid, + iPluginArray[i].iActiveScheduler ); + iPluginArray[i].iActiveScheduler->Halt( KErrNone ); + } + } + iPluginArray.Reset(); + } + +// ----------------------------------------------------------------------------- +// CGenericWlanPlugin::StartPlugins +// +// ----------------------------------------------------------------------------- +// +void CGenericWlanPlugin::StartPlugins() + { + DEBUG("CGenericWlanPlugin::StartPlugins"); + + // List implementations + RImplInfoPtrArray implInfoArray; + + TRAPD( listImplementationsError, CGenericWlanPluginClient::ListImplementationsL( implInfoArray ) ); + if ( listImplementationsError ) + { + DEBUG1("CGenericWlanPlugin::StartPlugins - CGenericWlanPluginClient::ListImplementationsL() failed with error %i", listImplementationsError ); + implInfoArray.ResetAndDestroy(); + return; + } + + // Get number of implementations + const TInt pluginCount( implInfoArray.Count() ); + + // Loop implementation info and create instances + for (TInt i = 0; i < pluginCount; i++) + { + // Get next implementation info + CImplementationInformation* info = static_cast(implInfoArray[i] ); + +#ifdef _DEBUG + // Trace information about plugin + DEBUG1( "CGenericWlanPlugin::StartPlugins - Generic WLAN Plugin # %i", i ); + DEBUG1( "CGenericWlanPlugin::StartPlugins - ImplementationUid 0x%08X", info->ImplementationUid().iUid ); + TBuf8 buf8; + buf8.Copy( info->DisplayName() ); + DEBUG1S("CGenericWlanPlugin::StartPlugins - DisplayName ", buf8.Length(), buf8.Ptr() ); + DEBUG1( "CGenericWlanPlugin::StartPlugins - Version %i", info->Version() ); + DEBUG1S("CGenericWlanPlugin::StartPlugins - DataType ", info->DataType().Length(), info->DataType().Ptr() ); + DEBUG1S("CGenericWlanPlugin::StartPlugins - OpaqueData ", info->OpaqueData().Length(), info->OpaqueData().Ptr() ); + DEBUG1( "CGenericWlanPlugin::StartPlugins - RomOnly %i", info->RomOnly() ); + DEBUG1( "CGenericWlanPlugin::StartPlugins - RomBased %i", info->RomBased() ); + DEBUG1( "CGenericWlanPlugin::StartPlugins - VendorId 0x%08X", info->VendorId().iId ); +#endif + CGenericWlanPlugin::TPluginArrayEntry entry; + entry.iUid = info->ImplementationUid(); + // Active scheduler will be updated when thread is started and Active Scheduler is created. + entry.iActiveScheduler = NULL; + iPluginArray.Append( entry ); + + RThread thread; + TInt err = thread.Create( info->DisplayName(), GenericWlanPluginThreadMain, KDefaultStackSize, KMinHeapSize, KMaxHeapSize, + reinterpret_cast( &iPluginArray[ iPluginArray.Count()-1 ] ) /*EOwnerProcess / EOwnerThread*/ ); + if (err != KErrNone) + { + DEBUG1("CGenericWlanPlugin::StartPlugins - thread.Create() failed with error %i", err ); + implInfoArray.ResetAndDestroy(); + return; + } + else + { + thread.Resume(); + } + thread.Close(); + } + + // Reset and destroy implementations infos + implInfoArray.ResetAndDestroy(); + + DEBUG1("CGenericWlanPlugin::StartPlugins - Started plugin count %i", pluginCount ); + } + +// ----------------------------------------------------------------------------- +// CGenericWlanPlugin::GenericWlanPluginThreadMain +// +// ----------------------------------------------------------------------------- +// +TInt CGenericWlanPlugin::GenericWlanPluginThreadMain( TAny* aPluginArrayEntryPtr ) + { + DEBUG("CGenericWlanPlugin::GenericWlanPluginThreadMain()"); + + // Create cleanup stack + CTrapCleanup* cleanup = CTrapCleanup::New(); + if ( !cleanup ) + { + DEBUG("CGenericWlanPlugin::GenericWlanPluginThreadMain() - CTrapCleanup::New() failed. Stopping thread."); + User::Exit( KErrNoMemory ); + } + + __UHEAP_MARK; + + TRAPD(createError, LoadGenericWlanPluginL( reinterpret_cast( aPluginArrayEntryPtr ) ) ); + if ( createError ) + { + return createError; + } + + __UHEAP_MARKEND; + + delete cleanup; + return KErrNone; + } + +// ----------------------------------------------------------------------------- +// CGenericWlanPlugin::LoadGenericWlanPluginL +// +// ----------------------------------------------------------------------------- +// +void CGenericWlanPlugin::LoadGenericWlanPluginL( TPluginArrayEntry * aPluginArrayEntryPtr ) + { + CActiveScheduler* scheduler = new (ELeave) CActiveScheduler(); + CleanupStack::PushL(scheduler); + CActiveScheduler::Install(scheduler); + + aPluginArrayEntryPtr->iActiveScheduler = scheduler; + + // Initialize WLAN plugin + CGenericWlanPluginClient* wlanPluginClient( NULL ); + DEBUG1( "Instantiating CGenericWlanPluginClient(UID 0x%08X)", aPluginArrayEntryPtr->iUid ); + TRAPD( ret, wlanPluginClient = CGenericWlanPluginClient::NewL( aPluginArrayEntryPtr->iUid ) ); + // Create new instance of the plugin + if( ret == KErrNone ) + { + DEBUG1("CGenericWlanPlugin::LoadGenericWlanPluginL() - wlanPluginClient instance 0x%08X", wlanPluginClient); + /* + * This thread will run in CActiveScheduler::Start() until CActiveScheduler is stopped. + */ + DEBUG("CGenericWlanPlugin::LoadGenericWlanPluginL() - Starting CActiveScheduler"); + CActiveScheduler::Start(); + + DEBUG("CGenericWlanPlugin::LoadGenericWlanPluginL() - deleting wlanPluginClient"); + delete wlanPluginClient; + } + else + { + DEBUG1( "CGenericWlanPlugin::LoadGenericWlanPluginL - CGenericWlanPluginClient::NewL leaved with %d, let's ignore it.", ret ); + } + + // Delete active scheduler + CleanupStack::PopAndDestroy(scheduler); + + DEBUG("CGenericWlanPlugin::LoadGenericWlanPluginL() - exit"); + User::Exit( KErrNone ); + }