diff options
| author | Carl Hetherington <cth@carlh.net> | 2013-11-29 21:38:08 +0000 |
|---|---|---|
| committer | Carl Hetherington <cth@carlh.net> | 2013-11-29 21:38:08 +0000 |
| commit | bdbb254c18b100f8fa66a3707f6b515309d05685 (patch) | |
| tree | 44606dda0a79df54f758c278c70df06733b28378 /src/lib/util.cc | |
| parent | 95f29bc89f860342c100d7609ce5e2e4a138aa8a (diff) | |
| parent | 747fc9e02cb66fb965e23a4cc0464cf7e8bd743d (diff) | |
Merge master.
Diffstat (limited to 'src/lib/util.cc')
| -rw-r--r-- | src/lib/util.cc | 47 |
1 files changed, 33 insertions, 14 deletions
diff --git a/src/lib/util.cc b/src/lib/util.cc index 98dec58d7..ddc0a2974 100644 --- a/src/lib/util.cc +++ b/src/lib/util.cc @@ -39,6 +39,9 @@ #include <boost/lexical_cast.hpp> #include <boost/thread.hpp> #include <boost/filesystem.hpp> +#ifdef DCPOMATIC_WINDOWS +#include <boost/locale.hpp> +#endif #include <glib.h> #include <openjpeg.h> #include <openssl/md5.h> @@ -80,7 +83,6 @@ using std::endl; using std::vector; using std::hex; using std::setw; -using std::ifstream; using std::ios; using std::min; using std::max; @@ -89,7 +91,6 @@ using std::multimap; using std::istream; using std::numeric_limits; using std::pair; -using std::ofstream; using std::cout; using std::streampos; using boost::shared_ptr; @@ -261,8 +262,11 @@ seconds (struct timeval t) LONG WINAPI exception_handler(struct _EXCEPTION_POINTERS *) { dbg::stack s; - ofstream f (backtrace_file.string().c_str()); - std::copy(s.begin(), s.end(), std::ostream_iterator<dbg::stack_frame>(f, "\n")); + FILE* f = fopen_boost (backtrace_file, "w"); + for (dbg::stack::const_iterator i = s.begin(); i != s.end(); ++i) { + fprintf (f, "%p %s %d %s", i->instruction, i->function.c_str(), i->line, i->module.c_str()); + } + fclose (f); return EXCEPTION_CONTINUE_SEARCH; } #endif @@ -277,6 +281,21 @@ dcpomatic_setup () backtrace_file /= g_get_user_config_dir (); backtrace_file /= "backtrace.txt"; SetUnhandledExceptionFilter(exception_handler); + + /* Dark voodoo which, I think, gets boost::filesystem::path to + correctly convert UTF-8 strings to paths, and also paths + back to UTF-8 strings (on path::string()). + + After this, constructing boost::filesystem::paths from strings + converts from UTF-8 to UTF-16 inside the path. Then + path::string().c_str() gives UTF-8 and + path::c_str() gives UTF-16. + + This is all Windows-only. AFAICT Linux/OS X use UTF-8 everywhere, + so things are much simpler. + */ + std::locale::global (boost::locale::generator().generate ("")); + boost::filesystem::path::imbue (std::locale ()); #endif avfilter_register_all (); @@ -391,7 +410,7 @@ md5_digest (void const * data, int size) string md5_digest (vector<boost::filesystem::path> files, shared_ptr<Job> job) { - int const buffer_size = 64 * 1024; + boost::uintmax_t const buffer_size = 64 * 1024; char buffer[buffer_size]; MD5_CTX md5_context; @@ -403,19 +422,17 @@ md5_digest (vector<boost::filesystem::path> files, shared_ptr<Job> job) } for (size_t i = 0; i < files.size(); ++i) { - ifstream f (files[i].string().c_str(), std::ios::binary); - if (!f.good ()) { + FILE* f = fopen_boost (files[i], "rb"); + if (!f) { throw OpenFileError (files[i].string()); } - - f.seekg (0, std::ios::end); - streampos const bytes = f.tellg (); - f.seekg (0, std::ios::beg); - streampos remaining = bytes; + boost::uintmax_t const bytes = boost::filesystem::file_size (files[i]); + boost::uintmax_t remaining = bytes; + while (remaining > 0) { - int const t = min (remaining, streampos (buffer_size)); - f.read (buffer, t); + int const t = min (remaining, buffer_size); + fread (buffer, 1, t, f); MD5_Update (&md5_context, buffer, t); remaining -= t; @@ -423,6 +440,8 @@ md5_digest (vector<boost::filesystem::path> files, shared_ptr<Job> job) job->set_progress ((float (i) + 1 - float(remaining) / bytes) / files.size ()); } } + + fclose (f); } unsigned char digest[MD5_DIGEST_LENGTH]; |
