Stream.cpp 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215
  1. #include "common/stream/Stream.h"
  2. #include <stdexcept>
  3. #include <iostream>
  4. #include <cstring>
  5. #include <sys/socket.h>
  6. Stream::Stream(size_t minSize)
  7. {
  8. dataLength = getSize(minSize);
  9. data = new unsigned char[dataLength];
  10. }
  11. Stream::~Stream()
  12. {
  13. delete[] data;
  14. }
  15. size_t Stream::getSize(size_t minSize)
  16. {
  17. size_t size = 1;
  18. while(size < minSize && size != 0)
  19. {
  20. size <<= 1;
  21. }
  22. if(size == 0)
  23. {
  24. throw runtime_error("size exceeds max possible size");
  25. }
  26. return size;
  27. }
  28. bool Stream::hasData() const
  29. {
  30. return readIndex < writeIndex;
  31. }
  32. void Stream::resize(size_t minSize)
  33. {
  34. size_t newSize = getSize(minSize);
  35. //cout << "resize from " << dataLength << " to " << newSize << endl;
  36. unsigned char* newData = new unsigned char[newSize];
  37. memcpy(newData, data, writeIndex);
  38. delete[] data;
  39. data = newData;
  40. dataLength = newSize;
  41. }
  42. void Stream::write(const void* writeData, size_t length)
  43. {
  44. if(writeIndex + length > dataLength)
  45. {
  46. resize(writeIndex + length);
  47. }
  48. for(size_t i = 0; i < length; i++)
  49. {
  50. data[writeIndex] = ((unsigned char*) writeData)[i];
  51. writeIndex++;
  52. }
  53. }
  54. void Stream::writeChar(char c)
  55. {
  56. write(&c, sizeof(char));
  57. }
  58. void Stream::writeShort(short s)
  59. {
  60. write(&s, sizeof(short));
  61. }
  62. void Stream::writeInt(int i)
  63. {
  64. write(&i, sizeof(int));
  65. }
  66. void Stream::writeLong(long l)
  67. {
  68. write(&l, sizeof(long));
  69. }
  70. void Stream::writeUnsignedChar(unsigned char uc)
  71. {
  72. write(&uc, sizeof(unsigned char));
  73. }
  74. void Stream::writeUnsignedShort(unsigned short us)
  75. {
  76. write(&us, sizeof(unsigned short));
  77. }
  78. void Stream::writeUnsignedInt(unsigned int ui)
  79. {
  80. write(&ui, sizeof(unsigned int));
  81. }
  82. void Stream::writeUnsignedLong(unsigned long ul)
  83. {
  84. write(&ul, sizeof(unsigned long));
  85. }
  86. void Stream::read(void* buffer, size_t length)
  87. {
  88. if(readIndex + length > writeIndex)
  89. {
  90. throw runtime_error("stream read over data length");
  91. }
  92. for(size_t i = 0; i < length; i++)
  93. {
  94. ((unsigned char*) buffer)[i] = data[readIndex];
  95. readIndex++;
  96. }
  97. }
  98. char Stream::readChar()
  99. {
  100. char c;
  101. read(&c, sizeof(char));
  102. return c;
  103. }
  104. short Stream::readShort()
  105. {
  106. short s;
  107. read(&s, sizeof(short));
  108. return s;
  109. }
  110. int Stream::readInt()
  111. {
  112. int i;
  113. read(&i, sizeof(int));
  114. return i;
  115. }
  116. long Stream::readLong()
  117. {
  118. long l;
  119. read(&l, sizeof(long));
  120. return l;
  121. }
  122. unsigned char Stream::readUnsignedChar()
  123. {
  124. unsigned char uc;
  125. read(&uc, sizeof(unsigned char));
  126. return uc;
  127. }
  128. unsigned short Stream::readUnsignedShort()
  129. {
  130. unsigned short us;
  131. read(&us, sizeof(unsigned short));
  132. return us;
  133. }
  134. unsigned int Stream::readUnsignedInt()
  135. {
  136. unsigned int ui;
  137. read(&ui, sizeof(unsigned int));
  138. return ui;
  139. }
  140. unsigned long Stream::readUnsignedLong()
  141. {
  142. unsigned long ul;
  143. read(&ul, sizeof(unsigned long));
  144. return ul;
  145. }
  146. void Stream::readSocket(int socket)
  147. {
  148. writeIndex = 0;
  149. readIndex = 0;
  150. size_t bufferOffset = 0;
  151. ssize_t freeSpace = dataLength - writeIndex;
  152. while(true)
  153. {
  154. ssize_t readLength = recv(socket, data + bufferOffset, freeSpace, MSG_DONTWAIT);
  155. if(readLength <= 0)
  156. {
  157. break;
  158. }
  159. writeIndex += readLength;
  160. if(readLength < freeSpace)
  161. {
  162. break;
  163. }
  164. else
  165. {
  166. resize(dataLength + 1);
  167. freeSpace = dataLength - writeIndex;
  168. bufferOffset += readLength;
  169. }
  170. }
  171. }
  172. void Stream::sendToSocket(int socket)
  173. {
  174. size_t bufferOffset = 0;
  175. size_t sendLength = writeIndex;
  176. while(sendLength > 0)
  177. {
  178. ssize_t writtenLength = send(socket, data + bufferOffset, sendLength, MSG_NOSIGNAL);
  179. if(writtenLength == -1)
  180. {
  181. perror("Cannot send data");
  182. return;
  183. }
  184. sendLength -= writtenLength;
  185. bufferOffset += writtenLength;
  186. }
  187. }