# FBB::IQuotedPrintableBuf(3bobcat)

## QuotedPrintable converting Stream Buffer
(libbobcat-dev_5.07.03)

## 2005-2021

## NAME

FBB::IQuotedPrintableBuf - Input Filtering stream buffer doing quoted printable conversions

## SYNOPSIS

#include <bobcat/iquotedprintablebuf>
Linking option: -lbobcat

## DESCRIPTION

The information made available by IQuotedPrintableBuf objects is either quoted-printable encoded or decoded. The information to convert is read by IQuotedPrintableBuf objects via std::istream objects.

The class IQuotedPrintableBuf is a class template, using a FBB::CryptType template non-type parameter. Objects of the class FBB::IQuotedPrintableBuf<FBB::ENCODE> encode the information they receive, objects of the class FBB::IQuotedPrintableBuf<FBB::DECODE> decode the information they receive. See also section ENUMERATION below.

Quoted-printable encoding is sometimes used in e-mail attachments (See also https://en.wikipedia.org/wiki/Quoted-printable and https://www.ietf.org/rfc/rfc2045.txt (section 6.7)). Its main characteristics are:

- Lines are at most 76 characters long;
- Lines longer than 76 characters are split into sub-lines, using =\n combinations to indicate `soft line breaks'. Lines not ending in soft line breaks indicate true end of lines.
- All printable characters, except for the = character and (final) blank characters just before the end of lines, are copied as-is, all other characters are escaped by writing =XX sequences, with XX being the ascii-character representation of the hexadecimal value of the escaped character (e.g., the = character is encoded as =3D, a final space before end-of-line is encoded as =20, a final tab as =09). Only capital letters are used when escaping characters.

## NAMESPACE

FBB
All constructors, members, operators and manipulators, mentioned in this man-page, are defined in the namespace FBB.

## INHERITS FROM

FBB::IFilterBuf

## MEMBER FUNCTIONS

All members of FBB::IFilterBuf are available, as IQuotedPrintableBuf inherits from this class.

Overloaded move and/or copy assignment operators are not available.

## ENUMERATION

IQuotedPrintableBuf objects either encode or decode quoted-printable information. IQuotedPrintableBuf objects of the class FBB::IQuotedPrintableBuf<FBB::ENCODE> encode the data they receive, IQuotedPrintableBuf objects of the class FBB::IQuotedPrintableBuf<FBB::DECODE> decode the data they receive.

The values ENCODE and DECODE are defined in the enum CryptType, defined in the FBB namespace.

## CONSTRUCTOR

- IQuotedPrintableBuf<CryptType>(std::istream &in, size_t bufSize = 1000):
  This constructor initializes the streambuf.

  - IQuotedPrintableBuf<ENCODE> objects perform quoted-printable encoding;
  - IQuotedPrintableBuf<DECODE> objects perform quoted-printable decoding;
  - IQuotedPrintableBuf<CryptType> objects obtain the bytes to encode or decode from std::istream &in;
  - The IFilterBuf base class is initialized with a buffer of size bufSize, using a lower bound of 100 characters.

  The constructor uses a configurable buffer size for reading. Characters read into the buffer which are not part of the actual quoted-printable encoded data are unavailable after completing the quoted-printable decoding. If information beyond the quoted-printable input block should remain available, then a buffer size of 1 should be specified.

Copy and move constructors (and assignment operators) are not available.

## EXAMPLE

The example shows the construction of IQuotedPrintableBuf<ENCODE> objects encode which are used to initialize a std::istream object. The information read from this istream is quoted-printable encoded.

IQuotedPrintableBuf<DECODE> objects read quoted-printable encoded information from std::istream objects, decoding the information.

The std::istream din object is initialized with the IQuotedPrintableBuf<DECODE> object, and its content is sent to std::cout. The information that is presented at std::cin and that appears at std::cout should be identical.

    #include <iostream>
    #include <istream>

    #include <bobcat/iquotedprintablebuf>

    using namespace std;
    using namespace FBB;

    int main(int argc, char **argv)
    {
        if (argc == 1)
        {
            cout << "Usage: " << argv[0] << " [edb] < infile > outfile\n"
                        "to quoted printable -e-ncode, -d-ecode or -b-oth\n";
            return 0;
        }

        switch (argv[1][0])
        {
            case 'e':
            {
                IQuotedPrintableBuf<ENCODE> encode(cin);
                istream ein(&encode);
                cout << ein.rdbuf();
            }
            break;

            case 'd':
            {
                IQuotedPrintableBuf<DECODE> decode(cin);
                istream din(&decode);
                cout << din.rdbuf();
            }
            break;

            case 'b':
            {
                IQuotedPrintableBuf<ENCODE> encode(cin);
                istream ein(&encode);

                IQuotedPrintableBuf<DECODE> decode(ein);
                istream din(&decode);
                cout << din.rdbuf();
            }
            break;
        }
    }

## FILES

bobcat/iquotedprintablebuf - defines the class interface

## SEE ALSO

bobcat(7), isymcryptstreambuf(3bobcat), iquotedprintablestream(3bobcat), ifilterbuf(3bobcat), ofilterbuf(3bobcat), std::streambuf.

## BUGS

None reported.

## BOBCAT PROJECT FILES

- https://fbb-git.gitlab.io/bobcat/: gitlab project page;
- bobcat_5.07.03-x.dsc: detached signature;
- bobcat_5.07.03-x.tar.gz: source archive;
- bobcat_5.07.03-x_i386.changes: change log;
- libbobcat1_5.07.03-x_*.deb: debian package containing the libraries;
- libbobcat1-dev_5.07.03-x_*.deb: debian package containing the libraries, headers and manual pages;

## BOBCAT

Bobcat is an acronym of `Brokken's Own Base Classes And Templates'.

## COPYRIGHT

This is free software, distributed under the terms of the GNU General Public License (GPL).

## AUTHOR

Frank B. Brokken (f.b.brokken@rug.nl).