telephonyprotocols/rawipnif/src/RawIpAgentHandler.cpp
changeset 0 3553901f7fa8
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/telephonyprotocols/rawipnif/src/RawIpAgentHandler.cpp	Tue Feb 02 01:41:59 2010 +0200
@@ -0,0 +1,88 @@
+// Copyright (c) 2006-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:
+// RawIPMCPR.CPP
+// RawIP MCPR
+// 
+//
+
+/**
+ @file
+ @internalComponent
+*/
+
+#include <comms-infras/nifprvar.h>			// for TAgentToFlowEventType
+#include <comms-infras/linkprovision.h>
+#include "RawIpAgentHandler.h"
+
+using namespace ESock;
+
+void CRawIpAgentHandler::ConnectCompleteL()
+/**
+RawIp handler called on Agent ConnectComplete().
+
+Allocate and populate the provisioning structure.
+*/
+	{
+	// If not already poresent, allocate and append the provisioning structure.  Assumed to be
+	// cleaned up by CAccessPointConfig.
+
+	if (iProvision == NULL)
+		{
+		CRawIpAgentConfig* provision = new (ELeave) CRawIpAgentConfig();
+		CleanupStack::PushL(provision);
+		AppendExtensionL(provision);
+		CleanupStack::Pop(provision);			// ownership given to CAccessPointConfig
+	
+		iProvision = provision;					// cache pointer to provisioning structure (no ownership)
+		}
+	
+	// The following calls towards the Agent will trigger Notification() calls from Agent back
+	// towards us (in the same stack frame).  These will be processed in NotificationFromAgent().
+	NotificationToAgent(EFlowToAgentEventTsyConfig, NULL);
+	NotificationToAgent(EFlowToAgentEventTsyConnectionSpeed, NULL);
+	}
+	
+TInt CRawIpAgentHandler::NotificationFromAgent(TAgentToFlowEventType aEvent, TAny* aInfo)
+/**
+RawIp handler called on Agent Notification() calls towards CFProtocol.
+
+@param aEvent event type
+@param aInfo free form data associated with event
+*/
+	{
+	switch (aEvent)
+		{
+	case EAgentToFlowEventTsyConfig:
+		// NOTE:
+		// We are presuming that the object pointed to by "aInfo" is on the heap of the Agent and
+		// not on the stack.  This sounds risky, but we are following the same conditions as
+		// with old Nifs and Agents - the Notification() method was used to communicate a pointer
+		// from Agent to Nif of a structure whose lifetime was guaranteed longer than that of the
+		// Nif.  This hasn't changed with the introduction of CFProtocols.  Alternatively, we would
+		// have allocate space for and copy the (very large - several K) TContextConfigGPRS.
+		iProvision->iGprsConfig = reinterpret_cast<const TPacketDataConfigBase*>(aInfo);
+		break;
+		
+	case EAgentToFlowEventTsyConnectionSpeed:
+		if (aInfo != NULL)
+			iProvision->iConnectionSpeed = *reinterpret_cast<TUint*>(aInfo);
+		break;
+		
+	default:
+		// Default handling
+		return CAgentNotificationHandler::NotificationFromAgent(aEvent, aInfo);
+		}
+
+	return KErrNone;
+	}