windows-nt/Source/XPSP1/NT/shell/cpls/appwzdui/datasrc.h
2020-09-26 16:20:57 +08:00

139 lines
5.4 KiB
C++

//+-----------------------------------------------------------------------
//
// Add/Remove Programs Data Source Object
//
//------------------------------------------------------------------------
#ifndef _DATASRC_H_
#define _DATASRC_H_
#include <simpdata.h> // for OLEDBSimpleProvider
#include "mtxarray.h" // for CMtxArray
#include "worker.h"
#include "iface.h" // for IARPSimpleProvider
// The load state progression can be as follows:
//
// LS_NOTSTARTED --> LS_LOADING_SLOWINFO --> LS_DONE
//
// or
//
// LS_NOTSTARTED --> LS_DONE
//
enum LOAD_STATE
{
LS_NOTSTARTED, // OSP is not initialized
LS_LOADING_SLOWINFO, // loading slow info (worker thread)
LS_DONE, // completely finished
};
// Do not build this file if on Win9X or NT4
#ifndef DOWNLEVEL_PLATFORM
//------------------------------------------------------------------------
//
// CDataSrc (ARP Data Source Object)
//
// This is the OSP (OLEDB Simple Provider). It organizes
// the data in matrix form and disseminates the data to the data
// consumer via the OLEDBSimpleProvider interface.
//
//------------------------------------------------------------------------
class CDataSrc : public CWorkerThread,
public OLEDBSimpleProvider,
public IWorkerEvent,
public IARPSimpleProvider,
public ISequentialStream
{
public:
// *** IUnknown ***
virtual STDMETHODIMP_(ULONG) AddRef (void) {return CWorkerThread::AddRef();};
virtual STDMETHODIMP_(ULONG) Release (void) {return CWorkerThread::Release();};
virtual STDMETHODIMP QueryInterface (REFIID riid, LPVOID * ppvObj);
// *** ISequentialStream ***
STDMETHOD(Read) (void * pvData, ULONG cbData, ULONG * pcbRead);
STDMETHOD(Write) (void const * pvData, ULONG cbData, ULONG * pcbWritten);
// *** OLEDBSimpleProvider ***
STDMETHOD(getRowCount) (DBROWCOUNT *pcRows);
STDMETHOD(getColumnCount) (DB_LORDINAL *pcCols);
STDMETHOD(getRWStatus) (DBROWCOUNT iRow, DB_LORDINAL iCol, OSPRW *prwStatus);
STDMETHOD(getVariant) (DBROWCOUNT iRow, DB_LORDINAL iCol, OSPFORMAT format, VARIANT *pVar);
STDMETHOD(setVariant) (DBROWCOUNT iRow, DB_LORDINAL iCol, OSPFORMAT format, VARIANT Var);
STDMETHOD(getLocale) (BSTR *pbstrLocale);
STDMETHOD(deleteRows) (DBROWCOUNT iRow, DBROWCOUNT cRows, DBROWCOUNT *pcRowsDeleted);
STDMETHOD(insertRows) (DBROWCOUNT iRow, DBROWCOUNT cRows, DBROWCOUNT *pcRowsInserted);
STDMETHOD(find) (DBROWCOUNT iRowStart, DB_LORDINAL iCol, VARIANT val,
OSPFIND findFlags, OSPCOMP compType, DBROWCOUNT *piRowFound);
STDMETHOD(addOLEDBSimpleProviderListener)(OLEDBSimpleProviderListener *pospIListener);
STDMETHOD(removeOLEDBSimpleProviderListener)(OLEDBSimpleProviderListener *pospIListener);
STDMETHOD(getEstimatedRows) (DBROWCOUNT *pcRows);
STDMETHOD(isAsync) (BOOL *pbAsync);
STDMETHOD(stopTransfer) (void);
// *** IWorkerEvent methods ***
STDMETHOD(FireOnDataReady) (DBROWCOUNT iRow);
STDMETHOD(FireOnFinished) (void);
STDMETHOD(FireOnDatasetChanged) (void);
// *** IARPSimpleProvider methods ***
STDMETHOD(Initialize) (IShellAppManager * psam, IARPEvent *, DWORD dwEnum);
STDMETHOD(EnumerateItemsAsync) (void);
STDMETHOD(Recalculate) (void);
STDMETHOD(SetSortCriteria) (BSTR bstrSortExpr);
STDMETHOD(SetFilter) (BSTR bstrFilter);
STDMETHOD(Sort) (void);
STDMETHOD(DoCommand) (HWND hwndParent, APPCMD appcmd, DBROWCOUNT iRow);
STDMETHOD(TransferData) (IARPSimpleProvider * parposp);
CDataSrc();
// *** IARPWorker *** (overide)
STDMETHOD(KillWT) (void);
private:
virtual ~CDataSrc();
inline BOOL _IsValidDataRow(DBROWCOUNT iRow);
inline BOOL _IsValidRow(DBROWCOUNT iRow);
inline BOOL _IsValidCol(DB_LORDINAL iCol);
inline BOOL _IsValidCell(DBROWCOUNT iRow, DB_LORDINAL iCol);
DBROWCOUNT _CalcRows(void);
DB_LORDINAL _CalcCols(void);
HRESULT _ApplySortCriteria(BOOL bFireDataSetChanged);
IAppData * _GetAppData(DBROWCOUNT iRow);
// NOTE: this is not used to kill the apps enumeration thread!!
// kills only the thread that get slow appinfo.
HRESULT _KillMtxWorkerThread(void);
HRESULT _EnumAppItems(DWORD dwEnum, LPCWSTR pszCategory);
DWORD _ThreadStartProc();
ULONG _cRef; // interface reference count
LOAD_STATE _loadstate;
DB_LORDINAL _cCols; // count of columns
DBROWCOUNT _cRows; // count of rows
DWORD _dwEnum; // items to enumerate (ENUM_*)
BITBOOL _fSortDirty: 1; // TRUE: the sort criteria is dirty
BITBOOL _fFilterDirty: 1; // TRUE: the sort criteria is dirty
BITBOOL _fAppsEnumed : 1; // TRUE if we have already finished enumerating apps
BITBOOL _fInEnumOp : 1; // TRUE if we are in a enumeraion opertion
IShellAppManager * _psam;
IARPEvent * _parpevt;
IMtxArray * _pmtxarray; // data is stored here
CComBSTR _cbstrSort; // sort string. contains name of column to sort.
CComBSTR _cbstrCategory; // category. used only for published apps.
};
HRESULT CDataSrc_CreateInstance(REFIID riid, LPVOID * ppvObj);
#endif //DOWNLEVEL_PLATFORM
#endif // _DATASRC_H_