void HippoChatRoomWrapper::notifyMessage(HippoChatMessage *message) { HippoPerson *user; user = hippo_chat_message_get_person(message); for (unsigned long i = 0; i < listeners_.length(); i++) listeners_[i]->onMessage(this, message); HippoPtr<IConnectionPoint> point; if (FAILED(connectionPointContainer_.FindConnectionPoint(__uuidof(IHippoChatRoomEvents), &point))) return; HippoPtr<IEnumConnections> e; if (FAILED(point->EnumConnections(&e))) return; HippoBSTR name = HippoBSTR::fromUTF8(hippo_entity_get_name(HIPPO_ENTITY(user)), -1); HippoBSTR guid = HippoBSTR::fromUTF8(hippo_entity_get_guid(HIPPO_ENTITY(user)), -1); HippoBSTR photoUrl = HippoBSTR::fromUTF8(hippo_entity_get_small_photo_url(HIPPO_ENTITY(user)), -1); HippoBSTR text = HippoBSTR::fromUTF8(hippo_chat_message_get_text(message), -1); CONNECTDATA data; ULONG fetched; while (e->Next(1, &data, &fetched) == S_OK) { HippoQIPtr<IDispatch> dispatch(data.pUnk); if (dispatch) { DISPPARAMS dispParams; VARIANTARG args[6]; args[0].vt = VT_INT; args[0].intVal = hippo_chat_message_get_serial(message); args[1].vt = VT_R8; args[1].dblVal = (DOUBLE)hippo_chat_message_get_timestamp(message); args[2].vt = VT_BSTR; args[2].bstrVal = text.m_str; args[3].vt = VT_BSTR; args[3].bstrVal = name.m_str; args[4].vt = VT_BSTR; args[4].bstrVal = photoUrl.m_str; args[5].vt = VT_BSTR; args[5].bstrVal = guid.m_str; dispParams.rgvarg = args; dispParams.cArgs = 6; dispParams.cNamedArgs = 0; dispParams.rgdispidNamedArgs = NULL; HRESULT hr = dispatch->Invoke(HIPPO_DISPID_ONMESSAGE, IID_NULL, 0 /* LCID */, DISPATCH_METHOD, &dispParams, NULL /* result */, NULL /* exception */, NULL /* argError */); if (!SUCCEEDED(hr)) hippoDebugDialog(L"OnMessage invoke failed %x", hr); } } }
void hippo_chat_room_add_message(HippoChatRoom *room, HippoChatMessage *message) { GSList *link; GSList *prev; int serial; g_return_if_fail(HIPPO_IS_CHAT_ROOM(room)); serial = hippo_chat_message_get_serial(message); /* highest serial is earliest in the list */ prev = NULL; for (link = room->messages; link != NULL; link = link->next) { HippoChatMessage *old = link->data; int old_serial = hippo_chat_message_get_serial(old); if (old_serial == serial) { /* We already have this message */ hippo_chat_message_free(message); return; } else if (old_serial < serial) { if (prev) { g_assert(prev->next == link); prev->next = g_slist_prepend(prev->next, message); } else { g_assert(link == room->messages); room->messages = g_slist_prepend(room->messages, message); } g_signal_emit(room, signals[MESSAGE_ADDED], 0, message); return; } prev = link; } /* We were lower than all existing serials, or the existing list was empty */ room->messages = g_slist_append(room->messages, message); g_signal_emit(room, signals[MESSAGE_ADDED], 0, message); }
void HippoListenerProxyImpl::onMessage(HippoChatRoom *room, HippoChatMessage *message, HippoEndpointProxy *endpointProxy) { HippoPerson *sender = hippo_chat_message_get_person(message); HippoBSTR chatId = HippoBSTR::fromUTF8(hippo_chat_room_get_id(room), -1); HippoBSTR entityId = HippoBSTR::fromUTF8(hippo_entity_get_guid(HIPPO_ENTITY(sender)), -1); HippoBSTR text = HippoBSTR::fromUTF8(hippo_chat_message_get_text(message), -1); if (listener_) listener_->OnMessage(hippo_endpoint_proxy_get_id(endpointProxy), chatId, entityId, text, hippo_chat_message_get_timestamp(message), hippo_chat_message_get_serial(message)); }
HippoChatMessage* hippo_chat_room_get_last_message(HippoChatRoom *room) { HippoChatMessage *message; g_return_val_if_fail(HIPPO_IS_CHAT_ROOM(room), NULL); if (room->messages == NULL) return NULL; message = room->messages->data; /* -1 message is the post description, which isn't technically * a message, it's displayed only in certain contexts. */ if (hippo_chat_message_get_serial(message) == -1) return NULL; else return message; }