Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Wysyłanie nie tego co chce użytkownik
Konnekt | Forum > Developerzy > Tworzenie wtyczek
bulanh
Witam.

Generalnie chciałbym osiągnąć taką rzecz:
Użytkownik pisze sobie coś w tym okienku na dole okna rozmowy, klepie Enter i w tym momencie moja wtyczka dostaje tą wiadomość i oto co powinien robić:
-> usuwa starą wiadomość z kolejki
-> dodaje nową wiadomość do kolejki, z tym że ta wiadomość zostanie tylko wysłana
-> dodaje jeszcze inną wiadomość do kolejki, ale tym razem ta wiadomość zostanie pokazana użytkownikowi.

Nie potrafię jednak skasować wiadomości z kolejki. Próbowałem zwracać IM_MSG_delete, próbowałem IMC_MESSAGEREMOVE, nawet freeMessage(), jednak nic nie działało (wiadomość co prawda nie wysyła się do odbiorcy, ale pokazuje się w oknie rozmowy co według mnie miejsca mieć nie powinno, skoro usunąłem ją z kolejki).

Druga sprawa to IM_MSG_RECV i IM_MSG_SEND. Czym one się różnią? Z moich testów wynikło, że IM_MSG_RECV jest wywoływane za każdym razem gdy wiadomość dodawana jest do kolejki (nawet wiadomość przeznaczona do wysłania). Po co w takim razie istnieje IM_MSG_SEND (zauważyłem, że wywoływane jest później niż IM_MSG_RECV)?

I ostanie: jak dodać do kolejki wiadomość, która zostanie wyświetlona tylko nadawcy (wiadomość pokazywana tylko odbiorcy powinna być z flagą MF_HIDE, tak?)?
hao
IM_MSG_RECV wysyłane jest do wszystkich wtyczek danej sieci (lub wszystkich z typem ALLMESSAGES) w momencie dodawania jej do kolejki i służy do określenia, która wtyczka będzie zajmowała się jej dalszą obsługą...

Wtyczka, która jako ostatnia odpowie IM_MSG_ok otrzyma IM_MSG_OPEN w przypadku wiadomości przychodzących, lub IM_MSG_SEND w przypadku wiadomości wysyłanych...

Jeżeli w IM_MSG_RECV zwrócisz IM_MSG_delete - to zupełnie wystarczy, aby wiadomość nie została dodana do kolejki, a więc i nie wysłana do użytkownika (zostanie jednak zawsze zalogowana w historii w katalogu "Usunięte/nie obsłużone"...

Żeby ukryć taką wiadomość w oknie rozmowy musisz ustawić jej flagę MF_HIDE.

Żeby dodać nową wiadomość do kolejki używasz IMC_NEWMESSAGE, najlepiej kopiując wszystkie parametry z oryginału. Pamiętaj żeby zabezpieczyć swoje usuwanie w IM_MSG_RECV, żeby nie skasować nowo dodawanej wiadomości i nie wpakować się w pętlę...

Żeby wyświetlić wiadomość w oknie rozmowy, jako wiadomość wysłaną przez użytkownika:

CODE

cMessage msg; // msg to wstawienia
Konnekt::UI::Notify::_insertMsg ni(&msg , 0 , true);
ni.act = sUIAction(IMIG_MSGWND , Konnekt::UI::ACT::msg_ctrlview, cntID);
ICMessage(IMI_ACTION_CALL , (int)&ni);


Powyższy kod wywołuje powiadomienie na kontrolce wiadomości... Powiadomień jest z resztą więcej i można nimi również sterować kontrolką wysyłania (msg_ctrlsend) - wszystko siedzi w nagłówku ui_message_controls.h
bulanh
Dzięki za pomoc. Jednakże wyniknął następny problem. Może na początek przedstawię kod funkcji:

CODE

int MessageEvent(cMessage* msg)
{
int cntID;
cMessage *nmsg = new cMessage;
memcpy(nmsg, msg, sizeof(cMessage));

// free(nmsg->body); //2
// Ctrl->free(nmsg->body); //2
// delete [] nmsg->body; //2

nmsg->body = "test";
msg->flag = msg->flag | MF_HIDE | MF_DONTADDTOHISTORY;

if (msg->flag & MF_SEND) cntID = ICMessage(IMC_FINDCONTACT, NET_GG, (int)nmsg->toUid); //3
 else cntID = ICMessage(IMC_FINDCONTACT, NET_GG, (int)nmsg->fromUid); //3

Konnekt::UI::Notify::_insertMsg ni(nmsg, 0, true); //1
ni.act = sUIAction(IMIG_MSGWND, Konnekt::UI::ACT::msg_ctrlview, cntID);
ICMessage(IMI_ACTION_CALL, (int)&ni);

Konnekt::UI::Notify::_insertText t;
t._text = "test";
t.act = sUIAction(IMIG_MSGWND, Konnekt::UI::ACT::msg_ctrlsend, cntID);
ICMessage(IMI_ACTION_CALL, (int)&t);

delete nmsg;
return IM_MSG_delete;
}



Akapit z komentarzem //1 prawidłowo działa tylko dla wiadomości wychodzących. Tzn. jeżeli wiadomość przychodzi to wyświetlana jest najpierw wiadomość testowa, a zaraz pod nią ta "prawdziwa" wiadomość (mimo ustawienia flagi MF_HIDE).

Drugie pytanie: jak zwolnić pamięć zajmowaną przez 'body' wiadomości (wiem, że nie powinienem zwalniać pamięci w tamtym miejscu, ale nie o to chodzi)? Próbowałem jak w akapicie z komentarzem //2, ale wszystkie trzy metody wywoływały "Unhandled exception".

Trzy: Czy linijki z komentarzem //3 są niezbędne? Co prawda, jeżeli wstawię do 'sUIAction' zamiast 'cntID' 'AC_CURRENT' to funkcja nie działa. W takim razie co naprawdę jest ten AC_CURRENT (bo mi się wydawało, że to id aktualnie "używanego" kontaktu)?

Pozdrowienia
Buła
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.