void CRouteServConn::_HandlePCLoginStatusNotify(CImPdu *pPdu) { IM::Server::IMServerPCLoginStatusNotify msg; CHECK_PB_PARSE_MSG(msg.ParseFromArray(pPdu->GetBodyData(), pPdu->GetBodyLength())); uint32_t user_id = msg.user_id(); uint32_t login_status = msg.login_status(); log("HandlePCLoginStatusNotify, user_id=%u, login_status=%u ", user_id, login_status); CImUser* pUser = CImUserManager::GetInstance()->GetImUserById(user_id); if (pUser) { pUser->SetPCLoginStatus(login_status); IM::Buddy::IMPCLoginStatusNotify msg2; msg2.set_user_id(user_id); if (IM_PC_LOGIN_STATUS_ON == login_status) { msg2.set_login_stat(::IM::BaseDefine::USER_STATUS_ONLINE); } else { msg2.set_login_stat(::IM::BaseDefine::USER_STATUS_OFFLINE); } CImPdu pdu; pdu.SetPBMsg(&msg2); pdu.SetServiceId(IM::BaseDefine::SID_BUDDY_LIST); pdu.SetCommandId(IM::BaseDefine::CID_BUDDY_LIST_PC_LOGIN_STATUS_NOTIFY); pUser->BroadcastPduToMobile(&pdu); } }
void CImUserManager::BroadcastPdu(CImPdu* pdu, uint32_t client_type_flag) { CImUser* pImUser = NULL; for (ImUserMap_t::iterator it = m_im_user_map.begin(); it != m_im_user_map.end(); it++) { pImUser = (CImUser*)it->second; if (pImUser->IsValidate()) { switch (client_type_flag) { case CLIENT_TYPE_FLAG_PC: pImUser->BroadcastPduWithOutMobile(pdu); break; case CLIENT_TYPE_FLAG_MOBILE: pImUser->BroadcastPduToMobile(pdu); break; case CLIENT_TYPE_FLAG_BOTH: pImUser->BroadcastPdu(pdu); break; default: break; } } } }