Skocz do zawartości

[Delphi] Komponent Gadu-Gadu na licencji GPL


markovcd

Polecane posty

Witam.

 

Znalazłem kilka błędów w tym komponencie :)

 

1. Komponent nie odbiera długich wiadomości

2.Komponent źle odbiera zakolejkowane wiadomości. Np. z 10 wiadomości, które wysłałem, podczas nieobecności użytkownika, po zalogowaniu się na dany numer dochodzą tylko pierwsze 3...

 

Pozdro.

Link do komentarza
Udostępnij na innych stronach

Witam.

 

Znalazłem kilka błędów w tym komponencie smile.gif

 

1. Komponent nie odbiera długich wiadomości

2.Komponent źle odbiera zakolejkowane wiadomości. Np. z 10 wiadomości, które wysłałem, podczas nieobecności użytkownika, po zalogowaniu się na dany numer dochodzą tylko pierwsze 3...

 

Pozdro.

 

 

 

Już przedwczoraj zauważyłem i poprawiłem ten problem. Poczekaj na wersję 0.02. smile.gif

Link do komentarza
Udostępnij na innych stronach

Już przedwczoraj zauważyłem i poprawiłem ten problem. Poczekaj na wersję 0.02. :)

A czy problem po importowaniu listy kontaktów oraz ponownym połączeniu ktory pokazałem w

moim kodzie w katalogu EGG_PROBLEM - też będziesz w stanie naprawić w tej wersji 0.02?

Pozdrawiam: olesio

Link do komentarza
Udostępnij na innych stronach

  • 4 weeks later...

Dzięki za info. Z testów wynika, że teraz działa ok i eksport listy w starym formacie (text nie xml) z pliku już u

mnie nie powoduje "wykrzaczenia się". Tylko dodam jedną uwagę, bo nowicjuesz mogą mieć problem. W Demie

w unicie głównym jest przez słowem kluczowym unit jakiś trzech bajtów które powoduje, że jak się wczyta to w

IDE to kompilator głupieje i pisze, że nie ma żadnych metod kiedy klika się na jakieś elementy - aby sprawdzić

jaki kod się pod nimi kryje. Może popraw to. Widzę, że w wersji 0.3 będzie pewnie wsparcie dla grup. Ale moim

zdaniem szkoda że nie mogleś zastosować jakiegoś zewnętrznego parsera XML na licencji która by pozwalała na

jego użycie. Bo teraz jak ktoś dysponuje Delphi 7 Personal to sobie nie skompiluje tego komponentu, bo musiał

by sobie "podkraść" te moduły z wersji Enterprise. Może rozważysz to czy udało by się Tobie parsować XML bez

użycia wbudowanych komponentów. Wiem, że to łatwiejsze z ich użyciem, ale może będzie się Tobie chciało to

przy użyciu jakiegoś parsera zrobić. Na sieci są dostępne jakieś, ale ciężko się ich używa a i nie są doskonałe ;/

Pozdrawiam: olesio

Link do komentarza
Udostępnij na innych stronach

W Demie

 

w unicie głównym jest przez słowem kluczowym unit jakiś trzech bajtów które powoduje, że jak się wczyta to w

IDE to kompilator głupieje i pisze, że nie ma żadnych metod kiedy klika się na jakieś elementy - aby sprawdzić

jaki kod się pod nimi kryje.

 

Ja tam nic takiego nie widzę, dziwne. Ok już poprawiam, odpaliłem w hex edytorze i faktycznie są tam te bajty. Nie wiem jak się to tam znalazło.

 

 

Ale moim

 

zdaniem szkoda że nie mogleś zastosować jakiegoś zewnętrznego parsera XML na licencji która by pozwalała na

jego użycie.

Możesz zaproponować jakiś dobry?

Link do komentarza
Udostępnij na innych stronach

Możesz zaproponować jakiś dobry?

Nie wiem czy będzie dobry, nie korzystałem z niego, ale kiedyś zapytałem się

bodajże Cubixmeistera z tego forum co darmowego polecił by mi do obsługi XMLa

zamiast tych komponentów z Delphi 7 odpowiedział mi, że SpkXMLParser. Znaleźć

go można na ów stronie: http://www.spook.freshsite.pl/download.php a konkretnie

pod tym adresem: http://www.spook.freshsite.pl/files/downlo...pkxmlparser.zip

Jak wspomniałem - nie bawiłem się nim za bardzo, ale myślę, że Tobie jako na

tyle doświadczonemu programiście, który sobie poradził z obslugą Socketów, co

na przykład dla mnie jest czarną magią, to pewnie i z tym XML, obsługiwanym

przez inny komponent także sobie też poradzisz. Ewentualnie może ktoś jeszcze

tutaj może polecić Tobie coś darmowego i dobrego do obsługi XMLa pod Delphi.

Pozdrawiam: olesio

Link do komentarza
Udostępnij na innych stronach

markovcd: siedziałem prawie pół dnia nad tym parserem i udało mi śię jedna mój program

