|
|
////////////////////////////////////////////////////////////////////////////////////
//
// File: write.cpp
//
// History: 16-Nov-00 markder Created.
//
// Desc: This file contains all code needed to create SDB files
// from the SdbDatabase internal C++ object.
//
////////////////////////////////////////////////////////////////////////////////////
#include "StdAfx.h"
#include "make.h"
DWORD g_dwCurrentWriteFilter = SDB_FILTER_INCLUDE_ALL; DATE g_dtCurrentWriteRevisionCutoff = 0;
////////////////////////////////////////////////////////////////////////////////////
//
// Func: GetUniqueCount
//
// Desc: Returns the count of unique index entries given an "ordered"
// array of exes
//
DWORD GetUniqueCount(SdbRefArray<SdbExe>* prgExes, DWORD dwFilter, DATE dtRevisionCutoff, BOOL bWildCard) { int i; SdbExe* pExe; DWORD dwCount = 0; ULONGLONG ullKey = 0;
for (i = 0; i < prgExes->GetSize(); ++i) { pExe = (SdbExe*)prgExes->GetAt(i);
if (!(pExe->m_bWildcardInName ^ bWildCard)) { // XOR is 1 if the args are different and
// is 0 if the args are the same
if ((pExe->m_dwFilter & dwFilter) && dtRevisionCutoff <= pExe->m_dtLastRevision) { if (ullKey != pExe->m_ullKey) { ullKey = pExe->m_ullKey; ++dwCount; } } } } return dwCount; }
BOOL WriteDatabase( SdbOutputFile* pOutputFile, SdbDatabase* pDatabase) { BOOL bSuccess = FALSE; PDB pdb = NULL;
pdb = SdbCreateDatabase(pOutputFile->m_csName, DOS_PATH); if (pdb == NULL) { SDBERROR_FORMAT((_T("Error creating database \"%s\".\n"), pOutputFile->m_csName)); goto eh; }
pDatabase->m_Library.SanitizeTagIDs();
if (!pDatabase->WriteToSDB(pdb)) { SDBERROR_PROPOGATE(); goto eh; }
bSuccess = TRUE;
eh: if (pdb) { SdbCloseDatabase(pdb); }
if (bSuccess == FALSE) { //
// We need to delete the .SDB that has been created. We had an error
// but shimdbc has made the .SDB for the XML till it hit the error. This is typically
// in the case when we hit a tag in the summary part of a XML for a custom SDB
// that is not allowed in the summary part. For e.g if we have
// *********************************************************************
// <LIBRARY>
// <MESSAGE NAME="1" ID="{5DE255AF-350F-4A94-896E-249561039F13}">
// <SUMMARY>
// <B>sd</B>
// </SUMMARY>
// </MESSAGE>
// </LIBRARY>
//
//**********************************************************************
// Such an .SDB is an invalid .SDB and should be removed
//
DeleteFile(pOutputFile->GetFullPath()); }
return bSuccess; }
VOID SdbLibrary::SanitizeTagIDs(VOID) { INT i;
for (i = 0; i < m_rgShims.GetSize(); ++i) { SdbShim* pShim = (SdbShim*)m_rgShims.GetAt(i); pShim->m_tiTagID = TAGID_NULL; }
for (i = 0; i < m_rgPatches.GetSize(); ++i) { SdbPatch* pPatch = (SdbPatch*)m_rgPatches.GetAt(i); pPatch->m_tiTagID = TAGID_NULL; }
for (i = 0; i < m_rgLayers.GetSize(); ++i) { SdbLayer* pLayer = (SdbLayer*)m_rgLayers.GetAt(i); pLayer->m_tiTagID = TAGID_NULL; }
for (i = 0; i < m_rgFiles.GetSize(); ++i) { SdbFile* pFile = (SdbFile*)m_rgFiles.GetAt(i); pFile->m_tiTagID = TAGID_NULL; }
for (i = 0; i < m_rgMsiTransforms.GetSize(); ++i) { SdbMsiTransform* pTransform = (SdbMsiTransform*)m_rgMsiTransforms.GetAt(i); pTransform->m_tiTagID = TAGID_NULL; }
}
BOOL SdbDatabase::WriteToSDB(PDB pdb) { BOOL bSuccess = FALSE; BOOL bAtLeastOneIndex = FALSE;
TAGID tiDatabase;
FILETIME ftBuildStamp; LARGE_INTEGER liBuildStamp;
DWORD dwHTMLHelpID; LANGID langID; DWORD dwUniqueCount = 0;
long i, j; SdbAppHelp* pAppHelp; SdbMessage* pMessage;
CString csURL, csLinkText, csContactInfo; CString csAppTitle, csSummary, csDetails, csID, csDBName; CString csLanguagesParam, csLangID; CStringArray rgLanguages;
csLanguagesParam = m_pCurrentOutputFile->GetParameter(_T("LANGUAGES")); if (csLanguagesParam.GetLength()) { if (!ParseLanguagesString(csLanguagesParam, &rgLanguages)) { SDBERROR_FORMAT((_T("Error parsing LANGUAGES parameter in makefile: %s\n"), csLanguagesParam)); goto eh; } } else { rgLanguages.Add(m_pCurrentMakefile->m_csLangID); }
//
// Allocate indexes
//
dwUniqueCount = GetUniqueCount(&m_rgExes, m_pCurrentOutputFile->m_dwFilter, g_dtCurrentWriteRevisionCutoff, FALSE);
if (m_pCurrentOutputFile->m_dwFilter & (SDB_FILTER_FIX | SDB_FILTER_DRIVER)) {
if (!SdbDeclareIndex(pdb, TAG_EXE, TAG_NAME, dwUniqueCount, TRUE, &m_iiExeIndex)) { SDBERROR(_T("Error declaring index for Exes.\n")); goto eh; }
bAtLeastOneIndex = TRUE; }
if (m_pCurrentOutputFile->m_dwFilter & SDB_FILTER_FIX) {
if (!SdbDeclareIndex(pdb, TAG_EXE, TAG_WILDCARD_NAME, (DWORD)m_rgWildcardExes.GetFilteredCount(m_pCurrentOutputFile->m_dwFilter, g_dtCurrentWriteRevisionCutoff), FALSE, &m_iiWildcardExeIndex)) { SDBERROR(_T("Error declaring index for wildcard Exes.\n")); goto eh; }
if (!SdbDeclareIndex(pdb, TAG_EXE, TAG_16BIT_MODULE_NAME, (DWORD)m_rgModuleExes.GetFilteredCount(m_pCurrentOutputFile->m_dwFilter, g_dtCurrentWriteRevisionCutoff), FALSE, &m_iiModuleExeIndex)) { SDBERROR(_T("Error declaring index for wildcard Exes.\n")); goto eh; }
if (!SdbDeclareIndex(pdb, TAG_SHIM, TAG_NAME, (DWORD)m_Library.m_rgShims.GetFilteredCount(m_pCurrentOutputFile->m_dwFilter, 0), FALSE, &m_iiShimIndex)) { SDBERROR(_T("Error declaring index for Shims.\n")); goto eh; }
bAtLeastOneIndex = TRUE; }
if (m_pCurrentOutputFile->m_dwFilter & SDB_FILTER_APPHELP) {
if (!SdbDeclareIndex(pdb, TAG_APPHELP, TAG_HTMLHELPID, (DWORD) (m_rgAppHelps.GetFilteredCount(m_pCurrentOutputFile->m_dwFilter, g_dtCurrentWriteRevisionCutoff) * rgLanguages.GetSize()), FALSE, &m_iiHtmlHelpID)) { SDBERROR(_T("Error declaring index for HTMLHELPID\n")); goto eh; }
bAtLeastOneIndex = TRUE; }
if (m_pCurrentOutputFile->m_dwFilter & SDB_FILTER_MSI) {
//
// MSI_TRANSFORM index, unique style (it's more efficient) - these are "fixes"
//
if (!SdbDeclareIndex(pdb, TAG_MSI_TRANSFORM, TAG_NAME, (DWORD)m_Library.m_rgMsiTransforms.GetFilteredCount(m_pCurrentOutputFile->m_dwFilter, g_dtCurrentWriteRevisionCutoff), TRUE, &m_iiMsiTransformIndex)) { SDBERROR(_T("Error declaring index for MSI Transforms.\n")); goto eh; }
//
// MSI_PACKAGE index, unique style (it's more efficient, again)
//
if (!SdbDeclareIndex(pdb, TAG_MSI_PACKAGE, TAG_MSI_PACKAGE_ID, m_rgMsiPackages.GetFilteredCount(m_pCurrentOutputFile->m_dwFilter, g_dtCurrentWriteRevisionCutoff), FALSE, &m_iiMsiPackageIndex)) { SDBERROR(_T("Error declaring index for MSI Packages.\n")); goto eh; }
if (!SdbDeclareIndex(pdb, TAG_MSI_PACKAGE, TAG_EXE_ID, m_rgMsiPackages.GetFilteredCount(m_pCurrentOutputFile->m_dwFilter, g_dtCurrentWriteRevisionCutoff), TRUE, &m_iiMsiIDIndex)) { SDBERROR(_T("Error declaring index for MSI Exe IDs.\n")); goto eh; }
bAtLeastOneIndex = TRUE; }
if (m_pCurrentOutputFile->m_dwFilter & SDB_FILTER_DRIVER) { if (!SdbDeclareIndex(pdb, TAG_EXE, TAG_EXE_ID, m_rgExes.GetFilteredCount(m_pCurrentOutputFile->m_dwFilter, g_dtCurrentWriteRevisionCutoff), FALSE, &m_iiDrvIDIndex)) { SDBERROR(_T("Error declaring index for DRIVER ID\n")); goto eh; }
bAtLeastOneIndex = TRUE; }
if (bAtLeastOneIndex) {
if (!SdbCommitIndexes(pdb)) { SDBERROR(_T("Error ending index declarations.\n")); goto eh; } }
//
// Open tag
//
tiDatabase = SdbBeginWriteListTag(pdb, TAG_DATABASE); if (!tiDatabase) { SDBERROR(_T("Error writing DATABASE tag\n")); goto eh; }
//
// Stamp the build time
//
GetSystemTimeAsFileTime(&ftBuildStamp); liBuildStamp.LowPart = ftBuildStamp.dwLowDateTime; liBuildStamp.HighPart = ftBuildStamp.dwHighDateTime;
if (!SdbWriteQWORDTag(pdb, TAG_TIME, liBuildStamp.QuadPart)) { SDBERROR(_T("Error writing TIME\n")); goto eh; }
//
// Stamp the compiler version
//
if (!SdbWriteStringTag(pdb, TAG_COMPILER_VERSION, g_szVersion)) { SDBERROR(_T("Error writing COMPILER_VERSION\n")); goto eh; }
//
// Look for name from makefile
//
csDBName = m_pDB->m_pCurrentOutputFile->GetParameter(_T("DATABASE NAME"));
if (csDBName.IsEmpty()) { csDBName = m_csName; }
//
// Write the name of the database
//
if (!SdbWriteStringTag(pdb, TAG_NAME, csDBName)) { SDBERROR(_T("Error writing TAG_NAME\n")); goto eh; }
//
// Look for GUID from makefile
//
csID = m_pDB->m_pCurrentOutputFile->GetParameter(_T("DATABASE ID"));
if (csID.GetLength()) { if (!GUIDFromString(csID, &m_CurrentDBID)) { SDBERROR_FORMAT((_T("Bad GUID specified for DATABASE_ID: %s\n"), csID)); goto eh; } } else { //
// Not there, take the ID from the XML file
//
m_CurrentDBID = m_ID; }
//
// Write the GUID
//
if (!SdbWriteBinaryTag(pdb, TAG_DATABASE_ID, (PBYTE)&m_CurrentDBID, sizeof(m_CurrentDBID))) { SDBERROR(_T("Error writing TAG_DATABASE_ID\n")); goto eh; }
if (m_pCurrentOutputFile->m_dwFilter & ~SDB_FILTER_DRIVER) { //
// Write the Library
//
if (!m_Library.WriteToSDB(pdb)) { SDBERROR_PROPOGATE(); goto eh; } }
//
// Action
//
if (!m_rgAction.WriteToSDB(pdb)) { SDBERROR_PROPOGATE(); goto eh; }
if (m_pCurrentOutputFile->m_dwFilter & SDB_FILTER_FIX) {
//
// First write all the EXEs with wild-card names
//
if (!SdbStartIndexing(pdb, m_iiWildcardExeIndex)) { SDBERROR(_T("Error starting to index wildcard Exes.\n")); goto eh; }
//
// Wildcard Exes
//
if (!m_rgWildcardExes.WriteToSDB(pdb)) { SDBERROR_PROPOGATE(); goto eh; }
//
// Done indexing the wildcard exes
//
if (!SdbStopIndexing(pdb, m_iiWildcardExeIndex)) { SDBERROR(_T("Error stopping indexing wildcard Exes.\n")); goto eh; }
//
// Next write all the EXEs with module names
//
if (!SdbStartIndexing(pdb, m_iiModuleExeIndex)) { SDBERROR(_T("Error starting to index Module Exes.\n")); goto eh; }
//
// Module Exes
//
if (!m_rgModuleExes.WriteToSDB(pdb)) { SDBERROR_PROPOGATE(); goto eh; }
//
// Done indexing the module exes
//
if (!SdbStopIndexing(pdb, m_iiModuleExeIndex)) { SDBERROR(_T("Error stopping indexing Module Exes.\n")); goto eh; } }
if (m_pCurrentOutputFile->m_dwFilter & (SDB_FILTER_FIX | SDB_FILTER_DRIVER)) { //
// Go ahead and start indexing normal exes
//
if (!SdbStartIndexing(pdb, m_iiExeIndex)) { SDBERROR(_T("Error starting to index Exes.\n")); goto eh; }
if (m_pCurrentOutputFile->m_dwFilter & SDB_FILTER_DRIVER) { if (!SdbStartIndexing(pdb, m_iiDrvIDIndex)) { SDBERROR(_T("Error starting to index driver IDs\n")); goto eh; } }
if (!m_rgExes.WriteToSDB(pdb)) { SDBERROR_PROPOGATE(); goto eh; }
if (m_pCurrentOutputFile->m_dwFilter & SDB_FILTER_DRIVER) { if (!SdbStopIndexing(pdb, m_iiDrvIDIndex)) { SDBERROR(_T("Error stopping indexing driver IDs\n")); goto eh; } }
//
// Done indexing the exes
//
if (!SdbStopIndexing(pdb, m_iiExeIndex)) { SDBERROR(_T("Error stopping indexing Exes.\n")); goto eh; } }
if (m_pCurrentOutputFile->m_dwFilter & SDB_FILTER_MSI) { //
// MSI Packages, they are just like EXEs
// but indexed not by name but by their GUID IDs
//
if (!SdbStartIndexing(pdb, m_iiMsiPackageIndex)) { SDBERROR(_T("Error starting to index MSI Packages.\n")); goto eh; } if (!SdbStartIndexing(pdb, m_iiMsiIDIndex)) { SDBERROR(_T("Error starting to index MSI packages by exe id\n")); goto eh; }
if (!m_rgMsiPackages.WriteToSDB(pdb)) { SDBERROR_PROPOGATE(); goto eh; }
if (!SdbStopIndexing(pdb, m_iiMsiIDIndex)) { SDBERROR(_T("Error stopping indexing of MSI packages by exe id\n")); goto eh; }
if (!SdbStopIndexing(pdb, m_iiMsiPackageIndex)) { SDBERROR(_T("Error stopping indexing MSI Packages.\n")); goto eh; } }
if (m_pCurrentOutputFile->m_dwFilter & SDB_FILTER_APPHELP) { //
// Start indexing apphelps
//
if (!SdbStartIndexing(pdb, m_iiHtmlHelpID)) { SDBERROR( _T("Error starting to index HTMLHELPID.\n")); goto eh; }
for (i = 0; i < m_rgAppHelps.GetSize(); i++) { pAppHelp = (SdbAppHelp *) m_rgAppHelps[i];
if (!(pAppHelp->m_dwFilter & m_pCurrentOutputFile->m_dwFilter)) { continue; }
if (g_dtCurrentWriteRevisionCutoff > pAppHelp->m_dtLastRevision) { continue; }
for (j = 0; j < rgLanguages.GetSize(); j++) {
csLangID = rgLanguages[j];
pMessage = (SdbMessage *) m_rgMessages.LookupName(pAppHelp->m_csMessage, csLangID);
if (pMessage == NULL) { SDBERROR_FORMAT((_T("Localized MESSAGE not found for\n NAME: %s\n HTMLHELPID: %s\n LANG: %s\n"), pAppHelp->m_csMessage, pAppHelp->m_csName, csLangID)); goto eh; }
if (!ConstructMessageParts( pAppHelp, pMessage, csLangID, &dwHTMLHelpID, &csURL, &csContactInfo, &csAppTitle, &csSummary, &csDetails)) { SDBERROR_PROPOGATE(); goto eh; }
if (g_bStrict) {
if (csURL.IsEmpty()) { SDBERROR_FORMAT((_T("ERROR: Empty string for URL on\n NAME: %s\n HTMLHELPID: %s\n LANG: %s\n\n"), pAppHelp->m_pApp->m_csName, pAppHelp->m_csName, csLangID)); goto eh; }
if (csAppTitle.IsEmpty()) { SDBERROR_FORMAT((_T("ERROR: Empty string for APP_TITLE on\n NAME: %s\n HTMLHELPID: %s\n LANG: %s\n\n"), pAppHelp->m_pApp->m_csName, pAppHelp->m_csName, csLangID)); goto eh; }
if (csSummary.IsEmpty()) { SDBERROR_FORMAT((_T("ERROR: Empty string for SUMMARY on\n NAME: %s\n HTMLHELPID: %s\n LANG: %s\n\n"), pAppHelp->m_pApp->m_csName, pAppHelp->m_csName, csLangID)); goto eh; } }
if (!WriteAppHelpRefTag( pdb, pAppHelp->m_csName, csLangID == _T("---") ? 0 : m_pCurrentMakefile->GetLangMap(csLangID)->m_lcid, csURL, csAppTitle, csSummary)) { SDBERROR_PROPOGATE(); goto eh; } } }
//
// Stop indexing apphelps
//
if (!SdbStopIndexing(pdb, m_iiHtmlHelpID)) { SDBERROR( _T("Error stopping indexing HTMLHELPID.\n")); goto eh; } }
//
// Close tag
//
if (!SdbEndWriteListTag(pdb, tiDatabase)) { SDBERROR(_T("Error writing TAG_DATABASE\n")); goto eh; }
bSuccess = TRUE;
eh:
return bSuccess; }
BOOL SdbLibrary::WriteToSDB(PDB pdb) { BOOL bSuccess = FALSE;
TAGID tiLibrary;
//
// Open tag
//
tiLibrary = SdbBeginWriteListTag(pdb, TAG_LIBRARY); if (!tiLibrary) { SDBERROR(_T("Error writing TAG_LIBRARY\n")); goto eh; }
if (m_pDB->m_pCurrentOutputFile->m_dwFilter & SDB_FILTER_FIX) { //
// Global exclusion list
//
if (!m_rgCallers.WriteToSDB(pdb)) { SDBERROR_PROPOGATE(); goto eh; }
//
// Index the shims
//
if (!SdbStartIndexing(pdb, m_pDB->m_iiShimIndex)) { SDBERROR(_T("Error starting to index Dlls.\n")); goto eh; }
//
// Shims
//
if (!m_rgShims.WriteToSDB(pdb)) { SDBERROR_PROPOGATE(); goto eh; }
//
// Done indexing the shims
//
if (!SdbStopIndexing(pdb, m_pDB->m_iiShimIndex)) { SDBERROR(_T("Error stopping indexing shims.\n")); goto eh; }
//
// Patches
//
if (!m_rgPatches.WriteToSDB(pdb)) { SDBERROR_PROPOGATE(); goto eh; }
//
// Flags
//
if (!m_rgFlags.WriteToSDB(pdb)) { SDBERROR_PROPOGATE(); goto eh; } }
//
// Included files
//
if (!m_rgFiles.WriteToSDB(pdb)) { SDBERROR_PROPOGATE(); goto eh; }
if (m_pDB->m_pCurrentOutputFile->m_dwFilter & SDB_FILTER_MSI) { //
// Msi Transforms, indexed by the their respective name
//
if (!SdbStartIndexing(pdb, m_pDB->m_iiMsiTransformIndex)) { SDBERROR(_T("Error starting to index MSI Transforms.\n")); goto eh; }
if (!m_rgMsiTransforms.WriteToSDB(pdb)) { SDBERROR_PROPOGATE(); goto eh; }
if (!SdbStopIndexing(pdb, m_pDB->m_iiMsiTransformIndex)) { SDBERROR(_T("Error stopping indexing MSI Transforms.\n")); goto eh; } }
//
// Close tag
//
if (!SdbEndWriteListTag(pdb, tiLibrary)) { SDBERROR(_T("Error ending TAG_LIBRARY\n")); goto eh; }
if (m_pDB->m_pCurrentOutputFile->m_dwFilter & SDB_FILTER_FIX) { //
// Layers
//
// BUGBUG: Layers should be *inside* the library
//
if (!m_rgLayers.WriteToSDB(pdb)) { SDBERROR_PROPOGATE(); goto eh; } }
bSuccess = TRUE;
eh:
return bSuccess; }
BOOL SdbExe::WriteToSDB(PDB pdb) { BOOL bSuccess = FALSE;
TAGID tiExe; long i; ULONGLONG ullFlagsNTVDM1 = 0; ULONGLONG ullFlagsNTVDM2 = 0; ULONGLONG ullFlagsNTVDM3 = 0;
//
// Open tag
//
tiExe = SdbBeginWriteListTag(pdb, TAG_EXE); if (!tiExe) { SDBERROR(_T("Error writing TAG_EXE\n")); goto eh; }
//
// NAME (i.e., EXE filename)
//
if (m_csName.GetLength()) { if (!SdbWriteStringTag(pdb, TAG_NAME, m_csName)) { SDBERROR(_T("Error writing TAG_NAME\n")); goto eh; }
//
// If there's a wildcard in the name, write WILDCARD_NAME
// as well, for the indexing
//
if (m_bWildcardInName) { if (!SdbWriteStringTag(pdb, TAG_WILDCARD_NAME, m_csName)) { SDBERROR(_T("Error writing TAG_WILDCARD_NAME\n")); goto eh; } } //
// If this is supposed to match on module name, write that out too
//
if (m_bMatchOnModule) { if (!SdbWriteStringTag(pdb, TAG_16BIT_MODULE_NAME, m_csName)) { SDBERROR(_T("Error writing TAG_16BIT_MODULE_NAME\n")); goto eh; } } }
//
// APP_NAME (i.e., application title)
//
if (m_pApp != NULL) { if (m_pApp->m_csName.GetLength()) { if (!SdbWriteStringTag(pdb, TAG_APP_NAME, m_pApp->m_csName)) { SDBERROR(_T("Error writing TAG_APP_NAME\n")); goto eh; } } }
//
// VENDOR
//
if (m_pApp != NULL) { if (m_pApp->m_csVendor.GetLength()) { if (!SdbWriteStringTag(pdb, TAG_VENDOR, m_pApp->m_csVendor)) { SDBERROR(_T("Error writing TAG_VENDOR\n")); goto eh; } } }
//
// GUID (Unique ID)
//
if (!SdbWriteBinaryTag(pdb, TAG_EXE_ID, (PBYTE)&m_ID, sizeof(m_ID))) { SDBERROR(_T("Error writing TAG_EXE_ID\n")); goto eh; }
//
// OS SERVICE PACK mask if it's anything other than 0xFFFFFFFF
//
if (m_dwSPMask != 0xFFFFFFFF) { if (!SdbWriteDWORDTag(pdb, TAG_OS_SERVICE_PACK, m_dwSPMask)) { SDBERROR(_T("Error writing TAG_OS_SERVICE_PACK\n")); goto eh; } }
//
// Write the MATCH_MODE tag if it's anything other than NORMAL
//
if (m_dwMatchMode != MATCH_DEFAULT) { BOOL bWriteMatchMode = FALSE;
if (m_pDB->IsStandardDatabase()) { //
// standard db, we write match mode if it's not "normal"
// since normal is the default
//
bWriteMatchMode = (m_dwMatchMode != MATCHMODE_DEFAULT_MAIN); } else { //
// for custom dbs default match mode is additive
//
bWriteMatchMode = (m_dwMatchMode != MATCHMODE_DEFAULT_CUSTOM); }
if (bWriteMatchMode && !SdbWriteWORDTag(pdb, TAG_MATCH_MODE, (WORD)m_dwMatchMode)) { SDBERROR(_T("Error writing TAG_MATCH_MODE\n")); goto eh; } }
//
// Write the RUNTIME_PLATFORM tag if it's anything other than RUNTIME_PLATFORM_ANY
//
if (m_dwRuntimePlatform != RUNTIME_PLATFORM_ANY) { if (!SdbWriteDWORDTag(pdb, TAG_RUNTIME_PLATFORM, m_dwRuntimePlatform)) { SDBERROR(_T("Error writing RUNTIME_PLATFORM\n")); goto eh; } }
//
// Write the OS_SKU tag if it's anything other than OS_SKU_ALL
//
if (m_dwOSSKU != OS_SKU_ALL) { if (!SdbWriteDWORDTag(pdb, TAG_OS_SKU, m_dwOSSKU)) { SDBERROR(_T("Error writing OS_SKU\n")); goto eh; } }
//
// Message reference
//
if (m_AppHelpRef.m_pAppHelp) { if (!m_AppHelpRef.WriteToSDB(pdb)) { SDBERROR_PROPOGATE(); goto eh; } }
//
// Matching Files
//
if (!m_rgMatchingFiles.WriteToSDB(pdb)) { SDBERROR_PROPOGATE(); goto eh; }
//
// Shim references
//
if (!m_rgShimRefs.WriteToSDB(pdb)) { SDBERROR_PROPOGATE(); goto eh; }
//
// Flag references
//
if (!m_rgFlagRefs.WriteToSDB(pdb)) { SDBERROR_PROPOGATE(); goto eh; }
//
// Patches (by reference)
//
if (!m_rgPatches.WriteToSDB(pdb, TRUE)) { SDBERROR_PROPOGATE(); goto eh; }
//
// Layers references
//
if (!m_rgLayerRefs.WriteToSDB(pdb)) { SDBERROR_PROPOGATE(); goto eh; }
if (!m_csSXSManifest.IsEmpty()) { //
// Add XML header tag
//
WCHAR wszXMLHeader[] = L"<?xml version=\"1.0\" encoding=\"UCS-2\" standalone=\"yes\"?>";
//
// The whole manifest consists of the Unicode byte marker (1 byte), the XML header,
// the manifest itself, and a NULL terminator (1 byte).
//
DWORD dwSXSEntryLen = wcslen(wszXMLHeader) + m_csSXSManifest.GetLength() + 2; LPWSTR wszSXSEntry = (LPWSTR) (malloc(dwSXSEntryLen * sizeof(WCHAR)));
//
// Begin with 0xFF 0xFE Unicode byte order marker
//
UCHAR* szSXSEntry = (UCHAR*) wszSXSEntry; szSXSEntry[0] = 0xFF; szSXSEntry[1] = 0xFE;
//
// Add the XML header
//
StringCchCopy(wszSXSEntry + 1, dwSXSEntryLen, wszXMLHeader);
//
// Add the manifest
//
StringCchCat(wszSXSEntry, dwSXSEntryLen, m_csSXSManifest);
if (!SdbWriteStringTag(pdb, TAG_SXS_MANIFEST, wszSXSEntry)) { goto eh; }
free(wszSXSEntry); }
//
// Data
//
if (!m_rgData.WriteToSDB(pdb)) { SDBERROR_PROPOGATE(); goto eh; }
//
// Action
//
if (!m_rgAction.WriteToSDB(pdb)) { SDBERROR_PROPOGATE(); goto eh; }
//
// Close tag
//
if (!SdbEndWriteListTag(pdb, tiExe)) { SDBERROR(_T("Error ending TAG_EXE\n")); goto eh; }
bSuccess = TRUE;
eh:
return bSuccess; }
BOOL SdbMsiPackage::WriteToSDB(PDB pdb) { BOOL bSuccess = FALSE; TAGID tiMsiPackage;
//
// Open tag
//
tiMsiPackage = SdbBeginWriteListTag(pdb, TAG_MSI_PACKAGE); if (!tiMsiPackage) { SDBERROR(_T("Error writing TAG_MSI_PACKAGE\n")); goto eh; }
//
// NAME (i.e., EXE filename)
//
if (m_csName.GetLength()) { if (!SdbWriteStringTag(pdb, TAG_NAME, m_csName)) { SDBERROR(_T("Error writing TAG_NAME for MSI_PACKAGE\n")); goto eh; } }
//
// APP_NAME (i.e., application title)
//
if (m_pApp != NULL) { if (m_pApp->m_csName.GetLength()) { if (!SdbWriteStringTag(pdb, TAG_APP_NAME, m_pApp->m_csName)) { SDBERROR(_T("Error writing TAG_APP_NAME for MSI_PACKAGE\n")); goto eh; } } }
//
// GUID (unique ID)
//
if (!SdbWriteBinaryTag(pdb, TAG_EXE_ID, (PBYTE)&m_ID, sizeof(m_ID))) { SDBERROR(_T("Error writing TAG_EXE_ID\n")); goto eh; }
//
// GUID (non-Unique ID)
//
if (!SdbWriteBinaryTag(pdb, TAG_MSI_PACKAGE_ID, (PBYTE)&m_MsiPackageID, sizeof(m_MsiPackageID))) { SDBERROR(_T("Error writing TAG_MSI_PACKAGE_ID\n")); goto eh; }
//
// RUNTIME_PLATFORM data
//
if (m_dwRuntimePlatform != RUNTIME_PLATFORM_ANY) { if (!SdbWriteDWORDTag(pdb, TAG_RUNTIME_PLATFORM, m_dwRuntimePlatform)) { SDBERROR(_T("Error writing RUNTIME_PLATFORM\n")); goto eh; } }
//
// Write the OS_SKU tag if it's anything other than OS_SKU_ALL
//
if (m_dwOSSKU != OS_SKU_ALL) { if (!SdbWriteDWORDTag(pdb, TAG_OS_SKU, m_dwOSSKU)) { SDBERROR(_T("Error writing OS_SKU\n")); goto eh; } }
//
// Supplemental data
//
if (!m_rgData.WriteToSDB(pdb)) { SDBERROR_PROPOGATE(); goto eh; }
//
// applicable fixes (reference to transforms)
//
if (!m_rgMsiTransformRefs.WriteToSDB(pdb)) { SDBERROR_PROPOGATE(); goto eh; }
//
// Message reference
//
if (m_AppHelpRef.m_pAppHelp) { if (!m_AppHelpRef.WriteToSDB(pdb)) { SDBERROR_PROPOGATE(); goto eh; } }
//
// custom actions
//
if (!m_rgCustomActions.WriteToSDB(pdb)) { SDBERROR_PROPOGATE(); goto eh; }
//
// Close tag
//
if (!SdbEndWriteListTag(pdb, tiMsiPackage)) { SDBERROR(_T("Error ending TAG_MSI_PACKAGE\n")); goto eh; }
bSuccess = TRUE; eh: return bSuccess; }
BOOL SdbMsiCustomAction::WriteToSDB(PDB pdb) { TAGID tiMsiCustomAction; BOOL bSuccess = FALSE;
//
// Open tag
//
tiMsiCustomAction = SdbBeginWriteListTag(pdb, TAG_MSI_CUSTOM_ACTION); if (!tiMsiCustomAction) { SDBERROR(_T("Error writing TAG_MSI_CUSTOM_ACTION\n")); goto eh; }
//
// NAME (i.e., EXE filename)
//
if (m_csName.GetLength()) { if (!SdbWriteStringTag(pdb, TAG_NAME, m_csName)) { SDBERROR(_T("Error writing TAG_NAME for MSI_CUSTOM_ACTION\n")); goto eh; } }
//
// Shim references
//
if (!m_rgShimRefs.WriteToSDB(pdb)) { SDBERROR_PROPOGATE(); goto eh; }
if (!m_rgLayerRefs.WriteToSDB(pdb)) { SDBERROR_PROPOGATE(); goto eh; }
//
// Close tag
//
if (!SdbEndWriteListTag(pdb, tiMsiCustomAction)) { SDBERROR(_T("Error ending TAG_MSI_CUSTOM_ACTION\n")); goto eh; }
bSuccess = TRUE;
eh: return bSuccess;
}
BOOL SdbCaller::WriteToSDB(PDB pdb) { BOOL bSuccess = FALSE; TAGID tiCaller;
//
// Open tag
//
tiCaller = SdbBeginWriteListTag(pdb, TAG_INEXCLUDE); if (!tiCaller) { SDBERROR(_T("Error writing TAG_INEXCLUDE\n")); goto eh; }
//
// If it's an <INCLUDE> tag, write out the indicator
//
if (m_CallerType == SDB_CALLER_INCLUDE) { if (!SdbWriteNULLTag(pdb, TAG_INCLUDE)) { SDBERROR(_T("Error writing TAG_INCLUDE\n")); goto eh; } }
//
// Module
//
if (m_csModule.GetLength()) { if (!SdbWriteStringTag(pdb, TAG_MODULE, m_csModule)) { SDBERROR(_T("Error writing TAG_MODULE\n")); goto eh; } }
//
// Close tag
//
if (!SdbEndWriteListTag(pdb, tiCaller)) { SDBERROR(_T("Error ending TAG_INEXCLUDE\n")); goto eh; }
bSuccess = TRUE;
eh:
return bSuccess; }
BOOL SdbFile::WriteToSDB(PDB pdb) { BOOL bSuccess = FALSE; TAGID tiFile; CString csFileDir, csFilename;
csFileDir = MakeFullPath(m_pDB->m_pCurrentOutputFile->GetParameter(_T("INCLUDE FILES")));
//
// Check if filtered out
//
if (!(m_dwFilter & m_pDB->m_pCurrentOutputFile->m_dwFilter)) { //
// Filtered out, return success
//
return TRUE; }
//
// Open tag
//
tiFile = SdbBeginWriteListTag(pdb, TAG_FILE); if (!tiFile) { SDBERROR(_T("Error writing TAG_FILE\n")); goto eh; }
//
// NAME
//
if (m_csName.GetLength()) { if (!SdbWriteStringTag(pdb, TAG_NAME, m_csName)) { SDBERROR(_T("Error writing TAG_NAME\n")); goto eh; } }
//
// Binary data
//
if (csFileDir.GetLength()) { csFilename = csFileDir; csFilename += m_csName;
if (!SdbWriteBinaryTagFromFile(pdb, TAG_FILE_BITS, csFilename)) { if (g_bStrict) { SDBERROR_FORMAT((_T("Can't find FILE \"%s\". No bits written.\n"), csFilename)); goto eh; } } } else { if (g_bStrict) { SDBERROR_FORMAT((_T("Can't find FILE \"%s\". -f compiler flag required.\n"), m_csName)); goto eh; } }
//
// Close tag
//
if (!SdbEndWriteListTag(pdb, tiFile)) { SDBERROR(_T("Error ending TAG_FILE\n")); goto eh; }
m_tiTagID = tiFile; // this is the tagid as it was written into the database
bSuccess = TRUE;
eh:
return bSuccess; }
BOOL SdbShimRef::WriteToSDB(PDB pdb) { BOOL bSuccess = FALSE; TAGID tiShimRef;
//
// Open tag
//
tiShimRef = SdbBeginWriteListTag(pdb, TAG_SHIM_REF); if (!tiShimRef) { SDBERROR(_T("Error writing TAG_SHIM_REF\n")); goto eh; }
//
// NAME
//
if (!SdbWriteStringTag(pdb, TAG_NAME, m_csName)) { SDBERROR(_T("Error writing NAME tag\n")); goto eh; }
//
// Write TAGID of the SHIM in the LIBRARY, if any
//
if (m_pShim && m_pShim->m_tiTagID) { if (!SdbWriteDWORDTag(pdb, TAG_SHIM_TAGID, m_pShim->m_tiTagID)) { SDBERROR(_T("Error writing TAG_SHIM_TAGID\n")); goto eh; } }
//
// COMMAND_LINE
//
if (m_csCommandLine.GetLength()) {
//
// process this command line first
//
CString csProcessedCmdLine = ProcessShimCmdLine(m_csCommandLine, m_pDB->m_CurrentDBID, tiShimRef);
if (!SdbWriteStringTag(pdb, TAG_COMMAND_LINE, csProcessedCmdLine)) { SDBERROR(_T("Error writing COMMAND_LINE tag\n")); goto eh; } }
//
// Inclusion/exclusion list
//
if (!m_rgCallers.WriteToSDB(pdb)) { SDBERROR_PROPOGATE(); goto eh; }
//
// child data tags
//
if (!m_rgData.WriteToSDB(pdb)) { SDBERROR_PROPOGATE(); goto eh; }
//
// Close tag
//
if (!SdbEndWriteListTag(pdb, tiShimRef)) { SDBERROR(_T("Error ending TAG_SHIM_REF\n")); goto eh; }
bSuccess = TRUE;
eh:
return bSuccess; }
BOOL SdbShim::WriteToSDB(PDB pdb) { BOOL bSuccess = FALSE; TAGID tiShim;
//
// Open tag
//
tiShim = SdbBeginWriteListTag(pdb, TAG_SHIM); if (!tiShim) { SDBERROR(_T("Error writing TAG_SHIM\n")); goto eh; }
m_tiTagID = tiShim;
//
// NAME
//
if (m_csName.GetLength()) { if (!SdbWriteStringTag(pdb, TAG_NAME, m_csName)) { SDBERROR(_T("Error writing TAG_NAME\n")); goto eh; } }
if (m_csDllFile.GetLength()) { if (!SdbWriteStringTag(pdb, TAG_DLLFILE, m_csDllFile)) { SDBERROR(_T("Error writing TAG_DLLFILE\n")); goto eh; } }
//
// DESCRIPTION, only written for general-purpose shims
//
if (m_csDesc.GetLength() && m_Purpose == SDB_PURPOSE_GENERAL) { //
// Remove all extra white space and new line characters
// via TrimParagraph()
//
if (!SdbWriteStringTag(pdb, TAG_DESCRIPTION, TrimParagraph(m_csDesc))) { SDBERROR(_T("Error writing TAG_DESCRIPTION\n")); goto eh; } }
//
// Purpose (if general)
//
if (m_Purpose == SDB_PURPOSE_GENERAL) { if (!SdbWriteNULLTag(pdb, TAG_GENERAL)) { SDBERROR(_T("Error writing TAG_GENERAL\n")); goto eh; } }
//
// APPLY_ALL_SHIMS flag
//
if (m_bApplyAllShims) { if (!SdbWriteNULLTag(pdb, TAG_APPLY_ALL_SHIMS)) { SDBERROR(_T("Error writing TAG_APPLY_ALL_SHIMS\n")); goto eh; } }
//
// Inclusion/exclusion list
//
if (!m_rgCallers.WriteToSDB(pdb)) { SDBERROR_PROPOGATE(); goto eh; }
//
// Close tag
//
if (!SdbEndWriteListTag(pdb, tiShim)) { SDBERROR(_T("Error ending TAG_SHIM\n")); goto eh; }
bSuccess = TRUE;
eh:
return bSuccess; }
BOOL SdbPatch::WriteToSDB(PDB pdb) { BOOL bSuccess = FALSE; TAGID tiPatch;
//
// Open tag
//
tiPatch = SdbBeginWriteListTag(pdb, TAG_PATCH); if (!tiPatch) { SDBERROR(_T("Error writing TAG_PATCH\n")); goto eh; }
m_tiTagID = tiPatch;
//
// NAME
//
if (m_csName.GetLength()) { if (!SdbWriteStringTag(pdb, TAG_NAME, m_csName)) { SDBERROR(_T("Error writing TAG_NAME\n")); goto eh; } }
//
// Patch bits
//
if (GetBlobSize()) { if (!SdbWriteBinaryTag(pdb, TAG_PATCH_BITS, GetBlobBytes(), GetBlobSize())) { SDBERROR_FORMAT((_T("Error writing patch bytes \"%s\"\n"), m_csName)); goto eh; } }
//
// Close tag
//
if (!SdbEndWriteListTag(pdb, tiPatch)) { SDBERROR(_T("Error ending TAG_PATCH\n")); goto eh; }
bSuccess = TRUE;
eh:
return bSuccess; }
BOOL SdbPatch::WriteRefToSDB(PDB pdb) { BOOL bSuccess = FALSE; TAGID tiPatch;
//
// Open tag
//
tiPatch = SdbBeginWriteListTag(pdb, TAG_PATCH_REF); if (!tiPatch) { SDBERROR(_T("Error writing TAG_PATCH\n")); goto eh; }
//
// NAME
//
if (m_csName.GetLength()) { if (!SdbWriteStringTag(pdb, TAG_NAME, m_csName)) { SDBERROR(_T("Error writing TAG_NAME\n")); goto eh; } }
//
// Write TAGID of the PATCH in the LIBRARY, if any
//
if (m_tiTagID) { if (!SdbWriteDWORDTag(pdb, TAG_PATCH_TAGID, m_tiTagID)) { SDBERROR(_T("Error writing TAG_PATCH_TAGID\n")); goto eh; } }
//
// Close tag
//
if (!SdbEndWriteListTag(pdb, tiPatch)) { SDBERROR(_T("Error ending TAG_PATCH\n")); goto eh; }
bSuccess = TRUE;
eh:
return bSuccess; }
BOOL SdbFlag::WriteToSDB(PDB pdb) { BOOL bSuccess = FALSE; TAGID tiFlag;
//
// Open tag
//
tiFlag = SdbBeginWriteListTag(pdb, TAG_FLAG); if (!tiFlag) { SDBERROR(_T("Error writing TAG_FLAG\n")); goto eh; }
m_tiTagID = tiFlag;
//
// NAME
//
if (m_csName.GetLength()) { if (!SdbWriteStringTag(pdb, TAG_NAME, m_csName)) { SDBERROR(_T("Error writing TAG_NAME\n")); goto eh; } }
//
// DESCRIPTION, only general-purpose descriptions
//
if (m_csDesc.GetLength() && m_Purpose == SDB_PURPOSE_GENERAL) { //
// Remove all extra white space and new line characters
// via TrimParagraph()
//
if (!SdbWriteStringTag(pdb, TAG_DESCRIPTION, TrimParagraph(m_csDesc))) { SDBERROR(_T("Error writing TAG_DESCRIPTION\n")); goto eh; } }
//
// Mask
//
if (!SdbWriteQWORDTag(pdb, TagFromType(m_dwType), m_ullMask)) { SDBERROR(_T("Error writing <FLAG> in <LIBRARY>\n")); goto eh; }
//
// Purpose (if general)
//
if (m_Purpose == SDB_PURPOSE_GENERAL) { if (!SdbWriteNULLTag(pdb, TAG_GENERAL)) { SDBERROR(_T("Error writing TAG_GENERAL\n")); goto eh; } }
//
// Close tag
//
if (!SdbEndWriteListTag(pdb, tiFlag)) { SDBERROR(_T("Error ending TAG_FLAG\n")); goto eh; }
bSuccess = TRUE;
eh:
return bSuccess; }
BOOL SdbFlagRef::WriteToSDB(PDB pdb) { BOOL bSuccess = FALSE; TAGID tiFlagRef;
//
// Open tag
//
tiFlagRef = SdbBeginWriteListTag(pdb, TAG_FLAG_REF); if (!tiFlagRef) { SDBERROR(_T("Error writing TAG_FLAG_REF\n")); goto eh; }
//
// NAME
//
if (!SdbWriteStringTag(pdb, TAG_NAME, m_csName)) { SDBERROR(_T("Error writing NAME tag\n")); goto eh; }
//
// Write TAGID of the FLAG in the LIBRARY, if any
//
if (m_pFlag && m_pFlag->m_tiTagID) { if (!SdbWriteDWORDTag(pdb, TAG_FLAG_TAGID, m_pFlag->m_tiTagID)) { SDBERROR(_T("Error writing TAG_FLAG_TAGID\n")); goto eh; } }
//
// Write Command Line tag
//
if (m_csCommandLine.GetLength()) { if (!SdbWriteStringTag(pdb, TAG_COMMAND_LINE, m_csCommandLine)) { SDBERROR(_T("Error writing COMMAND_LINE tag for flag\n")); goto eh; } }
//
// Close tag
//
if (!SdbEndWriteListTag(pdb, tiFlagRef)) { SDBERROR(_T("Error ending TAG_FLAG_REF\n")); goto eh; }
bSuccess = TRUE;
eh:
return bSuccess; }
BOOL SdbMsiTransformRef::WriteToSDB(PDB pdb) { BOOL bSuccess = FALSE; TAGID tiMsiTransformRef;
tiMsiTransformRef = SdbBeginWriteListTag(pdb, TAG_MSI_TRANSFORM_REF); if (!tiMsiTransformRef) { SDBERROR(_T("Error writing TAG_MSI_TRANSFORM_REF\n")); goto eh; }
//
// write out the reference to the transform by name first
//
if (m_csName.GetLength()) { if (!SdbWriteStringTag(pdb, TAG_NAME, m_csName)) { SDBERROR(_T("Error writing TAG_NAME\n")); goto eh; } }
//
// now -- satisfy the judgement by writing reference to the
// actual transform object if available
//
if (m_pMsiTransform != NULL) {
if (!SdbWriteDWORDTag(pdb, TAG_MSI_TRANSFORM_TAGID, m_pMsiTransform->m_tiTagID)) { SDBERROR(_T("Error writing TAG_MSI_TRANSFORM_TAGID for MSI_TRANSFORM_REF\n")); goto eh; } }
if (!SdbEndWriteListTag(pdb, tiMsiTransformRef)) { SDBERROR(_T("Error ending TAG_MSI_TRANSFORM_REF\n")); goto eh; }
bSuccess = TRUE;
eh: return bSuccess; }
BOOL SdbMsiTransform::WriteToSDB(PDB pdb) { BOOL bSuccess = FALSE; TAGID tiMsiTransform;
//
// write out the name of the transform
tiMsiTransform = SdbBeginWriteListTag(pdb, TAG_MSI_TRANSFORM); if (!tiMsiTransform) { SDBERROR(_T("Error writing TAG_MSI_TRANSFORM\n")); goto eh; }
//
// NAME
//
if (m_csName.GetLength()) { if (!SdbWriteStringTag(pdb, TAG_NAME, m_csName)) { SDBERROR(_T("Error writing TAG_NAME\n")); goto eh; } }
//
// MSI transform file name
//
if (m_csMsiTransformFile.GetLength()) { if (!SdbWriteStringTag(pdb, TAG_MSI_TRANSFORM_FILE, m_csMsiTransformFile)) { SDBERROR(_T("Error writing TAG_MSI_TRANSFORM_FILE\n")); goto eh; } }
//
// REFERENCE the Actual file bits
//
if (m_pSdbFile != NULL && m_pSdbFile->m_tiTagID != TAGID_NULL) { if (!SdbWriteDWORDTag(pdb, TAG_MSI_TRANSFORM_TAGID, m_pSdbFile->m_tiTagID)) { SDBERROR(_T("Error writing TAG_MSI_TRANSFORM_TAGID\n")); goto eh; } }
//
// Close tag
//
if (!SdbEndWriteListTag(pdb, tiMsiTransform)) { SDBERROR(_T("Error ending TAG_MSI_TRANSFORM\n")); goto eh; }
m_tiTagID = tiMsiTransform;
bSuccess = TRUE; eh: return bSuccess; }
BOOL SdbLayer::WriteToSDB(PDB pdb) { BOOL bSuccess = FALSE; TAGID tiLayer; long i;
//
// Open tag
//
tiLayer = SdbBeginWriteListTag(pdb, TAG_LAYER); if (!tiLayer) { SDBERROR(_T("Error writing TAG_LAYER\n")); goto eh; }
m_tiTagID = tiLayer;
//
// NAME
//
if (m_csName.GetLength()) { if (!SdbWriteStringTag(pdb, TAG_NAME, m_csName)) { SDBERROR(_T("Error writing TAG_NAME\n")); goto eh; } }
//
// Display name
//
if (m_csDisplayName.GetLength()) { if (!SdbWriteStringTag(pdb, TAG_LAYER_DISPLAYNAME, m_csDisplayName)) { SDBERROR(_T("Error writing TAG_LAYER_DISPLAYNAME\n")); goto eh; } }
//
// Shim references
//
if (!m_rgShimRefs.WriteToSDB(pdb)) { SDBERROR_PROPOGATE(); goto eh; }
//
// Flags
//
if (!m_rgFlagRefs.WriteToSDB(pdb)) { SDBERROR_PROPOGATE(); goto eh; }
//
// Close tag
//
if (!SdbEndWriteListTag(pdb, tiLayer)) { SDBERROR(_T("Error ending TAG_LAYER\n")); goto eh; }
bSuccess = TRUE;
eh:
return bSuccess; }
BOOL SdbLayerRef::WriteToSDB(PDB pdb) { BOOL bSuccess = FALSE; TAGID tiLayer;
//
// Open tag
//
tiLayer = SdbBeginWriteListTag(pdb, TAG_LAYER); if (!tiLayer) { SDBERROR(_T("Error writing TAG_LAYER\n")); goto eh; }
//
// NAME
//
if (m_csName.GetLength()) { if (!SdbWriteStringTag(pdb, TAG_NAME, m_csName)) { SDBERROR(_T("Error writing TAG_NAME\n")); goto eh; } }
//
// Write TAGID of the LAYER in the LIBRARY, if any
//
if (m_pLayer) { if (m_pLayer->m_tiTagID) { if (!SdbWriteDWORDTag(pdb, TAG_LAYER_TAGID, m_pLayer->m_tiTagID)) { SDBERROR(_T("Error writing TAG_LAYER_TAGID\n")); goto eh; } } }
//
// child data tags
//
if (!m_rgData.WriteToSDB(pdb)) { SDBERROR_PROPOGATE(); goto eh; }
//
// Close tag
//
if (!SdbEndWriteListTag(pdb, tiLayer)) { SDBERROR(_T("Error ending TAG_LAYER\n")); goto eh; }
bSuccess = TRUE;
eh:
return bSuccess; }
BOOL SdbMatchingFile::WriteToSDB(PDB pdb) { BOOL bSuccess = FALSE; TAGID tiMatchingFile;
//
// Open tag
//
tiMatchingFile = SdbBeginWriteListTag(pdb, TAG_MATCHING_FILE); if (!tiMatchingFile) { SDBERROR(_T("Error writing TAG_MATCHING_FILE\n")); goto eh; }
//
// NAME
//
if (m_csName.GetLength()) { if (!SdbWriteStringTag(pdb, TAG_NAME, m_csName)) { SDBERROR(_T("Error writing TAG_NAME\n")); goto eh; } }
//
// platform should be first if it exists -- along with the logic bit
//
if (m_bMatchLogicNot) { if (!SdbWriteNULLTag(pdb, TAG_MATCH_LOGIC_NOT)) { SDBERROR(_T("Error writing MATCH_LOGIC_NOT\n")); goto eh; } }
// matching information
if (m_dwMask & SDB_MATCHINGINFO_SIZE) { if (!SdbWriteDWORDTag(pdb, TAG_SIZE, m_dwSize)) { SDBERROR(_T("Error writing SIZE\n")); goto eh; } }
if (m_dwMask & SDB_MATCHINGINFO_CHECKSUM) { if (!SdbWriteDWORDTag(pdb, TAG_CHECKSUM, m_dwChecksum)) { SDBERROR(_T("Error writing CHECKSUM\n")); goto eh; } }
if (m_dwMask & SDB_MATCHINGINFO_COMPANY_NAME) { if (!SdbWriteStringTag(pdb, TAG_COMPANY_NAME, m_csCompanyName)) { SDBERROR(_T("Error writing COMPANY_NAME tag\n")); goto eh; } }
if (m_dwMask & SDB_MATCHINGINFO_PRODUCT_NAME) { if (!SdbWriteStringTag(pdb, TAG_PRODUCT_NAME, m_csProductName)) { SDBERROR(_T("Error writing PRODUCT_NAME tag\n")); goto eh; } }
if (m_dwMask & SDB_MATCHINGINFO_PRODUCT_VERSION) { if (!SdbWriteStringTag(pdb, TAG_PRODUCT_VERSION, m_csProductVersion)) { SDBERROR(_T("Error writing PRODUCT_VERSION tag\n")); goto eh; } }
if (m_dwMask & SDB_MATCHINGINFO_FILE_DESCRIPTION) { if (!SdbWriteStringTag(pdb, TAG_FILE_DESCRIPTION, m_csFileDescription)) { SDBERROR(_T("Error writing FILE_DESCRIPTION tag\n")); goto eh; } }
if (m_dwMask & SDB_MATCHINGINFO_BIN_FILE_VERSION) { if (!SdbWriteQWORDTag(pdb, TAG_BIN_FILE_VERSION, m_ullBinFileVersion)) { SDBERROR(_T("Error writing BIN_FILE_VERSION\n")); goto eh; } }
if (m_dwMask & SDB_MATCHINGINFO_BIN_PRODUCT_VERSION) { if (!SdbWriteQWORDTag(pdb, TAG_BIN_PRODUCT_VERSION, m_ullBinProductVersion)) { SDBERROR(_T("Error writing BIN_PRODUCT_VERSION\n")); goto eh; } }
if (m_dwMask & SDB_MATCHINGINFO_MODULE_TYPE) { if (!SdbWriteDWORDTag(pdb, TAG_MODULE_TYPE, m_dwModuleType)) { SDBERROR(_T("Error writing MODULE_TYPE\n")); goto eh; } }
if (m_dwMask & SDB_MATCHINGINFO_VERFILEDATEHI) { if (!SdbWriteDWORDTag(pdb, TAG_VERDATEHI, m_dwFileDateMS)) { SDBERROR(_T("Error writing MODULE_TYPE\n")); goto eh; }
}
if (m_dwMask & SDB_MATCHINGINFO_VERFILEDATELO) { if (!SdbWriteDWORDTag(pdb, TAG_VERDATELO, m_dwFileDateLS)) { SDBERROR(_T("Error writing MODULE_TYPE\n")); goto eh; }
}
if (m_dwMask & SDB_MATCHINGINFO_VERFILEOS) { if (!SdbWriteDWORDTag(pdb, TAG_VERFILEOS, m_dwFileOS)) { SDBERROR(_T("Error writing VERFILEOS\n")); goto eh; }
}
if (m_dwMask & SDB_MATCHINGINFO_VERFILETYPE) { if (!SdbWriteDWORDTag(pdb, TAG_VERFILETYPE, m_dwFileType)) { SDBERROR(_T("Error writing VERFILETYPE\n")); goto eh; } }
if (m_dwMask & SDB_MATCHINGINFO_PE_CHECKSUM) { if (!SdbWriteDWORDTag(pdb, TAG_PE_CHECKSUM, m_ulPECheckSum)) { SDBERROR(_T("Error writing PE_CHECKSUM\n")); goto eh; } }
if (m_dwMask & SDB_MATCHINGINFO_LINKER_VERSION) { if (!SdbWriteDWORDTag(pdb, TAG_LINKER_VERSION, m_dwLinkerVersion)) { SDBERROR(_T("Error writing LINKER_VERSION\n")); goto eh; } }
if (m_dwMask & SDB_MATCHINGINFO_FILE_VERSION) { if (!SdbWriteStringTag(pdb, TAG_FILE_VERSION, m_csFileVersion)) { SDBERROR(_T("Error writing FILE_VERSION\n")); goto eh; } }
if (m_dwMask & SDB_MATCHINGINFO_ORIGINAL_FILENAME) { if (!SdbWriteStringTag(pdb, TAG_ORIGINAL_FILENAME, m_csOriginalFileName)) { SDBERROR(_T("Error writing ORIGINAL_FILENAME\n")); goto eh; } }
if (m_dwMask & SDB_MATCHINGINFO_INTERNAL_NAME) { if (!SdbWriteStringTag(pdb, TAG_INTERNAL_NAME, m_csInternalName)) { SDBERROR(_T("Error writing INTERNAL_NAME\n")); goto eh; } }
if (m_dwMask & SDB_MATCHINGINFO_LEGAL_COPYRIGHT) { if (!SdbWriteStringTag(pdb, TAG_LEGAL_COPYRIGHT, m_csLegalCopyright)) { SDBERROR(_T("Error writing LEGAL_COPYRIGHT\n")); goto eh; } }
if (m_dwMask & SDB_MATCHINGINFO_16BIT_DESCRIPTION) { if (!SdbWriteStringTag(pdb, TAG_16BIT_DESCRIPTION, m_cs16BitDescription)) { SDBERROR(_T("Error writing 16BIT_DESCRIPTION\n")); goto eh; } }
if (m_dwMask & SDB_MATCHINGINFO_16BIT_MODULE_NAME) { if (!SdbWriteStringTag(pdb, TAG_16BIT_MODULE_NAME, m_cs16BitModuleName)) { SDBERROR(_T("Error Writing 16BIT_MODULE_NAME\n")); goto eh; } }
if (m_dwMask & SDB_MATCHINGINFO_UPTO_BIN_PRODUCT_VERSION) { if (!SdbWriteQWORDTag(pdb, TAG_UPTO_BIN_PRODUCT_VERSION, m_ullUpToBinProductVersion)) { SDBERROR(_T("Error writing UPTO_BIN_PRODUCT_VERSION\n")); goto eh; } }
if (m_dwMask & SDB_MATCHINGINFO_UPTO_BIN_FILE_VERSION) { if (!SdbWriteQWORDTag(pdb, TAG_UPTO_BIN_FILE_VERSION, m_ullUpToBinFileVersion)) { SDBERROR(_T("Error writing UPTO_BIN_FILE_VERSION\n")); goto eh; } }
if (m_dwMask & SDB_MATCHINGINFO_PREVOSMAJORVERSION) { if (!SdbWriteDWORDTag(pdb, TAG_PREVOSMAJORVER, m_dwPrevOSMajorVersion)) { SDBERROR(_T("Error writing PREVOSMAJORVER\n")); goto eh; } }
if (m_dwMask & SDB_MATCHINGINFO_PREVOSMINORVERSION) { if (!SdbWriteDWORDTag(pdb, TAG_PREVOSMINORVER, m_dwPrevOSMinorVersion)) { SDBERROR(_T("Error writing PREVOSMINORVER\n")); goto eh; } }
if (m_dwMask & SDB_MATCHINGINFO_PREVOSPLATFORMID) { if (!SdbWriteDWORDTag(pdb, TAG_PREVOSPLATFORMID, m_dwPrevOSPlatformID)) { SDBERROR(_T("Error writing PREVOSPLATFORMID\n")); goto eh; } }
if (m_dwMask & SDB_MATCHINGINFO_PREVOSBUILDNO) { if (!SdbWriteDWORDTag(pdb, TAG_PREVOSBUILDNO, m_dwPrevOSBuildNo)) { SDBERROR(_T("Error writing PREVOSBUILDNO\n")); goto eh; } }
if (m_dwMask & SDB_MATCHINGINFO_LINK_DATE) { if (!SdbWriteDWORDTag(pdb, TAG_LINK_DATE, (DWORD) m_timeLinkDate)) { SDBERROR(_T("Error writing LINK_DATE\n")); goto eh; } }
if (m_dwMask & SDB_MATCHINGINFO_UPTO_LINK_DATE) { if (!SdbWriteDWORDTag(pdb, TAG_UPTO_LINK_DATE, (DWORD) m_timeUpToLinkDate)) { SDBERROR(_T("Error writing UPTO_LINK_DATE\n")); goto eh; } }
if (m_dwMask & SDB_MATCHINGINFO_VER_LANGUAGE) { if (!SdbWriteDWORDTag(pdb, TAG_VER_LANGUAGE, m_dwVerLanguage)) { SDBERROR(_T("Error writing VER_LANGUAGE tag\n")); goto eh; } }
//
// Close tag
//
if (!SdbEndWriteListTag(pdb, tiMatchingFile)) { SDBERROR(_T("Error ending TAG_MATCHING_FILE\n")); goto eh; }
bSuccess = TRUE;
eh:
return bSuccess; }
BOOL SdbAppHelpRef::WriteToSDB(PDB pdb) { BOOL bSuccess = FALSE; TAGID tiAppHelp; CString cs;
//
// Open tag
//
tiAppHelp = SdbBeginWriteListTag(pdb, TAG_APPHELP); if (!tiAppHelp) { SDBERROR(_T("Error writing TAG_APPHELP\n")); goto eh; }
if (m_pDB->m_pCurrentOutputFile->m_dwFilter & ~SDB_FILTER_DRIVER) { //
// If this EXE entry contains only APPHELP entries, set
// a flag.
//
if (m_bApphelpOnly) { if (!SdbWriteDWORDTag(pdb, TAG_FLAGS, SHIMDB_APPHELP_ONLY)) { SDBERROR(_T("Error writing FLAGS in APPHELP entry\n")); goto eh; } }
//
// Severity
//
if (!SdbWriteDWORDTag(pdb, TAG_PROBLEMSEVERITY, (DWORD)m_pAppHelp->m_Type)) { SDBERROR( _T("Error writing PROBLEM_SEVERITY\n")); goto eh; } }
//
// HTMLHELPID
//
if (!SdbWriteDWORDTag(pdb, TAG_HTMLHELPID, (DWORD)_ttol(m_pAppHelp->m_csName))) { SDBERROR( _T("Error writing HTMLHELPID\n")); goto eh; }
//
// Check for service pack parameters.
//
cs = m_pDB->m_pCurrentOutputFile->GetParameter("DATE AFTER WHICH TO USE SERVICE PACK APPHELP SDB"); if (cs.GetLength()) { COleDateTime odt; if (!odt.ParseDateTime(cs)) { SDBERROR_FORMAT((_T("Error parsing DATE AFTER WHICH TO USE SERVICE PACK APPHELP SDB parameter: \"%s\"\n"), cs)); goto eh; }
if (odt.m_dt <= m_pAppHelp->m_dtLastRevision) { if (!SdbWriteNULLTag(pdb, TAG_USE_SERVICE_PACK_FILES)) { SDBERROR( _T("Error writing USE_SERVICE_PACK_FILES\n")); goto eh; } } }
//
// Close tag
//
if (!SdbEndWriteListTag(pdb, tiAppHelp)) { SDBERROR(_T("Error ending TAG_APPHELP\n")); goto eh; }
bSuccess = TRUE;
eh:
return bSuccess; }
BOOL SdbDatabase::ConstructMigrationMessage( SdbWin9xMigration* pMigApp, SdbMessage* pMessage, CString* pcsMessage ) { BOOL bSuccess = FALSE; CString csSummaryXML, csRedirURL;
SdbRefArray<SdbMessageField> rgFields; SdbMessageField TitleField; SdbMessageField VendorField;
if (pMessage->m_csSummaryXML.IsEmpty()) { if (pMessage->m_pTemplate != NULL) { csSummaryXML = pMessage->m_pTemplate->m_csSummaryXML; } } else { csSummaryXML = pMessage->m_csSummaryXML; }
TitleField.m_csName = _T("TITLE"); TitleField.m_csValue = pMigApp->m_pApp->GetLocalizedAppName(); VendorField.m_csName = _T("VENDOR"); VendorField.m_csValue = pMigApp->m_pApp->GetLocalizedVendorName();
rgFields.Add(&TitleField); rgFields.Add(&VendorField); rgFields.Append(pMessage->m_rgFields);
if (!ReplaceFields(csSummaryXML, pcsMessage, &rgFields)) { SDBERROR_PROPOGATE(); goto eh; }
csRedirURL = m_pCurrentOutputFile->GetParameter(_T("REDIR URL"));
if (!RedirectLinks(pcsMessage, m_pCurrentMakefile->GetLangMap(m_pCurrentOutputFile->m_csLangID)->m_lcid, csRedirURL)) { SDBERROR_PROPOGATE(); goto eh; }
if (g_bStrict) {
if (pcsMessage->IsEmpty()) { SDBERROR_FORMAT((_T("ERROR: Empty string for SUMMARY on\n NAME: %s\n MESSAGE: %s\n LANG: %s\n\n"), pMigApp->m_pApp->m_csName, pMigApp->m_csMessage, m_pCurrentMakefile->m_csLangID)); goto eh; }
}
//
// Remove redundant spacing
//
*pcsMessage = TrimParagraph(*pcsMessage);
//
// Replace <BR/> with \r\n
//
ReplaceStringNoCase(*pcsMessage, _T("<BR/>"), _T("<BR>")); ReplaceStringNoCase(*pcsMessage, _T("<P/>"), _T("<BR>")); ReplaceStringNoCase(*pcsMessage, _T("&"), _T("&"));
bSuccess = TRUE;
eh:
return bSuccess; }
BOOL SdbDatabase::ConstructMessageParts( SdbAppHelp* pAppHelp, SdbMessage* pMessage, CString& csLangID, DWORD* pdwHTMLHelpID, CString* pcsURL, CString* pcsContactInfo, CString* pcsAppTitle, CString* pcsSummary, CString* pcsDetails) { BOOL bSuccess = FALSE; SdbContactInfo* pContactInfo; SdbMessageTemplate* pTemplate; SdbMessageField* pField; CString csContactInfoXML, csSummaryXML, csDetailsXML; CString csField, csRedirURL, csBaseURL, csLCID; long i;
SdbRefArray<SdbMessageField> rgFields; SdbMessageField TitleField; SdbMessageField VendorField; SdbMessageField Parameter1Field;
//
// If there's a custom URL for this apphelp, use it. If a base content URL was given
// via the makefile, use that to construct the URL.
//
csBaseURL = m_pCurrentOutputFile->GetParameter(_T("BASE ONLINE CONTENT URL"));
*pdwHTMLHelpID = (DWORD)_ttol(pAppHelp->m_csName);
if (pAppHelp->m_csURL.GetLength()) { *pcsURL = pAppHelp->m_csURL; } else if (csBaseURL.GetLength()) { *pcsURL = csBaseURL; ReplaceStringNoCase(*pcsURL, _T("$HTMLHELPID$"), pAppHelp->m_csName); ReplaceStringNoCase(*pcsURL, _T("$LANGID$"), csLangID); csLCID.Format(_T("%X"), m_pCurrentMakefile->GetLangMap(csLangID)->m_lcid); ReplaceStringNoCase(*pcsURL, _T("$LCID$"), csLCID); }
if (pMessage->m_csContactInfoXML.IsEmpty()) { pContactInfo = (SdbContactInfo *) m_rgContactInfo.LookupName(pAppHelp->m_pApp->m_csVendor, csLangID);
if (pContactInfo == NULL) { pContactInfo = (SdbContactInfo *) m_rgContactInfo.LookupName(_T("__DEFAULT__"), csLangID); }
if (pContactInfo == NULL) { if (g_bStrict) { SDBERROR_FORMAT((_T("ERROR: Localized CONTACT_INFO not found for\n NAME: %s\n HTMLHELPID: %s\n LANG: %s\n\n"), pAppHelp->m_pApp->m_csVendor, pAppHelp->m_csName, csLangID)); goto eh; } else { csContactInfoXML = pAppHelp->m_pApp->m_csVendorXML; } } else { csContactInfoXML = pContactInfo->m_csXML; } } else { csContactInfoXML = pMessage->m_csContactInfoXML; }
*pcsAppTitle = pAppHelp->m_pApp->GetLocalizedAppName(csLangID);
if (pMessage->m_csSummaryXML.IsEmpty()) { if (pMessage->m_pTemplate != NULL) { csSummaryXML = pMessage->m_pTemplate->m_csSummaryXML; } } else { csSummaryXML = pMessage->m_csSummaryXML; }
if (pMessage->m_csDetailsXML.IsEmpty()) { if (pMessage->m_pTemplate != NULL) { csDetailsXML = pMessage->m_pTemplate->m_csDetailsXML; } } else { csDetailsXML = pMessage->m_csDetailsXML; }
TitleField.m_csName = _T("TITLE"); TitleField.m_csValue = pAppHelp->m_pApp->GetLocalizedAppName(csLangID); VendorField.m_csName = _T("VENDOR"); VendorField.m_csValue = pAppHelp->m_pApp->GetLocalizedVendorName(csLangID); Parameter1Field.m_csName = _T("PARAMETER1"); Parameter1Field.m_csValue = pAppHelp->m_csParameter1;
rgFields.Add(&TitleField); rgFields.Add(&VendorField); rgFields.Add(&Parameter1Field); rgFields.Append(pMessage->m_rgFields);
if (!ReplaceFields(csContactInfoXML, pcsContactInfo, &rgFields)) { SDBERROR_PROPOGATE(); goto eh; }
if (pcsSummary) { if (!ReplaceFields(csSummaryXML, pcsSummary, &rgFields)) { SDBERROR_PROPOGATE(); goto eh; } }
if (!ReplaceFields(csDetailsXML, pcsDetails, &rgFields)) { SDBERROR_PROPOGATE(); goto eh; }
csRedirURL = m_pCurrentOutputFile->GetParameter(_T("REDIR URL"));
if (!RedirectLinks(pcsContactInfo, m_pCurrentMakefile->GetLangMap(csLangID)->m_lcid, csRedirURL)) { SDBERROR_PROPOGATE(); goto eh; }
if (!RedirectLinks(pcsDetails, m_pCurrentMakefile->GetLangMap(csLangID)->m_lcid, csRedirURL)) { SDBERROR_PROPOGATE(); goto eh; }
//
// Remove redundant spacing
//
*pcsURL = TrimParagraph(*pcsURL); *pcsAppTitle = TrimParagraph(*pcsAppTitle);
if (pcsSummary) { *pcsSummary = TrimParagraph(*pcsSummary);
//
// Replace various HTML entities with equivalents
//
ReplaceStringNoCase(*pcsSummary, _T("<BR/>"), _T("\r\n")); ReplaceStringNoCase(*pcsSummary, _T("<P/>"), _T("\r\n")); ReplaceStringNoCase(*pcsSummary, _T("&"), _T("&"));
if (-1 != pcsSummary->Find(_T('<'))) { SDBERROR_FORMAT((_T("ERROR: <SUMMARY> can only contain <BR/> and <P/> formatting tags:\n%s\n"), *pcsSummary)); goto eh; } }
bSuccess = TRUE;
eh:
return bSuccess; }
BOOL SdbDatabase::WriteAppHelpRefTag( PDB pdb, CString csHTMLHelpID, LCID lcid, CString csURL, CString csAppTitle, CString csSummary) { TAGID tiMessageSummary; TAGID tiLink; INT i; BOOL bReturn = FALSE;
tiMessageSummary = SdbBeginWriteListTag(pdb, TAG_APPHELP); if (!tiMessageSummary) { SDBERROR(_T("Error writing APPHELP_DETAILS tag\n")); goto eh; }
if (!SdbWriteDWORDTag(pdb, TAG_HTMLHELPID, (DWORD)_ttol(csHTMLHelpID))) { SDBERROR( _T("Error writing HTMLHELPID\n")); goto eh; }
if (lcid != 0) { if (!SdbWriteDWORDTag(pdb, TAG_LANGID, lcid)) { SDBERROR( _T("Error writing LANGID\n")); goto eh; } }
// for each, write a list tag
tiLink = SdbBeginWriteListTag(pdb,TAG_LINK); if (!tiLink) { SDBERROR(_T("Error writing APPHELP LINK tag\n")); goto eh; }
if (!SdbWriteStringTag(pdb, TAG_LINK_URL, csURL)) { SDBERROR(_T("Error writing APPHELP URL tag\n")); goto eh; }
if (!SdbEndWriteListTag(pdb, tiLink)) { SDBERROR(_T("Error closing APPHELP LINK tag\n")); goto eh; }
if (!csAppTitle.IsEmpty() && !SdbWriteStringTag(pdb, TAG_APPHELP_TITLE, csAppTitle)) { SDBERROR(_T("Error writing APPHELP_TITLE tag\n")); goto eh; }
if (!csSummary.IsEmpty() && !SdbWriteStringTag(pdb, TAG_APPHELP_DETAILS, csSummary)) { SDBERROR(_T("Error writing APPHELP_DETAILS tag\n")); goto eh; }
if (!SdbEndWriteListTag(pdb, tiMessageSummary)) { SDBERROR(_T("Error closing APPHELP_DETAILS tag\n")); goto eh; }
bReturn = TRUE;
eh:
return bReturn; } BOOL SdbData::WriteToSDB(PDB pdb) { BOOL bSuccess = FALSE;
TAGID tiData;
//
// Open tag
//
tiData = SdbBeginWriteListTag(pdb, TAG_DATA); if (!tiData) { SDBERROR(_T("Error writing TAG_DATA\n")); goto eh; }
//
// NAME
//
if (m_csName.GetLength()) { if (!SdbWriteStringTag(pdb, TAG_NAME, m_csName)) { SDBERROR(_T("Error writing TAG_NAME\n")); goto eh; } }
//
// Value type
//
if (!SdbWriteDWORDTag(pdb, TAG_DATA_VALUETYPE, m_DataType)) { SDBERROR(_T("Error writing TAG_DATA_VALUETYPE for DRIVER_POLICY\n")); goto eh; }
//
// Value
//
switch(m_DataType) { case eValueNone: break;
case eValueString: if (m_szValue != NULL && !SdbWriteStringTag(pdb, TAG_DATA_STRING, m_szValue)) { SDBERROR(_T("Error writing TAG_DATA_STRING\n")); goto eh; } break;
case eValueDWORD: if (!SdbWriteDWORDTag(pdb, TAG_DATA_DWORD, m_dwValue)) { SDBERROR(_T("Error writing TAG_DATA_DWORD\n")); goto eh; } break;
case eValueQWORD: if (!SdbWriteQWORDTag(pdb, TAG_DATA_QWORD, m_ullValue)) { SDBERROR(_T("Error writing TAG_DATA_QWORD\n")); goto eh; } break;
case eValueBinary: if (!SdbWriteBinaryTag(pdb, TAG_DATA_BITS, m_pBinValue, m_dwDataSize)) { SDBERROR(_T("Error writing TAG_DATA_BITS\n")); goto eh; } break; }
//
// Data
//
if (!m_rgData.WriteToSDB(pdb)) { SDBERROR_PROPOGATE(); goto eh; }
//
// Close tag
//
if (!SdbEndWriteListTag(pdb, tiData)) { SDBERROR(_T("Error ending TAG_DATA\n")); goto eh; }
bSuccess = TRUE;
eh:
return bSuccess; }
BOOL SdbAction::WriteToSDB(PDB pdb) { BOOL bSuccess = FALSE; TAGID tiAction;
//
// Open tag
//
tiAction = SdbBeginWriteListTag(pdb, TAG_ACTION); if (!tiAction) { SDBERROR(_T("Error writing TAG_ACTION\n")); goto eh; }
//
// NAME
//
if (!SdbWriteStringTag(pdb, TAG_NAME, m_csName)) { SDBERROR(_T("Error writing NAME tag\n")); goto eh; }
//
// TYPE
//
if (m_csType.GetLength()) { if (!SdbWriteStringTag(pdb, TAG_ACTION_TYPE, m_csType)) { SDBERROR(_T("Error writing TAG_ACTION_TYPE tag\n")); goto eh; } }
//
// child data tags
//
if (!m_rgData.WriteToSDB(pdb)) { SDBERROR_PROPOGATE(); goto eh; }
//
// Close tag
//
if (!SdbEndWriteListTag(pdb, tiAction)) { SDBERROR(_T("Error ending TAG_ACTION\n")); goto eh; }
bSuccess = TRUE;
eh:
return bSuccess; }
|