3 /// Virtual parser wrapper
7 Copyright (C) 2005-2010, Net Direct Inc. (http://www.netdirect.ca/)
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; either version 2 of the License, or
12 (at your option) any later version.
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU General Public License in the COPYING file at the
19 root directory of this project for more details.
23 #include "r_calendar.h"
24 #include "r_calllog.h"
25 #include "r_bookmark.h"
26 #include "r_contact.h"
28 #include "r_message.h"
29 #include "r_servicebook.h"
31 #include "r_pin_message.h"
32 #include "r_saved_message.h"
35 #include "r_timezone.h"
44 //////////////////////////////////////////////////////////////////////////////
45 // HexDumpParser class
47 HexDumpParser::HexDumpParser(std::ostream
&os
)
52 void HexDumpParser::ParseRecord(const Barry::DBData
&data
,
55 m_os
<< "Raw record dump for record: 0x"
56 << hex
<< data
.GetUniqueId()
57 << ", type: 0x" << hex
<< data
.GetRecType()
58 << ", offset: 0x" << hex
<< data
.GetOffset()
60 m_os
<< data
.GetData() << std::endl
;
64 //////////////////////////////////////////////////////////////////////////////
65 // MultiRecordParser class
67 // takes ownership of default_parser!
68 MultiRecordParser::MultiRecordParser(Parser
*default_parser
)
69 : m_default(default_parser
)
73 MultiRecordParser::~MultiRecordParser()
75 map_type::iterator i
= m_parsers
.begin();
76 for( ; i
!= m_parsers
.end(); ++i
) {
80 // and the default parser
84 void MultiRecordParser::Add(const std::string
&dbname
, Parser
*parser
)
86 std::auto_ptr
<Parser
> p(parser
);
88 map_type::iterator i
= m_parsers
.find(dbname
);
89 if( i
!= m_parsers
.end() ) {
90 // found existing parser, so delete it first
94 i
->second
= p
.release();
97 m_parsers
[dbname
] = p
.get();
102 // takes ownership of parser!
103 void MultiRecordParser::Add(RecordParserBase
*parser
)
105 std::auto_ptr
<Parser
> p(parser
);
106 std::string name
= parser
->GetDBName();
107 Add(name
, p
.release());
110 bool MultiRecordParser::Add(const std::string
&dbname
,
113 std::auto_ptr
<Parser
> p
;
116 #define HANDLE_PARSER(tname) if( dbname == tname::GetDBName() ) { p.reset( new RecordParser<tname, DumpStore<tname> > (new DumpStore<tname>(os)) ); }
118 // check for recognized database names
119 ALL_KNOWN_PARSER_TYPES
126 Add(dbname
, p
.release());
130 bool MultiRecordParser::Add(const std::string
&dbname
, AllRecordStore
&store
)
133 #define HANDLE_PARSER(tname) \
134 if( dbname == tname::GetDBName() ) { \
135 Add(dbname, new RecordParser<tname, AllRecordStore>(store)); \
139 // check for recognized database names
140 ALL_KNOWN_PARSER_TYPES
142 // if we get here, record was not found
147 void MultiRecordParser::ParseRecord(const DBData
&data
, const IConverter
*ic
)
149 // search for a named parser
150 map_type::iterator i
= m_parsers
.find(data
.GetDBName());
151 if( i
!= m_parsers
.end() ) {
153 i
->second
->ParseRecord(data
, ic
);
155 else if( m_default
) {
156 // use default parser
157 m_default
->ParseRecord(data
, ic
);
162 //////////////////////////////////////////////////////////////////////////////
163 // AllRecordDumpStore class
165 // Use the macro here to implement the overrides, so that
166 // the compiler will catch if we are missing any.
168 #define HANDLE_PARSER(tname) \
169 void AllRecordDumpStore::operator() (const Barry::tname &r) \
171 m_os << r << std::endl; \
174 ALL_KNOWN_PARSER_TYPES
177 //////////////////////////////////////////////////////////////////////////////
178 // AllRecordDumpParser class
180 AllRecordParser::AllRecordParser(std::ostream
&os
,
181 Parser
*default_parser
,
182 AllRecordStore
*store
)
183 : MultiRecordParser(default_parser
)
187 #define HANDLE_PARSER(tname) if( m_store ) { Add( new RecordParser<tname, AllRecordStore>(*m_store)); } else { Add(tname::GetDBName(), os); }
189 ALL_KNOWN_PARSER_TYPES
;
192 AllRecordParser::~AllRecordParser()
198 //////////////////////////////////////////////////////////////////////////////
201 TeeParser::TeeParser()
205 TeeParser::~TeeParser()
207 // free all the owned parser pointers
208 for( parser_list_type::iterator i
= m_owned_parsers
.begin();
209 i
!= m_owned_parsers
.end();
216 // takes ownership of the pointer!
217 void TeeParser::Add(Parser
*p
)
219 std::auto_ptr
<Parser
> ap(p
);
220 m_owned_parsers
.push_back(ap
.get());
224 // does NOT take ownership
225 void TeeParser::Add(Parser
&p
)
227 m_external_parsers
.push_back(&p
);
230 void TeeParser::ParseRecord(const DBData
&data
, const IConverter
*ic
)
232 // call all owned parsers
233 for( parser_list_type::iterator i
= m_owned_parsers
.begin();
234 i
!= m_owned_parsers
.end();
237 (*i
)->ParseRecord(data
, ic
);
240 // call all external parsers
241 for( parser_list_type::iterator i
= m_external_parsers
.begin();
242 i
!= m_external_parsers
.end();
245 (*i
)->ParseRecord(data
, ic
);