GWinHttpVfs: Link to WinHTTP using the import library
WinHTTP.DLL is present on all supported versions of Windows
diff --git a/gio/win32/gwinhttpfile.c b/gio/win32/gwinhttpfile.c
index 2e519b8..866552e 100644
--- a/gio/win32/gwinhttpfile.c
+++ b/gio/win32/gwinhttpfile.c
@@ -40,6 +40,7 @@
static void g_winhttp_file_file_iface_init (GFileIface *iface);
#define g_winhttp_file_get_type _g_winhttp_file_get_type
+
G_DEFINE_TYPE_WITH_CODE (GWinHttpFile, g_winhttp_file, G_TYPE_OBJECT,
G_IMPLEMENT_INTERFACE (G_TYPE_FILE,
g_winhttp_file_file_iface_init))
@@ -47,9 +48,7 @@
static void
g_winhttp_file_finalize (GObject *object)
{
- GWinHttpFile *file;
-
- file = G_WINHTTP_FILE (object);
+ GWinHttpFile *file = G_WINHTTP_FILE (object);
g_free (file->url.lpszScheme);
g_free (file->url.lpszHostName);
@@ -107,7 +106,7 @@
file->url.dwUrlPathLength = 1;
file->url.dwExtraInfoLength = 1;
- if (!G_WINHTTP_VFS_GET_CLASS (vfs)->funcs->pWinHttpCrackUrl (wuri, 0, 0, &file->url))
+ if (!WinHttpCrackUrl (wuri, 0, 0, &file->url))
{
g_free (wuri);
return NULL;
@@ -120,7 +119,7 @@
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)->funcs->pWinHttpCrackUrl (wuri, 0, 0, &file->url))
+ if (!WinHttpCrackUrl (wuri, 0, 0, &file->url))
{
g_free (file->url.lpszScheme);
g_free (file->url.lpszHostName);
@@ -208,13 +207,13 @@
char *retval;
len = 0;
- if (!G_WINHTTP_VFS_GET_CLASS (winhttp_file->vfs)->funcs->pWinHttpCreateUrl (&winhttp_file->url, ICU_ESCAPE, NULL, &len) &&
+ if (!WinHttpCreateUrl (&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)->funcs->pWinHttpCreateUrl (&winhttp_file->url, ICU_ESCAPE, wuri, &len))
+ if (!WinHttpCreateUrl (&winhttp_file->url, ICU_ESCAPE, wuri, &len))
{
g_free (wuri);
return NULL;
@@ -505,44 +504,36 @@
return info;
}
- 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,
- 0);
-
+ connection = WinHttpConnect (G_WINHTTP_VFS (winhttp_file->vfs)->session,
+ winhttp_file->url.lpszHostName,
+ winhttp_file->url.nPort,
+ 0);
if (connection == NULL)
{
_g_winhttp_set_error (error, GetLastError (), "HTTP connection");
-
return NULL;
}
- request = G_WINHTTP_VFS_GET_CLASS (winhttp_file->vfs)->funcs->pWinHttpOpenRequest
- (connection,
- L"HEAD",
- winhttp_file->url.lpszUrlPath,
- NULL,
- WINHTTP_NO_REFERER,
- accept_types,
- winhttp_file->url.nScheme == INTERNET_SCHEME_HTTPS ? WINHTTP_FLAG_SECURE : 0);
-
+ request = WinHttpOpenRequest (connection,
+ L"HEAD",
+ winhttp_file->url.lpszUrlPath,
+ NULL,
+ WINHTTP_NO_REFERER,
+ accept_types,
+ winhttp_file->url.nScheme == INTERNET_SCHEME_HTTPS ? WINHTTP_FLAG_SECURE : 0);
if (request == NULL)
{
_g_winhttp_set_error (error, GetLastError (), "HEAD request");
-
return NULL;
}
- if (!G_WINHTTP_VFS_GET_CLASS (winhttp_file->vfs)->funcs->pWinHttpSendRequest
- (request,
- NULL, 0,
- NULL, 0,
- 0,
- 0))
+ if (!WinHttpSendRequest (request,
+ NULL, 0,
+ NULL, 0,
+ 0,
+ 0))
{
_g_winhttp_set_error (error, GetLastError (), "HEAD request");
-
return NULL;
}
@@ -602,13 +593,12 @@
}
last_modified_len = sizeof (last_modified);
- if (G_WINHTTP_VFS_GET_CLASS (winhttp_file->vfs)->funcs->pWinHttpQueryHeaders
- (request,
- WINHTTP_QUERY_LAST_MODIFIED | WINHTTP_QUERY_FLAG_SYSTEMTIME,
- NULL,
- &last_modified,
- &last_modified_len,
- NULL) &&
+ if (WinHttpQueryHeaders (request,
+ WINHTTP_QUERY_LAST_MODIFIED | WINHTTP_QUERY_FLAG_SYSTEMTIME,
+ NULL,
+ &last_modified,
+ &last_modified_len,
+ NULL) &&
last_modified_len == sizeof (last_modified) &&
/* Don't bother comparing to the exact Y2038 moment */
last_modified.wYear >= 1970 &&
@@ -643,32 +633,26 @@
NULL,
};
- 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,
- 0);
-
+ connection = WinHttpConnect (G_WINHTTP_VFS (winhttp_file->vfs)->session,
+ winhttp_file->url.lpszHostName,
+ winhttp_file->url.nPort,
+ 0);
if (connection == NULL)
{
_g_winhttp_set_error (error, GetLastError (), "HTTP connection");
-
return NULL;
}
- request = G_WINHTTP_VFS_GET_CLASS (winhttp_file->vfs)->funcs->pWinHttpOpenRequest
- (connection,
- L"GET",
- winhttp_file->url.lpszUrlPath,
- NULL,
- WINHTTP_NO_REFERER,
- accept_types,
- winhttp_file->url.nScheme == INTERNET_SCHEME_HTTPS ? WINHTTP_FLAG_SECURE : 0);
-
+ request = WinHttpOpenRequest (connection,
+ L"GET",
+ winhttp_file->url.lpszUrlPath,
+ NULL,
+ WINHTTP_NO_REFERER,
+ accept_types,
+ winhttp_file->url.nScheme == INTERNET_SCHEME_HTTPS ? WINHTTP_FLAG_SECURE : 0);
if (request == NULL)
{
_g_winhttp_set_error (error, GetLastError (), "GET request");
-
return NULL;
}
@@ -684,16 +668,13 @@
GWinHttpFile *winhttp_file = G_WINHTTP_FILE (file);
HINTERNET connection;
- 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,
- 0);
-
+ connection = WinHttpConnect (G_WINHTTP_VFS (winhttp_file->vfs)->session,
+ winhttp_file->url.lpszHostName,
+ winhttp_file->url.nPort,
+ 0);
if (connection == NULL)
{
_g_winhttp_set_error (error, GetLastError (), "HTTP connection");
-
return NULL;
}
diff --git a/gio/win32/gwinhttpfileinputstream.c b/gio/win32/gwinhttpfileinputstream.c
index 871274e..116e7e5 100644
--- a/gio/win32/gwinhttpfileinputstream.c
+++ b/gio/win32/gwinhttpfileinputstream.c
@@ -45,6 +45,7 @@
};
#define g_winhttp_file_input_stream_get_type _g_winhttp_file_input_stream_get_type
+
G_DEFINE_TYPE (GWinHttpFileInputStream, g_winhttp_file_input_stream, G_TYPE_FILE_INPUT_STREAM)
static gssize g_winhttp_file_input_stream_read (GInputStream *stream,
@@ -65,12 +66,11 @@
winhttp_stream = G_WINHTTP_FILE_INPUT_STREAM (object);
if (winhttp_stream->request != NULL)
- G_WINHTTP_VFS_GET_CLASS (winhttp_stream->file->vfs)->funcs->pWinHttpCloseHandle (winhttp_stream->request);
+ WinHttpCloseHandle (winhttp_stream->request);
if (winhttp_stream->connection != NULL)
- G_WINHTTP_VFS_GET_CLASS (winhttp_stream->file->vfs)->funcs->pWinHttpCloseHandle (winhttp_stream->connection);
+ WinHttpCloseHandle (winhttp_stream->connection);
- g_object_unref (winhttp_stream->file);
- winhttp_stream->file = NULL;
+ g_clear_object (&winhttp_stream->file);
G_OBJECT_CLASS (g_winhttp_file_input_stream_parent_class)->finalize (object);
}
@@ -129,15 +129,13 @@
if (!winhttp_stream->request_sent)
{
- if (!G_WINHTTP_VFS_GET_CLASS (winhttp_stream->file->vfs)->funcs->pWinHttpSendRequest
- (winhttp_stream->request,
- NULL, 0,
- NULL, 0,
- 0,
- 0))
+ if (!WinHttpSendRequest (winhttp_stream->request,
+ NULL, 0,
+ NULL, 0,
+ 0,
+ 0))
{
_g_winhttp_set_error (error, GetLastError (), "GET request");
-
return -1;
}
@@ -150,11 +148,9 @@
winhttp_stream->request_sent = TRUE;
}
- if (!G_WINHTTP_VFS_GET_CLASS (winhttp_stream->file->vfs)->funcs->pWinHttpReadData
- (winhttp_stream->request, buffer, count, &bytes_read))
+ if (!WinHttpReadData (winhttp_stream->request, buffer, count, &bytes_read))
{
_g_winhttp_set_error (error, GetLastError (), "GET request");
-
return -1;
}
@@ -169,7 +165,10 @@
GWinHttpFileInputStream *winhttp_stream = G_WINHTTP_FILE_INPUT_STREAM (stream);
if (winhttp_stream->connection != NULL)
- G_WINHTTP_VFS_GET_CLASS (winhttp_stream->file->vfs)->funcs->pWinHttpCloseHandle (winhttp_stream->connection);
- winhttp_stream->connection = NULL;
+ {
+ WinHttpCloseHandle (winhttp_stream->connection);
+ winhttp_stream->connection = NULL;
+ }
+
return TRUE;
}
diff --git a/gio/win32/gwinhttpfileoutputstream.c b/gio/win32/gwinhttpfileoutputstream.c
index f54f86c..2956473 100644
--- a/gio/win32/gwinhttpfileoutputstream.c
+++ b/gio/win32/gwinhttpfileoutputstream.c
@@ -44,6 +44,7 @@
};
#define g_winhttp_file_output_stream_get_type _g_winhttp_file_output_stream_get_type
+
G_DEFINE_TYPE (GWinHttpFileOutputStream, g_winhttp_file_output_stream, G_TYPE_FILE_OUTPUT_STREAM)
static gssize g_winhttp_file_output_stream_write (GOutputStream *stream,
@@ -60,7 +61,7 @@
winhttp_stream = G_WINHTTP_FILE_OUTPUT_STREAM (object);
if (winhttp_stream->connection != NULL)
- G_WINHTTP_VFS_GET_CLASS (winhttp_stream->file->vfs)->funcs->pWinHttpCloseHandle (winhttp_stream->connection);
+ WinHttpCloseHandle (winhttp_stream->connection);
G_OBJECT_CLASS (g_winhttp_file_output_stream_parent_class)->finalize (object);
}
@@ -117,19 +118,16 @@
wchar_t *wheaders;
DWORD bytes_written;
- request = G_WINHTTP_VFS_GET_CLASS (winhttp_stream->file->vfs)->funcs->pWinHttpOpenRequest
- (winhttp_stream->connection,
- L"PUT",
- winhttp_stream->file->url.lpszUrlPath,
- NULL,
- WINHTTP_NO_REFERER,
- NULL,
- winhttp_stream->file->url.nScheme == INTERNET_SCHEME_HTTPS ? WINHTTP_FLAG_SECURE : 0);
-
+ request = WinHttpOpenRequest (winhttp_stream->connection,
+ L"PUT",
+ winhttp_stream->file->url.lpszUrlPath,
+ NULL,
+ WINHTTP_NO_REFERER,
+ NULL,
+ winhttp_stream->file->url.nScheme == INTERNET_SCHEME_HTTPS ? WINHTTP_FLAG_SECURE : 0);
if (request == NULL)
{
_g_winhttp_set_error (error, GetLastError (), "PUT request");
-
return -1;
}
@@ -138,16 +136,15 @@
wheaders = g_utf8_to_utf16 (headers, -1, NULL, NULL, NULL);
g_free (headers);
- if (!G_WINHTTP_VFS_GET_CLASS (winhttp_stream->file->vfs)->funcs->pWinHttpSendRequest
- (request,
- wheaders, -1,
- NULL, 0,
- count,
- 0))
+ if (!WinHttpSendRequest (request,
+ wheaders, -1,
+ NULL, 0,
+ count,
+ 0))
{
_g_winhttp_set_error (error, GetLastError (), "PUT request");
- G_WINHTTP_VFS_GET_CLASS (winhttp_stream->file->vfs)->funcs->pWinHttpCloseHandle (request);
+ WinHttpCloseHandle (request);
g_free (wheaders);
return -1;
@@ -155,12 +152,11 @@
g_free (wheaders);
- if (!G_WINHTTP_VFS_GET_CLASS (winhttp_stream->file->vfs)->funcs->pWinHttpWriteData
- (request, buffer, count, &bytes_written))
+ if (!WinHttpWriteData (request, buffer, count, &bytes_written))
{
_g_winhttp_set_error (error, GetLastError (), "PUT request");
- G_WINHTTP_VFS_GET_CLASS (winhttp_stream->file->vfs)->funcs->pWinHttpCloseHandle (request);
+ WinHttpCloseHandle (request);
return -1;
}
@@ -172,12 +168,12 @@
error,
"PUT request"))
{
- G_WINHTTP_VFS_GET_CLASS (winhttp_stream->file->vfs)->funcs->pWinHttpCloseHandle (request);
+ WinHttpCloseHandle (request);
return -1;
}
- G_WINHTTP_VFS_GET_CLASS (winhttp_stream->file->vfs)->funcs->pWinHttpCloseHandle (request);
+ WinHttpCloseHandle (request);
return bytes_written;
}
diff --git a/gio/win32/gwinhttpvfs.c b/gio/win32/gwinhttpvfs.c
index 4d5f514..5bceb74 100644
--- a/gio/win32/gwinhttpvfs.c
+++ b/gio/win32/gwinhttpvfs.c
@@ -26,94 +26,33 @@
#include "gio/gioerror.h"
#include "gio/giomodule.h"
+#include "gio/giomodule-priv.h"
#include "gio/gvfs.h"
#include "gwinhttpfile.h"
#include "gwinhttpvfs.h"
-static gboolean lookup_done = FALSE;
-static gboolean funcs_found = FALSE;
-static GWinHttpDllFuncs funcs;
-
-static void
-lookup_funcs (void)
-{
- HMODULE winhttp = NULL;
- WCHAR winhttp_dll[MAX_PATH + 100];
- int n;
-
- if (lookup_done)
- return;
-
- n = GetSystemDirectoryW (winhttp_dll, MAX_PATH);
- if (n > 0 && n < MAX_PATH)
- {
- if (winhttp_dll[n-1] != L'\\' &&
- winhttp_dll[n-1] != L'/')
- wcscat (winhttp_dll, L"\\");
- wcscat (winhttp_dll, L"winhttp.dll");
- winhttp = LoadLibraryW (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,
- {
- lookup_funcs ();
- if (funcs_found)
- g_io_extension_point_implement (G_VFS_EXTENSION_POINT_NAME,
- g_define_type_id,
- "winhttp",
- 10);
- })
+ _g_io_modules_ensure_extension_points_registered ();
+ g_io_extension_point_implement (G_VFS_EXTENSION_POINT_NAME,
+ g_define_type_id,
+ "winhttp",
+ 10);)
static const gchar *winhttp_uri_schemes[] = { "http", "https" };
static void
g_winhttp_vfs_finalize (GObject *object)
{
- GWinHttpVfs *vfs;
+ GWinHttpVfs *vfs = G_WINHTTP_VFS (object);
- vfs = G_WINHTTP_VFS (object);
+ g_clear_object (&vfs->wrapped_vfs);
- (G_WINHTTP_VFS_GET_CLASS (vfs)->funcs->pWinHttpCloseHandle) (vfs->session);
+ WinHttpCloseHandle (vfs->session);
vfs->session = NULL;
- if (vfs->wrapped_vfs)
- g_object_unref (vfs->wrapped_vfs);
- vfs->wrapped_vfs = NULL;
-
G_OBJECT_CLASS (g_winhttp_vfs_parent_class)->finalize (object);
}
@@ -130,12 +69,11 @@
else
wagent = g_utf8_to_utf16 ("GWinHttpVfs", -1, NULL, NULL, NULL);
- vfs->session = (G_WINHTTP_VFS_GET_CLASS (vfs)->funcs->pWinHttpOpen)
- (wagent,
- WINHTTP_ACCESS_TYPE_DEFAULT_PROXY,
- WINHTTP_NO_PROXY_NAME,
- WINHTTP_NO_PROXY_BYPASS,
- 0);
+ vfs->session = WinHttpOpen (wagent,
+ WINHTTP_ACCESS_TYPE_DEFAULT_PROXY,
+ WINHTTP_NO_PROXY_NAME,
+ WINHTTP_NO_PROXY_BYPASS,
+ 0);
g_free (wagent);
}
@@ -260,12 +198,6 @@
vfs_class->get_file_for_uri = g_winhttp_vfs_get_file_for_uri;
vfs_class->get_supported_uri_schemes = g_winhttp_vfs_get_supported_uri_schemes;
vfs_class->parse_name = g_winhttp_vfs_parse_name;
-
- lookup_funcs ();
- if (funcs_found)
- class->funcs = &funcs;
- else
- class->funcs = NULL;
}
char *
@@ -354,41 +286,36 @@
wchar_t *status_code;
DWORD status_code_len;
- if (!G_WINHTTP_VFS_GET_CLASS (vfs)->funcs->pWinHttpReceiveResponse (request, NULL))
+ if (!WinHttpReceiveResponse (request, NULL))
{
_g_winhttp_set_error (error, GetLastError (), what);
-
return FALSE;
}
status_code_len = 0;
- if (!G_WINHTTP_VFS_GET_CLASS (vfs)->funcs->pWinHttpQueryHeaders
- (request,
- WINHTTP_QUERY_STATUS_CODE,
- NULL,
- NULL,
- &status_code_len,
- NULL) &&
+ if (!WinHttpQueryHeaders (request,
+ WINHTTP_QUERY_STATUS_CODE,
+ NULL,
+ NULL,
+ &status_code_len,
+ NULL) &&
GetLastError () != ERROR_INSUFFICIENT_BUFFER)
{
_g_winhttp_set_error (error, GetLastError (), what);
-
return FALSE;
}
status_code = g_malloc (status_code_len);
- if (!G_WINHTTP_VFS_GET_CLASS (vfs)->funcs->pWinHttpQueryHeaders
- (request,
- WINHTTP_QUERY_STATUS_CODE,
- NULL,
- status_code,
- &status_code_len,
- NULL))
+ if (!WinHttpQueryHeaders (request,
+ WINHTTP_QUERY_STATUS_CODE,
+ NULL,
+ status_code,
+ &status_code_len,
+ NULL))
{
_g_winhttp_set_error (error, GetLastError (), what);
g_free (status_code);
-
return FALSE;
}
@@ -397,24 +324,22 @@
wchar_t *status_text = NULL;
DWORD status_text_len;
- if (!G_WINHTTP_VFS_GET_CLASS (vfs)->funcs->pWinHttpQueryHeaders
- (request,
- WINHTTP_QUERY_STATUS_TEXT,
- NULL,
- NULL,
- &status_text_len,
- NULL) &&
+ if (!WinHttpQueryHeaders (request,
+ WINHTTP_QUERY_STATUS_TEXT,
+ NULL,
+ NULL,
+ &status_text_len,
+ NULL) &&
GetLastError () == ERROR_INSUFFICIENT_BUFFER)
{
status_text = g_malloc (status_text_len);
- if (!G_WINHTTP_VFS_GET_CLASS (vfs)->funcs->pWinHttpQueryHeaders
- (request,
- WINHTTP_QUERY_STATUS_TEXT,
- NULL,
- status_text,
- &status_text_len,
- NULL))
+ if (!WinHttpQueryHeaders (request,
+ WINHTTP_QUERY_STATUS_TEXT,
+ NULL,
+ status_text,
+ &status_text_len,
+ NULL))
{
g_free (status_text);
status_text = NULL;
@@ -424,6 +349,7 @@
g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
"%s failed: %S %S",
what, status_code, status_text ? status_text : L"");
+
g_free (status_code);
g_free (status_text);
@@ -445,33 +371,28 @@
{
DWORD header_len = 0;
- if (!G_WINHTTP_VFS_GET_CLASS (vfs)->funcs->pWinHttpQueryHeaders
- (request,
- which_header,
- NULL,
- NULL,
- &header_len,
- NULL) &&
+ if (!WinHttpQueryHeaders (request,
+ which_header,
+ NULL,
+ NULL,
+ &header_len,
+ NULL) &&
GetLastError () != ERROR_INSUFFICIENT_BUFFER)
{
_g_winhttp_set_error (error, GetLastError (), request_description);
-
return FALSE;
}
*header = g_malloc (header_len);
- if (!G_WINHTTP_VFS_GET_CLASS (vfs)->funcs->pWinHttpQueryHeaders
- (request,
- which_header,
- NULL,
- *header,
- &header_len,
- NULL))
+ if (!WinHttpQueryHeaders (request,
+ which_header,
+ NULL,
+ *header,
+ &header_len,
+ NULL))
{
_g_winhttp_set_error (error, GetLastError (), request_description);
- g_free (*header);
- *header = NULL;
-
+ g_clear_pointer (header, g_free);
return FALSE;
}
diff --git a/gio/win32/gwinhttpvfs.h b/gio/win32/gwinhttpvfs.h
index 64c77ae..8830362 100644
--- a/gio/win32/gwinhttpvfs.h
+++ b/gio/win32/gwinhttpvfs.h
@@ -2,6 +2,7 @@
*
* Copyright (C) 2006-2007 Red Hat, Inc.
* Copyright (C) 2008 Novell, Inc.
+ * Copyright (C) 2024 Luca Bacci
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -39,7 +40,6 @@
#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
@@ -50,31 +50,9 @@
HINTERNET session;
};
-struct _GWinHttpDllFuncs
-{
- BOOL (WINAPI *pWinHttpCloseHandle) (HINTERNET);
- BOOL (WINAPI *pWinHttpCrackUrl) (LPCWSTR,DWORD,DWORD,LPURL_COMPONENTS);
- HINTERNET (WINAPI *pWinHttpConnect) (HINTERNET,LPCWSTR,INTERNET_PORT,DWORD);
- BOOL (WINAPI *pWinHttpCreateUrl) (LPURL_COMPONENTS,DWORD,LPWSTR,LPDWORD);
- HINTERNET (WINAPI *pWinHttpOpen) (LPCWSTR,DWORD,LPCWSTR,LPCWSTR,DWORD);
- HINTERNET (WINAPI *pWinHttpOpenRequest) (HINTERNET,LPCWSTR,LPCWSTR,LPCWSTR,LPCWSTR,LPCWSTR*,DWORD);
- BOOL (WINAPI *pWinHttpQueryDataAvailable) (HINTERNET,LPDWORD);
- BOOL (WINAPI *pWinHttpQueryHeaders) (HINTERNET,DWORD,LPCWSTR,LPVOID,LPDWORD,LPDWORD);
- BOOL (WINAPI *pWinHttpReadData) (HINTERNET,LPVOID,DWORD,LPDWORD);
- BOOL (WINAPI *pWinHttpReceiveResponse) (HINTERNET,LPVOID);
- BOOL (WINAPI *pWinHttpSendRequest) (HINTERNET,LPCWSTR,DWORD,LPVOID,DWORD,DWORD,DWORD_PTR);
- 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;
};
diff --git a/gio/win32/meson.build b/gio/win32/meson.build
index 6699f10..ea348cd 100644
--- a/gio/win32/meson.build
+++ b/gio/win32/meson.build
@@ -15,6 +15,7 @@
gioenumtypes_dep,
libglib_dep,
gmodule_inc_dep,
+ winhttp,
],
gnu_symbol_visibility : 'hidden',
pic : true,
diff --git a/meson.build b/meson.build
index de82c00..eecf768 100644
--- a/meson.build
+++ b/meson.build
@@ -2326,8 +2326,10 @@
if host_system == 'windows'
winsock2 = cc.find_library('ws2_32')
+ winhttp = cc.find_library('winhttp')
else
winsock2 = not_found
+ winhttp = not_found
endif
selinux_dep = []