mtxarray.h
Upload User: xhy777
Upload Date: 2007-02-14
Package Size: 24088k
Code Size: 6k
Category:

Windows Kernel

Development Platform:

Visual C++

  1. //+-----------------------------------------------------------------------
  2. //
  3. //  Matrix Array
  4. //
  5. //------------------------------------------------------------------------
  6. #ifndef _MTXARRAY_H_
  7. #define _MTXARRAY_H_
  8. #include "iface.h"          // for APPCMD_*
  9. #include "worker.h"
  10. #include "setupenum.h"      // for COCSetup* classes
  11. #include "simpdata.h"       // for OLEDB
  12. // Areas that this control can enumerate
  13. // Warning: Please do not change these numbers, they are also used
  14. // as array indexes. 
  15. #define ENUM_INSTALLED  0       // installed apps
  16. #define ENUM_PUBLISHED  1       // published apps
  17. #define ENUM_CATEGORIES 2       // published categories
  18. #define ENUM_OCSETUP    3       // Optional components selected during setup
  19. #define ENUM_UNKNOWN    0xffffffff
  20. // Sort indexes
  21. #define SORT_NA         (-1)    // n/a
  22. #define SORT_NAME       0       // sort by name
  23. #define SORT_SIZE       1       // sort by size
  24. #define SORT_TIMESUSED  2       // sort by frequency of use
  25. #define SORT_LASTUSED   3       // sort by last used date
  26. typedef struct tagAPPFIELDS
  27. {
  28.     LPWSTR pszLabel;
  29.     DWORD  dwSort;          // can be SORT_*
  30.     DWORD  dwStruct;        // IFS_*
  31.     VARTYPE vt;             // field type
  32.     DWORD  ibOffset;        // offset into structure designated by dwStruct
  33. } APPFIELDS;
  34. // BUGBUG: (dli) We should have just one base CAppData class and installed, published,
  35. // categories and OCSetup should derives from it. 
  36. // CAppData
  37. class CAppData : public IAppData
  38. {
  39. public:
  40.     // *** IUnknown ***
  41.     STDMETHOD_(ULONG, AddRef)   (void);
  42.     STDMETHOD_(ULONG, Release)  (void);
  43.     STDMETHOD(QueryInterface)   (REFIID riid, LPVOID * ppvObj);
  44.     // *** IAppData ***
  45.     STDMETHOD(DoCommand)        (HWND hwndParent, APPCMD appcmd);
  46.     STDMETHOD(ReadSlowData)     (void);
  47.     STDMETHOD(GetVariant)       (DB_LORDINAL iField, VARIANT * pvar);
  48.     STDMETHOD(SetMtxParent)     (IMtxArray * pmtxParent);
  49.     STDMETHOD_(APPINFODATA *, GetDataPtr)(void);
  50.     STDMETHOD_(SLOWAPPINFO *, GetSlowDataPtr)(void);
  51.     STDMETHOD(GetFrequencyOfUse)(LPWSTR pszBuf, int cchBuf);
  52.     STDMETHOD(SetNameDupe)      (BOOL bDupe) {_bNameDupe = bDupe; return S_OK;};
  53.             
  54.     // Overloaded constructors
  55.     CAppData(IInstalledApp* pia, APPINFODATA* paid, PSLOWAPPINFO psai);
  56.     CAppData(IPublishedApp* ppa, APPINFODATA* paid, PUBAPPINFO * ppai);
  57.     CAppData(SHELLAPPCATEGORY * psac);
  58.     CAppData(COCSetupApp * pocsa, APPINFODATA* paid);
  59.     ~CAppData();
  60.     
  61. private:
  62.     HRESULT _GetInstField(DB_LORDINAL iField, VARIANT * pvar);
  63.     HRESULT _GetPubField(DB_LORDINAL iField, VARIANT * pvar);
  64.     HRESULT _GetSetupField(DB_LORDINAL iField, VARIANT * pvar);
  65.     HRESULT _GetCatField(DB_LORDINAL iField, VARIANT * pvar);
  66.     LPTSTR _BuildSupportInfo(void);
  67.     LPTSTR _BuildPropertiesHTML(void);
  68.     void   _GetIconHTML(LPTSTR pszIconHTML, UINT cch);
  69.                         
  70.     HRESULT _VariantFromData(const APPFIELDS * pfield, LPVOID pvData, VARIANT * pvar);
  71.     DWORD   _GetCapability();
  72.     HRESULT _GetDiskSize(LPTSTR pszBuf, int cchBuf);
  73.     HRESULT _GetLastUsed(LPTSTR pszBuf, int cchBuf);
  74.     DWORD   _GetSortIndex(void);
  75.     void    _MassageSlowAppInfo(void);
  76.     
  77.     LONG _cRef;
  78.     union
  79.     {
  80.         IInstalledApp* _pia;
  81.         IPublishedApp* _ppa;
  82.         SHELLAPPCATEGORY * _psac;
  83.         COCSetupApp * _pocsa;
  84.     };
  85.     APPINFODATA _ai;
  86.     PUBAPPINFO _pai;        // Published app specific info
  87.     SLOWAPPINFO _aiSlow;
  88.     IMtxArray * _pmtxParent;
  89.     DWORD _dwEnum;          // Can be ENUM_*
  90.     BOOL  _bNameDupe;       // Has a duplicate name with other apps
  91.     CRITICAL_SECTION _cs;   // NOTE: only used for Installed Apps. 
  92.     BOOL  _fCsInitialized;  // Was the critical section initialized 
  93. };
  94. // EnumAppItems callback
  95. typedef void (CALLBACK *ENUMAPPITEMSCB)(IAppData * pappdata, LPARAM lParam);
  96. HRESULT EnumAppItems(DWORD dwEnum, LPCWSTR pszCategory, IShellAppManager * pam, ENUMAPPITEMSCB pfnCallback, LPARAM lpContext);
  97. //------------------------------------------------------------------------
  98. //
  99. //  Matrix Array
  100. //
  101. //  This object maintains the array of data.  It knows how to map
  102. //  ordinal row/column references to the actual records and fields
  103. //  kept in the array.  The base class supplies all the necessary
  104. //  methods as virtuals, and derived classes allow for arrays of:
  105. //
  106. //   - installed apps
  107. //   - published apps
  108. //   - publishing categories
  109. //
  110. //------------------------------------------------------------------------
  111. class CMtxArray2 : public IMtxArray,
  112.                    public CWorkerThread
  113. {
  114. public:
  115.     // *** IUnknown ***
  116.     virtual STDMETHODIMP_(ULONG) AddRef   (void) {return CWorkerThread::AddRef();};
  117.     virtual STDMETHODIMP_(ULONG) Release  (void) {return CWorkerThread::Release();};
  118.     virtual STDMETHODIMP QueryInterface   (REFIID riid, LPVOID * ppvObj);
  119.     
  120.     // *** IMtxArray ***
  121.     STDMETHOD(Initialize)       (DWORD dwEnum);
  122.     STDMETHOD(AddItem)          (IAppData * pappdata, DBROWCOUNT * piRow);
  123.     STDMETHOD(DeleteItems)      (DBROWCOUNT iRow, DBROWCOUNT cRows);
  124.     STDMETHOD(GetAppData)       (DBROWCOUNT iRow, IAppData ** ppappdata);
  125.     STDMETHOD(GetItemCount)     (DBROWCOUNT * pcItems);
  126.     STDMETHOD(GetFieldCount)    (DB_LORDINAL * pcFields);
  127.     STDMETHOD(GetFieldName)     (DB_LORDINAL iField, VARIANT * pvar);
  128.     STDMETHOD(GetSortIndex)     (DWORD * pdwSort);
  129.     STDMETHOD(SortItems)        (void);
  130.     STDMETHOD(SetSortCriteria)  (LPCWSTR pszSortField);
  131.     STDMETHOD_(int,CompareItems)(IAppData * pappdata1, IAppData * pappdata2);
  132.     STDMETHOD(MarkDupEntries)   (void);
  133.     
  134.     // *** IARPWorker methods *** (override)
  135.     STDMETHOD(KillWT)           (void);
  136.     CMtxArray2();
  137.     ~CMtxArray2();
  138.     static int s_SortItemsCallbackWrapper(LPVOID pv1, LPVOID pv2, LPARAM lParam);
  139.     
  140. protected:
  141.     HRESULT _DeleteItem(DBROWCOUNT idpa);
  142.     HRESULT _CreateArray(void);
  143.     DWORD   _ThreadStartProc();
  144.     void    _Lock(void);
  145.     void    _Unlock(void);
  146.     CRITICAL_SECTION _cs;
  147.     DEBUG_CODE( LONG _cRefLock; )
  148.             
  149.     HDPA        _hdpa;          // the data is here
  150.     DWORD       _dwEnum;
  151.     DWORD       _dwSort;        // can be SORT_*
  152. };
  153. HRESULT CMtxArray_CreateInstance(REFIID riid, LPVOID * ppvObj);
  154. #endif // _MTXARRAY_H_