2 Copyright (c) 2005-2006, John Hurst
5 Redistribution and use in source and binary forms, with or without
6 modification, are permitted provided that the following conditions
8 1. Redistributions of source code must retain the above copyright
9 notice, this list of conditions and the following disclaimer.
10 2. Redistributions in binary form must reproduce the above copyright
11 notice, this list of conditions and the following disclaimer in the
12 documentation and/or other materials provided with the distribution.
13 3. The name of the author may not be used to endorse or promote products
14 derived from this software without specific prior written permission.
16 THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
17 IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
18 OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
19 IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
20 INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
21 NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
22 DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
23 THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24 (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
25 THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
41 // used with TLVReader::Read*
43 // these are used below to manufacture arguments
44 #define OBJ_READ_ARGS(s,l) Dict::Type(MDD_##s##_##l), &l
45 #define OBJ_WRITE_ARGS(s,l) Dict::Type(MDD_##s##_##l), &l
46 #define OBJ_TYPE_ARGS(t) Dict::Type(MDD_##t).ul
53 typedef std::pair<ui32_t, ui32_t> ItemInfo;
54 typedef std::map<TagValue, ItemInfo> TagMap;
57 class TLVReader : public Kumu::MemIOReader
61 IPrimerLookup* m_Lookup;
64 ASDCP_NO_COPY_CONSTRUCT(TLVReader);
65 bool FindTL(const MDDEntry&);
68 TLVReader(const byte_t* p, ui32_t c, IPrimerLookup* = 0);
69 Result_t ReadObject(const MDDEntry&, Kumu::IArchive*);
70 Result_t ReadUi8(const MDDEntry&, ui8_t*);
71 Result_t ReadUi16(const MDDEntry&, ui16_t*);
72 Result_t ReadUi32(const MDDEntry&, ui32_t*);
73 Result_t ReadUi64(const MDDEntry&, ui64_t*);
77 class TLVWriter : public Kumu::MemIOWriter
81 IPrimerLookup* m_Lookup;
84 ASDCP_NO_COPY_CONSTRUCT(TLVWriter);
85 Result_t WriteTag(const MDDEntry&);
88 TLVWriter(byte_t* p, ui32_t c, IPrimerLookup* = 0);
89 Result_t WriteObject(const MDDEntry&, Kumu::IArchive*);
90 Result_t WriteUi8(const MDDEntry&, ui8_t*);
91 Result_t WriteUi16(const MDDEntry&, ui16_t*);
92 Result_t WriteUi32(const MDDEntry&, ui32_t*);
93 Result_t WriteUi64(const MDDEntry&, ui64_t*);
98 class Batch : public std::vector<T>, public Kumu::IArchive
105 virtual bool Unarchive(Kumu::MemIOReader* Reader) {
106 ui32_t ItemCount, ItemSize;
107 if ( ! Reader->ReadUi32BE(&ItemCount) ) return false;
108 if ( ! Reader->ReadUi32BE(&ItemSize) ) return false;
110 if ( ( ItemCount > 65536 ) || ( ItemSize > 1024 ) )
114 for ( ui32_t i = 0; i < ItemCount && result; i++ )
117 result = Tmp.Unarchive(Reader);
126 inline virtual bool HasValue() const { return ! this->empty(); }
129 virtual bool Archive(Kumu::MemIOWriter* Writer) const {
130 if ( ! Writer->WriteUi32BE(this->size()) ) return false;
131 byte_t* p = Writer->CurrentData();
133 if ( ! Writer->WriteUi32BE(0) ) return false;
134 if ( this->empty() ) return true;
136 typename std::vector<T>::const_iterator l_i = this->begin();
137 assert(l_i != this->end());
139 ui32_t ItemSize = Writer->Remainder();
140 if ( ! (*l_i).Archive(Writer) ) return false;
141 ItemSize -= Writer->Remainder();
142 Kumu::i2p<ui32_t>(KM_i32_BE(ItemSize), p);
146 for ( ; l_i != this->end() && result; l_i++ )
147 result = (*l_i).Archive(Writer);
153 void Dump(FILE* stream = 0, ui32_t depth = 0)
155 char identbuf[IdentBufferLen];
160 typename std::vector<T>::iterator i = this->begin();
161 for ( ; i != this->end(); i++ )
162 fprintf(stream, " %s\n", (*i).EncodeString(identbuf, IdentBufferLen));
168 class Array : public std::list<T>, public Kumu::IArchive
175 virtual bool Unarchive(Kumu::MemIOReader* Reader)
179 while ( Reader->Remainder() > 0 && result )
182 result = Tmp.Unarchive(Reader);
189 inline virtual bool HasValue() const { return ! this->empty(); }
192 virtual bool Archive(Kumu::MemIOWriter* Writer) const {
194 typename std::list<T>::const_iterator l_i = this->begin();
196 for ( ; l_i != this->end() && result; l_i++ )
197 result = (*l_i).Archive(Writer);
203 void Dump(FILE* stream = 0, ui32_t depth = 0)
205 char identbuf[IdentBufferLen];
210 typename std::list<T>::iterator i = this->begin();
211 for ( ; i != this->end(); i++ )
212 fprintf(stream, " %s\n", (*i).EncodeString(identbuf, IdentBufferLen));
217 class Timestamp : public Kumu::IArchive
229 Timestamp(const Timestamp& rhs);
230 Timestamp(const char* datestr);
231 virtual ~Timestamp();
233 const Timestamp& operator=(const Timestamp& rhs);
234 bool operator<(const Timestamp& rhs) const;
235 bool operator==(const Timestamp& rhs) const;
236 bool operator!=(const Timestamp& rhs) const;
238 // decode and set value from string formatted by EncodeAsString
239 Result_t SetFromString(const char* datestr);
241 // add the given number of days or hours to the timestamp value. Values less than zero
242 // will cause the value to decrease
244 void AddHours(i32_t);
246 // Write the timestamp value to the given buffer in the form 2004-05-01 13:20:00.000
247 // returns 0 if the buffer is smaller than DateTimeLen
248 const char* EncodeString(char* str_buf, ui32_t buf_len) const;
251 inline virtual bool Unarchive(Kumu::MemIOReader* Reader) {
252 if ( ! Reader->ReadUi16BE(&Year) ) return false;
253 if ( ! Reader->ReadRaw(&Month, 6) ) return false;
257 inline virtual bool HasValue() const { return true; }
260 inline virtual bool Archive(Kumu::MemIOWriter* Writer) const {
261 if ( ! Writer->WriteUi16BE(Year) ) return false;
262 if ( ! Writer->WriteRaw(&Month, 6) ) return false;
268 class UTF16String : public std::string, public Kumu::IArchive
274 const UTF16String& operator=(const char*);
275 const UTF16String& operator=(const std::string&);
277 const char* EncodeString(char* str_buf, ui32_t buf_len) const;
278 virtual bool Unarchive(Kumu::MemIOReader* Reader);
279 inline virtual bool HasValue() const { return ! empty(); }
280 virtual bool Archive(Kumu::MemIOWriter* Writer) const;
284 class Rational : public ASDCP::Rational, public Kumu::IArchive
290 Rational(const Rational& rhs) {
291 Numerator = rhs.Numerator;
292 Denominator = rhs.Denominator;
295 const Rational& operator=(const Rational& rhs) {
296 Numerator = rhs.Numerator;
297 Denominator = rhs.Denominator;
301 Rational(const ASDCP::Rational& rhs) {
302 Numerator = rhs.Numerator;
303 Denominator = rhs.Denominator;
306 const Rational& operator=(const ASDCP::Rational& rhs) {
307 Numerator = rhs.Numerator;
308 Denominator = rhs.Denominator;
313 inline const char* EncodeString(char* str_buf, ui32_t buf_len) const {
314 snprintf(str_buf, buf_len, "%d/%d", Numerator, Denominator);
318 inline virtual bool Unarchive(Kumu::MemIOReader* Reader) {
319 if ( ! Reader->ReadUi32BE((ui32_t*)&Numerator) ) return false;
320 if ( ! Reader->ReadUi32BE((ui32_t*)&Denominator) ) return false;
324 inline virtual bool HasValue() const { return true; }
326 inline virtual bool Archive(Kumu::MemIOWriter* Writer) const {
327 if ( ! Writer->WriteUi32BE((ui32_t)Numerator) ) return false;
328 if ( ! Writer->WriteUi32BE((ui32_t)Denominator) ) return false;
334 class VersionType : public Kumu::IArchive
336 ASDCP_NO_COPY_CONSTRUCT(VersionType);
339 enum Release_t { RL_UNKNOWN, RL_RELEASE, RL_DEVELOPMENT, RL_PATCHED, RL_BETA, RL_PRIVATE };
346 VersionType() : Major(0), Minor(0), Patch(0), Build(0), Release(RL_UNKNOWN) {}
348 void Dump(FILE* = 0);
350 const char* EncodeString(char* str_buf, ui32_t buf_len) const {
351 snprintf(str_buf, buf_len, "%hu.%hu.%hu.%hur%hu", Major, Minor, Patch, Build, Release);
355 virtual bool Unarchive(Kumu::MemIOReader* Reader) {
356 if ( ! Reader->ReadUi16BE(&Major) ) return false;
357 if ( ! Reader->ReadUi16BE(&Minor) ) return false;
358 if ( ! Reader->ReadUi16BE(&Patch) ) return false;
359 if ( ! Reader->ReadUi16BE(&Build) ) return false;
361 if ( ! Reader->ReadUi16BE(&tmp_release) ) return false;
362 Release = (Release_t)tmp_release;
366 inline virtual bool HasValue() const { return true; }
368 virtual bool Archive(Kumu::MemIOWriter* Writer) const {
369 if ( ! Writer->WriteUi16BE(Major) ) return false;
370 if ( ! Writer->WriteUi16BE(Minor) ) return false;
371 if ( ! Writer->WriteUi16BE(Patch) ) return false;
372 if ( ! Writer->WriteUi16BE(Build) ) return false;
373 if ( ! Writer->WriteUi16BE((ui16_t)(Release & 0x0000ffffL)) ) return false;
379 class Raw : public Kumu::ByteString
381 ASDCP_NO_COPY_CONSTRUCT(Raw);
388 virtual bool Unarchive(Kumu::MemIOReader* Reader);
389 virtual bool Archive(Kumu::MemIOWriter* Writer) const;
390 const char* EncodeString(char* str_buf, ui32_t buf_len) const;
397 #endif //_MXFTYPES_H_