11 #ifndef __UT_Base64EncodeFilter__
12 #define __UT_Base64EncodeFilter__
39 : myPendingBlockSize(0) {}
43 myPendingBlockSize = 0;
47 template<
typename Sink>
48 std::streamsize write(Sink& dest,
const char* source_buffer,
49 std::streamsize source_buffer_size);
51 template<
typename Sink>
52 void close(Sink& dest);
57 myEncodeBuffer = UTmakeUnique<UT_WorkBuffer>();
59 myEncodeBuffer->
clear();
60 return *myEncodeBuffer.get();
63 uint8 myPendingBlock[3];
64 int myPendingBlockSize;
69 template <
typename Sink>
70 inline std::streamsize
73 const char* source_buffer,
74 std::streamsize source_buffer_size)
78 std::streamsize consumed_size = source_buffer_size;
83 if (myPendingBlockSize > 0)
85 while (myPendingBlockSize < 3 && source_buffer_size)
87 myPendingBlock[myPendingBlockSize++] =
88 *
reinterpret_cast<const uint8 *
>(source_buffer++);
91 if (myPendingBlockSize == 3)
96 bios::write<Sink>(dest, output.
buffer(), output.
length());
97 myPendingBlockSize = 0;
101 if (source_buffer_size >= 3)
104 std::streamsize remainder = source_buffer_size % 3;
107 source_buffer_size - remainder, output);
109 bios::write<Sink>(dest, output.
buffer(), output.
length());
110 source_buffer += (source_buffer_size - remainder);
111 source_buffer_size = remainder;
116 if (source_buffer_size > 0)
118 for (
int i = 0; i < source_buffer_size; i++)
119 myPendingBlock[i] = source_buffer[i];
120 myPendingBlockSize = source_buffer_size;
123 return consumed_size;
126 template<
typename Sink>
131 if (myPendingBlockSize > 0)
137 bios::write<Sink>(dest, output.
buffer(), output.
length());
138 myPendingBlockSize = 0;
142 #endif // __UT_Base64EncodeFilter__
SYS_FORCE_INLINE exint length() const
UT_Base64EncodeFilter & operator=(const UT_Base64EncodeFilter ©)
OIIO_UTIL_API bool copy(string_view from, string_view to, std::string &err)
UT_Base64EncodeFilter(const UT_Base64EncodeFilter ©)
SYS_FORCE_INLINE const char * buffer() const
std::unique_ptr< T, Deleter > UT_UniquePtr
A smart pointer for unique ownership of dynamically allocated objects.
static void encode(const UT_WorkBuffer &src, UT_WorkBuffer &dst)
std::streamsize write(Sink &dest, const char *source_buffer, std::streamsize source_buffer_size)
SYS_FORCE_INLINE void clear()