Example #1
0
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);
    }
}
Example #2
0
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;
}