Use dcp::filesystem to wrap filesystem calls and fix_long_path
[dcpomatic.git] / src / lib / util.cc
index be5ab5b953d4544929db1881c64a78ec786d3307..1a340cbcee16358402c1ea24d334e87e83965d84 100644 (file)
@@ -55,6 +55,7 @@
 #include <dcp/atmos_asset.h>
 #include <dcp/decrypted_kdm.h>
 #include <dcp/file.h>
+#include <dcp/filesystem.h>
 #include <dcp/locale_convert.h>
 #include <dcp/picture_asset.h>
 #include <dcp/raw_convert.h>
@@ -408,7 +409,6 @@ ffmpeg_log_callback(void* ptr, int level, const char* fmt, va_list vl)
 }
 
 
-static
 void
 capture_ffmpeg_logs()
 {
@@ -449,7 +449,13 @@ LIBDCP_ENABLE_WARNINGS
 
 #ifdef DCPOMATIC_WINDOWS
        putenv ("PANGOCAIRO_BACKEND=fontconfig");
-       putenv (String::compose("FONTCONFIG_PATH=%1", resources_path().string()).c_str());
+       if (dcp::filesystem::exists(resources_path() / "fonts.conf")) {
+               /* The actual application after installation */
+               putenv(String::compose("FONTCONFIG_PATH=%1", resources_path().string()).c_str());
+       } else {
+               /* The place where fonts.conf is during tests */
+               putenv("FONTCONFIG_PATH=build\\fonts");
+       }
 #endif
 
 #ifdef DCPOMATIC_OSX
@@ -462,7 +468,7 @@ LIBDCP_ENABLE_WARNINGS
 
 #if defined(DCPOMATIC_WINDOWS) || defined(DCPOMATIC_OSX)
        /* Render something to fontconfig to create its cache */
-       list<StringText> subs;
+       vector<StringText> subs;
        dcp::SubtitleString ss(
                optional<string>(), false, false, false, dcp::Colour(), 42, 1, dcp::Time(), dcp::Time(), 0, dcp::HAlign::CENTER, 0, dcp::VAlign::CENTER, 0, dcp::Direction::LTR,
                "Hello dolly", dcp::Effect::NONE, dcp::Colour(), dcp::Time(), dcp::Time(), 0
@@ -557,7 +563,7 @@ digest_head_tail (vector<boost::filesystem::path> files, boost::uintmax_t size)
                        throw OpenFileError (files[i].string(), errno, OpenFileError::READ);
                }
 
-               boost::uintmax_t this_time = min (to_do, boost::filesystem::file_size (files[i]));
+               auto this_time = min(to_do, dcp::filesystem::file_size(files[i]));
                f.checked_read(p, this_time);
                p += this_time;
                to_do -= this_time;
@@ -576,7 +582,7 @@ digest_head_tail (vector<boost::filesystem::path> files, boost::uintmax_t size)
                        throw OpenFileError (files[i].string(), errno, OpenFileError::READ);
                }
 
-               boost::uintmax_t this_time = min (to_do, boost::filesystem::file_size (files[i]));
+               auto this_time = min(to_do, dcp::filesystem::file_size(files[i]));
                f.seek(-this_time, SEEK_END);
                f.checked_read(p, this_time);
                p += this_time;
@@ -593,7 +599,7 @@ digest_head_tail (vector<boost::filesystem::path> files, boost::uintmax_t size)
 string
 simple_digest (vector<boost::filesystem::path> paths)
 {
-       return digest_head_tail(paths, 1000000) + raw_convert<string>(boost::filesystem::file_size(paths.front()));
+       return digest_head_tail(paths, 1000000) + raw_convert<string>(dcp::filesystem::file_size(paths.front()));
 }
 
 
@@ -728,9 +734,9 @@ asset_filename (shared_ptr<dcp::Asset> asset, string type, int reel_index, int r
        values['r'] = raw_convert<string>(reel_index + 1);
        values['n'] = raw_convert<string>(reel_count);
        if (summary) {
-               values['c'] = careful_string_filter(summary.get());
+               values['c'] = summary.get();
        }
-       return Config::instance()->dcp_asset_filename_format().get(values, "_" + asset->id() + extension);
+       return careful_string_filter(Config::instance()->dcp_asset_filename_format().get(values, "_" + asset->id() + extension));
 }
 
 
@@ -794,7 +800,7 @@ careful_string_filter (string s)
 
        /* Then remove anything that's not in a very limited character set */
        wstring out;
-       wstring const allowed = L"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz-_%.+";
+       wstring const allowed = L"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz-_.+";
        for (int i = 0; i < transliterated_more.length(); ++i) {
                wchar_t c = transliterated_more[i];
                if (allowed.find(c) != string::npos) {
@@ -960,7 +966,7 @@ copy_in_bits (boost::filesystem::path from, boost::filesystem::path to, std::fun
 
        std::vector<uint8_t> buffer(chunk);
 
-       boost::uintmax_t const total = boost::filesystem::file_size (from);
+       auto const total = dcp::filesystem::file_size(from);
        boost::uintmax_t remaining = total;
 
        while (remaining) {
@@ -1032,7 +1038,7 @@ default_font_file ()
        boost::filesystem::path liberation_normal;
        try {
                liberation_normal = resources_path() / "LiberationSans-Regular.ttf";
-               if (!boost::filesystem::exists (liberation_normal)) {
+               if (!dcp::filesystem::exists(liberation_normal)) {
                        /* Hack for unit tests */
                        liberation_normal = resources_path() / "fonts" / "LiberationSans-Regular.ttf";
                }
@@ -1040,10 +1046,10 @@ default_font_file ()
 
        }
 
-       if (!boost::filesystem::exists(liberation_normal)) {
+       if (!dcp::filesystem::exists(liberation_normal)) {
                liberation_normal = "/usr/share/fonts/truetype/liberation/LiberationSans-Regular.ttf";
        }
-       if (!boost::filesystem::exists(liberation_normal)) {
+       if (!dcp::filesystem::exists(liberation_normal)) {
                liberation_normal = "/usr/share/fonts/liberation-sans/LiberationSans-Regular.ttf";
        }
 
@@ -1079,7 +1085,7 @@ error_details(boost::system::error_code ec)
 bool
 contains_assetmap(boost::filesystem::path dir)
 {
-       return boost::filesystem::is_regular_file(dir / "ASSETMAP") || boost::filesystem::is_regular_file(dir / "ASSETMAP.xml");
+       return dcp::filesystem::is_regular_file(dir / "ASSETMAP") || dcp::filesystem::is_regular_file(dir / "ASSETMAP.xml");
 }