Base32Encoder.cpp 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204
  1. //
  2. // Base32Encoder.cpp
  3. //
  4. // $Id: //poco/1.4/Foundation/src/Base32Encoder.cpp#2 $
  5. //
  6. // Library: Foundation
  7. // Package: Streams
  8. // Module: Base32
  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/Base32Encoder.h"
  16. namespace Poco {
  17. const unsigned char Base32EncoderBuf::OUT_ENCODING[32] =
  18. {
  19. 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H',
  20. 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P',
  21. 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X',
  22. 'Y', 'Z', '2', '3', '4', '5', '6', '7',
  23. };
  24. Base32EncoderBuf::Base32EncoderBuf(std::ostream& ostr, bool padding):
  25. _groupLength(0),
  26. _buf(*ostr.rdbuf()),
  27. _doPadding(padding)
  28. {
  29. }
  30. Base32EncoderBuf::~Base32EncoderBuf()
  31. {
  32. try
  33. {
  34. close();
  35. }
  36. catch (...)
  37. {
  38. }
  39. }
  40. int Base32EncoderBuf::writeToDevice(char c)
  41. {
  42. static const int eof = std::char_traits<char>::eof();
  43. _group[_groupLength++] = (unsigned char) c;
  44. if (_groupLength == 5)
  45. {
  46. unsigned char idx;
  47. idx = _group[0] >> 3;
  48. if (_buf.sputc(OUT_ENCODING[idx]) == eof) return eof;
  49. idx = ((_group[0] & 0x07) << 2) | (_group[1] >> 6);
  50. if (_buf.sputc(OUT_ENCODING[idx]) == eof) return eof;
  51. idx = ((_group[1] & 0x3E) >> 1);
  52. if (_buf.sputc(OUT_ENCODING[idx]) == eof) return eof;
  53. idx = ((_group[1] & 0x01) << 4) | (_group[2] >> 4);
  54. if (_buf.sputc(OUT_ENCODING[idx]) == eof) return eof;
  55. idx = ((_group[2] & 0x0F) << 1) | (_group[3] >> 7);
  56. if (_buf.sputc(OUT_ENCODING[idx]) == eof) return eof;
  57. idx = ((_group[3] & 0x7C) >> 2);
  58. if (_buf.sputc(OUT_ENCODING[idx]) == eof) return eof;
  59. idx = ((_group[3] & 0x03) << 3) | (_group[4] >> 5);
  60. if (_buf.sputc(OUT_ENCODING[idx]) == eof) return eof;
  61. idx = (_group[4] & 0x1F);
  62. if (_buf.sputc(OUT_ENCODING[idx]) == eof) return eof;
  63. _groupLength = 0;
  64. }
  65. return charToInt(c);
  66. }
  67. int Base32EncoderBuf::close()
  68. {
  69. static const int eof = std::char_traits<char>::eof();
  70. if (sync() == eof) return eof;
  71. if (_groupLength == 1)
  72. {
  73. _group[1] = 0;
  74. unsigned char idx;
  75. idx = _group[0] >> 3;
  76. if (_buf.sputc(OUT_ENCODING[idx]) == eof) return eof;
  77. idx = ((_group[0] & 0x07) << 2);
  78. if (_buf.sputc(OUT_ENCODING[idx]) == eof) return eof;
  79. if (_doPadding) {
  80. if (_buf.sputc('=') == eof) return eof;
  81. if (_buf.sputc('=') == eof) return eof;
  82. if (_buf.sputc('=') == eof) return eof;
  83. if (_buf.sputc('=') == eof) return eof;
  84. if (_buf.sputc('=') == eof) return eof;
  85. if (_buf.sputc('=') == eof) return eof;
  86. }
  87. }
  88. else if (_groupLength == 2)
  89. {
  90. _group[2] = 0;
  91. unsigned char idx;
  92. idx = _group[0] >> 3;
  93. if (_buf.sputc(OUT_ENCODING[idx]) == eof) return eof;
  94. idx = ((_group[0] & 0x07) << 2) | (_group[1] >> 6);
  95. if (_buf.sputc(OUT_ENCODING[idx]) == eof) return eof;
  96. idx = ((_group[1] & 0x3E) >> 1);
  97. if (_buf.sputc(OUT_ENCODING[idx]) == eof) return eof;
  98. idx = ((_group[1] & 0x01) << 4);
  99. if (_buf.sputc(OUT_ENCODING[idx]) == eof) return eof;
  100. if (_doPadding) {
  101. if (_buf.sputc('=') == eof) return eof;
  102. if (_buf.sputc('=') == eof) return eof;
  103. if (_buf.sputc('=') == eof) return eof;
  104. if (_buf.sputc('=') == eof) return eof;
  105. }
  106. }
  107. else if (_groupLength == 3)
  108. {
  109. _group[3] = 0;
  110. unsigned char idx;
  111. idx = _group[0] >> 3;
  112. if (_buf.sputc(OUT_ENCODING[idx]) == eof) return eof;
  113. idx = ((_group[0] & 0x07) << 2) | (_group[1] >> 6);
  114. if (_buf.sputc(OUT_ENCODING[idx]) == eof) return eof;
  115. idx = ((_group[1] & 0x3E) >> 1);
  116. if (_buf.sputc(OUT_ENCODING[idx]) == eof) return eof;
  117. idx = ((_group[1] & 0x01) << 4) | (_group[2] >> 4);
  118. if (_buf.sputc(OUT_ENCODING[idx]) == eof) return eof;
  119. idx = ((_group[2] & 0x0F) << 1);
  120. if (_buf.sputc(OUT_ENCODING[idx]) == eof) return eof;
  121. if (_doPadding) {
  122. if (_buf.sputc('=') == eof) return eof;
  123. if (_buf.sputc('=') == eof) return eof;
  124. if (_buf.sputc('=') == eof) return eof;
  125. }
  126. }
  127. else if (_groupLength == 4)
  128. {
  129. _group[4] = 0;
  130. unsigned char idx;
  131. idx = _group[0] >> 3;
  132. if (_buf.sputc(OUT_ENCODING[idx]) == eof) return eof;
  133. idx = ((_group[0] & 0x07) << 2) | (_group[1] >> 6);
  134. if (_buf.sputc(OUT_ENCODING[idx]) == eof) return eof;
  135. idx = ((_group[1] & 0x3E) >> 1);
  136. if (_buf.sputc(OUT_ENCODING[idx]) == eof) return eof;
  137. idx = ((_group[1] & 0x01) << 4) | (_group[2] >> 4);
  138. if (_buf.sputc(OUT_ENCODING[idx]) == eof) return eof;
  139. idx = ((_group[2] & 0x0F) << 1) | (_group[3] >> 7);
  140. if (_buf.sputc(OUT_ENCODING[idx]) == eof) return eof;
  141. idx = ((_group[3] & 0x7C) >> 2);
  142. if (_buf.sputc(OUT_ENCODING[idx]) == eof) return eof;
  143. idx = ((_group[3] & 0x03) << 3);
  144. if (_buf.sputc(OUT_ENCODING[idx]) == eof) return eof;
  145. if (_doPadding && _buf.sputc('=') == eof) return eof;
  146. }
  147. _groupLength = 0;
  148. return _buf.pubsync();
  149. }
  150. Base32EncoderIOS::Base32EncoderIOS(std::ostream& ostr, bool padding):
  151. _buf(ostr, padding)
  152. {
  153. poco_ios_init(&_buf);
  154. }
  155. Base32EncoderIOS::~Base32EncoderIOS()
  156. {
  157. }
  158. int Base32EncoderIOS::close()
  159. {
  160. return _buf.close();
  161. }
  162. Base32EncoderBuf* Base32EncoderIOS::rdbuf()
  163. {
  164. return &_buf;
  165. }
  166. Base32Encoder::Base32Encoder(std::ostream& ostr, bool padding):
  167. Base32EncoderIOS(ostr, padding), std::ostream(&_buf)
  168. {
  169. }
  170. Base32Encoder::~Base32Encoder()
  171. {
  172. }
  173. } // namespace Poco