qtmobility/src/versit/qvcard30writer.cpp
changeset 4 90517678cc4f
parent 1 2b40d63a9c3d
child 11 06b8e2af4411
equal deleted inserted replaced
1:2b40d63a9c3d 4:90517678cc4f
    77         modifiedProperty.insertParameter(QLatin1String("ENCODING"), QLatin1String("b"));
    77         modifiedProperty.insertParameter(QLatin1String("ENCODING"), QLatin1String("b"));
    78     }
    78     }
    79     encodeParameters(modifiedProperty.parameters());
    79     encodeParameters(modifiedProperty.parameters());
    80     writeString(QLatin1String(":"));
    80     writeString(QLatin1String(":"));
    81 
    81 
    82     QString value;
    82     QString renderedValue;
    83     if (variant.canConvert<QVersitDocument>()) {
    83     if (variant.canConvert<QVersitDocument>()) {
    84         QVersitDocument embeddedDocument = variant.value<QVersitDocument>();
    84         QVersitDocument embeddedDocument = variant.value<QVersitDocument>();
    85         QByteArray data;
    85         QByteArray data;
    86         QBuffer buffer(&data);
    86         QBuffer buffer(&data);
    87         buffer.open(QIODevice::WriteOnly);
    87         buffer.open(QIODevice::WriteOnly);
    88         QVCard30Writer subWriter;
    88         QVCard30Writer subWriter;
    89         subWriter.setCodec(mCodec);
    89         subWriter.setCodec(mCodec);
    90         subWriter.setDevice(&buffer);
    90         subWriter.setDevice(&buffer);
    91         subWriter.encodeVersitDocument(embeddedDocument);
    91         subWriter.encodeVersitDocument(embeddedDocument);
    92         QString documentString(mCodec->toUnicode(data));
    92         QString documentString(mCodec->toUnicode(data));
    93         VersitUtils::backSlashEscape(documentString);
    93         backSlashEscape(documentString);
    94         value = documentString;
    94         renderedValue = documentString;
    95     } else if (variant.type() == QVariant::String) {
    95     } else if (variant.type() == QVariant::String) {
    96         value = variant.toString();
    96         renderedValue = variant.toString();
       
    97         backSlashEscape(renderedValue);
       
    98     } else if (variant.type() == QVariant::StringList) {
       
    99         // We need to backslash escape and concatenate the values in the list
       
   100         QStringList values = property.variantValue().toStringList();
       
   101         QString separator;
       
   102         if (property.valueType() == QVersitProperty::CompoundType) {
       
   103             separator = QLatin1String(";");
       
   104         } else {
       
   105             if (property.valueType() != QVersitProperty::ListType) {
       
   106                 qWarning("Variant value is a QStringList but the property's value type is neither "
       
   107                          "CompoundType or ListType");
       
   108             }
       
   109             // Assume it's a ListType
       
   110             separator = QLatin1String(",");
       
   111         }
       
   112         bool first = true;
       
   113         foreach (QString value, values) {
       
   114             if (!(value.isEmpty() && property.valueType() == QVersitProperty::ListType)) {
       
   115                 if (!first) {
       
   116                     renderedValue += separator;
       
   117                 }
       
   118                 backSlashEscape(value);
       
   119                 renderedValue += value;
       
   120                 first = false;
       
   121             }
       
   122         }
    97     } else if (variant.type() == QVariant::ByteArray) {
   123     } else if (variant.type() == QVariant::ByteArray) {
    98         value = QLatin1String(variant.toByteArray().toBase64().data());
   124         renderedValue = QLatin1String(variant.toByteArray().toBase64().data());
    99     }
   125     }
   100     writeString(value);
   126     writeString(renderedValue);
   101     writeCrlf();
   127     writeCrlf();
   102 }
   128 }
   103 
   129 
   104 /*!
   130 /*!
   105  * Encodes the \a parameters and writes it to the device.
   131  * Encodes the \a parameters and writes it to the device.
   108 {
   134 {
   109     QList<QString> names = parameters.uniqueKeys();
   135     QList<QString> names = parameters.uniqueKeys();
   110     foreach (QString nameString, names) {
   136     foreach (QString nameString, names) {
   111         writeString(QLatin1String(";"));
   137         writeString(QLatin1String(";"));
   112         QStringList values = parameters.values(nameString);
   138         QStringList values = parameters.values(nameString);
   113         VersitUtils::backSlashEscape(nameString);
   139         backSlashEscape(nameString);
   114         writeString(nameString);
   140         writeString(nameString);
   115         writeString(QLatin1String("="));
   141         writeString(QLatin1String("="));
   116         for (int i=0; i<values.size(); i++) {
   142         for (int i=0; i<values.size(); i++) {
   117             if (i > 0)
   143             if (i > 0)
   118                 writeString(QLatin1String(","));
   144                 writeString(QLatin1String(","));
   119             QString value = values.at(i);
   145             QString value = values.at(i);
   120 
   146 
   121             VersitUtils::backSlashEscape(value);
   147             backSlashEscape(value);
   122             writeString(value);
   148             writeString(value);
   123         }
   149         }
   124     }
   150     }
   125 }
   151 }
       
   152 
       
   153 
       
   154 /*!
       
   155  * Performs backslash escaping for line breaks (CRLFs), semicolons, backslashes and commas according
       
   156  * to RFC 2426.  This is called on parameter names and values and property values.
       
   157  * Colons ARE NOT escaped because the examples in RFC2426 suggest that they shouldn't be.
       
   158  */
       
   159 void QVCard30Writer::backSlashEscape(QString& text)
       
   160 {
       
   161     /* replaces ; with \;
       
   162                 , with \,
       
   163                 \ with \\
       
   164      */
       
   165     text.replace(QRegExp(QLatin1String("([;,\\\\])")), QLatin1String("\\\\1"));
       
   166     // replaces any CRLFs with \n
       
   167     text.replace(QRegExp(QLatin1String("\r\n|\r|\n")), QLatin1String("\\n"));
       
   168 }