// Copyright (c) 2004-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:
// Defines the interface to the BCA interface
// 
//

/**
 @file 
*/

#ifndef BCAIOCONTROLLER_H
#define BCAIOCONTROLLER_H

#include <e32base.h>
#include <c32comm.h>
#include <networking/bca.h>
#include <networking/bcafactory.h>

#include "BcaController.h"
using namespace BasebandChannelAdaptation;

class CBttLogger;
class CSender;
class CReceiver;
class CBcaControl;

/** 

@internalComponent 
*/	
void Panic(TRawIPNifPanic aPanic);

/**

@internalComponent
*/
typedef MBcaFactory* (*TNewBcaFactoryL)();


/** 
@internalComponent 
*/	
class CBcaIoController : public CBcaController
	{
public:
	CBcaIoController(MControllerObserver& aObserver, CBttLogger* aTheLogger);
	static CBcaIoController* NewL(MControllerObserver& aObserver, CBttLogger* aTheLogger);
	void ConstructL();
	~CBcaIoController();

public:
	void StartL();
	void Stop(TInt aError = KErrNone);

public:  // Process Down/Up stack data packets 
	void BcaProcess(TDesC8& aPdu);
	void BcaSend(RMBufChain& aPdu);
	void BcaSendComplete();

public:
	inline CSender& Sender();
	inline CReceiver& Receiver();
	inline TUint Nsapi();
	void SetBcaStackAndName(TDesC& aBcaStack);
	inline const TName& BcaStack()const;
	inline const TName& BcaName()const;
	inline MBca* Bca();
	inline void SetBca(MBca* aBca);
	inline void SetPort(TDesC& aPortName);
	inline const TName& Port()const;
	inline void SetIapId(TUint32 aIapId);
	inline TUint32 IapId();
	TInt BcaSendBufferLength();
	
private:
	void InitialiseBcaL();

private: // Flow Control
	void ResumeSending();

private: // Unowned data.
	/** Pointer to the BCA */
   	MBca* iMBca;

	/** used to send data*/
	CSender* iSender;
	/** used to receive data*/
	CReceiver* iReceiver;
	/** used to load, open and close the BCA*/
	CBcaControl* iLoader;
	/** IAP ID used to open CommDB*/
	TUint32 iIapId;
	/** Bca name*/
	TName iBcaName;
	/** Bca Stack*/
	TName iBcaStack;
	/** CommPort Name*/
	TName iCommPort;
	};

inline CSender& CBcaIoController::Sender()
/**
 * Returns reference to CSender object
 *
 * @return iSender The CSender reference
 */
	{
	return *iSender;
	}
	
inline CReceiver& CBcaIoController::Receiver()
/**
 * Returns reference to CReceiver object
 *
 * @return iReceiver The CReceiver reference
 */
	{
	return *iReceiver;
	}

/** returns the BCA Stack*/
inline const TName& CBcaIoController::BcaStack()const
	{
	return iBcaStack;
	}
	
/** returns the BCA name*/
inline const TName& CBcaIoController::BcaName()const
	{
	return iBcaName;
	}
	
/** retrurns the BCA pointer.*/	
inline MBca* CBcaIoController::Bca()
	{
	return iMBca;
	}
/** sets the BCA pointer.

* @param aBca BCA pointer.
*/
inline void CBcaIoController::SetBca(MBca* aBca)
	{
	iMBca = aBca;
	}

/** sets the IAP ID

* @param aIapId IAP ID to be set.
*/	
inline void CBcaIoController::SetIapId(TUint32 aIapId)
	{
	iIapId = aIapId;
	}

/** returns the IAP ID*/	
inline TUint32 CBcaIoController::IapId()
	{
	return iIapId;
	}

/** sets the port name

* @param aPortName port name to be set.
*/	
inline void CBcaIoController::SetPort(TDesC& aPortName)
	{
	iCommPort = aPortName;
	}

/** returns the port name*/	
inline const TName& CBcaIoController::Port()const
	{
	return iCommPort;
	}

/** class used to load, open and shutdown the BCA and also start and shutdown the NIF.
@internalComponent 
*/
class CBcaControl : public CActive
	{
public:
	CBcaControl(CBcaIoController& aObserver, CBttLogger* aTheLogger);
	~CBcaControl();
public:
	void StartLoadL();
	void ShutdownBca(TInt aError);
    inline MBca* Bca();
protected:
	// Inherited from CActive.
	virtual void RunL();
	virtual void DoCancel();	
private: // Unowned data.
	CBcaIoController& iObserver;
	CBttLogger* iTheLogger;
private:
		enum TBcaState
		{
		/** Bca ready to start */
		EIdling,
		/** Bca to be closed*/
		EClosing,
		/** Bca IAP is set*/
		EIAPSet,
		/** Bca stack is set*/
		EBcaStackSet
		};
	
private:
	
	/** BCA owned by NIF*/	
	MBca* iMBca;
	/** used to load library*/
	TAutoClose<RLibrary> iBcaDll;
	/** BCA state*/
	TBcaState iState;
	/** NIF shut down error*/
	TInt iError; 
	};
	
/** returns the BCA pointer. */	
inline MBca* CBcaControl::Bca()
	{
	return iMBca;
	}	

#endif // BCAIOCONTROLLER_H

