wininet: Move InternetQueryDataAvailable to vtbl.

This commit is contained in:
Jacek Caban 2008-02-29 12:57:57 +01:00 committed by Alexandre Julliard
parent a7c9fbc65c
commit 3314184597
4 changed files with 81 additions and 80 deletions

View File

@ -1190,6 +1190,7 @@ static const HANDLEHEADERVtbl FTPFILEVtbl = {
NULL, NULL,
NULL, NULL,
FTPFILE_WriteFile, FTPFILE_WriteFile,
NULL,
NULL NULL
}; };
@ -2109,6 +2110,7 @@ static const HANDLEHEADERVtbl FTPSESSIONVtbl = {
FTPSESSION_CloseConnection, FTPSESSION_CloseConnection,
NULL, NULL,
NULL, NULL,
NULL,
NULL NULL
}; };
@ -3194,6 +3196,7 @@ static const HANDLEHEADERVtbl FTPFINDNEXTVtbl = {
NULL, NULL,
NULL, NULL,
NULL, NULL,
NULL,
FTPFINDNEXT_FindNextFileW FTPFINDNEXT_FindNextFileW
}; };

View File

@ -1418,11 +1418,62 @@ static BOOL HTTPREQ_WriteFile(WININETHANDLEHEADER *hdr, const void *buffer, DWOR
return NETCON_send(&lpwhr->netConnection, buffer, size, 0, (LPINT)written); return NETCON_send(&lpwhr->netConnection, buffer, size, 0, (LPINT)written);
} }
static void HTTPREQ_AsyncQueryDataAvailableProc(WORKREQUEST *workRequest)
{
WININETHTTPREQW *req = (WININETHTTPREQW*)workRequest->hdr;
INTERNET_ASYNC_RESULT iar;
char buffer[4048];
TRACE("%p\n", workRequest->hdr);
iar.dwResult = NETCON_recv(&req->netConnection, buffer,
min(sizeof(buffer), req->dwContentLength - req->dwContentRead),
MSG_PEEK, (int *)&iar.dwError);
INTERNET_SendCallback(&req->hdr, req->hdr.dwContext, INTERNET_STATUS_REQUEST_COMPLETE, &iar,
sizeof(INTERNET_ASYNC_RESULT));
}
static DWORD HTTPREQ_QueryDataAvailable(WININETHANDLEHEADER *hdr, DWORD *available, DWORD flags, DWORD_PTR ctx)
{
WININETHTTPREQW *req = (WININETHTTPREQW*)hdr;
BYTE buffer[4048];
BOOL async;
TRACE("(%p %p %x %lx)\n", req, available, flags, ctx);
if(!NETCON_query_data_available(&req->netConnection, available) || *available)
return ERROR_SUCCESS;
/* Even if we are in async mode, we need to determine whether
* there is actually more data available. We do this by trying
* to peek only a single byte in async mode. */
async = (req->lpHttpSession->lpAppInfo->hdr.dwFlags & INTERNET_FLAG_ASYNC) != 0;
if (NETCON_recv(&req->netConnection, buffer,
min(async ? 1 : sizeof(buffer), req->dwContentLength - req->dwContentRead),
MSG_PEEK, (int *)available) && async && *available)
{
WORKREQUEST workRequest;
*available = 0;
workRequest.asyncproc = HTTPREQ_AsyncQueryDataAvailableProc;
workRequest.hdr = WININET_AddRef( &req->hdr );
INTERNET_AsyncCall(&workRequest);
return ERROR_IO_PENDING;
}
return ERROR_SUCCESS;
}
static const HANDLEHEADERVtbl HTTPREQVtbl = { static const HANDLEHEADERVtbl HTTPREQVtbl = {
HTTPREQ_Destroy, HTTPREQ_Destroy,
HTTPREQ_CloseConnection, HTTPREQ_CloseConnection,
HTTPREQ_SetOption, HTTPREQ_SetOption,
HTTPREQ_WriteFile, HTTPREQ_WriteFile,
HTTPREQ_QueryDataAvailable,
NULL NULL
}; };
@ -2948,6 +2999,7 @@ static const HANDLEHEADERVtbl HTTPSESSIONVtbl = {
NULL, NULL,
NULL, NULL,
NULL, NULL,
NULL,
NULL NULL
}; };

View File

