gboolean gnomegadu_protocol_send_message_confer (GList *uin_list_parm, gchar *msg) { GList *uin_list = uin_list_parm; gint recipients_count = g_list_length(uin_list); uin_t *recipients = g_malloc(recipients_count * sizeof (uin_t)); gchar *msg_windows1250 = NULL; gboolean ret = TRUE; gint i = 0; g_assert(uin_list); if (!gnomegadu_protocol_check_connected()) return FALSE; while (uin_list) { if (uin_list->data != NULL) recipients[i++] = g_ascii_strtod((gchar *) uin_list->data,NULL); uin_list = g_list_next(uin_list); } msg_windows1250 = g_convert (msg, strlen (msg), "WINDOWS-1250", "UTF-8", NULL, NULL, NULL); if (gg_send_message_confer(gnomegadu_gadugadu_session, GG_CLASS_CHAT, recipients_count, recipients, msg_windows1250) == -1) ret = FALSE; g_free(msg_windows1250); g_free(recipients); return ret; /*czy tu nie trzeba zwolnic tego recipients ? */ }
bool GaduChatService::sendMessage(const Chat &chat, FormattedMessage &message, bool silent) { kdebugf(); QString plain = message.toPlain(); QList<Contact> contacts = chat.contacts().toContactList(); if (plain.isEmpty()) // for image sending message.prepend(FormattedMessagePart(" ", false, false, false, QColor(0, 0, 0))); unsigned int uinsCount = 0; unsigned int formatsSize = 0; QScopedArrayPointer<unsigned char> formats(GaduFormatter::createFormats(Protocol->account(), message, formatsSize)); bool stop = false; kdebugmf(KDEBUG_INFO, "\n%s\n", (const char *)unicode2latin(plain)); QByteArray data = plain.toUtf8(); emit filterRawOutgoingMessage(chat, data, stop); plain = QString::fromUtf8(data); emit filterOutgoingMessage(chat, plain, stop); if (stop) { kdebugmf(KDEBUG_FUNCTION_END, "end: filter stopped processing\n"); return false; } if (data.length() >= 2000) { MessageDialog::show("dialog-warning", tr("Kadu"), tr("Filtered message too long (%1>=%2)").arg(data.length()).arg(2000)); kdebugmf(KDEBUG_FUNCTION_END, "end: filtered message too long\n"); return false; } uinsCount = contacts.count(); int messageId = -1; if (uinsCount > 1) { QScopedArrayPointer<UinType> uins(new UinType[uinsCount]); unsigned int i = 0; foreach (const Contact &contact, contacts) uins[i++] = Protocol->uin(contact); if (formatsSize) messageId = gg_send_message_confer_richtext( Protocol->gaduSession(), GG_CLASS_CHAT, uinsCount, uins.data(), (unsigned char *)data.data(), formats.data(), formatsSize); else messageId = gg_send_message_confer( Protocol->gaduSession(), GG_CLASS_CHAT, uinsCount, uins.data(), (unsigned char *)data.data()); }
int GGPROTO::gc_event(WPARAM, LPARAM lParam) { GCHOOK *gch = (GCHOOK *)lParam; GGGC *chat = NULL; uin_t uin; // Check if we got our protocol, and fields are set if (!gch || !gch->pDest || !gch->pDest->ptszID || !gch->pDest->pszModule || mir_strcmpi(gch->pDest->pszModule, m_szModuleName) || !(uin = getDword(GG_KEY_UIN, 0)) || !(chat = gc_lookup(gch->pDest->ptszID))) return 0; // Window terminated (Miranda exit) if (gch->pDest->iType == SESSION_TERMINATE) { debugLog(_T("gc_event(): Terminating chat %x, id %s from chat window..."), chat, gch->pDest->ptszID); // Destroy chat entry free(chat->recipients); list_remove(&chats, chat, 1); // Remove contact from contact list (duh!) should be done by chat.dll !! for (MCONTACT hContact = db_find_first(); hContact; ) { MCONTACT hNext = db_find_next(hContact); DBVARIANT dbv; if (!getTString(hContact, "ChatRoomID", &dbv)) { if (dbv.ptszVal && !mir_tstrcmp(gch->pDest->ptszID, dbv.ptszVal)) CallService(MS_DB_CONTACT_DELETE, hContact, 0); db_free(&dbv); } hContact = hNext; } return 1; } // Message typed / send only if online if (isonline() && (gch->pDest->iType == GC_USER_MESSAGE) && gch->ptszText) { TCHAR id[32]; UIN2IDT(uin, id); DBVARIANT dbv; GCDEST gcd = { m_szModuleName, gch->pDest->ptszID, GC_EVENT_MESSAGE }; GCEVENT gce = { sizeof(gce), &gcd }; gce.ptszUID = id; gce.ptszText = gch->ptszText; TCHAR* nickT; if (!getTString(GG_KEY_NICK, &dbv)){ nickT = mir_tstrdup(dbv.ptszVal); db_free(&dbv); } else nickT = mir_tstrdup(TranslateT("Me")); gce.ptszNick = nickT; // Get rid of CRLF at back int lc = (int)mir_tstrlen(gch->ptszText) - 1; while(lc >= 0 && (gch->ptszText[lc] == '\n' || gch->ptszText[lc] == '\r')) gch->ptszText[lc --] = 0; gce.time = time(NULL); gce.bIsMe = 1; gce.dwFlags = GCEF_ADDTOLOG; debugLog(_T("gc_event(): Sending conference message to room %s, \"%s\"."), gch->pDest->ptszID, gch->ptszText); CallServiceSync(MS_GC_EVENT, 0, (LPARAM)&gce); mir_free(nickT); T2Utf pszText_utf8(gch->ptszText); gg_EnterCriticalSection(&sess_mutex, "gc_event", 57, "sess_mutex", 1); gg_send_message_confer(sess, GG_CLASS_CHAT, chat->recipients_count, chat->recipients, pszText_utf8); gg_LeaveCriticalSection(&sess_mutex, "gc_event", 57, 1, "sess_mutex", 1); return 1; } // Privmessage selected if (gch->pDest->iType == GC_USER_PRIVMESS) { MCONTACT hContact = NULL; if ((uin = _ttoi(gch->ptszUID)) && (hContact = getcontact(uin, 1, 0, NULL))) CallService(MS_MSG_SENDMESSAGE, hContact, 0); } debugLog(_T("gc_event(): Unhandled event %d, chat %x, uin %d, text \"%s\"."), gch->pDest->iType, chat, uin, gch->ptszText); return 0; }