winehq.org
Sign In
Sign Up
Sign In
Sign Up
Manage this list
×
Keyboard Shortcuts
Thread View
j
: Next unread message
k
: Previous unread message
j a
: Jump to all threads
j l
: Jump to MailingList overview
2025
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
List overview
wine-commits
March 2011
----- 2025 -----
June 2025
May 2025
April 2025
March 2025
February 2025
January 2025
----- 2024 -----
December 2024
November 2024
October 2024
September 2024
August 2024
July 2024
June 2024
May 2024
April 2024
March 2024
February 2024
January 2024
----- 2023 -----
December 2023
November 2023
October 2023
September 2023
August 2023
July 2023
June 2023
May 2023
April 2023
March 2023
February 2023
January 2023
----- 2022 -----
December 2022
November 2022
October 2022
September 2022
August 2022
July 2022
June 2022
May 2022
April 2022
March 2022
February 2022
January 2022
----- 2021 -----
December 2021
November 2021
October 2021
September 2021
August 2021
July 2021
June 2021
May 2021
April 2021
March 2021
February 2021
January 2021
----- 2020 -----
December 2020
November 2020
October 2020
September 2020
August 2020
July 2020
June 2020
May 2020
April 2020
March 2020
February 2020
January 2020
----- 2019 -----
December 2019
November 2019
October 2019
September 2019
August 2019
July 2019
June 2019
May 2019
April 2019
March 2019
February 2019
January 2019
----- 2018 -----
December 2018
November 2018
October 2018
September 2018
August 2018
July 2018
June 2018
May 2018
April 2018
March 2018
February 2018
January 2018
----- 2017 -----
December 2017
November 2017
October 2017
September 2017
August 2017
July 2017
June 2017
May 2017
April 2017
March 2017
February 2017
January 2017
----- 2016 -----
December 2016
November 2016
October 2016
September 2016
August 2016
July 2016
June 2016
May 2016
April 2016
March 2016
February 2016
January 2016
----- 2015 -----
December 2015
November 2015
October 2015
September 2015
August 2015
July 2015
June 2015
May 2015
April 2015
March 2015
February 2015
January 2015
----- 2014 -----
December 2014
November 2014
October 2014
September 2014
August 2014
July 2014
June 2014
May 2014
April 2014
March 2014
February 2014
January 2014
----- 2013 -----
December 2013
November 2013
October 2013
September 2013
August 2013
July 2013
June 2013
May 2013
April 2013
March 2013
February 2013
January 2013
----- 2012 -----
December 2012
November 2012
October 2012
September 2012
August 2012
July 2012
June 2012
May 2012
April 2012
March 2012
February 2012
January 2012
----- 2011 -----
December 2011
November 2011
October 2011
September 2011
August 2011
July 2011
June 2011
May 2011
April 2011
March 2011
February 2011
January 2011
----- 2010 -----
December 2010
November 2010
October 2010
September 2010
August 2010
July 2010
June 2010
May 2010
April 2010
March 2010
February 2010
January 2010
----- 2009 -----
December 2009
November 2009
October 2009
September 2009
August 2009
July 2009
June 2009
May 2009
April 2009
March 2009
February 2009
January 2009
----- 2008 -----
December 2008
November 2008
October 2008
September 2008
August 2008
July 2008
June 2008
May 2008
April 2008
March 2008
February 2008
January 2008
----- 2007 -----
December 2007
November 2007
October 2007
September 2007
August 2007
July 2007
June 2007
May 2007
April 2007
March 2007
February 2007
January 2007
----- 2006 -----
December 2006
November 2006
October 2006
September 2006
August 2006
July 2006
June 2006
May 2006
April 2006
March 2006
February 2006
January 2006
----- 2005 -----
December 2005
November 2005
October 2005
September 2005
August 2005
July 2005
June 2005
May 2005
April 2005
March 2005
February 2005
January 2005
----- 2004 -----
December 2004
November 2004
October 2004
September 2004
August 2004
July 2004
June 2004
May 2004
April 2004
March 2004
February 2004
January 2004
----- 2003 -----
December 2003
November 2003
October 2003
September 2003
August 2003
July 2003
June 2003
May 2003
April 2003
March 2003
February 2003
January 2003
----- 2002 -----
December 2002
November 2002
October 2002
September 2002
August 2002
July 2002
June 2002
May 2002
April 2002
March 2002
February 2002
January 2002
----- 2001 -----
December 2001
November 2001
October 2001
September 2001
August 2001
July 2001
June 2001
May 2001
April 2001
March 2001
February 2001
wine-commits@winehq.org
2 participants
849 discussions
Start a n
N
ew thread
Henri Verbeet : wined3d: Remove COM from the buffer implementation.
by Alexandre Julliard
04 Mar '11
04 Mar '11
Module: wine Branch: master Commit: a27ee75ed2069f697fa5bcd5c9ade24086f05f75 URL:
http://source.winehq.org/git/wine.git/?a=commit;h=a27ee75ed2069f697fa5bcd5c…
Author: Henri Verbeet <hverbeet(a)codeweavers.com> Date: Thu Mar 3 21:49:09 2011 +0100 wined3d: Remove COM from the buffer implementation. --- dlls/d3d10core/buffer.c | 9 +- dlls/d3d10core/d3d10core_private.h | 2 +- dlls/d3d10core/view.c | 2 +- dlls/d3d8/buffer.c | 44 ++-- dlls/d3d8/d3d8_private.h | 18 +-- dlls/d3d8/device.c | 12 +- dlls/d3d9/buffer.c | 44 ++-- dlls/d3d9/d3d9_private.h | 15 +- dlls/d3d9/device.c | 12 +- dlls/ddraw/ddraw_private.h | 4 +- dlls/ddraw/device.c | 33 ++-- dlls/ddraw/vertexbuffer.c | 21 +- dlls/wined3d/buffer.c | 418 ++++++++++++++++-------------------- dlls/wined3d/device.c | 53 +++-- dlls/wined3d/stateblock.c | 12 +- dlls/wined3d/wined3d.spec | 15 ++ dlls/wined3d/wined3d_private.h | 2 +- include/wine/wined3d.idl | 56 +++--- 18 files changed, 354 insertions(+), 418 deletions(-) Diff:
http://source.winehq.org/git/wine.git/?a=commitdiff;h=a27ee75ed2069f697fa5b…
1
0
0
0
Henri Verbeet : ddraw: Just pass NULL as index buffer parent.
by Alexandre Julliard
04 Mar '11
04 Mar '11
Module: wine Branch: master Commit: b7c427b483b9d116e7837dc9a340bed253d8c0c8 URL:
http://source.winehq.org/git/wine.git/?a=commit;h=b7c427b483b9d116e7837dc9a…
Author: Henri Verbeet <hverbeet(a)codeweavers.com> Date: Thu Mar 3 21:49:08 2011 +0100 ddraw: Just pass NULL as index buffer parent. Since the parent is just an opaque pointer instead of a COM object now, it can just be NULL instead of needing IParent hacks. --- dlls/ddraw/device.c | 30 ++++-------------------------- 1 files changed, 4 insertions(+), 26 deletions(-) diff --git a/dlls/ddraw/device.c b/dlls/ddraw/device.c index 73feb38..8dfefdf 100644 --- a/dlls/ddraw/device.c +++ b/dlls/ddraw/device.c @@ -285,17 +285,12 @@ IDirect3DDeviceImpl_7_Release(IDirect3DDevice7 *iface) */ if (ref == 0) { - IParent *IndexBufferParent; DWORD i; EnterCriticalSection(&ddraw_cs); /* Free the index buffer. */ IWineD3DDevice_SetIndexBuffer(This->wineD3DDevice, NULL, WINED3DFMT_UNKNOWN); - IndexBufferParent = IWineD3DBuffer_GetParent(This->indexbuffer); - if (IParent_Release(IndexBufferParent)) - { - ERR(" (%p) Something is still holding the index buffer parent %p\n", This, IndexBufferParent); - } + IWineD3DBuffer_Release(This->indexbuffer); /* There is no need to unset the vertex buffer here, IWineD3DDevice_Uninit3D will do that when * destroying the primary stateblock. If a vertex buffer is destroyed while it is bound @@ -4183,13 +4178,11 @@ IDirect3DDeviceImpl_7_DrawIndexedPrimitiveVB(IDirect3DDevice7 *iface, { UINT size = max(desc.Size * 2, IndexCount * sizeof(WORD)); IWineD3DBuffer *buffer; - IParentImpl *parent; TRACE("Growing index buffer to %u bytes\n", size); - parent = IWineD3DBuffer_GetParent(This->indexbuffer); hr = IWineD3DDevice_CreateIndexBuffer(This->wineD3DDevice, size, WINED3DUSAGE_DYNAMIC /* Usage */, - WINED3DPOOL_DEFAULT, parent, &ddraw_null_wined3d_parent_ops, &buffer); + WINED3DPOOL_DEFAULT, NULL, &ddraw_null_wined3d_parent_ops, &buffer); if (FAILED(hr)) { ERR("(%p) IWineD3DDevice::CreateIndexBuffer failed with hr = %08x\n", This, hr); @@ -4199,8 +4192,6 @@ IDirect3DDeviceImpl_7_DrawIndexedPrimitiveVB(IDirect3DDevice7 *iface, IWineD3DBuffer_Release(This->indexbuffer); This->indexbuffer = buffer; - - parent->child = (IUnknown *)buffer; } /* copy the index stream into the index buffer. @@ -6781,7 +6772,6 @@ IDirect3DDeviceImpl_UpdateDepthStencil(IDirect3DDeviceImpl *This) HRESULT d3d_device_init(IDirect3DDeviceImpl *device, IDirectDrawImpl *ddraw, IDirectDrawSurfaceImpl *target) { - IParentImpl *index_buffer_parent; HRESULT hr; if (ddraw->cooperative_level & DDSCL_FPUPRESERVE) @@ -6805,27 +6795,15 @@ HRESULT d3d_device_init(IDirect3DDeviceImpl *device, IDirectDrawImpl *ddraw, IDi device->legacyTextureBlending = FALSE; /* Create an index buffer, it's needed for indexed drawing */ - index_buffer_parent = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*index_buffer_parent)); - if (!index_buffer_parent) - { - ERR("Failed to allocate index buffer parent memory.\n"); - ddraw_handle_table_destroy(&device->handle_table); - return DDERR_OUTOFMEMORY; - } - - ddraw_parent_init(index_buffer_parent); - hr = IWineD3DDevice_CreateIndexBuffer(ddraw->wineD3DDevice, 0x40000 /* Length. Don't know how long it should be */, - WINED3DUSAGE_DYNAMIC /* Usage */, WINED3DPOOL_DEFAULT, index_buffer_parent, + WINED3DUSAGE_DYNAMIC /* Usage */, WINED3DPOOL_DEFAULT, NULL, &ddraw_null_wined3d_parent_ops, &device->indexbuffer); if (FAILED(hr)) { ERR("Failed to create an index buffer, hr %#x.\n", hr); - HeapFree(GetProcessHeap(), 0, index_buffer_parent); ddraw_handle_table_destroy(&device->handle_table); return hr; } - index_buffer_parent->child = (IUnknown *)device->indexbuffer; /* This is for convenience. */ device->wineD3DDevice = ddraw->wineD3DDevice; @@ -6836,7 +6814,7 @@ HRESULT d3d_device_init(IDirect3DDeviceImpl *device, IDirectDrawImpl *ddraw, IDi if (FAILED(hr)) { ERR("Failed to set render target, hr %#x.\n", hr); - IParent_Release((IParent *)index_buffer_parent); + IWineD3DBuffer_Release(device->indexbuffer); ddraw_handle_table_destroy(&device->handle_table); return hr; }
1
0
0
0
Henri Verbeet : wined3d: Pass gl_info to surface_bind().
by Alexandre Julliard
04 Mar '11
04 Mar '11
Module: wine Branch: master Commit: 39aa477e4c57811bbbbfd7deb409e88d60d80aa3 URL:
http://source.winehq.org/git/wine.git/?a=commit;h=39aa477e4c57811bbbbfd7deb…
Author: Henri Verbeet <hverbeet(a)codeweavers.com> Date: Thu Mar 3 21:49:07 2011 +0100 wined3d: Pass gl_info to surface_bind(). --- dlls/wined3d/device.c | 2 +- dlls/wined3d/surface.c | 28 +++++++++++++++------------- dlls/wined3d/wined3d_private.h | 2 +- 3 files changed, 17 insertions(+), 15 deletions(-) diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c index 6c4814d..abff521 100644 --- a/dlls/wined3d/device.c +++ b/dlls/wined3d/device.c @@ -5499,7 +5499,7 @@ static HRESULT WINAPI IWineD3DDeviceImpl_UpdateSurface(IWineD3DDevice *iface, /* Make sure the surface is loaded and up to date */ surface_internal_preload(dst_impl, SRGB_RGB); - surface_bind(dst_impl, FALSE); + surface_bind(dst_impl, gl_info, FALSE); src_w = src_impl->currentDesc.Width; src_h = src_impl->currentDesc.Height; diff --git a/dlls/wined3d/surface.c b/dlls/wined3d/surface.c index 7f0a42c..4304963 100644 --- a/dlls/wined3d/surface.c +++ b/dlls/wined3d/surface.c @@ -694,14 +694,13 @@ void surface_set_texture_target(IWineD3DSurfaceImpl *surface, GLenum target) } /* Context activation is done by the caller. */ -void surface_bind(IWineD3DSurfaceImpl *surface, BOOL srgb) +void surface_bind(IWineD3DSurfaceImpl *surface, const struct wined3d_gl_info *gl_info, BOOL srgb) { - TRACE("surface %p, srgb %#x.\n", surface, srgb); + TRACE("surface %p, gl_info %p, srgb %#x.\n", surface, gl_info, srgb); if (surface->container.type == WINED3D_CONTAINER_TEXTURE) { IWineD3DBaseTextureImpl *texture = surface->container.u.texture; - const struct wined3d_gl_info *gl_info = &texture->resource.device->adapter->gl_info; TRACE("Passing to container (%p).\n", texture); texture->baseTexture.texture_ops->texture_bind(texture, gl_info, srgb); @@ -746,7 +745,10 @@ void surface_bind(IWineD3DSurfaceImpl *surface, BOOL srgb) } /* Context activation is done by the caller. */ -static void surface_bind_and_dirtify(IWineD3DSurfaceImpl *This, BOOL srgb) { +static void surface_bind_and_dirtify(IWineD3DSurfaceImpl *surface, + const struct wined3d_gl_info *gl_info, BOOL srgb) +{ + IWineD3DDeviceImpl *device = surface->resource.device; DWORD active_sampler; /* We don't need a specific texture unit, but after binding the texture the current unit is dirty. @@ -764,13 +766,13 @@ static void surface_bind_and_dirtify(IWineD3DSurfaceImpl *This, BOOL srgb) { ENTER_GL(); glGetIntegerv(GL_ACTIVE_TEXTURE, &active_texture); LEAVE_GL(); - active_sampler = This->resource.device->rev_tex_unit_map[active_texture - GL_TEXTURE0_ARB]; + active_sampler = device->rev_tex_unit_map[active_texture - GL_TEXTURE0_ARB]; if (active_sampler != WINED3D_UNMAPPED_STAGE) { - IWineD3DDeviceImpl_MarkStateDirty(This->resource.device, STATE_SAMPLER(active_sampler)); + IWineD3DDeviceImpl_MarkStateDirty(device, STATE_SAMPLER(active_sampler)); } - surface_bind(This, srgb); + surface_bind(surface, gl_info, srgb); } /* This function checks if the primary render target uses the 8bit paletted format. */ @@ -1703,7 +1705,7 @@ static void read_from_framebuffer_texture(IWineD3DSurfaceImpl *This, BOOL srgb) gl_info = context->gl_info; surface_prepare_texture(This, gl_info, srgb); - surface_bind_and_dirtify(This, srgb); + surface_bind_and_dirtify(This, gl_info, srgb); TRACE("Reading back offscreen render target %p.\n", This); @@ -1735,7 +1737,7 @@ static void surface_prepare_texture_internal(IWineD3DSurfaceImpl *surface, if (convert != NO_CONVERSION || format.convert) surface->flags |= SFLAG_CONVERTED; else surface->flags &= ~SFLAG_CONVERTED; - surface_bind_and_dirtify(surface, srgb); + surface_bind_and_dirtify(surface, gl_info, srgb); surface_allocate_surface(surface, gl_info, &format, srgb); surface->flags |= alloc_flag; } @@ -2102,13 +2104,13 @@ static void surface_release_client_storage(IWineD3DSurfaceImpl *surface) glPixelStorei(GL_UNPACK_CLIENT_STORAGE_APPLE, GL_FALSE); if (surface->texture_name) { - surface_bind_and_dirtify(surface, FALSE); + surface_bind_and_dirtify(surface, context->gl_info, FALSE); glTexImage2D(surface->texture_target, surface->texture_level, GL_RGB, 1, 1, 0, GL_RGB, GL_UNSIGNED_BYTE, NULL); } if (surface->texture_name_srgb) { - surface_bind_and_dirtify(surface, TRUE); + surface_bind_and_dirtify(surface, context->gl_info, TRUE); glTexImage2D(surface->texture_target, surface->texture_level, GL_RGB, 1, 1, 0, GL_RGB, GL_UNSIGNED_BYTE, NULL); } @@ -4425,7 +4427,7 @@ HRESULT surface_load_location(IWineD3DSurfaceImpl *surface, DWORD flag, const RE if (!device->isInDraw) context = context_acquire(device, NULL); - surface_bind_and_dirtify(surface, !(surface->flags & SFLAG_INTEXTURE)); + surface_bind_and_dirtify(surface, gl_info, !(surface->flags & SFLAG_INTEXTURE)); surface_download_data(surface, gl_info); if (context) context_release(context); @@ -4571,7 +4573,7 @@ HRESULT surface_load_location(IWineD3DSurfaceImpl *surface, DWORD flag, const RE if (!device->isInDraw) context = context_acquire(device, NULL); surface_prepare_texture(surface, gl_info, srgb); - surface_bind_and_dirtify(surface, srgb); + surface_bind_and_dirtify(surface, gl_info, srgb); if (surface->CKeyFlags & WINEDDSD_CKSRCBLT) { diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h index 709ffc5..e8fa71a 100644 --- a/dlls/wined3d/wined3d_private.h +++ b/dlls/wined3d/wined3d_private.h @@ -2173,7 +2173,7 @@ static inline GLuint surface_get_texture_name(IWineD3DSurfaceImpl *surface, } void surface_add_dirty_rect(IWineD3DSurfaceImpl *surface, const RECT *dirty_rect) DECLSPEC_HIDDEN; -void surface_bind(IWineD3DSurfaceImpl *surface, BOOL srgb) DECLSPEC_HIDDEN; +void surface_bind(IWineD3DSurfaceImpl *surface, const struct wined3d_gl_info *gl_info, BOOL srgb) DECLSPEC_HIDDEN; HRESULT surface_color_fill(IWineD3DSurfaceImpl *s, const RECT *rect, const WINED3DCOLORVALUE *color) DECLSPEC_HIDDEN; void surface_gdi_cleanup(IWineD3DSurfaceImpl *This) DECLSPEC_HIDDEN; GLenum surface_get_gl_buffer(IWineD3DSurfaceImpl *surface) DECLSPEC_HIDDEN;
1
0
0
0
Rico Schüller : d3dcompiler: Add debug helper for shader variable type.
by Alexandre Julliard
04 Mar '11
04 Mar '11
Module: wine Branch: master Commit: 7832577ad7a73f4436259c9ddd6b7aaf8dc4850c URL:
http://source.winehq.org/git/wine.git/?a=commit;h=7832577ad7a73f4436259c9dd…
Author: Rico Schüller <kgbricola(a)web.de> Date: Thu Mar 3 21:44:02 2011 +0100 d3dcompiler: Add debug helper for shader variable type. --- dlls/d3dcompiler_43/d3dcompiler_private.h | 1 + dlls/d3dcompiler_43/reflection.c | 3 +- dlls/d3dcompiler_43/utils.c | 56 +++++++++++++++++++++++++++++ 3 files changed, 59 insertions(+), 1 deletions(-) diff --git a/dlls/d3dcompiler_43/d3dcompiler_private.h b/dlls/d3dcompiler_43/d3dcompiler_private.h index 6b8e103..4ac8966 100644 --- a/dlls/d3dcompiler_43/d3dcompiler_private.h +++ b/dlls/d3dcompiler_43/d3dcompiler_private.h @@ -42,6 +42,7 @@ /* TRACE helper functions */ const char *debug_d3dcompiler_d3d_blob_part(D3D_BLOB_PART part) DECLSPEC_HIDDEN; const char *debug_d3dcompiler_shader_variable_class(D3D_SHADER_VARIABLE_CLASS c) DECLSPEC_HIDDEN; +const char *debug_d3dcompiler_shader_variable_type(D3D_SHADER_VARIABLE_TYPE t) DECLSPEC_HIDDEN; /* ID3DBlob */ struct d3dcompiler_blob diff --git a/dlls/d3dcompiler_43/reflection.c b/dlls/d3dcompiler_43/reflection.c index 7a63503..006dc40 100644 --- a/dlls/d3dcompiler_43/reflection.c +++ b/dlls/d3dcompiler_43/reflection.c @@ -1212,7 +1212,8 @@ static HRESULT d3dcompiler_parse_type(struct d3dcompiler_shader_reflection_type read_dword(&ptr, &temp); desc->Class = temp & 0xffff; desc->Type = temp >> 16; - TRACE("Class %s, Type %x\n", debug_d3dcompiler_shader_variable_class(desc->Class), desc->Type); + TRACE("Class %s, Type %s\n", debug_d3dcompiler_shader_variable_class(desc->Class), + debug_d3dcompiler_shader_variable_type(desc->Type)); read_dword(&ptr, &temp); desc->Rows = temp & 0xffff; diff --git a/dlls/d3dcompiler_43/utils.c b/dlls/d3dcompiler_43/utils.c index d47258d..5727183 100644 --- a/dlls/d3dcompiler_43/utils.c +++ b/dlls/d3dcompiler_43/utils.c @@ -47,6 +47,62 @@ const char *debug_d3dcompiler_shader_variable_class(D3D_SHADER_VARIABLE_CLASS c) } } +const char *debug_d3dcompiler_shader_variable_type(D3D_SHADER_VARIABLE_TYPE t) +{ + switch (t) + { + WINE_D3DCOMPILER_TO_STR(D3D_SVT_VOID); + WINE_D3DCOMPILER_TO_STR(D3D_SVT_BOOL); + WINE_D3DCOMPILER_TO_STR(D3D_SVT_INT); + WINE_D3DCOMPILER_TO_STR(D3D_SVT_FLOAT); + WINE_D3DCOMPILER_TO_STR(D3D_SVT_STRING); + WINE_D3DCOMPILER_TO_STR(D3D_SVT_TEXTURE); + WINE_D3DCOMPILER_TO_STR(D3D_SVT_TEXTURE1D); + WINE_D3DCOMPILER_TO_STR(D3D_SVT_TEXTURE2D); + WINE_D3DCOMPILER_TO_STR(D3D_SVT_TEXTURE3D); + WINE_D3DCOMPILER_TO_STR(D3D_SVT_TEXTURECUBE); + WINE_D3DCOMPILER_TO_STR(D3D_SVT_SAMPLER); + WINE_D3DCOMPILER_TO_STR(D3D_SVT_PIXELSHADER); + WINE_D3DCOMPILER_TO_STR(D3D_SVT_VERTEXSHADER); + WINE_D3DCOMPILER_TO_STR(D3D_SVT_UINT); + WINE_D3DCOMPILER_TO_STR(D3D_SVT_UINT8); + WINE_D3DCOMPILER_TO_STR(D3D_SVT_GEOMETRYSHADER); + WINE_D3DCOMPILER_TO_STR(D3D_SVT_RASTERIZER); + WINE_D3DCOMPILER_TO_STR(D3D_SVT_DEPTHSTENCIL); + WINE_D3DCOMPILER_TO_STR(D3D_SVT_BLEND); + WINE_D3DCOMPILER_TO_STR(D3D_SVT_BUFFER); + WINE_D3DCOMPILER_TO_STR(D3D_SVT_CBUFFER); + WINE_D3DCOMPILER_TO_STR(D3D_SVT_TBUFFER); + WINE_D3DCOMPILER_TO_STR(D3D_SVT_TEXTURE1DARRAY); + WINE_D3DCOMPILER_TO_STR(D3D_SVT_TEXTURE2DARRAY); + WINE_D3DCOMPILER_TO_STR(D3D_SVT_RENDERTARGETVIEW); + WINE_D3DCOMPILER_TO_STR(D3D_SVT_DEPTHSTENCILVIEW); + WINE_D3DCOMPILER_TO_STR(D3D_SVT_TEXTURE2DMS); + WINE_D3DCOMPILER_TO_STR(D3D_SVT_TEXTURE2DMSARRAY); + WINE_D3DCOMPILER_TO_STR(D3D_SVT_TEXTURECUBEARRAY); + WINE_D3DCOMPILER_TO_STR(D3D_SVT_HULLSHADER); + WINE_D3DCOMPILER_TO_STR(D3D_SVT_DOMAINSHADER); + WINE_D3DCOMPILER_TO_STR(D3D_SVT_INTERFACE_POINTER); + WINE_D3DCOMPILER_TO_STR(D3D_SVT_COMPUTESHADER); + WINE_D3DCOMPILER_TO_STR(D3D_SVT_DOUBLE); + WINE_D3DCOMPILER_TO_STR(D3D_SVT_RWTEXTURE1D); + WINE_D3DCOMPILER_TO_STR(D3D_SVT_RWTEXTURE1DARRAY); + WINE_D3DCOMPILER_TO_STR(D3D_SVT_RWTEXTURE2D); + WINE_D3DCOMPILER_TO_STR(D3D_SVT_RWTEXTURE2DARRAY); + WINE_D3DCOMPILER_TO_STR(D3D_SVT_RWTEXTURE3D); + WINE_D3DCOMPILER_TO_STR(D3D_SVT_RWBUFFER); + WINE_D3DCOMPILER_TO_STR(D3D_SVT_BYTEADDRESS_BUFFER); + WINE_D3DCOMPILER_TO_STR(D3D_SVT_RWBYTEADDRESS_BUFFER); + WINE_D3DCOMPILER_TO_STR(D3D_SVT_STRUCTURED_BUFFER); + WINE_D3DCOMPILER_TO_STR(D3D_SVT_RWSTRUCTURED_BUFFER); + WINE_D3DCOMPILER_TO_STR(D3D_SVT_APPEND_STRUCTURED_BUFFER); + WINE_D3DCOMPILER_TO_STR(D3D_SVT_CONSUME_STRUCTURED_BUFFER); + default: + FIXME("Unrecognized D3D_SHADER_VARIABLE_TYPE %#x.\n", t); + return "unrecognized"; + } +} + const char *debug_d3dcompiler_d3d_blob_part(D3D_BLOB_PART part) { switch(part)
1
0
0
0
Rico Schüller : d3dcompiler: Add debug helper for shader variable class.
by Alexandre Julliard
04 Mar '11
04 Mar '11
Module: wine Branch: master Commit: 525dee0778506167f6da342b9c9fbf38fca9be6b URL:
http://source.winehq.org/git/wine.git/?a=commit;h=525dee0778506167f6da342b9…
Author: Rico Schüller <kgbricola(a)web.de> Date: Thu Mar 3 21:44:00 2011 +0100 d3dcompiler: Add debug helper for shader variable class. --- dlls/d3dcompiler_43/d3dcompiler_private.h | 1 + dlls/d3dcompiler_43/reflection.c | 2 +- dlls/d3dcompiler_43/utils.c | 18 ++++++++++++++++++ 3 files changed, 20 insertions(+), 1 deletions(-) diff --git a/dlls/d3dcompiler_43/d3dcompiler_private.h b/dlls/d3dcompiler_43/d3dcompiler_private.h index 788f396..6b8e103 100644 --- a/dlls/d3dcompiler_43/d3dcompiler_private.h +++ b/dlls/d3dcompiler_43/d3dcompiler_private.h @@ -41,6 +41,7 @@ /* TRACE helper functions */ const char *debug_d3dcompiler_d3d_blob_part(D3D_BLOB_PART part) DECLSPEC_HIDDEN; +const char *debug_d3dcompiler_shader_variable_class(D3D_SHADER_VARIABLE_CLASS c) DECLSPEC_HIDDEN; /* ID3DBlob */ struct d3dcompiler_blob diff --git a/dlls/d3dcompiler_43/reflection.c b/dlls/d3dcompiler_43/reflection.c index 7db18d0..7a63503 100644 --- a/dlls/d3dcompiler_43/reflection.c +++ b/dlls/d3dcompiler_43/reflection.c @@ -1212,7 +1212,7 @@ static HRESULT d3dcompiler_parse_type(struct d3dcompiler_shader_reflection_type read_dword(&ptr, &temp); desc->Class = temp & 0xffff; desc->Type = temp >> 16; - TRACE("Class %x, Type %x\n", desc->Class, desc->Type); + TRACE("Class %s, Type %x\n", debug_d3dcompiler_shader_variable_class(desc->Class), desc->Type); read_dword(&ptr, &temp); desc->Rows = temp & 0xffff; diff --git a/dlls/d3dcompiler_43/utils.c b/dlls/d3dcompiler_43/utils.c index 362479a..d47258d 100644 --- a/dlls/d3dcompiler_43/utils.c +++ b/dlls/d3dcompiler_43/utils.c @@ -29,6 +29,24 @@ WINE_DEFAULT_DEBUG_CHANNEL(d3dcompiler); #define WINE_D3DCOMPILER_TO_STR(x) case x: return #x +const char *debug_d3dcompiler_shader_variable_class(D3D_SHADER_VARIABLE_CLASS c) +{ + switch (c) + { + WINE_D3DCOMPILER_TO_STR(D3D_SVC_SCALAR); + WINE_D3DCOMPILER_TO_STR(D3D_SVC_VECTOR); + WINE_D3DCOMPILER_TO_STR(D3D_SVC_MATRIX_ROWS); + WINE_D3DCOMPILER_TO_STR(D3D_SVC_MATRIX_COLUMNS); + WINE_D3DCOMPILER_TO_STR(D3D_SVC_OBJECT); + WINE_D3DCOMPILER_TO_STR(D3D_SVC_STRUCT); + WINE_D3DCOMPILER_TO_STR(D3D_SVC_INTERFACE_CLASS); + WINE_D3DCOMPILER_TO_STR(D3D_SVC_INTERFACE_POINTER); + default: + FIXME("Unrecognized D3D_SHADER_VARIABLE_CLASS %#x.\n", c); + return "unrecognized"; + } +} + const char *debug_d3dcompiler_d3d_blob_part(D3D_BLOB_PART part) { switch(part)
1
0
0
0
Juan Lang : include: Add some missing definitions.
by Alexandre Julliard
04 Mar '11
04 Mar '11
Module: wine Branch: master Commit: e71a23505846b51224fd799f717b0eec6cfb6a10 URL:
http://source.winehq.org/git/wine.git/?a=commit;h=e71a23505846b51224fd799f7…
Author: Juan Lang <juan.lang(a)gmail.com> Date: Thu Mar 3 10:25:55 2011 -0800 include: Add some missing definitions. --- include/winineti.h | 20 ++++++++++++++++++++ 1 files changed, 20 insertions(+), 0 deletions(-) diff --git a/include/winineti.h b/include/winineti.h index f1eb880..6419204 100644 --- a/include/winineti.h +++ b/include/winineti.h @@ -84,6 +84,26 @@ typedef struct _INTERNET_CACHE_CONFIG_INFOW DECL_WINELIB_TYPE_AW(INTERNET_CACHE_CONFIG_INFO) DECL_WINELIB_TYPE_AW(LPINTERNET_CACHE_CONFIG_INFO) +typedef enum { + WININET_SYNC_MODE_NEVER = 0, + WININET_SYNC_MODE_ON_EXPIRY, + WININET_SYNC_MODE_ONCE_PER_SESSION, + WININET_SYNC_MODE_ALWAYS, + WININET_SYNC_MODE_AUTOMATIC, + WININET_SYNC_MODE_DEFAULT = WININET_SYNC_MODE_AUTOMATIC +} WININET_SYNC_MODE; + +/* Flags for GetUrlCacheConfigInfoA/W and SetUrlCacheConfigInfoA/W */ +#define CACHE_CONFIG_FORCE_CLEANUP_FC 0x00000020 +#define CACHE_CONFIG_DISK_CACHE_PATHS_FC 0x00000040 +#define CACHE_CONFIG_SYNC_MODE_FC 0x00000080 +#define CACHE_CONFIG_CONTENT_PATHS_FC 0x00000100 +#define CACHE_CONFIG_COOKIES_PATHS_FC 0x00000200 +#define CACHE_CONFIG_HISTORY_PATHS_FC 0x00000400 +#define CACHE_CONFIG_QUOTA_FC 0x00000800 +#define CACHE_CONFIG_USER_MODE_FC 0x00001000 +#define CACHE_CONFIG_CONTENT_USAGE_FC 0x00002000 +#define CACHE_CONFIG_STICKY_CONTENT_USAGE_FC 0x00004000 #ifdef __cplusplus extern "C" {
1
0
0
0
Juan Lang : wininet: Move creating cache file to a helper function.
by Alexandre Julliard
04 Mar '11
04 Mar '11
Module: wine Branch: master Commit: 666353d1a67e2a6d21f74a488e12d3ccb9e699c4 URL:
http://source.winehq.org/git/wine.git/?a=commit;h=666353d1a67e2a6d21f74a488…
Author: Juan Lang <juan.lang(a)gmail.com> Date: Wed Mar 2 10:06:37 2011 -0800 wininet: Move creating cache file to a helper function. --- dlls/wininet/http.c | 58 +++++++++++++++++++++++++++----------------------- 1 files changed, 31 insertions(+), 27 deletions(-) diff --git a/dlls/wininet/http.c b/dlls/wininet/http.c index 8787ba2..d47ebd6 100644 --- a/dlls/wininet/http.c +++ b/dlls/wininet/http.c @@ -3843,6 +3843,35 @@ static void HTTP_ProcessExpires(http_request_t *request) } } +static void HTTP_CacheRequest(http_request_t *request) +{ + WCHAR url[INTERNET_MAX_URL_LENGTH]; + WCHAR cacheFileName[MAX_PATH+1]; + BOOL b; + + b = HTTP_GetRequestURL(request, url); + if(!b) { + WARN("Could not get URL\n"); + return; + } + + b = CreateUrlCacheEntryW(url, request->contentLength > 0 ? request->contentLength : 0, NULL, cacheFileName, 0); + if(b) { + HeapFree(GetProcessHeap(), 0, request->cacheFile); + CloseHandle(request->hCacheFile); + + request->cacheFile = heap_strdupW(cacheFileName); + request->hCacheFile = CreateFileW(request->cacheFile, GENERIC_WRITE, FILE_SHARE_READ|FILE_SHARE_WRITE, + NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); + if(request->hCacheFile == INVALID_HANDLE_VALUE) { + WARN("Could not create file: %u\n", GetLastError()); + request->hCacheFile = NULL; + } + }else { + WARN("Could not create cache entry: %08x\n", GetLastError()); + } +} + /*********************************************************************** * HTTP_HttpSendRequestW (internal) * @@ -4117,33 +4146,8 @@ static DWORD HTTP_HttpSendRequestW(http_request_t *request, LPCWSTR lpszHeaders, } while (loop_next); - if(res == ERROR_SUCCESS) { - WCHAR url[INTERNET_MAX_URL_LENGTH]; - WCHAR cacheFileName[MAX_PATH+1]; - BOOL b; - - b = HTTP_GetRequestURL(request, url); - if(!b) { - WARN("Could not get URL\n"); - goto lend; - } - - b = CreateUrlCacheEntryW(url, request->contentLength > 0 ? request->contentLength : 0, NULL, cacheFileName, 0); - if(b) { - HeapFree(GetProcessHeap(), 0, request->cacheFile); - CloseHandle(request->hCacheFile); - - request->cacheFile = heap_strdupW(cacheFileName); - request->hCacheFile = CreateFileW(request->cacheFile, GENERIC_WRITE, FILE_SHARE_READ|FILE_SHARE_WRITE, - NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); - if(request->hCacheFile == INVALID_HANDLE_VALUE) { - WARN("Could not create file: %u\n", GetLastError()); - request->hCacheFile = NULL; - } - }else { - WARN("Could not create cache entry: %08x\n", GetLastError()); - } - } + if(res == ERROR_SUCCESS) + HTTP_CacheRequest(request); lend:
1
0
0
0
Juan Lang : wininet: Support the Cache-Control max-age directive for setting url cache entry expiration .
by Alexandre Julliard
04 Mar '11
04 Mar '11
Module: wine Branch: master Commit: 488c2d0c36bc4e0579f6aa54eb645fdf565b24fc URL:
http://source.winehq.org/git/wine.git/?a=commit;h=488c2d0c36bc4e0579f6aa54e…
Author: Juan Lang <juan.lang(a)gmail.com> Date: Thu Mar 3 10:54:47 2011 -0800 wininet: Support the Cache-Control max-age directive for setting url cache entry expiration. --- dlls/wininet/http.c | 70 ++++++++++++++++++++++++++++++++++++++++++++++---- 1 files changed, 64 insertions(+), 6 deletions(-) diff --git a/dlls/wininet/http.c b/dlls/wininet/http.c index 649bd17..8787ba2 100644 --- a/dlls/wininet/http.c +++ b/dlls/wininet/http.c @@ -3761,16 +3761,74 @@ static void HTTP_ProcessExpires(http_request_t *request) BOOL expirationFound = FALSE; int headerIndex; - headerIndex = HTTP_GetCustomHeaderIndex(request, szExpires, 0, FALSE); + /* Look for a Cache-Control header with a max-age directive, as it takes + * precedence over the Expires header. + */ + headerIndex = HTTP_GetCustomHeaderIndex(request, szCache_Control, 0, FALSE); if (headerIndex != -1) { - LPHTTPHEADERW expiresHeader = &request->custHeaders[headerIndex]; - FILETIME ft; + LPHTTPHEADERW ccHeader = &request->custHeaders[headerIndex]; + LPWSTR ptr; - if (HTTP_ParseDate(expiresHeader->lpszValue, &ft)) + for (ptr = ccHeader->lpszValue; ptr && *ptr; ) { - expirationFound = TRUE; - request->expires = ft; + LPWSTR comma = strchrW(ptr, ','), end, equal; + + if (comma) + end = comma; + else + end = ptr + strlenW(ptr); + for (equal = end - 1; equal > ptr && *equal != '='; equal--) + ; + if (*equal == '=') + { + static const WCHAR max_age[] = { + 'm','a','x','-','a','g','e',0 }; + + if (!strncmpiW(ptr, max_age, equal - ptr - 1)) + { + LPWSTR nextPtr; + unsigned long age; + + age = strtoulW(equal + 1, &nextPtr, 10); + if (nextPtr > equal + 1) + { + LARGE_INTEGER ft; + + NtQuerySystemTime( &ft ); + /* Age is in seconds, FILETIME resolution is in + * 100 nanosecond intervals. + */ + ft.QuadPart += age * (ULONGLONG)1000000; + request->expires.dwLowDateTime = ft.u.LowPart; + request->expires.dwHighDateTime = ft.u.HighPart; + expirationFound = TRUE; + } + } + } + if (comma) + { + ptr = comma + 1; + while (isspaceW(*ptr)) + ptr++; + } + else + ptr = NULL; + } + } + if (!expirationFound) + { + headerIndex = HTTP_GetCustomHeaderIndex(request, szExpires, 0, FALSE); + if (headerIndex != -1) + { + LPHTTPHEADERW expiresHeader = &request->custHeaders[headerIndex]; + FILETIME ft; + + if (HTTP_ParseDate(expiresHeader->lpszValue, &ft)) + { + expirationFound = TRUE; + request->expires = ft; + } } } if (!expirationFound)
1
0
0
0
Juan Lang : wininet: Default to 10 minutes expiration for cache entries.
by Alexandre Julliard
04 Mar '11
04 Mar '11
Module: wine Branch: master Commit: 2d323430cbaa2ed9e58220694ca23068b3fd8821 URL:
http://source.winehq.org/git/wine.git/?a=commit;h=2d323430cbaa2ed9e58220694…
Author: Juan Lang <juan.lang(a)gmail.com> Date: Thu Mar 3 10:54:07 2011 -0800 wininet: Default to 10 minutes expiration for cache entries. --- dlls/wininet/http.c | 11 ++++++----- 1 files changed, 6 insertions(+), 5 deletions(-) diff --git a/dlls/wininet/http.c b/dlls/wininet/http.c index 3254a25..649bd17 100644 --- a/dlls/wininet/http.c +++ b/dlls/wininet/http.c @@ -56,6 +56,7 @@ #include "winbase.h" #include "wininet.h" #include "winerror.h" +#include "winternl.h" #define NO_SHLWAPI_STREAM #define NO_SHLWAPI_REG #define NO_SHLWAPI_STRFCNS @@ -3774,13 +3775,13 @@ static void HTTP_ProcessExpires(http_request_t *request) } if (!expirationFound) { - ULARGE_INTEGER ft; + LARGE_INTEGER t; /* With no known age, default to 10 minutes until expiration. */ - GetSystemTimeAsFileTime((FILETIME *)&ft); - ft.QuadPart += 10 * 60 * 10000000; - request->expires.dwLowDateTime = ft.u.LowPart; - request->expires.dwHighDateTime = ft.u.HighPart; + NtQuerySystemTime( &t ); + t.QuadPart += 10 * 60 * (ULONGLONG)10000000; + request->expires.dwLowDateTime = t.u.LowPart; + request->expires.dwHighDateTime = t.u.HighPart; } }
1
0
0
0
Juan Lang : wininet: Default to 10 minutes expiration for cache entries.
by Alexandre Julliard
04 Mar '11
04 Mar '11
Module: wine Branch: master Commit: ab16c75c48a79786a7adeb4dd93dc3135faaeb18 URL:
http://source.winehq.org/git/wine.git/?a=commit;h=ab16c75c48a79786a7adeb4dd…
Author: Juan Lang <juan.lang(a)gmail.com> Date: Thu Mar 3 10:54:07 2011 -0800 wininet: Default to 10 minutes expiration for cache entries. --- dlls/wininet/http.c | 14 ++++++++++++++ 1 files changed, 14 insertions(+), 0 deletions(-) diff --git a/dlls/wininet/http.c b/dlls/wininet/http.c index 85484bf..3254a25 100644 --- a/dlls/wininet/http.c +++ b/dlls/wininet/http.c @@ -3757,6 +3757,7 @@ static BOOL HTTP_ParseDate(LPCWSTR value, FILETIME *ft) static void HTTP_ProcessExpires(http_request_t *request) { + BOOL expirationFound = FALSE; int headerIndex; headerIndex = HTTP_GetCustomHeaderIndex(request, szExpires, 0, FALSE); @@ -3766,7 +3767,20 @@ static void HTTP_ProcessExpires(http_request_t *request) FILETIME ft; if (HTTP_ParseDate(expiresHeader->lpszValue, &ft)) + { + expirationFound = TRUE; request->expires = ft; + } + } + if (!expirationFound) + { + ULARGE_INTEGER ft; + + /* With no known age, default to 10 minutes until expiration. */ + GetSystemTimeAsFileTime((FILETIME *)&ft); + ft.QuadPart += 10 * 60 * 10000000; + request->expires.dwLowDateTime = ft.u.LowPart; + request->expires.dwHighDateTime = ft.u.HighPart; } }
1
0
0
0
Juan Lang : wininet: Store entries in url cache with valid expiration date.
by Alexandre Julliard
04 Mar '11
04 Mar '11
Module: wine Branch: master Commit: 0b5ea6f970bdaaeab5a2b177d9d681aa22e42094 URL:
http://source.winehq.org/git/wine.git/?a=commit;h=0b5ea6f970bdaaeab5a2b177d…
Author: Juan Lang <juan.lang(a)gmail.com> Date: Thu Mar 3 11:20:11 2011 -0800 wininet: Store entries in url cache with valid expiration date. --- dlls/wininet/http.c | 197 ++++++++++++++++++++++++++++++++++++++++++++++- dlls/wininet/internet.h | 1 + 2 files changed, 197 insertions(+), 1 deletions(-) diff --git a/dlls/wininet/http.c b/dlls/wininet/http.c index 0467860..85484bf 100644 --- a/dlls/wininet/http.c +++ b/dlls/wininet/http.c @@ -1577,7 +1577,7 @@ static void HTTPREQ_Destroy(object_header_t *hdr) memset(&ft, 0, sizeof(FILETIME)); if(HTTP_GetRequestURL(request, url)) { - CommitUrlCacheEntryW(url, request->cacheFile, ft, ft, + CommitUrlCacheEntryW(url, request->cacheFile, request->expires, ft, NORMAL_CACHE_ENTRY, NULL, 0, NULL, 0); } } @@ -3577,6 +3577,199 @@ static void HTTP_InsertCookies(http_request_t *request) HeapFree(GetProcessHeap(), 0, lpszUrl); } +static WORD HTTP_ParseDay(LPCWSTR day) +{ + static const WCHAR sun[] = { 's','u','n',0 }; + static const WCHAR mon[] = { 'm','o','n',0 }; + static const WCHAR tue[] = { 't','u','e',0 }; + static const WCHAR wed[] = { 'w','e','d',0 }; + static const WCHAR thu[] = { 't','h','u',0 }; + static const WCHAR fri[] = { 'f','r','i',0 }; + static const WCHAR sat[] = { 's','a','t',0 }; + + if (!strcmpiW(day, sun)) return 0; + if (!strcmpiW(day, mon)) return 1; + if (!strcmpiW(day, tue)) return 2; + if (!strcmpiW(day, wed)) return 3; + if (!strcmpiW(day, thu)) return 4; + if (!strcmpiW(day, fri)) return 5; + if (!strcmpiW(day, sat)) return 6; + /* Invalid */ + return 7; +} + +static WORD HTTP_ParseMonth(LPCWSTR month) +{ + static const WCHAR jan[] = { 'j','a','n',0 }; + static const WCHAR feb[] = { 'f','e','b',0 }; + static const WCHAR mar[] = { 'm','a','r',0 }; + static const WCHAR apr[] = { 'a','p','r',0 }; + static const WCHAR may[] = { 'm','a','y',0 }; + static const WCHAR jun[] = { 'j','u','n',0 }; + static const WCHAR jul[] = { 'j','u','l',0 }; + static const WCHAR aug[] = { 'a','u','g',0 }; + static const WCHAR sep[] = { 's','e','p',0 }; + static const WCHAR oct[] = { 'o','c','t',0 }; + static const WCHAR nov[] = { 'n','o','v',0 }; + static const WCHAR dec[] = { 'd','e','c',0 }; + + if (!strcmpiW(month, jan)) return 1; + if (!strcmpiW(month, feb)) return 2; + if (!strcmpiW(month, mar)) return 3; + if (!strcmpiW(month, apr)) return 4; + if (!strcmpiW(month, may)) return 5; + if (!strcmpiW(month, jun)) return 6; + if (!strcmpiW(month, jul)) return 7; + if (!strcmpiW(month, aug)) return 8; + if (!strcmpiW(month, sep)) return 9; + if (!strcmpiW(month, oct)) return 10; + if (!strcmpiW(month, nov)) return 11; + if (!strcmpiW(month, dec)) return 12; + /* Invalid */ + return 0; +} + +/* FIXME: only accepts dates in RFC 1123 format, which is the only correct + * format for HTTP, but which may not be the only format actually seen in the + * wild.
http://www.hackcraft.net/web/datetime/
suggests at least RFC 850 + * dates and dates as formatted by asctime() should be accepted as well. + */ +static BOOL HTTP_ParseDate(LPCWSTR value, FILETIME *ft) +{ + static const WCHAR gmt[]= { 'G','M','T',0 }; + WCHAR *ptr, *nextPtr, day[4], month[4], *monthPtr; + unsigned long num; + SYSTEMTIME st; + + ptr = strchrW(value, ','); + if (!ptr) + { + ERR("unexpected date format %s\n", debugstr_w(value)); + return FALSE; + } + if (ptr - value != 3) + { + ERR("unexpected weekday %s\n", debugstr_wn(value, ptr - value)); + return FALSE; + } + memcpy(day, value, (ptr - value) * sizeof(WCHAR)); + day[3] = 0; + st.wDayOfWeek = HTTP_ParseDay(day); + if (st.wDayOfWeek > 6) + { + ERR("unexpected weekday %s\n", debugstr_wn(value, ptr - value)); + return FALSE; + } + ptr++; + + while (isspaceW(*ptr)) + ptr++; + + num = strtoulW(ptr, &nextPtr, 10); + if (!nextPtr || nextPtr <= ptr || !num || num > 31) + { + ERR("unexpected day %s\n", debugstr_w(value)); + return FALSE; + } + ptr = nextPtr; + st.wDay = (WORD)num; + + while (isspaceW(*ptr)) + ptr++; + + for (monthPtr = month; !isspace(*ptr) && + monthPtr - month < sizeof(month) / sizeof(month[0]) - 1; + monthPtr++, ptr++) + *monthPtr = *ptr; + *monthPtr = 0; + st.wMonth = HTTP_ParseMonth(month); + if (!st.wMonth || st.wMonth > 12) + { + ERR("unexpected month %s\n", debugstr_w(month)); + return FALSE; + } + + while (isspaceW(*ptr)) + ptr++; + + num = strtoulW(ptr, &nextPtr, 10); + if (!nextPtr || nextPtr <= ptr || num < 1601 || num > 30827) + { + ERR("unexpected year %s\n", debugstr_w(value)); + return FALSE; + } + ptr = nextPtr; + st.wYear = (WORD)num; + + while (isspaceW(*ptr)) + ptr++; + + num = strtoulW(ptr, &nextPtr, 10); + if (!nextPtr || nextPtr <= ptr || *nextPtr != ':') + { + ERR("unexpected time format %s\n", debugstr_w(ptr)); + return FALSE; + } + if (num > 23) + { + ERR("unexpected hour in time format %s\n", debugstr_w(ptr)); + return FALSE; + } + ptr = nextPtr + 1; + st.wHour = (WORD)num; + num = strtoulW(ptr, &nextPtr, 10); + if (!nextPtr || nextPtr <= ptr || *nextPtr != ':') + { + ERR("unexpected time format %s\n", debugstr_w(ptr)); + return FALSE; + } + if (num > 59) + { + ERR("unexpected minute in time format %s\n", debugstr_w(ptr)); + return FALSE; + } + ptr = nextPtr + 1; + st.wMinute = (WORD)num; + num = strtoulW(ptr, &nextPtr, 10); + if (!nextPtr || nextPtr <= ptr) + { + ERR("unexpected time format %s\n", debugstr_w(ptr)); + return FALSE; + } + if (num > 59) + { + ERR("unexpected second in time format %s\n", debugstr_w(ptr)); + return FALSE; + } + ptr = nextPtr + 1; + st.wSecond = (WORD)num; + + while (isspaceW(*ptr)) + ptr++; + + if (strcmpW(ptr, gmt)) + { + ERR("unexpected time zone %s\n", debugstr_w(ptr)); + return FALSE; + } + return SystemTimeToFileTime(&st, ft); +} + +static void HTTP_ProcessExpires(http_request_t *request) +{ + int headerIndex; + + headerIndex = HTTP_GetCustomHeaderIndex(request, szExpires, 0, FALSE); + if (headerIndex != -1) + { + LPHTTPHEADERW expiresHeader = &request->custHeaders[headerIndex]; + FILETIME ft; + + if (HTTP_ParseDate(expiresHeader->lpszValue, &ft)) + request->expires = ft; + } +} + /*********************************************************************** * HTTP_HttpSendRequestW (internal) * @@ -3755,6 +3948,7 @@ static DWORD HTTP_HttpSendRequestW(http_request_t *request, LPCWSTR lpszHeaders, sizeof(DWORD)); HTTP_ProcessCookies(request); + HTTP_ProcessExpires(request); if (!set_content_length( request )) HTTP_FinishedReading(request); @@ -3942,6 +4136,7 @@ static DWORD HTTP_HttpEndRequestW(http_request_t *request, DWORD dwFlags, DWORD_ /* process cookies here. Is this right? */ HTTP_ProcessCookies(request); + HTTP_ProcessExpires(request); if (!set_content_length( request )) HTTP_FinishedReading(request); diff --git a/dlls/wininet/internet.h b/dlls/wininet/internet.h index 1d89045..40fa696 100644 --- a/dlls/wininet/internet.h +++ b/dlls/wininet/internet.h @@ -276,6 +276,7 @@ typedef struct DWORD nCustHeaders; HANDLE hCacheFile; LPWSTR cacheFile; + FILETIME expires; struct HttpAuthInfo *authInfo; struct HttpAuthInfo *proxyAuthInfo;
1
0
0
0
Alexandre Julliard : user32: Remove GetClipboardFormatName from the user driver interface.
by Alexandre Julliard
04 Mar '11
04 Mar '11
Module: wine Branch: master Commit: 383d8ac105df9dfdafa4e1176ea928bdc17259f1 URL:
http://source.winehq.org/git/wine.git/?a=commit;h=383d8ac105df9dfdafa4e1176…
Author: Alexandre Julliard <julliard(a)winehq.org> Date: Thu Mar 3 21:51:29 2011 +0100 user32: Remove GetClipboardFormatName from the user driver interface. --- dlls/user32/clipboard.c | 15 ++++----------- dlls/user32/driver.c | 13 ------------- dlls/user32/tests/clipboard.c | 12 ++---------- dlls/user32/user_private.h | 1 - dlls/winex11.drv/clipboard.c | 26 +++++--------------------- dlls/winex11.drv/winex11.drv.spec | 1 - 6 files changed, 11 insertions(+), 57 deletions(-) diff --git a/dlls/user32/clipboard.c b/dlls/user32/clipboard.c index 7b84686..875a027 100644 --- a/dlls/user32/clipboard.c +++ b/dlls/user32/clipboard.c @@ -243,7 +243,8 @@ UINT WINAPI RegisterClipboardFormatA(LPCSTR formatName) */ INT WINAPI GetClipboardFormatNameW(UINT wFormat, LPWSTR retStr, INT maxlen) { - return USER_Driver->pGetClipboardFormatName(wFormat, retStr, maxlen); + if (wFormat < MAXINTATOM) return 0; + return GlobalGetAtomNameW( wFormat, retStr, maxlen ); } @@ -252,16 +253,8 @@ INT WINAPI GetClipboardFormatNameW(UINT wFormat, LPWSTR retStr, INT maxlen) */ INT WINAPI GetClipboardFormatNameA(UINT wFormat, LPSTR retStr, INT maxlen) { - INT ret; - LPWSTR p = HeapAlloc( GetProcessHeap(), 0, maxlen*sizeof(WCHAR) ); - if(p == NULL) return 0; /* FIXME: is this the correct failure value? */ - - ret = GetClipboardFormatNameW( wFormat, p, maxlen ); - - if (ret && maxlen > 0 && !WideCharToMultiByte( CP_ACP, 0, p, -1, retStr, maxlen, 0, 0)) - retStr[maxlen-1] = 0; - HeapFree( GetProcessHeap(), 0, p ); - return ret; + if (wFormat < MAXINTATOM) return 0; + return GlobalGetAtomNameA( wFormat, retStr, maxlen ); } diff --git a/dlls/user32/driver.c b/dlls/user32/driver.c index 8f64219..d40789c 100644 --- a/dlls/user32/driver.c +++ b/dlls/user32/driver.c @@ -99,7 +99,6 @@ static const USER_DRIVER *load_driver(void) GET_USER_FUNC(EnumClipboardFormats); GET_USER_FUNC(IsClipboardFormatAvailable); GET_USER_FUNC(RegisterClipboardFormat); - GET_USER_FUNC(GetClipboardFormatName); GET_USER_FUNC(EndClipboardUpdate); GET_USER_FUNC(ChangeDisplaySettingsEx); GET_USER_FUNC(EnumDisplayMonitors); @@ -275,11 +274,6 @@ static HANDLE CDECL nulldrv_GetClipboardData( UINT format ) return 0; } -static INT CDECL nulldrv_GetClipboardFormatName( UINT format, LPWSTR buffer, UINT len ) -{ - return FALSE; -} - static BOOL CDECL nulldrv_IsClipboardFormatAvailable( UINT format ) { return FALSE; @@ -462,7 +456,6 @@ static USER_DRIVER null_driver = nulldrv_EndClipboardUpdate, nulldrv_EnumClipboardFormats, nulldrv_GetClipboardData, - nulldrv_GetClipboardFormatName, nulldrv_IsClipboardFormatAvailable, nulldrv_RegisterClipboardFormat, nulldrv_SetClipboardData, @@ -628,11 +621,6 @@ static HANDLE CDECL loaderdrv_GetClipboardData( UINT format ) return load_driver()->pGetClipboardData( format ); } -static INT CDECL loaderdrv_GetClipboardFormatName( UINT format, LPWSTR buffer, UINT len ) -{ - return load_driver()->pGetClipboardFormatName( format, buffer, len ); -} - static BOOL CDECL loaderdrv_IsClipboardFormatAvailable( UINT format ) { return load_driver()->pIsClipboardFormatAvailable( format ); @@ -809,7 +797,6 @@ static USER_DRIVER lazy_load_driver = loaderdrv_EndClipboardUpdate, loaderdrv_EnumClipboardFormats, loaderdrv_GetClipboardData, - loaderdrv_GetClipboardFormatName, loaderdrv_IsClipboardFormatAvailable, loaderdrv_RegisterClipboardFormat, loaderdrv_SetClipboardData, diff --git a/dlls/user32/tests/clipboard.c b/dlls/user32/tests/clipboard.c index 781334e..c461df4 100644 --- a/dlls/user32/tests/clipboard.c +++ b/dlls/user32/tests/clipboard.c @@ -140,6 +140,7 @@ todo_wine atom_id = GlobalFindAtomA("my_cool_clipboard_format"); ok(atom_id == 0, "GlobalFindAtomA should fail\n"); test_last_error(ERROR_FILE_NOT_FOUND); + } for (format_id = 0; format_id < 0xffff; format_id++) { @@ -147,18 +148,9 @@ todo_wine len = GetClipboardFormatNameA(format_id, buf, 256); if (format_id < 0xc000) - { ok(!len, "GetClipboardFormatNameA should fail, but it returned %d (%s)\n", len, buf); - test_last_error(ERROR_INVALID_PARAMETER); - } else - { - if (len) - trace("%04x: %s\n", format_id, len ? buf : ""); - else - test_last_error(ERROR_INVALID_HANDLE); - } - } + if (len) trace("%04x: %s\n", format_id, len ? buf : ""); } ret = OpenClipboard(0); diff --git a/dlls/user32/user_private.h b/dlls/user32/user_private.h index 51636de..f7b79b3 100644 --- a/dlls/user32/user_private.h +++ b/dlls/user32/user_private.h @@ -81,7 +81,6 @@ typedef struct tagUSER_DRIVER { void (CDECL *pEndClipboardUpdate)(void); /* End clipboard update */ UINT (CDECL *pEnumClipboardFormats)(UINT); /* Enumerate clipboard formats */ HANDLE (CDECL *pGetClipboardData)(UINT); /* Get specified selection data */ - INT (CDECL *pGetClipboardFormatName)(UINT, LPWSTR, UINT); /* Get a clipboard format name */ BOOL (CDECL *pIsClipboardFormatAvailable)(UINT); /* Check if specified format is available */ UINT (CDECL *pRegisterClipboardFormat)(LPCWSTR); /* Register a clipboard format */ BOOL (CDECL *pSetClipboardData)(UINT, HANDLE, BOOL); /* Set specified selection data */ diff --git a/dlls/winex11.drv/clipboard.c b/dlls/winex11.drv/clipboard.c index 8b9fe2d..1a3704d 100644 --- a/dlls/winex11.drv/clipboard.c +++ b/dlls/winex11.drv/clipboard.c @@ -283,12 +283,11 @@ static Window thread_selection_wnd(void) static const char *debugstr_format( UINT id ) { - if (id >= 0xc000) - { - WCHAR buffer[256]; - GlobalGetAtomNameW( id, buffer, 256 ); + WCHAR buffer[256]; + + if (GetClipboardFormatNameW( id, buffer, 256 )) return wine_dbg_sprintf( "%04x %s", id, debugstr_w(buffer) ); - } + switch (id) { #define BUILTIN(id) case id: return #id; @@ -378,7 +377,7 @@ static void intern_atoms(void) i = 0; LIST_FOR_EACH_ENTRY( format, &format_list, WINE_CLIPFORMAT, entry ) if (!format->drvData) { - GlobalGetAtomNameW( format->wFormatID, buffer, 256 ); + GetClipboardFormatNameW( format->wFormatID, buffer, 256 ); len = WideCharToMultiByte(CP_UNIXCP, 0, buffer, -1, NULL, 0, NULL, NULL); names[i] = HeapAlloc(GetProcessHeap(), 0, len); WideCharToMultiByte(CP_UNIXCP, 0, buffer, -1, names[i++], len, NULL, NULL); @@ -2501,21 +2500,6 @@ UINT CDECL X11DRV_RegisterClipboardFormat(LPCWSTR FormatName) } -/************************************************************************** - * X11DRV_GetClipboardFormatName - */ -INT CDECL X11DRV_GetClipboardFormatName(UINT wFormat, LPWSTR retStr, INT maxlen) -{ - TRACE("(%04X, %p, %d) !\n", wFormat, retStr, maxlen); - - if (wFormat < 0xc000) - { - SetLastError(ERROR_INVALID_PARAMETER); - return 0; - } - return GlobalGetAtomNameW( wFormat, retStr, maxlen ); -} - static void selection_acquire(void) { Window owner; diff --git a/dlls/winex11.drv/winex11.drv.spec b/dlls/winex11.drv/winex11.drv.spec index 2298b99..cc5cf43 100644 --- a/dlls/winex11.drv/winex11.drv.spec +++ b/dlls/winex11.drv/winex11.drv.spec @@ -91,7 +91,6 @@ @ cdecl EndClipboardUpdate() X11DRV_EndClipboardUpdate @ cdecl EnumClipboardFormats(long) X11DRV_EnumClipboardFormats @ cdecl GetClipboardData(long) X11DRV_GetClipboardData -@ cdecl GetClipboardFormatName(long ptr long) X11DRV_GetClipboardFormatName @ cdecl GetDC(long long long ptr ptr long) X11DRV_GetDC @ cdecl IsClipboardFormatAvailable(long) X11DRV_IsClipboardFormatAvailable @ cdecl MsgWaitForMultipleObjectsEx(long ptr long long long) X11DRV_MsgWaitForMultipleObjectsEx
1
0
0
0
Alexandre Julliard : winex11: Always reference clipboard formats by atom instead of name.
by Alexandre Julliard
04 Mar '11
04 Mar '11
Module: wine Branch: master Commit: 57921fec3ac4fa1e5b36bccc467b7219926f7b25 URL:
http://source.winehq.org/git/wine.git/?a=commit;h=57921fec3ac4fa1e5b36bccc4…
Author: Alexandre Julliard <julliard(a)winehq.org> Date: Thu Mar 3 21:37:35 2011 +0100 winex11: Always reference clipboard formats by atom instead of name. --- dlls/winex11.drv/clipboard.c | 164 ++++++++++++------------------------------ 1 files changed, 46 insertions(+), 118 deletions(-) Diff:
http://source.winehq.org/git/wine.git/?a=commitdiff;h=57921fec3ac4fa1e5b36b…
1
0
0
0
Alexandre Julliard : winex11: Pre-register atoms for all the built-in clipboard formats.
by Alexandre Julliard
04 Mar '11
04 Mar '11
Module: wine Branch: master Commit: f15e91a883b5a1d1a72f1388172b5b31a6986b02 URL:
http://source.winehq.org/git/wine.git/?a=commit;h=f15e91a883b5a1d1a72f13881…
Author: Alexandre Julliard <julliard(a)winehq.org> Date: Thu Mar 3 21:27:34 2011 +0100 winex11: Pre-register atoms for all the built-in clipboard formats. --- dlls/winex11.drv/clipboard.c | 46 ++++++++++++++++++++-------------------- dlls/winex11.drv/x11drv.h | 20 +++++++++++++++++ dlls/winex11.drv/x11drv_main.c | 20 +++++++++++++++++ 3 files changed, 63 insertions(+), 23 deletions(-) diff --git a/dlls/winex11.drv/clipboard.c b/dlls/winex11.drv/clipboard.c index c281bef..a1d4c6b 100644 --- a/dlls/winex11.drv/clipboard.c +++ b/dlls/winex11.drv/clipboard.c @@ -218,30 +218,30 @@ static const struct } builtin_formats[] = { { CF_TEXT, wszCF_TEXT, XA_STRING, X11DRV_CLIPBOARD_ImportXAString, X11DRV_CLIPBOARD_ExportString}, - { CF_BITMAP, wszCF_BITMAP, 0, X11DRV_CLIPBOARD_ImportClipboardData, NULL}, - { CF_METAFILEPICT, wszCF_METAFILEPICT, 0, X11DRV_CLIPBOARD_ImportMetaFilePict, X11DRV_CLIPBOARD_ExportMetaFilePict }, - { CF_SYLK, wszCF_SYLK, 0, X11DRV_CLIPBOARD_ImportClipboardData, X11DRV_CLIPBOARD_ExportClipboardData }, - { CF_DIF, wszCF_DIF, 0, X11DRV_CLIPBOARD_ImportClipboardData, X11DRV_CLIPBOARD_ExportClipboardData }, - { CF_TIFF, wszCF_TIFF, 0, X11DRV_CLIPBOARD_ImportClipboardData, X11DRV_CLIPBOARD_ExportClipboardData }, - { CF_OEMTEXT, wszCF_OEMTEXT, 0, X11DRV_CLIPBOARD_ImportClipboardData, X11DRV_CLIPBOARD_ExportClipboardData }, + { CF_BITMAP, wszCF_BITMAP, XATOM_WCF_BITMAP, X11DRV_CLIPBOARD_ImportClipboardData, NULL}, + { CF_METAFILEPICT, wszCF_METAFILEPICT, XATOM_WCF_METAFILEPICT, X11DRV_CLIPBOARD_ImportMetaFilePict, X11DRV_CLIPBOARD_ExportMetaFilePict }, + { CF_SYLK, wszCF_SYLK, XATOM_WCF_SYLK, X11DRV_CLIPBOARD_ImportClipboardData, X11DRV_CLIPBOARD_ExportClipboardData }, + { CF_DIF, wszCF_DIF, XATOM_WCF_DIF, X11DRV_CLIPBOARD_ImportClipboardData, X11DRV_CLIPBOARD_ExportClipboardData }, + { CF_TIFF, wszCF_TIFF, XATOM_WCF_TIFF, X11DRV_CLIPBOARD_ImportClipboardData, X11DRV_CLIPBOARD_ExportClipboardData }, + { CF_OEMTEXT, wszCF_OEMTEXT, XATOM_WCF_OEMTEXT, X11DRV_CLIPBOARD_ImportClipboardData, X11DRV_CLIPBOARD_ExportClipboardData }, { CF_DIB, wszCF_DIB, XA_PIXMAP, X11DRV_CLIPBOARD_ImportXAPIXMAP, X11DRV_CLIPBOARD_ExportXAPIXMAP }, - { CF_PALETTE, wszCF_PALETTE, 0, X11DRV_CLIPBOARD_ImportClipboardData, X11DRV_CLIPBOARD_ExportClipboardData }, - { CF_PENDATA, wszCF_PENDATA, 0, X11DRV_CLIPBOARD_ImportClipboardData, X11DRV_CLIPBOARD_ExportClipboardData }, - { CF_RIFF, wszCF_RIFF, 0, X11DRV_CLIPBOARD_ImportClipboardData, X11DRV_CLIPBOARD_ExportClipboardData }, - { CF_WAVE, wszCF_WAVE, 0, X11DRV_CLIPBOARD_ImportClipboardData, X11DRV_CLIPBOARD_ExportClipboardData }, - { CF_UNICODETEXT, wszUTF8STRING, 0, X11DRV_CLIPBOARD_ImportUTF8, X11DRV_CLIPBOARD_ExportString }, + { CF_PALETTE, wszCF_PALETTE, XATOM_WCF_PALETTE, X11DRV_CLIPBOARD_ImportClipboardData, X11DRV_CLIPBOARD_ExportClipboardData }, + { CF_PENDATA, wszCF_PENDATA, XATOM_WCF_PENDATA, X11DRV_CLIPBOARD_ImportClipboardData, X11DRV_CLIPBOARD_ExportClipboardData }, + { CF_RIFF, wszCF_RIFF, XATOM_WCF_RIFF, X11DRV_CLIPBOARD_ImportClipboardData, X11DRV_CLIPBOARD_ExportClipboardData }, + { CF_WAVE, wszCF_WAVE, XATOM_WCF_WAVE, X11DRV_CLIPBOARD_ImportClipboardData, X11DRV_CLIPBOARD_ExportClipboardData }, + { CF_UNICODETEXT, wszUTF8STRING, XATOM_UTF8_STRING, X11DRV_CLIPBOARD_ImportUTF8, X11DRV_CLIPBOARD_ExportString }, /* If UTF8_STRING is not available, attempt COMPOUND_TEXT */ - { CF_UNICODETEXT, wszCOMPOUNDTEXT, 0, X11DRV_CLIPBOARD_ImportCompoundText, X11DRV_CLIPBOARD_ExportString }, - { CF_ENHMETAFILE, wszCF_ENHMETAFILE, 0, X11DRV_CLIPBOARD_ImportEnhMetaFile, X11DRV_CLIPBOARD_ExportEnhMetaFile }, - { CF_HDROP, wszCF_HDROP, 0, X11DRV_CLIPBOARD_ImportClipboardData, X11DRV_CLIPBOARD_ExportClipboardData }, - { CF_LOCALE, wszCF_LOCALE, 0, X11DRV_CLIPBOARD_ImportClipboardData, X11DRV_CLIPBOARD_ExportClipboardData }, - { CF_DIBV5, wszCF_DIBV5, 0, X11DRV_CLIPBOARD_ImportClipboardData, X11DRV_CLIPBOARD_ExportClipboardData }, - { CF_OWNERDISPLAY, wszCF_OWNERDISPLAY, 0, X11DRV_CLIPBOARD_ImportClipboardData, X11DRV_CLIPBOARD_ExportClipboardData }, - { CF_DSPTEXT, wszCF_DSPTEXT, 0, X11DRV_CLIPBOARD_ImportClipboardData, X11DRV_CLIPBOARD_ExportClipboardData }, - { CF_DSPBITMAP, wszCF_DSPBITMAP, 0, X11DRV_CLIPBOARD_ImportClipboardData, X11DRV_CLIPBOARD_ExportClipboardData }, - { CF_DSPMETAFILEPICT, wszCF_DSPMETAFILEPICT, 0, X11DRV_CLIPBOARD_ImportClipboardData, X11DRV_CLIPBOARD_ExportClipboardData }, - { CF_DSPENHMETAFILE, wszCF_DSPENHMETAFILE, 0, X11DRV_CLIPBOARD_ImportClipboardData, X11DRV_CLIPBOARD_ExportClipboardData }, - { CF_DIB, wszIMAGEBMP, 0, X11DRV_CLIPBOARD_ImportImageBmp, X11DRV_CLIPBOARD_ExportImageBmp }, + { CF_UNICODETEXT, wszCOMPOUNDTEXT, XATOM_COMPOUND_TEXT, X11DRV_CLIPBOARD_ImportCompoundText, X11DRV_CLIPBOARD_ExportString }, + { CF_ENHMETAFILE, wszCF_ENHMETAFILE, XATOM_WCF_ENHMETAFILE, X11DRV_CLIPBOARD_ImportEnhMetaFile, X11DRV_CLIPBOARD_ExportEnhMetaFile }, + { CF_HDROP, wszCF_HDROP, XATOM_WCF_HDROP, X11DRV_CLIPBOARD_ImportClipboardData, X11DRV_CLIPBOARD_ExportClipboardData }, + { CF_LOCALE, wszCF_LOCALE, XATOM_WCF_LOCALE, X11DRV_CLIPBOARD_ImportClipboardData, X11DRV_CLIPBOARD_ExportClipboardData }, + { CF_DIBV5, wszCF_DIBV5, XATOM_WCF_DIBV5, X11DRV_CLIPBOARD_ImportClipboardData, X11DRV_CLIPBOARD_ExportClipboardData }, + { CF_OWNERDISPLAY, wszCF_OWNERDISPLAY, XATOM_WCF_OWNERDISPLAY, X11DRV_CLIPBOARD_ImportClipboardData, X11DRV_CLIPBOARD_ExportClipboardData }, + { CF_DSPTEXT, wszCF_DSPTEXT, XATOM_WCF_DSPTEXT, X11DRV_CLIPBOARD_ImportClipboardData, X11DRV_CLIPBOARD_ExportClipboardData }, + { CF_DSPBITMAP, wszCF_DSPBITMAP, XATOM_WCF_DSPBITMAP, X11DRV_CLIPBOARD_ImportClipboardData, X11DRV_CLIPBOARD_ExportClipboardData }, + { CF_DSPMETAFILEPICT, wszCF_DSPMETAFILEPICT, XATOM_WCF_DSPMETAFILEPICT, X11DRV_CLIPBOARD_ImportClipboardData, X11DRV_CLIPBOARD_ExportClipboardData }, + { CF_DSPENHMETAFILE, wszCF_DSPENHMETAFILE, XATOM_WCF_DSPENHMETAFILE, X11DRV_CLIPBOARD_ImportClipboardData, X11DRV_CLIPBOARD_ExportClipboardData }, + { CF_DIB, wszIMAGEBMP, XATOM_image_bmp, X11DRV_CLIPBOARD_ImportImageBmp, X11DRV_CLIPBOARD_ExportImageBmp }, }; static struct list format_list = LIST_INIT( format_list ); @@ -362,7 +362,7 @@ void X11DRV_InitClipboard(void) if (!(format = HeapAlloc( GetProcessHeap(), 0, sizeof(*format )))) break; format->wFormatID = builtin_formats[i].id; format->Name = builtin_formats[i].name; - format->drvData = builtin_formats[i].data; + format->drvData = GET_ATOM(builtin_formats[i].data); format->wFlags = CF_FLAG_BUILTINFMT; format->lpDrvImportFunc = builtin_formats[i].import; format->lpDrvExportFunc = builtin_formats[i].export; diff --git a/dlls/winex11.drv/x11drv.h b/dlls/winex11.drv/x11drv.h index 92898ef..6f0c8db 100644 --- a/dlls/winex11.drv/x11drv.h +++ b/dlls/winex11.drv/x11drv.h @@ -677,7 +677,27 @@ enum x11drv_atoms XATOM_XdndTarget, XATOM_XdndTypeList, XATOM_HTML_Format, + XATOM_WCF_BITMAP, XATOM_WCF_DIB, + XATOM_WCF_DIBV5, + XATOM_WCF_DIF, + XATOM_WCF_DSPBITMAP, + XATOM_WCF_DSPENHMETAFILE, + XATOM_WCF_DSPMETAFILEPICT, + XATOM_WCF_DSPTEXT, + XATOM_WCF_ENHMETAFILE, + XATOM_WCF_HDROP, + XATOM_WCF_LOCALE, + XATOM_WCF_METAFILEPICT, + XATOM_WCF_OEMTEXT, + XATOM_WCF_OWNERDISPLAY, + XATOM_WCF_PALETTE, + XATOM_WCF_PENDATA, + XATOM_WCF_RIFF, + XATOM_WCF_SYLK, + XATOM_WCF_TIFF, + XATOM_WCF_WAVE, + XATOM_image_bmp, XATOM_image_gif, XATOM_image_jpeg, XATOM_image_png, diff --git a/dlls/winex11.drv/x11drv_main.c b/dlls/winex11.drv/x11drv_main.c index 54f56b9..606bc28 100644 --- a/dlls/winex11.drv/x11drv_main.c +++ b/dlls/winex11.drv/x11drv_main.c @@ -179,7 +179,27 @@ static const char * const atom_names[NB_XATOMS - FIRST_XATOM] = "XdndTarget", "XdndTypeList", "HTML Format", + "WCF_BITMAP", "WCF_DIB", + "WCF_DIBV5", + "WCF_DIF", + "WCF_DSPBITMAP", + "WCF_DSPENHMETAFILE", + "WCF_DSPMETAFILEPICT", + "WCF_DSPTEXT", + "WCF_ENHMETAFILE", + "WCF_HDROP", + "WCF_LOCALE", + "WCF_METAFILEPICT", + "WCF_OEMTEXT", + "WCF_OWNERDISPLAY", + "WCF_PALETTE", + "WCF_PENDATA", + "WCF_RIFF", + "WCF_SYLK", + "WCF_TIFF", + "WCF_WAVE", + "image/bmp", "image/gif", "image/jpeg", "image/png",
1
0
0
0
Alexandre Julliard : winex11: Add a debug helper for printing clipboard formats.
by Alexandre Julliard
04 Mar '11
04 Mar '11
Module: wine Branch: master Commit: ade3b4f148fc681be975c28290786638538b1219 URL:
http://source.winehq.org/git/wine.git/?a=commit;h=ade3b4f148fc681be975c2829…
Author: Alexandre Julliard <julliard(a)winehq.org> Date: Thu Mar 3 21:09:22 2011 +0100 winex11: Add a debug helper for printing clipboard formats. --- dlls/winex11.drv/clipboard.c | 57 +++++++++++++++++++++++++++++++++++------ 1 files changed, 48 insertions(+), 9 deletions(-) diff --git a/dlls/winex11.drv/clipboard.c b/dlls/winex11.drv/clipboard.c index 30aee96..c281bef 100644 --- a/dlls/winex11.drv/clipboard.c +++ b/dlls/winex11.drv/clipboard.c @@ -310,6 +310,44 @@ static Window thread_selection_wnd(void) return w; } +static const char *debugstr_format( UINT id ) +{ + if (id >= 0xc000) + { + WCHAR buffer[256]; + GlobalGetAtomNameW( id, buffer, 256 ); + return wine_dbg_sprintf( "%04x %s", id, debugstr_w(buffer) ); + } + switch (id) + { +#define BUILTIN(id) case id: return #id; + BUILTIN(CF_TEXT) + BUILTIN(CF_BITMAP) + BUILTIN(CF_METAFILEPICT) + BUILTIN(CF_SYLK) + BUILTIN(CF_DIF) + BUILTIN(CF_TIFF) + BUILTIN(CF_OEMTEXT) + BUILTIN(CF_DIB) + BUILTIN(CF_PALETTE) + BUILTIN(CF_PENDATA) + BUILTIN(CF_RIFF) + BUILTIN(CF_WAVE) + BUILTIN(CF_UNICODETEXT) + BUILTIN(CF_ENHMETAFILE) + BUILTIN(CF_HDROP) + BUILTIN(CF_LOCALE) + BUILTIN(CF_DIBV5) + BUILTIN(CF_OWNERDISPLAY) + BUILTIN(CF_DSPTEXT) + BUILTIN(CF_DSPBITMAP) + BUILTIN(CF_DSPMETAFILEPICT) + BUILTIN(CF_DSPENHMETAFILE) +#undef BUILTIN + default: return wine_dbg_sprintf( "%04x", id ); + } +} + /************************************************************************** * X11DRV_InitClipboard */ @@ -498,8 +536,8 @@ static WINE_CLIPFORMAT *X11DRV_CLIPBOARD_InsertClipboardFormat(LPCWSTR FormatNam list_add_tail( &format_list, &lpNewFormat->entry ); - TRACE("Registering format(%04x): %s drvData %d\n", - lpNewFormat->wFormatID, debugstr_w(FormatName), lpNewFormat->drvData); + TRACE("Registering format %s drvData %d\n", + debugstr_format(lpNewFormat->wFormatID), lpNewFormat->drvData); return lpNewFormat; } @@ -1936,8 +1974,8 @@ static VOID X11DRV_CLIPBOARD_InsertSelectionProperties(Display *display, Atom* p */ while (lpFormat) { - TRACE("Atom#%d Property(%d): --> FormatID(%04x) %s\n", - i, lpFormat->drvData, lpFormat->wFormatID, debugstr_w(lpFormat->Name)); + TRACE("Atom#%d Property(%d): --> Format %s\n", + i, lpFormat->drvData, debugstr_format(lpFormat->wFormatID)); X11DRV_CLIPBOARD_InsertClipboardData(lpFormat->wFormatID, 0, 0, lpFormat, FALSE); lpFormat = X11DRV_CLIPBOARD_LookupProperty(lpFormat, properties[i]); } @@ -1979,8 +2017,8 @@ static VOID X11DRV_CLIPBOARD_InsertSelectionProperties(Display *display, Atom* p ERR("Failed to register %s property. Type will not be cached.\n", names[i]); continue; } - TRACE("Atom#%d Property(%d): --> FormatID(%04x) %s\n", - i, lpFormat->drvData, lpFormat->wFormatID, debugstr_w(lpFormat->Name)); + TRACE("Atom#%d Property(%d): --> Format %s\n", + i, lpFormat->drvData, debugstr_format(lpFormat->wFormatID)); X11DRV_CLIPBOARD_InsertClipboardData(lpFormat->wFormatID, 0, 0, lpFormat, FALSE); } wine_tsx11_lock(); @@ -2145,7 +2183,8 @@ static BOOL X11DRV_CLIPBOARD_ReadSelectionData(Display *display, LPWINE_CLIPDATA } TRACE("Requesting conversion of %s property (%d) from selection type %08x\n", - debugstr_w(lpData->lpFormat->Name), lpData->lpFormat->drvData, (UINT)selectionCacheSrc); + debugstr_format(lpData->lpFormat->wFormatID), lpData->lpFormat->drvData, + (UINT)selectionCacheSrc); wine_tsx11_lock(); XConvertSelection(display, selectionCacheSrc, lpData->lpFormat->drvData, @@ -3168,8 +3207,8 @@ static void X11DRV_HandleSelectionRequest( HWND hWnd, XSelectionRequestEvent *ev { int mode = PropModeReplace; - TRACE("\tUpdating property %s, %d bytes\n", debugstr_w(lpFormat->Name), cBytes); - + TRACE("\tUpdating property %s, %d bytes\n", + debugstr_format(lpFormat->wFormatID), cBytes); wine_tsx11_lock(); do {
1
0
0
0
Alexandre Julliard : winex11: Convert the clipboard format list to a standard Wine list.
by Alexandre Julliard
04 Mar '11
04 Mar '11
Module: wine Branch: master Commit: 7aa4acb80ab3c22f67b2c8073873c72ec0dd2c4f URL:
http://source.winehq.org/git/wine.git/?a=commit;h=7aa4acb80ab3c22f67b2c8073…
Author: Alexandre Julliard <julliard(a)winehq.org> Date: Thu Mar 3 20:52:13 2011 +0100 winex11: Convert the clipboard format list to a standard Wine list. --- dlls/winex11.drv/clipboard.c | 206 +++++++++++++++--------------------------- 1 files changed, 75 insertions(+), 131 deletions(-) Diff:
http://source.winehq.org/git/wine.git/?a=commitdiff;h=7aa4acb80ab3c22f67b2c…
1
0
0
0
Alexandre Julliard : winex11: Convert the clipboard data list to a standard Wine list.
by Alexandre Julliard
04 Mar '11
04 Mar '11
Module: wine Branch: master Commit: bfa753ba55a95415febbf4b03ccec99321cc3ff4 URL:
http://source.winehq.org/git/wine.git/?a=commit;h=bfa753ba55a95415febbf4b03…
Author: Alexandre Julliard <julliard(a)winehq.org> Date: Thu Mar 3 20:25:01 2011 +0100 winex11: Convert the clipboard data list to a standard Wine list. --- dlls/winex11.drv/clipboard.c | 103 ++++++++++-------------------------------- 1 files changed, 24 insertions(+), 79 deletions(-) diff --git a/dlls/winex11.drv/clipboard.c b/dlls/winex11.drv/clipboard.c index 3610af7..37d1f3f 100644 --- a/dlls/winex11.drv/clipboard.c +++ b/dlls/winex11.drv/clipboard.c @@ -79,6 +79,7 @@ #include "windef.h" #include "winbase.h" #include "x11drv.h" +#include "wine/list.h" #include "wine/debug.h" #include "wine/unicode.h" #include "wine/server.h" @@ -121,13 +122,12 @@ typedef struct tagWINE_CLIPFORMAT { } WINE_CLIPFORMAT, *LPWINE_CLIPFORMAT; typedef struct tagWINE_CLIPDATA { + struct list entry; UINT wFormatID; HANDLE hData; UINT wFlags; UINT drvData; LPWINE_CLIPFORMAT lpFormat; - struct tagWINE_CLIPDATA *PrevData; - struct tagWINE_CLIPDATA *NextData; } WINE_CLIPDATA, *LPWINE_CLIPDATA; #define CF_FLAG_BUILTINFMT 0x0001 /* Built-in windows format */ @@ -311,7 +311,7 @@ static const struct /* * Cached clipboard data. */ -static LPWINE_CLIPDATA ClipData = NULL; +static struct list data_list = LIST_INIT( data_list ); static UINT ClipDataCount = 0; /* @@ -487,24 +487,12 @@ static LPWINE_CLIPFORMAT X11DRV_CLIPBOARD_LookupProperty(LPWINE_CLIPFORMAT curre */ static LPWINE_CLIPDATA X11DRV_CLIPBOARD_LookupData(DWORD wID) { - LPWINE_CLIPDATA lpData = ClipData; + WINE_CLIPDATA *data; - if (lpData) - { - do - { - if (lpData->wFormatID == wID) - break; - - lpData = lpData->NextData; - } - while(lpData != ClipData); - - if (lpData->wFormatID != wID) - lpData = NULL; - } + LIST_FOR_EACH_ENTRY( data, &data_list, WINE_CLIPDATA, entry ) + if (data->wFormatID == wID) return data; - return lpData; + return NULL; } @@ -649,23 +637,7 @@ static BOOL X11DRV_CLIPBOARD_InsertClipboardData(UINT wFormatID, HANDLE hData, D lpData->lpFormat = lpFormat; lpData->drvData = 0; - if (ClipData) - { - LPWINE_CLIPDATA lpPrevData = ClipData->PrevData; - - lpData->PrevData = lpPrevData; - lpData->NextData = ClipData; - - lpPrevData->NextData = lpData; - ClipData->PrevData = lpData; - } - else - { - lpData->NextData = lpData; - lpData->PrevData = lpData; - ClipData = lpData; - } - + list_add_tail( &data_list, &lpData->entry ); ClipDataCount++; } @@ -2734,33 +2706,15 @@ int CDECL X11DRV_AcquireClipboard(HWND hWndClipWindow) */ void CDECL X11DRV_EmptyClipboard(BOOL keepunowned) { - if (ClipData) - { - LPWINE_CLIPDATA lpData, lpStart; - LPWINE_CLIPDATA lpNext = ClipData; - - TRACE(" called with %d entries in cache.\n", ClipDataCount); - - do - { - lpStart = ClipData; - lpData = lpNext; - lpNext = lpData->NextData; - - if (!keepunowned || !(lpData->wFlags & CF_FLAG_UNOWNED)) - { - lpData->PrevData->NextData = lpData->NextData; - lpData->NextData->PrevData = lpData->PrevData; - - if (lpData == ClipData) - ClipData = lpNext != lpData ? lpNext : NULL; - - X11DRV_CLIPBOARD_FreeData(lpData); - HeapFree(GetProcessHeap(), 0, lpData); + WINE_CLIPDATA *data, *next; - ClipDataCount--; - } - } while (lpNext != lpStart); + LIST_FOR_EACH_ENTRY_SAFE( data, next, &data_list, WINE_CLIPDATA, entry ) + { + if (keepunowned && (data->wFlags & CF_FLAG_UNOWNED)) continue; + list_remove( &data->entry ); + X11DRV_CLIPBOARD_FreeData( data ); + HeapFree( GetProcessHeap(), 0, data ); + ClipDataCount--; } TRACE(" %d entries remaining in cache.\n", ClipDataCount); @@ -2820,7 +2774,7 @@ INT CDECL X11DRV_CountClipboardFormats(void) UINT CDECL X11DRV_EnumClipboardFormats(UINT wFormat) { CLIPBOARDINFO cbinfo; - UINT wNextFormat = 0; + struct list *ptr = NULL; TRACE("(%04X)\n", wFormat); @@ -2828,18 +2782,16 @@ UINT CDECL X11DRV_EnumClipboardFormats(UINT wFormat) if (!wFormat) { - if (ClipData) - wNextFormat = ClipData->wFormatID; + ptr = list_head( &data_list ); } else { LPWINE_CLIPDATA lpData = X11DRV_CLIPBOARD_LookupData(wFormat); - - if (lpData && lpData->NextData != ClipData) - wNextFormat = lpData->NextData->wFormatID; + if (lpData) ptr = list_next( &data_list, &lpData->entry ); } - return wNextFormat; + if (!ptr) return 0; + return LIST_ENTRY( ptr, WINE_CLIPDATA, entry )->wFormatID; } @@ -3032,9 +2984,9 @@ static Atom X11DRV_SelectionRequest_TARGETS( Display *display, Window requestor, */ cTargets = 1; /* Include TARGETS */ - if (!(lpData = ClipData)) return None; + if (!list_head( &data_list )) return None; - do + LIST_FOR_EACH_ENTRY( lpData, &data_list, WINE_CLIPDATA, entry ) { lpFormats = ClipFormats; @@ -3046,10 +2998,7 @@ static Atom X11DRV_SelectionRequest_TARGETS( Display *display, Window requestor, lpFormats = lpFormats->NextFormat; } - - lpData = lpData->NextData; } - while (lpData != ClipData); TRACE(" found %d formats\n", cTargets); @@ -3059,10 +3008,9 @@ static Atom X11DRV_SelectionRequest_TARGETS( Display *display, Window requestor, return None; i = 0; - lpData = ClipData; targets[i++] = x11drv_atom(TARGETS); - do + LIST_FOR_EACH_ENTRY( lpData, &data_list, WINE_CLIPDATA, entry ) { lpFormats = ClipFormats; @@ -3074,10 +3022,7 @@ static Atom X11DRV_SelectionRequest_TARGETS( Display *display, Window requestor, lpFormats = lpFormats->NextFormat; } - - lpData = lpData->NextData; } - while (lpData != ClipData); wine_tsx11_lock();
1
0
0
0
Erich Hoover : shdocvw: Implement IWebBrowser::ExecWB and IWebBrowser:: QueryStatusWB.
by Alexandre Julliard
03 Mar '11
03 Mar '11
Module: wine Branch: master Commit: 4ec8e1a0371b6070ed654b4e56f66f1f0f9e7f6e URL:
http://source.winehq.org/git/wine.git/?a=commit;h=4ec8e1a0371b6070ed654b4e5…
Author: Erich Hoover <ehoover(a)mines.edu> Date: Tue Mar 1 13:25:41 2011 -0700 shdocvw: Implement IWebBrowser::ExecWB and IWebBrowser::QueryStatusWB. --- dlls/shdocvw/tests/webbrowser.c | 195 +++++++++++++++++++++++++++++++++++---- dlls/shdocvw/webbrowser.c | 67 +++++++++++++- 2 files changed, 240 insertions(+), 22 deletions(-) Diff:
http://source.winehq.org/git/wine.git/?a=commitdiff;h=4ec8e1a0371b6070ed654…
1
0
0
0
Maarten Lankhorst : gdiplus: Implement GdipAddPathString.
by Alexandre Julliard
03 Mar '11
03 Mar '11
Module: wine Branch: master Commit: b8a1e6c68791ca6e8d583cd2f99d36da498a2ac4 URL:
http://source.winehq.org/git/wine.git/?a=commit;h=b8a1e6c68791ca6e8d583cd2f…
Author: Maarten Lankhorst <m.b.lankhorst(a)gmail.com> Date: Thu Feb 17 11:06:43 2011 +0100 gdiplus: Implement GdipAddPathString. --- dlls/gdiplus/gdiplus_private.h | 10 ++ dlls/gdiplus/graphics.c | 7 +-- dlls/gdiplus/graphicspath.c | 179 +++++++++++++++++++++++++++++++++++++++- 3 files changed, 186 insertions(+), 10 deletions(-) diff --git a/dlls/gdiplus/gdiplus_private.h b/dlls/gdiplus/gdiplus_private.h index 42e28fa..68998df 100644 --- a/dlls/gdiplus/gdiplus_private.h +++ b/dlls/gdiplus/gdiplus_private.h @@ -397,4 +397,14 @@ struct GpRegion{ region_element node; }; +typedef GpStatus (*gdip_format_string_callback)(HDC hdc, + GDIPCONST WCHAR *string, INT index, INT length, GDIPCONST GpFont *font, + GDIPCONST RectF *rect, GDIPCONST GpStringFormat *format, + INT lineno, const RectF *bounds, void *user_data); + +GpStatus gdip_format_string(HDC hdc, + GDIPCONST WCHAR *string, INT length, GDIPCONST GpFont *font, + GDIPCONST RectF *rect, GDIPCONST GpStringFormat *format, + gdip_format_string_callback callback, void *user_data); + #endif diff --git a/dlls/gdiplus/graphics.c b/dlls/gdiplus/graphics.c index 5f226e9..43513c8 100644 --- a/dlls/gdiplus/graphics.c +++ b/dlls/gdiplus/graphics.c @@ -3989,12 +3989,7 @@ GpStatus WINGDIPAPI GdipIsVisibleRectI(GpGraphics *graphics, INT x, INT y, INT w return GdipIsVisibleRect(graphics, (REAL)x, (REAL)y, (REAL)width, (REAL)height, result); } -typedef GpStatus (*gdip_format_string_callback)(HDC hdc, - GDIPCONST WCHAR *string, INT index, INT length, GDIPCONST GpFont *font, - GDIPCONST RectF *rect, GDIPCONST GpStringFormat *format, - INT lineno, const RectF *bounds, void *user_data); - -static GpStatus gdip_format_string(HDC hdc, +GpStatus gdip_format_string(HDC hdc, GDIPCONST WCHAR *string, INT length, GDIPCONST GpFont *font, GDIPCONST RectF *rect, GDIPCONST GpStringFormat *format, gdip_format_string_callback callback, void *user_data) diff --git a/dlls/gdiplus/graphicspath.c b/dlls/gdiplus/graphicspath.c index 5a68147..992bd7c 100644 --- a/dlls/gdiplus/graphicspath.c +++ b/dlls/gdiplus/graphicspath.c @@ -831,16 +831,187 @@ GpStatus WINGDIPAPI GdipAddPathPolygonI(GpPath *path, GDIPCONST GpPoint *points, return status; } +static float fromfixedpoint(const FIXED v) +{ + float f = ((float)v.fract) / (1<<(sizeof(v.fract)*8)); + f += v.value; + return f; +} + +struct format_string_args +{ + GpPath *path; + UINT maxY; +}; + +static GpStatus format_string_callback(HDC dc, + GDIPCONST WCHAR *string, INT index, INT length, GDIPCONST GpFont *font, + GDIPCONST RectF *rect, GDIPCONST GpStringFormat *format, + INT lineno, const RectF *bounds, void *priv) +{ + static const MAT2 identity = { {0,1}, {0,0}, {0,0}, {0,1} }; + struct format_string_args *args = priv; + GpPath *path = args->path; + GpStatus status = Ok; + float x = bounds->X; + float y = bounds->Y; + int i; + + for (i = index; i < length; ++i) + { + GLYPHMETRICS gm; + TTPOLYGONHEADER *ph = NULL; + char *start; + DWORD len, ofs = 0; + UINT bb_end; + len = GetGlyphOutlineW(dc, string[i], GGO_BEZIER, &gm, 0, NULL, &identity); + if (len == GDI_ERROR) + { + status = GenericError; + break; + } + ph = GdipAlloc(len); + start = (char *)ph; + if (!ph || !lengthen_path(path, len / sizeof(POINTFX))) + { + status = OutOfMemory; + break; + } + GetGlyphOutlineW(dc, string[i], GGO_BEZIER, &gm, len, start, &identity); + bb_end = gm.gmBlackBoxY + gm.gmptGlyphOrigin.y; + if (bb_end + y > args->maxY) + args->maxY = bb_end + y; + + ofs = 0; + while (ofs < len) + { + DWORD ofs_start = ofs; + ph = (TTPOLYGONHEADER*)&start[ofs]; + path->pathdata.Types[path->pathdata.Count] = PathPointTypeStart; + path->pathdata.Points[path->pathdata.Count].X = x + fromfixedpoint(ph->pfxStart.x); + path->pathdata.Points[path->pathdata.Count++].Y = y + bb_end - fromfixedpoint(ph->pfxStart.y); + TRACE("Starting at count %i with pos %f, %f)\n", path->pathdata.Count, x, y); + ofs += sizeof(*ph); + while (ofs - ofs_start < ph->cb) + { + TTPOLYCURVE *curve = (TTPOLYCURVE*)&start[ofs]; + int j; + ofs += sizeof(TTPOLYCURVE) + (curve->cpfx - 1) * sizeof(POINTFX); + + switch (curve->wType) + { + case TT_PRIM_LINE: + for (j = 0; j < curve->cpfx; ++j) + { + path->pathdata.Types[path->pathdata.Count] = PathPointTypeLine; + path->pathdata.Points[path->pathdata.Count].X = x + fromfixedpoint(curve->apfx[j].x); + path->pathdata.Points[path->pathdata.Count++].Y = y + bb_end - fromfixedpoint(curve->apfx[j].y); + } + break; + case TT_PRIM_CSPLINE: + for (j = 0; j < curve->cpfx; ++j) + { + path->pathdata.Types[path->pathdata.Count] = PathPointTypeBezier; + path->pathdata.Points[path->pathdata.Count].X = x + fromfixedpoint(curve->apfx[j].x); + path->pathdata.Points[path->pathdata.Count++].Y = y + bb_end - fromfixedpoint(curve->apfx[j].y); + } + break; + default: + ERR("Unhandled type: %u\n", curve->wType); + status = GenericError; + } + } + path->pathdata.Types[path->pathdata.Count - 1] |= PathPointTypeCloseSubpath; + } + path->newfigure = TRUE; + x += gm.gmCellIncX; + y += gm.gmCellIncY; + + GdipFree(ph); + if (status != Ok) + break; + } + + return status; +} + GpStatus WINGDIPAPI GdipAddPathString(GpPath* path, GDIPCONST WCHAR* string, INT length, GDIPCONST GpFontFamily* family, INT style, REAL emSize, GDIPCONST RectF* layoutRect, GDIPCONST GpStringFormat* format) { - FIXME("(%p, %p, %d, %p, %d, %f, %p, %p): stub\n", path, string, length, family, style, emSize, layoutRect, format); - return NotImplemented; + GpFont *font; + GpStatus status; + HANDLE hfont; + HDC dc; + GpPath *backup; + struct format_string_args args; + int i; + + FIXME("(%p, %s, %d, %p, %d, %f, %p, %p): stub\n", path, debugstr_w(string), length, family, style, emSize, layoutRect, format); + if (!path || !string || !family || !emSize || !layoutRect || !format) + return InvalidParameter; + + status = GdipCreateFont(family, emSize, style, UnitPixel, &font); + if (status != Ok) + return status; + + hfont = CreateFontIndirectW(&font->lfw); + if (!hfont) + { + WARN("Failed to create font\n"); + return GenericError; + } + + if ((status = GdipClonePath(path, &backup)) != Ok) + { + DeleteObject(hfont); + return status; + } + + dc = CreateCompatibleDC(0); + SelectObject(dc, hfont); + + args.path = path; + args.maxY = 0; + status = gdip_format_string(dc, string, length, NULL, layoutRect, format, format_string_callback, &args); + + DeleteDC(dc); + DeleteObject(hfont); + + if (status != Ok) /* free backup */ + { + GdipFree(path->pathdata.Points); + GdipFree(path->pathdata.Types); + *path = *backup; + GdipFree(backup); + return status; + } + if (format && format->vertalign == StringAlignmentCenter && layoutRect->Y + args.maxY < layoutRect->Height) + { + float inc = layoutRect->Height - args.maxY - layoutRect->Y; + inc /= 2; + for (i = backup->pathdata.Count; i < path->pathdata.Count; ++i) + path->pathdata.Points[i].Y += inc; + } else if (format && format->vertalign == StringAlignmentFar) { + float inc = layoutRect->Height - args.maxY - layoutRect->Y; + for (i = backup->pathdata.Count; i < path->pathdata.Count; ++i) + path->pathdata.Points[i].Y += inc; + } + GdipDeletePath(backup); + return status; } GpStatus WINGDIPAPI GdipAddPathStringI(GpPath* path, GDIPCONST WCHAR* string, INT length, GDIPCONST GpFontFamily* family, INT style, REAL emSize, GDIPCONST Rect* layoutRect, GDIPCONST GpStringFormat* format) { - FIXME("(%p, %p, %d, %p, %d, %f, %p, %p): stub\n", path, string, length, family, style, emSize, layoutRect, format); - return NotImplemented; + if (layoutRect) + { + RectF layoutRectF = { + (REAL)layoutRect->X, + (REAL)layoutRect->Y, + (REAL)layoutRect->Width, + (REAL)layoutRect->Height + }; + return GdipAddPathString(path, string, length, family, style, emSize, &layoutRectF, format); + } + return InvalidParameter; } GpStatus WINGDIPAPI GdipClonePath(GpPath* path, GpPath **clone)
1
0
0
0
Maarten Lankhorst : gdiplus: Add tests and fix GdipDrawImagePointsRect.
by Alexandre Julliard
03 Mar '11
03 Mar '11
Module: wine Branch: master Commit: c0576948833522e71aa9cc2c77ce5d515b473d2f URL:
http://source.winehq.org/git/wine.git/?a=commit;h=c0576948833522e71aa9cc2c7…
Author: Maarten Lankhorst <m.b.lankhorst(a)gmail.com> Date: Thu Feb 17 10:51:33 2011 +0100 gdiplus: Add tests and fix GdipDrawImagePointsRect. --- dlls/gdiplus/graphics.c | 5 +++ dlls/gdiplus/tests/graphics.c | 56 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 61 insertions(+), 0 deletions(-) diff --git a/dlls/gdiplus/graphics.c b/dlls/gdiplus/graphics.c index 65700da..5f226e9 100644 --- a/dlls/gdiplus/graphics.c +++ b/dlls/gdiplus/graphics.c @@ -2161,6 +2161,9 @@ GpStatus WINGDIPAPI GdipDrawImagePointsRect(GpGraphics *graphics, GpImage *image count, srcx, srcy, srcwidth, srcheight, srcUnit, imageAttributes, callback, callbackData); + if (count > 3) + return NotImplemented; + if(!graphics || !image || !points || count != 3) return InvalidParameter; @@ -2170,6 +2173,8 @@ GpStatus WINGDIPAPI GdipDrawImagePointsRect(GpGraphics *graphics, GpImage *image memcpy(ptf, points, 3 * sizeof(GpPointF)); ptf[3].X = ptf[2].X + ptf[1].X - ptf[0].X; ptf[3].Y = ptf[2].Y + ptf[1].Y - ptf[0].Y; + if (!srcwidth || !srcheight || ptf[3].X == ptf[0].X || ptf[3].Y == ptf[0].Y) + return Ok; transform_and_round_points(graphics, pti, ptf, 4); if (image->picture) diff --git a/dlls/gdiplus/tests/graphics.c b/dlls/gdiplus/tests/graphics.c index 9a746b1..275c237 100644 --- a/dlls/gdiplus/tests/graphics.c +++ b/dlls/gdiplus/tests/graphics.c @@ -1130,6 +1130,60 @@ static void test_GdipDrawLineI(void) ReleaseDC(hwnd, hdc); } +static void test_GdipDrawImagePointsRect(void) +{ + GpStatus status; + GpGraphics *graphics = NULL; + GpPointF ptf[4]; + GpBitmap *bm = NULL; + BYTE rbmi[sizeof(BITMAPINFOHEADER)]; + BYTE buff[400]; + BITMAPINFO *bmi = (BITMAPINFO*)rbmi; + HDC hdc = GetDC( hwnd ); + if (!hdc) + return; + + memset(rbmi, 0, sizeof(rbmi)); + bmi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER); + bmi->bmiHeader.biWidth = 10; + bmi->bmiHeader.biHeight = 10; + bmi->bmiHeader.biPlanes = 1; + bmi->bmiHeader.biBitCount = 32; + bmi->bmiHeader.biCompression = BI_RGB; + status = GdipCreateBitmapFromGdiDib(bmi, buff, &bm); + expect(Ok, status); + ok(NULL != bm, "Expected bitmap to be initialized\n"); + status = GdipCreateFromHDC(hdc, &graphics); + expect(Ok, status); + ptf[0].X = 0; + ptf[0].Y = 0; + ptf[1].X = 10; + ptf[1].Y = 0; + ptf[2].X = 0; + ptf[2].Y = 10; + ptf[3].X = 10; + ptf[3].Y = 10; + status = GdipDrawImagePointsRect(graphics, (GpImage*)bm, ptf, 4, 0, 0, 10, 10, UnitPixel, NULL, NULL, NULL); + expect(NotImplemented, status); + status = GdipDrawImagePointsRect(graphics, (GpImage*)bm, ptf, 2, 0, 0, 10, 10, UnitPixel, NULL, NULL, NULL); + expect(InvalidParameter, status); + status = GdipDrawImagePointsRect(graphics, (GpImage*)bm, ptf, 3, 0, 0, 10, 10, UnitPixel, NULL, NULL, NULL); + expect(Ok, status); + status = GdipDrawImagePointsRect(graphics, NULL, ptf, 3, 0, 0, 10, 10, UnitPixel, NULL, NULL, NULL); + expect(InvalidParameter, status); + status = GdipDrawImagePointsRect(graphics, (GpImage*)bm, NULL, 3, 0, 0, 10, 10, UnitPixel, NULL, NULL, NULL); + expect(InvalidParameter, status); + status = GdipDrawImagePointsRect(graphics, (GpImage*)bm, ptf, 3, 0, 0, 0, 0, UnitPixel, NULL, NULL, NULL); + expect(Ok, status); + memset(ptf, 0, sizeof(ptf)); + status = GdipDrawImagePointsRect(graphics, (GpImage*)bm, ptf, 3, 0, 0, 10, 10, UnitPixel, NULL, NULL, NULL); + expect(Ok, status); + + GdipDisposeImage((GpImage*)bm); + GdipDeleteGraphics(graphics); + ReleaseDC(hwnd, hdc); +} + static void test_GdipDrawLinesI(void) { GpStatus status; @@ -1603,6 +1657,7 @@ static void test_Get_Release_DC(void) expect(ObjectBusy, status); status = GdipTransformPoints(graphics, CoordinateSpacePage, CoordinateSpaceWorld, ptf, 5); expect(ObjectBusy, status); + /* try to delete before release */ status = GdipDeleteGraphics(graphics); expect(ObjectBusy, status); @@ -2998,6 +3053,7 @@ START_TEST(graphics) test_GdipDrawCurve3I(); test_GdipDrawLineI(); test_GdipDrawLinesI(); + test_GdipDrawImagePointsRect(); test_GdipFillClosedCurve(); test_GdipFillClosedCurveI(); test_GdipDrawString();
1
0
0
0
Maarten Lankhorst : gdiplus: Clean up gdip_format_string.
by Alexandre Julliard
03 Mar '11
03 Mar '11
Module: wine Branch: master Commit: fe8e08a5d637b7dec927abdcda65e027aa867a05 URL:
http://source.winehq.org/git/wine.git/?a=commit;h=fe8e08a5d637b7dec927abdcd…
Author: Maarten Lankhorst <m.b.lankhorst(a)gmail.com> Date: Thu Feb 17 11:06:02 2011 +0100 gdiplus: Clean up gdip_format_string. --- dlls/gdiplus/graphics.c | 46 +++++++++++++++++++++------------------------- 1 files changed, 21 insertions(+), 25 deletions(-) diff --git a/dlls/gdiplus/graphics.c b/dlls/gdiplus/graphics.c index 026b9a2..65700da 100644 --- a/dlls/gdiplus/graphics.c +++ b/dlls/gdiplus/graphics.c @@ -3984,12 +3984,12 @@ GpStatus WINGDIPAPI GdipIsVisibleRectI(GpGraphics *graphics, INT x, INT y, INT w return GdipIsVisibleRect(graphics, (REAL)x, (REAL)y, (REAL)width, (REAL)height, result); } -typedef GpStatus (*gdip_format_string_callback)(GpGraphics *graphics, +typedef GpStatus (*gdip_format_string_callback)(HDC hdc, GDIPCONST WCHAR *string, INT index, INT length, GDIPCONST GpFont *font, GDIPCONST RectF *rect, GDIPCONST GpStringFormat *format, INT lineno, const RectF *bounds, void *user_data); -static GpStatus gdip_format_string(GpGraphics *graphics, +static GpStatus gdip_format_string(HDC hdc, GDIPCONST WCHAR *string, INT length, GDIPCONST GpFont *font, GDIPCONST RectF *rect, GDIPCONST GpStringFormat *format, gdip_format_string_callback callback, void *user_data) @@ -4028,7 +4028,7 @@ static GpStatus gdip_format_string(GpGraphics *graphics, else halign = StringAlignmentNear; while(sum < length){ - GetTextExtentExPointW(graphics->hdc, stringdup + sum, length - sum, + GetTextExtentExPointW(hdc, stringdup + sum, length - sum, nwidth, &fit, NULL, &size); fitcpy = fit; @@ -4066,7 +4066,7 @@ static GpStatus gdip_format_string(GpGraphics *graphics, else lineend = fit; - GetTextExtentExPointW(graphics->hdc, stringdup + sum, lineend, + GetTextExtentExPointW(hdc, stringdup + sum, lineend, nwidth, &j, NULL, &size); bounds.Width = size.cx; @@ -4092,7 +4092,7 @@ static GpStatus gdip_format_string(GpGraphics *graphics, break; } - stat = callback(graphics, stringdup, sum, lineend, + stat = callback(hdc, stringdup, sum, lineend, font, rect, format, lineno, &bounds, user_data); if (stat != Ok) @@ -4119,7 +4119,7 @@ struct measure_ranges_args { GpRegion **regions; }; -static GpStatus measure_ranges_callback(GpGraphics *graphics, +static GpStatus measure_ranges_callback(HDC hdc, GDIPCONST WCHAR *string, INT index, INT length, GDIPCONST GpFont *font, GDIPCONST RectF *rect, GDIPCONST GpStringFormat *format, INT lineno, const RectF *bounds, void *user_data) @@ -4140,11 +4140,11 @@ static GpStatus measure_ranges_callback(GpGraphics *graphics, range_rect.Y = bounds->Y; range_rect.Height = bounds->Height; - GetTextExtentExPointW(graphics->hdc, string + index, range_start - index, + GetTextExtentExPointW(hdc, string + index, range_start - index, INT_MAX, NULL, NULL, &range_size); range_rect.X = bounds->X + range_size.cx; - GetTextExtentExPointW(graphics->hdc, string + index, range_end - index, + GetTextExtentExPointW(hdc, string + index, range_end - index, INT_MAX, NULL, NULL, &range_size); range_rect.Width = (bounds->X + range_size.cx) - range_rect.X; @@ -4166,7 +4166,7 @@ GpStatus WINGDIPAPI GdipMeasureCharacterRanges(GpGraphics* graphics, int i; HFONT oldfont; struct measure_ranges_args args; - HDC temp_hdc=NULL; + HDC hdc, temp_hdc=NULL; TRACE("(%p %s %d %p %s %p %d %p)\n", graphics, debugstr_w(string), length, font, debugstr_rectf(layoutRect), stringFormat, regionCount, regions); @@ -4179,14 +4179,16 @@ GpStatus WINGDIPAPI GdipMeasureCharacterRanges(GpGraphics* graphics, if(!graphics->hdc) { - temp_hdc = graphics->hdc = CreateCompatibleDC(0); + hdc = temp_hdc = CreateCompatibleDC(0); if (!temp_hdc) return OutOfMemory; } + else + hdc = graphics->hdc; if (stringFormat->attr) TRACE("may be ignoring some format flags: attr %x\n", stringFormat->attr); - oldfont = SelectObject(graphics->hdc, CreateFontIndirectW(&font->lfw)); + oldfont = SelectObject(hdc, CreateFontIndirectW(&font->lfw)); for (i=0; i<stringFormat->range_count; i++) { @@ -4197,16 +4199,13 @@ GpStatus WINGDIPAPI GdipMeasureCharacterRanges(GpGraphics* graphics, args.regions = regions; - stat = gdip_format_string(graphics, string, length, font, layoutRect, stringFormat, + stat = gdip_format_string(hdc, string, length, font, layoutRect, stringFormat, measure_ranges_callback, &args); - DeleteObject(SelectObject(graphics->hdc, oldfont)); + DeleteObject(SelectObject(hdc, oldfont)); if (temp_hdc) - { - graphics->hdc = NULL; DeleteDC(temp_hdc); - } return stat; } @@ -4217,7 +4216,7 @@ struct measure_string_args { INT *linesfilled; }; -static GpStatus measure_string_callback(GpGraphics *graphics, +static GpStatus measure_string_callback(HDC hdc, GDIPCONST WCHAR *string, INT index, INT length, GDIPCONST GpFont *font, GDIPCONST RectF *rect, GDIPCONST GpStringFormat *format, INT lineno, const RectF *bounds, void *user_data) @@ -4261,7 +4260,7 @@ GpStatus WINGDIPAPI GdipMeasureString(GpGraphics *graphics, if(!graphics->hdc) { - temp_hdc = graphics->hdc = CreateCompatibleDC(0); + temp_hdc = CreateCompatibleDC(0); if (!temp_hdc) return OutOfMemory; } @@ -4282,16 +4281,13 @@ GpStatus WINGDIPAPI GdipMeasureString(GpGraphics *graphics, args.codepointsfitted = codepointsfitted; args.linesfilled = linesfilled; - gdip_format_string(graphics, string, length, font, rect, format, + gdip_format_string(graphics->hdc ? graphics->hdc : temp_hdc, string, length, font, rect, format, measure_string_callback, &args); DeleteObject(SelectObject(graphics->hdc, oldfont)); if (temp_hdc) - { - graphics->hdc = NULL; DeleteDC(temp_hdc); - } return Ok; } @@ -4302,7 +4298,7 @@ struct draw_string_args { REAL ang_cos, ang_sin; }; -static GpStatus draw_string_callback(GpGraphics *graphics, +static GpStatus draw_string_callback(HDC hdc, GDIPCONST WCHAR *string, INT index, INT length, GDIPCONST GpFont *font, GDIPCONST RectF *rect, GDIPCONST GpStringFormat *format, INT lineno, const RectF *bounds, void *user_data) @@ -4313,7 +4309,7 @@ static GpStatus draw_string_callback(GpGraphics *graphics, drawcoord.left = drawcoord.right = args->drawbase.x + roundr(args->ang_sin * bounds->Y); drawcoord.top = drawcoord.bottom = args->drawbase.y + roundr(args->ang_cos * bounds->Y); - DrawTextW(graphics->hdc, string + index, length, &drawcoord, args->drawflags); + DrawTextW(hdc, string + index, length, &drawcoord, args->drawflags); return Ok; } @@ -4436,7 +4432,7 @@ GpStatus WINGDIPAPI GdipDrawString(GpGraphics *graphics, GDIPCONST WCHAR *string args.drawflags = DT_NOCLIP | DT_EXPANDTABS | DT_RIGHT; } - gdip_format_string(graphics, string, length, font, &scaled_rect, format, + gdip_format_string(graphics->hdc, string, length, font, &scaled_rect, format, draw_string_callback, &args); DeleteObject(rgn);
1
0
0
0
Jacek Caban : mshtml: Added support for indexed access to form elements.
by Alexandre Julliard
03 Mar '11
03 Mar '11
Module: wine Branch: master Commit: 0af2a117c348bc9e6cf09b50c80713f64805984f URL:
http://source.winehq.org/git/wine.git/?a=commit;h=0af2a117c348bc9e6cf09b50c…
Author: Jacek Caban <jacek(a)codeweavers.com> Date: Thu Mar 3 15:18:26 2011 +0100 mshtml: Added support for indexed access to form elements. --- dlls/mshtml/htmlform.c | 14 ++++++++++++++ 1 files changed, 14 insertions(+), 0 deletions(-) diff --git a/dlls/mshtml/htmlform.c b/dlls/mshtml/htmlform.c index d9c2bce..ac6d39c 100644 --- a/dlls/mshtml/htmlform.c +++ b/dlls/mshtml/htmlform.c @@ -534,6 +534,20 @@ static HRESULT HTMLFormElement_get_dispid(HTMLDOMNode *iface, return E_FAIL; } + if(len > MSHTML_CUSTOM_DISPID_CNT) + len = MSHTML_CUSTOM_DISPID_CNT; + + /* FIXME: Implement in more generic way */ + if('0' <= *name && *name <= '9') { + WCHAR *end_ptr; + + i = strtoulW(name, &end_ptr, 10); + if(!*end_ptr && i < len) { + *pid = MSHTML_DISPID_CUSTOM_MIN + i; + return S_OK; + } + } + nsAString_InitDepend(&nsname, nameW); nsAString_Init(&nsstr, NULL); for(i = 0; i < len; ++i) {
1
0
0
0
Joris Huizer : userenv: GetUserProfileDirectoryW: Plug memory leak.
by Alexandre Julliard
03 Mar '11
03 Mar '11
Module: wine Branch: master Commit: fa7c08820b0234f107d594b8ba49bf1156f0be50 URL:
http://source.winehq.org/git/wine.git/?a=commit;h=fa7c08820b0234f107d594b8b…
Author: Joris Huizer <joris_huizer(a)yahoo.com> Date: Wed Mar 2 21:28:43 2011 +0100 userenv: GetUserProfileDirectoryW: Plug memory leak. --- dlls/userenv/userenv_main.c | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) diff --git a/dlls/userenv/userenv_main.c b/dlls/userenv/userenv_main.c index 6a2a953..6221e7e 100644 --- a/dlls/userenv/userenv_main.c +++ b/dlls/userenv/userenv_main.c @@ -187,6 +187,7 @@ BOOL WINAPI GetUserProfileDirectoryW( HANDLE hToken, LPWSTR lpProfileDir, ret = TRUE; done: + HeapFree( GetProcessHeap(), 0, t ); HeapFree( GetProcessHeap(), 0, userW ); HeapFree( GetProcessHeap(), 0, dirW ); return ret;
1
0
0
0
Juan Lang : wininet: Support setting the expired time in SetUrlCacheEntryInfo.
by Alexandre Julliard
03 Mar '11
03 Mar '11
Module: wine Branch: master Commit: 75cc509daef08920ea38655e4b52fc083be90081 URL:
http://source.winehq.org/git/wine.git/?a=commit;h=75cc509daef08920ea38655e4…
Author: Juan Lang <juan.lang(a)gmail.com> Date: Wed Mar 2 09:07:58 2011 -0800 wininet: Support setting the expired time in SetUrlCacheEntryInfo. --- dlls/wininet/urlcache.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/dlls/wininet/urlcache.c b/dlls/wininet/urlcache.c index 2129f42..a52de20 100644 --- a/dlls/wininet/urlcache.c +++ b/dlls/wininet/urlcache.c @@ -1090,7 +1090,7 @@ static DWORD URLCache_SetEntryInfo(URL_CACHEFILE_ENTRY * pUrlEntry, const INTERN if (dwFieldControl & CACHE_ENTRY_EXEMPT_DELTA_FC) pUrlEntry->dwExemptDelta = lpCacheEntryInfo->u.dwExemptDelta; if (dwFieldControl & CACHE_ENTRY_EXPTIME_FC) - FIXME("CACHE_ENTRY_EXPTIME_FC unimplemented\n"); + FileTimeToDosDateTime(&lpCacheEntryInfo->ExpireTime, &pUrlEntry->wExpiredDate, &pUrlEntry->wExpiredTime); if (dwFieldControl & CACHE_ENTRY_HEADERINFO_FC) FIXME("CACHE_ENTRY_HEADERINFO_FC unimplemented\n"); if (dwFieldControl & CACHE_ENTRY_HITRATE_FC)
1
0
0
0
Juan Lang : wininet: Use correct scheme for cache entries.
by Alexandre Julliard
03 Mar '11
03 Mar '11
Module: wine Branch: master Commit: b9c348a0b30dca03f8d64f6a36a262a4784296ff URL:
http://source.winehq.org/git/wine.git/?a=commit;h=b9c348a0b30dca03f8d64f6a3…
Author: Juan Lang <juan.lang(a)gmail.com> Date: Wed Mar 2 08:28:39 2011 -0800 wininet: Use correct scheme for cache entries. --- dlls/wininet/http.c | 16 +++++++++++++--- 1 files changed, 13 insertions(+), 3 deletions(-) diff --git a/dlls/wininet/http.c b/dlls/wininet/http.c index ae45b08..0467860 100644 --- a/dlls/wininet/http.c +++ b/dlls/wininet/http.c @@ -1533,15 +1533,25 @@ static DWORD HTTP_ResolveName(http_request_t *request) static BOOL HTTP_GetRequestURL(http_request_t *req, LPWSTR buf) { + static const WCHAR http[] = { 'h','t','t','p',':','/','/',0 }; + static const WCHAR https[] = { 'h','t','t','p','s',':','/','/',0 }; + static const WCHAR slash[] = { '/',0 }; LPHTTPHEADERW host_header; - - static const WCHAR formatW[] = {'h','t','t','p',':','/','/','%','s','%','s',0}; + LPCWSTR scheme; host_header = HTTP_GetHeader(req, hostW); if(!host_header) return FALSE; - sprintfW(buf, formatW, host_header->lpszValue, req->path); /* FIXME */ + if (req->hdr.dwFlags & INTERNET_FLAG_SECURE) + scheme = https; + else + scheme = http; + strcpyW(buf, scheme); + strcatW(buf, host_header->lpszValue); + if (req->path[0] != '/') + strcatW(buf, slash); + strcatW(buf, req->path); return TRUE; }
1
0
0
0
André Hentschel : t2embed: Add stub for TTEmbedFont.
by Alexandre Julliard
03 Mar '11
03 Mar '11
Module: wine Branch: master Commit: 29d5887b5c4c24b8d52988324fbea65a5dacb696 URL:
http://source.winehq.org/git/wine.git/?a=commit;h=29d5887b5c4c24b8d52988324…
Author: André Hentschel <nerv(a)dawncrow.de> Date: Thu Mar 3 13:09:56 2011 +0100 t2embed: Add stub for TTEmbedFont. --- dlls/t2embed/main.c | 13 +++++++++++++ dlls/t2embed/t2embed.spec | 4 ++-- include/t2embapi.h | 8 ++++++++ 3 files changed, 23 insertions(+), 2 deletions(-) diff --git a/dlls/t2embed/main.c b/dlls/t2embed/main.c index 6d12eff..f3f1a00 100644 --- a/dlls/t2embed/main.c +++ b/dlls/t2embed/main.c @@ -60,6 +60,19 @@ LONG WINAPI TTLoadEmbeddedFont(HANDLE *phFontReference, ULONG ulFlags, return E_API_NOTIMPL; } +LONG WINAPI TTEmbedFont(HDC hDC, ULONG ulFlags, ULONG ulCharSet, ULONG *pulPrivStatus, + ULONG *pulStatus, WRITEEMBEDPROC lpfnWriteToStream, LPVOID lpvWriteStream, + USHORT *pusCharCodeSet, USHORT usCharCodeCount, USHORT usLanguage, + TTEMBEDINFO *pTTEmbedInfo) +{ + FIXME("(%p 0x%08x 0x%08x %p %p %p %p %p %u %u %p) stub\n", hDC, + ulFlags, ulCharSet, pulPrivStatus, pulStatus, lpfnWriteToStream, + lpvWriteStream, pusCharCodeSet, usCharCodeCount, usLanguage, + pTTEmbedInfo); + + return E_API_NOTIMPL; +} + LONG WINAPI TTGetEmbeddingType(HDC hDC, ULONG *status) { FIXME("(%p %p) stub\n", hDC, status); diff --git a/dlls/t2embed/t2embed.spec b/dlls/t2embed/t2embed.spec index 2566fa2..120eaaa 100644 --- a/dlls/t2embed/t2embed.spec +++ b/dlls/t2embed/t2embed.spec @@ -1,6 +1,6 @@ @ stub TTCharToUnicode @ stub TTDeleteEmbeddedFont -@ stub TTEmbedFont +@ stdcall TTEmbedFont(ptr long long ptr ptr ptr ptr ptr long long ptr) @ stub TTEmbedFontFromFileA @ stub TTEnableEmbeddingForFacename @ stub TTGetEmbeddedFontInfo @@ -11,7 +11,7 @@ @ stub TTRunValidationTests @ stub _TTCharToUnicode@24 @ stub _TTDeleteEmbeddedFont@12 -@ stub _TTEmbedFont@44 +@ stdcall _TTEmbedFont@44(ptr long long ptr ptr ptr ptr ptr long long ptr) TTEmbedFont @ stub _TTEmbedFontFromFileA@52 @ stub _TTEnableEmbeddingForFacename@8 @ stub _TTGetEmbeddedFontInfo@28 diff --git a/include/t2embapi.h b/include/t2embapi.h index d0ddef2..151bfc1 100644 --- a/include/t2embapi.h +++ b/include/t2embapi.h @@ -28,6 +28,7 @@ extern "C" { #define E_API_NOTIMPL 0x0001L typedef ULONG (WINAPIV * READEMBEDPROC)(void*,void*,ULONG); +typedef ULONG (WINAPIV * WRITEEMBEDPROC)(void*,void*,ULONG); typedef struct { @@ -36,6 +37,13 @@ typedef struct unsigned short *pusRefStr; } TTLOADINFO; +typedef struct +{ + unsigned short usStructSize; + unsigned short usRootStrSize; + unsigned short *pusRootStr; +} TTEMBEDINFO; + LONG WINAPI TTLoadEmbeddedFont(HANDLE*,ULONG,ULONG*,ULONG,ULONG*,READEMBEDPROC, LPVOID,LPWSTR,LPSTR,TTLOADINFO*);
1
0
0
0
Huw Davies : widl: Initialise [out] only conformant arrays.
by Alexandre Julliard
03 Mar '11
03 Mar '11
Module: wine Branch: master Commit: 09dd285d8c6458643a5eb6eb5dfa999368a46c74 URL:
http://source.winehq.org/git/wine.git/?a=commit;h=09dd285d8c6458643a5eb6eb5…
Author: Huw Davies <huw(a)codeweavers.com> Date: Wed Mar 2 11:14:36 2011 +0000 widl: Initialise [out] only conformant arrays. This isn't strictly what midl does, however VB relies on the array in IEnumVARIANT_Next() being zero initialised. Native uses stubless proxies, where the initialisation is performed in NdrStubCall2(). --- tools/widl/typegen.c | 16 ++++++++++++++-- 1 files changed, 14 insertions(+), 2 deletions(-) diff --git a/tools/widl/typegen.c b/tools/widl/typegen.c index 5702cbc..2d2bd75 100644 --- a/tools/widl/typegen.c +++ b/tools/widl/typegen.c @@ -4034,10 +4034,22 @@ void assign_stub_out_args( FILE *file, int indent, const var_t *func, const char if (type_array_has_conformance(var->type)) { unsigned int size; - type_t *type = var->type; + type_t *type; fprintf(file, " = NdrAllocate(&__frame->_StubMsg, "); - for ( ; + for (type = var->type; + is_array(type) && type_array_has_conformance(type); + type = type_array_get_element(type)) + { + write_expr(file, type_array_get_conformance(type), TRUE, + TRUE, NULL, NULL, local_var_prefix); + fprintf(file, " * "); + } + size = type_memsize(type); + fprintf(file, "%u);\n", size); + + print_file(file, indent, "memset(%s%s, 0, ", local_var_prefix, var->name); + for (type = var->type; is_array(type) && type_array_has_conformance(type); type = type_array_get_element(type)) {
1
0
0
0
Peter Urbanec : wintab32: Better handling of XInput initialisation errors.
by Alexandre Julliard
03 Mar '11
03 Mar '11
Module: wine Branch: master Commit: 0ea8bf17fa1df2b18d8d3a9fda56db472da94948 URL:
http://source.winehq.org/git/wine.git/?a=commit;h=0ea8bf17fa1df2b18d8d3a9fd…
Author: Peter Urbanec <winehq.org(a)urbanec.net> Date: Thu Mar 3 19:26:33 2011 +1100 wintab32: Better handling of XInput initialisation errors. --- dlls/winex11.drv/wintab.c | 16 ++++++++++------ dlls/wintab32/context.c | 31 +++++++++++++++++++++++-------- 2 files changed, 33 insertions(+), 14 deletions(-) diff --git a/dlls/winex11.drv/wintab.c b/dlls/winex11.drv/wintab.c index 7d7bfcc..7a9e749 100644 --- a/dlls/winex11.drv/wintab.c +++ b/dlls/winex11.drv/wintab.c @@ -484,7 +484,7 @@ static void disable_system_cursors(void) /*********************************************************************** * X11DRV_LoadTabletInfo (X11DRV.@) */ -void CDECL X11DRV_LoadTabletInfo(HWND hwnddefault) +BOOL CDECL X11DRV_LoadTabletInfo(HWND hwnddefault) { const WCHAR SZ_CONTEXT_NAME[] = {'W','i','n','e',' ','T','a','b','l','e','t',' ','C','o','n','t','e','x','t',0}; const WCHAR SZ_DEVICE_NAME[] = {'W','i','n','e',' ','T','a','b','l','e','t',' ','D','e','v','i','c','e',0}; @@ -507,7 +507,7 @@ void CDECL X11DRV_LoadTabletInfo(HWND hwnddefault) if (!X11DRV_XInput_Init()) { ERR("Unable to initialize the XInput library.\n"); - return; + return FALSE; } hwndTabletDefault = hwnddefault; @@ -555,9 +555,9 @@ void CDECL X11DRV_LoadTabletInfo(HWND hwnddefault) devices = pXListInputDevices(data->display, &num_devices); if (!devices) { - WARN("XInput Extensions reported as not avalable\n"); + WARN("XInput Extensions reported as not available\n"); wine_tsx11_unlock(); - return; + return FALSE; } TRACE("XListInputDevices reports %d devices\n", num_devices); for (loop=0; loop < num_devices; loop++) @@ -778,6 +778,7 @@ void CDECL X11DRV_LoadTabletInfo(HWND hwnddefault) } wine_tsx11_unlock(); + return TRUE; } static int figure_deg(int x, int y) @@ -971,7 +972,7 @@ int CDECL X11DRV_AttachEventQueueToTablet(HWND hOwner) XEventClass event_list[7]; Window win = X11DRV_get_whole_window( hOwner ); - if (!win) return 0; + if (!win || !xinput_handle) return 0; TRACE("Creating context for window %p (%lx) %i cursors\n", hOwner, win, gNumCursors); @@ -1080,6 +1081,8 @@ UINT CDECL X11DRV_WTInfoW(UINT wCategory, UINT nIndex, LPVOID lpOutput) LPWTI_CURSORS_INFO tgtcursor; TRACE("(%u, %u, %p)\n", wCategory, nIndex, lpOutput); + if (!xinput_handle) return 0; + switch(wCategory) { case 0: @@ -1512,8 +1515,9 @@ int CDECL X11DRV_GetCurrentPacket(LPWTPACKET packet) /*********************************************************************** * LoadTabletInfo (X11DRV.@) */ -void CDECL X11DRV_LoadTabletInfo(HWND hwnddefault) +BOOL CDECL X11DRV_LoadTabletInfo(HWND hwnddefault) { + return FALSE; } /*********************************************************************** diff --git a/dlls/wintab32/context.c b/dlls/wintab32/context.c index 30f0021..c8940b3 100644 --- a/dlls/wintab32/context.c +++ b/dlls/wintab32/context.c @@ -42,7 +42,6 @@ WINE_DEFAULT_DEBUG_CHANNEL(wintab32); *
http://www.csl.sony.co.jp/projects/ar/restricted/wintabl.html
*/ -static BOOL gLoaded; static LPOPENCONTEXT gOpenContexts; static HCTX gTopContext = (HCTX)0xc00; @@ -151,12 +150,26 @@ static LPOPENCONTEXT TABLET_FindOpenContext(HCTX hCtx) return NULL; } -static void LoadTablet(void) +static inline BOOL LoadTablet(void) { - TRACE("Initializing the tablet to hwnd %p\n",hwndDefault); - gLoaded= TRUE; - if (pLoadTabletInfo) - pLoadTabletInfo(hwndDefault); + static enum {TI_START = 0, TI_OK, TI_FAIL} loaded = TI_START; + + if (loaded == TI_START) + { + TRACE("Initializing the tablet to hwnd %p\n",hwndDefault); + + if (pLoadTabletInfo && pLoadTabletInfo(hwndDefault)) + { + loaded = TI_OK; + } + else + { + loaded = TI_FAIL; + ERR("LoadTabletInfo(%p) failed\n", hwndDefault); + } + } + + return loaded == TI_OK; } int TABLET_PostTabletMessage(LPOPENCONTEXT newcontext, UINT msg, WPARAM wParam, @@ -366,9 +379,9 @@ static UINT WTInfoT(UINT wCategory, UINT nIndex, LPVOID lpOutput, BOOL bUnicode) { UINT result; + if (!LoadTablet()) return 0; + TRACE("(%d, %d, %p, %d)\n", wCategory, nIndex, lpOutput, bUnicode); - if (gLoaded == FALSE) - LoadTablet(); /* * Handle system extents here, as we can use user32.dll code to set them. @@ -450,6 +463,8 @@ HCTX WINAPI WTOpenW(HWND hWnd, LPLOGCONTEXTW lpLogCtx, BOOL fEnable) { LPOPENCONTEXT newcontext; + if (!LoadTablet()) return 0; + TRACE("hWnd=%p, lpLogCtx=%p, fEnable=%u\n", hWnd, lpLogCtx, fEnable); DUMPCONTEXT(*lpLogCtx);
1
0
0
0
Henri Verbeet : wined3d: Pass gl_info to basetexture_bind().
by Alexandre Julliard
03 Mar '11
03 Mar '11
Module: wine Branch: master Commit: af0a4b6956b0c9cb44a0c00b479c9cb892b64e6d URL:
http://source.winehq.org/git/wine.git/?a=commit;h=af0a4b6956b0c9cb44a0c00b4…
Author: Henri Verbeet <hverbeet(a)codeweavers.com> Date: Thu Mar 3 09:24:11 2011 +0100 wined3d: Pass gl_info to basetexture_bind(). --- dlls/wined3d/basetexture.c | 4 ++-- dlls/wined3d/cubetexture.c | 8 ++++---- dlls/wined3d/state.c | 2 +- dlls/wined3d/surface.c | 3 ++- dlls/wined3d/texture.c | 8 ++++---- dlls/wined3d/volume.c | 2 +- dlls/wined3d/volumetexture.c | 7 ++++--- dlls/wined3d/wined3d_private.h | 6 ++++-- 8 files changed, 22 insertions(+), 18 deletions(-) diff --git a/dlls/wined3d/basetexture.c b/dlls/wined3d/basetexture.c index 534847f..e14185b 100644 --- a/dlls/wined3d/basetexture.c +++ b/dlls/wined3d/basetexture.c @@ -238,9 +238,9 @@ void basetexture_set_dirty(IWineD3DBaseTextureImpl *texture, BOOL dirty) } /* Context activation is done by the caller. */ -HRESULT basetexture_bind(IWineD3DBaseTextureImpl *texture, BOOL srgb, BOOL *set_surface_desc) +HRESULT basetexture_bind(IWineD3DBaseTextureImpl *texture, + const struct wined3d_gl_info *gl_info, BOOL srgb, BOOL *set_surface_desc) { - const struct wined3d_gl_info *gl_info = &texture->resource.device->adapter->gl_info; HRESULT hr = WINED3D_OK; GLenum textureDimensions; BOOL isNewTexture = FALSE; diff --git a/dlls/wined3d/cubetexture.c b/dlls/wined3d/cubetexture.c index 2500650..765c11a 100644 --- a/dlls/wined3d/cubetexture.c +++ b/dlls/wined3d/cubetexture.c @@ -28,18 +28,18 @@ WINE_DEFAULT_DEBUG_CHANNEL(d3d_texture); /* Context activation is done by the caller. */ -static HRESULT cubetexture_bind(IWineD3DBaseTextureImpl *texture, BOOL srgb) +static HRESULT cubetexture_bind(IWineD3DBaseTextureImpl *texture, + const struct wined3d_gl_info *gl_info, BOOL srgb) { BOOL set_gl_texture_desc; HRESULT hr; - TRACE("texture %p, srgb %#x.\n", texture, srgb); + TRACE("texture %p, gl_info %p, srgb %#x.\n", texture, gl_info, srgb); - hr = basetexture_bind(texture, srgb, &set_gl_texture_desc); + hr = basetexture_bind(texture, gl_info, srgb, &set_gl_texture_desc); if (set_gl_texture_desc && SUCCEEDED(hr)) { UINT sub_count = texture->baseTexture.level_count * texture->baseTexture.layer_count; - const struct wined3d_gl_info *gl_info = &texture->resource.device->adapter->gl_info; BOOL srgb_tex = !gl_info->supported[EXT_TEXTURE_SRGB_DECODE] && texture->baseTexture.is_srgb; GLuint name = srgb_tex ? texture->baseTexture.texture_srgb.name : texture->baseTexture.texture_rgb.name; UINT i; diff --git a/dlls/wined3d/state.c b/dlls/wined3d/state.c index 1f9a7fd..daecba2 100644 --- a/dlls/wined3d/state.c +++ b/dlls/wined3d/state.c @@ -3646,7 +3646,7 @@ static void sampler(DWORD state_id, struct wined3d_stateblock *stateblock, struc IWineD3DBaseTextureImpl *texture = state->textures[sampler]; BOOL srgb = state->sampler_states[sampler][WINED3DSAMP_SRGBTEXTURE]; - texture->baseTexture.texture_ops->texture_bind(texture, srgb); + texture->baseTexture.texture_ops->texture_bind(texture, gl_info, srgb); basetexture_apply_state_changes(texture, state->sampler_states[sampler], gl_info); diff --git a/dlls/wined3d/surface.c b/dlls/wined3d/surface.c index 30e1d64..7f0a42c 100644 --- a/dlls/wined3d/surface.c +++ b/dlls/wined3d/surface.c @@ -701,9 +701,10 @@ void surface_bind(IWineD3DSurfaceImpl *surface, BOOL srgb) if (surface->container.type == WINED3D_CONTAINER_TEXTURE) { IWineD3DBaseTextureImpl *texture = surface->container.u.texture; + const struct wined3d_gl_info *gl_info = &texture->resource.device->adapter->gl_info; TRACE("Passing to container (%p).\n", texture); - texture->baseTexture.texture_ops->texture_bind(texture, srgb); + texture->baseTexture.texture_ops->texture_bind(texture, gl_info, srgb); } else { diff --git a/dlls/wined3d/texture.c b/dlls/wined3d/texture.c index 0491a8e..8f98739 100644 --- a/dlls/wined3d/texture.c +++ b/dlls/wined3d/texture.c @@ -28,17 +28,17 @@ WINE_DEFAULT_DEBUG_CHANNEL(d3d_texture); /* Context activation is done by the caller. */ -static HRESULT texture_bind(IWineD3DBaseTextureImpl *texture, BOOL srgb) +static HRESULT texture_bind(IWineD3DBaseTextureImpl *texture, + const struct wined3d_gl_info *gl_info, BOOL srgb) { BOOL set_gl_texture_desc; HRESULT hr; - TRACE("texture %p, srgb %#x.\n", texture, srgb); + TRACE("texture %p, gl_info %p, srgb %#x.\n", texture, gl_info, srgb); - hr = basetexture_bind(texture, srgb, &set_gl_texture_desc); + hr = basetexture_bind(texture, gl_info, srgb, &set_gl_texture_desc); if (set_gl_texture_desc && SUCCEEDED(hr)) { - const struct wined3d_gl_info *gl_info = &texture->resource.device->adapter->gl_info; BOOL srgb_tex = !gl_info->supported[EXT_TEXTURE_SRGB_DECODE] && texture->baseTexture.is_srgb; struct gl_texture *gl_tex; UINT i; diff --git a/dlls/wined3d/volume.c b/dlls/wined3d/volume.c index e877cfb..03bc5e6 100644 --- a/dlls/wined3d/volume.c +++ b/dlls/wined3d/volume.c @@ -60,7 +60,7 @@ static void volume_bind_and_dirtify(struct IWineD3DVolumeImpl *volume) IWineD3DDeviceImpl_MarkStateDirty(volume->resource.device, STATE_SAMPLER(active_sampler)); } - container->baseTexture.texture_ops->texture_bind(container, FALSE); + container->baseTexture.texture_ops->texture_bind(container, gl_info, FALSE); } void volume_add_dirty_box(struct IWineD3DVolumeImpl *volume, const WINED3DBOX *dirty_box) diff --git a/dlls/wined3d/volumetexture.c b/dlls/wined3d/volumetexture.c index 2ac6091..e24ff79 100644 --- a/dlls/wined3d/volumetexture.c +++ b/dlls/wined3d/volumetexture.c @@ -27,13 +27,14 @@ WINE_DEFAULT_DEBUG_CHANNEL(d3d_texture); /* Context activation is done by the caller. */ -static HRESULT volumetexture_bind(IWineD3DBaseTextureImpl *texture, BOOL srgb) +static HRESULT volumetexture_bind(IWineD3DBaseTextureImpl *texture, + const struct wined3d_gl_info *gl_info, BOOL srgb) { BOOL dummy; - TRACE("texture %p, srgb %#x.\n", texture, srgb); + TRACE("texture %p, gl_info %p, srgb %#x.\n", texture, gl_info, srgb); - return basetexture_bind(texture, srgb, &dummy); + return basetexture_bind(texture, gl_info, srgb, &dummy); } /* Do not call while under the GL lock. */ diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h index cb619a5..709ffc5 100644 --- a/dlls/wined3d/wined3d_private.h +++ b/dlls/wined3d/wined3d_private.h @@ -1871,7 +1871,8 @@ struct gl_texture struct wined3d_texture_ops { - HRESULT (*texture_bind)(struct IWineD3DBaseTextureImpl *texture, BOOL srgb); + HRESULT (*texture_bind)(struct IWineD3DBaseTextureImpl *texture, + const struct wined3d_gl_info *gl_info, BOOL srgb); void (*texture_preload)(struct IWineD3DBaseTextureImpl *texture, enum WINED3DSRGB srgb); }; @@ -1919,7 +1920,8 @@ static inline struct gl_texture *basetexture_get_gl_texture(IWineD3DBaseTextureI void basetexture_apply_state_changes(IWineD3DBaseTextureImpl *texture, const DWORD samplerStates[WINED3D_HIGHEST_SAMPLER_STATE + 1], const struct wined3d_gl_info *gl_info) DECLSPEC_HIDDEN; -HRESULT basetexture_bind(IWineD3DBaseTextureImpl *texture, BOOL srgb, BOOL *set_surface_desc) DECLSPEC_HIDDEN; +HRESULT basetexture_bind(IWineD3DBaseTextureImpl *texture, + const struct wined3d_gl_info *gl_info, BOOL srgb, BOOL *set_surface_desc) DECLSPEC_HIDDEN; void basetexture_cleanup(IWineD3DBaseTextureImpl *texture) DECLSPEC_HIDDEN; void basetexture_generate_mipmaps(IWineD3DBaseTextureImpl *texture) DECLSPEC_HIDDEN; WINED3DTEXTUREFILTERTYPE basetexture_get_autogen_filter_type(IWineD3DBaseTextureImpl *texture) DECLSPEC_HIDDEN;
1
0
0
0
Henri Verbeet : wined3d: Use EXT_texture_sRGB_decode to avoid sRGB texture duplication.
by Alexandre Julliard
03 Mar '11
03 Mar '11
Module: wine Branch: master Commit: 75c8e9f7b42173eb3c08e4ae87d485caca431a9b URL:
http://source.winehq.org/git/wine.git/?a=commit;h=75c8e9f7b42173eb3c08e4ae8…
Author: Henri Verbeet <hverbeet(a)codeweavers.com> Date: Thu Mar 3 09:24:10 2011 +0100 wined3d: Use EXT_texture_sRGB_decode to avoid sRGB texture duplication. --- dlls/wined3d/basetexture.c | 18 +++++++++++++++--- dlls/wined3d/context.c | 16 +++++++++------- dlls/wined3d/cubetexture.c | 12 ++++++------ dlls/wined3d/surface.c | 18 ++++++++++++++++++ dlls/wined3d/texture.c | 14 +++++++------- dlls/wined3d/utils.c | 16 +++++++++++----- dlls/wined3d/wined3d_private.h | 13 +++++++++---- 7 files changed, 75 insertions(+), 32 deletions(-) Diff:
http://source.winehq.org/git/wine.git/?a=commitdiff;h=75c8e9f7b42173eb3c08e…
1
0
0
0
Henri Verbeet : wined3d: Add support for EXT_texture_sRGB_decode.
by Alexandre Julliard
03 Mar '11
03 Mar '11
Module: wine Branch: master Commit: a97c1ad15eb6061cb13888afcbe1090bc2a92784 URL:
http://source.winehq.org/git/wine.git/?a=commit;h=a97c1ad15eb6061cb13888afc…
Author: Henri Verbeet <hverbeet(a)codeweavers.com> Date: Thu Mar 3 09:24:09 2011 +0100 wined3d: Add support for EXT_texture_sRGB_decode. --- dlls/wined3d/directx.c | 1 + dlls/wined3d/wined3d_gl.h | 9 +++++++++ 2 files changed, 10 insertions(+), 0 deletions(-) diff --git a/dlls/wined3d/directx.c b/dlls/wined3d/directx.c index 8d77321..c607d99 100644 --- a/dlls/wined3d/directx.c +++ b/dlls/wined3d/directx.c @@ -129,6 +129,7 @@ static const struct { {"GL_EXT_texture_filter_anisotropic", EXT_TEXTURE_FILTER_ANISOTROPIC, 0 }, {"GL_EXT_texture_lod_bias", EXT_TEXTURE_LOD_BIAS, 0 }, {"GL_EXT_texture_sRGB", EXT_TEXTURE_SRGB, 0 }, + {"GL_EXT_texture_sRGB_decode", EXT_TEXTURE_SRGB_DECODE, 0 }, {"GL_EXT_vertex_array_bgra", EXT_VERTEX_ARRAY_BGRA, 0 }, /* NV */ diff --git a/dlls/wined3d/wined3d_gl.h b/dlls/wined3d/wined3d_gl.h index a2e0140..fca79af 100644 --- a/dlls/wined3d/wined3d_gl.h +++ b/dlls/wined3d/wined3d_gl.h @@ -1810,6 +1810,7 @@ typedef enum wined3d_gl_extension EXT_TEXTURE_FILTER_ANISOTROPIC, EXT_TEXTURE_LOD_BIAS, EXT_TEXTURE_SRGB, + EXT_TEXTURE_SRGB_DECODE, EXT_VERTEX_ARRAY_BGRA, /* NVIDIA */ NV_DEPTH_CLAMP, @@ -3412,6 +3413,14 @@ typedef void (WINE_GLAPI *PGLFNGETCOMPRESSEDTEXIMAGEPROC)(GLenum target, GLint l #define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT 0x8c4f #endif +/* GL_EXT_texture_sRGB_decode */ +#ifndef GL_EXT_texture_sRGB_decode +#define GL_EXT_texture_sRGB_decode 1 +#define GL_TEXTURE_SRGB_DECODE_EXT 0x8a48 +#define GL_DECODE_EXT 0x8a49 +#define GL_SKIP_DECODE_EXT 0x8a4a +#endif + /* GL_NV_depth_clamp */ #ifndef GL_NV_depth_clamp #define GL_NV_depth_clamp 1
1
0
0
0
Henri Verbeet : wined3d: Retrieve the GL texture through a function.
by Alexandre Julliard
03 Mar '11
03 Mar '11
Module: wine Branch: master Commit: 09c3537ad06c48791fd4a8cca2fecf1f210272ce URL:
http://source.winehq.org/git/wine.git/?a=commit;h=09c3537ad06c48791fd4a8cca…
Author: Henri Verbeet <hverbeet(a)codeweavers.com> Date: Thu Mar 3 09:24:08 2011 +0100 wined3d: Retrieve the GL texture through a function. --- dlls/wined3d/basetexture.c | 10 ++-------- dlls/wined3d/context.c | 13 +++++-------- dlls/wined3d/cubetexture.c | 9 +++++---- dlls/wined3d/texture.c | 9 +++++---- dlls/wined3d/wined3d_private.h | 5 +++++ 5 files changed, 22 insertions(+), 24 deletions(-) diff --git a/dlls/wined3d/basetexture.c b/dlls/wined3d/basetexture.c index 20685e4..09e9ff3 100644 --- a/dlls/wined3d/basetexture.c +++ b/dlls/wined3d/basetexture.c @@ -248,10 +248,7 @@ HRESULT basetexture_bind(IWineD3DBaseTextureImpl *texture, BOOL srgb, BOOL *set_ TRACE("texture %p, srgb %#x, set_surface_desc %p.\n", texture, srgb, set_surface_desc); texture->baseTexture.is_srgb = srgb; /* SRGB mode cache for PreLoad calls outside drawprim */ - if (srgb) - gl_tex = &texture->baseTexture.texture_srgb; - else - gl_tex = &texture->baseTexture.texture_rgb; + gl_tex = basetexture_get_gl_texture(texture, srgb); textureDimensions = texture->baseTexture.target; @@ -377,10 +374,7 @@ void basetexture_apply_state_changes(IWineD3DBaseTextureImpl *texture, TRACE("texture %p, samplerStates %p\n", texture, samplerStates); - if (texture->baseTexture.is_srgb) - gl_tex = &texture->baseTexture.texture_srgb; - else - gl_tex = &texture->baseTexture.texture_rgb; + gl_tex = basetexture_get_gl_texture(texture, texture->baseTexture.is_srgb); /* This function relies on the correct texture being bound and loaded. */ diff --git a/dlls/wined3d/context.c b/dlls/wined3d/context.c index 9ace3b2..4f3cd67 100644 --- a/dlls/wined3d/context.c +++ b/dlls/wined3d/context.c @@ -117,7 +117,7 @@ static void context_apply_attachment_filter_states(IWineD3DSurfaceImpl *surface, /* Update base texture states array */ if (surface->container.type == WINED3D_CONTAINER_TEXTURE) { - IWineD3DBaseTextureImpl *texture_impl = surface->container.u.texture; + IWineD3DBaseTextureImpl *texture = surface->container.u.texture; IWineD3DDeviceImpl *device = surface->resource.device; BOOL update_minfilter = FALSE; BOOL update_magfilter = FALSE; @@ -126,16 +126,13 @@ static void context_apply_attachment_filter_states(IWineD3DSurfaceImpl *surface, switch (location) { case SFLAG_INTEXTURE: - gl_tex = &texture_impl->baseTexture.texture_rgb; - break; - case SFLAG_INSRGBTEX: - gl_tex = &texture_impl->baseTexture.texture_srgb; + gl_tex = basetexture_get_gl_texture(texture, location == SFLAG_INSRGBTEX); break; default: ERR("Unsupported location %s (%#x).\n", debug_surflocation(location), location); - IWineD3DBaseTexture_Release((IWineD3DBaseTexture *)texture_impl); + IWineD3DBaseTexture_Release((IWineD3DBaseTexture *)texture); return; } @@ -153,10 +150,10 @@ static void context_apply_attachment_filter_states(IWineD3DSurfaceImpl *surface, update_magfilter = TRUE; } - if (texture_impl->baseTexture.bindCount) + if (texture->baseTexture.bindCount) { WARN("Render targets should not be bound to a sampler\n"); - IWineD3DDeviceImpl_MarkStateDirty(device, STATE_SAMPLER(texture_impl->baseTexture.sampler)); + IWineD3DDeviceImpl_MarkStateDirty(device, STATE_SAMPLER(texture->baseTexture.sampler)); } if (update_minfilter || update_magfilter) diff --git a/dlls/wined3d/cubetexture.c b/dlls/wined3d/cubetexture.c index 47dcc2b..0d6d20e 100644 --- a/dlls/wined3d/cubetexture.c +++ b/dlls/wined3d/cubetexture.c @@ -61,8 +61,8 @@ static void cubetexture_preload(IWineD3DBaseTextureImpl *texture, enum WINED3DSR UINT sub_count = texture->baseTexture.level_count * texture->baseTexture.layer_count; IWineD3DDeviceImpl *device = texture->resource.device; struct wined3d_context *context = NULL; + struct gl_texture *gl_tex; BOOL srgb_mode; - BOOL *dirty; UINT i; TRACE("texture %p, srgb %#x.\n", texture, srgb); @@ -85,7 +85,8 @@ static void cubetexture_preload(IWineD3DBaseTextureImpl *texture, enum WINED3DSR srgb_mode = texture->baseTexture.is_srgb; break; } - dirty = srgb_mode ? &texture->baseTexture.texture_srgb.dirty : &texture->baseTexture.texture_rgb.dirty; + + gl_tex = basetexture_get_gl_texture(texture, srgb_mode); /* We only have to activate a context for gl when we're not drawing. * In most cases PreLoad will be called during draw and a context was @@ -118,7 +119,7 @@ static void cubetexture_preload(IWineD3DBaseTextureImpl *texture, enum WINED3DSR /* If the texture is marked dirty or the srgb sampler setting has changed * since the last load then reload the surfaces. */ - if (*dirty) + if (gl_tex->dirty) { for (i = 0; i < sub_count; ++i) { @@ -131,7 +132,7 @@ static void cubetexture_preload(IWineD3DBaseTextureImpl *texture, enum WINED3DSR } /* No longer dirty. */ - *dirty = FALSE; + gl_tex->dirty = FALSE; if (context) context_release(context); } diff --git a/dlls/wined3d/texture.c b/dlls/wined3d/texture.c index 32ff66b..c575e2b 100644 --- a/dlls/wined3d/texture.c +++ b/dlls/wined3d/texture.c @@ -90,9 +90,9 @@ static void texture_preload(IWineD3DBaseTextureImpl *texture, enum WINED3DSRGB s { IWineD3DDeviceImpl *device = texture->resource.device; struct wined3d_context *context = NULL; + struct gl_texture *gl_tex; unsigned int i; BOOL srgb_mode; - BOOL *dirty; TRACE("texture %p, srgb %#x.\n", texture, srgb); @@ -114,7 +114,8 @@ static void texture_preload(IWineD3DBaseTextureImpl *texture, enum WINED3DSRGB s srgb_mode = texture->baseTexture.is_srgb; break; } - dirty = srgb_mode ? &texture->baseTexture.texture_srgb.dirty : &texture->baseTexture.texture_rgb.dirty; + + gl_tex = basetexture_get_gl_texture(texture, srgb_mode); if (!device->isInDraw) { @@ -142,7 +143,7 @@ static void texture_preload(IWineD3DBaseTextureImpl *texture, enum WINED3DSRGB s /* If the texture is marked dirty or the srgb sampler setting has changed * since the last load then reload the surfaces. */ - if (*dirty) + if (gl_tex->dirty) { for (i = 0; i < texture->baseTexture.level_count; ++i) { @@ -157,7 +158,7 @@ static void texture_preload(IWineD3DBaseTextureImpl *texture, enum WINED3DSRGB s if (context) context_release(context); /* No longer dirty. */ - *dirty = FALSE; + gl_tex->dirty = FALSE; } /* Do not call while under the GL lock. */ diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h index 32a2189..87d5c48 100644 --- a/dlls/wined3d/wined3d_private.h +++ b/dlls/wined3d/wined3d_private.h @@ -1908,6 +1908,11 @@ static inline IWineD3DBaseTextureImpl *basetexture_from_resource(struct wined3d_ return CONTAINING_RECORD(resource, IWineD3DBaseTextureImpl, resource); } +static inline struct gl_texture *basetexture_get_gl_texture(IWineD3DBaseTextureImpl *texture, BOOL srgb) +{ + return srgb ? &texture->baseTexture.texture_srgb : &texture->baseTexture.texture_rgb; +} + void basetexture_apply_state_changes(IWineD3DBaseTextureImpl *texture, const DWORD samplerStates[WINED3D_HIGHEST_SAMPLER_STATE + 1], const struct wined3d_gl_info *gl_info) DECLSPEC_HIDDEN;
1
0
0
0
Nikolay Sivov : msxml3: Link dom attribute with parent interface pointer.
by Alexandre Julliard
03 Mar '11
03 Mar '11
Module: wine Branch: master Commit: 59f7b8899bf355dfc18164b1bdc40414a8e56eb7 URL:
http://source.winehq.org/git/wine.git/?a=commit;h=59f7b8899bf355dfc18164b1b…
Author: Nikolay Sivov <nsivov(a)codeweavers.com> Date: Thu Mar 3 03:57:01 2011 +0300 msxml3: Link dom attribute with parent interface pointer. --- dlls/msxml3/element.c | 16 ++++++++++++++++ dlls/msxml3/msxml_private.h | 5 +++-- dlls/msxml3/node.c | 1 + dlls/msxml3/tests/domdoc.c | 23 +++++++++++++++++------ 4 files changed, 37 insertions(+), 8 deletions(-) diff --git a/dlls/msxml3/element.c b/dlls/msxml3/element.c index b1de8df..f2c5bbb 100644 --- a/dlls/msxml3/element.c +++ b/dlls/msxml3/element.c @@ -1182,6 +1182,7 @@ static HRESULT WINAPI domelem_setAttributeNode( static const WCHAR xmlnsW[] = {'x','m','l','n','s',0}; xmlChar *name, *value; BSTR nameW, prefix; + xmlnode *attr_node; xmlAttrPtr attr; VARIANT valueW; HRESULT hr; @@ -1190,6 +1191,19 @@ static HRESULT WINAPI domelem_setAttributeNode( if (!attribute) return E_INVALIDARG; + attr_node = get_node_obj((IXMLDOMNode*)attribute); + if (!attr_node) + { + FIXME("att_node is not our node implementation\n"); + return E_FAIL; + } + + if (attr_node->parent) + { + WARN("attempt to add already used attribute\n"); + return E_FAIL; + } + hr = IXMLDOMAttribute_get_nodeName(attribute, &nameW); if (hr != S_OK) return hr; @@ -1231,6 +1245,8 @@ static HRESULT WINAPI domelem_setAttributeNode( } attr = xmlSetNsProp(get_element(This), NULL, name, value); + if (attr) + attr_node->parent = (IXMLDOMNode*)iface; SysFreeString(nameW); VariantClear(&valueW); diff --git a/dlls/msxml3/msxml_private.h b/dlls/msxml3/msxml_private.h index ab7820f..72de7ba 100644 --- a/dlls/msxml3/msxml_private.h +++ b/dlls/msxml3/msxml_private.h @@ -233,9 +233,10 @@ extern void set_xpathmode(xmlDocPtr doc, BOOL xpath); /* IXMLDOMNode Internal Structure */ typedef struct _xmlnode { - DispatchEx dispex; + DispatchEx dispex; IXMLDOMNode *iface; - xmlNodePtr node; + IXMLDOMNode *parent; + xmlNodePtr node; } xmlnode; extern void init_xmlnode(xmlnode*,xmlNodePtr,IXMLDOMNode*,dispex_static_data_t*); diff --git a/dlls/msxml3/node.c b/dlls/msxml3/node.c index a952ac0..71b95a8 100644 --- a/dlls/msxml3/node.c +++ b/dlls/msxml3/node.c @@ -1106,6 +1106,7 @@ void init_xmlnode(xmlnode *This, xmlNodePtr node, IXMLDOMNode *node_iface, dispe This->node = node; This->iface = node_iface; + This->parent = NULL; if(dispex_data) init_dispex(&This->dispex, (IUnknown*)This->iface, dispex_data); diff --git a/dlls/msxml3/tests/domdoc.c b/dlls/msxml3/tests/domdoc.c index c154860..82961f0 100644 --- a/dlls/msxml3/tests/domdoc.c +++ b/dlls/msxml3/tests/domdoc.c @@ -7213,7 +7213,7 @@ static void test_get_ownerDocument(void) static void test_setAttributeNode(void) { IXMLDOMDocument *doc, *doc2; - IXMLDOMElement *elem; + IXMLDOMElement *elem, *elem2; IXMLDOMAttribute *attr, *attr2, *ret_attr; VARIANT_BOOL b; HRESULT hr; @@ -7233,6 +7233,10 @@ static void test_setAttributeNode(void) hr = IXMLDOMDocument_get_documentElement(doc, &elem); ok( hr == S_OK, "got 0x%08x\n", hr); + hr = IXMLDOMDocument_get_documentElement(doc, &elem2); + ok( hr == S_OK, "got 0x%08x\n", hr); + ok( elem2 != elem, "got same instance\n"); + ret_attr = (void*)0xdeadbeef; hr = IXMLDOMElement_setAttributeNode(elem, NULL, &ret_attr); ok( hr == E_INVALIDARG, "got 0x%08x\n", hr); @@ -7259,16 +7263,23 @@ static void test_setAttributeNode(void) ok( hr == S_OK, "got 0x%08x\n", hr); ok(b == VARIANT_TRUE, "got %d\n", b); + b = VARIANT_FALSE; + hr = IXMLDOMElement_hasChildNodes(elem2, &b); + ok( hr == S_OK, "got 0x%08x\n", hr); + ok(b == VARIANT_TRUE, "got %d\n", b); + IXMLDOMElement_Release(elem2); + attr2 = NULL; hr = IXMLDOMElement_getAttributeNode(elem, _bstr_("attr"), &attr2); ok( hr == S_OK, "got 0x%08x\n", hr); + ok( attr2 != attr, "got same instance %p\n", attr2); IXMLDOMAttribute_Release(attr2); /* try to add it another time */ ret_attr = (void*)0xdeadbeef; hr = IXMLDOMElement_setAttributeNode(elem, attr, &ret_attr); - todo_wine ok( hr == E_FAIL, "got 0x%08x\n", hr); - todo_wine ok( ret_attr == (void*)0xdeadbeef, "got %p\n", ret_attr); + ok( hr == E_FAIL, "got 0x%08x\n", hr); + ok( ret_attr == (void*)0xdeadbeef, "got %p\n", ret_attr); IXMLDOMElement_Release(elem); @@ -7277,8 +7288,8 @@ static void test_setAttributeNode(void) ok( hr == S_OK, "got 0x%08x\n", hr); ret_attr = (void*)0xdeadbeef; hr = IXMLDOMElement_setAttributeNode(elem, attr, &ret_attr); - todo_wine ok( hr == E_FAIL, "got 0x%08x\n", hr); - todo_wine ok( ret_attr == (void*)0xdeadbeef, "got %p\n", ret_attr); + ok( hr == E_FAIL, "got 0x%08x\n", hr); + ok( ret_attr == (void*)0xdeadbeef, "got %p\n", ret_attr); IXMLDOMElement_Release(elem); /* add attribute already attached to another document */ @@ -7293,7 +7304,7 @@ static void test_setAttributeNode(void) hr = IXMLDOMDocument_get_documentElement(doc2, &elem); ok( hr == S_OK, "got 0x%08x\n", hr); hr = IXMLDOMElement_setAttributeNode(elem, attr, NULL); - todo_wine ok( hr == E_FAIL, "got 0x%08x\n", hr); + ok( hr == E_FAIL, "got 0x%08x\n", hr); IXMLDOMElement_Release(elem); IXMLDOMAttribute_Release(attr);
1
0
0
0
Nikolay Sivov : msxml3: Fail on certain node types in insertBefore() for attributes, remove broken tests.
by Alexandre Julliard
03 Mar '11
03 Mar '11
Module: wine Branch: master Commit: d04fd1d067c375f8536576531690f3309f836d08 URL:
http://source.winehq.org/git/wine.git/?a=commit;h=d04fd1d067c375f8536576531…
Author: Nikolay Sivov <nsivov(a)codeweavers.com> Date: Thu Mar 3 03:50:04 2011 +0300 msxml3: Fail on certain node types in insertBefore() for attributes, remove broken tests. --- dlls/msxml3/attribute.c | 25 ++++- dlls/msxml3/tests/domdoc.c | 245 ++++++++++++++++++++++++++------------------ 2 files changed, 167 insertions(+), 103 deletions(-) Diff:
http://source.winehq.org/git/wine.git/?a=commitdiff;h=d04fd1d067c375f853657…
1
0
0
0
Jacek Caban : mshtml: Fixed use after free in HTMLElement_destructor.
by Alexandre Julliard
03 Mar '11
03 Mar '11
Module: wine Branch: master Commit: 873619e9bd402e1b77dba81e434abbb08e6bad7d URL:
http://source.winehq.org/git/wine.git/?a=commit;h=873619e9bd402e1b77dba81e4…
Author: Jacek Caban <jacek(a)codeweavers.com> Date: Wed Mar 2 23:10:22 2011 +0100 mshtml: Fixed use after free in HTMLElement_destructor. --- dlls/mshtml/htmlelem.c | 5 ++++- 1 files changed, 4 insertions(+), 1 deletions(-) diff --git a/dlls/mshtml/htmlelem.c b/dlls/mshtml/htmlelem.c index c4d5607..bf54739 100644 --- a/dlls/mshtml/htmlelem.c +++ b/dlls/mshtml/htmlelem.c @@ -1649,7 +1649,10 @@ void HTMLElement_destructor(HTMLDOMNode *iface) HTMLElement *This = impl_from_HTMLDOMNode(iface); HTMLDOMAttribute *attr; - LIST_FOR_EACH_ENTRY(attr, &This->attrs, HTMLDOMAttribute, entry) { + while(!list_empty(&This->attrs)) { + attr = LIST_ENTRY(list_head(&This->attrs), HTMLDOMAttribute, entry); + + list_remove(&attr->entry); attr->elem = NULL; IHTMLDOMAttribute_Release(&attr->IHTMLDOMAttribute_iface); }
1
0
0
0
Jacek Caban : mshtml: Added more attribute object tests.
by Alexandre Julliard
03 Mar '11
03 Mar '11
Module: wine Branch: master Commit: eaa6a9fdcf54b0d2c3e75f86cbc7b9c0c2b3aef6 URL:
http://source.winehq.org/git/wine.git/?a=commit;h=eaa6a9fdcf54b0d2c3e75f86c…
Author: Jacek Caban <jacek(a)codeweavers.com> Date: Wed Mar 2 23:10:11 2011 +0100 mshtml: Added more attribute object tests. --- dlls/mshtml/tests/dom.c | 82 +++++++++++++++++++++++++++++++--------------- 1 files changed, 55 insertions(+), 27 deletions(-) diff --git a/dlls/mshtml/tests/dom.c b/dlls/mshtml/tests/dom.c index 88d8790..ec6c7e8 100644 --- a/dlls/mshtml/tests/dom.c +++ b/dlls/mshtml/tests/dom.c @@ -56,7 +56,7 @@ static const char elem_test_str[] = "</body></html>"; static const char elem_test2_str[] = "<html><head><title>test</title><style>.body { margin-right: 0px; }</style>" - "<body><div id=\"divid\" emptyattr=""></div></body>" + "<body><div id=\"divid\" emptyattr=\"\" onclick=\"parseInt();\"></div></body>" "</html>"; static const char indent_test_str[] = @@ -462,6 +462,17 @@ static IHTMLDocument2 *create_document(void) return doc; } +#define get_dispex_iface(u) _get_dispex_iface(__LINE__,u) +static IDispatchEx *_get_dispex_iface(unsigned line, IUnknown *unk) +{ + IDispatchEx *dispex; + HRESULT hres; + + hres = IUnknown_QueryInterface(unk, &IID_IDispatchEx, (void**)&dispex); + ok_(__FILE__,line) (hres == S_OK, "Could not get IDispatchEx: %08x\n", hres); + return dispex; +} + #define test_ifaces(i,ids) _test_ifaces(__LINE__,i,ids) static void _test_ifaces(unsigned line, IUnknown *iface, REFIID *iids) { @@ -492,17 +503,12 @@ static void _test_no_iface(unsigned line, IUnknown *iface, REFIID iid) #define test_get_dispid(u,id) _test_get_dispid(__LINE__,u,id) static BOOL _test_get_dispid(unsigned line, IUnknown *unk, IID *iid) { - IDispatchEx *dispex; + IDispatchEx *dispex = _get_dispex_iface(line, unk); ITypeInfo *typeinfo; BOOL ret = FALSE; UINT ticnt; HRESULT hres; - hres = IUnknown_QueryInterface(unk, &IID_IDispatchEx, (void**)&dispex); - ok_(__FILE__,line) (hres == S_OK, "Could not get IDispatchEx: %08x\n", hres); - if(FAILED(hres)) - return FALSE; - ticnt = 0xdeadbeef; hres = IDispatchEx_GetTypeInfoCount(dispex, &ticnt); ok_(__FILE__,line) (hres == S_OK, "GetTypeInfoCount failed: %08x\n", hres); @@ -532,17 +538,12 @@ static BOOL _test_get_dispid(unsigned line, IUnknown *unk, IID *iid) #define test_disp_value(u) _test_disp_value(__LINE__,u,v) static void _test_disp_value(unsigned line, IUnknown *unk, const char *val) { + IDispatchEx *dispex = _get_dispex_iface(line, unk); DISPPARAMS dp = {NULL,NULL,0,0}; - IDispatchEx *dispex; EXCEPINFO ei; VARIANT var; HRESULT hres; - hres = IUnknown_QueryInterface(unk, &IID_IDispatchEx, (void**)&dispex); - ok_(__FILE__,line)(hres == S_OK, "Could not get IDispatchEx interface: %08x\n", hres); - if(FAILED(hres)) - return; - hres = IDispatchEx_InvokeEx(dispex, DISPID_VALUE, 0, DISPATCH_PROPERTYGET, &dp, &var, &ei, NULL); IDispatchEx_Release(dispex); ok_(__FILE__,line)(hres == S_OK, "InvokeEx(DISPID_VALUE) returned: %08x\n", hres); @@ -577,6 +578,27 @@ static void _test_disp2(unsigned line, IUnknown *unk, const IID *diid, const IID _test_disp_value(line, unk, val); } +#define set_dispex_value(a,b,c) _set_dispex_value(__LINE__,a,b,c) +static void _set_dispex_value(unsigned line, IUnknown *unk, const char *name, VARIANT *val) +{ + IDispatchEx *dispex = _get_dispex_iface(line, unk); + DISPPARAMS dp = {val, NULL, 1, 0}; + EXCEPINFO ei; + DISPID id; + BSTR str; + HRESULT hres; + + str = a2bstr(name); + hres = IDispatchEx_GetDispID(dispex, str, fdexNameEnsure|fdexNameCaseInsensitive, &id); + SysFreeString(str); + ok_(__FILE__,line)(hres == S_OK, "GetDispID failed: %08x\n", hres); + + memset(&ei, 0, sizeof(ei)); + hres = IDispatchEx_InvokeEx(dispex, id, LOCALE_NEUTRAL, INVOKE_PROPERTYPUT, &dp, NULL, &ei, NULL); + ok_(__FILE__,line)(hres == S_OK, "InvokeEx failed: %08x\n", hres); + +} + #define get_elem_iface(u) _get_elem_iface(__LINE__,u) static IHTMLElement *_get_elem_iface(unsigned line, IUnknown *unk) { @@ -2897,21 +2919,14 @@ static IHTMLDOMAttribute *_get_elem_attr_node(unsigned line, IUnknown *unk, cons return attr; } -#define test_attr_node_value(a,b) _test_attr_node_value(__LINE__,a,b) -static void _test_attr_node_value(unsigned line, IHTMLDOMAttribute *attr, const char *exval) +#define get_attr_node_value(a,b,c) _get_attr_node_value(__LINE__,a,b,c) +static void _get_attr_node_value(unsigned line, IHTMLDOMAttribute *attr, VARIANT *v, VARTYPE vt) { - VARIANT var; HRESULT hres; - hres = IHTMLDOMAttribute_get_nodeValue(attr, &var); + hres = IHTMLDOMAttribute_get_nodeValue(attr, v); ok_(__FILE__,line) (hres == S_OK, "get_nodeValue failed: %08x, expected VT_BSTR\n", hres); - ok_(__FILE__,line) (V_VT(&var) == VT_BSTR, "vt=%d\n", V_VT(&var)); - if(exval) - ok_(__FILE__,line) (!strcmp_wa(V_BSTR(&var), exval), "unexpected value %s\n", wine_dbgstr_w(V_BSTR(&var))); - else - ok_(__FILE__,line) (!V_BSTR(&var), "nodeValue = %s, expected NULL\n", wine_dbgstr_w(V_BSTR(&var))); - - VariantClear(&var); + ok_(__FILE__,line) (V_VT(v) == vt, "vt=%d, expected %d\n", V_VT(v), vt); } #define get_window_doc(e) _get_window_doc(__LINE__,e) @@ -6802,6 +6817,7 @@ static void test_elems(IHTMLDocument2 *doc) static void test_attr(IHTMLElement *elem) { IHTMLDOMAttribute *attr, *attr2; + VARIANT v; get_elem_attr_node((IUnknown*)elem, "noattr", FALSE); @@ -6815,12 +6831,24 @@ static void test_attr(IHTMLElement *elem) ok(iface_cmp((IUnknown*)attr, (IUnknown*)attr2), "attr != attr2\n"); IHTMLDOMAttribute_Release(attr2); - test_attr_node_value(attr, "divid"); + get_attr_node_value(attr, &v, VT_BSTR); + ok(!strcmp_wa(V_BSTR(&v), "divid"), "V_BSTR(v) = %s\n", wine_dbgstr_w(V_BSTR(&v))); + VariantClear(&v); IHTMLDOMAttribute_Release(attr); attr = get_elem_attr_node((IUnknown*)elem, "emptyattr", TRUE); - test_attr_node_value(attr, NULL); + get_attr_node_value(attr, &v, VT_BSTR); + ok(!V_BSTR(&v), "V_BSTR(v) = %s\n", wine_dbgstr_w(V_BSTR(&v))); + VariantClear(&v); + IHTMLDOMAttribute_Release(attr); + + V_VT(&v) = VT_I4; + V_I4(&v) = 100; + set_dispex_value((IUnknown*)elem, "dispprop", &v); + attr = get_elem_attr_node((IUnknown*)elem, "dispprop", TRUE); + get_attr_node_value(attr, &v, VT_I4); + ok(V_I4(&v) == 100, "V_I4(v) = %d\n", V_I4(&v)); IHTMLDOMAttribute_Release(attr); } @@ -7529,10 +7557,10 @@ START_TEST(dom) run_domtest(range_test2_str, test_txtrange2); if (winetest_interactive || ! is_ie_hardened()) { run_domtest(elem_test_str, test_elems); + run_domtest(elem_test2_str, test_elems2); }else { skip("IE running in Enhanced Security Configuration\n"); } - run_domtest(elem_test2_str, test_elems2); run_domtest(doc_blank, test_create_elems); run_domtest(doc_blank, test_defaults); run_domtest(doc_blank, test_null_write);
1
0
0
0
Alexandre Julliard : winex11: Merge updating the mouse state and sending the input into a single helper function .
by Alexandre Julliard
03 Mar '11
03 Mar '11
Module: wine Branch: master Commit: e047a20627ebbb70fb97c31b2969c9556c0234a0 URL:
http://source.winehq.org/git/wine.git/?a=commit;h=e047a20627ebbb70fb97c31b2…
Author: Alexandre Julliard <julliard(a)winehq.org> Date: Thu Mar 3 17:47:08 2011 +0100 winex11: Merge updating the mouse state and sending the input into a single helper function. --- dlls/winex11.drv/mouse.c | 73 ++++++++++++++++------------------------------ 1 files changed, 25 insertions(+), 48 deletions(-) diff --git a/dlls/winex11.drv/mouse.c b/dlls/winex11.drv/mouse.c index d7fa124..7778203 100644 --- a/dlls/winex11.drv/mouse.c +++ b/dlls/winex11.drv/mouse.c @@ -211,15 +211,18 @@ void sync_window_cursor( struct x11drv_win_data *data ) } /*********************************************************************** - * update_mouse_state + * send_mouse_input * * Update the various window states on a mouse event. */ -static HWND update_mouse_state( HWND hwnd, Window window, int x, int y, unsigned int state, POINT *pt ) +static void send_mouse_input( HWND hwnd, UINT flags, Window window, int x, int y, + unsigned int state, DWORD mouse_data, Time time ) { struct x11drv_win_data *data = X11DRV_get_win_data( hwnd ); + POINT pt; + INPUT input; - if (!data) return 0; + if (!data) return; if (window == data->whole_window) { @@ -231,11 +234,11 @@ static HWND update_mouse_state( HWND hwnd, Window window, int x, int y, unsigned x += virtual_screen_rect.left; y += virtual_screen_rect.top; } - pt->x = x; - pt->y = y; + pt.x = x; + pt.y = y; if (GetWindowLongW( data->hwnd, GWL_EXSTYLE ) & WS_EX_LAYOUTRTL) - pt->x = data->client_rect.right - data->client_rect.left - 1 - pt->x; - MapWindowPoints( hwnd, 0, pt, 1 ); + pt.x = data->client_rect.right - data->client_rect.left - 1 - pt.x; + MapWindowPoints( hwnd, 0, &pt, 1 ); if (InterlockedExchangePointer( (void **)&cursor_window, hwnd ) != hwnd || GetTickCount() - last_time_modified > 100) @@ -243,6 +246,8 @@ static HWND update_mouse_state( HWND hwnd, Window window, int x, int y, unsigned cursor_window = hwnd; sync_window_cursor( data ); } + last_time_modified = GetTickCount(); + if (hwnd != GetDesktopWindow()) hwnd = GetAncestor( hwnd, GA_ROOT ); /* update the wine server Z-order */ @@ -252,7 +257,7 @@ static HWND update_mouse_state( HWND hwnd, Window window, int x, int y, unsigned !(state & (Button1Mask|Button2Mask|Button3Mask|Button4Mask|Button5Mask|Button6Mask|Button7Mask))) { RECT rect; - SetRect( &rect, pt->x, pt->y, pt->x + 1, pt->y + 1 ); + SetRect( &rect, pt.x, pt.y, pt.x + 1, pt.y + 1 ); MapWindowPoints( 0, hwnd, (POINT *)&rect, 2 ); SERVER_START_REQ( update_window_zorder ) @@ -266,25 +271,13 @@ static HWND update_mouse_state( HWND hwnd, Window window, int x, int y, unsigned } SERVER_END_REQ; } - return hwnd; -} - - -/*********************************************************************** - * X11DRV_send_mouse_input - */ -static void X11DRV_send_mouse_input( HWND hwnd, DWORD flags, int x, int y, DWORD data, DWORD time ) -{ - INPUT input; - - last_time_modified = GetTickCount(); input.type = INPUT_MOUSE; - input.u.mi.dx = x; - input.u.mi.dy = y; - input.u.mi.mouseData = data; + input.u.mi.dx = pt.x; + input.u.mi.dy = pt.y; + input.u.mi.mouseData = mouse_data; input.u.mi.dwFlags = flags; - input.u.mi.time = time; + input.u.mi.time = EVENT_x11_time_to_win32_time( time ); input.u.mi.dwExtraInfo = 0; __wine_send_input( hwnd, &input ); @@ -927,7 +920,6 @@ void X11DRV_ButtonPress( HWND hwnd, XEvent *xev ) XButtonEvent *event = &xev->xbutton; int buttonNum = event->button - 1; WORD wData = 0; - POINT pt; if (buttonNum >= NB_BUTTONS) return; @@ -954,11 +946,8 @@ void X11DRV_ButtonPress( HWND hwnd, XEvent *xev ) } update_user_time( event->time ); - hwnd = update_mouse_state( hwnd, event->window, event->x, event->y, event->state, &pt ); - if (!hwnd) return; - - X11DRV_send_mouse_input( hwnd, button_down_flags[buttonNum] | MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_MOVE, - pt.x, pt.y, wData, EVENT_x11_time_to_win32_time(event->time) ); + send_mouse_input( hwnd, button_down_flags[buttonNum] | MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_MOVE, + event->window, event->x, event->y, event->state, wData, event->time ); } @@ -970,7 +959,6 @@ void X11DRV_ButtonRelease( HWND hwnd, XEvent *xev ) XButtonEvent *event = &xev->xbutton; int buttonNum = event->button - 1; WORD wData = 0; - POINT pt; if (buttonNum >= NB_BUTTONS || !button_up_flags[buttonNum]) return; @@ -990,11 +978,8 @@ void X11DRV_ButtonRelease( HWND hwnd, XEvent *xev ) break; } - hwnd = update_mouse_state( hwnd, event->window, event->x, event->y, event->state, &pt ); - if (!hwnd) return; - - X11DRV_send_mouse_input( hwnd, button_up_flags[buttonNum] | MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_MOVE, - pt.x, pt.y, wData, EVENT_x11_time_to_win32_time(event->time) ); + send_mouse_input( hwnd, button_up_flags[buttonNum] | MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_MOVE, + event->window, event->x, event->y, event->state, wData, event->time ); } @@ -1004,15 +989,11 @@ void X11DRV_ButtonRelease( HWND hwnd, XEvent *xev ) void X11DRV_MotionNotify( HWND hwnd, XEvent *xev ) { XMotionEvent *event = &xev->xmotion; - POINT pt; TRACE("hwnd %p, event->is_hint %d\n", hwnd, event->is_hint); - hwnd = update_mouse_state( hwnd, event->window, event->x, event->y, event->state, &pt ); - if (!hwnd) return; - - X11DRV_send_mouse_input( hwnd, MOUSEEVENTF_MOVE | MOUSEEVENTF_ABSOLUTE, - pt.x, pt.y, 0, EVENT_x11_time_to_win32_time(event->time) ); + send_mouse_input( hwnd, MOUSEEVENTF_MOVE | MOUSEEVENTF_ABSOLUTE, + event->window, event->x, event->y, event->state, 0, event->time ); } @@ -1022,7 +1003,6 @@ void X11DRV_MotionNotify( HWND hwnd, XEvent *xev ) void X11DRV_EnterNotify( HWND hwnd, XEvent *xev ) { XCrossingEvent *event = &xev->xcrossing; - POINT pt; TRACE("hwnd %p, event->detail %d\n", hwnd, event->detail); @@ -1030,9 +1010,6 @@ void X11DRV_EnterNotify( HWND hwnd, XEvent *xev ) if (event->window == x11drv_thread_data()->grab_window) return; /* simulate a mouse motion event */ - hwnd = update_mouse_state( hwnd, event->window, event->x, event->y, event->state, &pt ); - if (!hwnd) return; - - X11DRV_send_mouse_input( hwnd, MOUSEEVENTF_MOVE | MOUSEEVENTF_ABSOLUTE, - pt.x, pt.y, 0, EVENT_x11_time_to_win32_time(event->time) ); + send_mouse_input( hwnd, MOUSEEVENTF_MOVE | MOUSEEVENTF_ABSOLUTE, + event->window, event->x, event->y, event->state, 0, event->time ); }
1
0
0
0
Alexandre Julliard : winex11: Get rid of the ClipCursor and SendInput entry points.
by Alexandre Julliard
03 Mar '11
03 Mar '11
Module: wine Branch: master Commit: f46bd50a806e3d3707bab3ed3649e107adca3630 URL:
http://source.winehq.org/git/wine.git/?a=commit;h=f46bd50a806e3d3707bab3ed3…
Author: Alexandre Julliard <julliard(a)winehq.org> Date: Wed Mar 2 16:28:23 2011 +0100 winex11: Get rid of the ClipCursor and SendInput entry points. --- dlls/winex11.drv/event.c | 29 --------- dlls/winex11.drv/keyboard.c | 126 ++++-------------------------------- dlls/winex11.drv/mouse.c | 116 ++++------------------------------ dlls/winex11.drv/winex11.drv.spec | 2 - dlls/winex11.drv/x11drv.h | 4 - 5 files changed, 26 insertions(+), 251 deletions(-) Diff:
http://source.winehq.org/git/wine.git/?a=commitdiff;h=f46bd50a806e3d3707bab…
1
0
0
0
Alexandre Julliard : user32: Handle input injected through SendInput entirely in user32.
by Alexandre Julliard
03 Mar '11
03 Mar '11
Module: wine Branch: master Commit: f1a348006872825b1fe4bb583f9019f2c0880672 URL:
http://source.winehq.org/git/wine.git/?a=commit;h=f1a348006872825b1fe4bb583…
Author: Alexandre Julliard <julliard(a)winehq.org> Date: Wed Mar 2 21:29:17 2011 +0100 user32: Handle input injected through SendInput entirely in user32. --- dlls/user32/driver.c | 13 ----- dlls/user32/input.c | 105 ++++++++++++++++++++++++++++++------------- dlls/user32/user32.spec | 2 +- dlls/user32/user_private.h | 1 - dlls/winex11.drv/keyboard.c | 2 +- dlls/winex11.drv/mouse.c | 2 +- include/winuser.h | 2 +- 7 files changed, 78 insertions(+), 49 deletions(-) Diff:
http://source.winehq.org/git/wine.git/?a=commitdiff;h=f1a348006872825b1fe4b…
1
0
0
0
Alexandre Julliard : server: Invoke low-level hardware hooks directly from the server side.
by Alexandre Julliard
03 Mar '11
03 Mar '11
Module: wine Branch: master Commit: c7efa293f0b35bdb86f2b472f5b7cef2a6ebcea9 URL:
http://source.winehq.org/git/wine.git/?a=commit;h=c7efa293f0b35bdb86f2b472f…
Author: Alexandre Julliard <julliard(a)winehq.org> Date: Wed Mar 2 19:53:03 2011 +0100 server: Invoke low-level hardware hooks directly from the server side. --- dlls/user32/message.c | 48 +++++++++++++ dlls/winex11.drv/keyboard.c | 9 --- dlls/winex11.drv/mouse.c | 105 ++++++---------------------- include/wine/server_protocol.h | 11 ++- server/hook.c | 11 +++ server/protocol.def | 8 ++- server/queue.c | 150 +++++++++++++++++++++++++++++----------- server/request.h | 3 +- server/trace.c | 8 ++- server/user.h | 1 + 10 files changed, 211 insertions(+), 143 deletions(-) Diff:
http://source.winehq.org/git/wine.git/?a=commitdiff;h=c7efa293f0b35bdb86f2b…
1
0
0
0
Alexandre Julliard : user32: Export a Wine-specific function to send hardware input from the graphics driver .
by Alexandre Julliard
03 Mar '11
03 Mar '11
Module: wine Branch: master Commit: ae895a1f100682fdee679bad1b5cadda8e00ddef URL:
http://source.winehq.org/git/wine.git/?a=commit;h=ae895a1f100682fdee679bad1…
Author: Alexandre Julliard <julliard(a)winehq.org> Date: Wed Mar 2 19:43:53 2011 +0100 user32: Export a Wine-specific function to send hardware input from the graphics driver. --- dlls/user32/input.c | 13 +++++++++++++ dlls/user32/message.c | 43 +++++++++++++++++++++++++++++++++++++++++++ dlls/user32/user32.spec | 8 ++++++++ dlls/user32/user_private.h | 1 + dlls/winex11.drv/keyboard.c | 23 +++++++++-------------- dlls/winex11.drv/mouse.c | 24 ++++++++++-------------- include/winuser.h | 4 ++++ 7 files changed, 88 insertions(+), 28 deletions(-) diff --git a/dlls/user32/input.c b/dlls/user32/input.c index 455e55a..c30a195 100644 --- a/dlls/user32/input.c +++ b/dlls/user32/input.c @@ -115,6 +115,19 @@ BOOL set_capture_window( HWND hwnd, UINT gui_flags, HWND *prev_ret ) /*********************************************************************** + * __wine_send_input (USER32.@) + * + * Internal SendInput function to allow the graphics driver to inject real events. + */ +BOOL CDECL __wine_send_input( HWND hwnd, const INPUT *input, BOOL injected ) +{ + NTSTATUS status = send_hardware_message( hwnd, input, injected ? SEND_HWMSG_INJECTED : 0 ); + if (status) SetLastError( RtlNtStatusToDosError(status) ); + return !status; +} + + +/*********************************************************************** * SendInput (USER32.@) */ UINT WINAPI SendInput( UINT count, LPINPUT inputs, int size ) diff --git a/dlls/user32/message.c b/dlls/user32/message.c index 93a90ea..0095af3 100644 --- a/dlls/user32/message.c +++ b/dlls/user32/message.c @@ -25,6 +25,8 @@ #include <assert.h> #include <stdarg.h> +#define NONAMELESSUNION +#define NONAMELESSSTRUCT #include "ntstatus.h" #define WIN32_NO_STATUS #include "windef.h" @@ -3066,6 +3068,47 @@ static BOOL send_message( struct send_message_info *info, DWORD_PTR *res_ptr, BO /*********************************************************************** + * send_hardware_message + */ +NTSTATUS send_hardware_message( HWND hwnd, const INPUT *input, UINT flags ) +{ + NTSTATUS ret; + + SERVER_START_REQ( send_hardware_message ) + { + req->win = wine_server_user_handle( hwnd ); + req->flags = flags; + req->input.type = input->type; + switch (input->type) + { + case INPUT_MOUSE: + req->input.mouse.x = input->u.mi.dx; + req->input.mouse.y = input->u.mi.dy; + req->input.mouse.data = input->u.mi.mouseData; + req->input.mouse.flags = input->u.mi.dwFlags; + req->input.mouse.time = input->u.mi.time; + req->input.mouse.info = input->u.mi.dwExtraInfo; + break; + case INPUT_KEYBOARD: + req->input.kbd.vkey = input->u.ki.wVk; + req->input.kbd.scan = input->u.ki.wScan; + req->input.kbd.flags = input->u.ki.dwFlags; + req->input.kbd.time = input->u.ki.time; + req->input.kbd.info = input->u.ki.dwExtraInfo; + break; + case INPUT_HARDWARE: + req->input.hw.msg = input->u.hi.uMsg; + req->input.hw.lparam = MAKELONG( input->u.hi.wParamL, input->u.hi.wParamH ); + break; + } + ret = wine_server_call( req ); + } + SERVER_END_REQ; + return ret; +} + + +/*********************************************************************** * MSG_SendInternalMessageTimeout * * Same as SendMessageTimeoutW but sends the message to a specific thread diff --git a/dlls/user32/user32.spec b/dlls/user32/user32.spec index 5eb7154..63aff08 100644 --- a/dlls/user32/user32.spec +++ b/dlls/user32/user32.spec @@ -774,6 +774,14 @@ @ stdcall wvsprintfW(ptr wstr ptr) ################################################################ +# Wine internal extensions +# +# All functions must be prefixed with '__wine_' (for internal functions) +# or 'wine_' (for user-visible functions) to avoid namespace conflicts. +# +@ cdecl __wine_send_input(long ptr long) + +################################################################ # Wine dll separation hacks, these will go away, don't use them # @ cdecl HOOK_CallHooks(long long long long long) diff --git a/dlls/user32/user_private.h b/dlls/user32/user_private.h index 23b4269..afd948b 100644 --- a/dlls/user32/user_private.h +++ b/dlls/user32/user_private.h @@ -213,6 +213,7 @@ extern void erase_now( HWND hwnd, UINT rdw_flags ) DECLSPEC_HIDDEN; extern void *get_hook_proc( void *proc, const WCHAR *module ); extern LRESULT call_current_hook( HHOOK hhook, INT code, WPARAM wparam, LPARAM lparam ) DECLSPEC_HIDDEN; extern BOOL map_wparam_AtoW( UINT message, WPARAM *wparam, enum wm_char_mapping mapping ) DECLSPEC_HIDDEN; +extern NTSTATUS send_hardware_message( HWND hwnd, const INPUT *input, UINT flags ) DECLSPEC_HIDDEN; extern LRESULT MSG_SendInternalMessageTimeout( DWORD dest_pid, DWORD dest_tid, UINT msg, WPARAM wparam, LPARAM lparam, UINT flags, UINT timeout, PDWORD_PTR res_ptr ) DECLSPEC_HIDDEN; diff --git a/dlls/winex11.drv/keyboard.c b/dlls/winex11.drv/keyboard.c index 04d7371..6fc7bb0 100644 --- a/dlls/winex11.drv/keyboard.c +++ b/dlls/winex11.drv/keyboard.c @@ -1154,6 +1154,7 @@ void X11DRV_send_keyboard_input( HWND hwnd, WORD wVk, WORD wScan, DWORD event_fl DWORD dwExtraInfo, UINT injected_flags ) { UINT message; + INPUT input; KBDLLHOOKSTRUCT hook; WORD flags, wVkStripped, wVkL, wVkR, vk_hook = wVk; @@ -1234,6 +1235,13 @@ void X11DRV_send_keyboard_input( HWND hwnd, WORD wVk, WORD wScan, DWORD event_fl hook.dwExtraInfo = dwExtraInfo; if (HOOK_CallHooks( WH_KEYBOARD_LL, HC_ACTION, message, (LPARAM)&hook, TRUE )) return; + input.type = INPUT_KEYBOARD; + input.u.ki.wVk = vk_hook; + input.u.ki.wScan = wScan; + input.u.ki.dwFlags = event_flags; + input.u.ki.time = time; + input.u.ki.dwExtraInfo = dwExtraInfo; + if (!(event_flags & KEYEVENTF_UNICODE)) { if (event_flags & KEYEVENTF_KEYUP) @@ -1252,20 +1260,7 @@ void X11DRV_send_keyboard_input( HWND hwnd, WORD wVk, WORD wScan, DWORD event_fl TRACE_(key)("message=0x%04x wParam=0x%04x InputKeyState=0x%x\n", message, wVk, key_state_table[wVk]); - SERVER_START_REQ( send_hardware_message ) - { - req->win = wine_server_user_handle( hwnd ); - req->msg = message; - req->input.type = INPUT_KEYBOARD; - req->input.kbd.vkey = vk_hook; - req->input.kbd.scan = wScan; - req->input.kbd.flags = event_flags; - req->input.kbd.time = time; - req->input.kbd.info = dwExtraInfo; - if (injected_flags & LLKHF_INJECTED) req->flags = SEND_HWMSG_INJECTED; - wine_server_call( req ); - } - SERVER_END_REQ; + __wine_send_input( hwnd, &input, (injected_flags & LLKHF_INJECTED) != 0 ); } diff --git a/dlls/winex11.drv/mouse.c b/dlls/winex11.drv/mouse.c index 236ba75..2d71be5 100644 --- a/dlls/winex11.drv/mouse.c +++ b/dlls/winex11.drv/mouse.c @@ -292,6 +292,7 @@ void X11DRV_send_mouse_input( HWND hwnd, DWORD flags, DWORD x, DWORD y, DWORD data, DWORD time, DWORD extra_info, UINT injected_flags ) { POINT pt; + INPUT input; MSLLHOOKSTRUCT hook; if (!time) time = GetTickCount(); @@ -414,20 +415,15 @@ void X11DRV_send_mouse_input( HWND hwnd, DWORD flags, DWORD x, DWORD y, if (HOOK_CallHooks( WH_MOUSE_LL, HC_ACTION, WM_XBUTTONUP, (LPARAM)&hook, TRUE )) return; } - SERVER_START_REQ( send_hardware_message ) - { - req->win = wine_server_user_handle( hwnd ); - req->input.type = INPUT_MOUSE; - req->input.mouse.x = pt.x; - req->input.mouse.y = pt.y; - req->input.mouse.data = data; - req->input.mouse.flags = flags | MOUSEEVENTF_ABSOLUTE; - req->input.mouse.time = time; - req->input.mouse.info = extra_info; - if (injected_flags & LLMHF_INJECTED) req->flags = SEND_HWMSG_INJECTED; - wine_server_call( req ); - } - SERVER_END_REQ; + input.type = INPUT_MOUSE; + input.u.mi.dx = pt.x; + input.u.mi.dy = pt.y; + input.u.mi.mouseData = data; + input.u.mi.dwFlags = flags | MOUSEEVENTF_ABSOLUTE; + input.u.mi.time = time; + input.u.mi.dwExtraInfo = extra_info; + + __wine_send_input( hwnd, &input, (injected_flags & LLMHF_INJECTED) != 0 ); } #ifdef SONAME_LIBXCURSOR diff --git a/include/winuser.h b/include/winuser.h index d95bfea..bd35803 100644 --- a/include/winuser.h +++ b/include/winuser.h @@ -5136,6 +5136,10 @@ WINUSERAPI INT WINAPI wvsprintfW(LPWSTR,LPCWSTR,__ms_va_list); /* NOTE: This is SYSTEM.3, not USER.182, which is also named KillSystemTimer */ WORD WINAPI SYSTEM_KillSystemTimer( WORD ); +#ifdef __WINESRC__ +WINUSERAPI BOOL CDECL __wine_send_input( HWND hwnd, const INPUT *input, BOOL injected ); +#endif + #ifdef __cplusplus } #endif
1
0
0
0
Dmitry Timoshkov : comctl32: 'clip' rect is unused in the WM_ERASEBKGND rebar class handler.
by Alexandre Julliard
02 Mar '11
02 Mar '11
Module: wine Branch: master Commit: 9f91254c0f97ba43e7d88f28b78ce66c9f125d75 URL:
http://source.winehq.org/git/wine.git/?a=commit;h=9f91254c0f97ba43e7d88f28b…
Author: Dmitry Timoshkov <dmitry(a)codeweavers.com> Date: Wed Mar 2 20:55:41 2011 +0800 comctl32: 'clip' rect is unused in the WM_ERASEBKGND rebar class handler. --- dlls/comctl32/rebar.c | 25 ++++--------------------- 1 files changed, 4 insertions(+), 21 deletions(-) diff --git a/dlls/comctl32/rebar.c b/dlls/comctl32/rebar.c index 74ed03d..4235592 100644 --- a/dlls/comctl32/rebar.c +++ b/dlls/comctl32/rebar.c @@ -1847,8 +1847,7 @@ REBAR_CommonSetupBand(HWND hwnd, const REBARBANDINFOW *lprbbi, REBAR_BAND *lpBan return uChanged; } -static LRESULT -REBAR_InternalEraseBkGnd (const REBAR_INFO *infoPtr, HDC hdc, const RECT *clip) +static LRESULT REBAR_EraseBkGnd (const REBAR_INFO *infoPtr, HDC hdc) /* Function: This erases the background rectangle by drawing */ /* each band with its background color (or the default) and */ /* draws each bands right separator if necessary. The row */ @@ -1951,14 +1950,10 @@ REBAR_InternalEraseBkGnd (const REBAR_INFO *infoPtr, HDC hdc, const RECT *clip) else { old = SetBkColor (hdc, new); - TRACE("%s background color=0x%06x, band (%d,%d)-(%d,%d), clip (%d,%d)-(%d,%d)\n", + TRACE("%s background color=0x%06x, band %s\n", (lpBand->clrBack == CLR_NONE) ? "none" : ((lpBand->clrBack == CLR_DEFAULT) ? "dft" : ""), - GetBkColor(hdc), - rcBand.left,rcBand.top, - rcBand.right,rcBand.bottom, - clip->left, clip->top, - clip->right, clip->bottom); + GetBkColor(hdc), wine_dbgstr_rect(&rcBand)); ExtTextOutW (hdc, 0, 0, ETO_OPAQUE, &rcBand, NULL, 0, 0); if (lpBand->clrBack != CLR_NONE) SetBkColor (hdc, old); @@ -3001,18 +2996,6 @@ REBAR_Destroy (REBAR_INFO *infoPtr) return 0; } - -static LRESULT -REBAR_EraseBkGnd (const REBAR_INFO *infoPtr, HDC hdc) -{ - RECT cliprect; - - if (GetClipBox ( hdc, &cliprect)) - return REBAR_InternalEraseBkGnd (infoPtr, hdc, &cliprect); - return 0; -} - - static LRESULT REBAR_GetFont (const REBAR_INFO *infoPtr) { @@ -3455,7 +3438,7 @@ REBAR_Paint (const REBAR_INFO *infoPtr, HDC hdc) TRACE("painting (%s)\n", wine_dbgstr_rect(&ps.rcPaint)); if (ps.fErase) { /* Erase area of paint if requested */ - REBAR_InternalEraseBkGnd (infoPtr, hdc, &ps.rcPaint); + REBAR_EraseBkGnd (infoPtr, hdc); } REBAR_Refresh (infoPtr, hdc); EndPaint (infoPtr->hwndSelf, &ps);
1
0
0
0
Jacek Caban : mshtml: Use our IDispatchEx-based attributes implementation instead of nsIDOMAttr.
by Alexandre Julliard
02 Mar '11
02 Mar '11
Module: wine Branch: master Commit: 903279eff9ce9c150c9449b9afdb1e2a76912a1c URL:
http://source.winehq.org/git/wine.git/?a=commit;h=903279eff9ce9c150c9449b9a…
Author: Jacek Caban <jacek(a)codeweavers.com> Date: Wed Mar 2 13:34:24 2011 +0100 mshtml: Use our IDispatchEx-based attributes implementation instead of nsIDOMAttr. --- dlls/mshtml/htmlattr.c | 31 +++++----------- dlls/mshtml/htmlelem3.c | 81 ++++++++++++++++++++++++++++++++--------- dlls/mshtml/mshtml_private.h | 4 +- 3 files changed, 75 insertions(+), 41 deletions(-) diff --git a/dlls/mshtml/htmlattr.c b/dlls/mshtml/htmlattr.c index bd0f6a2..d5446c6 100644 --- a/dlls/mshtml/htmlattr.c +++ b/dlls/mshtml/htmlattr.c @@ -80,7 +80,6 @@ static ULONG WINAPI HTMLDOMAttribute_Release(IHTMLDOMAttribute *iface) if(!ref) { assert(!This->elem); - nsIDOMAttr_Release(This->nsattr); release_dispex(&This->dispex); heap_free(This); } @@ -136,27 +135,19 @@ static HRESULT WINAPI HTMLDOMAttribute_put_nodeName(IHTMLDOMAttribute *iface, VA static HRESULT WINAPI HTMLDOMAttribute_get_nodeValue(IHTMLDOMAttribute *iface, VARIANT *p) { HTMLDOMAttribute *This = impl_from_IHTMLDOMAttribute(iface); - const PRUnichar *val; - nsAString val_str; - HRESULT hres = S_OK; + DISPPARAMS dp = {NULL, NULL, 0, 0}; + EXCEPINFO ei; TRACE("(%p)->(%p)\n", This, p); - nsAString_Init(&val_str, NULL); - nsIDOMAttr_GetNodeValue(This->nsattr, &val_str); - nsAString_GetData(&val_str, &val); - - V_VT(p) = VT_BSTR; - if(*val) { - V_BSTR(p) = SysAllocString(val); - if(!V_BSTR(p)) - hres = E_OUTOFMEMORY; - }else { - V_BSTR(p) = NULL; + if(!This->elem) { + FIXME("NULL This->elem\n"); + return E_UNEXPECTED; } - nsAString_Finish(&val_str); - return hres; + memset(&ei, 0, sizeof(ei)); + return IDispatchEx_InvokeEx(&This->elem->node.dispex.IDispatchEx_iface, This->dispid, LOCALE_SYSTEM_DEFAULT, + DISPATCH_PROPERTYGET, &dp, p, &ei, NULL); } static HRESULT WINAPI HTMLDOMAttribute_get_specified(IHTMLDOMAttribute *iface, VARIANT_BOOL *p) @@ -191,7 +182,7 @@ static dispex_static_data_t HTMLDOMAttribute_dispex = { HTMLDOMAttribute_iface_tids }; -HRESULT HTMLDOMAttribute_Create(HTMLElement *elem, nsIDOMAttr *nsattr, HTMLDOMAttribute **attr) +HRESULT HTMLDOMAttribute_Create(HTMLElement *elem, DISPID dispid, HTMLDOMAttribute **attr) { HTMLDOMAttribute *ret; @@ -202,9 +193,7 @@ HRESULT HTMLDOMAttribute_Create(HTMLElement *elem, nsIDOMAttr *nsattr, HTMLDOMAt ret->IHTMLDOMAttribute_iface.lpVtbl = &HTMLDOMAttributeVtbl; ret->ref = 1; - nsIDOMAttr_AddRef(nsattr); - ret->nsattr = nsattr; - + ret->dispid = dispid; ret->elem = elem; list_add_tail(&elem->attrs, &ret->entry); diff --git a/dlls/mshtml/htmlelem3.c b/dlls/mshtml/htmlelem3.c index 02015e5..b23c5ad 100644 --- a/dlls/mshtml/htmlelem3.c +++ b/dlls/mshtml/htmlelem3.c @@ -557,43 +557,88 @@ static HRESULT WINAPI HTMLElement4_normalize(IHTMLElement4 *iface) return E_NOTIMPL; } -static HRESULT WINAPI HTMLElement4_getAttributeNode(IHTMLElement4 *iface, BSTR bstrname, IHTMLDOMAttribute **ppAttribute) +/* FIXME: This should be done in IDispatchEx implementation layer */ +static BOOL get_attr_from_nselem(HTMLElement *This, BSTR name, DISPID *dispid) { - HTMLElement *This = impl_from_IHTMLElement4(iface); - HTMLDOMAttribute *attr = NULL, *iter; - nsAString name_str; + const PRUnichar *v; nsIDOMAttr *nsattr; + nsAString nsstr; + BSTR val = NULL; nsresult nsres; HRESULT hres; - TRACE("(%p)->(%s %p)\n", This, debugstr_w(bstrname), ppAttribute); + nsAString_InitDepend(&nsstr, name); + nsres = nsIDOMHTMLElement_GetAttributeNode(This->nselem, &nsstr, &nsattr); + nsAString_Finish(&nsstr); + if(NS_FAILED(nsres) || !nsattr) + return FALSE; + + FIXME("HACK\n"); - nsAString_InitDepend(&name_str, bstrname); - nsres = nsIDOMHTMLElement_GetAttributeNode(This->nselem, &name_str, &nsattr); - nsAString_Finish(&name_str); + nsAString_Init(&nsstr, NULL); + nsres = nsIDOMAttr_GetNodeValue(nsattr, &nsstr); if(NS_FAILED(nsres)) { - ERR("GetAttributeNode failed: %08x\n", nsres); - return E_FAIL; + nsAString_Finish(&nsstr); + return FALSE; } - if(!nsattr) { - *ppAttribute = NULL; - return S_OK; + nsAString_GetData(&nsstr, &v); + if(*v) { + val = SysAllocString(v); + if(!val) { + nsAString_Finish(&nsstr); + return FALSE; + } + } + nsAString_Finish(&nsstr); + + hres = IDispatchEx_GetDispID(&This->node.dispex.IDispatchEx_iface, name, fdexNameEnsure, dispid); + if(SUCCEEDED(hres)) { + VARIANT arg; + DISPPARAMS dp = {&arg, NULL, 1, 0}; + EXCEPINFO ei; + + V_VT(&arg) = VT_BSTR; + V_BSTR(&arg) = val; + memset(&ei, 0, sizeof(ei)); + hres = IDispatchEx_InvokeEx(&This->node.dispex.IDispatchEx_iface, *dispid, + LOCALE_SYSTEM_DEFAULT, DISPATCH_PROPERTYPUT, &dp, NULL, &ei, NULL); + } + + SysFreeString(val); + return SUCCEEDED(hres); +} + +static HRESULT WINAPI HTMLElement4_getAttributeNode(IHTMLElement4 *iface, BSTR bstrname, IHTMLDOMAttribute **ppAttribute) +{ + HTMLElement *This = impl_from_IHTMLElement4(iface); + HTMLDOMAttribute *attr = NULL, *iter; + DISPID dispid; + HRESULT hres; + + TRACE("(%p)->(%s %p)\n", This, debugstr_w(bstrname), ppAttribute); + + hres = IDispatchEx_GetDispID(&This->node.dispex.IDispatchEx_iface, bstrname, fdexNameCaseInsensitive, &dispid); + if(hres == DISP_E_UNKNOWNNAME) { + if(!get_attr_from_nselem(This, bstrname, &dispid)) { + *ppAttribute = NULL; + return S_OK; + } + }else if(FAILED(hres)) { + return hres; } LIST_FOR_EACH_ENTRY(iter, &This->attrs, HTMLDOMAttribute, entry) { - if(iter->nsattr == nsattr) { + if(iter->dispid == dispid) { attr = iter; break; } } if(!attr) { - hres = HTMLDOMAttribute_Create(This, nsattr, &attr); - if(FAILED(hres)) { - nsIDOMAttr_Release(nsattr); + hres = HTMLDOMAttribute_Create(This, dispid, &attr); + if(FAILED(hres)) return hres; - } } IHTMLDOMAttribute_AddRef(&attr->IHTMLDOMAttribute_iface); diff --git a/dlls/mshtml/mshtml_private.h b/dlls/mshtml/mshtml_private.h index b39ad75..11ab878 100644 --- a/dlls/mshtml/mshtml_private.h +++ b/dlls/mshtml/mshtml_private.h @@ -749,13 +749,13 @@ typedef struct { IHTMLDOMAttribute IHTMLDOMAttribute_iface; LONG ref; - nsIDOMAttr *nsattr; + DISPID dispid; HTMLElement *elem; struct list entry; } HTMLDOMAttribute; -HRESULT HTMLDOMAttribute_Create(HTMLElement*,nsIDOMAttr*,HTMLDOMAttribute**); +HRESULT HTMLDOMAttribute_Create(HTMLElement*,DISPID,HTMLDOMAttribute**); HRESULT HTMLElement_Create(HTMLDocumentNode*,nsIDOMNode*,BOOL,HTMLElement**); HRESULT HTMLCommentElement_Create(HTMLDocumentNode*,nsIDOMNode*,HTMLElement**);
1
0
0
0
Jacek Caban : mshtml: Reuse attribute objects.
by Alexandre Julliard
02 Mar '11
02 Mar '11
Module: wine Branch: master Commit: 110155099b3b51a4ce7f6b979eb56f14b8d8f950 URL:
http://source.winehq.org/git/wine.git/?a=commit;h=110155099b3b51a4ce7f6b979…
Author: Jacek Caban <jacek(a)codeweavers.com> Date: Wed Mar 2 13:34:04 2011 +0100 mshtml: Reuse attribute objects. --- dlls/mshtml/htmlattr.c | 7 ++++++- dlls/mshtml/htmlelem.c | 7 +++++++ dlls/mshtml/htmlelem3.c | 30 +++++++++++++++++++++--------- dlls/mshtml/mshtml_private.h | 6 +++++- dlls/mshtml/tests/dom.c | 1 - 5 files changed, 39 insertions(+), 12 deletions(-) diff --git a/dlls/mshtml/htmlattr.c b/dlls/mshtml/htmlattr.c index 9fef7d8..bd0f6a2 100644 --- a/dlls/mshtml/htmlattr.c +++ b/dlls/mshtml/htmlattr.c @@ -18,6 +18,7 @@ #include <stdarg.h> +#include <assert.h> #define COBJMACROS @@ -78,6 +79,7 @@ static ULONG WINAPI HTMLDOMAttribute_Release(IHTMLDOMAttribute *iface) TRACE("(%p) ref=%d\n", This, ref); if(!ref) { + assert(!This->elem); nsIDOMAttr_Release(This->nsattr); release_dispex(&This->dispex); heap_free(This); @@ -189,7 +191,7 @@ static dispex_static_data_t HTMLDOMAttribute_dispex = { HTMLDOMAttribute_iface_tids }; -HRESULT HTMLDOMAttribute_Create(HTMLDocumentNode *doc, nsIDOMAttr *nsattr, HTMLDOMAttribute **attr) +HRESULT HTMLDOMAttribute_Create(HTMLElement *elem, nsIDOMAttr *nsattr, HTMLDOMAttribute **attr) { HTMLDOMAttribute *ret; @@ -203,6 +205,9 @@ HRESULT HTMLDOMAttribute_Create(HTMLDocumentNode *doc, nsIDOMAttr *nsattr, HTMLD nsIDOMAttr_AddRef(nsattr); ret->nsattr = nsattr; + ret->elem = elem; + list_add_tail(&elem->attrs, &ret->entry); + init_dispex(&ret->dispex, (IUnknown*)&ret->IHTMLDOMAttribute_iface, &HTMLDOMAttribute_dispex); diff --git a/dlls/mshtml/htmlelem.c b/dlls/mshtml/htmlelem.c index 897a7c5..c4d5607 100644 --- a/dlls/mshtml/htmlelem.c +++ b/dlls/mshtml/htmlelem.c @@ -1647,6 +1647,12 @@ HRESULT HTMLElement_QI(HTMLDOMNode *iface, REFIID riid, void **ppv) void HTMLElement_destructor(HTMLDOMNode *iface) { HTMLElement *This = impl_from_HTMLDOMNode(iface); + HTMLDOMAttribute *attr; + + LIST_FOR_EACH_ENTRY(attr, &This->attrs, HTMLDOMAttribute, entry) { + attr->elem = NULL; + IHTMLDOMAttribute_Release(&attr->IHTMLDOMAttribute_iface); + } ConnectionPointContainer_Destroy(&This->cp_container); @@ -1742,6 +1748,7 @@ void HTMLElement_Init(HTMLElement *This, HTMLDocumentNode *doc, nsIDOMHTMLElemen if(nselem) nsIDOMHTMLElement_AddRef(nselem); This->nselem = nselem; + list_init(&This->attrs); HTMLDOMNode_Init(doc, &This->node, (nsIDOMNode*)nselem); diff --git a/dlls/mshtml/htmlelem3.c b/dlls/mshtml/htmlelem3.c index 7841346..02015e5 100644 --- a/dlls/mshtml/htmlelem3.c +++ b/dlls/mshtml/htmlelem3.c @@ -560,7 +560,7 @@ static HRESULT WINAPI HTMLElement4_normalize(IHTMLElement4 *iface) static HRESULT WINAPI HTMLElement4_getAttributeNode(IHTMLElement4 *iface, BSTR bstrname, IHTMLDOMAttribute **ppAttribute) { HTMLElement *This = impl_from_IHTMLElement4(iface); - HTMLDOMAttribute *attr; + HTMLDOMAttribute *attr = NULL, *iter; nsAString name_str; nsIDOMAttr *nsattr; nsresult nsres; @@ -576,16 +576,28 @@ static HRESULT WINAPI HTMLElement4_getAttributeNode(IHTMLElement4 *iface, BSTR b return E_FAIL; } - if(nsattr) { - hres = HTMLDOMAttribute_Create(This->node.doc, nsattr, &attr); - nsIDOMAttr_Release(nsattr); - if(FAILED(hres)) - return hres; - - *ppAttribute = &attr->IHTMLDOMAttribute_iface; - }else { + if(!nsattr) { *ppAttribute = NULL; + return S_OK; + } + + LIST_FOR_EACH_ENTRY(iter, &This->attrs, HTMLDOMAttribute, entry) { + if(iter->nsattr == nsattr) { + attr = iter; + break; + } } + + if(!attr) { + hres = HTMLDOMAttribute_Create(This, nsattr, &attr); + if(FAILED(hres)) { + nsIDOMAttr_Release(nsattr); + return hres; + } + } + + IHTMLDOMAttribute_AddRef(&attr->IHTMLDOMAttribute_iface); + *ppAttribute = &attr->IHTMLDOMAttribute_iface; return S_OK; } diff --git a/dlls/mshtml/mshtml_private.h b/dlls/mshtml/mshtml_private.h index 0adb344..b39ad75 100644 --- a/dlls/mshtml/mshtml_private.h +++ b/dlls/mshtml/mshtml_private.h @@ -561,6 +561,7 @@ typedef struct { nsIDOMHTMLElement *nselem; HTMLStyle *style; + struct list attrs; } HTMLElement; #define HTMLELEMENT_TIDS \ @@ -749,9 +750,12 @@ typedef struct { LONG ref; nsIDOMAttr *nsattr; + + HTMLElement *elem; + struct list entry; } HTMLDOMAttribute; -HRESULT HTMLDOMAttribute_Create(HTMLDocumentNode*,nsIDOMAttr*,HTMLDOMAttribute**); +HRESULT HTMLDOMAttribute_Create(HTMLElement*,nsIDOMAttr*,HTMLDOMAttribute**); HRESULT HTMLElement_Create(HTMLDocumentNode*,nsIDOMNode*,BOOL,HTMLElement**); HRESULT HTMLCommentElement_Create(HTMLDocumentNode*,nsIDOMNode*,HTMLElement**); diff --git a/dlls/mshtml/tests/dom.c b/dlls/mshtml/tests/dom.c index 85bac69..88d8790 100644 --- a/dlls/mshtml/tests/dom.c +++ b/dlls/mshtml/tests/dom.c @@ -6812,7 +6812,6 @@ static void test_attr(IHTMLElement *elem) test_no_iface((IUnknown*)attr, &IID_IHTMLDOMNode); attr2 = get_elem_attr_node((IUnknown*)elem, "id", TRUE); - todo_wine ok(iface_cmp((IUnknown*)attr, (IUnknown*)attr2), "attr != attr2\n"); IHTMLDOMAttribute_Release(attr2);
1
0
0
0
Jacek Caban : mshtml: Correctly handle NULL BSTR in VARIANT in IDispatchEx implementation.
by Alexandre Julliard
02 Mar '11
02 Mar '11
Module: wine Branch: master Commit: b9975bf88e6c7cc9e37df7cd4de951e8b85dbb4b URL:
http://source.winehq.org/git/wine.git/?a=commit;h=b9975bf88e6c7cc9e37df7cd4…
Author: Jacek Caban <jacek(a)codeweavers.com> Date: Wed Mar 2 13:34:58 2011 +0100 mshtml: Correctly handle NULL BSTR in VARIANT in IDispatchEx implementation. --- dlls/mshtml/dispex.c | 15 +++++++++++++-- dlls/mshtml/tests/script.c | 12 ++++++++++++ 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/dlls/mshtml/dispex.c b/dlls/mshtml/dispex.c index be949d5..4706309 100644 --- a/dlls/mshtml/dispex.c +++ b/dlls/mshtml/dispex.c @@ -334,6 +334,17 @@ static inline BOOL is_dynamic_dispid(DISPID id) return DISPID_DYNPROP_0 <= id && id <= DISPID_DYNPROP_MAX; } +static HRESULT variant_copy(VARIANT *dest, VARIANT *src) +{ + if(V_VT(src) == VT_BSTR && !V_BSTR(src)) { + V_VT(dest) = VT_BSTR; + V_BSTR(dest) = NULL; + return S_OK; + } + + return VariantCopy(dest, src); +} + static inline dispex_dynamic_data_t *get_dynamic_data(DispatchEx *This, BOOL alloc) { return !alloc || This->dynamic_data @@ -938,7 +949,7 @@ static HRESULT WINAPI DispatchEx_InvokeEx(IDispatchEx *iface, DISPID id, LCID lc case DISPATCH_PROPERTYGET: if(prop->flags & DYNPROP_DELETED) return DISP_E_UNKNOWNNAME; - return VariantCopy(pvarRes, &prop->var); + return variant_copy(pvarRes, &prop->var); case DISPATCH_PROPERTYPUT|DISPATCH_PROPERTYPUTREF: case DISPATCH_PROPERTYPUT: if(pdp->cArgs != 1 || (pdp->cNamedArgs == 1 && *pdp->rgdispidNamedArgs != DISPID_PROPERTYPUT) @@ -949,7 +960,7 @@ static HRESULT WINAPI DispatchEx_InvokeEx(IDispatchEx *iface, DISPID id, LCID lc TRACE("put %s\n", debugstr_variant(pdp->rgvarg)); VariantClear(&prop->var); - hres = VariantCopy(&prop->var, pdp->rgvarg); + hres = variant_copy(&prop->var, pdp->rgvarg); if(FAILED(hres)) return hres; diff --git a/dlls/mshtml/tests/script.c b/dlls/mshtml/tests/script.c index 761d440..35e6a9c 100644 --- a/dlls/mshtml/tests/script.c +++ b/dlls/mshtml/tests/script.c @@ -1986,6 +1986,18 @@ static void test_script_run(void) ok(V_VT(&var) == VT_I4, "V_VT(var)=%d\n", V_VT(&var)); ok(V_I4(&var) == 300, "V_I4(&var) = %d\n", V_I4(&var)); + V_VT(&var) = VT_BSTR; + V_BSTR(&var) = NULL; + dispex_propput(document, id, 0,&var); + + VariantInit(&var); + memset(&dp, 0, sizeof(dp)); + memset(&ei, 0, sizeof(ei)); + hres = IDispatchEx_InvokeEx(document, id, LOCALE_NEUTRAL, INVOKE_PROPERTYGET, &dp, &var, &ei, NULL); + ok(hres == S_OK, "InvokeEx failed: %08x\n", hres); + ok(V_VT(&var) == VT_BSTR, "V_VT(var)=%d\n", V_VT(&var)); + ok(!V_BSTR(&var), "V_BSTR(&var) = %s\n", wine_dbgstr_w(V_BSTR(&var))); + unk = (void*)0xdeadbeef; hres = IDispatchEx_GetNameSpaceParent(window_dispex, &unk); ok(hres == S_OK, "GetNameSpaceParent failed: %08x\n", hres);
1
0
0
0
Jacek Caban : mshtml: Added IHTMLLocation::replace implementation.
by Alexandre Julliard
02 Mar '11
02 Mar '11
Module: wine Branch: master Commit: a5437697612789ab20eb756065b3187e76fb745f URL:
http://source.winehq.org/git/wine.git/?a=commit;h=a5437697612789ab20eb75606…
Author: Jacek Caban <jacek(a)codeweavers.com> Date: Wed Mar 2 13:33:51 2011 +0100 mshtml: Added IHTMLLocation::replace implementation. --- dlls/mshtml/htmllocation.c | 11 +++++- dlls/mshtml/tests/htmldoc.c | 79 ++++++++++++++++++++++++------------------- 2 files changed, 53 insertions(+), 37 deletions(-) Diff:
http://source.winehq.org/git/wine.git/?a=commitdiff;h=a5437697612789ab20eb7…
1
0
0
0
Alistair Leslie-Hughes : mshtml: Implement IHTMLAnchorElement get/ put target.
by Alexandre Julliard
02 Mar '11
02 Mar '11
Module: wine Branch: master Commit: 5c186f6a99b6d63a85d124bec69c5318b483fc18 URL:
http://source.winehq.org/git/wine.git/?a=commit;h=5c186f6a99b6d63a85d124bec…
Author: Alistair Leslie-Hughes <leslie_alistair(a)hotmail.com> Date: Fri Feb 18 14:03:41 2011 +1100 mshtml: Implement IHTMLAnchorElement get/put target. --- dlls/mshtml/htmlanchor.c | 25 +++++++++++++++++++++---- dlls/mshtml/tests/dom.c | 42 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 63 insertions(+), 4 deletions(-) diff --git a/dlls/mshtml/htmlanchor.c b/dlls/mshtml/htmlanchor.c index ae3dd18..02a05a7 100644 --- a/dlls/mshtml/htmlanchor.c +++ b/dlls/mshtml/htmlanchor.c @@ -144,15 +144,32 @@ static HRESULT WINAPI HTMLAnchorElement_get_href(IHTMLAnchorElement *iface, BSTR static HRESULT WINAPI HTMLAnchorElement_put_target(IHTMLAnchorElement *iface, BSTR v) { HTMLAnchorElement *This = impl_from_IHTMLAnchorElement(iface); - FIXME("(%p)->(%s)\n", This, debugstr_w(v)); - return E_NOTIMPL; + nsAString nsstr; + nsresult nsres; + + TRACE("(%p)->(%s)\n", This, debugstr_w(v)); + + nsAString_InitDepend(&nsstr, v); + nsres = nsIDOMHTMLAnchorElement_SetTarget(This->nsanchor, &nsstr); + nsAString_Finish(&nsstr); + if(NS_FAILED(nsres)) + return E_FAIL; + + return S_OK; } static HRESULT WINAPI HTMLAnchorElement_get_target(IHTMLAnchorElement *iface, BSTR *p) { HTMLAnchorElement *This = impl_from_IHTMLAnchorElement(iface); - FIXME("(%p)->(%p)\n", This, p); - return E_NOTIMPL; + nsAString target_str; + nsresult nsres; + + TRACE("(%p)->(%p)\n", This, p); + + nsAString_Init(&target_str, NULL); + nsres = nsIDOMHTMLAnchorElement_GetTarget(This->nsanchor, &target_str); + + return return_nsstr(nsres, &target_str, p); } static HRESULT WINAPI HTMLAnchorElement_put_rel(IHTMLAnchorElement *iface, BSTR v) diff --git a/dlls/mshtml/tests/dom.c b/dlls/mshtml/tests/dom.c index 432a3b8..85bac69 100644 --- a/dlls/mshtml/tests/dom.c +++ b/dlls/mshtml/tests/dom.c @@ -1124,6 +1124,36 @@ static void _test_anchor_put_href(unsigned line, IUnknown *unk, const char *exhr _test_disp_value(line, unk, exhref); } +#define test_anchor_get_target(a,h) _test_anchor_get_target(__LINE__,a,h) +static void _test_anchor_get_target(unsigned line, IUnknown *unk, const char *target) +{ + IHTMLAnchorElement *anchor = _get_anchor_iface(line, unk); + BSTR str; + HRESULT hres; + + hres = IHTMLAnchorElement_get_target(anchor, &str); + ok_(__FILE__,line)(hres == S_OK, "get_target failed: %08x\n", hres); + if(target) + ok_(__FILE__,line)(!strcmp_wa(str, target), "target = %s, expected %s\n", wine_dbgstr_w(str), target); + else + ok_(__FILE__,line)(str == NULL, "target = %s, expected NULL\n", wine_dbgstr_w(str)); + SysFreeString(str); +} + +#define test_anchor_put_target(a,h) _test_anchor_put_target(__LINE__,a,h) +static void _test_anchor_put_target(unsigned line, IUnknown *unk, const char *target) +{ + IHTMLAnchorElement *anchor = _get_anchor_iface(line, unk); + BSTR str; + HRESULT hres; + + str = target ? a2bstr(target) : NULL; + hres = IHTMLAnchorElement_put_target(anchor, str); + ok_(__FILE__,line)(hres == S_OK, "put_target failed: %08x\n", hres); + SysFreeString(str); +} + + #define test_option_text(o,t) _test_option_text(__LINE__,o,t) static void _test_option_text(unsigned line, IHTMLOptionElement *option, const char *text) { @@ -6585,6 +6615,18 @@ static void test_elems(IHTMLDocument2 *doc) /* Restore the href */ test_anchor_put_href((IUnknown*)elem, "
http://test/
"); test_anchor_href((IUnknown*)elem, "
http://test/
"); + + /* target */ + test_anchor_get_target((IUnknown*)elem, NULL); + + /* Change the target */ + test_anchor_put_target((IUnknown*)elem, "wine"); + test_anchor_get_target((IUnknown*)elem, "wine"); + + /* Restore the target */ + test_anchor_put_target((IUnknown*)elem, NULL); + test_anchor_get_target((IUnknown*)elem, NULL); + IHTMLElement_Release(elem); }
1
0
0
0
Hans Leidekker : userenv: Implement and test GetUserProfileDirectory.
by Alexandre Julliard
02 Mar '11
02 Mar '11
Module: wine Branch: master Commit: c4d8f7400b51ca3a196e9a9d9bea7254a2b716cc URL:
http://source.winehq.org/git/wine.git/?a=commit;h=c4d8f7400b51ca3a196e9a9d9…
Author: Hans Leidekker <hans(a)codeweavers.com> Date: Wed Mar 2 10:46:56 2011 +0100 userenv: Implement and test GetUserProfileDirectory. --- dlls/userenv/tests/userenv.c | 104 ++++++++++++++++++++++++++++++++++++++++++ dlls/userenv/userenv_main.c | 74 ++++++++++++++++++++++++++++-- 2 files changed, 174 insertions(+), 4 deletions(-) diff --git a/dlls/userenv/tests/userenv.c b/dlls/userenv/tests/userenv.c index c96b710..cd81232 100644 --- a/dlls/userenv/tests/userenv.c +++ b/dlls/userenv/tests/userenv.c @@ -283,8 +283,112 @@ static void test_get_profiles_dir(void) expect_gle(ERROR_INSUFFICIENT_BUFFER); } +static void test_get_user_profile_dir(void) +{ + BOOL ret; + DWORD error, len; + HANDLE token; + char *dirA; + WCHAR *dirW; + + if (!GetEnvironmentVariableA( "ALLUSERSPROFILE", NULL, 0 )) + { + win_skip("Skipping tests on NT4\n"); + return; + } + + ret = OpenProcessToken( GetCurrentProcess(), TOKEN_QUERY, &token ); + ok(ret, "expected success %u\n", GetLastError()); + + SetLastError( 0xdeadbeef ); + ret = GetUserProfileDirectoryA( NULL, NULL, NULL ); + error = GetLastError(); + ok(!ret, "expected failure\n"); + ok(error == ERROR_INVALID_PARAMETER, "expected ERROR_INVALID_PARAMETER, got %u\n", error); + + SetLastError( 0xdeadbeef ); + ret = GetUserProfileDirectoryA( token, NULL, NULL ); + error = GetLastError(); + ok(!ret, "expected failure\n"); + ok(error == ERROR_INVALID_PARAMETER, "expected ERROR_INVALID_PARAMETER, got %u\n", error); + + dirA = HeapAlloc( GetProcessHeap(), 0, 32 ); + SetLastError( 0xdeadbeef ); + ret = GetUserProfileDirectoryA( token, dirA, NULL ); + error = GetLastError(); + ok(!ret, "expected failure\n"); + ok(error == ERROR_INVALID_PARAMETER, "expected ERROR_INVALID_PARAMETER, got %u\n", error); + HeapFree( GetProcessHeap(), 0, dirA ); + + len = 0; + SetLastError( 0xdeadbeef ); + ret = GetUserProfileDirectoryA( token, NULL, &len ); + error = GetLastError(); + ok(!ret, "expected failure\n"); + ok(error == ERROR_INVALID_PARAMETER, "expected ERROR_INVALID_PARAMETER, got %u\n", error); + ok(!len, "expected 0, got %u\n", len); + + len = 0; + dirA = HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, 32 ); + SetLastError( 0xdeadbeef ); + ret = GetUserProfileDirectoryA( token, dirA, &len ); + error = GetLastError(); + ok(!ret, "expected failure\n"); + ok(error == ERROR_INSUFFICIENT_BUFFER, "expected ERROR_INSUFFICIENT_BUFFER, got %u\n", error); + ok(len, "expected len > 0\n"); + HeapFree( GetProcessHeap(), 0, dirA ); + + dirA = HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, len ); + SetLastError( 0xdeadbeef ); + ret = GetUserProfileDirectoryA( token, dirA, &len ); + ok(ret, "expected success %u\n", GetLastError()); + ok(len, "expected len > 0\n"); + ok(lstrlenA( dirA ) == len - 1, "length mismatch %d != %d - 1\n", lstrlenA( dirA ), len ); + trace("%s\n", dirA); + HeapFree( GetProcessHeap(), 0, dirA ); + + SetLastError( 0xdeadbeef ); + ret = GetUserProfileDirectoryW( NULL, NULL, NULL ); + error = GetLastError(); + ok(!ret, "expected failure\n"); + todo_wine ok(error == ERROR_INVALID_HANDLE, "expected ERROR_INVALID_HANDLE, got %u\n", error); + + SetLastError( 0xdeadbeef ); + ret = GetUserProfileDirectoryW( token, NULL, NULL ); + error = GetLastError(); + ok(!ret, "expected failure\n"); + ok(error == ERROR_INVALID_PARAMETER, "expected ERROR_INVALID_PARAMETER, got %u\n", error); + + dirW = HeapAlloc( GetProcessHeap(), 0, 32 ); + SetLastError( 0xdeadbeef ); + ret = GetUserProfileDirectoryW( token, dirW, NULL ); + error = GetLastError(); + ok(!ret, "expected failure\n"); + ok(error == ERROR_INVALID_PARAMETER, "expected ERROR_INVALID_PARAMETER, got %u\n", error); + HeapFree( GetProcessHeap(), 0, dirW ); + + len = 0; + SetLastError( 0xdeadbeef ); + ret = GetUserProfileDirectoryW( token, NULL, &len ); + error = GetLastError(); + ok(!ret, "expected failure\n"); + ok(error == ERROR_INSUFFICIENT_BUFFER, "expected ERROR_INSUFFICIENT_BUFFER, got %u\n", error); + ok(len, "expected len > 0\n"); + + dirW = HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, len * sizeof(WCHAR) ); + SetLastError( 0xdeadbeef ); + ret = GetUserProfileDirectoryW( token, dirW, &len ); + ok(ret, "expected success %u\n", GetLastError()); + ok(len, "expected len > 0\n"); + ok(lstrlenW( dirW ) == len - 1, "length mismatch %d != %d - 1\n", lstrlenW( dirW ), len ); + HeapFree( GetProcessHeap(), 0, dirW ); + + CloseHandle( token ); +} + START_TEST(userenv) { test_create_env(); test_get_profiles_dir(); + test_get_user_profile_dir(); } diff --git a/dlls/userenv/userenv_main.c b/dlls/userenv/userenv_main.c index 4204472..6a2a953 100644 --- a/dlls/userenv/userenv_main.c +++ b/dlls/userenv/userenv_main.c @@ -26,9 +26,11 @@ #include "winbase.h" #include "winreg.h" #include "winternl.h" +#include "winnls.h" #include "userenv.h" #include "wine/debug.h" +#include "wine/unicode.h" WINE_DEFAULT_DEBUG_CHANNEL( userenv ); @@ -115,15 +117,79 @@ BOOL WINAPI GetDefaultUserProfileDirectoryW( LPWSTR lpProfileDir, LPDWORD lpcchS BOOL WINAPI GetUserProfileDirectoryA( HANDLE hToken, LPSTR lpProfileDir, LPDWORD lpcchSize ) { - FIXME("%p %p %p\n", hToken, lpProfileDir, lpcchSize ); - return FALSE; + BOOL ret; + WCHAR *dirW = NULL; + + TRACE( "%p %p %p\n", hToken, lpProfileDir, lpcchSize ); + + if (!lpProfileDir || !lpcchSize) + { + SetLastError( ERROR_INVALID_PARAMETER ); + return FALSE; + } + if (!(dirW = HeapAlloc( GetProcessHeap(), 0, *lpcchSize * sizeof(WCHAR) ))) + return FALSE; + + if ((ret = GetUserProfileDirectoryW( hToken, dirW, lpcchSize ))) + WideCharToMultiByte( CP_ACP, 0, dirW, *lpcchSize, lpProfileDir, *lpcchSize, NULL, NULL ); + + HeapFree( GetProcessHeap(), 0, dirW ); + return ret; } BOOL WINAPI GetUserProfileDirectoryW( HANDLE hToken, LPWSTR lpProfileDir, LPDWORD lpcchSize ) { - FIXME("%p %p %p\n", hToken, lpProfileDir, lpcchSize ); - return FALSE; + static const WCHAR slashW[] = {'\\',0}; + TOKEN_USER *t; + WCHAR *userW = NULL, *dirW = NULL; + DWORD len, dir_len, domain_len; + SID_NAME_USE use; + BOOL ret = FALSE; + + TRACE( "%p %p %p\n", hToken, lpProfileDir, lpcchSize ); + + if (!lpcchSize) + { + SetLastError( ERROR_INVALID_PARAMETER ); + return FALSE; + } + + len = 0; + GetTokenInformation( hToken, TokenUser, NULL, 0, &len ); + if (GetLastError() != ERROR_INSUFFICIENT_BUFFER) return FALSE; + if (!(t = HeapAlloc( GetProcessHeap(), 0, len ))) return FALSE; + if (!GetTokenInformation( hToken, TokenUser, t, len, &len )) goto done; + + len = 0; + LookupAccountSidW( NULL, t->User.Sid, NULL, &len, NULL, &domain_len, NULL ); + if (GetLastError() != ERROR_INSUFFICIENT_BUFFER) goto done; + if (!(userW = HeapAlloc( GetProcessHeap(), 0, len * sizeof(WCHAR) ))) goto done; + if (!LookupAccountSidW( NULL, t->User.Sid, userW, &len, NULL, &domain_len, &use )) goto done; + + dir_len = 0; + GetProfilesDirectoryW( NULL, &dir_len ); + if (GetLastError() != ERROR_INSUFFICIENT_BUFFER) goto done; + if (!(dirW = HeapAlloc( GetProcessHeap(), 0, (dir_len + 1) * sizeof(WCHAR) ))) goto done; + if (!GetProfilesDirectoryW( dirW, &dir_len )) goto done; + + len += dir_len + 2; + if (*lpcchSize < len) + { + SetLastError( ERROR_INSUFFICIENT_BUFFER ); + *lpcchSize = len; + goto done; + } + strcpyW( lpProfileDir, dirW ); + strcatW( lpProfileDir, slashW ); + strcatW( lpProfileDir, userW ); + *lpcchSize = len; + ret = TRUE; + +done: + HeapFree( GetProcessHeap(), 0, userW ); + HeapFree( GetProcessHeap(), 0, dirW ); + return ret; } static const char ProfileListA[] = "Software\\Microsoft\\Windows NT\\CurrentVersion\\ProfileList";
1
0
0
0
Hans Leidekker : userenv: GetProfilesDirectoryW accepts a NULL buffer.
by Alexandre Julliard
02 Mar '11
02 Mar '11
Module: wine Branch: master Commit: 1c6ea02ffa1510056551404a6b777dcc6a4a307a URL:
http://source.winehq.org/git/wine.git/?a=commit;h=1c6ea02ffa1510056551404a6…
Author: Hans Leidekker <hans(a)codeweavers.com> Date: Wed Mar 2 10:46:44 2011 +0100 userenv: GetProfilesDirectoryW accepts a NULL buffer. --- dlls/userenv/tests/userenv.c | 17 +++++++++++++++++ dlls/userenv/userenv_main.c | 4 ++-- 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/dlls/userenv/tests/userenv.c b/dlls/userenv/tests/userenv.c index 446870f..c96b710 100644 --- a/dlls/userenv/tests/userenv.c +++ b/dlls/userenv/tests/userenv.c @@ -264,6 +264,23 @@ static void test_get_profiles_dir(void) HeapFree(GetProcessHeap(), 0, buf); HeapFree(GetProcessHeap(), 0, profiles_dir); + + SetLastError(0xdeadbeef); + r = GetProfilesDirectoryW(NULL, NULL); + expect(FALSE, r); + expect_gle(ERROR_INVALID_PARAMETER); + + cch = 0; + SetLastError(0xdeadbeef); + r = GetProfilesDirectoryW(NULL, &cch); + expect(FALSE, r); + expect_gle(ERROR_INSUFFICIENT_BUFFER); + ok(cch, "expected cch > 0\n"); + + SetLastError(0xdeadbeef); + r = GetProfilesDirectoryW(NULL, &cch); + expect(FALSE, r); + expect_gle(ERROR_INSUFFICIENT_BUFFER); } START_TEST(userenv) diff --git a/dlls/userenv/userenv_main.c b/dlls/userenv/userenv_main.c index 59b3b1f..4204472 100644 --- a/dlls/userenv/userenv_main.c +++ b/dlls/userenv/userenv_main.c @@ -201,7 +201,7 @@ BOOL WINAPI GetProfilesDirectoryW( LPWSTR lpProfilesDir, LPDWORD lpcchSize ) TRACE("%p %p\n", lpProfilesDir, lpcchSize ); - if (!lpProfilesDir || !lpcchSize) + if (!lpcchSize) { SetLastError(ERROR_INVALID_PARAMETER); return FALSE; @@ -234,7 +234,7 @@ BOOL WINAPI GetProfilesDirectoryW( LPWSTR lpProfilesDir, LPDWORD lpcchSize ) } expanded_len = ExpandEnvironmentStringsW(unexpanded_profiles_dir, NULL, 0); /* The returned length doesn't include the NULL terminator. */ - if (*lpcchSize < expanded_len - 1) + if (*lpcchSize < expanded_len - 1 || !lpProfilesDir) { *lpcchSize = expanded_len - 1; SetLastError(ERROR_INSUFFICIENT_BUFFER);
1
0
0
0
Hans Leidekker : advapi32: Use a fixed computer SID that matches local user SIDs.
by Alexandre Julliard
02 Mar '11
02 Mar '11
Module: wine Branch: master Commit: 837fc836aacfc1ea654e3c6c29b74c14d9bd9686 URL:
http://source.winehq.org/git/wine.git/?a=commit;h=837fc836aacfc1ea654e3c6c2…
Author: Hans Leidekker <hans(a)codeweavers.com> Date: Wed Mar 2 10:46:30 2011 +0100 advapi32: Use a fixed computer SID that matches local user SIDs. --- dlls/advapi32/lsa.c | 1 - dlls/advapi32/security.c | 64 +++++++-------------------------------------- 2 files changed, 10 insertions(+), 55 deletions(-) diff --git a/dlls/advapi32/lsa.c b/dlls/advapi32/lsa.c index 863ddb2..4806216 100644 --- a/dlls/advapi32/lsa.c +++ b/dlls/advapi32/lsa.c @@ -656,7 +656,6 @@ NTSTATUS WINAPI LsaQueryInformationPolicy( xdi->info.DomainSid = &xdi->sid; - /* read the computer SID from the registry */ if (!ADVAPI_GetComputerSid(&xdi->sid)) { HeapFree(GetProcessHeap(), 0, xdi); diff --git a/dlls/advapi32/security.c b/dlls/advapi32/security.c index de090dc..1aa7990 100644 --- a/dlls/advapi32/security.c +++ b/dlls/advapi32/security.c @@ -446,64 +446,20 @@ BOOL ADVAPI_IsLocalComputer(LPCWSTR ServerName) /************************************************************ * ADVAPI_GetComputerSid - * - * Reads the computer SID from the registry. */ BOOL ADVAPI_GetComputerSid(PSID sid) { - HKEY key; - LONG ret; - BOOL retval = FALSE; - static const WCHAR Account[] = { 'S','E','C','U','R','I','T','Y','\\','S','A','M','\\','D','o','m','a','i','n','s','\\','A','c','c','o','u','n','t',0 }; - static const WCHAR V[] = { 'V',0 }; - - if ((ret = RegOpenKeyExW(HKEY_LOCAL_MACHINE, Account, 0, - KEY_READ, &key)) == ERROR_SUCCESS) + static const struct /* same fields as struct SID */ { - DWORD size = 0; - ret = RegQueryValueExW(key, V, NULL, NULL, NULL, &size); - if (ret == ERROR_MORE_DATA || ret == ERROR_SUCCESS) - { - BYTE * data = HeapAlloc(GetProcessHeap(), 0, size); - if (data) - { - if ((ret = RegQueryValueExW(key, V, NULL, NULL, - data, &size)) == ERROR_SUCCESS) - { - /* the SID is in the last 24 bytes of the binary data */ - CopyMemory(sid, &data[size-24], 24); - retval = TRUE; - } - HeapFree(GetProcessHeap(), 0, data); - } - } - RegCloseKey(key); - } - - if(retval == TRUE) return retval; - - /* create a new random SID */ - if (RegCreateKeyExW(HKEY_LOCAL_MACHINE, Account, - 0, NULL, 0, KEY_ALL_ACCESS, NULL, &key, NULL) == ERROR_SUCCESS) - { - PSID new_sid; - SID_IDENTIFIER_AUTHORITY identifierAuthority = {SECURITY_NT_AUTHORITY}; - DWORD id[3]; - - if (RtlGenRandom(id, sizeof(id))) - { - if (AllocateAndInitializeSid(&identifierAuthority, 4, SECURITY_NT_NON_UNIQUE, id[0], id[1], id[2], 0, 0, 0, 0, &new_sid)) - { - if (RegSetValueExW(key, V, 0, REG_BINARY, new_sid, GetLengthSid(new_sid)) == ERROR_SUCCESS) - retval = CopySid(GetLengthSid(new_sid), sid, new_sid); - - FreeSid(new_sid); - } - } - RegCloseKey(key); - } - - return retval; + BYTE Revision; + BYTE SubAuthorityCount; + SID_IDENTIFIER_AUTHORITY IdentifierAuthority; + DWORD SubAuthority[4]; + } computer_sid = + { SID_REVISION, 4, { SECURITY_NT_AUTHORITY }, { SECURITY_NT_NON_UNIQUE, 0, 0, 0 } }; + + memcpy( sid, &computer_sid, sizeof(computer_sid) ); + return TRUE; } /* ##############################
1
0
0
0
← Newer
1
...
13
14
15
16
17
Older →
Jump to page:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Results per page:
10
25
50
100
200