boost::filesystem::path
directory_containing_executable ()
{
- return boost::dll::program_location().parent_path();
+ return boost::filesystem::canonical(boost::dll::program_location()).parent_path();
}
}
-struct MediaPath
-{
- bool real; ///< true for a "real" disk, false for a synthesized APFS one
- std::string prt; ///< "PRT" entry from the media path
-};
-
-
-static optional<MediaPath>
+static optional<OSXMediaPath>
analyse_media_path (CFDictionaryRef& description)
{
using namespace boost::algorithm;
string path(path_key_cstr);
LOG_DISK("MediaPathKey is %1", path);
-
- if (path.find("/IOHDIXController") != string::npos) {
- /* This is a disk image, so we completely ignore it */
- LOG_DISK_NC("Ignoring this as it seems to be a disk image");
- return {};
- }
-
- MediaPath mp;
- if (starts_with(path, "IODeviceTree:")) {
- mp.real = true;
- } else if (starts_with(path, "IOService:")) {
- mp.real = false;
- } else {
- return {};
- }
-
- vector<string> bits;
- split(bits, path, boost::is_any_of("/"));
- for (auto i: bits) {
- if (starts_with(i, "PRT")) {
- mp.prt = i;
- }
- }
-
- return mp;
+ return analyse_osx_media_path (path);
}
* unearth is, to put it impolitely, crap.
*/
-struct Disk
-{
- string mount_point;
- optional<string> vendor;
- optional<string> model;
- bool real;
- string prt;
- bool whole;
- vector<boost::filesystem::path> mount_points;
- unsigned long size;
-};
-
-
static void
disk_appeared (DADiskRef disk, void* context)
{
}
LOG_DISK("%1 appeared", bsd_name);
- Disk this_disk;
+ OSXDisk this_disk;
this_disk.mount_point = string("/dev/") + bsd_name;
LOG_DISK("Mount point is %1", this_disk.mount_point);
}
LOG_DISK(
- "%1 prt %2 whole %3 mounted %4",
+ "%1 prt=%2 %3 %4",
this_disk.real ? "Real" : "Synth",
this_disk.prt,
this_disk.whole ? "whole" : "part",
CFNumberGetValue ((CFNumberRef) media_size_cstr, kCFNumberLongType, &this_disk.size);
CFRelease (description);
- reinterpret_cast<vector<Disk>*>(context)->push_back(this_disk);
+ reinterpret_cast<vector<OSXDisk>*>(context)->push_back(this_disk);
}
Drive::get ()
{
using namespace boost::algorithm;
- vector<Disk> disks;
+ vector<OSXDisk> disks;
auto session = DASessionCreate(kCFAllocatorDefault);
if (!session) {
DAUnregisterCallback(session, (void *) disk_appeared, &disks);
CFRelease(session);
- /* Mark disks containing mounted partitions as themselves mounted */
- for (auto& i: disks) {
- if (!i.whole) {
- continue;
- }
- for (auto& j: disks) {
- if (!j.mount_points.empty() && starts_with(j.mount_point, i.mount_point)) {
- LOG_DISK("Marking %1 as mounted because %2 is", i.mount_point, j.mount_point);
- std::copy(j.mount_points.begin(), j.mount_points.end(), back_inserter(i.mount_points));
- }
- }
- }
-
- /* Make a map of the PRT codes and mount points of mounted, synthesized disks */
- map<string, vector<boost::filesystem::path>> mounted_synths;
- for (auto& i: disks) {
- if (!i.real && !i.mount_points.empty()) {
- LOG_DISK("Found a mounted synth %1 with %2", i.mount_point, i.prt);
- mounted_synths[i.prt] = i.mount_points;
- }
- }
-
- /* Mark containers of those mounted synths as themselves mounted */
- for (auto& i: disks) {
- if (i.real) {
- auto j = mounted_synths.find(i.prt);
- if (j != mounted_synths.end()) {
- LOG_DISK("Marking %1 (%2) as mounted because it contains a mounted synth", i.mount_point, i.prt);
- std::copy(j->second.begin(), j->second.end(), back_inserter(i.mount_points));
- }
- }
- }
-
- vector<Drive> drives;
- for (auto& i: disks) {
- if (i.whole) {
- /* A whole disk that is not a container for a mounted synth */
- drives.push_back(Drive(i.mount_point, i.mount_points, i.size, i.vendor, i.model));
- LOG_DISK_NC(drives.back().log_summary());
- }
- }
- return drives;
+ return osx_disks_to_drives (disks);
}
boost::filesystem::path
-config_path ()
+config_path (optional<string> version)
{
boost::filesystem::path p;
p /= g_get_home_dir ();
p /= "Preferences";
p /= "com.dcpomatic";
p /= "2";
+ if (version) {
+ p /= *version;
+ }
return p;
}
{
return path;
}
+
+
+bool
+show_in_file_manager (boost::filesystem::path, boost::filesystem::path select)
+{
+ int r = system (String::compose("open -R \"%1\"", select.string()).c_str());
+ return static_cast<bool>(WEXITSTATUS(r));
+}
+