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