--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/localconnectivityservice/locod/src/locodaemon.cpp Mon Jan 18 21:03:15 2010 +0200
@@ -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 <startupdomainpskeys.h>
+
+#include <featmgr.h>
+#include <locodplugin.hrh>
+#include <locodbearerplugin.h>
+
+#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
+ }
+