void CFileHandler::HandleClientFileRequest(CMsgConn* pMsgConn, CImPduClientFileRequest* pPdu) { string from_id_url(pPdu->GetFromId(), pPdu->GetFromIdLen()); uint32_t from_id = urltoid(from_id_url.c_str()); string to_id_url(pPdu->GetToId(), pPdu->GetToIdLen()); uint32_t to_id = urltoid(to_id_url.c_str()); string file_name(pPdu->GetFileName(), pPdu->GetFileNameLen()); uint32_t file_size = pPdu->GetFileSize(); log("HandleClientFileRequest, %u->%u, fileName: %s\n", from_id, to_id, file_name.c_str()); CPduAttachData attach(ATTACH_TYPE_HANDLE, pMsgConn->GetHandle(), 0, NULL, 0); CImUser* pUser = CImUserManager::GetInstance()->GetImUserById(to_id); if (pUser) { uint32_t client_type_flag = pUser->GetClientTypeFlag(); //to_user has pc_client in this msg_server if ((client_type_flag & CLIENT_TYPE_FLAG_BOTH) == CLIENT_TYPE_FLAG_PC) { CFileServConn* pFileConn = get_random_file_serv_conn(); if (pFileConn) { CImPduMsgFileTransferReq pdu(from_id, to_id, file_name.c_str(), file_size, FILE_TYPE_ONLINE, attach.GetLength(), attach.GetBuffer()); pdu.SetReserved(pPdu->GetReserved()); pFileConn->SendPdu(&pdu); } else { log("HandleClientFileRequest, no file server.\n"); CImPduClientFileResponse pdu2(REFUSE_REASON_NO_FILE_SERVER, from_id_url.c_str(), to_id_url.c_str(), file_name.c_str(), NULL, NULL, 0); pdu2.SetReserved(pPdu->GetReserved()); pMsgConn->SendPdu(&pdu2); } return; } } else { //no pc_client in this msg_server, check it from route_server CRouteServConn* pConn = get_route_serv_conn(); CPduAttachData pduAttachData(ATTACH_TYPE_HANDLE_AND_PDU, pMsgConn->GetHandle(), pPdu->GetLength(), pPdu->GetBuffer()); CImPduUserClientTypeRequest pdu3(to_id, pduAttachData.GetLength(), pduAttachData.GetBuffer()); pdu3.SetReserved(pPdu->GetReserved()); pConn->SendPdu(&pdu3); } }
void CRouteServConn::_HandleUserClientTypeResponse(CImPduUserClientTypeResponse *pPdu) { uint32_t client_type_flag = pPdu->GetClientTypeFlag(); uint32_t attach_len = pPdu->GetAttachLen(); uchar_t* attach_data = pPdu->GetAttachData(); CPduAttachData pduAttachData(attach_data, attach_len); CImPduClientFileRequest pdu(pduAttachData.GetPdu(), pduAttachData.GetPduLength()); string from_id_url(pdu.GetFromId(), pdu.GetFromIdLen()); uint32_t from_id = urltoid(from_id_url.c_str()); string to_id_url(pdu.GetToId(), pdu.GetToIdLen()); uint32_t to_id = urltoid(to_id_url.c_str()); string file_name(pdu.GetFileName(), pdu.GetFileNameLen()); uint32_t file_size = pdu.GetFileSize(); uint32_t handle = pduAttachData.GetHandle(); log("HandleUserClientTypeResponse, from_user_id: %u, to_user_id: %u, file_name: %s\n", from_id, to_id, file_name.c_str()); uint32_t trans_mode = FILE_TYPE_OFFLINE; if ((client_type_flag & CLIENT_TYPE_FLAG_BOTH) == CLIENT_TYPE_FLAG_PC) { trans_mode = FILE_TYPE_ONLINE; } CPduAttachData attach(ATTACH_TYPE_HANDLE, handle, 0, NULL, 0); CImPduMsgFileTransferReq pdu2(from_id, to_id, file_name.c_str(), file_size, trans_mode, attach.GetLength(), attach.GetBuffer()); pdu2.SetReserved(pPdu->GetReserved()); CFileServConn* pConn = get_random_file_serv_conn(); if (pConn) { pConn->SendPdu(&pdu2); } else { log("HandleUserClientTypeResponse, no file server\n"); CImPduClientFileResponse pdu3(REFUSE_REASON_NO_FILE_SERVER, from_id_url.c_str(), to_id_url.c_str(), file_name.c_str(), NULL, NULL, 0); pdu3.SetReserved(pPdu->GetReserved()); CMsgConn* pMsgConn = CImUserManager::GetInstance()->GetMsgConnByHandle(from_id,handle); if (pMsgConn) { pMsgConn->SendPdu(&pdu3); } } }
/* * Check that we can inflate a Root PDU that contains other PDUs */ void RootInflatorTest::testInflatePDU() { MockPDU pdu1(1, 2); MockPDU pdu2(4, 8); PDUBlock<PDU> block; block.AddPDU(&pdu1); block.AddPDU(&pdu2); CID cid = CID::Generate(); RootPDU pdu(MockPDU::TEST_VECTOR, cid, &block); OLA_ASSERT_EQ((unsigned int) 50, pdu.Size()); unsigned int size = pdu.Size(); uint8_t *data = new uint8_t[size]; unsigned int bytes_used = size; OLA_ASSERT(pdu.Pack(data, &bytes_used)); OLA_ASSERT_EQ((unsigned int) size, bytes_used); MockInflator mock_inflator(cid); RootInflator inflator; inflator.AddInflator(&mock_inflator); HeaderSet header_set; OLA_ASSERT(inflator.InflatePDUBlock(&header_set, data, size)); delete[] data; }