Windows2003-3790/inetcore/wininet/autoconf/dllmain.cpp
2020-09-30 16:53:55 +02:00

184 lines
5.3 KiB
C++

/********************************************************************************
/ This is the base file to the Microsoft JScript Proxy Configuration
/ This file implements the code to provide the script site and the JSProxy psuedo
/ object for the script engine to call against.
/
/ Created 11/27/96 larrysu
/
/
/
/
/
/
/
/
/
*/
#include "dllmain.h"
CScriptSite *g_ScriptSite = NULL;
BOOL fOleInited = FALSE;
/*******************************************************************************
* dll initialization and destruction
********************************************************************************/
EXTERN_C
BOOL APIENTRY DllMain(HMODULE hModule,DWORD ul_reason_for_call,LPVOID lpReserved)
{
switch( ul_reason_for_call ) {
case DLL_PROCESS_ATTACH:
DisableThreadLibraryCalls(hModule);
break;
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
STDAPI_(BOOL) AUTOCONF_InternetInitializeAutoProxyDll(DWORD dwVersion,
LPSTR lpszDownloadedTempFile,
LPSTR lpszMime,
AUTO_PROXY_HELPER_APIS *pAutoProxyCallbacks,
LPAUTO_PROXY_EXTERN_STRUC lpExtraData)
{
HRESULT hr = E_FAIL;
HANDLE hFile = 0;
LPSTR szScript = NULL;
DWORD dwFileSize = 0;
DWORD dwBytesRead = 0;
LPSTR result;
LPSTR szAllocatedScript = NULL;
if ( !fOleInited )
{
#ifndef unix
CoInitializeEx(NULL, COINIT_MULTITHREADED);
#else
CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);
#endif /* unix */
}
// get the script text from the downloaded file!
// open the file
if ( lpExtraData == NULL ||
lpExtraData->dwStructSize != sizeof(AUTO_PROXY_EXTERN_STRUC) ||
lpExtraData->lpszScriptBuffer == NULL )
{
if (!lpszDownloadedTempFile)
return FALSE;
hFile = CreateFile((LPCSTR)lpszDownloadedTempFile,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
if (hFile == INVALID_HANDLE_VALUE)
return FALSE;
// Get the size
dwFileSize = GetFileSize(hFile,NULL);
// allocate the buffer to hold the data.
szScript = (LPSTR) GlobalAlloc(GMEM_FIXED|GMEM_ZEROINIT,dwFileSize+1);
szAllocatedScript = szScript;
BOOL f = TRUE;
// if the memory was allocated
if (szScript)
{
// read the data
f = ReadFile(hFile,(LPVOID) szScript,dwFileSize,&dwBytesRead,NULL);
}
CloseHandle(hFile);
if (!f)
goto Cleanup;
}
else
{
szScript = (LPSTR) lpExtraData->lpszScriptBuffer;
}
// Create a new CScriptSite object and initiate it with the autoconfig script.
g_ScriptSite = new CScriptSite;
if (g_ScriptSite)
hr = g_ScriptSite->Init(pAutoProxyCallbacks, szScript);
else
hr = E_OUTOFMEMORY;
Cleanup:
if ( szAllocatedScript )
{
// Free the script text
GlobalFree(szAllocatedScript);
szAllocatedScript = NULL;
}
if (SUCCEEDED(hr))
return TRUE;
else
return FALSE;
}
// This function frees the script engine and destroys the script site.
EXTERN_C BOOL CALLBACK AUTOCONF_InternetDeInitializeAutoProxyDll(LPSTR lpszMime, DWORD dwReserved)
{
// Release and destroy the CScriptSite object and initiate it with the autoconfig script.
// DeInit the script site.
if (g_ScriptSite)
{
g_ScriptSite->DeInit();
g_ScriptSite->Release();
g_ScriptSite = NULL;
}
if ( fOleInited )
{
CoUninitialize();
}
return TRUE;
}
// This function is called when the host wants to run the script.
EXTERN_C BOOL CALLBACK InternetGetProxyInfo(LPCSTR lpszUrl,
DWORD dwUrlLength,
LPSTR lpszUrlHostName,
DWORD dwUrlHostNameLength,
LPSTR *lplpszProxyHostName,
LPDWORD lpdwProxyHostNameLength)
{
HRESULT hr = S_OK;
LPSTR szHost;
// The host passed in may be too big. Copy it an make the
// HostLength + 1 position will be slammed with \0.
szHost = (LPSTR) GlobalAlloc(GMEM_FIXED|GMEM_ZEROINIT,dwUrlHostNameLength+1);
if (!szHost)
return FALSE;
if(lpszUrlHostName && !lstrcpyn(szHost,lpszUrlHostName,dwUrlHostNameLength+1))
{
GlobalFree(szHost);
return FALSE;
}
// construct a jscript call with the passed in url and host.
if (g_ScriptSite)
// hr = g_ScriptSite->RunScript(lpszUrl,lpszUrlHostName,lplpszProxyHostName);
hr = g_ScriptSite->RunScript(lpszUrl,szHost,lplpszProxyHostName);
GlobalFree(szHost);
if (SUCCEEDED(hr))
{
*lpdwProxyHostNameLength = lstrlen(*lplpszProxyHostName) +1;
return TRUE;
}
else
return FALSE;
}