Leaked source code of windows server 2003
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

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