//+----------------------------------------------------------------------- // // Add/Remove Programs Data Source Object // //------------------------------------------------------------------------ #ifndef _DATASRC_H_ #define _DATASRC_H_ #include // 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_