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);
        }
    }
}
Example #2
0
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));
}
Example #4
0
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;
}