1f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch/* 2f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * libjingle 3f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * Copyright 2004--2005, Google Inc. 4f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * 5f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * Redistribution and use in source and binary forms, with or without 6f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * modification, are permitted provided that the following conditions are met: 7f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * 8f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * 1. Redistributions of source code must retain the above copyright notice, 9f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * this list of conditions and the following disclaimer. 10f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * 2. Redistributions in binary form must reproduce the above copyright notice, 11f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * this list of conditions and the following disclaimer in the documentation 12f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * and/or other materials provided with the distribution. 13f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * 3. The name of the author may not be used to endorse or promote products 14f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * derived from this software without specific prior written permission. 15f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * 16f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED 17f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 18f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO 19f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 20f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 21f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 22f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 23f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 24f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 25f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 26f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch */ 27f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 28f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#include <string> 29f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#include <iostream> 30f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#include <vector> 31f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#include <sstream> 32f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#include "talk/xmllite/xmlelement.h" 33f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#include "talk/xmllite/xmlprinter.h" 34f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#include "talk/xmllite/xmlnsstack.h" 35f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#include "talk/xmllite/xmlconstants.h" 36f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 37f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdochnamespace buzz { 38f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 39f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdochclass XmlPrinterImpl { 40f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdochpublic: 41f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch XmlPrinterImpl(std::ostream * pout, 42f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch const std::string * const xmlns, int xmlnsCount); 43f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch void PrintElement(const XmlElement * element); 44f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch void PrintQuotedValue(const std::string & text); 45f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch void PrintBodyText(const std::string & text); 46f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch void PrintCDATAText(const std::string & text); 47f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 48f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdochprivate: 49f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch std::ostream *pout_; 50f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch XmlnsStack xmlnsStack_; 51f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch}; 52f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 53f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdochvoid 54f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen MurdochXmlPrinter::PrintXml(std::ostream * pout, const XmlElement * element) { 55f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch PrintXml(pout, element, NULL, 0); 56f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch} 57f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 58f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdochvoid 59f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen MurdochXmlPrinter::PrintXml(std::ostream * pout, const XmlElement * element, 60f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch const std::string * const xmlns, int xmlnsCount) { 61f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch XmlPrinterImpl printer(pout, xmlns, xmlnsCount); 62f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch printer.PrintElement(element); 63f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch} 64f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 65f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen MurdochXmlPrinterImpl::XmlPrinterImpl(std::ostream * pout, 66f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch const std::string * const xmlns, int xmlnsCount) : 67f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch pout_(pout), 68f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch xmlnsStack_() { 69f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch int i; 70f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch for (i = 0; i < xmlnsCount; i += 2) { 71f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch xmlnsStack_.AddXmlns(xmlns[i], xmlns[i + 1]); 72f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch } 73f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch} 74f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 75f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdochvoid 76f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen MurdochXmlPrinterImpl::PrintElement(const XmlElement * element) { 77f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch xmlnsStack_.PushFrame(); 78f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 79f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // first go through attrs of pel to add xmlns definitions 80f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch const XmlAttr * pattr; 81f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch for (pattr = element->FirstAttr(); pattr; pattr = pattr->NextAttr()) { 82f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch if (pattr->Name() == QN_XMLNS) 83f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch xmlnsStack_.AddXmlns(STR_EMPTY, pattr->Value()); 84f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch else if (pattr->Name().Namespace() == NS_XMLNS) 85f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch xmlnsStack_.AddXmlns(pattr->Name().LocalPart(), 86f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch pattr->Value()); 87f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch } 88f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 89f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // then go through qnames to make sure needed xmlns definitons are added 90f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch std::vector<std::string> newXmlns; 91f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch std::pair<std::string, bool> prefix; 92f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch prefix = xmlnsStack_.AddNewPrefix(element->Name().Namespace(), false); 93f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch if (prefix.second) { 94f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch newXmlns.push_back(prefix.first); 95f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch newXmlns.push_back(element->Name().Namespace()); 96f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch } 97f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 98f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch for (pattr = element->FirstAttr(); pattr; pattr = pattr->NextAttr()) { 99f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch prefix = xmlnsStack_.AddNewPrefix(pattr->Name().Namespace(), true); 100f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch if (prefix.second) { 101f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch newXmlns.push_back(prefix.first); 102f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch newXmlns.push_back(pattr->Name().Namespace()); 103f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch } 104f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch } 105f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 106f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // print the element name 107f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch *pout_ << '<' << xmlnsStack_.FormatQName(element->Name(), false); 108f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 109f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // and the attributes 110f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch for (pattr = element->FirstAttr(); pattr; pattr = pattr->NextAttr()) { 111f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch *pout_ << ' ' << xmlnsStack_.FormatQName(pattr->Name(), true) << "=\""; 112f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch PrintQuotedValue(pattr->Value()); 113f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch *pout_ << '"'; 114f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch } 115f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 116f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // and the extra xmlns declarations 117f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch std::vector<std::string>::iterator i(newXmlns.begin()); 118f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch while (i < newXmlns.end()) { 119f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch if (*i == STR_EMPTY) 120f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch *pout_ << " xmlns=\"" << *(i + 1) << '"'; 121f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch else 122f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch *pout_ << " xmlns:" << *i << "=\"" << *(i + 1) << '"'; 123f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch i += 2; 124f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch } 125f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 126f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // now the children 127f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch const XmlChild * pchild = element->FirstChild(); 128f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 129f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch if (pchild == NULL) 130f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch *pout_ << "/>"; 131f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch else { 132f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch *pout_ << '>'; 133f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch while (pchild) { 134f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch if (pchild->IsText()) { 135f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch if (element->IsCDATA()) { 136f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch PrintCDATAText(pchild->AsText()->Text()); 137f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch } else { 138f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch PrintBodyText(pchild->AsText()->Text()); 139f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch } 140f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch } else 141f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch PrintElement(pchild->AsElement()); 142f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch pchild = pchild->NextChild(); 143f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch } 144f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch *pout_ << "</" << xmlnsStack_.FormatQName(element->Name(), false) << '>'; 145f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch } 146f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 147f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch xmlnsStack_.PopFrame(); 148f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch} 149f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 150f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdochvoid 151f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen MurdochXmlPrinterImpl::PrintQuotedValue(const std::string & text) { 152f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch size_t safe = 0; 153f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch for (;;) { 154f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch size_t unsafe = text.find_first_of("<>&\"", safe); 155f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch if (unsafe == std::string::npos) 156f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch unsafe = text.length(); 157f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch *pout_ << text.substr(safe, unsafe - safe); 158f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch if (unsafe == text.length()) 159f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch return; 160f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch switch (text[unsafe]) { 161f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch case '<': *pout_ << "<"; break; 162f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch case '>': *pout_ << ">"; break; 163f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch case '&': *pout_ << "&"; break; 164f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch case '"': *pout_ << """; break; 165f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch } 166f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch safe = unsafe + 1; 167f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch if (safe == text.length()) 168f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch return; 169f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch } 170f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch} 171f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 172f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdochvoid 173f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen MurdochXmlPrinterImpl::PrintBodyText(const std::string & text) { 174f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch size_t safe = 0; 175f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch for (;;) { 176f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch size_t unsafe = text.find_first_of("<>&", safe); 177f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch if (unsafe == std::string::npos) 178f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch unsafe = text.length(); 179f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch *pout_ << text.substr(safe, unsafe - safe); 180f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch if (unsafe == text.length()) 181f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch return; 182f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch switch (text[unsafe]) { 183f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch case '<': *pout_ << "<"; break; 184f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch case '>': *pout_ << ">"; break; 185f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch case '&': *pout_ << "&"; break; 186f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch } 187f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch safe = unsafe + 1; 188f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch if (safe == text.length()) 189f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch return; 190f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch } 191f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch} 192f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 193f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdochvoid 194f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen MurdochXmlPrinterImpl::PrintCDATAText(const std::string & text) { 195f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch *pout_ << "<![CDATA[" << text << "]]>"; 196f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch} 197f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 198f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch} 199