Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Wysyłanie obrazka
Konnekt | Forum > Developerzy > Tworzenie wtyczek
bulanh
Witam.

Chciałbym programowo wysłać obrazek do innego klienta w sieci GG. Korzystając z helpa Konnekt'a wymyśliłem coś takiego:
CODE

    cMessage msg;
    memset(&msg, 0, sizeof(cMessage));
    msg.s_size = sizeof(cMessage);
    msg.type = MT_IMAGE;
    msg.ext = "C:\\Program Files\\Konnekt\\profiles\\Adam\\4Coders2\\temp.gif"; // Ścieżka do pliku
    msg.flag = MF_HANDLEDBYUI;
    msg.net = NET_GG;
    msg.toUid = "Numer odbiorcy";
    msg.fromUid = "Mój numer";
    msg.time = 0;
    sMESSAGESELECT ms;
    ms.id = ICMessage(IMC_NEWMESSAGE, (int)&msg);
    if (ms.id) ICMessage(IMC_MESSAGEQUEUE, (int)&ms);

Jak się łatwo domyślić coś nie działa. Nie wiem jednak co. Plik jest formatu GIF i zajmuje ok. 160B. Wysłanie go za pomocą GGImage kończy się sukcesem. Co robie źle i jak to naprawić?

I jeszcze jedno pytanko, aby się ostatecznie upewnić: Kto jest odpowiedzialny za zwalnianie wszelkich zmiennych tekstowych w wiadomościach? Ja jako ten który je zaalokował, Konnekt w momencie kiedy wiadomość została wysłana i jest usuwana z kolejki, czy autor wtyczki, która jako ostatnia przetwarza wiadomość przed wysłaniem (czyli chyba ta, która otrzymuje IM_MSG_OPEN)? Jeżeli ja, to skąd mam wiedzieć kiedy bufor nie jest już potrzebny?
hao
Nie przypominam sobie żeby UI obsługiwało typ MT_IMAGE smile.gif A czy GGImage posiada API do wysyłania to tego też ci nie powiem... Ktoś jest na bieżąco?
Olórin
IT_IMAGE jest przez GGImage obsługiwane (patrząc w kod), w ext należy ustawić pole MEX_FILE_PATH makrem SetExtParam lub można też IMessage o numerze 1331100 do ggimage, p1 = (char*)plik , p2 = (int)cnt
bulanh
Wysłanie messaga do GGImage działa bez problemu. Dzięki.

Mógłby ktoś jeszcze mi wytłumaczyć sprawę tych buforów? Trapi mnie to trochę.
hao
Konnekt robi własne kopie danych. Jeżeli używasz jakichkolwiek buforów do tworzenia wiadomości może je zwolnić po wywołaniu IMC_NEWMESSAGE.
Olórin
A co jeżeli chcemy zmodyfikować wiadomość w IM_MSG_RCV?
bulanh
Myślałem (albo przeczytałem), żeby skopiować starą wiadomość, zmodyfikować kopię, dodać ją do kolejki, a pierwowzór usunąć zwracając IM_MSG_delete. (Należałoby się zabezpieczyć przed zapętleniem).
Olórin
Takim sposobem stważamy wiele problemów - tego sposobu używał kpilot2, no i działało jak działało. W swoim patchu modyfikowałem wskaźnik i działa, chociaż pewnie bufory nie są nigdy zwalniane wink.gif
bulanh
Pamiętam, że próbowałem podmieniać wskaźnik do bufora, a stary zwalniać za pomocą: free(), delete, delete[], Ctrl->free(). Wszystko kończyło się błędem.
Olórin
Patrząc na szybko do kodu
CODE
                char * b = (char*)Ctrl->GetTempBuffer(body.length()+1);
                strcpy(b,body.c_str());
                m->body = b;

                return IM_MSG_update;

