Extract part of analyse_media_path to cross_common for tests.
[dcpomatic.git] / src / lib / cross_common.cc
index edc806b584fed235a947e53a46751725bac7424c..17546f712b97df87dd08f4474edb1980a35a1c3b 100644 (file)
@@ -1,5 +1,5 @@
 /*
-    Copyright (C) 2012-2020 Carl Hetherington <cth@carlh.net>
+    Copyright (C) 2012-2021 Carl Hetherington <cth@carlh.net>
 
     This file is part of DCP-o-matic.
 
 
 */
 
+
 #include "cross.h"
 #include "compose.hpp"
 #include "dcpomatic_log.h"
 #include "warnings.h"
 #include <dcp/raw_convert.h>
-#include <boost/foreach.hpp>
 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)
 {
        cxml::Document doc;
        doc.read_string (xml);
        _device = doc.string_child("Device");
-       BOOST_FOREACH (cxml::ConstNodePtr i, doc.node_children("MountPoint")) {
+       for (auto i: doc.node_children("MountPoint")) {
                _mount_points.push_back (i->content());
        }
        _size = doc.number_child<uint64_t>("Size");
@@ -51,9 +56,9 @@ string
 Drive::as_xml () const
 {
        xmlpp::Document doc;
-       xmlpp::Element* root = doc.create_root_node ("Drive");
+       auto root = doc.create_root_node ("Drive");
        root->add_child("Device")->add_child_text(_device);
-       BOOST_FOREACH (boost::filesystem::path i, _mount_points) {
+       for (auto i: _mount_points) {
                root->add_child("MountPoint")->add_child_text(i.string());
        }
        root->add_child("Size")->add_child_text(dcp::raw_convert<string>(_size));
@@ -92,11 +97,12 @@ Drive::description () const
        return String::compose(_("%1 (%2 GB) [%3]"), name, gb, _device);
 }
 
+
 string
 Drive::log_summary () const
 {
        string mp;
-       BOOST_FOREACH (boost::filesystem::path i, _mount_points) {
+       for (auto i: _mount_points) {
                mp += i.string() + ",";
        }
        if (mp.empty()) {
@@ -110,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;
+}
+
+