diff options
Diffstat (limited to 'rfc2045/rfc3676parsercpp.C')
| -rw-r--r-- | rfc2045/rfc3676parsercpp.C | 117 |
1 files changed, 117 insertions, 0 deletions
diff --git a/rfc2045/rfc3676parsercpp.C b/rfc2045/rfc3676parsercpp.C new file mode 100644 index 0000000..cb67993 --- /dev/null +++ b/rfc2045/rfc3676parsercpp.C @@ -0,0 +1,117 @@ +/* +** Copyright 2011 Double Precision, Inc. +** See COPYING for distribution information. +** +*/ + +#include "rfc3676parser.h" + +extern "C" { + + int mail::tpp_trampoline_line_begin(size_t quote_level, void *arg) + { + reinterpret_cast<mail::textplainparser *>(arg) + ->line_begin(quote_level); + + return 0; + } + + int mail::tpp_trampoline_line_contents(const unicode_char *ptr, + size_t cnt, void *arg) + { + reinterpret_cast<mail::textplainparser *>(arg) + ->line_contents(ptr, cnt); + return 0; + } + + int mail::tpp_trampoline_line_flowed_notify(void *arg) + { + reinterpret_cast<mail::textplainparser *>(arg) + ->line_flowed_notify(); + + return 0; + } + + int mail::tpp_trampoline_line_end(void *arg) + { + reinterpret_cast<mail::textplainparser *>(arg) + ->line_end(); + return 0; + } +} + +mail::textplainparser::textplainparser() : handle(NULL) +{ +} + +mail::textplainparser::~textplainparser() +{ + end(); +} + +bool mail::textplainparser::begin(const std::string &charset, + bool flowed, + bool delsp) +{ + end(); + + struct rfc3676_parser_info info=rfc3676_parser_info(); + + info.charset=charset.c_str(); + info.isflowed=flowed == true; + info.isdelsp=delsp == true; + + info.line_begin=&tpp_trampoline_line_begin; + info.line_contents=&tpp_trampoline_line_contents; + info.line_flowed_notify=&tpp_trampoline_line_flowed_notify; + info.line_end=&tpp_trampoline_line_end; + + info.arg=reinterpret_cast<void *>(this); + + if ((handle=rfc3676parser_init(&info)) == NULL) + return false; + + return true; +} + +void mail::textplainparser::end(bool &unicode_errflag) +{ + int rc=0; + + if (handle) + { + rfc3676parser_deinit(handle, &rc); + handle=NULL; + } + + unicode_errflag=rc != 0; +} + +void mail::textplainparser::line_begin(size_t quote_level) +{ + if (quote_level) + { + std::vector<unicode_char> vec; + + vec.reserve(quote_level+1); + vec.insert(vec.end(), quote_level, '>'); + vec.push_back(' '); + line_contents(&vec[0], vec.size()); + } +} + +void mail::textplainparser::line_contents(const unicode_char *data, + size_t cnt) +{ +} + +void mail::textplainparser::line_flowed_notify() +{ +} + +void mail::textplainparser::line_end() +{ + unicode_char nl='\n'; + + line_contents(&nl, 1); +} |
