windows-nt/Source/XPSP1/NT/windows/appcompat/shimdbc/mig.h
2020-09-26 16:20:57 +08:00

411 lines
9.3 KiB
C++

////////////////////////////////////////////////////////////////////////////////////
//
// File: mig.h
//
// History: 01-Jan-01 VadimB Resurrected.
//
// Desc: This file contains all object definitions used by the
// Migdb-related code.
//
////////////////////////////////////////////////////////////////////////////////////
#ifndef __MIG_H__
#define __MIG_H__
///////////////////////////////////////////////////////////////////////////////
//
// MigDb support
// objects that translate the entries into MigDB entries
//
//
// Migration entry matching operation
// for our purposes we always use MIGOP_AND
//
typedef enum tagMIGMATCHOPERATION {
MIGOP_AND,
MIGOP_OR
} MIGMATCHOPERATION;
//
// attribute types used by migdb
//
typedef enum tagMIGATTRTYPE {
NONE,
COMPANYNAME,
FILEDESCRIPTION,
FILEVERSION,
INTERNALNAME,
LEGALCOPYRIGHT,
ORIGINALFILENAME,
PRODUCTNAME,
PRODUCTVERSION,
FILESIZE,
ISMSBINARY,
ISWIN9XBINARY,
INWINDIR,
INCATDIR,
INHLPDIR,
INSYSDIR,
INPROGRAMFILES,
ISNOTSYSROOT,
CHECKSUM,
EXETYPE,
DESCRIPTION,
INPARENTDIR,
INROOTDIR,
PNPID,
HLPTITLE,
ISWIN98,
HASVERSION,
REQFILE,
BINFILEVER,
BINPRODUCTVER,
FILEDATEHI,
FILEDATELO,
FILEVEROS,
FILEVERTYPE,
FC,
UPTOBINPRODUCTVER,
UPTOBINFILEVER,
SECTIONKEY,
REGKEYPRESENT,
ATLEASTWIN98,
ARG
} MIGATTRTYPE;
//
// Attribute table entry --
// used to describe how particular attribute appears in Migdb vs our XML
//
typedef struct tagATTRLISTENTRY {
MIGATTRTYPE MigAttrType; // type as it appears in migration db (tag)
TCHAR* szOutputName; // attribute as it's supposed to appear in .inx file
DWORD XMLAttrType; // type as it appears in xml (dword/mask)
TCHAR* szAttributeName; // attribute as it appears in .xml file (ascii)
} ATTRLISTENTRY, *PATTRLISTENTRY;
//
// Macro to define migdb entry when the entry name is the same for both xml and inf
//
#define MIGDB_ENTRY(entry) { entry, NULL, SDB_MATCHINGINFO_##entry, _T(#entry) }
//
// Macro to define migdb entry when the entry name is not the same
// entry with equivalent entry being present in xml
//
#define MIGDB_ENTRY2(entry, entXML, entInf) \
{ entry, _T(#entInf), SDB_MATCHINGINFO_##entXML, _T(#entXML) }
//
// entry with no equivalence in xml
//
#define MIGDB_ENTRY3(entry, entInf) \
{ entry, _T(#entInf), 0, NULL }
#define MIGDB_ENTRY4(entry) \
{ entry, _T(#entry), 0, NULL }
#define MIGDB_ENTRY5(entry, entInc, entXML) \
{ entry, _T(#entry), SDB_MATCHINGINFO_##entInc, _T(#entXML) }
////////////////////////////////////////////////////////////////////////////////////////////////////////
//
// MigDB parser
//
//
class MigEntry; // collection of attributes
class MigSection; // section (collection of entries or other sections)
class MigAttribute; // indivitual attribute
class MigDatabase; // migration database
// this is a "named" collection of attributes
// equivalent to a line in an inf file
//
//
class MigEntry : public SdbArrayElement {
public:
// construction
MigEntry(MigDatabase* pMigDB) :
m_pMigDB(pMigDB) {};
// properties
//
// implied: m_csName
//
SdbArray<MigAttribute> m_rgAttrs; // attributes (collection of pointers of type MigAttribute*)
//
// pointer to mig database
//
MigDatabase* m_pMigDB;
// methods
//
// Dump inf into a file
//
CString dump(void);
// format entry name (exe name)
//
CString FormatName(void);
//
// translate from the matching file into MigEntry
//
MigEntry& operator=(SdbMatchingFile& rMatchingFile);
};
//
// these are "matching exes" - aka "Section"
//
//
class MigSection : public SdbArrayElement {
// implied: m_csName (aka "section name or exe name")
public:
// each element of the array
// may be of the type MigMatchingFile OR
// MigSection
// we determine which one that is using rtti
//
MigSection(MigDatabase* pMigDB) :
m_pMigDB(pMigDB),
m_nEntry(0),
m_bTopLevel(FALSE),
m_Operation(MIGOP_AND) {};
SdbArray<SdbArrayElement> m_rgEntries; // these are matching exes or subsections
MIGMATCHOPERATION m_Operation; // operation (AND/OR)
BOOL m_bTopLevel; // top level Section or not
LONG m_nEntry;
MigDatabase* m_pMigDB;
MigSection& operator=(SdbMatchOperation& rMatch);
//
// method to dump the section into the file
//
CString dump(LPCTSTR lpszDescription = NULL, int* pIndexContents = NULL, BOOL bNoHeader = FALSE, BOOL bInline = TRUE);
};
//
// MigAttribute
//
class MigAttribute : public SdbArrayElement {
public: // methods
MigAttribute(MigDatabase* pMigDB) :
m_pMigDB(pMigDB),
m_type(NONE),
m_bNot(FALSE),
m_pSection(NULL) {};
~MigAttribute() {
if (m_pSection != NULL) {
delete m_pSection;
}
}
// implied m_csName
public: // data
MIGATTRTYPE m_type;
BOOL m_bNot; // is operation NOT applied
union {
LONG m_lValue; // long value for the attribute
ULONG m_ulValue; // ulong value
DWORD m_dwValue;
ULONGLONG m_ullValue; // unsigned long long
ULARGE_INTEGER m_uliValue; // unsigned large integer
// if this attribute is REQFile then we use special
// value along with the pointer to Attribute collection
};
CString m_csValue; // string value
MigSection* m_pSection; // section (used for ARG and REQFILE)
MigDatabase* m_pMigDB;
CString dump(void);
};
class MigApp : public SdbArrayElement {
public:
MigApp(MigDatabase* pMigDB) :
m_pMigDB(pMigDB),
m_pSection(NULL),
m_bShowInSimplifiedView(FALSE) {}
~MigApp() {
if (m_pSection != NULL) {
delete m_pSection;
}
}
// implied m_csName
CString m_csSection; // name used in .inf file
CString m_csDescription; // description from .inf file
// section that is used (can represent single file or a real section)
MigSection* m_pSection; // section (contents of the app tag)
BOOL m_bShowInSimplifiedView;
SdbArray<SdbArrayElement> m_rgArgs; // ARGs that go with this...
MigDatabase* m_pMigDB; // Mig db
CString dump(VOID);
MigApp& operator=(SdbWin9xMigration& rMig);
};
class MigDatabase {
public:
MigDatabase() :
m_dwStringCount(0),
m_dwExeCount(0) { }
~MigDatabase() {
POSITION pos = m_mapSections.GetStartPosition();
CString csSection;
SdbArray<SdbArrayElement>* prgApp;
while(pos) {
m_mapSections.GetNextAssoc(pos, csSection, (LPVOID&)prgApp);
delete prgApp;
}
}
//
// methods:
//
CString GetAppTitle(
SdbWin9xMigration* pAppMig
);
BOOL MigDatabase::AddApp( // adds application to the migdb
MigApp* pApp
);
CString GetSectionFromExe(
SdbExe* pExe
);
CString GetDescriptionStringID(
SdbWin9xMigration* pMigration
);
CString GetDescriptionString(
SdbWin9xMigration* pMigration
);
CString FormatDescriptionStringID(
SdbWin9xMigration* pMigration
);
BOOL Populate(
VOID
);
BOOL PopulateStrings(
VOID
);
BOOL DumpMigDBStrings(
LPCTSTR lpszFilename
);
BOOL DumpMigDBInf(
LPCTSTR lpszFilename
);
//
// just the temporary storage for db we're working with (this is the db that has exes -> which is AppHelpDatabase)
//
SdbDatabase* m_pFixDatabase;
SdbDatabase* m_pAppHelpDatabase;
SdbDatabase* m_pMessageDatabase;
//
// output - supplemental sections
//
CStringArray m_rgOut; // output strings that contain supplemental sections
//
// String table, maps string ids to string content
//
CMapStringToString m_mapStringsOut;
//
// maps section names to arrays of objects of type MigApp
//
CMapStringToPtr m_mapSections;
//
// simple counter for strings to aid in the process of generating unique names
//
DWORD m_dwStringCount;
//
// count of exes to keep entries unique
//
DWORD m_dwExeCount;
};
class CMigDBException : public CException {
public:
CMigDBException(LPCTSTR lpszError = NULL) {
if (lpszError != NULL) {
m_csError = lpszError;
}
}
virtual BOOL GetErrorMessage(LPTSTR lpszMessage, UINT nMaxError, PUINT puiHelpContext = NULL) {
if (m_csError.GetLength() > 0 && nMaxError > (UINT)m_csError.GetLength()) {
StringCchCopy(lpszMessage, nMaxError, (LPCTSTR)m_csError);
return TRUE;
}
return FALSE;
}
CString m_csError;
};
BOOL WriteMigDBFile(
SdbDatabase* pFixDatabase,
SdbDatabase* pAppHelpDatabase,
SdbDatabase* pMessageDatabase,
LPCTSTR lpszFileName
);
#endif