*/
+#define UNICODE 1
+
#include "cross.h"
#include "compose.hpp"
#include "log.h"
#include <fileapi.h>
#undef DATADIR
#include <shlwapi.h>
+#include <shlobj.h>
#include <shellapi.h>
+#include <knownfolders.h>
#include <fcntl.h>
#include <fstream>
#include <map>
boost::filesystem::path
-xsd_path ()
-{
- return directory_containing_executable().parent_path() / "xsd";
-}
-
-
-boost::filesystem::path
-tags_path ()
+libdcp_resources_path ()
{
- return directory_containing_executable().parent_path() / "tags";
+ return resources_path ();
}
fix_long_path (boost::filesystem::path long_path)
{
using namespace boost::filesystem;
- path fixed = "\\\\?\\";
+
+ if (boost::algorithm::starts_with(long_path.string(), "\\\\")) {
+ /* This could mean it starts with \\ (i.e. a SMB path) or \\?\ (a long path)
+ * or a variety of other things... anyway, we'll leave it alone.
+ */
+ return long_path;
+ }
+
/* We have to make the path canonical but we can't call canonical() on the long path
* as it will fail. So we'll sort of do it ourselves (possibly badly).
*/
+ path fixed = "\\\\?\\";
if (long_path.is_absolute()) {
fixed += long_path.make_preferred();
} else {
wchar_to_utf8 (wchar_t const * s)
{
int const length = (wcslen(s) + 1) * 2;
- char* utf8 = new char[length];
- WideCharToMultiByte (CP_UTF8, 0, s, -1, utf8, length, 0, 0);
- string u (utf8);
- delete[] utf8;
+ std::vector<char> utf8(length);
+ WideCharToMultiByte (CP_UTF8, 0, s, -1, utf8.data(), length, 0, 0);
+ string u (utf8.data());
return u;
}
boost::filesystem::path
home_directory ()
{
- return boost::filesystem::path(getenv("HOMEDRIVE")) / boost::filesystem::path(getenv("HOMEPATH"));
+ PWSTR wide_path;
+ auto result = SHGetKnownFolderPath(FOLDERID_Documents, 0, nullptr, &wide_path);
+
+ if (result != S_OK) {
+ CoTaskMemFree(wide_path);
+ return boost::filesystem::path("c:\\");
+ }
+
+ auto path = wchar_to_utf8(wide_path);
+ CoTaskMemFree(wide_path);
+ return path;
}
DCPOMATIC_ASSERT (_mount_points.size() == 1);
string const device_name = String::compose ("\\\\.\\%1", _mount_points.front());
string const truncated = device_name.substr (0, device_name.length() - 1);
- //LOG_DISK("Actually opening %1", _device);
- //HANDLE device = CreateFileA (_device.c_str(), (GENERIC_READ | GENERIC_WRITE), FILE_SHARE_READ | FILE_SHARE_WRITE, 0, OPEN_EXISTING, 0, 0);
LOG_DISK("Actually opening %1", truncated);
HANDLE device = CreateFileA (truncated.c_str(), (GENERIC_READ | GENERIC_WRITE), FILE_SHARE_READ | FILE_SHARE_WRITE, 0, OPEN_EXISTING, 0, 0);
if (device == INVALID_HANDLE_VALUE) {
boost::filesystem::path
-config_path ()
+config_path (optional<string> version)
{
boost::filesystem::path p;
p /= g_get_user_config_dir ();
p /= "dcpomatic2";
+ if (version) {
+ p /= *version;
+ }
return p;
}
return dcp::raw_convert<string>(GetCurrentProcessId());
}
+
+bool
+show_in_file_manager (boost::filesystem::path, boost::filesystem::path select)
+{
+ std::wstringstream args;
+ args << "/select," << select;
+ auto const r = ShellExecute (0, L"open", L"explorer.exe", args.str().c_str(), 0, SW_SHOWDEFAULT);
+ return (reinterpret_cast<int64_t>(r) <= 32);
+}
+