/*! * 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(); }
/*! 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; }
/*! * Generates a QContact from \a versitDocument. */ bool QVersitContactImporterPrivate::importContact( const QVersitDocument& document, int contactIndex, QContact* contact, QVersitContactImporter::Error* error) { if (document.componentType() != QStringLiteral("VCARD") && document.type() != QVersitDocument::VCard21Type && document.type() != QVersitDocument::VCard30Type) { *error = QVersitContactImporter::InvalidDocumentError; return false; } const QList<QVersitProperty> properties = document.properties(); if (properties.size() == 0) { *error = QVersitContactImporter::EmptyDocumentError; return false; } // First, do the properties with PREF set so they appear first in the contact details foreach (const QVersitProperty& property, properties) { QStringList typeParameters = property.parameters().values(QStringLiteral("TYPE")); if (typeParameters.contains(QStringLiteral("PREF"), Qt::CaseInsensitive)) importProperty(document, property, contactIndex, contact); }