From a3c73134fad8a4261c7cd655ae7531b347a78ac7 Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Mon, 17 Jan 2022 22:56:52 +0100 Subject: [PATCH] Extract part of analyse_media_path to cross_common for tests. --- src/lib/cross.h | 11 +++++++++++ src/lib/cross_common.cc | 39 +++++++++++++++++++++++++++++++++++++++ src/lib/cross_osx.cc | 37 +++---------------------------------- 3 files changed, 53 insertions(+), 34 deletions(-) diff --git a/src/lib/cross.h b/src/lib/cross.h index ed1d0c8e7..1906acef7 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 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 DCPOMATIC_ENABLE_WARNINGS +#include #include #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 +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 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 +static optional 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 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", -- 2.30.2