qtmobility/src/versit/qvcard30writer.cpp
changeset 4 90517678cc4f
parent 1 2b40d63a9c3d
child 11 06b8e2af4411
--- a/qtmobility/src/versit/qvcard30writer.cpp	Fri Apr 16 15:51:22 2010 +0300
+++ b/qtmobility/src/versit/qvcard30writer.cpp	Mon May 03 13:18:40 2010 +0300
@@ -79,7 +79,7 @@
     encodeParameters(modifiedProperty.parameters());
     writeString(QLatin1String(":"));
 
-    QString value;
+    QString renderedValue;
     if (variant.canConvert<QVersitDocument>()) {
         QVersitDocument embeddedDocument = variant.value<QVersitDocument>();
         QByteArray data;
@@ -90,14 +90,40 @@
         subWriter.setDevice(&buffer);
         subWriter.encodeVersitDocument(embeddedDocument);
         QString documentString(mCodec->toUnicode(data));
-        VersitUtils::backSlashEscape(documentString);
-        value = documentString;
+        backSlashEscape(documentString);
+        renderedValue = documentString;
     } else if (variant.type() == QVariant::String) {
-        value = variant.toString();
+        renderedValue = variant.toString();
+        backSlashEscape(renderedValue);
+    } else if (variant.type() == QVariant::StringList) {
+        // We need to backslash escape and concatenate the values in the list
+        QStringList values = property.variantValue().toStringList();
+        QString separator;
+        if (property.valueType() == QVersitProperty::CompoundType) {
+            separator = QLatin1String(";");
+        } else {
+            if (property.valueType() != QVersitProperty::ListType) {
+                qWarning("Variant value is a QStringList but the property's value type is neither "
+                         "CompoundType or ListType");
+            }
+            // Assume it's a ListType
+            separator = QLatin1String(",");
+        }
+        bool first = true;
+        foreach (QString value, values) {
+            if (!(value.isEmpty() && property.valueType() == QVersitProperty::ListType)) {
+                if (!first) {
+                    renderedValue += separator;
+                }
+                backSlashEscape(value);
+                renderedValue += value;
+                first = false;
+            }
+        }
     } else if (variant.type() == QVariant::ByteArray) {
-        value = QLatin1String(variant.toByteArray().toBase64().data());
+        renderedValue = QLatin1String(variant.toByteArray().toBase64().data());
     }
-    writeString(value);
+    writeString(renderedValue);
     writeCrlf();
 }
 
@@ -110,7 +136,7 @@
     foreach (QString nameString, names) {
         writeString(QLatin1String(";"));
         QStringList values = parameters.values(nameString);
-        VersitUtils::backSlashEscape(nameString);
+        backSlashEscape(nameString);
         writeString(nameString);
         writeString(QLatin1String("="));
         for (int i=0; i<values.size(); i++) {
@@ -118,8 +144,25 @@
                 writeString(QLatin1String(","));
             QString value = values.at(i);
 
-            VersitUtils::backSlashEscape(value);
+            backSlashEscape(value);
             writeString(value);
         }
     }
 }
+
+
+/*!
+ * Performs backslash escaping for line breaks (CRLFs), semicolons, backslashes and commas according
+ * to RFC 2426.  This is called on parameter names and values and property values.
+ * Colons ARE NOT escaped because the examples in RFC2426 suggest that they shouldn't be.
+ */
+void QVCard30Writer::backSlashEscape(QString& text)
+{
+    /* replaces ; with \;
+                , with \,
+                \ with \\
+     */
+    text.replace(QRegExp(QLatin1String("([;,\\\\])")), QLatin1String("\\\\1"));
+    // replaces any CRLFs with \n
+    text.replace(QRegExp(QLatin1String("\r\n|\r|\n")), QLatin1String("\\n"));
+}