// a private utility used by wxXML
-static bool wxIsWhiteOnly(const wxChar *buf);
+static bool wxIsWhiteOnly(const wxString& buf);
//-----------------------------------------------------------------------------
// converts Expat-produced string in UTF-8 into wxString using the specified
// conv or keep in UTF-8 if conv is NULL
static wxString CharToString(wxMBConv *conv,
- const char *s, size_t len = wxString::npos)
+ const char *s, size_t len = wxString::npos)
{
-#if wxUSE_UNICODE
- wxUnusedVar(conv);
-
- return wxString(s, wxConvUTF8, len);
-#else // !wxUSE_UNICODE
+#if !wxUSE_UNICODE
if ( conv )
{
// there can be no embedded NULs in this string so we don't need the
return wxString(wbuf, *conv);
}
- else // already in UTF-8, no conversion needed
- {
- return wxString(s, len != wxString::npos ? len : strlen(s));
- }
-#endif // wxUSE_UNICODE/!wxUSE_UNICODE
+ // else: the string is wanted in UTF-8
+#endif // !wxUSE_UNICODE
+
+ wxUnusedVar(conv);
+ return wxString::FromUTF8(s, len);
}
// returns true if the given string contains only whitespaces
-bool wxIsWhiteOnly(const wxChar *buf)
+bool wxIsWhiteOnly(const wxString& buf)
{
- for (const wxChar *c = buf; *c != wxT('\0'); c++)
- if (*c != wxT(' ') && *c != wxT('\t') && *c != wxT('\n') && *c != wxT('\r'))
+ for ( wxString::const_iterator i = buf.begin(); i != buf.end(); ++i )
+ {
+ wxChar c = *i;
+ if ( c != wxT(' ') && c != wxT('\t') && c != wxT('\n') && c != wxT('\r'))
return false;
+ }
return true;
}
wxXmlNode *lastAsText;
wxString encoding;
wxString version;
- bool bLastCdata;
bool removeWhiteOnlyNodes;
};
ctx->node = node;
ctx->lastAsText = NULL;
}
-}
-extern "C" {
static void EndElementHnd(void *userData, const char* WXUNUSED(name))
{
wxXmlParsingContext *ctx = (wxXmlParsingContext*)userData;
ctx->node = ctx->node->GetParent();
ctx->lastAsText = NULL;
}
-}
-extern "C" {
static void TextHnd(void *userData, const char *s, int len)
{
wxXmlParsingContext *ctx = (wxXmlParsingContext*)userData;
if (ctx->lastAsText)
{
- if ( ctx->bLastCdata )
- {
- ctx->lastAsText->SetContent(ctx->lastAsText->GetContent() +
- CharToString(NULL, s, len));
- }
- else
- {
- ctx->lastAsText->SetContent(ctx->lastAsText->GetContent() + str);
- }
+ ctx->lastAsText->SetContent(ctx->lastAsText->GetContent() + str);
}
else
{
}
}
}
-}
-extern "C" {
static void StartCdataHnd(void *userData)
{
wxXmlParsingContext *ctx = (wxXmlParsingContext*)userData;
- ctx->bLastCdata = true;
-
ctx->lastAsText = new wxXmlNode(wxXML_CDATA_SECTION_NODE, wxT("cdata"),wxT(""));
ctx->node->AddChild(ctx->lastAsText);
}
-}
-
-extern "C" {
-static void EndCdataHnd(void *userData)
-{
- wxXmlParsingContext *ctx = (wxXmlParsingContext*)userData;
-
- ctx->bLastCdata = false;
-}
-}
-extern "C" {
static void CommentHnd(void *userData, const char *data)
{
wxXmlParsingContext *ctx = (wxXmlParsingContext*)userData;
}
ctx->lastAsText = NULL;
}
-}
-extern "C" {
static void DefaultHnd(void *userData, const char *s, int len)
{
// XML header:
ctx->version = buf.Mid(pos + 9).BeforeFirst(buf[(size_t)pos+8]);
}
}
-}
-extern "C" {
static int UnknownEncodingHnd(void * WXUNUSED(encodingHandlerData),
const XML_Char *name, XML_Encoding *info)
{
// We must build conversion table for expat. The easiest way to do so
// is to let wxCSConv convert as string containing all characters to
// wide character representation:
- wxString str(name, wxConvLibc);
- wxCSConv conv(str);
+ wxCSConv conv(name);
char mbBuf[2];
wchar_t wcBuf[10];
size_t i;
return 1;
}
-}
+
+} // extern "C"
bool wxXmlDocument::Load(wxInputStream& stream, const wxString& encoding, int flags)
{
ctx.encoding = wxT("UTF-8"); // default in absence of encoding=""
ctx.conv = NULL;
#if !wxUSE_UNICODE
- if ( encoding != wxT("UTF-8") && encoding != wxT("utf-8") )
+ if ( encoding.CmpNoCase(wxT("UTF-8")) != 0 )
ctx.conv = new wxCSConv(encoding);
#endif
ctx.removeWhiteOnlyNodes = (flags & wxXMLDOC_KEEP_WHITESPACE_NODES) == 0;
- ctx.bLastCdata = false;
XML_SetUserData(parser, (void*)&ctx);
XML_SetElementHandler(parser, StartElementHnd, EndElementHnd);
XML_SetCharacterDataHandler(parser, TextHnd);
- XML_SetCdataSectionHandler(parser, StartCdataHnd, EndCdataHnd );
+ XML_SetStartCdataSectionHandler(parser, StartCdataHnd);
XML_SetCommentHandler(parser, CommentHnd);
XML_SetDefaultHandler(parser, DefaultHnd);
XML_SetUnknownEncodingHandler(parser, UnknownEncodingHnd, NULL);
wxString s;
- wxMBConv *convMem = NULL;
+ wxMBConv *convMem = NULL,
+ *convFile;
#if wxUSE_UNICODE
- wxMBConv *convFile = new wxCSConv(GetFileEncoding());
+ convFile = new wxCSConv(GetFileEncoding());
+ convMem = NULL;
#else
- wxMBConv *convFile = NULL;
- if ( GetFileEncoding() != GetEncoding() )
+ if ( GetFileEncoding().CmpNoCase(GetEncoding()) != 0 )
{
convFile = new wxCSConv(GetFileEncoding());
convMem = new wxCSConv(GetEncoding());
}
+ else // file and in-memory encodings are the same, no conversion needed
+ {
+ convFile =
+ convMem = NULL;
+ }
#endif
s.Printf(wxT("<?xml version=\"%s\" encoding=\"%s\"?>\n"),
OutputNode(stream, GetRoot(), 0, convMem, convFile, indentstep);
OutputString(stream, wxT("\n"));
- if ( convFile )
- delete convFile;
- if ( convMem )
- delete convMem;
+ delete convFile;
+ delete convMem;
return true;
}