Windows2003-3790/inetcore/setup/active/inseng/ciffile.h
2020-09-30 16:53:55 +02:00

140 lines
5.0 KiB
C++

#include <wininet.h>
#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);