⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ectag.h

📁 电驴的MAC源代码
💻 H
字号:
//// This file is part of the aMule Project.//// Copyright (c) 2004-2008 aMule Team ( admin@amule.org / http://www.amule.org )//// Any parts of this program derived from the xMule, lMule or eMule project,// or contributed by third-party developers are copyrighted by their// respective authors.//// This program is free software; you can redistribute it and/or modify// it under the terms of the GNU General Public License as published by// the Free Software Foundation; either version 2 of the License, or// (at your option) any later version.//// This program is distributed in the hope that it will be useful,// but WITHOUT ANY WARRANTY; without even the implied warranty of// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the// GNU General Public License for more details.// // You should have received a copy of the GNU General Public License// along with this program; if not, write to the Free Software// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301, USA//#ifndef ECTAG_H#define ECTAG_H#include <iostream>#include <sstream>// Must be first! #ifdef USE_WX_EXTENSIONS#include <wx/string.h> // Do_not_auto_remove#include <common/StringFunctions.h>#define EC_ASSERT(x)	wxASSERT(x)#else#define EC_ASSERT(x)	assert(x)#endif/* aMule/libcommon generic includes */#include "../../../MD4Hash.h"		// Needed for CMD4Hash/* EC specific includes */#include "ECCodes.h"		// Needed for EC types#include "ECTagTypes.h"	// Needed for TagTypesclass CECSocket;/** * Class to hold IPv4 address. */class EC_IPv4_t {	public:		EC_IPv4_t() { }		EC_IPv4_t(uint32 ip, uint16 port)		{			m_ip[0] = ip & 0xff;			m_ip[1] = (ip >> 8) & 0xff;			m_ip[2] = (ip >> 16) & 0xff;			m_ip[3] = (ip >> 24) & 0xff;			m_port = port;		}				uint32 IP()		{			return m_ip[0] | (m_ip[1] << 8) | (m_ip[2] << 16) | (m_ip[3] << 24);		}		std::string StringIPSTL(bool brackets = true)		{			std::ostringstream string_ip;			if (brackets) string_ip << "[";			string_ip << (int)m_ip[0] << "." << (int)m_ip[1] << "." << (int)m_ip[2] << "." << (int)m_ip[3] << ":" << m_port;			if (brackets) string_ip << "]";			return string_ip.str();		}				#ifdef USE_WX_EXTENSIONS		wxString StringIP(bool brackets = true) {			return char2unicode(StringIPSTL(brackets).c_str());		}		#endif				uint8 m_ip[4];		uint16 m_port;};/** * High level EC packet TAGs handler class */class CECTag {	public:		CECTag(ec_tagname_t name, unsigned int length, const void *data, bool copy = true);		// tag for custom data: just init object, alloc buffer and return pointer		CECTag(ec_tagname_t name, unsigned int length, void **dataptr);		// Routines for special data types.		CECTag(ec_tagname_t name, uint8_t data);		CECTag(ec_tagname_t name, uint16_t data);		CECTag(ec_tagname_t name, uint32_t data);		CECTag(ec_tagname_t name, uint64_t data);		CECTag(ec_tagname_t name, double data);		CECTag(ec_tagname_t name, const std::string& data);		CECTag(ec_tagname_t name, const EC_IPv4_t& data);		CECTag(ec_tagname_t name, const CMD4Hash& data);		#ifdef USE_WX_EXTENSIONS		CECTag(ec_tagname_t name, const wxString& data);		CECTag(ec_tagname_t name, const char* data) { ConstructStringTag(name, data); }		#endif		CECTag(const CECTag& tag);		~CECTag(void);		CECTag&		operator=(const CECTag& rhs);		bool		AddTag(const CECTag& tag);		const CECTag*	GetTagByIndex(size_t index) const			{ return ((index >= m_tagList.size()) ? NULL : &m_tagList[index]); }		CECTag*		GetTagByIndex(size_t index)			{ return ((index >= m_tagList.size()) ? NULL : &m_tagList[index]); }		const CECTag*	GetTagByIndexSafe(size_t index) const			{ const CECTag* result = GetTagByIndex(index); return result ? result : &s_theNullTag; }				const CECTag*	GetTagByName(ec_tagname_t name) const;		CECTag*			GetTagByName(ec_tagname_t name);		const CECTag*	GetTagByNameSafe(ec_tagname_t name) const;				size_t		GetTagCount(void) const { return m_tagList.size(); }		const void *	GetTagData(void) const { 			EC_ASSERT(m_dataType == EC_TAGTYPE_CUSTOM);			return m_tagData; 		}		uint16_t		GetTagDataLen() const { return m_dataLen; }		uint32_t		GetTagLen() const;		ec_tagname_t		GetTagName() const { return m_tagName; }				// Retrieving special data types		uint64_t		GetInt() const;		double			GetDoubleData() const;		std::string		GetStringDataSTL() const;				#ifdef USE_WX_EXTENSIONS		wxString GetStringData() const;		#endif 				EC_IPv4_t 	GetIPv4Data() const;		CMD4Hash	GetMD4Data() const;				void AssignIfExist(ec_tagname_t tagname, uint8_t &target)		{			CECTag *tag = GetTagByName(tagname);			if ( tag ) {				EC_ASSERT((tag->GetType() == EC_TAGTYPE_UINT8) || (m_dataType == EC_TAGTYPE_UNKNOWN));				target = tag->GetInt();			}		}		void AssignIfExist(ec_tagname_t tagname, uint16_t &target)		{			CECTag *tag = GetTagByName(tagname);			if ( tag ) {				EC_ASSERT(					(tag->GetType() == EC_TAGTYPE_UINT16)					|| (tag->GetType() == EC_TAGTYPE_UINT8)					|| (m_dataType == EC_TAGTYPE_UNKNOWN)				);				target = tag->GetInt();			}		}		void AssignIfExist(ec_tagname_t tagname, uint32_t &target)		{			CECTag *tag = GetTagByName(tagname);			if ( tag ) {				EC_ASSERT(					(tag->GetType() == EC_TAGTYPE_UINT32)					|| (tag->GetType() == EC_TAGTYPE_UINT16)					|| (tag->GetType() == EC_TAGTYPE_UINT8)					|| (m_dataType == EC_TAGTYPE_UNKNOWN)				);				target = tag->GetInt();				}		}		void AssignIfExist(ec_tagname_t tagname, uint64_t &target)		{			CECTag *tag = GetTagByName(tagname);			if ( tag ) target = tag->GetInt();		}		void AssignIfExist(ec_tagname_t tagname, double &target)		{			CECTag *tag = GetTagByName(tagname);			if ( tag ) target = tag->GetDoubleData();		}		void AssignIfExist(ec_tagname_t tagname, CMD4Hash &target)		{			CECTag *tag = GetTagByName(tagname);			if ( tag ) target = tag->GetMD4Data();		}		void AssignIfExist(ec_tagname_t tagname, std::string &target)		{			CECTag *tag = GetTagByName(tagname);			if ( tag ) target = tag->GetStringDataSTL();		}				#ifdef USE_WX_EXTENSIONS		void AssignIfExist(ec_tagname_t tagname, wxString &target)		{			CECTag *tag = GetTagByName(tagname);			if ( tag ) target = tag->GetStringData();		}				#endif			protected:		uint8_t GetType() const { return m_dataType; }		enum BuildState {			bsName,			bsType,			bsLength,			bsLengthChld,			bsChildCnt,			bsChildren,			bsData1,			bsData2,			bsFinished		};		CECTag(const CECSocket&)			: m_error(0), m_tagData(NULL), m_state(bsName), m_dataLen(0), m_dataType(EC_TAGTYPE_UNKNOWN), m_dynamic(true), m_haschildren(false)			{}		bool		ReadFromSocket(CECSocket& socket);		bool		WriteTag(CECSocket& socket) const;		bool		ReadChildren(CECSocket& socket);		bool		WriteChildren(CECSocket& socket) const;		int		m_error;		const void *	m_tagData;		BuildState	m_state;		bool		IsOk() const { return m_state == bsFinished; }	private:		// Special type used to invoke the Null tag constructor		struct NullTagConstructorSelector { };				// To init. the automatic int data		void InitInt(uint64_t data);		// Special constructor to construct the Null tag.		explicit CECTag(const NullTagConstructorSelector*);		ec_tagname_t	m_tagName;		ec_taglen_t		m_dataLen;		mutable ec_tagtype_t	m_dataType;		bool		m_dynamic;		typedef std::vector<CECTag> TagList;		TagList m_tagList;				bool m_haschildren;		static const CECTag s_theNullTag;		static const uint32_t s_theNullTagData[4];				// To be used by the string constructors.		void ConstructStringTag(ec_tagname_t name, const std::string& data);};/** * An empty TAG * * Note, that an "empty" tag is empty because it contains no data, but it still * may contain children. */class CECEmptyTag : public CECTag {	public:		CECEmptyTag(ec_tagname_t name) : CECTag(name, 0, NULL, false) {}	protected:		CECEmptyTag(const CECSocket& socket) : CECTag(socket) {}};#endif /* ECTAG_H */// File_checked_for_headers

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -