Annotation of parser3/src/include/pa_charset.h, revision 1.22
1.1 paf 1: /** @file
2: Parser: Charset connection decl.
3:
1.20 paf 4: Copyright (c) 2001, 2003 ArtLebedev Group (http://www.artlebedev.com)
1.14 paf 5: Author: Alexandr Petrosian <paf@design.ru> (http://paf.design.ru)
1.1 paf 6: */
7:
8: #ifndef PA_CHARSET_H
9: #define PA_CHARSET_H
1.17 paf 10:
1.22 ! paf 11: static const char* IDENT_CHARSET_H="$Date: 2003/03/21 09:43:48 $";
1.1 paf 12:
13: #include "pa_pool.h"
14: #include "pa_exception.h"
15: #include "pa_common.h"
16:
17: // hiding into namespace so to avoid stupid conflict
18: namespace PCRE {
19: #include "pcre.h"
20: # include "internal.h"
21: };
22:
1.3 paf 23: #ifdef XML
24: #include "libxml/encoding.h"
25: #endif
26:
1.1 paf 27: // defines
28:
1.3 paf 29: # ifndef XMLCh
1.10 paf 30: typedef unsigned int XMLCh;
1.3 paf 31: # endif
32: # ifndef XMLByte
1.11 paf 33: typedef unsigned char XMLByte;
1.3 paf 34: # endif
35:
1.10 paf 36: struct Charset_TransRec {
37: XMLCh intCh;
38: XMLByte extCh;
39: };
1.1 paf 40:
41: /** charset holds name & transcode tables
42: registers Xerces transcoders
43: */
44: class Charset : public Pooled {
45: public:
46:
1.2 paf 47: Charset(Pool& apool, const String& aname, const String *request_file_spec);
1.1 paf 48: Charset::~Charset();
49:
50: const String& name() const { return fname; }
51:
52: bool isUTF8() const { return fisUTF8; }
53:
54: static void transcode(Pool& pool,
55: const Charset& source_transcoder, const void *source_body, size_t source_content_length,
56: const Charset& dest_transcoder, const void *& dest_body, size_t& dest_content_length
57: );
1.21 paf 58:
59: static String& transcode(Pool& pool,
60: const Charset& source_transcoder,
61: const Charset& dest_transcoder,
62: const String& src);
63:
64: static void transcode(Pool& pool,
65: const Charset& source_transcoder,
66: const Charset& dest_transcoder,
67: Array& src);
68:
69: static void transcode(Pool& pool,
70: const Charset& source_transcoder,
71: const Charset& dest_transcoder,
72: Hash& src);
1.1 paf 73:
1.9 paf 74: #ifdef XML
75: xmlCharEncodingHandler *transcoder(const String *source);
76: #endif
77:
1.1 paf 78: public:
79:
80: unsigned char pcre_tables[tables_length];
81:
82: private:
83:
1.2 paf 84: void loadDefinition(const String& request_file_spec);
1.1 paf 85: void sort_ToTable();
86:
87: void transcodeToUTF8(Pool& pool,
88: const void *source_body, size_t source_content_length,
89: const void *& dest_body, size_t& dest_content_length) const;
90: void transcodeFromUTF8(Pool& pool,
91: const void *source_body, size_t source_content_length,
92: const void *& dest_body, size_t& dest_content_length) const;
1.15 paf 93:
1.1 paf 94: void transcodeToCharset(Pool& pool,
95: const Charset& dest_transcoder,
96: const void *source_body, size_t source_content_length,
97: const void *& dest_body, size_t& dest_content_length) const;
98:
1.4 paf 99: public:
100:
101: struct Tables {
102: XMLCh fromTable[0x100];
103: Charset_TransRec *toTable;
104: uint toTableSize;
105: };
106:
1.1 paf 107: private:
108:
1.2 paf 109: const String& fname;
1.1 paf 110: bool fisUTF8;
1.4 paf 111: Tables tables;
1.1 paf 112:
113: #ifdef XML
114:
115: private:
1.4 paf 116: void addEncoding(char *name_cstr);
1.1 paf 117: void initTranscoder(const String *source, const char *name_cstr);
1.9 paf 118:
1.1 paf 119: public:
1.3 paf 120: /// converts GdomeDOMString string to char *
121: const char *transcode_cstr(GdomeDOMString *s);
122: /// converts GdomeDOMString string to parser String
1.19 paf 123: String& transcode(GdomeDOMString *s
124: #ifndef NO_STRING_ORIGIN
125: , const String *origin
126: #endif
127: );
1.8 paf 128: /// converts xmlChar* null-terminated string to char *
129: const char *transcode_cstr(xmlChar *s);
130: /// converts xmlChar* null-terminated string to parser String
1.19 paf 131: String& transcode(xmlChar *s
132: #ifndef NO_STRING_ORIGIN
133: , const String *origin
134: #endif
135: );
1.16 paf 136: /** converts sized char * to xmlChar*
137: @returns xmlChar * which caller should free
138: */
139: xmlChar *transcode_buf2xchar(const char *buf, size_t buf_size);
1.3 paf 140: /// converts char * to GdomeDOMString
1.16 paf 141: GdomeDOMString_auto_ptr transcode_buf2dom(const char *buf, size_t buf_size);
1.3 paf 142: /// converts parser String to GdomeDOMString
1.5 paf 143: GdomeDOMString_auto_ptr transcode(const String& s);
1.1 paf 144:
145: private:
146:
1.9 paf 147: xmlCharEncodingHandler *ftranscoder;
1.1 paf 148:
149: #endif
150:
1.5 paf 151: };
152:
1.12 paf 153: #ifdef XML
1.5 paf 154: /// Auto-object used to track GdomeDOMString usage
155: class GdomeDOMString_auto_ptr {
156: GdomeDOMString *fstring;
157: public:
1.6 paf 158: explicit GdomeDOMString_auto_ptr(gchar *astring) : fstring(gdome_str_mkref(astring)) {}
1.5 paf 159: explicit GdomeDOMString_auto_ptr(GdomeDOMString *astring) : fstring(astring) {
1.7 paf 160: // not ref-ing, owning
1.5 paf 161: }
162: ~GdomeDOMString_auto_ptr() {
163: gdome_str_unref(fstring);
164: }
1.22 ! paf 165: /* GdomeDOMString* get() {
! 166: return fstring;
! 167: }*/
! 168: GdomeDOMString* use() {
! 169: if(fstring)
! 170: gdome_str_ref(fstring);
1.5 paf 171: return fstring;
172: }
173: GdomeDOMString* operator->() {
174: return fstring;
175: }
1.22 ! paf 176: /* GdomeDOMString& operator*() {
1.5 paf 177: return *fstring;
1.22 ! paf 178: }*/
1.5 paf 179:
180: // copying
181: GdomeDOMString_auto_ptr(const GdomeDOMString_auto_ptr& src) : fstring(src.fstring) {
182: gdome_str_ref(fstring);
183: }
184: GdomeDOMString_auto_ptr& operator =(const GdomeDOMString_auto_ptr& src) {
185: if(this == &src)
186: return *this;
187:
1.22 ! paf 188: if(fstring)
! 189: gdome_str_unref(fstring);
1.5 paf 190: fstring=src.fstring;
1.22 ! paf 191: if(fstring)
! 192: gdome_str_ref(fstring);
1.5 paf 193:
194: return *this;
195: }
1.1 paf 196: };
1.12 paf 197: #endif
1.1 paf 198:
199: #endif
E-mail: