Witam. Mam możliwość korzystania z dokumentacji protokołu by utrzymywać własną bibliotekę (komponent klienta gg na Windows Mobile - MobileGadu) za co dziękuję.
Mam kilka pytań dotyczących dokumentacji protokołu i multilogowania: 1. Rozłączanie. Czy opis w pkt. 1.4 jest poprawny? Czy jednak nie powinniśmy zmieniać stanu na GG_STATUS_NOT_AVAIL lub GG_STATUS_NOT_AVAIL_DESCR w przypadku, gdy istnieją inne sesje? Czy w takim przypadku zakończenie połączenia (niskopoziomowe zamknięcie socketa) jest poprawnym zakończeniem sesji? A może należy wykonać to, co opisałem w pkt. 2 (jeśli możliwe)? 2. Czy w pakiecie GG_MULTILOGON_INFO dostajemy informację o własnej sesji (wydaje mi się, że nie)? Jeśli tak to czy możemy wysłać GG_MULTILOGON_DISCONNECT dla własnej sesji by ją zakończyć? 3. Mimo użycia 0x0400 w odniesieniu do pakietu logowania i pola "status" oraz odpowiednio maski 0x00004000 w "features" nie dostaję pakietu GG_NOTIFY_REPLY80. W zasadzie tego pakietu nigdy nie dostaję z własnym numerem gg. Dostaję natomiast pakiet GG_STATUS80 jeśli inny zalogowany klient zmieni status (tego scenariusza nie ma w załączonym logu "gglib32.log"). Co może być nie tak? W załączeniu: "ggcommon.txt" - stałe (flagi logowania) "LoginWorker.txt" - kod metody wysyłającej pakiet logowania "gglib32.log" - log z komunikacji (logowanie statusem GG_STATUS_FFC_DESCR, opis "Opis", 1 kontakt na liście, zakończenie sesji zgodne z opisem w pkt. 1.4 dokumentacji). W sytuacji, gdy jeden klient jest już zalogowany (inna instancja gglib32 ze statusem GG_STATUS_BUSY, oczywiście bez opisu, serwer wysyła pakiet GG_MULTILOGON_INFO). Dzięki za odpowiedzi / komentarze. Mała uwaga: w samej dokumentacji nazewnictwo pakietów jest niespójne - rozdział ze spisem pakietów ma "OWN" w nazwach. W zasadniczej treści stosowane są nazwy jak w moim mailu. Wartości oczywiście się zgadzają :). Pozdrawiam, Marcin Parka
2011-08-05 13:46:39 - RX << (0x0001,00004): [39][77][6d][59] 2011-08-05 13:46:39 - TX >> (0x0031,00144): [c9][c8][7a][00][70][6c][02][7d][9e][6b][a3][40][5b][c1][23][95][61][88][b6][58][68][69][08][61][b5][c6][26][00][00][00][00][00][00][00][00][00][00][00][00][00][00][00][00][00][00][00][00][00][00][00][00][00][00][00][00][00][00][00][00][00][00][00][00][00][00][00][00][00][00][00][00][18][04][00][00][00][00][00][00][77][67][00][00][00][00][00][00][00][00][00][00][00][00][00][00][00][64][23][00][00][00][47][61][64][75][2d][47][61][64][75][20][43][6c][69][65][6e][74][20][62][75][69][6c][64][20][31][30][2e][31][2e][30][2e][31][31][30][37][30][04][00][00][00][4f][70][69][73] 2011-08-05 13:46:40 - RX << (0x0035,00004): [01][00][00][00] 2011-08-05 13:46:40 - TX >> (0x0010,00005): [8d][31][7c][00][03] 2011-08-05 13:46:40 - RX << (0x0037,00028): [8d][31][7c][00][01][00][00][00][00][00][00][00][00][00][00][00][00][00][00][00][08][00][00][00][00][00][00][00] 2011-08-05 13:46:40 - RX << (0x0044,00136): [03][00][00][00][02][00][00][00][c9][c8][7a][00][01][00][00][00][0e][00][00][00][53][74][61][74][75][73][43][6f][6d][6d][65][6e][74][73][12][00][00][00][1e][00][00][00][30][2c][62][64][62][62][61][65][35][32][2c][35][36][33][37][31][34][34][36][38][38][31][36][38][37][31][37][34][31][36][8d][31][7c][00][01][00][00][00][0e][00][00][00][53][74][61][74][75][73][43][6f][6d][6d][65][6e][74][73][01][00][00][00][1e][00][00][00][30][2c][61][37][33][39][33][33][66][32][2c][35][36][33][34][35][30][36][32][35][35][33][39][32][35][37][39][35][33][36] 2011-08-05 13:46:40 - RX << (0x005b,00071): [01][00][00][00][4d][de][eb][72][00][00][00][00][77][67][00][00][37][29][3b][4e][0e][03][cf][f0][72][5c][01][00][00][00][00][00][23][00][00][00][47][61][64][75][2d][47][61][64][75][20][43][6c][69][65][6e][74][20][62][75][69][6c][64][20][31][30][2e][31][2e][30][2e][31][31][30][37][30] 2011-08-05 13:46:40 - RX << (0x002c,00264): [3c][3f][78][6d][6c][20][76][65][72][73][69][6f][6e][3d][22][31][2e][30][22][20][65][6e][63][6f][64][69][6e][67][3d][22][55][54][46][2d][38][22][3f][3e][3c][61][70][70][5f][65][76][65][6e][74][3e][3c][21][5b][43][44][41][54][41][5b][5b][7b][22][74][79][70][65][22][3a][31][2c][22][70][61][72][61][6d][73][22][3a][7b][22][61][70][70][49][64][22][3a][22][67][72][79][22][2c][22][63][54][79][70][65][22][3a][22][31][22][2c][22][63][56][61][6c][75][65][22][3a][22][31][22][7d][7d][2c][7b][22][74][79][70][65][22][3a][31][2c][22][70][61][72][61][6d][73][22][3a][7b][22][61][70][70][49][64][22][3a][22][6d][61][69][6c][22][2c][22][63][54][79][70][65][22][3a][22][31][22][2c][22][63][56][61][6c][75][65][22][3a][22][31][22][7d][7d][2c][7b][22][74][79][70][65][22][3a][31][2c][22][70][61][72][61][6d][73][22][3a][7b][22][61][70][70][49][64][22][3a][22][63][61][6c][6c][70][61][6e][65][6c][22][2c][22][63][54][79][70][65][22][3a][22][31][22][2c][22][63][56][61][6c][75][65][22][3a][22][31][22][7d][7d][5d][5d][5d][3e][3c][2f][61][70][70][5f][65][76][65][6e][74][3e] 2011-08-05 13:47:02 - TX >> (0x0038,00012): [01][00][00][00][00][00][00][00][00][00][00][00]
enum GG_LOGIN_FLAGS { GG_LOGIN_FLAGS_GG80BETA = 0x00000001, GG_LOGIN_FLAGS_MSG80 = 0x00000002, GG_LOGIN_FLAGS_GG80 = 0x00000004, GG_LOGIN_FLAGS_NEW_STATUSES = 0x00000010, GG_LOGIN_FLAGS_NEW_IMG_STATUSES = 0x00000020, GG_LOGIN_FLAGS_LOGIN80_FAILED = 0x00000040, GG_LOGIN_FLAGS_NEW_CLIENT = 0x00000100, GG_LOGIN_FLAGS_ADV_CONTACT_LIST = 0x00000200, GG_LOGIN_FLAGS_MSG_ACK = 0x00000400, GG_LOGIN_FLAGS_TYPING_NOTIFY = 0x00002000, GG_LOGIN_FLAGS_MULTI_LOGIN = 0x00004000 }; enum GG_DEFAULT { GG_DEFAULT_PING_TIMEOUT = 60000, GG_DEFAULT_CODEPAGE = 1250, GG_DEFAULT_PORT = 8074, GG_DEFAULT_PORT_SSL = 443, GG_DEFAULT_MAX_TX_PACKET_SIZE = 0xFFFF, GG_DEFAULT_MAX_RX_PACKET_SIZE = 0xFFFF, GG_DEFAULT_LOGIN_FLAGS = GG_LOGIN_FLAGS_GG80BETA|GG_LOGIN_FLAGS_MSG80|GG_LOGIN_FLAGS_GG80|GG_LOGIN_FLAGS_NEW_STATUSES|GG_LOGIN_FLAGS_NEW_IMG_STATUSES|GG_LOGIN_FLAGS_LOGIN80_FAILED|GG_LOGIN_FLAGS_NEW_CLIENT|GG_LOGIN_FLAGS_ADV_CONTACT_LIST|GG_LOGIN_FLAGS_MSG_ACK|GG_LOGIN_FLAGS_TYPING_NOTIFY|GG_LOGIN_FLAGS_MULTI_LOGIN }; enum GG_USER_STATUS_MASK { GG_USER_STATUS_MASK_ADAPT = 0x00000400, GG_USER_STATUS_MASK_FRIENDS = 0x00008000 };
BOOL ggLibrary::LoginWorker(UINT nUserId,const TCHAR* tUserPassword,GG_USER_STATUS UserStatus,const TCHAR* tUserDescription,BOOL bUserOnlyForFriends) { if(LoginValidate(nUserId,tUserPassword,UserStatus,tUserDescription,bUserOnlyForFriends)) { ggPacket PacketTx(GG_PACKET_S_LOGIN80); { PacketTx.AddData<UINT>(nUserId); { std::basic_string<CHAR> Language("pl"); { PacketTx.AddData(Language.c_str(),Language.length()); } } PacketTx.AddData<BYTE>(m_LoginHashType); switch(m_LoginHashType) { case GG_LOGIN_HASH_TYPE_GG32: { PacketTx.AddData<UINT>(ggHelper::ggUtil::PasswordHashGG32(tUserPassword,m_Seed)); PacketTx.AddData(std::vector<BYTE>(60,0x00)); } break; case GG_LOGIN_HASH_TYPE_SHA1: { PacketTx.AddData(ggHelper::ggUtil::PasswordHashSHA1(tUserPassword,m_Seed)); PacketTx.AddData(std::vector<BYTE>(44,0x00)); } break; default: { return FALSE; } break; } PacketTx.AddData<UINT>(UserStatus|(bUserOnlyForFriends?GG_USER_STATUS_MASK_FRIENDS:0)|((GG_DEFAULT_LOGIN_FLAGS&GG_LOGIN_FLAGS_MULTI_LOGIN)?GG_USER_STATUS_MASK_ADAPT:0)); PacketTx.AddData<UINT>(0); PacketTx.AddData<UINT>(GG_DEFAULT_LOGIN_FLAGS); PacketTx.AddData<UINT>(0); PacketTx.AddData<USHORT>(0); PacketTx.AddData<UINT>(0); PacketTx.AddData<USHORT>(0); PacketTx.AddData<BYTE>(0); PacketTx.AddData<BYTE>(0x64); { std::basic_string<CHAR> ClientVersion(ggHelper::ggString::ggConvert::CharC2CharU(GGLIB32_DEFAULT_CLIENT_VERSION_STRING)); { PacketTx.AddData<UINT>(ClientVersion.length()); PacketTx.AddData(ClientVersion.c_str(),ClientVersion.length()); } } switch(UserStatus) { case GG_USER_STATUS_AVAIL_DESCR: case GG_USER_STATUS_BUSY_DESCR: case GG_USER_STATUS_INVISIBLE_DESCR: case GG_USER_STATUS_TALK_WITH_ME_DESCR: case GG_USER_STATUS_DO_NOT_DISTURB_DESCR: { std::basic_string<CHAR> UserDescription(ggHelper::ggString::ggConvert::CharT2CharU(tUserDescription)); { PacketTx.AddData<UINT>(UserDescription.length()); PacketTx.AddData(UserDescription.c_str(),UserDescription.length()); } } break; default: { PacketTx.AddData<UINT>(0); } break; } SetUser(nUserId,tUserPassword,UserStatus,tUserDescription,bUserOnlyForFriends); if(PacketTx.Send(static_cast<ggHelper::ggSocket*>(m_pSocket)->GetSocket(),&m_TxCriticalSection,m_LogFilePath.c_str())) { if(BeginAddEvent(GG_EVENT_TYPE_PACKET_SENT)) { GetLastEvent().SetPacket(PacketTx.GetType(),PacketTx.GetSize()); FinishAddEvent(); } return TRUE; } SetUser(0,NULL,GG_USER_STATUS_NONE,NULL,FALSE); } } return FALSE; }
_______________________________________________ libgadu-devel mailing list libgadu-devel@lists.ziew.org http://lists.ziew.org/mailman/listinfo/libgadu-devel