From bbca67df678097e5c127b0300e47ef3f99520318 Mon Sep 17 00:00:00 2001 From: Tobias Taschner Date: Wed, 17 Nov 2021 15:40:40 +0100 Subject: [PATCH] Implement wxFSVolume for macOS Implement with NSFileManager and NSURL to provide basic functionality like on MSW. Icons are not implemented for macOS. --- Makefile.in | 61 ++++++++++---- build/bakefiles/files.bkl | 1 + build/cmake/files.cmake | 1 + build/files | 1 + interface/wx/volume.h | 4 +- src/generic/dirctrlg.cpp | 14 ++-- src/osx/cocoa/dirdlg.mm | 31 ------- src/osx/volume.mm | 157 +++++++++++++++++++++++++++++++++++ tests/interactive/output.cpp | 2 +- 9 files changed, 213 insertions(+), 59 deletions(-) create mode 100644 src/osx/volume.mm diff --git a/Makefile.in b/Makefile.in index 2bffc317e0..e094a30c98 100644 --- a/Makefile.in +++ b/Makefile.in @@ -957,6 +957,7 @@ ALL_BASE_SOURCES = \ src/common/utilscmn.cpp \ src/osx/cocoa/power.mm \ src/osx/cocoa/utils.mm \ + src/osx/volume.mm \ src/msw/main.cpp \ src/msw/volume.cpp \ src/common/fs_inet.cpp \ @@ -4345,9 +4346,10 @@ COND_PLATFORM_WIN32_1___BASE_PLATFORM_SRC_OBJECTS = \ monodll_msw_uilocale.o @COND_PLATFORM_WIN32_1@__BASE_PLATFORM_SRC_OBJECTS = $(COND_PLATFORM_WIN32_1___BASE_PLATFORM_SRC_OBJECTS) @COND_PLATFORM_WIN32_1@__BASE_AND_GUI_PLATFORM_SRC_OBJECTS \ -@COND_PLATFORM_WIN32_1@ = monodll_msw_main.o monodll_volume.o +@COND_PLATFORM_WIN32_1@ = monodll_msw_main.o monodll_msw_volume.o @COND_TOOLKIT_OSX_COCOA@__BASE_AND_GUI_TOOLKIT_SRC_OBJECTS \ -@COND_TOOLKIT_OSX_COCOA@ = monodll_cocoa_power.o monodll_cocoa_utils.o +@COND_TOOLKIT_OSX_COCOA@ = monodll_cocoa_power.o monodll_cocoa_utils.o \ +@COND_TOOLKIT_OSX_COCOA@ monodll_osx_volume.o COND_PLATFORM_MACOSX_1___NET_PLATFORM_SRC_OBJECTS = \ monodll_socketiohandler.o \ monodll_sockunix.o \ @@ -6348,9 +6350,10 @@ COND_PLATFORM_WIN32_1___BASE_PLATFORM_SRC_OBJECTS_1 = \ monolib_msw_uilocale.o @COND_PLATFORM_WIN32_1@__BASE_PLATFORM_SRC_OBJECTS_1 = $(COND_PLATFORM_WIN32_1___BASE_PLATFORM_SRC_OBJECTS_1) @COND_PLATFORM_WIN32_1@__BASE_AND_GUI_PLATFORM_SRC_OBJECTS_1 \ -@COND_PLATFORM_WIN32_1@ = monolib_msw_main.o monolib_volume.o +@COND_PLATFORM_WIN32_1@ = monolib_msw_main.o monolib_msw_volume.o @COND_TOOLKIT_OSX_COCOA@__BASE_AND_GUI_TOOLKIT_SRC_OBJECTS_1 \ -@COND_TOOLKIT_OSX_COCOA@ = monolib_cocoa_power.o monolib_cocoa_utils.o +@COND_TOOLKIT_OSX_COCOA@ = monolib_cocoa_power.o monolib_cocoa_utils.o \ +@COND_TOOLKIT_OSX_COCOA@ monolib_osx_volume.o COND_PLATFORM_MACOSX_1___NET_PLATFORM_SRC_OBJECTS_1 = \ monolib_socketiohandler.o \ monolib_sockunix.o \ @@ -8403,9 +8406,10 @@ COND_PLATFORM_WIN32_1___BASE_PLATFORM_SRC_OBJECTS_2 = \ basedll_msw_uilocale.o @COND_PLATFORM_WIN32_1@__BASE_PLATFORM_SRC_OBJECTS_2 = $(COND_PLATFORM_WIN32_1___BASE_PLATFORM_SRC_OBJECTS_2) @COND_PLATFORM_WIN32_1@__BASE_AND_GUI_PLATFORM_SRC_OBJECTS_2 \ -@COND_PLATFORM_WIN32_1@ = basedll_main.o basedll_volume.o +@COND_PLATFORM_WIN32_1@ = basedll_main.o basedll_msw_volume.o @COND_TOOLKIT_OSX_COCOA@__BASE_AND_GUI_TOOLKIT_SRC_OBJECTS_2 \ -@COND_TOOLKIT_OSX_COCOA@ = basedll_cocoa_power.o basedll_cocoa_utils.o +@COND_TOOLKIT_OSX_COCOA@ = basedll_cocoa_power.o basedll_cocoa_utils.o \ +@COND_TOOLKIT_OSX_COCOA@ basedll_osx_volume.o COND_MONOLITHIC_0_SHARED_0___baselib___depname = \ $(LIBDIRNAME)/$(LIBPREFIX)wx_base$(WXBASEPORT)$(WXUNICODEFLAG)$(WXDEBUGFLAG)$(WX_LIB_FLAVOUR)-$(WX_RELEASE)$(HOST_SUFFIX)$(LIBEXT) @COND_MONOLITHIC_0_SHARED_0@__baselib___depname = $(COND_MONOLITHIC_0_SHARED_0___baselib___depname) @@ -8489,9 +8493,10 @@ COND_PLATFORM_WIN32_1___BASE_PLATFORM_SRC_OBJECTS_3 = \ baselib_msw_uilocale.o @COND_PLATFORM_WIN32_1@__BASE_PLATFORM_SRC_OBJECTS_3 = $(COND_PLATFORM_WIN32_1___BASE_PLATFORM_SRC_OBJECTS_3) @COND_PLATFORM_WIN32_1@__BASE_AND_GUI_PLATFORM_SRC_OBJECTS_3 \ -@COND_PLATFORM_WIN32_1@ = baselib_main.o baselib_volume.o +@COND_PLATFORM_WIN32_1@ = baselib_main.o baselib_msw_volume.o @COND_TOOLKIT_OSX_COCOA@__BASE_AND_GUI_TOOLKIT_SRC_OBJECTS_3 \ -@COND_TOOLKIT_OSX_COCOA@ = baselib_cocoa_power.o baselib_cocoa_utils.o +@COND_TOOLKIT_OSX_COCOA@ = baselib_cocoa_power.o baselib_cocoa_utils.o \ +@COND_TOOLKIT_OSX_COCOA@ baselib_osx_volume.o @COND_SHARED_1@____wxbase_namedll_DEP = $(__basedll___depname) @COND_SHARED_0@____wxbase_namelib_DEP = $(__baselib___depname) COND_MONOLITHIC_0_SHARED_1___netdll___depname = \ @@ -8662,9 +8667,10 @@ COND_USE_SOVERSOLARIS_1___coredll___so_symlinks_uninst_cmd = rm -f \ @COND_USE_SOVERSOLARIS_1@__coredll___so_symlinks_uninst_cmd = $(COND_USE_SOVERSOLARIS_1___coredll___so_symlinks_uninst_cmd) @COND_PLATFORM_WIN32_1@__coredll___win32rc = coredll_version_rc.o @COND_PLATFORM_WIN32_1@__BASE_AND_GUI_PLATFORM_SRC_OBJECTS_4 \ -@COND_PLATFORM_WIN32_1@ = coredll_msw_main.o coredll_volume.o +@COND_PLATFORM_WIN32_1@ = coredll_msw_main.o coredll_msw_volume.o @COND_TOOLKIT_OSX_COCOA@__BASE_AND_GUI_TOOLKIT_SRC_OBJECTS_4 \ -@COND_TOOLKIT_OSX_COCOA@ = coredll_power.o coredll_cocoa_utils.o +@COND_TOOLKIT_OSX_COCOA@ = coredll_power.o coredll_cocoa_utils.o \ +@COND_TOOLKIT_OSX_COCOA@ coredll_osx_volume.o COND_USE_GUI_1_WXUNIV_0___CORE_SRC_OBJECTS_2 = \ $(__LOWLEVEL_SRC_OBJECTS_4) \ $(__PLATFORM_SRC_OBJECTS_8) \ @@ -10393,9 +10399,10 @@ COND_MONOLITHIC_0_SHARED_0_USE_GUI_1___corelib___depname = \ @COND_USE_PCH_1@_____pch_wxprec_corelib_wx_wxprec_h_gch___depname \ @COND_USE_PCH_1@ = ./.pch/wxprec_corelib/wx/wxprec.h.gch @COND_PLATFORM_WIN32_1@__BASE_AND_GUI_PLATFORM_SRC_OBJECTS_5 \ -@COND_PLATFORM_WIN32_1@ = corelib_msw_main.o corelib_volume.o +@COND_PLATFORM_WIN32_1@ = corelib_msw_main.o corelib_msw_volume.o @COND_TOOLKIT_OSX_COCOA@__BASE_AND_GUI_TOOLKIT_SRC_OBJECTS_5 \ -@COND_TOOLKIT_OSX_COCOA@ = corelib_power.o corelib_cocoa_utils.o +@COND_TOOLKIT_OSX_COCOA@ = corelib_power.o corelib_cocoa_utils.o \ +@COND_TOOLKIT_OSX_COCOA@ corelib_osx_volume.o COND_USE_GUI_1_WXUNIV_0___CORE_SRC_OBJECTS_3 = \ $(__LOWLEVEL_SRC_OBJECTS_6) \ $(__PLATFORM_SRC_OBJECTS_9) \ @@ -16178,7 +16185,7 @@ monodll_utilscmn.o: $(srcdir)/src/common/utilscmn.cpp $(MONODLL_ODEP) monodll_msw_main.o: $(srcdir)/src/msw/main.cpp $(MONODLL_ODEP) $(CXXC) -c -o $@ $(MONODLL_CXXFLAGS) $(srcdir)/src/msw/main.cpp -monodll_volume.o: $(srcdir)/src/msw/volume.cpp $(MONODLL_ODEP) +monodll_msw_volume.o: $(srcdir)/src/msw/volume.cpp $(MONODLL_ODEP) $(CXXC) -c -o $@ $(MONODLL_CXXFLAGS) $(srcdir)/src/msw/volume.cpp monodll_cocoa_power.o: $(srcdir)/src/osx/cocoa/power.mm $(MONODLL_ODEP) @@ -16187,6 +16194,9 @@ monodll_cocoa_power.o: $(srcdir)/src/osx/cocoa/power.mm $(MONODLL_ODEP) monodll_cocoa_utils.o: $(srcdir)/src/osx/cocoa/utils.mm $(MONODLL_ODEP) $(CXXC) -c -o $@ $(MONODLL_OBJCXXFLAGS) $(srcdir)/src/osx/cocoa/utils.mm +monodll_osx_volume.o: $(srcdir)/src/osx/volume.mm $(MONODLL_ODEP) + $(CXXC) -c -o $@ $(MONODLL_OBJCXXFLAGS) $(srcdir)/src/osx/volume.mm + monodll_fs_inet.o: $(srcdir)/src/common/fs_inet.cpp $(MONODLL_ODEP) $(CXXC) -c -o $@ $(MONODLL_CXXFLAGS) $(srcdir)/src/common/fs_inet.cpp @@ -21485,7 +21495,7 @@ monolib_utilscmn.o: $(srcdir)/src/common/utilscmn.cpp $(MONOLIB_ODEP) monolib_msw_main.o: $(srcdir)/src/msw/main.cpp $(MONOLIB_ODEP) $(CXXC) -c -o $@ $(MONOLIB_CXXFLAGS) $(srcdir)/src/msw/main.cpp -monolib_volume.o: $(srcdir)/src/msw/volume.cpp $(MONOLIB_ODEP) +monolib_msw_volume.o: $(srcdir)/src/msw/volume.cpp $(MONOLIB_ODEP) $(CXXC) -c -o $@ $(MONOLIB_CXXFLAGS) $(srcdir)/src/msw/volume.cpp monolib_cocoa_power.o: $(srcdir)/src/osx/cocoa/power.mm $(MONOLIB_ODEP) @@ -21494,6 +21504,9 @@ monolib_cocoa_power.o: $(srcdir)/src/osx/cocoa/power.mm $(MONOLIB_ODEP) monolib_cocoa_utils.o: $(srcdir)/src/osx/cocoa/utils.mm $(MONOLIB_ODEP) $(CXXC) -c -o $@ $(MONOLIB_OBJCXXFLAGS) $(srcdir)/src/osx/cocoa/utils.mm +monolib_osx_volume.o: $(srcdir)/src/osx/volume.mm $(MONOLIB_ODEP) + $(CXXC) -c -o $@ $(MONOLIB_OBJCXXFLAGS) $(srcdir)/src/osx/volume.mm + monolib_fs_inet.o: $(srcdir)/src/common/fs_inet.cpp $(MONOLIB_ODEP) $(CXXC) -c -o $@ $(MONOLIB_CXXFLAGS) $(srcdir)/src/common/fs_inet.cpp @@ -26792,7 +26805,7 @@ basedll_utilscmn.o: $(srcdir)/src/common/utilscmn.cpp $(BASEDLL_ODEP) basedll_main.o: $(srcdir)/src/msw/main.cpp $(BASEDLL_ODEP) $(CXXC) -c -o $@ $(BASEDLL_CXXFLAGS) $(srcdir)/src/msw/main.cpp -basedll_volume.o: $(srcdir)/src/msw/volume.cpp $(BASEDLL_ODEP) +basedll_msw_volume.o: $(srcdir)/src/msw/volume.cpp $(BASEDLL_ODEP) $(CXXC) -c -o $@ $(BASEDLL_CXXFLAGS) $(srcdir)/src/msw/volume.cpp basedll_cocoa_power.o: $(srcdir)/src/osx/cocoa/power.mm $(BASEDLL_ODEP) @@ -26801,6 +26814,9 @@ basedll_cocoa_power.o: $(srcdir)/src/osx/cocoa/power.mm $(BASEDLL_ODEP) basedll_cocoa_utils.o: $(srcdir)/src/osx/cocoa/utils.mm $(BASEDLL_ODEP) $(CXXC) -c -o $@ $(BASEDLL_OBJCXXFLAGS) $(srcdir)/src/osx/cocoa/utils.mm +basedll_osx_volume.o: $(srcdir)/src/osx/volume.mm $(BASEDLL_ODEP) + $(CXXC) -c -o $@ $(BASEDLL_OBJCXXFLAGS) $(srcdir)/src/osx/volume.mm + @COND_PLATFORM_UNIX_1@basedll_fdiodispatcher.o: $(srcdir)/src/common/fdiodispatcher.cpp $(BASEDLL_ODEP) @COND_PLATFORM_UNIX_1@ $(CXXC) -c -o $@ $(BASEDLL_CXXFLAGS) $(srcdir)/src/common/fdiodispatcher.cpp @@ -27278,7 +27294,7 @@ baselib_utilscmn.o: $(srcdir)/src/common/utilscmn.cpp $(BASELIB_ODEP) baselib_main.o: $(srcdir)/src/msw/main.cpp $(BASELIB_ODEP) $(CXXC) -c -o $@ $(BASELIB_CXXFLAGS) $(srcdir)/src/msw/main.cpp -baselib_volume.o: $(srcdir)/src/msw/volume.cpp $(BASELIB_ODEP) +baselib_msw_volume.o: $(srcdir)/src/msw/volume.cpp $(BASELIB_ODEP) $(CXXC) -c -o $@ $(BASELIB_CXXFLAGS) $(srcdir)/src/msw/volume.cpp baselib_cocoa_power.o: $(srcdir)/src/osx/cocoa/power.mm $(BASELIB_ODEP) @@ -27287,6 +27303,9 @@ baselib_cocoa_power.o: $(srcdir)/src/osx/cocoa/power.mm $(BASELIB_ODEP) baselib_cocoa_utils.o: $(srcdir)/src/osx/cocoa/utils.mm $(BASELIB_ODEP) $(CXXC) -c -o $@ $(BASELIB_OBJCXXFLAGS) $(srcdir)/src/osx/cocoa/utils.mm +baselib_osx_volume.o: $(srcdir)/src/osx/volume.mm $(BASELIB_ODEP) + $(CXXC) -c -o $@ $(BASELIB_OBJCXXFLAGS) $(srcdir)/src/osx/volume.mm + @COND_PLATFORM_UNIX_1@baselib_fdiodispatcher.o: $(srcdir)/src/common/fdiodispatcher.cpp $(BASELIB_ODEP) @COND_PLATFORM_UNIX_1@ $(CXXC) -c -o $@ $(BASELIB_CXXFLAGS) $(srcdir)/src/common/fdiodispatcher.cpp @@ -27524,7 +27543,7 @@ coredll_utilscmn.o: $(srcdir)/src/common/utilscmn.cpp $(COREDLL_ODEP) coredll_msw_main.o: $(srcdir)/src/msw/main.cpp $(COREDLL_ODEP) $(CXXC) -c -o $@ $(COREDLL_CXXFLAGS) $(srcdir)/src/msw/main.cpp -coredll_volume.o: $(srcdir)/src/msw/volume.cpp $(COREDLL_ODEP) +coredll_msw_volume.o: $(srcdir)/src/msw/volume.cpp $(COREDLL_ODEP) $(CXXC) -c -o $@ $(COREDLL_CXXFLAGS) $(srcdir)/src/msw/volume.cpp coredll_power.o: $(srcdir)/src/osx/cocoa/power.mm $(COREDLL_ODEP) @@ -27533,6 +27552,9 @@ coredll_power.o: $(srcdir)/src/osx/cocoa/power.mm $(COREDLL_ODEP) coredll_cocoa_utils.o: $(srcdir)/src/osx/cocoa/utils.mm $(COREDLL_ODEP) $(CXXC) -c -o $@ $(COREDLL_OBJCXXFLAGS) $(srcdir)/src/osx/cocoa/utils.mm +coredll_osx_volume.o: $(srcdir)/src/osx/volume.mm $(COREDLL_ODEP) + $(CXXC) -c -o $@ $(COREDLL_OBJCXXFLAGS) $(srcdir)/src/osx/volume.mm + coredll_gtk_eggtrayicon.o: $(srcdir)/src/gtk/eggtrayicon.c $(COREDLL_ODEP) $(CCC) -c -o $@ $(COREDLL_CFLAGS) $(srcdir)/src/gtk/eggtrayicon.c @@ -31793,7 +31815,7 @@ corelib_utilscmn.o: $(srcdir)/src/common/utilscmn.cpp $(CORELIB_ODEP) corelib_msw_main.o: $(srcdir)/src/msw/main.cpp $(CORELIB_ODEP) $(CXXC) -c -o $@ $(CORELIB_CXXFLAGS) $(srcdir)/src/msw/main.cpp -corelib_volume.o: $(srcdir)/src/msw/volume.cpp $(CORELIB_ODEP) +corelib_msw_volume.o: $(srcdir)/src/msw/volume.cpp $(CORELIB_ODEP) $(CXXC) -c -o $@ $(CORELIB_CXXFLAGS) $(srcdir)/src/msw/volume.cpp corelib_power.o: $(srcdir)/src/osx/cocoa/power.mm $(CORELIB_ODEP) @@ -31802,6 +31824,9 @@ corelib_power.o: $(srcdir)/src/osx/cocoa/power.mm $(CORELIB_ODEP) corelib_cocoa_utils.o: $(srcdir)/src/osx/cocoa/utils.mm $(CORELIB_ODEP) $(CXXC) -c -o $@ $(CORELIB_OBJCXXFLAGS) $(srcdir)/src/osx/cocoa/utils.mm +corelib_osx_volume.o: $(srcdir)/src/osx/volume.mm $(CORELIB_ODEP) + $(CXXC) -c -o $@ $(CORELIB_OBJCXXFLAGS) $(srcdir)/src/osx/volume.mm + corelib_gtk_eggtrayicon.o: $(srcdir)/src/gtk/eggtrayicon.c $(CORELIB_ODEP) $(CCC) -c -o $@ $(CORELIB_CFLAGS) $(srcdir)/src/gtk/eggtrayicon.c diff --git a/build/bakefiles/files.bkl b/build/bakefiles/files.bkl index 7abc8b4024..bfc3249842 100644 --- a/build/bakefiles/files.bkl +++ b/build/bakefiles/files.bkl @@ -227,6 +227,7 @@ IMPORTANT: please read docs/tech/tn0016.txt before modifying this file! src/osx/cocoa/power.mm src/osx/cocoa/utils.mm + src/osx/volume.mm diff --git a/build/cmake/files.cmake b/build/cmake/files.cmake index c1fdf4f2ee..6d99745f37 100644 --- a/build/cmake/files.cmake +++ b/build/cmake/files.cmake @@ -154,6 +154,7 @@ set(BASE_OSX_SHARED_HDR set(BASE_AND_GUI_OSX_COCOA_SRC src/osx/cocoa/utils.mm src/osx/cocoa/power.mm + src/osx/volume.mm ) set(BASE_OSX_NOTWXMAC_SRC diff --git a/build/files b/build/files index 6e91285cdb..2f76cac6ab 100644 --- a/build/files +++ b/build/files @@ -178,6 +178,7 @@ BASE_OSX_SHARED_HDR = BASE_AND_GUI_OSX_COCOA_SRC = src/osx/cocoa/utils.mm src/osx/cocoa/power.mm + src/osx/volume.mm # files used by non-wxMac OS X builds BASE_OSX_NOTWXMAC_SRC = diff --git a/interface/wx/volume.h b/interface/wx/volume.h index 86394632c2..8a15d89b5b 100644 --- a/interface/wx/volume.h +++ b/interface/wx/volume.h @@ -58,7 +58,7 @@ enum wxFSIconType Unix ports of wxWidgets do not have the concept of volumes and thus do not implement wxFSVolume. - @onlyfor{wxmsw} + @onlyfor{wxmsw,wxosx} @library{wxbase} @category{misc} @@ -138,6 +138,8 @@ public: This function is available only when @c wxUSE_GUI is @c 1. Returns the icon used by the native toolkit for the given file system type. + + @onlyfor{wxmsw} */ wxIcon GetIcon(wxFSIconType type) const; }; diff --git a/src/generic/dirctrlg.cpp b/src/generic/dirctrlg.cpp index 617f08001a..ba52565f90 100644 --- a/src/generic/dirctrlg.cpp +++ b/src/generic/dirctrlg.cpp @@ -51,10 +51,13 @@ #include "wx/osx/private.h" // includes mac headers #endif +#if defined(__WINDOWS__) || defined(__APPLE__) +#include "wx/volume.h" +#endif + #ifdef __WINDOWS__ #include #include "wx/msw/winundef.h" -#include "wx/volume.h" // MinGW has _getdrive() and _chdrive(), Cygwin doesn't. #if defined(__GNUWIN32__) && !defined(__CYGWIN__) @@ -91,15 +94,11 @@ wxDEFINE_EVENT( wxEVT_DIRCTRL_FILEACTIVATED, wxTreeEvent ); // wxGetAvailableDrives, for WINDOWS, OSX, UNIX (returns "/") // ---------------------------------------------------------------------------- -// since the macOS implementation needs objective-C this is dirdlg.mm -#ifdef __WXOSX__ -extern size_t wxGetAvailableDrives(wxArrayString &paths, wxArrayString &names, wxArrayInt &icon_ids); -#else size_t wxGetAvailableDrives(wxArrayString &paths, wxArrayString &names, wxArrayInt &icon_ids) { -#ifdef wxHAS_FILESYSTEM_VOLUMES +#if defined(wxHAS_FILESYSTEM_VOLUMES) || defined(__APPLE__) -#if defined(__WIN32__) && wxUSE_FSVOLUME +#if (defined(__WIN32__) || defined(__WXOSX__)) && wxUSE_FSVOLUME // TODO: this code (using wxFSVolumeBase) should be used for all platforms // but unfortunately wxFSVolumeBase is not implemented everywhere const wxArrayString as = wxFSVolumeBase::GetVolumes(); @@ -164,7 +163,6 @@ size_t wxGetAvailableDrives(wxArrayString &paths, wxArrayString &names, wxArrayI wxASSERT_MSG( (paths.GetCount() == icon_ids.GetCount()), wxT("Wrong number of icons for available drives.")); return paths.GetCount(); } -#endif // ---------------------------------------------------------------------------- // wxIsDriveAvailable diff --git a/src/osx/cocoa/dirdlg.mm b/src/osx/cocoa/dirdlg.mm index b47a2c9039..c762fb7425 100644 --- a/src/osx/cocoa/dirdlg.mm +++ b/src/osx/cocoa/dirdlg.mm @@ -173,35 +173,4 @@ void wxDirDialog::SetTitle(const wxString &title) wxDialog::SetTitle(title); } -size_t wxGetAvailableDrives(wxArrayString &paths, wxArrayString &names, wxArrayInt &icon_ids) -{ - NSWorkspace *workspace = [NSWorkspace sharedWorkspace]; - NSArray *volumes = [workspace mountedLocalVolumePaths]; - NSFileManager *filemanager = [NSFileManager defaultManager]; - - for (NSString *path in volumes) - { - NSString *description, *type, *name; - BOOL removable, writable, unmountable; - - if ( [workspace getFileSystemInfoForPath:path isRemovable:&removable isWritable:&writable - isUnmountable:&unmountable description:&description type:&type] ) - { - if ( writable ) - icon_ids.Add(wxFileIconsTable::drive); - else - icon_ids.Add(wxFileIconsTable::cdrom); - - name = [filemanager displayNameAtPath:path]; - - paths.Add(wxCFStringRefFromGet(path).AsString()); - names.Add(wxCFStringRefFromGet(name).AsString()); - } - } - - wxASSERT_MSG( (paths.GetCount() == names.GetCount()), wxT("The number of paths and their human readable names should be equal in number.")); - wxASSERT_MSG( (paths.GetCount() == icon_ids.GetCount()), wxT("Wrong number of icons for available drives.")); - return paths.GetCount(); -} - #endif // wxUSE_DIRDLG diff --git a/src/osx/volume.mm b/src/osx/volume.mm new file mode 100644 index 0000000000..bd03bbe44a --- /dev/null +++ b/src/osx/volume.mm @@ -0,0 +1,157 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: src/osx/volume.cpp +// Purpose: apple implementation of wxFSVolume +// Author: Tobias Taschner +// Created: 2021-11-17 +// Copyright: (c) 2021 wxWidgets development team +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +// ============================================================================ +// declarations +// ============================================================================ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +#include "wx/wxprec.h" + + +#if wxUSE_FSVOLUME + +#include "wx/volume.h" + +#ifndef WX_PRECOMP + #if wxUSE_GUI + #include "wx/icon.h" + #endif +#endif // WX_PRECOMP + +#include "wx/arrimpl.cpp" + +#include "wx/osx/core/cfref.h" +#include "wx/osx/core/cfstring.h" + +#import +#import + +//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// wxFSVolume +//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + +wxArrayString wxFSVolumeBase::GetVolumes(int flagsSet, int flagsUnset) +{ + auto nativeVolumes = [[NSFileManager defaultManager] + mountedVolumeURLsIncludingResourceValuesForKeys:nil + options:NSVolumeEnumerationSkipHiddenVolumes]; + + + wxArrayString volumePaths; + if ( nativeVolumes == nil ) + { + wxFSVolumeBase volume("/"); + int flags = volume.GetFlags(); + if ((flags & flagsSet) == flagsSet && !(flags & flagsUnset)) + volumePaths.push_back(volume.GetName()); + } + else + { + for (NSURL* url in nativeVolumes) + { + wxFSVolumeBase volume(url.fileSystemRepresentation); + int flags = volume.GetFlags(); + if ((flags & flagsSet) == flagsSet && !(flags & flagsUnset)) + volumePaths.push_back(volume.GetName()); + } + } + return volumePaths; +} + +void wxFSVolumeBase::CancelSearch() +{ +} + +wxFSVolumeBase::wxFSVolumeBase() +{ + m_isOk = false; +} + +wxFSVolumeBase::wxFSVolumeBase(const wxString& name) +{ + Create(name); +} + +bool wxFSVolumeBase::Create(const wxString& name) +{ + m_isOk = false; + m_volName = name; + + NSURL* url = [NSURL fileURLWithPath:wxCFStringRef(name).AsNSString()]; + auto values = [url resourceValuesForKeys:@[NSURLVolumeLocalizedNameKey] error:nil]; + if (values) + { + m_isOk = true; + m_dispName = wxCFStringRef::AsString((CFStringRef)[values objectForKey:NSURLVolumeLocalizedNameKey]); + } + + return m_isOk; +} + +bool wxFSVolumeBase::IsOk() const +{ + return m_isOk; +} + +wxFSVolumeKind wxFSVolumeBase::GetKind() const +{ + NSURL* url = [NSURL fileURLWithPath:wxCFStringRef(GetName()).AsNSString()]; + auto values = [url resourceValuesForKeys:@[NSURLVolumeIsLocalKey, NSURLVolumeIsReadOnlyKey] error:nil]; + + // Assume disk for local volumes + if ([(NSNumber*)[values objectForKey:NSURLVolumeIsLocalKey] boolValue]) + { + if ([(NSNumber*)[values objectForKey:NSURLVolumeIsReadOnlyKey] boolValue]) + return wxFS_VOL_CDROM; + else + return wxFS_VOL_DISK; + } + else + return wxFS_VOL_NETWORK; +} + +int wxFSVolumeBase::GetFlags() const +{ + NSURL* url = [NSURL fileURLWithPath:wxCFStringRef(GetName()).AsNSString()]; + auto values = [url resourceValuesForKeys:@[NSURLVolumeIsRemovableKey, NSURLVolumeIsLocalKey, NSURLVolumeIsReadOnlyKey] error:nil]; + if (values) + { + // mounted status cannot be determined, assume mounted + int flags = wxFS_VOL_MOUNTED; + if ([(NSNumber*)[values objectForKey:NSURLVolumeIsRemovableKey] boolValue]) + flags |= wxFS_VOL_REMOVABLE; + if ([(NSNumber*)[values objectForKey:NSURLVolumeIsReadOnlyKey] boolValue]) + flags |= wxFS_VOL_READONLY; + if (![(NSNumber*)[values objectForKey:NSURLVolumeIsLocalKey] boolValue]) + flags |= wxFS_VOL_REMOTE; + return flags; + } + else + return -1; +} + +#if wxUSE_GUI +void wxFSVolume::InitIcons() +{ + // no support for icons on apple +} + +wxIcon wxFSVolume::GetIcon(wxFSIconType WXUNUSED(type)) const +{ + // no support for icons on apple + return wxNullIcon; +} +#endif // wxUSE_GUI + + +#endif // wxUSE_FSVOLUME diff --git a/tests/interactive/output.cpp b/tests/interactive/output.cpp index 54002c5fbc..d0bdb7a958 100644 --- a/tests/interactive/output.cpp +++ b/tests/interactive/output.cpp @@ -421,7 +421,7 @@ void InteractiveOutputTestCase::TestStandardPaths() // wxVolume tests // ---------------------------------------------------------------------------- -#if !defined(__WIN32__) || !wxUSE_FSVOLUME +#if (!defined(__WIN32__) && !defined(__APPLE__)) || defined(__WXOSX_IPHONE__) || !wxUSE_FSVOLUME #undef TEST_VOLUME #endif