123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244 |
- #include <iostream>
- #include <stdexcept>
- #include <iostream>
- #include <cstring>
- #include <sys/socket.h>
- #include "common/stream/Stream.h"
- Stream::Stream(size_t minSize) : dataLength(getSize(minSize)),
- data(new unsigned char[dataLength]), writeIndex(0), readIndex(0)
- {
- }
- Stream::~Stream()
- {
- delete[] data;
- }
- size_t Stream::getSize(size_t minSize) const
- {
- size_t size = 1;
- while(size < minSize && size <= MAX_SIZE)
- {
- size <<= 1;
- }
- return size;
- }
- bool Stream::hasData() const
- {
- return readIndex < writeIndex;
- }
- bool Stream::resize(size_t minSize)
- {
- if(minSize > MAX_SIZE)
- {
- return true;
- }
- size_t newSize = getSize(minSize);
- //cout << "resize from " << dataLength << " to " << newSize << endl;
- unsigned char* newData = new unsigned char[newSize];
- memcpy(newData, data, writeIndex);
- delete[] data;
- data = newData;
- dataLength = newSize;
- return false;
- }
- void Stream::write(const void* writeData, size_t length)
- {
- if(writeIndex + length > dataLength && resize(writeIndex + length))
- {
- std::cout << "write over max stream size" << std::endl;
- return;
- }
- memcpy(data + writeIndex, writeData, length);
- writeIndex += length;
- }
- void Stream::write(const char* writeData)
- {
- write(writeData, strlen(writeData));
- }
- void Stream::writeChar(char c)
- {
- write(&c, sizeof(char));
- }
- void Stream::writeShort(int16_t s)
- {
- write(&s, sizeof(short));
- }
- void Stream::writeInt(int32_t i)
- {
- write(&i, sizeof(int));
- }
- void Stream::writeLong(int64_t l)
- {
- write(&l, sizeof(long));
- }
- void Stream::writeUnsignedChar(uint8_t uc)
- {
- write(&uc, sizeof(unsigned char));
- }
- void Stream::writeUnsignedShort(uint16_t us)
- {
- write(&us, sizeof(unsigned short));
- }
- void Stream::writeUnsignedInt(uint32_t ui)
- {
- write(&ui, sizeof(unsigned int));
- }
- void Stream::writeUnsignedLong(uint64_t ul)
- {
- write(&ul, sizeof(unsigned long));
- }
- bool Stream::read(void* buffer, size_t length)
- {
- if(readIndex + length > writeIndex)
- {
- std::cout << "read over stream data length" << std::endl;
- return true;
- }
- memcpy(buffer, data + readIndex, length);
- readIndex += length;
- return false;
- }
- char Stream::readChar(char error)
- {
- char c;
- if(read(&c, sizeof(char)))
- {
- return error;
- }
- return c;
- }
- int16_t Stream::readShort(int16_t error)
- {
- short s;
- if(read(&s, sizeof(short)))
- {
- return error;
- }
- return s;
- }
- int32_t Stream::readInt(int32_t error)
- {
- int i;
- if(read(&i, sizeof(int)))
- {
- return error;
- }
- return i;
- }
- int64_t Stream::readLong(int64_t error)
- {
- long l;
- if(read(&l, sizeof(long)))
- {
- return error;
- }
- return l;
- }
- unsigned char Stream::readUnsignedChar(unsigned char error)
- {
- unsigned char uc;
- if(read(&uc, sizeof(unsigned char)))
- {
- return error;
- }
- return uc;
- }
- uint16_t Stream::readUnsignedShort(uint16_t error)
- {
- unsigned short us;
- if(read(&us, sizeof(unsigned short)))
- {
- return error;
- }
- return us;
- }
- uint32_t Stream::readUnsignedInt(uint32_t error)
- {
- unsigned int ui;
- if(read(&ui, sizeof(unsigned int)))
- {
- return error;
- }
- return ui;
- }
- uint64_t Stream::readUnsignedLong(uint64_t error)
- {
- unsigned long ul;
- if(read(&ul, sizeof(unsigned long)))
- {
- return error;
- }
- return ul;
- }
- void Stream::readSocket(int socket)
- {
- writeIndex = 0;
- readIndex = 0;
-
- size_t bufferOffset = 0;
- ssize_t freeSpace = dataLength - writeIndex;
-
- while(true)
- {
- ssize_t readLength = recv(socket, data + bufferOffset, freeSpace, MSG_DONTWAIT);
- if(readLength <= 0)
- {
- break;
- }
- writeIndex += readLength;
- if(readLength < freeSpace)
- {
- break;
- }
- else
- {
- resize(dataLength + 1);
- freeSpace = dataLength - writeIndex;
- bufferOffset += readLength;
- }
- }
- }
- void Stream::sendToSocket(int socket)
- {
- size_t bufferOffset = 0;
- size_t sendLength = writeIndex;
-
- while(sendLength > 0)
- {
- ssize_t writtenLength = send(socket, data + bufferOffset, sendLength, MSG_NOSIGNAL);
- if(writtenLength == -1)
- {
- perror("Cannot send data");
- return;
- }
- sendLength -= writtenLength;
- bufferOffset += writtenLength;
- }
- }
|