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