summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarl Hetherington <cth@carlh.net>2022-01-18 00:08:44 +0100
committerCarl Hetherington <cth@carlh.net>2022-01-19 20:39:25 +0100
commit59bb9538218eee564ab3c07f923628e0a47bf207 (patch)
tree3c5fcf84532e850b4698a843dee96fe54668edbd
parenta3c73134fad8a4261c7cd655ae7531b347a78ac7 (diff)
Extract osx_disks_to_drives to cross_common for tests.
-rw-r--r--src/lib/cross.h15
-rw-r--r--src/lib/cross_common.cc51
-rw-r--r--src/lib/cross_osx.cc62
3 files changed, 70 insertions, 58 deletions
diff --git a/src/lib/cross.h b/src/lib/cross.h
index 1906acef7..ac1f028f4 100644
--- a/src/lib/cross.h
+++ b/src/lib/cross.h
@@ -147,7 +147,22 @@ struct OSXMediaPath
};
+
+struct OSXDisk
+{
+ std::string mount_point;
+ boost::optional<std::string> vendor;
+ boost::optional<std::string> model;
+ bool real;
+ std::string prt;
+ bool whole;
+ std::vector<boost::filesystem::path> mount_points;
+ unsigned long size;
+};
+
+
boost::optional<OSXMediaPath> analyse_osx_media_path (std::string path);
+std::vector<Drive> osx_disks_to_drives (std::vector<OSXDisk> disks);
#endif
diff --git a/src/lib/cross_common.cc b/src/lib/cross_common.cc
index 17546f712..250db3cd5 100644
--- a/src/lib/cross_common.cc
+++ b/src/lib/cross_common.cc
@@ -33,6 +33,7 @@ DCPOMATIC_ENABLE_WARNINGS
#include "i18n.h"
+using std::map;
using std::string;
using std::vector;
using boost::optional;
@@ -152,3 +153,53 @@ analyse_osx_media_path (string path)
}
+/* This is in _common so we can use it in unit tests */
+vector<Drive>
+osx_disks_to_drives (vector<OSXDisk> disks)
+{
+ using namespace boost::algorithm;
+
+ /* 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 const& 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 const& 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;
+}
diff --git a/src/lib/cross_osx.cc b/src/lib/cross_osx.cc
index 03438a220..018516abb 100644
--- a/src/lib/cross_osx.cc
+++ b/src/lib/cross_osx.cc
@@ -387,19 +387,6 @@ mount_point (CFDictionaryRef& description)
* 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)
{
@@ -410,7 +397,7 @@ 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);
@@ -452,7 +439,7 @@ disk_appeared (DADiskRef disk, void* context)
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);
}
@@ -460,7 +447,7 @@ vector<Drive>
Drive::get ()
{
using namespace boost::algorithm;
- vector<Disk> disks;
+ vector<OSXDisk> disks;
auto session = DASessionCreate(kCFAllocatorDefault);
if (!session) {
@@ -475,48 +462,7 @@ Drive::get ()
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);
}