linklayerprotocols/pppnif/te_ppp/src/DummyAgtRef.cpp
changeset 0 af10295192d8
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/linklayerprotocols/pppnif/te_ppp/src/DummyAgtRef.cpp	Tue Jan 26 15:23:49 2010 +0200
@@ -0,0 +1,449 @@
+// Copyright (c) 1997-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:
+// The objects of the class do all work to start & finish PPP session
+// 
+//
+
+#include "DummyAgtRef.h"
+#include "nifman.h"
+#include "cdbcols.h"
+#include "TestMgr.h"
+#include "dummyprotocol.h"
+#include "ss_pman.h"
+
+CDummyNifAgentRef::CDummyNifAgentRef(const TDesC& aName,CTestMgr& aTheMgr, CTestExecuteLogger& aLogger):iName(aName),iTheMgr(aTheMgr), iLogger(aLogger),
+	iState(EStopped) // When the AgentRef comes up, the NIF is disconnected.
+{
+}
+
+CDummyNifAgentRef::~CDummyNifAgentRef()
+{
+	delete ipDummyPrt;
+	DestroyIniReader();
+}
+
+CDummyNifAgentRef*
+CDummyNifAgentRef::NewL(const TDesC& aName,CTestMgr& aTheMgr, CTestExecuteLogger& aLogger)
+{
+
+	CDummyNifAgentRef* ref = new (ELeave) CDummyNifAgentRef(aName,aTheMgr, aLogger);
+	CleanupStack::PushL(TCleanupItem(CNifFactory::Cleanup, ref));
+	ref->ConstructL();
+	CleanupStack::Pop();
+	return ref;
+}
+
+
+void CDummyNifAgentRef::ConstructL()
+{
+	ipDummyPrt=CDummyProtocol::NewL();
+	CreateIniReader();
+}
+
+//this member's called when the PPP negotiation is over.
+void CDummyNifAgentRef::LinkLayerUp()
+{
+	LOG_INFO_PRINTF1(_L("DummyAgtRef::LinkLayerUp"));
+		
+	iTheMgr.Notify(CTestMgr::ETestFinished);
+	ServiceClosed();//cleanup
+}
+
+TInt CDummyNifAgentRef::Authenticate(TDes& /*aUsername*/, TDes& /*aPassword*/)
+{
+	//ask the test mgr for authentication information
+	return KErrNone;
+}
+//
+TInt CDummyNifAgentRef::Notification(TNifToAgentEventType /*aEvent*/, void* /*aInfo*/)
+{
+	//log them all ???
+	return KErrNone;
+}
+
+//
+//MNifIfNotify overrides -------------------------------------------------------
+//
+TInt CDummyNifAgentRef::DoReadInt(const TDesC&  aField, TUint32&  aValue,const RMessagePtr2* /*aMessage*/)
+{
+	TInt result = KErrNotFound;
+	if (ipIniFileReader !=0)
+	{
+		TInt value=0;
+		if (ipIniFileReader->FindVar(iData.KCommDbSectionName,aField,value))
+		{
+			aValue=(TInt32)value;
+			result=KErrNone;
+		}
+	}
+	//use hardcoded only if the ini file read or search failed
+	if (KErrNotFound==result)
+	{
+		result=KErrNone;
+
+		if (TPtrC(KCDTypeNameIfServerMode)==aField)
+			aValue=iData.KPppIsServerMode;
+		else if (TPtrC(iData.KModemCommRoleString)==aField)
+			aValue=iData.KPppCommRole;
+		else if (iData.KIapIdString==aField)
+			aValue=iData.KPppIapId;
+		else
+			result=KErrNotFound;
+	}
+	//
+	LOG_ERR_PRINTF4(_L("--------------- Config param used: %S = %d (err %d)"),&aField,aValue,result);
+	//
+	return result;
+}
+
+TInt CDummyNifAgentRef::DoReadDes(const TDesC& aField, TDes16& aValue,const RMessagePtr2* /*aMessage*/)
+{
+	TInt result = KErrNotFound;
+	if (ipIniFileReader !=0)
+	{
+		TPtrC value;
+		if (ipIniFileReader->FindVar(iData.KCommDbSectionName,aField,value))
+		{
+			aValue.Copy(value);
+			result=KErrNone;
+		}
+	}
+	//use hardcoded only if the ini file read or search failed
+	if (KErrNotFound==result)
+	{
+		result=KErrNone;
+		//
+		if (TPtrC(KCDTypeNameRecordName)==aField)
+			aValue=iData.KPppCommdbName;
+		else if (iData.KModemPortString==aField)
+			aValue=iData.KPppPortString;
+		else if (iData.KModemCsyString==aField)
+			aValue=iData.KPppCsyString;
+		else
+			result=KErrNotFound;
+	}
+	//
+	LOG_ERR_PRINTF4(_L("--------------- Config param used: %S = %S (err %d)"),&aField,&aValue,result);
+	//
+	return result;
+}
+
+TInt CDummyNifAgentRef::DoReadBool(const TDesC& aField, TBool& aValue,const RMessagePtr2* /*aMessage*/)
+{
+	TInt result = KErrNotFound; //optimistic approach
+	if (ipIniFileReader !=0)
+	{
+		TInt value=0;
+		if (ipIniFileReader->FindVar(iData.KCommDbSectionName,aField,value))
+		{
+			aValue=(value != 0);
+			result=KErrNone;
+		}
+	}
+	//use hardcoded only if the ini file read or search failed
+	if (KErrNotFound==result)
+	{
+		result=KErrNone;
+
+		if (TPtrC(KCDTypeNameEnableLcpExtensions) == aField)
+			aValue=iData.KPppIsLcpExtEnabled;
+		else if (TPtrC(KCDTypeNameEnableSwComp) == aField)
+			aValue=iData.KPppIsSwCompEnabled;
+		else if (TPtrC(KCDTypeNameIfCallbackEnabled) == aField)
+			aValue=iData.KPppIsCallbackEnabled;
+		else
+			result=KErrNotFound;
+	}
+	//
+	LOG_ERR_PRINTF4(_L("--------------- Config param used: %S = %d (err %d)"),&aField,(TInt)aValue,result);
+	//
+	return result;
+}
+//
+//MNifAgentNotify overrides -------------------------------------------------------
+//
+
+//Nasty classes to sneak into protected sections
+class CCheekyNifIfBase:public CNifIfBase
+{
+};
+
+class CCheekyNifIfFactory : public CNifIfFactory
+{
+public:
+	CNifIfBase*
+		CreateInterfaceL(const TDesC& aName, MNifIfNotify* aNotify){ return NewInterfaceL(aName, aNotify);}
+};
+
+void CDummyNifAgentRef::ServiceStartedL()
+{
+	LOG_INFO_PRINTF1(_L("DummyAgtRef::ServiceStartedL"));
+		
+	// load the required interface
+	TInt errCode=KErrNone;
+	//create the interface as nifman does. The code taken from NifMan (with custom error check)
+	TAutoClose<RLibrary> lib;
+	errCode=lib.iObj.Load(iData.KPppNifFileName);
+	if (errCode!=KErrNone)
+	{
+		LOG_ERR_PRINTF2(_L("Can't load tppp.nif (error=%d) -> Leaving"),errCode);
+		User::Leave(errCode);
+	}
+	lib.PushL();
+	// The Uid check
+#ifdef _UNICODE
+	TUid uid(TUid::Uid(KUidUnicodeNifmanInterface));
+#else
+	TUid uid(TUid::Uid(KUidNifmanInterface));
+#endif
+	if(lib.iObj.Type()[1]!=uid)
+	{
+		LOG_INFO_PRINTF1(_L("Wrong UID of ppp.nif -> Leaving"));
+		User::Leave(KErrCorrupt);
+	}
+	//get the entry point
+	typedef CNifFactory* (*TNifFactoryNewL)();
+	TNifFactoryNewL libEntry=(TNifFactoryNewL)lib.iObj.Lookup(1);//the factory function has ordinal ==1
+	if (libEntry==NULL)
+	{
+		LOG_INFO_PRINTF1(_L("No factory method in ppp.nif -> Leaving"));
+		User::Leave(KErrCorrupt);
+	}
+
+	CNifFactory* pFactory =(*libEntry)(); // Opens CObject
+	if (!pFactory)
+	{
+		LOG_INFO_PRINTF1(_L("Can't create factory in ppp.nif -> Leaving"));
+		User::Leave(KErrCorrupt);
+	}
+
+	CleanupStack::PushL(TCleanupItem(CNifFactory::Cleanup, pFactory));
+	CObjectCon* pContainer=CObjectCon::NewL();
+	CleanupStack::PushL(pContainer);
+	pFactory->InitL(lib.iObj, *pContainer); // Transfers the library object if successful
+	// Can pop the library now - auto close will have no effect because handle is null
+	CleanupStack::Pop();//pContainer
+	CleanupStack::Pop();//pFactory
+	lib.Pop();
+
+	CleanupStack::PushL(TCleanupItem(CNifFactory::Cleanup, pFactory));
+	TName name=_L("ppp");
+	//another dirty hack
+	CCheekyNifIfFactory* pFactoryExt=(CCheekyNifIfFactory*)pFactory;
+    iInterface = reinterpret_cast<CNifIfLink*>(pFactoryExt->CreateInterfaceL(name, this));
+    CleanupStack::PopAndDestroy(); // close extra reference on Factory
+
+	if(!iInterface)
+	{
+		LOG_INFO_PRINTF1(_L("Failed to create interface -> Leaving"));
+		User::Leave(KErrCorrupt);
+	}
+	
+	//chose ip or ip6
+	TText prtName_[64];
+	TPtrC    prtName(prtName_,64);
+	 if (ipIniFileReader ==0 || //problem with ppp.ini reading
+		(!ipIniFileReader->FindVar(iData.KCommDbSectionName,TPtrC(KCDTypeNameIfNetworks),prtName)))//or no corresponding item
+	{
+		prtName.Set(_L("ip6"));//use default then
+	}
+	//use hardcoded only if the ini file read or search failed
+	iInterfaceBound=iInterface->GetBinderL(TPtrC(prtName));//Do as if we bind to the ipv6 protocol
+	iInterface->BindL(ipDummyPrt);     //and instead of the protocol put just a dummy
+}
+
+void
+CDummyNifAgentRef::ServiceStarted()
+{
+	TRAPD(errCode,ServiceStartedL());
+	if (errCode!=KErrNone)
+	{
+		LOG_INFO_PRINTF1(_L("Can't continue -> Stopping the test"));
+		iTheMgr.Notify(CTestMgr::EStopTest);//and it's enough in our case
+	}
+	LOG_INFO_PRINTF2(_L("DummyAgtRef::ServiceStarted. ServiceStartedL returned err[%d]"), errCode);		
+}
+
+
+void CDummyNifAgentRef::ServiceClosed()
+{
+	LOG_INFO_PRINTF1(_L("DummyAgtRef::ServiceClosed"));
+		
+	delete iInterfaceBound;
+	iInterfaceBound=0;
+	delete iInterface;
+	iInterface=0;
+
+}
+
+void CDummyNifAgentRef::ConnectComplete(TInt aStatus)
+{
+	LOG_INFO_PRINTF2(_L("DummuAgtRef::ConnectComplete aStatus[%d]"), aStatus);
+		
+	if (aStatus==KErrNone)
+	{
+		aStatus=iInterface->Start();
+		iState = ELinkUp;
+		LOG_INFO_PRINTF2(_L("DummyAgtRef::ConnectComplete: Interface started: state[%d] (ELinkUp)"), iState);
+	}
+	if(aStatus!=KErrNone)
+	{
+	//	iAgent->Disconnect(aStatus);
+	}
+}
+
+void CDummyNifAgentRef::DisconnectComplete()
+{
+	LOG_INFO_PRINTF1(_L("DummyAgtRef::DisconnectComplete"));
+		
+	ServiceClosed();
+}
+void CDummyNifAgentRef::Stop()
+{
+	LOG_INFO_PRINTF2(_L("DummyAgtRef::Stop iState[%d]"), iState);
+		
+	// Simplified replica of real CNifAgentRef::Stop
+	// Stop can be called while the NIF is negotiating termination. PPP NIF does not support correct handling
+	// of repeated Stop calls (i.e. Close events) - it will not behave as specified in RFC1661. Therefore, PPP must be
+	// "shielded."
+	switch(iState)
+		{
+		case ELinkUp: // NIF is Up. It is OK to stop it.
+			iState = EStopping; // Negotiating termination.
+			iInterface->Stop(KErrCancel,MNifIfNotify::EDisconnect); // Start to negotiate termination.
+			break;
+			
+		case EStopping: // NIF is negotiating termination already
+		case EStopped:  // NIF has informed us that it is finished.
+			break; 
+			
+		default:			
+			User::Panic(_L("CDummyNifAgentRef::Stop: Illegal AgentRef state."),KErrGeneral);			
+		}
+	
+}
+
+void CDummyNifAgentRef::LinkLayerDown(TInt  aReason, TAction  aAction)
+{
+	LOG_INFO_PRINTF4(_L("DummyAgtRef::LinkLayerDown iState[%d] Reason[%d] Action[%d] "), iState, aReason, aAction);
+	iState = EStopped;		
+}
+void CDummyNifAgentRef::NegotiationFailed(CNifIfBase*  /*aIf*/, TInt  /*aReason*/)
+{
+}
+
+void CDummyNifAgentRef::BinderLayerDown(CNifIfBase*, TInt, TAction)
+	{
+	}
+
+void CDummyNifAgentRef::CancelAuthenticate()
+{
+}
+TInt CDummyNifAgentRef::GetExcessData(TDes8&  /*aBuffer*/)
+{
+	return KErrNone;
+}
+TInt CDummyNifAgentRef::DoWriteInt( const TDesC& /*aField*/, TUint32 /*aValue*/,const RMessagePtr2* /*aMessage*/)
+{
+	__ASSERT_ALWAYS(ETrue,User::Panic(_L("CDummyNifAgentRef::WriteInt called"),KErrGeneral));
+	return KErrNone;
+}
+TInt CDummyNifAgentRef::DoReadDes(const TDesC& /*aField*/, TDes8& /*aValue*/,const RMessagePtr2* /*aMessage*/)
+{
+	__ASSERT_ALWAYS(ETrue,User::Panic(_L("CDummyNifAgentRef::ReadDes called"),KErrGeneral));
+	return KErrNone;
+}
+TInt CDummyNifAgentRef::DoWriteDes(const TDesC& /*aField*/, const TDesC8& /*aValue*/,const RMessagePtr2* /*aMessage*/)
+{
+	__ASSERT_ALWAYS(ETrue,User::Panic(_L("CDummyNifAgentRef::WriteDes called"),KErrGeneral));
+	return KErrNone;
+}
+TInt CDummyNifAgentRef::DoWriteDes(const TDesC& /*aField*/, const TDesC16& /*aValue*/,const RMessagePtr2* /*aMessage*/)
+{
+	__ASSERT_ALWAYS(ETrue,User::Panic(_L("CDummyNifAgentRef::WriteDes called"),KErrGeneral));
+	return KErrNone;
+}
+TInt CDummyNifAgentRef::DoWriteBool( const TDesC& /*aField*/, TBool /*aValue*/,const RMessagePtr2* /*aMessage*/)
+{
+	__ASSERT_ALWAYS(ETrue,User::Panic(_L("CDummyNifAgentRef::WriteBool called"),KErrGeneral));
+	return KErrNone;
+}
+void CDummyNifAgentRef::IfProgress(TInt aStage, TInt aError)
+{
+LOG_INFO_PRINTF4(_L("DummyAgtRef::IfProgress iState[%d] Stage[%d] Error[%d] "), iState, aStage, aError);
+}
+
+void CDummyNifAgentRef::IfProgress(TSubConnectionUniqueId /*aSubConnectionUniqueId*/, TInt /*aStage*/, TInt /*aError*/)
+{
+}
+
+void CDummyNifAgentRef::OpenRoute()
+{
+}
+void CDummyNifAgentRef::CloseRoute()
+{
+}
+
+void CDummyNifAgentRef::ReconnectComplete(TInt /*aStatus*/)
+{
+}
+void CDummyNifAgentRef::AuthenticateComplete(TInt /*aStatus*/)
+{
+}
+void CDummyNifAgentRef::AgentProgress(TInt /*aStage*/, TInt /*aError*/)
+{
+}
+
+void CDummyNifAgentRef::AgentProgress(TSubConnectionUniqueId /*aSubConnectionUniqueId*/, TInt /*aStage*/, TInt /*aError*/)
+{
+}
+
+TInt
+CDummyNifAgentRef:: Notification(TAgentToNifEventType /*aEvent*/, TAny* /*aInfo*/)
+{
+	return KErrNone;
+}
+TInt CDummyNifAgentRef::IncomingConnectionReceived()
+{
+	return KErrNone;
+}
+
+void CDummyNifAgentRef::AgentEvent(TNetworkAdaptorEventType /*aEventType*/, TUint /*aEvent*/, const TDesC8& /*aEventData*/, TAny* /*aSource*/)
+{
+}
+
+TName CDummyNifAgentRef::Name() const
+{
+	return iName;
+}
+void CDummyNifAgentRef::Close()
+{
+}
+
+TInt CDummyNifAgentRef::PacketActivity(TDataTransferDirection /*aDirection*/, TUint /*aBytes*/, TBool /*aResetTimer*/)
+{
+	return KErrNone;
+}
+
+void CDummyNifAgentRef::NotifyDataSent(TSubConnectionUniqueId /*aSubConnectionUniqueId*/, TUint /*aUplinkVolume*/)
+{
+}
+
+void CDummyNifAgentRef::NotifyDataReceived(TSubConnectionUniqueId /*aSubConnectionUniqueId*/, TUint /*aDownlinkVolume*/)
+{
+}
+
+void CDummyNifAgentRef::NifEvent(TNetworkAdaptorEventType /*aEventType*/, TUint /*aEvent*/, const TDesC8& /*aEventData*/, TAny* /*aSource*/)
+{
+}