Check for multiple asset IDs in a PKL during verify.
[libdcp.git] / src / verify.cc
index 9068e9cca06d84ff248844e91fda68c4e2fa9ad9..a797813a526adb0736e1e03c3f0d44fdbfb8a245 100644 (file)
@@ -79,6 +79,7 @@
 #include <boost/algorithm/string.hpp>
 #include <iostream>
 #include <map>
+#include <set>
 #include <vector>
 
 
@@ -88,6 +89,7 @@ using std::list;
 using std::make_shared;
 using std::map;
 using std::max;
+using std::set;
 using std::shared_ptr;
 using std::string;
 using std::vector;
@@ -1616,6 +1618,7 @@ verify_pkl(
        )
 {
        validate_xml(pkl->file().get(), xsd_dtd_directory, notes);
+
        if (pkl_has_encrypted_assets(dcp, pkl)) {
                cxml::Document doc("PackingList");
                doc.read_file(pkl->file().get());
@@ -1623,6 +1626,14 @@ verify_pkl(
                        notes.push_back({VerificationNote::Type::BV21_ERROR, VerificationNote::Code::UNSIGNED_PKL_WITH_ENCRYPTED_CONTENT, pkl->id(), pkl->file().get()});
                }
        }
+
+       set<string> uuid_set;
+       for (auto asset: pkl->asset_list()) {
+               if (!uuid_set.insert(asset->id()).second) {
+                       notes.push_back({VerificationNote::Type::ERROR, VerificationNote::Code::DUPLICATE_ASSET_ID_IN_PKL, pkl->id(), pkl->file().get()});
+                       break;
+               }
+       }
 }
 
 
@@ -1899,6 +1910,8 @@ dcp::note_to_string (VerificationNote note)
                return String::compose("<ContentKind> has an invalid value %1.", note.note().get());
        case VerificationNote::Code::INVALID_MAIN_PICTURE_ACTIVE_AREA:
                return String::compose("<MainPictureActiveaArea> has an invalid value: %1", note.note().get());
+       case VerificationNote::Code::DUPLICATE_ASSET_ID_IN_PKL:
+               return String::compose("The PKL %1 has more than one asset with the same ID", note.note().get());
        }
 
        return "";