Source code of Windows XP (NT5)
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.
 
 
 
 
 
 

943 lines
22 KiB

/*****************************************************************************\
* MODULE: inetwrap.c
*
* This module contains wrapper routines to translate internet calls from
* Unicode to Ansi. This is necessary right now since the WININET routines
* do not support Unicode for Windows NT.
*
*
* Copyright (C) 1996-1997 Microsoft Corporation
* Copyright (C) 1996-1997 Hewlett Packard
*
* History:
* 07-Oct-1996 HWP-Guys Initiated port from win95 to winNT
* 15-Jul-1998 v-chrisw Allow safe DelayLoad of wininet.
*
\*****************************************************************************/
#include "precomp.h"
#include "priv.h"
/*****************************************************************************\
* wrapInternetOpen
*
*
\*****************************************************************************/
HINTERNET wrapInternetOpen(
LPCTSTR lpszAgent,
DWORD dwAccess,
LPCTSTR lpszProxyName,
LPCTSTR lpszProxyBypass,
DWORD dwFlags)
{
HINTERNET hRet = NULL;
#ifdef UNICODE
UINT uSize;
LPSTR lpszAnsiAgent = NULL;
LPSTR lpszAnsiProxyName = NULL;
LPSTR lpszAnsiProxyBypass = NULL;
BOOL bRet = TRUE;
if (lpszAgent && (uSize = WCtoMB(lpszAgent, NULL, 0))) {
if (lpszAnsiAgent = new CHAR[uSize])
bRet = WCtoMB(lpszAgent, lpszAnsiAgent, uSize);
else
bRet = FALSE;
}
if (bRet && lpszProxyName && (uSize = WCtoMB(lpszProxyName, NULL, 0))) {
if (lpszAnsiProxyName = new CHAR[uSize])
bRet = WCtoMB(lpszProxyName, lpszAnsiProxyName, uSize);
else
bRet = FALSE;
}
if (bRet && lpszProxyBypass && (uSize = WCtoMB(lpszProxyBypass, NULL, 0))) {
if (lpszAnsiProxyBypass = new CHAR[uSize])
bRet = WCtoMB(lpszProxyBypass, lpszAnsiProxyBypass, uSize);
else
bRet = FALSE;
}
if (bRet) {
__try {
hRet = g_pfnInternetOpen((LPCTSTR)lpszAnsiAgent,
dwAccess,
(LPCTSTR)lpszAnsiProxyName,
(LPCTSTR)lpszAnsiProxyBypass,
dwFlags);
} __except(1) {
DBG_ASSERT(FALSE, (TEXT("inetwrap : InternetOpen exception!")));
hRet = NULL;
}
}
if (lpszAnsiAgent)
delete [](lpszAnsiAgent);
if (lpszAnsiProxyName)
delete [](lpszAnsiProxyName);
if (lpszAnsiProxyBypass)
delete [](lpszAnsiProxyBypass);
#else
__try {
hRet = g_pfnInternetOpen(lpszAgent,
dwAccess,
lpszProxyName,
lpszProxyBypass,
dwFlags);
} __except(1) {
DBG_ASSERT(FALSE, (TEXT("inetwrap : InternetOpen exception!")));
hRet = NULL;
}
#endif
return hRet;
}
/*****************************************************************************\
* wrapInternetOpenUrl
*
*
\*****************************************************************************/
HINTERNET wrapInternetOpenUrl(
HINTERNET hInternet,
LPCTSTR lpszUrl,
LPCTSTR lpszHeaders,
DWORD dwHeaderLen,
DWORD dwFlags,
DWORD_PTR dwContext)
{
HINTERNET hRet = NULL;
#ifdef UNICODE
UINT uSize;
LPSTR lpszAnsiUrl = NULL;
LPSTR lpszAnsiHeaders = NULL;
BOOL bRet = TRUE;
if (lpszUrl && (uSize = WCtoMB(lpszUrl, NULL, 0))) {
if (lpszAnsiUrl = new CHAR[uSize])
bRet = WCtoMB(lpszUrl, lpszAnsiUrl, uSize);
else
bRet = FALSE;
}
if (bRet && lpszHeaders && (uSize = WCtoMB(lpszHeaders, NULL, 0))) {
if (lpszAnsiHeaders = new CHAR[uSize])
bRet = WCtoMB(lpszHeaders, lpszAnsiHeaders, uSize);
else
bRet = FALSE;
}
if (bRet) {
__try {
hRet = g_pfnInternetOpenUrl(hInternet,
(LPCTSTR)lpszAnsiUrl,
(LPCTSTR)lpszAnsiHeaders,
dwHeaderLen,
dwFlags,
dwContext);
} __except(1) {
DBG_ASSERT(FALSE, (TEXT("inetwrap : InternetOpenUrl exception!")));
hRet = NULL;
}
}
if (lpszAnsiUrl)
delete [](lpszAnsiUrl);
if (lpszAnsiHeaders)
delete [](lpszAnsiHeaders);
#else
__try {
hRet = g_pfnInternetOpenUrl(hInternet,
lpszUrl,
lpszHeaders,
dwHeaderLen,
dwFlags,
dwContext);
} __except(1) {
DBG_ASSERT(FALSE, (TEXT("inetwrap : InternetOpenUrl exception!")));
hRet = NULL;
}
#endif
return hRet;
}
/*****************************************************************************\
* wrapInternetConnect
*
*
\*****************************************************************************/
HINTERNET wrapInternetConnect(
HINTERNET hSession,
LPCTSTR lpszServerName,
INTERNET_PORT nServerPort,
LPCTSTR lpszUserName,
LPCTSTR lpszPassword,
DWORD dwService,
DWORD dwFlags,
DWORD_PTR dwContext)
{
HINTERNET hRet = NULL;
#ifdef UNICODE
UINT uSize;
LPSTR lpszAnsiServerName = NULL;
LPSTR lpszAnsiUserName = NULL;
LPSTR lpszAnsiPassword = NULL;
BOOL bRet = TRUE;
if (lpszServerName && (uSize = WCtoMB(lpszServerName, NULL, 0))) {
if (lpszAnsiServerName = new CHAR[uSize])
bRet = WCtoMB(lpszServerName, lpszAnsiServerName, uSize);
else
bRet = FALSE;
}
if (bRet && lpszUserName && (uSize = WCtoMB(lpszUserName, NULL, 0))) {
if (lpszAnsiUserName = new CHAR[uSize])
bRet = WCtoMB(lpszUserName, lpszAnsiUserName, uSize);
else
bRet = FALSE;
}
if (bRet && lpszPassword && (uSize = WCtoMB(lpszPassword, NULL, 0))) {
if (lpszAnsiPassword = new CHAR[uSize])
bRet = WCtoMB(lpszPassword, lpszAnsiPassword, uSize);
else
bRet = FALSE;
}
if (bRet) {
__try {
hRet = g_pfnInternetConnect(hSession,
(LPCTSTR)lpszAnsiServerName,
nServerPort,
(LPCTSTR)lpszAnsiUserName,
(LPCTSTR)lpszAnsiPassword,
dwService,
dwFlags,
dwContext);
} __except(1) {
DBG_ASSERT(FALSE, (TEXT("inetwrap : InternetConnect exception!")));
hRet = NULL;
}
}
if (lpszAnsiServerName)
delete [](lpszAnsiServerName);
if (lpszAnsiUserName)
delete [](lpszAnsiUserName);
if (lpszAnsiPassword)
delete [](lpszAnsiPassword);
#else
__try {
hRet = g_pfnInternetConnect(hSession,
lpszServerName,
nServerPort,
lpszUserName,
lpszPassword,
dwService,
dwFlags,
dwContext);
} __except(1) {
DBG_ASSERT(FALSE, (TEXT("inetwrap : InternetConnect exception!")));
hRet = NULL;
}
#endif
return hRet;
}
/*****************************************************************************\
* wrapHttpQueryInfo
*
*
\*****************************************************************************/
BOOL wrapHttpQueryInfo(
HINTERNET hRequest,
DWORD dwInfoLevel,
LPVOID lpvBuffer,
LPDWORD lpdwBufferLen,
LPDWORD lpdwIndex)
{
BOOL bRet;
__try {
bRet = g_pfnHttpQueryInfo(hRequest,
dwInfoLevel,
lpvBuffer,
lpdwBufferLen,
lpdwIndex);
} __except(1) {
DBG_ASSERT(FALSE, (TEXT("inetwrap : HttpQueryInfo exception!")));
bRet = FALSE;
}
return bRet;
}
/*****************************************************************************\
* wrapHttpSendRequest
*
*
\*****************************************************************************/
BOOL wrapHttpSendRequest(
HINTERNET hRequest,
LPCTSTR lpszHeaders,
DWORD dwHeaderLen,
LPVOID lpvOptional,
DWORD dwOptionalLen)
{
BOOL bRet = TRUE;
#ifdef UNICODE
UINT uSize;
LPSTR lpszAnsiHeaders = NULL;
if (lpszHeaders && (uSize = WCtoMB(lpszHeaders, NULL, 0))) {
if (lpszAnsiHeaders = new CHAR[uSize])
bRet = WCtoMB(lpszHeaders, lpszAnsiHeaders, uSize);
else
bRet = FALSE;
}
if (bRet) {
__try {
bRet = g_pfnHttpSendRequest(hRequest,
(LPCTSTR)lpszAnsiHeaders,
dwHeaderLen,
lpvOptional,
dwOptionalLen);
} __except(1) {
DBG_ASSERT(FALSE, (TEXT("inetwrap : HttpSendRequest exception!")));
bRet = FALSE;
}
}
if (lpszAnsiHeaders)
delete [](lpszAnsiHeaders);
#else
__try {
bRet = g_pfnHttpSendRequest(hRequest,
lpszHeaders,
dwHeaderLen,
lpvOptional,
dwOptionalLen);
} __except(1) {
DBG_ASSERT(FALSE, (TEXT("inetwrap : HttpSendRequest exception!")));
bRet = FALSE;
}
#endif
return bRet;
}
/*****************************************************************************\
* wrapHttpSendRequestEx
*
*
\*****************************************************************************/
BOOL wrapHttpSendRequestEx(
HINTERNET hRequest,
LPINTERNET_BUFFERS lpBufIn,
LPINTERNET_BUFFERS lpBufOut,
DWORD dwFlags,
DWORD_PTR dwContext)
{
BOOL bRet = TRUE;
// NOTE : This now works for Header values defined in lpBufIn and lpBufOut, we assume that
// the "size" of the header in the structure is not set by the calling routine, if it is we
// overwrite the size when we convert it....
//
// NOTE2: We do not support linked Buffer Strucures, only 1!!!!!
// NOTE3: We do not support lpBufOut to return values. It must be NULL
#ifdef UNICODE
UINT uSize = 0;
LPSTR lpszAnsiHeaders = NULL;
LPCWSTR lpcszHeader;
INTERNET_BUFFERSA ConvertBuf;
DBG_ASSERT((lpBufOut == NULL) , (TEXT("inetwrap : We do not support output buffers!")));
DBG_ASSERT((lpBufIn->Next == NULL) , (TEXT("inetwrap : We do not support chained input buffers!")));
lpcszHeader = lpBufIn->lpcszHeader;
if (lpcszHeader && (uSize = WCtoMB(lpcszHeader, NULL, 0))) {
if (lpszAnsiHeaders = new CHAR[uSize])
bRet = WCtoMB(lpcszHeader, lpszAnsiHeaders, uSize--);
else
bRet = FALSE;
}
if (bRet) {
ConvertBuf.dwStructSize = sizeof(ConvertBuf);
ConvertBuf.Next = NULL;
ConvertBuf.lpcszHeader = lpszAnsiHeaders;
ConvertBuf.dwHeadersLength = (DWORD)uSize;
ConvertBuf.dwHeadersTotal = lpBufIn->dwHeadersTotal;
ConvertBuf.lpvBuffer = lpBufIn->lpvBuffer;
ConvertBuf.dwBufferLength = lpBufIn->dwBufferLength;
ConvertBuf.dwBufferTotal = lpBufIn->dwBufferTotal;
ConvertBuf.dwOffsetLow = lpBufIn->dwOffsetLow;
ConvertBuf.dwOffsetHigh = lpBufIn->dwOffsetHigh;
__try {
bRet = g_pfnHttpSendRequestEx(hRequest,
&ConvertBuf,
lpBufOut,
dwFlags,
dwContext);
} __except(1) {
DBG_ASSERT(FALSE, (TEXT("inetwrap : HttpSendRequestEx exception!")));
bRet = FALSE;
}
}
if (lpszAnsiHeaders)
delete [](lpszAnsiHeaders);
#else
__try {
bRet = g_pfnHttpSendRequestEx(hRequest,
lpBufIn,
lpBufOut,
dwFlags,
dwContext);
} __except(1) {
DBG_ASSERT(FALSE, (TEXT("inetwrap : HttpSendRequestEx exception!")));
bRet = FALSE;
}
#endif
return bRet;
}
/*****************************************************************************\
* wrapHttpOpenRequest
*
*
\*****************************************************************************/
HINTERNET wrapHttpOpenRequest(
HINTERNET hConnect,
LPCTSTR lpszVerb,
LPCTSTR lpszObjectName,
LPCTSTR lpszVersion,
LPCTSTR lpszReferer,
LPCTSTR *lplpszAccept,
DWORD dwFlags,
DWORD_PTR dwContext)
{
HINTERNET hRet = NULL;
#ifdef UNICODE
UINT uSize;
LPSTR lpszAnsiVerb = NULL;
LPSTR lpszAnsiObjectName = NULL;
LPSTR lpszAnsiVersion = NULL;
LPSTR lpszAnsiReferer = NULL;
BOOL bRet = TRUE;
if (lpszVerb && (uSize = WCtoMB(lpszVerb, NULL, 0))) {
if (lpszAnsiVerb = new CHAR[uSize])
bRet = WCtoMB(lpszVerb, lpszAnsiVerb, uSize);
}
if (bRet && lpszObjectName && (uSize = WCtoMB(lpszObjectName, NULL, 0))) {
if (lpszAnsiObjectName = new CHAR[uSize])
bRet = WCtoMB(lpszObjectName, lpszAnsiObjectName, uSize);
else
bRet = FALSE;
}
if (bRet && lpszVersion && (uSize = WCtoMB(lpszVersion, NULL, 0))) {
if (lpszAnsiVersion = new CHAR[uSize])
bRet = WCtoMB(lpszVersion, lpszAnsiVersion, uSize);
else
bRet = FALSE;
}
if (bRet && lpszReferer && (uSize = WCtoMB(lpszReferer, NULL, 0))) {
if (lpszAnsiReferer = new CHAR[uSize])
bRet = WCtoMB(lpszReferer, lpszAnsiReferer, uSize);
else
bRet = FALSE;
}
if (bRet) {
__try {
hRet = g_pfnHttpOpenRequest(hConnect,
(LPCTSTR)lpszAnsiVerb,
(LPCTSTR)lpszAnsiObjectName,
(LPCTSTR)lpszAnsiVersion,
(LPCTSTR)lpszAnsiReferer,
(LPCTSTR *)lplpszAccept,
dwFlags,
dwContext);
} __except(1) {
DBG_ASSERT(FALSE, (TEXT("inetwrap : HttpOpenRequest exception!")));
hRet = NULL;
}
}
if (lpszAnsiVerb)
delete [](lpszAnsiVerb);
if (lpszAnsiObjectName)
delete [](lpszAnsiObjectName);
if (lpszAnsiVersion)
delete [](lpszAnsiVersion);
if (lpszAnsiReferer)
delete [](lpszAnsiReferer);
#else
__try {
hRet = g_pfnHttpOpenRequest(hConnect,
lpszVerb,
lpszObjectName,
lpszVersion,
lpszReferer,
lplpszAccept,
dwFlags,
dwContext);
} __except(1) {
DBG_ASSERT(FALSE, (TEXT("inetwrap : HttpOpenRequest exception!")));
hRet = NULL;
}
#endif
return hRet;
}
/*****************************************************************************\
* wrapHttpAddRequestHeaders
*
*
\*****************************************************************************/
BOOL wrapHttpAddRequestHeaders(
HINTERNET hRequest,
LPCTSTR lpszHeaders,
DWORD cbLength,
DWORD dwModifiers)
{
BOOL bRet = TRUE;
#ifdef UNICODE
UINT uSize;
LPSTR lpszAnsiHeaders = NULL;
if (lpszHeaders && (uSize = WCtoMB(lpszHeaders, NULL, 0))) {
if (lpszAnsiHeaders = new CHAR[uSize])
WCtoMB(lpszHeaders, lpszAnsiHeaders, uSize);
else
bRet = FALSE;
}
if (bRet) {
__try {
bRet = g_pfnHttpAddRequestHeaders(hRequest,
(LPCTSTR)lpszAnsiHeaders,
cbLength,
dwModifiers);
} __except(1) {
DBG_ASSERT(FALSE, (TEXT("inetwrap : HttpAddRequestHeaders exception!")));
bRet = FALSE;
}
}
if (lpszAnsiHeaders)
delete [](lpszAnsiHeaders);
#else
__try {
bRet = g_pfnHttpAddRequestHeaders(hRequest,
lpszHeaders,
cbLength,
dwModifiers);
} __except(1) {
DBG_ASSERT(FALSE, (TEXT("inetwrap : HttpAdRequestHeaders exception!")));
bRet = FALSE;
}
#endif
return bRet;
}
/*****************************************************************************\
* wrapHttpEndRequest
*
*
\*****************************************************************************/
BOOL wrapHttpEndRequest(
HINTERNET hRequest,
LPINTERNET_BUFFERS lpBuf,
DWORD dwFlags,
DWORD_PTR dwContext)
{
BOOL bRet;
__try {
#ifdef UNICODE
DBG_ASSERT((lpBuf == NULL), (TEXT("Assert: NULL Buffer is only support")));
bRet = g_pfnHttpEndRequest(hRequest, lpBuf, dwFlags, dwContext);
#else
bRet = g_pfnHttpEndRequest(hRequest, lpBuf, dwFlags, dwContext);
#endif
} __except(1) {
DBG_ASSERT(FALSE, (TEXT("inetwrap : HttpOpenRequest exception!")));
bRet = FALSE;
}
return bRet;
}
/*****************************************************************************\
* wrapInternetSetOption
*
*
\*****************************************************************************/
BOOL wrapInternetSetOption(
HINTERNET hRequest,
IN DWORD dwOption,
IN LPVOID lpBuffer,
IN DWORD dwBufferLength)
{
BOOL bRet = TRUE;
#ifdef UNICODE
UINT uSize;
LPSTR lpszAnsiBuffer = NULL;
switch (dwOption) {
case INTERNET_OPTION_USERNAME:
case INTERNET_OPTION_PASSWORD:
case INTERNET_OPTION_PROXY_USERNAME:
case INTERNET_OPTION_PROXY_PASSWORD:
if (lpBuffer && (uSize = WCtoMB(lpBuffer, NULL, 0))) {
if (lpszAnsiBuffer = new CHAR[uSize])
bRet = WCtoMB(lpBuffer, lpszAnsiBuffer, uSize);
else
bRet = FALSE;
}
if (bRet) {
__try {
bRet = g_pfnInternetSetOption(hRequest,
dwOption,
lpszAnsiBuffer,
dwBufferLength);
} __except(1) {
DBG_ASSERT(FALSE, (TEXT("inetwrap : InternetSetOption exception!")));
bRet = FALSE;
}
}
if (lpszAnsiBuffer)
delete [](lpszAnsiBuffer);
break;
default:
__try {
bRet = g_pfnInternetSetOption(hRequest,
dwOption,
lpBuffer,
dwBufferLength);
} __except(1) {
DBG_ASSERT(FALSE, (TEXT("inetwrap : InternetSetOption exception!")));
bRet = FALSE;
}
break;
}
#else
__try {
bRet = g_pfnInternetSetOption(hRequest,
dwOption,
lpBuffer,
dwBufferLength);
} __except(1) {
DBG_ASSERT(FALSE, (TEXT("inetwrap : InternetSetOption exception!")));
bRet = FALSE;
}
#endif
return bRet;
}
/*****************************************************************************\
* wrapInternetCloseHandle
*
*
\*****************************************************************************/
BOOL wrapInternetCloseHandle(
HINTERNET hHandle)
{
BOOL bRet;
__try {
bRet = g_pfnInternetCloseHandle(hHandle);
} __except(1) {
DBG_ASSERT(FALSE, (TEXT("inetwrap : InternetCloseHandle exception!")));
bRet = FALSE;
}
return bRet;
}
/*****************************************************************************\
* wrapInternetReadFile
*
*
\*****************************************************************************/
BOOL wrapInternetReadFile(
HINTERNET hReq,
LPVOID lpvBuffer,
DWORD cbBuffer,
LPDWORD lpcbRd)
{
BOOL bRet;
__try {
bRet = g_pfnInternetReadFile(hReq, lpvBuffer, cbBuffer, lpcbRd);
} __except(1) {
DBG_ASSERT(FALSE, (TEXT("inetwrap : InternetReadFile exception!")));
bRet = FALSE;
}
return bRet;
}
/*****************************************************************************\
* wrapInternetWriteFile
*
*
\*****************************************************************************/
BOOL wrapInternetWriteFile(
HINTERNET hReq,
LPVOID lpvBuffer,
DWORD cbBuffer,
LPDWORD lpcbWr)
{
BOOL bRet;
__try {
bRet = g_pfnInternetWriteFile(hReq, lpvBuffer, cbBuffer, lpcbWr);
} __except(1) {
DBG_ASSERT(FALSE, (TEXT("inetwrap : InternetWriteFile exception!")));
bRet = FALSE;
}
return bRet;
}
/*****************************************************************************\
* wrapInternetErrorDlg
*
*
\*****************************************************************************/
DWORD wrapInternetErrorDlg(
HWND hWnd,
HINTERNET hReq,
DWORD dwError,
DWORD dwFlags,
LPVOID pvParam)
{
DWORD dwRet;
__try {
dwRet = g_pfnInternetErrorDlg(hWnd, hReq, dwError, dwFlags, pvParam);
} __except(1) {
DBG_ASSERT(FALSE, (TEXT("inetwrap : InternetErrorDlg exception!")));
dwRet = 0;
}
return dwRet;
}