/*! Returns the hash value for \a key. */ uint qHash(const QVersitDocument &key) { int hash = QT_PREPEND_NAMESPACE(qHash)(key.type()); hash += QT_PREPEND_NAMESPACE(qHash)(key.componentType()); hash += key.properties().length() + key.subDocuments().length(); foreach (const QVersitProperty& property, key.properties()) { hash += qHash(property); } foreach (const QVersitDocument& nested, key.subDocuments()) { hash += qHash(nested); } return hash; }
/*! * Converts \a document into a corresponding list of QOrganizerItems. After calling this, the * converted organizer items can be retrieved by calling items(). * * Returns true on success. The document should contain at least one subdocument. In the * importing process, each subdocument roughly corresponds to a QOrganizerItem. If any of the * subdocuments cannot be imported as organizer items (eg. they don't conform to the iCalendar * format), false is returned and errorMap() will return a list describing the errors that occurred. * The successfully imported items will still be available via items(). * * \sa items(), errorMap() */ bool QVersitOrganizerImporter::importDocument(const QVersitDocument& document) { d->mItems.clear(); d->mErrors.clear(); bool ok = true; if (document.type() != QVersitDocument::ICalendar20Type || document.componentType() != QLatin1String("VCALENDAR")) { d->mErrors.insert(-1, QVersitOrganizerImporter::InvalidDocumentError); return false; } const QList<QVersitDocument> subDocuments = document.subDocuments(); if (subDocuments.isEmpty()) { d->mErrors.insert(-1, QVersitOrganizerImporter::EmptyDocumentError); return false; } int documentIndex = 0; foreach (const QVersitDocument& subDocument, subDocuments) { QOrganizerItem item; QVersitOrganizerImporter::Error error; if (d->importDocument(document, subDocument, &item, &error)) { d->mItems.append(item); } else { // importDocument can return false with no error if it's a non-document component if (error != QVersitOrganizerImporter::NoError) { d->mErrors.insert(documentIndex, error); ok = false; } } documentIndex++; }
QDebug operator<<(QDebug dbg, const QVersitDocument& document) { dbg.nospace() << "QVersitDocument(" << document.type() << ", " << document.componentType() << ')'; foreach (const QVersitProperty& property, document.properties()) { dbg.space() << '\n' << property; } foreach (const QVersitDocument& nested, document.subDocuments()) { dbg.space() << '\n' << nested; } return dbg.maybeSpace(); }
/*! * Encodes the \a document and writes it to the device. A "VERSION:" line is added iff \a * encodeVersion is true. */ bool QVersitDocumentWriter::encodeVersitDocument(const QVersitDocument& document, bool encodeVersion) { mSuccessful = true; if (document.componentType().isEmpty()) { // for compatibility with code for Qt Mobility 1.0, which didn't have componentType writeString(QStringLiteral("BEGIN:VCARD")); } else { writeString(QStringLiteral("BEGIN:") + document.componentType()); } writeCrlf(); if (encodeVersion) { switch (mType) { case QVersitDocument::VCard21Type: writeString(QStringLiteral("VERSION:2.1")); writeCrlf(); break; case QVersitDocument::VCard30Type: writeString(QStringLiteral("VERSION:3.0")); writeCrlf(); break; case QVersitDocument::VCard40Type: writeString(QStringLiteral("VERSION:4.0")); writeCrlf(); break; case QVersitDocument::ICalendar20Type: writeString(QStringLiteral("VERSION:2.0")); writeCrlf(); break; default: ; // don't print version } } foreach (const QVersitProperty& property, document.properties()) { encodeVersitProperty(property); } foreach (const QVersitDocument& document, document.subDocuments()) { encodeVersitDocument(document, false); } if (document.componentType().isEmpty()) { writeString(QStringLiteral("END:VCARD")); } else { writeString(QStringLiteral("END:") + document.componentType()); } writeCrlf(); // This has been set by the methods called from this function return mSuccessful; }
} void tst_QVersitOrganizerExporter::testExportEventDetails() { QFETCH(QList<QOrganizerItemDetail>, details); QFETCH(QList<QVersitProperty>, expectedProperties); QVersitOrganizerExporter exporter; QOrganizerEvent item; foreach (QOrganizerItemDetail detail, details) { item.saveDetail(&detail); } QVERIFY(exporter.exportItems(QList<QOrganizerItem>() << item)); QVERIFY(exporter.errorMap().isEmpty()); QVersitDocument document = exporter.document(); QList<QVersitDocument> subDocuments = document.subDocuments(); QCOMPARE(subDocuments.size(), 1); foreach(const QVersitProperty& expectedProperty, expectedProperties) { QList<QVersitProperty> actualProperties = findPropertiesByName(subDocuments.first(), expectedProperty.name()); if (!actualProperties.contains(expectedProperty)) { qDebug() << "Actual:" << actualProperties; qDebug() << "Expected to find:" << expectedProperty; QVERIFY(false); } } } void tst_QVersitOrganizerExporter::testExportEventDetails_data() {