void TcpSocketsManager::unRegisterCallback(net_handle_t handle) { CImConn* pConn = TcpSocketsManager::getInstance()->get_client_conn(handle); if (pConn) pConn->unRegisterCallback(); release_by_handle(handle); }
static CImConn* FindImConn(ConnMap_t* imconn_map, net_handle_t handle) { CImConn* pConn = NULL; ConnMap_t::iterator iter = imconn_map->find(handle); if (iter != imconn_map->end()) { pConn = iter->second; pConn->AddRef(); } return pConn; }
net_handle_t TcpSocketsManager::connect(const char* server_ip, uint16_t server_port) { CImConn* pConn = new CImConn; net_handle_t handle = pConn->Connect(server_ip, server_port); if (handle != SOCKET_ERROR) { m_client_conn_map[handle] = pConn; } return handle; }
void imconn_callback(void* callback_data, uint8_t msg, uint32_t handle, void *param) { NOTUSED_ARG(handle); NOTUSED_ARG(param); if (!callback_data) { return; } ConnMap_t *conn_map = (ConnMap_t*) callback_data; CImConn* pConn = FindImConn(conn_map, handle); if (!pConn) { return; } switch (msg) { case NETLIB_MSG_CONFIRM: pConn->OnConfirm(); break; case NETLIB_MSG_READ: pConn->OnRead(); break; case NETLIB_MSG_WRITE: pConn->OnWrite(); break; case NETLIB_MSG_CLOSE: pConn->OnClose(); break; default: break; } pConn->ReleaseRef(); }
void imconn_callback(void* callback_data, uint8_t msg, uint32_t handle, void* pParam) { NOTUSED_ARG(handle); NOTUSED_ARG(pParam); if (!callback_data) return; ConnMap_t* conn_map = (ConnMap_t*)callback_data; CImConn* pConn = FindImConn(conn_map, handle); if (!pConn) return; // logt("msg=%d, handle=%d ", msg, handle); switch (msg) { case NETLIB_MSG_CONFIRM: pConn->OnConfirm(); break; case NETLIB_MSG_READ: pConn->OnRead(); break; case NETLIB_MSG_WRITE: pConn->OnWrite(); break; case NETLIB_MSG_CLOSE: pConn->OnClose(); break; default: log("!!!imconn_callback error msg: %d ", msg); break; } pConn->ReleaseRef(); }
void imconn_callback(void* callback_data, uint8_t msg, uint32_t handle, void* pParam) { NOTUSED_ARG(handle); NOTUSED_ARG(pParam); CImConn* pConn = TcpSocketsManager::getInstance()->get_client_conn(handle); if (!pConn) { //LOG__(NET, _T("connection is invalied:%d"), handle); return; } pConn->AddRef(); // LOG__(NET, "msg=%d, handle=%d\n", msg, handle); switch (msg) { case NETLIB_MSG_CONFIRM: pConn->onConnect(); break; case NETLIB_MSG_READ: pConn->OnRead(); break; case NETLIB_MSG_WRITE: pConn->OnWrite(); break; case NETLIB_MSG_CLOSE: pConn->OnClose(); break; default: LOG__(NET, _T("!!!imconn_callback error msg: %d"), msg); break; } pConn->ReleaseRef(); }
void FileClientConn::_HandleClientFilePullFileRsp(CImPdu *pdu) { if (!auth_ || !transfer_task_) { log("auth is false"); return; } // 只有rsp IM::File::IMFilePullDataRsp pull_data_rsp; CHECK_PB_PARSE_MSG(pull_data_rsp.ParseFromArray(pdu->GetBodyData(), pdu->GetBodyLength())); uint32_t user_id = pull_data_rsp.user_id(); string task_id = pull_data_rsp.task_id(); uint32_t offset = pull_data_rsp.offset(); uint32_t data_size = static_cast<uint32_t>(pull_data_rsp.file_data().length()); const char* data = pull_data_rsp.file_data().data(); // log("Recv FilePullFileRsp, user_id=%d, task_id=%s, file_role=%d, offset=%d, datasize=%d", user_id, task_id.c_str(), mode, offset, datasize); log("Recv FilePullFileRsp, task_id=%s, user_id=%u, offset=%u, data_size=%d", task_id.c_str(), user_id, offset, data_size); int rv = -1; do { // // 检查user_id if (user_id != user_id_) { log("Received user_id valid, recv_user_id = %d, transfer_task.user_id = %d, user_id_ = %d", user_id, transfer_task_->from_user_id(), user_id_); break; } // 检查task_id if (transfer_task_->task_id() != task_id) { log("Received task_id valid, recv_task_id = %s, this_task_id = %s", task_id.c_str(), transfer_task_->task_id().c_str()); // Close(); break; } rv = transfer_task_->DoRecvData(user_id, offset, data, data_size); if (rv == -1) { break; } if (transfer_task_->GetTransMode() == FILE_TYPE_ONLINE) { // 对于在线,直接转发 OnlineTransferTask* online = reinterpret_cast<OnlineTransferTask*>(transfer_task_); pdu->SetSeqNum(online->GetSeqNum()); // online->SetSeqNum(pdu->GetSeqNum()); CImConn* conn = transfer_task_->GetToConn(); if (conn) { conn->SendPdu(pdu); } } else { // 离线 // all packages recved if (rv == 1) { _StatesNotify(CLIENT_FILE_DONE, task_id, user_id, this); // Close(); } else { OfflineTransferTask* offline = reinterpret_cast<OfflineTransferTask*>(transfer_task_); IM::File::IMFilePullDataReq pull_data_req; pull_data_req.set_task_id(task_id); pull_data_req.set_user_id(user_id); pull_data_req.set_trans_mode(static_cast<IM::BaseDefine::TransferFileType>(offline->GetTransMode())); pull_data_req.set_offset(offline->GetNextOffset()); pull_data_req.set_data_size(offline->GetNextSegmentBlockSize()); ::SendMessageLite(this, SID_FILE, CID_FILE_PULL_DATA_REQ, &pull_data_req); // log("size not match"); } } } while (0); if (rv!=0) { // -1,出错关闭 // 1, 离线上传完成 Close(); } }
void FileClientConn::_HandleClientFilePullFileReq(CImPdu *pdu) { if (!auth_ || !transfer_task_) { log("Recv a client_file_state, but auth is false"); return; } IM::File::IMFilePullDataReq pull_data_req; CHECK_PB_PARSE_MSG(pull_data_req.ParseFromArray(pdu->GetBodyData(), pdu->GetBodyLength())); uint32_t user_id = pull_data_req.user_id(); string task_id = pull_data_req.task_id(); uint32_t mode = pull_data_req.trans_mode(); uint32_t offset = pull_data_req.offset(); uint32_t datasize = pull_data_req.data_size(); log("Recv FilePullFileReq, user_id=%d, task_id=%s, file_role=%d, offset=%d, datasize=%d", user_id, task_id.c_str(), mode, offset, datasize); // rsp IM::File::IMFilePullDataRsp pull_data_rsp; pull_data_rsp.set_result_code(1); pull_data_rsp.set_task_id(task_id); pull_data_rsp.set_user_id(user_id); pull_data_rsp.set_offset(offset); pull_data_rsp.set_file_data(""); // BaseTransferTask* transfer_task = NULL; int rv = -1; do { // 检查user_id if (user_id != user_id_) { log("Received user_id valid, recv_user_id = %d, transfer_task.user_id = %d, user_id_ = %d", user_id, transfer_task_->from_user_id(), user_id_); break; } // 检查task_id if (transfer_task_->task_id() != task_id) { log("Received task_id valid, recv_task_id = %s, this_task_id = %s", task_id.c_str(), transfer_task_->task_id().c_str()); break; } // 离线传输,需要下载文件 // 在线传输,从发送者拉数据 // user_id为transfer_task.to_user_id if (!transfer_task_->CheckToUserID(user_id)) { log("user_id equal transfer_task.to_user_id, but user_id=%d, transfer_task.to_user_id=%d", user_id, transfer_task_->to_user_id()); break; } rv = transfer_task_->DoPullFileRequest(user_id, offset, datasize, pull_data_rsp.mutable_file_data()); if (rv == -1) { break; } pull_data_rsp.set_result_code(0); if (transfer_task_->GetTransMode() == FILE_TYPE_ONLINE) { OnlineTransferTask* online = reinterpret_cast<OnlineTransferTask*>(transfer_task_); online->SetSeqNum(pdu->GetSeqNum()); CImConn* conn = transfer_task_->GetOpponentConn(user_id); if (conn) { conn->SendPdu(pdu); // SendMessageLite(conn, SID_FILE, CID_FILE_PULL_DATA_RSP, pdu->GetSeqNum(), &pull_data_rsp); } // SendPdu(&pdu); } else { SendMessageLite(this, SID_FILE, CID_FILE_PULL_DATA_RSP, pdu->GetSeqNum(), &pull_data_rsp); if (rv == 1) { _StatesNotify(CLIENT_FILE_DONE, task_id, transfer_task_->from_user_id(), this); } } // rv = 0; } while (0); if (rv!=0) { Close(); } }
void TcpSocketsManager::registerCallback(net_handle_t handle, ITcpSocketCallback* pCB) { CImConn* pConn = TcpSocketsManager::getInstance()->get_client_conn(handle); if (pConn) pConn->registerCallback(pCB); }