3 /// Virtual parser wrapper
7 Copyright (C) 2005-2012, 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"
37 #include "r_hhagent.h"
38 #include "ios_state.h"
47 //////////////////////////////////////////////////////////////////////////////
48 // HexDumpParser class
50 HexDumpParser::HexDumpParser(std::ostream
&os
)
55 void HexDumpParser::ParseRecord(const Barry::DBData
&data
,
58 ios_format_state
state(m_os
);
60 if( m_last_dbname
!= data
.GetDBName() ) {
61 m_os
<< "Records for database: " << data
.GetDBName() << endl
;
62 m_last_dbname
= data
.GetDBName();
65 m_os
<< "Raw record dump for record: 0x"
66 << hex
<< data
.GetUniqueId()
67 << ", type: 0x" << hex
<< (unsigned int) data
.GetRecType()
68 << ", offset: 0x" << hex
<< data
.GetOffset()
70 m_os
<< data
.GetData() << endl
;
74 //////////////////////////////////////////////////////////////////////////////
75 // MultiRecordParser class
77 // takes ownership of default_parser!
78 MultiRecordParser::MultiRecordParser(Parser
*default_parser
)
79 : m_delete_default(default_parser
) // takes ownership
80 , m_default(default_parser
)
84 // does not take ownership of the default_parser
85 MultiRecordParser::MultiRecordParser(Parser
&default_parser
)
86 : m_delete_default(0) // no ownership of reference
87 , m_default(&default_parser
)
91 MultiRecordParser::~MultiRecordParser()
93 map_type::iterator i
= m_parsers
.begin();
94 for( ; i
!= m_parsers
.end(); ++i
) {
98 // and the default parser
99 delete m_delete_default
;
102 void MultiRecordParser::Add(const std::string
&dbname
, Parser
*parser
)
104 std::auto_ptr
<Parser
> p(parser
);
106 map_type::iterator i
= m_parsers
.find(dbname
);
107 if( i
!= m_parsers
.end() ) {
108 // found existing parser, so delete it first
112 i
->second
= p
.release();
115 m_parsers
[dbname
] = p
.get();
120 // takes ownership of parser!
121 void MultiRecordParser::Add(RecordParserBase
*parser
)
123 std::auto_ptr
<Parser
> p(parser
);
124 std::string name
= parser
->GetDBName();
125 Add(name
, p
.release());
128 bool MultiRecordParser::Add(const std::string
&dbname
,
131 std::auto_ptr
<Parser
> p
;
134 #define HANDLE_PARSER(tname) if( dbname == tname::GetDBName() ) { p.reset( new RecordParser<tname, DumpStore<tname> > (new DumpStore<tname>(os)) ); }
136 // check for recognized database names
137 ALL_KNOWN_PARSER_TYPES
144 Add(dbname
, p
.release());
148 bool MultiRecordParser::Add(const std::string
&dbname
, AllRecordStore
&store
)
151 #define HANDLE_PARSER(tname) \
152 if( dbname == tname::GetDBName() ) { \
153 Add(dbname, new RecordParser<tname, AllRecordStore>(store)); \
157 // check for recognized database names
158 ALL_KNOWN_PARSER_TYPES
160 // if we get here, record was not found
165 void MultiRecordParser::ParseRecord(const DBData
&data
, const IConverter
*ic
)
167 // search for a named parser
168 map_type::iterator i
= m_parsers
.find(data
.GetDBName());
169 if( i
!= m_parsers
.end() ) {
171 i
->second
->ParseRecord(data
, ic
);
173 else if( m_default
) {
174 // use default parser
175 m_default
->ParseRecord(data
, ic
);
180 //////////////////////////////////////////////////////////////////////////////
181 // AllRecordDumpStore class
183 // Use the macro here to implement the overrides, so that
184 // the compiler will catch if we are missing any.
186 #define HANDLE_PARSER(tname) \
187 void AllRecordDumpStore::operator() (const Barry::tname &r) \
189 m_os << r << std::endl; \
192 ALL_KNOWN_PARSER_TYPES
195 //////////////////////////////////////////////////////////////////////////////
196 // AllRecordDumpParser class
198 AllRecordParser::AllRecordParser(std::ostream
&os
,
199 Parser
*default_parser
,
200 AllRecordStore
*store
)
201 : MultiRecordParser(default_parser
)
202 , m_store(store
) // takes ownership here
204 AddRecords(&os
, store
);
207 // does not take ownership of default_parser or store
208 AllRecordParser::AllRecordParser(Parser
&default_parser
, AllRecordStore
&store
)
209 : MultiRecordParser(default_parser
)
212 AddRecords(0, &store
);
215 AllRecordParser::~AllRecordParser()
220 void AllRecordParser::AddRecords(std::ostream
*os
, AllRecordStore
*store
)
222 // Does not allow RecordParser<> to own store, since we're using
223 // it multiple times as the same store for each record type.
225 #define HANDLE_PARSER(tname) \
227 Add( new RecordParser<tname, AllRecordStore>(*store)); \
229 Add(tname::GetDBName(), *os); \
232 ALL_KNOWN_PARSER_TYPES
;
236 //////////////////////////////////////////////////////////////////////////////
239 TeeParser::TeeParser()
243 TeeParser::~TeeParser()
245 // free all the owned parser pointers
246 for( parser_list_type::iterator i
= m_owned_parsers
.begin();
247 i
!= m_owned_parsers
.end();
254 // takes ownership of the pointer!
255 void TeeParser::Add(Parser
*p
)
257 std::auto_ptr
<Parser
> ap(p
);
258 m_owned_parsers
.push_back(ap
.get());
262 // does NOT take ownership
263 void TeeParser::Add(Parser
&p
)
265 m_external_parsers
.push_back(&p
);
268 void TeeParser::ParseRecord(const DBData
&data
, const IConverter
*ic
)
270 // call all owned parsers
271 for( parser_list_type::iterator i
= m_owned_parsers
.begin();
272 i
!= m_owned_parsers
.end();
275 (*i
)->ParseRecord(data
, ic
);
278 // call all external parsers
279 for( parser_list_type::iterator i
= m_external_parsers
.begin();
280 i
!= m_external_parsers
.end();
283 (*i
)->ParseRecord(data
, ic
);