// base64codec.hpp
// Copyright (C) 2006 - 2009 MicroNeil Research Corporation
// BASE64 encoder decoder objects extending vectors

#ifndef base64codec_included
#define base64codec_included

#include <vector>
#include <cstring>
#include <string>

using namespace std;

typedef vector<unsigned char> base64buffer;

class to_base64 : public base64buffer {                                         // Converts binary data to base 64.
  private:
    bool BadConversion;                                                         // True if something went wrong.
    void convert(const unsigned char* bfr, const int len);                      // Does the actual work.

  public:
    to_base64(const vector<unsigned char>& bfr);                                // Converts from a base64buffer.
    to_base64(const vector<char>& bfr);                                         // Converts from a buffer.
    to_base64(const string& s);                                                 // Converts from a c++ string.
    to_base64(const char* s);                                                   // Converts from a c string.
    to_base64(const unsigned char* bfr, const int len);                         // Converts from a uchar buffer.
    to_base64(const char* bfr, const int len);                                  // Converts from a char buffer.
    bool Bad();
};

class from_base64 : public base64buffer {                                       // Convert base64 data to binary.
  private:
    bool BadConversion;                                                         // True if the conversion didn't go well.
    unsigned char NextSixBits(                                                  // Helper for decoding & ingoring spaces.
      int& cursor,
      const unsigned char* bfr,
      const int len);
    void convert(const unsigned char* bfr, const int len);                      // Does the actual work.

  public:
    from_base64(const vector<unsigned char>& bfr);                              // Converts from a base64buffer.
    from_base64(const vector<char>& bfr);                                       // Converts from a buffer.
    from_base64(const string& s);                                               // Converts from a c++ string.
    from_base64(const char*);                                                   // Converts from a c_string.
    bool Bad();                                                                 // True if conversion wasn't complete.
};


#endif
