windows-nt/Source/XPSP1/NT/net/mmc/common/handlers.h
2020-09-26 16:20:57 +08:00

167 lines
4.7 KiB
C++

/**********************************************************************/
/** Microsoft Windows/NT **/
/** Copyright(c) Microsoft Corporation, 1997 - 1998 **/
/**********************************************************************/
/*
handlers.h
Prototypes for the various handlers
FILE HISTORY:
*/
#ifndef _HANDLERS_H
#define _HANDLERS_H
#ifndef _BASEHAND_H
#include "basehand.h"
#endif
#ifndef _QUERYOBJ_H
#include "queryobj.h"
#endif
#ifndef _PROPPAGE_H
#include "proppage.h"
#endif
typedef CArray<int, int> CVirtualIndexArray;
/*---------------------------------------------------------------------------
Class: ThreadHandler
This is an abstract base class that anyone who wants to run a
background thread needs to implement (if they use the hidden window
mechanism that is).
This is the class that does all of the background thread management.
Author: kennt
---------------------------------------------------------------------------*/
class ThreadHandler :
public ITFSThreadHandler
{
public:
ThreadHandler();
~ThreadHandler();
DeclareIUnknownMembers(IMPL)
// Derived classes should implement this
DeclareITFSThreadHandlerMembers(PURE)
// Thread management functions
BOOL StartBackgroundThread(ITFSNode * pNode, HWND hWndHidden, ITFSQueryObject *pQuery);
void WaitForThreadToExit();
void ReleaseThreadHandler();
protected:
// override for custom thread creation
virtual CBackgroundThread* CreateThreadObject();
SPITFSQueryObject m_spQuery;
SPITFSNode m_spNode;
HWND m_hwndHidden; // handle to window to post to
UINT m_uMsgBase;
HANDLE m_hThread;
long m_cRef;
};
typedef CList <CPropertyPageHolderBase *, CPropertyPageHolderBase *> CPropSheetListBase;
/*---------------------------------------------------------------------------
Class: CHandler
---------------------------------------------------------------------------*/
class CHandler :
public CBaseHandler,
public CBaseResultHandler
{
public:
CHandler(ITFSComponentData *pTFSCompData);
virtual ~CHandler();
DeclareIUnknownMembers(IMPL)
virtual HRESULT OnExpand(ITFSNode *, LPDATAOBJECT, DWORD, LPARAM, LPARAM) { m_bExpanded = TRUE; return hrOK; }
void Lock();
void Unlock();
BOOL IsLocked() { return m_nLockCount > 0;}
OVERRIDE_NodeHandler_UserNotify();
OVERRIDE_NodeHandler_DestroyHandler()
{ return DestroyPropSheets(); }
OVERRIDE_ResultHandler_UserResultNotify();
OVERRIDE_ResultHandler_DestroyResultHandler()
{ return DestroyPropSheets(); }
// public helpers
int HasPropSheetsOpen();
HRESULT GetOpenPropSheet(int nIndex, CPropertyPageHolderBase ** ppPropSheet);
virtual HRESULT OnRefresh(ITFSNode *, LPDATAOBJECT, DWORD, LPARAM, LPARAM);
protected:
HRESULT BuildSelectedItemList(ITFSComponent * pComponent, CTFSNodeList * plistSelectedItems);
HRESULT BuildVirtualSelectedItemList(ITFSComponent * pComponent, CVirtualIndexArray * parraySelectedItems);
HRESULT RemovePropSheet(CPropertyPageHolderBase * pPageHolder);
HRESULT AddPropSheet(CPropertyPageHolderBase * pPageHolder);
HRESULT DestroyPropSheets();
public:
int m_nState; // for general purpose finite state machine implementation
DWORD m_dwErr; // for general purpose error handling
LONG m_nLockCount; // keeps track if a node has been locked (e.g. to spin a thread, etc.)
BOOL m_bExpanded; // whether or not this node has been expanded yet
protected:
LONG m_cRef;
CPropSheetListBase m_listPropSheets;
};
/*---------------------------------------------------------------------------
Class: CMTHander
---------------------------------------------------------------------------*/
class CMTHandler :
public CHandler,
public ThreadHandler
{
public:
CMTHandler(ITFSComponentData *pTFSCompData);
virtual ~CMTHandler();
DeclareIUnknownMembers(IMPL)
STDMETHOD (DestroyHandler) (ITFSNode *pNode);
virtual HRESULT OnExpand(ITFSNode *, LPDATAOBJECT, DWORD, LPARAM, LPARAM);
// query creation - override to create a user-specific query object
virtual ITFSQueryObject* OnCreateQuery(ITFSNode *pNode) = 0;
virtual HRESULT OnRefresh(ITFSNode *, LPDATAOBJECT, DWORD, LPARAM, LPARAM);
protected:
virtual int GetImageIndex(BOOL bOpenIndex) { return -1; }
// the next 3 functions are background thread notification callbacks
// these override the ThreadHandler::OnNotifyXXX functions
DeclareITFSThreadHandlerMembers(IMPL)
virtual void OnChangeState(ITFSNode * pNode) {}
virtual void OnHaveData(ITFSNode * pParentNode, ITFSNode * pNode) = 0;
virtual void OnHaveData(ITFSNode * pParentNode, LPARAM Data, LPARAM Type) { };
virtual void OnError(DWORD dwErr) { m_dwErr = dwErr; }
protected:
LONG m_cRef;
private:
// friend class CHiddenWnd; // to get OnThreadNotification()
};
#endif _HANDLERS_H