linklayercontrol/networkinterfacemgr/agentprcore/src/tunnelagentcprstates.cpp
changeset 0 af10295192d8
child 14 23b59305592d
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/linklayercontrol/networkinterfacemgr/agentprcore/src/tunnelagentcprstates.cpp	Tue Jan 26 15:23:49 2010 +0200
@@ -0,0 +1,111 @@
+// Copyright (c) 2008-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:
+//
+
+/**
+ @file
+ @internalTechnology
+ @prototype
+*/
+
+
+#include <comms-infras/ss_log.h>
+
+#include <ss_glob.h>
+#include <commsdattypesv1_1.h>
+#include <metadatabase.h>
+
+#include "tunnelagentcpr.h"
+#include "tunnelagentcprstates.h"
+#include "agentmessages.h"
+#include <comms-infras/ss_tiermanagerutils.h>
+
+#include <comms-infras/ss_connprov.h>
+
+
+#ifdef _DEBUG
+// Panic category for "absolutely impossible!" vanilla ASSERT()-type panics from this module
+// (if it could happen through user error then you should give it an explicit, documented, category + code)
+_LIT(KSpecAssert_NifManAgtPrCtnlg, "NifManAgtPrCtnlg");
+#endif
+
+//#ifdef __CFLOG_ACTIVE
+//#define KTunnelAgentCprTag KESockConnectionTag
+//_LIT8(KTunnelAgentCprSubTag, "tunnelagentcprstates");
+//#endif
+
+_LIT (KTunnelAgentCPRPanic,"TunnelAgentCPRPanic");
+
+using namespace TunnelAgentCprStates;
+using namespace ESock;
+using namespace Messages;
+
+
+
+EXPORT_DEFINE_SMELEMENT(TJoinRealIAP, NetStateMachine::MStateTransition, TunnelAgentCprStates::TContext)
+EXPORT_C void TJoinRealIAP::DoL()
+	{
+    //__CFLOG_VAR((KTunnelAgentCprTag, KTunnelAgentCprSubTag, _L8("TBindToRealIAP::DoL()")));
+    __ASSERT_DEBUG(iContext.iNodeActivity, User::Panic(KSpecAssert_NifManAgtPrCtnlg, 1));
+
+	// 1) Get the realIAPId
+	TUint32 realIapId, myIapId,snaprecid,snapid=0;
+
+	MQueryConnSettingsApiExt* queryItf;
+	iContext.Node().ReturnInterfacePtrL(queryItf);
+
+	CommsDat::TMDBElementId elementId = (KCDTIdRealIAP);
+	TInt err = queryItf->GetInt(elementId, realIapId, NULL);
+	if (err == KErrNotFound) 
+	        realIapId = 0;
+	
+        CommsDat::TMDBElementId elementId2 = (KCDTIdVPNSNAPRecord);
+	TInt err2 = queryItf->GetInt(elementId2, snaprecid,NULL);
+	if(err2 == KErrNone)
+	    {
+	    CMDBSession* dbs = CMDBSession::NewLC(KCDVersion1_2);
+	    snapid = TierManagerUtils::ConvertSNAPPrefToTagIdL(snaprecid,*dbs);
+	    CleanupStack::PopAndDestroy(dbs);
+	    }
+
+	// compare it with MY IAP id, make sure they are different
+	CommsDat::TMDBElementId myElementId = (KCDTIdIAPRecord | KCDTIdRecordTag);
+	err = queryItf->GetInt(myElementId, myIapId, NULL);
+	if(myIapId == realIapId)
+		{
+		_LIT(KPanicNoTunnelService, "No Tunnel Service");
+		User::Panic(KPanicNoTunnelService, ETunnelAgentCprNoTunnelService);
+		}
+
+	// 2) Bind to the real AP
+	TUint apid = realIapId ? realIapId : snapid;
+	XConnectionProviderInfoQuery query(apid);
+	
+	CConnectionFactoryContainer* connectionFactories = SockManGlobals::Get()->iConnectionFactories;
+	__ASSERT_DEBUG(connectionFactories, User::Panic(KSpecAssert_NifManAgtPrCtnlg, 2));
+
+	CConnectionProviderBase* provider = static_cast<CConnectionProviderBase*>(connectionFactories->Find(query));
+	
+	TNodeId realIapNodeId = provider->Id();
+
+	TNodeId thisNodeId = iContext.Node().NodeId();
+	
+	RNodeInterface* sp = iContext.Node().AddClientL(realIapNodeId, TClientType(TCFClientType::EServProvider));
+	__ASSERT_DEBUG(sp != NULL, User::Panic(KTunnelAgentCPRPanic, ETunnelAgentCprNoServiceProvider));
+ 	iContext.iNodeActivity->PostRequestTo(
+ 			realIapNodeId, 
+ 			TCFServiceProvider::TJoinRequest(iContext.NodeId(), TClientType(TCFClientType::ECtrl)).CRef()
+ 			);
+	}
+