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]); |