linklayerprotocols/ethernetnif/EtherPkt/Cardctl.h
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Thu, 01 Apr 2010 00:00:09 +0300
branchRCL_3
changeset 12 e9cc36e353d4
permissions -rw-r--r--
Revision: 201013 Kit: 201013

// 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:
//

/**
 @file
 @internalComponent 
*/

#if !defined(__CARDCTL_H__)
#define __CARDCTL_H__

#include <d32ethernet.h>

#include "carddrv.h"
#include <comms-infras/connectionsettings.h>	// for KSlashChar

const TInt KConfigBufferSize = 12;


NONSHARABLE_CLASS(CIOBuffer) : public CBase
/**
Generic buffer class
Enables HBufC8 pointers to be queued
@internalComponent
*/
{
public:
	~CIOBuffer();
	inline HBufC8*	Data() const {return iBuf;};
	void FreeData();
	inline TPtr8& Ptr() {return iBufPtr;};
	void Assign(HBufC8* aBuffer = NULL);
    static CIOBuffer* NewL(HBufC8* aBuf = NULL);
    static CIOBuffer* NewL(const TInt aSize);
	static TInt LinkOffset();

private:
	CIOBuffer();
	void ConstructL(const TInt aSize);
	//	void Construct(HBufC8* aBuffer);
	
	TSglQueLink iLink;
	HBufC8* iBuf;
	TPtr8 iBufPtr;
};


// Main Card Control class. Controls open, close, read, write etc 
class CPcCardSender;
class CPcCardReceiver;
class CPcCardIOCTL;
class CPcCardEventHandler;

NONSHARABLE_CLASS(CPcCardControlEngine) : public CBase
/**
@internalComponent
*/
{
public:
	friend class CPcCardSender;
	friend class CPcCardReceiver;
	friend class CPcCardIOCTL;
	friend class CPcCardEventHandler;

	static CPcCardControlEngine *NewL(CPcCardPktDrv* aPktDrv);
	~CPcCardControlEngine();
	void StartL();
	void Stop();
	TUint8* GetInterfaceAddress();
	TInt Send(HBufC8* aBuffer);
	TBool CardOpen(){return iCardOpen;};

#if (!defined __WINS__)
	void ParseMACFromFileL();
#endif


private:
	CPcCardControlEngine(CPcCardPktDrv* aPktDrv);
	void ConstructL();
	void ProcessReceivedPacket(TDesC8 &aBuffer);
	void ResumeSending();
	void LinkLayerUp();
	void LoadDeviceDriversL();

private:
	TBool iCardOpen;
	CPcCardPktDrv* iNotify;

	TBuf8<KConfigBufferSize> iConfig;
	
	CPcCardSender* iSender;
	CPcCardReceiver* iReceiver;
	CPcCardEventHandler* iEventHandler;
	RBusDevEthernet iCard;
	TInt iPcmciaSocket;
	
	TBuf<KCommsDbSvrDefaultTextFieldLength>	iPDDName;
	TBuf<KCommsDbSvrDefaultTextFieldLength>	iLDDName;
};

NONSHARABLE_CLASS(CPcCardSender) : public CActive
/**
Writer Active object class
Queues buffers for transmit
@internalComponent
*/
{
public:
	static CPcCardSender* NewL(CPcCardControlEngine* aParent);
	~CPcCardSender();
	TInt Send(CIOBuffer* aBuffer);
	void EmptyQueue();

private:
	virtual void RunL();
	virtual void DoCancel();
	CPcCardSender();
	void InitL(CPcCardControlEngine* aParent);

	TInt iQueueLength;
	CPcCardControlEngine* iParent;
	TSglQue<CIOBuffer> iTxQueue;
	TBool iStopSending;
};

NONSHARABLE_CLASS(CPcCardReceiver) : public CActive
/**
Reader active object
One receive buffer only, read queue handled by LDD
@internalComponent
*/
{
public:
	static CPcCardReceiver* NewL(CPcCardControlEngine* aParent);
	~CPcCardReceiver();
	void QueueRead();
private:
	virtual void RunL();
	virtual void DoCancel();
	CPcCardReceiver();
	void InitL(CPcCardControlEngine* aParent);

	CPcCardControlEngine* iParent;
	HBufC8* iRecvBuffer;
	TUint iRecvBufLength;
	TPtr8 iRecvBufPtr;
};

NONSHARABLE_CLASS(CPcCardEventHandler) : public CActive
/**
@internalComponent
*/
{
public:
	~CPcCardEventHandler();
	static CPcCardEventHandler* NewL(CPcCardControlEngine* aParent);
	void GetEvent();
private:
	virtual void RunL();
	virtual void DoCancel();
	CPcCardEventHandler();
	void InitL(CPcCardControlEngine* aParent);

	TBuf8<32>	iEventBuffer;
	CPcCardControlEngine* iParent;
};

NONSHARABLE_CLASS(CPcCardIOCTL) : public CActive
/**
@internalComponent
*/
{
public:
	~CPcCardIOCTL();
	static CPcCardIOCTL* NewL(CPcCardControlEngine* aParent);
	TInt Ioctl(const TUint8 aIOCTLCode);
private:
	virtual void RunL();
	virtual void DoCancel();
	CPcCardIOCTL();
	void InitL(CPcCardControlEngine* aParent);
	TBuf8<32>	iIOCTLBuffer;
	TUint8 iCurrentIOCTL;

	CPcCardControlEngine* iParent;
};

#endif