Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/supermerill/SuperSlicer.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEnrico Turri <enricoturri@seznam.cz>2020-03-10 14:03:26 +0300
committerEnrico Turri <enricoturri@seznam.cz>2020-03-10 14:03:26 +0300
commit33470f7f6d67306de247717a926bc4eef9cece78 (patch)
tree68c2a087daf9d9e41178bb64da655b7fcab20939 /src/slic3r/GUI
parent4ca03c3f8a7d0013c65197c5b93b81c95c9d72f6 (diff)
parent7b6c920a3d5e298d20b5873feb69ff5327eba700 (diff)
Merge branch 'master' of https://github.com/prusa3d/PrusaSlicer
Diffstat (limited to 'src/slic3r/GUI')
-rw-r--r--src/slic3r/GUI/RemovableDriveManager.cpp36
-rw-r--r--src/slic3r/GUI/RemovableDriveManagerMM.mm27
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)