void CRouteServConn::_HandleClientDelFriendNotify(CImPdu* pPdu) { IM::Buddy::IMCommonOperFriendRes msg; CHECK_PB_PARSE_MSG(msg.ParseFromArray(pPdu->GetBodyData(), pPdu->GetBodyLength())); log(" user_id=%d friend_id=%d.", msg.user_id(), msg.friend_id()); //send to other client CImUser* pFromImUser = CImUserManager::GetInstance()->GetImUserById(msg.user_id()); if (pFromImUser) { pPdu->SetCommandId(DFFX_CID_BUDDY_LIST_DELFRIEND_RES); pFromImUser->BroadcastPdu(pPdu); } // 2.send notify to myfriend uint32_t to_user_id = msg.friend_id(); CImUser* pToImUser = CImUserManager::GetInstance()->GetImUserById(to_user_id); if (pToImUser) { pPdu->SetCommandId(DFFX_CID_BUDDY_LIST_DELFRIEND_NOTIFY); pToImUser->BroadcastPdu(pPdu); } }
void CRouteServConn::_HandleGroupP2PMsg(CImPduGroupP2PMessageResponse* pPdu) { uint32_t result = pPdu->GetResult(); uint32_t from_user_id = pPdu->GetReqUserId(); uint32_t* toUserList = pPdu->GetUserList(); log("_HandleGroupP2PMsg, from_user_id = %u, result = %u, to_user_cnt = %u.\n", from_user_id, result, pPdu->GetUserCnt()); if(result != 0 || !toUserList) return; for (int i = 0; i < pPdu->GetUserCnt(); ++i) { uint32_t to_user_id = toUserList[i]; CImUser* pToImUser = CImUserManager::GetInstance()->GetImUserById(to_user_id); if (pToImUser) { uint32_t seq_no = 0; string from_id_url = idtourl(from_user_id); string to_id_url = idtourl(to_user_id); CImPduClientP2PCmdMsg pdu(seq_no, from_id_url.c_str(), to_id_url.c_str(), pPdu->GetMsgDataLen(), pPdu->GetMsgData()); pToImUser->BroadcastPdu(&pdu); } } }
// friend online/off-line notify void CRouteServConn::_HandleFriendStatusNotify(CImPduFriendStatusNotify* pPdu) { uint32_t user_id = pPdu->GetFromUserId(); uint32_t user_status = pPdu->GetFromUserStatus(); uint32_t friend_cnt = pPdu->GetFriendCnt(); uint32_t* friend_id_list = pPdu->GetFriendIdList(); string user_id_url = idtourl(user_id); log("HandleFriendStatusNotify, from_id=%u, status=%u\n", user_id, user_status); // send friend online message to client CImPduClientFriendNotify pdu(user_id_url.c_str(), user_status); for (uint32_t i = 0; i < friend_cnt; ++i) { CImUser* pImUser = CImUserManager::GetInstance()->GetImUserById(friend_id_list[i]); if (pImUser) { pImUser->BroadcastPdu(&pdu); if (user_status == USER_STATUS_ONLINE) { pImUser->AddOnlineFriend(user_id); } else if (user_status == USER_STATUS_OFFLINE){ pImUser->RemoveOnlineFriend(user_id); } } } }
void CGroupChat::_SendPduToUser(CImPdu* pPdu, uint32_t user_id, CMsgConn* pReqConn) { if(!pPdu) { return; } CImUser* pToUser = CImUserManager::GetInstance()->GetImUserById(user_id); if(pToUser) { pToUser->BroadcastPdu(pPdu, pReqConn); } }
void CRouteServConn::_HandleP2PMsg(CImPduP2PMsg* pPdu) { uint32_t from_user_id = pPdu->GetFromUserId(); uint32_t to_user_id = pPdu->GetToUserId(); uint32_t seq_no = pPdu->GetSeqNo(); string from_id_url = idtourl(from_user_id); string to_id_url = idtourl(to_user_id); CImPduClientP2PCmdMsg pdu(seq_no, from_id_url.c_str(), to_id_url.c_str(), pPdu->GetMsgLen(), pPdu->GetMsgData()); log("HandleP2PMsg, %u->%u\n", from_user_id, to_user_id); CImUser* pFromImUser = CImUserManager::GetInstance()->GetImUserById(from_user_id); CImUser* pToImUser = CImUserManager::GetInstance()->GetImUserById(to_user_id); if (pFromImUser) { pFromImUser->BroadcastPdu(&pdu); } if (pToImUser) { pToImUser->BroadcastPdu(&pdu); } }
void CRouteServConn::_HandleP2PMsg(CImPdu* pPdu) { IM::SwitchService::IMP2PCmdMsg msg; CHECK_PB_PARSE_MSG(msg.ParseFromArray(pPdu->GetBodyData(), pPdu->GetBodyLength())); uint32_t from_user_id = msg.from_user_id(); uint32_t to_user_id = msg.to_user_id(); log("HandleP2PMsg, %u->%u ", from_user_id, to_user_id); CImUser* pFromImUser = CImUserManager::GetInstance()->GetImUserById(from_user_id); CImUser* pToImUser = CImUserManager::GetInstance()->GetImUserById(to_user_id); if (pFromImUser) { pFromImUser->BroadcastPdu(pPdu); } if (pToImUser) { pToImUser->BroadcastPdu(pPdu); } }
void CRouteServConn::_HandleRemoveSessionNotify(CImPdu *pPdu) { IM::Buddy::IMRemoveSessionNotify msg; CHECK_PB_PARSE_MSG(msg.ParseFromArray(pPdu->GetBodyData(), pPdu->GetBodyLength())); uint32_t user_id = msg.user_id(); uint32_t session_id = msg.session_id(); log("HandleRemoveSessionNotify, user_id=%u, session_id=%u ", user_id, session_id); CImUser* pUser = CImUserManager::GetInstance()->GetImUserById(user_id); if (pUser) { pUser->BroadcastPdu(pPdu); } }
void CRouteServConn::_HandleClientFriendNotifyRequest(CImPdu* pPdu) { IM::Buddy::IMFriendNotifyReq msg; CHECK_PB_PARSE_MSG(msg.ParseFromArray(pPdu->GetBodyData(), pPdu->GetBodyLength())); log(" from_user_id=%d to_user_id=%d.", msg.from_user_id(), msg.to_user_id()); uint32_t to_user_id = msg.to_user_id(); CImUser* pToImUser = CImUserManager::GetInstance()->GetImUserById(to_user_id); if (pToImUser) { pToImUser->BroadcastPdu(pPdu); } }
void CRouteServConn::_HandleFriendStatusList(CImPduFriendStatusList* pPdu) { uint32_t user_id = pPdu->GetFromUserId(); uint32_t friend_cnt = pPdu->GetFriendCnt(); user_stat_t* friend_status_list = pPdu->GetFriendStatList(); string user_id_url = idtourl(user_id); log("HandleOnlineFriendList, from_id=%d\n", user_id); CImUser* pImUser = CImUserManager::GetInstance()->GetImUserById(user_id); if (!pImUser) { return; } // send online friend status list to client CImPduClientOnlineFriendList pduCOFL(pPdu->GetRequestType(), friend_cnt, friend_status_list); pImUser->BroadcastPdu(&pduCOFL); // user don't need to send self status to friend list if (pPdu->GetRequestType() == ONLINE_LIST_TYPE_FRIEND_LIST) { return; } // send online friend notify packet to the client in the same message server CImPduClientFriendNotify pduCFN(user_id_url.c_str(), pImUser->GetIMOnlineStatus()); for (uint32_t i = 0; i < friend_cnt; i++) { pImUser->AddOnlineFriend(friend_status_list[i].user_id); CImUser* pFriendUser = CImUserManager::GetInstance()->GetImUserById(friend_status_list[i].user_id); if (pFriendUser) { //log("notify %u online to %u\n", user_id, friend_status_list[i].user_id); pFriendUser->BroadcastPdu(&pduCFN); pFriendUser->AddOnlineFriend(user_id); } } }
void CRouteServConn::_HanddleClientOrderStatusReadMsgBraodcast(CImPdu* pPdu) { IM::Message::IMOrderStatusRead msg; CHECK_PB_PARSE_MSG(msg.ParseFromArray(pPdu->GetBodyData(), pPdu->GetBodyLength())); log("CRouteServConn user_id = %d order_id = %d orderlist_is_null = %d", msg.user_id(), msg.order_id(), msg.orderlist_is_null()); //send to other client CImUser* pFromImUser = CImUserManager::GetInstance()->GetImUserById(msg.user_id()); if (pFromImUser) { pFromImUser->BroadcastPdu(pPdu); } }
void CRouteServConn::_HandleDBReverseAddFriendRes(CImPdu* pPdu) { IM::Buddy::IMCommonOperFriendRes msg; CHECK_PB_PARSE_MSG(msg.ParseFromArray(pPdu->GetBodyData(), pPdu->GetBodyLength())); log(" user_id=%d friend_id=%d.", msg.user_id(), msg.friend_id()); //send to other client CImUser* pFromImUser = CImUserManager::GetInstance()->GetImUserById(msg.user_id()); if (pFromImUser) { pFromImUser->BroadcastPdu(pPdu); } }
void CDBServConn::_HandleChangeAvatarResponse(CImPdu* pPdu) { IM::Buddy::IMChangeAvatarRsp msg; CHECK_PB_PARSE_MSG(msg.ParseFromArray(pPdu->GetBodyData(), pPdu->GetBodyLength())); uint32_t user_id = msg.user_id(); uint32_t result = msg.result_code(); log("HandleChangeAvatarResp, user_id=%u, result=%u.", user_id, result); CImUser* pUser = CImUserManager::GetInstance()->GetImUserById(user_id); if (NULL != pUser) { msg.clear_attach_data(); pPdu->SetPBMsg(&msg); pUser->BroadcastPdu(pPdu); } }
void CRouteServConn::_HandleMsgReadNotify(CImPdu *pPdu) { IM::Message::IMMsgDataReadNotify msg; CHECK_PB_PARSE_MSG(msg.ParseFromArray(pPdu->GetBodyData(), pPdu->GetBodyLength())); uint32_t req_id = msg.user_id(); uint32_t session_id = msg.session_id(); uint32_t msg_id = msg.msg_id(); uint32_t session_type = msg.session_type(); log("HandleMsgReadNotify, user_id=%u, session_id=%u, session_type=%u, msg_id=%u. ", req_id, session_id, session_type, msg_id); CImUser* pUser = CImUserManager::GetInstance()->GetImUserById(req_id); if (pUser) { pUser->BroadcastPdu(pPdu); } }
void CFileHandler::HandleFileNotify(CImPduFileNotify *pPdu) { uint32_t from_user_id = pPdu->GetFromId(); uint32_t to_user_id = pPdu->GetToId(); string file_name(pPdu->GetFileName(), pPdu->GetFileNameLen()); uint32_t file_size = pPdu->GetFileSize(); string task_id(pPdu->GetTaskId(), pPdu->GetTaskIdLen()); string listen_ip(pPdu->GetListenIp(), pPdu->GetListenIpLen()); uint32_t listen_port = pPdu->GetListenPort(); log("HandleFileNotify, from_id: %u, to_id: %u, file_name: %s, task_id: %s, file_server_ip: %s,\ file_server_port: %u.\n", from_user_id, to_user_id, file_name.c_str(), task_id.c_str(), listen_ip.c_str(), listen_port); CImUser* pUser = CImUserManager::GetInstance()->GetImUserById(to_user_id); if (pUser) { CImPduClientFileNotify pdu(idtourl(from_user_id), idtourl(to_user_id), file_name.c_str(), file_size, task_id.c_str(), listen_ip.c_str(), listen_port); pUser->BroadcastPdu(&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; } } } }