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

478 lines
13 KiB
C++

///////////////////////////////////////////////////////////////////////////////
//
// File: make.cpp
//
// History: 06-Mar-01 markder Created.
//
// Desc: This file contains various member functions/constructors
// used by the makefile objects.
//
///////////////////////////////////////////////////////////////////////////////
#include "StdAfx.h"
#include "make.h"
#include "fileio.h"
////////////////////////////////////////////////////////////////////////////////////
//
// Func: ReadDatabase
//
// Desc: Opens an XML file and calls read on the database object.
//
BOOL SdbMakefile::ReadMakefile(
CString csMakefile)
{
BOOL bSuccess = FALSE;
IXMLDOMNodePtr cpRootNode;
IXMLDOMNodePtr cpMakefile;
XMLNodeList XQL;
if (!OpenXML(csMakefile, &cpRootNode)) {
SDBERROR_PROPOGATE();
goto eh;
}
if (!GetChild(_T("SHIMDBC_MAKEFILE"), cpRootNode, &cpMakefile)) {
SDBERROR(_T("<SHIMDBC_MAKEFILE> object not found"));
goto eh;
}
if (!ReadFromXML(cpMakefile, NULL)) {
SDBERROR_PROPOGATE();
goto eh;
}
bSuccess = TRUE;
eh:
return bSuccess;
}
BOOL SdbMakefile::ReadFromXML(IXMLDOMNode* pNode, SdbDatabase* pDB)
{
BOOL bSuccess = FALSE;
SdbOutputFile* pOutputFile = NULL;
if (!m_rgInputFiles.ReadFromXML(_T("INPUT"), NULL, pNode)) {
SDBERROR_PROPOGATE();
goto eh;
}
if (!m_rgOutputFiles.ReadFromXML(_T("OUTPUT"), NULL, pNode)) {
SDBERROR_PROPOGATE();
goto eh;
}
//
// Propagate LANGID to output files if needed
//
for (int j = 0; j < m_rgOutputFiles.GetSize(); j++) {
pOutputFile = (SdbOutputFile *) m_rgOutputFiles.GetAt(j);
if (!pOutputFile->m_csLangID.GetLength()) {
pOutputFile->m_csLangID = m_csLangID;
}
}
if (!m_rgLangMaps.ReadFromXML(_T("LANG_MAP"), NULL, pNode)) {
SDBERROR_PROPOGATE();
goto eh;
}
bSuccess = TRUE;
eh:
return bSuccess;
}
BOOL SdbInputFile::ReadFromXML(IXMLDOMNode* pNode, SdbDatabase* pDB)
{
BOOL bSuccess = FALSE;
CString csType, csParamName, csParamValue;
XMLNodeList XQL;
IXMLDOMNodePtr cpParam;
long i;
if (!ReadName(pNode, &m_csName)) {
SDBERROR_PROPOGATE();
goto eh;
}
m_csName = MakeFullPath(m_csName);
ExpandEnvStrings(&m_csName);
if (!XQL.Query(pNode, _T("PARAM"))) {
SDBERROR_PROPOGATE();
goto eh;
}
for (i = 0; i < XQL.GetSize(); i++) {
if (!XQL.GetItem(i, &cpParam)) {
SDBERROR_PROPOGATE();
goto eh;
}
if (!GetAttribute(_T("NAME"), cpParam, &csParamName)) {
SDBERROR_FORMAT((_T("<PARAM> requires NAME attribute:\n%s\n"),
GetXML(cpParam)));
}
if (!GetAttribute(_T("VALUE"), cpParam, &csParamValue)) {
SDBERROR_FORMAT((_T("<PARAM> requires VALUE attribute:\n%s\n"),
GetXML(cpParam)));
}
ExpandEnvStrings(&csParamValue);
if (csParamName == _T("FILTER")) {
m_dwFilter = GetFilter(csParamValue);
}
m_mapParameters.SetAt(csParamName, csParamValue);
cpParam.Release();
}
bSuccess = TRUE;
eh:
return bSuccess;
}
BOOL SdbOutputFile::ReadFromXML(IXMLDOMNode* pNode, SdbDatabase* pDB)
{
BOOL bSuccess = FALSE;
CString csType, csParamName, csParamValue;
XMLNodeList XQL;
IXMLDOMNodePtr cpParam;
long i;
COleDateTime odtServicePackBaselineDate;
if (!ReadName(pNode, &m_csName)) {
SDBERROR_PROPOGATE();
goto eh;
}
ExpandEnvStrings(&m_csName);
m_csName = MakeFullPath(m_csName);
if (!GetAttribute(_T("TYPE"), pNode, &csType)) {
SDBERROR_FORMAT((_T("<OUTPUT> requires TYPE attribute:\n%s\n"),
GetXML(pNode)));
}
m_OutputType = GetOutputType(csType);
if (m_OutputType == SDB_OUTPUT_TYPE_UNKNOWN) {
SDBERROR_FORMAT((_T("<OUTPUT TYPE> not recognized:\n%s\n"),
csType));
}
if (!XQL.Query(pNode, _T("PARAM"))) {
SDBERROR_PROPOGATE();
goto eh;
}
for (i = 0; i < XQL.GetSize(); i++) {
if (!XQL.GetItem(i, &cpParam)) {
SDBERROR_PROPOGATE();
goto eh;
}
if (!GetAttribute(_T("NAME"), cpParam, &csParamName)) {
SDBERROR_FORMAT((_T("<PARAM> requires NAME attribute:\n%s\n"),
GetXML(cpParam)));
}
if (!GetAttribute(_T("VALUE"), cpParam, &csParamValue)) {
SDBERROR_FORMAT((_T("<PARAM> requires VALUE attribute:\n%s\n"),
GetXML(cpParam)));
}
ExpandEnvStrings(&csParamValue);
if (csParamName == _T("FILTER")) {
m_dwFilter = GetFilter(csParamValue);
}
if (csParamName == _T("INCLUDE FILES")) {
if (csParamValue.Right(1) != _T("\\")) {
csParamValue += _T("\\");
}
}
if (csParamName == _T("SERVICE PACK BASELINE DATE")) {
if (csParamValue.GetLength()) {
if (!odtServicePackBaselineDate.ParseDateTime(csParamValue, 0, 0x0409)) {
SDBERROR_FORMAT((_T("Error parsing SERVICE PACK BASELINE DATE parameter in makefile: %s\n"),
csParamValue));
goto eh;
}
m_dtRevisionCutoff = odtServicePackBaselineDate.m_dt;
}
}
if (csParamName == _T("LANGID")) {
m_csLangID = csParamValue;
}
m_mapParameters.SetAt(csParamName, csParamValue);
cpParam.Release();
}
bSuccess = TRUE;
eh:
return bSuccess;
}
BOOL SdbLangMap::ReadFromXML(IXMLDOMNode* pNode, SdbDatabase* pDB)
{
BOOL bSuccess = FALSE;
CString csCodePage, csLCID;
if (!ReadName(pNode, &m_csName)) {
SDBERROR_PROPOGATE();
goto eh;
}
m_csName.MakeUpper();
if (!GetAttribute(_T("CODEPAGE"), pNode, &csCodePage)) {
SDBERROR_FORMAT((_T("<LANG_MAP> requires CODEPAGE attribute:\n%s\n"),
GetXML(pNode)));
}
if (!GetAttribute(_T("LCID"), pNode, &csLCID)) {
SDBERROR_FORMAT((_T("<LANG_MAP> requires LCID attribute:\n%s\n"),
GetXML(pNode)));
}
if (!GetAttribute(_T("HTML_CHARSET"), pNode, &m_csHtmlCharset)) {
SDBERROR_FORMAT((_T("<LANG_MAP> requires HTML_CHARSET attribute:\n%s\n"),
GetXML(pNode)));
}
m_dwCodePage = _ttol(csCodePage);
m_lcid = _tcstol(csLCID, NULL, 0);
bSuccess = TRUE;
eh:
return bSuccess;
}
BOOL WriteRedirMapFile(CString csFile, CString csTemplateFile, SdbDatabase* pDB)
{
BOOL bSuccess = FALSE;
CString csID, csURL, csTemplate, csRow;
try {
CStdioFile TemplateFile(csTemplateFile, CFile::typeText|CFile::modeRead);
while (TemplateFile.ReadString(csRow)) {
csTemplate += csRow + _T("\n");
}
}
catch(CFileException* pFileEx) {
SDBERROR_FORMAT((_T("Error reading from redir template file: %s\n"), csTemplateFile));
pFileEx->Delete();
goto eh;
}
catch(CMemoryException* pMemEx) {
pMemEx->Delete();
goto eh;
}
try {
SdbLocalizedString* pRedir = NULL;
CStdioFile OutputFile(csFile, CFile::typeText |
CFile::modeCreate |
CFile::modeWrite |
CFile::shareDenyWrite);
OutputFile.WriteString(_T("<root>\n"));
for (int i = 0; i < pDB->m_rgRedirs.GetSize(); i++) {
pRedir = (SdbLocalizedString *) pDB->m_rgRedirs.GetAt(i);
if (pRedir->m_csLangID == pDB->m_pCurrentOutputFile->m_csLangID)
{
csID = pRedir->m_csName;
csURL = pRedir->m_csValue;
csRow = csTemplate;
csRow.Replace(_T("%REDIR_ID%"), csID);
csRow.Replace(_T("%URL%"), csURL);
OutputFile.WriteString(csRow);
}
}
OutputFile.WriteString(_T("</root>\n"));
OutputFile.Close();
}
catch(CFileException* pFileEx) {
pFileEx->Delete();
goto eh;
}
catch(CMemoryException* pMemEx) {
pMemEx->Delete();
goto eh;
}
bSuccess = TRUE;
eh:
return bSuccess;
}
void SdbMakefile::AddHistoryKeywords(LPCTSTR szStart)
{
LPCTSTR szEnd;
szEnd = szStart;
while (*szEnd) {
if (*(szEnd+1) == _T(';') || *(szEnd+1) == _T('\0')) {
m_rgHistoryKeywords.Add(szStart);
m_rgHistoryKeywords[m_rgHistoryKeywords.GetSize()-1] =
m_rgHistoryKeywords[m_rgHistoryKeywords.GetSize()-1].Left((int)(szEnd - szStart + 1));
szStart = szEnd + 2;
}
szEnd++;
}
}
SdbLangMap* SdbMakefile::GetLangMap(CString& csLangID)
{
SdbLangMap* pLangMap = NULL;
return (SdbLangMap *) m_rgLangMaps.LookupName(csLangID);
}
BOOL WriteAppHelpReport(SdbOutputFile* pOutputFile, SdbDatabase* pDB)
{
BOOL bSuccess = FALSE;
SdbAppHelp* pAppHelp;
long i, j;
CString csHTML, csRedirID, csRedirURL, csThisRedirURL, csURL, csTemp;
SdbLocalizedString* pRedir = NULL;
csRedirURL = pOutputFile->GetParameter(_T("REDIR URL"));
try {
CUTF16TextFile File(pOutputFile->m_csName, CFile::typeText |
CFile::modeCreate |
CFile::modeWrite |
CFile::shareDenyWrite);
File.WriteString(_T("<HTML><HEAD><STYLE>td { font-family: sans-serif; font-size: 8pt; }</STYLE></HEAD><BODY>"));
File.WriteString(_T("<TABLE BORDER=0 CELLSPACING=0>"));
File.WriteString(_T("<TR>\n"));
File.WriteString(_T("<TD COLSPAN=3 ALIGN=CENTER>AppHelp Pages</TD>\n"));
File.WriteString(_T("</TR><TR><TD COLSPAN=3>&nbsp;</TD></TR>\n"));
File.WriteString(_T("<TR BGCOLOR=#E0E0E0>\n"));
File.WriteString(_T("<TD>App</TD>\n"));
File.WriteString(_T("<TD>Vendor</TD>\n"));
File.WriteString(_T("<TD>HTMLHelpID</TD>\n"));
File.WriteString(_T("</TR>\n"));
for (i = 0; i < pDB->m_rgAppHelps.GetSize(); i++) {
pAppHelp = (SdbAppHelp *) pDB->m_rgAppHelps[i];
File.WriteString(_T("<TR>\n"));
csHTML.Format(_T("<TD>%s</TD>\n"), pAppHelp->m_pApp->GetLocalizedAppName());
File.WriteString(csHTML);
csHTML.Format(_T("<TD>%s</TD>\n"), pAppHelp->m_pApp->GetLocalizedVendorName());
File.WriteString(csHTML);
csHTML.Format(_T("<TD><A TARGET=\"_new\" HREF=\"idh_w2_%s.htm\">%s</A></TD>\n"),
pAppHelp->m_csName, pAppHelp->m_csName);
File.WriteString(csHTML);
File.WriteString(_T("</TR>\n"));
}
File.WriteString(_T("</TABLE><P><P>"));
File.WriteString(_T("<TABLE BORDER=0 CELLSPACING=0>"));
File.WriteString(_T("<TR>\n"));
File.WriteString(_T("<TD COLSPAN=3 ALIGN=CENTER>Redirector Report</TD>\n"));
File.WriteString(_T("</TR><TR><TD COLSPAN=3>&nbsp;</TD></TR>\n"));
File.WriteString(_T("<TR BGCOLOR=#E0E0E0>\n"));
File.WriteString(_T("<TD>RedirID</TD>\n"));
File.WriteString(_T("<TD>URL</TD>\n"));
File.WriteString(_T("<TD>FWLink Entry</TD>\n"));
File.WriteString(_T("</TR>\n"));
for (i = 0; i < pDB->m_rgRedirs.GetSize(); i++) {
pRedir = (SdbLocalizedString *) pDB->m_rgRedirs.GetAt(i);
if (pRedir->m_csLangID == pDB->m_pCurrentMakefile->m_csLangID)
{
csRedirID = pRedir->m_csName;
csURL = pRedir->m_csValue;
File.WriteString(_T("<TR>\n"));
csHTML.Format(_T("<TD>%s</TD>\n"), csRedirID);
File.WriteString(csHTML);
csHTML.Format(_T("<TD>%s</TD>\n"), csURL);
File.WriteString(csHTML);
csThisRedirURL = csRedirURL;
csThisRedirURL.Replace(_T("$REDIR_ID$"), csRedirID);
csTemp.Format(_T("%X"), pDB->m_pCurrentMakefile->GetLangMap(pOutputFile->m_csLangID)->m_lcid);
csThisRedirURL.Replace(_T("$LCID$"), csTemp);
csHTML.Format(_T("<TD><A TARGET=\"_new\" HREF=\"%s\">%s</A></TD>\n"),
csThisRedirURL, csThisRedirURL);
File.WriteString(csHTML);
File.WriteString(_T("</TR>\n"));
}
}
File.WriteString(_T("</TABLE></BODY></HTML>"));
File.Close();
}
catch(CFileException* pFileEx) {
pFileEx->Delete();
goto eh;
}
catch(CMemoryException* pMemEx) {
pMemEx->Delete();
goto eh;
}
bSuccess = TRUE;
eh:
return bSuccess;
}