XML helpers added
This commit is contained in:
parent
c0dbc0caf2
commit
b927b467a3
@ -27,11 +27,13 @@
|
|||||||
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Create</PrecompiledHeader>
|
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Create</PrecompiledHeader>
|
||||||
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Create</PrecompiledHeader>
|
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Create</PrecompiledHeader>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
|
<ClCompile Include="..\src\xml.cpp" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ClInclude Include="..\include\wxex\appbar.h" />
|
<ClInclude Include="..\include\wxex\appbar.h" />
|
||||||
<ClInclude Include="..\include\wxex\common.h" />
|
<ClInclude Include="..\include\wxex\common.h" />
|
||||||
<ClInclude Include="..\include\wxex\comutils.h" />
|
<ClInclude Include="..\include\wxex\comutils.h" />
|
||||||
|
<ClInclude Include="..\include\wxex\xml.h" />
|
||||||
<ClInclude Include="..\src\stdafx.h" />
|
<ClInclude Include="..\src\stdafx.h" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
@ -28,6 +28,9 @@
|
|||||||
<ClCompile Include="..\src\comutils.cpp">
|
<ClCompile Include="..\src\comutils.cpp">
|
||||||
<Filter>Source Files</Filter>
|
<Filter>Source Files</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
|
<ClCompile Include="..\src\xml.cpp">
|
||||||
|
<Filter>Source Files</Filter>
|
||||||
|
</ClCompile>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ClInclude Include="..\src\stdafx.h">
|
<ClInclude Include="..\src\stdafx.h">
|
||||||
@ -42,6 +45,9 @@
|
|||||||
<ClInclude Include="..\include\wxex\comutils.h">
|
<ClInclude Include="..\include\wxex\comutils.h">
|
||||||
<Filter>Header Files</Filter>
|
<Filter>Header Files</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\include\wxex\xml.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<None Include="..\locale\wxExtend.pot">
|
<None Include="..\locale\wxExtend.pot">
|
||||||
|
@ -79,10 +79,11 @@ inline bool wxGetDoWndAnimation()
|
|||||||
///
|
///
|
||||||
/// Modifies window extended style.
|
/// Modifies window extended style.
|
||||||
///
|
///
|
||||||
/// \param[in] hWnd Handle of the window to modify.
|
/// \param[in] hWnd Handle of the window to modify.
|
||||||
/// \param[in] dwRemove Set of extended styles to remove.
|
/// \param[in] dwRemove Set of extended styles to remove.
|
||||||
/// \param[in] dwAdd Set of extended styles to add.
|
/// \param[in] dwAdd Set of extended styles to add.
|
||||||
/// \param[in] nFlags Additional SWP_ flags to pass to SetWindowPos(). If zero, SetWindowPos() is not called.
|
/// \param[in] nFlags Additional SWP_ flags to pass to SetWindowPos(). If zero, SetWindowPos() is not called.
|
||||||
|
///
|
||||||
/// \returns
|
/// \returns
|
||||||
/// - true when the window extended style was modified
|
/// - true when the window extended style was modified
|
||||||
/// - false if the window extended style was not neccessary
|
/// - false if the window extended style was not neccessary
|
||||||
|
116
include/wxex/xml.h
Normal file
116
include/wxex/xml.h
Normal file
@ -0,0 +1,116 @@
|
|||||||
|
/*
|
||||||
|
Copyright 2016 Amebis
|
||||||
|
|
||||||
|
This file is part of wxExtend.
|
||||||
|
|
||||||
|
wxExtend is free software: you can redistribute it and/or modify it
|
||||||
|
under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation, either version 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
wxExtend is distributed in the hope that it will be useful, but
|
||||||
|
WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with wxExtend. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "common.h"
|
||||||
|
|
||||||
|
#include <wx/string.h>
|
||||||
|
#include <wx/xml/xml.h>
|
||||||
|
|
||||||
|
|
||||||
|
///
|
||||||
|
/// Escapes text string for XML insertion
|
||||||
|
///
|
||||||
|
/// \param[in] str Text string
|
||||||
|
/// \returns Escaped string
|
||||||
|
///
|
||||||
|
inline wxString wxXmlEscapeText(_In_ const wxString& str)
|
||||||
|
{
|
||||||
|
wxString escaped;
|
||||||
|
escaped.reserve(str.length());
|
||||||
|
|
||||||
|
for (wxString::const_iterator i = str.begin(); i != str.end(); ++i) {
|
||||||
|
const wxChar c = *i;
|
||||||
|
switch (c) {
|
||||||
|
case wxS('<'):
|
||||||
|
escaped.append(wxS("<"));
|
||||||
|
break;
|
||||||
|
case wxS('>'):
|
||||||
|
escaped.append(wxS(">"));
|
||||||
|
break;
|
||||||
|
case wxS('&'):
|
||||||
|
escaped.append(wxS("&"));
|
||||||
|
break;
|
||||||
|
case wxS('\r'):
|
||||||
|
escaped.append(wxS("
"));
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
escaped.append(c);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return escaped;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
///
|
||||||
|
/// Escapes attribute value string for XML insertion
|
||||||
|
///
|
||||||
|
/// \param[in] str Attribute value
|
||||||
|
///
|
||||||
|
/// \returns Escaped string
|
||||||
|
///
|
||||||
|
inline wxString wxXmlEscapeAttr(_In_ const wxString& str)
|
||||||
|
{
|
||||||
|
wxString escaped;
|
||||||
|
escaped.reserve(str.length());
|
||||||
|
|
||||||
|
for (wxString::const_iterator i = str.begin(); i != str.end(); ++i) {
|
||||||
|
const wxChar c = *i;
|
||||||
|
switch (c) {
|
||||||
|
case wxS('<'):
|
||||||
|
escaped.append(wxS("<"));
|
||||||
|
break;
|
||||||
|
case wxS('>'):
|
||||||
|
escaped.append(wxS(">"));
|
||||||
|
break;
|
||||||
|
case wxS('&'):
|
||||||
|
escaped.append(wxS("&"));
|
||||||
|
break;
|
||||||
|
case wxS('\r'):
|
||||||
|
escaped.append(wxS("
"));
|
||||||
|
break;
|
||||||
|
case wxS('"'):
|
||||||
|
escaped.append(wxS("""));
|
||||||
|
break;
|
||||||
|
case wxS('\t'):
|
||||||
|
escaped.append(wxS("	"));
|
||||||
|
break;
|
||||||
|
case wxS('\n'):
|
||||||
|
escaped.append(wxS("
"));
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
escaped.append(c);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return escaped;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
///
|
||||||
|
/// Calculates hash of the node and all its children
|
||||||
|
///
|
||||||
|
/// \param[in] hash Handle of a hash object
|
||||||
|
/// \param[in] node Root node
|
||||||
|
///
|
||||||
|
///
|
||||||
|
void WXEXTEND_API wxXmlHashNode(_In_ HCRYPTHASH hash, const wxXmlNode *node);
|
@ -25,5 +25,6 @@
|
|||||||
|
|
||||||
#include "../include/wxex/appbar.h"
|
#include "../include/wxex/appbar.h"
|
||||||
#include "../include/wxex/comutils.h"
|
#include "../include/wxex/comutils.h"
|
||||||
|
#include "../include/wxex/xml.h"
|
||||||
|
|
||||||
#include "../include/wxex/common.h"
|
#include "../include/wxex/common.h"
|
||||||
|
120
src/xml.cpp
Normal file
120
src/xml.cpp
Normal file
@ -0,0 +1,120 @@
|
|||||||
|
/*
|
||||||
|
Copyright 2015-2016 Amebis
|
||||||
|
|
||||||
|
This file is part of wxExtend.
|
||||||
|
|
||||||
|
wxExtend is free software: you can redistribute it and/or modify it
|
||||||
|
under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation, either version 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
wxExtend is distributed in the hope that it will be useful, but
|
||||||
|
WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with wxExtend. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "stdafx.h"
|
||||||
|
|
||||||
|
|
||||||
|
static inline BOOL CryptHashData(__in HCRYPTHASH hHash, __in const wxString &str, __in DWORD dwFlags)
|
||||||
|
{
|
||||||
|
const wxScopedCharBuffer buf(str.ToUTF8());
|
||||||
|
return ::CryptHashData(hHash, (const BYTE*)buf.data(), buf.length(), dwFlags);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void WXEXTEND_API wxXmlHashNode(_In_ HCRYPTHASH hash, const wxXmlNode *node)
|
||||||
|
{
|
||||||
|
wxASSERT_MSG(node, wxT("invalid parameter"));
|
||||||
|
|
||||||
|
switch (node->GetType()) {
|
||||||
|
case wxXML_ELEMENT_NODE:
|
||||||
|
{
|
||||||
|
{
|
||||||
|
static const BYTE element_in [] = "<";
|
||||||
|
|
||||||
|
// Hash the open tag.
|
||||||
|
wxVERIFY(::CryptHashData(hash, element_in, _countof(element_in) - 1, 0));
|
||||||
|
wxVERIFY(::CryptHashData(hash, node->GetName(), 0));
|
||||||
|
for (wxXmlAttribute *attr = node->GetAttributes(); attr; attr = attr->GetNext()) {
|
||||||
|
static const BYTE attrib_sep[] = " ";
|
||||||
|
|
||||||
|
wxVERIFY(::CryptHashData(hash, attrib_sep, _countof(attrib_sep) - 1, 0));
|
||||||
|
wxVERIFY(::CryptHashData(hash, attr->GetName(), 0));
|
||||||
|
wxString value = attr->GetValue();
|
||||||
|
if (!value.IsEmpty()) {
|
||||||
|
static const BYTE
|
||||||
|
attrval_in [] = "=\"",
|
||||||
|
attrval_out[] = "\"";
|
||||||
|
|
||||||
|
wxVERIFY(::CryptHashData(hash, attrval_in, _countof(attrval_in) - 1, 0));
|
||||||
|
wxVERIFY(::CryptHashData(hash, wxXmlEscapeAttr(value), 0));
|
||||||
|
wxVERIFY(::CryptHashData(hash, attrval_out, _countof(attrval_out) - 1, 0));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
wxXmlNode *child = node->GetChildren();
|
||||||
|
if (child) {
|
||||||
|
static const BYTE
|
||||||
|
element_out [] = ">",
|
||||||
|
elemclose_in[] = "</";
|
||||||
|
|
||||||
|
// Hash the open tag closing.
|
||||||
|
wxVERIFY(::CryptHashData(hash, element_out, _countof(element_out) - 1, 0));
|
||||||
|
|
||||||
|
// Hash the children.
|
||||||
|
for (; child; child = child->GetNext())
|
||||||
|
wxXmlHashNode(hash, child);
|
||||||
|
|
||||||
|
// Hash the closing tag.
|
||||||
|
wxVERIFY(::CryptHashData(hash, elemclose_in, _countof(elemclose_in) - 1, 0));
|
||||||
|
wxVERIFY(::CryptHashData(hash, node->GetName(), 0));
|
||||||
|
wxVERIFY(::CryptHashData(hash, element_out, _countof(element_out) - 1, 0));
|
||||||
|
} else {
|
||||||
|
static const BYTE element_out [] = "/>";
|
||||||
|
|
||||||
|
// Hash the childless element tag closing.
|
||||||
|
wxVERIFY(::CryptHashData(hash, element_out, _countof(element_out) - 1, 0));
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case wxXML_TEXT_NODE:
|
||||||
|
{
|
||||||
|
wxVERIFY(::CryptHashData(hash, wxXmlEscapeText(node->GetContent()), 0));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case wxXML_CDATA_SECTION_NODE:
|
||||||
|
{
|
||||||
|
static const BYTE
|
||||||
|
cdata_in [] = "<![CDATA[",
|
||||||
|
cdata_out[] = "]]>";
|
||||||
|
|
||||||
|
wxVERIFY(::CryptHashData(hash, cdata_in, _countof(cdata_in) - 1, 0));
|
||||||
|
wxVERIFY(::CryptHashData(hash, node->GetContent(), 0));
|
||||||
|
wxVERIFY(::CryptHashData(hash, cdata_out, _countof(cdata_out) - 1, 0));
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case wxXML_COMMENT_NODE:
|
||||||
|
{
|
||||||
|
wxVERIFY(::CryptHashData(hash, node->GetContent(), 0));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case wxXML_DOCUMENT_NODE:
|
||||||
|
{
|
||||||
|
// Hash the children.
|
||||||
|
for (wxXmlNode *child = node->GetChildren(); child; child = child->GetNext())
|
||||||
|
wxXmlHashNode(hash, child);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user