ByteStream.cpp 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. /*
  2. * This is the source code of tgnet library v. 1.1
  3. * It is licensed under GNU GPL v. 2 or later.
  4. * You should have received a copy of the license in this archive (see LICENSE).
  5. *
  6. * Copyright Nikolai Kudashov, 2015-2018.
  7. */
  8. #include "ByteStream.h"
  9. #include "NativeByteBuffer.h"
  10. ByteStream::ByteStream() {
  11. }
  12. ByteStream::~ByteStream() {
  13. }
  14. void ByteStream::append(NativeByteBuffer *buffer) {
  15. if (buffer == nullptr) {
  16. return;
  17. }
  18. buffersQueue.push_back(buffer);
  19. }
  20. bool ByteStream::hasData() {
  21. size_t size = buffersQueue.size();
  22. for (uint32_t a = 0; a < size; a++) {
  23. if (buffersQueue[a]->hasRemaining()) {
  24. return true;
  25. }
  26. }
  27. return false;
  28. }
  29. void ByteStream::get(NativeByteBuffer *dst) {
  30. if (dst == nullptr) {
  31. return;
  32. }
  33. size_t size = buffersQueue.size();
  34. NativeByteBuffer *buffer;
  35. for (uint32_t a = 0; a < size; a++) {
  36. buffer = buffersQueue[a];
  37. if (buffer->remaining() > dst->remaining()) {
  38. dst->writeBytes(buffer->bytes(), buffer->position(), dst->remaining());
  39. break;
  40. }
  41. dst->writeBytes(buffer->bytes(), buffer->position(), buffer->remaining());
  42. if (!dst->hasRemaining()) {
  43. break;
  44. }
  45. }
  46. }
  47. void ByteStream::discard(uint32_t count) {
  48. uint32_t remaining;
  49. NativeByteBuffer *buffer;
  50. while (count > 0) {
  51. if (buffersQueue.empty()) {
  52. break;
  53. }
  54. buffer = buffersQueue[0];
  55. remaining = buffer->remaining();
  56. if (count < remaining) {
  57. buffer->position(buffer->position() + count);
  58. break;
  59. }
  60. buffer->reuse();
  61. buffersQueue.erase(buffersQueue.begin());
  62. count -= remaining;
  63. }
  64. }
  65. void ByteStream::clean() {
  66. if (buffersQueue.empty()) {
  67. return;
  68. }
  69. size_t size = buffersQueue.size();
  70. for (uint32_t a = 0; a < size; a++) {
  71. NativeByteBuffer *buffer = buffersQueue[a];
  72. buffer->reuse();
  73. }
  74. buffersQueue.clear();
  75. }