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