From 58eaeda1640480ddde17855f71131e3b8c7ea9f8 Mon Sep 17 00:00:00 2001 From: Thomas Bernard Date: Mon, 11 Feb 2019 15:47:34 +0100 Subject: [PATCH] Win32: browse Network Neighborhood --- project/msvc/grafx2-sdl2.vcxproj | 6 ++-- project/msvc/grafx2-win32.vcxproj | 4 +-- project/msvc/grafx2.vcxproj | 6 ++-- src/Makefile | 3 +- src/filesel.c | 26 +++++++++++--- src/input.c | 3 ++ src/io.c | 58 +++++++++++++++++++++++++++++++ src/io.h | 4 +++ 8 files changed, 97 insertions(+), 13 deletions(-) diff --git a/project/msvc/grafx2-sdl2.vcxproj b/project/msvc/grafx2-sdl2.vcxproj index 109307bd..b025baa4 100644 --- a/project/msvc/grafx2-sdl2.vcxproj +++ b/project/msvc/grafx2-sdl2.vcxproj @@ -63,7 +63,7 @@ Windows true - zlib.lib;SDL2.lib;SDL2main.lib;SDL2_image.lib;lua53.lib;%(AdditionalDependencies) + mpr.lib;zlib.lib;SDL2.lib;SDL2main.lib;SDL2_image.lib;lua53.lib;%(AdditionalDependencies) $(ZLibLibDir);$(SDL2LibDir);$(SDL2ImageLibDir);$(LuaLibDir);%(AdditionalLibraryDirectories) @@ -84,7 +84,7 @@ true true true - zlib.lib;SDL2.lib;SDL2main.lib;SDL2_image.lib;lua53.lib;%(AdditionalDependencies) + mpr.lib;zlib.lib;SDL2.lib;SDL2main.lib;SDL2_image.lib;lua53.lib;%(AdditionalDependencies) $(ZLibLibDir);$(SDL2LibDir);$(SDL2ImageLibDir);$(LuaLibDir);%(AdditionalLibraryDirectories) @@ -217,4 +217,4 @@ - \ No newline at end of file + diff --git a/project/msvc/grafx2-win32.vcxproj b/project/msvc/grafx2-win32.vcxproj index 2c2b7987..d79cb76d 100644 --- a/project/msvc/grafx2-win32.vcxproj +++ b/project/msvc/grafx2-win32.vcxproj @@ -58,7 +58,7 @@ true - libtiff.lib;lua53.lib;libpng16.lib;zlib.lib;%(AdditionalDependencies) + mpr.lib;libtiff.lib;lua53.lib;libpng16.lib;zlib.lib;%(AdditionalDependencies) $(TIFFLibDir);$(PNGLibDirDebug);$(LuaLibDir);%(AdditionalLibraryDirectories) @@ -77,7 +77,7 @@ true true true - libtiff.lib;lua53.lib;libpng16.lib;zlib.lib;%(AdditionalDependencies) + mpr.lib;libtiff.lib;lua53.lib;libpng16.lib;zlib.lib;%(AdditionalDependencies) $(TIFFLibDir);$(PNGLibDirRelease);$(LuaLibDir);%(AdditionalLibraryDirectories) diff --git a/project/msvc/grafx2.vcxproj b/project/msvc/grafx2.vcxproj index 8a43328a..31c4c18a 100644 --- a/project/msvc/grafx2.vcxproj +++ b/project/msvc/grafx2.vcxproj @@ -63,7 +63,7 @@ Windows true - zlib.lib;SDL.lib;SDLmain.lib;SDL_image.lib;lua53.lib;%(AdditionalDependencies) + mpr.lib;zlib.lib;SDL.lib;SDLmain.lib;SDL_image.lib;lua53.lib;%(AdditionalDependencies) $(ZLibLibDir);$(SDLLibDir);$(SDLImageLibDir);$(LuaLibDir);%(AdditionalLibraryDirectories) @@ -84,7 +84,7 @@ true true true - zlib.lib;SDL.lib;SDLmain.lib;SDL_image.lib;lua53.lib;%(AdditionalDependencies) + mpr.lib;zlib.lib;SDL.lib;SDLmain.lib;SDL_image.lib;lua53.lib;%(AdditionalDependencies) $(ZLibLibDir);$(SDLLibDir);$(SDLImageLibDir);$(LuaLibDir);%(AdditionalLibraryDirectories) @@ -217,4 +217,4 @@ - \ No newline at end of file + diff --git a/src/Makefile b/src/Makefile index cc843429..a4074917 100644 --- a/src/Makefile +++ b/src/Makefile @@ -129,6 +129,7 @@ ifdef COMSPEC LOPT += -L../3rdparty/usr-win32/lib -lgdi32 -lcomdlg32 PLATFORMFILES = endif + LOPT += -lmpr LOPT += -ltiff LOPT += -lpng -lz LUALOPT = -llua @@ -501,7 +502,7 @@ endif STRIP = $(CROSS_STRIP) BIN = ../bin/grafx2-$(API).exe COPT = -W -Wall -Wdeclaration-after-statement -O$(OPTIM) -g -ggdb $(TTFCOPT) - LOPT = -mwindows -lmingw32 -lshlwapi $(TTFLOPT) + LOPT = -mwindows -lmingw32 -lshlwapi -lmpr $(TTFLOPT) ifeq ($(API),sdl) COPT += -Dmain=SDL_main $(shell $(CROSS_SDLCONFIG) --cflags) LOPT += -lSDLmain -lSDL $(shell $(CROSS_SDLCONFIG) --libs) -lSDL_image diff --git a/src/filesel.c b/src/filesel.c index cbbb6846..72761a6d 100644 --- a/src/filesel.c +++ b/src/filesel.c @@ -738,6 +738,7 @@ void Read_list_of_drives(T_Fileselector *list, byte name_length) list->Nb_directories++; } } + Enumerate_Network(list); } #elif defined(__MINT__) drive_bits = Drvmap(); //get drive map bitfield @@ -822,12 +823,29 @@ void Read_list_of_drives(T_Fileselector *list, byte name_length) // Comparison of file names: #ifdef WIN32 // case-insensitive - #define FILENAME_COMPARE strcasecmp - #define FILENAME_COMPARE_UNICODE wcsicmp +static int Windows_Path_Compare(const char * s1, const char * s2) +{ + // trick to make network shares path (starting with \\) + // at the end of the list + if (s1[0] == '\\') + { + if (s2[0] != '\\') + return 1; + } + else + { + // s1[0] != '\\' + if (s2[0] == '\\') + return -1; + } + return strcasecmp(s1, s2); +} +#define FILENAME_COMPARE Windows_Path_Compare +#define FILENAME_COMPARE_UNICODE wcsicmp #else // case-sensitive - #define FILENAME_COMPARE strcmp - #define FILENAME_COMPARE_UNICODE Unicode_strcmp +#define FILENAME_COMPARE strcmp +#define FILENAME_COMPARE_UNICODE Unicode_strcmp #endif diff --git a/src/input.c b/src/input.c index b275373f..235386ff 100644 --- a/src/input.c +++ b/src/input.c @@ -33,6 +33,9 @@ #include #include #endif +#if defined(_MSC_VER) +#define strdup _strdup +#endif #ifdef USE_X11 #include diff --git a/src/io.c b/src/io.c index 894a07a3..6d08b843 100644 --- a/src/io.c +++ b/src/io.c @@ -70,6 +70,8 @@ #include "global.h" #include "gfx2log.h" #include "gfx2mem.h" +// for the network browse +#include "filesel.h" // Lit un octet // Renvoie -1 si OK, 0 en cas d'erreur @@ -1222,3 +1224,59 @@ char * Calculate_relative_path(const char * ref_path, const char * path) } return rel_path; } + +#if defined(WIN32) +static void Enumerate_Network_R(T_Fileselector *list, LPNETRESOURCEA lpnr) +{ + // Mpr.lib + HANDLE hEnum; + DWORD r; + r = WNetOpenEnumA (RESOURCE_GLOBALNET, RESOURCETYPE_DISK, 0, lpnr, &hEnum); + if (r == NO_ERROR) + { + DWORD buffer_size = 16*1024; + DWORD count = -1; + LPNETRESOURCEA lpnrLocal = (LPNETRESOURCEA) GlobalAlloc(GPTR, buffer_size); + do + { + ZeroMemory(lpnrLocal, buffer_size); + r = WNetEnumResourceA(hEnum, &count, lpnrLocal, &buffer_size); + if (r == NO_ERROR) + { + DWORD i; + for (i = 0 ; i < count; i++) + { + GFX2_Log(GFX2_DEBUG, "%08x %08x %08x %s %s %s %s\n", + lpnrLocal[i].dwType, lpnrLocal[i].dwDisplayType, + lpnrLocal[i].dwUsage, + lpnrLocal[i].lpProvider, lpnrLocal[i].lpLocalName, + lpnrLocal[i].lpRemoteName, lpnrLocal[i].lpComment); + if (lpnrLocal[i].dwUsage & RESOURCEUSAGE_CONTAINER) + { + Enumerate_Network_R(list, &lpnrLocal[i]); + } + if (lpnrLocal[i].dwType == RESOURCETYPE_DISK && + lpnrLocal[i].dwDisplayType == RESOURCEDISPLAYTYPE_SHARE) + { + Add_element_to_list(list, lpnrLocal[i].lpRemoteName, + Format_filename(lpnrLocal[i].lpRemoteName, 19-1, FSOBJECT_DRIVE), + FSOBJECT_DRIVE, ICON_NETWORK); + list->Nb_directories++; + } + } + } + else + { + } + } + while (0); + GlobalFree((HGLOBAL) lpnrLocal); + WNetCloseEnum(hEnum); + } +} + +void Enumerate_Network(T_Fileselector *list) +{ + Enumerate_Network_R(list, NULL); +} +#endif diff --git a/src/io.h b/src/io.h index 6bea8c88..83c82f2e 100644 --- a/src/io.h +++ b/src/io.h @@ -201,5 +201,9 @@ int Remove_directory(const char * path); /// Calculate relative path char * Calculate_relative_path(const char * ref_path, const char * path); +#if defined(WIN32) +void Enumerate_Network(T_Fileselector *list); +#endif + /** @}*/ #endif