@ -476,6 +476,7 @@ static const HANDLEHEADERVtbl APPINFOVtbl = {
NULL, NULL,
NULL, NULL,
NULL, NULL,
NULL,
NULL NULL
}; };
@ -2399,6 +2400,10 @@ static BOOL INET_QueryOptionHelper(BOOL bIsUnicode, HINTERNET hInternet, DWORD d
INTERNET_SetLastError(ERROR_INVALID_PARAMETER); INTERNET_SetLastError(ERROR_INVALID_PARAMETER);
} }
break; break;
case 66:
FIXME("66\n");
bSuccess = TRUE;
break;
default: default:
FIXME("Stub! %d\n", dwOption); FIXME("Stub! %d\n", dwOption);
break; break;
@ -2556,6 +2561,9 @@ BOOL WINAPI InternetSetOptionW(HINTERNET hInternet, DWORD dwOption,
case INTERNET_OPTION_SECURITY_FLAGS: case INTERNET_OPTION_SECURITY_FLAGS:
FIXME("Option INTERNET_OPTION_SECURITY_FLAGS; STUB\n"); FIXME("Option INTERNET_OPTION_SECURITY_FLAGS; STUB\n");
break; break;
case 86:
FIXME("86\n");
break;
default: default:
FIXME("Option %d STUB\n",dwOption); FIXME("Option %d STUB\n",dwOption);
INTERNET_SetLastError(ERROR_INTERNET_INVALID_OPTION); INTERNET_SetLastError(ERROR_INTERNET_INVALID_OPTION);
@ -3400,96 +3408,33 @@ lend:
* INTERNET_STATUS_REQUEST_COMPLETE will be sent when more * INTERNET_STATUS_REQUEST_COMPLETE will be sent when more
* data is available. * data is available.
*/ */
void AsyncInternetQueryDataAvailableProc(WORKREQUEST *workRequest)
{
LPWININETHTTPREQW lpwhr;
INTERNET_ASYNC_RESULT iar;
char buffer[4048];
TRACE("INTERNETQUERYDATAAVAILABLE %p\n", workRequest->hdr);
switch (workRequest->hdr->htype)
{
case WH_HHTTPREQ:
lpwhr = (LPWININETHTTPREQW)workRequest->hdr;
iar.dwResult = NETCON_recv(&lpwhr->netConnection, buffer,
min(sizeof(buffer),
lpwhr->dwContentLength - lpwhr->dwContentRead),
MSG_PEEK, (int *)&iar.dwError);
INTERNET_SendCallback(workRequest->hdr, workRequest->hdr->dwContext,
INTERNET_STATUS_REQUEST_COMPLETE, &iar,
sizeof(INTERNET_ASYNC_RESULT));
break;
default:
FIXME("unsupported file type\n");
break;
}
}
BOOL WINAPI InternetQueryDataAvailable( HINTERNET hFile, BOOL WINAPI InternetQueryDataAvailable( HINTERNET hFile,
LPDWORD lpdwNumberOfBytesAvailble, LPDWORD lpdwNumberOfBytesAvailble,
DWORD dwFlags, DWORD_PTR dwContext) DWORD dwFlags, DWORD_PTR dwContext)
{ {
LPWININETHTTPREQW lpwhr; WININETHANDLEHEADER *hdr;
BOOL retval = FALSE; DWORD res;
char buffer[4048];
lpwhr = (LPWININETHTTPREQW) WININET_GetObject( hFile ); TRACE("(%p %p %x %lx)\n", hFile, lpdwNumberOfBytesAvailble, dwFlags, dwContext);
if (NULL == lpwhr)
{ hdr = WININET_GetObject( hFile );
INTERNET_SetLastError(ERROR_NO_MORE_FILES); if (!hdr) {
INTERNET_SetLastError(ERROR_INVALID_HANDLE);
return FALSE; return FALSE;
} }
TRACE("--> %p %i\n",lpwhr,lpwhr->hdr.htype); if(hdr->vtbl->QueryDataAvailable) {
res = hdr->vtbl->QueryDataAvailable(hdr, lpdwNumberOfBytesAvailble, dwFlags, dwContext);
switch (lpwhr->hdr.htype) }else {
{ WARN("wrong handle\n");
case WH_HHTTPREQ: res = ERROR_INTERNET_INCORRECT_HANDLE_TYPE;
retval = TRUE;
if (NETCON_query_data_available(&lpwhr->netConnection,
lpdwNumberOfBytesAvailble) &&
!*lpdwNumberOfBytesAvailble)
{
/* Even if we are in async mode, we need to determine whether
* there is actually more data available. We do this by trying
* to peek only a single byte in async mode. */
BOOL async = (lpwhr->lpHttpSession->lpAppInfo->hdr.dwFlags & INTERNET_FLAG_ASYNC);
if (NETCON_recv(&lpwhr->netConnection, buffer,
min(async ? 1 : sizeof(buffer),
lpwhr->dwContentLength - lpwhr->dwContentRead),
MSG_PEEK, (int *)lpdwNumberOfBytesAvailble) &&
async && *lpdwNumberOfBytesAvailble)
{
WORKREQUEST workRequest;
*lpdwNumberOfBytesAvailble = 0;
workRequest.asyncproc = AsyncInternetQueryDataAvailableProc;
workRequest.hdr = WININET_AddRef( &lpwhr->hdr );
retval = INTERNET_AsyncCall(&workRequest);
if (!retval)
{
WININET_Release( &lpwhr->hdr );
}
else
{
INTERNET_SetLastError(ERROR_IO_PENDING);
retval = FALSE;
}
}
}
break;
default:
FIXME("unsupported file type\n");
break;
} }
WININET_Release( &lpwhr->hdr );
TRACE("<-- %i\n",retval); WININET_Release(hdr);
return retval;
if(res != ERROR_SUCCESS)
SetLastError(res);
return res == ERROR_SUCCESS;
} }

View File

@ -140,6 +140,7 @@ typedef struct {
void (*CloseConnection)(WININETHANDLEHEADER*); void (*CloseConnection)(WININETHANDLEHEADER*);
DWORD (*SetOption)(WININETHANDLEHEADER*,DWORD,void*,DWORD); DWORD (*SetOption)(WININETHANDLEHEADER*,DWORD,void*,DWORD);
BOOL (*WriteFile)(WININETHANDLEHEADER*,const void*,DWORD,DWORD*); BOOL (*WriteFile)(WININETHANDLEHEADER*,const void*,DWORD,DWORD*);
DWORD (*QueryDataAvailable)(WININETHANDLEHEADER*,DWORD*,DWORD,DWORD_PTR);
DWORD (*FindNextFileW)(WININETHANDLEHEADER*,void*); DWORD (*FindNextFileW)(WININETHANDLEHEADER*,void*);
} HANDLEHEADERVtbl; } HANDLEHEADERVtbl;