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.
300 lines
4.9 KiB
300 lines
4.9 KiB
/*++=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
|
|
|
|
Copyright (c) 2000 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
iw3spoof.cxx
|
|
|
|
Abstract:
|
|
|
|
Implements the W3Spoof object's IW3Spoof interface.
|
|
|
|
Author:
|
|
|
|
Paul M Midgen (pmidge) 08-February-2001
|
|
|
|
|
|
Revision History:
|
|
|
|
08-February-2001 pmidge
|
|
Created
|
|
|
|
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=--*/
|
|
|
|
#include "common.h"
|
|
|
|
|
|
HRESULT
|
|
__stdcall
|
|
CW3Spoof::GetRuntime(IW3SpoofRuntime** pprt)
|
|
{
|
|
DEBUG_ENTER((
|
|
DBG_W3SOBJ,
|
|
rt_hresult,
|
|
"CW3Spoof::GetRuntime",
|
|
"this=%#x; pprt=%#x",
|
|
this,
|
|
pprt
|
|
));
|
|
|
|
HRESULT hr = S_OK;
|
|
|
|
if( !pprt )
|
|
{
|
|
hr = E_POINTER;
|
|
}
|
|
else
|
|
{
|
|
*pprt = NULL;
|
|
|
|
if( m_prt )
|
|
{
|
|
hr = m_prt->QueryInterface(IID_IW3SpoofRuntime, (void**) pprt);
|
|
DEBUG_TRACE(W3SOBJ, ("returning IW3SpoofRuntime instance %#x", *pprt));
|
|
}
|
|
else
|
|
{
|
|
hr = E_FAIL;
|
|
}
|
|
}
|
|
|
|
DEBUG_LEAVE(hr);
|
|
return hr;
|
|
}
|
|
|
|
|
|
HRESULT
|
|
__stdcall
|
|
CW3Spoof::GetTypeLibrary(ITypeLib** pptl)
|
|
{
|
|
DEBUG_ENTER((
|
|
DBG_W3SOBJ,
|
|
rt_hresult,
|
|
"CW3Spoof::GetTypeLibrary",
|
|
"this=%#x; pptl=%#x",
|
|
this,
|
|
pptl
|
|
));
|
|
|
|
HRESULT hr = S_OK;
|
|
|
|
if( !pptl )
|
|
{
|
|
hr = E_POINTER;
|
|
}
|
|
else
|
|
{
|
|
*pptl = NULL;
|
|
|
|
if( m_ptl )
|
|
{
|
|
hr = m_ptl->QueryInterface(IID_ITypeLib, (void**) pptl);
|
|
DEBUG_TRACE(W3SOBJ, ("returning ITypeLib instance %#x", *pptl));
|
|
}
|
|
else
|
|
{
|
|
hr = E_FAIL;
|
|
}
|
|
}
|
|
|
|
DEBUG_LEAVE(hr);
|
|
return hr;
|
|
}
|
|
|
|
|
|
HRESULT
|
|
__stdcall
|
|
CW3Spoof::GetScriptEngine(IActiveScript** ppas)
|
|
{
|
|
DEBUG_ENTER((
|
|
DBG_W3SOBJ,
|
|
rt_hresult,
|
|
"CW3Spoof::GetScriptEngine",
|
|
"this=%#x; ppas=%#x",
|
|
this,
|
|
ppas
|
|
));
|
|
|
|
HRESULT hr = S_OK;
|
|
|
|
if( !ppas )
|
|
{
|
|
hr = E_POINTER;
|
|
}
|
|
else
|
|
{
|
|
*ppas = NULL;
|
|
|
|
if( m_pas )
|
|
{
|
|
hr = m_pas->QueryInterface(IID_IActiveScript, (void**) ppas);
|
|
DEBUG_TRACE(W3SOBJ, ("returning IActiveScript instance %#x", *ppas));
|
|
}
|
|
else
|
|
{
|
|
hr = E_FAIL;
|
|
}
|
|
}
|
|
|
|
DEBUG_LEAVE(hr);
|
|
return hr;
|
|
}
|
|
|
|
|
|
HRESULT
|
|
__stdcall
|
|
CW3Spoof::GetScriptPath(LPWSTR client, LPWSTR* path)
|
|
{
|
|
DEBUG_ENTER((
|
|
DBG_W3SOBJ,
|
|
rt_hresult,
|
|
"CW3Spoof::GetScriptPath",
|
|
"this=%#x; client=%S; path=%#x",
|
|
this,
|
|
client,
|
|
path
|
|
));
|
|
|
|
HRESULT hr = S_OK;
|
|
|
|
if( !path )
|
|
{
|
|
hr = E_POINTER;
|
|
goto quit;
|
|
}
|
|
|
|
if( !client )
|
|
{
|
|
hr = E_INVALIDARG;
|
|
goto quit;
|
|
}
|
|
|
|
if( m_clientmap && (m_clientmap->Get(client, (void**) path) != ERROR_SUCCESS) )
|
|
{
|
|
*path = L"default.js";
|
|
}
|
|
|
|
DEBUG_TRACE(W3SOBJ, ("script path is %S", *path));
|
|
|
|
quit:
|
|
|
|
DEBUG_LEAVE(hr);
|
|
return hr;
|
|
}
|
|
|
|
|
|
HRESULT
|
|
__stdcall
|
|
CW3Spoof::Notify(LPWSTR clientid, PSESSIONOBJ pso, STATE state)
|
|
{
|
|
DEBUG_ENTER((
|
|
DBG_W3SOBJ,
|
|
rt_hresult,
|
|
"CW3Spoof::Notify",
|
|
"this=%#x; clientid=%S; pso=%#x; state=%s",
|
|
this,
|
|
clientid,
|
|
pso,
|
|
MapStateToString(state)
|
|
));
|
|
|
|
HRESULT hr = S_OK;
|
|
|
|
//
|
|
// states not directly handled:
|
|
//
|
|
// ST_CREATED
|
|
// ST_OPENING
|
|
// ST_CLOSING
|
|
//
|
|
|
|
switch( state )
|
|
{
|
|
case ST_OPEN :
|
|
{
|
|
DEBUG_TRACE(W3SOBJ, ("registering session object"));
|
|
|
|
m_CP.FireOnSessionOpen(clientid);
|
|
hr = m_sessionmap->Insert(clientid, (void*) pso);
|
|
}
|
|
break;
|
|
|
|
case ST_CLOSED :
|
|
{
|
|
DEBUG_TRACE(W3SOBJ, ("unregistering session object"));
|
|
|
|
m_CP.FireOnSessionClose(clientid);
|
|
m_sessionmap->Delete(clientid, NULL);
|
|
}
|
|
break;
|
|
|
|
case ST_ERROR :
|
|
{
|
|
m_CP.FireOnSessionStateChange(clientid, state);
|
|
m_sessionmap->Delete(clientid, NULL);
|
|
}
|
|
break;
|
|
|
|
default :
|
|
{
|
|
m_CP.FireOnSessionStateChange(clientid, state);
|
|
}
|
|
}
|
|
|
|
DEBUG_LEAVE(hr);
|
|
return hr;
|
|
}
|
|
|
|
|
|
HRESULT
|
|
__stdcall
|
|
CW3Spoof::WaitForUnload(void)
|
|
{
|
|
DEBUG_ENTER((
|
|
DBG_W3SOBJ,
|
|
rt_hresult,
|
|
"CW3Spoof::WaitForUnload",
|
|
"this=%#x",
|
|
this
|
|
));
|
|
|
|
HRESULT hr = S_OK;
|
|
|
|
WaitForSingleObject(m_evtServerUnload, INFINITE);
|
|
|
|
DEBUG_LEAVE(hr);
|
|
return hr;
|
|
}
|
|
|
|
|
|
HRESULT
|
|
__stdcall
|
|
CW3Spoof::Terminate(void)
|
|
{
|
|
DEBUG_ENTER((
|
|
DBG_W3SOBJ,
|
|
rt_hresult,
|
|
"CW3Spoof::Terminate",
|
|
"this=%#x",
|
|
this
|
|
));
|
|
|
|
HRESULT hr = S_OK;
|
|
|
|
_SetState(ST_CLOSING);
|
|
|
|
_TerminateThreads();
|
|
|
|
SAFETERMINATE(m_prt);
|
|
SAFERELEASE(m_ptl);
|
|
SAFERELEASE(m_pas);
|
|
SAFEDELETE(m_clientmap);
|
|
SAFEDELETE(m_sessionmap);
|
|
SAFECLOSE(m_evtServerUnload);
|
|
|
|
_SetState(ST_CLOSED);
|
|
|
|
DEBUG_LEAVE(hr);
|
|
return hr;
|
|
}
|