Bugzilla Bug 327448: it's not necessary to do dynamic lookup of the W
authorwtchang%redhat.com
Thu, 16 Feb 2006 21:34:46 +0000
changeset 3587 20a2565c3465f6bd6a7b3ada87524d6d23d13b43
parent 3583 ee903936ef158b759319656706617faff710a22b
child 3589 859e54f66a6d991bdc376249481357afcc2aa14b
push idunknown
push userunknown
push dateunknown
bugs327448
Bugzilla Bug 327448: it's not necessary to do dynamic lookup of the W functions because they are also defined (as stubs) on Windows 9x. The patch is contributed by Masatoshi Kimura (emk) <VYV03354@nifty.ne.jp>. r=wtc.
pr/src/md/windows/w95io.c
--- a/pr/src/md/windows/w95io.c
+++ b/pr/src/md/windows/w95io.c
@@ -75,20 +75,16 @@ static DWORD dirAccessTable[] = {
  * This constant is used by _PR_FileTimeToPRTime().
  */
 #if defined(__MINGW32__)
 static const PRTime _pr_filetime_offset = 116444736000000000LL;
 #else
 static const PRTime _pr_filetime_offset = 116444736000000000i64;
 #endif
 
-#ifdef MOZ_UNICODE
-static void InitUnicodeSupport(void);
-#endif
-
 void
 _PR_MD_INIT_IO()
 {
     WORD WSAVersion = 0x0101;
     WSADATA WSAData;
     int err;
 
     err = WSAStartup( WSAVersion, &WSAData );
@@ -115,20 +111,16 @@ void
 
         rv = SystemTimeToFileTime(&systime, &filetime.ft);
         PR_ASSERT(0 != rv);
         PR_ASSERT(filetime.prt == _pr_filetime_offset);
     }
 #endif /* DEBUG */
 
     _PR_NT_InitSids();
-
-#ifdef MOZ_UNICODE
-    InitUnicodeSupport();
-#endif
 }
 
 PRStatus
 _PR_MD_WAIT(PRThread *thread, PRIntervalTime ticks)
 {
     DWORD rv;
 
     PRUint32 msecs = (ticks == PR_INTERVAL_NO_TIMEOUT) ?
@@ -1100,49 +1092,16 @@ PRInt32
 		PR_SetError(PR_BAD_DESCRIPTOR_ERROR, 0);
 	else
 		PR_SetError(PR_NOT_IMPLEMENTED_ERROR, 0);
     return -1;
 }
 
 #ifdef MOZ_UNICODE
 
