arabica/Utils/base64codecvt.h

71 lines
2.2 KiB
C++

#ifndef ARABICA_BASE64_CODECVT_H
#define ARABICA_BASE64_CODECVT_H
///////////////////////////////////////////
//
// $Id$
//
///////////////////////////////////////////
#include <locale>
class base64codecvt : public std::codecvt<char, char, int>
{
public:
typedef int state_t;
protected:
virtual ~base64codecvt() { }
virtual result do_out(state_t& state,
const char* from,
const char* from_end,
const char*& from_next,
char* to,
char* to_limit,
char*& to_next) const;
virtual result do_in(state_t& state,
const char* from,
const char* from_end,
const char*& from_next,
char* to,
char* to_limit,
char*& to_next) const;
virtual result do_unshift(state_t& state,
char* to,
char* to_limit,
char*& to_next) const;
virtual int do_encoding() const throw() { return -1; }
virtual bool do_always_noconv() const throw() { return false; }
virtual int do_length(const state_t&,
const char* from,
const char* end,
size_t max) const;
virtual int do_max_length() const throw();
private:
// state here is a little tricky - we need the previous char and
// the state counter, and in some case we need to "pad" the input
// strings. I use these helper functions to mungle them
// together and keep the details neater (or try to anyway)
mutable state_t* state_;
mutable const char** from_next_;
mutable const char** from_end_;
void grabState(state_t& state) const { state_ = &state; }
void grabFromNext(const char*& from_next) const { from_next_ = &from_next; }
void grabFromEnd(const char*& from_end) const { from_end_ = &from_end; }
int getState() const;
void nextState() const;
int getCurrentOutChar() const;
void consumeOutChar() const;
char getPreviousChar() const;
void setPreviousChar(char c) const;
}; // class base64codecvt
#endif