00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047 #ifndef _WordRecord_h_
00048 #define _WordRecord_h_
00049
00050 #ifndef SWIG
00051 #include "StringList.h"
00052 #include "WordContext.h"
00053 #endif
00054
00055
00056
00057
00058
00059
00060 class WordRecordStorage {
00061 public:
00062
00063
00064
00065
00066 unsigned int data;
00067
00068
00069
00070 String str;
00071 };
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081 class WordRecord
00082 {
00083 public:
00084
00085
00086
00087
00088
00089 inline WordRecord(WordContext* ncontext) {
00090 context = ncontext;
00091 Clear();
00092 }
00093
00094
00095
00096
00097
00098 inline void Clear() {
00099 memset((char*)&info, '\0', sizeof(info));
00100 type = DefaultType();
00101 }
00102
00103
00104
00105
00106 inline int DefaultType() {
00107 return context->GetRecordInfo().default_type;
00108 }
00109
00110 #ifndef SWIG
00111
00112
00113
00114
00115
00116 inline int Pack(String& packed) const {
00117 packed.trunc();
00118 switch(type) {
00119
00120 case WORD_RECORD_DATA:
00121 {
00122 packed << (char)type;
00123 int offset = 1;
00124 packed.ber_push(offset, info.data);
00125 }
00126 break;
00127
00128 case WORD_RECORD_STR:
00129 packed << (char)type;
00130 packed << info.str;
00131 break;
00132
00133 case WORD_RECORD_NONE:
00134 packed.trunc();
00135 break;
00136
00137 default:
00138 fprintf(stderr, "WordRecord::Pack: unknown type %d\n", type);
00139 return NOTOK;
00140 break;
00141 }
00142 return OK;
00143 }
00144
00145
00146
00147
00148
00149 inline int Unpack(const char* string, int length) {
00150 return Unpack(String(string, length));
00151 }
00152
00153
00154
00155
00156
00157
00158 inline int Unpack(const String& packed) {
00159 String decompressed;
00160
00161 if(packed.length() == 0)
00162 type = WORD_RECORD_NONE;
00163 else
00164 type = packed[0];
00165
00166 switch(type) {
00167
00168 case WORD_RECORD_DATA:
00169 {
00170 int offset = 1;
00171 packed.ber_shift(offset, info.data);
00172 }
00173 break;
00174
00175 case WORD_RECORD_STR:
00176 info.str = packed.sub(1);
00177 break;
00178
00179 case WORD_RECORD_NONE:
00180 break;
00181
00182 default:
00183 fprintf(stderr, "WordRecord::Pack: unknown type %d\n", (int)type);
00184 return NOTOK;
00185 break;
00186 }
00187
00188 return OK;
00189 }
00190 #endif
00191
00192 #ifndef SWIG
00193
00194
00195
00196
00197
00198 int Set(const String& bufferin);
00199 int SetList(StringList& fields);
00200
00201
00202
00203
00204
00205 int Get(String& bufferout) const;
00206
00207
00208
00209
00210 String Get() const;
00211
00212
00213
00214
00215 inline WordContext* GetContext() { return context; }
00216
00217
00218
00219
00220 inline const WordContext* GetContext() const { return context; }
00221
00222
00223
00224
00225
00226 int Write(FILE* f) const;
00227 #endif
00228 void Print() const;
00229
00230 unsigned char type;
00231 WordRecordStorage info;
00232 #ifndef SWIG
00233 WordContext* context;
00234 #endif
00235 };
00236
00237 #endif
00238