generated from zhangwei/Matrixai
109 lines
2.0 KiB
C++
109 lines
2.0 KiB
C++
// PHZ
|
|
// 2018-5-15
|
|
|
|
#include "BufferReader.h"
|
|
#include "Socket.h"
|
|
#include <cstring>
|
|
|
|
using namespace xop;
|
|
uint32_t xop::ReadUint32BE(char* data)
|
|
{
|
|
uint8_t* p = (uint8_t*)data;
|
|
uint32_t value = (p[0] << 24) | (p[1] << 16) | (p[2] << 8) | p[3];
|
|
return value;
|
|
}
|
|
|
|
uint32_t xop::ReadUint32LE(char* data)
|
|
{
|
|
uint8_t* p = (uint8_t*)data;
|
|
uint32_t value = (p[3] << 24) | (p[2] << 16) | (p[1] << 8) | p[0];
|
|
return value;
|
|
}
|
|
|
|
uint32_t xop::ReadUint24BE(char* data)
|
|
{
|
|
uint8_t* p = (uint8_t*)data;
|
|
uint32_t value = (p[0] << 16) | (p[1] << 8) | p[2];
|
|
return value;
|
|
}
|
|
|
|
uint32_t xop::ReadUint24LE(char* data)
|
|
{
|
|
uint8_t* p = (uint8_t*)data;
|
|
uint32_t value = (p[2] << 16) | (p[1] << 8) | p[0];
|
|
return value;
|
|
}
|
|
|
|
uint16_t xop::ReadUint16BE(char* data)
|
|
{
|
|
uint8_t* p = (uint8_t*)data;
|
|
uint16_t value = (p[0] << 8) | p[1];
|
|
return value;
|
|
}
|
|
|
|
uint16_t xop::ReadUint16LE(char* data)
|
|
{
|
|
uint8_t* p = (uint8_t*)data;
|
|
uint16_t value = (p[1] << 8) | p[0];
|
|
return value;
|
|
}
|
|
|
|
const char BufferReader::kCRLF[] = "\r\n";
|
|
|
|
BufferReader::BufferReader(uint32_t initial_size)
|
|
{
|
|
buffer_.resize(initial_size);
|
|
}
|
|
|
|
BufferReader::~BufferReader()
|
|
{
|
|
|
|
}
|
|
|
|
int BufferReader::Read(SOCKET sockfd)
|
|
{
|
|
uint32_t size = WritableBytes();
|
|
if(size < MAX_BYTES_PER_READ) {
|
|
uint32_t bufferReaderSize = (uint32_t)buffer_.size();
|
|
if(bufferReaderSize > MAX_BUFFER_SIZE) {
|
|
return 0;
|
|
}
|
|
|
|
buffer_.resize(bufferReaderSize + MAX_BYTES_PER_READ);
|
|
}
|
|
|
|
int bytes_read = ::recv(sockfd, beginWrite(), MAX_BYTES_PER_READ, 0);
|
|
if(bytes_read > 0) {
|
|
writer_index_ += bytes_read;
|
|
}
|
|
|
|
return bytes_read;
|
|
}
|
|
|
|
|
|
uint32_t BufferReader::ReadAll(std::string& data)
|
|
{
|
|
uint32_t size = ReadableBytes();
|
|
if(size > 0) {
|
|
data.assign(Peek(), size);
|
|
writer_index_ = 0;
|
|
reader_index_ = 0;
|
|
}
|
|
|
|
return size;
|
|
}
|
|
|
|
uint32_t BufferReader::ReadUntilCrlf(std::string& data)
|
|
{
|
|
const char* crlf = FindLastCrlf();
|
|
if(crlf == nullptr) {
|
|
return 0;
|
|
}
|
|
|
|
uint32_t size = (uint32_t)(crlf - Peek() + 2);
|
|
data.assign(Peek(), size);
|
|
Retrieve(size);
|
|
return size;
|
|
}
|
|
|