Stream.cpp 3.9 KB

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