ecspecialtags.h

来自「wxWidgets写的电驴」· C头文件 代码 · 共 359 行

H
359
字号
//// This file is part of the aMule Project.//// Copyright (c) 2004-2006 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 ECSPECIALTAGS_H#define ECSPECIALTAGS_H#include "Types.h"	// Needed for uint* types#include <wx/string.h>	// Needed for wxString#include "ECCodes.h"	// Needed for EC types#include "ECPacket.h"	// Needed for CECTag#include "MD4Hash.h"	// Needed for CMD4Hash#include "NetworkFunctions.h" // Needed for IsLowID#include "kademlia/utils/UInt128.h" // Need for UInt128#include <map>#include <vector>/* * Specific tags for specific requests * * \note EC remote end does not need to create these packets, * only using the getter functions. * * Regarding this, those classes are removed from remote build, * that have only a constructor. */class CServer;class CKnownFile;class CPartFile;class CSearchFile;class CUpDownClient;/* * EC tags encoder. Idea: if for an object <X>, client <Z> tag <Y> have value equal to previous * request, skip this tag. */class CValueMap {		/*		 * Tag -> LastValue map. Hold last value that transmitted to remote side		 */		std::map<ec_tagname_t, uint8> m_map_uint8;		std::map<ec_tagname_t, uint16> m_map_uint16;		std::map<ec_tagname_t, uint32> m_map_uint32;		std::map<ec_tagname_t, uint64> m_map_uint64;		std::map<ec_tagname_t, CMD4Hash> m_map_md4;		std::map<ec_tagname_t, wxString> m_map_string;				template <class T>		void CreateTagT(ec_tagname_t tagname, T value, std::map<ec_tagname_t, T> &map, CECTag *parent)		{			if ( (map.count(tagname) == 0) || (map[tagname] != value) ) {				parent->AddTag(CECTag(tagname, value));				map[tagname] = value;			}		}	public:		CValueMap()		{		}				CValueMap(const CValueMap &valuemap)		{			m_map_uint8 = valuemap.m_map_uint8;			m_map_uint16 = valuemap.m_map_uint16;			m_map_uint32 = valuemap.m_map_uint32;			m_map_uint64 = valuemap.m_map_uint64;			m_map_md4 = valuemap.m_map_md4;			m_map_string = valuemap.m_map_string;		}				~CValueMap()		{		}				void CreateTag(ec_tagname_t tagname, uint8 value, CECTag *parent)		{			CreateTagT<uint8>(tagname, value, m_map_uint8, parent);		}				void CreateTag(ec_tagname_t tagname, uint16 value, CECTag *parent)		{			CreateTagT<uint16>(tagname, value, m_map_uint16, parent);		}				void CreateTag(ec_tagname_t tagname, uint32 value, CECTag *parent)		{			CreateTagT<uint32>(tagname, value, m_map_uint32, parent);		}				void CreateTag(ec_tagname_t tagname, uint64 value, CECTag *parent)		{			CreateTagT<uint64>(tagname, value, m_map_uint64, parent);		}				void CreateTag(ec_tagname_t tagname, CMD4Hash value, CECTag *parent)		{			CreateTagT<CMD4Hash>(tagname, value, m_map_md4, parent);		}				void CreateTag(ec_tagname_t tagname, wxString value, CECTag *parent)		{			CreateTagT<wxString>(tagname, value, m_map_string, parent);		}};class CEC_Category_Tag : public CECTag { 	public: 		CEC_Category_Tag(uint32 cat_index, EC_DETAIL_LEVEL detail_level = EC_DETAIL_FULL); 		// for create-upate commands 		CEC_Category_Tag(uint32 cat_index, wxString name, wxString path,			wxString comment, uint32 color, uint8 prio); 		 		void Apply(); 		void Create(); 		 		wxString Name() { return GetTagByNameSafe(EC_TAG_CATEGORY_TITLE)->GetStringData(); } 		wxString Path() { return GetTagByNameSafe(EC_TAG_CATEGORY_PATH)->GetStringData(); } 		wxString Comment() { return GetTagByNameSafe(EC_TAG_CATEGORY_COMMENT)->GetStringData(); } 		uint8 Prio() { return GetTagByNameSafe(EC_TAG_CATEGORY_PRIO)->GetInt8Data(); } 		uint32 Color() { return GetTagByNameSafe(EC_TAG_CATEGORY_COLOR)->GetInt32Data(); } 		};class CEC_Prefs_Packet : public CECPacket { 	public: 		CEC_Prefs_Packet(uint32 selection, EC_DETAIL_LEVEL prefs_detail = EC_DETAIL_FULL, EC_DETAIL_LEVEL cat_details = EC_DETAIL_FULL); 		void Apply();};class CEC_Server_Tag : public CECTag { 	public: 		CEC_Server_Tag(const CServer *, EC_DETAIL_LEVEL); 		 		wxString ServerName() { return GetTagByNameSafe(EC_TAG_SERVER_NAME)->GetStringData(); } 		wxString ServerDesc() { return GetTagByNameSafe(EC_TAG_SERVER_DESC)->GetStringData(); } 		uint8 GetPrio() { return GetTagByNameSafe(EC_TAG_SERVER_PRIO)->GetInt8Data(); } 		uint8 GetStatic() { return GetTagByNameSafe(EC_TAG_SERVER_STATIC)->GetInt8Data(); } 		uint32 GetPing() { return GetTagByNameSafe(EC_TAG_SERVER_PING)->GetInt32Data(); } 		uint8 GetFailed() { return GetTagByNameSafe(EC_TAG_SERVER_FAILED)->GetInt8Data(); } 		uint32 GetFiles() { return GetTagByNameSafe(EC_TAG_SERVER_FILES)->GetInt32Data(); } 		uint32 GetUsers() { return GetTagByNameSafe(EC_TAG_SERVER_USERS)->GetInt32Data(); } 		uint32 GetMaxUsers() { return GetTagByNameSafe(EC_TAG_SERVER_USERS_MAX)->GetInt32Data(); } 		 		// we're not using incremental update on server list, 		// but template code needs it 		uint32 ID() { return 0; }};class CEC_ConnState_Tag : public CECTag { 	public: 		CEC_ConnState_Tag(EC_DETAIL_LEVEL);		uint32	GetEd2kId()		{ return GetTagByNameSafe(EC_TAG_ED2K_ID)->GetInt32Data(); } 		bool	HasLowID()		{ return GetEd2kId() < HIGHEST_LOWID_ED2K_KAD; } 		bool	IsConnected()		const { return IsConnectedED2K() || IsConnectedKademlia(); } 		bool	IsConnectedED2K()	const { return (GetInt8Data() & 0x01); } 		bool	IsConnectingED2K()	const { return (GetInt8Data() & 0x02); }		bool	IsConnectedKademlia()	const { return (GetInt8Data() & 0x04); }		bool	IsKadFirewalled()	const { return (GetInt8Data() & 0x08); }		bool	IsKadRunning()	const { return (GetInt8Data() & 0x10); }};class CEC_PartFile_Tag : public CECTag { 	public: 		CEC_PartFile_Tag(CPartFile *file, EC_DETAIL_LEVEL detail_level);		CEC_PartFile_Tag(CPartFile *file, CValueMap &valuemap); 				// template needs it		CMD4Hash		ID()	{ return GetMD4Data(); } 		CMD4Hash	FileHash()	{ return GetMD4Data(); }		wxString	FileHashString() { return GetMD4Data().Encode(); } 		wxString	FileName()	{ return GetTagByNameSafe(EC_TAG_PARTFILE_NAME)->GetStringData(); } 		uint32		SizeFull()	{ return GetTagByNameSafe(EC_TAG_PARTFILE_SIZE_FULL)->GetInt32Data(); } 		uint32		SizeXfer()	{ return GetTagByNameSafe(EC_TAG_PARTFILE_SIZE_XFER)->GetInt32Data(); }  		uint32		SizeDone()	{ return GetTagByNameSafe(EC_TAG_PARTFILE_SIZE_DONE)->GetInt32Data(); } 		wxString	FileEd2kLink()	{ return GetTagByNameSafe(EC_TAG_PARTFILE_ED2K_LINK)->GetStringData(); } 		uint8		FileStatus()	{ return GetTagByNameSafe(EC_TAG_PARTFILE_STATUS)->GetInt8Data(); }  		uint16		SourceCount()	{ return GetTagByNameSafe(EC_TAG_PARTFILE_SOURCE_COUNT)->GetInt16Data(); }  		uint16		SourceNotCurrCount()	{ return GetTagByNameSafe(EC_TAG_PARTFILE_SOURCE_COUNT_NOT_CURRENT)->GetInt32Data(); }  		uint16		SourceXferCount()	{ return GetTagByNameSafe(EC_TAG_PARTFILE_SOURCE_COUNT_XFER)->GetInt16Data(); }  		uint16		SourceCountA4AF()	{ return GetTagByNameSafe(EC_TAG_PARTFILE_SOURCE_COUNT_A4AF)->GetInt16Data(); }  		uint32		Speed()		{ return GetTagByNameSafe(EC_TAG_PARTFILE_SPEED)->GetInt32Data(); }  		uint8		Prio()		{ return GetTagByNameSafe(EC_TAG_PARTFILE_PRIO)->GetInt8Data(); } 		uint8		FileCat()	{ return GetTagByNameSafe(EC_TAG_PARTFILE_CAT)->GetInt8Data(); }		time_t		LastSeenComplete() { return (time_t)GetTagByNameSafe(EC_TAG_PARTFILE_LAST_SEEN_COMP)->GetInt32Data(); }		wxString	PartMetName()			{				CECTag* tmp = GetTagByName(EC_TAG_PARTFILE_PARTMETID);				if (tmp) {					return wxString::Format(wxT("%03u.part.met"), tmp->GetInt16Data());				} else {					return wxEmptyString;				}			}				void SetSizeXfer(uint32 &value) { AssignIfExist(EC_TAG_PARTFILE_SIZE_XFER, value); }		void SetSizeDone(uint32 &value) { AssignIfExist(EC_TAG_PARTFILE_SIZE_DONE, value); }		void SetFileEd2kLink(uint32 &value) { AssignIfExist(EC_TAG_PARTFILE_ED2K_LINK, value); }		void SetFileStatus(uint8 &value) { AssignIfExist(EC_TAG_PARTFILE_STATUS, value); }		void SetSourceCount(uint16 &value) { AssignIfExist(EC_TAG_PARTFILE_SOURCE_COUNT, value); }		void SetSourceNotCurrCount(uint32 &value) { AssignIfExist(EC_TAG_PARTFILE_SOURCE_COUNT_NOT_CURRENT, value); }		void SetSourceXferCount(uint16 &value) { AssignIfExist(EC_TAG_PARTFILE_SOURCE_COUNT_XFER, value); }		void SetSourceCountA4AF(uint16 &value) { AssignIfExist(EC_TAG_PARTFILE_SOURCE_COUNT_A4AF, value); }		void SetSpeed(uint32 &value) { AssignIfExist(EC_TAG_PARTFILE_SPEED, value); }		void SetPrio(uint8 &value) { AssignIfExist(EC_TAG_PARTFILE_PRIO, value); }		void SetFileCat(uint8 &value) { AssignIfExist(EC_TAG_PARTFILE_CAT, value); }		void SetLastSeenComplete(uint32 &value) { AssignIfExist(EC_TAG_PARTFILE_LAST_SEEN_COMP, value); }				wxString	GetFileStatusString();};class CEC_SharedFile_Tag : public CECTag {	public: 		CEC_SharedFile_Tag(const CKnownFile *file, EC_DETAIL_LEVEL detail_level);		CEC_SharedFile_Tag(const CKnownFile *file, CValueMap &valuemap); 				// template needs it 		CMD4Hash	ID()		{ return GetMD4Data(); }		 		CMD4Hash	FileHash()	{ return GetMD4Data(); }		wxString	FileHashString(){ return GetMD4Data().Encode(); } 		wxString	FileName()	{ return GetTagByNameSafe(EC_TAG_PARTFILE_NAME)->GetStringData(); } 		uint32		SizeFull()	{ return GetTagByNameSafe(EC_TAG_PARTFILE_SIZE_FULL)->GetInt32Data(); } 		wxString	FileEd2kLink()	{ return GetTagByNameSafe(EC_TAG_PARTFILE_ED2K_LINK)->GetStringData(); }  		uint8		Prio()		{ return GetTagByNameSafe(EC_TAG_PARTFILE_PRIO)->GetInt8Data(); } 		uint16		GetRequests()	{ return GetTagByNameSafe(EC_TAG_KNOWNFILE_REQ_COUNT)->GetInt16Data(); } 		uint16		GetAllRequests()	{ return GetTagByNameSafe(EC_TAG_KNOWNFILE_REQ_COUNT_ALL)->GetInt16Data(); } 		uint16		GetAccepts()	{ return GetTagByNameSafe(EC_TAG_KNOWNFILE_ACCEPT_COUNT)->GetInt16Data(); } 		uint16		GetAllAccepts()	{ return GetTagByNameSafe(EC_TAG_KNOWNFILE_ACCEPT_COUNT_ALL)->GetInt16Data(); } 		uint64		GetXferred()	{ return GetTagByNameSafe(EC_TAG_KNOWNFILE_XFERRED)->GetInt64Data(); } 		uint64		GetAllXferred()	{ return GetTagByNameSafe(EC_TAG_KNOWNFILE_XFERRED_ALL)->GetInt64Data(); } 		 		void SetPrio(uint8 &val) { AssignIfExist(EC_TAG_PARTFILE_PRIO, val); } 		 		void SetRequests(uint16 &val) { AssignIfExist(EC_TAG_KNOWNFILE_REQ_COUNT, val); } 		void SetAllRequests(uint32 &val) { AssignIfExist(EC_TAG_KNOWNFILE_REQ_COUNT_ALL, val); } 		 		void SetAccepts(uint16 &val) { AssignIfExist(EC_TAG_KNOWNFILE_ACCEPT_COUNT, val); } 		void SetAllAccepts(uint32 &val) { AssignIfExist(EC_TAG_KNOWNFILE_ACCEPT_COUNT_ALL, val); } 		 		void SetXferred(uint64 &val) { AssignIfExist(EC_TAG_KNOWNFILE_XFERRED, val); } 		void SetAllXferred(uint64 &val) { AssignIfExist(EC_TAG_KNOWNFILE_XFERRED_ALL, val); }};class CEC_UpDownClient_Tag : public CECTag {	public:		CEC_UpDownClient_Tag(const CUpDownClient* client, EC_DETAIL_LEVEL detail_level);		CEC_UpDownClient_Tag(const CUpDownClient* client, CValueMap &valuemap);		uint32 ID() { return GetInt32Data(); }		 		CMD4Hash FileID() { return GetTagByNameSafe(EC_TAG_KNOWNFILE)->GetMD4Data(); } 		CMD4Hash UserID() { return GetTagByNameSafe(EC_TAG_CLIENT_HASH)->GetMD4Data(); } 		 		bool HaveFile() { return GetTagByName(EC_TAG_KNOWNFILE) != NULL; } 		wxString ClientName() { return GetTagByNameSafe(EC_TAG_CLIENT_NAME)->GetStringData(); } 		uint32 SpeedUp() { return GetTagByNameSafe(EC_TAG_CLIENT_UP_SPEED)->GetInt32Data(); } 		uint32 SpeedDown() { return GetTagByNameSafe(EC_TAG_CLIENT_DOWN_SPEED)->GetInt32Data(); } 		 		uint64 XferUp() { return GetTagByNameSafe(EC_TAG_CLIENT_UPLOAD_TOTAL)->GetInt64Data(); }; 		uint64 XferDown() { return GetTagByNameSafe(EC_TAG_CLIENT_DOWNLOAD_TOTAL)->GetInt64Data(); } 		uint32 XferUpSession() { return GetTagByNameSafe(EC_TAG_CLIENT_UPLOAD_SESSION)->GetInt32Data(); } 		 		bool IsFriend() { return (GetTagByName(EC_TAG_CLIENT_FRIEND) != 0); } 		 		uint8 ClientSoftware() { return GetTagByNameSafe(EC_TAG_CLIENT_SOFTWARE)->GetInt8Data(); } 		 		uint8 ClientState() { return GetTagByNameSafe(EC_TAG_CLIENT_STATE)->GetInt16Data(); } 		 		uint32 WaitTime() { return GetTagByNameSafe(EC_TAG_CLIENT_WAIT_TIME)->GetInt32Data(); } 		uint32 XferTime() { return GetTagByNameSafe(EC_TAG_CLIENT_XFER_TIME)->GetInt32Data(); } 		uint32 LastReqTime() { return GetTagByNameSafe(EC_TAG_CLIENT_LAST_TIME)->GetInt32Data(); } 		uint32 QueueTime() { return GetTagByNameSafe(EC_TAG_CLIENT_QUEUE_TIME)->GetInt32Data(); }		uint8 GetSourceFrom() { return GetTagByNameSafe(EC_TAG_CLIENT_FROM)->GetInt8Data(); }};class CEC_SearchFile_Tag : public CECTag {	public:		CEC_SearchFile_Tag(CSearchFile *file, EC_DETAIL_LEVEL detail_level);		CEC_SearchFile_Tag(CSearchFile *file, CValueMap &valuemap);		// template needs it 		CMD4Hash	ID()	{ return GetMD4Data(); } 		CMD4Hash	FileHash()	{ return GetMD4Data(); }		wxString	FileHashString() { return GetMD4Data().Encode(); } 		wxString	FileName()	{ return GetTagByNameSafe(EC_TAG_PARTFILE_NAME)->GetStringData(); } 		uint32		SizeFull()	{ return GetTagByNameSafe(EC_TAG_PARTFILE_SIZE_FULL)->GetInt32Data(); }  		uint32		SourceCount()	{ return GetTagByNameSafe(EC_TAG_PARTFILE_SOURCE_COUNT)->GetInt32Data(); }  		uint32		CompleteSourceCount()	{ return GetTagByNameSafe(EC_TAG_PARTFILE_SOURCE_COUNT_XFER)->GetInt32Data(); }  		bool		AlreadyHave()	{ return GetTagByName(EC_TAG_KNOWNFILE) != 0; }};class CEC_Search_Tag : public CECTag {	public:		// search request		CEC_Search_Tag(wxString &name, EC_SEARCH_TYPE search_type, wxString &file_type,			wxString &extension, uint32 avail, uint32 min_size, uint32 max_size);					wxString SearchText() { return GetTagByNameSafe(EC_TAG_SEARCH_NAME)->GetStringData(); }		EC_SEARCH_TYPE SearchType() { return (EC_SEARCH_TYPE)GetInt32Data(); }		uint32 MinSize() { return GetTagByNameSafe(EC_TAG_SEARCH_MIN_SIZE)->GetInt32Data(); }		uint32 MaxSize() { return GetTagByNameSafe(EC_TAG_SEARCH_MAX_SIZE)->GetInt32Data(); }		uint32 Avail() { return GetTagByNameSafe(EC_TAG_SEARCH_AVAILABILITY)->GetInt32Data(); }		wxString SearchExt() { return GetTagByNameSafe(EC_TAG_SEARCH_EXTENSION)->GetStringData(); }		wxString SearchFileType() { return GetTagByNameSafe(EC_TAG_SEARCH_FILE_TYPE)->GetStringData(); }};class CEC_StatTree_Node_Tag : public CECTag {	public:		CEC_StatTree_Node_Tag();	// just to keep compiler happy		wxString GetDisplayString() const;};#endif /* ECSPEACIALTAGS_H */

⌨️ 快捷键说明

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