2020-09-30 16:53:55 +02:00

184 lines
4.0 KiB
C++
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*++
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;
}