Tweak comment.
[libdcp.git] / src / asset.cc
index 740dc592335c6379f07824b6c896af8a1acd52b0..78686a17bf16ffe6ec59ef62c464f64a26042f0b 100644 (file)
@@ -22,6 +22,7 @@
  */
 
 #include <iostream>
+#include <fstream>
 #include <boost/filesystem.hpp>
 #include "AS_DCP.h"
 #include "KM_util.h"
@@ -50,7 +51,7 @@ Asset::write_to_pkl (ostream& s) const
        s << "    <Asset>\n"
          << "      <Id>urn:uuid:" << _uuid << "</Id>\n"
          << "      <AnnotationText>" << _mxf_name << "</AnnotationText>\n"
-         << "      <Hash>" << _digest << "</Hash>\n"
+         << "      <Hash>" << digest() << "</Hash>\n"
          << "      <Size>" << filesystem::file_size(mxf_path()) << "</Size>\n"
          << "      <Type>application/mxf</Type>\n"
          << "    </Asset>\n";
@@ -93,3 +94,71 @@ Asset::mxf_path () const
        p /= _mxf_name;
        return p;
 }
+
+list<string>
+Asset::equals (shared_ptr<const Asset> other, EqualityOptions opt) const
+{
+       list<string> notes;
+       
+       if (opt.flags & LIBDCP_METADATA) {
+               if (_mxf_name != other->_mxf_name) {
+                       notes.push_back ("MXF names differ");
+               }
+               if (_fps != other->_fps) {
+                       notes.push_back ("MXF frames per second differ");
+               }
+               if (_length != other->_length) {
+                       notes.push_back ("MXF lengths differ");
+               }
+       }
+       
+       if (opt.flags & MXF_BITWISE) {
+
+               if (digest() != other->digest()) {
+                       notes.push_back ("MXF digests differ");
+               }
+               
+               if (filesystem::file_size (mxf_path()) != filesystem::file_size (other->mxf_path())) {
+                       notes.push_back (mxf_path().string() + " and " + other->mxf_path().string() + " sizes differ");
+                       return notes;
+               }
+               
+               ifstream a (mxf_path().string().c_str(), ios::binary);
+               ifstream b (other->mxf_path().string().c_str(), ios::binary);
+
+               int buffer_size = 65536;
+               char abuffer[buffer_size];
+               char bbuffer[buffer_size];
+
+               int n = filesystem::file_size (mxf_path ());
+
+               while (n) {
+                       int const t = min (n, buffer_size);
+                       a.read (abuffer, t);
+                       b.read (bbuffer, t);
+
+                       if (memcmp (abuffer, bbuffer, t) != 0) {
+                               notes.push_back (mxf_path().string() + " and " + other->mxf_path().string() + " content differs");
+                               return notes;
+                       }
+
+                       n -= t;
+               }
+       }
+
+       return notes;
+}
+
+string
+Asset::digest () const
+{
+       if (_digest.empty ()) {
+               _digest = make_digest (mxf_path().string(), 0);
+       }
+
+       return _digest;
+}
+
+               
+               
+