|
From: <bo...@us...> - 2003-12-09 00:16:34
|
Update of /cvsroot/sharedaemon/core/src
In directory sc8-pr-cvs1:/tmp/cvs-serv4491
Modified Files:
ParseClass.cpp ParseClass.h parse-ed2k.c test.cpp
Log Message:
Initial write support for ParseClass
Index: ParseClass.cpp
===================================================================
RCS file: /cvsroot/sharedaemon/core/src/ParseClass.cpp,v
retrieving revision 1.11
retrieving revision 1.12
diff -u -d -r1.11 -r1.12
--- ParseClass.cpp 26 Nov 2003 02:03:36 -0000 1.11
+++ ParseClass.cpp 9 Dec 2003 00:16:29 -0000 1.12
@@ -631,6 +631,10 @@
return true;
}
+bool ParseClass::Read(const Ed2kPacket & p) {
+ return Read(p.GetPtr(),p.GetSize());
+}
+
bool ParseClass::Read(FILE * file) {
/*
* ISO/IEC 9899:1999 (E) §7.19.9.2(3)
@@ -684,6 +688,88 @@
rc=Read(file);
fclose(file);
+
+ return rc;
+}
+
+bool ParseClass::Write(u8 * * buffer,size_t * buffsize) const {
+
+}
+
+bool ParseClass::Write(Ed2kPacket & p,u8 protocol,u8 opcode) const {
+ u8 * buffer;
+ size_t buffsize;
+
+ if (!Write(&buffer,&buffsize)) {
+ return false;
+ }
+
+ p.SetData(protocol,opcode,buffsize,buffer);
+
+ delete buffer;
+
+ return true;
+}
+
+bool ParseClass::Write(FILE * file) const {
+ u8 * buffer;
+ size_t buffsize;
+
+ if (!Write(&buffer,&buffsize)) {
+ return false;
+ }
+
+ if (fwrite(buffer,1,buffsize,file) != buffsize) {
+ return false;
+ }
+
+ delete buffer;
+
+ return true;
+}
+
+bool ParseClass::Write(const char * filename) const {
+ bool rc;
+ FILE * file;
+ char * othername;
+ int sl;
+
+ sl=strlen(filename);
+ othername=new char[sl+5];
+ strcpy(othername,filename);
+
+ strcpy(othername+sl,".new");
+ file=fopen(othername,"wb");
+ if (!file) {
+ delete othername;
+ return false;
+ }
+
+ rc=Write(file);
+
+ fclose(file);
+
+ if (rc) {
+ strcpy(othername+sl,".bak");
+ unlink(othername);
+ if (rename(filename,othername)) {
+ if (errno!=ENOENT) {
+ delete othername;
+ return false;
+ }
+ }
+ strcpy(othername+sl,".new");
+ if (rename(othername,filename)) {
+ if (errno!=ENOENT) {
+ delete othername;
+ return false;
+ }
+ }
+ } else {
+ unlink(othername);
+ }
+
+ delete othername;
return rc;
}
Index: ParseClass.h
===================================================================
RCS file: /cvsroot/sharedaemon/core/src/ParseClass.h,v
retrieving revision 1.10
retrieving revision 1.11
diff -u -d -r1.10 -r1.11
--- ParseClass.h 26 Nov 2003 01:22:56 -0000 1.10
+++ ParseClass.h 9 Dec 2003 00:16:29 -0000 1.11
@@ -38,6 +38,7 @@
#include "util.h"
#include "mprintf.h"
#include "parse-ed2k.h"
+#include "Ed2kPacket.h"
#include <cassert>
#include <cstdarg>
@@ -59,21 +60,21 @@
* Special care must be taken on BYTE and CHAR as one cannot distinquished
* between them. Thus GetTypeID(BYTE) == GetTypeID(CHAR)!
*/
-template <class T> int GetTypeID( T &t ) { generate=error+on+invalid+type; }
-inline int GetTypeID( char &t ) { return CHAR; }
-inline int GetTypeID( unsigned char &t ) { return BYTE; }
-inline int GetTypeID( signed char &t ) { return BYTE; }
-inline int GetTypeID( short &t ) { return WORD; }
-inline int GetTypeID( unsigned short &t ) { return WORD; }
-inline int GetTypeID( long &t ) { return DWORD; }
-inline int GetTypeID( unsigned long &t ) { return DWORD; }
-inline int GetTypeID( int &t ) { return DWORD; }
-inline int GetTypeID( unsigned int &t ) { return DWORD; }
-inline int GetTypeID( range &t ) { return RANGE; }
-inline int GetTypeID( ipport &t ) { return IPPORT; }
-inline int GetTypeID( hash &t ) { return HASH; }
-inline int GetTypeID( tag &t ) { return TAG; }
-inline int GetTypeID( bitmap &t ) { return BITMAP; }
+template <class T> int GetTypeID(const T &t ) { generate=error+on+invalid+type; }
+inline int GetTypeID(const char &t ) { return CHAR; }
+inline int GetTypeID(const unsigned char &t ) { return BYTE; }
+inline int GetTypeID(const signed char &t ) { return BYTE; }
+inline int GetTypeID(const short &t ) { return WORD; }
+inline int GetTypeID(const unsigned short &t ) { return WORD; }
+inline int GetTypeID(const long &t ) { return DWORD; }
+inline int GetTypeID(const unsigned long &t ) { return DWORD; }
+inline int GetTypeID(const int &t ) { return DWORD; }
+inline int GetTypeID(const unsigned int &t ) { return DWORD; }
+inline int GetTypeID(const range &t ) { return RANGE; }
+inline int GetTypeID(const ipport &t ) { return IPPORT; }
+inline int GetTypeID(const hash &t ) { return HASH; }
+inline int GetTypeID(const tag &t ) { return TAG; }
+inline int GetTypeID(const bitmap &t ) { return BITMAP; }
#define ISSTRUCT(x) true
#define ISARRAY(x) true
@@ -224,20 +225,42 @@
size_t IncrementalReadNonArray(const u8 * buffer,size_t buffsize);
size_t IncrementalReadArray(const u8 * buffer,size_t buffsize);
- template <class D,class S> void Cast(D & dst,const S & src) const {
+ template <class D,class S> void GetCast(D & dst,const S & src) const {
fprintf(stderr,"%s:%s:%i: FATAL: Cannot cast types.\n"
,__FILE__,__FUNCTION__,__LINE__
);
abort();
}
- void Cast(unsigned long & dst,const u16 & src) const { dst=src; }
- void Cast(unsigned int & dst,const u16 & src) const { dst=src; }
- void Cast(unsigned short & dst,const u16 & src) const { dst=src; }
+ template <class S,class D> void SetCast(const S & src,D & dst) const {
+ fprintf(stderr,"%s:%s:%i: FATAL: Cannot cast types.\n"
+ ,__FILE__,__FUNCTION__,__LINE__
+ );
+ abort();
+ }
- void Cast(unsigned long & dst,const u8 & src) const { dst=src; }
- void Cast(unsigned int & dst,const u8 & src) const { dst=src; }
- void Cast(unsigned short & dst,const u8 & src) const { dst=src; }
+ void GetCast(unsigned long & dst,const u16 & src) const { dst=src; }
+ void GetCast(unsigned int & dst,const u16 & src) const { dst=src; }
+ void GetCast(unsigned short & dst,const u16 & src) const { dst=src; }
+
+ void GetCast(unsigned long & dst,const u8 & src) const { dst=src; }
+ void GetCast(unsigned int & dst,const u8 & src) const { dst=src; }
+ void GetCast(unsigned short & dst,const u8 & src) const { dst=src; }
+
+ void SetCast(const unsigned long & src,u32 & dst) const { dst=src; }
+ void SetCast(const unsigned int & src,u32 & dst) const { dst=src; }
+ void SetCast(const unsigned short & src,u32 & dst) const { dst=src; }
+ void SetCast(const unsigned char & src,u32 & dst) const { dst=src; }
+
+/*
+ void SetCast(const unsigned long & src,u16 & dst) const { dst=src; }
+ void SetCast(const unsigned int & src,u16 & dst) const { dst=src; }
+ void SetCast(const unsigned short & src,u16 & dst) const { dst=src; }
+
+ void SetCast(const unsigned long & src,u8 & dst) const { dst=src; }
+ void SetCast(const unsigned int & src,u8 & dst) const { dst=src; }
+ void SetCast(const unsigned short & src,u8 & dst) const { dst=src; }
+*/
/*
inline int GetTypeID( char &t ) { return CHAR; }
@@ -285,22 +308,21 @@
if (!struc && !array) {
void * ptr=data+size*index+ps->offset;
+ int tid=GetTypeID(var);
- if (GetTypeID(var) == ps->type_id) {
+ if (tid == ps->type_id) {
var=*(T*)ptr;
} else {
- int tid=GetTypeID(var);
-
switch (ps->type_id) {
case WORD:
if (tid==DWORD) {
- Cast(var,*(u16*)ptr);
+ GetCast(var,*(u16*)ptr);
return;
}
break;
case BYTE:
if (tid==DWORD || tid==WORD) {
- Cast(var,*(u8 *)ptr);
+ GetCast(var,*(u8 *)ptr);
return;
}
break;
@@ -360,21 +382,74 @@
}
if (!struc && !array) {
- *(T*)(data+size*index+ps->offset)=var;
- ParseClass * PC=*(ParseClass**)
- (data+size*(index+1)-sizeof(ParseClass*));
- PC+=ps->first_referer;
- i=ps->num_referer;
- do {
- (*(PC++)).Resize(var);
- } while (--i);
+ void * ptr;
+ int tid;
+ u32 val;
+ bool resize;
+
+ ptr=data+size*index+ps->offset;
+ tid=GetTypeID(var);
+ resize=false;
+
+ if (tid == ps->type_id) {
+ *(T*)ptr=var;
+
+ if (tid == DWORD || tid == WORD || tid == BYTE) {
+ resize = true;
+ SetCast(var,val);
+ }
+ } else {
+ switch (ps->type_id) {
+ case WORD:
+ if (tid==DWORD) {
+ SetCast(var,val);
+ *(u16*)ptr=*(u16*)&val;
+ resize = true;
+ }
+ break;
+ case BYTE:
+ if (tid==DWORD || tid==WORD) {
+ SetCast(var,val);
+ *(u8*)ptr=*(u8*)&val;
+ resize = true;
+ }
+ break;
+ default:
+ /* nothing to do here */
+ break;
+ }
+
+ if (!resize) {
+ fprintf(stderr,
+ "%s:%s:%i: FATAL: Type doesn "
+ "not match. %s was expected "
+ "but %s was given\n"
+ ,__FILE__,__FUNCTION__,__LINE__
+ ,::type[ps->type_id].type_name
+ ,tid>=0
+ ?::type[tid].type_name
+ :"<special>"
+ );
+ abort();
+ }
+ }
+
+ if (resize) {
+ ParseClass * * PC=FirstParseClassPointer(index);
+
+ PC+=ps->first_referer;
+ i=ps->num_referer;
+ while (i--) {
+ (*(PC++))->Resize(val);
+ }
+ }
} else {
- ParseClass * PC=*(ParseClass**)
- (data+size*(index+1)-sizeof(ParseClass*));
+ ParseClass * * PC=FirstParseClassPointer(index);
+
if (struc) {
- PC[ps->referer_id].Set(var,next_index,subexpr);
+ PC[ps->referer_id]->Set(var,next_index,subexpr);
} else {
- *(T*)(PC->data+PC->size*next_index)=var;
+ *(T*)(PC[ps->referer_id]->data+PC[ps->referer_id]->size*next_index)=var;
/*
* An array MUST NOT be used as subscript, so
* we don't need to take care about that here.
@@ -418,11 +493,13 @@
bool Read(const u8 * buffer,size_t buffsize);
bool Read(FILE * file);
bool Read(const char * filename);
+ bool Read(const Ed2kPacket & p);
// *buffsize=(size_t)-1 means error
bool Write(u8 * * buffer,size_t * buffsize) const;
bool Write(FILE * file) const;
bool Write(const char * filename) const;
+ bool Write(Ed2kPacket & p,u8 protocol,u8 opcode) const;
/*
struct bitmap Bitmap(const char * varname_fmt,...) PRINTF_FORMAT;
Index: parse-ed2k.c
===================================================================
RCS file: /cvsroot/sharedaemon/core/src/parse-ed2k.c,v
retrieving revision 1.14
retrieving revision 1.15
diff -u -d -r1.14 -r1.15
--- parse-ed2k.c 26 Nov 2003 01:22:56 -0000 1.14
+++ parse-ed2k.c 9 Dec 2003 00:16:29 -0000 1.15
@@ -72,6 +72,7 @@
int ClientClient:1;
u8 command;
char * name;
+ char * altname;
struct parsestruct * element;
char * format;
};
@@ -95,15 +96,15 @@
// | | | | | | +-- Client <-> Client
// Client <-> Server
#define LOGINREQUEST 0x01 // mlDonkey adds a DWORD with content: 'MLDK' // <DWORD>tagcount<TAG>tag[tagcount] // <BYTE>magic=0x10
- { 1,0,0,0,0,0,0,PROT_NAME(LOGINREQUEST) ,NULL,"<HASH>user_hash<IPPORT>client_address=0,0<DWORD>tagcount<TAG>tag[tagcount]<IPPORT>server_address<DWORD>*software_id=1262767181" },
+ { 1,0,0,0,0,1,0,PROT_NAME(LOGINREQUEST) ,"cse301",NULL,"<HASH>user_hash<IPPORT>client_address=0,0<DWORD>tagcount<TAG>tag[tagcount]<IPPORT>server_address<DWORD>*software_id=1262767181" },
#define REJECT 0x05
- { 1,0,0,0,0,0,0,PROT_NAME(REJECT) ,NULL,"" },
+ { 1,0,0,0,0,0,0,PROT_NAME(REJECT) ,"cse305",NULL,"" },
#define GETSERVERLIST 0x14
- { 1,0,0,0,0,0,0,PROT_NAME(GETSERVERLIST) ,NULL,"" },
+ { 1,0,0,0,0,0,0,PROT_NAME(GETSERVERLIST) ,"cse314",NULL,"" },
#define OFFERFILES 0x15
- { 1,0,0,0,0,0,0,PROT_NAME(OFFERFILES) ,NULL,"<DWORD>file_count{<HASH>hash<IPPORT>source<DWORD>tagcount<TAG>tag[tagcount]}file[file_count]" },
+ { 1,0,0,0,0,0,0,PROT_NAME(OFFERFILES) ,"cse315",NULL,"<DWORD>filecount{<HASH>hash<IPPORT>source<DWORD>tagcount<TAG>tag[tagcount]}file[filecount]" },
#define SEARCHREQUEST 0x16
-// { 1,0,0,0,0,0,0,PROT_NAME(SEARCHREQUEST) ,NULL,"<Query_Tree>query" },
+// { 1,0,0,0,0,0,0,PROT_NAME(SEARCHREQUEST) ,"cse316",NULL,"<Query_Tree>query" },
/*
Local search for "Bodo sucht für tcpdump"
@@ -130,188 +131,188 @@
*/
#define DISCONNECT 0x18 // (not verified)
- { 1,0,0,0,0,0,0,PROT_NAME(DISCONNECT) ,NULL,"" },
+ { 1,0,0,0,0,0,0,PROT_NAME(DISCONNECT) ,"cse318",NULL,"" },
#define GETSOURCES 0x19
- { 1,0,0,0,0,0,0,PROT_NAME(GETSOURCES) ,NULL,"<HASH>file_hash" },
+ { 1,0,0,0,0,0,0,PROT_NAME(GETSOURCES) ,"cse319",NULL,"<HASH>file_hash" },
#define SEARCH_USER 0x1A
-// { 1,0,0,0,0,0,0,PROT_NAME(SEARCH_USER) ,NULL,"<Query_Tree>query" },
+// { 1,0,0,0,0,0,0,PROT_NAME(SEARCH_USER) ,"cse31a",NULL,"<Query_Tree>query" },
// Maybe there is a 0x1b too
// CONFORMING TO "eDonkey-protocol-0.6.1"
#define CALLBACKREQUEST 0x1C // <ID 4>
- { 1,0,0,0,0,0,0,PROT_NAME(CALLBACKREQUEST) ,NULL,"<DWORD>LowID_client_ip" },
+ { 1,0,0,0,0,0,0,PROT_NAME(CALLBACKREQUEST) ,"cse31c",NULL,"<DWORD>LowID_client_ip" },
// Maybe there is a 0x20 too
// CONFORMING TO "eDonkey-protocol-0.6.1" : Exception in Connection::doTask 25 for 16.39
#define QUERY_MORE_RESULT 0x21
- { 1,0,0,0,0,0,0,PROT_NAME(QUERY_MORE_RESULT) ,NULL,"" },
+ { 1,0,0,0,0,0,0,PROT_NAME(QUERY_MORE_RESULT) ,"cse321",NULL,"" },
#define SERVERLIST 0x32 // Server -> Client
- { 1,0,0,0,0,0,0,PROT_NAME(SERVERLIST) ,NULL,"<BYTE>server_count<IPPORT>server[server_count]" },
+ { 1,0,0,0,0,0,0,PROT_NAME(SERVERLIST) ,"cse332",NULL,"<BYTE>server_count<IPPORT>server[server_count]" },
#define SEARCHRESULT 0x33
- { 1,0,0,0,0,0,0,PROT_NAME(SEARCHRESULT) ,NULL,"<DWORD>num_results{<HASH>hash<IPPORT>ipport<DWORD>tag_count<TAG>tag[tag_count]}user[num_results]<DWORD>unknown1<DWORD>unknown2" },
+ { 1,0,0,0,0,0,0,PROT_NAME(SEARCHRESULT) ,"cse333",NULL,"<DWORD>num_results{<HASH>hash<IPPORT>ipport<DWORD>tag_count<TAG>tag[tag_count]}user[num_results]<DWORD>unknown1<DWORD>unknown2" },
#define SERVERSTATUS 0x34
- { 1,0,0,0,0,0,0,PROT_NAME(SERVERSTATUS) ,NULL,"<DWORD>user_count<DWORD>file_count" },
+ { 1,0,0,0,0,0,0,PROT_NAME(SERVERSTATUS) ,"cse334",NULL,"<DWORD>user_count<DWORD>file_count" },
#define CALLBACKREQUESTED 0x35
- { 1,0,0,0,0,0,0,PROT_NAME(CALLBACKREQUESTED) ,NULL,"<IPPORT>HighID_client_ip" },
+ { 1,0,0,0,0,0,0,PROT_NAME(CALLBACKREQUESTED) ,"cse335",NULL,"<IPPORT>HighID_client_ip" },
#define CALLBACK_FAIL 0x36
- { 1,0,0,0,0,0,0,PROT_NAME(CALLBACK_FAIL) ,NULL,"<DWORD>client_id" },
+ { 1,0,0,0,0,0,0,PROT_NAME(CALLBACK_FAIL) ,"cse336",NULL,"<DWORD>client_id" },
#define SERVERMESSAGE 0x38
- { 1,0,0,0,0,0,0,PROT_NAME(SERVERMESSAGE) ,NULL,"<WORD>message_len<CHAR>message[message_len]" },
+ { 1,0,0,0,0,0,0,PROT_NAME(SERVERMESSAGE) ,"cse338",NULL,"<WORD>message_len<CHAR>message[message_len]" },
#define IDCHANGE 0x40
- { 1,0,0,0,0,0,0,PROT_NAME(IDCHANGE) ,NULL,"<DWORD>new_id" },
+ { 1,0,0,0,0,0,0,PROT_NAME(IDCHANGE) ,"cse340",NULL,"<DWORD>new_id" },
#define SERVERIDENT 0x41
- { 1,0,0,0,0,0,0,PROT_NAME(SERVERIDENT) ,NULL,"<HASH>server_hash<IPPORT>server_address<DWORD>tag_count<TAG>tag[tag_count]" },
+ { 1,0,0,0,0,0,0,PROT_NAME(SERVERIDENT) ,"cse341",NULL,"<HASH>server_hash<IPPORT>server_address<DWORD>tag_count<TAG>tag[tag_count]" },
#define FOUNDSOURCES 0x42
- { 1,0,0,0,0,0,0,PROT_NAME(FOUNDSOURCES) ,NULL,"<HASH>file_hash<BYTE>source_count<IPPORT>source_address[source_count]" },
+ { 1,0,0,0,0,0,0,PROT_NAME(FOUNDSOURCES) ,"cse342",NULL,"<HASH>file_hash<BYTE>source_count<IPPORT>source_address[source_count]" },
#define USERS_LIST 0x43
- { 1,0,0,0,0,0,0,PROT_NAME(USERS_LIST) ,NULL,"<DWORD>user_count{<HASH>hash<IPPORT>address<TAG>name}user[user_count]" },
+ { 1,0,0,0,0,0,0,PROT_NAME(USERS_LIST) ,"cse343",NULL,"<DWORD>user_count{<HASH>hash<IPPORT>address<TAG>name}user[user_count]" },
#define QUERY_CHATS 0x1D // (deprecated not supported by server any longer)
-// { 1,0,0,0,0,0,0,PROT_NAME(QUERY_CHATS) ,NULL,"DEPRECATED" },
+// { 1,0,0,0,0,0,0,PROT_NAME(QUERY_CHATS) ,"cse31d",NULL,"DEPRECATED" },
#define CHAT_MESSAGE 0x1E // (deprecated not supported by server any longer)
-// { 1,0,0,0,0,0,0,PROT_NAME(CHAT_MESSAGE) ,NULL,"DEPRECATED" },
+// { 1,0,0,0,0,0,0,PROT_NAME(CHAT_MESSAGE) ,"cse31e",NULL,"DEPRECATED" },
#define JOIN_ROOM 0x1F // (deprecated not supported by server any longer)
-// { 1,0,0,0,0,0,0,PROT_NAME(JOIN_ROOM) ,NULL,"DEPRECATED" },
+// { 1,0,0,0,0,0,0,PROT_NAME(JOIN_ROOM) ,"cse31f",NULL,"DEPRECATED" },
#define CHAT_ROOM_REQUEST 0x39 // (deprecated not supported by server any longer)
-// { 1,0,0,0,0,0,0,PROT_NAME(CHAT_ROOM_REQUEST) ,NULL,"DEPRECATED" },
+// { 1,0,0,0,0,0,0,PROT_NAME(CHAT_ROOM_REQUEST) ,"cse339",NULL,"DEPRECATED" },
#define CHAT_BROADCAST 0x3A // (deprecated not supported by server any longer)
-// { 1,0,0,0,0,0,0,PROT_NAME(CHAT_BROADCAST) ,NULL,"DEPRECATED" },
+// { 1,0,0,0,0,0,0,PROT_NAME(CHAT_BROADCAST) ,"cse33a",NULL,"DEPRECATED" },
#define CHAT_USER_JOIN 0x3B // (deprecated not supported by server any longer)
-// { 1,0,0,0,0,0,0,PROT_NAME(CHAT_USER_JOIN) ,NULL,"DEPRECATED" },
+// { 1,0,0,0,0,0,0,PROT_NAME(CHAT_USER_JOIN) ,"cse33b",NULL,"DEPRECATED" },
#define CHAT_USER_LEAVE 0x3C // (deprecated not supported by server any longer)
-// { 1,0,0,0,0,0,0,PROT_NAME(CHAT_USER_LEAVE) ,NULL,"DEPRECATED" },
+// { 1,0,0,0,0,0,0,PROT_NAME(CHAT_USER_LEAVE) ,"cse33c",NULL,"DEPRECATED" },
#define CHAT_USER 0x3D // (deprecated not supported by server any longer)
-// { 1,0,0,0,0,0,0,PROT_NAME(CHAT_USER) ,NULL,"DEPRECATED" },
+// { 1,0,0,0,0,0,0,PROT_NAME(CHAT_USER) ,"cse33d",NULL,"DEPRECATED" },
// client <-> server [UDP]
#define GLOBSERVSTATREQ 0x96
- { 1,0,0,0,0,0,0,PROT_NAME(GLOBSERVSTATREQ) ,NULL,"<WORD>unknown1<WORD>unknown2" },
+ { 1,0,0,0,0,0,0,PROT_NAME(GLOBSERVSTATREQ) ,"cse396",NULL,"<WORD>unknown1<WORD>unknown2" },
// if unknown2==0xaa,0x5a, The respond contains max_users, else not.
-// { 1,0,0,0,0,0,0,PROT_NAME(GLOBSERVSTATRES) ,NULL,"<DWORD>user_count<DWORD>file_count" },
+// { 1,0,0,0,0,0,0,PROT_NAME(GLOBSERVSTATRES) ,"cse396",NULL,"<DWORD>user_count<DWORD>file_count" },
#define GLOBSERVSTATRES 0x97
- { 1,0,0,0,0,0,0,PROT_NAME(GLOBSERVSTATRES) ,NULL,"<WORD>unknown1<WORD>unknown2<DWORD>user_count<DWORD>file_count<DWORD>*max_users" },
+ { 1,0,0,0,0,0,0,PROT_NAME(GLOBSERVSTATRES) ,"cse397",NULL,"<WORD>unknown1<WORD>unknown2<DWORD>user_count<DWORD>file_count<DWORD>*max_users" },
#define GLOBSEARCHREQUEST 0x98
-// { 1,0,0,0,0,0,0,PROT_NAME(GLOBSEARCHREQUEST) ,NULL,"<Search query>" },
+// { 1,0,0,0,0,0,0,PROT_NAME(GLOBSEARCHREQUEST) ,"cse398",NULL,"<Search query>" },
#define GLOBSEARCHRESULT 0x99
- { 1,0,0,0,0,0,0,PROT_NAME(GLOBSEARCHRESULT) ,NULL,"<HASH>hash<IPPORT>dummy<DWORD>tag_count<TAG>tag[tag_count]" },
+ { 1,0,0,0,0,0,0,PROT_NAME(GLOBSEARCHRESULT) ,"cse399",NULL,"<HASH>hash<IPPORT>dummy<DWORD>tag_count<TAG>tag[tag_count]" },
#define GLOBGETSOURCES 0x9A
- { 1,0,0,0,0,0,0,PROT_NAME(GLOBGETSOURCES) ,NULL,"<HASH>file_hash" },
+ { 1,0,0,0,0,0,0,PROT_NAME(GLOBGETSOURCES) ,"cse39a",NULL,"<HASH>file_hash" },
#define GLOBFOUNDSORUCES 0x9B
- { 1,0,0,0,0,0,0,PROT_NAME(GLOBFOUNDSORUCES) ,NULL,"<HASH>file_hash<BYTE>num_peers<IPPORT>peer[num_peers]" },
+ { 1,0,0,0,0,0,0,PROT_NAME(GLOBFOUNDSORUCES) ,"cse39b",NULL,"<HASH>file_hash<BYTE>num_peers<IPPORT>peer[num_peers]" },
#define GLOBCALLBACKREQ 0x9C
- { 1,0,0,0,0,0,0,PROT_NAME(GLOBCALLBACKREQ) ,NULL,"<DWORD>LowID_client_id" },
-#define GLOBCALLBACKFAILED 0x9e // CONFORMING TO "eDonkey-protocol-0.6.1"
- { 1,0,0,0,0,0,0,PROT_NAME(GLOBCALLBACKFAILED) ,NULL,"<DWORD>LowID_client_id" },
+ { 1,0,0,0,0,0,0,PROT_NAME(GLOBCALLBACKREQ) ,"cse39c",NULL,"<DWORD>LowID_client_id" },
+#define GLOBCALLBACKFAILED 0x9E // CONFORMING TO "eDonkey-protocol-0.6.1"
+ { 1,0,0,0,0,0,0,PROT_NAME(GLOBCALLBACKFAILED) ,"cse39e",NULL,"<DWORD>LowID_client_id" },
// Maybe there is a 0xA0 too
// CONFORMING TO "eDonkey-protocol-0.6.1" : Exception in Connection::doTask 25 for 16.39
-#define UDP_SERVERLIST 0xa1 // CONFORMING TO "eDonkey-protocol-0.6.1"
-// { 1,0,0,0,0,0,0,PROT_NAME(UDP_SERVERLIST) ,NULL,"<Address list>" },
+#define UDP_SERVERLIST 0xA1 // CONFORMING TO "eDonkey-protocol-0.6.1"
+// { 1,0,0,0,0,0,0,PROT_NAME(UDP_SERVERLIST) ,"cse3a1",NULL,"<Address list>" },
#define UNKNOWN1 0xA2
- { 1,0,0,0,0,0,0,PROT_NAME(UNKNOWN1) ,NULL,"" },
-#define UDP_SERVERINFO 0xa3 // CONFORMING TO "eDonkey-protocol-0.6.1"
-// { 1,0,0,0,0,0,0,PROT_NAME(UDP_SERVERLIST) ,NULL,"<String>name<String>description" },
+ { 1,0,0,0,0,0,0,PROT_NAME(UNKNOWN1) ,"cse3a2",NULL,"" },
+#define UDP_SERVERINFO 0xA3 // CONFORMING TO "eDonkey-protocol-0.6.1"
+// { 1,0,0,0,0,0,0,PROT_NAME(UDP_SERVERLIST) ,"cse3a3",NULL,"<String>name<String>description" },
#define UNKNOWN2 0xA4
- { 1,0,0,0,0,0,0,PROT_NAME(UNKNOWN2) ,NULL,"" },
+ { 1,0,0,0,0,0,0,PROT_NAME(UNKNOWN2) ,"cse3a4",NULL,"" },
// client <-> client
#define HELLO 0x01
- { 1,0,0,0,0,0,0,PROT_NAME(HELLO) ,NULL,"<BYTE>magic=0x10<HASH>user_hash<IPPORT>address<DWORD>tagcount<TAG>tag[tagcount]<IPPORT>server_address" },
+ { 1,0,0,0,0,0,1,PROT_NAME(HELLO) ,"cce301",NULL,"<BYTE>magic=0x10<HASH>user_hash<IPPORT>address<DWORD>tagcount<TAG>tag[tagcount]<IPPORT>server_address" },
#define SENDINGPART 0x46
- { 1,0,0,0,0,0,0,PROT_NAME(SENDINGPART) ,NULL,"<HASH>file_hash<RANGE>range<BYTE>data[range]" },
+ { 1,0,0,0,0,0,0,PROT_NAME(SENDINGPART) ,"cce346",NULL,"<HASH>file_hash<RANGE>range<BYTE>data[range]" },
#define REQUESTPARTS 0x47 // "<HASH>file_hash<DWORD>start[3]<DWORD>end[3]"
- { 1,0,0,0,0,0,0,PROT_NAME(REQUESTPARTS) ,NULL,"<HASH>file_hash<DWORD>part_1_start<DWORD>part_2_start<DWORD>part_3_start<DWORD>part_1_end<DWORD>part_2_end<DWORD>part_3_end" }, // <HASH>file_hash<DWORD>start[3]<DWORD>end[3]
+ { 1,0,0,0,0,0,0,PROT_NAME(REQUESTPARTS) ,"cce347",NULL,"<HASH>file_hash<DWORD>part_1_start<DWORD>part_2_start<DWORD>part_3_start<DWORD>part_1_end<DWORD>part_2_end<DWORD>part_3_end" }, // <HASH>file_hash<DWORD>start[3]<DWORD>end[3]
#define FILEREQANSNOFIL 0x48
- { 1,0,0,0,0,0,0,PROT_NAME(FILEREQANSNOFIL) ,NULL,"<HASH>file_hash" },
+ { 1,0,0,0,0,0,0,PROT_NAME(FILEREQANSNOFIL) ,"cce348",NULL,"<HASH>file_hash" },
#define END_OF_DOWNLOAD 0x49
- { 1,0,0,0,0,0,0,PROT_NAME(END_OF_DOWNLOAD) ,NULL,"<HASH>file_hash" },
+ { 1,0,0,0,0,0,0,PROT_NAME(END_OF_DOWNLOAD) ,"cce349",NULL,"<HASH>file_hash" },
#define ASKSHAREDFILES 0x4A
- { 1,0,0,0,0,0,0,PROT_NAME(ASKSHAREDFILES) ,NULL,"" },
+ { 1,0,0,0,0,0,0,PROT_NAME(ASKSHAREDFILES) ,"cce34a",NULL,"" },
#define ASKSHAREDFILESANSWER 0x4B // ? "<DWORD>file_count{<HASH>file<TAG>name}file[file_count]" },
- { 1,0,0,0,0,0,0,PROT_NAME(ASKSHAREDFILESANSWER) ,NULL,"<DWORD>file_count{<IPPORT>address<TAG>name}file[file_count]" },
-#define HELLOANSWER 0x4c
- { 1,0,0,0,0,0,0,PROT_NAME(HELLOANSWER) ,NULL,"<HASH>user_hash<IPPORT>user<DWORD>tagcount<TAG>tag[tagcount]<IPPORT>server" },
+ { 1,0,0,0,0,0,0,PROT_NAME(ASKSHAREDFILESANSWER) ,"cce34b",NULL,"<DWORD>file_count{<IPPORT>address<TAG>name}file[file_count]" },
+#define HELLOANSWER 0x4C
+ { 1,0,0,0,0,0,0,PROT_NAME(HELLOANSWER) ,"cce34c",NULL,"<HASH>user_hash<IPPORT>user<DWORD>tagcount<TAG>tag[tagcount]<IPPORT>server" },
#define CHANGE_CLIENT_ID 0x4D
- { 1,0,0,0,0,0,0,PROT_NAME(CHANGE_CLIENT_ID) ,NULL,"<DWORD>old_id<DWORD>new_id" },
+ { 1,0,0,0,0,0,0,PROT_NAME(CHANGE_CLIENT_ID) ,"cce34d",NULL,"<DWORD>old_id<DWORD>new_id" },
#define MESSAGE 0x4E
- { 1,0,0,0,0,0,0,PROT_NAME(MESSAGE) ,NULL,"<WORD>message_len<CHAR>message[message_len]" },
-#define SETREQFILEID 0x4f
- { 1,0,0,0,0,0,0,PROT_NAME(SETREQFILEID) ,NULL,"<HASH>file_hash" },
+ { 1,0,0,0,0,0,0,PROT_NAME(MESSAGE) ,"cce34e",NULL,"<WORD>message_len<CHAR>message[message_len]" },
+#define SETREQFILEID 0x4F
+ { 1,0,0,0,0,0,0,PROT_NAME(SETREQFILEID) ,"cce34f",NULL,"<HASH>file_hash" },
#define FILESTATUS 0x50
- { 1,0,0,0,0,0,0,PROT_NAME(FILESTATUS) ,NULL,"<HASH>file_hash<BITMAP>chunks" },
+ { 1,0,0,0,0,0,0,PROT_NAME(FILESTATUS) ,"cce350",NULL,"<HASH>file_hash<BITMAP>chunks" },
#define HASHSETREQUEST 0x51
- { 1,0,0,0,0,0,0,PROT_NAME(HASHSETREQUEST) ,NULL,"<HASH>file_hash" },
+ { 1,0,0,0,0,0,0,PROT_NAME(HASHSETREQUEST) ,"cce351",NULL,"<HASH>file_hash" },
#define HASHSETANSWER 0x52
- { 1,0,0,0,0,0,0,PROT_NAME(HASHSETANSWER) ,NULL,"<HASH>file_hash<WORD>chunk_count<HASH>chunk_hash[chunk_count]" },
+ { 1,0,0,0,0,0,0,PROT_NAME(HASHSETANSWER) ,"cce352",NULL,"<HASH>file_hash<WORD>chunk_count<HASH>chunk_hash[chunk_count]" },
// Maybe there is a 0x53 too
// CONFORMING TO "eDonkey-protocol-0.6.1"
#define STARTUPLOADREQ 0x54 // The file_hash seems to be optional
- { 1,0,0,0,0,0,0,PROT_NAME(STARTUPLOADREQ) ,NULL,"<HASH>*file_hash" },
+ { 1,0,0,0,0,0,0,PROT_NAME(STARTUPLOADREQ) ,"cce354",NULL,"<HASH>*file_hash" },
#define ACCEPTUPLOADREQ 0x55
- { 1,0,0,0,0,0,0,PROT_NAME(ACCEPTUPLOADREQ) ,NULL,"<EMPTY>" },
+ { 1,0,0,0,0,0,0,PROT_NAME(ACCEPTUPLOADREQ) ,"cce355",NULL,"<EMPTY>" },
#define CANCELTRANSFER 0x56
- { 1,0,0,0,0,0,0,PROT_NAME(CANCELTRANSFER) ,NULL,"<EMPTY>" },
+ { 1,0,0,0,0,0,0,PROT_NAME(CANCELTRANSFER) ,"cce356",NULL,"<EMPTY>" },
#define OUTOFPARTREQS 0x57
- { 1,0,0,0,0,0,0,PROT_NAME(OUTOFPARTREQS) ,NULL,"<EMPTY>" },
+ { 1,0,0,0,0,0,0,PROT_NAME(OUTOFPARTREQS) ,"cce357",NULL,"<EMPTY>" },
#define FILEREQUEST 0x58
- { 1,0,0,0,0,0,0,PROT_NAME(FILEREQUEST) ,NULL,"<HASH>file_hash<BITMAP>*chunks" },
+ { 1,0,0,0,0,0,0,PROT_NAME(FILEREQUEST) ,"cce358",NULL,"<HASH>file_hash<BITMAP>*chunks" },
#define FILEREQANSWER 0x59
- { 1,0,0,0,0,0,0,PROT_NAME(FILEREQANSWER) ,NULL,"<HASH>file_hash<WORD>filename_len<CHAR>filename[filename_len]" },
+ { 1,0,0,0,0,0,0,PROT_NAME(FILEREQANSWER) ,"cce359",NULL,"<HASH>file_hash<WORD>filename_len<CHAR>filename[filename_len]" },
#define CHANGE_SLOT 0x5B // The writers of "eDonkey-protocol-0.6.1" are not sure about this...
- { 1,0,0,0,0,0,0,PROT_NAME(CHANGE_SLOT) ,NULL,"<HASH>file_hash" },
+ { 1,0,0,0,0,0,0,PROT_NAME(CHANGE_SLOT) ,"cce35b",NULL,"<HASH>file_hash" },
#define QUEUERANK 0x5C // (original comment: slot index of the request)
- { 1,0,0,0,0,0,0,PROT_NAME(QUEUERANK) ,NULL,"<DWORD>rank" },
+ { 1,0,0,0,0,0,0,PROT_NAME(QUEUERANK) ,"cce35c",NULL,"<DWORD>rank" },
// Client -> Client, CONFORMING TO "eDonkey-protocol-0.6.1"
#define GETSHAREDDIRS 0x5d // Request shared directories
- { 1,0,0,0,0,0,0,PROT_NAME(GETSHAREDDIRS) ,NULL,"" },
+ { 1,0,0,0,0,0,0,PROT_NAME(GETSHAREDDIRS) ,"cce35d",NULL,"" },
#define GETSHAREDFILES4DIR 0x5e // Request shared files from directory
-// { 1,0,0,0,0,0,0,PROT_NAME(GETSHAREDFILES4DIR) ,NULL,"<Directory>" },
+// { 1,0,0,0,0,0,0,PROT_NAME(GETSHAREDFILES4DIR) ,"cce35e",NULL,"<Directory>" },
#define ANSWERSHAREDDIRS 0x5f
-// { 1,0,0,0,0,0,0,PROT_NAME(ANSWERSHAREDDIRS) ,NULL,"<Directory list>" },
+// { 1,0,0,0,0,0,0,PROT_NAME(ANSWERSHAREDDIRS) ,"cce35f",NULL,"<Directory list>" },
#define ANSWERSHAREDFILES4DIR 0x60
-// { 1,0,0,0,0,0,0,PROT_NAME(ANSWERSHAREDFILES4DIR),NULL,"<Directory> <File info list>" },
+// { 1,0,0,0,0,0,0,PROT_NAME(ANSWERSHAREDFILES4DIR),"cce360",NULL,"<Directory> <File info list>" },
#define ANSWERSHAREDDENIED 0x61
- { 1,0,0,0,0,0,0,PROT_NAME(ANSWERSHAREDDENIED) ,NULL,"" },
+ { 1,0,0,0,0,0,0,PROT_NAME(ANSWERSHAREDDENIED) ,"cce361",NULL,"" },
// extened prot client <-> extened prot client
#define EMULEINFO 0x01
- { 0,1,0,0,0,0,0,PROT_NAME(EMULEINFO) ,NULL,"<BYTE>client_version<BYTE>protocol_version<DWORD>tagcount<TAG>tag[tagcount]" },
+ { 0,1,0,0,0,0,0,PROT_NAME(EMULEINFO) ,"ccc5e301",NULL,"<BYTE>client_version<BYTE>protocol_version<DWORD>tagcount<TAG>tag[tagcount]" },
// Values: ET_COMPRESSION ET_UDPPORT ET_UDPVER ET_SOURCEEXCHANGE ET_COMMENTS ET_EXTENDEDREQUEST ET_COMPATABLECLIENT ET_MOD_VERSION
#define EMULEINFOANSWER 0x02
- { 0,1,0,0,0,0,0,PROT_NAME(EMULEINFOANSWER) ,NULL,"<BYTE>client_version<BYTE>protocol_version<DWORD>tagcount<TAG>tag[tagcount]" },
+ { 0,1,0,0,0,0,0,PROT_NAME(EMULEINFOANSWER) ,"ccc502",NULL,"<BYTE>client_version<BYTE>protocol_version<DWORD>tagcount<TAG>tag[tagcount]" },
//
// CONFORMING TO "eDonkey-protocol-0.6.1" and comfirming to the xMule sources,
// a part may be split down to several packets. Each packet _may_ have same
// value for range.
#define COMPRESSEDPART 0x40
- { 0,1,0,0,0,0,0,PROT_NAME(COMPRESSEDPART) ,NULL,"<HASH>file_hash<RANGE>range<BYTE>cdata[range]" },
+ { 0,1,0,0,0,0,0,PROT_NAME(COMPRESSEDPART) ,"ccc540",NULL,"<HASH>file_hash<RANGE>range<BYTE>cdata[range]" },
#define QUEUERANKING 0x60
- { 0,1,0,0,0,0,0,PROT_NAME(QUEUERANKING) ,NULL,"<WORD>rank<DWORD>unknown1=0<DWORD>unknown2=0<WORD>unknown3=0" },
+ { 0,1,0,0,0,0,0,PROT_NAME(QUEUERANKING) ,"ccc560",NULL,"<WORD>rank<DWORD>unknown1=0<DWORD>unknown2=0<WORD>unknown3=0" },
// "eDonkey-protocol-0.6.1" doesn't know anything about 0x61:
#define FILEDESC 0x61 // max len = 128 [Why the hell is comment_len a 32 bit value, and than limited to 128 bytes?]
- { 0,1,0,0,0,0,0,PROT_NAME(FILEDESC) ,NULL,"<BYTE>quality_rating<DWORD>comment_len<CHAR>comment[comment_len]" },
+ { 0,1,0,0,0,0,0,PROT_NAME(FILEDESC) ,"ccc561",NULL,"<BYTE>quality_rating<DWORD>comment_len<CHAR>comment[comment_len]" },
#define REQUESTSOURCES 0x81
- { 0,1,0,0,0,0,0,PROT_NAME(REQUESTSOURCES) ,NULL,"<HASH>file_hash" },
+ { 0,1,0,0,0,0,0,PROT_NAME(REQUESTSOURCES) ,"ccc581",NULL,"<HASH>file_hash" },
#define ANSWERSOURCES 0x82
- { 0,1,0,0,0,0,0,PROT_NAME(ANSWERSOURCES) ,NULL,"<HASH>file_hash<WORD>num_sources{<IPPORT>server<IPPORT>client}source[num_sources]" },
+ { 0,1,0,0,0,0,0,PROT_NAME(ANSWERSOURCES) ,"ccc582",NULL,"<HASH>file_hash<WORD>num_sources{<IPPORT>server<IPPORT>client}source[num_sources]" },
// extened prot client <-> extened prot client UDP
#define REASKFILEPING 0x90
- { 0,1,0,0,0,0,0,PROT_NAME(REASKFILEPING) ,NULL,"<HASH>file_hash" },
+ { 0,1,0,0,0,0,0,PROT_NAME(REASKFILEPING) ,"ccc590",NULL,"<HASH>file_hash" },
#define REASKACK 0x91
- { 0,1,0,0,0,0,0,PROT_NAME(REASKACK) ,NULL,"<WORD>rank" },
+ { 0,1,0,0,0,0,0,PROT_NAME(REASKACK) ,"ccc591",NULL,"<WORD>rank" },
#define FILENOTFOUND 0x92
- { 0,1,0,0,0,0,0,PROT_NAME(FILENOTFOUND) ,NULL,"" },
+ { 0,1,0,0,0,0,0,PROT_NAME(FILENOTFOUND) ,"ccc592",NULL,"" },
#define QUEUEFULL 0x93
- { 0,1,0,0,0,0,0,PROT_NAME(QUEUEFULL) ,NULL,"" },
+ { 0,1,0,0,0,0,0,PROT_NAME(QUEUEFULL) ,"ccc593",NULL,"" },
// unknown: (?extened prot client <-> extened prot client?)
#define VERIFYUPSREQ 0x71 // (never used) */
- { 0,1,0,0,0,0,0,PROT_NAME(VERIFYUPSREQ) ,NULL,"" },
+ { 0,1,0,0,0,0,0,PROT_NAME(VERIFYUPSREQ) ,"ccc571",NULL,"" },
#define VERIFYUPSANSWER 0x72 // (never used) */
- { 0,1,0,0,0,0,0,PROT_NAME(VERIFYUPSANSWER) ,NULL,"" },
+ { 0,1,0,0,0,0,0,PROT_NAME(VERIFYUPSANSWER) ,"ccc572",NULL,"" },
#define UDPVERIFYUPREQ 0x73 // (never used) */
- { 0,1,0,0,0,0,0,PROT_NAME(UDPVERIFYUPREQ) ,NULL,"" },
+ { 0,1,0,0,0,0,0,PROT_NAME(UDPVERIFYUPREQ) ,"ccc573",NULL,"" },
#define UDPVERIFYUPA 0x74 // (never used)
- { 0,1,0,0,0,0,0,PROT_NAME(UDPVERIFYUPA) ,NULL,"" }
+ { 0,1,0,0,0,0,0,PROT_NAME(UDPVERIFYUPA) ,"ccc574",NULL,"" }
};
struct typestruct real_type[]={
@@ -1063,33 +1064,48 @@
return true;
}
-int find_parsestruct_by_name_compare(const void * key, const void * i) {
+int find_parsestruct_by_name_compare_name(const void * key, const void * i) {
return strcmp((char*)key,packet[*(int*)i].name);
}
+int find_parsestruct_by_name_compare_altname(const void * key, const void * i) {
+ return strcmp((char*)key,packet[*(int*)i].altname);
+}
+
bool find_parsestruct_by_name(
const char * name,
const struct parsestruct * * element
) {
- static int bsearchtable[sizeof packet / sizeof *packet];
+ static int bsearchtable_name [sizeof packet / sizeof *packet];
+ static int bsearchtable_altname[sizeof packet / sizeof *packet];
static bool first=true;
int * intp;
if (first) {
int i,j;
- for (i=0;i<sizeof packet / sizeof *packet;++i)
- bsearchtable[i]=i;
+ for (i=0;i<sizeof packet / sizeof *packet;++i) {
+ bsearchtable_name [i]=i;
+ bsearchtable_altname[i]=i;
+ }
for (i=0;i<sizeof packet / sizeof *packet-1;++i) {
for (j=i+1;j<sizeof packet / sizeof *packet;++j) {
if (strcmp(
- packet[bsearchtable[i]].name,
- packet[bsearchtable[j]].name
+ packet[bsearchtable_name[i]].name,
+ packet[bsearchtable_name[j]].name
)>0) {
- int t=bsearchtable[i];
- bsearchtable[i]=bsearchtable[j];
- bsearchtable[j]=t;
+ int t=bsearchtable_name[i];
+ bsearchtable_name[i]=bsearchtable_name[j];
+ bsearchtable_name[j]=t;
+ }
+ if (strcmp(
+ packet[bsearchtable_altname[i]].altname,
+ packet[bsearchtable_altname[j]].altname
+ )>0) {
+ int t=bsearchtable_altname[i];
+ bsearchtable_altname[i]=bsearchtable_altname[j];
+ bsearchtable_altname[j]=t;
}
}
}
@@ -1098,14 +1114,28 @@
}
intp=(int*)bsearch(
- name,bsearchtable,
+ name,bsearchtable_name,
sizeof(packet) / sizeof(*packet),
- sizeof(int),find_parsestruct_by_name_compare
+ sizeof(int),find_parsestruct_by_name_compare_name
);
- if (!intp) return false;
-
- *element=packet[bsearchtable[*intp]].element;
+ if (intp) {
+ // *element=packet[bsearchtable_name[*intp]].element;
+ *element=packet[*intp].element;
+ } else {
+ intp=(int*)bsearch(
+ name,bsearchtable_altname,
+ sizeof(packet) / sizeof(*packet),
+ sizeof(int),find_parsestruct_by_name_compare_altname
+ );
+
+ if (intp) {
+ // *element=packet[bsearchtable_altname[*intp]].element;
+ *element=packet[*intp].element;
+ } else {
+ return false;
+ }
+ }
return true;
}
Index: test.cpp
===================================================================
RCS file: /cvsroot/sharedaemon/core/src/test.cpp,v
retrieving revision 1.29
retrieving revision 1.30
diff -u -d -r1.29 -r1.30
--- test.cpp 26 Nov 2003 02:07:04 -0000 1.29
+++ test.cpp 9 Dec 2003 00:16:29 -0000 1.30
@@ -770,6 +770,36 @@
u32 * OurClientID=NULL;
u32 * connection_id=NULL;
+std::map<char,unsigned> hexdigit2value;
+bool hexdigit2value_initialised=false;
+
+ParseClass * GetParseClass(const char * proto_opcode) {
+ const parsestruct * ps;
+ unsigned p,o;
+
+ if (PClist[proto_opcode]) {
+ return PClist[proto_opcode];
+ }
+
+ if (find_parsestruct_by_name(proto_opcode,&ps)) {
+ return PClist[proto_opcode]=new ParseClass(ps);
+ }
+
+ p=16*hexdigit2value[proto_opcode[0]]+hexdigit2value[proto_opcode[1]];
+ o=16*hexdigit2value[proto_opcode[2]]+hexdigit2value[proto_opcode[3]];
+
+ if (!packet_description(p,o,&ps,NULL)) {
+ fprintf(
+ stderr
+ ,"%s:%i: FATAL: Couldn't find ps for packet 0x%02x,0x%02x.\n"
+ ,__FILE__,__LINE__,p,o
+ );
+ abort();
+ }
+
+ return PClist[proto_opcode]=new ParseClass(ps);
+}
+
void Client_Tcp_Sending_Hello_Packet(u32 id) {
bool rc;
Ed2kPacket p;
@@ -781,6 +811,38 @@
0x0f,DEFAULT_CLIENTPORT,
ipport(MY_IP,DEFAULT_SERVERPORT)
);
+
+ ParseClass * PC=GetParseClass("HELLO"); // e301
+ const ipport & client=ipport(MY_IP,DEFAULT_CLIENTPORT);
+ const ipport & server=ipport(MY_IP,DEFAULT_SERVERPORT);
+ tag tag;
+
+ PC->Set((u8)0x10,"magic");
+ PC->Set(userhash,"user_hash");
+ PC->Set(client, "address");
+ PC->Set((u32)3, "tagcount");
+
+ tag.type=TAG_TYPE_STRING;
+ tag.id_len=1;
+ tag.id.number=0x01;
+ tag.value.string.content=(u8*)"bothie tests his xMule v2 core";
+ tag.value.string.length=strlen((char*)tag.value.string.content);
+ PC->Set(tag, "tag[0]");
+
+ tag.type=TAG_TYPE_DWORD;
+ tag.id.number=0x11;
+ tag.value.dword=60;
+ PC->Set(tag, "tag[1]");
+
+ tag.id.number=0x0f;
+ tag.value.dword=DEFAULT_CLIENTPORT;
+ PC->Set(tag, "tag[2]");
+
+ PC->Set(server, "server_address");
+/*
+ PC->Write(p);
+*/
+
printf(
"Sending packet (id=%lu; ip:port=%lu:%u. Protocol=0x%02x, Opcode=0x%02x, Size=0x%08x\n",
(long unsigned)id,(long unsigned)Connection::GetSocket(id).GetIP(),
@@ -895,7 +957,7 @@
if (!PClist[proto_opcode]) PClist[proto_opcode]=new ParseClass(ps);
PC=PClist[proto_opcode];
- PC->Read(p.GetPtr(),p.GetSize());
+ PC->Read(p);
switch ((u16)p.GetProtocol()*0x100+p.GetOpcode()) {
case 0xe338: // Servermessage
@@ -963,6 +1025,10 @@
Log(tmp);
free(tmp);
Connection::SetStatus(id,SERVER_TCP_INITIAL_OFFER_FILES);
+ /*
+ * Ask for all sources, and afterwards offer files.
+ */
+ // e315: "<DWORD>filecount{<HASH>hash<IPPORT>source<DWORD>tagcount<TAG>tag[tagcount]}file[filecount]" },
++num_connected;
break;
@@ -1164,6 +1230,7 @@
u32 ip;
u16 port;
bool rc;
+ int i;
#ifndef NDEBUG
#ifdef HAVE_BTLINUXLIBRARY
@@ -1176,6 +1243,14 @@
parse_all();
parse_something();
+
+ for (i=0;i<10;++i) {
+ hexdigit2value['0'+i]=i;
+ }
+ for (i=0;i<6;++i) {
+ hexdigit2value['a'+i]=10+i;
+ hexdigit2value['A'+i]=10+i;
+ }
if (argc!=3 && argc!=1) return usage(argv[0]);
|