mirror of
				https://github.com/SoftFever/OrcaSlicer.git
				synced 2025-10-31 04:31:15 -06:00 
			
		
		
		
	Merge branch 'dk_remote_devices'
This commit is contained in:
		
						commit
						7b6c920a3d
					
				
					 2 changed files with 50 additions and 15 deletions
				
			
		|  | @ -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)  | ||||
|  |  | |||
|  | @ -4,10 +4,22 @@ | |||
| #import <AppKit/AppKit.h>  | ||||
| #import <DiskArbitration/DiskArbitration.h> | ||||
| 
 | ||||
| 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 | ||||
| { | ||||
| 	self = [super 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) | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 David Kocik
						David Kocik