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['&'] = "&amp;";
+                       SDOUtils::HtmlEntities['<'] = "&lt;";
+                       SDOUtils::HtmlEntities['>'] = "&gt;";
+                       SDOUtils::HtmlEntities['\''] = "&apos;";
+                       SDOUtils::HtmlEntities['"'] = "&quot;";
+
             SDOUtils::populated = true;
             return true;
         }
@@ -316,6 +324,115 @@
 
             return returnString;
         }
+
+
+               /*
+                * Processes a string, substituting entities (such as &amp;) 
for special characters
+                * Does not double-encode, that is, &amp; is not converted to 
&amp;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 &amp;) 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]

Reply via email to