Something went wrong. Try again.
Reactos
Something went wrong. Try again.
5.2 kB · 180 lines
C++
at master
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181/* * PROJECT: ReactOS Applications * LICENSE: LGPL - See COPYING in the top level directory * FILE: base/applications/msconfig_new/xmldomparser.cpp * PURPOSE: XML DOM Parser * COPYRIGHT: Copyright 2011-2012 Hermes BELUSCA - MAITO <hermes.belusca@sfr.fr> */
#include "precomp.h"#include "xmldomparser.hpp"#include "utils.h"#include "stringutils.h"
// UTF8 adapted version of ConvertStringToBSTR (see lib/sdk/comsupp/comsupp.c)static BSTRConvertUTF8StringToBSTR(const char *pSrc){ DWORD cwch; BSTR wsOut(NULL);
if (!pSrc) return NULL;
/* Compute the needed size with the NULL terminator */ cwch = MultiByteToWideChar(CP_UTF8, 0, pSrc, -1, NULL, 0); if (cwch == 0) return NULL;
/* Allocate the BSTR (without the NULL terminator) */ wsOut = SysAllocStringLen(NULL, cwch - 1); if (!wsOut) { _com_issue_error(HRESULT_FROM_WIN32(ERROR_OUTOFMEMORY)); return NULL; }
/* Convert the string */ if (MultiByteToWideChar(CP_UTF8, 0, pSrc, -1, wsOut, cwch) == 0) { /* We failed, clean everything up */ cwch = GetLastError();
SysFreeString(wsOut); wsOut = NULL;
_com_issue_error(!IS_ERROR(cwch) ? HRESULT_FROM_WIN32(cwch) : cwch); }
return wsOut;}
HRESULTInitXMLDOMParser(VOID){ return CoInitialize(NULL);}
VOIDUninitXMLDOMParser(VOID){ CoUninitialize(); return;}
HRESULTCreateAndInitXMLDOMDocument(IXMLDOMDocument** ppDoc){ HRESULT hr = CoCreateInstance(CLSID_DOMDocument30, // __uuidof(DOMDocument30), // NOTE: Do not use DOMDocument60 if you want MSConfig working by default on XP. NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARG(IXMLDOMDocument, ppDoc) /* IID_PPV_ARGS(ppDoc) */); if (!SUCCEEDED(hr)) return hr;
/* These methods should not fail so don't inspect result */ (*ppDoc)->put_async(VARIANT_FALSE); (*ppDoc)->put_validateOnParse(VARIANT_FALSE); (*ppDoc)->put_resolveExternals(VARIANT_FALSE);
return hr;}
BOOLLoadXMLDocumentFromResource(IXMLDOMDocument* pDoc, LPCWSTR lpszXMLResName){ VARIANT_BOOL Success = VARIANT_FALSE; HRSRC hRes; HGLOBAL handle; LPVOID lpXMLRes; _bstr_t bstrXMLRes;
if (!pDoc) return FALSE;
// hRes = FindResourceExW(NULL, RT_HTML, lpszXMLResName, MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL)); hRes = FindResourceW(NULL, lpszXMLResName, RT_HTML); if (hRes == NULL) return FALSE;
handle = LoadResource(NULL, hRes); if (handle == NULL) return FALSE;
lpXMLRes = LockResource(handle); if (lpXMLRes == NULL) goto Cleanup;
/* Convert the resource to UNICODE if needed */ if (!IsTextUnicode(lpXMLRes, SizeofResource(NULL, hRes), NULL)) bstrXMLRes.Attach(ConvertUTF8StringToBSTR((LPCSTR)lpXMLRes)); else bstrXMLRes = (LPCWSTR)lpXMLRes;
if (SUCCEEDED(pDoc->loadXML(bstrXMLRes, &Success)) && (Success != VARIANT_TRUE)) { IXMLDOMParseError* pXMLErr = NULL; _bstr_t bstrErr;
if (SUCCEEDED(pDoc->get_parseError(&pXMLErr)) && SUCCEEDED(pXMLErr->get_reason(&bstrErr.GetBSTR()))) { LPWSTR lpszStr = NULL;
if (IS_INTRESOURCE((ULONG_PTR)lpszXMLResName)) lpszStr = FormatString(L"Failed to load DOM from resource '#%u': %wS", lpszXMLResName, (wchar_t*)bstrErr); else lpszStr = FormatString(L"Failed to load DOM from resource '%wS': %wS", lpszXMLResName, (wchar_t*)bstrErr);
MessageBoxW(NULL, lpszStr, L"Error", MB_ICONERROR | MB_OK);
MemFree(lpszStr); }
SAFE_RELEASE(pXMLErr); }
Cleanup: FreeResource(handle);
return (Success == VARIANT_TRUE);}
BOOLLoadXMLDocumentFromFile(IXMLDOMDocument* pDoc, LPCWSTR lpszFilename, BOOL bIgnoreErrorsIfNonExistingFile){ VARIANT_BOOL Success = VARIANT_FALSE; _variant_t varFileName(lpszFilename);
if (!pDoc) return FALSE;
if (SUCCEEDED(pDoc->load(varFileName, &Success)) && (Success != VARIANT_TRUE)) { IXMLDOMParseError* pXMLErr = NULL; LONG lErrorCode = 0L;
if (SUCCEEDED(pDoc->get_parseError(&pXMLErr)) && SUCCEEDED(pXMLErr->get_errorCode(&lErrorCode))) { if ( !bIgnoreErrorsIfNonExistingFile || ((lErrorCode != _HRESULT_TYPEDEF_(0x800C0006) /* INET_E_OBJECT_NOT_FOUND */) && (lErrorCode != HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND))) ) { _bstr_t bstrErr;
if (SUCCEEDED(pXMLErr->get_reason(&bstrErr.GetBSTR()))) { LPWSTR lpszStr = FormatString(L"Failed to load DOM from '%wS': %wS", lpszFilename, (wchar_t*)bstrErr); MessageBoxW(NULL, lpszStr, L"Error", MB_ICONERROR | MB_OK); MemFree(lpszStr); } } }
SAFE_RELEASE(pXMLErr); }
return (Success == VARIANT_TRUE);}