#include #include "cifcomp.h" #include "cifmode.h" #include "cifgroup.h" #include "enum.h" class CInstallEngine; class CCifFile : public ICifFile { public: CCifFile(); ~CCifFile(); HRESULT Download(); HRESULT Install(BOOL *pfOneInstalled); void SortEntries(); // sort the arrays void ReinsertComponent(CCifComponent *pComp); HRESULT DownloadCifFile(LPCSTR pszUrl, LPCSTR pszCif); HRESULT SetCifFile(LPCSTR pszCifPath, BOOL bRWFlag); void MarkCriticalComponents(CCifComponent *); void RemoveFromCriticalComponents(CCifComponent *); LPCSTR GetCifPath() { return _szCifPath; } LPCSTR GetDownloadDir() { return _szDLDir; } LPCSTR GetFilelist() { return _szFilelist; } void SetDownloadDir(LPCSTR pszDir); void SetInstallEngine(CInstallEngine *p) { _pInsEng = p; } BOOL CanCancel() { return ( _pLastCriticalComp == NULL); } void ClearQueueState(); CInstallEngine *GetInstallEngine() { return _pInsEng; } CCifComponent **GetComponentList() { return _rpComp ? _rpComp:(CCifComponent **)_rpRWComp; } // *** IUnknown methods *** STDMETHOD(QueryInterface) (REFIID riid, LPVOID * ppvObj); STDMETHOD_(ULONG,AddRef) (); STDMETHOD_(ULONG,Release) (); // *** ICifFile methods *** STDMETHOD(EnumComponents)(IEnumCifComponents **, DWORD dwFilter, LPVOID pv); STDMETHOD(FindComponent)(LPCSTR pszID, ICifComponent **p); STDMETHOD(EnumGroups)(IEnumCifGroups **, DWORD dwFilter, LPVOID pv); STDMETHOD(FindGroup)(LPCSTR pszID, ICifGroup **p); STDMETHOD(EnumModes)(IEnumCifModes **, DWORD dwFilter, LPVOID pv); STDMETHOD(FindMode)(LPCSTR pszID, ICifMode **p); STDMETHOD(GetDescription)(LPSTR pszDesc, DWORD dwSize); STDMETHOD(GetDetDlls)(LPSTR pszDlls, DWORD dwSize); protected: // private data UINT _cRef; // ref count char _szCifPath[MAX_PATH]; // local path to cif char _szFilelist[MAX_PATH]; // filelist.dat char _szDLDir[MAX_PATH]; // download directory CInstallEngine *_pInsEng; CCifComponent **_rpComp; // array of components CCifGroup **_rpGroup; // array of groups CCifMode **_rpMode; // array of modes UINT _cComp; UINT _cGroup; UINT _cMode; CCifComponent *_pLastCriticalComp; // for read write arrays CCifRWComponent **_rpRWComp; // array of components CCifRWGroup **_rpRWGroup; // array of groups CCifRWMode **_rpRWMode; // array of modes BOOL _fCleanDir:1; // private methods HRESULT _ParseCifFile(BOOL bRWFlag); // parse cif into arrays void _SortComponents(CCifComponent **, UINT start, UINT finish); void _SortGroups(CCifGroup **, UINT start, UINT finish); HRESULT _ExtractDetDlls(LPCSTR pszCab, LPCSTR pszPath); HRESULT _CopyDetDlls(LPCSTR pszPath); HRESULT _FindCifComponent(LPCSTR pszID, CCifComponent **p); void _CheckDependencyPriority(); }; class CCifRWFile : public ICifRWFile, public CCifFile { public: // *** IUnknown methods *** STDMETHOD(QueryInterface) (REFIID riid, LPVOID * ppvObj); STDMETHOD_(ULONG,AddRef) (); STDMETHOD_(ULONG,Release) (); // *** ICifFile methods *** STDMETHOD(EnumComponents)(IEnumCifComponents **, DWORD dwFilter, LPVOID pv); STDMETHOD(FindComponent)(LPCSTR pszID, ICifComponent **p); STDMETHOD(EnumGroups)(IEnumCifGroups **, DWORD dwFilter, LPVOID pv); STDMETHOD(FindGroup)(LPCSTR pszID, ICifGroup **p); STDMETHOD(EnumModes)(IEnumCifModes **, DWORD dwFilter, LPVOID pv); STDMETHOD(FindMode)(LPCSTR pszID, ICifMode **p); STDMETHOD(GetDescription)(LPSTR pszDesc, DWORD dwSize); STDMETHOD(GetDetDlls)(LPSTR pszDlls, DWORD dwSize); // CCifRWFile(); ~CCifRWFile(); // ICifRWFile methods STDMETHOD(SetDescription)(THIS_ LPCSTR pszDesc); STDMETHOD(CreateComponent)(THIS_ LPCSTR pszID, ICifRWComponent **p); STDMETHOD(CreateGroup)(THIS_ LPCSTR pszID, ICifRWGroup **p); STDMETHOD(CreateMode)(THIS_ LPCSTR pszID, ICifRWMode **p); STDMETHOD(DeleteComponent)(THIS_ LPCSTR pszID); STDMETHOD(DeleteGroup)(THIS_ LPCSTR pszID); STDMETHOD(DeleteMode)(THIS_ LPCSTR pszID); STDMETHOD(Flush)(); private: UINT _cCompUnused; UINT _cGroupUnused; UINT _cModeUnused; }; typedef struct _SetCifArgs { char szUrl[INTERNET_MAX_URL_LENGTH]; char szCif[MAX_PATH]; CCifFile *pCif; } SETCIFARGS; DWORD WINAPI DownloadCifFile(LPVOID);