Report progress with done/total rather than a float.
[libdcp.git] / src / util.h
index cc272b643522247ff6213a1fb417d7825b184921..551eed071eb158b9455136a2aed903a0961ed28c 100644 (file)
@@ -1,5 +1,5 @@
 /*
-    Copyright (C) 2012-2020 Carl Hetherington <cth@carlh.net>
+    Copyright (C) 2012-2021 Carl Hetherington <cth@carlh.net>
 
     This file is part of libdcp.
 
 
 
 #include "array_data.h"
-#include "types.h"
 #include "local_time.h"
+#include "warnings.h"
+LIBDCP_DISABLE_WARNINGS
 #include <asdcp/KM_log.h>
-#include <memory>
-#include <boost/function.hpp>
+LIBDCP_ENABLE_WARNINGS
 #include <boost/filesystem.hpp>
+#include <boost/function.hpp>
 #include <boost/optional.hpp>
+#include <memory>
 #include <string>
 #include <stdint.h>
 
 
+/* windows.h defines this but we want to use it */
+#undef ERROR
+
+
 #define LIBDCP_UNUSED(x) (void)(x)
 
 
+namespace ASDCP {
+       class Dictionary;
+}
+
+
 namespace xmlpp {
        class Element;
        class Node;
@@ -74,30 +85,26 @@ extern std::string make_uuid ();
 
 /** Create a digest for a file
  *  @param filename File name
- *  @param progress Optional progress reporting function.  The function will be called
- *  with a progress value between 0 and 1
+ *  @param progress Optional progress reporting function, called with a number of bytes done
+ *  and a total number of bytes.
  *  @return Digest
  */
-extern std::string make_digest (boost::filesystem::path filename, boost::function<void (float)>);
+extern std::string make_digest(boost::filesystem::path filename, boost::function<void (int64_t, int64_t)>);
 
 extern std::string make_digest (ArrayData data);
 
-/** @param s A string
- *  @return true if the string contains only space, newline or tab characters, or is empty
- */
-extern bool empty_or_white_space (std::string s);
-
 extern bool ids_equal (std::string a, std::string b);
 extern std::string remove_urn_uuid (std::string raw);
 
 /** Set up various bits that the library needs.  Should be called once
  *  by client applications.
  *
- *  @param tags_directory Path to a copy of the tags directory from the source code;
- *  if none is specified libdcp will look for a tags directory inside the environment
- *  variable LIBDCP_SHARE_PREFIX or the LIBDCP_SHARE_PREFIX #defined during the build.
+ *  @param resources_directory Path to a directory containing the tags and xsd
+ *  directories from the source code; if none is specified libdcp will look
+ *  in the directory given by LIBDCP_RESOURCES or based on where the current
+ *  executable is.
  */
-extern void init (boost::optional<boost::filesystem::path> tags_directory = boost::optional<boost::filesystem::path>());
+extern void init (boost::optional<boost::filesystem::path> resources_directory = boost::optional<boost::filesystem::path>());
 
 /** Decode a base64 string.  The base64 decode routine in KM_util.cpp
  *  gives different values to both this and the command-line base64
@@ -112,16 +119,6 @@ extern int base64_decode (std::string const & in, unsigned char* out, int out_le
 
 extern boost::optional<boost::filesystem::path> relative_to_root (boost::filesystem::path root, boost::filesystem::path file);
 
-/** @param p Path to open
- *  @param t mode flags, as for fopen(3)
- *  @return FILE pointer or 0 on error
- *
- *  Apparently there is no way to create an ofstream using a UTF-8
- *  filename under Windows.  We are hence reduced to using fopen
- *  with this wrapper.
- */
-extern FILE * fopen_boost (boost::filesystem::path, std::string);
-
 extern std::string file_to_string (boost::filesystem::path, uintmax_t max_length = 1048576);
 
 /** @param key RSA private key in PEM format (optionally with -----BEGIN... / -----END...)
@@ -150,6 +147,9 @@ extern std::string unique_string (std::vector<std::string> existing, std::string
 
 extern ASDCP::Dictionary const* asdcp_smpte_dict;
 
+extern boost::filesystem::path directory_containing_executable ();
+extern boost::filesystem::path resources_directory ();
+
 
 class ASDCPErrorSuspender
 {
@@ -164,6 +164,15 @@ private:
 };
 
 
+template <class From, class To>
+void
+add_to_container(To& container, From source)
+{
+       std::copy(source.begin(), source.end(), std::back_inserter(container));
 }
 
+
+}
+
+
 #endif