Strona 4 z 4

Re: BCB6 - Klient Gadu Gadu

Nowy postNapisane: czwartek, 28 stycznia 2010, 22:39
przez mko000
Kod: Zaznacz cały
vector<char>    buff(sizeof(gg_header) + sizeof(gg_send_msg80));
gg_header*      gg_hdr = (gg_header*) &buff[0];
gg_send_msg80*  gg_send = (gg_send_msg80*)(gg_hdr + 1);
string          msg = "blablabla";

gg_hdr->type = GG_SEND_MSG80;

msg.append(1,'\0');
time_t sekundy;
sekundy = time (NULL);
gg_send->recipient = 18199693;
gg_send->seq = sekundy;
gg_send->clas = 0x0008;

gg_send->offset_plain = sizeof(gg_send_msg80) + 1;
gg_send->offset_attributes = gg_send->offset_plain + msg.size();

buff.push_back('\0');
buff.insert(buff.end(),msg.begin(),msg.end());

char tab[] = { 2, 6, 0, 0, 0, 8, 0, 0, 0 };
buff.insert(buff.end(),tab,tab + sizeof(tab));

gg_hdr = (gg_header*) &buff[0];
gg_hdr->length = buff.size() - sizeof(gg_header);

Client->Socket->SendBuf(&buff[0],buff.size());

Rezultat ten sam przychodzi pusta wiadomość.

Re: BCB6 - Klient Gadu Gadu

Nowy postNapisane: czwartek, 28 stycznia 2010, 23:28
przez polymorphism
Ok, spróbuj wysłać wersję html:
Kod: Zaznacz cały
vector<char>    buff(sizeof(gg_header) + sizeof(gg_send_msg80));
gg_header*      gg_hdr = (gg_header*) &buff[0];
gg_send_msg80*  gg_send = (gg_send_msg80*)(gg_hdr + 1);
string          msg = "<span style=\"color:#000000; font-family:'MS Shell Dlg 2'; font-size:9pt; \">blablabla</span>";
   
msg.append(1,'\0');

...

gg_send->offset_plain = sizeof(gg_send_msg80) + msg.size();
gg_send->offset_attributes = gg_send->offset_plain + 1;
   
buff.insert(buff.end(),msg.begin(),msg.end());
buff.push_back('\0');
char tab[] = { 2, 6, 0, 0, 0, 8, 0, 0, 0 };
buff.insert(buff.end(),tab,tab + sizeof(tab));

gg_hdr = (gg_header*) &buff[0];
gg_hdr->length = buff.size() - sizeof(gg_header);

...

swoją drogą, niezły łeb wpadł na pomysł, żeby wysyłać dwie wersje tekstu, na dodatek w różnych kodowaniach.

Re: BCB6 - Klient Gadu Gadu

Nowy postNapisane: piątek, 29 stycznia 2010, 10:59
przez mko000
Ten kod nie jest dla mnie za bardzo zrozumiały.
Kod: Zaznacz cały
vector<char>    buff(sizeof(gg_header) + sizeof(gg_send_msg80));
gg_header*      gg_hdr = (gg_header*) &buff[0];
gg_send_msg80*  gg_send = (gg_send_msg80*)(gg_hdr + 1);
string          msg = "<span style=\"color:#000000; font-family:'MS Shell Dlg 2'; font-size:9pt; \">blablabla</span>";

msg.append(1,'\0');
//----------
time_t sekundy;
sekundy = time (NULL);
gg_send->recipient = 18199693;
gg_send->seq = sekundy;
gg_send->clas = 0x0008;
//----------
gg_send->offset_plain = sizeof(gg_send_msg80) + msg.size();
gg_send->offset_attributes = gg_send->offset_plain + 1;

buff.insert(buff.end(),msg.begin(),msg.end());
buff.push_back('\0');
char tab[] = { 2, 6, 0, 0, 0, 8, 0, 0, 0 };
buff.insert(buff.end(),tab,tab + sizeof(tab));

gg_hdr = (gg_header*) &buff[0];
gg_hdr->length = buff.size() - sizeof(gg_header);

Client->Socket->SendBuf(&buff[0],buff.size());

Jak tylko uzupełnię strukturę tak jak w tym kodzie to automatycznie mnie rozłącza.

PS. Się udało xD brakowało w kodzie tej linijki:
gg_hdr->type = GG_SEND_MSG80;
Dziękuje Ci bardzo za pomoc :)

Re: BCB6 - Klient Gadu Gadu

Nowy postNapisane: piątek, 29 stycznia 2010, 11:30
przez polymorphism
Czyli tylko wersja html działa, tak? Pamiętaj, że ta wersja wiadomości musi być kodowana w utf8. No i dobrze by było, jakbyś sprawdził czy to działa na innych, alternatywnych komunikatorach, bo mam przeczucie, że może nie działać z samym tekstem html.

Re: BCB6 - Klient Gadu Gadu

Nowy postNapisane: piątek, 29 stycznia 2010, 11:38
przez mko000
Tak tylko HTML działa. Jak jest z tym kodowaniem ? W twoim kodzie nie ma konwertujesz na te kodowanie. Programy sprawdzę jak znajdę który obsługuje nowe numery.

Re: BCB6 - Klient Gadu Gadu

Nowy postNapisane: piątek, 29 stycznia 2010, 11:53
przez polymorphism
Jak jest z tym kodowaniem ? W twoim kodzie nie ma konwertujesz na te kodowanie.

