You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
183 lines
4.0 KiB
183 lines
4.0 KiB
/*++
|
|
|
|
Copyright (c) 1996 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
inetapiu.cxx
|
|
|
|
Abstract:
|
|
|
|
Contains WinInet API utility & sub-API functions
|
|
|
|
Contents:
|
|
wInternetQueryDataAvailable
|
|
|
|
Author:
|
|
|
|
Richard L Firth (rfirth) 16-Feb-1996
|
|
|
|
Environment:
|
|
|
|
Win32 user-level
|
|
|
|
Revision History:
|
|
|
|
16-Feb-1996 rfirth
|
|
Created
|
|
|
|
--*/
|
|
|
|
#include <wininetp.h>
|
|
|
|
//
|
|
// functions
|
|
//
|
|
|
|
|
|
BOOL
|
|
wInternetQueryDataAvailable(
|
|
IN LPVOID hFileMapped,
|
|
OUT LPDWORD lpdwNumberOfBytesAvailable,
|
|
IN DWORD dwFlags,
|
|
IN DWORD_PTR dwContext
|
|
)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Part 2 of InternetQueryDataAvailabe. This function is called by the async
|
|
worker thread in order to resume InternetQueryDataAvailable(), and by the
|
|
app as the worker part of the API, post validation
|
|
|
|
We can query available data for handle types that return data, either from
|
|
a socket, or from a cache file:
|
|
|
|
- HTTP request
|
|
- FTP file
|
|
- FTP find
|
|
- FTP find HTML
|
|
- gopher file
|
|
- gopher find
|
|
- gopher find HTML
|
|
|
|
Arguments:
|
|
|
|
hFileMapped - the mapped HINTERNET
|
|
|
|
lpdwNumberOfBytesAvailable - where the number of bytes is returned
|
|
|
|
dwFlags - flags controlling operation
|
|
|
|
dwContext - context value for callbacks
|
|
|
|
Return Value:
|
|
|
|
DWORD
|
|
Success - ERROR_SUCCESS
|
|
|
|
Failure -
|
|
|
|
--*/
|
|
|
|
{
|
|
DEBUG_ENTER((DBG_INET,
|
|
Bool,
|
|
"wInternetQueryDataAvailable",
|
|
"%#x, %#x, %#x, %#x",
|
|
hFileMapped,
|
|
lpdwNumberOfBytesAvailable,
|
|
dwFlags,
|
|
dwContext
|
|
));
|
|
|
|
LPINTERNET_THREAD_INFO lpThreadInfo = InternetGetThreadInfo();
|
|
DWORD error;
|
|
HINTERNET_HANDLE_TYPE handleType;
|
|
|
|
INET_ASSERT(hFileMapped);
|
|
|
|
//
|
|
// as usual, grab the per-thread info block
|
|
//
|
|
|
|
if (lpThreadInfo == NULL) {
|
|
|
|
INET_ASSERT(FALSE);
|
|
|
|
error = ERROR_WINHTTP_INTERNAL_ERROR;
|
|
goto quit;
|
|
}
|
|
|
|
//
|
|
// if this is the async worker thread then set the handle, and
|
|
// last-error info in the per-thread data block before we go any further
|
|
// (we already did this on the sync path)
|
|
//
|
|
|
|
if (lpThreadInfo->IsAsyncWorkerThread) {
|
|
_InternetSetObjectHandle(lpThreadInfo,
|
|
((HANDLE_OBJECT *)hFileMapped)->GetPseudoHandle(),
|
|
hFileMapped
|
|
);
|
|
_InternetClearLastError(lpThreadInfo);
|
|
|
|
//
|
|
// we should only be here in async mode if there was no data immediately
|
|
// available
|
|
//
|
|
|
|
INET_ASSERT(!((INTERNET_HANDLE_OBJECT *)hFileMapped)->IsDataAvailable());
|
|
|
|
}
|
|
|
|
//
|
|
// we copy the number of bytes available to a local variable first, and
|
|
// only update the caller's variable if we succeed
|
|
//
|
|
|
|
DWORD bytesAvailable;
|
|
|
|
//
|
|
// get the current data available
|
|
//
|
|
|
|
error = ((HTTP_REQUEST_HANDLE_OBJECT *)hFileMapped)
|
|
->QueryDataAvailable(&bytesAvailable);
|
|
|
|
quit:
|
|
|
|
BOOL success;
|
|
|
|
if (error == ERROR_SUCCESS) {
|
|
((INTERNET_HANDLE_OBJECT *)hFileMapped)->SetAvailableDataLength(bytesAvailable);
|
|
*lpdwNumberOfBytesAvailable = bytesAvailable;
|
|
success = TRUE;
|
|
|
|
DEBUG_PRINT(INET,
|
|
INFO,
|
|
("%d bytes available\n",
|
|
bytesAvailable
|
|
));
|
|
|
|
DEBUG_PRINT_API(API,
|
|
INFO,
|
|
("*lpdwNumberOfBytesAvailable (%#x) = %d\n",
|
|
lpdwNumberOfBytesAvailable,
|
|
bytesAvailable
|
|
));
|
|
|
|
} else {
|
|
success = FALSE;
|
|
|
|
DEBUG_ERROR(INET, error);
|
|
|
|
}
|
|
|
|
SetLastError(error);
|
|
|
|
DEBUG_LEAVE(success);
|
|
|
|
return success;
|
|
}
|