linklayerprotocols/pppnif/te_ppp/src/DummyAgtRef.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Wed, 15 Sep 2010 13:53:10 +0300
branchRCL_3
changeset 67 bb2423252ea3
parent 0 af10295192d8
permissions -rw-r--r--
Revision: 201036 Kit: 201036

// 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*/)
{
}