📄 resorgxmlwriter.cpp
字号:
/************************************************************************
*
* Resource ID Organiser Core Library
*
* (c) Copyright 2000-2004 by Anna-Jayne Metcalfe (resorg@annasplace.me.uk)
* All rights reserved.
*
************************************************************************
*
* Filename : ResOrgXmlWriter.cpp
*
* Description : CResOrgXmlWriter - class for writing XML files
*
* Compiler : Microsoft Visual C++ 6.0, Service Pack 3 or later
* Microsoft Visual C++ .NET 2003
*
* Target
* Environment : Windows 98/NT/2000/XP
*
* NOTE:
*
* This software is provided "as is" free for personal use. All
* title and copyrights in and to the software, including but not
* limited to any images, text, etc. incorporated into it, are
* owned by Anna-Jayne Metcalfe, except where acknowledged otherwise.
*
* Your may freely to use this code in your own products, PROVIDED
* this notice is not removed or modified.
*
*
* Visit http://www.annasplace.me.uk/resorg for latest updates
*
************************************************************************
*
* MODIFICATION HISTORY:
*
* This is a controlled document. See project configuration
* control tool for latest version and full version history.
*
* $Archive: /Projects/AddIns/ResOrg/ResOrgCore/ResOrgXmlWriter.cpp $
* $Revision: 8 $
* $Date: 29/08/04 21:12 $
* $Author: Anna $
*
* $History: ResOrgXmlWriter.cpp $
*
* ***************** Version 8 *****************
* User: Anna Date: 29/08/04 Time: 21:12
* Updated in $/Projects/AddIns/ResOrg/ResOrgCore
* CResOrgXmlWriter::LoadSymbolFileConfig() now asks the associated
* CResourceSymbolManager object to recalculate its problem symbol count
* after loading a config file. Also guarded it against NULL
* CResourceSymbolManager pointers
*
* ***************** Version 7 *****************
* User: Anna Date: 29/08/04 Time: 10:49
* Updated in $/Projects/AddIns/ResOrg/ResOrgCore
* Added support for toolbars, accelerators and out of range symbols
*
* ***************** Version 6 *****************
* User: Anna Date: 23/08/04 Time: 21:39
* Updated in $/Projects/AddIns/ResOrg/ResOrgCore
* Added support for out of range symbols
*
* ***************** Version 5 *****************
* User: Anna Date: 27/06/03 Time: 21:12
* Updated in $/Projects/AddIns/ResOrg/ResOrgCore
* CResOrgXmlWriter::SaveXml() now saves both internal and external
* conflict counts
*
* ***************** Version 4 *****************
* User: Anna Date: 20/04/03 Time: 15:47
* Updated in $/Projects/AddIns/ResOrg/ResOrgCore
* Replaced CException with CUserException to keep VS.NET happy
*
* ***************** Version 3 *****************
* User: Anna Date: 15/04/03 Time: 20:48
* Updated in $/Projects/AddIns/ResOrg/ResOrgCore
* Implemented Load/SaveSymbolFileConfig()
*
* ***************** Version 2 *****************
* User: Anna Date: 3/04/03 Time: 13:32
* Updated in $/Projects/AddIns/ResOrg/ResOrgCore
* Added CResOrgXmlWriter::LoadSymbolFileConfig() and
* SaveSymbolFileConfig() [not used yet]
*
* ***************** Version 1 *****************
* User: Anna Date: 3/03/03 Time: 20:07
* Created in $/Projects/AddIns/ResOrg/ResOrgCore
*
* $Nokeywords: $
*
************************************************************************/
#include "StdAfx.h"
#include <math.h>
#include "ResOrgCore_Priv.h"
#include "ResourceSymbol.h"
#include "ResourceSymbolManager.h"
#include "ResourceSymbolManagerMultiFile.h"
#include "ResOrgXmlWriter.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CResOrgXmlWriter
CResOrgXmlWriter::CResOrgXmlWriter(void)
{
}
CResOrgXmlWriter::~CResOrgXmlWriter(void)
{
}
/////////////////////////////////////////////////////////////////////////////
// CResOrgXmlWriter implementation
static BOOL GetNodeValue(IXMLDOMNode* pParent,
const CString& sChildNodeName,
int eType,
_variant_t& rVal)
{
MSXML2::IXMLDOMNodePtr ptrParent(pParent);
if (ptrParent != NULL)
{
MSXML2::IXMLDOMNodePtr ptrNode = ptrParent->selectSingleNode( (LPCTSTR)sChildNodeName);
if (ptrNode != NULL)
{
for (MSXML2::IXMLDOMNodePtr pChild = ptrNode->firstChild;
NULL != pChild;
pChild = pChild->nextSibling)
{
if (pChild->GetnodeType() == (MSXML2::tagDOMNodeType)eType)
{
rVal = pChild->GetnodeValue();
return true;
}
}
}
}
return false;
}
HRESULT CResOrgXmlWriter::LoadSymbolFileConfig( CResourceSymbolManager* pManager,
IXMLDOMDocument* pDOMDoc,
CString* psErrorMsg /*= NULL*/)
{
if (NULL == pManager)
{
ASSERT(false);
return E_FAIL;
}
CString sErrorMsg;
MSXML2::IXMLDOMDocumentPtr ptrDOMDoc(pDOMDoc);
HRESULT hr = E_FAIL;
try
{
MSXML2::IXMLDOMElementPtr ptrRoot = ptrDOMDoc->documentElement;
if (ptrRoot == NULL)
{
sErrorMsg = _T("Unable to locate the root tag");
throw new CUserException;
}
_variant_t value;
/* if (!GetNodeValue( (IXMLDOMNode*)ptrRoot.GetInterfacePtr(),
_T("ResOrgConfigFile"),
MSXML2::NODE_TEXT,
value) )
{
sErrorMsg = _T("Failed to detect the ResOrgConfigFile tag");
throw new CUserException;
}
*/
MSXML2::IXMLDOMNodePtr ptrFile = ptrRoot->selectSingleNode( _T("File") );
if (ptrFile == NULL)
{
sErrorMsg = _T("Unable to locate the File tag");
throw new CUserException;
}
if (!GetNodeValue( (IXMLDOMNode*)ptrFile.GetInterfacePtr(),
_T("PathName"),
MSXML2::NODE_TEXT,
value) )
{
sErrorMsg = _T("Unable to locate the PathName tag");
throw new CUserException;
}
CString sPathName = (LPCTSTR)(_bstr_t)value;
// TODO Check FileName NOT Pathname
MSXML2::IXMLDOMNodePtr ptrBaseValues = ptrFile->selectSingleNode( _T("BaseValues") );
if (ptrBaseValues != NULL)
{
IXMLDOMNode* pBaseValues = (IXMLDOMNode*)ptrBaseValues.GetInterfacePtr();
if (GetNodeValue( pBaseValues,
_T("Resources"),
MSXML2::NODE_TEXT,
value) )
{
UINT uBaseResourceValue = (long)value;
pManager->SetBaseResourceValue(uBaseResourceValue);
}
if (GetNodeValue( pBaseValues,
_T("Controls"),
MSXML2::NODE_TEXT,
value) )
{
UINT uBaseControlValue = (long)value;
pManager->SetBaseControlValue(uBaseControlValue);
}
if (GetNodeValue( pBaseValues,
_T("Commands"),
MSXML2::NODE_TEXT,
value) )
{
UINT uBaseCommandValue = (long)value;
pManager->SetBaseCommandValue(uBaseCommandValue);
}
}
hr = S_OK;
}
catch(_com_error& e)
{
hr = e.Error();
if (sErrorMsg.IsEmpty() )
{
sErrorMsg.Format("CResOrgXmlWriter::LoadSymbolFileConfig(): Exception 0x%08x", hr);
}
}
catch(CUserException* e)
{
e->Delete();
}
if (NULL != psErrorMsg)
{
*psErrorMsg = sErrorMsg;
}
// As the manager's base values are likely to have changed,
// we need to ask it to update its problem symbol counts.
pManager->CountConflicts();
return hr;
}
HRESULT CResOrgXmlWriter::SaveSymbolFileConfig( CResourceSymbolManager* pManager,
IXMLDOMDocument* pDOMDoc,
CString* psErrorMsg /*= NULL*/)
{
if (NULL == pManager)
{
return E_FAIL;
}
MSXML2::IXMLDOMDocumentPtr ptrDOMDoc(pDOMDoc);
HRESULT hr = S_OK;
try
{
// Create root element
MSXML2::IXMLDOMElementPtr ptrRoot = ptrDOMDoc->createElement(_T("ResOrgConfigFile") );
ptrDOMDoc->appendChild(ptrRoot);
MSXML2::IXMLDOMElementPtr ptrFile = ptrDOMDoc->createElement( _T("File") );
MSXML2::IXMLDOMAttributePtr ptrNameAttr = ptrDOMDoc->createAttribute(_T("name"));
ptrNameAttr->value = (LPCTSTR)pManager->GetFileName();
ptrFile->setAttributeNode(ptrNameAttr);
ptrRoot->appendChild(ptrFile);
MSXML2::IXMLDOMElementPtr ptrPathName = ptrDOMDoc->createElement( _T("PathName") );
ptrPathName->text = (LPCTSTR)pManager->GetPathName();
ptrFile->appendChild(ptrPathName);
// General Resources
MSXML2::IXMLDOMElementPtr ptrBaseValues = ptrDOMDoc->createElement( _T("BaseValues") );
ptrFile->appendChild(ptrBaseValues);
MSXML2::IXMLDOMElementPtr ptrBaseResourceValue = ptrDOMDoc->createElement( _T("Resources") );
ptrBaseResourceValue->text = (LPCTSTR)::UIntToStr( pManager->GetBaseResourceValue() );
ptrBaseValues->appendChild(ptrBaseResourceValue);
MSXML2::IXMLDOMElementPtr ptrBaseControlValue = ptrDOMDoc->createElement( _T("Controls") );
ptrBaseControlValue->text = (LPCTSTR)::UIntToStr( pManager->GetBaseControlValue() );
ptrBaseValues->appendChild(ptrBaseControlValue);
MSXML2::IXMLDOMElementPtr ptrBaseCommandValue = ptrDOMDoc->createElement( _T("Commands") );
ptrBaseCommandValue->text = (LPCTSTR)::UIntToStr( pManager->GetBaseCommandValue() );
ptrBaseValues->appendChild(ptrBaseCommandValue);
}
catch(_com_error& e)
{
hr = e.Error();
if (NULL != psErrorMsg)
{
psErrorMsg->Format( _T("Exception 0x%08x in CResOrgXmlWriter::SaveSymbolFileConfig()"), hr);
}
}
return hr;
}
/////////////////////////////////////////////////////////////////////////////
// CResOrgXmlWriter operations
HRESULT CResOrgXmlWriter::SaveXml( CResourceSymbolManager* pManager,
IXMLDOMDocument* pDOMDoc,
IXMLDOMElement* pParent,
CString* psErrorMsg /*= NULL*/)
{
HRESULT hResult = S_OK;
if (pManager->IsKindOf( RUNTIME_CLASS(CResourceSymbolManagerMultiFile) ) )
{
CResourceSymbolManagerMultiFile* pMngr = static_cast<CResourceSymbolManagerMultiFile*>(pManager);
for (int n = 0; n < pMngr->GetSymbolFiles().GetSize(); n++)
{
CResourceSymbolManager* pFile = pMngr->GetSymbolFiles()[n];
ASSERT(NULL != pFile);
if (NULL != pFile)
{
HRESULT hr = SaveSymbolFileXml( pFile,
pMngr,
pDOMDoc,
pParent,
psErrorMsg);
if (FAILED(hr) )
{
hResult = hr;
}
}
}
}
else
{
hResult = SaveSymbolFileXml(pManager,
NULL,
pDOMDoc,
pParent,
psErrorMsg);
}
return hResult;
}
HRESULT CResOrgXmlWriter::SaveSymbolFileXml(CResourceSymbolManager* pManager,
CResourceSymbolManagerMultiFile* pParentManager,
IXMLDOMDocument* pDOMDoc,
IXMLDOMElement* pParent,
CString* psErrorMsg /*= NULL*/)
{
if (NULL == pManager)
{
return E_FAIL;
}
MSXML2::IXMLDOMDocumentPtr ptrDOMDoc(pDOMDoc);
MSXML2::IXMLDOMElementPtr ptrParent(pParent);
HRESULT hr = S_OK;
try
{
MSXML2::IXMLDOMElementPtr ptrFile = ptrDOMDoc->createElement( _T("File") );
MSXML2::IXMLDOMAttributePtr ptrNameAttr = ptrDOMDoc->createAttribute(_T("name"));
ptrNameAttr->value = (LPCTSTR)pManager->GetFileName();
ptrFile->setAttributeNode(ptrNameAttr);
MSXML2::IXMLDOMAttributePtr ptrUidAttr = ptrDOMDoc->createAttribute(_T("uid"));
CString sValue;
sValue.Format( _T("%lu"), (INT_PTR)pManager);
ptrUidAttr->value = (LPCTSTR)sValue;
ptrFile->setAttributeNode(ptrUidAttr);
ptrParent->appendChild(ptrFile);
MSXML2::IXMLDOMElementPtr ptrPathName = ptrDOMDoc->createElement( _T("PathName") );
ptrPathName->text = (LPCTSTR)pManager->GetPathName();
ptrFile->appendChild(ptrPathName);
MSXML2::IXMLDOMElementPtr ptrResourceFile = ptrDOMDoc->createElement( _T("ResourceFile") );
ptrResourceFile->text = (LPCTSTR)pManager->GetResourceFileName();
ptrFile->appendChild(ptrResourceFile);
MSXML2::IXMLDOMElementPtr ptrOptions = ptrDOMDoc->createElement( _T("Options") );
ptrFile->appendChild(ptrOptions);
MSXML2::IXMLDOMElementPtr ptrCheckForOutOfRangeSymbols = ptrDOMDoc->createElement( _T("CheckForOutOfRangeSymbols") );
ptrCheckForOutOfRangeSymbols->text = (LPCTSTR)::IntToStr( pManager->CheckForOutOfRangeSymbols() );
ptrOptions->appendChild(ptrCheckForOutOfRangeSymbols);
MSXML2::IXMLDOMElementPtr ptrMetrics = ptrDOMDoc->createElement( _T("Metrics") );
ptrFile->appendChild(ptrMetrics);
// Conflicts (internal & external)
MSXML2::IXMLDOMElementPtr ptrConflicts = ptrDOMDoc->createElement( _T("Conflicts") );
int nOutOfRangeSymbols = pManager->GetOutOfRangeSymbolCount();
int nInternalConflicts = pManager->GetConflictCount();
int nTotalConflicts = nInternalConflicts;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -