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

Reply via email to