ejecting sd card/flash drives with boost::process::child on mac/linux
This commit is contained in:
parent
0836df93e1
commit
e6035542fa
@ -21,6 +21,7 @@
|
|||||||
#include <pwd.h>
|
#include <pwd.h>
|
||||||
#include <boost/filesystem.hpp>
|
#include <boost/filesystem.hpp>
|
||||||
#include <boost/filesystem/convenience.hpp>
|
#include <boost/filesystem/convenience.hpp>
|
||||||
|
#include <boost/process.hpp>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
namespace Slic3r {
|
namespace Slic3r {
|
||||||
@ -329,29 +330,40 @@ void RemovableDriveManager::eject_drive()
|
|||||||
auto it_drive_data = this->find_last_save_path_drive_data();
|
auto it_drive_data = this->find_last_save_path_drive_data();
|
||||||
if (it_drive_data != m_current_drives.end()) {
|
if (it_drive_data != m_current_drives.end()) {
|
||||||
std::string correct_path(m_last_save_path);
|
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]==' ') {
|
if (correct_path[i]==' ') {
|
||||||
correct_path = correct_path.insert(i,1,'\\');
|
correct_path = correct_path.insert(i,1,'\\');
|
||||||
++ i;
|
++ i;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
//std::cout<<"Ejecting "<<(*it).name<<" from "<< correct_path<<"\n";
|
//std::cout<<"Ejecting "<<(*it).name<<" from "<< correct_path<<"\n";
|
||||||
// there is no usable command in c++ so terminal command is used instead
|
// there is no usable command in c++ so terminal command is used instead
|
||||||
// but neither triggers "succesful safe removal messege"
|
// but neither triggers "succesful safe removal messege"
|
||||||
std::string command =
|
BOOST_LOG_TRIVIAL(info) << "Ejecting started";
|
||||||
|
boost::process::ipstream istd_err;
|
||||||
|
boost::process::child child(
|
||||||
#if __APPLE__
|
#if __APPLE__
|
||||||
"diskutil unmount ";
|
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.
|
//Another option how to eject at mac. Currently not working.
|
||||||
//used insted of system() command;
|
//used insted of system() command;
|
||||||
//this->eject_device(correct_path);
|
//this->eject_device(correct_path);
|
||||||
#else
|
#else
|
||||||
"umount ";
|
boost::process::search_path("umount"), correct_path.c_str(), (boost::process::std_out & boost::process::std_err) > istd_err);
|
||||||
#endif
|
#endif
|
||||||
command += correct_path;
|
std::string line;
|
||||||
int err = system(command.c_str());
|
while (child.running() && std::getline(istd_err, line)) {
|
||||||
if (err) {
|
BOOST_LOG_TRIVIAL(trace) << line;
|
||||||
BOOST_LOG_TRIVIAL(error) << "Ejecting " << m_last_save_path << " failed";
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
// 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);
|
assert(m_callback_evt_handler);
|
||||||
if (m_callback_evt_handler)
|
if (m_callback_evt_handler)
|
||||||
|
Loading…
Reference in New Issue
Block a user