arabica/Utils/base64_codecvt.h

72 lines
2.2 KiB
C
Raw Normal View History

2002-08-30 17:52:22 +02:00
#ifndef base64_codecvtH
#define base64_codecvtH
///////////////////////////////////////////
//
// $Id$
//
///////////////////////////////////////////
#include <locale>
2002-09-02 17:52:19 +02:00
class base64_codecvt : public std::codecvt<char, char, std::char_traits<char>::state_type>
2002-08-30 17:52:22 +02:00
{
2002-09-02 17:52:19 +02:00
public:
typedef std::char_traits<char>::state_type state_t;
2002-08-30 17:52:22 +02:00
protected:
virtual ~base64_codecvt();
2002-09-02 17:52:19 +02:00
virtual result do_out(state_t& state,
2002-08-30 17:52:22 +02:00
const char* from,
const char* from_end,
const char*& from_next,
char* to,
char* to_limit,
char*& to_next) const;
2002-09-02 17:52:19 +02:00
virtual result do_in(state_t& state,
2002-08-30 17:52:22 +02:00
const char* from,
const char* from_end,
const char*& from_next,
char* to,
char* to_limit,
char*& to_next) const;
2002-09-02 17:52:19 +02:00
virtual result do_unshift(state_t& state,
2002-08-30 17:52:22 +02:00
char* to,
char* to_limit,
char*& to_next) const;
2002-09-02 17:52:19 +02:00
virtual int do_encoding() const throw();
2002-08-30 17:52:22 +02:00
virtual bool do_always_noconv() const throw();
2002-09-02 17:52:19 +02:00
virtual int do_length(const state_t&,
2002-08-30 17:52:22 +02:00
const char* from,
const char* end,
size_t max) const;
2002-09-02 17:52:19 +02:00
virtual int do_max_length() const throw();
2002-08-30 17:52:22 +02:00
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)
2002-09-02 17:52:19 +02:00
mutable state_t* state_;
2002-08-30 17:52:22 +02:00
mutable const char** from_next_;
mutable const char** from_end_;
2002-09-02 17:52:19 +02:00
void grabState(state_t& state) const { state_ = &state; }
2002-08-30 17:52:22 +02:00
void grabFromNext(const char*& from_next) const { from_next_ = &from_next; }
void grabFromEnd(const char*& from_end) const { from_end_ = &from_end; }
2002-09-02 17:52:19 +02:00
int getState() const;
2002-08-30 17:52:22 +02:00
void nextState() const;
int getCurrentOutChar() const;
void consumeOutChar() const;
char getPreviousChar() const;
void setPreviousChar(char c) const;
}; // class base64_codecvt
#endif