#define CPPCMS_SOURCE
#include "filters.h"
#include "base64.h"
#include "util.h"
#include <iostream>
namespace cppcms { namespace filters {
streamable::streamable()
{
set(0,0,0,0);
}
streamable::streamable(streamable const &other)
{
set(other.ptr_,other.to_stream_,other.to_string_,other.type_);
}
streamable::~streamable()
{
}
streamable const &streamable::operator=(streamable const &other)
{
if(&other!=this)
set(other.ptr_,other.to_stream_,other.to_string_,other.type_);
return *this;
}
namespace {
void ch_to_stream(std::ostream &out,void const *p)
{
out<<reinterpret_cast<char const *>(p);
}
std::string ch_to_string(std::ios &ios,void const *p)
{
return reinterpret_cast<char const *>(p);
}
std::string s_to_string(std::ios &ios,void const *p)
{
return *reinterpret_cast<std::string const *>(p);
}
}
streamable::streamable(char const *ptr)
{
set(ptr,ch_to_stream,ch_to_string,&typeid(char const *));
}
template<>
streamable::streamable(std::string const &str)
{
set(&str,to_stream<std::string>,s_to_string,&typeid(std::string));
}
std::string streamable::get(std::ios &ios) const
{
return to_string_(ios,ptr_);
}
void streamable::operator()(std::ostream &out) const
{
to_stream_(out,ptr_);
}
void streamable::set(void const *ptr,to_stream_type tse,to_string_type tst,std::type_info const *type)
{
ptr_=ptr;
to_stream_=tse;
to_string_=tst;
type_=type;
}
std::type_info const &streamable::type() const
{
return *type_;
}
///////////////////////////////////
struct to_upper::data {};
to_upper::to_upper() {}
to_upper::~to_upper() {}
to_upper::to_upper(to_upper const &other) : obj_(other.obj_) {}
to_upper::to_upper(streamable const &obj) : obj_(obj) {}
to_upper const &to_upper::operator=(to_upper const &other){ obj_ = other.obj_; return *this; }
void to_upper::operator()(std::ostream &out) const
{
std::string tmp =obj_.get(out) ;
std::locale loc = out.getloc();
out << ::cppcms::locale::to_upper( tmp,loc);
}
struct to_lower::data {};
to_lower::to_lower() {}
to_lower::~to_lower() {}
to_lower::to_lower(to_lower const &other) : obj_(other.obj_) {}
to_lower::to_lower(streamable const &obj) : obj_(obj) {}
to_lower const &to_lower::operator=(to_lower const &other){ obj_ = other.obj_; return *this; }
void to_lower::operator()(std::ostream &out) const
{
out << locale::to_lower(obj_.get(out),out.getloc());
}
struct to_title::data {};
to_title::to_title() {}
to_title::~to_title() {}
to_title::to_title(to_title const &other) : obj_(other.obj_) {}
to_title::to_title(streamable const &obj) : obj_(obj) {}
to_title const &to_title::operator=(to_title const &other){ obj_ = other.obj_; return *this; }
void to_title::operator()(std::ostream &out) const
{
out << locale::to_title(obj_.get(out),out.getloc());
}
struct escape::data {};
escape::escape() {}
escape::~escape() {}
escape::escape(escape const &other) : obj_(other.obj_) {}
escape::escape(streamable const &obj) : obj_(obj) {}
escape const &escape::operator=(escape const &other){ obj_ = other.obj_; return *this; }
void escape::operator()(std::ostream &out) const
{
out << util::escape(obj_.get(out));
}
struct urlencode::data {};
urlencode::urlencode() {}
urlencode::~urlencode() {}
urlencode::urlencode(urlencode const &other) : obj_(other.obj_) {}
urlencode::urlencode(streamable const &obj) : obj_(obj) {}
urlencode const &urlencode::operator=(urlencode const &other){ obj_ = other.obj_; return *this; }
void urlencode::operator()(std::ostream &out) const
{
out << util::urlencode(obj_.get(out));
}
struct raw::data {};
raw::raw() {}
raw::~raw() {}
raw::raw(raw const &other) : obj_(other.obj_) {}
raw::raw(streamable const &obj) : obj_(obj) {}
raw const &raw::operator=(raw const &other){ obj_ = other.obj_; return *this; }
void raw::operator()(std::ostream &out) const
{
out << obj_;;
}
struct base64_urlencode::data {};
base64_urlencode::base64_urlencode() {}
base64_urlencode::~base64_urlencode() {}
base64_urlencode::base64_urlencode(base64_urlencode const &other) : obj_(other.obj_) {}
base64_urlencode::base64_urlencode(streamable const &obj) : obj_(obj) {}
base64_urlencode const &base64_urlencode::operator=(base64_urlencode const &other){ obj_ = other.obj_; return *this; }
void base64_urlencode::operator()(std::ostream &os) const
{
std::string const s=obj_.get(os);
using namespace cppcms::b64url;
unsigned char const *begin=reinterpret_cast<unsigned char const *>(s.c_str());
unsigned char const *end=begin+s.size();
std::vector<unsigned char> out(encoded_size(s.size())+1);
encode(begin,end,&out.front());
out.back()=0;
char const *buf=reinterpret_cast<char const *>(out.front());
os<<buf;
}
struct date::data {};
struct time::data {};
struct datetime::data {};
date::date() : time_(0) {}
datetime::datetime() : time_(0){}
time::time() : time_(0) {}
date::~date() {}
datetime::~datetime() {}
time::~time() {}
date::date(date const &other) : time_(other.time_) {}
time::time(time const &other) : time_(other.time_) {}
datetime::datetime(datetime const &other) : time_(other.time_) {}
date const &date::operator=(date const &other) { time_=other.time_; return *this; }
time const &time::operator=(time const &other) { time_=other.time_; return *this; }
datetime const &datetime::operator=(datetime const &other) { time_=other.time_; return *this; }
date::date(double t) : time_(t) {}
time::time(double t) : time_(t) {}
datetime::datetime(double t) : time_(t) {}
void date::operator()(std::ostream &out) const
{
out << format("{1,date}") % time_;
}
void time::operator()(std::ostream &out) const
{
out << format("{1,time}") % time_;
}
void datetime::operator()(std::ostream &out) const
{
out << format("{1,datetime}") % time_;
}
}} // cppcms::filters