linklayerprotocols/ethernetnif/IRLAN/IRLAN.H
changeset 0 af10295192d8
child 5 1422c6cd3f0c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/linklayerprotocols/ethernetnif/IRLAN/IRLAN.H	Tue Jan 26 15:23:49 2010 +0200
@@ -0,0 +1,303 @@
+// 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:
+// Interface to IR-LAN
+// 
+//
+
+/**
+ @file
+ @internalComponent 
+*/
+
+#if !defined(__IRLAN_H__)
+#define __IRLAN_H__
+
+#define _MKLOG
+//#define __TRACEWIN__
+
+#include <ir_sock.h>
+#include "IRLANDAT.H"
+
+#include <comms-infras/nifif.h>
+
+const TUint KIrlanMajorVersionNumber=1; //< Constant specifies Major version number.
+const TUint KIrlanMinorVersionNumber=0; //< Constant specifies Minor version number.
+const TUint KIrlanBuildVersionNumber=7; //< Constant specifies Build version number.
+
+class CInternalSocket;
+class CInternalNetDB;
+class CInternalHostResolver;
+class CIrlanControlEngine;
+
+/**
+@internalComponent
+*/
+NONSHARABLE_CLASS(CIrlanPktDrvFactory) : public CPktDrvFactory
+{
+public:
+	CIrlanPktDrvFactory();
+	virtual CPktDrvBase* NewDriverL(CLANLinkCommon* aParent);
+  	virtual TVersion Version() const;
+};
+  
+inline CIrlanPktDrvFactory::CIrlanPktDrvFactory()
+{
+}
+
+/**
+Specific packet drivers are implemented as separate DLLs.
+@internalComponent
+*/
+NONSHARABLE_CLASS(CIrlanPktDrv) : public CPktDrvBase
+{
+public: 
+	CIrlanPktDrv(CPktDrvFactory& aFactory);
+	virtual ~CIrlanPktDrv();
+	virtual void ConstructL(CLANLinkCommon* aParent);
+	virtual TInt TestSend(TDesC8& /*aBuffer*/){return KErrNone;};
+	virtual TInt StartInterface();
+	virtual TInt StopInterface();
+	virtual TInt ResetInterface();
+	virtual TInt SetRxMode(TRxMode AMode); 
+	virtual TInt GetRxMode() const;
+	virtual TInt AccessType();
+	virtual TInt ReleaseType();
+	virtual TInt SetInterfaceAddress(const THWAddr&);
+	virtual TUint8* GetInterfaceAddress()const;
+	virtual TInt GetMulticastList(const THWAddr* aAddr, TInt& n) const;
+	virtual TInt SetMulticastList(const THWAddr* aAddr, TInt n);
+	virtual TInt InterfacePowerUp();
+	virtual TInt InterfacePowerDown();
+	virtual TInt InterfaceSleep();
+	virtual TInt InterfaceResume();
+	virtual TInt Info(TNifIfInfo& aInfo, TInt aIndex) const; //< need to instantiate pure virtuals from CNifIfBase ETHER_802 
+    virtual void FoundMACAddr();
+	virtual TInt Send(RMBufChain& aPdu);
+	virtual TInt Notification(enum TAgentToNifEventType aEvent, void* aInfo);
+	virtual TInt Control(TUint aLevel,TUint aName,TDes8& aOption, TAny* aSource=0);
+
+	// Other functions 
+	void LinkLayerUp();
+	void Process(RMBufChain& aPdu);
+private:
+	CIrlanPktDrv();
+	
+private:
+	CEther802LLCBase* iMACLayer;
+	CIrlanControlEngine *iControl;
+};
+
+class CIrlanSender;
+class CIrlanReceiver;
+class CIrlanControlEngineTimers;
+
+/**
+Main Irlan control object.  State machine implemented with as an active object.
+@internalComponent
+*/
+NONSHARABLE_CLASS(CIrlanControlEngine) : public CActive , public MResolverNotify , public MSocketNotify
+{
+public:
+	friend class CIrlanSender;
+	friend class CIrlanReceiver;
+private:
+enum TIrlanState
+	{
+	E_Idle,E_PassiveIdle,E_Query,E_Conn,E_Info,E_Media,E_FilterConfig,E_FilterOperation,
+	E_FilterBroadcast,E_Open,E_Wait,E_Arb,E_Data,E_Close,E_Sync,
+	};
+enum TIrlanMode
+	{
+	EAccessPoint,EPeerToPeer,EHosted,
+	};
+public:
+	static CIrlanControlEngine *NewL(CIrlanPktDrv* aPktDrv);
+	~CIrlanControlEngine();
+	void RunL();
+	void StartL();
+	void DoCancel();
+	// Notifier functions for internal sockets to call.
+	void NewData(TUint aCount);
+	void CanSend();
+	TInt Send(RMBufChain& aPdu, TAny* aSource=0);
+	void ConnectComplete();
+	void ConnectComplete(const TDesC8& aConnectData);
+    void ConnectComplete(CServProviderBase& aSSP);
+	void ConnectComplete(CServProviderBase& aSSP,const TDesC8& aConnectData);
+	void CanClose(TDelete aDelete=EDelete);
+	void CanClose(const TDesC8& aDisconnectData,TDelete aDelete=EDelete);
+	void Error(TInt anError,TUint anOperationMask=EErrorAllOperations);
+	void Disconnect(void);
+	void Disconnect(TDesC8& aDisconnectData);
+	void IoctlComplete(TDesC8 *aBuf);
+	void NoBearer(const TDesC8& aConnectionParams);
+	void Bearer(const TDesC8& aConnectionInfo);
+	// Notifier functions for internal host resolver/netDB to call. 
+	void QueryComplete(TInt aError);
+	// Other public functions 
+	TUint8* GetInterfaceAddress();
+	//	static TInt SendCallBack(TAny* aSource);
+	static TInt IrlanControlEngineTimerExpired(TAny *aIrlan);
+private:
+	CIrlanControlEngine();
+	void ConstructL(CIrlanPktDrv* aNotify);
+	void ActivateStateMachine(TInt aStat=KErrNone);
+	// IrLAN state machine asynchronous actions: 
+	TInt AttemptingDiscoveryL();
+	TInt PassiveIdleTransitionL();
+	TInt QueryRemoteIASL();
+	TInt ConnectToProviderL();
+	void ParseControlCommand();
+
+	TInt GetInfoCmd();
+	TInt GetInfoReply();
+	void ParseInfoReply();
+	TInt GetMediaCmd();
+	TInt GetMediaReply();
+	TInt ParseMediaReply(); 
+	TInt OpenDataCmd();
+	void ParseOpenDataReply();
+	TInt GetDirectedFilterConfigCmd();
+	void ParseDirectedFilterConfigReply();
+	TInt SetDirectedFilterOperationCmd();
+	void ParseDirectedFilterOperationReply();
+	TInt SetBroadcastFilterOperationCmd();
+	void ParseBroadcastFilterOperationReply();
+	TInt ConnectToDataChannelL();
+	void SendIrlanControlFrame(RMBufChain& aPdu);
+	void SendIrlanResponseFrame(RMBufChain& aPdu);
+	void QueueWaitForControlCommand();
+	void QueueWaitForControlResponse();
+	void ProcessReceivedPacketL();
+
+	// Private utility functions 
+	CIrlanParameter* LookUpParameter(const TDesC8& aName);
+	void HandleErrorL();
+	TInt DoIASQuery(const TDesC8& aClassName,
+	  const TDesC8& aAttributeName,TUint aRemDevAddr);
+	TInt DoControlConnect();
+	TInt DoDataConnect();
+
+	// printing routines 
+	void PrintState();
+	void PrintIASResults();
+	void PrintIASError(TInt aError);
+	void PrintResultCode(TIrlanQueryResult aResult);
+private:
+	CIrlanPktDrv* iNotify;
+	TUint8 iHWAddr[9];
+
+	HBufC8* iRecvBuffer;
+	TUint iRecvBufLength;
+	TPtr8 iRecvBufPtr;
+
+	CIrlanControlEngineTimers *iTimers;
+	TInt iDiscoveryAttempts;
+	TIrlanMode iAccessType;
+	TBool iAwaitingResponse;
+	TInt iAwaitingCommand;
+	TIrlanState iState;
+	CIrlanPktDrv *iPktDrv;
+	TUint iDiscoveredDevice;
+	CIrlanSender* iSender;
+	CIrlanReceiver* iReceiver;
+	TProtocolDesc iProtInfo;
+	CProtocolBase *iProtocol;
+	CInternalHostResolver *iHostResolver;
+	/** discovery log */
+	TNameEntry iLog;		
+
+	CInternalNetDB *iNetDatabase;
+	TIASQuery iQuery;
+	TIASResponse iResults;
+	// listening 
+	CInternalSocket *iListenSock;
+	CInternalSocket *iAcceptControlSock;
+
+	// sending 
+	CInternalSocket *iControlSock;
+	CInternalSocket *iDataSock;
+	TRequestStatus iSendStat;
+	TRequestStatus iRecvStat;
+	TUint iOpenRetries;
+	TInt iIrlanControlPortNum;
+	TInt iIrlanDataPortNum;
+	TDblQue<CIrlanParameter> iIrlanParameterList;
+	RMBufPktQ iDataSendQ;
+};
+
+/**
+@internalComponent
+*/
+NONSHARABLE_CLASS(CIrlanSender) : public CActive
+{
+public:
+	static CIrlanSender* NewL(CIrlanControlEngine* aParent,CInternalSocket* aSock);
+	~CIrlanSender();
+	void QueueSend(RMBufChain& aPdu);
+	void KickSender();
+	virtual void RunL();
+	virtual void DoCancel();
+private:
+	CIrlanSender();
+	void InitL(CIrlanControlEngine* aParent,CInternalSocket* aSock);
+	void SeeIfPacketToSend();
+private:
+	CIrlanControlEngine* iParent;
+	CInternalSocket* iDataSock;
+};
+
+/**
+@internalComponent
+*/
+NONSHARABLE_CLASS(CIrlanReceiver) : public CActive
+{
+public:
+	static CIrlanReceiver* NewL(CIrlanControlEngine* aParent,CInternalSocket* aSock);
+	~CIrlanReceiver();
+	void QueueRead();
+	virtual void RunL();
+	virtual void DoCancel();
+private:
+	CIrlanReceiver();
+	void InitL(CIrlanControlEngine* aParent,CInternalSocket* aSock);
+private:
+	CIrlanControlEngine* iParent;
+	CInternalSocket* iDataSock;
+};
+
+/**
+@internalComponent
+*/
+NONSHARABLE_CLASS(CIrlanControlEngineTimers) : public CBase
+{
+public:
+	friend class CIrlanControlEngine;
+	virtual ~CIrlanControlEngineTimers();
+	static CIrlanControlEngineTimers *NewL(CIrlanControlEngine *aIrlan);
+	void StartIrlanControlEngineTimer(TCallBack aCallBack,TInt aTimeout);
+	void StopIrlanControlEngineTimer();
+	void DoIrlanControlEngineTimerExpired();
+private:
+	CIrlanControlEngineTimers(CIrlanControlEngine *aIrlan);
+private:
+	CIrlanControlEngine *iIrlanControlEngine;
+	TDeltaTimerEntry iIrlanControlEngineTimer;
+	TDeltaTimerEntry *iIrlanControlEngineTimerH;
+};
+
+#endif
+
+
+