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
February 2019
----- 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
1 participants
672 discussions
Start a n
N
ew thread
Piotr Caban : winebuild: Recognize armv7a target.
by Alexandre Julliard
22 Feb '19
22 Feb '19
Module: wine Branch: master Commit: 8b24bc95b9a9a506c1685407aa02c459cfea26d5 URL:
https://source.winehq.org/git/wine.git/?a=commit;h=8b24bc95b9a9a506c1685407…
Author: Piotr Caban <piotr(a)codeweavers.com> Date: Fri Feb 22 16:41:20 2019 +0100 winebuild: Recognize armv7a target. Signed-off-by: Piotr Caban <piotr(a)codeweavers.com> Signed-off-by: Alexandre Julliard <julliard(a)winehq.org> --- tools/widl/widl.c | 1 + tools/winebuild/utils.c | 1 + tools/winegcc/winegcc.c | 1 + 3 files changed, 3 insertions(+) diff --git a/tools/widl/widl.c b/tools/widl/widl.c index 8fe8e4c..0bcf67b 100644 --- a/tools/widl/widl.c +++ b/tools/widl/widl.c @@ -290,6 +290,7 @@ static void set_target( const char *target ) { "armv5", CPU_ARM }, { "armv6", CPU_ARM }, { "armv7", CPU_ARM }, + { "armv7a", CPU_ARM }, { "arm64", CPU_ARM64 }, { "aarch64", CPU_ARM64 }, }; diff --git a/tools/winebuild/utils.c b/tools/winebuild/utils.c index 95da175..78e9645 100644 --- a/tools/winebuild/utils.c +++ b/tools/winebuild/utils.c @@ -66,6 +66,7 @@ static const struct { "armv5", CPU_ARM }, { "armv6", CPU_ARM }, { "armv7", CPU_ARM }, + { "armv7a", CPU_ARM }, { "arm64", CPU_ARM64 }, { "aarch64", CPU_ARM64 }, }; diff --git a/tools/winegcc/winegcc.c b/tools/winegcc/winegcc.c index 71ebf12..54d4368 100644 --- a/tools/winegcc/winegcc.c +++ b/tools/winegcc/winegcc.c @@ -164,6 +164,7 @@ static const struct { "armv5", CPU_ARM }, { "armv6", CPU_ARM }, { "armv7", CPU_ARM }, + { "armv7a", CPU_ARM }, { "arm64", CPU_ARM64 }, { "aarch64", CPU_ARM64 }, };
1
0
0
0
Hans Leidekker : ws2_32: Always set overlapped status in AcceptEx.
by Alexandre Julliard
22 Feb '19
22 Feb '19
Module: wine Branch: master Commit: 72c1cf59a35b3b0ef511fd1e1a718c0d986421a2 URL:
https://source.winehq.org/git/wine.git/?a=commit;h=72c1cf59a35b3b0ef511fd1e…
Author: Hans Leidekker <hans(a)codeweavers.com> Date: Fri Feb 22 13:59:28 2019 +0100 ws2_32: Always set overlapped status in AcceptEx. Signed-off-by: Hans Leidekker <hans(a)codeweavers.com> Signed-off-by: Alexandre Julliard <julliard(a)winehq.org> --- dlls/ws2_32/socket.c | 9 +++++---- dlls/ws2_32/tests/sock.c | 30 ++++++++++++++++++++++++++++++ 2 files changed, 35 insertions(+), 4 deletions(-) diff --git a/dlls/ws2_32/socket.c b/dlls/ws2_32/socket.c index 542dc9a..3755338 100644 --- a/dlls/ws2_32/socket.c +++ b/dlls/ws2_32/socket.c @@ -2822,15 +2822,16 @@ static BOOL WINAPI WS2_AcceptEx(SOCKET listener, SOCKET acceptor, PVOID dest, DW TRACE("(%04lx, %04lx, %p, %d, %d, %d, %p, %p)\n", listener, acceptor, dest, dest_len, local_addr_len, rem_addr_len, received, overlapped); - if (!dest) + if (!overlapped) { - SetLastError(WSAEINVAL); + SetLastError(WSA_INVALID_PARAMETER); return FALSE; } + overlapped->Internal = STATUS_PENDING; - if (!overlapped) + if (!dest) { - SetLastError(WSA_INVALID_PARAMETER); + SetLastError(WSAEINVAL); return FALSE; } diff --git a/dlls/ws2_32/tests/sock.c b/dlls/ws2_32/tests/sock.c index b32d1c0..0c7f736 100644 --- a/dlls/ws2_32/tests/sock.c +++ b/dlls/ws2_32/tests/sock.c @@ -8276,18 +8276,22 @@ static void test_AcceptEx(void) goto end; } + overlapped.Internal = 0xdeadbeef; bret = pAcceptEx(INVALID_SOCKET, acceptor, buffer, sizeof(buffer) - 2*(sizeof(struct sockaddr_in) + 16), sizeof(struct sockaddr_in) + 16, sizeof(struct sockaddr_in) + 16, &bytesReturned, &overlapped); ok(bret == FALSE && WSAGetLastError() == WSAENOTSOCK, "AcceptEx on invalid listening socket " "returned %d + errno %d\n", bret, WSAGetLastError()); + ok(overlapped.Internal == STATUS_PENDING, "got %08x\n", (ULONG)overlapped.Internal); + overlapped.Internal = 0xdeadbeef; bret = pAcceptEx(listener, acceptor, buffer, sizeof(buffer) - 2*(sizeof(struct sockaddr_in) + 16), sizeof(struct sockaddr_in) + 16, sizeof(struct sockaddr_in) + 16, &bytesReturned, &overlapped); todo_wine ok(bret == FALSE && WSAGetLastError() == WSAEINVAL, "AcceptEx on a non-listening socket " "returned %d + errno %d\n", bret, WSAGetLastError()); + ok(overlapped.Internal == STATUS_PENDING, "got %08x\n", (ULONG)overlapped.Internal); iret = listen(listener, 5); if (iret != 0) { @@ -8295,43 +8299,55 @@ todo_wine goto end; } + overlapped.Internal = 0xdeadbeef; bret = pAcceptEx(listener, INVALID_SOCKET, buffer, sizeof(buffer) - 2*(sizeof(struct sockaddr_in) + 16), sizeof(struct sockaddr_in) + 16, sizeof(struct sockaddr_in) + 16, &bytesReturned, &overlapped); ok(bret == FALSE && WSAGetLastError() == WSAENOTSOCK, "AcceptEx on invalid accepting socket " "returned %d + errno %d\n", bret, WSAGetLastError()); + ok(overlapped.Internal == STATUS_PENDING, "got %08x\n", (ULONG)overlapped.Internal); + overlapped.Internal = 0xdeadbeef; bret = pAcceptEx(listener, acceptor, NULL, sizeof(buffer) - 2*(sizeof(struct sockaddr_in) + 16), sizeof(struct sockaddr_in) + 16, sizeof(struct sockaddr_in) + 16, &bytesReturned, &overlapped); todo_wine ok(bret == FALSE && WSAGetLastError() == WSAEFAULT, "AcceptEx on NULL buffer returned %d + errno %d\n", bret, WSAGetLastError()); + ok(overlapped.Internal == STATUS_PENDING, "got %08x\n", (ULONG)overlapped.Internal); + overlapped.Internal = 0xdeadbeef; bret = pAcceptEx(listener, acceptor, buffer, 0, 0, sizeof(struct sockaddr_in) + 16, &bytesReturned, &overlapped); ok(bret == FALSE && WSAGetLastError() == ERROR_IO_PENDING, "AcceptEx on too small local address size returned %d + errno %d\n", bret, WSAGetLastError()); + ok(overlapped.Internal == STATUS_PENDING, "got %08x\n", (ULONG)overlapped.Internal); bret = CancelIo((HANDLE) listener); ok(bret, "Failed to cancel pending accept socket\n"); + overlapped.Internal = 0xdeadbeef; bret = pAcceptEx(listener, acceptor, buffer, 0, sizeof(struct sockaddr_in) + 15, sizeof(struct sockaddr_in) + 16, &bytesReturned, &overlapped); ok(bret == FALSE && WSAGetLastError() == ERROR_IO_PENDING, "AcceptEx on too small local address " "size returned %d + errno %d\n", bret, WSAGetLastError()); + ok(overlapped.Internal == STATUS_PENDING, "got %08x\n", (ULONG)overlapped.Internal); bret = CancelIo((HANDLE) listener); ok(bret, "Failed to cancel pending accept socket\n"); + overlapped.Internal = 0xdeadbeef; bret = pAcceptEx(listener, acceptor, buffer, 0, sizeof(struct sockaddr_in) + 16, 0, &bytesReturned, &overlapped); ok(bret == FALSE && WSAGetLastError() == WSAEFAULT, "AcceptEx on too small remote address size returned %d + errno %d\n", bret, WSAGetLastError()); + ok(overlapped.Internal == STATUS_PENDING, "got %08x\n", (ULONG)overlapped.Internal); + overlapped.Internal = 0xdeadbeef; bret = pAcceptEx(listener, acceptor, buffer, 0, sizeof(struct sockaddr_in) + 16, sizeof(struct sockaddr_in) + 15, &bytesReturned, &overlapped); ok(bret == FALSE && WSAGetLastError() == ERROR_IO_PENDING, "AcceptEx on too small remote address size returned %d + errno %d\n", bret, WSAGetLastError()); + ok(overlapped.Internal == STATUS_PENDING, "got %08x\n", (ULONG)overlapped.Internal); bret = CancelIo((HANDLE) listener); ok(bret, "Failed to cancel pending accept socket\n"); @@ -8351,16 +8367,20 @@ todo_wine goto end; } + overlapped.Internal = 0xdeadbeef; bret = pAcceptEx(listener, acceptor, buffer, 0, sizeof(struct sockaddr_in) + 16, sizeof(struct sockaddr_in) + 16, &bytesReturned, &overlapped); ok(bret == FALSE && WSAGetLastError() == ERROR_IO_PENDING, "AcceptEx returned %d + errno %d\n", bret, WSAGetLastError()); + ok(overlapped.Internal == STATUS_PENDING, "got %08x\n", (ULONG)overlapped.Internal); + overlapped.Internal = 0xdeadbeef; bret = pAcceptEx(listener, acceptor, buffer, 0, sizeof(struct sockaddr_in) + 16, sizeof(struct sockaddr_in) + 16, &bytesReturned, &overlapped); todo_wine ok(bret == FALSE && WSAGetLastError() == WSAEINVAL, "AcceptEx on already pending socket returned %d + errno %d\n", bret, WSAGetLastError()); + ok(overlapped.Internal == STATUS_PENDING, "got %08x\n", (ULONG)overlapped.Internal); if (bret == FALSE && WSAGetLastError() == ERROR_IO_PENDING) { /* We need to cancel this call, otherwise things fail */ bret = CancelIo((HANDLE) listener); @@ -8368,10 +8388,12 @@ todo_wine if (!bret) return; WaitForSingleObject(overlapped.hEvent, 0); + overlapped.Internal = 0xdeadbeef; bret = pAcceptEx(listener, acceptor, buffer, 0, sizeof(struct sockaddr_in) + 16, sizeof(struct sockaddr_in) + 16, &bytesReturned, &overlapped); ok(bret == FALSE && WSAGetLastError() == ERROR_IO_PENDING, "AcceptEx returned %d + errno %d\n", bret, WSAGetLastError()); + ok(overlapped.Internal == STATUS_PENDING, "got %08x\n", (ULONG)overlapped.Internal); } iret = connect(acceptor, (struct sockaddr*)&bindAddress, sizeof(bindAddress)); @@ -8390,17 +8412,21 @@ todo_wine ok(bret, "Failed to cancel failed test. Bailing...\n"); if (!bret) return; + overlapped.Internal = 0xdeadbeef; bret = pAcceptEx(listener, acceptor, buffer, 0, sizeof(struct sockaddr_in) + 16, sizeof(struct sockaddr_in) + 16, &bytesReturned, &overlapped); ok(bret == FALSE && WSAGetLastError() == ERROR_IO_PENDING, "AcceptEx returned %d + errno %d\n", bret, WSAGetLastError()); + ok(overlapped.Internal == STATUS_PENDING, "got %08x\n", (ULONG)overlapped.Internal); } + overlapped.Internal = 0xdeadbeef; iret = connect(connector, (struct sockaddr*)&bindAddress, sizeof(bindAddress)); ok(iret == 0, "connecting to accepting socket failed, error %d\n", WSAGetLastError()); dwret = WaitForSingleObject(overlapped.hEvent, INFINITE); ok(dwret == WAIT_OBJECT_0, "Waiting for accept event failed with %d + errno %d\n", dwret, GetLastError()); + ok(overlapped.Internal == STATUS_SUCCESS, "got %08x\n", (ULONG)overlapped.Internal); bret = GetOverlappedResult((HANDLE)listener, &overlapped, &bytesReturned, FALSE); ok(bret, "GetOverlappedResult failed, error %d\n", GetLastError()); @@ -8422,10 +8448,12 @@ todo_wine skip("could not create connector socket, error %d\n", WSAGetLastError()); goto end; } + overlapped.Internal = 0xdeadbeef; bret = pAcceptEx(listener, acceptor, buffer, 2, sizeof(struct sockaddr_in) + 16, sizeof(struct sockaddr_in) + 16, &bytesReturned, &overlapped); ok(bret == FALSE && WSAGetLastError() == ERROR_IO_PENDING, "AcceptEx returned %d + errno %d\n", bret, WSAGetLastError()); + ok(overlapped.Internal == STATUS_PENDING, "got %08x\n", (ULONG)overlapped.Internal); connect_time = 0xdeadbeef; optlen = sizeof(connect_time); @@ -8445,6 +8473,7 @@ todo_wine dwret = WaitForSingleObject(overlapped.hEvent, 0); ok(dwret == WAIT_TIMEOUT, "Waiting for accept event timeout failed with %d + errno %d\n", dwret, GetLastError()); + ok(overlapped.Internal == STATUS_PENDING, "got %08x\n", (ULONG)overlapped.Internal); iret = getsockname( connector, (struct sockaddr *)&peerAddress, &remoteSize); ok( !iret, "getsockname failed.\n"); @@ -8455,6 +8484,7 @@ todo_wine dwret = WaitForSingleObject(overlapped.hEvent, 1000); ok(dwret == WAIT_OBJECT_0, "Waiting for accept event failed with %d + errno %d\n", dwret, GetLastError()); + ok(overlapped.Internal == STATUS_SUCCESS, "got %08x\n", (ULONG)overlapped.Internal); /* Check if the buffer from AcceptEx is decoded correctly */ pGetAcceptExSockaddrs(buffer, 2, sizeof(struct sockaddr_in) + 16, sizeof(struct sockaddr_in) + 16,
1
0
0
0
Hans Leidekker : secur32: Fix the username fallback in get_key_container_path.
by Alexandre Julliard
22 Feb '19
22 Feb '19
Module: wine Branch: master Commit: ba14773187834d5f6280521bb3c768f7843f246e URL:
https://source.winehq.org/git/wine.git/?a=commit;h=ba14773187834d5f6280521b…
Author: Hans Leidekker <hans(a)codeweavers.com> Date: Fri Feb 22 13:59:27 2019 +0100 secur32: Fix the username fallback in get_key_container_path. Spotted by Sven Baars. Signed-off-by: Hans Leidekker <hans(a)codeweavers.com> Signed-off-by: Alexandre Julliard <julliard(a)winehq.org> --- dlls/secur32/schannel_gnutls.c | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/dlls/secur32/schannel_gnutls.c b/dlls/secur32/schannel_gnutls.c index ea116e81..7c6bb96 100644 --- a/dlls/secur32/schannel_gnutls.c +++ b/dlls/secur32/schannel_gnutls.c @@ -599,13 +599,12 @@ static WCHAR *get_key_container_path(const CERT_CONTEXT *ctx) { static const WCHAR rsabaseW[] = {'S','o','f','t','w','a','r','e','\\','W','i','n','e','\\','C','r','y','p','t','o','\\','R','S','A','\\',0}; - DWORD size; CERT_KEY_CONTEXT keyctx; + DWORD size = sizeof(keyctx), prov_size = 0; CRYPT_KEY_PROV_INFO *prov; WCHAR username[UNLEN + 1], *ret = NULL; DWORD len = ARRAY_SIZE(username); - size = sizeof(keyctx); if (CertGetCertificateContextProperty(ctx, CERT_KEY_CONTEXT_PROP_ID, &keyctx, &size)) { char *str; @@ -623,12 +622,10 @@ static WCHAR *get_key_container_path(const CERT_CONTEXT *ctx) MultiByteToWideChar(CP_ACP, 0, str, -1, ret + strlenW(ret), len); heap_free(str); } - else + else if (CertGetCertificateContextProperty(ctx, CERT_KEY_PROV_INFO_PROP_ID, NULL, &prov_size)) { - size = 0; - if (!CertGetCertificateContextProperty(ctx, CERT_KEY_PROV_INFO_PROP_ID, NULL, &size)) return NULL; - if (!(prov = heap_alloc(size))) return NULL; - if (!CertGetCertificateContextProperty(ctx, CERT_KEY_PROV_INFO_PROP_ID, prov, &size)) + if (!(prov = heap_alloc(prov_size))) return NULL; + if (!CertGetCertificateContextProperty(ctx, CERT_KEY_PROV_INFO_PROP_ID, prov, &prov_size)) { heap_free(prov); return NULL;
1
0
0
0
Dmitry Timoshkov : windowscodecs: Move JPEG frame image data initialization from Frame:: CopyPixels to Decoder::Initialize.
by Alexandre Julliard
22 Feb '19
22 Feb '19
Module: wine Branch: master Commit: 361b0ed5ba4d88c9a18c0ae71da621b077fb4ed7 URL:
https://source.winehq.org/git/wine.git/?a=commit;h=361b0ed5ba4d88c9a18c0ae7…
Author: Dmitry Timoshkov <dmitry(a)baikal.ru> Date: Thu Feb 21 09:24:43 2019 +0300 windowscodecs: Move JPEG frame image data initialization from Frame::CopyPixels to Decoder::Initialize. This is how PNG decoder does things, and it avoids image data corruption in some cases (presumably when libjpeg reuses existing scanline data). Signed-off-by: Dmitry Timoshkov <dmitry(a)baikal.ru> Signed-off-by: Vincent Povirk <vincent(a)codeweavers.com> Signed-off-by: Alexandre Julliard <julliard(a)winehq.org> --- dlls/windowscodecs/jpegformat.c | 152 +++++++++++++++------------------------- 1 file changed, 56 insertions(+), 96 deletions(-) diff --git a/dlls/windowscodecs/jpegformat.c b/dlls/windowscodecs/jpegformat.c index 54f77a7..1df898f 100644 --- a/dlls/windowscodecs/jpegformat.c +++ b/dlls/windowscodecs/jpegformat.c @@ -50,6 +50,7 @@ #include "wincodecs_private.h" +#include "wine/heap.h" #include "wine/debug.h" #include "wine/library.h" @@ -155,6 +156,7 @@ typedef struct { struct jpeg_error_mgr jerr; struct jpeg_source_mgr source_mgr; BYTE source_buffer[1024]; + UINT bpp, stride; BYTE *image_data; CRITICAL_SECTION lock; } JpegDecoder; @@ -303,6 +305,8 @@ static HRESULT WINAPI JpegDecoder_Initialize(IWICBitmapDecoder *iface, IStream * int ret; LARGE_INTEGER seek; jmp_buf jmpbuf; + UINT data_size, i; + TRACE("(%p,%p,%u)\n", iface, pIStream, cacheOptions); EnterCriticalSection(&This->lock); @@ -381,6 +385,55 @@ static HRESULT WINAPI JpegDecoder_Initialize(IWICBitmapDecoder *iface, IStream * return E_FAIL; } + if (This->cinfo.out_color_space == JCS_GRAYSCALE) This->bpp = 8; + else if (This->cinfo.out_color_space == JCS_CMYK) This->bpp = 32; + else This->bpp = 24; + + This->stride = (This->bpp * This->cinfo.output_width + 7) / 8; + data_size = This->stride * This->cinfo.output_height; + + This->image_data = heap_alloc(data_size); + if (!This->image_data) + { + LeaveCriticalSection(&This->lock); + return E_OUTOFMEMORY; + } + + while (This->cinfo.output_scanline < This->cinfo.output_height) + { + UINT first_scanline = This->cinfo.output_scanline; + UINT max_rows; + JSAMPROW out_rows[4]; + JDIMENSION ret; + + max_rows = min(This->cinfo.output_height-first_scanline, 4); + for (i=0; i<max_rows; i++) + out_rows[i] = This->image_data + This->stride * (first_scanline+i); + + ret = pjpeg_read_scanlines(&This->cinfo, out_rows, max_rows); + if (ret == 0) + { + ERR("read_scanlines failed\n"); + LeaveCriticalSection(&This->lock); + return E_FAIL; + } + } + + if (This->bpp == 24) + { + /* libjpeg gives us RGB data and we want BGR, so byteswap the data */ + reverse_bgr8(3, This->image_data, + This->cinfo.output_width, This->cinfo.output_height, + This->stride); + } + + if (This->cinfo.out_color_space == JCS_CMYK && This->cinfo.saw_Adobe_marker) + { + /* Adobe JPEG's have inverted CMYK data. */ + for (i=0; i<data_size; i++) + This->image_data[i] ^= 0xff; + } + This->initialized = TRUE; LeaveCriticalSection(&This->lock); @@ -590,104 +643,11 @@ static HRESULT WINAPI JpegDecoder_Frame_CopyPixels(IWICBitmapFrameDecode *iface, const WICRect *prc, UINT cbStride, UINT cbBufferSize, BYTE *pbBuffer) { JpegDecoder *This = impl_from_IWICBitmapFrameDecode(iface); - UINT bpp; - UINT stride; - UINT data_size; - UINT max_row_needed; - jmp_buf jmpbuf; - WICRect rect; - TRACE("(%p,%s,%u,%u,%p)\n", iface, debug_wic_rect(prc), cbStride, cbBufferSize, pbBuffer); - - if (!prc) - { - rect.X = 0; - rect.Y = 0; - rect.Width = This->cinfo.output_width; - rect.Height = This->cinfo.output_height; - prc = ▭ - } - else - { - if (prc->X < 0 || prc->Y < 0 || prc->X+prc->Width > This->cinfo.output_width || - prc->Y+prc->Height > This->cinfo.output_height) - return E_INVALIDARG; - } - - if (This->cinfo.out_color_space == JCS_GRAYSCALE) bpp = 8; - else if (This->cinfo.out_color_space == JCS_CMYK) bpp = 32; - else bpp = 24; - - stride = (bpp * This->cinfo.output_width + 7) / 8; - data_size = stride * This->cinfo.output_height; - - max_row_needed = prc->Y + prc->Height; - if (max_row_needed > This->cinfo.output_height) return E_INVALIDARG; - - EnterCriticalSection(&This->lock); - if (!This->image_data) - { - This->image_data = HeapAlloc(GetProcessHeap(), 0, data_size); - if (!This->image_data) - { - LeaveCriticalSection(&This->lock); - return E_OUTOFMEMORY; - } - } - - This->cinfo.client_data = jmpbuf; - - if (setjmp(jmpbuf)) - { - LeaveCriticalSection(&This->lock); - return E_FAIL; - } - - while (max_row_needed > This->cinfo.output_scanline) - { - UINT first_scanline = This->cinfo.output_scanline; - UINT max_rows; - JSAMPROW out_rows[4]; - UINT i; - JDIMENSION ret; - - max_rows = min(This->cinfo.output_height-first_scanline, 4); - for (i=0; i<max_rows; i++) - out_rows[i] = This->image_data + stride * (first_scanline+i); - - ret = pjpeg_read_scanlines(&This->cinfo, out_rows, max_rows); - - if (ret == 0) - { - ERR("read_scanlines failed\n"); - LeaveCriticalSection(&This->lock); - return E_FAIL; - } - - if (bpp == 24) - { - /* libjpeg gives us RGB data and we want BGR, so byteswap the data */ - reverse_bgr8(3, This->image_data + stride * first_scanline, - This->cinfo.output_width, This->cinfo.output_scanline - first_scanline, - stride); - } - - if (This->cinfo.out_color_space == JCS_CMYK && This->cinfo.saw_Adobe_marker) - { - DWORD *pDwordData = (DWORD*) (This->image_data + stride * first_scanline); - DWORD *pDwordDataEnd = (DWORD*) (This->image_data + This->cinfo.output_scanline * stride); - - /* Adobe JPEG's have inverted CMYK data. */ - while(pDwordData < pDwordDataEnd) - *pDwordData++ ^= 0xffffffff; - } - - } - - LeaveCriticalSection(&This->lock); + TRACE("(%p,%s,%u,%u,%p)\n", iface, debug_wic_rect(prc), cbStride, cbBufferSize, pbBuffer); - return copy_pixels(bpp, This->image_data, - This->cinfo.output_width, This->cinfo.output_height, stride, + return copy_pixels(This->bpp, This->image_data, + This->cinfo.output_width, This->cinfo.output_height, This->stride, prc, cbStride, cbBufferSize, pbBuffer); }
1
0
0
0
Michael Stefaniuc : gdiplus: Remove redundant not-NULL checks ( coccinellery).
by Alexandre Julliard
22 Feb '19
22 Feb '19
Module: wine Branch: master Commit: 241335cea22bbedfa1c601b49102c545d6cb445d URL:
https://source.winehq.org/git/wine.git/?a=commit;h=241335cea22bbedfa1c601b4…
Author: Michael Stefaniuc <mstefani(a)winehq.org> Date: Thu Feb 21 20:35:36 2019 +0100 gdiplus: Remove redundant not-NULL checks (coccinellery). Signed-off-by: Michael Stefaniuc <mstefani(a)winehq.org> Signed-off-by: Vincent Povirk <vincent(a)codeweavers.com> Signed-off-by: Alexandre Julliard <julliard(a)winehq.org> --- dlls/gdiplus/graphicspath.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dlls/gdiplus/graphicspath.c b/dlls/gdiplus/graphicspath.c index 76ef1c2..7ec6061 100644 --- a/dlls/gdiplus/graphicspath.c +++ b/dlls/gdiplus/graphicspath.c @@ -1088,13 +1088,13 @@ GpStatus WINGDIPAPI GdipAddPathString(GpPath* path, GDIPCONST WCHAR* string, INT heap_free(backup); return status; } - if (format && format->line_align == StringAlignmentCenter && layoutRect->Y + args.maxY < layoutRect->Height) + if (format->line_align == StringAlignmentCenter && layoutRect->Y + args.maxY < layoutRect->Height) { float inc = layoutRect->Height + layoutRect->Y - args.maxY; inc /= 2; for (i = backup->pathdata.Count; i < path->pathdata.Count; ++i) path->pathdata.Points[i].Y += inc; - } else if (format && format->line_align == StringAlignmentFar) { + } else if (format->line_align == StringAlignmentFar) { float inc = layoutRect->Height + layoutRect->Y - args.maxY; for (i = backup->pathdata.Count; i < path->pathdata.Count; ++i) path->pathdata.Points[i].Y += inc;
1
0
0
0
Sven Baars : gdiplus/tests: Fix a memory leak (Valgrind).
by Alexandre Julliard
22 Feb '19
22 Feb '19
Module: wine Branch: master Commit: 6a6376cd830cd855114d3c4b2ded97bd9ac4716d URL:
https://source.winehq.org/git/wine.git/?a=commit;h=6a6376cd830cd855114d3c4b…
Author: Sven Baars <sven.wine(a)gmail.com> Date: Thu Feb 21 17:18:37 2019 +0100 gdiplus/tests: Fix a memory leak (Valgrind). Signed-off-by: Sven Baars <sven.wine(a)gmail.com> Signed-off-by: Vincent Povirk <vincent(a)codeweavers.com> Signed-off-by: Alexandre Julliard <julliard(a)winehq.org> --- dlls/gdiplus/tests/image.c | 1 + 1 file changed, 1 insertion(+) diff --git a/dlls/gdiplus/tests/image.c b/dlls/gdiplus/tests/image.c index 5aec1c2..60591b0 100644 --- a/dlls/gdiplus/tests/image.c +++ b/dlls/gdiplus/tests/image.c @@ -5482,6 +5482,7 @@ todo_wine GdipFree(palette); GdipDisposeImage((GpImage *)bitmap); + HeapFree(GetProcessHeap(), 0, data); } START_TEST(image)
1
0
0
0
Jacek Caban : server: Return proper object type for mailslot and device files.
by Alexandre Julliard
22 Feb '19
22 Feb '19
Module: wine Branch: master Commit: 6531f79d8d5ff65fba37b431e0b9326cfaa1ffc9 URL:
https://source.winehq.org/git/wine.git/?a=commit;h=6531f79d8d5ff65fba37b431…
Author: Jacek Caban <jacek(a)codeweavers.com> Date: Fri Feb 22 13:14:34 2019 +0100 server: Return proper object type for mailslot and device files. Signed-off-by: Jacek Caban <jacek(a)codeweavers.com> Signed-off-by: Alexandre Julliard <julliard(a)winehq.org> --- dlls/ntdll/tests/om.c | 3 +++ server/device.c | 2 +- server/file.c | 3 +-- server/file.h | 1 + server/mailslot.c | 4 ++-- server/named_pipe.c | 12 ++---------- 6 files changed, 10 insertions(+), 15 deletions(-) diff --git a/dlls/ntdll/tests/om.c b/dlls/ntdll/tests/om.c index 3110dbf..3f627aa 100644 --- a/dlls/ntdll/tests/om.c +++ b/dlls/ntdll/tests/om.c @@ -1500,6 +1500,7 @@ static void test_query_object(void) "name too short %s\n", wine_dbgstr_w(str->Buffer) ); trace( "got %s len %u\n", wine_dbgstr_w(str->Buffer), len ); + test_object_type( handle, "File" ); test_file_info( handle ); pNtClose( handle ); @@ -1858,6 +1859,8 @@ static void test_null_device(void) ok(status == STATUS_SUCCESS, "expected STATUS_SUCCESS, got %08x\n", status); + test_object_type(null, "File"); + SetLastError(0xdeadbeef); ret = WriteFile(null, buf, sizeof(buf), &num_bytes, NULL); ok(!ret, "WriteFile unexpectedly succeeded\n"); diff --git a/server/device.c b/server/device.c index ac7d88f..cae66d4 100644 --- a/server/device.c +++ b/server/device.c @@ -183,7 +183,7 @@ static const struct object_ops device_file_ops = { sizeof(struct device_file), /* size */ device_file_dump, /* dump */ - no_get_type, /* get_type */ + file_get_type, /* get_type */ add_queue, /* add_queue */ remove_queue, /* remove_queue */ default_fd_signaled, /* signaled */ diff --git a/server/file.c b/server/file.c index 8d39f30..7ca650f 100644 --- a/server/file.c +++ b/server/file.c @@ -64,7 +64,6 @@ struct file static unsigned int generic_file_map_access( unsigned int access ); static void file_dump( struct object *obj, int verbose ); -static struct object_type *file_get_type( struct object *obj ); static struct fd *file_get_fd( struct object *obj ); static struct security_descriptor *file_get_sd( struct object *obj ); static int file_set_sd( struct object *obj, const struct security_descriptor *sd, unsigned int set_info ); @@ -269,7 +268,7 @@ static void file_dump( struct object *obj, int verbose ) fprintf( stderr, "File fd=%p\n", file->fd ); } -static struct object_type *file_get_type( struct object *obj ) +struct object_type *file_get_type( struct object *obj ) { static const WCHAR name[] = {'F','i','l','e'}; static const struct unicode_str str = { name, sizeof(name) }; diff --git a/server/file.h b/server/file.h index 6b67866..0621b47 100644 --- a/server/file.h +++ b/server/file.h @@ -146,6 +146,7 @@ extern int get_file_unix_fd( struct file *file ); extern struct file *create_file_for_fd( int fd, unsigned int access, unsigned int sharing ); extern struct file *create_file_for_fd_obj( struct fd *fd, unsigned int access, unsigned int sharing ); extern void file_set_error(void); +extern struct object_type *file_get_type( struct object *obj ); extern struct security_descriptor *mode_to_sd( mode_t mode, const SID *user, const SID *group ); extern mode_t sd_to_mode( const struct security_descriptor *sd, const SID *owner ); diff --git a/server/mailslot.c b/server/mailslot.c index 95308c4..75a397d 100644 --- a/server/mailslot.c +++ b/server/mailslot.c @@ -75,7 +75,7 @@ static const struct object_ops mailslot_ops = { sizeof(struct mailslot), /* size */ mailslot_dump, /* dump */ - no_get_type, /* get_type */ + file_get_type, /* get_type */ add_queue, /* add_queue */ remove_queue, /* remove_queue */ default_fd_signaled, /* signaled */ @@ -131,7 +131,7 @@ static const struct object_ops mail_writer_ops = { sizeof(struct mail_writer), /* size */ mail_writer_dump, /* dump */ - no_get_type, /* get_type */ + file_get_type, /* get_type */ no_add_queue, /* add_queue */ NULL, /* remove_queue */ NULL, /* signaled */ diff --git a/server/named_pipe.c b/server/named_pipe.c index 8c32ef8..101ff63 100644 --- a/server/named_pipe.c +++ b/server/named_pipe.c @@ -134,7 +134,6 @@ static const struct object_ops named_pipe_ops = /* common server and client pipe end functions */ static void pipe_end_destroy( struct object *obj ); -static struct object_type *pipe_end_get_type( struct object *obj ); static enum server_fd_type pipe_end_get_fd_type( struct fd *fd ); static struct fd *pipe_end_get_fd( struct object *obj ); static struct security_descriptor *pipe_end_get_sd( struct object *obj ); @@ -156,7 +155,7 @@ static const struct object_ops pipe_server_ops = { sizeof(struct pipe_server), /* size */ pipe_server_dump, /* dump */ - pipe_end_get_type, /* get_type */ + file_get_type, /* get_type */ add_queue, /* add_queue */ remove_queue, /* remove_queue */ default_fd_signaled, /* signaled */ @@ -197,7 +196,7 @@ static const struct object_ops pipe_client_ops = { sizeof(struct pipe_end), /* size */ pipe_client_dump, /* dump */ - pipe_end_get_type, /* get_type */ + file_get_type, /* get_type */ add_queue, /* add_queue */ remove_queue, /* remove_queue */ default_fd_signaled, /* signaled */ @@ -341,13 +340,6 @@ static void named_pipe_destroy( struct object *obj) free_async_queue( &pipe->waiters ); } -static struct object_type *pipe_end_get_type( struct object *obj ) -{ - static const WCHAR name[] = {'F','i','l','e'}; - static const struct unicode_str str = { name, sizeof(name) }; - return get_object_type( &str ); -} - static struct fd *pipe_end_get_fd( struct object *obj ) { struct pipe_end *pipe_end = (struct pipe_end *) obj;
1
0
0
0
Jacek Caban : server: Support token object type.
by Alexandre Julliard
22 Feb '19
22 Feb '19
Module: wine Branch: master Commit: c55c4ab88c7178f92ca21813ed138a9528f04dad URL:
https://source.winehq.org/git/wine.git/?a=commit;h=c55c4ab88c7178f92ca21813…
Author: Jacek Caban <jacek(a)codeweavers.com> Date: Fri Feb 22 13:14:20 2019 +0100 server: Support token object type. Signed-off-by: Jacek Caban <jacek(a)codeweavers.com> Signed-off-by: Alexandre Julliard <julliard(a)winehq.org> --- dlls/ntdll/tests/om.c | 10 ++++++++++ server/token.c | 10 +++++++++- 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/dlls/ntdll/tests/om.c b/dlls/ntdll/tests/om.c index 516304e..3110dbf 100644 --- a/dlls/ntdll/tests/om.c +++ b/dlls/ntdll/tests/om.c @@ -1348,6 +1348,7 @@ static void test_query_object(void) UNICODE_STRING path, session, *str; char dir[MAX_PATH], tmp_path[MAX_PATH], file1[MAX_PATH + 16]; LARGE_INTEGER size; + BOOL ret; sprintf( tmp_path, "\\Sessions\\%u", NtCurrentTeb()->Peb->SessionId ); pRtlCreateUnicodeStringFromAsciiz( &session, tmp_path ); @@ -1566,6 +1567,15 @@ static void test_query_object(void) test_object_type( GetCurrentThread(), "Thread" ); test_no_file_info( GetCurrentThread() ); + + ret = OpenProcessToken(GetCurrentProcess(), TOKEN_ALL_ACCESS, &handle); + ok(ret, "OpenProcessToken failed: %u\n", GetLastError()); + + test_object_type( handle, "Token" ); + test_no_file_info( handle ); + + pNtClose(handle); + } static void test_type_mismatch(void) diff --git a/server/token.c b/server/token.c index d88f16c..e440d48 100644 --- a/server/token.c +++ b/server/token.c @@ -134,6 +134,7 @@ struct group }; static void token_dump( struct object *obj, int verbose ); +static struct object_type *token_get_type( struct object *obj ); static unsigned int token_map_access( struct object *obj, unsigned int access ); static void token_destroy( struct object *obj ); @@ -141,7 +142,7 @@ static const struct object_ops token_ops = { sizeof(struct token), /* size */ token_dump, /* dump */ - no_get_type, /* get_type */ + token_get_type, /* get_type */ no_add_queue, /* add_queue */ NULL, /* remove_queue */ NULL, /* signaled */ @@ -167,6 +168,13 @@ static void token_dump( struct object *obj, int verbose ) token->token_id.low_part, token->primary, token->impersonation_level ); } +static struct object_type *token_get_type( struct object *obj ) +{ + static const WCHAR name[] = {'T','o','k','e','n'}; + static const struct unicode_str str = { name, sizeof(name) }; + return get_object_type( &str ); +} + static unsigned int token_map_access( struct object *obj, unsigned int access ) { if (access & GENERIC_READ) access |= TOKEN_READ;
1
0
0
0
Jacek Caban : server: Support thread object type.
by Alexandre Julliard
22 Feb '19
22 Feb '19
Module: wine Branch: master Commit: eea7702eb6f9236861fc7ed997c34f59b73d061e URL:
https://source.winehq.org/git/wine.git/?a=commit;h=eea7702eb6f9236861fc7ed9…
Author: Jacek Caban <jacek(a)codeweavers.com> Date: Fri Feb 22 13:14:12 2019 +0100 server: Support thread object type. Signed-off-by: Jacek Caban <jacek(a)codeweavers.com> Signed-off-by: Alexandre Julliard <julliard(a)winehq.org> --- dlls/ntdll/tests/om.c | 3 +++ server/thread.c | 10 +++++++++- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/dlls/ntdll/tests/om.c b/dlls/ntdll/tests/om.c index bc1c6a4..516304e 100644 --- a/dlls/ntdll/tests/om.c +++ b/dlls/ntdll/tests/om.c @@ -1563,6 +1563,9 @@ static void test_query_object(void) test_object_type( GetCurrentProcess(), "Process" ); test_no_file_info( GetCurrentProcess() ); + + test_object_type( GetCurrentThread(), "Thread" ); + test_no_file_info( GetCurrentThread() ); } static void test_type_mismatch(void) diff --git a/server/thread.c b/server/thread.c index 7162fc3..4c3d9c3 100644 --- a/server/thread.c +++ b/server/thread.c @@ -128,6 +128,7 @@ static const struct object_ops thread_apc_ops = /* thread operations */ static void dump_thread( struct object *obj, int verbose ); +static struct object_type *thread_get_type( struct object *obj ); static int thread_signaled( struct object *obj, struct wait_queue_entry *entry ); static unsigned int thread_map_access( struct object *obj, unsigned int access ); static void thread_poll_event( struct fd *fd, int event ); @@ -137,7 +138,7 @@ static const struct object_ops thread_ops = { sizeof(struct thread), /* size */ dump_thread, /* dump */ - no_get_type, /* get_type */ + thread_get_type, /* get_type */ add_queue, /* add_queue */ remove_queue, /* remove_queue */ thread_signaled, /* signaled */ @@ -361,6 +362,13 @@ static void dump_thread( struct object *obj, int verbose ) thread->id, thread->unix_pid, thread->unix_tid, thread->state ); } +static struct object_type *thread_get_type( struct object *obj ) +{ + static const WCHAR name[] = {'T','h','r','e','a','d'}; + static const struct unicode_str str = { name, sizeof(name) }; + return get_object_type( &str ); +} + static int thread_signaled( struct object *obj, struct wait_queue_entry *entry ) { struct thread *mythread = (struct thread *)obj;
1
0
0
0
Jacek Caban : server: Support process object type.
by Alexandre Julliard
22 Feb '19
22 Feb '19
Module: wine Branch: master Commit: 2bb4d24589d5029c767801bbc39f616c309d360a URL:
https://source.winehq.org/git/wine.git/?a=commit;h=2bb4d24589d5029c767801bb…
Author: Jacek Caban <jacek(a)codeweavers.com> Date: Fri Feb 22 13:14:05 2019 +0100 server: Support process object type. Signed-off-by: Jacek Caban <jacek(a)codeweavers.com> Signed-off-by: Alexandre Julliard <julliard(a)winehq.org> --- dlls/ntdll/tests/om.c | 3 +++ server/process.c | 10 +++++++++- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/dlls/ntdll/tests/om.c b/dlls/ntdll/tests/om.c index 9ced706..bc1c6a4 100644 --- a/dlls/ntdll/tests/om.c +++ b/dlls/ntdll/tests/om.c @@ -1560,6 +1560,9 @@ static void test_query_object(void) pNtClose( handle ); } pRtlFreeUnicodeString( &session ); + + test_object_type( GetCurrentProcess(), "Process" ); + test_no_file_info( GetCurrentProcess() ); } static void test_type_mismatch(void) diff --git a/server/process.c b/server/process.c index e55c8a8..77bd1e7 100644 --- a/server/process.c +++ b/server/process.c @@ -60,6 +60,7 @@ static int shutdown_stage; /* current stage in the shutdown process */ /* process operations */ static void process_dump( struct object *obj, int verbose ); +static struct object_type *process_get_type( struct object *obj ); static int process_signaled( struct object *obj, struct wait_queue_entry *entry ); static unsigned int process_map_access( struct object *obj, unsigned int access ); static void process_poll_event( struct fd *fd, int event ); @@ -70,7 +71,7 @@ static const struct object_ops process_ops = { sizeof(struct process), /* size */ process_dump, /* dump */ - no_get_type, /* get_type */ + process_get_type, /* get_type */ add_queue, /* add_queue */ remove_queue, /* remove_queue */ process_signaled, /* signaled */ @@ -630,6 +631,13 @@ static void process_dump( struct object *obj, int verbose ) fprintf( stderr, "Process id=%04x handles=%p\n", process->id, process->handles ); } +static struct object_type *process_get_type( struct object *obj ) +{ + static const WCHAR name[] = {'P','r','o','c','e','s','s'}; + static const struct unicode_str str = { name, sizeof(name) }; + return get_object_type( &str ); +} + static int process_signaled( struct object *obj, struct wait_queue_entry *entry ) { struct process *process = (struct process *)obj;
1
0
0
0
← Newer
1
...
13
14
15
16
17
18
19
...
68
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
Results per page:
10
25
50
100
200