Author: akhaldi Date: Thu Apr 9 13:29:04 2015 New Revision: 67116
URL: http://svn.reactos.org/svn/reactos?rev=67116&view=rev Log: [WINHTTP] Sync with Wine Staging 1.7.37. CORE-9246
Modified: trunk/reactos/dll/win32/winhttp/main.c trunk/reactos/dll/win32/winhttp/net.c trunk/reactos/dll/win32/winhttp/request.c trunk/reactos/dll/win32/winhttp/session.c trunk/reactos/dll/win32/winhttp/winhttp_private.h trunk/reactos/dll/win32/winhttp/winhttp_ros.diff trunk/reactos/media/doc/README.WINE
Modified: trunk/reactos/dll/win32/winhttp/main.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/winhttp/main.c?re... ============================================================================== --- trunk/reactos/dll/win32/winhttp/main.c [iso-8859-1] (original) +++ trunk/reactos/dll/win32/winhttp/main.c [iso-8859-1] Thu Apr 9 13:29:04 2015 @@ -37,6 +37,7 @@ case DLL_PROCESS_DETACH: if (lpv) break; netconn_unload(); + release_typelib(); break; } return TRUE;
Modified: trunk/reactos/dll/win32/winhttp/net.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/winhttp/net.c?rev... ============================================================================== --- trunk/reactos/dll/win32/winhttp/net.c [iso-8859-1] (original) +++ trunk/reactos/dll/win32/winhttp/net.c [iso-8859-1] Thu Apr 9 13:29:04 2015 @@ -733,16 +733,8 @@ if(!netconn_connected(conn)) return 0;
- if(conn->secure) { + if(conn->secure) return conn->peek_len; - }else { -#ifdef FIONREAD - ULONG unread; - - if(!ioctlsocket(conn->socket, FIONREAD, &unread)) - return unread; -#endif - }
return 0; }
Modified: trunk/reactos/dll/win32/winhttp/request.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/winhttp/request.c... ============================================================================== --- trunk/reactos/dll/win32/winhttp/request.c [iso-8859-1] (original) +++ trunk/reactos/dll/win32/winhttp/request.c [iso-8859-1] Thu Apr 9 13:29:04 2015 @@ -167,20 +167,87 @@ NULL /* WINHTTP_QUERY_PASSPORT_CONFIG = 78 */ };
-static DWORD CALLBACK task_thread( LPVOID param ) -{ - task_header_t *task = param; - - task->proc( task ); - - release_object( &task->request->hdr ); - heap_free( task ); - return ERROR_SUCCESS; +static task_header_t *dequeue_task( request_t *request ) +{ + task_header_t *task; + + EnterCriticalSection( &request->task_cs ); + TRACE("%u tasks queued\n", list_count( &request->task_queue )); + task = LIST_ENTRY( list_head( &request->task_queue ), task_header_t, entry ); + if (task) list_remove( &task->entry ); + LeaveCriticalSection( &request->task_cs ); + + TRACE("returning task %p\n", task); + return task; +} + +static DWORD CALLBACK task_proc( LPVOID param ) +{ + request_t *request = param; + HANDLE handles[2]; + + handles[0] = request->task_wait; + handles[1] = request->task_cancel; + for (;;) + { + DWORD err = WaitForMultipleObjects( 2, handles, FALSE, INFINITE ); + switch (err) + { + case WAIT_OBJECT_0: + { + task_header_t *task; + while ((task = dequeue_task( request ))) + { + task->proc( task ); + release_object( &task->request->hdr ); + heap_free( task ); + } + break; + } + case WAIT_OBJECT_0 + 1: + TRACE("exiting\n"); + return 0; + + default: + ERR("wait failed %u (%u)\n", err, GetLastError()); + break; + } + } + return 0; }
static BOOL queue_task( task_header_t *task ) { - return QueueUserWorkItem( task_thread, task, WT_EXECUTELONGFUNCTION ); + request_t *request = task->request; + + if (!request->task_thread) + { + if (!(request->task_wait = CreateEventW( NULL, FALSE, FALSE, NULL ))) return FALSE; + if (!(request->task_cancel = CreateEventW( NULL, FALSE, FALSE, NULL ))) + { + CloseHandle( request->task_wait ); + request->task_wait = NULL; + return FALSE; + } + if (!(request->task_thread = CreateThread( NULL, 0, task_proc, request, 0, NULL ))) + { + CloseHandle( request->task_wait ); + request->task_wait = NULL; + CloseHandle( request->task_cancel ); + request->task_cancel = NULL; + return FALSE; + } + InitializeCriticalSection( &request->task_cs ); + request->task_cs.DebugInfo->Spare[0] = (DWORD_PTR)(__FILE__ ": request.task_cs"); + } + + EnterCriticalSection( &request->task_cs ); + TRACE("queueing task %p\n", task ); + list_add_tail( &request->task_queue, &task->entry ); + LeaveCriticalSection( &request->task_cs ); + + SetEvent( request->task_wait ); + return TRUE; }
static void free_header( header_t *header ) @@ -1792,24 +1859,28 @@ }
/* set the request content length based on the headers */ -static DWORD set_content_length( request_t *request ) +static DWORD set_content_length( request_t *request, DWORD status ) { WCHAR encoding[20]; - DWORD buflen; - - buflen = sizeof(request->content_length); - if (!query_headers( request, WINHTTP_QUERY_CONTENT_LENGTH|WINHTTP_QUERY_FLAG_NUMBER, - NULL, &request->content_length, &buflen, NULL )) - request->content_length = ~0u; - - buflen = sizeof(encoding); - if (query_headers( request, WINHTTP_QUERY_TRANSFER_ENCODING, NULL, encoding, &buflen, NULL ) && - !strcmpiW( encoding, chunkedW )) - { - request->content_length = ~0u; - request->read_chunked = TRUE; - request->read_chunked_size = ~0u; - request->read_chunked_eof = FALSE; + DWORD buflen = sizeof(request->content_length); + + if (status == HTTP_STATUS_NO_CONTENT || status == HTTP_STATUS_NOT_MODIFIED || !strcmpW( request->verb, headW )) + request->content_length = 0; + else + { + if (!query_headers( request, WINHTTP_QUERY_CONTENT_LENGTH|WINHTTP_QUERY_FLAG_NUMBER, + NULL, &request->content_length, &buflen, NULL )) + request->content_length = ~0u; + + buflen = sizeof(encoding); + if (query_headers( request, WINHTTP_QUERY_TRANSFER_ENCODING, NULL, encoding, &buflen, NULL ) && + !strcmpiW( encoding, chunkedW )) + { + request->content_length = ~0u; + request->read_chunked = TRUE; + request->read_chunked_size = ~0u; + request->read_chunked_eof = FALSE; + } } request->content_read = 0; return request->content_length; @@ -1958,6 +2029,7 @@ /* check if we have reached the end of the data to read */ static BOOL end_of_read_data( request_t *request ) { + if (!request->content_length) return TRUE; if (request->read_chunked) return request->read_chunked_eof; if (request->content_length == ~0u) return FALSE; return (request->content_length == request->content_read); @@ -2138,6 +2210,7 @@ DWORD bytes_read; char buffer[2048];
+ refill_buffer( request, FALSE ); for (;;) { if (!read_data( request, buffer, sizeof(buffer), &bytes_read, FALSE ) || !bytes_read) return; @@ -2291,7 +2364,7 @@ query = WINHTTP_QUERY_STATUS_CODE | WINHTTP_QUERY_FLAG_NUMBER; if (!(ret = query_headers( request, query, NULL, &status, &size, NULL ))) break;
- set_content_length( request ); + set_content_length( request, status );
if (!(request->hdr.disable_flags & WINHTTP_DISABLE_COOKIES)) record_cookies( request );
@@ -2303,27 +2376,22 @@ if (!(ret = handle_redirect( request, status ))) break;
/* recurse synchronously */ - send_request( request, NULL, 0, request->optional, request->optional_len, 0, 0, FALSE ); - continue; + if ((ret = send_request( request, NULL, 0, request->optional, request->optional_len, 0, 0, FALSE ))) continue; } else if (status == HTTP_STATUS_DENIED || status == HTTP_STATUS_PROXY_AUTH_REQ) { if (request->hdr.disable_flags & WINHTTP_DISABLE_AUTHENTICATION) break;
drain_content( request ); - if (!handle_authorization( request, status )) - { - ret = TRUE; - break; - } + if (!handle_authorization( request, status )) break; + /* recurse synchronously */ - send_request( request, NULL, 0, request->optional, request->optional_len, 0, 0, FALSE ); - continue; + if ((ret = send_request( request, NULL, 0, request->optional, request->optional_len, 0, 0, FALSE ))) continue; } break; }
- if (ret) refill_buffer( request, FALSE ); + if (request->content_length) refill_buffer( request, FALSE );
if (async) { @@ -2387,8 +2455,11 @@
static BOOL query_data_available( request_t *request, DWORD *available, BOOL async ) { - DWORD count = get_available_data( request ); - + DWORD count = 0; + + if (end_of_read_data( request )) goto done; + + count = get_available_data( request ); if (!request->read_chunked) count += netconn_query_data_available( &request->netconn ); if (!count) @@ -2399,6 +2470,7 @@ count += netconn_query_data_available( &request->netconn ); }
+done: if (async) send_callback( &request->hdr, WINHTTP_CALLBACK_STATUS_DATA_AVAILABLE, &count, sizeof(count) ); TRACE("%u bytes available\n", count); if (available) *available = count; @@ -2747,7 +2819,20 @@ ITypeInfo_Release( typeinfo ); } *ret = winhttp_typeinfo[tid]; + ITypeInfo_AddRef(winhttp_typeinfo[tid]); return S_OK; +} + +void release_typelib(void) +{ + unsigned i; + + for (i = 0; i < sizeof(winhttp_typeinfo)/sizeof(*winhttp_typeinfo); i++) + if (winhttp_typeinfo[i]) + ITypeInfo_Release(winhttp_typeinfo[i]); + + if (winhttp_typelib) + ITypeLib_Release(winhttp_typelib); }
static HRESULT WINAPI winhttp_request_GetTypeInfo( @@ -2922,7 +3007,7 @@ request->bytes_read = 0; request->error = ERROR_SUCCESS; request->logon_policy = WINHTTP_AUTOLOGON_SECURITY_LEVEL_MEDIUM; - request->disable_feature = WINHTTP_DISABLE_AUTHENTICATION; + request->disable_feature = 0; request->proxy.dwAccessType = WINHTTP_ACCESS_TYPE_DEFAULT_PROXY; request->proxy.lpszProxy = NULL; request->proxy.lpszProxyBypass = NULL; @@ -2982,7 +3067,7 @@ path[uc.dwUrlPathLength + uc.dwExtraInfoLength] = 0;
if (!(verb = strdupW( method ))) goto error; - if (V_VT( &async ) == VT_BOOL && V_BOOL( &async )) flags |= WINHTTP_FLAG_ASYNC; + if (SUCCEEDED( VariantChangeType( &async, &async, 0, VT_BOOL )) && V_BOOL( &async )) flags |= WINHTTP_FLAG_ASYNC; if (!(hsession = WinHttpOpen( user_agentW, WINHTTP_ACCESS_TYPE_DEFAULT_PROXY, NULL, NULL, flags ))) { err = get_last_error(); @@ -3569,6 +3654,11 @@ if (!body) return E_INVALIDARG;
EnterCriticalSection( &request->cs ); + if (request->state < REQUEST_STATE_SENT) + { + err = ERROR_WINHTTP_CANNOT_CALL_BEFORE_SEND; + goto done; + } if (!(sa = SafeArrayCreateVector( VT_UI1, 0, request->offset ))) { err = ERROR_OUTOFMEMORY; @@ -3595,12 +3685,203 @@ return HRESULT_FROM_WIN32( err ); }
+struct stream +{ + IStream IStream_iface; + LONG refs; + char *data; + ULARGE_INTEGER pos, size; +}; + +static inline struct stream *impl_from_IStream( IStream *iface ) +{ + return CONTAINING_RECORD( iface, struct stream, IStream_iface ); +} + +static HRESULT WINAPI stream_QueryInterface( IStream *iface, REFIID riid, void **obj ) +{ + struct stream *stream = impl_from_IStream( iface ); + + TRACE("%p, %s, %p\n", stream, debugstr_guid(riid), obj); + + if (IsEqualGUID( riid, &IID_IStream ) || IsEqualGUID( riid, &IID_IUnknown )) + { + *obj = iface; + } + else + { + FIXME("interface %s not implemented\n", debugstr_guid(riid)); + return E_NOINTERFACE; + } + IStream_AddRef( iface ); + return S_OK; +} + +static ULONG WINAPI stream_AddRef( IStream *iface ) +{ + struct stream *stream = impl_from_IStream( iface ); + return InterlockedIncrement( &stream->refs ); +} + +static ULONG WINAPI stream_Release( IStream *iface ) +{ + struct stream *stream = impl_from_IStream( iface ); + LONG refs = InterlockedDecrement( &stream->refs ); + if (!refs) + { + heap_free( stream->data ); + heap_free( stream ); + } + return refs; +} + +static HRESULT WINAPI stream_Read( IStream *iface, void *buf, ULONG len, ULONG *read ) +{ + struct stream *stream = impl_from_IStream( iface ); + ULONG size; + + if (stream->pos.QuadPart >= stream->size.QuadPart) + { + *read = 0; + return S_FALSE; + } + + size = min( stream->size.QuadPart - stream->pos.QuadPart, len ); + memcpy( buf, stream->data + stream->pos.QuadPart, size ); + stream->pos.QuadPart += size; + *read = size; + + return S_OK; +} + +static HRESULT WINAPI stream_Write( IStream *iface, const void *buf, ULONG len, ULONG *written ) +{ + FIXME("\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI stream_Seek( IStream *iface, LARGE_INTEGER move, DWORD origin, ULARGE_INTEGER *newpos ) +{ + struct stream *stream = impl_from_IStream( iface ); + + if (origin == STREAM_SEEK_SET) + stream->pos.QuadPart = move.QuadPart; + else if (origin == STREAM_SEEK_CUR) + stream->pos.QuadPart += move.QuadPart; + else if (origin == STREAM_SEEK_END) + stream->pos.QuadPart = stream->size.QuadPart - move.QuadPart; + + if (newpos) newpos->QuadPart = stream->pos.QuadPart; + return S_OK; +} + +static HRESULT WINAPI stream_SetSize( IStream *iface, ULARGE_INTEGER newsize ) +{ + FIXME("\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI stream_CopyTo( IStream *iface, IStream *stream, ULARGE_INTEGER len, ULARGE_INTEGER *read, + ULARGE_INTEGER *written ) +{ + FIXME("\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI stream_Commit( IStream *iface, DWORD flags ) +{ + FIXME("\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI stream_Revert( IStream *iface ) +{ + FIXME("\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI stream_LockRegion( IStream *iface, ULARGE_INTEGER offset, ULARGE_INTEGER len, DWORD locktype ) +{ + FIXME("\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI stream_UnlockRegion( IStream *iface, ULARGE_INTEGER offset, ULARGE_INTEGER len, DWORD locktype ) +{ + FIXME("\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI stream_Stat( IStream *iface, STATSTG *stg, DWORD flag ) +{ + FIXME("\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI stream_Clone( IStream *iface, IStream **stream ) +{ + FIXME("\n"); + return E_NOTIMPL; +} + +static const IStreamVtbl stream_vtbl = +{ + stream_QueryInterface, + stream_AddRef, + stream_Release, + stream_Read, + stream_Write, + stream_Seek, + stream_SetSize, + stream_CopyTo, + stream_Commit, + stream_Revert, + stream_LockRegion, + stream_UnlockRegion, + stream_Stat, + stream_Clone +}; + static HRESULT WINAPI winhttp_request_get_ResponseStream( IWinHttpRequest *iface, VARIANT *body ) { - FIXME("\n"); - return E_NOTIMPL; + struct winhttp_request *request = impl_from_IWinHttpRequest( iface ); + DWORD err = ERROR_SUCCESS; + struct stream *stream; + + TRACE("%p, %p\n", request, body); + + if (!body) return E_INVALIDARG; + + EnterCriticalSection( &request->cs ); + if (request->state < REQUEST_STATE_SENT) + { + err = ERROR_WINHTTP_CANNOT_CALL_BEFORE_SEND; + goto done; + } + if (!(stream = heap_alloc( sizeof(*stream) ))) + { + err = ERROR_OUTOFMEMORY; + goto done; + } + stream->IStream_iface.lpVtbl = &stream_vtbl; + stream->refs = 1; + if (!(stream->data = heap_alloc( request->offset ))) + { + heap_free( stream ); + err = ERROR_OUTOFMEMORY; + goto done; + } + memcpy( stream->data, request->buffer, request->offset ); + stream->pos.QuadPart = 0; + stream->size.QuadPart = request->offset; + V_VT( body ) = VT_UNKNOWN; + V_UNKNOWN( body ) = (IUnknown *)&stream->IStream_iface; + +done: + LeaveCriticalSection( &request->cs ); + return HRESULT_FROM_WIN32( err ); }
static HRESULT WINAPI winhttp_request_get_Option(
Modified: trunk/reactos/dll/win32/winhttp/session.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/winhttp/session.c... ============================================================================== --- trunk/reactos/dll/win32/winhttp/session.c [iso-8859-1] (original) +++ trunk/reactos/dll/win32/winhttp/session.c [iso-8859-1] Thu Apr 9 13:29:04 2015 @@ -42,9 +42,12 @@
void send_callback( object_header_t *hdr, DWORD status, LPVOID info, DWORD buflen ) { - TRACE("%p, 0x%08x, %p, %u\n", hdr, status, info, buflen); - - if (hdr->callback && (hdr->notify_mask & status)) hdr->callback( hdr->handle, hdr->context, status, info, buflen ); + if (hdr->callback && (hdr->notify_mask & status)) + { + TRACE("%p, 0x%08x, %p, %u\n", hdr, status, info, buflen); + hdr->callback( hdr->handle, hdr->context, status, info, buflen ); + TRACE("returning from 0x%08x callback\n", status); + } }
/*********************************************************************** @@ -536,6 +539,15 @@
TRACE("%p\n", request);
+ if (request->task_thread) + { + SetEvent( request->task_cancel ); + WaitForSingleObject( request->task_thread, INFINITE ); + CloseHandle( request->task_thread ); + CloseHandle( request->task_cancel ); + CloseHandle( request->task_wait ); + DeleteCriticalSection( &request->task_cs ); + } release_object( &request->connect->hdr );
destroy_authinfo( request->authinfo ); @@ -1037,6 +1049,7 @@ request->hdr.context = connect->hdr.context; request->hdr.redirect_policy = connect->hdr.redirect_policy; list_init( &request->hdr.children ); + list_init( &request->task_queue );
addref_object( &connect->hdr ); request->connect = connect;
Modified: trunk/reactos/dll/win32/winhttp/winhttp_private.h URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/winhttp/winhttp_p... ============================================================================== --- trunk/reactos/dll/win32/winhttp/winhttp_private.h [iso-8859-1] (original) +++ trunk/reactos/dll/win32/winhttp/winhttp_private.h [iso-8859-1] Thu Apr 9 13:29:04 2015 @@ -209,19 +209,25 @@ BOOL read_chunked_size; /* chunk size remaining */ DWORD read_pos; /* current read position in read_buf */ DWORD read_size; /* valid data size in read_buf */ - char read_buf[4096]; /* buffer for already read but not returned data */ + char read_buf[8192]; /* buffer for already read but not returned data */ header_t *headers; DWORD num_headers; WCHAR **accept_types; DWORD num_accept_types; struct authinfo *authinfo; struct authinfo *proxy_authinfo; + HANDLE task_wait; + HANDLE task_cancel; + HANDLE task_thread; + struct list task_queue; + CRITICAL_SECTION task_cs; } request_t;
typedef struct _task_header_t task_header_t;
struct _task_header_t { + struct list entry; request_t *request; void (*proc)( task_header_t * ); }; @@ -298,6 +304,7 @@ void destroy_authinfo( struct authinfo * ) DECLSPEC_HIDDEN;
extern HRESULT WinHttpRequest_create( void ** ) DECLSPEC_HIDDEN; +void release_typelib( void ) DECLSPEC_HIDDEN;
static inline void *heap_alloc( SIZE_T size ) {
Modified: trunk/reactos/dll/win32/winhttp/winhttp_ros.diff URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/winhttp/winhttp_r... ============================================================================== --- trunk/reactos/dll/win32/winhttp/winhttp_ros.diff [iso-8859-1] (original) +++ trunk/reactos/dll/win32/winhttp/winhttp_ros.diff [iso-8859-1] Thu Apr 9 13:29:04 2015 @@ -1,7 +1,7 @@ -diff -prudN e:\Wine\dlls\winhttp/net.c e:\reactos-clean\dll\win32\winhttp/net.c ---- e:\Wine\dlls\winhttp/net.c 2013-03-16 11:54:52.602606100 +0100 -+++ e:\reactos-clean\dll\win32\winhttp/net.c 2013-05-21 20:25:32.595598100 +0100 -@@ -73,6 +77,7 @@ static CRITICAL_SECTION cs_gethostbyname +diff -pudN e:\wine\dlls\winhttp/net.c dll\win32\winhttp/net.c +--- e:\wine\dlls\winhttp/net.c 2015-02-21 17:13:15.365542100 +0100 ++++ dll\win32\winhttp/net.c 2015-04-09 13:48:12.485050200 +0100 +@@ -73,6 +50,7 @@ static CRITICAL_SECTION cs_gethostbyname #endif
/* translate a unix error code into a winsock error code */ @@ -9,7 +9,7 @@ static int sock_get_error( int err ) { #if !defined(__MINGW32__) && !defined (_MSC_VER) -@@ -138,6 +143,15 @@ static int sock_get_error( int err ) +@@ -138,6 +116,15 @@ static int sock_get_error( int err ) #endif return err; } @@ -23,14 +23,14 @@ +#define ioctlsocket unix_ioctl +#endif
- static DWORD netconn_verify_cert( PCCERT_CONTEXT cert, WCHAR *server, DWORD security_flags ) + static int sock_send(int fd, const void *msg, size_t len, int flags) { -@@ -344,11 +358,17 @@ BOOL netconn_connect( netconn_t *conn, c +@@ -366,11 +353,17 @@ BOOL netconn_connect( netconn_t *conn, c res = sock_get_error( errno ); if (res == WSAEWOULDBLOCK || res == WSAEINPROGRESS) { - struct pollfd pfd; -+ // ReactOS: use select instead of poll ++ /* ReactOS: use select instead of poll */ + fd_set outfd; + struct timeval tv;
@@ -47,58 +47,18 @@ ret = TRUE; else res = sock_get_error( errno ); -@@ -442,7 +462,7 @@ BOOL netconn_secure_connect( netconn_t * - read_buf_size += 1024; - } +diff -pudN e:\wine\dlls\winhttp/request.c dll\win32\winhttp/request.c +--- e:\wine\dlls\winhttp/request.c 2015-02-22 13:25:32.479716600 +0100 ++++ dll\win32\winhttp/request.c 2015-04-09 13:49:32.753638400 +0100 +@@ -1275,6 +1264,7 @@ BOOL WINAPI WinHttpSendRequest( HINTERNE + return ret; + }
-- size = recv(conn->socket, read_buf+in_bufs[0].cbBuffer, read_buf_size-in_bufs[0].cbBuffer, 0); -+ size = recv(conn->socket, (char *)(read_buf+in_bufs[0].cbBuffer), read_buf_size-in_bufs[0].cbBuffer, 0); - if(size < 1) { - WARN("recv error\n"); - status = ERROR_WINHTTP_SECURE_CHANNEL_ERROR; -@@ -754,7 +774,8 @@ BOOL netconn_query_data_available( netco ++#undef ARRAYSIZE + #define ARRAYSIZE(array) (sizeof(array) / sizeof((array)[0]))
- BOOL netconn_get_next_line( netconn_t *conn, char *buffer, DWORD *buflen ) - { -- struct pollfd pfd; -+ // ReactOS: use select instead of poll -+ fd_set infd; - BOOL ret = FALSE; - DWORD recvd = 0; - -@@ -786,19 +807,21 @@ BOOL netconn_get_next_line( netconn_t *c - return ret; - } - -- pfd.fd = conn->socket; -- pfd.events = POLLIN; -+ FD_ZERO(&infd); -+ FD_SET(conn->socket, &infd); -+ - while (recvd < *buflen) - { -- int timeout, res; -- struct timeval tv; -+ int res; -+ struct timeval tv, *ptv; - socklen_t len = sizeof(tv); - - if ((res = getsockopt( conn->socket, SOL_SOCKET, SO_RCVTIMEO, (void*)&tv, &len ) != -1)) -- timeout = tv.tv_sec * 1000 + tv.tv_usec / 1000; -+ ptv = &tv; - else -- timeout = -1; -- if (poll( &pfd, 1, timeout ) > 0) -+ ptv = NULL; -+ -+ if (select( 0, &infd, NULL, NULL, ptv ) > 0) - { - if ((res = recv( conn->socket, &buffer[recvd], 1, 0 )) <= 0) - { -diff -prudN e:\Wine\dlls\winhttp/request.c e:\reactos-clean\dll\win32\winhttp/request.c ---- e:\Wine\dlls\winhttp/request.c 2013-03-16 11:54:52.603606700 +0100 -+++ e:\reactos-clean\dll\win32\winhttp/request.c 2013-05-21 20:05:12.642413600 +0100 -@@ -2254,8 +2260,8 @@ static void free_request( struct winhttp + static const WCHAR basicW[] = {'B','a','s','i','c',0}; +@@ -2722,8 +2712,8 @@ static void free_request( struct winhttp CloseHandle( request->thread ); CloseHandle( request->wait ); CloseHandle( request->cancel ); @@ -109,7 +69,7 @@ heap_free( request->buffer ); heap_free( request->verb ); VariantClear( &request->data ); -@@ -2446,16 +2452,16 @@ static HRESULT WINAPI winhttp_request_Se +@@ -2927,16 +2917,16 @@ static HRESULT WINAPI winhttp_request_Se { case HTTPREQUEST_PROXYSETTING_DEFAULT: request->proxy.dwAccessType = WINHTTP_ACCESS_TYPE_DEFAULT_PROXY; @@ -130,7 +90,7 @@ request->proxy.lpszProxy = NULL; request->proxy.lpszProxyBypass = NULL; break; -@@ -2464,12 +2470,12 @@ static HRESULT WINAPI winhttp_request_Se +@@ -2945,12 +2935,12 @@ static HRESULT WINAPI winhttp_request_Se request->proxy.dwAccessType = WINHTTP_ACCESS_TYPE_NAMED_PROXY; if (V_VT( &proxy_server ) == VT_BSTR) { @@ -145,26 +105,10 @@ request->proxy.lpszProxyBypass = strdupW( V_BSTR( &bypass_list ) ); } break; -diff -prudN e:\Wine\dlls\winhttp/rsrc.rc e:\reactos-clean\dll\win32\winhttp/rsrc.rc ---- e:\Wine\dlls\winhttp/rsrc.rc 2011-11-24 17:55:02.335439900 +0100 -+++ e:\reactos-clean\dll\win32\winhttp/rsrc.rc 2012-07-20 21:40:58.173741700 +0100 -@@ -16,6 +16,12 @@ - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA - */ - -+/* @makedep: winhttp_tlb.tlb */ -+1 TYPELIB winhttp_tlb.tlb -+ -+/* @makedep: winhttp_tlb.rgs */ -+1 WINE_REGISTRY winhttp_tlb.rgs -+ - /* @makedep: pac.js */ - pac.js 40 "pac.js" - -diff -prudN e:\Wine\dlls\winhttp/session.c e:\reactos-clean\dll\win32\winhttp/session.c ---- e:\Wine\dlls\winhttp/session.c 2013-03-16 11:54:52.604607400 +0100 -+++ e:\reactos-clean\dll\win32\winhttp/session.c 2013-05-21 20:19:52.231665900 +0100 -@@ -100,6 +100,9 @@ static void session_destroy( object_head +diff -pudN e:\wine\dlls\winhttp/session.c dll\win32\winhttp/session.c +--- e:\wine\dlls\winhttp/session.c 2015-02-22 13:25:32.480717300 +0100 ++++ dll\win32\winhttp/session.c 2015-04-09 13:50:02.955100200 +0100 +@@ -109,6 +81,9 @@ static void session_destroy( object_head heap_free( session->proxy_username ); heap_free( session->proxy_password ); heap_free( session ); @@ -174,7 +118,7 @@ }
static BOOL session_query_option( object_header_t *hdr, DWORD option, LPVOID buffer, LPDWORD buflen ) -@@ -211,6 +214,11 @@ HINTERNET WINAPI WinHttpOpen( LPCWSTR ag +@@ -220,6 +195,11 @@ HINTERNET WINAPI WinHttpOpen( LPCWSTR ag { session_t *session; HINTERNET handle = NULL; @@ -186,7 +130,7 @@
TRACE("%s, %u, %s, %s, 0x%08x\n", debugstr_w(agent), access, debugstr_w(proxy), debugstr_w(bypass), flags);
-@@ -237,14 +245,14 @@ HINTERNET WINAPI WinHttpOpen( LPCWSTR ag +@@ -246,14 +226,14 @@ HINTERNET WINAPI WinHttpOpen( LPCWSTR ag session->access = info.dwAccessType; if (info.lpszProxy && !(session->proxy_server = strdupW( info.lpszProxy ))) { @@ -205,7 +149,7 @@ goto end; } } -@@ -594,7 +602,7 @@ static WCHAR *blob_to_str( DWORD encodin +@@ -615,7 +595,7 @@ static WCHAR *blob_to_str( DWORD encodin
static BOOL convert_sockaddr( const struct sockaddr *addr, SOCKADDR_STORAGE *addr_storage ) {
Modified: trunk/reactos/media/doc/README.WINE URL: http://svn.reactos.org/svn/reactos/trunk/reactos/media/doc/README.WINE?rev=6... ============================================================================== --- trunk/reactos/media/doc/README.WINE [iso-8859-1] (original) +++ trunk/reactos/media/doc/README.WINE [iso-8859-1] Thu Apr 9 13:29:04 2015 @@ -213,7 +213,7 @@ reactos/dll/win32/windowscodecsext # Synced to Wine-1.7.27 reactos/dll/win32/winemp3.acm # Synced to Wine-1.7.27 reactos/dll/win32/wing32 # Out of sync -reactos/dll/win32/winhttp # Synced to Wine-1.7.27 +reactos/dll/win32/winhttp # Synced to WineStaging-1.7.37 reactos/dll/win32/wininet # Synced to Wine-1.7.27 reactos/dll/win32/winmm # Forked at Wine-20050628 reactos/dll/win32/winmm/midimap # Forked at Wine-20050628