OSDN Git Service

BUG: [2372000] Ampersand in folder names ruins the project file
authorTakashi Sawanaka <sdottaka@users.sourceforge.net>
Sun, 21 Dec 2008 12:16:20 +0000 (12:16 +0000)
committerTakashi Sawanaka <sdottaka@users.sourceforge.net>
Sun, 21 Dec 2008 12:16:20 +0000 (12:16 +0000)
Docs/Users/ChangeLog.txt
Src/ProjectFile.cpp

index 9f7c271..72a46db 100644 (file)
@@ -3,6 +3,10 @@ Numbers in parentheses refer to SourceForge.net tracker item numbers (#XXXXX) or
 to Subversion revision numbers (rXXXXX). To open the tracker item, go to URL:
 http://winmerge.org/tracker/[tracker-id]
 
+WinMerge 2.13.1.1
+  Bugfix: Cound not open project file that contains an ampersand 
+    character in folder names (#2372000)
+
 WinMerge 2.12.x (R2_12) branch created (r6202)
 
 WinMerge 2.11.1.8 - 2008-12-19 (r6200)
index f152102..c13e7c2 100755 (executable)
@@ -288,6 +288,20 @@ scew_element* ProjectFile::AddPathsElement(scew_element * parent)
 }
 
 /**
+ * @brief Covert characters that are unsafe for use in XML
+ * @param [in] str The string to be converted
+ * @return The converted string
+ */
+static String EscapeXML(const String &str)
+{
+       String escapedStr = str;
+       string_replace(escapedStr, _T("&"), _T("&amp;"));
+       string_replace(escapedStr, _T("<"), _T("&lt;"));
+       string_replace(escapedStr, _T(">"), _T("&gt;"));
+       return escapedStr;
+}
+
+/**
  * @brief Add paths data to the XML tree.
  * This function adds our paths data to the XML tree.
  * @param [in] parent Parent element for paths data.
@@ -300,29 +314,23 @@ BOOL ProjectFile::AddPathsContent(scew_element * parent)
 
        if (!m_leftFile.IsEmpty())
        {
-               LPCTSTR path;
                element = scew_element_add(parent, Left_element_name);
-               path = m_leftFile.GetBuffer(MAX_PATH);
-               scew_element_set_contents(element, T2UTF8(path));
-               m_leftFile.ReleaseBuffer();
+               String path = m_leftFile;
+               scew_element_set_contents(element, T2UTF8(EscapeXML(path).c_str()));
        }
 
        if (!m_rightFile.IsEmpty())
        {
-               LPCTSTR path;
                element = scew_element_add(parent, Right_element_name);
-               path = m_rightFile.GetBuffer(MAX_PATH);
-               scew_element_set_contents(element, T2UTF8(path));
-               m_rightFile.ReleaseBuffer();
+               String path = m_rightFile;
+               scew_element_set_contents(element, T2UTF8(EscapeXML(path).c_str()));
        }
 
        if (!m_filter.IsEmpty())
        {
-               LPCTSTR filter;
                element = scew_element_add(parent, Filter_element_name);
-               filter = m_filter.GetBuffer(MAX_PATH);
-               scew_element_set_contents(element, T2UTF8(filter));
-               m_filter.ReleaseBuffer();
+               String filter = m_filter;
+               scew_element_set_contents(element, T2UTF8(EscapeXML(filter).c_str()));
        }
 
        element = scew_element_add(parent, Subfolders_element_name);