void CTcpPullClient::DoFetch(BYTE* pBuffer, int iLength) { int iIndex = 0; int iRemain = iLength; while(iRemain > 0) { CBufferPtr* pItem = m_pullBuffers->front(); int iItemSize = (int)pItem->Size(); int iCopySize = min(iItemSize, iRemain); memcpy(pBuffer + iIndex, pItem->Ptr(), iCopySize); if(iItemSize > iRemain) { int iLeft = iItemSize - iCopySize; memcpy(pItem->Ptr(), pItem->Ptr() + iCopySize, iLeft); pItem->Realloc(iLeft); } else { m_pullBuffers->pop_front(); delete pItem; } iRemain -= iCopySize; iIndex += iCopySize; } }
CBufferPtr* GeneratePkgBuffer(const TPkgHeader& header, const TPkgBody& body) { int header_len = sizeof(TPkgHeader); int body_len = header.body_len; CBufferPtr* pBuffer = new CBufferPtr(header_len + body_len); memcpy(pBuffer->Ptr(), (BYTE*)&header, header_len); memcpy(pBuffer->Ptr() + header_len, (BYTE*)&body, body_len); return pBuffer; }
EnHandleResult CHttpServerListenerImpl::OnWSMessageComplete(IHttpServer* pSender, CONNID dwConnID) { ::PostOnWSMessageComplete(dwConnID, m_strName); CBufferPtr* pBuffer = nullptr; pSender->GetConnectionExtra(dwConnID, (PVOID*)&pBuffer); VERIFY(pBuffer); BOOL bFinal; BYTE iReserved, iOperationCode; VERIFY(pSender->GetWSMessageState(dwConnID, &bFinal, &iReserved, &iOperationCode, nullptr, nullptr, nullptr)); pSender->SendWSMessage(dwConnID, bFinal, iReserved, iOperationCode, nullptr, pBuffer->Ptr(), (int)pBuffer->Size()); pBuffer->Free(); if(iOperationCode == 0x8) pSender->Disconnect(dwConnID); return HR_OK; }
En_HP_HandleResult CServerDlg::OnWSMessageComplete(HP_HttpServer pSender, HP_CONNID dwConnID) { ::PostOnWSMessageComplete(dwConnID, m_spThis->GetSenderName(pSender)); CBufferPtr* pBuffer = nullptr; ::HP_Server_GetConnectionExtra(pSender, dwConnID, (PVOID*)&pBuffer); VERIFY(pBuffer); BOOL bFinal; BYTE iReserved, iOperationCode; VERIFY(::HP_HttpServer_GetWSMessageState(pSender, dwConnID, &bFinal, &iReserved, &iOperationCode, nullptr, nullptr, nullptr)); ::HP_HttpServer_SendWSMessage(pSender, dwConnID, bFinal, iReserved, iOperationCode, nullptr, pBuffer->Ptr(), (int)pBuffer->Size(), 0); pBuffer->Free(); if(iOperationCode == 0x8) ::HP_Server_Disconnect(pSender, dwConnID, TRUE); return HR_OK; }