X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Flib%2Fcross.cc;h=6398e36764be282f60b355fa06613f79c810f7bc;hb=9af73fe2b9ea2ef82d641d44a995c110f8e61693;hp=786f4b99767e1a8db5b4b1fc1f01695da547a919;hpb=6d8bcba724be622739a749064466901486304cee;p=dcpomatic.git diff --git a/src/lib/cross.cc b/src/lib/cross.cc index 786f4b997..6398e3676 100644 --- a/src/lib/cross.cc +++ b/src/lib/cross.cc @@ -1,5 +1,5 @@ /* - Copyright (C) 2012 Carl Hetherington + Copyright (C) 2012-2015 Carl Hetherington This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -17,11 +17,11 @@ */ -#include -#include #include "cross.h" #include "compose.hpp" #include "log.h" +#include "exceptions.h" +#include #ifdef DCPOMATIC_LINUX #include #include @@ -42,7 +42,13 @@ #include #include #endif -#include "exceptions.h" +#include + +#include "i18n.h" + +#define LOG_GENERAL(...) log->log (String::compose (__VA_ARGS__), LogEntry::TYPE_GENERAL); +#define LOG_ERROR(...) log->log (String::compose (__VA_ARGS__), LogEntry::TYPE_ERROR); +#define LOG_ERROR_NC(...) log->log (__VA_ARGS__, LogEntry::TYPE_ERROR); using std::pair; using std::list; @@ -50,6 +56,7 @@ using std::ifstream; using std::string; using std::wstring; using std::make_pair; +using std::runtime_error; using boost::shared_ptr; /** @param s Number of seconds to sleep for */ @@ -69,7 +76,7 @@ string cpu_info () { string info; - + #ifdef DCPOMATIC_LINUX /* This use of ifstream is ok; the filename can never be non-Latin @@ -93,7 +100,7 @@ cpu_info () if (sysctlbyname ("machdep.cpu.brand_string", buffer, &N, 0, 0) == 0) { info = buffer; } -#endif +#endif #ifdef DCPOMATIC_WINDOWS HKEY key; @@ -118,11 +125,11 @@ cpu_info () } info = string (value.begin(), value.end()); - + RegCloseKey (key); -#endif - +#endif + return info; } @@ -134,9 +141,9 @@ app_contents () uint32_t size = 1024; char buffer[size]; if (_NSGetExecutablePath (buffer, &size)) { - throw StringError ("_NSGetExecutablePath failed"); + throw runtime_error ("_NSGetExecutablePath failed"); } - + boost::filesystem::path path (buffer); path = boost::filesystem::canonical (path); path = path.parent_path (); @@ -145,6 +152,28 @@ app_contents () } #endif +boost::filesystem::path +shared_path () +{ +#ifdef DCPOMATIC_LINUX + char const * p = getenv ("DCPOMATIC_LINUX_SHARE_PREFIX"); + if (p) { + return p; + } + return boost::filesystem::canonical (LINUX_SHARE_PREFIX); +#endif +#ifdef DCPOMATIC_WINDOWS + wchar_t dir[512]; + GetModuleFileName (GetModuleHandle (0), dir, sizeof (dir)); + PathRemoveFileSpec (dir); + boost::filesystem::path path = dir; + return path.parent_path(); +#endif +#ifdef DCPOMATIC_OSX + return app_contents() / "Resources"; +#endif +} + void run_ffprobe (boost::filesystem::path content, boost::filesystem::path out, shared_ptr log) { @@ -157,7 +186,7 @@ run_ffprobe (boost::filesystem::path content, boost::filesystem::path out, share HANDLE child_stderr_read; HANDLE child_stderr_write; if (!CreatePipe (&child_stderr_read, &child_stderr_write, &security, 0)) { - log->log ("ffprobe call failed (could not CreatePipe)"); + LOG_ERROR_NC ("ffprobe call failed (could not CreatePipe)"); return; } @@ -184,19 +213,19 @@ run_ffprobe (boost::filesystem::path content, boost::filesystem::path out, share PROCESS_INFORMATION process_info; ZeroMemory (&process_info, sizeof (process_info)); if (!CreateProcess (0, command, 0, 0, TRUE, CREATE_NO_WINDOW, 0, 0, &startup_info, &process_info)) { - log->log ("ffprobe call failed (could not CreateProcess)"); + LOG_ERROR_NC (N_("ffprobe call failed (could not CreateProcess)")); return; } FILE* o = fopen_boost (out, "w"); if (!o) { - log->log ("ffprobe call failed (could not create output file)"); + LOG_ERROR_NC (N_("ffprobe call failed (could not create output file)")); return; } CloseHandle (child_stderr_write); - while (1) { + while (true) { char buffer[512]; DWORD read; if (!ReadFile(child_stderr_read, buffer, sizeof(buffer), &read, 0) || read == 0) { @@ -213,9 +242,9 @@ run_ffprobe (boost::filesystem::path content, boost::filesystem::path out, share CloseHandle (child_stderr_read); #endif -#ifdef DCPOMATIC_LINUX +#ifdef DCPOMATIC_LINUX string ffprobe = "ffprobe \"" + content.string() + "\" 2> \"" + out.string() + "\""; - log->log (String::compose ("Probing with %1", ffprobe)); + LOG_GENERAL (N_("Probing with %1"), ffprobe); system (ffprobe.c_str ()); #endif @@ -223,9 +252,9 @@ run_ffprobe (boost::filesystem::path content, boost::filesystem::path out, share boost::filesystem::path path = app_contents(); path /= "MacOS"; path /= "ffprobe"; - - string ffprobe = path.string() + " \"" + content.string() + "\" 2> \"" + out.string() + "\""; - log->log (String::compose ("Probing with %1", ffprobe)); + + string ffprobe = "\"" + path.string() + "\" \"" + content.string() + "\" 2> \"" + out.string() + "\""; + LOG_GENERAL (N_("Probing with %1"), ffprobe); system (ffprobe.c_str ()); #endif } @@ -234,14 +263,14 @@ list > mount_info () { list > m; - + #ifdef DCPOMATIC_LINUX FILE* f = setmntent ("/etc/mtab", "r"); if (!f) { return m; } - - while (1) { + + while (true) { struct mntent* mnt = getmntent (f); if (!mnt) { break; @@ -263,11 +292,11 @@ openssl_path () wchar_t dir[512]; GetModuleFileName (GetModuleHandle (0), dir, sizeof (dir)); PathRemoveFileSpec (dir); - + boost::filesystem::path path = dir; path /= "openssl.exe"; return path; -#else +#else /* We assume that it's on the path for Linux and OS X */ return "openssl"; #endif @@ -295,29 +324,58 @@ dcpomatic_fseek (FILE* stream, int64_t offset, int whence) { #ifdef DCPOMATIC_WINDOWS return _fseeki64 (stream, offset, whence); -#else +#else return fseek (stream, offset, whence); -#endif +#endif } void Waker::nudge () { #ifdef DCPOMATIC_WINDOWS - SetThreadExecutionState (ES_CONTINUOUS); -#endif + SetThreadExecutionState (ES_SYSTEM_REQUIRED); +#endif } Waker::Waker () { -#ifdef DCPOMATIC_OSX - IOPMAssertionCreateWithName (kIOPMAssertionTypeNoIdleSleep, kIOPMAssertionLevelOn, CFSTR ("Encoding DCP"), &_assertion_id); -#endif +#ifdef DCPOMATIC_OSX + /* We should use this */ + // IOPMAssertionCreateWithName (kIOPMAssertionTypeNoIdleSleep, kIOPMAssertionLevelOn, CFSTR ("Encoding DCP"), &_assertion_id); + /* but it's not available on 10.5, so we use this */ + IOPMAssertionCreate (kIOPMAssertionTypeNoIdleSleep, kIOPMAssertionLevelOn, &_assertion_id); +#endif } Waker::~Waker () { -#ifdef DCPOMATIC_OSX +#ifdef DCPOMATIC_OSX IOPMAssertionRelease (_assertion_id); -#endif +#endif +} + +void +start_batch_converter (boost::filesystem::path dcpomatic) +{ +#if defined(DCPOMATIC_LINUX) || defined(DCPOMATIC_WINDOWS) + boost::filesystem::path batch = dcpomatic.parent_path() / "dcpomatic2_batch"; +#endif + +#ifdef DCPOMATIC_OSX + boost::filesystem::patch batch = dcpomatic.parent_path (); + batch = batch.parent_path (); // MacOS + batch = batch.parent_path (); // Contents + batch = batch.parent_path (); // DCP-o-matic.app + batch = batch.parent_path (); // Applications + batch /= "DCP-o-matic 2 Batch Converter.app" / "Contents" / "MacOS" / "dcpomatic2_batch"; +#endif + +#ifdef DCPOMATIC_LINUX + pid_t pid = fork (); + if (pid == 0) { + int const r = system (batch.string().c_str ()); + exit (WEXITSTATUS (r)); + } +#endif + }