parser.h
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 template <class RecordT>
00221 void ParseDBData(const DBData &data, RecordT &rec, const IConverter *ic)
00222 {
00223
00224 rec = RecordT();
00225
00226
00227 rec.SetIds(data.GetRecType(), data.GetUniqueId());
00228 size_t offset = data.GetOffset();
00229 rec.ParseHeader(data.GetData(), offset);
00230 rec.ParseFields(data.GetData(), offset, ic);
00231 }
00232
00233
00234
00235
00236
00237
00238
00239
00240
00241
00242
00243
00244
00245
00246
00247
00248
00249
00250
00251
00252
00253
00254
00255
00256
00257
00258
00259
00260
00261
00262
00263
00264
00265
00266 template <class RecordT, class StorageT>
00267 class RecordParser : public RecordParserBase
00268 {
00269 StorageT *m_store;
00270 bool m_owned;
00271 RecordT m_rec;
00272 bool m_record_valid;
00273
00274 public:
00275
00276 RecordParser(StorageT &storage)
00277 : m_store(&storage)
00278 , m_owned(false)
00279 , m_record_valid(false)
00280 {
00281 }
00282
00283
00284
00285
00286
00287 RecordParser(StorageT *storage = 0)
00288 : m_store(storage)
00289 , m_owned(true)
00290 , m_record_valid(false)
00291 {
00292 }
00293
00294 ~RecordParser()
00295 {
00296 if( this->m_owned )
00297 delete m_store;
00298 }
00299
00300 virtual StorageT* GetStore()
00301 {
00302 return m_store;
00303 }
00304
00305 virtual const StorageT* GetStore() const
00306 {
00307 return m_store;
00308 }
00309
00310 virtual void ParseRecord(const DBData &data, const IConverter *ic)
00311 {
00312 m_record_valid = false;
00313 ParseDBData(data, m_rec, ic);
00314 m_record_valid = true;
00315
00316 if( m_store )
00317 (*m_store)(m_rec);
00318 }
00319
00320
00321
00322
00323
00324
00325
00326 virtual const char * GetDBName() const
00327 {
00328 return RecordT::GetDBName();
00329 }
00330
00331 virtual uint8_t GetDefaultRecType() const
00332 {
00333 return RecordT::GetDefaultRecType();
00334 }
00335
00336
00337
00338 virtual bool IsRecordValid() const
00339 {
00340 return m_record_valid;
00341 }
00342
00343 virtual uint8_t GetRecType() const
00344 {
00345 return m_rec.GetRecType();
00346 }
00347
00348 virtual uint32_t GetUniqueId() const
00349 {
00350 return m_rec.GetUniqueId();
00351 }
00352
00353 virtual void Dump(std::ostream &os) const
00354 {
00355 m_rec.Dump(os);
00356 }
00357 };
00358
00359
00360
00361
00362
00363
00364
00365 class BXEXPORT AllRecordStore
00366 {
00367 public:
00368 AllRecordStore() {}
00369 virtual ~AllRecordStore() {}
00370
00371 #undef HANDLE_PARSER
00372 #define HANDLE_PARSER(tname) \
00373 virtual void operator() (const Barry::tname &) = 0;
00374
00375 ALL_KNOWN_PARSER_TYPES
00376 };
00377
00378
00379
00380
00381
00382
00383
00384
00385
00386
00387
00388
00389
00390
00391
00392
00393
00394
00395
00396
00397 class BXEXPORT MultiRecordParser : public Parser
00398 {
00399 typedef std::map<std::string, Parser*> map_type;
00400
00401 Parser *m_delete_default;
00402 Parser *m_default;
00403
00404 map_type m_parsers;
00405
00406 public:
00407
00408 explicit MultiRecordParser(Parser *default_parser = 0);
00409
00410
00411 explicit MultiRecordParser(Parser &default_parser);
00412
00413 ~MultiRecordParser();
00414
00415
00416 void Add(const std::string &dbname, Parser *parser);
00417
00418
00419 void Add(RecordParserBase *parser);
00420
00421
00422
00423
00424
00425 template <class RecordT>
00426 void Add(AllRecordStore &store)
00427 {
00428 Add( RecordT::GetDBName(),
00429 new RecordParser<RecordT, AllRecordStore>(store) );
00430 }
00431
00432
00433
00434
00435 template <class RecordT, class StorageT>
00436 void Add(StorageT *store)
00437 {
00438 Add( RecordT::GetDBName(),
00439 new RecordParser<RecordT, StorageT>(store) );
00440 }
00441
00442 template <class RecordT, class StorageT>
00443 void Add(StorageT &store)
00444 {
00445 Add( RecordT::GetDBName(),
00446 new RecordParser<RecordT, StorageT>(store) );
00447 }
00448
00449
00450
00451
00452
00453 bool Add(const std::string &dbname, std::ostream &os);
00454
00455
00456
00457
00458 bool Add(const std::string &dbname, AllRecordStore &store);
00459
00460
00461 virtual void ParseRecord(const DBData &data, const IConverter *ic);
00462 };
00463
00464
00465
00466
00467
00468
00469
00470 class BXEXPORT AllRecordDumpStore : public AllRecordStore
00471 {
00472 protected:
00473 std::ostream &m_os;
00474
00475 public:
00476 explicit AllRecordDumpStore(std::ostream &os)
00477 : m_os(os)
00478 {
00479 }
00480
00481 #undef HANDLE_PARSER
00482 #define HANDLE_PARSER(tname) \
00483 virtual void operator() (const Barry::tname &);
00484
00485 ALL_KNOWN_PARSER_TYPES
00486 };
00487
00488
00489
00490
00491
00492
00493
00494
00495
00496
00497
00498
00499
00500
00501
00502 class BXEXPORT AllRecordParser : public MultiRecordParser
00503 {
00504 AllRecordStore *m_store;
00505
00506 protected:
00507
00508
00509 void AddRecords(std::ostream *os, AllRecordStore *store);
00510
00511 public:
00512
00513 explicit AllRecordParser(std::ostream &os,
00514 Parser *default_parser = 0,
00515 AllRecordStore *store = 0);
00516
00517
00518 AllRecordParser(Parser &default_parser, AllRecordStore &store);
00519
00520 ~AllRecordParser();
00521 };
00522
00523
00524
00525
00526
00527
00528
00529 class BXEXPORT TeeParser : public Parser
00530 {
00531 typedef std::vector<Parser*> parser_list_type;
00532
00533 parser_list_type m_external_parsers, m_owned_parsers;
00534
00535 public:
00536 TeeParser();
00537 ~TeeParser();
00538
00539
00540
00541 void Add(Parser *p);
00542
00543
00544 void Add(Parser &p);
00545
00546 void ParseRecord(const DBData &data, const IConverter *ic);
00547 };
00548
00549 }
00550
00551 #endif
00552