realtimenetprots/sipfw/ProfileAgent/PluginMgr/Src/Sipplugindirector.cpp
changeset 0 307788aac0a8
child 42 69df6ed78a6a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/realtimenetprots/sipfw/ProfileAgent/PluginMgr/Src/Sipplugindirector.cpp	Tue Feb 02 01:03:15 2010 +0200
@@ -0,0 +1,343 @@
+// Copyright (c) 2007-2009 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:
+// Name        : sipplugindirector
+// Part of     : sip agent server
+// implementation
+// Version     : 1.0
+//
+
+
+
+
+// INCLUDE FILES
+#include	"sipplugindirector.h"
+#include	"sipprofileagent.h"
+#include	"sipprofileagentinitparams.h"
+#include	"SipProfileLog.h"
+#include 	<sipprofileagentextensionparams.h>
+
+const TInt KPluginMicroSecInSec = 1;
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CSIPPluginDirector::CSIPPluginDirector
+// C++ default constructor can NOT contain any code, that
+// might leave.
+// -----------------------------------------------------------------------------
+//
+CSIPPluginDirector::CSIPPluginDirector(MSIPProfileAgentObserver& aObserver) 
+ : iProfileAgentObserver(aObserver),
+   iDeltaTimerCallBack(CleanupTimerExpired, this)
+    {
+    TUid KSIPProfileServerUid = {0x0};
+	iServerId = KSIPProfileServerUid;
+	iDeltaTimerEntry.Set(iDeltaTimerCallBack);
+    }
+
+// -----------------------------------------------------------------------------
+// CSIPPluginDirector::ConstructL
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+void CSIPPluginDirector::ConstructL()
+    {
+    iDeltaTimer = CDeltaTimer::NewL(CActive::EPriorityStandard);
+    iConfigExtension = CSipProfileAgentConfigExtension::NewL();
+    }
+
+// -----------------------------------------------------------------------------
+// CSIPPluginDirector::NewLC
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+CSIPPluginDirector* CSIPPluginDirector::NewLC(
+	MSIPProfileAgentObserver& aObserver)
+    {
+    CSIPPluginDirector* self = new(ELeave)CSIPPluginDirector(aObserver);
+    CleanupStack::PushL(self);
+    self->ConstructL();
+    return self;
+    }
+
+// -----------------------------------------------------------------------------
+// CSIPPluginDirector::NewL
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+CSIPPluginDirector* CSIPPluginDirector::NewL(
+	MSIPProfileAgentObserver& aObserver)
+    {
+    CSIPPluginDirector* self = CSIPPluginDirector::NewLC(aObserver);
+    CleanupStack::Pop(self);
+    return self;
+    }
+ 
+// -----------------------------------------------------------------------------
+// CSIPPluginDirector::~CSIPPluginDirector
+// -----------------------------------------------------------------------------
+//
+CSIPPluginDirector::~CSIPPluginDirector()
+    {
+	iSIPProfileAgents.ResetAndDestroy();
+	delete iDeltaTimer;
+	delete iConfigExtension;
+	REComSession::FinalClose();
+    }
+
+// -----------------------------------------------------------------------------
+// CSIPPluginDirector::FindImplementation 
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+CSIPProfileAgent* CSIPPluginDirector::FindImplementation(
+	const TSIPProfileTypeInfo& aType)
+	{
+	PROFILE_DEBUG6("CSIPPluginDirector::FindImplementation", 
+		aType.iSIPProfileName)
+	for (TInt i=0; i < iSIPProfileAgents.Count(); i++)
+		{
+		if (iSIPProfileAgents[i]->Type().iSIPProfileName == 
+			aType.iSIPProfileName && 
+			iSIPProfileAgents[i]->Type().iSIPProfileClass == 
+			aType.iSIPProfileClass)
+			{
+			return iSIPProfileAgents[i];
+			}
+			
+		}
+	PROFILE_DEBUG2("CSIPPluginDirector::FindImplementation", "Not found!")
+	return NULL;
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPPluginDirector::CreateImplementationL
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+CSIPProfileAgent& CSIPPluginDirector::CreateImplementationL(
+	const TSIPProfileTypeInfo& aType)
+	{
+	PROFILE_DEBUG6("CSIPPluginDirector::CreateImplementationL", 
+		aType.iSIPProfileName)
+	TSIPProfileAgentInitParams initParams(*iDeltaTimer,
+			iProfileAgentObserver);
+	TBuf8<30> plugin;
+	plugin.Format(_L8("%u_"), aType.iSIPProfileClass);
+	plugin.Append(aType.iSIPProfileName);
+
+	CSIPProfileAgent* sipProfileAgent = 
+	    CSIPProfileAgent::NewL(plugin,initParams);
+	CleanupStack::PushL( sipProfileAgent);
+	sipProfileAgent->Extension(KSipProfileAgentConfigExtension,
+			iConfigExtension);
+	User::LeaveIfError(iSIPProfileAgents.Append(sipProfileAgent));
+	CleanupStack::Pop(sipProfileAgent);
+	return *sipProfileAgent;
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPPluginDirector::ProvideImplementationL
+// provides correct implementation
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+CSIPProfileAgent& CSIPPluginDirector::ProvideImplementationL(
+	const TSIPProfileTypeInfo& aType)
+	{
+	PROFILE_DEBUG6("CSIPPluginDirector::ProvideImplementationL", aType.iSIPProfileName)
+
+	CSIPProfileAgent* implementation = FindImplementation(aType);
+	if (implementation)
+		return *implementation;
+	else
+		return CreateImplementationL(aType);
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPPluginDirector::DeltaTimer
+// returns iDeltaTimer as reference
+// -----------------------------------------------------------------------------
+//
+CDeltaTimer& CSIPPluginDirector::DeltaTimer()
+	{
+	return *iDeltaTimer;
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPPluginDirector::RegisterL
+// registers profile
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CSIPPluginDirector::RegisterL(
+	CSIPConcreteProfile& aSIPProfile)
+	{
+	PROFILE_DEBUG3("CSIPPluginDirector::RegisterL", aSIPProfile.Id())
+	ProvideImplementationL(aSIPProfile.ProfileType()).RegisterL(aSIPProfile);
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPPluginDirector::DeregisterL
+// deregisters profile
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CSIPPluginDirector::DeregisterL(
+	CSIPConcreteProfile& aSIPProfile)
+	{
+	PROFILE_DEBUG3("CSIPPluginDirector::DeregisterL", aSIPProfile.Id())
+	CSIPProfileAgent* profileagent = FindImplementation(aSIPProfile.ProfileType());
+	
+	__ASSERT_ALWAYS (profileagent, User::Leave(KErrArgument));
+	profileagent->DeregisterL(aSIPProfile);
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPPluginDirector::UpdateRegistrationL
+// deregisters profile
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CSIPPluginDirector::UpdateRegistrationL(
+	CSIPConcreteProfile& aNewProfile,
+	CSIPConcreteProfile& aOldProfile)
+	{
+	PROFILE_DEBUG3("CSIPPluginDirector::UpdateRegistrationL", aNewProfile.Id())
+	__ASSERT_ALWAYS(aNewProfile.Id() == aOldProfile.Id(), 
+	                User::Leave(KErrArgument));
+	CSIPProfileAgent* profileagent = FindImplementation(aOldProfile.ProfileType());
+	__ASSERT_ALWAYS(profileagent, User::Leave(KErrArgument));
+	profileagent->UpdateL(aNewProfile, aOldProfile);
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPPluginDirector::ListImplementationsL
+// Lists all implementations
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CSIPPluginDirector::ListImplementationsL(
+	RImplInfoPtrArray& aImplementations)
+	{
+	PROFILE_DEBUG1("CSIPPluginDirector::ListImplementationsL")
+	CSIPProfileAgent::ListAllImplementationsL(aImplementations);
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPPluginDirector::IsRegisterPending
+// -----------------------------------------------------------------------------
+//
+TBool CSIPPluginDirector::IsRegisterPending(CSIPConcreteProfile& aSIPProfile)
+	{
+	PROFILE_DEBUG3("CSIPPluginDirector::IsRegisterPending", aSIPProfile.Id())
+	CSIPProfileAgent* implementation = 
+	    FindImplementation(aSIPProfile.ProfileType());
+	if (implementation)
+		{
+        return implementation->RegisterPending(aSIPProfile);
+		}
+	return EFalse;
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPPluginDirector::State
+// -----------------------------------------------------------------------------
+//
+TInt CSIPPluginDirector::State(CSIPConcreteProfile::TStatus& aStatus,
+							   CSIPConcreteProfile& aSIPProfile)
+	{
+	TInt err(KErrNotFound);
+	aStatus = CSIPConcreteProfile::EUnregistered;
+	CSIPProfileAgent* implementation =
+	    FindImplementation(aSIPProfile.ProfileType());
+	if (implementation)
+		{
+		err = implementation->GetProfileState(aStatus, aSIPProfile);
+		}
+	return err;
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPPluginDirector::TerminateHandling
+// -----------------------------------------------------------------------------
+//
+TInt CSIPPluginDirector::TerminateHandling(CSIPConcreteProfile& aSIPProfile)
+	{
+	CSIPProfileAgent* implementation = 
+	    FindImplementation(aSIPProfile.ProfileType());
+	if (implementation)
+		{
+		return implementation->TerminateHandling(aSIPProfile);
+		}
+	return KErrNotFound;
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPPluginDirector::Cleanup
+// initiate cleanup; idle agent will be deleted
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CSIPPluginDirector::Cleanup()
+	{
+	CSIPProfileAgent* agent;
+
+	for (TInt i=iSIPProfileAgents.Count()-1; i >= 0; i-- )
+		{
+		agent = iSIPProfileAgents[i];
+		if ( agent->IsIdle() )
+			{
+			iSIPProfileAgents.Remove(i);
+			delete agent;
+			agent = 0;
+			}//if
+
+		}//for
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPPluginDirector::StartTimerForCleanup
+// -----------------------------------------------------------------------------
+//
+void CSIPPluginDirector::StartTimerForCleanup ()
+	{
+	PROFILE_DEBUG1("CSIPPluginDirector::StartTimerForCleanup")
+	iDeltaTimer->Remove(iDeltaTimerEntry);
+	TTimeIntervalMicroSeconds32 interval(KPluginMicroSecInSec);
+	iDeltaTimer->Queue(interval, iDeltaTimerEntry);
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPPluginDirector::CleanupTimerExpired
+// -----------------------------------------------------------------------------
+//
+TInt CSIPPluginDirector::CleanupTimerExpired(TAny* aPtr)
+	{
+	PROFILE_DEBUG1("CSIPPluginDirector::CleanupTimerExpired")
+	CSIPPluginDirector* self = reinterpret_cast<CSIPPluginDirector*>(aPtr);
+  	self->Cleanup();
+  	return ETrue;
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPPluginDirector::CreateProfileL
+// -----------------------------------------------------------------------------
+//
+CSIPConcreteProfile* CSIPPluginDirector::CreateProfileL (
+	const TSIPProfileTypeInfo& aType)
+	{
+	PROFILE_DEBUG1("CSIPPluginDirector::CreateProfileL")
+	return ProvideImplementationL(aType).CreateL();
+	}