Wine-Devel
Threads by month
- ----- 2026 -----
- June
- May
- April
- March
- February
- January
- ----- 2025 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2011 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2010 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2009 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2008 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2007 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2006 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2005 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2004 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2003 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2002 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2001 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- 7 participants
- 84546 discussions
Feb. 9, 2022
Signed-off-by: Alistair Leslie-Hughes <leslie_alistair(a)hotmail.com>
---
dlls/xolehlp/Makefile.in | 1 -
dlls/xolehlp/xolehlp.c | 34 +++++++++++++++++-----------------
2 files changed, 17 insertions(+), 18 deletions(-)
diff --git a/dlls/xolehlp/Makefile.in b/dlls/xolehlp/Makefile.in
index c2bebe884fe..f39cd90f0b9 100644
--- a/dlls/xolehlp/Makefile.in
+++ b/dlls/xolehlp/Makefile.in
@@ -1,4 +1,3 @@
-EXTRADEFS = -DWINE_NO_LONG_TYPES
MODULE = xolehlp.dll
IMPORTS = uuid
diff --git a/dlls/xolehlp/xolehlp.c b/dlls/xolehlp/xolehlp.c
index d3355c1c34e..e61f4b35fc8 100644
--- a/dlls/xolehlp/xolehlp.c
+++ b/dlls/xolehlp/xolehlp.c
@@ -68,7 +68,7 @@ static ULONG WINAPI ResourceManager_AddRef(IResourceManager *iface)
ResourceManager *This = impl_from_IResourceManager(iface);
ULONG ref = InterlockedIncrement(&This->ref);
- TRACE("(%p) refcount=%u\n", iface, ref);
+ TRACE("(%p) refcount=%lu\n", iface, ref);
return ref;
}
@@ -78,7 +78,7 @@ static ULONG WINAPI ResourceManager_Release(IResourceManager *iface)
ResourceManager *This = impl_from_IResourceManager(iface);
ULONG ref = InterlockedDecrement(&This->ref);
- TRACE("(%p) refcount=%u\n", iface, ref);
+ TRACE("(%p) refcount=%lu\n", iface, ref);
if (ref == 0)
{
@@ -98,7 +98,7 @@ static HRESULT WINAPI ResourceManager_Enlist(IResourceManager *iface,
static HRESULT WINAPI ResourceManager_Reenlist(IResourceManager *iface,
byte *pPrepInfo,ULONG cbPrepInfo,DWORD lTimeout,XACTSTAT *pXactStat)
{
- FIXME("(%p, %p, %u, %u, %p): stub\n", iface, pPrepInfo, cbPrepInfo, lTimeout, pXactStat);
+ FIXME("(%p, %p, %lu, %lu, %p): stub\n", iface, pPrepInfo, cbPrepInfo, lTimeout, pXactStat);
return E_NOTIMPL;
}
static HRESULT WINAPI ResourceManager_ReenlistmentComplete(IResourceManager *iface)
@@ -186,7 +186,7 @@ static ULONG WINAPI TransactionOptions_AddRef(ITransactionOptions *iface)
TransactionOptions *This = impl_from_ITransactionOptions(iface);
ULONG ref = InterlockedIncrement(&This->ref);
- TRACE("(%p) refcount=%u\n", iface, ref);
+ TRACE("(%p) refcount=%lu\n", iface, ref);
return ref;
}
@@ -196,7 +196,7 @@ static ULONG WINAPI TransactionOptions_Release(ITransactionOptions *iface)
TransactionOptions *This = impl_from_ITransactionOptions(iface);
ULONG ref = InterlockedDecrement(&This->ref);
- TRACE("(%p) refcount=%u\n", iface, ref);
+ TRACE("(%p) refcount=%lu\n", iface, ref);
if (ref == 0)
{
@@ -211,7 +211,7 @@ static HRESULT WINAPI TransactionOptions_SetOptions(ITransactionOptions *iface,
TransactionOptions *This = impl_from_ITransactionOptions(iface);
if (!pOptions) return E_INVALIDARG;
- TRACE("(%p, %u, %s)\n", iface, pOptions->ulTimeout, debugstr_a(pOptions->szDescription));
+ TRACE("(%p, %lu, %s)\n", iface, pOptions->ulTimeout, debugstr_a(pOptions->szDescription));
This->opts = *pOptions;
return S_OK;
}
@@ -295,7 +295,7 @@ static ULONG WINAPI Transaction_AddRef(ITransaction *iface)
Transaction *This = impl_from_ITransaction(iface);
ULONG ref = InterlockedIncrement(&This->ref);
- TRACE("(%p) refcount=%u\n", iface, ref);
+ TRACE("(%p) refcount=%lu\n", iface, ref);
return ref;
}
@@ -305,7 +305,7 @@ static ULONG WINAPI Transaction_Release(ITransaction *iface)
Transaction *This = impl_from_ITransaction(iface);
ULONG ref = InterlockedDecrement(&This->ref);
- TRACE("(%p) refcount=%u\n", iface, ref);
+ TRACE("(%p) refcount=%lu\n", iface, ref);
if (ref == 0)
{
@@ -317,7 +317,7 @@ static ULONG WINAPI Transaction_Release(ITransaction *iface)
static HRESULT WINAPI Transaction_Commit(ITransaction *iface,
BOOL fRetaining, DWORD grfTC, DWORD grfRM)
{
- FIXME("(%p, %d, %08x, %08x): stub\n", iface, fRetaining, grfTC, grfRM);
+ FIXME("(%p, %d, %08lx, %08lx): stub\n", iface, fRetaining, grfTC, grfRM);
return E_NOTIMPL;
}
static HRESULT WINAPI Transaction_Abort(ITransaction *iface,
@@ -425,7 +425,7 @@ static ULONG WINAPI TransactionDispenser_AddRef(ITransactionDispenser *iface)
TransactionManager *This = impl_from_ITransactionDispenser(iface);
ULONG ref = InterlockedIncrement(&This->ref);
- TRACE("(%p) refcount=%u\n", iface, ref);
+ TRACE("(%p) refcount=%lu\n", iface, ref);
return ref;
}
@@ -435,7 +435,7 @@ static ULONG WINAPI TransactionDispenser_Release(ITransactionDispenser *iface)
TransactionManager *This = impl_from_ITransactionDispenser(iface);
ULONG ref = InterlockedDecrement(&This->ref);
- TRACE("(%p) refcount=%u\n", iface, ref);
+ TRACE("(%p) refcount=%lu\n", iface, ref);
if (ref == 0)
{
@@ -460,7 +460,7 @@ static HRESULT WINAPI TransactionDispenser_BeginTransaction(ITransactionDispense
ITransactionOptions *pOptions,
ITransaction **ppTransaction)
{
- FIXME("(%p, %p, %08x, %08x, %p, %p): semi-stub\n", iface, punkOuter,
+ FIXME("(%p, %p, %08lx, %08lx, %p, %p): semi-stub\n", iface, punkOuter,
isoLevel, isoFlags, pOptions, ppTransaction);
if (!ppTransaction) return E_INVALIDARG;
@@ -556,7 +556,7 @@ static HRESULT WINAPI TransactionImportWhereabouts_GetWhereaboutsSize(ITransacti
static HRESULT WINAPI TransactionImportWhereabouts_GetWhereabouts(ITransactionImportWhereabouts *iface,
ULONG cbWhereabouts, BYTE *rgbWhereabouts,ULONG *pcbUsed)
{
- FIXME("(%p, %u, %p, %p): stub returning fake value\n", iface, cbWhereabouts, rgbWhereabouts, pcbUsed);
+ FIXME("(%p, %lu, %p, %p): stub returning fake value\n", iface, cbWhereabouts, rgbWhereabouts, pcbUsed);
if (!rgbWhereabouts || !pcbUsed) return E_INVALIDARG;
*rgbWhereabouts = 0;
@@ -597,7 +597,7 @@ static ULONG WINAPI TransactionImport_Release(ITransactionImport *iface)
static HRESULT WINAPI TransactionImport_Import(ITransactionImport *iface,
ULONG cbTransactionCookie, byte *rgbTransactionCookie, IID *piid, void **ppvTransaction)
{
- FIXME("(%p, %u, %p, %s, %p): stub\n", iface, cbTransactionCookie, rgbTransactionCookie, debugstr_guid(piid), ppvTransaction);
+ FIXME("(%p, %lu, %p, %s, %p): stub\n", iface, cbTransactionCookie, rgbTransactionCookie, debugstr_guid(piid), ppvTransaction);
if (!rgbTransactionCookie || !piid || !ppvTransaction) return E_INVALIDARG;
return E_NOTIMPL;
@@ -653,7 +653,7 @@ static BOOL is_local_machineW( const WCHAR *server )
HRESULT CDECL DtcGetTransactionManager(char *host, char *tm_name, REFIID riid,
DWORD dwReserved1, WORD wcbReserved2, void *pvReserved2, void **ppv)
{
- TRACE("(%s, %s, %s, %d, %d, %p, %p)\n", debugstr_a(host), debugstr_a(tm_name),
+ TRACE("(%s, %s, %s, %ld, %d, %p, %p)\n", debugstr_a(host), debugstr_a(tm_name),
debugstr_guid(riid), dwReserved1, wcbReserved2, pvReserved2, ppv);
if (!is_local_machineA(host))
@@ -667,7 +667,7 @@ HRESULT CDECL DtcGetTransactionManager(char *host, char *tm_name, REFIID riid,
HRESULT CDECL DtcGetTransactionManagerExA(CHAR *host, CHAR *tm_name, REFIID riid,
DWORD options, void *config, void **ppv)
{
- TRACE("(%s, %s, %s, %d, %p, %p)\n", debugstr_a(host), debugstr_a(tm_name),
+ TRACE("(%s, %s, %s, %ld, %p, %p)\n", debugstr_a(host), debugstr_a(tm_name),
debugstr_guid(riid), options, config, ppv);
if (!is_local_machineA(host))
@@ -681,7 +681,7 @@ HRESULT CDECL DtcGetTransactionManagerExA(CHAR *host, CHAR *tm_name, REFIID riid
HRESULT CDECL DtcGetTransactionManagerExW(WCHAR *host, WCHAR *tm_name, REFIID riid,
DWORD options, void *config, void **ppv)
{
- TRACE("(%s, %s, %s, %d, %p, %p)\n", debugstr_w(host), debugstr_w(tm_name),
+ TRACE("(%s, %s, %s, %ld, %p, %p)\n", debugstr_w(host), debugstr_w(tm_name),
debugstr_guid(riid), options, config, ppv);
if (!is_local_machineW(host))
--
2.34.1
1
0
Signed-off-by: Zebediah Figura <zfigura(a)codeweavers.com>
---
dlls/qasf/Makefile.in | 1 -
dlls/qasf/dmowrapper.c | 16 ++++++++--------
2 files changed, 8 insertions(+), 9 deletions(-)
diff --git a/dlls/qasf/Makefile.in b/dlls/qasf/Makefile.in
index d82abfeea7d..ee8fd0451e1 100644
--- a/dlls/qasf/Makefile.in
+++ b/dlls/qasf/Makefile.in
@@ -1,4 +1,3 @@
-EXTRADEFS = -DWINE_NO_LONG_TYPES
MODULE = qasf.dll
IMPORTS = strmbase dmoguids strmiids uuid ole32 oleaut32
diff --git a/dlls/qasf/dmowrapper.c b/dlls/qasf/dmowrapper.c
index 54581b48bee..95e12e860ae 100644
--- a/dlls/qasf/dmowrapper.c
+++ b/dlls/qasf/dmowrapper.c
@@ -86,7 +86,7 @@ static HRESULT WINAPI buffer_SetLength(IMediaBuffer *iface, DWORD len)
{
struct buffer *buffer = impl_from_IMediaBuffer(iface);
- TRACE("iface %p, len %u.\n", iface, len);
+ TRACE("iface %p, len %lu.\n", iface, len);
return IMediaSample_SetActualDataLength(buffer->sample, len);
}
@@ -216,7 +216,7 @@ static HRESULT process_output(struct dmo_wrapper *filter, IMediaObject *dmo)
if (FAILED(hr = IMemAllocator_GetBuffer(filter->sources[i].pin.pAllocator,
&filter->sources[i].buffer.sample, NULL, NULL, 0)))
{
- ERR("Failed to get sample, hr %#x.\n", hr);
+ ERR("Failed to get sample, hr %#lx.\n", hr);
goto out;
}
buffers[i].pBuffer = &filter->sources[i].buffer.IMediaBuffer_iface;
@@ -263,7 +263,7 @@ static HRESULT process_output(struct dmo_wrapper *filter, IMediaObject *dmo)
{
if (FAILED(hr = IMemInputPin_Receive(filter->sources[i].pin.pMemInputPin, sample)))
{
- WARN("Downstream sink returned %#x.\n", hr);
+ WARN("Downstream sink returned %#lx.\n", hr);
goto out;
}
IMediaSample_SetActualDataLength(sample, 0);
@@ -300,7 +300,7 @@ static HRESULT WINAPI dmo_wrapper_sink_Receive(struct strmbase_sink *iface, IMed
{
if (FAILED(hr = IMediaObject_Discontinuity(dmo, index)))
{
- ERR("Discontinuity() failed, hr %#x.\n", hr);
+ ERR("Discontinuity() failed, hr %#lx.\n", hr);
goto out;
}
@@ -324,7 +324,7 @@ static HRESULT WINAPI dmo_wrapper_sink_Receive(struct strmbase_sink *iface, IMed
if (FAILED(hr = IMediaObject_ProcessInput(dmo, index,
&filter->input_buffer.IMediaBuffer_iface, flags, start, stop - start)))
{
- ERR("ProcessInput() failed, hr %#x.\n", hr);
+ ERR("ProcessInput() failed, hr %#lx.\n", hr);
goto out;
}
@@ -346,11 +346,11 @@ static HRESULT dmo_wrapper_sink_eos(struct strmbase_sink *iface)
IUnknown_QueryInterface(filter->dmo, &IID_IMediaObject, (void **)&dmo);
if (FAILED(hr = IMediaObject_Discontinuity(dmo, index)))
- ERR("Discontinuity() failed, hr %#x.\n", hr);
+ ERR("Discontinuity() failed, hr %#lx.\n", hr);
process_output(filter, dmo);
if (FAILED(hr = IMediaObject_Flush(dmo)))
- ERR("Flush() failed, hr %#x.\n", hr);
+ ERR("Flush() failed, hr %#lx.\n", hr);
for (i = 0; i < filter->source_count; ++i)
{
@@ -372,7 +372,7 @@ static HRESULT dmo_wrapper_end_flush(struct strmbase_sink *iface)
IUnknown_QueryInterface(filter->dmo, &IID_IMediaObject, (void **)&dmo);
if (FAILED(hr = IMediaObject_Flush(dmo)))
- ERR("Flush() failed, hr %#x.\n", hr);
+ ERR("Flush() failed, hr %#lx.\n", hr);
for (i = 0; i < filter->source_count; ++i)
{
--
2.34.1
2
4
[PATCH] winex11.drv: Change fullscreen state even when processing events.
by Esme Povirk Feb. 9, 2022
by Esme Povirk Feb. 9, 2022
Feb. 9, 2022
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=52532
Signed-off-by: Esme Povirk <esme(a)codeweavers.com>
---
dlls/winex11.drv/window.c | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/dlls/winex11.drv/window.c b/dlls/winex11.drv/window.c
index 36fb41ac710..7e5b17288bf 100644
--- a/dlls/winex11.drv/window.c
+++ b/dlls/winex11.drv/window.c
@@ -2536,7 +2536,10 @@ void CDECL X11DRV_WindowPosChanged( HWND hwnd, HWND insert_after, UINT swp_flags
else
{
if (swp_flags & (SWP_FRAMECHANGED|SWP_STATECHANGED)) set_wm_hints( data );
- if (!event_type) update_net_wm_states( data );
+ if (!event_type ||
+ (!(swp_flags & (SWP_NOMOVE|SWP_NOSIZE)) &&
+ (is_window_rect_full_screen( &old_whole_rect ) != is_window_rect_full_screen( &data->whole_rect ))))
+ update_net_wm_states( data );
}
}
--
2.30.2
2
1
[RFC PATCH v5 0/5] Fix sock_recv reordering issue (#52401): unknown_status + wineserver call approach
by Jinoh Kang Feb. 9, 2022
by Jinoh Kang Feb. 9, 2022
Feb. 9, 2022
<preamble>
This is my forth attempt to tackle the issue #52401 [1]: "Improper
synchronization in sock_recv/sock_send leads to arbitrary reordering of
completion of I/O requests", which was initially reported (outside Bugzilla)
by Dongwan Kim [2].
Basically, the old process of sock_recv is:
1. Perform the I/O synchronously.
2. Report the result back to the server,
or queue up the request in the server.
3. If blocking, wait for I/O to complete.
The new process of sock_recv would be:
1. Queue up the request in the server.
2. Perform the I/O synchronously.
3. Report the result back to the server,
4. If blocking, wait for I/O to complete.
Everything except the actual I/O requires communicating with wineserver.
My goal here is to fix the issue without introducing extra calls to wineserver.
(However, if it turns out that this goal is not of utmost significance, then
this patch serie can be easily modified so that it issues separate server
calls.)
The previous approaches are listed here:
- Add a new select type called SELECT_SIGNAL_WAIT_ASYNC [3].
Zebediah has pointed out [4] that it is not very elegant to (ab-)use
the synchronization machinery for communicating the async result.
- Use APC_ASYNC_IO to perform the synchronous I/O [5].
This ended up with a total of 11 patches, and turned out to be
rather too complicated for a simple task.
- Add a new wineserver call, and use "add_queue" hook to save a round
trip to the server [6].
</preamble>
Each of the above turned out to be either too intrusive, complicated, or
hard to verify. Per suggestion by Zebediah [7], this is my (hopefully)
last approach: keep the new wineserver call, but keep out the implicit
STATUS_PENDING transition from "add_queue"; also, (re-)use the
"unknown_status" field.
Changelog:
- v1 -> v2: fix async queue hang on synchronous failure
- v2 -> v3: rewrite handling of pending/failed asyncs.
- v3 -> v4: don't set IOSB on synchronous failure, make more robust
[1] https://bugs.winehq.org/show_bug.cgi?id=52401
[2] https://www.winehq.org/pipermail/wine-devel/2021-May/186454.html
[3] https://www.winehq.org/pipermail/wine-devel/2022-January/204695.html
[4] https://www.winehq.org/pipermail/wine-devel/2022-January/204710.html
[5] https://www.winehq.org/pipermail/wine-devel/2022-January/205168.html
[6] https://www.winehq.org/pipermail/wine-devel/2022-January/205193.html
[7] https://www.winehq.org/pipermail/wine-devel/2022-January/205738.html
Jinoh Kang (5):
server: Allow calling async_handoff() with status code STATUS_ALERTED.
server: Add a new server request "set_async_direct_result."
server: Attempt to complete I/O request immediately in recv_socket.
ntdll: Don't call try_recv before server call in sock_recv.
server: Replace redundant recv_socket status fields with force_async
boolean field.
dlls/ntdll/unix/socket.c | 36 +++++++++--------
dlls/ntdll/unix/sync.c | 26 ++++++++++++
dlls/ntdll/unix/unix_private.h | 1 +
dlls/ws2_32/tests/sock.c | 8 ++--
server/async.c | 72 ++++++++++++++++++++++++++++++++++
server/protocol.def | 14 ++++++-
server/sock.c | 39 ++++++++++++------
7 files changed, 160 insertions(+), 36 deletions(-)
--
2.34.1
3
7
[PATCH 1/5] wined3d: Use the chunk allocator for GL indirect draw buffers.
by Zebediah Figura Feb. 9, 2022
by Zebediah Figura Feb. 9, 2022
Feb. 9, 2022
From: Henri Verbeet <hverbeet(a)codeweavers.com>
Signed-off-by: Zebediah Figura <zfigura(a)codeweavers.com>
---
dlls/wined3d/adapter_gl.c | 1 +
dlls/wined3d/context_gl.c | 258 +++++++++++++++++++++++++++++----
dlls/wined3d/device.c | 110 ++++++++++++++
dlls/wined3d/wined3d_private.h | 66 ++++++---
4 files changed, 390 insertions(+), 45 deletions(-)
diff --git a/dlls/wined3d/adapter_gl.c b/dlls/wined3d/adapter_gl.c
index 5511a70a8ff..e903c67b56a 100644
--- a/dlls/wined3d/adapter_gl.c
+++ b/dlls/wined3d/adapter_gl.c
@@ -4283,6 +4283,7 @@ static void adapter_gl_destroy_device(struct wined3d_device *device)
struct wined3d_device_gl *device_gl = wined3d_device_gl(device);
wined3d_device_cleanup(&device_gl->d);
+ heap_free(device_gl->retired_blocks);
heap_free(device_gl);
}
diff --git a/dlls/wined3d/context_gl.c b/dlls/wined3d/context_gl.c
index 3a83027522a..9b8a887bd92 100644
--- a/dlls/wined3d/context_gl.c
+++ b/dlls/wined3d/context_gl.c
@@ -2618,6 +2618,37 @@ static void wined3d_context_gl_poll_fences(struct wined3d_context_gl *context_gl
}
}
+static void wined3d_context_gl_cleanup_resources(struct wined3d_context_gl *context_gl)
+{
+ struct wined3d_device_gl *device_gl = wined3d_device_gl(context_gl->c.device);
+ struct wined3d_retired_block_gl *r, *blocks;
+ SIZE_T count, i = 0;
+ uint64_t id;
+
+ wined3d_context_gl_poll_fences(context_gl);
+ id = device_gl->completed_fence_id;
+
+ blocks = device_gl->retired_blocks;
+ count = device_gl->retired_block_count;
+ while (i < count)
+ {
+ r = &blocks[i];
+
+ if (r->fence_id > id)
+ {
+ ++i;
+ continue;
+ }
+
+ wined3d_allocator_block_free(r->block);
+ if (i != --count)
+ *r = blocks[count];
+ else
+ ++i;
+ }
+ device_gl->retired_block_count = count;
+}
+
void wined3d_context_gl_wait_command_fence(struct wined3d_context_gl *context_gl, uint64_t id)
{
struct wined3d_device_gl *device_gl = wined3d_device_gl(context_gl->c.device);
@@ -2635,7 +2666,7 @@ void wined3d_context_gl_wait_command_fence(struct wined3d_context_gl *context_gl
if ((ret = wined3d_fence_wait(context_gl->submitted.fences[i].fence, &device_gl->d)) != WINED3D_FENCE_OK)
ERR("Failed to wait for command fence with id 0x%s, ret %#x.\n", wine_dbgstr_longlong(id), ret);
- wined3d_context_gl_poll_fences(context_gl);
+ wined3d_context_gl_cleanup_resources(context_gl);
return;
}
@@ -2665,7 +2696,133 @@ void wined3d_context_gl_submit_command_fence(struct wined3d_context_gl *context_
device_gl->completed_fence_id = 0;
device_gl->current_fence_id = 1;
}
- wined3d_context_gl_poll_fences(context_gl);
+ wined3d_context_gl_cleanup_resources(context_gl);
+}
+
+static void wined3d_context_gl_destroy_allocator_block(struct wined3d_context_gl *context_gl,
+ struct wined3d_allocator_block *block, uint64_t fence_id)
+{
+ struct wined3d_device_gl *device_gl = wined3d_device_gl(context_gl->c.device);
+ struct wined3d_retired_block_gl *r;
+
+ if (device_gl->completed_fence_id > fence_id)
+ {
+ wined3d_allocator_block_free(block);
+ TRACE("Freed block %p.\n", block);
+ return;
+ }
+
+ if (!wined3d_array_reserve((void **)&device_gl->retired_blocks,
+ &device_gl->retired_blocks_size, device_gl->retired_block_count + 1,
+ sizeof(*device_gl->retired_blocks)))
+ {
+ ERR("Leaking block %p.\n", block);
+ return;
+ }
+
+ r = &device_gl->retired_blocks[device_gl->retired_block_count++];
+ r->block = block;
+ r->fence_id = fence_id;
+}
+
+/* We always have buffer storage here. */
+GLuint wined3d_context_gl_allocate_vram_chunk_buffer(struct wined3d_context_gl *context_gl,
+ unsigned int pool, size_t size)
+{
+ const struct wined3d_gl_info *gl_info = context_gl->gl_info;
+ GLbitfield flags;
+ GLuint id = 0;
+
+ TRACE("context_gl %p, pool %u, size %zu.\n", context_gl, pool, size);
+
+ GL_EXTCALL(glGenBuffers(1, &id));
+ if (!id)
+ {
+ checkGLcall("buffer object creation");
+ return 0;
+ }
+ wined3d_context_gl_bind_bo(context_gl, GL_PIXEL_UNPACK_BUFFER, id);
+
+ flags = wined3d_device_gl_get_memory_type_flags(pool) | GL_DYNAMIC_STORAGE_BIT;
+ if (flags & (GL_MAP_READ_BIT | GL_MAP_WRITE_BIT))
+ flags |= GL_MAP_PERSISTENT_BIT | GL_MAP_COHERENT_BIT;
+ GL_EXTCALL(glBufferStorage(GL_PIXEL_UNPACK_BUFFER, size, NULL, flags));
+
+ checkGLcall("buffer object creation");
+
+ TRACE("Created buffer object %u.\n", id);
+
+ return id;
+}
+
+static struct wined3d_allocator_block *wined3d_context_gl_allocate_memory(struct wined3d_context_gl *context_gl,
+ unsigned int memory_type, GLsizeiptr size, GLuint *id)
+{
+ struct wined3d_device_gl *device_gl = wined3d_device_gl(context_gl->c.device);
+ struct wined3d_allocator *allocator = &device_gl->allocator;
+ struct wined3d_allocator_block *block;
+
+ if (size > WINED3D_ALLOCATOR_CHUNK_SIZE / 2)
+ {
+ *id = wined3d_context_gl_allocate_vram_chunk_buffer(context_gl, memory_type, size);
+ return NULL;
+ }
+
+ if (!(block = wined3d_allocator_allocate(allocator, &context_gl->c, memory_type, size)))
+ {
+ *id = 0;
+ return NULL;
+ }
+
+ *id = wined3d_allocator_chunk_gl(block->chunk)->gl_buffer;
+
+ return block;
+}
+
+static void *wined3d_allocator_chunk_gl_map(struct wined3d_allocator_chunk_gl *chunk_gl,
+ struct wined3d_context_gl *context_gl)
+{
+ const struct wined3d_gl_info *gl_info = context_gl->gl_info;
+
+ TRACE("chunk %p, gl_buffer %u, map_ptr %p.\n", chunk_gl, chunk_gl->gl_buffer, chunk_gl->c.map_ptr);
+
+ if (!chunk_gl->c.map_ptr)
+ {
+ unsigned int flags = wined3d_device_gl_get_memory_type_flags(chunk_gl->memory_type) & ~GL_CLIENT_STORAGE_BIT;
+
+ flags |= GL_MAP_PERSISTENT_BIT | GL_MAP_COHERENT_BIT;
+ if (!(flags & GL_MAP_READ_BIT))
+ flags |= GL_MAP_UNSYNCHRONIZED_BIT;
+ if (flags & GL_MAP_WRITE_BIT)
+ flags |= GL_MAP_FLUSH_EXPLICIT_BIT;
+ wined3d_context_gl_bind_bo(context_gl, GL_PIXEL_UNPACK_BUFFER, chunk_gl->gl_buffer);
+ chunk_gl->c.map_ptr = GL_EXTCALL(glMapBufferRange(GL_PIXEL_UNPACK_BUFFER,
+ 0, WINED3D_ALLOCATOR_CHUNK_SIZE, flags));
+ if (!chunk_gl->c.map_ptr)
+ {
+ ERR("Failed to map chunk memory.\n");
+ return NULL;
+ }
+ }
+
+ ++chunk_gl->c.map_count;
+
+ return chunk_gl->c.map_ptr;
+}
+
+static void wined3d_allocator_chunk_gl_unmap(struct wined3d_allocator_chunk_gl *chunk_gl,
+ struct wined3d_context_gl *context_gl)
+{
+ const struct wined3d_gl_info *gl_info = context_gl->gl_info;
+
+ TRACE("chunk_gl %p, context_gl %p.\n", chunk_gl, context_gl);
+
+ if (!--chunk_gl->c.map_count && !wined3d_map_persistent())
+ {
+ wined3d_context_gl_bind_bo(context_gl, GL_PIXEL_UNPACK_BUFFER, chunk_gl->gl_buffer);
+ GL_EXTCALL(glUnmapBuffer(GL_PIXEL_UNPACK_BUFFER));
+ chunk_gl->c.map_ptr = NULL;
+ }
}
static void *wined3d_bo_gl_map(struct wined3d_bo_gl *bo, struct wined3d_context_gl *context_gl, uint32_t flags)
@@ -2708,6 +2865,15 @@ map:
if (bo->b.map_ptr)
return bo->b.map_ptr;
+ if (bo->memory)
+ {
+ struct wined3d_allocator_chunk_gl *chunk_gl = wined3d_allocator_chunk_gl(bo->memory->chunk);
+
+ if (!(map_ptr = wined3d_allocator_chunk_gl_map(chunk_gl, context_gl)))
+ ERR("Failed to map chunk.\n");
+ return map_ptr;
+ }
+
gl_info = context_gl->gl_info;
wined3d_context_gl_bind_bo(context_gl, bo->binding, bo->id);
@@ -2766,7 +2932,12 @@ static void wined3d_bo_gl_unmap(struct wined3d_bo_gl *bo, struct wined3d_context
return;
wined3d_context_gl_bind_bo(context_gl, bo->binding, bo->id);
- GL_EXTCALL(glUnmapBuffer(bo->binding));
+
+ if (bo->memory)
+ wined3d_allocator_chunk_gl_unmap(wined3d_allocator_chunk_gl(bo->memory->chunk), context_gl);
+ else
+ GL_EXTCALL(glUnmapBuffer(bo->binding));
+
wined3d_context_gl_bind_bo(context_gl, bo->binding, 0);
checkGLcall("Unmap buffer object");
}
@@ -2920,7 +3091,23 @@ void wined3d_context_gl_destroy_bo(struct wined3d_context_gl *context_gl, struct
TRACE("context_gl %p, bo %p.\n", context_gl, bo);
+ if (bo->memory)
+ {
+ if (bo->b.map_ptr)
+ wined3d_allocator_chunk_gl_unmap(wined3d_allocator_chunk_gl(bo->memory->chunk), context_gl);
+ wined3d_context_gl_destroy_allocator_block(context_gl, bo->memory, bo->command_fence_id);
+ bo->id = 0;
+ return;
+ }
+
+ if (bo->b.map_ptr)
+ {
+ wined3d_context_gl_bind_bo(context_gl, bo->binding, bo->id);
+ GL_EXTCALL(glUnmapBuffer(bo->binding));
+ }
+
TRACE("Destroying GL buffer %u.\n", bo->id);
+
GL_EXTCALL(glDeleteBuffers(1, &bo->id));
checkGLcall("buffer object destruction");
bo->id = 0;
@@ -2929,42 +3116,61 @@ void wined3d_context_gl_destroy_bo(struct wined3d_context_gl *context_gl, struct
bool wined3d_context_gl_create_bo(struct wined3d_context_gl *context_gl, GLsizeiptr size,
GLenum binding, GLenum usage, bool coherent, GLbitfield flags, struct wined3d_bo_gl *bo)
{
+ unsigned int memory_type_idx = wined3d_device_gl_find_memory_type(flags);
const struct wined3d_gl_info *gl_info = context_gl->gl_info;
+ struct wined3d_allocator_block *memory = NULL;
+ GLsizeiptr buffer_offset = 0;
GLuint id = 0;
TRACE("context_gl %p, size %lu, binding %#x, usage %#x, coherent %#x, flags %#x, bo %p.\n",
context_gl, size, binding, usage, coherent, flags, bo);
- GL_EXTCALL(glGenBuffers(1, &id));
- if (!id)
- {
- checkGLcall("buffer object creation");
- return false;
- }
- wined3d_context_gl_bind_bo(context_gl, binding, id);
-
- if (!coherent && gl_info->supported[APPLE_FLUSH_BUFFER_RANGE])
- {
- GL_EXTCALL(glBufferParameteriAPPLE(binding, GL_BUFFER_FLUSHING_UNMAP_APPLE, GL_FALSE));
- GL_EXTCALL(glBufferParameteriAPPLE(binding, GL_BUFFER_SERIALIZED_MODIFY_APPLE, GL_FALSE));
- }
-
if (gl_info->supported[ARB_BUFFER_STORAGE])
{
- if (flags & (GL_MAP_READ_BIT | GL_MAP_WRITE_BIT))
- flags |= GL_MAP_PERSISTENT_BIT | GL_MAP_COHERENT_BIT;
- GL_EXTCALL(glBufferStorage(binding, size, NULL, flags | GL_DYNAMIC_STORAGE_BIT));
+ switch (binding)
+ {
+ case GL_DRAW_INDIRECT_BUFFER:
+ if ((memory = wined3d_context_gl_allocate_memory(context_gl, memory_type_idx, size, &id)))
+ buffer_offset = memory->offset;
+ break;
+
+ default:
+ WARN_(d3d_perf)("Not allocating chunk memory for binding type %#x.\n", binding);
+ id = wined3d_context_gl_allocate_vram_chunk_buffer(context_gl, memory_type_idx, size);
+ break;
+ }
+
+ if (!id)
+ {
+ WARN("Failed to allocate buffer.\n");
+ return false;
+ }
}
else
{
- GL_EXTCALL(glBufferData(binding, size, NULL, usage));
- }
+ GL_EXTCALL(glGenBuffers(1, &id));
+ if (!id)
+ {
+ checkGLcall("buffer object creation");
+ return false;
+ }
+ wined3d_context_gl_bind_bo(context_gl, binding, id);
- wined3d_context_gl_bind_bo(context_gl, binding, 0);
- checkGLcall("buffer object creation");
+ if (!coherent && gl_info->supported[APPLE_FLUSH_BUFFER_RANGE])
+ {
+ GL_EXTCALL(glBufferParameteriAPPLE(binding, GL_BUFFER_FLUSHING_UNMAP_APPLE, GL_FALSE));
+ GL_EXTCALL(glBufferParameteriAPPLE(binding, GL_BUFFER_SERIALIZED_MODIFY_APPLE, GL_FALSE));
+ }
+
+ GL_EXTCALL(glBufferData(binding, size, NULL, usage));
+
+ wined3d_context_gl_bind_bo(context_gl, binding, 0);
+ checkGLcall("buffer object creation");
+ }
TRACE("Created buffer object %u.\n", id);
bo->id = id;
+ bo->memory = memory;
bo->size = size;
bo->binding = binding;
bo->usage = usage;
@@ -2972,8 +3178,8 @@ bool wined3d_context_gl_create_bo(struct wined3d_context_gl *context_gl, GLsizei
bo->b.coherent = coherent;
list_init(&bo->b.users);
bo->command_fence_id = 0;
- bo->b.memory_offset = 0;
- bo->b.buffer_offset = 0;
+ bo->b.buffer_offset = buffer_offset;
+ bo->b.memory_offset = bo->b.buffer_offset;
bo->b.map_ptr = NULL;
return true;
diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c
index aa456d3e702..09be992dd2f 100644
--- a/dlls/wined3d/device.c
+++ b/dlls/wined3d/device.c
@@ -955,6 +955,101 @@ static void device_init_swapchain_state(struct wined3d_device *device, struct wi
wined3d_device_context_set_depth_stencil_view(context, ds_enable ? device->auto_depth_stencil_view : NULL);
}
+static struct wined3d_allocator_chunk *wined3d_allocator_gl_create_chunk(struct wined3d_allocator *allocator,
+ struct wined3d_context *context, unsigned int memory_type, size_t chunk_size)
+{
+ struct wined3d_context_gl *context_gl = wined3d_context_gl(context);
+ struct wined3d_allocator_chunk_gl *chunk_gl;
+
+ TRACE("allocator %p, context %p, memory_type %u, chunk_size %zu.\n", allocator, context, memory_type, chunk_size);
+
+ if (!(chunk_gl = heap_alloc(sizeof(*chunk_gl))))
+ return NULL;
+
+ if (!wined3d_allocator_chunk_init(&chunk_gl->c, allocator))
+ {
+ heap_free(chunk_gl);
+ return NULL;
+ }
+
+ chunk_gl->memory_type = memory_type;
+ if (!(chunk_gl->gl_buffer = wined3d_context_gl_allocate_vram_chunk_buffer(context_gl, memory_type, chunk_size)))
+ {
+ wined3d_allocator_chunk_cleanup(&chunk_gl->c);
+ heap_free(chunk_gl);
+ return NULL;
+ }
+ list_add_head(&allocator->pools[memory_type].chunks, &chunk_gl->c.entry);
+
+ return &chunk_gl->c;
+}
+
+static void wined3d_allocator_gl_destroy_chunk(struct wined3d_allocator_chunk *chunk)
+{
+ struct wined3d_allocator_chunk_gl *chunk_gl = wined3d_allocator_chunk_gl(chunk);
+ const struct wined3d_gl_info *gl_info;
+ struct wined3d_context_gl *context_gl;
+ struct wined3d_device_gl *device_gl;
+
+ TRACE("chunk %p.\n", chunk);
+
+ device_gl = CONTAINING_RECORD(chunk_gl->c.allocator, struct wined3d_device_gl, allocator);
+ context_gl = wined3d_context_gl(context_acquire(&device_gl->d, NULL, 0));
+ gl_info = context_gl->gl_info;
+
+ wined3d_context_gl_bind_bo(context_gl, GL_PIXEL_UNPACK_BUFFER, chunk_gl->gl_buffer);
+ if (chunk_gl->c.map_ptr)
+ GL_EXTCALL(glUnmapBuffer(GL_PIXEL_UNPACK_BUFFER));
+ GL_EXTCALL(glDeleteBuffers(1, &chunk_gl->gl_buffer));
+ TRACE("Freed buffer %u.\n", chunk_gl->gl_buffer);
+ wined3d_allocator_chunk_cleanup(&chunk_gl->c);
+ heap_free(chunk_gl);
+
+ context_release(&context_gl->c);
+}
+
+static const struct wined3d_allocator_ops wined3d_allocator_gl_ops =
+{
+ .allocator_create_chunk = wined3d_allocator_gl_create_chunk,
+ .allocator_destroy_chunk = wined3d_allocator_gl_destroy_chunk,
+};
+
+static const struct
+{
+ GLbitfield flags;
+}
+gl_memory_types[] =
+{
+ {0},
+ {GL_MAP_READ_BIT},
+ {GL_MAP_WRITE_BIT},
+ {GL_MAP_READ_BIT | GL_MAP_WRITE_BIT},
+
+ {GL_CLIENT_STORAGE_BIT},
+ {GL_CLIENT_STORAGE_BIT | GL_MAP_READ_BIT},
+ {GL_CLIENT_STORAGE_BIT | GL_MAP_WRITE_BIT},
+ {GL_CLIENT_STORAGE_BIT | GL_MAP_READ_BIT | GL_MAP_WRITE_BIT},
+};
+
+unsigned int wined3d_device_gl_find_memory_type(GLbitfield flags)
+{
+ unsigned int i;
+
+ for (i = 0; i < ARRAY_SIZE(gl_memory_types); ++i)
+ {
+ if (gl_memory_types[i].flags == flags)
+ return i;
+ }
+
+ assert(0);
+ return 0;
+}
+
+GLbitfield wined3d_device_gl_get_memory_type_flags(unsigned int memory_type_idx)
+{
+ return gl_memory_types[memory_type_idx].flags;
+}
+
void wined3d_device_gl_delete_opengl_contexts_cs(void *object)
{
struct wined3d_device_gl *device_gl = object;
@@ -978,6 +1073,12 @@ void wined3d_device_gl_delete_opengl_contexts_cs(void *object)
device->blitter->ops->blitter_destroy(device->blitter, context);
device->shader_backend->shader_free_private(device, context);
wined3d_device_gl_destroy_dummy_textures(device_gl, context_gl);
+
+ wined3d_context_gl_submit_command_fence(context_gl);
+ wined3d_context_gl_wait_command_fence(context_gl,
+ wined3d_device_gl(context_gl->c.device)->current_fence_id - 1);
+ wined3d_allocator_cleanup(&device_gl->allocator);
+
context_release(context);
while (device->context_count)
@@ -1010,10 +1111,18 @@ void wined3d_device_gl_create_primary_opengl_context_cs(void *object)
return;
}
+ if (!wined3d_allocator_init(&device_gl->allocator, ARRAY_SIZE(gl_memory_types), &wined3d_allocator_gl_ops))
+ {
+ WARN("Failed to initialise allocator.\n");
+ context_release(context);
+ return;
+ }
+
if (FAILED(hr = device->shader_backend->shader_alloc_private(device,
device->adapter->vertex_pipe, device->adapter->fragment_pipe)))
{
ERR("Failed to allocate shader private data, hr %#x.\n", hr);
+ wined3d_allocator_cleanup(&device_gl->allocator);
context_release(context);
return;
}
@@ -1022,6 +1131,7 @@ void wined3d_device_gl_create_primary_opengl_context_cs(void *object)
{
ERR("Failed to create CPU blitter.\n");
device->shader_backend->shader_free_private(device, NULL);
+ wined3d_allocator_cleanup(&device_gl->allocator);
context_release(context);
return;
}
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index 1b3a13024f9..ef1062ec9b4 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -1617,6 +1617,9 @@ struct wined3d_bo_gl
struct wined3d_bo b;
GLuint id;
+
+ struct wined3d_allocator_block *memory;
+
GLsizeiptr size;
GLenum binding;
GLenum usage;
@@ -2355,6 +2358,8 @@ void wined3d_context_gl_alloc_so_statistics_query(struct wined3d_context_gl *con
struct wined3d_so_statistics_query *query) DECLSPEC_HIDDEN;
void wined3d_context_gl_alloc_timestamp_query(struct wined3d_context_gl *context_gl,
struct wined3d_timestamp_query *query) DECLSPEC_HIDDEN;
+GLuint wined3d_context_gl_allocate_vram_chunk_buffer(struct wined3d_context_gl *context_gl,
+ unsigned int pool, size_t size) DECLSPEC_HIDDEN;
void wined3d_context_gl_apply_blit_state(struct wined3d_context_gl *context_gl,
const struct wined3d_device *device) DECLSPEC_HIDDEN;
BOOL wined3d_context_gl_apply_clear_state(struct wined3d_context_gl *context_gl, const struct wined3d_state *state,
@@ -3956,25 +3961,6 @@ static inline struct wined3d_device_no3d *wined3d_device_no3d(struct wined3d_dev
return CONTAINING_RECORD(device, struct wined3d_device_no3d, d);
}
-struct wined3d_device_gl
-{
- struct wined3d_device d;
-
- /* Textures for when no other textures are bound. */
- struct wined3d_dummy_textures dummy_textures;
-
- uint64_t completed_fence_id;
- uint64_t current_fence_id;
-};
-
-static inline struct wined3d_device_gl *wined3d_device_gl(struct wined3d_device *device)
-{
- return CONTAINING_RECORD(device, struct wined3d_device_gl, d);
-}
-
-void wined3d_device_gl_create_primary_opengl_context_cs(void *object) DECLSPEC_HIDDEN;
-void wined3d_device_gl_delete_opengl_contexts_cs(void *object) DECLSPEC_HIDDEN;
-
struct wined3d_null_resources_vk
{
struct wined3d_bo_vk bo;
@@ -4021,6 +4007,18 @@ void wined3d_allocator_chunk_cleanup(struct wined3d_allocator_chunk *chunk) DECL
bool wined3d_allocator_chunk_init(struct wined3d_allocator_chunk *chunk,
struct wined3d_allocator *allocator) DECLSPEC_HIDDEN;
+struct wined3d_allocator_chunk_gl
+{
+ struct wined3d_allocator_chunk c;
+ unsigned int memory_type;
+ GLuint gl_buffer;
+};
+
+static inline struct wined3d_allocator_chunk_gl *wined3d_allocator_chunk_gl(struct wined3d_allocator_chunk *chunk)
+{
+ return CONTAINING_RECORD(chunk, struct wined3d_allocator_chunk_gl, c);
+}
+
struct wined3d_allocator_chunk_vk
{
struct wined3d_allocator_chunk c;
@@ -4155,6 +4153,36 @@ void wined3d_device_vk_destroy_null_views(struct wined3d_device_vk *device_vk,
void wined3d_device_vk_uav_clear_state_init(struct wined3d_device_vk *device_vk) DECLSPEC_HIDDEN;
void wined3d_device_vk_uav_clear_state_cleanup(struct wined3d_device_vk *device_vk) DECLSPEC_HIDDEN;
+struct wined3d_device_gl
+{
+ struct wined3d_device d;
+
+ /* Textures for when no other textures are bound. */
+ struct wined3d_dummy_textures dummy_textures;
+
+ struct wined3d_allocator allocator;
+ uint64_t completed_fence_id;
+ uint64_t current_fence_id;
+
+ struct wined3d_retired_block_gl
+ {
+ struct wined3d_allocator_block *block;
+ uint64_t fence_id;
+ } *retired_blocks;
+ SIZE_T retired_blocks_size;
+ SIZE_T retired_block_count;
+};
+
+static inline struct wined3d_device_gl *wined3d_device_gl(struct wined3d_device *device)
+{
+ return CONTAINING_RECORD(device, struct wined3d_device_gl, d);
+}
+
+void wined3d_device_gl_create_primary_opengl_context_cs(void *object) DECLSPEC_HIDDEN;
+void wined3d_device_gl_delete_opengl_contexts_cs(void *object) DECLSPEC_HIDDEN;
+unsigned int wined3d_device_gl_find_memory_type(GLbitfield flags) DECLSPEC_HIDDEN;
+GLbitfield wined3d_device_gl_get_memory_type_flags(unsigned int memory_type_idx) DECLSPEC_HIDDEN;
+
static inline float wined3d_alpha_ref(const struct wined3d_state *state)
{
return (state->render_states[WINED3D_RS_ALPHAREF] & 0xff) / 255.0f;
--
2.34.1
4
16
Feb. 9, 2022
Signed-off-by: Zebediah Figura <zfigura(a)codeweavers.com>
---
dlls/shlwapi/tests/url.c | 485 ++++++++++++++-------------------------
1 file changed, 176 insertions(+), 309 deletions(-)
diff --git a/dlls/shlwapi/tests/url.c b/dlls/shlwapi/tests/url.c
index 0cc14dc65bf..ea58163ce2e 100644
--- a/dlls/shlwapi/tests/url.c
+++ b/dlls/shlwapi/tests/url.c
@@ -29,30 +29,6 @@
#include "wininet.h"
#include "intshcut.h"
-/* ################ */
-static HMODULE hShlwapi;
-static HRESULT (WINAPI *pUrlUnescapeA)(LPSTR,LPSTR,LPDWORD,DWORD);
-static HRESULT (WINAPI *pUrlUnescapeW)(LPWSTR,LPWSTR,LPDWORD,DWORD);
-static BOOL (WINAPI *pUrlIsA)(LPCSTR,URLIS);
-static BOOL (WINAPI *pUrlIsW)(LPCWSTR,URLIS);
-static HRESULT (WINAPI *pUrlHashA)(LPCSTR,LPBYTE,DWORD);
-static HRESULT (WINAPI *pUrlHashW)(LPCWSTR,LPBYTE,DWORD);
-static HRESULT (WINAPI *pUrlGetPartA)(LPCSTR,LPSTR,LPDWORD,DWORD,DWORD);
-static HRESULT (WINAPI *pUrlGetPartW)(LPCWSTR,LPWSTR,LPDWORD,DWORD,DWORD);
-static HRESULT (WINAPI *pUrlEscapeA)(LPCSTR,LPSTR,LPDWORD,DWORD);
-static HRESULT (WINAPI *pUrlEscapeW)(LPCWSTR,LPWSTR,LPDWORD,DWORD);
-static HRESULT (WINAPI *pUrlCreateFromPathA)(LPCSTR,LPSTR,LPDWORD,DWORD);
-static HRESULT (WINAPI *pUrlCreateFromPathW)(LPCWSTR,LPWSTR,LPDWORD,DWORD);
-static HRESULT (WINAPI *pUrlCombineA)(LPCSTR,LPCSTR,LPSTR,LPDWORD,DWORD);
-static HRESULT (WINAPI *pUrlCombineW)(LPCWSTR,LPCWSTR,LPWSTR,LPDWORD,DWORD);
-static HRESULT (WINAPI *pUrlCanonicalizeA)(LPCSTR, LPSTR, LPDWORD, DWORD);
-static HRESULT (WINAPI *pUrlCanonicalizeW)(LPCWSTR, LPWSTR, LPDWORD, DWORD);
-static HRESULT (WINAPI *pUrlApplySchemeA)(LPCSTR,LPSTR,LPDWORD,DWORD);
-static HRESULT (WINAPI *pUrlApplySchemeW)(LPCWSTR,LPWSTR,LPDWORD,DWORD);
-static HRESULT (WINAPI *pParseURLA)(LPCSTR,PARSEDURLA*);
-static HRESULT (WINAPI *pParseURLW)(LPCWSTR,PARSEDURLW*);
-static HRESULT (WINAPI *pHashData)(LPBYTE, DWORD, LPBYTE, DWORD);
-
static const char* TEST_URL_1 = "http://www.winehq.org/tests?date=10/10/1923";
static const char* TEST_URL_2 = "http://localhost:8080/tests%2e.html?date=Mon%2010/10/1923";
static const char* TEST_URL_3 = "http://foo:bar(a)localhost:21/internal.php?query=x&return=y";
@@ -539,15 +515,10 @@ static void test_UrlApplyScheme(void)
DWORD len;
DWORD i;
- if (!pUrlApplySchemeA) {
- win_skip("UrlApplySchemeA not found\n");
- return;
- }
-
for (i = 0; i < ARRAY_SIZE(TEST_APPLY); i++) {
len = TEST_APPLY_MAX_LENGTH;
lstrcpyA(newurl, untouchedA);
- res = pUrlApplySchemeA(TEST_APPLY[i].url, newurl, &len, TEST_APPLY[i].flags);
+ res = UrlApplySchemeA(TEST_APPLY[i].url, newurl, &len, TEST_APPLY[i].flags);
ok( res == TEST_APPLY[i].res,
"#%dA: got HRESULT 0x%x (expected 0x%x)\n", i, res, TEST_APPLY[i].res);
@@ -563,7 +534,7 @@ static void test_UrlApplyScheme(void)
MultiByteToWideChar(CP_ACP, 0, newurl, -1, newurlW, len);
MultiByteToWideChar(CP_ACP, 0, TEST_APPLY[i].url, -1, urlW, len);
- res = pUrlApplySchemeW(urlW, newurlW, &len, TEST_APPLY[i].flags);
+ res = UrlApplySchemeW(urlW, newurlW, &len, TEST_APPLY[i].flags);
WideCharToMultiByte(CP_ACP, 0, newurlW, -1, newurl, TEST_APPLY_MAX_LENGTH, NULL, NULL);
ok( res == TEST_APPLY[i].res,
"#%dW: got HRESULT 0x%x (expected 0x%x)\n", i, res, TEST_APPLY[i].res);
@@ -579,7 +550,7 @@ static void test_UrlApplyScheme(void)
/* buffer too small */
lstrcpyA(newurl, untouchedA);
len = lstrlenA(TEST_APPLY[0].newurl);
- res = pUrlApplySchemeA(TEST_APPLY[0].url, newurl, &len, TEST_APPLY[0].flags);
+ res = UrlApplySchemeA(TEST_APPLY[0].url, newurl, &len, TEST_APPLY[0].flags);
ok(res == E_POINTER, "got HRESULT 0x%x (expected E_POINTER)\n", res);
/* The returned length include the space for the terminating 0 */
i = lstrlenA(TEST_APPLY[0].newurl)+1;
@@ -589,18 +560,18 @@ static void test_UrlApplyScheme(void)
/* NULL as parameter. The length and the buffer are not modified */
lstrcpyA(newurl, untouchedA);
len = TEST_APPLY_MAX_LENGTH;
- res = pUrlApplySchemeA(NULL, newurl, &len, TEST_APPLY[0].flags);
+ res = UrlApplySchemeA(NULL, newurl, &len, TEST_APPLY[0].flags);
ok(res == E_INVALIDARG, "got HRESULT 0x%x (expected E_INVALIDARG)\n", res);
ok(len == TEST_APPLY_MAX_LENGTH, "got len %d\n", len);
ok(!lstrcmpA(newurl, untouchedA), "got '%s' (expected '%s')\n", newurl, untouchedA);
len = TEST_APPLY_MAX_LENGTH;
- res = pUrlApplySchemeA(TEST_APPLY[0].url, NULL, &len, TEST_APPLY[0].flags);
+ res = UrlApplySchemeA(TEST_APPLY[0].url, NULL, &len, TEST_APPLY[0].flags);
ok(res == E_INVALIDARG, "got HRESULT 0x%x (expected E_INVALIDARG)\n", res);
ok(len == TEST_APPLY_MAX_LENGTH, "got len %d\n", len);
lstrcpyA(newurl, untouchedA);
- res = pUrlApplySchemeA(TEST_APPLY[0].url, newurl, NULL, TEST_APPLY[0].flags);
+ res = UrlApplySchemeA(TEST_APPLY[0].url, newurl, NULL, TEST_APPLY[0].flags);
ok(res == E_INVALIDARG, "got HRESULT 0x%x (expected E_INVALIDARG)\n", res);
ok(!lstrcmpA(newurl, untouchedA), "got '%s' (expected '%s')\n", newurl, untouchedA);
@@ -616,25 +587,18 @@ static void hash_url(const char* szUrl)
DWORD cbSize = sizeof(DWORD);
DWORD dwHash1, dwHash2;
- res = pUrlHashA(szTestUrl, (LPBYTE)&dwHash1, cbSize);
+ res = UrlHashA(szTestUrl, (LPBYTE)&dwHash1, cbSize);
ok(res == S_OK, "UrlHashA returned 0x%x (expected S_OK) for %s\n", res, szUrl);
- if (pUrlHashW) {
- res = pUrlHashW(wszTestUrl, (LPBYTE)&dwHash2, cbSize);
- ok(res == S_OK, "UrlHashW returned 0x%x (expected S_OK) for %s\n", res, szUrl);
- ok(dwHash1 == dwHash2,
- "Hashes didn't match (A: 0x%x, W: 0x%x) for %s\n", dwHash1, dwHash2, szUrl);
- }
- FreeWideString(wszTestUrl);
+ res = UrlHashW(wszTestUrl, (LPBYTE)&dwHash2, cbSize);
+ ok(res == S_OK, "UrlHashW returned 0x%x (expected S_OK) for %s\n", res, szUrl);
+ ok(dwHash1 == dwHash2,
+ "Hashes didn't match (A: 0x%x, W: 0x%x) for %s\n", dwHash1, dwHash2, szUrl);
+ FreeWideString(wszTestUrl);
}
static void test_UrlHash(void)
{
- if (!pUrlHashA) {
- win_skip("UrlHashA not found\n");
- return;
- }
-
hash_url(TEST_URL_1);
hash_url(TEST_URL_2);
hash_url(TEST_URL_3);
@@ -652,31 +616,30 @@ static void test_url_part(const char* szUrl, DWORD dwPart, DWORD dwFlags, const
DWORD dwSize;
dwSize = 1;
- res = pUrlGetPartA(szUrl, szPart, &dwSize, dwPart, dwFlags);
+ res = UrlGetPartA(szUrl, szPart, &dwSize, dwPart, dwFlags);
ok(res == E_POINTER, "UrlGetPart for \"%s\" gave: 0x%08x\n", szUrl, res);
ok(dwSize == strlen(szExpected)+1 ||
(*szExpected == '?' && dwSize == strlen(szExpected)),
"UrlGetPart for \"%s\" gave size: %u\n", szUrl, dwSize);
dwSize = INTERNET_MAX_URL_LENGTH;
- res = pUrlGetPartA(szUrl, szPart, &dwSize, dwPart, dwFlags);
+ res = UrlGetPartA(szUrl, szPart, &dwSize, dwPart, dwFlags);
ok(res == S_OK,
"UrlGetPartA for \"%s\" part 0x%08x returned 0x%x and \"%s\"\n",
szUrl, dwPart, res, szPart);
- if (pUrlGetPartW) {
- dwSize = INTERNET_MAX_URL_LENGTH;
- res = pUrlGetPartW(wszUrl, wszPart, &dwSize, dwPart, dwFlags);
- ok(res == S_OK,
- "UrlGetPartW for \"%s\" part 0x%08x returned 0x%x\n",
- szUrl, dwPart, res);
- wszConvertedPart = GetWideString(szPart);
+ dwSize = INTERNET_MAX_URL_LENGTH;
+ res = UrlGetPartW(wszUrl, wszPart, &dwSize, dwPart, dwFlags);
+ ok(res == S_OK,
+ "UrlGetPartW for \"%s\" part 0x%08x returned 0x%x\n",
+ szUrl, dwPart, res);
- ok(lstrcmpW(wszPart,wszConvertedPart)==0,
- "Strings didn't match between ansi and unicode UrlGetPart!\n");
+ wszConvertedPart = GetWideString(szPart);
- FreeWideString(wszConvertedPart);
- }
+ ok(lstrcmpW(wszPart,wszConvertedPart)==0,
+ "Strings didn't match between ansi and unicode UrlGetPart!\n");
+
+ FreeWideString(wszConvertedPart);
FreeWideString(wszUrl);
/* Note that v6.0 and later don't return '?' with the query */
@@ -698,57 +661,47 @@ static void test_UrlGetPart(void)
const char* short_url = "ascheme:";
CHAR szPart[INTERNET_MAX_URL_LENGTH];
+ WCHAR bufW[5];
DWORD dwSize;
HRESULT res;
- if (!pUrlGetPartA) {
- win_skip("UrlGetPartA not found\n");
- return;
- }
-
- res = pUrlGetPartA(NULL, NULL, NULL, URL_PART_SCHEME, 0);
+ res = UrlGetPartA(NULL, NULL, NULL, URL_PART_SCHEME, 0);
ok(res == E_INVALIDARG, "null params gave: 0x%08x\n", res);
- res = pUrlGetPartA(NULL, szPart, &dwSize, URL_PART_SCHEME, 0);
+ res = UrlGetPartA(NULL, szPart, &dwSize, URL_PART_SCHEME, 0);
ok(res == E_INVALIDARG, "null URL gave: 0x%08x\n", res);
- res = pUrlGetPartA(res_url, NULL, &dwSize, URL_PART_SCHEME, 0);
+ res = UrlGetPartA(res_url, NULL, &dwSize, URL_PART_SCHEME, 0);
ok(res == E_INVALIDARG, "null szPart gave: 0x%08x\n", res);
- res = pUrlGetPartA(res_url, szPart, NULL, URL_PART_SCHEME, 0);
+ res = UrlGetPartA(res_url, szPart, NULL, URL_PART_SCHEME, 0);
ok(res == E_INVALIDARG, "null URL gave: 0x%08x\n", res);
dwSize = 0;
szPart[0]='x'; szPart[1]=0;
- res = pUrlGetPartA("hi", szPart, &dwSize, URL_PART_SCHEME, 0);
+ res = UrlGetPartA("hi", szPart, &dwSize, URL_PART_SCHEME, 0);
ok(res == E_INVALIDARG, "UrlGetPartA(*pcchOut = 0) returned %08X\n", res);
ok(szPart[0] == 'x' && szPart[1] == 0, "UrlGetPartA(*pcchOut = 0) modified szPart: \"%s\"\n", szPart);
ok(dwSize == 0, "dwSize = %d\n", dwSize);
dwSize = sizeof szPart;
szPart[0]='x'; szPart[1]=0;
- res = pUrlGetPartA("hi", szPart, &dwSize, URL_PART_SCHEME, 0);
+ res = UrlGetPartA("hi", szPart, &dwSize, URL_PART_SCHEME, 0);
ok (res==S_FALSE, "UrlGetPartA(\"hi\") returned %08X\n", res);
ok(szPart[0]==0, "UrlGetPartA(\"hi\") return \"%s\" instead of \"\"\n", szPart);
ok(dwSize == 0, "dwSize = %d\n", dwSize);
- if(pUrlGetPartW)
- {
- const WCHAR hiW[] = {'h','i',0};
- WCHAR bufW[5];
-
- /* UrlGetPartW returns S_OK instead of S_FALSE */
- dwSize = sizeof szPart;
- bufW[0]='x'; bufW[1]=0;
- res = pUrlGetPartW(hiW, bufW, &dwSize, URL_PART_SCHEME, 0);
- todo_wine ok(res==S_OK, "UrlGetPartW(\"hi\") returned %08X\n", res);
- ok(bufW[0] == 0, "UrlGetPartW(\"hi\") return \"%c\"\n", bufW[0]);
- ok(dwSize == 0, "dwSize = %d\n", dwSize);
- }
+ /* UrlGetPartW returns S_OK instead of S_FALSE */
+ dwSize = sizeof szPart;
+ bufW[0]='x'; bufW[1]=0;
+ res = UrlGetPartW(L"hi", bufW, &dwSize, URL_PART_SCHEME, 0);
+ todo_wine ok(res==S_OK, "UrlGetPartW(\"hi\") returned %08X\n", res);
+ ok(bufW[0] == 0, "UrlGetPartW(\"hi\") return \"%c\"\n", bufW[0]);
+ ok(dwSize == 0, "dwSize = %d\n", dwSize);
dwSize = sizeof szPart;
szPart[0]='x'; szPart[1]=0;
- res = pUrlGetPartA("hi", szPart, &dwSize, URL_PART_QUERY, 0);
+ res = UrlGetPartA("hi", szPart, &dwSize, URL_PART_QUERY, 0);
ok (res==S_FALSE, "UrlGetPartA(\"hi\") returned %08X\n", res);
ok(szPart[0]==0, "UrlGetPartA(\"hi\") return \"%s\" instead of \"\"\n", szPart);
ok(dwSize == 0, "dwSize = %d\n", dwSize);
@@ -774,7 +727,7 @@ static void test_UrlGetPart(void)
test_url_part(short_url, URL_PART_SCHEME, 0, "ascheme");
dwSize = sizeof(szPart);
- res = pUrlGetPartA(about_url, szPart, &dwSize, URL_PART_HOSTNAME, 0);
+ res = UrlGetPartA(about_url, szPart, &dwSize, URL_PART_HOSTNAME, 0);
ok(res==E_FAIL, "returned %08x\n", res);
test_url_part(res_url, URL_PART_SCHEME, 0, "res");
@@ -782,52 +735,52 @@ static void test_UrlGetPart(void)
dwSize = sizeof szPart;
szPart[0]='x'; szPart[1]=0;
- res = pUrlGetPartA(res_url, szPart, &dwSize, URL_PART_QUERY, 0);
+ res = UrlGetPartA(res_url, szPart, &dwSize, URL_PART_QUERY, 0);
ok(res==S_FALSE, "UrlGetPartA returned %08X\n", res);
ok(szPart[0]==0, "UrlGetPartA gave \"%s\" instead of \"\"\n", szPart);
ok(dwSize == 0, "dwSize = %d\n", dwSize);
dwSize = sizeof(szPart);
- res = pUrlGetPartA("file://c:\\index.htm", szPart, &dwSize, URL_PART_HOSTNAME, 0);
+ res = UrlGetPartA("file://c:\\index.htm", szPart, &dwSize, URL_PART_HOSTNAME, 0);
ok(res==S_FALSE, "returned %08x\n", res);
ok(dwSize == 0, "dwSize = %d\n", dwSize);
dwSize = sizeof(szPart);
szPart[0] = 'x'; szPart[1] = '\0';
- res = pUrlGetPartA("file:some text", szPart, &dwSize, URL_PART_HOSTNAME, 0);
+ res = UrlGetPartA("file:some text", szPart, &dwSize, URL_PART_HOSTNAME, 0);
ok(res==S_FALSE, "returned %08x\n", res);
ok(szPart[0] == '\0', "szPart[0] = %c\n", szPart[0]);
ok(dwSize == 0, "dwSize = %d\n", dwSize);
dwSize = sizeof(szPart);
szPart[0] = 'x'; szPart[1] = '\0';
- res = pUrlGetPartA("index.htm", szPart, &dwSize, URL_PART_HOSTNAME, 0);
+ res = UrlGetPartA("index.htm", szPart, &dwSize, URL_PART_HOSTNAME, 0);
ok(res==E_FAIL, "returned %08x\n", res);
dwSize = sizeof(szPart);
szPart[0] = 'x'; szPart[1] = '\0';
- res = pUrlGetPartA(excid_url, szPart, &dwSize, URL_PART_HOSTNAME, 0);
+ res = UrlGetPartA(excid_url, szPart, &dwSize, URL_PART_HOSTNAME, 0);
ok(res==E_FAIL, "returned %08x\n", res);
ok(szPart[0] == 'x', "szPart[0] = %c\n", szPart[0]);
ok(dwSize == sizeof(szPart), "dwSize = %d\n", dwSize);
dwSize = sizeof(szPart);
szPart[0] = 'x'; szPart[1] = '\0';
- res = pUrlGetPartA(excid_url, szPart, &dwSize, URL_PART_QUERY, 0);
+ res = UrlGetPartA(excid_url, szPart, &dwSize, URL_PART_QUERY, 0);
ok(res==S_FALSE, "returned %08x\n", res);
ok(szPart[0] == 0, "szPart[0] = %c\n", szPart[0]);
ok(dwSize == 0, "dwSize = %d\n", dwSize);
dwSize = sizeof(szPart);
szPart[0] = 'x'; szPart[1] = '\0';
- res = pUrlGetPartA(foo_url, szPart, &dwSize, URL_PART_HOSTNAME, 0);
+ res = UrlGetPartA(foo_url, szPart, &dwSize, URL_PART_HOSTNAME, 0);
ok(res==E_FAIL, "returned %08x\n", res);
ok(szPart[0] == 'x', "szPart[0] = %c\n", szPart[0]);
ok(dwSize == sizeof(szPart), "dwSize = %d\n", dwSize);
dwSize = sizeof(szPart);
szPart[0] = 'x'; szPart[1] = '\0';
- res = pUrlGetPartA(foo_url, szPart, &dwSize, URL_PART_QUERY, 0);
+ res = UrlGetPartA(foo_url, szPart, &dwSize, URL_PART_QUERY, 0);
ok(res==S_FALSE, "returned %08x\n", res);
ok(szPart[0] == 0, "szPart[0] = %c\n", szPart[0]);
ok(dwSize == 0, "dwSize = %d\n", dwSize);
@@ -846,28 +799,26 @@ static void test_url_canonicalize(int index, const char *szUrl, DWORD dwFlags, H
DWORD dwSize;
dwSize = INTERNET_MAX_URL_LENGTH;
- ret = pUrlCanonicalizeA(szUrl, NULL, &dwSize, dwFlags);
+ ret = UrlCanonicalizeA(szUrl, NULL, &dwSize, dwFlags);
ok(ret != dwExpectReturn, "got 0s%x: Unexpected return for NULL buffer, index %d\n", ret, index);
- ret = pUrlCanonicalizeA(szUrl, szReturnUrl, &dwSize, dwFlags);
+ ret = UrlCanonicalizeA(szUrl, szReturnUrl, &dwSize, dwFlags);
ok(ret == dwExpectReturn || ret == dwExpectReturnAlt,
"UrlCanonicalizeA failed: expected=0x%08x or 0x%08x, got=0x%08x, index %d\n",
dwExpectReturn, dwExpectReturnAlt, ret, index);
todo_wine_if (todo)
ok(strcmp(szReturnUrl,szExpectUrl)==0, "UrlCanonicalizeA dwFlags 0x%08x url '%s' Expected \"%s\", but got \"%s\", index %d\n", dwFlags, szUrl, szExpectUrl, szReturnUrl, index);
- if (pUrlCanonicalizeW) {
- dwSize = INTERNET_MAX_URL_LENGTH;
- ret = pUrlCanonicalizeW(wszUrl, NULL, &dwSize, dwFlags);
- ok(ret != dwExpectReturn, "got 0x%x: Unexpected return for NULL buffer, index %d\n", ret, index);
- ret = pUrlCanonicalizeW(wszUrl, wszReturnUrl, &dwSize, dwFlags);
- ok(ret == dwExpectReturn, "UrlCanonicalizeW failed: expected 0x%08x, got 0x%x, index %d\n",
- dwExpectReturn, ret, index);
+ dwSize = INTERNET_MAX_URL_LENGTH;
+ ret = UrlCanonicalizeW(wszUrl, NULL, &dwSize, dwFlags);
+ ok(ret != dwExpectReturn, "got 0x%x: Unexpected return for NULL buffer, index %d\n", ret, index);
+ ret = UrlCanonicalizeW(wszUrl, wszReturnUrl, &dwSize, dwFlags);
+ ok(ret == dwExpectReturn, "UrlCanonicalizeW failed: expected 0x%08x, got 0x%x, index %d\n",
+ dwExpectReturn, ret, index);
- wszConvertedUrl = GetWideString(szReturnUrl);
- ok(lstrcmpW(wszReturnUrl, wszConvertedUrl)==0,
- "Strings didn't match between ansi and unicode UrlCanonicalize, index %d!\n", index);
- FreeWideString(wszConvertedUrl);
- }
+ wszConvertedUrl = GetWideString(szReturnUrl);
+ ok(lstrcmpW(wszReturnUrl, wszConvertedUrl)==0,
+ "Strings didn't match between ansi and unicode UrlCanonicalize, index %d!\n", index);
+ FreeWideString(wszConvertedUrl);
FreeWideString(wszUrl);
FreeWideString(wszExpectUrl);
@@ -881,40 +832,35 @@ static void test_UrlEscapeA(void)
unsigned int i;
char empty_string[] = "";
- if (!pUrlEscapeA) {
- win_skip("UrlEscapeA not found\n");
- return;
- }
-
- ret = pUrlEscapeA("/woningplan/woonkamer basis.swf", NULL, &size, URL_ESCAPE_SPACES_ONLY);
+ ret = UrlEscapeA("/woningplan/woonkamer basis.swf", NULL, &size, URL_ESCAPE_SPACES_ONLY);
ok(ret == E_INVALIDARG, "got %x, expected %x\n", ret, E_INVALIDARG);
ok(size == 0, "got %d, expected %d\n", size, 0);
size = 0;
- ret = pUrlEscapeA("/woningplan/woonkamer basis.swf", empty_string, &size, URL_ESCAPE_SPACES_ONLY);
+ ret = UrlEscapeA("/woningplan/woonkamer basis.swf", empty_string, &size, URL_ESCAPE_SPACES_ONLY);
ok(ret == E_INVALIDARG, "got %x, expected %x\n", ret, E_INVALIDARG);
ok(size == 0, "got %d, expected %d\n", size, 0);
size = 1;
- ret = pUrlEscapeA("/woningplan/woonkamer basis.swf", NULL, &size, URL_ESCAPE_SPACES_ONLY);
+ ret = UrlEscapeA("/woningplan/woonkamer basis.swf", NULL, &size, URL_ESCAPE_SPACES_ONLY);
ok(ret == E_INVALIDARG, "got %x, expected %x\n", ret, E_INVALIDARG);
ok(size == 1, "got %d, expected %d\n", size, 1);
size = 1;
- ret = pUrlEscapeA("/woningplan/woonkamer basis.swf", empty_string, NULL, URL_ESCAPE_SPACES_ONLY);
+ ret = UrlEscapeA("/woningplan/woonkamer basis.swf", empty_string, NULL, URL_ESCAPE_SPACES_ONLY);
ok(ret == E_INVALIDARG, "got %x, expected %x\n", ret, E_INVALIDARG);
ok(size == 1, "got %d, expected %d\n", size, 1);
size = 1;
empty_string[0] = 127;
- ret = pUrlEscapeA("/woningplan/woonkamer basis.swf", empty_string, &size, URL_ESCAPE_SPACES_ONLY);
+ ret = UrlEscapeA("/woningplan/woonkamer basis.swf", empty_string, &size, URL_ESCAPE_SPACES_ONLY);
ok(ret == E_POINTER, "got %x, expected %x\n", ret, E_POINTER);
ok(size == 34, "got %d, expected %d\n", size, 34);
ok(empty_string[0] == 127, "String has changed, empty_string[0] = %d\n", empty_string[0]);
size = 1;
empty_string[0] = 127;
- ret = pUrlEscapeA("/woningplan/woonkamer basis.swf", empty_string, &size, URL_ESCAPE_AS_UTF8);
+ ret = UrlEscapeA("/woningplan/woonkamer basis.swf", empty_string, &size, URL_ESCAPE_AS_UTF8);
ok(ret == E_NOTIMPL || broken(ret == E_POINTER), /* < Win7/Win2k8 */
"got %x, expected %x\n", ret, E_NOTIMPL);
ok(size == 1 || broken(size == 34), /* < Win7/Win2k8 */
@@ -925,7 +871,7 @@ static void test_UrlEscapeA(void)
CHAR ret_url[INTERNET_MAX_URL_LENGTH];
size = INTERNET_MAX_URL_LENGTH;
- ret = pUrlEscapeA(TEST_ESCAPE[i].url, ret_url, &size, TEST_ESCAPE[i].flags);
+ ret = UrlEscapeA(TEST_ESCAPE[i].url, ret_url, &size, TEST_ESCAPE[i].flags);
ok(ret == TEST_ESCAPE[i].expectret, "UrlEscapeA returned 0x%08x instead of 0x%08x for \"%s\"\n",
ret, TEST_ESCAPE[i].expectret, TEST_ESCAPE[i].url);
ok(!strcmp(ret_url, TEST_ESCAPE[i].expecturl), "Expected \"%s\", but got \"%s\" for \"%s\"\n",
@@ -947,11 +893,6 @@ static void test_UrlEscapeW(void)
WCHAR wc;
int i;
- if (!pUrlEscapeW) {
- win_skip("UrlEscapeW not found\n");
- return;
- }
-
/* Check error paths */
ret = UrlEscapeW(path_test, NULL, NULL, URL_ESCAPE_SPACES_ONLY);
@@ -989,21 +930,21 @@ static void test_UrlEscapeW(void)
/* Check actual escaping */
size = ARRAY_SIZE(overwrite);
- ret = pUrlEscapeW(overwrite, overwrite, &size, URL_ESCAPE_SPACES_ONLY);
+ ret = UrlEscapeW(overwrite, overwrite, &size, URL_ESCAPE_SPACES_ONLY);
ok(ret == S_OK, "got %x, expected S_OK\n", ret);
ok(size == 9, "got %d, expected 9\n", size);
ok(!lstrcmpW(overwrite, out), "got %s, expected %s\n", wine_dbgstr_w(overwrite), wine_dbgstr_w(out));
size = 1;
wc = 127;
- ret = pUrlEscapeW(overwrite, &wc, &size, URL_ESCAPE_SPACES_ONLY);
+ ret = UrlEscapeW(overwrite, &wc, &size, URL_ESCAPE_SPACES_ONLY);
ok(ret == E_POINTER, "got %x, expected %x\n", ret, E_POINTER);
ok(size == 10, "got %d, expected 10\n", size);
ok(wc == 127, "String has changed, wc = %d\n", wc);
/* non-ASCII range */
size = ARRAY_SIZE(ret_urlW);
- ret = pUrlEscapeW(naW, ret_urlW, &size, 0);
+ ret = UrlEscapeW(naW, ret_urlW, &size, 0);
ok(ret == S_OK, "got %x, expected S_OK\n", ret);
ok(!lstrcmpW(naescapedW, ret_urlW), "got %s, expected %s\n", wine_dbgstr_w(ret_urlW), wine_dbgstr_w(naescapedW));
@@ -1014,7 +955,7 @@ static void test_UrlEscapeW(void)
size = INTERNET_MAX_URL_LENGTH;
urlW = GetWideString(TEST_ESCAPE[i].url);
expected_urlW = GetWideString(TEST_ESCAPE[i].expecturl);
- ret = pUrlEscapeW(urlW, ret_urlW, &size, TEST_ESCAPE[i].flags);
+ ret = UrlEscapeW(urlW, ret_urlW, &size, TEST_ESCAPE[i].flags);
ok(ret == TEST_ESCAPE[i].expectret, "UrlEscapeW returned 0x%08x instead of 0x%08x for %s\n",
ret, TEST_ESCAPE[i].expectret, wine_dbgstr_w(urlW));
ok(!lstrcmpW(ret_urlW, expected_urlW), "Expected %s, but got %s for %s flags %08x\n",
@@ -1027,7 +968,7 @@ static void test_UrlEscapeW(void)
WCHAR ret_url[INTERNET_MAX_URL_LENGTH];
size = INTERNET_MAX_URL_LENGTH;
- ret = pUrlEscapeW(TEST_ESCAPEW[i].url, ret_url, &size, TEST_ESCAPEW[i].flags);
+ ret = UrlEscapeW(TEST_ESCAPEW[i].url, ret_url, &size, TEST_ESCAPEW[i].flags);
ok(ret == TEST_ESCAPEW[i].expectret, "UrlEscapeW returned 0x%08x instead of 0x%08x for \"%s\"\n",
ret, TEST_ESCAPEW[i].expectret, wine_dbgstr_w(TEST_ESCAPEW[i].url));
ok(!lstrcmpW(ret_url, TEST_ESCAPEW[i].expecturl) ||
@@ -1050,27 +991,22 @@ static void test_UrlCanonicalizeA(void)
DWORD urllen;
HRESULT hr;
- if (!pUrlCanonicalizeA) {
- win_skip("UrlCanonicalizeA not found\n");
- return;
- }
-
urllen = lstrlenA(winehqA);
/* Parameter checks */
dwSize = ARRAY_SIZE(szReturnUrl);
- hr = pUrlCanonicalizeA(NULL, szReturnUrl, &dwSize, URL_UNESCAPE);
+ hr = UrlCanonicalizeA(NULL, szReturnUrl, &dwSize, URL_UNESCAPE);
ok(hr == E_INVALIDARG, "Got unexpected hr %#x.\n", hr);
dwSize = ARRAY_SIZE(szReturnUrl);
- hr = pUrlCanonicalizeA(winehqA, NULL, &dwSize, URL_UNESCAPE);
+ hr = UrlCanonicalizeA(winehqA, NULL, &dwSize, URL_UNESCAPE);
ok(hr == E_INVALIDARG, "Got unexpected hr %#x.\n", hr);
- hr = pUrlCanonicalizeA(winehqA, szReturnUrl, NULL, URL_UNESCAPE);
+ hr = UrlCanonicalizeA(winehqA, szReturnUrl, NULL, URL_UNESCAPE);
ok(hr == E_INVALIDARG, "Got unexpected hr %#x.\n", hr);
dwSize = 0;
- hr = pUrlCanonicalizeA(winehqA, szReturnUrl, &dwSize, URL_UNESCAPE);
+ hr = UrlCanonicalizeA(winehqA, szReturnUrl, &dwSize, URL_UNESCAPE);
ok(hr == E_INVALIDARG, "Got unexpected hr %#x.\n", hr);
/* buffer has no space for the result */
@@ -1078,7 +1014,7 @@ static void test_UrlCanonicalizeA(void)
memset(szReturnUrl, '#', urllen+4);
szReturnUrl[urllen+4] = '\0';
SetLastError(0xdeadbeef);
- hr = pUrlCanonicalizeA(winehqA, szReturnUrl, &dwSize, URL_WININET_COMPATIBILITY | URL_ESCAPE_UNSAFE);
+ hr = UrlCanonicalizeA(winehqA, szReturnUrl, &dwSize, URL_WININET_COMPATIBILITY | URL_ESCAPE_UNSAFE);
ok( (hr == E_POINTER) && (dwSize == (urllen + 1)),
"got 0x%x with %u and size %u for '%s' and %u (expected 'E_POINTER' and size %u)\n",
hr, GetLastError(), dwSize, szReturnUrl, lstrlenA(szReturnUrl), urllen+1);
@@ -1088,7 +1024,7 @@ static void test_UrlCanonicalizeA(void)
memset(szReturnUrl, '#', urllen+4);
szReturnUrl[urllen+4] = '\0';
SetLastError(0xdeadbeef);
- hr = pUrlCanonicalizeA(winehqA, szReturnUrl, &dwSize, URL_WININET_COMPATIBILITY | URL_ESCAPE_UNSAFE);
+ hr = UrlCanonicalizeA(winehqA, szReturnUrl, &dwSize, URL_WININET_COMPATIBILITY | URL_ESCAPE_UNSAFE);
ok( (hr == E_POINTER) && (dwSize == (urllen + 1)),
"got 0x%x with %u and size %u for '%s' and %u (expected 'E_POINTER' and size %u)\n",
hr, GetLastError(), dwSize, szReturnUrl, lstrlenA(szReturnUrl), urllen+1);
@@ -1098,7 +1034,7 @@ static void test_UrlCanonicalizeA(void)
memset(szReturnUrl, '#', urllen+4);
szReturnUrl[urllen+4] = '\0';
SetLastError(0xdeadbeef);
- hr = pUrlCanonicalizeA(winehqA, szReturnUrl, &dwSize, URL_WININET_COMPATIBILITY | URL_ESCAPE_UNSAFE);
+ hr = UrlCanonicalizeA(winehqA, szReturnUrl, &dwSize, URL_WININET_COMPATIBILITY | URL_ESCAPE_UNSAFE);
ok( (hr == S_OK) && (dwSize == urllen),
"got 0x%x with %u and size %u for '%s' and %u (expected 'S_OK' and size %u)\n",
hr, GetLastError(), dwSize, szReturnUrl, lstrlenA(szReturnUrl), urllen);
@@ -1108,7 +1044,7 @@ static void test_UrlCanonicalizeA(void)
memset(szReturnUrl, '#', urllen+4);
szReturnUrl[urllen+4] = '\0';
SetLastError(0xdeadbeef);
- hr = pUrlCanonicalizeA(winehqA, szReturnUrl, &dwSize, URL_WININET_COMPATIBILITY | URL_ESCAPE_UNSAFE);
+ hr = UrlCanonicalizeA(winehqA, szReturnUrl, &dwSize, URL_WININET_COMPATIBILITY | URL_ESCAPE_UNSAFE);
ok( (hr == S_OK) && (dwSize == urllen),
"got 0x%x with %u and size %u for '%s' and %u (expected 'S_OK' and size %u)\n",
hr, GetLastError(), dwSize, szReturnUrl, lstrlenA(szReturnUrl), urllen);
@@ -1118,7 +1054,7 @@ static void test_UrlCanonicalizeA(void)
memset(szReturnUrl, '#', urllen+4);
szReturnUrl[urllen+4] = '\0';
SetLastError(0xdeadbeef);
- hr = pUrlCanonicalizeA(winehqA, szReturnUrl, &dwSize, URL_WININET_COMPATIBILITY | URL_ESCAPE_UNSAFE);
+ hr = UrlCanonicalizeA(winehqA, szReturnUrl, &dwSize, URL_WININET_COMPATIBILITY | URL_ESCAPE_UNSAFE);
ok( (hr == E_INVALIDARG) && (dwSize == 0),
"got 0x%x with %u and size %u for '%s' and %u (expected 'E_INVALIDARG' and size %u)\n",
hr, GetLastError(), dwSize, szReturnUrl, lstrlenA(szReturnUrl), 0);
@@ -1128,7 +1064,7 @@ static void test_UrlCanonicalizeA(void)
memset(longurl, 'a', sizeof(longurl));
memcpy(longurl, winehqA, sizeof(winehqA)-1);
longurl[sizeof(longurl)-1] = '\0';
- hr = pUrlCanonicalizeA(longurl, szReturnUrl, &dwSize, URL_WININET_COMPATIBILITY | URL_ESCAPE_UNSAFE);
+ hr = UrlCanonicalizeA(longurl, szReturnUrl, &dwSize, URL_WININET_COMPATIBILITY | URL_ESCAPE_UNSAFE);
ok(hr == S_OK, "hr = %x\n", hr);
test_url_canonicalize(-1, "", 0, S_OK, S_FALSE /* Vista/win2k8 */, "", FALSE);
@@ -1151,27 +1087,22 @@ static void test_UrlCanonicalizeW(void)
HRESULT hr;
int i;
-
- if (!pUrlCanonicalizeW) {
- win_skip("UrlCanonicalizeW not found\n");
- return;
- }
urllen = lstrlenW(winehqW);
/* Parameter checks */
dwSize = ARRAY_SIZE(szReturnUrl);
- hr = pUrlCanonicalizeW(NULL, szReturnUrl, &dwSize, URL_UNESCAPE);
+ hr = UrlCanonicalizeW(NULL, szReturnUrl, &dwSize, URL_UNESCAPE);
ok(hr == E_INVALIDARG, "Got unexpected hr %#x.\n", hr);
dwSize = ARRAY_SIZE(szReturnUrl);
- hr = pUrlCanonicalizeW(winehqW, NULL, &dwSize, URL_UNESCAPE);
+ hr = UrlCanonicalizeW(winehqW, NULL, &dwSize, URL_UNESCAPE);
ok(hr == E_INVALIDARG, "Got unexpected hr %#x.\n", hr);
- hr = pUrlCanonicalizeW(winehqW, szReturnUrl, NULL, URL_UNESCAPE);
+ hr = UrlCanonicalizeW(winehqW, szReturnUrl, NULL, URL_UNESCAPE);
ok(hr == E_INVALIDARG, "Got unexpected hr %#x.\n", hr);
dwSize = 0;
- hr = pUrlCanonicalizeW(winehqW, szReturnUrl, &dwSize, URL_UNESCAPE);
+ hr = UrlCanonicalizeW(winehqW, szReturnUrl, &dwSize, URL_UNESCAPE);
ok(hr == E_INVALIDARG, "Got unexpected hr %#x.\n", hr);
/* buffer has no space for the result */
@@ -1179,7 +1110,7 @@ static void test_UrlCanonicalizeW(void)
memset(szReturnUrl, '#', (urllen+4) * sizeof(WCHAR));
szReturnUrl[urllen+4] = '\0';
SetLastError(0xdeadbeef);
- hr = pUrlCanonicalizeW(winehqW, szReturnUrl, &dwSize, URL_WININET_COMPATIBILITY | URL_ESCAPE_UNSAFE);
+ hr = UrlCanonicalizeW(winehqW, szReturnUrl, &dwSize, URL_WININET_COMPATIBILITY | URL_ESCAPE_UNSAFE);
ok( (hr == E_POINTER) && (dwSize == (urllen + 1)),
"got 0x%x with %u and size %u for %u (expected 'E_POINTER' and size %u)\n",
hr, GetLastError(), dwSize, lstrlenW(szReturnUrl), urllen+1);
@@ -1190,7 +1121,7 @@ static void test_UrlCanonicalizeW(void)
memset(szReturnUrl, '#', (urllen+4) * sizeof(WCHAR));
szReturnUrl[urllen+4] = '\0';
SetLastError(0xdeadbeef);
- hr = pUrlCanonicalizeW(winehqW, szReturnUrl, &dwSize, URL_WININET_COMPATIBILITY | URL_ESCAPE_UNSAFE);
+ hr = UrlCanonicalizeW(winehqW, szReturnUrl, &dwSize, URL_WININET_COMPATIBILITY | URL_ESCAPE_UNSAFE);
ok( (hr == E_POINTER) && (dwSize == (urllen + 1)),
"got 0x%x with %u and size %u for %u (expected 'E_POINTER' and size %u)\n",
hr, GetLastError(), dwSize, lstrlenW(szReturnUrl), urllen+1);
@@ -1200,7 +1131,7 @@ static void test_UrlCanonicalizeW(void)
memset(szReturnUrl, '#', (urllen+4) * sizeof(WCHAR));
szReturnUrl[urllen+4] = '\0';
SetLastError(0xdeadbeef);
- hr = pUrlCanonicalizeW(winehqW, szReturnUrl, &dwSize, URL_WININET_COMPATIBILITY | URL_ESCAPE_UNSAFE);
+ hr = UrlCanonicalizeW(winehqW, szReturnUrl, &dwSize, URL_WININET_COMPATIBILITY | URL_ESCAPE_UNSAFE);
ok( (hr == S_OK) && (dwSize == urllen),
"got 0x%x with %u and size %u for %u (expected 'S_OK' and size %u)\n",
hr, GetLastError(), dwSize, lstrlenW(szReturnUrl), urllen);
@@ -1210,7 +1141,7 @@ static void test_UrlCanonicalizeW(void)
memset(szReturnUrl, '#', (urllen+4) * sizeof(WCHAR));
szReturnUrl[urllen+4] = '\0';
SetLastError(0xdeadbeef);
- hr = pUrlCanonicalizeW(winehqW, szReturnUrl, &dwSize, URL_WININET_COMPATIBILITY | URL_ESCAPE_UNSAFE);
+ hr = UrlCanonicalizeW(winehqW, szReturnUrl, &dwSize, URL_WININET_COMPATIBILITY | URL_ESCAPE_UNSAFE);
ok( (hr == S_OK) && (dwSize == urllen),
"got 0x%x with %u and size %u for %u (expected 'S_OK' and size %u)\n",
hr, GetLastError(), dwSize, lstrlenW(szReturnUrl), urllen);
@@ -1226,7 +1157,7 @@ static void test_UrlCanonicalizeW(void)
pos = lstrlenW(szUrl) - 1;
szUrl[pos] = i;
urllen = INTERNET_MAX_URL_LENGTH;
- pUrlCanonicalizeW(szUrl, szReturnUrl, &urllen, 0);
+ UrlCanonicalizeW(szUrl, szReturnUrl, &urllen, 0);
choped = lstrlenW(szReturnUrl) < lstrlenW(szUrl);
ok(choped == (i <= 32), "Incorrect char chopping for char %d\n", i);
}
@@ -1244,54 +1175,47 @@ static void test_url_combine(const char *szUrl1, const char *szUrl2, DWORD dwFla
DWORD dwSize;
DWORD dwExpectLen = lstrlenA(szExpectUrl);
- if (!pUrlCombineA) {
- win_skip("UrlCombineA not found\n");
- return;
- }
-
wszUrl1 = GetWideString(szUrl1);
wszUrl2 = GetWideString(szUrl2);
wszExpectUrl = GetWideString(szExpectUrl);
- hr = pUrlCombineA(szUrl1, szUrl2, NULL, NULL, dwFlags);
+ hr = UrlCombineA(szUrl1, szUrl2, NULL, NULL, dwFlags);
ok(hr == E_INVALIDARG, "UrlCombineA returned 0x%08x, expected 0x%08x\n", hr, E_INVALIDARG);
dwSize = 0;
- hr = pUrlCombineA(szUrl1, szUrl2, NULL, &dwSize, dwFlags);
+ hr = UrlCombineA(szUrl1, szUrl2, NULL, &dwSize, dwFlags);
ok(hr == E_POINTER, "Checking length of string, return was 0x%08x, expected 0x%08x\n", hr, E_POINTER);
ok(dwSize == dwExpectLen+1, "Got length %d, expected %d\n", dwSize, dwExpectLen+1);
dwSize--;
- hr = pUrlCombineA(szUrl1, szUrl2, szReturnUrl, &dwSize, dwFlags);
+ hr = UrlCombineA(szUrl1, szUrl2, szReturnUrl, &dwSize, dwFlags);
ok(hr == E_POINTER, "UrlCombineA returned 0x%08x, expected 0x%08x\n", hr, E_POINTER);
ok(dwSize == dwExpectLen+1, "Got length %d, expected %d\n", dwSize, dwExpectLen+1);
- hr = pUrlCombineA(szUrl1, szUrl2, szReturnUrl, &dwSize, dwFlags);
+ hr = UrlCombineA(szUrl1, szUrl2, szReturnUrl, &dwSize, dwFlags);
ok(hr == dwExpectReturn, "UrlCombineA returned 0x%08x, expected 0x%08x\n", hr, dwExpectReturn);
ok(dwSize == dwExpectLen, "Got length %d, expected %d\n", dwSize, dwExpectLen);
if(SUCCEEDED(hr)) {
ok(strcmp(szReturnUrl,szExpectUrl)==0, "Expected %s, but got %s\n", szExpectUrl, szReturnUrl);
}
- if (pUrlCombineW) {
- dwSize = 0;
- hr = pUrlCombineW(wszUrl1, wszUrl2, NULL, &dwSize, dwFlags);
- ok(hr == E_POINTER, "Checking length of string, return was 0x%08x, expected 0x%08x\n", hr, E_POINTER);
- ok(dwSize == dwExpectLen+1, "Got length %d, expected %d\n", dwSize, dwExpectLen+1);
+ dwSize = 0;
+ hr = UrlCombineW(wszUrl1, wszUrl2, NULL, &dwSize, dwFlags);
+ ok(hr == E_POINTER, "Checking length of string, return was 0x%08x, expected 0x%08x\n", hr, E_POINTER);
+ ok(dwSize == dwExpectLen+1, "Got length %d, expected %d\n", dwSize, dwExpectLen+1);
- dwSize--;
- hr = pUrlCombineW(wszUrl1, wszUrl2, wszReturnUrl, &dwSize, dwFlags);
- ok(hr == E_POINTER, "UrlCombineW returned 0x%08x, expected 0x%08x\n", hr, E_POINTER);
- ok(dwSize == dwExpectLen+1, "Got length %d, expected %d\n", dwSize, dwExpectLen+1);
+ dwSize--;
+ hr = UrlCombineW(wszUrl1, wszUrl2, wszReturnUrl, &dwSize, dwFlags);
+ ok(hr == E_POINTER, "UrlCombineW returned 0x%08x, expected 0x%08x\n", hr, E_POINTER);
+ ok(dwSize == dwExpectLen+1, "Got length %d, expected %d\n", dwSize, dwExpectLen+1);
- hr = pUrlCombineW(wszUrl1, wszUrl2, wszReturnUrl, &dwSize, dwFlags);
- ok(hr == dwExpectReturn, "UrlCombineW returned 0x%08x, expected 0x%08x\n", hr, dwExpectReturn);
- ok(dwSize == dwExpectLen, "Got length %d, expected %d\n", dwSize, dwExpectLen);
- if(SUCCEEDED(hr)) {
- wszConvertedUrl = GetWideString(szReturnUrl);
- ok(lstrcmpW(wszReturnUrl, wszConvertedUrl)==0, "Strings didn't match between ansi and unicode UrlCombine!\n");
- FreeWideString(wszConvertedUrl);
- }
+ hr = UrlCombineW(wszUrl1, wszUrl2, wszReturnUrl, &dwSize, dwFlags);
+ ok(hr == dwExpectReturn, "UrlCombineW returned 0x%08x, expected 0x%08x\n", hr, dwExpectReturn);
+ ok(dwSize == dwExpectLen, "Got length %d, expected %d\n", dwSize, dwExpectLen);
+ if(SUCCEEDED(hr)) {
+ wszConvertedUrl = GetWideString(szReturnUrl);
+ ok(lstrcmpW(wszReturnUrl, wszConvertedUrl)==0, "Strings didn't match between ansi and unicode UrlCombine!\n");
+ FreeWideString(wszConvertedUrl);
}
FreeWideString(wszUrl1);
@@ -1320,32 +1244,25 @@ static void test_UrlCreateFromPath(void)
WCHAR ret_urlW[INTERNET_MAX_URL_LENGTH];
WCHAR *pathW, *urlW;
- if (!pUrlCreateFromPathA) {
- win_skip("UrlCreateFromPathA not found\n");
- return;
- }
-
for (i = 0; i < ARRAY_SIZE(TEST_URLFROMPATH); i++) {
len = INTERNET_MAX_URL_LENGTH;
- ret = pUrlCreateFromPathA(TEST_URLFROMPATH[i].path, ret_url, &len, 0);
+ ret = UrlCreateFromPathA(TEST_URLFROMPATH[i].path, ret_url, &len, 0);
ok(ret == TEST_URLFROMPATH[i].ret, "ret %08x from path %s\n", ret, TEST_URLFROMPATH[i].path);
ok(!lstrcmpiA(ret_url, TEST_URLFROMPATH[i].url), "url %s from path %s\n", ret_url, TEST_URLFROMPATH[i].path);
ok(len == strlen(ret_url), "ret len %d from path %s\n", len, TEST_URLFROMPATH[i].path);
- if (pUrlCreateFromPathW) {
- len = INTERNET_MAX_URL_LENGTH;
- pathW = GetWideString(TEST_URLFROMPATH[i].path);
- urlW = GetWideString(TEST_URLFROMPATH[i].url);
- ret = pUrlCreateFromPathW(pathW, ret_urlW, &len, 0);
- WideCharToMultiByte(CP_ACP, 0, ret_urlW, -1, ret_url, sizeof(ret_url),0,0);
- ok(ret == TEST_URLFROMPATH[i].ret, "ret %08x from path L\"%s\", expected %08x\n",
- ret, TEST_URLFROMPATH[i].path, TEST_URLFROMPATH[i].ret);
- ok(!lstrcmpiW(ret_urlW, urlW), "got %s expected %s from path L\"%s\"\n",
- ret_url, TEST_URLFROMPATH[i].url, TEST_URLFROMPATH[i].path);
- ok(len == lstrlenW(ret_urlW), "ret len %d from path L\"%s\"\n", len, TEST_URLFROMPATH[i].path);
- FreeWideString(urlW);
- FreeWideString(pathW);
- }
+ len = INTERNET_MAX_URL_LENGTH;
+ pathW = GetWideString(TEST_URLFROMPATH[i].path);
+ urlW = GetWideString(TEST_URLFROMPATH[i].url);
+ ret = UrlCreateFromPathW(pathW, ret_urlW, &len, 0);
+ WideCharToMultiByte(CP_ACP, 0, ret_urlW, -1, ret_url, sizeof(ret_url),0,0);
+ ok(ret == TEST_URLFROMPATH[i].ret, "ret %08x from path L\"%s\", expected %08x\n",
+ ret, TEST_URLFROMPATH[i].path, TEST_URLFROMPATH[i].ret);
+ ok(!lstrcmpiW(ret_urlW, urlW), "got %s expected %s from path L\"%s\"\n",
+ ret_url, TEST_URLFROMPATH[i].url, TEST_URLFROMPATH[i].path);
+ ok(len == lstrlenW(ret_urlW), "ret len %d from path L\"%s\"\n", len, TEST_URLFROMPATH[i].path);
+ FreeWideString(urlW);
+ FreeWideString(pathW);
}
}
@@ -1354,9 +1271,9 @@ static void test_UrlCreateFromPath(void)
static void test_UrlIs_null(DWORD flag)
{
BOOL ret;
- ret = pUrlIsA(NULL, flag);
+ ret = UrlIsA(NULL, flag);
ok(ret == FALSE, "pUrlIsA(NULL, %d) failed\n", flag);
- ret = pUrlIsW(NULL, flag);
+ ret = UrlIsW(NULL, flag);
ok(ret == FALSE, "pUrlIsW(NULL, %d) failed\n", flag);
}
@@ -1366,11 +1283,6 @@ static void test_UrlIs(void)
size_t i;
WCHAR wurl[80];
- if (!pUrlIsA) {
- win_skip("UrlIsA not found\n");
- return;
- }
-
test_UrlIs_null(URLIS_APPLIABLE);
test_UrlIs_null(URLIS_DIRECTORY);
test_UrlIs_null(URLIS_FILEURL);
@@ -1382,40 +1294,36 @@ static void test_UrlIs(void)
for (i = 0; i < ARRAY_SIZE(TEST_PATH_IS_URL); i++) {
MultiByteToWideChar(CP_ACP, 0, TEST_PATH_IS_URL[i].path, -1, wurl, ARRAY_SIZE(wurl));
- ret = pUrlIsA( TEST_PATH_IS_URL[i].path, URLIS_URL );
+ ret = UrlIsA( TEST_PATH_IS_URL[i].path, URLIS_URL );
ok( ret == TEST_PATH_IS_URL[i].expect,
"returned %d from path %s, expected %d\n", ret, TEST_PATH_IS_URL[i].path,
TEST_PATH_IS_URL[i].expect );
- if (pUrlIsW) {
- ret = pUrlIsW( wurl, URLIS_URL );
- ok( ret == TEST_PATH_IS_URL[i].expect,
- "returned %d from path (UrlIsW) %s, expected %d\n", ret,
- TEST_PATH_IS_URL[i].path, TEST_PATH_IS_URL[i].expect );
- }
+ ret = UrlIsW( wurl, URLIS_URL );
+ ok( ret == TEST_PATH_IS_URL[i].expect,
+ "returned %d from path (UrlIsW) %s, expected %d\n", ret,
+ TEST_PATH_IS_URL[i].path, TEST_PATH_IS_URL[i].expect );
}
for (i = 0; i < ARRAY_SIZE(TEST_URLIS_ATTRIBS); i++) {
MultiByteToWideChar(CP_ACP, 0, TEST_URLIS_ATTRIBS[i].url, -1, wurl, ARRAY_SIZE(wurl));
- ret = pUrlIsA( TEST_URLIS_ATTRIBS[i].url, URLIS_OPAQUE);
+ ret = UrlIsA( TEST_URLIS_ATTRIBS[i].url, URLIS_OPAQUE);
ok( ret == TEST_URLIS_ATTRIBS[i].expectOpaque,
"returned %d for URLIS_OPAQUE, url \"%s\", expected %d\n", ret, TEST_URLIS_ATTRIBS[i].url,
TEST_URLIS_ATTRIBS[i].expectOpaque );
- ret = pUrlIsA( TEST_URLIS_ATTRIBS[i].url, URLIS_FILEURL);
+ ret = UrlIsA( TEST_URLIS_ATTRIBS[i].url, URLIS_FILEURL);
ok( ret == TEST_URLIS_ATTRIBS[i].expectFile,
"returned %d for URLIS_FILEURL, url \"%s\", expected %d\n", ret, TEST_URLIS_ATTRIBS[i].url,
TEST_URLIS_ATTRIBS[i].expectFile );
- if (pUrlIsW) {
- ret = pUrlIsW( wurl, URLIS_OPAQUE);
- ok( ret == TEST_URLIS_ATTRIBS[i].expectOpaque,
- "returned %d for URLIS_OPAQUE (UrlIsW), url \"%s\", expected %d\n",
- ret, TEST_URLIS_ATTRIBS[i].url, TEST_URLIS_ATTRIBS[i].expectOpaque );
- ret = pUrlIsW( wurl, URLIS_FILEURL);
- ok( ret == TEST_URLIS_ATTRIBS[i].expectFile,
- "returned %d for URLIS_FILEURL (UrlIsW), url \"%s\", expected %d\n",
- ret, TEST_URLIS_ATTRIBS[i].url, TEST_URLIS_ATTRIBS[i].expectFile );
- }
+ ret = UrlIsW( wurl, URLIS_OPAQUE);
+ ok( ret == TEST_URLIS_ATTRIBS[i].expectOpaque,
+ "returned %d for URLIS_OPAQUE (UrlIsW), url \"%s\", expected %d\n",
+ ret, TEST_URLIS_ATTRIBS[i].url, TEST_URLIS_ATTRIBS[i].expectOpaque );
+ ret = UrlIsW( wurl, URLIS_FILEURL);
+ ok( ret == TEST_URLIS_ATTRIBS[i].expectFile,
+ "returned %d for URLIS_FILEURL (UrlIsW), url \"%s\", expected %d\n",
+ ret, TEST_URLIS_ATTRIBS[i].url, TEST_URLIS_ATTRIBS[i].expectFile );
}
}
@@ -1436,13 +1344,9 @@ static void test_UrlUnescape(void)
'C',':','/','P','r','o','g','r','a','m','%','2','0','F','i','l','e','s',0};
HRESULT res;
- if (!pUrlUnescapeA) {
- win_skip("UrlUnescapeA not found\n");
- return;
- }
for (i = 0; i < ARRAY_SIZE(TEST_URL_UNESCAPE); i++) {
dwEscaped=INTERNET_MAX_URL_LENGTH;
- res = pUrlUnescapeA(TEST_URL_UNESCAPE[i].url, szReturnUrl, &dwEscaped, 0);
+ res = UrlUnescapeA(TEST_URL_UNESCAPE[i].url, szReturnUrl, &dwEscaped, 0);
ok(res == S_OK,
"UrlUnescapeA returned 0x%x (expected S_OK) for \"%s\"\n",
res, TEST_URL_UNESCAPE[i].url);
@@ -1450,53 +1354,49 @@ static void test_UrlUnescape(void)
ZeroMemory(szReturnUrl, sizeof(szReturnUrl));
/* if we set the buffer pointer to NULL here, UrlUnescape fails and the string is not converted */
- res = pUrlUnescapeA(TEST_URL_UNESCAPE[i].url, szReturnUrl, NULL, 0);
+ res = UrlUnescapeA(TEST_URL_UNESCAPE[i].url, szReturnUrl, NULL, 0);
ok(res == E_INVALIDARG,
"UrlUnescapeA returned 0x%x (expected E_INVALIDARG) for \"%s\"\n",
res, TEST_URL_UNESCAPE[i].url);
ok(strcmp(szReturnUrl,"")==0, "Expected empty string\n");
- if (pUrlUnescapeW) {
- dwEscaped = INTERNET_MAX_URL_LENGTH;
- urlW = GetWideString(TEST_URL_UNESCAPE[i].url);
- expected_urlW = GetWideString(TEST_URL_UNESCAPE[i].expect);
- res = pUrlUnescapeW(urlW, ret_urlW, &dwEscaped, 0);
- ok(res == S_OK,
- "UrlUnescapeW returned 0x%x (expected S_OK) for \"%s\"\n",
- res, TEST_URL_UNESCAPE[i].url);
+ dwEscaped = INTERNET_MAX_URL_LENGTH;
+ urlW = GetWideString(TEST_URL_UNESCAPE[i].url);
+ expected_urlW = GetWideString(TEST_URL_UNESCAPE[i].expect);
+ res = UrlUnescapeW(urlW, ret_urlW, &dwEscaped, 0);
+ ok(res == S_OK,
+ "UrlUnescapeW returned 0x%x (expected S_OK) for \"%s\"\n",
+ res, TEST_URL_UNESCAPE[i].url);
- WideCharToMultiByte(CP_ACP,0,ret_urlW,-1,szReturnUrl,INTERNET_MAX_URL_LENGTH,0,0);
- ok(lstrcmpW(ret_urlW, expected_urlW)==0,
- "Expected \"%s\", but got \"%s\" from \"%s\" flags %08lx\n",
- TEST_URL_UNESCAPE[i].expect, szReturnUrl, TEST_URL_UNESCAPE[i].url, 0L);
- FreeWideString(urlW);
- FreeWideString(expected_urlW);
- }
+ WideCharToMultiByte(CP_ACP,0,ret_urlW,-1,szReturnUrl,INTERNET_MAX_URL_LENGTH,0,0);
+ ok(lstrcmpW(ret_urlW, expected_urlW)==0,
+ "Expected \"%s\", but got \"%s\" from \"%s\" flags %08lx\n",
+ TEST_URL_UNESCAPE[i].expect, szReturnUrl, TEST_URL_UNESCAPE[i].url, 0L);
+ FreeWideString(urlW);
+ FreeWideString(expected_urlW);
}
dwEscaped = sizeof(inplace);
- res = pUrlUnescapeA(inplace, NULL, &dwEscaped, URL_UNESCAPE_INPLACE);
+ res = UrlUnescapeA(inplace, NULL, &dwEscaped, URL_UNESCAPE_INPLACE);
ok(res == S_OK, "UrlUnescapeA returned 0x%x (expected S_OK)\n", res);
ok(!strcmp(inplace, expected), "got %s expected %s\n", inplace, expected);
ok(dwEscaped == 27, "got %d expected 27\n", dwEscaped);
/* if we set the buffer pointer to NULL, the string apparently still gets converted (Google Lively does this) */
- res = pUrlUnescapeA(another_inplace, NULL, NULL, URL_UNESCAPE_INPLACE);
+ res = UrlUnescapeA(another_inplace, NULL, NULL, URL_UNESCAPE_INPLACE);
ok(res == S_OK, "UrlUnescapeA returned 0x%x (expected S_OK)\n", res);
ok(!strcmp(another_inplace, expected), "got %s expected %s\n", another_inplace, expected);
- if (pUrlUnescapeW) {
- dwEscaped = sizeof(inplaceW);
- res = pUrlUnescapeW(inplaceW, NULL, &dwEscaped, URL_UNESCAPE_INPLACE);
- ok(res == S_OK, "UrlUnescapeW returned 0x%x (expected S_OK)\n", res);
- ok(dwEscaped == 50, "got %d expected 50\n", dwEscaped);
+ dwEscaped = sizeof(inplaceW);
+ res = UrlUnescapeW(inplaceW, NULL, &dwEscaped, URL_UNESCAPE_INPLACE);
+ ok(res == S_OK, "UrlUnescapeW returned 0x%x (expected S_OK)\n", res);
+ ok(dwEscaped == 50, "got %d expected 50\n", dwEscaped);
- /* if we set the buffer pointer to NULL, the string apparently still gets converted (Google Lively does this) */
- res = pUrlUnescapeW(another_inplaceW, NULL, NULL, URL_UNESCAPE_INPLACE);
- ok(res == S_OK, "UrlUnescapeW returned 0x%x (expected S_OK)\n", res);
+ /* if we set the buffer pointer to NULL, the string apparently still gets converted (Google Lively does this) */
+ res = UrlUnescapeW(another_inplaceW, NULL, NULL, URL_UNESCAPE_INPLACE);
+ ok(res == S_OK, "UrlUnescapeW returned 0x%x (expected S_OK)\n", res);
- ok(lstrlenW(another_inplaceW) == 24, "got %d expected 24\n", lstrlenW(another_inplaceW));
- }
+ ok(lstrlenW(another_inplaceW) == 24, "got %d expected 24\n", lstrlenW(another_inplaceW));
}
static const struct parse_url_test_t {
@@ -1534,7 +1434,7 @@ static void test_ParseURL(void)
for (test = parse_url_tests; test < parse_url_tests + ARRAY_SIZE(parse_url_tests); test++) {
memset(&parseda, 0xd0, sizeof(parseda));
parseda.cbSize = sizeof(parseda);
- hres = pParseURLA(test->url, &parseda);
+ hres = ParseURLA(test->url, &parseda);
ok(hres == test->hres, "ParseURL failed: %08x, expected %08x\n", hres, test->hres);
if(hres == S_OK) {
ok(parseda.pszProtocol == test->url, "parseda.pszProtocol = %s, expected %s\n",
@@ -1557,7 +1457,7 @@ static void test_ParseURL(void)
memset(&parsedw, 0xd0, sizeof(parsedw));
parsedw.cbSize = sizeof(parsedw);
- hres = pParseURLW(url, &parsedw);
+ hres = ParseURLW(url, &parsedw);
ok(hres == test->hres, "ParseURL failed: %08x, expected %08x\n", hres, test->hres);
if(hres == S_OK) {
ok(parsedw.pszProtocol == url, "parsedw.pszProtocol = %s, expected %s\n",
@@ -1598,36 +1498,36 @@ static void test_HashData(void)
int i;
/* Test hashing with identically sized input/output buffers. */
- res = pHashData(input, 16, output, 16);
+ res = HashData(input, 16, output, 16);
ok(res == S_OK, "Expected HashData to return S_OK, got 0x%08x\n", res);
if(res == S_OK)
ok(!memcmp(output, expected, sizeof(expected)),
"Output buffer did not match expected contents\n");
/* Test hashing with larger output buffer. */
- res = pHashData(input, 16, output, 32);
+ res = HashData(input, 16, output, 32);
ok(res == S_OK, "Expected HashData to return S_OK, got 0x%08x\n", res);
if(res == S_OK)
ok(!memcmp(output, expected2, sizeof(expected2)),
"Output buffer did not match expected contents\n");
/* Test hashing with smaller input buffer. */
- res = pHashData(input, 8, output, 16);
+ res = HashData(input, 8, output, 16);
ok(res == S_OK, "Expected HashData to return S_OK, got 0x%08x\n", res);
if(res == S_OK)
ok(!memcmp(output, expected3, sizeof(expected3)),
"Output buffer did not match expected contents\n");
/* Test passing NULL pointers for input/output parameters. */
- res = pHashData(NULL, 0, NULL, 0);
+ res = HashData(NULL, 0, NULL, 0);
ok(res == E_INVALIDARG || broken(res == S_OK), /* Windows 2000 */
"Expected HashData to return E_INVALIDARG, got 0x%08x\n", res);
- res = pHashData(input, 0, NULL, 0);
+ res = HashData(input, 0, NULL, 0);
ok(res == E_INVALIDARG || broken(res == S_OK), /* Windows 2000 */
"Expected HashData to return E_INVALIDARG, got 0x%08x\n", res);
- res = pHashData(NULL, 0, output, 0);
+ res = HashData(NULL, 0, output, 0);
ok(res == E_INVALIDARG || broken(res == S_OK), /* Windows 2000 */
"Expected HashData to return E_INVALIDARG, got 0x%08x\n", res);
@@ -1638,7 +1538,7 @@ static void test_HashData(void)
for (i = 0; i < ARRAY_SIZE(output); i++)
output[i] = 0xFF;
- res = pHashData(input, 0, output, 0);
+ res = HashData(input, 0, output, 0);
ok(res == S_OK, "Expected HashData to return S_OK, got 0x%08x\n", res);
/* The buffers should be unchanged. */
@@ -1655,12 +1555,12 @@ static void test_HashData(void)
}
/* Input/output parameters are not validated. */
- res = pHashData((BYTE *)0xdeadbeef, 0, (BYTE *)0xdeadbeef, 0);
+ res = HashData((BYTE *)0xdeadbeef, 0, (BYTE *)0xdeadbeef, 0);
ok(res == S_OK, "Expected HashData to return S_OK, got 0x%08x\n", res);
if (0)
{
- res = pHashData((BYTE *)0xdeadbeef, 1, (BYTE *)0xdeadbeef, 1);
+ res = HashData((BYTE *)0xdeadbeef, 1, (BYTE *)0xdeadbeef, 1);
trace("HashData returned 0x%08x\n", res);
}
}
@@ -1669,39 +1569,6 @@ static void test_HashData(void)
START_TEST(url)
{
- char *pFunc;
-
- hShlwapi = GetModuleHandleA("shlwapi.dll");
-
- /* SHCreateStreamOnFileEx was introduced in shlwapi v6.0 */
- pFunc = (void*)GetProcAddress(hShlwapi, "SHCreateStreamOnFileEx");
- if(!pFunc){
- win_skip("Too old shlwapi version\n");
- return;
- }
-
- pUrlUnescapeA = (void *) GetProcAddress(hShlwapi, "UrlUnescapeA");
- pUrlUnescapeW = (void *) GetProcAddress(hShlwapi, "UrlUnescapeW");
- pUrlIsA = (void *) GetProcAddress(hShlwapi, "UrlIsA");
- pUrlIsW = (void *) GetProcAddress(hShlwapi, "UrlIsW");
- pUrlHashA = (void *) GetProcAddress(hShlwapi, "UrlHashA");
- pUrlHashW = (void *) GetProcAddress(hShlwapi, "UrlHashW");
- pUrlGetPartA = (void *) GetProcAddress(hShlwapi, "UrlGetPartA");
- pUrlGetPartW = (void *) GetProcAddress(hShlwapi, "UrlGetPartW");
- pUrlEscapeA = (void *) GetProcAddress(hShlwapi, "UrlEscapeA");
- pUrlEscapeW = (void *) GetProcAddress(hShlwapi, "UrlEscapeW");
- pUrlCreateFromPathA = (void *) GetProcAddress(hShlwapi, "UrlCreateFromPathA");
- pUrlCreateFromPathW = (void *) GetProcAddress(hShlwapi, "UrlCreateFromPathW");
- pUrlCombineA = (void *) GetProcAddress(hShlwapi, "UrlCombineA");
- pUrlCombineW = (void *) GetProcAddress(hShlwapi, "UrlCombineW");
- pUrlCanonicalizeA = (void *) GetProcAddress(hShlwapi, "UrlCanonicalizeA");
- pUrlCanonicalizeW = (void *) GetProcAddress(hShlwapi, "UrlCanonicalizeW");
- pUrlApplySchemeA = (void *) GetProcAddress(hShlwapi, "UrlApplySchemeA");
- pUrlApplySchemeW = (void *) GetProcAddress(hShlwapi, "UrlApplySchemeW");
- pParseURLA = (void*)GetProcAddress(hShlwapi, (LPCSTR)1);
- pParseURLW = (void*)GetProcAddress(hShlwapi, (LPCSTR)2);
- pHashData = (void*)GetProcAddress(hShlwapi, "HashData");
-
test_UrlApplyScheme();
test_UrlHash();
test_UrlGetPart();
--
2.34.1
1
4
Feb. 8, 2022
Signed-off-by: Brendan Shanks <bshanks(a)codeweavers.com>
---
Fixes a crash where two threads calling SetupDiGetClassDevs() would end
up in alloc_devnode() at the same time. One thread would start iterating
through the table after devnode_table_size was set but before
devnode_table was allocated, and crash.
dlls/setupapi/devinst.c | 28 +++++++++++++++++++++++++---
1 file changed, 25 insertions(+), 3 deletions(-)
diff --git a/dlls/setupapi/devinst.c b/dlls/setupapi/devinst.c
index ecc0b58ca5c..f3ae4fdb1da 100644
--- a/dlls/setupapi/devinst.c
+++ b/dlls/setupapi/devinst.c
@@ -233,11 +233,21 @@ static inline void copy_device_iface_data(SP_DEVICE_INTERFACE_DATA *data,
static struct device **devnode_table;
static unsigned int devnode_table_size;
+static CRITICAL_SECTION devnode_table_cs;
+static CRITICAL_SECTION_DEBUG critsect_debug =
+{
+ 0, 0, &devnode_table_cs,
+ { &critsect_debug.ProcessLocksList, &critsect_debug.ProcessLocksList },
+ 0, 0, { (DWORD_PTR)(__FILE__ ": devnode_table_cs") }
+};
+static CRITICAL_SECTION devnode_table_cs = { &critsect_debug, -1, 0, 0, 0, 0 };
static DEVINST alloc_devnode(struct device *device)
{
unsigned int i;
+ EnterCriticalSection(&devnode_table_cs);
+
for (i = 0; i < devnode_table_size; ++i)
{
if (!devnode_table[i])
@@ -260,21 +270,33 @@ static DEVINST alloc_devnode(struct device *device)
}
devnode_table[i] = device;
+
+ LeaveCriticalSection(&devnode_table_cs);
+
return i;
}
static void free_devnode(DEVINST devnode)
{
+ EnterCriticalSection(&devnode_table_cs);
devnode_table[devnode] = NULL;
+ LeaveCriticalSection(&devnode_table_cs);
}
static struct device *get_devnode_device(DEVINST devnode)
{
+ struct device *device = NULL;
+
+ EnterCriticalSection(&devnode_table_cs);
+
if (devnode < devnode_table_size)
- return devnode_table[devnode];
+ device = devnode_table[devnode];
+ else
+ WARN("device node %u not found\n", devnode);
- WARN("device node %u not found\n", devnode);
- return NULL;
+ LeaveCriticalSection(&devnode_table_cs);
+
+ return device;
}
static void SETUPDI_GuidToString(const GUID *guid, LPWSTR guidStr)
--
2.32.0 (Apple Git-132)
2
2
[tools 1/3] testbot/SetWinLocale: Better detect when Windows has rebooted.
by Francois Gouget Feb. 8, 2022
by Francois Gouget Feb. 8, 2022
Feb. 8, 2022
This no longer relies on a long pause to give time for Windows to start
rebooting and should detect when TestAgentd is ready again faster.
Signed-off-by: Francois Gouget <fgouget(a)codeweavers.com>
---
testbot/bin/SetWinLocale | 15 ++++++++-------
1 file changed, 8 insertions(+), 7 deletions(-)
diff --git a/testbot/bin/SetWinLocale b/testbot/bin/SetWinLocale
index 2324a5cb16..dc551853af 100755
--- a/testbot/bin/SetWinLocale
+++ b/testbot/bin/SetWinLocale
@@ -902,18 +902,19 @@ if ($OptReboot)
{
my $Cmd = ["shutdown.exe", "/r", "/t", "0"];
Debug(Elapsed($Start), " Rebooting: ", join(" ", @$Cmd), "\n");
+ my $OldCount = $TA->GetProperties("start.count");
$TA->Run($Cmd, 0);
# Note that we cannot wait for this command since it reboots Windows
- # Wait a bit to make sure we don't reconnect before Windows has rebooted.
- sleep(30);
-
- Debug(Elapsed($Start), " Waiting for Windows to boot\n");
- $TA->SetConnectTimeout(undef, undef, $WaitForBoot);
- if (!$TA->Ping())
+ my ($OneTimeout, $MinAttempts, $MinTimeout) = $TA->SetConnectTimeout(3, 1, 3);
+ while (1)
{
- FatalError("could not reconnect to $OptHostName after the reboot: ", $TA->GetLastError(), "\n");
+ my $NewCount = $TA->GetProperties("start.count");
+ next if (!defined $NewCount); # Rebooting (TestAgentd is not running)
+ last if ($NewCount != $OldCount); # start.count got incremented
+ sleep(10); # Not rebooting yet
}
+ $TA->SetConnectTimeout($OneTimeout, $MinAttempts, $MinTimeout);
# Skip this check on pre-Windows 10 versions, i.e. those that don't have
# 'CountryName' and if the settings were not changed in the first place.
--
2.30.2
1
2
[tools] testbot/LibvirtTool: Revert() does not need its own VM object.
by Francois Gouget Feb. 8, 2022
by Francois Gouget Feb. 8, 2022
Feb. 8, 2022
Signed-off-by: Francois Gouget <fgouget(a)codeweavers.com>
---
testbot/bin/LibvirtTool.pl | 7 +++----
1 file changed, 3 insertions(+), 4 deletions(-)
diff --git a/testbot/bin/LibvirtTool.pl b/testbot/bin/LibvirtTool.pl
index 7a865499c2..b6b1fad581 100755
--- a/testbot/bin/LibvirtTool.pl
+++ b/testbot/bin/LibvirtTool.pl
@@ -447,9 +447,9 @@ sub CheckOff()
return ChangeStatus("dirty", "off", "done");
}
-sub SetupTestAgentd($$$$)
+sub SetupTestAgentd($$$)
{
- my ($VM, $Booting, $UpgradeTestAgentd, $ResetStartCount) = @_;
+ my ($Booting, $UpgradeTestAgentd, $ResetStartCount) = @_;
Debug(Elapsed($Start), " Setting up the $VMKey TestAgent server\n");
LogMsg "Setting up the $VMKey TestAgent server\n";
@@ -572,7 +572,6 @@ sub CreateSnapshot($$)
sub Revert()
{
- my $VM = CreateVMs()->GetItem($VMKey);
if (!$Debug and $VM->Status ne "reverting")
{
Error("The VM is not ready to be reverted (". $VM->Status .")\n");
@@ -648,7 +647,7 @@ sub Revert()
# Set up the TestAgent server. Note that setting the locale will require a
# reboot so reset start.count in that case.
- SetupTestAgentd($VM, $Booting, ($CreateSnapshot or $SetLocale), $SetLocale);
+ SetupTestAgentd($Booting, ($CreateSnapshot or $SetLocale), $SetLocale);
if ($CreateSnapshot)
{
--
2.30.2
1
0
Feb. 8, 2022
Multiple VMs may be reverted at the same time (either on the same VM
host or on separate hosts) so this is needed to know which VM the error
is about.
Signed-off-by: Francois Gouget <fgouget(a)codeweavers.com>
---
testbot/bin/LibvirtTool.pl | 22 +++++++++++-----------
1 file changed, 11 insertions(+), 11 deletions(-)
diff --git a/testbot/bin/LibvirtTool.pl b/testbot/bin/LibvirtTool.pl
index b6b1fad581..681223f11c 100755
--- a/testbot/bin/LibvirtTool.pl
+++ b/testbot/bin/LibvirtTool.pl
@@ -132,7 +132,7 @@ if (!defined $Usage)
$VM = CreateVMs()->GetItem($VMKey);
if (!defined $VM)
{
- Error "VM $VMKey does not exist\n";
+ Error "The $VMKey VM does not exist\n";
$Usage = 2;
}
}
@@ -301,7 +301,7 @@ sub ShutDown()
my $PTA = GetPrivilegedTA($VM->GetAgent());
if (!$PTA->Run($Cmd, 0))
{
- Error "Could not run @$Cmd: ". $PTA->GetLastError() ."\n";
+ Error "Could not run @$Cmd on $VMKey: ". $PTA->GetLastError() ."\n";
$Success = 0;
}
else
@@ -469,14 +469,14 @@ sub SetupTestAgentd($$$)
LogMsg "Upgrading the $VMKey TestAgent server from $Version\n";
if ($Version !~ / ([0-9]+)\.([0-9]+)$/)
{
- FatalError("Unsupported TestAgent server version: $Version\n");
+ FatalError("Unsupported TestAgent server version on $VMKey: $Version\n");
}
# We want 'TestAgentd --detach --show-restarts' on Windows but this was
# not supported before this version and changing how the server is started
# is too complex.
if (!$TA->HasMinVersion(1, 7))
{
- FatalError("The TestAgent server is too old to be upgraded: $Version\n");
+ FatalError("The $VMKey TestAgent server is too old to be upgraded: $Version\n");
}
if (!$TA->Upgrade("$DataDir/latest/TestAgentd.exe"))
@@ -506,10 +506,10 @@ sub SetupTestAgentd($$$)
# HTTPS certificates), but also for the build (if the time moves forward
# during the build some ccache versions will return a compilation error).
my $PTA = GetPrivilegedTA($TA);
- FatalError("Cannot set the VM system time\n") if (!$PTA);
+ FatalError("Cannot set the $VMKey VM system time\n") if (!$PTA);
if (!$PTA->SetTime())
{
- FatalError("Setting the VM system time failed: ". $PTA->GetLastError() ."\n");
+ FatalError("Setting the $VMKey VM system time failed: ". $PTA->GetLastError() ."\n");
}
if ($Booting and $VM->Type eq "wine")
@@ -518,16 +518,16 @@ sub SetupTestAgentd($$$)
Debug(Elapsed($Start), " Waiting for the X session\n");
LogMsg "Waiting for the $VMKey X session\n";
my $Pid = $TA->Run(["sh", "-c", "while ! xset -display :0.0 q >/dev/null; do sleep 1; done"], 0);
- FatalError("Could not check for the X session on $VMKey\n") if (!$Pid);
+ FatalError("Could not check for the $VMKey X session\n") if (!$Pid);
if (!defined $TA->Wait($Pid, $SleepAfterBoot))
{
my $ErrMessage = $TA->GetLastError();
if ($ErrMessage =~ /timed out waiting for the child process/)
{
- FatalError("Timed out waiting for the X session\n");
+ FatalError("Timed out waiting for the $VMKey X session\n");
}
- FatalError("An error occurred while waiting for the X session: $ErrMessage\n");
+ FatalError("An error occurred while waiting for the $VMKey X session: $ErrMessage\n");
}
}
@@ -544,7 +544,7 @@ sub SetupTestAgentd($$$)
my $Count = $TA->GetProperties("start.count");
if (defined $Count and $Count > 1)
{
- FatalError("The VM has been rebooted too many times: start.count=$Count > 1");
+ FatalError("$VMKey has been rebooted too many times: start.count=$Count > 1");
}
}
$PTA->Disconnect();
@@ -574,7 +574,7 @@ sub Revert()
{
if (!$Debug and $VM->Status ne "reverting")
{
- Error("The VM is not ready to be reverted (". $VM->Status .")\n");
+ Error("$VMKey is not ready to be reverted (". $VM->Status .")\n");
return 1;
}
$CurrentStatus = "reverting";
--
2.30.2
1
0