diff options
author | Enrico Turri <enricoturri@seznam.cz> | 2020-03-10 14:03:26 +0300 |
---|---|---|
committer | Enrico Turri <enricoturri@seznam.cz> | 2020-03-10 14:03:26 +0300 |
commit | 33470f7f6d67306de247717a926bc4eef9cece78 (patch) | |
tree | 68c2a087daf9d9e41178bb64da655b7fcab20939 /src/slic3r/GUI | |
parent | 4ca03c3f8a7d0013c65197c5b93b81c95c9d72f6 (diff) | |
parent | 7b6c920a3d5e298d20b5873feb69ff5327eba700 (diff) |
Merge branch 'master' of https://github.com/prusa3d/PrusaSlicer
Diffstat (limited to 'src/slic3r/GUI')
-rw-r--r-- | src/slic3r/GUI/RemovableDriveManager.cpp | 36 | ||||
-rw-r--r-- | src/slic3r/GUI/RemovableDriveManagerMM.mm | 27 |
2 files changed, 49 insertions, 14 deletions
diff --git a/src/slic3r/GUI/RemovableDriveManager.cpp b/src/slic3r/GUI/RemovableDriveManager.cpp index 0c4c417b2..f76625049 100644 --- a/src/slic3r/GUI/RemovableDriveManager.cpp +++ b/src/slic3r/GUI/RemovableDriveManager.cpp @@ -21,6 +21,7 @@ #include <pwd.h> #include <boost/filesystem.hpp> #include <boost/filesystem/convenience.hpp> +#include <boost/process.hpp> #endif namespace Slic3r { @@ -329,27 +330,40 @@ void RemovableDriveManager::eject_drive() auto it_drive_data = this->find_last_save_path_drive_data(); if (it_drive_data != m_current_drives.end()) { std::string correct_path(m_last_save_path); - for (size_t i = 0; i < correct_path.size(); ++i) +#ifndef __APPLE__ + for (size_t i = 0; i < correct_path.size(); ++i) if (correct_path[i]==' ') { correct_path = correct_path.insert(i,1,'\\'); ++ i; } +#endif //std::cout<<"Ejecting "<<(*it).name<<" from "<< correct_path<<"\n"; // there is no usable command in c++ so terminal command is used instead // but neither triggers "succesful safe removal messege" - std::string command = -#if __APPLE__ - //this->eject_device(m_last_save_path); - "diskutil unmount "; + BOOST_LOG_TRIVIAL(info) << "Ejecting started"; + boost::process::ipstream istd_err; + boost::process::child child( +#if __APPLE__ + boost::process::search_path("diskutil"), "eject", correct_path.c_str(), (boost::process::std_out & boost::process::std_err) > istd_err); + //Another option how to eject at mac. Currently not working. + //used insted of system() command; + //this->eject_device(correct_path); #else - "umount "; + boost::process::search_path("umount"), correct_path.c_str(), (boost::process::std_out & boost::process::std_err) > istd_err); #endif - command += correct_path; - int err = system(command.c_str()); - if (err) { - BOOST_LOG_TRIVIAL(error) << "Ejecting " << m_last_save_path << " failed"; - return; + std::string line; + while (child.running() && std::getline(istd_err, line)) { + BOOST_LOG_TRIVIAL(trace) << line; } + // wait for command to finnish (blocks ui thread) + child.wait(); + int err = child.exit_code(); + if(err) + { + BOOST_LOG_TRIVIAL(error) << "Ejecting failed"; + return; + } + BOOST_LOG_TRIVIAL(info) << "Ejecting finished"; assert(m_callback_evt_handler); if (m_callback_evt_handler) diff --git a/src/slic3r/GUI/RemovableDriveManagerMM.mm b/src/slic3r/GUI/RemovableDriveManagerMM.mm index c2f55bb79..3e4b32f29 100644 --- a/src/slic3r/GUI/RemovableDriveManagerMM.mm +++ b/src/slic3r/GUI/RemovableDriveManagerMM.mm @@ -4,9 +4,21 @@ #import <AppKit/AppKit.h> #import <DiskArbitration/DiskArbitration.h> -@implementation RemovableDriveManagerMM +static void eject_callback(DADiskRef disk, DADissenterRef dissenter, void *context) +{ + NSLog(@"eject successfull"); +} +static void unmount_callback(DADiskRef disk, DADissenterRef dissenter, void *context) +{ + //if (dissenter) { + //? + //} else { + DADiskEject(disk, kDADiskEjectOptionDefault, eject_callback, context); + //} +} +@implementation RemovableDriveManagerMM -(instancetype) init { @@ -59,9 +71,17 @@ CFTypeRef mediaEjectableKey = CFDictionaryGetValue(descDict,kDADiskDescriptionMediaEjectableKey); BOOL ejectable = [mediaEjectableKey boolValue]; CFTypeRef deviceProtocolName = CFDictionaryGetValue(descDict,kDADiskDescriptionDeviceProtocolKey); + CFTypeRef deviceModelKey = CFDictionaryGetValue(descDict, kDADiskDescriptionDeviceModelKey); + //debug logging + /* + if (deviceProtocolName) + NSLog(@"%@",(CFStringRef)deviceProtocolName); + if (deviceModelKey) + NSLog(@"-%@",(CFStringRef)deviceModelKey); + */ if (mediaEjectableKey != nullptr) { - BOOL op = ejectable && (CFEqual(deviceProtocolName, CFSTR("USB")) || CFEqual(deviceModelKey, CFSTR("SD Card Reader"))); + BOOL op = ejectable && (CFEqual(deviceProtocolName, CFSTR("USB")) || CFEqual(deviceModelKey, CFSTR("SD Card Reader")) || CFEqual(deviceProtocolName, CFSTR("Secure Digital"))); //!CFEqual(deviceModelKey, CFSTR("Disk Image")); if (op) [result addObject:volURL.path]; @@ -86,7 +106,8 @@ if (err == 0) disk = DADiskCreateFromVolumePath(nullptr,session,(CFURLRef)url); if( err == 0) - DADiskUnmount(disk, kDADiskUnmountOptionDefault, nullptr, nullptr); + //DADiskUnmount(disk, kDADiskUnmountOptionDefault, nullptr, nullptr); + DADiskUnmount(disk, kDADiskUnmountOptionWhole | kDADiskUnmountOptionForce, unmount_callback, nullptr); if (disk != nullptr) CFRelease(disk); if (session != nullptr) |