⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 resorgxmlwriter.cpp

📁 ResOrg 图形化管理Vc项目的资源ID的工具的源代码。 ResOrg - Manage and Renumber Resource Symbol IDs Introduction The
💻 CPP
📖 第 1 页 / 共 2 页
字号:
/************************************************************************
 *
 *                 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 + -