Allow progressive writes to be encrypted.
[libdcp.git] / src / metadata.cc
index fe883c9473f4c9c24372b91fc98cae4abb6a6200..bcf5d76c62c659940d6cf7116b11a94b7b645c24 100644 (file)
  *  @brief Metadata for writing to the DCP.
  */
 
+#include <sstream>
+#include <iomanip>
 #include <time.h>
+#ifdef LIBDCP_WINDOWS
+#include <windows.h>
+#endif
 #include "metadata.h"
 
 using namespace std;
@@ -47,10 +52,44 @@ void
 XMLMetadata::set_issue_date_now ()
 {
        char buffer[64];
-       time_t now;
-       time (&now);
+       time_t now = time (0);
        struct tm* tm = localtime (&now);
-       strftime (buffer, 64, "%Y-%m-%dT%I:%M:%S%z", tm);
-       issue_date = string (buffer);
+       strftime (buffer, 64, "%Y-%m-%dT%I:%M:%S", tm);
+
+       int offset = 0;
+
+#ifdef LIBDCP_POSIX
+
+       offset = tm->tm_gmtoff / 60;
+       
+#else
+       TIME_ZONE_INFORMATION tz;
+       GetTimeZoneInformation (&tz);
+       offset = tz.Bias;
+#endif
+       
+       issue_date = string (buffer) + utc_offset_to_string (offset);
+}
+
+/** @param b Offset from UTC to local time in minutes.
+ *  @return string of the form e.g. -01:00.
+ */
+string
+XMLMetadata::utc_offset_to_string (int b)
+{
+       bool const negative = (b < 0);
+       b = negative ? -b : b;
+
+       int const hours = b / 60;
+       int const minutes = b % 60;
+
+       stringstream o;
+       if (negative) {
+               o << "-";
+       } else {
+               o << "+";
+       }
+
+       o << setw(2) << setfill('0') << hours << ":" << setw(2) << setfill('0') << minutes;
+       return o.str ();
 }
-