sipproviderplugins/sipprovider/sipconnectionplugins/src/sipmcpr.cpp
changeset 0 307788aac0a8
child 4 dd3853b8dc3f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sipproviderplugins/sipprovider/sipconnectionplugins/src/sipmcpr.cpp	Tue Feb 02 01:03:15 2010 +0200
@@ -0,0 +1,167 @@
+// 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:
+// NETMCPR.CPP
+// This is part of an ECOM plug-in
+// SIP Meta Conneciton Provider class definition
+// 
+//
+
+/**
+ @file
+ @internalComponent
+*/
+
+#include "sipmcpr.h"
+#include <comms-infras/ss_nodemessages_selector.h>
+#include <comms-infras/ss_corepractivities.h>
+#include <elements/mm_states.h>
+
+#ifdef __CFLOG_ACTIVE
+#define KSipMCprTag KESockMetaConnectionTag
+_LIT8(KSipMCprSubTag, "sipmcpr");
+#endif
+
+using namespace ESock;
+using namespace NetStateMachine;
+using namespace Messages;
+using namespace MeshMachine;
+using namespace MCprActivities;
+using namespace PRActivities;
+using namespace CoreActivities;
+
+
+/*
+The problem is that we have a single dummy access point for sip.
+If I open 2 connection , ie 2 mcprs, the access point config is still shared.
+This becomes a problem because the the tierMgr instances set in the provision message
+will be of the same type.
+*/
+namespace SipMCprStates
+{
+DEFINE_SMELEMENT(TSendProvision, NetStateMachine::MStateTransition, SipMCprStates::TContext)
+void SipMCprStates::TSendProvision::DoL()
+	{	
+	PRStates::TSendProvision  mcprSendProvision(iContext);
+	mcprSendProvision.DoL();
+	}
+}
+
+// Default activity is overriden here. SIP MCPR needs to extend the access point config
+// with SIP MCPR provision info(Appuid, ProfileID and TransitionEngine Mgr).  This extended
+// Provision info will be sent in provision messages SendProvision::DoL()
+namespace SipMCprBinderRequestActivity
+{
+DECLARE_DEFINE_CUSTOM_NODEACTIVITY(ECFActivityBinderRequest, SipMCprBinderRequest, TCFServiceProvider::TCommsBinderRequest, CCommsBinderActivity::NewL)
+	FIRST_NODEACTIVITY_ENTRY(CoreNetStates::TAwaitingBinderRequest, CCommsBinderActivity::TNoTagOrUseExistingBlockedByBinderRequest)
+	NODEACTIVITY_ENTRY(KNoTag, PRStates::TCreateDataClient, CoreNetStates::TAwaitingDataClientJoin, MeshMachine::TNoTag)	
+
+	THROUGH_NODEACTIVITY_ENTRY(KNoTag, SipMCprStates::TProcessCprCreation, MeshMachine::TTag<CoreStates::KUseExisting>)		
+	NODEACTIVITY_ENTRY(CoreStates::KUseExisting, PRActivities::CCommsBinderActivity::TSendBinderResponse, PRActivities::CCommsBinderActivity::TAwaitingBindToComplete, MeshMachine::TNoTagOrErrorTag)
+	LAST_NODEACTIVITY_ENTRY(KNoTag, MeshMachine::TDoNothing)
+	LAST_NODEACTIVITY_ENTRY(KErrorTag, MeshMachine::TClearError)
+NODEACTIVITY_END()
+}
+
+// For the SIP there is no below layer. Send Select complete when this msg is received
+namespace SipMCprSelectNextLayerActivity
+{
+DECLARE_DEFINE_NODEACTIVITY(ECFActivitySelect, SipMCprSelectNextLayer, TCFSelector::TSimpleSelect)
+FIRST_NODEACTIVITY_ENTRY(MCprStates::TAwaitingSelectNextLayer, MeshMachine::TNoTag)
+LAST_NODEACTIVITY_ENTRY(KNoTag, MCprStates::TSendFinalSelectComplete)
+NODEACTIVITY_END()
+}
+
+namespace SipMcpr
+{
+DEFINE_EXPORT_ACTIVITY_MAP(SipMcprActivities)
+   ACTIVITY_MAP_ENTRY(SipMCprBinderRequestActivity, SipMCprBinderRequest)
+   ACTIVITY_MAP_ENTRY(SipMCprSelectNextLayerActivity,SipMCprSelectNextLayer)
+   ACTIVITY_MAP_END_BASE(PRActivities, coreActivitiesMCpr)   
+}
+
+//
+//CSipMetaConnectionProvider
+CSipMetaConnectionProvider* CSipMetaConnectionProvider::NewL(CMetaConnectionProviderFactoryBase& aFactory, const TProviderInfo& aProviderInfo)
+	{
+	__CFLOG_VAR((KSipMCprTag, KSipMCprSubTag, _L8("CSipMetaConnectionProvider:\tNewL()")));
+	CSipMetaConnectionProvider* self = new (ELeave) CSipMetaConnectionProvider(aFactory,aProviderInfo,SipMcpr::SipMcprActivities::Self());
+	CleanupStack::PushL(self);
+	self->ConstructL(aProviderInfo);
+	CleanupStack::Pop(self);	
+	return self;
+	}
+
+CSipMetaConnectionProvider::CSipMetaConnectionProvider(CMetaConnectionProviderFactoryBase& aFactory, const TProviderInfo& aProviderInfo, const MeshMachine::TNodeActivityMap& aActivityMap)
+:	CCoreMetaConnectionProvider(aFactory,aProviderInfo,aActivityMap)
+
+	{
+	LOG_NODE_CREATE(KSipMCprTag, CSipMetaConnectionProvider);
+	}
+
+CSipMetaConnectionProvider::~CSipMetaConnectionProvider()
+	{
+	LOG_NODE_DESTROY(KSipMCprTag, CSipMetaConnectionProvider);
+	}
+
+void CSipMetaConnectionProvider::ReceivedL(const TRuntimeCtxId& aSender, const TNodeId& aRecipient, TSignatureBase& aMessage)
+    {
+//@TODO log
+//	__CFLOG_VAR((KSipMCprTag, KSipMCprSubTag, _L8("CSipMetaConnectionProvider %08x:\tReceivedL() aCFMessage=%d"),
+//	   this, aCFMessage.MessageId().MessageId()));
+	TNodeContext<CSipMetaConnectionProvider> ctx(*this, aMessage, aSender, aRecipient);
+    CCoreMetaConnectionProvider::Received(ctx);
+    User::LeaveIfError(ctx.iReturn);
+	}
+
+
+void CSipMetaConnectionProvider::ConstructL(const ESock::TProviderInfo& aProviderInfo)
+{
+	CMetaConnectionProviderBase::ConstructL(); //This initialises the AccessPointInfo
+	
+	// Set the SIP Provision info
+	if (aProviderInfo.Instance()!= NULL)
+	{
+	TSipMcprProvisionInfo* sipext = reinterpret_cast<TSipMcprProvisionInfo *>(aProviderInfo.Instance());
+	SetAppUid(sipext->iAppUid);
+	SetProfileId(sipext->iProfileId);
+	SetTransitionEngineManager(sipext->iTransitionEngineMgr);
+	}
+    
+  	//For construction of IpProto providers (construction only) we use the instance field of TProviderInfo
+   	//to carry the IAP id. The IAP id is necessary for the initialisation if IpProto specific data.
+    //TInt iap = (TInt)ProviderInfo().Instance(); // instance is set to null and hence the iap also will be null
+    TInt iap = (TInt)ProviderInfo().APId();    
+	SetProviderInfo(TProviderInfo(ProviderInfo().TierId(),iap));
+    SetConfigL();	
+}
+
+void CSipMetaConnectionProvider::SetConfigL()
+	{
+	TSipMcprProvisionInfo*	iProvisionInfo = new (ELeave) TSipMcprProvisionInfo();	
+	iProvisionInfo->iAppUid = iAppUid;
+	iProvisionInfo->iProfileId = iProfileId;		
+	iProvisionInfo->iTransitionEngineMgr = iTransitionEngineMgr;
+
+	// Append the above three to the accesspointconfig and send to CPR in ProvisionConfig message
+	
+	RMetaExtensionContainer mec;
+	mec.Open(AccessPointConfig());
+	CleanupClosePushL(mec);
+	CleanupStack::PushL(iProvisionInfo);
+	mec.AppendExtensionL(iProvisionInfo);
+	CleanupStack::Pop(iProvisionInfo);
+	AccessPointConfig().Close();
+	AccessPointConfig().Open(mec);
+	CleanupStack::PopAndDestroy(&mec);
+	}