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 } |