commands/ping/pingmodel.h
changeset 0 7f656887cf89
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/commands/ping/pingmodel.h	Wed Jun 23 15:52:26 2010 +0100
@@ -0,0 +1,291 @@
+// Copyright (c) 2000-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:
+// pingmodel.h - icmp echo client engine
+// This software has been implemented in the 6PACK
+// project at the Mobile Networks Laboratory (MNW)
+// http://www.research.nokia.com/projects/6pack/
+//
+
+#if !defined __PINGMODEL_H
+#define __PINGMODEL_H
+
+#include <es_sock.h>
+#include <in_sock.h>
+
+#include <nifmbuf.h>
+#include "in_icmp.h"
+#include <icmp6_hdr.h>
+
+#include "const.h"
+
+#ifdef IAPSETTING
+#include <agentclient.h>
+#endif
+
+// constants
+
+#define TIMESTAMP_SIZE  sizeof(TInt64)  //Timestamp Size
+
+#define DEFDATALEN      64 - TIMESTAMP_SIZE     //default data length
+
+
+#define SECOND 1000000  // One second is 1000000 us. (1 us. per tick)
+
+//ICMPv6 codes not defined in .h's
+#define KInet6ICMP_HopLimitExceeded		0
+#define KInet6ICMP_FragReassExceeded	1
+
+#define KInet6ICMP_NoRoute				0
+#define KInet6ICMP_AdminProhibition		1
+#define KInet6ICMP_NotNeighbour			2
+#define KInet6ICMP_AddrUnreach			3
+#define KInet6ICMP_PortUnreach			4
+
+#define KInet6ICMP_ErrHdrField			0
+#define KInet6ICMP_NextHdrUnknown		1
+#define KInet6ICMP_OptionUnkown			2
+
+
+#define MAX_PATTERN_LENGTH	16	//Must match the value of the pattern in the RSS file!!!
+#ifdef IAPSETTING
+#define MAX_IAP_LENGTH	5	//Must match the value of the pattern in the RSS file!!!
+#endif
+class CPingContainer;
+class CPingSender;
+
+
+const TUint KPingQuiet			= 0x01;
+const TUint KPingVerbose		= 0x02;
+const TUint KPingPackLimit		= 0x04;
+const TUint KPingDebug			= 0x08;
+
+//Contains engine's saved preferences
+class TPreferences
+{
+public:
+	TUint iFlags;
+	//Contains:
+		//Bit 0 TBool   iQuiet;                 //No packet info, just statistics
+		//Bit 1 TBool   iVerbose;               //Verbose Output. All ICMP packets, not only Echo reply
+		//Bit 2 TBool   iPackLimit;             //Indicates if unlimited packet number
+		//Bit 3 TBool   iDebug;                 //Set the SO_DEBUG flag in the socket
+
+	TUint   iSecWait;			//Time between sent packets (Default 1 second)
+	TUint   iPacketDataSize;	//Default Data Size (not including ICMP header)
+	TUint   iTotalPackets;		//Number of ICMP Echo Request packets to send
+	TUint   iLastSecWait;		//Time to wait for the Last packet. Default 2
+	TBuf<KHostNameLimit> iHostname;
+	TBuf<MAX_PATTERN_LENGTH> iPattern;	//Pattern to fill the packet.Default 0xFF (Stored as text)
+
+#ifdef IAPSETTING
+	TUint iIAP;	
+#endif
+	//Not used yet
+	//TUint   iHopLimit;              //Time-to-live in hops default 255 (0 means not set)
+	//TBool   iNumericOutput; //Resolve adresses by default	
+};
+
+class CPingSender;
+class CPingSingleSender;
+//Ping Utility class. Contains All the ping model and create active objects to
+//                                              send and receive from the socket
+class CPing : public CActive
+{
+friend class CPingSender;
+friend class CPingSingleSender;
+public:
+	CPing();
+	~CPing();
+	
+	void ConstructL(TPreferences aPref);
+
+	//return the current preferences
+	void GetPreferences(TPreferences &aPref);
+	static void DefaultPreferences(TPreferences &aPref);
+	void SetConsole(CPingContainer *aConsole);
+	TDes* GetHostName();
+	void SetHostName(const TDesC& ahostname);
+	
+	void EndPingL();
+	TBool IsRunning();
+	void BeginL();
+
+#ifdef IAPSETTING
+	void StartConnection();
+#endif
+
+protected:
+	
+	TUint16 in_chksum(TUint16 *data, TUint len);
+	void ComposeFirstICMPPacket();  //Compose a whole ICMPPacket
+	void ComposeICMPPacket();               //Only composes timestamp and sequence number
+	void StampPacket(); // Modify the composed packet with fresh timestamp and checksum
+	void NextSeq();
+
+	void CloseAll();        //Closes all the resources
+	void PrintICMPData(const TDesC8& adata);
+
+	void IssueRequest();
+	void RunL();    //Segment of code to execute
+	void DoCancel();        //Stops Execution of Ping
+
+private:
+	void CreateSocketAOL();
+	void Statistics();
+	void WriteLineIfNotQuiet(const TDesC& abuf);
+	void ErrorL(const TDesC& string,TInt error);
+	void CLR(TUint16 num);
+	void SET(TUint16 num);
+	TBool TEST(TUint16 num);
+	TPtrC PacketType(ThdrICMP *hdr);
+	//TPtrC PacketTypev6(TInet6HeaderICMP_Echo *aHdr);
+	void PacketTypev6(TDes& buf,ThdrICMP *aHdr);
+	void Stop();
+	TUint16 RandomNumber();
+
+private:
+	
+    CPingContainer *iConsole;
+	RSocketServ iSockServ;  // Socket Server
+	RSocket iSocket;                                // Socket
+	RHostResolver iHostResolv;      //Resolver
+	//TRequestStatus status;		// To wait for socket operations completion
+
+	CPingSender *iPingSender;
+	TUint32 iDup[8];                //Calculates duplicate packets up to 256 packets, after
+						//it begins again using modulus (%, MOD)
+
+	HBufC8 *iPacketData;
+	TPtr8 iPacket;
+	TUint16 iId;
+
+	TUint iMaxTime;                         //Maximum time 
+	TUint iMinTime;                         //Minimum time
+	TUint iTimeSum;                         //all times sum
+	TBuf<KHostNameLimit> iHostname;         // Contains hostname to ping
+	
+	TUint iDupPackets;						//Duplicated packets
+	TBool iRunning;
+	TUint iStage;		//Stages to use non-blocking resolver in RunL
+	TNameEntry iEntry;	//contains address resolution data
+
+	HBufC8 *iReceivedDataBuffer;
+	TPtr8 iReceivedData;
+
+	TUint iType;
+
+	TInt64 iSeed;	//Used for random iId generation
+
+public:
+	TBool   iNumericOutput; //Resolve adresses by default
+	TUint   iSecWait;               //Time between sent packets (Default 1 second)
+	TUint   iPacketDataSize;//Default Data Size (not including ICMP header)
+	TBool   iQuiet;                 //No packet info, just statistics
+	TUint   iHopLimit;              //Time-to-live in hops default 255 (0 means not set)
+	TBool   iVerbose;               //Verbose Output. All ICMP packets, not only Echo reply
+	TBool   iPackLimit;             //Indicates if unlimited packet number
+	TUint   iSentPackets;   //ICMP Echo Request Packets sent til now
+	TUint   iRecvPackets;   //ICMP Echo Reply Packets received til now
+	TUint   iTotalPackets;  //Number of ICMP Echo Request packets to send
+	TBuf<MAX_PATTERN_LENGTH> iPattern;               //Pattern to fill the packet.Default 0xFF
+	TBool   iDebug;                 //Set the SO_DEBUG flag in the socket
+	TUint   iLastSecWait;   //Time to wait for the Last packet. Default 2
+	TUint   iChksumErrors;
+	TUint   iSockErrors;
+	TInetAddr iHostAddr;		//Address to Ping
+#ifdef IAPSETTING
+	TUint iIAP;		
+	RGenericAgent iGenericAgent;     // To establish the connection with the ISP.
+#endif
+};
+
+// Used by CPing
+// Send packets using a CTimer (CActive) object
+// Not intended to run alone!!!
+
+class CPingSender : public CTimer
+{
+public:
+	//constructor
+	CPingSender();
+
+	//destructor
+	~CPingSender();
+	
+	//second phase constructor
+	void ConstructL(CPing *aPingModel);
+	void FirstRunL();
+
+protected:
+	//Issues next RunL execution
+	void IssueRequest();
+
+	//Issues last RunL execution
+	void IssueLastRequest();
+
+	// will send all the packets
+	void RunL();
+
+	//Cancel Packet Sending
+	void DoCancel();
+	
+	void SendFirstPacketL();
+	void SendPacket();
+
+private:
+	CPing *iPingModel;
+	CPingSingleSender *iSender;
+	
+
+};
+
+
+// Used by CPingSender
+// Sends packets. Cannot be done directly by CPingSender because there are conflicts with
+//					diferent TRequestStatus.
+
+
+class CPingSingleSender : public CActive
+{
+public:
+	//constructor
+	CPingSingleSender(CPing *aPingModel);
+
+	//destructor
+	~CPingSingleSender();
+	
+	void FirstRunLD();
+	void NextPacket();
+
+protected:
+	//Issues next RunL execution
+	void IssueRequest();
+
+	//Issues last RunL execution
+	void IssueLastRequest();
+
+	// will send all the packets
+	void RunL();
+
+	//Cancel Packet Sending
+	void DoCancel();
+
+
+private:
+	CPing *iPingModel;
+	TUint iUnsent;
+
+};
+
+#endif