3 /// Virtual parser wrapper
7 Copyright (C) 2005-2007, 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.
22 #ifndef __BARRY_PARSER_H__
23 #define __BARRY_PARSER_H__
27 #include <stdint.h> // for uint32_t
29 // forward declarations
30 namespace Barry
{ class Data
; }
34 // also acts as a null parser
38 /// Base class for the parser hierarchy. If in debug mode, this
39 /// class can be used as a null parser. Call Init() and the protocol
40 /// will be dumped to stdout and no parsing will be done.
42 /// This class provides the interface that the Controller class uses
43 /// to pass raw data it reads from the device. The Controller, along
44 /// with the Packet class, calls each of the virtual functions below
45 /// in the same order.
53 /// Reset and prepare for a new raw data packet
54 virtual void Clear() {}
57 virtual void SetIds(uint8_t RecType
, uint32_t UniqueId
) {}
59 /// Called to parse the header portion of the raw data packet.
60 /// data contains the entire packet, and offset contains the
61 /// location at which to start parsing.
62 virtual void ParseHeader(const Data
&data
, size_t &offset
) {}
64 /// Called to parse sub fields in the raw data packet.
65 /// The same data is passed as was passed in ParseHeader,
66 /// only the offset will be updated if it was advanced during
67 /// the header parsing.
68 virtual void ParseFields(const Data
&data
, size_t &offset
) {}
70 /// Called at the very end of record parsing, and used to
71 /// store the final packet somewhere, either in memory, disk, etc.
72 virtual void Store() {}
77 // RecordParser template class
79 /// Template class for easy creation of specific parser objects. This template
80 /// takes the following template arguments:
82 /// - Record: One of the record parser classes in record.h
83 /// - Storage: A custom storage functor class. An object of this type
84 /// will be called as a function with parsed Record as an
85 /// argument. This happens on the fly as the data is retrieved
86 /// from the device over USB, so it should not block forever.
88 /// Example LoadDatabase() call:
91 /// struct StoreContact
93 /// std::vector<Contact> &array;
94 /// StoreContact(std::vector<Contact> &a) : array(a) {}
95 /// void operator() (const Contact &c)
97 /// array.push_back(c);
101 /// Controller con(probeResult);
102 /// con.OpenMode(Controller::Desktop);
103 /// std::vector<Contact> contactList;
104 /// StoreContact storage(contactList);
105 /// RecordParser<Contact, StoreContact> parser(storage);
106 /// con.LoadDatabase(con.GetDBID("Address Book"), parser);
109 template <class Record
, class Storage
>
110 class RecordParser
: public Parser
117 /// Constructor that references an externally managed storage object.
118 RecordParser(Storage
&storage
)
119 : m_store(&storage
), m_owned(false) {}
121 /// Constructor that references a locally managed storage object.
122 /// The pointer passed in will be stored, and freed when this class
123 /// is destroyed. It is safe to call this constructor with
124 /// a 'new'ly created storage object.
125 RecordParser(Storage
*storage
)
126 : m_store(storage
), m_owned(true) {}
139 virtual void SetIds(uint8_t RecType
, uint32_t UniqueId
)
141 m_rec
.SetIds(RecType
, UniqueId
);
144 virtual void ParseHeader(const Data
&data
, size_t &offset
)
146 m_rec
.ParseHeader(data
, offset
);
149 virtual void ParseFields(const Data
&data
, size_t &offset
)
151 m_rec
.ParseFields(data
, offset
);