summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKevin Wu Won <kevin.wu-won@nokia.com>2010-06-09 18:00:37 +1000
committerKevin Wu Won <kevin.wu-won@nokia.com>2010-06-09 18:00:37 +1000
commitd88cfc1f35eb143b78d12356db1a8564e22fdb7e (patch)
tree3a87a35e5099094309636b121d7a73dda9079ee2
parent89b7b1b3a11298edb7fd7353c8b96e3b05f6d164 (diff)
Implmented import/export of QOrganizerItemTodoProgress details
-rw-r--r--src/versit/qversitorganizerexporter_p.cpp51
-rw-r--r--src/versit/qversitorganizerexporter_p.h6
-rw-r--r--src/versit/qversitorganizerimporter_p.cpp56
-rw-r--r--src/versit/qversitorganizerimporter_p.h13
-rw-r--r--tests/auto/qversitorganizerexporter/tst_qversitorganizerexporter.cpp78
-rw-r--r--tests/auto/qversitorganizerexporter/tst_qversitorganizerexporter.h3
-rw-r--r--tests/auto/qversitorganizerimporter/tst_qversitorganizerimporter.cpp81
-rw-r--r--tests/auto/qversitorganizerimporter/tst_qversitorganizerimporter.h3
8 files changed, 291 insertions, 0 deletions
diff --git a/src/versit/qversitorganizerexporter_p.cpp b/src/versit/qversitorganizerexporter_p.cpp
index 0fa7769546..026db3fd13 100644
--- a/src/versit/qversitorganizerexporter_p.cpp
+++ b/src/versit/qversitorganizerexporter_p.cpp
@@ -122,6 +122,8 @@ void QVersitOrganizerExporterPrivate::exportDetail(
encodePriority(detail, *document, &removedProperties, &generatedProperties, &processedFields);
} else if (detail.definitionName() == QOrganizerItemInstanceOrigin::DefinitionName) {
encodeInstanceOrigin(detail, *document, &removedProperties, &generatedProperties, &processedFields);
+ } else if (detail.definitionName() == QOrganizerItemTodoProgress::DefinitionName) {
+ encodeTodoProgress(detail, *document, &removedProperties, &generatedProperties, &processedFields);
} else if (mPropertyMappings.contains(detail.definitionName())) {
encodeSimpleProperty(detail, *document, &removedProperties, &generatedProperties, &processedFields);
}
@@ -413,6 +415,55 @@ void QVersitOrganizerExporterPrivate::encodeInstanceOrigin(
*processedFields << QOrganizerItemInstanceOrigin::FieldOriginalDate;
}
+void QVersitOrganizerExporterPrivate::encodeTodoProgress(
+ const QOrganizerItemDetail& detail,
+ const QVersitDocument& document,
+ QList<QVersitProperty>* removedProperties,
+ QList<QVersitProperty>* generatedProperties,
+ QSet<QString>* processedFields)
+{
+ QOrganizerItemTodoProgress todoProgress = static_cast<QOrganizerItemTodoProgress>(detail);
+
+ if (todoProgress.finishedDateTime().isValid()) {
+ QVersitProperty property =
+ VersitUtils::takeProperty(document, QLatin1String("COMPLETED"), removedProperties);
+ property.setName(QLatin1String("COMPLETED"));
+ property.setValue(todoProgress.finishedDateTime().toString(QLatin1String("yyyyMMddTHHmmss")));
+ *generatedProperties << property;
+ *processedFields << QOrganizerItemTodoProgress::FieldFinishedDateTime;
+ }
+
+ if (todoProgress.hasValue(QOrganizerItemTodoProgress::FieldPercentageComplete)) {
+ QVersitProperty property =
+ VersitUtils::takeProperty(document, QLatin1String("PERCENT-COMPLETE"), removedProperties);
+ property.setName(QLatin1String("PERCENT-COMPLETE"));
+ property.setValue(QString::number(todoProgress.percentageComplete()));
+ *generatedProperties << property;
+ *processedFields << QOrganizerItemTodoProgress::FieldPercentageComplete;
+ }
+
+ if (todoProgress.hasValue(QOrganizerItemTodoProgress::FieldStatus)) {
+ QVersitProperty property =
+ VersitUtils::takeProperty(document, QLatin1String("STATUS"), removedProperties);
+ property.setName(QLatin1String("STATUS"));
+ switch (todoProgress.status()) {
+ case QOrganizerItemTodoProgress::StatusNotStarted:
+ property.setValue(QLatin1String("NEEDS-ACTION"));
+ break;
+ case QOrganizerItemTodoProgress::StatusInProgress:
+ property.setValue(QLatin1String("IN-PROCESS"));
+ break;
+ case QOrganizerItemTodoProgress::StatusComplete:
+ property.setValue(QLatin1String("COMPLETED"));
+ break;
+ default:
+ return;
+ }
+ *generatedProperties << property;
+ *processedFields << QOrganizerItemTodoProgress::FieldStatus;
+ }
+}
+
void QVersitOrganizerExporterPrivate::encodeSimpleProperty(
const QOrganizerItemDetail& detail,
const QVersitDocument& document,
diff --git a/src/versit/qversitorganizerexporter_p.h b/src/versit/qversitorganizerexporter_p.h
index 3d60ddea96..0be5b9b6a0 100644
--- a/src/versit/qversitorganizerexporter_p.h
+++ b/src/versit/qversitorganizerexporter_p.h
@@ -118,6 +118,12 @@ private:
QList<QVersitProperty>* removedProperties,
QList<QVersitProperty>* generatedProperties,
QSet<QString>* processedFields);
+ void encodeTodoProgress(
+ const QOrganizerItemDetail& detail,
+ const QVersitDocument& document,
+ QList<QVersitProperty>* removedProperties,
+ QList<QVersitProperty>* generatedProperties,
+ QSet<QString>* processedFields);
void encodeSimpleProperty(
const QOrganizerItemDetail& detail,
const QVersitDocument& document,
diff --git a/src/versit/qversitorganizerimporter_p.cpp b/src/versit/qversitorganizerimporter_p.cpp
index e71b492ae6..3bc6f76fe6 100644
--- a/src/versit/qversitorganizerimporter_p.cpp
+++ b/src/versit/qversitorganizerimporter_p.cpp
@@ -139,6 +139,12 @@ void QVersitOrganizerImporterPrivate::importProperty(
} else if (property.name() == QLatin1String("RDATE")
|| (property.name() == QLatin1String("EXDATE"))) {
success = createRecurrenceDates(property, item, &updatedDetails);
+ } else if (property.name() == QLatin1String("STATUS")) {
+ success = createStatus(property, item, &updatedDetails);
+ } else if (property.name() == QLatin1String("PERCENT-COMPLETE")) {
+ success = createPercentageComplete(property, item, &updatedDetails);
+ } else if (property.name() == QLatin1String("COMPLETED")) {
+ success = createFinishedDateTime(property, item, &updatedDetails);
}
}
@@ -592,6 +598,56 @@ QDate QVersitOrganizerImporterPrivate::parseDate(QString str)
return QDate::fromString(str, QLatin1String("yyyyMMdd"));
}
+bool QVersitOrganizerImporterPrivate::createStatus(
+ const QVersitProperty& property,
+ QOrganizerItem* item,
+ QList<QOrganizerItemDetail>* updatedDetails) {
+ QOrganizerItemTodoProgress::Status status;
+ if (property.value() == QLatin1String("COMPLETED"))
+ status = QOrganizerItemTodoProgress::StatusComplete;
+ else if (property.value() == QLatin1String("NEEDS-ACTION"))
+ status = QOrganizerItemTodoProgress::StatusNotStarted;
+ else if (property.value() == QLatin1String("IN-PROCESS"))
+ status = QOrganizerItemTodoProgress::StatusInProgress;
+ else
+ return false;
+
+ QOrganizerItemTodoProgress progress(item->detail<QOrganizerItemTodoProgress>());
+ progress.setStatus(status);
+ updatedDetails->append(progress);
+ return true;
+}
+
+bool QVersitOrganizerImporterPrivate::createPercentageComplete(
+ const QVersitProperty& property,
+ QOrganizerItem* item,
+ QList<QOrganizerItemDetail>* updatedDetails) {
+ bool ok = false;
+ int percent = property.value().toInt(&ok);
+ if (!ok)
+ return false;
+
+ QOrganizerItemTodoProgress progress(item->detail<QOrganizerItemTodoProgress>());
+ progress.setPercentageComplete(percent);
+ updatedDetails->append(progress);
+ return true;
+}
+
+bool QVersitOrganizerImporterPrivate::createFinishedDateTime(
+ const QVersitProperty& property,
+ QOrganizerItem* item,
+ QList<QOrganizerItemDetail>* updatedDetails) {
+ if (property.value().isEmpty())
+ return false;
+ QDateTime datetime = parseDateTime(property.value());
+ if (!datetime.isValid())
+ return false;
+ QOrganizerItemTodoProgress progress(item->detail<QOrganizerItemTodoProgress>());
+ progress.setFinishedDateTime(datetime);
+ updatedDetails->append(progress);
+ return true;
+}
+
/*! Parse the iCalendar duration string \a str in an RDP fashion with a two symbol lookahead, and
* returns a Duration that represents it. */
Duration Duration::parseDuration(QString str)
diff --git a/src/versit/qversitorganizerimporter_p.h b/src/versit/qversitorganizerimporter_p.h
index 430aae04cd..4f9732941a 100644
--- a/src/versit/qversitorganizerimporter_p.h
+++ b/src/versit/qversitorganizerimporter_p.h
@@ -179,6 +179,19 @@ private:
bool parseDateList(const QString& str, QList<QDate>* dates);
QDate parseDate(QString str);
+ bool createStatus(
+ const QVersitProperty& property,
+ QOrganizerItem* item,
+ QList<QOrganizerItemDetail>* updatedDetails);
+ bool createPercentageComplete(
+ const QVersitProperty& property,
+ QOrganizerItem* item,
+ QList<QOrganizerItemDetail>* updatedDetails);
+ bool createFinishedDateTime(
+ const QVersitProperty& property,
+ QOrganizerItem* item,
+ QList<QOrganizerItemDetail>* updatedDetails);
+
// versit property name -> <definition name, field name>:
QMap<QString, QPair<QString, QString> > mPropertyMappings;
};
diff --git a/tests/auto/qversitorganizerexporter/tst_qversitorganizerexporter.cpp b/tests/auto/qversitorganizerexporter/tst_qversitorganizerexporter.cpp
index ff97d491af..49fbcf6e8b 100644
--- a/tests/auto/qversitorganizerexporter/tst_qversitorganizerexporter.cpp
+++ b/tests/auto/qversitorganizerexporter/tst_qversitorganizerexporter.cpp
@@ -557,6 +557,84 @@ void tst_QVersitOrganizerExporter::testExportEventDetails_data()
}
}
+void tst_QVersitOrganizerExporter::testExportTodoDetails()
+{
+ QFETCH(QList<QOrganizerItemDetail>, details);
+ QFETCH(QList<QVersitProperty>, expectedProperties);
+
+ QVersitOrganizerExporter exporter;
+ QOrganizerTodo item;
+ foreach (QOrganizerItemDetail detail, details) {
+ item.saveDetail(&detail);
+ }
+ QVERIFY(exporter.exportItems(QList<QOrganizerItem>() << item, QVersitDocument::ICalendar20Type));
+ QVERIFY(exporter.errors().isEmpty());
+ QVersitDocument document = exporter.document();
+ QList<QVersitDocument> subDocuments = document.subDocuments();
+ QCOMPARE(subDocuments.size(), 1);
+
+ foreach(const QVersitProperty& expectedProperty, expectedProperties) {
+ QVersitProperty actualProperty = findPropertyByName(subDocuments.first(), expectedProperty.name());
+ if (actualProperty != expectedProperty) {
+ qDebug() << "Actual:" << actualProperty;
+ qDebug() << "Expected:" << expectedProperty;
+ QCOMPARE(actualProperty, expectedProperty);
+ }
+ }
+}
+
+void tst_QVersitOrganizerExporter::testExportTodoDetails_data()
+{
+ QTest::addColumn<QList<QOrganizerItemDetail> >("details");
+ QTest::addColumn<QList<QVersitProperty> >("expectedProperties");
+
+ {
+ QVersitProperty property;
+ property.setName(QLatin1String("STATUS"));
+ property.setValue(QLatin1String("COMPLETED"));
+ QOrganizerItemTodoProgress progress;
+ progress.setStatus(QOrganizerItemTodoProgress::StatusComplete);
+ QTest::newRow("status completed")
+ << (QList<QOrganizerItemDetail>() << progress)
+ << (QList<QVersitProperty>() << property);
+
+ property.setValue(QLatin1String("NEEDS-ACTION"));
+ progress.setStatus(QOrganizerItemTodoProgress::StatusNotStarted);
+ QTest::newRow("status needs-action")
+ << (QList<QOrganizerItemDetail>() << progress)
+ << (QList<QVersitProperty>() << property);
+
+ property.setValue(QLatin1String("IN-PROCESS"));
+ progress.setStatus(QOrganizerItemTodoProgress::StatusInProgress);
+ QTest::newRow("status in-process")
+ << (QList<QOrganizerItemDetail>() << progress)
+ << (QList<QVersitProperty>() << property);
+ }
+
+ {
+ QVersitProperty property;
+ property.setName(QLatin1String("PERCENT-COMPLETE"));
+ property.setValue(QLatin1String("42"));
+ QOrganizerItemTodoProgress progress;
+ progress.setPercentageComplete(42);
+ QTest::newRow("percent-complete")
+ << (QList<QOrganizerItemDetail>() << progress)
+ << (QList<QVersitProperty>() << property);
+ }
+
+ {
+ QVersitProperty property;
+ property.setName(QLatin1String("COMPLETED"));
+ property.setValue(QLatin1String("20100609T161500"));
+ QOrganizerItemTodoProgress progress;
+ progress.setFinishedDateTime(QDateTime(QDate(2010, 6, 9), QTime(16, 15, 0)));
+ QTest::newRow("completed")
+ << (QList<QOrganizerItemDetail>() << progress)
+ << (QList<QVersitProperty>() << property);
+ }
+}
+
+
QVersitProperty tst_QVersitOrganizerExporter::findPropertyByName(
const QVersitDocument &document, const QString &propertyName)
{
diff --git a/tests/auto/qversitorganizerexporter/tst_qversitorganizerexporter.h b/tests/auto/qversitorganizerexporter/tst_qversitorganizerexporter.h
index 3f4ebd4511..a075767318 100644
--- a/tests/auto/qversitorganizerexporter/tst_qversitorganizerexporter.h
+++ b/tests/auto/qversitorganizerexporter/tst_qversitorganizerexporter.h
@@ -67,6 +67,9 @@ private slots:
void testExportEventDetails();
void testExportEventDetails_data();
+ void testExportTodoDetails();
+ void testExportTodoDetails_data();
+
static QVersitProperty findPropertyByName(const QVersitDocument &document, const QString &propertyName);
};
diff --git a/tests/auto/qversitorganizerimporter/tst_qversitorganizerimporter.cpp b/tests/auto/qversitorganizerimporter/tst_qversitorganizerimporter.cpp
index c5ef2ebe2b..e9337d329a 100644
--- a/tests/auto/qversitorganizerimporter/tst_qversitorganizerimporter.cpp
+++ b/tests/auto/qversitorganizerimporter/tst_qversitorganizerimporter.cpp
@@ -638,4 +638,85 @@ void tst_QVersitOrganizerImporter::testImportEventProperties_data()
}
}
+void tst_QVersitOrganizerImporter::testImportTodoProperties()
+{
+ QFETCH(QList<QVersitProperty>, properties);
+ QFETCH(QList<QOrganizerItemDetail>, expectedDetails);
+
+ QVersitDocument document(QVersitDocument::ICalendar20Type);
+ document.setComponentType(QLatin1String("VCALENDAR"));
+ QVersitDocument nested(QVersitDocument::ICalendar20Type);
+ nested.setComponentType(QLatin1String("VTODO"));
+ foreach (const QVersitProperty& property, properties) {
+ nested.addProperty(property);
+ }
+ document.addSubDocument(nested);
+
+ QVersitOrganizerImporter importer;
+ QVERIFY(importer.importDocument(document));
+ QVERIFY(importer.errors().isEmpty());
+ QList<QOrganizerItem> items = importer.items();
+ QCOMPARE(items.size(), 1);
+
+ foreach (const QOrganizerItemDetail& expectedDetail, expectedDetails) {
+ QOrganizerItemDetail actualDetail = items.first().detail(expectedDetail.definitionName());
+ if (actualDetail != expectedDetail) {
+ qDebug() << "Actual:" << actualDetail;
+ qDebug() << "Expected:" << expectedDetail;
+ QCOMPARE(actualDetail, expectedDetail);
+ }
+ }
+}
+
+void tst_QVersitOrganizerImporter::testImportTodoProperties_data()
+{
+ QTest::addColumn<QList<QVersitProperty> >("properties");
+ QTest::addColumn<QList<QOrganizerItemDetail> >("expectedDetails");
+
+ {
+ QVersitProperty property;
+ property.setName(QLatin1String("STATUS"));
+ property.setValue(QLatin1String("COMPLETED"));
+ QOrganizerItemTodoProgress progress;
+ progress.setStatus(QOrganizerItemTodoProgress::StatusComplete);
+ QTest::newRow("status completed")
+ << (QList<QVersitProperty>() << property)
+ << (QList<QOrganizerItemDetail>() << progress);
+
+ property.setValue(QLatin1String("NEEDS-ACTION"));
+ progress.setStatus(QOrganizerItemTodoProgress::StatusNotStarted);
+ QTest::newRow("status needs-action")
+ << (QList<QVersitProperty>() << property)
+ << (QList<QOrganizerItemDetail>() << progress);
+
+ property.setValue(QLatin1String("IN-PROCESS"));
+ progress.setStatus(QOrganizerItemTodoProgress::StatusInProgress);
+ QTest::newRow("status in-process")
+ << (QList<QVersitProperty>() << property)
+ << (QList<QOrganizerItemDetail>() << progress);
+ }
+
+ {
+ QVersitProperty property;
+ property.setName(QLatin1String("PERCENT-COMPLETE"));
+ property.setValue(QLatin1String("42"));
+ QOrganizerItemTodoProgress progress;
+ progress.setPercentageComplete(42);
+ QTest::newRow("percent-complete")
+ << (QList<QVersitProperty>() << property)
+ << (QList<QOrganizerItemDetail>() << progress);
+ }
+
+ {
+ QVersitProperty property;
+ property.setName(QLatin1String("COMPLETED"));
+ property.setValue(QLatin1String("20100609T161500"));
+ QOrganizerItemTodoProgress progress;
+ progress.setFinishedDateTime(QDateTime(QDate(2010, 6, 9), QTime(16, 15, 0)));
+ QTest::newRow("completed")
+ << (QList<QVersitProperty>() << property)
+ << (QList<QOrganizerItemDetail>() << progress);
+ }
+}
+
QTEST_MAIN(tst_QVersitOrganizerImporter)
diff --git a/tests/auto/qversitorganizerimporter/tst_qversitorganizerimporter.h b/tests/auto/qversitorganizerimporter/tst_qversitorganizerimporter.h
index f0dd76b3fe..f7096c9d8e 100644
--- a/tests/auto/qversitorganizerimporter/tst_qversitorganizerimporter.h
+++ b/tests/auto/qversitorganizerimporter/tst_qversitorganizerimporter.h
@@ -61,6 +61,9 @@ private slots:
void testImportEventProperties();
void testImportEventProperties_data();
+
+ void testImportTodoProperties();
+ void testImportTodoProperties_data();
};
#endif