From: <lab...@us...> - 2016-12-08 11:05:39
|
Revision: 1543 http://sourceforge.net/p/opengtoolkit/svn/1543 Author: labviewer Date: 2016-12-08 11:05:37 +0000 (Thu, 08 Dec 2016) Log Message: ----------- Allow for dynamic loading of SymbolicLink API Modified Paths: -------------- trunk/lvzip/c_source/lvutil.c trunk/lvzip/c_source/lvutil.h trunk/lvzip/c_source/zlibvc.vcproj Modified: trunk/lvzip/c_source/lvutil.c =================================================================== --- trunk/lvzip/c_source/lvutil.c 2016-12-04 23:36:48 UTC (rev 1542) +++ trunk/lvzip/c_source/lvutil.c 2016-12-08 11:05:37 UTC (rev 1543) @@ -6,9 +6,9 @@ */ #define ZLIB_INTERNAL +#include "lvutil.h" #include "zlib.h" #include "ioapi.h" -#include "lvutil.h" #include "iomem.h" #include "utf.h" #if Unix @@ -381,6 +381,7 @@ case ERROR_SHARING_VIOLATION: return fNoPerm; case ERROR_ALREADY_EXISTS: case ERROR_FILE_EXISTS: return fDupPath; + case ERROR_NOT_SUPPORTED: return mgNotSupported; case ERROR_NO_MORE_FILES: return mgNoErr; } return fIOErr; /* fIOErr generally signifies some unknown file error */ @@ -1595,6 +1596,48 @@ return err; } +#if Win32 +typedef BOOL (WINAPI *tCreateHardLinkW)(LPCWSTR lpFileName, LPCWSTR lpExistingFileName, LPSECURITY_ATTRIBUTES lpSecurityAttributes); +BOOL Win32CreateHardLinkW(LPCWSTR lpFileName, LPCWSTR lpExistingFileName, LPSECURITY_ATTRIBUTES lpSecurityAttributes) +{ + static tCreateHardLinkW pCreateHardLinkW = NULL; + if (!pCreateHardLinkW) + { + HMODULE hLib = LoadLibrary("kernel32.dll"); + if (hLib) + { + pCreateHardLinkW = (tCreateHardLinkW)GetProcAddress(hLib, "CreateHardLinkW"); + } + } + if (pCreateHardLinkW) + { + return pCreateHardLinkW(lpFileName, lpExistingFileName, lpSecurityAttributes); + } + SetLastError(ERROR_NOT_SUPPORTED); + return FALSE; +} + +typedef BOOL (WINAPI *tCreateSymbolicLinkW)(LPCWSTR lpSymlinkFileName, LPCWSTR lpTargetFileName, DWORD dwFlags); +BOOL Win32CreateSymbolicLinkW(LPCWSTR lpSymlinkFileName, LPCWSTR lpTargetFileName, DWORD dwFlags) +{ + static tCreateSymbolicLinkW pCreateSymbolicLinkW = NULL; + if (!pCreateSymbolicLinkW) + { + HMODULE hLib = LoadLibrary("kernel32.dll"); + if (hLib) + { + pCreateSymbolicLinkW = (tCreateSymbolicLinkW)GetProcAddress(hLib, "CreateSymbolicLinkW"); + } + } + if (pCreateSymbolicLinkW) + { + return pCreateSymbolicLinkW(lpSymlinkFileName, lpTargetFileName, dwFlags); + } + SetLastError(ERROR_NOT_SUPPORTED); + return FALSE; +} +#endif + LibAPI(MgErr) LVPath_CreateLink(Path path, uInt32 flags, Path target) { MgErr err = mgNoErr; @@ -1621,7 +1664,7 @@ if (symlink((const char*)LStrBuf(src), (const char*)LStrBuf(tgt))) err = UnixToLVFileErr(); } -#elif Win32 +#elif Win32 && !EMBEDDED if (FExists(target)) { FInfoRec finfo; @@ -1636,13 +1679,15 @@ if (flags & kLinkHard) { if (flags & kLinkDir) + { err = mgNotSupported; - else if (!CreateHardLinkW(UStrBuf(src), UStrBuf(tgt), NULL)) + } + else if (!Win32CreateHardLinkW(UStrBuf(src), UStrBuf(tgt), NULL)) { err = Win32ToLVFileErr(); } } - else if (!CreateSymbolicLinkW(UStrBuf(src), UStrBuf(tgt), flags & kLinkDir ? SYMBOLIC_LINK_FLAG_DIRECTORY : 0)) + else if (!Win32CreateSymbolicLinkW(UStrBuf(src), UStrBuf(tgt), flags & kLinkDir ? SYMBOLIC_LINK_FLAG_DIRECTORY : 0)) { err = Win32ToLVFileErr(); } @@ -1774,7 +1819,7 @@ if (!err) { LStrHandle handle = NULL; - err = WideCStrToMultiByte((LPCWCHAR)wTgt, -1, &handle, CP_ACP, 0, NULL); + err = WideCStrToMultiByte((LPCWSTR)wTgt, -1, &handle, CP_ACP, 0, NULL); if (!err) err = FTextToPath(LStrBuf(*handle), LStrLen(*handle), target); if (handle) @@ -2566,7 +2611,7 @@ #endif } -LibAPI(uInt32) determine_codepage(uLong *flags, LStrHandle string) +LibAPI(uInt32) determine_codepage(uInt32 *flags, LStrHandle string) { uInt32 cp = Hi16(*flags); if (!cp) Modified: trunk/lvzip/c_source/lvutil.h =================================================================== --- trunk/lvzip/c_source/lvutil.h 2016-12-04 23:36:48 UTC (rev 1542) +++ trunk/lvzip/c_source/lvutil.h 2016-12-08 11:05:37 UTC (rev 1543) @@ -65,6 +65,7 @@ #define DEBUG 1 #endif #define BigEndian 0 + #define _WIN32_WINNT 0x0501 #elif defined(linux) || defined(__linux) || defined(__linux__) #if defined(i386) #define ProcessorType kX86 @@ -618,7 +619,7 @@ /**************************/ /* Version string of the zlib library */ -LibAPI(void) DLLVersion OF((uChar* Version)); +LibAPI(void) DLLVersion(uChar* Version); /* Convert the path into a string representation for the current platform */ LibAPI(MgErr) LVPath_ToText(Path path, LStrHandle *str); @@ -680,14 +681,14 @@ uInt16 str[1]; } UString, *UStrPtr, **UStrHandle; -#define UStrLen(s) LStrLen(s) * sizeof(uInt16) / sizeof(wchar_t) +#define UStrLen(s) (int32)(LStrLen(s) * sizeof(uInt16) / sizeof(wchar_t)) #define UStrLenSet(s, l) LStrLen(s) = l * sizeof(wchar_t) / sizeof(uInt16) #define UStrBuf(s) ((wchar_t*)(LStrBuf(s))) LibAPI(MgErr) ZeroTerminateLString(LStrHandle *dest); LibAPI(uInt32) GetCurrentCodePage(LVBoolean acp); -LibAPI(uInt32) determine_codepage(uLong *flags, LStrHandle string); +LibAPI(uInt32) determine_codepage(uInt32 *flags, LStrHandle string); LibAPI(MgErr) MultiByteCStrToWideString(ConstCStr src, int32 srclen, UStrHandle *dest, uInt32 codePage); LibAPI(MgErr) MultiByteToWideString(const LStrHandle src, UStrHandle *dest, uInt32 codePage); LibAPI(MgErr) WideStringToMultiByte(const UStrHandle src, LStrHandle *dest, uInt32 codePage, char defaultChar, LVBoolean *defaultCharWasUsed); Modified: trunk/lvzip/c_source/zlibvc.vcproj =================================================================== --- trunk/lvzip/c_source/zlibvc.vcproj 2016-12-04 23:36:48 UTC (rev 1542) +++ trunk/lvzip/c_source/zlibvc.vcproj 2016-12-08 11:05:37 UTC (rev 1543) @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="Windows-1252"?> <VisualStudioProject ProjectType="Visual C++" - Version="8.00" + Version="8,00" Name="zlibvc" ProjectGUID="{FF990D80-DB65-4107-B10C-5F7ACEF6F01B}" RootNamespace="zlibvc" This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |