Bug 556415 - Crash on Windows 2000 in g_winhttp_vfs_init()
authorTor Lillqvist <tml@novell.com>
Wed, 12 Nov 2008 17:52:39 +0000 (17:52 +0000)
committerTor Lillqvist <tml@src.gnome.org>
Wed, 12 Nov 2008 17:52:39 +0000 (17:52 +0000)
2008-11-12  Tor Lillqvist  <tml@novell.com>

Bug 556415 - Crash on Windows 2000 in g_winhttp_vfs_init()

* win32/gwinhttpvfs.h: Move the set of function pointers to
winhttp.dll into a separate struct GWinHttpDllFuncs. Just have a
pointer to that in the GWinHttpVfsClass.

* win32/gwinhttpvfs.c: Move the lookup of functions from
winhttp.dll into a function of its own, that stores the pointers
in a separate GWinHttpDllFuncs variable. Add two bookeeping
booleans lookup_done and funcs_found.

Don't call g_io_extension_point_implement() to register the
winhttp extension unless winhttp.dll has been successfully loaded
and the required functions found in it.

* win32/gwinhttp*.c: Adjust calls of the functions looked up from
winhttp.dll correspondingly.

svn path=/trunk/; revision=7648

gio/ChangeLog
gio/win32/gwinhttpfile.c
gio/win32/gwinhttpfileinputstream.c
gio/win32/gwinhttpfileoutputstream.c
gio/win32/gwinhttpvfs.c
gio/win32/gwinhttpvfs.h

index 8da10d3..cc38db6 100644 (file)
@@ -1,3 +1,23 @@
+2008-11-12  Tor Lillqvist  <tml@novell.com>
+
+       Bug 556415 - Crash on Windows 2000 in g_winhttp_vfs_init()
+
+       * win32/gwinhttpvfs.h: Move the set of function pointers to
+       winhttp.dll into a separate struct GWinHttpDllFuncs. Just have a
+       pointer to that in the GWinHttpVfsClass.
+       
+       * win32/gwinhttpvfs.c: Move the lookup of functions from
+       winhttp.dll into a function of its own, that stores the pointers
+       in a separate GWinHttpDllFuncs variable. Add two bookeeping
+       booleans lookup_done and funcs_found.
+
+       Don't call g_io_extension_point_implement() to register the
+       winhttp extension unless winhttp.dll has been successfully loaded
+       and the required functions found in it.
+
+       * win32/gwinhttp*.c: Adjust calls of the functions looked up from
+       winhttp.dll correspondingly.
+
 2008-10-28  Cosimo Cecchi  <cosimoc@gnome.org>
 
        reviewed by: Alexander Larsson <alexl@redhat.com>