-typedef HANDLE (WINAPI *CreateFileWFn) (LPCWSTR, DWORD, DWORD, LPSECURITY_ATTRIBUTES, DWORD, DWORD, HANDLE);
-static CreateFileWFn createFileW = NULL; 
-typedef HANDLE (WINAPI *FindFirstFileWFn) (LPCWSTR, LPWIN32_FIND_DATAW);
-static FindFirstFileWFn findFirstFileW = NULL; 
-typedef BOOL (WINAPI *FindNextFileWFn) (HANDLE, LPWIN32_FIND_DATAW);
-static FindNextFileWFn findNextFileW = NULL; 
-typedef DWORD (WINAPI *GetFullPathNameWFn) (LPCWSTR, DWORD, LPWSTR, LPWSTR *);
-static GetFullPathNameWFn getFullPathNameW = NULL; 
-typedef UINT (WINAPI *GetDriveTypeWFn) (LPCWSTR);
-static GetDriveTypeWFn getDriveTypeW = NULL; 
-
-static void InitUnicodeSupport(void)
-{
-    HMODULE module;
-
-    /*
-     * The W functions do not exist on Win9x.  NSPR won't run on Win9x
-     * if we call the W functions directly.  Use GetProcAddress() to
-     * look up their addresses at run time.
-     */
-
-    module = GetModuleHandle("Kernel32.dll");
-    if (!module) {
-        return;
-    }
-
-    createFileW = (CreateFileWFn)GetProcAddress(module, "CreateFileW"); 
-    findFirstFileW = (FindFirstFileWFn)GetProcAddress(module, "FindFirstFileW"); 
-    findNextFileW = (FindNextFileWFn)GetProcAddress(module, "FindNextFileW"); 
-    getDriveTypeW = (GetDriveTypeWFn)GetProcAddress(module, "GetDriveTypeW"); 
-    getFullPathNameW = (GetFullPathNameWFn)GetProcAddress(module, "GetFullPathNameW"); 
-}
-
 /* ================ UTF16 Interfaces ================================ */
 void FlipSlashesW(PRUnichar *cp, size_t len)
 {
     while (len-- > 0) {
         if (cp[0] == L'/') {
             cp[0] = L'\\';
         }
         cp++;
@@ -1155,21 +1114,16 @@ PROsfd
     HANDLE file;
     PRInt32 access = 0;
     PRInt32 flags = 0;
     PRInt32 flag6 = 0;
     SECURITY_ATTRIBUTES sa;
     LPSECURITY_ATTRIBUTES lpSA = NULL;
     PSECURITY_DESCRIPTOR pSD = NULL;
     PACL pACL = NULL;
-
-    if (!createFileW) {
-        PR_SetError(PR_NOT_IMPLEMENTED_ERROR, 0);
-        return -1;
-    }
  
     if (osflags & PR_CREATE_FILE) {
         if (_PR_NT_MakeSecurityDescriptorACL(mode, fileAccessTable,
                 &pSD, &pACL) == PR_SUCCESS) {
             sa.nLength = sizeof(sa);
             sa.lpSecurityDescriptor = pSD;
             sa.bInheritHandle = FALSE;
             lpSA = &sa;
@@ -1192,17 +1146,17 @@ PROsfd
             flags = OPEN_ALWAYS;
     } else {
         if (osflags & PR_TRUNCATE)
             flags = TRUNCATE_EXISTING;
         else
             flags = OPEN_EXISTING;
     }
 
-    file = createFileW(name,
+    file = CreateFileW(name,
                        access,
                        FILE_SHARE_READ|FILE_SHARE_WRITE,
                        lpSA,
                        flags,
                        flag6,
                        NULL);
     if (lpSA != NULL) {
         _PR_NT_FreeSecurityDescriptorACL(pSD, pACL);
@@ -1216,21 +1170,16 @@ PROsfd
 }
  
 PRStatus
 _PR_MD_OPEN_DIR_UTF16(_MDDirUTF16 *d, const PRUnichar *name)
 {
     PRUnichar filename[ MAX_PATH ];
     int len;
 
-    if (!findFirstFileW) {
-        PR_SetError(PR_NOT_IMPLEMENTED_ERROR, 0);
-        return PR_FAILURE;
-    }
-
     len = wcslen(name);
     /* Need 5 bytes for \*.* and the trailing null byte. */
     if (len + 5 > MAX_PATH) {
         PR_SetError(PR_NAME_TOO_LONG_ERROR, 0);
         return PR_FAILURE;
     }
     wcscpy(filename, name);
 
@@ -1239,45 +1188,40 @@ PRStatus
      * another backslash.
      */
     if (filename[len - 1] == L'/' || filename[len - 1] == L'\\') {
         len--;
     }
     wcscpy(&filename[len], L"\\*.*");
     FlipSlashesW( filename, wcslen(filename) );
 
-    d->d_hdl = findFirstFileW( filename, &(d->d_entry) );
+    d->d_hdl = FindFirstFileW( filename, &(d->d_entry) );
     if ( d->d_hdl == INVALID_HANDLE_VALUE ) {
         _PR_MD_MAP_OPENDIR_ERROR(GetLastError());
         return PR_FAILURE;
     }
     d->firstEntry = PR_TRUE;
     d->magic = _MD_MAGIC_DIR;
     return PR_SUCCESS;
 }
 
 PRUnichar *
 _PR_MD_READ_DIR_UTF16(_MDDirUTF16 *d, PRIntn flags)
 {
     PRInt32 err;
     BOOL rv;
     PRUnichar *fileName;
 
-    if (!findNextFileW) {
-        PR_SetError(PR_NOT_IMPLEMENTED_ERROR, 0);
-        return NULL;
-    }
-
     if ( d ) {
         while (1) {
             if (d->firstEntry) {
                 d->firstEntry = PR_FALSE;
                 rv = 1;
             } else {
-                rv = findNextFileW(d->d_hdl, &(d->d_entry));
+                rv = FindNextFileW(d->d_hdl, &(d->d_entry));
             }
             if (rv == 0) {
                 break;
             }
             fileName = GetFileFromDIR(d);
             if ( (flags & PR_SKIP_DOT) &&
                  (fileName[0] == L'.') && (fileName[1] == L'\0'))
                 continue;
@@ -1342,17 +1286,17 @@ IsRootDirectoryW(PRUnichar *fn, size_t b
     PRBool rv = PR_FALSE;
 
     if (_PR_IS_W_SLASH(fn[0]) && fn[1] == L'\0') {
         return PR_TRUE;
     }
 
     if (iswalpha(fn[0]) && fn[1] == L':' && _PR_IS_W_SLASH(fn[2])
             && fn[3] == L'\0') {
-        rv = getDriveTypeW(fn) > 1 ? PR_TRUE : PR_FALSE;
+        rv = GetDriveTypeW(fn) > 1 ? PR_TRUE : PR_FALSE;
         return rv;
     }
 
     /* The UNC root directory */
 
     if (_PR_IS_W_SLASH(fn[0]) && _PR_IS_W_SLASH(fn[1])) {
         /* The 'server' part should have at least one character. */
         p = &fn[2];
@@ -1390,52 +1334,47 @@ IsRootDirectoryW(PRUnichar *fn, size_t b
             if ((p + 1) < (fn + buflen)) {
                 *p++ = L'\\';
                 *p = L'\0';
                 slashAdded = PR_TRUE;
             } else {
                 return PR_FALSE; /* name too long */
             }
         }
-        rv = getDriveTypeW(fn) > 1 ? PR_TRUE : PR_FALSE;
+        rv = GetDriveTypeW(fn) > 1 ? PR_TRUE : PR_FALSE;
         /* restore the 'fn' buffer */
         if (slashAdded) {
             *--p = L'\0';
         }
     }
     return rv;
 }
 
 PRInt32
 _PR_MD_GETFILEINFO64_UTF16(const PRUnichar *fn, PRFileInfo64 *info)
 {
     HANDLE hFindFile;
     WIN32_FIND_DATAW findFileData;
     PRUnichar pathbuf[MAX_PATH + 1];
-
-    if (!findFirstFileW || !getFullPathNameW || !getDriveTypeW) {
-        PR_SetError(PR_NOT_IMPLEMENTED_ERROR, 0);
-        return -1;
-    }
     
     if (NULL == fn || L'\0' == *fn) {
         PR_SetError(PR_INVALID_ARGUMENT_ERROR, 0);
         return -1;
     }
 
     /*
      * FindFirstFile() expands wildcard characters.  So
      * we make sure the pathname contains no wildcard.
      */
     if (NULL != wcspbrk(fn, L"?*")) {
         PR_SetError(PR_FILE_NOT_FOUND_ERROR, 0);
         return -1;
     }
 
-    hFindFile = findFirstFileW(fn, &findFileData);
+    hFindFile = FindFirstFileW(fn, &findFileData);
     if (INVALID_HANDLE_VALUE == hFindFile) {
         DWORD len;
         PRUnichar *filePart;
 
         /*
          * FindFirstFile() does not work correctly on root directories.
          * It also doesn't work correctly on a pathname that ends in a
          * slash.  So we first check to see if the pathname specifies a
@@ -1446,17 +1385,17 @@ PRInt32
         /*
          * If the pathname does not contain ., \, and /, it cannot be
          * a root directory or a pathname that ends in a slash.
          */
         if (NULL == wcspbrk(fn, L".\\/")) {
             _PR_MD_MAP_OPENDIR_ERROR(GetLastError());
             return -1;
         } 
-        len = getFullPathNameW(fn, sizeof(pathbuf)/sizeof(pathbuf[0]), pathbuf,
+        len = GetFullPathNameW(fn, sizeof(pathbuf)/sizeof(pathbuf[0]), pathbuf,
                 &filePart);
         if (0 == len) {
             _PR_MD_MAP_OPENDIR_ERROR(GetLastError());
             return -1;
         }
         if (len > sizeof(pathbuf)/sizeof(pathbuf[0])) {
             PR_SetError(PR_NAME_TOO_LONG_ERROR, 0);
             return -1;
@@ -1471,17 +1410,17 @@ PRInt32
             info->creationTime = 0;
             return 0;
         }
         if (!_PR_IS_W_SLASH(pathbuf[len - 1])) {
             _PR_MD_MAP_OPENDIR_ERROR(GetLastError());
             return -1;
         } else {
             pathbuf[len - 1] = L'\0';
-            hFindFile = findFirstFileW(pathbuf, &findFileData);
+            hFindFile = FindFirstFileW(pathbuf, &findFileData);
             if (INVALID_HANDLE_VALUE == hFindFile) {
                 _PR_MD_MAP_OPENDIR_ERROR(GetLastError());
                 return -1;
             }
         }
     }
 
     FindClose(hFindFile);