przerobić aby zapisywał i odczytywal dane z xmla, przy użyciu spkxmlparser zamiast tego,

co standardowo jest w Delphi czyli TXMLDocument. Dlatego myślę że Ty jako bardziej mi

się wydaje doświadczony pogramista również dasz rade. Swoją drogą jak pobieżnie na te

generowane przez TEasyGG listy kontaktów spojrzałem to wydają mi śię nieco zamotane.

Chociaż z tego co widzę, w module egg.pas TXMLDocument - jest użyty tylko dwa razy,

w jednej procedurze i w jednej funkcji, ale dopasowanie kodu pozostawie Tobie, sam w

sumie nie będę przerabiał kodu, bo autor zrobi to najlepiej. Poza tym nie bardzo wiem w

jaki sposób w TXMLDocument stosuje się te AddChild. w tym parserze co Tobie poleciłem

dodawać trzeba chyba kolejne tworzone TSpkXMLNode. A wyszukiwanie Nodeów robi się z

tebo co pewnie zauważyłeś NodeByName[Nazwa, False]; Niestety parser nie obsługuje - z

tego co mi się wydaję, Unikodu. No ale czy to go dyskwalifikuje czy jednak może też być?

Pozdrawiam: olesio

Link do komentarza
Udostępnij na innych stronach

A ja znalazłem rozwiązanie na wykrzaczające się EasyGG przy imporcie z pliku lub serwera do ListView.

Należy dodać z początku Application.ProcessMessagess i wtedy jest ok. Może to poprawisz lub jak to

będzie nadal koniecznie dodasz o tym informację w dokumentacji. Przydało by się też przeanalizowanie

dlaczego czasami po imporcie danych z serwera lub pliku nie odświeża Użytkowników. Pomaga wtedy z

tego co testowałem jedynie reconnect. A i przydało by się według mnie - o ile to możliwe, zdarzenie w

stylu OnUserStatusUpdateDone, które zachodzilo my wtedy jak komponent skończy zmieniać status,

dla wszystkich kontaktów, bo jak zmian jest więcej niż jedna to przydało by się to w takim celu aby

na przykład w OnUserStatus ukryć ListBox z userami, a w OnDone go ponownie pokazać na formie.

//...
function StateID(Status : TUserStatus) : Byte;
begin
 case Status of
   usAvailable : Result := 0; // Dostępny
   usBusy : Result := 1; // Zaraz wracam
   usNotAvailable : Result := 2; // Niedostępny
   usInvisible : Result := 3; //Niewidoczny
   usBlocked : Result := 4; //Zablokowany
 else
   Result := 1; // Niedostępny
 end;
end;
// ...
procedure TMainForm.EGGUserStatus(Sender : TObject; User : TUser);
var
 I : Integer;
begin
 Application.ProcessMessages;
 for I := 0 to ContactsLV.Items.Count - 1 do
 begin
   if ContactsLV.Items.Item[I].Data = User then
   begin
     ContactsLV.Items.Item[I].Caption := User.Name;
     ContactsLV.Items.Item[I].SubItems[1] := User.Description;
     ContactsLV.Items.Item[I].SubItems[2] := IntToStr(StateID(User.Status));
   end;
 end;
 ContactsLV.AlphaSort;
 GGL.RefreshItems;
end;

Pozdrawiam: olesio

Link do komentarza
Udostępnij na innych stronach

  • 1 year later...

Witam .

markovcd w Twoim demku wyskakuje błąd gdy rozłączę internet a aplikacja jest zalogowana.

 

Robię aplikacje na tym komponencie i zawsze ten sam problem:

error 1

KODAsynchronous socket error 10053

error 2

KODWindows socket error: Istniejące połączenie zostało gwałtownie zamknięte przez zdalnego hosta (10054),on API 'send'

 

jak usunąć te błędy by ich w ogóle nie pokazywało?

Link do komentarza
Udostępnij na innych stronach

  • 2 months later...

Davai Ja rozwiązałem to tak:

Edytuj EGG.pas.

Dodaj:

 


TEasyGG =class(TEasyGGBase)
private
 .
 .
 .
 procedure ErrorCatch(Sender: TObject; Socket: TCustomWinSocket;
     ErrorEvent: TErrorEvent; var ErrorCode: Integer);
 .
 .
 .
end;

implementation

procedure TEasyGG.ErrorCatch(Sender: TObject; Socket: TCustomWinSocket;
 ErrorEvent: TErrorEvent; var ErrorCode: Integer);
begin
 if (ErrorCode = 10053) or (ErrorCode = 10054) then
 begin
   ErrorCode := 0;
   Status := usNotAvailable;
   Self.Active := False;
 end;
end;

 

W procedurze Create TEasyGG dodaj:

 


Self.OnError := ErrorCatch;

Link do komentarza
Udostępnij na innych stronach

@robson1000

 

Ale dla 10049 ( Windows Socket Error: Żądany adres jest nieprawidłowy w tym kontekście (10049), on API 'Connect') Twój sposób już nie działa.

