Extract part of analyse_media_path to cross_common for tests.
authorCarl Hetherington <cth@carlh.net>
Mon, 17 Jan 2022 21:56:52 +0000 (22:56 +0100)
committerCarl Hetherington <cth@carlh.net>
Tue, 18 Jan 2022 21:50:10 +0000 (22:50 +0100)
src/lib/cross.h
src/lib/cross_common.cc
src/lib/cross_osx.cc

index 1f06822b01dad60a8ca223e330373b271aa73a0a..a3d7e13f4e5210e0307f3c78cf2ca2469a12e315 100644 (file)
@@ -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
index 2e48bf3e015131fab22094fea7a46b80f028325f..17546f712b97df87dd08f4474edb1980a35a1c3b 100644 (file)
 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;
+}
+
+
index d9355e161b8de21d646628b10eafa5ea9c967397..03438a220926c9d7d0540a327a914defbf86bf8b 100644 (file)
@@ -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",