StreamCopier.cpp 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. //
  2. // StreamCopier.cpp
  3. //
  4. // $Id: //poco/1.4/Foundation/src/StreamCopier.cpp#2 $
  5. //
  6. // Library: Foundation
  7. // Package: Streams
  8. // Module: StreamCopier
  9. //
  10. // Copyright (c) 2004-2006, Applied Informatics Software Engineering GmbH.
  11. // and Contributors.
  12. //
  13. // SPDX-License-Identifier: BSL-1.0
  14. //
  15. #include "Poco/StreamCopier.h"
  16. #include "Poco/Buffer.h"
  17. namespace Poco {
  18. std::streamsize StreamCopier::copyStream(std::istream& istr, std::ostream& ostr, std::size_t bufferSize)
  19. {
  20. poco_assert (bufferSize > 0);
  21. Buffer<char> buffer(bufferSize);
  22. std::streamsize len = 0;
  23. istr.read(buffer.begin(), bufferSize);
  24. std::streamsize n = istr.gcount();
  25. while (n > 0)
  26. {
  27. len += n;
  28. ostr.write(buffer.begin(), n);
  29. if (istr && ostr)
  30. {
  31. istr.read(buffer.begin(), bufferSize);
  32. n = istr.gcount();
  33. }
  34. else n = 0;
  35. }
  36. return len;
  37. }
  38. #if defined(POCO_HAVE_INT64)
  39. Poco::UInt64 StreamCopier::copyStream64(std::istream& istr, std::ostream& ostr, std::size_t bufferSize)
  40. {
  41. poco_assert (bufferSize > 0);
  42. Buffer<char> buffer(bufferSize);
  43. Poco::UInt64 len = 0;
  44. istr.read(buffer.begin(), bufferSize);
  45. std::streamsize n = istr.gcount();
  46. while (n > 0)
  47. {
  48. len += n;
  49. ostr.write(buffer.begin(), n);
  50. if (istr && ostr)
  51. {
  52. istr.read(buffer.begin(), bufferSize);
  53. n = istr.gcount();
  54. }
  55. else n = 0;
  56. }
  57. return len;
  58. }
  59. #endif
  60. std::streamsize StreamCopier::copyToString(std::istream& istr, std::string& str, std::size_t bufferSize)
  61. {
  62. poco_assert (bufferSize > 0);
  63. Buffer<char> buffer(bufferSize);
  64. std::streamsize len = 0;
  65. istr.read(buffer.begin(), bufferSize);
  66. std::streamsize n = istr.gcount();
  67. while (n > 0)
  68. {
  69. len += n;
  70. str.append(buffer.begin(), static_cast<std::string::size_type>(n));
  71. if (istr)
  72. {
  73. istr.read(buffer.begin(), bufferSize);
  74. n = istr.gcount();
  75. }
  76. else n = 0;
  77. }
  78. return len;
  79. }
  80. #if defined(POCO_HAVE_INT64)
  81. Poco::UInt64 StreamCopier::copyToString64(std::istream& istr, std::string& str, std::size_t bufferSize)
  82. {
  83. poco_assert (bufferSize > 0);
  84. Buffer<char> buffer(bufferSize);
  85. Poco::UInt64 len = 0;
  86. istr.read(buffer.begin(), bufferSize);
  87. std::streamsize n = istr.gcount();
  88. while (n > 0)
  89. {
  90. len += n;
  91. str.append(buffer.begin(), static_cast<std::string::size_type>(n));
  92. if (istr)
  93. {
  94. istr.read(buffer.begin(), bufferSize);
  95. n = istr.gcount();
  96. }
  97. else n = 0;
  98. }
  99. return len;
  100. }
  101. #endif
  102. std::streamsize StreamCopier::copyStreamUnbuffered(std::istream& istr, std::ostream& ostr)
  103. {
  104. char c;
  105. std::streamsize len = 0;
  106. istr.get(c);
  107. while (istr && ostr)
  108. {
  109. ++len;
  110. ostr.put(c);
  111. istr.get(c);
  112. }
  113. return len;
  114. }
  115. #if defined(POCO_HAVE_INT64)
  116. Poco::UInt64 StreamCopier::copyStreamUnbuffered64(std::istream& istr, std::ostream& ostr)
  117. {
  118. char c;
  119. Poco::UInt64 len = 0;
  120. istr.get(c);
  121. while (istr && ostr)
  122. {
  123. ++len;
  124. ostr.put(c);
  125. istr.get(c);
  126. }
  127. return len;
  128. }
  129. #endif
  130. } // namespace Poco