/* * MimeCodes.h - MIME Encoding and decoding filters, using STL-like iterators. */ #ifndef MIME_CODES_H #define MIME_CODES_H /****************************************************************************** * MimeCoder - Abstract base class for MIME filters. ******************************************************************************/ template class MimeCoder { public: virtual OutIter Filter( OutIter out, InIter inBeg, InIter inEnd ) = 0; virtual OutIter Finish( OutIter out ) = 0; }; /****************************************************************************** * Base64 ******************************************************************************/ template class Base64Encoder : public MimeCoder { public: Base64Encoder() : its3Len(0), itsLinePos(0) {} virtual OutIter Filter( OutIter out, InIter inBeg, InIter inEnd ); virtual OutIter Finish( OutIter out ); private: int itsLinePos; unsigned char itsCurr3[3]; int its3Len; void EncodeCurr3( OutIter& out ); }; template class Base64Decoder : public MimeCoder { public: Base64Decoder() : its4Len(0), itsEnded(0) {} virtual OutIter Filter( OutIter out, InIter inBeg, InIter inEnd ); virtual OutIter Finish( OutIter out ); private: int itsEnded; unsigned char itsCurr4[4]; int its4Len; int itsErrNum; void DecodeCurr4( OutIter& out ); }; template OutIter base64_encode( InIter inBeg, InIter inEnd, OutIter out ) { Base64Encoder e; return e.Finish( e.Filter(out, inBeg, inEnd) ); } template OutIter base64_decode( InIter inBeg, InIter inEnd, OutIter out ) { Base64Decoder d; return d.Finish( d.Filter(out, inBeg, inEnd) ); } /****************************************************************************** * Quoted-Printable ******************************************************************************/ template class QpEncoder : public MimeCoder { public: QpEncoder() : itsLinePos(0), itsPrevCh('x') {} virtual OutIter Filter( OutIter out, InIter inBeg, InIter inEnd ); virtual OutIter Finish( OutIter out ); private: int itsLinePos; unsigned char itsPrevCh; }; template class QpDecoder : public MimeCoder { public: QpDecoder() : itsHexLen(0) {} virtual OutIter Filter( OutIter out, InIter inBeg, InIter inEnd ); virtual OutIter Finish( OutIter out ); private: int itsHexLen; unsigned char itsHex[2]; }; template OutIter qp_encode( InIter inBeg, InIter inEnd, OutIter out ) { QpEncoder e; return e.Finish( e.Filter(out, inBeg, inEnd) ); } template OutIter qp_decode( InIter inBeg, InIter inEnd, OutIter out ) { QpDecoder d; return d.Finish( d.Filter(out, inBeg, inEnd) ); } #endif // MIME_CODES_H