summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarl Hetherington <cth@carlh.net>2022-01-17 22:56:52 +0100
committerCarl Hetherington <cth@carlh.net>2022-01-18 22:50:10 +0100
commit559b286f5f956d0955beac445952b39f739d05d9 (patch)
tree8922a122e81af2bcd8941b87da13fbae6aa4cdfc
parent4db2cb288af3baa40a93e2cd85416f133885ce56 (diff)
Extract part of analyse_media_path to cross_common for tests.
-rw-r--r--src/lib/cross.h11
-rw-r--r--src/lib/cross_common.cc39
-rw-r--r--src/lib/cross_osx.cc37
3 files changed, 53 insertions, 34 deletions
diff --git a/src/lib/cross.h b/src/lib/cross.h
index 1f06822b0..a3d7e13f4 100644
--- a/src/lib/cross.h
+++ b/src/lib/cross.h
@@ -139,4 +139,15 @@ private:
void disk_write_finished ();
+
+struct OSXMediaPath
+{
+ bool real; ///< true for a "real" disk, false for a synthesized APFS one
+ std::string prt; ///< "PRT" entry from the media path
+};
+
+
+boost::optional<OSXMediaPath> analyse_osx_media_path (std::string path);
+
+
#endif
diff --git a/src/lib/cross_common.cc b/src/lib/cross_common.cc
index 2e48bf3e0..17546f712 100644
--- a/src/lib/cross_common.cc
+++ b/src/lib/cross_common.cc
@@ -27,12 +27,15 @@
DCPOMATIC_DISABLE_WARNINGS
#include <libxml++/libxml++.h>
DCPOMATIC_ENABLE_WARNINGS
+#include <boost/algorithm/string.hpp>
#include <iostream>
#include "i18n.h"
using std::string;
+using std::vector;
+using boost::optional;
Drive::Drive (string xml)
@@ -113,3 +116,39 @@ Drive::log_summary () const
_device, mp, _size, _vendor.get_value_or("[none]"), _model.get_value_or("[none]")
);
}
+
+
+
+/* This is in _common so we can use it in unit tests */
+optional<OSXMediaPath>
+analyse_osx_media_path (string path)
+{
+ using namespace boost::algorithm;
+
+ 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 {};
+ }
+
+ OSXMediaPath 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;
+}
+
+
diff --git a/src/lib/cross_osx.cc b/src/lib/cross_osx.cc
index d9355e161..03438a220 100644
--- a/src/lib/cross_osx.cc
+++ b/src/lib/cross_osx.cc
@@ -309,14 +309,7 @@ get_model (CFDictionaryRef& description)
}
-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;
@@ -335,31 +328,7 @@ analyse_media_path (CFDictionaryRef& description)
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);
}
@@ -467,7 +436,7 @@ disk_appeared (DADiskRef disk, void* context)
}
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",