IMF MCA labels
[asdcplib.git] / src / MXFTypes.h
index 5bb8ca44e21ffd39f190a07edab0c29d2e9ee03a..05672d6861b00dca95d802a21875795c246db7e0 100755 (executable)
@@ -1,5 +1,5 @@
 /*
-Copyright (c) 2005-2006, John Hurst
+Copyright (c) 2005-2012, John Hurst
 All rights reserved.
 
 Redistribution and use in source and binary forms, with or without
@@ -41,9 +41,9 @@ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 // used with TLVReader::Read*
 //
 // these are used below to manufacture arguments
-#define OBJ_READ_ARGS(s,l) Dict::Type(MDD_##s##_##l), &l
-#define OBJ_WRITE_ARGS(s,l) Dict::Type(MDD_##s##_##l), &l
-#define OBJ_TYPE_ARGS(t) Dict::Type(MDD_##t).ul
+#define OBJ_READ_ARGS(s,l) m_Dict->Type(MDD_##s##_##l), &l
+#define OBJ_WRITE_ARGS(s,l) m_Dict->Type(MDD_##s##_##l), &l
+#define OBJ_TYPE_ARGS(t) m_Dict->Type(MDD_##t).ul
 
 
 namespace ASDCP
@@ -99,7 +99,7 @@ namespace ASDCP
        {
        public:
          Batch() {}
-         ~Batch() {}
+         virtual ~Batch() {}
 
          //
          virtual bool Unarchive(Kumu::MemIOReader* Reader) {
@@ -117,7 +117,7 @@ namespace ASDCP
                result = Tmp.Unarchive(Reader);
 
                if ( result )
-                 push_back(Tmp);
+                 this->push_back(Tmp);
              }
 
            return result;
@@ -125,6 +125,18 @@ namespace ASDCP
 
          inline virtual bool HasValue() const { return ! this->empty(); }
 
+         virtual ui32_t ArchiveLength() const {
+           ui32_t arch_size = sizeof(ui32_t)*2;
+
+           typename std::vector<T>::const_iterator l_i = this->begin();
+           assert(l_i != this->end());
+
+           for ( ; l_i != this->end(); l_i++ )
+             arch_size += l_i->ArchiveLength();
+           
+           return arch_size;
+         }
+
          //
          virtual bool Archive(Kumu::MemIOWriter* Writer) const {
            if ( ! Writer->WriteUi32BE(this->size()) ) return false;
@@ -169,7 +181,7 @@ namespace ASDCP
        {
        public:
          Array() {}
-         ~Array() {}
+         virtual ~Array() {}
 
          //
          virtual bool Unarchive(Kumu::MemIOReader* Reader)
@@ -180,7 +192,7 @@ namespace ASDCP
                {
                  T Tmp;
                  result = Tmp.Unarchive(Reader);
-                 push_back(Tmp);
+                 this->push_back(Tmp);
                }
 
              return result;
@@ -188,6 +200,17 @@ namespace ASDCP
 
          inline virtual bool HasValue() const { return ! this->empty(); }
 
+         virtual ui32_t ArchiveLength() const {
+           ui32_t arch_size = 0;
+
+           typename std::list<T>::const_iterator l_i = this->begin();
+
+           for ( ; l_i != this->end(); l_i++ )
+             arch_size += l_i->ArchiveLength();
+           
+           return arch_size;
+         }
+
          //
          virtual bool Archive(Kumu::MemIOWriter* Writer) const {
            bool result = true;
@@ -214,78 +237,36 @@ namespace ASDCP
        };
 
       //
-      class Timestamp : public Kumu::IArchive
+    class ISO8String : public std::string, public Kumu::IArchive
        {
        public:
-         ui16_t Year;
-         ui8_t  Month;
-         ui8_t  Day;
-         ui8_t  Hour;
-         ui8_t  Minute;
-         ui8_t  Second;
-         ui8_t  Tick;
-
-         Timestamp();
-         Timestamp(const Timestamp& rhs);
-         Timestamp(const char* datestr);
-         virtual ~Timestamp();
-
-         const Timestamp& operator=(const Timestamp& rhs);
-         bool operator<(const Timestamp& rhs) const;
-         bool operator==(const Timestamp& rhs) const;
-         bool operator!=(const Timestamp& rhs) const;
-
-         // decode and set value from string formatted by EncodeAsString
-         Result_t    SetFromString(const char* datestr);
-         
-         // add the given number of days or hours to the timestamp value. Values less than zero
-         // will cause the value to decrease
-         void AddDays(i32_t);
-         void AddHours(i32_t);
-
-         // Write the timestamp value to the given buffer in the form 2004-05-01 13:20:00.000
-         // returns 0 if the buffer is smaller than DateTimeLen
-         const char* EncodeString(char* str_buf, ui32_t buf_len) const;
-
-         //
-         inline virtual bool Unarchive(Kumu::MemIOReader* Reader) {
-           if ( ! Reader->ReadUi16BE(&Year) ) return false;
-           if ( ! Reader->ReadRaw(&Month, 6) ) return false;
-           return true;
-         }
+         ISO8String() {}
+         ~ISO8String() {}
 
-         inline virtual bool HasValue() const { return true; }
+         const ISO8String& operator=(const char*);
+         const ISO8String& operator=(const std::string&);
 
-         //
-         inline virtual bool Archive(Kumu::MemIOWriter* Writer) const {
-           if ( ! Writer->WriteUi16BE(Year) ) return false;
-           if ( ! Writer->WriteRaw(&Month, 6) ) return false;
-           return true;
-         }
+         const char* EncodeString(char* str_buf, ui32_t buf_len) const;
+         inline virtual bool HasValue() const { return ! empty(); }
+         inline virtual ui32_t ArchiveLength() const { return sizeof(ui32_t) + size(); }
+         virtual bool Unarchive(Kumu::MemIOReader* Reader);
+         virtual bool Archive(Kumu::MemIOWriter* Writer) const;
        };
 
       //
-      class UTF16String : public Kumu::IArchive
+    class UTF16String : public std::string, public Kumu::IArchive
        {
-         ui16_t m_length;
-         char   m_buffer[IdentBufferLen];
-         ASDCP_NO_COPY_CONSTRUCT(UTF16String);
-         
        public:
-         UTF16String() : m_length(0) { *m_buffer = 0; }
+         UTF16String() {}
          ~UTF16String() {}
 
          const UTF16String& operator=(const char*);
+         const UTF16String& operator=(const std::string&);
 
-         //
-         const char* EncodeString(char* str_buf, ui32_t buf_len) const {
-           strncpy(str_buf, m_buffer, Kumu::xmin(buf_len, ((ui32_t)m_length+1)));
-           str_buf[buf_len-1] = 0;
-           return str_buf;
-         }
-
+         const char* EncodeString(char* str_buf, ui32_t buf_len) const;
+         inline virtual bool HasValue() const { return ! empty(); }
+         inline virtual ui32_t ArchiveLength() const { return sizeof(ui32_t) + size(); }
          virtual bool Unarchive(Kumu::MemIOReader* Reader);
-         inline virtual bool HasValue() const { return m_length > 0; }
          virtual bool Archive(Kumu::MemIOWriter* Writer) const;
        };
 
@@ -296,7 +277,7 @@ namespace ASDCP
          Rational() {}
          ~Rational() {}
 
-         Rational(const Rational& rhs) {
+         Rational(const Rational& rhs) : ASDCP::Rational(), IArchive() {
            Numerator = rhs.Numerator;
            Denominator = rhs.Denominator;
          }
@@ -320,7 +301,7 @@ namespace ASDCP
 
          //
          inline const char* EncodeString(char* str_buf, ui32_t buf_len) const {
-           snprintf(str_buf, buf_len, "%lu/%lu", Numerator, Denominator);
+           snprintf(str_buf, buf_len, "%d/%d", Numerator, Denominator);
            return str_buf;
          }
 
@@ -331,6 +312,7 @@ namespace ASDCP
          }
 
          inline virtual bool HasValue() const { return true; }
+         inline virtual ui32_t ArchiveLength() const { return sizeof(ui32_t)*2; }
 
          inline virtual bool Archive(Kumu::MemIOWriter* Writer) const {
            if ( ! Writer->WriteUi32BE((ui32_t)Numerator) ) return false;
@@ -342,18 +324,27 @@ namespace ASDCP
       //
       class VersionType : public Kumu::IArchive
        {
-         ASDCP_NO_COPY_CONSTRUCT(VersionType);
-
        public:
-         enum Release_t { RL_UNKNOWN, RM_RELEASE, RL_DEVELOPMENT, RL_PATCHED, RL_BETA, RL_PRIVATE };
+         enum Release_t { RL_UNKNOWN, RL_RELEASE, RL_DEVELOPMENT, RL_PATCHED, RL_BETA, RL_PRIVATE, RL_MAX };
          ui16_t Major;
          ui16_t Minor;
          ui16_t Patch;
          ui16_t Build;
-         ui16_t Release;
+         Release_t Release;
 
          VersionType() : Major(0), Minor(0), Patch(0), Build(0), Release(RL_UNKNOWN) {}
-         ~VersionType() {}
+         VersionType(const VersionType& rhs) { Copy(rhs); }
+         virtual ~VersionType() {}
+
+         const VersionType& operator=(const VersionType& rhs) { Copy(rhs); return *this; }
+         void Copy(const VersionType& rhs) {
+           Major = rhs.Major;
+           Minor = rhs.Minor;
+           Patch = rhs.Patch;
+           Build = rhs.Build;
+           Release = rhs.Release;
+         }
+
          void Dump(FILE* = 0);
 
          const char* EncodeString(char* str_buf, ui32_t buf_len) const {
@@ -373,6 +364,7 @@ namespace ASDCP
          }
 
          inline virtual bool HasValue() const { return true; }
+         inline virtual ui32_t ArchiveLength() const { return sizeof(ui16_t)*5; }
 
          virtual bool Archive(Kumu::MemIOWriter* Writer) const {
            if ( ! Writer->WriteUi16BE(Major) ) return false;
@@ -385,17 +377,23 @@ namespace ASDCP
        };
 
       //
-      class Raw : public Kumu::ByteString, public Kumu::IArchive
+      class Raw : public Kumu::ByteString
        {
-         ASDCP_NO_COPY_CONSTRUCT(Raw);
-
        public:
          Raw();
-         ~Raw();
+         Raw(const Raw& rhs) { Copy(rhs); }
+         virtual ~Raw();
+
+         const Raw& operator=(const Raw& rhs) { Copy(rhs); return *this; }
+         void Copy(const Raw& rhs) {
+           if ( KM_SUCCESS(Capacity(rhs.Length())) )
+             {
+               Set(rhs);
+             }
+         }
 
          //
           virtual bool Unarchive(Kumu::MemIOReader* Reader);
-         inline virtual bool HasValue() const { return Length() > 0; }
          virtual bool Archive(Kumu::MemIOWriter* Writer) const;
          const char* EncodeString(char* str_buf, ui32_t buf_len) const;
        };