more optional stuff
[asdcplib.git] / src / MXF.h
index 826c0495cc38b1d82075dabf4927cd9d599515c4..dc06c7fceef1ad6e08734f601c6bb0475a846f82 100755 (executable)
--- a/src/MXF.h
+++ b/src/MXF.h
@@ -218,7 +218,29 @@ namespace ASDCP
          virtual void     Dump(FILE* = 0);
        };
 
+      // wrapper object manages optional properties
+      template <class PropertyType>
+       class optional_property
+       {
+         PropertyType m_property;
+         bool m_has_value;
+
+       public:
+       optional_property() : m_has_value(false) {}
+       optional_property(const PropertyType& value) : m_property(value), m_has_value(false) {}
+         const optional_property<PropertyType>& operator=(const PropertyType& rhs) { this->m_property = rhs; this->m_has_value = true; return *this; }
+         bool operator==(const PropertyType& rhs) const { return this->m_property == rhs; }
+         bool operator==(const optional_property<PropertyType>& rhs) const { return this->m_property == rhs.m_property; }
+         operator PropertyType&() { return this->m_property; }
+         void set(const PropertyType& rhs) { this->m_property = rhs; this->m_has_value = true; }
+         void set_has_value(bool has_value = true) { this->m_has_value = has_value; }
+         void reset(const PropertyType& rhs) { this->m_has_value = false; }
+         bool empty() const { return ! m_has_value; }
+         PropertyType& get() { return m_property; }
+         const PropertyType& cget() const { return m_property; }
+       };
 
+      // base class of all metadata objects
       //
       class InterchangeObject : public ASDCP::KLVPacket
        {
@@ -228,7 +250,7 @@ namespace ASDCP
          const Dictionary*& m_Dict;
          IPrimerLookup* m_Lookup;
          UUID           InstanceUID;
-         UUID           GenerationUID;
+         optional_property<UUID>  GenerationUID;
 
        InterchangeObject(const Dictionary*& d) : m_Dict(d), m_Lookup(0) {}
          virtual ~InterchangeObject() {}
@@ -256,13 +278,14 @@ namespace ASDCP
          const Dictionary*& m_Dict;
          Kumu::Timestamp    LastModifiedDate;
          ui16_t       Version;
-         ui32_t       ObjectModelVersion;
-         UUID         PrimaryPackage;
+         optional_property<ui32_t> ObjectModelVersion;
+         optional_property<UUID> PrimaryPackage;
          Batch<UUID>  Identifications;
          UUID         ContentStorage;
          UL           OperationalPattern;
          Batch<UL>    EssenceContainers;
          Batch<UL>    DMSchemes;
+         optional_property<Batch<UL> > ApplicationSchemes;
 
          Preface(const Dictionary*& d);
          virtual ~Preface() {}
@@ -433,26 +456,39 @@ namespace ASDCP
        }
       };
 
+      typedef std::map<const std::string, const UL, ci_comp> mca_label_map_t;
+      bool decode_mca_string(const std::string& s, const mca_label_map_t& labels, const Dictionary& dict, const std::string& language, InterchangeObject_list_t&, ui32_t&);
+
       //
-      class MCAConfigParser : public InterchangeObject_list_t
+      class ASDCP_MCAConfigParser : public InterchangeObject_list_t
        {
-         typedef std::map<const std::string, const UL, ci_comp> label_map_t;
-         label_map_t label_map;
-         ui32_t m_ChannelCount;
+         KM_NO_COPY_CONSTRUCT(ASDCP_MCAConfigParser);
+         ASDCP_MCAConfigParser();
 
+       protected:
+         mca_label_map_t m_LabelMap;
+         ui32_t m_ChannelCount;
          const Dictionary*& m_Dict;
 
-         KM_NO_COPY_CONSTRUCT(MCAConfigParser);
-         MCAConfigParser();
          
        public:
-         MCAConfigParser(const Dictionary*&);
+         ASDCP_MCAConfigParser(const Dictionary*&);
          bool DecodeString(const std::string& s, const std::string& language = "en");
 
          // Valid only after a successful call to DecodeString
          ui32_t ChannelCount() const;
        };
 
+      //
+      class AS02_MCAConfigParser : public ASDCP_MCAConfigParser
+       {
+         KM_NO_COPY_CONSTRUCT(AS02_MCAConfigParser);
+         AS02_MCAConfigParser();
+         
+       public:
+         AS02_MCAConfigParser(const Dictionary*&);
+       };
+
     } // namespace MXF
 } // namespace ASDCP