windows-nt/Source/XPSP1/NT/shell/lib/inetutil.cpp
2020-09-26 16:20:57 +08:00

147 lines
3.7 KiB
C++

/*****************************************************************************\
FILE: inetutil.cpp
DESCRIPTION:
These are wininet wrappers that fix the error values and wrap functionality.
BryanSt 10/12/2000
Copyright (C) Microsoft Corp 2000-2000. All rights reserved.
\*****************************************************************************/
#include "stock.h"
#pragma hdrstop
#include <wininet.h>
////////////////////////////////
// Wininet/URL Helpers
////////////////////////////////
STDAPI InternetReadFileWrap(HINTERNET hFile, LPVOID pvBuffer, DWORD dwNumberOfBytesToRead, LPDWORD pdwNumberOfBytesRead)
{
HRESULT hr = S_OK;
DWORD dwError = 0;
if (!InternetReadFile(hFile, pvBuffer, dwNumberOfBytesToRead, pdwNumberOfBytesRead))
{
dwError = GetLastError();
hr = HRESULT_FROM_WIN32(dwError);
}
return hr;
}
#define SIZE_COPY_BUFFER (32 * 1024) // 32k
STDAPI InternetReadIntoBSTR(HINTERNET hInternetRead, OUT BSTR * pbstrXML)
{
BYTE byteBuffer[SIZE_COPY_BUFFER];
DWORD cbRead = SIZE_COPY_BUFFER;
DWORD cchSize = 0;
HRESULT hr = S_OK;
*pbstrXML = NULL;
while (SUCCEEDED(hr) && cbRead)
{
hr = InternetReadFileWrap(hInternetRead, byteBuffer, sizeof(byteBuffer), &cbRead);
if (SUCCEEDED(hr) && cbRead)
{
BSTR bstrOld = *pbstrXML;
BSTR bstrEnd;
// The string may not be terminated.
byteBuffer[cbRead] = 0;
cchSize += ARRAYSIZE(byteBuffer);
*pbstrXML = SysAllocStringLen(NULL, cchSize);
if (*pbstrXML)
{
if (bstrOld)
{
StrCpy(*pbstrXML, bstrOld);
}
else
{
(*pbstrXML)[0] = 0;
}
bstrEnd = *pbstrXML + lstrlenW(*pbstrXML);
SHAnsiToUnicode((LPCSTR) byteBuffer, bstrEnd, ARRAYSIZE(byteBuffer));
}
else
{
hr = E_OUTOFMEMORY;
}
SysFreeString(bstrOld);
}
}
return hr;
}
STDAPI InternetOpenWrap(LPCTSTR pszAgent, DWORD dwAccessType, LPCTSTR pszProxy, LPCTSTR pszProxyBypass, DWORD dwFlags, HINTERNET * phFileHandle)
{
HRESULT hr = S_OK;
DWORD dwError = 0;
*phFileHandle = InternetOpen(pszAgent, dwAccessType, pszProxy, pszProxyBypass, dwFlags);
if (!*phFileHandle)
{
dwError = GetLastError();
hr = HRESULT_FROM_WIN32(dwError);
}
return hr;
}
STDAPI InternetOpenUrlWrap(HINTERNET hInternet, LPCTSTR pszUrl, LPCTSTR pszHeaders, DWORD dwHeadersLength, DWORD dwFlags, DWORD_PTR dwContext, HINTERNET * phFileHandle)
{
HRESULT hr = S_OK;
DWORD dwError = 0;
*phFileHandle = InternetOpenUrl(hInternet, pszUrl, pszHeaders, dwHeadersLength, dwFlags, dwContext);
if (!*phFileHandle)
{
dwError = GetLastError();
hr = HRESULT_FROM_WIN32(dwError);
}
return hr;
}
#define SZ_WININET_AGENT_FILEASSOC TEXT("Microsoft File Association Lookup")
STDAPI DownloadUrl(LPCTSTR pszUrl, BSTR * pbstrXML)
{
HRESULT hr = E_OUTOFMEMORY;
HINTERNET hInternetSession;
hr = InternetOpenWrap(SZ_WININET_AGENT_FILEASSOC, PRE_CONFIG_INTERNET_ACCESS, NULL, NULL, 0, &hInternetSession);
if (SUCCEEDED(hr))
{
HINTERNET hOpenUrlSession;
hr = InternetOpenUrlWrap(hInternetSession, pszUrl, NULL, 0, INTERNET_FLAG_NO_UI, NULL, &hOpenUrlSession);
if (SUCCEEDED(hr))
{
hr = InternetReadIntoBSTR(hOpenUrlSession, pbstrXML);
InternetCloseHandle(hOpenUrlSession);
}
InternetCloseHandle(hInternetSession);
}
return hr;
}