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.
 
 
 
 
 
 

164 lines
5.1 KiB

#include <windows.h>
#include <activscp.h>
class CDeviceScriptSite : public IActiveScriptSite {
private:
ULONG m_dwRef;
public:
IUnknown *m_pUnkScriptObject;
ITypeInfo *m_pTypeInfo;
IUnknown *m_pUnkScriptObjectDeviceAction;
ITypeInfo *m_pTypeInfoDeviceAction;
IUnknown *m_pUnkScriptObjectDeviceControl;
ITypeInfo *m_pTypeInfoDeviceControl;
IUnknown *m_pUnkScriptObjectLastError;
ITypeInfo *m_pTypeInfoLastError;
CDeviceScriptSite::CDeviceScriptSite() {
m_pUnkScriptObject = 0;
m_pTypeInfo = 0;
m_pUnkScriptObjectDeviceAction = 0;
m_pTypeInfoDeviceAction = 0;
m_pUnkScriptObjectDeviceControl = 0;
m_pTypeInfoDeviceControl = 0;
m_pUnkScriptObjectLastError = 0;
m_pTypeInfoLastError = 0;
m_dwRef = 1;
}
// IUnknown methods...
virtual HRESULT __stdcall QueryInterface(REFIID riid,
void **ppvObject) {
*ppvObject = NULL;
return E_NOTIMPL;
}
virtual ULONG _stdcall AddRef(void) {
return ++m_dwRef;
}
virtual ULONG _stdcall Release(void) {
if(--m_dwRef == 0) return 0;
return m_dwRef;
}
// IActiveScriptSite methods...
virtual HRESULT __stdcall GetLCID(LCID *plcid) {
return S_OK;
}
virtual HRESULT __stdcall GetItemInfo(LPCOLESTR pstrName,
DWORD dwReturnMask, IUnknown **ppunkItem, ITypeInfo **ppti) {
// Is it expecting an ITypeInfo?
if(ppti) {
// Default to NULL.
*ppti = NULL;
// See if asking about ITypeInfo...
//
// Note: This needs to be done in a more efficient
// way.
//
if(dwReturnMask & SCRIPTINFO_ITYPEINFO) {
if (!_wcsicmp(L"DeviceProperty", pstrName)) {
*ppti = m_pTypeInfo;
} else if (!_wcsicmp(L"DeviceAction", pstrName)) {
*ppti = m_pTypeInfoDeviceAction;
} else if (!_wcsicmp(L"DeviceControl", pstrName)) {
*ppti = m_pTypeInfoDeviceControl;
} else if (!_wcsicmp(L"LastError", pstrName)) {
*ppti = m_pTypeInfoLastError;
}
}
}
// Is the engine passing an IUnknown buffer?
if(ppunkItem) {
// Default to NULL.
*ppunkItem = NULL;
// Is Script Engine looking for an IUnknown for our object?
//
// Note: This needs to be done in a more efficient
// way.
//
if(dwReturnMask & SCRIPTINFO_IUNKNOWN) {
if (!_wcsicmp(L"DeviceProperty", pstrName)) {
*ppunkItem = m_pUnkScriptObject;
m_pUnkScriptObject->AddRef();
} else if (!_wcsicmp(L"DeviceAction", pstrName)) {
*ppunkItem = m_pUnkScriptObjectDeviceAction;
m_pUnkScriptObjectDeviceAction->AddRef();
} else if (!_wcsicmp(L"DeviceControl", pstrName)) {
*ppunkItem = m_pUnkScriptObjectDeviceControl;
m_pUnkScriptObjectDeviceControl->AddRef();
} else if (!_wcsicmp(L"LastError", pstrName)) {
*ppunkItem = m_pUnkScriptObjectLastError;
m_pUnkScriptObjectLastError->AddRef();
}
}
}
return S_OK;
}
virtual HRESULT __stdcall GetDocVersionString(BSTR *pbstrVersion) {
return S_OK;
}
virtual HRESULT __stdcall OnScriptTerminate(
const VARIANT *pvarResult, const EXCEPINFO *pexcepInfo) {
return S_OK;
}
virtual HRESULT __stdcall OnStateChange(SCRIPTSTATE ssScriptState) {
return S_OK;
}
virtual HRESULT __stdcall OnScriptError(
IActiveScriptError *pscriptError) {
BSTR bstrSourceLine;
DWORD dwSourceContext = 0;
ULONG ulLineNumber = 0;
LONG lchPosition = 0;
HRESULT hr = S_OK;
hr = pscriptError->GetSourceLineText(&bstrSourceLine);
hr = pscriptError->GetSourcePosition(&dwSourceContext,&ulLineNumber,&lchPosition);
TCHAR szErrorDescription[1024];
memset(szErrorDescription,0,sizeof(szErrorDescription));
#ifdef UNICODE
swprintf(szErrorDescription,TEXT("SOURCE: %ws\nLINE: %d\nCHARACTER POS: %d"),
bstrSourceLine,
ulLineNumber,
lchPosition);
#else
sprintf(szErrorDescription,TEXT("SOURCE: %ws\nLINE: %d\nCHARACTER POS: %d"),
bstrSourceLine,
ulLineNumber,
lchPosition);
#endif
#ifdef DEBUG
::MessageBox(NULL, szErrorDescription, TEXT("WIA Driver Script Error"), MB_SETFOREGROUND);
#endif
return S_OK;
}
virtual HRESULT __stdcall OnEnterScript(void) {
return S_OK;
}
virtual HRESULT __stdcall OnLeaveScript(void) {
return S_OK;
}
};