3 /// Blackberry database record classes. Help translate data
4 /// from data packets to useful structurs, and back.
8 Copyright (C) 2005, Net Direct Inc. (http://www.netdirect.ca/)
10 This program is free software; you can redistribute it and/or modify
11 it under the terms of the GNU General Public License as published by
12 the Free Software Foundation; either version 2 of the License, or
13 (at your option) any later version.
15 This program is distributed in the hope that it will be useful,
16 but WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
19 See the GNU General Public License in the COPYING file at the
20 root directory of this project for more details.
23 #ifndef __BARRY_RECORD_H__
24 #define __BARRY_RECORD_H__
31 // forward declarations
37 // NOTE: All classes here must be container-safe! Perhaps add sorting
38 // operators in the future.
52 typedef std::vector
<Command
> CommandArrayType
;
54 CommandArrayType Commands
;
57 const unsigned char* ParseField(const unsigned char *begin
,
58 const unsigned char *end
);
63 void Parse(const Data
&data
, int offset
);
66 // returns 0 if unable to find command name, which is safe, since
67 // 0 is a special command that shouldn't be in the table anyway
68 unsigned int GetCommand(const std::string
&name
) const;
70 void Dump(std::ostream
&os
) const;
73 inline std::ostream
& operator<< (std::ostream
&os
, const CommandTable
&command
) {
80 class DatabaseDatabase
86 unsigned int RecordCount
;
90 typedef std::vector
<Database
> DatabaseArrayType
;
92 DatabaseArrayType Databases
;
95 template <class RecordType
, class FieldType
>
96 void ParseRec(const RecordType
&rec
, const unsigned char *end
);
98 template <class FieldType
>
99 const unsigned char* ParseField(const unsigned char *begin
,
100 const unsigned char *end
);
106 void Parse(const Data
&data
);
109 // FIXME - returns 0 on error here, but that's a valid DBNumber
110 unsigned int GetDBNumber(const std::string
&name
) const;
112 void Dump(std::ostream
&os
) const;
115 inline std::ostream
& operator<<(std::ostream
&os
, const DatabaseDatabase
&dbdb
) {
127 std::ostream
& operator<< (std::ostream
&os
, const std::vector
<UnknownField
> &unknowns
);
130 /// \addtogroup RecordParserClasses
131 /// Parser and data storage classes. These classes take a
132 /// Database Database record and convert them into C++ objects.
133 /// Each of these classes are safe to be used in standard
134 /// containers, and are meant to be used in conjunction with the
135 /// RecordParser<> template when calling Controller::LoadDatabase().
146 GroupLink() : Link(0), Unknown(0) {}
147 GroupLink(uint32_t link
, uint16_t unknown
)
148 : Link(link
), Unknown(unknown
)
152 typedef std::vector
<GroupLink
> GroupLinksType
;
153 typedef std::vector
<UnknownField
> UnknownsType
;
155 // contact specific data
169 DefaultCommunicationsMethod
,
181 GroupLinksType GroupLinks
;
182 UnknownsType Unknowns
;
187 const unsigned char* ParseField(const unsigned char *begin
,
188 const unsigned char *end
);
194 uint64_t GetID() const { return RecordId
; }
195 std::string
GetPostalAddress() const;
197 void Parse(const Data
&data
, unsigned int operation
);
198 void Build(Data
&data
, unsigned int databaseId
) const;
199 void Clear(); // erase everything
201 void Dump(std::ostream
&os
) const;
202 void DumpLdif(std::ostream
&os
, const std::string
&baseDN
) const;
204 // protocol record sizes
205 static size_t GetOldProtocolRecordSize();
206 static size_t GetProtocolRecordSize();
209 inline std::ostream
& operator<< (std::ostream
&os
, const Contact
&contact
) {
229 std::vector
<UnknownField
> Unknowns
;
235 const unsigned char* ParseField(const unsigned char *begin
,
236 const unsigned char *end
);
237 void Parse(const Data
&data
, unsigned int operation
);
240 void Dump(std::ostream
&os
) const;
242 // protocol record sizes
243 static size_t GetOldProtocolRecordSize();
244 static size_t GetProtocolRecordSize();
247 inline std::ostream
& operator<<(std::ostream
&os
, const Message
&msg
) {
252 std::ostream
& operator<<(std::ostream
&os
, const Message::Address
&msga
);
261 std::string Location
;
262 time_t NotificationTime
;
265 std::vector
<UnknownField
> Unknowns
;
271 const unsigned char* ParseField(const unsigned char *begin
,
272 const unsigned char *end
);
273 void Parse(const Data
&data
, unsigned int operation
);
276 void Dump(std::ostream
&os
) const;
278 // protocol record sizes
279 static size_t GetOldProtocolRecordSize();
280 static size_t GetProtocolRecordSize();
283 inline std::ostream
& operator<<(std::ostream
&os
, const Calendar
&msg
) {