#include "RemovableDriveManager.hpp" #include #include "boost/nowide/convert.hpp" #if _WIN32 #include #include #include #include DEFINE_GUID(GUID_DEVINTERFACE_USB_DEVICE, 0xA5DCBF10L, 0x6530, 0x11D2, 0x90, 0x1F, 0x00, 0xC0, 0x4F, 0xB9, 0x51, 0xED); #else //linux includes #include #include #include #include #include #include #endif namespace Slic3r { namespace GUI { //std::vector RemovableDriveManager::m_current_drives; //std::vector> RemovableDriveManager::m_callbacks; #if _WIN32 void RemovableDriveManager::search_for_drives() { m_current_drives.clear(); m_current_drives.reserve(26); DWORD drives_mask = GetLogicalDrives(); for (size_t i = 0; i < 26; i++) { if(drives_mask & (1 << i)) { std::string path (1,(char)('A' + i)); path+=":"; UINT drive_type = GetDriveTypeA(path.c_str()); //std::cout << "found drive" << (char)('A' + i) << ": type:" < 0) { path += "\\"; m_current_drives.push_back(DriveData(boost::nowide::narrow(volume_name), path)); } } } } } } //std::cout << "found drives:" << m_current_drives.size() << "\n"; } void RemovableDriveManager::eject_drive(const std::string &path) { //if (!update() || !is_drive_mounted(path)) if(m_current_drives.empty()) return; for (auto it = m_current_drives.begin(); it != m_current_drives.end(); ++it) { if ((*it).path == path) { std::string mpath = "\\\\.\\" + path; mpath = mpath.substr(0, mpath.size() - 1); std::cout << "Ejecting " << mpath << "\n"; HANDLE handle = CreateFileA(mpath.c_str(), GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, nullptr, OPEN_EXISTING, 0, nullptr); if (handle == INVALID_HANDLE_VALUE) { std::cerr << "Ejecting " << mpath << " failed " << GetLastError() << " \n"; return; } DWORD deviceControlRetVal(0); BOOL error = DeviceIoControl(handle, IOCTL_STORAGE_EJECT_MEDIA, nullptr, 0, nullptr, 0, &deviceControlRetVal, nullptr); CloseHandle(handle); if (error == 0) { std::cerr << "Ejecting " << mpath << " failed " << deviceControlRetVal << " " << GetLastError() << " \n"; return; } m_current_drives.erase(it); break; } } } bool RemovableDriveManager::is_path_on_removable_drive(const std::string &path) { if (m_current_drives.empty()) return false; int letter = PathGetDriveNumberA(path.c_str()); for (auto it = m_current_drives.begin(); it != m_current_drives.end(); ++it) { char drive = (*it).path[0]; if (drive == ('A' + letter)) return true; } return false; } void RemovableDriveManager::register_window() { /* WNDCLASSEX wndClass; wndClass.cbSize = sizeof(WNDCLASSEX); wndClass.style = CS_OWNDC | CS_HREDRAW | CS_VREDRAW; wndClass.hInstance = reinterpret_cast(GetModuleHandle(0)); wndClass.lpfnWndProc = reinterpret_cast(WinProcCallback); wndClass.cbClsExtra = 0; wndClass.cbWndExtra = 0; wndClass.hIcon = LoadIcon(0, IDI_APPLICATION); wndClass.hbrBackground = CreateSolidBrush(RGB(192, 192, 192)); wndClass.hCursor = LoadCursor(0, IDC_ARROW); wndClass.lpszClassName = L"SlicerWindowClass"; wndClass.lpszMenuName = NULL; wndClass.hIconSm = wndClass.hIcon; */ } #else void RemovableDriveManager::search_for_drives() { m_current_drives.clear(); m_current_drives.reserve(26); //search /media/* folder search_path("/media/*", "/media"); std::string path(std::getenv("USER")); std::string pp(path); //std::cout << "user: "<< path << "\n"; if(path == "root"){ //if program is run with sudo, we have to search for all users while (true) { passwd* entry = getpwent(); if (!entry) { break; } path = entry->pw_name; pp = path; //search /media/USERNAME/* folder pp = "/media/"+pp; path = "/media/" + path + "/*"; search_path(path, pp); //search /run/media/USERNAME/* folder path = "/run" + path; pp = "/run"+pp; search_path(path, pp); } endpwent(); }else { //search /media/USERNAME/* folder pp = "/media/"+pp; path = "/media/" + path + "/*"; search_path(path, pp); //search /run/media/USERNAME/* folder path = "/run" + path; pp = "/run"+pp; search_path(path, pp); } //std::cout << "found drives:" < RemovableDriveManager::get_all_drives() { return m_current_drives; } void RemovableDriveManager::check_and_notify() { //std::cout<<"drives count: "< callback) { m_callbacks.push_back(callback); } void RemovableDriveManager::print() { std::cout << "notified\n"; } }}//namespace Slicer::Gui::