Nie konwertuję, bo nie muszę. UTF8 jest kompatybilne z podstawowym kodowaniem ASCII, a że nigdzie nie korzystałem ze znaków diakrytycznych, nie musiałem nic konwertować. Ty, pisząc komunikator, musisz taką konwersję zapewnić. W VCL-u jest funkcja AnsiToUtf8, więc sprawa jest prosta:
Kod: Zaznacz cały
msg = "<span style=\"color:#000000; font-family:'MS Shell Dlg 2'; font-size:9pt; \">"
msg += AnsiToUtf8("Wiadomość ze znakami: śćźżółęą").c_str();
msg += "</span>";
msg.append(1,'\0');


___
p.s. opierałem się na dokumentacji z BCB6.

Re: BCB6 - Klient Gadu Gadu

Nowy postNapisane: piątek, 29 stycznia 2010, 14:16
przez Cyfrowy Baron
mko000 korzysta ze środowiska C++Builder 2010, gdzie domyślnym typem nie jest AnsiString tylko UnicodeString, więc raczej powinien użyć funkcji UnicodeToUtf8

Kod: Zaznacz cały
int __fastcall UnicodeToUtf8(char * Dest, wchar_t * Source, int MaxBytes);

Re: BCB6 - Klient Gadu Gadu

Nowy postNapisane: piątek, 29 stycznia 2010, 15:23
przez polymorphism
Być może, choć w samym przykładzie nie ma to aż takiego znaczenia.

___
p.s. a nie prościej użyć UTF8Encode zamiast UnicodeToUtf8?

Re: BCB6 - Klient Gadu Gadu

Nowy postNapisane: piątek, 29 stycznia 2010, 15:27
przez Cyfrowy Baron
Jeżeli zamiast deklarowania zmiennej String zadeklaruje się AnsiString to wtedy można używać AnsiToUtf8. Różnica polega na tym, że w C++Builder 2009 i 2010 deklaracja String jest traktowana jako UnicodeString, a nie jak we wcześniejszych wersjach jako AnsiString.

Zmienna UnicodeString obsługuje więcej znaków niż AnsiString, więc chyba lepiej używać tego typu.

Re: BCB6 - Klient Gadu Gadu

Nowy postNapisane: sobota, 30 stycznia 2010, 12:26
przez polymorphism
Machnąłem wersję ze strumieniem pamięciowym, bez użycia struktur:
Kod: Zaznacz cały
/* rozszerzmy nieco strumień pamięciowy */
#include <stdint.h>

class CMemStream:public TMemoryStream
{
public:
   void Write8(int8_t v)    { Write(&v,1); }
   void Write16(int16_t  v)    { Write(&v,2); }
   void Write32(int32_t  v)    { Write(&v,4); }
   void Write64(int64_t  v)    { Write(&v,8); }
};

...

auto_ptr<CMemStream> mem_str(new CMemStream);
string msg = "<span style=\"color:#000000; font-family:'MS Shell Dlg 2'; font-size:9pt; \">blablabla</span>";

sekundy = ...

mem_str->Write32(GG_SEND_MSG80);
mem_str->Write32(0);

mem_str->Write32(18199693);
mem_str->Write32(sekundy);
mem_str->Write32(8);
mem_str->Write32(0);
mem_str->Write32(0);
mem_str->Write(msg.c_str(),msg.size() + 1);

int offset_plain = mem_str->Position;
mem_str->Write8(0);

char tab[] = { 2, 6, 0, 0, 0, 8, 0, 0, 0 };
mem_str->Write(tab,sizeof(tab));

mem_str->Position = 5 * 4;
mem_str->Write32(offset_plain);
mem_str->Write32(offset_plain + 1);
mem_str->Position = 4;
mem_str->Write32(mem_str->Size - 8);

Client->Socket->SendBuf(mem_str->Memory,mem_str->Size);

Być może będzie bardziej zrozumiała.

____
p.s. 1. kodu nie testowałem, bo nie mam jak.
p.s. 2. Baron, przydałoby się jakieś kolorowanie składni w CODE, bo teraz kod jest nieczytelny.
p.s. 3. czy w BCB jest plik stdint.h lub coś podobnego?

Re: BCB6 - Klient Gadu Gadu

Nowy postNapisane: sobota, 30 stycznia 2010, 13:13
przez Cyfrowy Baron
W C++Builder 2007 i 2010 jest plik stdint.h, więc w innych wersjach pewnie też.



p.s. 2. Baron, przydałoby się jakieś kolorowanie składni w CODE, bo teraz kod jest nieczytelny.


Wiem! Tylko, że ja nie znam się zupełnie na PHP, więc nie wiem jak to przerobić. Kiedyś miałem takie kolorowanie, ale bardziej przypominało to kolorowanie składni PHP niż C++, poza tym działało tylko w odniesieniu do nowych postów i całkowicie psuło kod w postach wcześniejszych. Mam ten MOD, ale on nie działa z tą wersją forum, więc póki nie znajdzie się ktoś, kto będzie potrafił zmodyfikować skrypty dla forum phpBB 3.0.5 to nic nie wymyślę.

Re: BCB6 - Klient Gadu Gadu

Nowy postNapisane: sobota, 30 stycznia 2010, 14:00
przez mko000
Poszukałem trochę i znalazłem coś o kolorowaniu składni:
http://www.kurshtml.boo.pl/phpbb/#code_highlight
oraz opis jak to zrobic z forum przema
http://www.przemo.org/phpBB2/forum/view ... +highlight



[EDIT] Cyfrowy Baron

Niestety ten MOD współpracuje tylko ze stylem subsilver, a na tym forum domyślnym stylem jest prosilver i większość z tego stylu korzysta.

Re: BCB6 - Klient Gadu Gadu

Nowy postNapisane: sobota, 30 stycznia 2010, 14:21
przez polymorphism
Cyfrowy Baron napisał(a):W C++Builder 2007 i 2010 jest plik stdint.h, więc w innych wersjach pewnie też.

OK. Poprawiłem nieco klasę strumienia.