WindowsXP-SP1/enduser/troubleshoot/tshoot/tshootctrl.h

269 lines
9.1 KiB
C++

//
// MODULE: TSHOOTCtrl.h
//
// PURPOSE: Interface for the component
//
// PROJECT: Troubleshooter 99
//
// COMPANY: Saltmine Creative, Inc. (206)-284-7511 support@saltmine.com
//
// AUTHOR: Oleg Kalosha
//
// ORIGINAL DATE: 12.23.98
//
// NOTES:
// Declaration of CTSHOOTCtrl
//
// Version Date By Comments
//--------------------------------------------------------------------
// V3.1 12/23/98 OK Windows related functionality is disabled;
// IObjectSafetyImpl is added
#ifndef __TSHOOTCTRL_H_
#define __TSHOOTCTRL_H_
#include "resource.h" // main symbols
#include <atlctl.h>
#include "CPTSHOOT.h"
#include "apgtsstr.h"
#include "TSNameValueMgr.h"
#include "SniffConnector.h"
#include "RenderConnector.h"
#include <new.h>
class CDBLoadConfiguration;
class CThreadPool;
class COnlineECB;
class CPoolQueue;
class CHTMLLog;
class CLocalECB;
class CVariantBuilder;
/////////////////////////////////////////////////////////////////////////////
// CTSHOOTCtrl
class ATL_NO_VTABLE CTSHOOTCtrl :
//public CComObjectRootEx<CComMultiThreadModel>,
public CComObjectRootEx<CComSingleThreadModel>,
public IDispatchImpl<ITSHOOTCtrl, &IID_ITSHOOTCtrl, &LIBID_TSHOOTLib>,
public CComControl<CTSHOOTCtrl>,
public IPersistStreamInitImpl<CTSHOOTCtrl>,
public IOleControlImpl<CTSHOOTCtrl>,
public IOleObjectImpl<CTSHOOTCtrl>,
public IOleInPlaceActiveObjectImpl<CTSHOOTCtrl>,
public IViewObjectExImpl<CTSHOOTCtrl>,
public IOleInPlaceObjectWindowlessImpl<CTSHOOTCtrl>,
public ISupportErrorInfo,
public IConnectionPointContainerImpl<CTSHOOTCtrl>,
public IPersistStorageImpl<CTSHOOTCtrl>,
public ISpecifyPropertyPagesImpl<CTSHOOTCtrl>,
public IQuickActivateImpl<CTSHOOTCtrl>,
public IDataObjectImpl<CTSHOOTCtrl>,
public IProvideClassInfo2Impl<&CLSID_TSHOOTCtrl, &DIID__ITSHOOTCtrlEvents, &LIBID_TSHOOTLib>,
public IPropertyNotifySinkCP<CTSHOOTCtrl>,
public CComCoClass<CTSHOOTCtrl, &CLSID_TSHOOTCtrl>,
public CProxy_ITSHOOTCtrlEvents< CTSHOOTCtrl >,
public IObjectSafetyImpl<CTSHOOTCtrl, INTERFACESAFE_FOR_UNTRUSTED_CALLER | INTERFACESAFE_FOR_UNTRUSTED_DATA>,
public CSniffConnector,
public CRenderConnector
{
friend class CProxy_ITSHOOTCtrlEvents< CTSHOOTCtrl >;
public:
CTSHOOTCtrl();
virtual ~CTSHOOTCtrl();
DECLARE_REGISTRY_RESOURCEID(IDR_TSHOOTCTRL)
DECLARE_PROTECT_FINAL_CONSTRUCT()
BEGIN_COM_MAP(CTSHOOTCtrl)
COM_INTERFACE_ENTRY(ITSHOOTCtrl)
COM_INTERFACE_ENTRY(IDispatch)
COM_INTERFACE_ENTRY(IViewObjectEx)
COM_INTERFACE_ENTRY(IViewObject2)
COM_INTERFACE_ENTRY(IViewObject)
COM_INTERFACE_ENTRY(IOleInPlaceObjectWindowless)
COM_INTERFACE_ENTRY(IOleInPlaceObject)
COM_INTERFACE_ENTRY2(IOleWindow, IOleInPlaceObjectWindowless)
COM_INTERFACE_ENTRY(IOleInPlaceActiveObject)
COM_INTERFACE_ENTRY(IOleControl)
COM_INTERFACE_ENTRY(IOleObject)
COM_INTERFACE_ENTRY(IPersistStreamInit)
COM_INTERFACE_ENTRY2(IPersist, IPersistStreamInit)
COM_INTERFACE_ENTRY(ISupportErrorInfo)
COM_INTERFACE_ENTRY(IConnectionPointContainer)
COM_INTERFACE_ENTRY(ISpecifyPropertyPages)
COM_INTERFACE_ENTRY(IQuickActivate)
COM_INTERFACE_ENTRY(IPersistStorage)
COM_INTERFACE_ENTRY(IDataObject)
COM_INTERFACE_ENTRY(IProvideClassInfo)
COM_INTERFACE_ENTRY(IProvideClassInfo2)
COM_INTERFACE_ENTRY(IObjectSafety)
COM_INTERFACE_ENTRY_IMPL(IConnectionPointContainer)
END_COM_MAP()
BEGIN_PROP_MAP(CTSHOOTCtrl)
PROP_DATA_ENTRY("_cx", m_sizeExtent.cx, VT_UI4)
PROP_DATA_ENTRY("_cy", m_sizeExtent.cy, VT_UI4)
// Example entries
// PROP_ENTRY("Property Description", dispid, clsid)
// PROP_PAGE(CLSID_StockColorPage)
END_PROP_MAP()
BEGIN_CONNECTION_POINT_MAP(CTSHOOTCtrl)
CONNECTION_POINT_ENTRY(IID_IPropertyNotifySink)
CONNECTION_POINT_ENTRY(DIID__ITSHOOTCtrlEvents)
END_CONNECTION_POINT_MAP()
/* >>> I have commented anything related to Windows messaging
in order to relieve the Control. Oleg. 12.23.98
BEGIN_MSG_MAP(CTSHOOTCtrl)
CHAIN_MSG_MAP(CComControl<CTSHOOTCtrl>)
DEFAULT_REFLECTION_HANDLER()
END_MSG_MAP()
*/
// Handler prototypes:
// LRESULT MessageHandler(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
// LRESULT CommandHandler(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled);
// LRESULT NotifyHandler(int idCtrl, LPNMHDR pnmh, BOOL& bHandled);
// ISupportsErrorInfo
STDMETHOD(InterfaceSupportsErrorInfo)(REFIID riid)
{
static const IID* arr[] =
{
&IID_ITSHOOTCtrl,
};
for (int i=0; i<sizeof(arr)/sizeof(arr[0]); i++)
{
if (InlineIsEqualGUID(*arr[i], riid))
return S_OK;
}
return S_FALSE;
}
// IViewObjectEx
DECLARE_VIEW_STATUS(VIEWSTATUS_SOLIDBKGND | VIEWSTATUS_OPAQUE)
// ITSHOOTCtrl
public:
STDMETHOD(NotifyNothingChecked)(/*[in]*/ BSTR bstrMessage);
STDMETHOD(ProblemPage)(/*[out, retval]*/ BSTR * pbstrFirstPage);
STDMETHOD(RunQuery2)(/*[in]*/ BSTR, /*[in]*/ BSTR, /*[in]*/ BSTR, /*[out, retval]*/ BSTR * pbstrPage);
STDMETHOD(SetPair)(/*[in]*/ BSTR bstrCmd, /*[in]*/ BSTR bstrVal);
STDMETHOD(Restart)(/*[out, retval]*/ BSTR * pbstrPage);
STDMETHOD(PreLoadURL)(/*[in]*/ BSTR bstrRoot, /*[out, retval]*/ BSTR * pbstrPage);
STDMETHOD(SetSniffResult)(/*[in]*/ VARIANT varNodeName, /*[in]*/ VARIANT varState, /*[out, retval]*/ BOOL * bResult);
STDMETHOD(RunQuery)(/*[in]*/ VARIANT varCmds, /*[in]*/ VARIANT varVals, /*[in]*/ short size, /*[out, retval]*/ BSTR * pbstrPage);
/* >>> I have commented anything related to Windows messaging
in order to relieve the Control. Oleg. 12.23.98
HRESULT OnDraw(ATL_DRAWINFO& di)
{
RECT& rc = *(RECT*)di.prcBounds;
Rectangle(di.hdcDraw, rc.left, rc.top, rc.right, rc.bottom);
SetTextAlign(di.hdcDraw, TA_CENTER|TA_BASELINE);
LPCTSTR pszText = _T("ATL 3.0 : TSHOOTCtrl");
TextOut(di.hdcDraw,
(rc.left + rc.right) / 2,
(rc.top + rc.bottom) / 2,
pszText,
lstrlen(pszText));
return S_OK;
}
*/
protected:
static bool SendSimpleHtmlPage(CLocalECB *pLocalECB,
LPCTSTR pszStatus,
const CString& str);
static bool SendError(CDBLoadConfiguration *pConf,
CLocalECB *pLocalECB,
LPCTSTR pszStatus,
const CString& strMessage);
public:
STDMETHOD(IsLocked)(/*[out, retval]*/ BOOL * pbResult);
STDMETHOD(setLocale2)(/*[in]*/ BSTR bstrNewLocale);
static bool RemoveStartOverButton(CString& strWriteClient);
static bool RemoveBackButton(CString& strWriteClient);
//static DWORD WINAPI Worker(LPVOID pParameter);
protected:
bool Init(HMODULE hModule);
void Destroy();
// Launcher integration
bool ExtractLauncherData(CString& error);
//
DWORD HttpExtensionProc(CLocalECB* pECB);
DWORD StartRequest(CLocalECB *pLocalECB, HANDLE hImpersonationToken);
bool SendError(CLocalECB *pLocalECB,
LPCTSTR pszStatus,
const CString & strMessage) const;
bool ReadStaticPageFile(const CString& strTopicName, CString& strContent);
void RegisterGlobal();
protected:
virtual long PerformSniffingInternal(CString strNodeName, CString strLaunchBasis, CString strAdditionalArgs);
virtual void RenderInternal(CString strPage);
protected:
_PNH m_SetNewHandlerPtr; // Used to store the initial _set_new_handler pointer.
int m_SetNewMode; // Used to store the initial _set_new_mode value which
// is then restored in the destructor.
protected:
bool m_bInitialized;
bool m_bFirstCall;
CThreadPool* m_pThreadPool; // thread management
CPoolQueue* m_poolctl; // Keeps track of user requests queued up to be serviced
// by working threads (a.k.a. "pool threads")
CDBLoadConfiguration* m_pConf; // manages loading support files
CHTMLLog* m_pLog; // manages user logging: what was requested by end user
DWORD m_dwErr; // general error status. 0 - OK. Once set, never gets
bool m_bShutdown; // Set true to say we're shutting down & can't handle
// new requests.
DWORD m_dwRollover; // We increment this each time we make a WORK_QUEUE_ITEM so
// we can use it there as a unique ID (unique as long as
// this DLL stays loaded).
CString m_strFirstPage; // First page, saved when RunQuery is invoked
// for the first time
bool m_bStartedFromLauncher; // true if started from the Launcher,
// false (from static page) by default
CString m_strTopicName; // topic name - only one topic for Local TS
CArrNameValue m_arrNameValueFromLauncher; // array of name - value pairs, extracted from Launcher
// passed from Launcher
// and can be used for sniffing
CString m_strMachineID;
CString m_strPNPDeviceID;
CString m_strDeviceInstanceID;
CString m_strGuidClass;
CVariantBuilder * m_pVariantBuilder;
CString m_strRequestedLocale; // Used to hold the requested locale string.
// Could be null, hence the bool variable
// m_bRequestToSetLocale.
bool m_bRequestToSetLocale; // Set to true when a request to set the locale
// is made, set to false after the LocalECB
// object has been created. Initially set to false.
vector<DWORD> m_vecCookies;
IGlobalInterfaceTable* m_pGIT;
bool m_bCanRegisterGlobal;
};
#endif //__TSHOOTCTRL_H_