mirror of
https://github.com/reactos/wine.git
synced 2025-02-16 19:10:35 +00:00
wininet: Add a new NETCON_query_data_available function.
Use it to implement the behaviour where InternetReadFileExA does a synchronous request if the data is available and asynchronous otherwise.
This commit is contained in:
parent
76507d475b
commit
56267608f1
@ -1855,26 +1855,32 @@ BOOL WINAPI InternetReadFileExA(HINTERNET hFile, LPINTERNET_BUFFERSA lpBuffersOu
|
|||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* FIXME: native only does it asynchronously if the amount of data
|
|
||||||
* requested isn't available. See NtReadFile. */
|
|
||||||
/* FIXME: IRF_ASYNC may not be the right thing to test here;
|
/* FIXME: IRF_ASYNC may not be the right thing to test here;
|
||||||
* hIC->hdr.dwFlags & INTERNET_FLAG_ASYNC is probably better, but
|
* hIC->hdr.dwFlags & INTERNET_FLAG_ASYNC is probably better */
|
||||||
* we should implement the above first */
|
|
||||||
if (dwFlags & IRF_ASYNC)
|
if (dwFlags & IRF_ASYNC)
|
||||||
{
|
{
|
||||||
WORKREQUEST workRequest;
|
DWORD dwDataAvailable = 0;
|
||||||
struct WORKREQ_INTERNETREADFILEEXA *req;
|
|
||||||
|
|
||||||
workRequest.asyncproc = AsyncInternetReadFileExProc;
|
if (lpwh->htype == WH_HHTTPREQ)
|
||||||
workRequest.hdr = WININET_AddRef( lpwh );
|
NETCON_query_data_available(&((LPWININETHTTPREQW)lpwh)->netConnection,
|
||||||
req = &workRequest.u.InternetReadFileExA;
|
&dwDataAvailable);
|
||||||
req->lpBuffersOut = lpBuffersOut;
|
|
||||||
|
|
||||||
retval = INTERNET_AsyncCall(&workRequest);
|
if (!dwDataAvailable)
|
||||||
if (!retval) return FALSE;
|
{
|
||||||
|
WORKREQUEST workRequest;
|
||||||
|
struct WORKREQ_INTERNETREADFILEEXA *req;
|
||||||
|
|
||||||
INTERNET_SetLastError(ERROR_IO_PENDING);
|
workRequest.asyncproc = AsyncInternetReadFileExProc;
|
||||||
return FALSE;
|
workRequest.hdr = WININET_AddRef( lpwh );
|
||||||
|
req = &workRequest.u.InternetReadFileExA;
|
||||||
|
req->lpBuffersOut = lpBuffersOut;
|
||||||
|
|
||||||
|
retval = INTERNET_AsyncCall(&workRequest);
|
||||||
|
if (!retval) return FALSE;
|
||||||
|
|
||||||
|
INTERNET_SetLastError(ERROR_IO_PENDING);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
retval = INTERNET_ReadFile(lpwh, lpBuffersOut->lpvBuffer,
|
retval = INTERNET_ReadFile(lpwh, lpBuffersOut->lpvBuffer,
|
||||||
@ -3258,15 +3264,24 @@ BOOL WINAPI InternetQueryDataAvailable( HINTERNET hFile,
|
|||||||
switch (lpwhr->hdr.htype)
|
switch (lpwhr->hdr.htype)
|
||||||
{
|
{
|
||||||
case WH_HHTTPREQ:
|
case WH_HHTTPREQ:
|
||||||
if (!NETCON_recv(&lpwhr->netConnection, buffer,
|
if (NETCON_query_data_available(&lpwhr->netConnection,
|
||||||
|
lpdwNumberOfBytesAvailble))
|
||||||
|
{
|
||||||
|
if (!*lpdwNumberOfBytesAvailble &&
|
||||||
|
!NETCON_recv(&lpwhr->netConnection, buffer,
|
||||||
min(sizeof(buffer), lpwhr->dwContentLength - lpwhr->dwContentRead),
|
min(sizeof(buffer), lpwhr->dwContentLength - lpwhr->dwContentRead),
|
||||||
MSG_PEEK, (int *)lpdwNumberOfBytesAvailble))
|
MSG_PEEK, (int *)lpdwNumberOfBytesAvailble))
|
||||||
|
{
|
||||||
|
INTERNET_SetLastError(ERROR_NO_MORE_FILES);
|
||||||
|
retval = FALSE;
|
||||||
|
}
|
||||||
|
retval = TRUE;
|
||||||
|
}
|
||||||
|
else
|
||||||
{
|
{
|
||||||
INTERNET_SetLastError(ERROR_NO_MORE_FILES);
|
INTERNET_SetLastError(ERROR_NO_MORE_FILES);
|
||||||
retval = FALSE;
|
retval = FALSE;
|
||||||
}
|
}
|
||||||
else
|
|
||||||
retval = TRUE;
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
@ -459,6 +459,7 @@ BOOL NETCON_send(WININET_NETCONNECTION *connection, const void *msg, size_t len,
|
|||||||
int *sent /* out */);
|
int *sent /* out */);
|
||||||
BOOL NETCON_recv(WININET_NETCONNECTION *connection, void *buf, size_t len, int flags,
|
BOOL NETCON_recv(WININET_NETCONNECTION *connection, void *buf, size_t len, int flags,
|
||||||
int *recvd /* out */);
|
int *recvd /* out */);
|
||||||
|
BOOL NETCON_query_data_available(WININET_NETCONNECTION *connection, DWORD *available);
|
||||||
BOOL NETCON_getNextLine(WININET_NETCONNECTION *connection, LPSTR lpszBuffer, LPDWORD dwBuffer);
|
BOOL NETCON_getNextLine(WININET_NETCONNECTION *connection, LPSTR lpszBuffer, LPDWORD dwBuffer);
|
||||||
LPCVOID NETCON_GetCert(WININET_NETCONNECTION *connection);
|
LPCVOID NETCON_GetCert(WININET_NETCONNECTION *connection);
|
||||||
BOOL NETCON_set_timeout(WININET_NETCONNECTION *connection, BOOL send, int value);
|
BOOL NETCON_set_timeout(WININET_NETCONNECTION *connection, BOOL send, int value);
|
||||||
|
@ -33,6 +33,9 @@
|
|||||||
#ifdef HAVE_UNISTD_H
|
#ifdef HAVE_UNISTD_H
|
||||||
# include <unistd.h>
|
# include <unistd.h>
|
||||||
#endif
|
#endif
|
||||||
|
#ifdef HAVE_SYS_IOCTL_H
|
||||||
|
# include <sys/ioctl.h>
|
||||||
|
#endif
|
||||||
#include <stdarg.h>
|
#include <stdarg.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
@ -569,6 +572,35 @@ BOOL NETCON_recv(WININET_NETCONNECTION *connection, void *buf, size_t len, int f
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/******************************************************************************
|
||||||
|
* NETCON_query_data_available
|
||||||
|
* Returns the number of bytes of peeked data plus the number of bytes of
|
||||||
|
* queued, but unread data.
|
||||||
|
*/
|
||||||
|
BOOL NETCON_query_data_available(WININET_NETCONNECTION *connection, DWORD *available)
|
||||||
|
{
|
||||||
|
if (!NETCON_connected(connection))
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
if (connection->peek_msg)
|
||||||
|
*available = connection->peek_len;
|
||||||
|
else
|
||||||
|
*available = 0;
|
||||||
|
#ifdef FIONREAD
|
||||||
|
if (!connection->useSSL)
|
||||||
|
{
|
||||||
|
int unread;
|
||||||
|
int retval = ioctl(connection->socketFD, FIONREAD, &unread);
|
||||||
|
if (!retval)
|
||||||
|
{
|
||||||
|
TRACE("%d bytes of queued, but unread data\n", unread);
|
||||||
|
*available += unread;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
/******************************************************************************
|
/******************************************************************************
|
||||||
* NETCON_getNextLine
|
* NETCON_getNextLine
|
||||||
*/
|
*/
|
||||||
|
Loading…
x
Reference in New Issue
Block a user