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.
410 lines
9.7 KiB
410 lines
9.7 KiB
|
|
////////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// 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
|
|
|
|
|
|
|