configure.ac | 7 +++++ src/lib/libvisio_utils.cpp | 54 ++++++++------------------------------------- 2 files changed, 16 insertions(+), 45 deletions(-)
New commits: commit b7b4e9cad38aaeb1fb5f27d1bdb6875f9c2661bc Author: Fridrich Å trba <fridrich.st...@bluewin.ch> Date: Tue Jun 25 09:37:35 2013 +0200 Use boost for base64 decoding diff --git a/configure.ac b/configure.ac index 4cf1ac2..50de8ab 100644 --- a/configure.ac +++ b/configure.ac @@ -108,7 +108,12 @@ AC_SUBST(ZLIB_LIBS) # =========================== AC_CHECK_HEADERS( - boost/algorithm/string.hpp boost/optional.hpp boost/spirit/include/classic.hpp, + boost/algorithm/string.hpp \ + boost/optional.hpp \ + boost/spirit/include/classic.hpp \ + boost/archive/iterators/binary_from_base64.hpp \ + boost/archive/iterators/remove_whitespace.hpp \ + boost/archive/iterators/transform_width.hpp, [], [AC_MSG_ERROR(Required boost headers not found. install boost >= 1.36)], [] diff --git a/src/lib/libvisio_utils.cpp b/src/lib/libvisio_utils.cpp index 48ae1e7..42e2adc 100644 --- a/src/lib/libvisio_utils.cpp +++ b/src/lib/libvisio_utils.cpp @@ -32,7 +32,9 @@ #include "VSDInternalStream.h" #include "libvisio_utils.h" -#define VSD_NUM_ELEMENTS(array) sizeof(array)/sizeof(array[0]) +#include <boost/archive/iterators/binary_from_base64.hpp> +#include <boost/archive/iterators/remove_whitespace.hpp> +#include <boost/archive/iterators/transform_width.hpp> uint8_t libvisio::readU8(WPXInputStream *input) { @@ -123,51 +125,15 @@ double libvisio::readDouble(WPXInputStream *input) void libvisio::appendFromBase64(WPXBinaryData &data, const unsigned char *base64String, size_t base64StringLength) { - static const std::string base64Chars = - "ABCDEFGHIJKLMNOPQRSTUVWXYZ" - "abcdefghijklmnopqrstuvwxyz" - "0123456789+/"; + typedef boost::archive::iterators::transform_width< + boost::archive::iterators::binary_from_base64< + boost::archive::iterators::remove_whitespace< const char * > >, 8, 6 > base64_decoder; + std::vector<unsigned char> buffer; + std::copy(base64_decoder(base64String), base64_decoder(base64String + base64StringLength), std::back_inserter(buffer)); - VSDInternalStream tmpStream(base64String, base64StringLength); - - unsigned i = 0; - char tmpCharsToDecode[4]; - while (!tmpStream.atEOS()) - { - const char tmpChar = (char)readU8(&tmpStream); - if (std::string::npos == base64Chars.find(tmpChar) && (tmpChar != '=')) - continue; - if (tmpChar == '=') - break; - tmpCharsToDecode[i++] = tmpChar; - i %= 4; - if (!i) - { - for (unsigned k = 0; k < 4; k++) - tmpCharsToDecode[k] = base64Chars.find(tmpCharsToDecode[k]); - - data.append((unsigned char)((tmpCharsToDecode[0] << 2) | ((tmpCharsToDecode[1] & 0x30) >> 4))); - data.append((unsigned char)(((tmpCharsToDecode[1] & 0xf) << 4) | ((tmpCharsToDecode[2] & 0x3c) >> 2))); - data.append((unsigned char)(((tmpCharsToDecode[2] & 0x3) << 6) | tmpCharsToDecode[3])); - } - } - - if (i) - { - for (unsigned j = i; j < 4; j++) - tmpCharsToDecode[j] = 0; - for (unsigned k = 0; k < 4; k++) - tmpCharsToDecode[k] = base64Chars.find(tmpCharsToDecode[k]); - - data.append((unsigned char)((tmpCharsToDecode[0] << 2) | ((tmpCharsToDecode[1] & 0x30) >> 4))); - if (i > 1) - { - data.append((unsigned char)(((tmpCharsToDecode[1] & 0xf) << 4) | ((tmpCharsToDecode[2] & 0x3c) >> 2))); - if (i > 2) - data.append((unsigned char)(((tmpCharsToDecode[2] & 0x3) << 6) | tmpCharsToDecode[3])); - } - } + if (!buffer.empty()) + data.append(&buffer[0], buffer.size()); } const ::WPXString libvisio::getColourString(const Colour &c)
_______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits