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
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
August 2020
----- 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
692 discussions
Start a n
N
ew thread
Michael Stefaniuc : dmime: Simplify loading/storing of the Tempo Track data.
by Alexandre Julliard
05 Aug '20
05 Aug '20
Module: wine Branch: master Commit: c64b31c71db4e7216f72e15c9d252e8f2635abe6 URL:
https://source.winehq.org/git/wine.git/?a=commit;h=c64b31c71db4e7216f72e15c…
Author: Michael Stefaniuc <mstefani(a)winehq.org> Date: Wed Aug 5 00:14:32 2020 +0200 dmime: Simplify loading/storing of the Tempo Track data. Fixes loading more than one tempo items. Signed-off-by: Michael Stefaniuc <mstefani(a)winehq.org> Signed-off-by: Alexandre Julliard <julliard(a)winehq.org> --- dlls/dmime/dmobject.c | 45 +++++++++++++++++++++ dlls/dmime/dmobject.h | 2 + dlls/dmime/tempotrack.c | 102 ++++++++++++++++++------------------------------ 3 files changed, 85 insertions(+), 64 deletions(-) diff --git a/dlls/dmime/dmobject.c b/dlls/dmime/dmobject.c index 0ef007530f..e6a1ce906a 100644 --- a/dlls/dmime/dmobject.c +++ b/dlls/dmime/dmobject.c @@ -28,6 +28,7 @@ #include "dmusics.h" #include "dmobject.h" #include "wine/debug.h" +#include "wine/heap.h" WINE_DEFAULT_DEBUG_CHANNEL(dmobj); WINE_DECLARE_DEBUG_CHANNEL(dmfile); @@ -371,6 +372,50 @@ HRESULT stream_next_chunk(IStream *stream, struct chunk_entry *chunk) return stream_get_chunk(stream, chunk); } +/* Reads chunk data of the form: + DWORD - size of array element + element[] - Array of elements + The caller needs to heap_free() the array. +*/ +HRESULT stream_chunk_get_array(IStream *stream, const struct chunk_entry *chunk, void **array, + unsigned int *count, DWORD elem_size) +{ + DWORD size; + HRESULT hr; + + *array = NULL; + *count = 0; + + if (chunk->size < sizeof(DWORD)) { + WARN_(dmfile)("%s: Too short to read element size\n", debugstr_chunk(chunk)); + return E_FAIL; + } + if (FAILED(hr = stream_read(stream, &size, sizeof(DWORD)))) + return hr; + if (size != elem_size) { + WARN_(dmfile)("%s: Array element size mismatch: got %u, expected %u\n", + debugstr_chunk(chunk), size, elem_size); + return DMUS_E_UNSUPPORTED_STREAM; + } + + *count = (chunk->size - sizeof(DWORD)) / elem_size; + size = *count * elem_size; + if (!(*array = heap_alloc(size))) + return E_OUTOFMEMORY; + if (FAILED(hr = stream_read(stream, *array, size))) { + heap_free(*array); + *array = NULL; + return hr; + } + + if (chunk->size > size + sizeof(DWORD)) { + WARN_(dmfile)("%s: Extraneous data at end of array\n", debugstr_chunk(chunk)); + stream_skip_chunk(stream, chunk); + return S_FALSE; + } + return S_OK; +} + HRESULT stream_chunk_get_data(IStream *stream, const struct chunk_entry *chunk, void *data, ULONG size) { diff --git a/dlls/dmime/dmobject.h b/dlls/dmime/dmobject.h index a1729c8323..afe721dc82 100644 --- a/dlls/dmime/dmobject.h +++ b/dlls/dmime/dmobject.h @@ -35,6 +35,8 @@ HRESULT stream_get_chunk(IStream *stream, struct chunk_entry *chunk) DECLSPEC_HI HRESULT stream_next_chunk(IStream *stream, struct chunk_entry *chunk) DECLSPEC_HIDDEN; HRESULT stream_skip_chunk(IStream *stream, const struct chunk_entry *chunk) DECLSPEC_HIDDEN; +HRESULT stream_chunk_get_array(IStream *stream, const struct chunk_entry *chunk, void **array, + unsigned int *count, DWORD elem_size) DECLSPEC_HIDDEN; HRESULT stream_chunk_get_data(IStream *stream, const struct chunk_entry *chunk, void *data, ULONG size) DECLSPEC_HIDDEN; HRESULT stream_chunk_get_wstr(IStream *stream, const struct chunk_entry *chunk, WCHAR *str, diff --git a/dlls/dmime/tempotrack.c b/dlls/dmime/tempotrack.c index 94e4430b7f..9d25ccc298 100644 --- a/dlls/dmime/tempotrack.c +++ b/dlls/dmime/tempotrack.c @@ -29,11 +29,13 @@ WINE_DECLARE_DEBUG_CHANNEL(dmfile); /***************************************************************************** * IDirectMusicTempoTrack implementation */ + typedef struct IDirectMusicTempoTrack { IDirectMusicTrack8 IDirectMusicTrack8_iface; struct dmobject dmobj; /* IPersistStream only */ LONG ref; - struct list Items; + DMUS_IO_TEMPO_ITEM *items; + unsigned int count; } IDirectMusicTempoTrack; /* IDirectMusicTempoTrack IDirectMusicTrack8 part: */ @@ -83,16 +85,7 @@ static ULONG WINAPI tempo_track_Release(IDirectMusicTrack8 *iface) TRACE("(%p) ref=%d\n", This, ref); if (!ref) { - struct list *cursor, *cursor2; - DMUS_PRIVATE_TEMPO_ITEM *item; - - LIST_FOR_EACH_SAFE(cursor, cursor2, &This->Items) { - item = LIST_ENTRY(cursor, DMUS_PRIVATE_TEMPO_ITEM, entry); - list_remove(cursor); - - heap_free(item); - } - + heap_free(This->items); heap_free(This); DMIME_UnlockModule(); } @@ -157,8 +150,8 @@ static HRESULT WINAPI tempo_track_GetParam(IDirectMusicTrack8 *iface, REFGUID ty MUSIC_TIME *next, void *param) { IDirectMusicTempoTrack *This = impl_from_IDirectMusicTrack8(iface); - DMUS_PRIVATE_TEMPO_ITEM *item = NULL; DMUS_TEMPO_PARAM *prm = param; + unsigned int i; TRACE("(%p, %s, %d, %p, %p)\n", This, debugstr_dmguid(type), time, next, param); @@ -174,15 +167,15 @@ static HRESULT WINAPI tempo_track_GetParam(IDirectMusicTrack8 *iface, REFGUID ty prm->mtTime = 0; prm->dblTempo = 0.123456; - LIST_FOR_EACH_ENTRY(item, &This->Items, DMUS_PRIVATE_TEMPO_ITEM, entry) { - if (item->item.lTime <= time) { - MUSIC_TIME ofs = item->item.lTime - time; + for (i = 0; i < This->count; i++) { + if (This->items[i].lTime <= time) { + MUSIC_TIME ofs = This->items[i].lTime - time; if (ofs > prm->mtTime) { prm->mtTime = ofs; - prm->dblTempo = item->item.dblTempo; + prm->dblTempo = This->items[i].dblTempo; } - if (next && item->item.lTime > time && item->item.lTime < *next) - *next = item->item.lTime; + if (next && This->items[i].lTime > time && This->items[i].lTime < *next) + *next = This->items[i].lTime; } } @@ -334,53 +327,35 @@ static inline IDirectMusicTempoTrack *impl_from_IPersistStream(IPersistStream *i return CONTAINING_RECORD(iface, IDirectMusicTempoTrack, dmobj.IPersistStream_iface); } -static HRESULT WINAPI tempo_IPersistStream_Load(IPersistStream *iface, IStream *pStm) +static HRESULT WINAPI tempo_IPersistStream_Load(IPersistStream *iface, IStream *stream) { - IDirectMusicTempoTrack *This = impl_from_IPersistStream(iface); - DMUS_PRIVATE_CHUNK Chunk; - DWORD StreamSize, StreamCount; - LARGE_INTEGER liMove; - DMUS_IO_TEMPO_ITEM item; - LPDMUS_PRIVATE_TEMPO_ITEM pNewItem = NULL; - DWORD nItem = 0; - FIXME("(%p, %p): Loading not fully implemented yet\n", This, pStm); - - IStream_Read (pStm, &Chunk, sizeof(FOURCC)+sizeof(DWORD), NULL); - TRACE_(dmfile)(": %s chunk (size = %d)", debugstr_fourcc (Chunk.fccID), Chunk.dwSize); - switch (Chunk.fccID) { - case DMUS_FOURCC_TEMPO_TRACK: { - TRACE_(dmfile)(": Tempo track\n"); - IStream_Read (pStm, &StreamSize, sizeof(DWORD), NULL); - StreamSize -= sizeof(DWORD); - StreamCount = 0; - TRACE_(dmfile)(" - sizeof(DMUS_IO_TEMPO_ITEM): %u (chunkSize = %u)\n", StreamSize, Chunk.dwSize); - do { - IStream_Read (pStm, &item, sizeof(item), NULL); - ++nItem; - TRACE_(dmfile)("DMUS_IO_TEMPO_ITEM #%d\n", nItem); - TRACE_(dmfile)(" - lTime = %u\n", item.lTime); - TRACE_(dmfile)(" - dblTempo = %g\n", item.dblTempo); - pNewItem = HeapAlloc (GetProcessHeap (), HEAP_ZERO_MEMORY, sizeof(DMUS_PRIVATE_TEMPO_ITEM)); - if (NULL == pNewItem) - return E_OUTOFMEMORY; - - pNewItem->item = item; - list_add_tail (&This->Items, &pNewItem->entry); - pNewItem = NULL; - StreamCount += sizeof(item); - TRACE_(dmfile)(": StreamCount[0] = %d < StreamSize[0] = %d\n", StreamCount, StreamSize); - } while (StreamCount < StreamSize); - break; - } - default: { - TRACE_(dmfile)(": unexpected chunk; loading failed)\n"); - liMove.QuadPart = Chunk.dwSize; - IStream_Seek (pStm, liMove, STREAM_SEEK_CUR, NULL); - return E_FAIL; - } - } + IDirectMusicTempoTrack *This = impl_from_IPersistStream(iface); + struct chunk_entry chunk = {0}; + unsigned int i; + HRESULT hr; - return S_OK; + TRACE("%p, %p\n", This, stream); + + if (!stream) + return E_POINTER; + + if ((hr = stream_get_chunk(stream, &chunk) != S_OK)) + return hr; + if (chunk.id != DMUS_FOURCC_TEMPO_TRACK) + return DMUS_E_UNSUPPORTED_STREAM; + + hr = stream_chunk_get_array(stream, &chunk, (void **)&This->items, &This->count, + sizeof(DMUS_IO_TEMPO_ITEM)); + if (FAILED(hr)) + return hr; + + for (i = 0; i < This->count; i++) { + TRACE_(dmfile)("DMUS_IO_TEMPO_ITEM #%u\n", i); + TRACE_(dmfile)(" - lTime = %u\n", This->items[i].lTime); + TRACE_(dmfile)(" - dblTempo = %g\n", This->items[i].dblTempo); + } + + return S_OK; } static const IPersistStreamVtbl persiststream_vtbl = { @@ -410,7 +385,6 @@ HRESULT WINAPI create_dmtempotrack(REFIID lpcGUID, void **ppobj) dmobject_init(&track->dmobj, &CLSID_DirectMusicTempoTrack, (IUnknown *)&track->IDirectMusicTrack8_iface); track->dmobj.IPersistStream_iface.lpVtbl = &persiststream_vtbl; - list_init(&track->Items); DMIME_LockModule(); hr = IDirectMusicTrack8_QueryInterface(&track->IDirectMusicTrack8_iface, lpcGUID, ppobj);
1
0
0
0
Michael Stefaniuc : dmime: Constify the chunk parameter of stream_skip_chunk().
by Alexandre Julliard
05 Aug '20
05 Aug '20
Module: wine Branch: master Commit: 4fc685a8b787047b5150505277e6d4e2717cc821 URL:
https://source.winehq.org/git/wine.git/?a=commit;h=4fc685a8b787047b51505052…
Author: Michael Stefaniuc <mstefani(a)winehq.org> Date: Wed Aug 5 00:14:31 2020 +0200 dmime: Constify the chunk parameter of stream_skip_chunk(). Signed-off-by: Michael Stefaniuc <mstefani(a)winehq.org> Signed-off-by: Alexandre Julliard <julliard(a)winehq.org> --- dlls/dmime/dmobject.c | 2 +- dlls/dmime/dmobject.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/dlls/dmime/dmobject.c b/dlls/dmime/dmobject.c index 2a0a540fdb..0ef007530f 100644 --- a/dlls/dmime/dmobject.c +++ b/dlls/dmime/dmobject.c @@ -349,7 +349,7 @@ HRESULT stream_get_chunk(IStream *stream, struct chunk_entry *chunk) return S_OK; } -HRESULT stream_skip_chunk(IStream *stream, struct chunk_entry *chunk) +HRESULT stream_skip_chunk(IStream *stream, const struct chunk_entry *chunk) { LARGE_INTEGER end; diff --git a/dlls/dmime/dmobject.h b/dlls/dmime/dmobject.h index fcbb89fd28..a1729c8323 100644 --- a/dlls/dmime/dmobject.h +++ b/dlls/dmime/dmobject.h @@ -33,7 +33,7 @@ struct chunk_entry { HRESULT stream_get_chunk(IStream *stream, struct chunk_entry *chunk) DECLSPEC_HIDDEN; HRESULT stream_next_chunk(IStream *stream, struct chunk_entry *chunk) DECLSPEC_HIDDEN; -HRESULT stream_skip_chunk(IStream *stream, struct chunk_entry *chunk) DECLSPEC_HIDDEN; +HRESULT stream_skip_chunk(IStream *stream, const struct chunk_entry *chunk) DECLSPEC_HIDDEN; HRESULT stream_chunk_get_data(IStream *stream, const struct chunk_entry *chunk, void *data, ULONG size) DECLSPEC_HIDDEN;
1
0
0
0
Brendan Shanks : ntdll: End generated SMBIOS tables with the end-of-table structure.
by Alexandre Julliard
04 Aug '20
04 Aug '20
Module: wine Branch: master Commit: 2b76b9f234eb5d4753337d8b080f2c050daae3ff URL:
https://source.winehq.org/git/wine.git/?a=commit;h=2b76b9f234eb5d4753337d8b…
Author: Brendan Shanks <bshanks(a)codeweavers.com> Date: Tue Aug 4 12:02:48 2020 -0700 ntdll: End generated SMBIOS tables with the end-of-table structure. Signed-off-by: Brendan Shanks <bshanks(a)codeweavers.com> Signed-off-by: Alexandre Julliard <julliard(a)winehq.org> --- dlls/ntdll/unix/system.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/dlls/ntdll/unix/system.c b/dlls/ntdll/unix/system.c index de33d52ed2..4e0841175e 100644 --- a/dlls/ntdll/unix/system.c +++ b/dlls/ntdll/unix/system.c @@ -1263,6 +1263,7 @@ static NTSTATUS get_firmware_info( SYSTEM_FIRMWARE_TABLE_INFORMATION *sfti, ULON struct smbios_system *system; struct smbios_board *board; struct smbios_chassis *chassis; + struct smbios_header *end_of_table; #define S(s) s, sizeof(s) bios_vendor_len = get_smbios_string("/sys/class/dmi/id/bios_vendor", S(bios_vendor)); @@ -1301,6 +1302,9 @@ static NTSTATUS get_firmware_info( SYSTEM_FIRMWARE_TABLE_INFORMATION *sfti, ULON *required_len += sizeof(struct smbios_chassis); *required_len += max(L(chassis_vendor_len) + L(chassis_version_len) + L(chassis_serial_len) + L(chassis_asset_tag_len) + 1, 2); + + *required_len += sizeof(struct smbios_header); + *required_len += 2; #undef L sfti->TableBufferLength = *required_len; @@ -1408,6 +1412,14 @@ static NTSTATUS get_firmware_info( SYSTEM_FIRMWARE_TABLE_INFORMATION *sfti, ULON if (!string_count) *buffer++ = 0; *buffer++ = 0; + end_of_table = (struct smbios_header*)buffer; + end_of_table->type = 127; + end_of_table->length = sizeof(struct smbios_header); + end_of_table->handle = handle_count++; + buffer += sizeof(struct smbios_header); + *buffer++ = 0; + *buffer++ = 0; + return STATUS_SUCCESS; } default:
1
0
0
0
Brendan Shanks : ntdll: Use unique handle numbers in generated SMBIOS tables.
by Alexandre Julliard
04 Aug '20
04 Aug '20
Module: wine Branch: master Commit: 0720c6cfd0b8c863fd22053c2ca750fd982d49d2 URL:
https://source.winehq.org/git/wine.git/?a=commit;h=0720c6cfd0b8c863fd22053c…
Author: Brendan Shanks <bshanks(a)codeweavers.com> Date: Tue Aug 4 12:02:47 2020 -0700 ntdll: Use unique handle numbers in generated SMBIOS tables. Signed-off-by: Brendan Shanks <bshanks(a)codeweavers.com> Signed-off-by: Alexandre Julliard <julliard(a)winehq.org> --- dlls/ntdll/unix/system.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/dlls/ntdll/unix/system.c b/dlls/ntdll/unix/system.c index 3756bd7cee..de33d52ed2 100644 --- a/dlls/ntdll/unix/system.c +++ b/dlls/ntdll/unix/system.c @@ -1257,6 +1257,7 @@ static NTSTATUS get_firmware_info( SYSTEM_FIRMWARE_TABLE_INFORMATION *sfti, ULON size_t chassis_vendor_len, chassis_version_len, chassis_serial_len, chassis_asset_tag_len; char *buffer = (char*)sfti->TableBuffer; BYTE string_count; + BYTE handle_count = 0; struct smbios_prologue *prologue; struct smbios_bios *bios; struct smbios_system *system; @@ -1321,7 +1322,7 @@ static NTSTATUS get_firmware_info( SYSTEM_FIRMWARE_TABLE_INFORMATION *sfti, ULON bios = (struct smbios_bios*)buffer; bios->hdr.type = 0; bios->hdr.length = sizeof(struct smbios_bios); - bios->hdr.handle = 0; + bios->hdr.handle = handle_count++; bios->vendor = bios_vendor_len ? ++string_count : 0; bios->version = bios_version_len ? ++string_count : 0; bios->start = 0; @@ -1346,7 +1347,7 @@ static NTSTATUS get_firmware_info( SYSTEM_FIRMWARE_TABLE_INFORMATION *sfti, ULON system = (struct smbios_system*)buffer; system->hdr.type = 1; system->hdr.length = sizeof(struct smbios_system); - system->hdr.handle = 0; + system->hdr.handle = handle_count++; system->vendor = system_vendor_len ? ++string_count : 0; system->product = system_product_len ? ++string_count : 0; system->version = system_version_len ? ++string_count : 0; @@ -1370,7 +1371,7 @@ static NTSTATUS get_firmware_info( SYSTEM_FIRMWARE_TABLE_INFORMATION *sfti, ULON board = (struct smbios_board*)buffer; board->hdr.type = 2; board->hdr.length = sizeof(struct smbios_board); - board->hdr.handle = 0; + board->hdr.handle = handle_count++; board->vendor = board_vendor_len ? ++string_count : 0; board->product = board_product_len ? ++string_count : 0; board->version = board_version_len ? ++string_count : 0; @@ -1388,7 +1389,7 @@ static NTSTATUS get_firmware_info( SYSTEM_FIRMWARE_TABLE_INFORMATION *sfti, ULON chassis = (struct smbios_chassis*)buffer; chassis->hdr.type = 3; chassis->hdr.length = sizeof(struct smbios_chassis); - chassis->hdr.handle = 0; + chassis->hdr.handle = handle_count++; chassis->vendor = chassis_vendor_len ? ++string_count : 0; chassis->type = atoi(chassis_type); chassis->version = chassis_version_len ? ++string_count : 0;
1
0
0
0
Dmitry Kislyuk : vbscript: Support conversion to string in InStr.
by Alexandre Julliard
04 Aug '20
04 Aug '20
Module: wine Branch: master Commit: 626a38b570188e5c12c86ab628c9b1e576f25e62 URL:
https://source.winehq.org/git/wine.git/?a=commit;h=626a38b570188e5c12c86ab6…
Author: Dmitry Kislyuk <dimaki(a)rocketmail.com> Date: Tue Aug 4 12:14:52 2020 -0500 vbscript: Support conversion to string in InStr. Signed-off-by: Dmitry Kislyuk <dimaki(a)rocketmail.com> Signed-off-by: Jacek Caban <jacek(a)codeweavers.com> Signed-off-by: Alexandre Julliard <julliard(a)winehq.org> --- dlls/vbscript/global.c | 34 ++++++++++++++++++++++------------ dlls/vbscript/tests/api.vbs | 6 ++++++ 2 files changed, 28 insertions(+), 12 deletions(-) diff --git a/dlls/vbscript/global.c b/dlls/vbscript/global.c index e41c2ff7b3..abb4b7933b 100644 --- a/dlls/vbscript/global.c +++ b/dlls/vbscript/global.c @@ -1624,7 +1624,7 @@ static HRESULT Global_InStr(BuiltinDisp *This, VARIANT *args, unsigned args_cnt, { VARIANT *startv, *str1v, *str2v; BSTR str1, str2; - int ret, start = 0, mode = 0; + int ret = -1, start = 0, mode = 0; HRESULT hres; TRACE("args_cnt=%u\n", args_cnt); @@ -1673,23 +1673,33 @@ static HRESULT Global_InStr(BuiltinDisp *This, VARIANT *args, unsigned args_cnt, return return_null(res); if(V_VT(str1v) != VT_BSTR) { - FIXME("Unsupported str1 type %s\n", debugstr_variant(str1v)); - return E_NOTIMPL; + hres = to_string(str1v, &str1); + if(FAILED(hres)) + return hres; } - str1 = V_BSTR(str1v); + else + str1 = V_BSTR(str1v); if(V_VT(str2v) != VT_BSTR) { - FIXME("Unsupported str2 type %s\n", debugstr_variant(str2v)); - return E_NOTIMPL; + hres = to_string(str2v, &str2); + if(FAILED(hres)){ + if(V_VT(str1v) != VT_BSTR) + SysFreeString(str1); + return hres; + } } - str2 = V_BSTR(str2v); - - if(start >= SysStringLen(str1)) - return return_int(res, 0); + else + str2 = V_BSTR(str2v); - ret = FindStringOrdinal(FIND_FROMSTART, str1 + start, SysStringLen(str1)-start, - str2, SysStringLen(str2), mode); + if(start < SysStringLen(str1)) { + ret = FindStringOrdinal(FIND_FROMSTART, str1 + start, SysStringLen(str1)-start, + str2, SysStringLen(str2), mode); + } + if(V_VT(str1v) != VT_BSTR) + SysFreeString(str1); + if(V_VT(str2v) != VT_BSTR) + SysFreeString(str2); return return_int(res, ++ret ? ret+start : 0); } diff --git a/dlls/vbscript/tests/api.vbs b/dlls/vbscript/tests/api.vbs index 3f50195bdc..0c37c3c843 100644 --- a/dlls/vbscript/tests/api.vbs +++ b/dlls/vbscript/tests/api.vbs @@ -429,6 +429,12 @@ Call ok(x = 8, "InStr returned " & x) x = InStr(1, "abc" & Chr(0) & "ABC", Chr(0) & "a", 1) Call ok(x = 4, "InStr returned " & x) +x = InStr(1, 23456, 45, 0) +Call ok(x = 3, "InStr returned " & x) + +x = InStr(1, "23456", 34, 1) +Call ok(x = 2, "InStr returned " & x) + x = InStrRev("bcabcd", "bc") Call ok(x = 4, "InStrRev returned " & x)
1
0
0
0
Dmitry Timoshkov : ieframe: Deactivate UI when processing IOleObject::DoVerb(OLEIVERB_HIDE).
by Alexandre Julliard
04 Aug '20
04 Aug '20
Module: wine Branch: master Commit: a58b7d387894e969a3a612d82bafffe74aba6484 URL:
https://source.winehq.org/git/wine.git/?a=commit;h=a58b7d387894e969a3a612d8…
Author: Dmitry Timoshkov <dmitry(a)baikal.ru> Date: Tue Aug 4 23:56:26 2020 +0800 ieframe: Deactivate UI when processing IOleObject::DoVerb(OLEIVERB_HIDE). This fixes an application that expects to go through full UI activation after IOleObject::DoVerb(OLEIVERB_HIDE) + IOleObject::DoVerb(OLEIVERB_UIACTIVATE). Signed-off-by: Dmitry Timoshkov <dmitry(a)baikal.ru> Signed-off-by: Jacek Caban <jacek(a)codeweavers.com> Signed-off-by: Alexandre Julliard <julliard(a)winehq.org> --- dlls/ieframe/ieframe.h | 2 + dlls/ieframe/oleobject.c | 44 ++++++++---- dlls/ieframe/tests/webbrowser.c | 154 ++++++++++++++++++++++++++++++++++++++-- 3 files changed, 183 insertions(+), 17 deletions(-) Diff:
https://source.winehq.org/git/wine.git/?a=commitdiff;h=a58b7d387894e969a3a6…
1
0
0
0
Gabriel Ivăncescu : msscript.ocx: Implement ScriptControl::get_CodeObject.
by Alexandre Julliard
04 Aug '20
04 Aug '20
Module: wine Branch: master Commit: ad56f0c5c5a7e85558db93b3f180e8be61bd858b URL:
https://source.winehq.org/git/wine.git/?a=commit;h=ad56f0c5c5a7e85558db93b3…
Author: Gabriel Ivăncescu <gabrielopcode(a)gmail.com> Date: Tue Aug 4 17:28:16 2020 +0300 msscript.ocx: Implement ScriptControl::get_CodeObject. Signed-off-by: Gabriel Ivăncescu <gabrielopcode(a)gmail.com> Signed-off-by: Jacek Caban <jacek(a)codeweavers.com> Signed-off-by: Alexandre Julliard <julliard(a)winehq.org> --- dlls/msscript.ocx/msscript.c | 8 +++-- dlls/msscript.ocx/tests/msscript.c | 67 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 73 insertions(+), 2 deletions(-) diff --git a/dlls/msscript.ocx/msscript.c b/dlls/msscript.ocx/msscript.c index 94d6ddac83..3fc4aca2e9 100644 --- a/dlls/msscript.ocx/msscript.c +++ b/dlls/msscript.ocx/msscript.c @@ -1760,8 +1760,12 @@ static HRESULT WINAPI ScriptControl_get_Error(IScriptControl *iface, IScriptErro static HRESULT WINAPI ScriptControl_get_CodeObject(IScriptControl *iface, IDispatch **p) { ScriptControl *This = impl_from_IScriptControl(iface); - FIXME("(%p)->(%p)\n", This, p); - return E_NOTIMPL; + + TRACE("(%p)->(%p)\n", This, p); + + if (!This->host) return E_FAIL; + + return IScriptModule_get_CodeObject(&This->modules[0]->IScriptModule_iface, p); } static HRESULT WINAPI ScriptControl_get_Procedures(IScriptControl *iface, IScriptProcedureCollection **p) diff --git a/dlls/msscript.ocx/tests/msscript.c b/dlls/msscript.ocx/tests/msscript.c index 90f6d19231..352bf78703 100644 --- a/dlls/msscript.ocx/tests/msscript.c +++ b/dlls/msscript.ocx/tests/msscript.c @@ -2883,6 +2883,72 @@ static void test_IScriptControl_get_Modules(void) } } +static void test_IScriptControl_get_CodeObject(void) +{ + IScriptControl *sc; + IDispatch *disp; + HRESULT hr; + BSTR str; + + hr = CoCreateInstance(&CLSID_ScriptControl, NULL, CLSCTX_INPROC_SERVER | CLSCTX_INPROC_HANDLER, + &IID_IScriptControl, (void**)&sc); + ok(hr == S_OK, "Failed to create IScriptControl interface: 0x%08x.\n", hr); + + hr = IScriptControl_get_CodeObject(sc, &disp); + ok(hr == E_FAIL, "IScriptControl_get_CodeObject returned: 0x%08x.\n", hr); + + str = SysAllocString(L"jscript"); + hr = IScriptControl_put_Language(sc, str); + ok(hr == S_OK, "IScriptControl_put_Language failed: 0x%08x.\n", hr); + SysFreeString(str); + + hr = IScriptControl_get_CodeObject(sc, &disp); + ok(hr == S_OK, "IScriptControl_get_CodeObject failed: 0x%08x.\n", hr); + + IDispatch_Release(disp); + IScriptControl_Release(sc); + + if (have_custom_engine) + { + hr = CoCreateInstance(&CLSID_ScriptControl, NULL, CLSCTX_INPROC_SERVER | CLSCTX_INPROC_HANDLER, + &IID_IScriptControl, (void**)&sc); + ok(hr == S_OK, "Failed to create IScriptControl interface: 0x%08x.\n", hr); + + SET_EXPECT(CreateInstance); + SET_EXPECT(SetInterfaceSafetyOptions); + SET_EXPECT(SetScriptSite); + SET_EXPECT(QI_IActiveScriptParse); + SET_EXPECT(InitNew); + + str = SysAllocString(L"testscript"); + hr = IScriptControl_put_Language(sc, str); + ok(hr == S_OK, "IScriptControl_put_Language failed: 0x%08x.\n", hr); + SysFreeString(str); + + CHECK_CALLED(CreateInstance); + CHECK_CALLED(SetInterfaceSafetyOptions); + CHECK_CALLED(SetScriptSite); + CHECK_CALLED(QI_IActiveScriptParse); + CHECK_CALLED(InitNew); + + GetScriptDispatch_expected_name = NULL; + SET_EXPECT(SetScriptState_STARTED); + SET_EXPECT(GetScriptDispatch); + hr = IScriptControl_get_CodeObject(sc, &disp); + ok(hr == S_OK, "IScriptControl_get_CodeObject failed: 0x%08x.\n", hr); + ok(disp == (IDispatch*)&DispatchEx, "unexpected code object %p\n", disp); + CHECK_CALLED(GetScriptDispatch); + CHECK_CALLED(SetScriptState_STARTED); + + IDispatch_Release(disp); + IActiveScriptSite_Release(site); + + SET_EXPECT(Close); + IScriptControl_Release(sc); + CHECK_CALLED(Close); + } +} + START_TEST(msscript) { IUnknown *unk; @@ -2921,6 +2987,7 @@ START_TEST(msscript) test_IScriptControl_ExecuteStatement(); test_IScriptControl_Run(); test_IScriptControl_get_Modules(); + test_IScriptControl_get_CodeObject(); init_registry(FALSE);
1
0
0
0
Gabriel Ivăncescu : msscript.ocx: Implement ScriptModule::get_CodeObject.
by Alexandre Julliard
04 Aug '20
04 Aug '20
Module: wine Branch: master Commit: 77b48fa41a93c3b42a09c2d77065c57a8b02b341 URL:
https://source.winehq.org/git/wine.git/?a=commit;h=77b48fa41a93c3b42a09c2d7…
Author: Gabriel Ivăncescu <gabrielopcode(a)gmail.com> Date: Tue Aug 4 17:28:15 2020 +0300 msscript.ocx: Implement ScriptModule::get_CodeObject. Signed-off-by: Gabriel Ivăncescu <gabrielopcode(a)gmail.com> Signed-off-by: Jacek Caban <jacek(a)codeweavers.com> Signed-off-by: Alexandre Julliard <julliard(a)winehq.org> --- dlls/msscript.ocx/msscript.c | 14 ++++++++++++-- dlls/msscript.ocx/tests/msscript.c | 37 +++++++++++++++++++++++++++++++++++-- 2 files changed, 47 insertions(+), 4 deletions(-) diff --git a/dlls/msscript.ocx/msscript.c b/dlls/msscript.ocx/msscript.c index c36a5db3ec..94d6ddac83 100644 --- a/dlls/msscript.ocx/msscript.c +++ b/dlls/msscript.ocx/msscript.c @@ -828,10 +828,20 @@ static HRESULT WINAPI ScriptModule_get_Name(IScriptModule *iface, BSTR *pbstrNam static HRESULT WINAPI ScriptModule_get_CodeObject(IScriptModule *iface, IDispatch **ppdispObject) { ScriptModule *This = impl_from_IScriptModule(iface); + HRESULT hr; - FIXME("(%p)->(%p)\n", This, ppdispObject); + TRACE("(%p)->(%p)\n", This, ppdispObject); - return E_NOTIMPL; + if (!This->host) return E_FAIL; + + hr = start_script(This->host); + if (FAILED(hr)) return hr; + + hr = get_script_dispatch(This, ppdispObject); + if (FAILED(hr)) return hr; + + IDispatch_AddRef(*ppdispObject); + return hr; } static HRESULT WINAPI ScriptModule_get_Procedures(IScriptModule *iface, IScriptProcedureCollection **ppdispProcedures) diff --git a/dlls/msscript.ocx/tests/msscript.c b/dlls/msscript.ocx/tests/msscript.c index 7f121e0073..90f6d19231 100644 --- a/dlls/msscript.ocx/tests/msscript.c +++ b/dlls/msscript.ocx/tests/msscript.c @@ -549,11 +549,13 @@ static HRESULT WINAPI ActiveScript_AddTypeLib(IActiveScript *iface, REFGUID rgui return E_NOTIMPL; } +static const WCHAR *GetScriptDispatch_expected_name; static HRESULT WINAPI ActiveScript_GetScriptDispatch(IActiveScript *iface, LPCOLESTR pstrItemName, IDispatch **ppdisp) { CHECK_EXPECT(GetScriptDispatch); - ok(!pstrItemName, "pstrItemName not NULL, got %s.\n", wine_dbgstr_w(pstrItemName)); + ok(GetScriptDispatch_expected_name ? (pstrItemName && !lstrcmpW(pstrItemName, GetScriptDispatch_expected_name)) : !pstrItemName, + "pstrItemName not %s, got %s.\n", wine_dbgstr_w(GetScriptDispatch_expected_name), wine_dbgstr_w(pstrItemName)); *ppdisp = (IDispatch*)&DispatchEx; @@ -2234,6 +2236,7 @@ static void test_IScriptControl_Run(void) CHECK_CALLED(QI_IActiveScriptParse); CHECK_CALLED(InitNew); + GetScriptDispatch_expected_name = NULL; SET_EXPECT(SetScriptState_STARTED); SET_EXPECT(GetScriptDispatch); SET_EXPECT(QI_IDispatchEx); @@ -2320,9 +2323,11 @@ static void test_IScriptControl_get_Modules(void) IScriptControl *sc; SAFEARRAY *params; IUnknown *unknown; + IDispatch *disp; ULONG fetched; LONG count; HRESULT hr; + DISPID id; BSTR str; UINT i; @@ -2504,6 +2509,23 @@ static void test_IScriptControl_get_Modules(void) hr = IScriptModuleCollection_get_Item(mods, var, &mod); ok(hr == S_OK, "IScriptModuleCollection_get_Item failed: 0x%08x.\n", hr); + hr = IScriptModule_get_CodeObject(mod, &disp); + ok(hr == S_OK, "IScriptModule_get_CodeObject failed: 0x%08x.\n", hr); + + str = SysAllocString(L"sub"); + hr = IDispatch_GetIDsOfNames(disp, &IID_NULL, &str, 1, LOCALE_USER_DEFAULT, &id); + ok(hr == S_OK, "IDispatch_GetIDsOfNames failed: 0x%08x.\n", hr); + ok(id != -1, "Unexpected id %d.\n", id); + SysFreeString(str); + + str = SysAllocString(L"add"); + hr = IDispatch_GetIDsOfNames(disp, &IID_NULL, &str, 1, LOCALE_USER_DEFAULT, &id); + ok(hr == DISP_E_UNKNOWNNAME, "IDispatch_GetIDsOfNames returned: 0x%08x.\n", hr); + ok(id == -1, "Unexpected id %d.\n", id); + SysFreeString(str); + + IDispatch_Release(disp); + params = SafeArrayCreate(VT_VARIANT, 1, bnd); ok(params != NULL, "Failed to create SafeArray.\n"); @@ -2578,6 +2600,8 @@ static void test_IScriptControl_get_Modules(void) ok(count == 1, "count is not 1, got %d.\n", count); hr = IScriptModule_get_Name(mod, &str); ok(hr == E_FAIL, "IScriptModule_get_Name returned: 0x%08x.\n", hr); + hr = IScriptModule_get_CodeObject(mod, &disp); + ok(hr == E_FAIL, "IScriptModule_get_CodeObject returned: 0x%08x.\n", hr); str = SysAllocString(L"function closed() { }\n"); hr = IScriptModule_AddCode(mod, str); ok(hr == E_FAIL, "IScriptModule_AddCode failed: 0x%08x.\n", hr); @@ -2703,14 +2727,23 @@ static void test_IScriptControl_get_Modules(void) ok(unknown == (IUnknown*)&testdisp, "Unexpected IUnknown for the item: %p.\n", unknown); IUnknown_Release(unknown); + GetScriptDispatch_expected_name = str; SET_EXPECT(SetScriptState_STARTED); + SET_EXPECT(GetScriptDispatch); + hr = IScriptModule_get_CodeObject(mod, &disp); + ok(hr == S_OK, "IScriptModule_get_CodeObject failed: 0x%08x.\n", hr); + ok(disp == (IDispatch*)&DispatchEx, "Unexpected code object %p.\n", disp); + CHECK_CALLED(GetScriptDispatch); + CHECK_CALLED(SetScriptState_STARTED); + GetScriptDispatch_expected_name = NULL; + IDispatch_Release(disp); + SET_EXPECT(ParseScriptText); parse_item_name = str; parse_flags = SCRIPTTEXT_ISVISIBLE; code_str = SysAllocString(L"some code"); hr = IScriptModule_AddCode(mod, code_str); ok(hr == S_OK, "IScriptControl_AddCode failed: 0x%08x.\n", hr); - CHECK_CALLED(SetScriptState_STARTED); CHECK_CALLED(ParseScriptText); SysFreeString(code_str); SysFreeString(str);
1
0
0
0
Gabriel Ivăncescu : msscript.ocx: Implement ScriptModule::Run.
by Alexandre Julliard
04 Aug '20
04 Aug '20
Module: wine Branch: master Commit: a5a7ceba0e63f54812a51f8c03ab193358824fdf URL:
https://source.winehq.org/git/wine.git/?a=commit;h=a5a7ceba0e63f54812a51f8c…
Author: Gabriel Ivăncescu <gabrielopcode(a)gmail.com> Date: Tue Aug 4 17:28:14 2020 +0300 msscript.ocx: Implement ScriptModule::Run. Signed-off-by: Gabriel Ivăncescu <gabrielopcode(a)gmail.com> Signed-off-by: Jacek Caban <jacek(a)codeweavers.com> Signed-off-by: Alexandre Julliard <julliard(a)winehq.org> --- dlls/msscript.ocx/msscript.c | 13 ++++++- dlls/msscript.ocx/tests/msscript.c | 75 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 86 insertions(+), 2 deletions(-) diff --git a/dlls/msscript.ocx/msscript.c b/dlls/msscript.ocx/msscript.c index db5d97db3c..c36a5db3ec 100644 --- a/dlls/msscript.ocx/msscript.c +++ b/dlls/msscript.ocx/msscript.c @@ -885,10 +885,19 @@ static HRESULT WINAPI ScriptModule_ExecuteStatement(IScriptModule *iface, BSTR s static HRESULT WINAPI ScriptModule_Run(IScriptModule *iface, BSTR procedure_name, SAFEARRAY **parameters, VARIANT *res) { ScriptModule *This = impl_from_IScriptModule(iface); + SAFEARRAY *sa; - FIXME("(%p)->(%s %p %p)\n", This, debugstr_w(procedure_name), parameters, res); + TRACE("(%p)->(%s %p %p)\n", This, debugstr_w(procedure_name), parameters, res); - return E_NOTIMPL; + if (!parameters || !res) return E_POINTER; + if (!(sa = *parameters)) return E_POINTER; + + V_VT(res) = VT_EMPTY; + if (sa->cDims == 0) return DISP_E_BADINDEX; + if (!(sa->fFeatures & FADF_VARIANT)) return DISP_E_BADVARTYPE; + if (!This->host) return E_FAIL; + + return run_procedure(This, procedure_name, sa, res); } static const IScriptModuleVtbl ScriptModuleVtbl = { diff --git a/dlls/msscript.ocx/tests/msscript.c b/dlls/msscript.ocx/tests/msscript.c index 9986fbf2f4..7f121e0073 100644 --- a/dlls/msscript.ocx/tests/msscript.c +++ b/dlls/msscript.ocx/tests/msscript.c @@ -2307,11 +2307,18 @@ static void test_IScriptControl_Run(void) static void test_IScriptControl_get_Modules(void) { + SAFEARRAYBOUND bnd[] = { { 2, 0 }, { 2, 0 } }; + LONG idx0_0[] = { 0, 0 }; + LONG idx0_1[] = { 1, 0 }; + LONG idx1_0[] = { 0, 1 }; + LONG idx1_1[] = { 1, 1 }; + IEnumVARIANT *enumvar, *enumvar2; IScriptModuleCollection *mods; VARIANT var, vars[3]; IScriptModule *mod; IScriptControl *sc; + SAFEARRAY *params; IUnknown *unknown; ULONG fetched; LONG count; @@ -2492,6 +2499,69 @@ static void test_IScriptControl_get_Modules(void) ok(FAILED(hr), "IScriptControl_Eval succeeded: 0x%08x.\n", hr); SysFreeString(str); + V_VT(&var) = VT_R4; + V_R4(&var) = 2.0f; + hr = IScriptModuleCollection_get_Item(mods, var, &mod); + ok(hr == S_OK, "IScriptModuleCollection_get_Item failed: 0x%08x.\n", hr); + + params = SafeArrayCreate(VT_VARIANT, 1, bnd); + ok(params != NULL, "Failed to create SafeArray.\n"); + + V_VT(&var) = VT_I4; + V_I4(&var) = 10; + SafeArrayPutElement(params, idx0_0, &var); + V_I4(&var) = 3; + SafeArrayPutElement(params, idx0_1, &var); + + str = SysAllocString(L"sub"); + hr = IScriptModule_Run(mod, str, NULL, &var); + ok(hr == E_POINTER, "IScriptModule_Run returned: 0x%08x.\n", hr); + hr = IScriptModule_Run(mod, str, ¶ms, NULL); + ok(hr == E_POINTER, "IScriptModule_Run returned: 0x%08x.\n", hr); + + hr = IScriptControl_Run(sc, str, ¶ms, &var); + ok(hr == DISP_E_UNKNOWNNAME, "IScriptControl_Run failed: 0x%08x.\n", hr); + hr = IScriptModule_Run(mod, str, ¶ms, &var); + ok(hr == S_OK, "IScriptModule_Run failed: 0x%08x.\n", hr); + ok((V_VT(&var) == VT_I4) && (V_I4(&var) == 7), "V_VT(var) = %d, V_I4(var) = %d.\n", V_VT(&var), V_I4(&var)); + SysFreeString(str); + + str = SysAllocString(L"add"); + hr = IScriptControl_Run(sc, str, ¶ms, &var); + ok(hr == S_OK, "IScriptControl_Run failed: 0x%08x.\n", hr); + ok((V_VT(&var) == VT_I4) && (V_I4(&var) == 13), "V_VT(var) = %d, V_I4(var) = %d.\n", V_VT(&var), V_I4(&var)); + hr = IScriptModule_Run(mod, str, ¶ms, &var); + ok(hr == DISP_E_UNKNOWNNAME, "IScriptModule_Run failed: 0x%08x.\n", hr); + SysFreeString(str); + + SafeArrayDestroy(params); + params = SafeArrayCreate(VT_VARIANT, 2, bnd); + ok(params != NULL, "Failed to create SafeArray.\n"); + + V_VT(&var) = VT_I4; + V_I4(&var) = 49; + SafeArrayPutElement(params, idx0_0, &var); + V_I4(&var) = 7; + SafeArrayPutElement(params, idx0_1, &var); + V_I4(&var) = 30; + SafeArrayPutElement(params, idx1_0, &var); + V_I4(&var) = 25; + SafeArrayPutElement(params, idx1_1, &var); + + str = SysAllocString(L"sub"); + hr = IScriptModule_Run(mod, str, ¶ms, &var); + ok(hr == S_OK, "IScriptModule_Run failed: 0x%08x.\n", hr); + ok((V_VT(&var) == VT_I4) && (V_I4(&var) == 42), "V_VT(var) = %d, V_I4(var) = %d.\n", V_VT(&var), V_I4(&var)); + + params->cDims = 0; + hr = IScriptModule_Run(mod, str, ¶ms, &var); + ok(hr == DISP_E_BADINDEX, "IScriptModule_Run returned: 0x%08x.\n", hr); + ok(V_VT(&var) == VT_EMPTY, "V_VT(var) = %d.\n", V_VT(&var)); + params->cDims = 2; + SysFreeString(str); + + IScriptModule_Release(mod); + /* Grab a module ref and change the language to something valid */ V_VT(&var) = VT_I2; V_I2(&var) = 3; @@ -2515,7 +2585,12 @@ static void test_IScriptControl_get_Modules(void) str = SysAllocString(L"sub closed\nend sub"); hr = IScriptModule_AddCode(mod, str); ok(hr == E_FAIL, "IScriptModule_AddCode failed: 0x%08x.\n", hr); + SysFreeString(str); + str = SysAllocString(L"identifier"); + hr = IScriptModule_Run(mod, str, ¶ms, &var); + ok(hr == E_FAIL, "IScriptModule_Run returned: 0x%08x.\n", hr); IScriptModule_Release(mod); + SafeArrayDestroy(params); SysFreeString(str); /* The enumerator is also invalid */
1
0
0
0
Gabriel Ivăncescu : msscript.ocx: Move ScriptControl::Run implementation into a helper.
by Alexandre Julliard
04 Aug '20
04 Aug '20
Module: wine Branch: master Commit: 5035b82f8ff47229a573416077df1437a4cf4e3c URL:
https://source.winehq.org/git/wine.git/?a=commit;h=5035b82f8ff47229a5734160…
Author: Gabriel Ivăncescu <gabrielopcode(a)gmail.com> Date: Tue Aug 4 17:28:13 2020 +0300 msscript.ocx: Move ScriptControl::Run implementation into a helper. Signed-off-by: Gabriel Ivăncescu <gabrielopcode(a)gmail.com> Signed-off-by: Jacek Caban <jacek(a)codeweavers.com> Signed-off-by: Alexandre Julliard <julliard(a)winehq.org> --- dlls/msscript.ocx/msscript.c | 97 +++++++++++++++++++++++--------------------- 1 file changed, 51 insertions(+), 46 deletions(-) diff --git a/dlls/msscript.ocx/msscript.c b/dlls/msscript.ocx/msscript.c index 352bcab0c2..db5d97db3c 100644 --- a/dlls/msscript.ocx/msscript.c +++ b/dlls/msscript.ocx/msscript.c @@ -314,6 +314,56 @@ static HRESULT parse_script_text(ScriptModule *module, BSTR script_text, DWORD f return hr; } +static HRESULT run_procedure(ScriptModule *module, BSTR procedure_name, SAFEARRAY *args, VARIANT *res) +{ + IDispatchEx *dispex; + IDispatch *disp; + DISPPARAMS dp; + DISPID dispid; + HRESULT hr; + UINT i; + + hr = start_script(module->host); + if (FAILED(hr)) return hr; + + hr = get_script_dispatch(module, &disp); + if (FAILED(hr)) return hr; + + hr = IDispatch_GetIDsOfNames(disp, &IID_NULL, &procedure_name, 1, LOCALE_USER_DEFAULT, &dispid); + if (FAILED(hr)) return hr; + + dp.cArgs = args->rgsabound[0].cElements; + dp.rgdispidNamedArgs = NULL; + dp.cNamedArgs = 0; + dp.rgvarg = heap_alloc(dp.cArgs * sizeof(*dp.rgvarg)); + if (!dp.rgvarg) return E_OUTOFMEMORY; + + hr = SafeArrayLock(args); + if (SUCCEEDED(hr)) + { + /* The DISPPARAMS are stored in reverse order */ + for (i = 0; i < dp.cArgs; i++) + dp.rgvarg[i] = *(VARIANT*)((char*)(args->pvData) + (dp.cArgs - i - 1) * args->cbElements); + SafeArrayUnlock(args); + + hr = IDispatch_QueryInterface(disp, &IID_IDispatchEx, (void**)&dispex); + if (FAILED(hr)) + { + hr = IDispatch_Invoke(disp, dispid, &IID_NULL, LOCALE_USER_DEFAULT, + DISPATCH_METHOD, &dp, res, NULL, NULL); + } + else + { + hr = IDispatchEx_InvokeEx(dispex, dispid, LOCALE_USER_DEFAULT, + DISPATCH_METHOD, &dp, res, NULL, NULL); + IDispatchEx_Release(dispex); + } + } + heap_free(dp.rgvarg); + + return hr; +} + static inline ScriptControl *impl_from_IScriptControl(IScriptControl *iface) { return CONTAINING_RECORD(iface, ScriptControl, IScriptControl_iface); @@ -1782,13 +1832,7 @@ static HRESULT WINAPI ScriptControl_ExecuteStatement(IScriptControl *iface, BSTR static HRESULT WINAPI ScriptControl_Run(IScriptControl *iface, BSTR procedure_name, SAFEARRAY **parameters, VARIANT *res) { ScriptControl *This = impl_from_IScriptControl(iface); - IDispatchEx *dispex; - IDispatch *disp; SAFEARRAY *sa; - DISPPARAMS dp; - DISPID dispid; - HRESULT hr; - UINT i; TRACE("(%p)->(%s %p %p)\n", This, debugstr_w(procedure_name), parameters, res); @@ -1798,48 +1842,9 @@ static HRESULT WINAPI ScriptControl_Run(IScriptControl *iface, BSTR procedure_na V_VT(res) = VT_EMPTY; if (sa->cDims == 0) return DISP_E_BADINDEX; if (!(sa->fFeatures & FADF_VARIANT)) return DISP_E_BADVARTYPE; - - if (!This->host) return E_FAIL; - hr = start_script(This->host); - if (FAILED(hr)) return hr; - - hr = get_script_dispatch(This->modules[0], &disp); - if (FAILED(hr)) return hr; - - hr = IDispatch_GetIDsOfNames(disp, &IID_NULL, &procedure_name, 1, LOCALE_USER_DEFAULT, &dispid); - if (FAILED(hr)) return hr; - - dp.cArgs = sa->rgsabound[0].cElements; - dp.rgdispidNamedArgs = NULL; - dp.cNamedArgs = 0; - dp.rgvarg = heap_alloc(dp.cArgs * sizeof(*dp.rgvarg)); - if (!dp.rgvarg) return E_OUTOFMEMORY; - hr = SafeArrayLock(sa); - if (SUCCEEDED(hr)) - { - /* The DISPPARAMS are stored in reverse order */ - for (i = 0; i < dp.cArgs; i++) - dp.rgvarg[i] = *(VARIANT*)((char*)(sa->pvData) + (dp.cArgs - i - 1) * sa->cbElements); - SafeArrayUnlock(sa); - - hr = IDispatch_QueryInterface(disp, &IID_IDispatchEx, (void**)&dispex); - if (FAILED(hr)) - { - hr = IDispatch_Invoke(disp, dispid, &IID_NULL, LOCALE_USER_DEFAULT, - DISPATCH_METHOD, &dp, res, NULL, NULL); - } - else - { - hr = IDispatchEx_InvokeEx(dispex, dispid, LOCALE_USER_DEFAULT, - DISPATCH_METHOD, &dp, res, NULL, NULL); - IDispatchEx_Release(dispex); - } - } - heap_free(dp.rgvarg); - - return hr; + return run_procedure(This->modules[0], procedure_name, sa, res); } static const IScriptControlVtbl ScriptControlVtbl = {
1
0
0
0
← Newer
1
...
59
60
61
62
63
64
65
...
70
Older →
Jump to page:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
Results per page:
10
25
50
100
200