Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #ifndef __BARRY_PARSER_H__
00023 #define __BARRY_PARSER_H__
00024
00025 #include "dll.h"
00026 #include "data.h"
00027 #include "protocol.h"
00028 #include <stdint.h>
00029 #include <iosfwd>
00030 #include <map>
00031
00032
00033 namespace Barry {
00034 class IConverter;
00035 class Contact;
00036 class Message;
00037 class Calendar;
00038 class CalendarAll;
00039 class CallLog;
00040 class Bookmark;
00041 class ServiceBook;
00042 class Memo;
00043 class Task;
00044 class PINMessage;
00045 class SavedMessage;
00046 class Sms;
00047 class Folder;
00048 class Timezone;
00049 class ContentStore;
00050 }
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060 #define ALL_KNOWN_PARSER_TYPES \
00061 HANDLE_PARSER(Contact) \
00062 HANDLE_PARSER(Bookmark) \
00063 HANDLE_PARSER(Calendar) \
00064 HANDLE_PARSER(CalendarAll) \
00065 HANDLE_PARSER(ContentStore) \
00066 HANDLE_PARSER(Folder) \
00067 HANDLE_PARSER(Memo) \
00068 HANDLE_PARSER(Message) \
00069 HANDLE_PARSER(CallLog) \
00070 HANDLE_PARSER(PINMessage) \
00071 HANDLE_PARSER(SavedMessage) \
00072 HANDLE_PARSER(ServiceBook) \
00073 HANDLE_PARSER(Sms) \
00074 HANDLE_PARSER(Task) \
00075 HANDLE_PARSER(Timezone)
00076
00077 namespace Barry {
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093 class BXEXPORT Parser
00094 {
00095 public:
00096 Parser() {}
00097 virtual ~Parser() {}
00098
00099
00100 virtual void ParseRecord(const DBData &data, const IConverter *ic) = 0;
00101 };
00102
00103
00104
00105
00106
00107
00108
00109
00110
00111
00112
00113
00114
00115
00116 class BXEXPORT NullParser : public Parser
00117 {
00118 public:
00119 NullParser() {}
00120 virtual ~NullParser() {}
00121
00122 virtual void ParseRecord(const DBData &data, const IConverter *ic) {}
00123 };
00124
00125
00126
00127
00128
00129
00130
00131
00132
00133
00134
00135 class BXEXPORT HexDumpParser : public Parser
00136 {
00137 std::ostream &m_os;
00138 std::string m_last_dbname;
00139
00140 public:
00141 explicit HexDumpParser(std::ostream &os);
00142
00143 virtual void ParseRecord(const Barry::DBData &data,
00144 const IConverter *ic);
00145 };
00146
00147
00148
00149
00150
00151
00152
00153
00154 class BXEXPORT RecordParserBase : public Parser
00155 {
00156 public:
00157
00158
00159 virtual const char * GetDBName() const = 0;
00160 virtual uint8_t GetDefaultRecType() const = 0;
00161
00162
00163
00164 virtual bool IsRecordValid() const = 0;
00165 virtual uint8_t GetRecType() const = 0;
00166 virtual uint32_t GetUniqueId() const = 0;
00167 virtual void Dump(std::ostream &os) const = 0;
00168 };
00169
00170
00171
00172
00173
00174
00175
00176
00177
00178
00179
00180
00181
00182
00183 template <class RecordT>
00184 class NullStore
00185 {
00186 public:
00187 void operator() (const RecordT &r)
00188 {
00189 }
00190 };
00191
00192
00193
00194
00195
00196
00197
00198 template <class RecordT>
00199 class DumpStore
00200 {
00201 std::ostream &m_os;
00202
00203 public:
00204 explicit DumpStore(std::ostream &os)
00205 : m_os(os)
00206 {
00207 }
00208
00209 void operator() (const RecordT &r)
00210 {
00211 r.Dump(m_os);
00212 }
00213 };
00214
00215
00216
00217
00218
00219
00220
00221
00222
00223
00224
00225
00226
00227
00228
00229
00230
00231
00232
00233
00234
00235
00236
00237
00238
00239
00240
00241
00242
00243
00244
00245
00246
00247
00248 template <class RecordT, class StorageT>
00249 class RecordParser : public RecordParserBase
00250 {
00251 StorageT *m_store;
00252 bool m_owned;
00253 RecordT m_rec;
00254 bool m_record_valid;
00255
00256 public:
00257
00258 RecordParser(StorageT &storage)
00259 : m_store(&storage)
00260 , m_owned(false)
00261 , m_record_valid(false)
00262 {
00263 }
00264
00265
00266
00267
00268
00269 RecordParser(StorageT *storage = 0)
00270 : m_store(storage)
00271 , m_owned(true)
00272 , m_record_valid(false)
00273 {
00274 }
00275
00276 ~RecordParser()
00277 {
00278 if( this->m_owned )
00279 delete m_store;
00280 }
00281
00282 virtual StorageT* GetStore()
00283 {
00284 return m_store;
00285 }
00286
00287 virtual const StorageT* GetStore() const
00288 {
00289 return m_store;
00290 }
00291
00292 virtual void ParseRecord(const DBData &data, const IConverter *ic)
00293 {
00294 m_rec = RecordT();
00295 m_record_valid = false;
00296
00297 m_rec.SetIds(data.GetRecType(), data.GetUniqueId());
00298 size_t offset = data.GetOffset();
00299 m_rec.ParseHeader(data.GetData(), offset);
00300 m_rec.ParseFields(data.GetData(), offset, ic);
00301 m_record_valid = true;
00302
00303 if( m_store )
00304 (*m_store)(m_rec);
00305 }
00306
00307
00308
00309
00310
00311
00312
00313 virtual const char * GetDBName() const
00314 {
00315 return RecordT::GetDBName();
00316 }
00317
00318 virtual uint8_t GetDefaultRecType() const
00319 {
00320 return RecordT::GetDefaultRecType();
00321 }
00322
00323
00324
00325 virtual bool IsRecordValid() const
00326 {
00327 return m_record_valid;
00328 }
00329
00330 virtual uint8_t GetRecType() const
00331 {
00332 return m_rec.GetRecType();
00333 }
00334
00335 virtual uint32_t GetUniqueId() const
00336 {
00337 return m_rec.GetUniqueId();
00338 }
00339
00340 virtual void Dump(std::ostream &os) const
00341 {
00342 m_rec.Dump(os);
00343 }
00344 };
00345
00346
00347
00348
00349
00350
00351
00352 class BXEXPORT AllRecordStore
00353 {
00354 public:
00355 AllRecordStore() {}
00356 virtual ~AllRecordStore() {}
00357
00358 #undef HANDLE_PARSER
00359 #define HANDLE_PARSER(tname) \
00360 virtual void operator() (const Barry::tname &) = 0;
00361
00362 ALL_KNOWN_PARSER_TYPES
00363 };
00364
00365
00366
00367
00368
00369
00370
00371
00372
00373
00374
00375
00376
00377
00378
00379
00380
00381
00382
00383
00384 class BXEXPORT MultiRecordParser : public Parser
00385 {
00386 typedef std::map<std::string, Parser*> map_type;
00387
00388 Parser *m_default;
00389 map_type m_parsers;
00390
00391 public:
00392
00393 explicit MultiRecordParser(Parser *default_parser = 0);
00394 ~MultiRecordParser();
00395
00396
00397 void Add(const std::string &dbname, Parser *parser);
00398
00399
00400 void Add(RecordParserBase *parser);
00401
00402
00403
00404
00405
00406 template <class RecordT>
00407 void Add(AllRecordStore &store)
00408 {
00409 Add( RecordT::GetDBName(),
00410 new RecordParser<RecordT, AllRecordStore>(store) );
00411 }
00412
00413
00414
00415
00416 template <class RecordT, class StorageT>
00417 void Add(StorageT *store)
00418 {
00419 Add( RecordT::GetDBName(),
00420 new RecordParser<RecordT, StorageT>(store) );
00421 }
00422
00423 template <class RecordT, class StorageT>
00424 void Add(StorageT &store)
00425 {
00426 Add( RecordT::GetDBName(),
00427 new RecordParser<RecordT, StorageT>(store) );
00428 }
00429
00430
00431
00432
00433
00434 bool Add(const std::string &dbname, std::ostream &os);
00435
00436
00437
00438
00439 bool Add(const std::string &dbname, AllRecordStore &store);
00440
00441
00442 virtual void ParseRecord(const DBData &data, const IConverter *ic);
00443 };
00444
00445
00446
00447
00448
00449
00450
00451 class BXEXPORT AllRecordDumpStore : public AllRecordStore
00452 {
00453 protected:
00454 std::ostream &m_os;
00455
00456 public:
00457 explicit AllRecordDumpStore(std::ostream &os)
00458 : m_os(os)
00459 {
00460 }
00461
00462 #undef HANDLE_PARSER
00463 #define HANDLE_PARSER(tname) \
00464 virtual void operator() (const Barry::tname &);
00465
00466 ALL_KNOWN_PARSER_TYPES
00467 };
00468
00469
00470
00471
00472
00473
00474
00475
00476
00477
00478
00479
00480
00481
00482
00483 class BXEXPORT AllRecordParser : public MultiRecordParser
00484 {
00485 AllRecordStore *m_store;
00486
00487 public:
00488
00489 explicit AllRecordParser(std::ostream &os,
00490 Parser *default_parser = 0,
00491 AllRecordStore *store = 0);
00492 ~AllRecordParser();
00493 };
00494
00495
00496
00497
00498
00499
00500
00501 class BXEXPORT TeeParser : public Parser
00502 {
00503 typedef std::vector<Parser*> parser_list_type;
00504
00505 parser_list_type m_external_parsers, m_owned_parsers;
00506
00507 public:
00508 TeeParser();
00509 ~TeeParser();
00510
00511
00512
00513 void Add(Parser *p);
00514
00515
00516 void Add(Parser &p);
00517
00518 void ParseRecord(const DBData &data, const IConverter *ic);
00519 };
00520
00521 }
00522
00523 #endif
00524