diff -r 4096754ee773 -r 52a167391590 localconnectivityservice/locod/src/locodaemon.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/localconnectivityservice/locod/src/locodaemon.cpp Wed Sep 01 12:20:40 2010 +0100 @@ -0,0 +1,188 @@ +/* +* Copyright (c) 2006 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: Daemon class implementation. +* +*/ + + +#include + +#include +#include +#include + +#include "locodaemon.h" +#include "locodserviceman.h" +#include "utils.h" +#include "debug.h" + +// ======== MEMBER FUNCTIONS ======== + +// --------------------------------------------------------------------------- +// NewLC +// --------------------------------------------------------------------------- +// +CLocoDaemon* CLocoDaemon::NewLC() + { + CLocoDaemon* self = new (ELeave) CLocoDaemon(); + CleanupStack::PushL(self); + self->ConstructL(); + return self; + } + +// --------------------------------------------------------------------------- +// C++ destrctor +// --------------------------------------------------------------------------- +// +CLocoDaemon::~CLocoDaemon() + { + FeatureManager::UnInitializeLib(); + Cancel(); + iSystemPS.Close(); + delete iServiceMan; + iBearers.ResetAndDestroy(); + iBearers.Close(); + REComSession::FinalClose(); + TRACE_FUNC + } + +// --------------------------------------------------------------------------- +// Called when the status of system pubsub keys are +// changed. Normally this is called after the system boot. +// --------------------------------------------------------------------------- +// +void CLocoDaemon::RunL() + { + TRACE_INFO((_L(" RunL %d"), iStatus.Int())) + if (iStatus == KErrNone) + { + iSystemPS.Subscribe(iStatus); + SetActive(); + + TRACE_INFO((_L(" [SYSTEM] prev %d"), iSystemState)) + LEAVE_IF_ERROR(iSystemPS.Get(iSystemState)); + TRACE_INFO((_L(" [SYSTEM] now %d"), iSystemState)) + + if (iSystemState == ESwStateNormalRfOn || + iSystemState == ESwStateNormalRfOff || + iSystemState == ESwStateCharging || + iSystemState == ESwStateNormalBTSap) + { // System is up, construct service man and load bearers. + if(!iServiceMan) + { + iServiceMan = CLocodServiceMan::NewL(); + } + if (!iBearers.Count()) + { + LoadBearesL(); + } + } + /* + ESwStateShuttingDown and ESWStateShuttingDown event is received when + the device is about to shut down + */ + else if (iSystemState == ESwStateShuttingDown) + { + TRACE_INFO((_L(" [SYSTEM] Shuting down and deleting"))) + delete iServiceMan; + iServiceMan = NULL; + iBearers.ResetAndDestroy(); + return; + } + } + RProcess::Rendezvous(KErrNone); + } + +// --------------------------------------------------------------------------- +// CActive method cancel listening pubsub keys +// --------------------------------------------------------------------------- +// +void CLocoDaemon::DoCancel() + { + TRACE_FUNC + iSystemPS.Cancel(); + } + +// --------------------------------------------------------------------------- +// CActive method +// --------------------------------------------------------------------------- +// +TInt CLocoDaemon::RunError(TInt /*aReason*/) + { + TRACE_FUNC + return KErrNone; + } + +// --------------------------------------------------------------------------- +// C++ Constructor +// --------------------------------------------------------------------------- +// +CLocoDaemon::CLocoDaemon() : CActive(CActive::EPriorityStandard) + { + CActiveScheduler::Add(this); + TRACE_FUNC_THIS + } + +// --------------------------------------------------------------------------- +// 2nd phase construction +// --------------------------------------------------------------------------- +// +void CLocoDaemon::ConstructL() + { + FeatureManager::InitializeLibL(); + LEAVE_IF_ERROR(iSystemPS.Attach(KPSUidStartup, KPSGlobalSystemState)); + iStatus = KRequestPending; + SetActive(); + TRequestStatus* sta = &iStatus; + User::RequestComplete(sta, KErrNone); + TRACE_FUNC + } + +// --------------------------------------------------------------------------- +// LoadBearesL Loads the bearer plug ins +// --------------------------------------------------------------------------- +// +void CLocoDaemon::LoadBearesL() + { + TRACE_FUNC_ENTRY + TRACE_INFO((_L("Load interface 0x%08X"), KLOCODBEARERINTERFACEUID)) + const TUid KBearerPluginInterface = TUid::Uid(KLOCODBEARERINTERFACEUID); + RImplInfoPtrArray implementations; + const TEComResolverParams noResolverParams; + REComSession::ListImplementationsL(KBearerPluginInterface, + noResolverParams, + KRomOnlyResolverUid, + implementations); + CleanupResetDestroyClosePushL(implementations); + const TUint count = implementations.Count(); + TRACE_INFO((_L(" Bearer count = %d"), count)) + for ( TUint ii = 0 ; ii < count ; ++ii ) + { + CImplementationInformation* impl = implementations[ii]; + TRACE_INFO((_L("Bearer: feature %d, name '%S', ROM only %d"), + impl->ImplementationUid().iUid, &(impl->DisplayName()), impl->RomOnly())) + if (FeatureManager::FeatureSupported(impl->ImplementationUid().iUid)) + { + TRACE_INFO((_L("Feature found"))) + TLocodBearerPluginParams params(impl->ImplementationUid(), *iServiceMan); + CLocodBearerPlugin* bearer = CLocodBearerPlugin::NewL(params); + CleanupStack::PushL(bearer); + iBearers.AppendL(bearer); + CleanupStack::Pop(bearer); + } + } + CleanupStack::PopAndDestroy(&implementations); + TRACE_FUNC_EXIT + } +