Błąd pojawia się podczas gdy próbuje się zalogować gdy mam wyłączony internet.

 

Dodałem oczywiście odpowiedniego if'a.

 

Może ktoś by miał jakiś pomysł?

 

Pozdrawiam.

Link do komentarza
Udostępnij na innych stronach

Błąd wywoływany przy próbie zalogowania, przy braku połączenia internetowego, to inna sprawa.

Komponent przed zalogowaniem metodą HTTP GET pobiera host i port z którym następnie się łączy.

Błąd jest generowany w funkcji HttpGetText i nie można go przechwycić procedurą którą podałem.

 

Moje rozwiązanie wygląda tak:

Edytuj plik EGGFuncts.pas.

Funkcję HttpGetText sprowadź do takiej postaci:

 


function HttpGetText(URL: string): string;
var
 FClientSocket: TClientSocket;
 SockStream: TWinSocketStream;
 Host, Request: String;
 Buffer: array[0..254] of Char;
const
 DATA = 'GET %s HTTP/1.1' + rn +
    'Connection: Keep-Alive' + rn +
    'Host: %s' + rn + rn;
begin
 FillChar(Buffer, SizeOf(Buffer), #0);

 if Copy(URL, 1, 7) = 'http://' then
   URL := Copy(URL, 8, Length(URL));
 Host := Copy(URL, 1, Pos('/', URL) - 1);
 Request := Copy(URL, Pos('/', URL), Length(URL));

 Request := Format(DATA, [Request, Host]);

 FClientSocket := TClientSocket.Create(nil);
 FClientSocket.Host := Host;
 FClientSocket.Port := 80;
 FClientSocket.ClientType := ctBlocking;

 SockStream := nil;
 try
   FClientSocket.Active := True; // uzyskanie polaczenia
   SockStream := TWinSocketStream.Create(FClientSocket.Socket, 60000); // utworzenie streamu
   SockStream.Write(Request[1], Length(Request));
   SockStream.Read(Buffer, SizeOf(Buffer));
   Result := Buffer;
   Result := Trim(Copy(Result, Pos(rn + rn, Result), Length(Result)));
   FClientSocket.Active := False;
 except
   FClientSocket.Active := False;
   Result := '';
 end;
 if SockStream <> nil then
   SockStream.Free;
 FClientSocket.Free;
end;

 

Poniżej w procedurze GetHost dodaj na samym początku:

 

APort := 0;
Następnie przejdź do pliku EGG.pas i edytuj procedurę TEasyGG.Connect do takiej postaci:

KOD


procedure TEasyGG.Connect;
var
 sHost: String;
 iPort: Integer;
begin
 if FAutoHost and (not Active) then begin
   GetHost(UID, sHost, iPort); // automatyczne pobranie adresu serwera
   Host := sHost;
   Port := iPort;
 end;
 if (Host = '') or (Port = 0) then
 begin
   Status := usNotAvailable;
   if Assigned(OnDisconnect) then
     OnDisconnect(Self, Socket);
 end
 else
   inherited;
end;

 

UWAGA! Jeśli uruchomimy program w Delphi, to błąd i tak zostanie przechwycony i pokazany, jeśli jednak uruchomimy program z pliku exe to błąd się nie pokaże.

Link do komentarza
Udostępnij na innych stronach

Ja nie mam zbyt dużej wiedzy na temat "gołych" socketów - pewnie jak napisano w odpowiedzi podany sposób działa, ale można zrobić też prościej i również zadziała, oczywiście przy odpaleniu exeka z poza IDE. Modyfikujemy eggfuncts.pas tak jak pokazałem poniżej. Czyli najprostsze jakie może być przechwycenie wyjątku.

procedure GetHost(const AUID : Integer; var AHost : string; var APort : Integer);
var
 s : string;
 i, j : Integer;
const
 URL = 'http://appmsg.gadu-gadu.pl/appsvc/appmsg_ver8.asp?fmnumber=%d&lastmsg=0&version=%s';
begin
 try // fix
   s := HttpGetText(Format(URL, [AUID, GG_VERSION]));
   i := LastDelimiter(' ', s);
   AHost := Trim(Copy(s, i + 1, Length(s)));
   j := LastDelimiter(':', s);
   if j <> 0 then
     APort := StrToInt(Copy(s, j + 1, i - j - 1));
 except
 end;
end;

Pozdrawiam: olesio

Link do komentarza
Udostępnij na innych stronach

  • 3 weeks later...

Tak, komponent świetny, tylko szkoda, że nie jest już rozwijany. Może ktoś go jakoś zmodyfikował np. nie wiem, rozwiązał problem z listą kontaktów powyżej 160, poprawił jakieś inne błędy lub dodał jakieś bajery typu wysyłanie i odbieranie obrazków itp?

Link do komentarza
Udostępnij na innych stronach

Zarchiwizowany

Ten temat jest archiwizowany i nie można dodawać nowych odpowiedzi.

×
×
  • Utwórz nowe...