You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
208 lines
4.2 KiB
208 lines
4.2 KiB
#ifndef _COMPONENT_H_
|
|
#define _COMPONENT_H_
|
|
|
|
#include <iostream.h>
|
|
#include <windows.h>
|
|
#include <setupapi.h>
|
|
#include <stdio.h>
|
|
#include <tchar.h>
|
|
#include "logutils.h"
|
|
#include "hcttools.h"
|
|
|
|
const INT MaxStringSize = 256;
|
|
const INT MaxBufferSize = 255;
|
|
|
|
// Global variables
|
|
static BOOL g_bUseLog;
|
|
static BOOL g_bUseMsgBox;
|
|
static BOOL g_bUseConsole;
|
|
static BOOL g_bMasterInf;
|
|
|
|
// Global function definitions
|
|
|
|
VOID LogError(IN TCHAR *tszMsg,
|
|
IN DWORD dwErrorLevel,
|
|
IN TCHAR *tszFunctionName);
|
|
|
|
// Some structures to hold temporary data
|
|
|
|
typedef struct _DescAndTip{
|
|
TCHAR tszDesc[MaxStringSize];
|
|
TCHAR tszTip[MaxStringSize];
|
|
}DescAndTip;
|
|
|
|
class ComponentList;
|
|
class RelationList;
|
|
|
|
class Component{
|
|
|
|
private:
|
|
// ComponentId is the real ID
|
|
TCHAR tszComponentId[MaxStringSize];
|
|
|
|
// ParentId is the ID of the its parent
|
|
// It is the same as its own ID if it is a
|
|
// top level component
|
|
TCHAR tszParentId[MaxStringSize];
|
|
|
|
RelationList *prlNeedList;
|
|
RelationList *prlExcludeList;
|
|
RelationList *prlChildrenList;
|
|
|
|
Component *Next;
|
|
|
|
public:
|
|
|
|
// Constructors and destructors
|
|
Component();
|
|
~Component();
|
|
Component(TCHAR *tszId);
|
|
|
|
// Copy constructor
|
|
Component(const Component& source);
|
|
|
|
// Assignment operator
|
|
const Component& operator=(const Component& source);
|
|
|
|
// Get this component's ID
|
|
TCHAR *GetComponentId(){
|
|
return tszComponentId;
|
|
}
|
|
|
|
// Get this component's parent's ID
|
|
TCHAR *GetParentId(){
|
|
return tszParentId;
|
|
}
|
|
|
|
// Get a pointer to the parent component of this component
|
|
// It returns NULL if this is a top-level component
|
|
Component *GetParent(ComponentList *pclHead);
|
|
|
|
RelationList *GetNeedList(){
|
|
return prlNeedList;
|
|
}
|
|
|
|
RelationList *GetExcludeList(){
|
|
return prlExcludeList;
|
|
}
|
|
|
|
RelationList *GetChildrenList(){
|
|
return prlChildrenList;
|
|
}
|
|
|
|
// TRUE if this component is the parent of the parameter
|
|
BOOL IsParent(Component *pcChild);
|
|
|
|
// TRUE if this component is the child of the parameter
|
|
BOOL IsChild(Component *pcParent);
|
|
|
|
// TRUE if this component is needed by the parameter
|
|
BOOL IsNeededBy(Component *pcComponent);
|
|
|
|
// TRUE if this component is excluded by the parameter
|
|
BOOL IsExcludeBy(Component *pcComponent);
|
|
|
|
// The following function is to be called when only
|
|
// the component ID is known
|
|
BOOL BuildChildrenList(ComponentList *pclList);
|
|
|
|
BOOL GetParentIdFromINF(HINF hinfHandle);
|
|
|
|
BOOL IsTopLevelComponent();
|
|
|
|
BOOL IsBottomComponent();
|
|
|
|
BOOL IsNeededByOthers(ComponentList *pclList);
|
|
|
|
BOOL IsExcludedByOthers(ComponentList *pclList);
|
|
|
|
BOOL IsParentOfOthers();
|
|
|
|
BOOL NeedAndExcludeAtSameTime(ComponentList *pclList);
|
|
|
|
BOOL NeedOthers();
|
|
BOOL ExcludeOthers();
|
|
|
|
BOOL IsThereSameId(ComponentList *pclList);
|
|
|
|
UINT GetDiskSpaceRequirement(HINF hinfHandle);
|
|
|
|
// Doesn't matter if this is a public member
|
|
// It will only be used once
|
|
DescAndTip *pDescAndTip;
|
|
|
|
BOOL IsThereSameDesc(ComponentList *pclList);
|
|
|
|
BOOL HasSameParentWith(Component *pcComponent);
|
|
|
|
friend class ComponentList;
|
|
};
|
|
|
|
class ComponentList{
|
|
|
|
private:
|
|
|
|
Component *pcHead;
|
|
|
|
Component *pcCurrent;
|
|
|
|
public:
|
|
|
|
// Constructor and destructor
|
|
ComponentList();
|
|
~ComponentList();
|
|
|
|
void ResetList();
|
|
|
|
Component *GetNext();
|
|
|
|
BOOL Done();
|
|
|
|
Component* AddComponent(TCHAR *tszId);
|
|
|
|
BOOL RemoveComponent(TCHAR *tszId);
|
|
|
|
Component *LookupComponent(TCHAR *tszId);
|
|
|
|
friend class Component;
|
|
|
|
};
|
|
|
|
class Relation{
|
|
|
|
TCHAR tszComponentId[MaxStringSize];
|
|
Relation *Next;
|
|
|
|
public:
|
|
|
|
TCHAR *GetComponentId(){
|
|
return tszComponentId;
|
|
}
|
|
friend class Component;
|
|
friend class ComponentList;
|
|
friend class RelationList;
|
|
};
|
|
|
|
class RelationList{
|
|
|
|
Relation *prHead;
|
|
Relation *prCurrent;
|
|
|
|
public:
|
|
|
|
RelationList();
|
|
~RelationList();
|
|
|
|
void ResetList();
|
|
BOOL Done();
|
|
Relation *GetNext();
|
|
|
|
Relation* AddRelation(TCHAR *tszId);
|
|
BOOL RemoveRelation(TCHAR *tszId);
|
|
|
|
friend class Component;
|
|
friend class ComponentList;
|
|
|
|
};
|
|
|
|
#endif
|