index d922d3c..6bd05b7 100644 (file)
@@ -107,7 +107,7 @@ _g_winhttp_file_new (GWinHttpVfs *vfs,
   file->url.dwUrlPathLength = 1;
   file->url.dwExtraInfoLength = 1;
 
-  if (!G_WINHTTP_VFS_GET_CLASS (vfs)->pWinHttpCrackUrl (wuri, 0, 0, &file->url))
+  if (!G_WINHTTP_VFS_GET_CLASS (vfs)->funcs->pWinHttpCrackUrl (wuri, 0, 0, &file->url))
     {
       g_free (wuri);
       return NULL;
@@ -120,7 +120,7 @@ _g_winhttp_file_new (GWinHttpVfs *vfs,
   file->url.lpszUrlPath = g_new (wchar_t, ++file->url.dwUrlPathLength);
   file->url.lpszExtraInfo = g_new (wchar_t, ++file->url.dwExtraInfoLength);
 
-  if (!G_WINHTTP_VFS_GET_CLASS (vfs)->pWinHttpCrackUrl (wuri, 0, 0, &file->url))
+  if (!G_WINHTTP_VFS_GET_CLASS (vfs)->funcs->pWinHttpCrackUrl (wuri, 0, 0, &file->url))
     {
       g_free (file->url.lpszScheme);
       g_free (file->url.lpszHostName);
@@ -193,13 +193,13 @@ g_winhttp_file_get_uri (GFile *file)
   char *retval;
 
   len = 0;
-  if (!G_WINHTTP_VFS_GET_CLASS (winhttp_file->vfs)->pWinHttpCreateUrl (&winhttp_file->url, ICU_ESCAPE, NULL, &len) &&
+  if (!G_WINHTTP_VFS_GET_CLASS (winhttp_file->vfs)->funcs->pWinHttpCreateUrl (&winhttp_file->url, ICU_ESCAPE, NULL, &len) &&
       GetLastError () != ERROR_INSUFFICIENT_BUFFER)
     return NULL;
 
   wuri = g_new (wchar_t, ++len);
 
-  if (!G_WINHTTP_VFS_GET_CLASS (winhttp_file->vfs)->pWinHttpCreateUrl (&winhttp_file->url, ICU_ESCAPE, wuri, &len))
+  if (!G_WINHTTP_VFS_GET_CLASS (winhttp_file->vfs)->funcs->pWinHttpCreateUrl (&winhttp_file->url, ICU_ESCAPE, wuri, &len))
     {
       g_free (wuri);
       return NULL;
@@ -477,7 +477,7 @@ g_winhttp_file_query_info (GFile                *file,
   SYSTEMTIME last_modified;
   DWORD last_modified_len;
 
-  connection = G_WINHTTP_VFS_GET_CLASS (winhttp_file->vfs)->pWinHttpConnect
+  connection = G_WINHTTP_VFS_GET_CLASS (winhttp_file->vfs)->funcs->pWinHttpConnect
     (G_WINHTTP_VFS (winhttp_file->vfs)->session,
      winhttp_file->url.lpszHostName,
      winhttp_file->url.nPort,
@@ -490,7 +490,7 @@ g_winhttp_file_query_info (GFile                *file,
       return NULL;
     }
 
-  request = G_WINHTTP_VFS_GET_CLASS (winhttp_file->vfs)->pWinHttpOpenRequest
+  request = G_WINHTTP_VFS_GET_CLASS (winhttp_file->vfs)->funcs->pWinHttpOpenRequest
     (connection,
      L"HEAD",
      winhttp_file->url.lpszUrlPath,
@@ -506,7 +506,7 @@ g_winhttp_file_query_info (GFile                *file,
       return NULL;
     }
 
-  if (!G_WINHTTP_VFS_GET_CLASS (winhttp_file->vfs)->pWinHttpSendRequest
+  if (!G_WINHTTP_VFS_GET_CLASS (winhttp_file->vfs)->funcs->pWinHttpSendRequest
       (request,
        NULL, 0,
        NULL, 0,
@@ -579,7 +579,7 @@ g_winhttp_file_query_info (GFile                *file,
     }
 
   last_modified_len = sizeof (last_modified);
-  if (G_WINHTTP_VFS_GET_CLASS (winhttp_file->vfs)->pWinHttpQueryHeaders
+  if (G_WINHTTP_VFS_GET_CLASS (winhttp_file->vfs)->funcs->pWinHttpQueryHeaders
       (request,
        WINHTTP_QUERY_LAST_MODIFIED | WINHTTP_QUERY_FLAG_SYSTEMTIME,
        NULL,
@@ -617,7 +617,7 @@ g_winhttp_file_read (GFile         *file,
       NULL,
     };
 
-  connection = G_WINHTTP_VFS_GET_CLASS (winhttp_file->vfs)->pWinHttpConnect
+  connection = G_WINHTTP_VFS_GET_CLASS (winhttp_file->vfs)->funcs->pWinHttpConnect
     (G_WINHTTP_VFS (winhttp_file->vfs)->session,
      winhttp_file->url.lpszHostName,
      winhttp_file->url.nPort,
@@ -630,7 +630,7 @@ g_winhttp_file_read (GFile         *file,
       return NULL;
     }
 
-  request = G_WINHTTP_VFS_GET_CLASS (winhttp_file->vfs)->pWinHttpOpenRequest
+  request = G_WINHTTP_VFS_GET_CLASS (winhttp_file->vfs)->funcs->pWinHttpOpenRequest
     (connection,
      L"GET",
      winhttp_file->url.lpszUrlPath,
@@ -658,7 +658,7 @@ g_winhttp_file_create (GFile             *file,
   GWinHttpFile *winhttp_file = G_WINHTTP_FILE (file);
   HINTERNET connection;
 
-  connection = G_WINHTTP_VFS_GET_CLASS (winhttp_file->vfs)->pWinHttpConnect
+  connection = G_WINHTTP_VFS_GET_CLASS (winhttp_file->vfs)->funcs->pWinHttpConnect
     (G_WINHTTP_VFS (winhttp_file->vfs)->session,
      winhttp_file->url.lpszHostName,
      winhttp_file->url.nPort,
index c36fcab..3a90374 100644 (file)
@@ -65,9 +65,9 @@ g_winhttp_file_input_stream_finalize (GObject *object)
   winhttp_stream = G_WINHTTP_FILE_INPUT_STREAM (object);
 
   if (winhttp_stream->request != NULL)
-    G_WINHTTP_VFS_GET_CLASS (winhttp_stream->file->vfs)->pWinHttpCloseHandle (winhttp_stream->request);
+    G_WINHTTP_VFS_GET_CLASS (winhttp_stream->file->vfs)->funcs->pWinHttpCloseHandle (winhttp_stream->request);
   if (winhttp_stream->connection != NULL)
-    G_WINHTTP_VFS_GET_CLASS (winhttp_stream->file->vfs)->pWinHttpCloseHandle (winhttp_stream->connection);
+    G_WINHTTP_VFS_GET_CLASS (winhttp_stream->file->vfs)->funcs->pWinHttpCloseHandle (winhttp_stream->connection);
 
   G_OBJECT_CLASS (g_winhttp_file_input_stream_parent_class)->finalize (object);
 }
@@ -125,7 +125,7 @@ g_winhttp_file_input_stream_read (GInputStream  *stream,
 
   if (!winhttp_stream->request_sent)
     {
-      if (!G_WINHTTP_VFS_GET_CLASS (winhttp_stream->file->vfs)->pWinHttpSendRequest
+      if (!G_WINHTTP_VFS_GET_CLASS (winhttp_stream->file->vfs)->funcs->pWinHttpSendRequest
           (winhttp_stream->request,
            NULL, 0,
            NULL, 0,
@@ -146,7 +146,7 @@ g_winhttp_file_input_stream_read (GInputStream  *stream,
       winhttp_stream->request_sent = TRUE;
     }
 
-  if (!G_WINHTTP_VFS_GET_CLASS (winhttp_stream->file->vfs)->pWinHttpReadData
+  if (!G_WINHTTP_VFS_GET_CLASS (winhttp_stream->file->vfs)->funcs->pWinHttpReadData
       (winhttp_stream->request, buffer, count, &bytes_read))
     {
       _g_winhttp_set_error (error, GetLastError (), "GET request");
index d283399..2d549bf 100644 (file)
@@ -64,7 +64,7 @@ g_winhttp_file_output_stream_finalize (GObject *object)
   winhttp_stream = G_WINHTTP_FILE_OUTPUT_STREAM (object);
 
   if (winhttp_stream->connection != NULL)
-    G_WINHTTP_VFS_GET_CLASS (winhttp_stream->file->vfs)->pWinHttpCloseHandle (winhttp_stream->connection);
+    G_WINHTTP_VFS_GET_CLASS (winhttp_stream->file->vfs)->funcs->pWinHttpCloseHandle (winhttp_stream->connection);
 
   G_OBJECT_CLASS (g_winhttp_file_output_stream_parent_class)->finalize (object);
 }
@@ -121,7 +121,7 @@ g_winhttp_file_output_stream_write (GOutputStream  *stream,
   wchar_t *wheaders;
   DWORD bytes_written;
 
-  request = G_WINHTTP_VFS_GET_CLASS (winhttp_stream->file->vfs)->pWinHttpOpenRequest
+  request = G_WINHTTP_VFS_GET_CLASS (winhttp_stream->file->vfs)->funcs->pWinHttpOpenRequest
     (winhttp_stream->connection,
      L"PUT",
      winhttp_stream->file->url.lpszUrlPath,
@@ -142,7 +142,7 @@ g_winhttp_file_output_stream_write (GOutputStream  *stream,
   wheaders = g_utf8_to_utf16 (headers, -1, NULL, NULL, NULL);
   g_free (headers);
 
-  if (!G_WINHTTP_VFS_GET_CLASS (winhttp_stream->file->vfs)->pWinHttpSendRequest
+  if (!G_WINHTTP_VFS_GET_CLASS (winhttp_stream->file->vfs)->funcs->pWinHttpSendRequest
       (request,
        wheaders, -1,
        NULL, 0,
@@ -151,7 +151,7 @@ g_winhttp_file_output_stream_write (GOutputStream  *stream,
     {
       _g_winhttp_set_error (error, GetLastError (), "PUT request");
 
-      G_WINHTTP_VFS_GET_CLASS (winhttp_stream->file->vfs)->pWinHttpCloseHandle (request);
+      G_WINHTTP_VFS_GET_CLASS (winhttp_stream->file->vfs)->funcs->pWinHttpCloseHandle (request);
       g_free (wheaders);
 
       return -1;
@@ -159,12 +159,12 @@ g_winhttp_file_output_stream_write (GOutputStream  *stream,
 
   g_free (wheaders);
 
-  if (!G_WINHTTP_VFS_GET_CLASS (winhttp_stream->file->vfs)->pWinHttpWriteData
+  if (!G_WINHTTP_VFS_GET_CLASS (winhttp_stream->file->vfs)->funcs->pWinHttpWriteData
       (request, buffer, count, &bytes_written))
     {
       _g_winhttp_set_error (error, GetLastError (), "PUT request");
 
-      G_WINHTTP_VFS_GET_CLASS (winhttp_stream->file->vfs)->pWinHttpCloseHandle (request);
+      G_WINHTTP_VFS_GET_CLASS (winhttp_stream->file->vfs)->funcs->pWinHttpCloseHandle (request);
 
       return -1;
     }
@@ -176,12 +176,12 @@ g_winhttp_file_output_stream_write (GOutputStream  *stream,
                             error,
                             "PUT request"))
     {
-      G_WINHTTP_VFS_GET_CLASS (winhttp_stream->file->vfs)->pWinHttpCloseHandle (request);
+      G_WINHTTP_VFS_GET_CLASS (winhttp_stream->file->vfs)->funcs->pWinHttpCloseHandle (request);
 
       return -1;
     }
 
-  G_WINHTTP_VFS_GET_CLASS (winhttp_stream->file->vfs)->pWinHttpCloseHandle (request);
+  G_WINHTTP_VFS_GET_CLASS (winhttp_stream->file->vfs)->funcs->pWinHttpCloseHandle (request);
 
   return bytes_written;
 }
index 2f7a331..3b8aa8e 100644 (file)
 
 #include "gioalias.h"
 
+static gboolean lookup_done = FALSE;
+static gboolean funcs_found = FALSE;
+static GWinHttpDllFuncs funcs;
+
+static void
+lookup_funcs (void)
+{
+  HMODULE winhttp;
+
+  if (lookup_done)
+    return;
+
+  winhttp = LoadLibrary ("winhttp.dll");
+  if (winhttp != NULL)
+    {
+      funcs.pWinHttpCloseHandle = (BOOL (WINAPI *) (HINTERNET)) GetProcAddress (winhttp, "WinHttpCloseHandle");
+      funcs.pWinHttpCrackUrl = (BOOL (WINAPI *) (LPCWSTR,DWORD,DWORD,LPURL_COMPONENTS)) GetProcAddress (winhttp, "WinHttpCrackUrl");
+      funcs.pWinHttpConnect = (HINTERNET (WINAPI *) (HINTERNET,LPCWSTR,INTERNET_PORT,DWORD)) GetProcAddress (winhttp, "WinHttpConnect");
+      funcs.pWinHttpCreateUrl = (BOOL (WINAPI *) (LPURL_COMPONENTS,DWORD,LPWSTR,LPDWORD)) GetProcAddress (winhttp, "WinHttpCreateUrl");
+      funcs.pWinHttpOpen = (HINTERNET (WINAPI *) (LPCWSTR,DWORD,LPCWSTR,LPCWSTR,DWORD)) GetProcAddress (winhttp, "WinHttpOpen");
+      funcs.pWinHttpOpenRequest = (HINTERNET (WINAPI *) (HINTERNET,LPCWSTR,LPCWSTR,LPCWSTR,LPCWSTR,LPCWSTR*,DWORD)) GetProcAddress (winhttp, "WinHttpOpenRequest");
+      funcs.pWinHttpQueryDataAvailable = (BOOL (WINAPI *) (HINTERNET,LPDWORD)) GetProcAddress (winhttp, "WinHttpQueryDataAvailable");
+      funcs.pWinHttpQueryHeaders = (BOOL (WINAPI *) (HINTERNET,DWORD,LPCWSTR,LPVOID,LPDWORD,LPDWORD)) GetProcAddress (winhttp, "WinHttpQueryHeaders");
+      funcs.pWinHttpReadData = (BOOL (WINAPI *) (HINTERNET,LPVOID,DWORD,LPDWORD)) GetProcAddress (winhttp, "WinHttpReadData");
+      funcs.pWinHttpReceiveResponse = (BOOL (WINAPI *) (HINTERNET,LPVOID)) GetProcAddress (winhttp, "WinHttpReceiveResponse");
+      funcs.pWinHttpSendRequest = (BOOL (WINAPI *) (HINTERNET,LPCWSTR,DWORD,LPVOID,DWORD,DWORD,DWORD_PTR)) GetProcAddress (winhttp, "WinHttpSendRequest");
+      funcs.pWinHttpWriteData = (BOOL (WINAPI *) (HINTERNET,LPCVOID,DWORD,LPDWORD)) GetProcAddress (winhttp, "WinHttpWriteData");
+
+      if (funcs.pWinHttpCloseHandle &&
+         funcs.pWinHttpCrackUrl &&
+         funcs.pWinHttpConnect &&
+         funcs.pWinHttpCreateUrl &&
+         funcs.pWinHttpOpen &&
+         funcs.pWinHttpOpenRequest &&
+         funcs.pWinHttpQueryDataAvailable &&
+         funcs.pWinHttpQueryHeaders &&
+         funcs.pWinHttpReadData &&
+         funcs.pWinHttpReceiveResponse &&
+         funcs.pWinHttpSendRequest &&
+         funcs.pWinHttpWriteData)
+       funcs_found = TRUE;
+    }
+  lookup_done = TRUE;
+}
+
 #define g_winhttp_vfs_get_type _g_winhttp_vfs_get_type
 G_DEFINE_TYPE_WITH_CODE (GWinHttpVfs, g_winhttp_vfs, G_TYPE_VFS,
-                         g_io_extension_point_implement (G_VFS_EXTENSION_POINT_NAME,
-                                                         g_define_type_id,
-                                                         "winhttp",
-                                                         10))
+                        {
+                          lookup_funcs ();
+                          if (funcs_found)
+                            g_io_extension_point_implement (G_VFS_EXTENSION_POINT_NAME,
+                                                            g_define_type_id,
+                                                            "winhttp",
+                                                            10);
+                        })
 
 static const gchar *winhttp_uri_schemes[] = { "http", "https" };
 
@@ -51,7 +100,7 @@ g_winhttp_vfs_finalize (GObject *object)
 
   vfs = G_WINHTTP_VFS (object);
 
-  (G_WINHTTP_VFS_GET_CLASS (vfs)->pWinHttpCloseHandle) (vfs->session);
+  (G_WINHTTP_VFS_GET_CLASS (vfs)->funcs->pWinHttpCloseHandle) (vfs->session);
   vfs->session = NULL;
 
   if (vfs->wrapped_vfs)
@@ -73,7 +122,7 @@ g_winhttp_vfs_init (GWinHttpVfs *vfs)
   if (!wagent)
     wagent = g_utf8_to_utf16 ("GWinHttpVfs", -1, NULL, NULL, NULL);
 
-  vfs->session = (G_WINHTTP_VFS_GET_CLASS (vfs)->pWinHttpOpen)
+  vfs->session = (G_WINHTTP_VFS_GET_CLASS (vfs)->funcs->pWinHttpOpen)
     (wagent,
      WINHTTP_ACCESS_TYPE_DEFAULT_PROXY,
      WINHTTP_NO_PROXY_NAME,
@@ -179,7 +228,6 @@ g_winhttp_vfs_class_init (GWinHttpVfsClass *class)
 {
   GObjectClass *object_class;
   GVfsClass *vfs_class;
-  HMODULE winhttp;
 
   object_class = (GObjectClass *) class;
 
@@ -193,22 +241,11 @@ g_winhttp_vfs_class_init (GWinHttpVfsClass *class)
   vfs_class->get_supported_uri_schemes = g_winhttp_vfs_get_supported_uri_schemes;
   vfs_class->parse_name = g_winhttp_vfs_parse_name;
 
-  winhttp = LoadLibrary ("winhttp.dll");
-  if (winhttp != NULL)
-    {
-      class->pWinHttpCloseHandle = (BOOL (WINAPI *) (HINTERNET)) GetProcAddress (winhttp, "WinHttpCloseHandle");
-      class->pWinHttpCrackUrl = (BOOL (WINAPI *) (LPCWSTR,DWORD,DWORD,LPURL_COMPONENTS)) GetProcAddress (winhttp, "WinHttpCrackUrl");
-      class->pWinHttpConnect = (HINTERNET (WINAPI *) (HINTERNET,LPCWSTR,INTERNET_PORT,DWORD)) GetProcAddress (winhttp, "WinHttpConnect");
-      class->pWinHttpCreateUrl = (BOOL (WINAPI *) (LPURL_COMPONENTS,DWORD,LPWSTR,LPDWORD)) GetProcAddress (winhttp, "WinHttpCreateUrl");
-      class->pWinHttpOpen = (HINTERNET (WINAPI *) (LPCWSTR,DWORD,LPCWSTR,LPCWSTR,DWORD)) GetProcAddress (winhttp, "WinHttpOpen");
-      class->pWinHttpOpenRequest = (HINTERNET (WINAPI *) (HINTERNET,LPCWSTR,LPCWSTR,LPCWSTR,LPCWSTR,LPCWSTR*,DWORD)) GetProcAddress (winhttp, "WinHttpOpenRequest");
-      class->pWinHttpQueryDataAvailable = (BOOL (WINAPI *) (HINTERNET,LPDWORD)) GetProcAddress (winhttp, "WinHttpQueryDataAvailable");
-      class->pWinHttpQueryHeaders = (BOOL (WINAPI *) (HINTERNET,DWORD,LPCWSTR,LPVOID,LPDWORD,LPDWORD)) GetProcAddress (winhttp, "WinHttpQueryHeaders");
-      class->pWinHttpReadData = (BOOL (WINAPI *) (HINTERNET,LPVOID,DWORD,LPDWORD)) GetProcAddress (winhttp, "WinHttpReadData");
-      class->pWinHttpReceiveResponse = (BOOL (WINAPI *) (HINTERNET,LPVOID)) GetProcAddress (winhttp, "WinHttpReceiveResponse");
-      class->pWinHttpSendRequest = (BOOL (WINAPI *) (HINTERNET,LPCWSTR,DWORD,LPVOID,DWORD,DWORD,DWORD_PTR)) GetProcAddress (winhttp, "WinHttpSendRequest");
-      class->pWinHttpWriteData = (BOOL (WINAPI *) (HINTERNET,LPCVOID,DWORD,LPDWORD)) GetProcAddress (winhttp, "WinHttpWriteData");
-    }
+  lookup_funcs ();
+  if (funcs_found)
+    class->funcs = &funcs;
+  else
+    class->funcs = NULL;
 }
 
 char *
@@ -297,7 +334,7 @@ _g_winhttp_response (GWinHttpVfs *vfs,
   wchar_t *status_code;
   DWORD status_code_len;
 
-  if (!G_WINHTTP_VFS_GET_CLASS (vfs)->pWinHttpReceiveResponse (request, NULL))
+  if (!G_WINHTTP_VFS_GET_CLASS (vfs)->funcs->pWinHttpReceiveResponse (request, NULL))
     {
       _g_winhttp_set_error (error, GetLastError (), what);
 
@@ -305,7 +342,7 @@ _g_winhttp_response (GWinHttpVfs *vfs,
     }
 
   status_code_len = 0;
-  if (!G_WINHTTP_VFS_GET_CLASS (vfs)->pWinHttpQueryHeaders
+  if (!G_WINHTTP_VFS_GET_CLASS (vfs)->funcs->pWinHttpQueryHeaders
       (request,
        WINHTTP_QUERY_STATUS_CODE,
        NULL,
@@ -321,7 +358,7 @@ _g_winhttp_response (GWinHttpVfs *vfs,
 
   status_code = g_malloc (status_code_len);
 
-  if (!G_WINHTTP_VFS_GET_CLASS (vfs)->pWinHttpQueryHeaders
+  if (!G_WINHTTP_VFS_GET_CLASS (vfs)->funcs->pWinHttpQueryHeaders
       (request,
        WINHTTP_QUERY_STATUS_CODE,
        NULL,
@@ -340,7 +377,7 @@ _g_winhttp_response (GWinHttpVfs *vfs,
       wchar_t *status_text = NULL;
       DWORD status_text_len;
 
-      if (!G_WINHTTP_VFS_GET_CLASS (vfs)->pWinHttpQueryHeaders
+      if (!G_WINHTTP_VFS_GET_CLASS (vfs)->funcs->pWinHttpQueryHeaders
           (request,
            WINHTTP_QUERY_STATUS_TEXT,
            NULL,
@@ -351,7 +388,7 @@ _g_winhttp_response (GWinHttpVfs *vfs,
         {
           status_text = g_malloc (status_text_len);
 
-          if (!G_WINHTTP_VFS_GET_CLASS (vfs)->pWinHttpQueryHeaders
+          if (!G_WINHTTP_VFS_GET_CLASS (vfs)->funcs->pWinHttpQueryHeaders
               (request,
                WINHTTP_QUERY_STATUS_TEXT,
                NULL,
@@ -388,7 +425,7 @@ _g_winhttp_query_header (GWinHttpVfs *vfs,
 {
   DWORD header_len = 0;
 
-  if (!G_WINHTTP_VFS_GET_CLASS (vfs)->pWinHttpQueryHeaders
+  if (!G_WINHTTP_VFS_GET_CLASS (vfs)->funcs->pWinHttpQueryHeaders
       (request,
        which_header,
        NULL,
@@ -403,7 +440,7 @@ _g_winhttp_query_header (GWinHttpVfs *vfs,
     }
 
   *header = g_malloc (header_len);
-  if (!G_WINHTTP_VFS_GET_CLASS (vfs)->pWinHttpQueryHeaders
+  if (!G_WINHTTP_VFS_GET_CLASS (vfs)->funcs->pWinHttpQueryHeaders
       (request,
        which_header,
        NULL,
index 787aa0b..11593ab 100644 (file)
@@ -44,6 +44,7 @@ G_BEGIN_DECLS
 #define G_WINHTTP_VFS_GET_CLASS(obj)            (G_TYPE_INSTANCE_GET_CLASS ((obj), G_TYPE_WINHTTP_VFS, GWinHttpVfsClass))
 
 typedef struct _GWinHttpVfs       GWinHttpVfs;
+typedef struct _GWinHttpDllFuncs  GWinHttpDllFuncs;
 typedef struct _GWinHttpVfsClass  GWinHttpVfsClass;
 
 struct _GWinHttpVfs
@@ -54,14 +55,8 @@ struct _GWinHttpVfs
   HINTERNET session;
 };
 
-struct _GWinHttpVfsClass
+struct _GWinHttpDllFuncs
 {
-  GVfsClass parent_class;
-
-  /* As there is no import library for winhttp.dll in mingw, we must
-   * look up the functions we need dynamically. Store the pointers
-   * here.
-   */
   BOOL (WINAPI *pWinHttpCloseHandle) (HINTERNET);
   BOOL (WINAPI *pWinHttpCrackUrl) (LPCWSTR,DWORD,DWORD,LPURL_COMPONENTS);
   HINTERNET (WINAPI *pWinHttpConnect) (HINTERNET,LPCWSTR,INTERNET_PORT,DWORD);
@@ -76,6 +71,17 @@ struct _GWinHttpVfsClass
   BOOL (WINAPI *pWinHttpWriteData) (HINTERNET,LPCVOID,DWORD,LPDWORD);
 };
 
+struct _GWinHttpVfsClass
+{
+  GVfsClass parent_class;
+
+  /* As there is no import library for winhttp.dll in mingw, and
+   * winhttp.dll isn't present on Windows 2000 anyway, we must look up
+   * the functions we need dynamically. Store the pointers here.
+   */
+  GWinHttpDllFuncs *funcs;
+};
+
 
 GType   _g_winhttp_vfs_get_type  (void) G_GNUC_CONST;