Czyli bufor nie był zwalniany wink.gif
bulanh
Czyli pozostaje pytanie: Jak zwolnić podmieniony wskaźnik w IMG_MSG_RCV? Przyznam, że odpowiedź może mi się przydać do nowej wersji 4Coders smile.gif
Olórin
Wydaje mi się że tutaj pogrzebany jest przysłowiowy pies - chyba nie sposobu na to, bo wtyczka korektor nie mogła być dokończona jak należy...
piech
chciałem jednak iść dziś spać, a widzę, że sam tego nie zrobię

bulanh, jak wysłać obrazek? Proszę...

Obiecuje, że do poniedziałku nie będę zadawał już żadnych pytań. smile.gif

bulanh
piech: U mnie w kodzie wygląda to w ten sposób:
CODE

Ctrl->IMessageDirect(1331100, 132, (int)sciezka, cntID);

,gdzie "sciezka" to ścieżka do pliku, a "cntID" to ID kontaktu do którego wysyłamy obrazek.
hao
QUOTE(bulanh @ 6.04.2006 - 18:19) *

Czyli pozostaje pytanie: Jak zwolnić podmieniony wskaźnik w IMG_MSG_RCV? Przyznam, że odpowiedź może mi się przydać do nowej wersji 4Coders smile.gif


Nie wolno zwalniać poprzedniego bufora w MSG_RCV. Można co najwyżej podstawić swój własny wskaźnik.

Zamiast go alokować lepszym sposobem jest użycie bufora tymczasowego z Ctrl->GetTempBuffer(). Bufory tymczasowe są osobne dla każdej wtyczki i każdego wątku, więc dopóki ta sama wtyczka w tym samym wątku ponownie nie wywoła tej funkcji - jesteśmy bezpieczni.

Po wysłaniu do wszystkich wtyczek MSG_RCV dane są od razu zapisywane do DataTable (jako kopia), a więc nasz bufor już nie jest potrzebny i spokojnie może zostać nadpisany...

Trzeba tylko się jakoś zabezpieczyć przed dopisywaniem nowych wiadomości w trakcie rozsyłania MSG_RCV (gdy któraś wtyczka w odpowiedzi na MSG_RCV dodaje nową wiadomość do kolejki). To powoduje że nasza wtyczka może skorzystać z bufora tymczasowego ponownie nadpisując wcześniej ustawione dane zanim zostały zapisane do bazu dla poprzedniej wiadomości...
piech
miałem nie pisać, ale ciągle nie mogę wysłać obrazka.

chcę wysłać do użytkownika o numerze gg 7133841
więc chyba ID pobieram w ten sposób
CODE

int  id = ICMessage(IMC_FINDCONTACT, NET_GG,(int)"7133841");

Ctrl->IMessageDirect(1331100, 132, (int)"C:\\a.jpg",id);
Ctrl->IMessageDirect(1331100, 1331, (int)"C:\\a.jpg",id)

132 to numer net ggimage? nie 1331?
http://www.konnekt.info/forum/index.php?sh...=warto%B6ci+net
zresztą i tak żadna wersja mi nie działa.

Może brakuje mi jakiegoś kodu. powiedzmy Ctrl->update?
Olórin
A skąd się wzięło IMessageDirect? Zwykłe IMessage ma być! No i prawda, net to 1331 ;]
bulanh
Mój błąd. Napisałeś, aby wysłać wiadomość do wtyczki więc patrząc po nazwach funkcji uznałem, że IMessageDirect będzie odpowiednie. Spróbowałem, zadziałało, więc zostawiłem.
piech
kawałek kodu wysyłającego obrazek do sieci gg. (żeby inni nie musieli się męczyć)
CODE

int  id = ICMessage(IMC_FINDCONTACT, NET_GG,(int)"xxxxxx"); //zamiast xxxxxx wstaw numer gg odbiorcy
IMessage(1331100  , 1331,NET_BROADCAST , (int)"C:\\a.jpg",id);

uff działa
czy użycie flagi NET_BROADCAST jest w tym wypadku najwłaściwsze?
Olórin
Nie, jako type podaj IMT_ALL.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2012 Invision Power Services, Inc.