void
HippoChatRoomWrapper::onUserStateChanged(HippoPerson *person)
{
    HippoChatState state = hippo_chat_room_get_user_state(delegate_, person);
    if (state == HIPPO_CHAT_STATE_PARTICIPANT) {
        addMember(person);
    } else {
        removeMember(person, true);
    }
}
void
HippoChatRoomWrapper::notifyUserJoin(HippoPerson *user)
{
    for (unsigned long i = 0; i < listeners_.length(); i++)
        listeners_[i]->onUserJoin(this, user);

    HippoPtr<IConnectionPoint> point;
    if (FAILED(connectionPointContainer_.FindConnectionPoint(__uuidof(IHippoChatRoomEvents), &point)))
        return;

    HippoPtr<IEnumConnections> e;
    if (FAILED(point->EnumConnections(&e)))
        return;

    HippoChatState state = hippo_chat_room_get_user_state(delegate_, user);
    g_return_if_fail(state != HIPPO_CHAT_STATE_NONMEMBER);

    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);

    CONNECTDATA data;
    ULONG fetched;
    while (e->Next(1, &data, &fetched) == S_OK) {
        HippoQIPtr<IDispatch> dispatch(data.pUnk);
        if (dispatch) {
            DISPPARAMS dispParams;
            VARIANTARG args[4];

            args[0].vt = VT_BOOL;
            args[0].boolVal = state == HIPPO_CHAT_STATE_PARTICIPANT ? TRUE : FALSE;
            args[1].vt = VT_BSTR;
            args[1].bstrVal = name.m_str;
            args[2].vt = VT_BSTR;
            args[2].bstrVal = photoUrl.m_str;            
            args[3].vt = VT_BSTR;
            args[3].bstrVal = guid.m_str;

            dispParams.rgvarg = args;
            dispParams.cArgs = 4;
            dispParams.cNamedArgs = 0;
            dispParams.rgdispidNamedArgs = NULL;

            HRESULT hr = dispatch->Invoke(HIPPO_DISPID_ONUSERJOIN, IID_NULL, 0 /* LCID */,
                                          DISPATCH_METHOD, &dispParams, 
                                          NULL /* result */, NULL /* exception */, NULL /* argError */);
            if (!SUCCEEDED(hr))
                hippoDebugDialog(L"OnUserJoin invoke failed %x", hr);
        }
    }
}
示例#3
0
void
hippo_chat_room_set_user_state(HippoChatRoom *room,
                               HippoPerson   *person,
                               HippoChatState state)
{
    HippoChatState old_state;
    const char *guid;
    
    g_return_if_fail(HIPPO_IS_CHAT_ROOM(room));
    
    old_state = hippo_chat_room_get_user_state(room, person);
    
    g_debug("Updating chat state room '%s' person '%s/%s' old state %d state %d",
            room->id, hippo_entity_get_guid(HIPPO_ENTITY(person)),
            hippo_entity_get_name(HIPPO_ENTITY(person)) ? 
            hippo_entity_get_name(HIPPO_ENTITY(person)) : "NULL",
            old_state, state);
    
    if (old_state == state)
        return;
    
    guid = hippo_entity_get_guid(HIPPO_ENTITY(person));

    /* so we can remove from our hash tables and then 
     * still safely emit the signal 
     */
    g_object_ref(person);
    
    switch (old_state) {
    case HIPPO_CHAT_STATE_VISITOR:
        g_hash_table_remove(room->viewers, guid);
        break; 
    case HIPPO_CHAT_STATE_PARTICIPANT:
        g_hash_table_remove(room->chatters, guid);
        break;
    case HIPPO_CHAT_STATE_NONMEMBER:
        /* no old entry to remove */        
        break;
    }
    
    switch(state) {
    case HIPPO_CHAT_STATE_VISITOR:
        g_object_ref(person); /* extra ref for the hash */
        g_hash_table_replace(room->viewers, g_strdup(guid), person);
        break; 
    case HIPPO_CHAT_STATE_PARTICIPANT:
        g_object_ref(person); /* extra ref for the hash */    
        g_hash_table_replace(room->chatters, g_strdup(guid), person);    
        break;
    case HIPPO_CHAT_STATE_NONMEMBER:
        /* no new entry to insert */
        break;
    }

    g_signal_emit(room, signals[USER_STATE_CHANGED], 0, person);

    if (!room->loading && old_state == HIPPO_CHAT_STATE_NONMEMBER) {
        g_signal_emit(room, signals[USER_JOINED], 0, person);
    }

    g_object_unref(person);
}