robbinspg
Tue, 04 Dec 2007 03:50:01 -0800
Author: robbinspg Date: Tue Dec 4 03:49:39 2007 New Revision: 600900 URL: http://svn.apache.org/viewvc?rev=600900&view=rev Log: TUSCANY-1553 Apply Caroline's patch Minor modification to patch to avoid VC8 compile errors Modified: incubator/tuscany/branches/sdo-cpp-pre2.1/runtime/core/src/commonj/sdo/SDOUtils.cpp incubator/tuscany/branches/sdo-cpp-pre2.1/runtime/core/src/commonj/sdo/SDOUtils.h incubator/tuscany/branches/sdo-cpp-pre2.1/runtime/core/src/commonj/sdo/SDOXMLWriter.cpp Modified: incubator/tuscany/branches/sdo-cpp-pre2.1/runtime/core/src/commonj/sdo/SDOUtils.cpp URL: http://svn.apache.org/viewvc/incubator/tuscany/branches/sdo-cpp-pre2.1/runtime/core/src/commonj/sdo/SDOUtils.cpp?rev=600900&r1=600899&r2=600900&view=diff ============================================================================== --- incubator/tuscany/branches/sdo-cpp-pre2.1/runtime/core/src/commonj/sdo/SDOUtils.cpp (original) +++ incubator/tuscany/branches/sdo-cpp-pre2.1/runtime/core/src/commonj/sdo/SDOUtils.cpp Tue Dec 4 03:49:39 2007 @@ -44,6 +44,8 @@ std::map<std::string,std::string> SDOUtils::XsdToSdo; + std::map<char,std::string> SDOUtils::HtmlEntities; + bool SDOUtils::populated = false; bool SDOUtils::populate() @@ -84,6 +86,12 @@ SDOUtils::SdoToXsd["Bytes"] = "base64Binary"; SDOUtils::SdoToXsd["URI"] = "anyURI"; + SDOUtils::HtmlEntities['&'] = "&"; + SDOUtils::HtmlEntities['<'] = "<"; + SDOUtils::HtmlEntities['>'] = ">"; + SDOUtils::HtmlEntities['\''] = "'"; + SDOUtils::HtmlEntities['"'] = """; + SDOUtils::populated = true; return true; } @@ -316,6 +324,115 @@ return returnString; } + + + /* + * Processes a string, substituting entities (such as &) for special characters + * Does not double-encode, that is, & is not converted to &amp; + */ + SDOString SDOUtils::escapeHtmlEntities(SDOString inputString) + { + if (inputString.size() == 0) + return inputString; + + if (!SDOUtils::populated) SDOUtils::populate(); + + SDOString returnString = SDOString(); + + SDOString::iterator start = inputString.begin(); + SDOString::iterator end = inputString.end(); + SDOString::iterator cur = start; + + while(cur < end) { + //cout << SDOString(cur) <<endl; + if ((*cur) == '&') { + bool skip = false; + /* + * Don't want to double-encode, so skip recognised entities + */ + for (map<char, SDOString>::iterator iter = HtmlEntities.begin(); + iter != HtmlEntities.end(); iter++ ) { + if (SDOString(cur, end).compare(0, (*iter).second.length(), (*iter).second) == 0) { + cur += (*iter).second.length(); + skip = true; + break; + } + } + + if (skip) continue; + } + + /* + * look for characters which need encoding + */ + for (map<char, SDOString>::iterator iter = HtmlEntities.begin(); + iter != HtmlEntities.end(); iter++ ) { + if ((*cur) == (*iter).first) { + returnString += SDOString(start, cur); + // cout << returnString <<endl; + returnString += (*iter).second; + // cout << returnString <<endl; + start = cur + 1; + break; + } + } + + cur++; + } + + returnString += SDOString(start, end); + // cout << returnString <<endl; + return returnString; + } + + + /* + * Processes a string substituting entities (such as &) for special characters + * CDATA sections within the string are left untouched + */ + SDOString SDOUtils::escapeHtmlEntitiesExcludingCData(SDOString inputString) + { + if (inputString.size() == 0) + return inputString; + + if (!SDOUtils::populated) SDOUtils::populate(); + + SDOString returnString = SDOString(); + + SDOString::const_iterator start = inputString.begin(); + SDOString::const_iterator end = inputString.end(); + SDOString::const_iterator cur = start; + + bool inCdataSection = false; + while(cur < end) { + if (!inCdataSection && SDOString(cur, end).compare(0, strlen(XMLCDataStartMarker), XMLCDataStartMarker) == 0) { + inCdataSection = true; + returnString += escapeHtmlEntities(SDOString(start, cur)); + start = cur; + cur += strlen(XMLCDataStartMarker); + continue; + } + + if (inCdataSection && SDOString(cur, end).compare(0, strlen(XMLCDataEndMarker), XMLCDataEndMarker) == 0) { + inCdataSection = false; + cur += strlen(XMLCDataEndMarker); + /* don't escape inside the cdata section */ + returnString += SDOString(start, cur); + start = cur; + continue; + } + + ++cur; + } + + if (inCdataSection) { + returnString += SDOString(start, end); + } else { + returnString += escapeHtmlEntities(SDOString(start, end)); + } + + return returnString; + } }; Modified: incubator/tuscany/branches/sdo-cpp-pre2.1/runtime/core/src/commonj/sdo/SDOUtils.h URL: http://svn.apache.org/viewvc/incubator/tuscany/branches/sdo-cpp-pre2.1/runtime/core/src/commonj/sdo/SDOUtils.h?rev=600900&r1=600899&r2=600900&view=diff ============================================================================== --- incubator/tuscany/branches/sdo-cpp-pre2.1/runtime/core/src/commonj/sdo/SDOUtils.h (original) +++ incubator/tuscany/branches/sdo-cpp-pre2.1/runtime/core/src/commonj/sdo/SDOUtils.h Tue Dec 4 03:49:39 2007 @@ -47,6 +47,8 @@ static SDO_API const char* XSDToSDO(const char* xsdname); static SDO_API void printTypes(std::ostream& out, DataFactoryPtr df); static SDOString replace(SDOString hostString, const char *fromString, const char *toString); + static SDOString escapeHtmlEntities(SDOString inputString); + static SDOString escapeHtmlEntitiesExcludingCData(SDOString inputString); /* * Markers used to represent the start and end of CDATA sections in the @@ -68,6 +70,7 @@ static std::map<std::string,std::string> XsdToSdo; static std::map<std::string,std::string> SdoToXsd; + static std::map<char, std::string> HtmlEntities; }; } // End - namespace sdo Modified: incubator/tuscany/branches/sdo-cpp-pre2.1/runtime/core/src/commonj/sdo/SDOXMLWriter.cpp URL: http://svn.apache.org/viewvc/incubator/tuscany/branches/sdo-cpp-pre2.1/runtime/core/src/commonj/sdo/SDOXMLWriter.cpp?rev=600900&r1=600899&r2=600900&view=diff ============================================================================== --- incubator/tuscany/branches/sdo-cpp-pre2.1/runtime/core/src/commonj/sdo/SDOXMLWriter.cpp (original) +++ incubator/tuscany/branches/sdo-cpp-pre2.1/runtime/core/src/commonj/sdo/SDOXMLWriter.cpp Tue Dec 4 03:49:39 2007 @@ -34,6 +34,7 @@ #include "commonj/sdo/DataObjectImpl.h" #include "commonj/sdo/DataFactoryImpl.h" #include "commonj/sdo/PropertySetting.h" +#include "commonj/sdo/SDOUtils.h" namespace commonj { @@ -1255,7 +1256,7 @@ const SDOXMLString& content) { int rc = 0; - rc = xmlTextWriterWriteRaw(writer, content); + rc = xmlTextWriterWriteRaw(writer, SDOXMLString(SDOUtils::escapeHtmlEntitiesExcludingCData(content).c_str())); /* A more complex version that doesn't work! * I've left it here just in case we need to go back and separate out --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]