Hello community, here is the log from the commit of package kdepimlibs4 for openSUSE:Factory checked in at 2014-11-19 20:24:19 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/kdepimlibs4 (Old) and /work/SRC/openSUSE:Factory/.kdepimlibs4.new (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "kdepimlibs4" Changes: -------- --- /work/SRC/openSUSE:Factory/kdepimlibs4/kdepimlibs4.changes 2014-10-16 18:11:27.000000000 +0200 +++ /work/SRC/openSUSE:Factory/.kdepimlibs4.new/kdepimlibs4.changes 2014-11-19 20:26:59.000000000 +0100 @@ -1,0 +2,12 @@ +Mon Nov 10 02:26:00 UTC 2014 - Led <[email protected]> + +- fix bashisms in post/postun scripts + +------------------------------------------------------------------- +Sun Nov 9 20:24:11 UTC 2014 - [email protected] + +- Update to 4.14.3 + * KDE 4.14.3 SC Bugfix Release + * See http://www.kde.org/announcements/announce-4.14.3.php + +------------------------------------------------------------------- Old: ---- kdepimlibs-4.14.2.tar.xz New: ---- kdepimlibs-4.14.3.tar.xz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ kdepimlibs4.spec ++++++ --- /var/tmp/diff_new_pack.1PXozm/_old 2014-11-19 20:27:01.000000000 +0100 +++ /var/tmp/diff_new_pack.1PXozm/_new 2014-11-19 20:27:01.000000000 +0100 @@ -17,7 +17,7 @@ Name: kdepimlibs4 -Version: 4.14.2 +Version: 4.14.3 Release: 0 Summary: KDE PIM Libraries License: LGPL-2.1+ @@ -76,11 +76,11 @@ %post /sbin/ldconfig -%{_kde4_bindir}/update-mime-database %{_datadir}/mime &> /dev/null || : +%{_kde4_bindir}/update-mime-database %{_datadir}/mime > /dev/null 2>&1 || : %postun /sbin/ldconfig -%{_kde4_bindir}/update-mime-database %{_datadir}/mime &> /dev/null || : +%{_kde4_bindir}/update-mime-database %{_datadir}/mime > /dev/null 2>&1 || : %package -n libkdepimlibs4 Summary: KDE PIM Libraries ++++++ kdepimlibs-4.14.2.tar.xz -> kdepimlibs-4.14.3.tar.xz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kdepimlibs-4.14.2/CMakeLists.txt new/kdepimlibs-4.14.3/CMakeLists.txt --- old/kdepimlibs-4.14.2/CMakeLists.txt 2014-10-09 22:09:43.000000000 +0200 +++ new/kdepimlibs-4.14.3/CMakeLists.txt 2014-11-04 22:19:27.000000000 +0100 @@ -7,7 +7,7 @@ ############### The kdepimlibs version (used e.g. in KdepimLibsConfig.cmake) ############### set(KDEPIMLIBS_VERSION_MAJOR 4) set(KDEPIMLIBS_VERSION_MINOR 14) -set(KDEPIMLIBS_VERSION_PATCH 2) +set(KDEPIMLIBS_VERSION_PATCH 3) set(KDEPIMLIBS_VERSION ${KDEPIMLIBS_VERSION_MAJOR}.${KDEPIMLIBS_VERSION_MINOR}.${KDEPIMLIBS_VERSION_PATCH}) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kdepimlibs-4.14.2/akonadi/collection.cpp new/kdepimlibs-4.14.3/akonadi/collection.cpp --- old/kdepimlibs-4.14.2/akonadi/collection.cpp 2014-10-09 22:09:43.000000000 +0200 +++ new/kdepimlibs-4.14.3/akonadi/collection.cpp 2014-11-04 22:19:27.000000000 +0100 @@ -274,9 +274,7 @@ { Q_D(Collection); - if (enabled != d->enabled) { - d->enabledChanged = true; - } + d->enabledChanged = true; d->enabled = enabled; } @@ -341,9 +339,7 @@ { Q_D(Collection); - if (d->referenced != referenced) { - d->referencedChanged = true; - } + d->referencedChanged = true; d->referenced = referenced; } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kdepimlibs-4.14.2/akonadi/collectiondialog.h new/kdepimlibs-4.14.3/akonadi/collectiondialog.h --- old/kdepimlibs-4.14.2/akonadi/collectiondialog.h 2014-10-09 22:09:43.000000000 +0200 +++ new/kdepimlibs-4.14.3/akonadi/collectiondialog.h 2014-11-04 22:19:27.000000000 +0100 @@ -212,6 +212,7 @@ Q_PRIVATE_SLOT(d, void slotAddChildCollection()) Q_PRIVATE_SLOT(d, void slotCollectionCreationResult(KJob *job)) Q_PRIVATE_SLOT(d, void slotFilterFixedString(const QString &)) + Q_PRIVATE_SLOT(d, void slotDoubleClicked()) //@endcond }; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kdepimlibs-4.14.2/akonadi/collectiondialog_desktop.cpp new/kdepimlibs-4.14.3/akonadi/collectiondialog_desktop.cpp --- old/kdepimlibs-4.14.2/akonadi/collectiondialog_desktop.cpp 2014-10-09 22:09:43.000000000 +0200 +++ new/kdepimlibs-4.14.3/akonadi/collectiondialog_desktop.cpp 2014-11-04 22:19:27.000000000 +0100 @@ -113,7 +113,7 @@ mParent, SLOT(slotSelectionChanged())); mParent->connect(mView, SIGNAL(doubleClicked(QModelIndex)), - mParent, SLOT(accept())); + mParent, SLOT(slotDoubleClicked())); mSelectionHandler = new AsyncSelectionHandler(mFilterCollection, mParent); mParent->connect(mSelectionHandler, SIGNAL(collectionAvailable(QModelIndex)), @@ -171,14 +171,35 @@ KRecursiveFilterProxyModel *mFilterCollection; QCheckBox *mUseByDefault; + void slotDoubleClicked(); void slotSelectionChanged(); void slotAddChildCollection(); void slotCollectionCreationResult(KJob *job); bool canCreateCollection(const Akonadi::Collection &parentCollection) const; void changeCollectionDialogOptions(CollectionDialogOptions options); - + bool canSelectCollection() const; }; +void CollectionDialog::Private::slotDoubleClicked() +{ + if (canSelectCollection()) { + mParent->accept(); + } +} + +bool CollectionDialog::Private::canSelectCollection() const +{ + bool result = (mView->selectionModel()->selectedIndexes().count() > 0); + if (mAllowToCreateNewChildCollection) { + const Akonadi::Collection parentCollection = mParent->selectedCollection(); + + if (parentCollection.isValid()) { + result = (parentCollection.rights() & Akonadi::Collection::CanCreateItem); + } + } + return result; +} + void CollectionDialog::Private::slotSelectionChanged() { mParent->enableButton(KDialog::Ok, mView->selectionModel()->selectedIndexes().count() > 0); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kdepimlibs-4.14.2/akonadi/collectiondialog_mobile.cpp new/kdepimlibs-4.14.3/akonadi/collectiondialog_mobile.cpp --- old/kdepimlibs-4.14.2/akonadi/collectiondialog_mobile.cpp 2014-10-09 22:09:43.000000000 +0200 +++ new/kdepimlibs-4.14.3/akonadi/collectiondialog_mobile.cpp 2014-11-04 22:19:27.000000000 +0100 @@ -124,6 +124,10 @@ { } +void CollectionDialog::Private::slotDoubleClicked() +{ +} + void CollectionDialog::Private::slotCollectionAvailable(const QModelIndex &index) { mSelectionModel->setCurrentIndex(index, QItemSelectionModel::ClearAndSelect); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kdepimlibs-4.14.2/akonadi/contact/editor/im/kaddressbookimprotocol.desktop new/kdepimlibs-4.14.3/akonadi/contact/editor/im/kaddressbookimprotocol.desktop --- old/kdepimlibs-4.14.2/akonadi/contact/editor/im/kaddressbookimprotocol.desktop 2014-10-09 22:09:43.000000000 +0200 +++ new/kdepimlibs-4.14.3/akonadi/contact/editor/im/kaddressbookimprotocol.desktop 2014-11-04 22:19:27.000000000 +0100 @@ -6,7 +6,7 @@ Name[bs]=Protokol brzih poruka K adresara Name[ca]=Protocol de missatgeria instantània del KAddressbook Name[ca@valencia]=Protocol de missatgeria instantània del KAddressbook -Name[cs]=KAddressbook instant messaging protokol +Name[cs]=KAddressbook pro IM protokol Name[da]=KAddressbook instant messaging-protokol Name[de]=Instant-Messaging-Protokoll im KDE-Adressbuch Name[el]=Πρωτόκολλο στιγμιαίων μηνυμάτων KAddressbook diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kdepimlibs-4.14.2/akonadi/entitytreemodel.cpp new/kdepimlibs-4.14.3/akonadi/entitytreemodel.cpp --- old/kdepimlibs-4.14.2/akonadi/entitytreemodel.cpp 2014-10-09 22:09:43.000000000 +0200 +++ new/kdepimlibs-4.14.3/akonadi/entitytreemodel.cpp 2014-11-04 22:19:27.000000000 +0100 @@ -314,7 +314,7 @@ return d->m_pendingCollectionRetrieveJobs.contains(collection.id()) ? FetchingState : IdleState; } case CollectionSyncProgressRole: { - return d->m_collectionSyncProgress.value(collection.id()); + return QVariant(); // no longer supported } case IsPopulatedRole: { return d->m_populatedCols.contains(collection.id()); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kdepimlibs-4.14.2/akonadi/entitytreemodel.h new/kdepimlibs-4.14.3/akonadi/entitytreemodel.h --- old/kdepimlibs-4.14.2/akonadi/entitytreemodel.h 2014-10-09 22:09:43.000000000 +0200 +++ new/kdepimlibs-4.14.3/akonadi/entitytreemodel.h 2014-11-04 22:19:27.000000000 +0100 @@ -349,7 +349,7 @@ EntityUrlRole, ///< The akonadi:/ Url of the entity as a string. Item urls will contain the mimetype. UnreadCountRole, ///< Returns the number of unread items in a collection. @since 4.5 FetchStateRole, ///< Returns the FetchState of a particular item. @since 4.5 - CollectionSyncProgressRole, ///< Returns the progress of synchronization in percent for a particular collection. @since 4.6 + CollectionSyncProgressRole, ///< Returns the progress of synchronization in percent for a particular collection. @since 4.6. Deprecated since 4.14.3. IsPopulatedRole, ///< Returns whether a Collection has been populated, i.e. whether its items have been fetched. @since 4.10 UserRole = Qt::UserRole + 500, ///< First role for user extensions. TerminalUserRole = 2000, ///< Last role for user extensions. Don't use a role beyond this or headerData will break. @@ -754,7 +754,6 @@ Q_PRIVATE_SLOT(d_func(), void monitoredItemUnlinked(const Akonadi::Item &, const Akonadi::Collection &)) Q_PRIVATE_SLOT(d_func(), void changeFetchState(const Akonadi::Collection &)) - Q_PRIVATE_SLOT(d_func(), void agentInstanceAdvancedStatusChanged(const QString &, const QVariantMap &)) Q_PRIVATE_SLOT(d_func(), void agentInstanceRemoved(Akonadi::AgentInstance)) Q_PRIVATE_SLOT(d_func(), void monitoredItemsRetrieved(KJob *job)) //@endcond diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kdepimlibs-4.14.2/akonadi/entitytreemodel_p.cpp new/kdepimlibs-4.14.3/akonadi/entitytreemodel_p.cpp --- old/kdepimlibs-4.14.2/akonadi/entitytreemodel_p.cpp 2014-10-09 22:09:43.000000000 +0200 +++ new/kdepimlibs-4.14.3/akonadi/entitytreemodel_p.cpp 2014-11-04 22:19:27.000000000 +0100 @@ -90,14 +90,6 @@ // using collection as a parameter of a queued call in runItemFetchJob() qRegisterMetaType<Collection>(); - org::freedesktop::Akonadi::AgentManager *manager = - new org::freedesktop::Akonadi::AgentManager(ServerManager::serviceName(Akonadi::ServerManager::Control), - QLatin1String("/AgentManager"), - DBusConnectionPool::threadConnection(), q_ptr); - - QObject::connect(manager, SIGNAL(agentInstanceAdvancedStatusChanged(QString,QVariantMap)), - q_ptr, SLOT(agentInstanceAdvancedStatusChanged(QString,QVariantMap))); - Akonadi::AgentManager *agentManager = Akonadi::AgentManager::self(); QObject::connect(agentManager, SIGNAL(instanceRemoved(Akonadi::AgentInstance)), q_ptr, SLOT(agentInstanceRemoved(Akonadi::AgentInstance))); @@ -221,31 +213,6 @@ } } -void EntityTreeModelPrivate::agentInstanceAdvancedStatusChanged(const QString &, const QVariantMap &status) -{ - const QString key = status.value(QLatin1String("key")).toString(); - if (key != QLatin1String("collectionSyncProgress")) { - return; - } - - const Collection::Id collectionId = status.value(QLatin1String("collectionId")).toLongLong(); - const uint percent = status.value(QLatin1String("percent")).toUInt(); - if (m_collectionSyncProgress.value(collectionId) == percent) { - return; - } - m_collectionSyncProgress.insert(collectionId, percent); - - const QModelIndex collectionIndex = indexForCollection(Collection(collectionId)); - if (!collectionIndex.isValid()) { - return; - } - - Q_Q(EntityTreeModel); - // This is really slow (80 levels of method calls in proxy models...), and called - // very often during an imap sync... - q->dataChanged(collectionIndex, collectionIndex); -} - void EntityTreeModelPrivate::fetchItems(const Collection &parent) { Q_Q(const EntityTreeModel); @@ -1911,9 +1878,9 @@ const QList<Collection> collections = m_monitor->collectionsMonitored(); if (collections.isEmpty() && - m_monitor->mimeTypesMonitored().isEmpty() && - m_monitor->resourcesMonitored().isEmpty() && - !m_monitor->itemsMonitoredEx().isEmpty()) { + m_monitor->numMimeTypesMonitored() == 0 && + m_monitor->numResourcesMonitored() == 0 && + m_monitor->numItemsMonitored() != 0) { m_rootCollection = Collection(-1); m_collectionTreeFetched = true; emit q_ptr->collectionTreeFetched(collections); // there are no collections to fetch diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kdepimlibs-4.14.2/akonadi/entitytreemodel_p.h new/kdepimlibs-4.14.3/akonadi/entitytreemodel_p.h --- old/kdepimlibs-4.14.2/akonadi/entitytreemodel_p.h 2014-10-09 22:09:43.000000000 +0200 +++ new/kdepimlibs-4.14.3/akonadi/entitytreemodel_p.h 2014-11-04 22:19:27.000000000 +0100 @@ -124,7 +124,6 @@ void fillModel(); void changeFetchState(const Collection &parent); - void agentInstanceAdvancedStatusChanged(const QString &, const QVariantMap &); void agentInstanceRemoved(const Akonadi::AgentInstance &instace); QHash<Collection::Id, Collection> m_collections; @@ -149,7 +148,6 @@ bool m_includeStatistics; bool m_showRootCollection; bool m_collectionTreeFetched; - QHash<Collection::Id, uint> m_collectionSyncProgress; /** * Called after the root collection was fetched by fillModel diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kdepimlibs-4.14.2/akonadi/favoritecollectionsmodel.cpp new/kdepimlibs-4.14.3/akonadi/favoritecollectionsmodel.cpp --- old/kdepimlibs-4.14.2/akonadi/favoritecollectionsmodel.cpp 2014-10-09 22:09:43.000000000 +0200 +++ new/kdepimlibs-4.14.3/akonadi/favoritecollectionsmodel.cpp 2014-11-04 22:19:27.000000000 +0100 @@ -87,7 +87,7 @@ } /** - * Stuff changed, reload everything. + * Stuff changed (e.g. new rows inserted into sorted model), reload everything. */ void reload() { @@ -143,7 +143,7 @@ void reference(const Collection::Id &collectionId) { if (referencedCollections.contains(collectionId)) { - kWarning() << "already referenced " << collectionId; + kWarning() << "already referenced" << collectionId; return; } const QModelIndex index = EntityTreeModel::modelIndexForCollection(q->sourceModel(), Collection(collectionId)); @@ -160,14 +160,14 @@ void dereference(const Collection::Id &collectionId) { if (!referencedCollections.contains(collectionId)) { - kWarning() << "not referenced " << collectionId; + kWarning() << "not referenced" << collectionId; return; } const QModelIndex index = EntityTreeModel::modelIndexForCollection(q->sourceModel(), Collection(collectionId)); if (index.isValid()) { q->sourceModel()->setData(index, QVariant(), EntityTreeModel::CollectionDerefRole); } - referencedCollections.remove(collectionId); + referencedCollections.remove(collectionId); } void clearReferences() diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kdepimlibs-4.14.2/akonadi/monitor.cpp new/kdepimlibs-4.14.3/akonadi/monitor.cpp --- old/kdepimlibs-4.14.2/akonadi/monitor.cpp 2014-10-09 22:09:43.000000000 +0200 +++ new/kdepimlibs-4.14.3/akonadi/monitor.cpp 2014-11-04 22:19:27.000000000 +0100 @@ -291,6 +291,12 @@ return result; } +int Monitor::numItemsMonitored() const +{ + Q_D(const Monitor); + return d->items.size(); +} + QVector<Tag::Id> Monitor::tagsMonitored() const { Q_D(const Monitor); @@ -315,12 +321,24 @@ return d->mimetypes.toList(); } +int Monitor::numMimeTypesMonitored() const +{ + Q_D(const Monitor); + return d->mimetypes.count(); +} + QList<QByteArray> Monitor::resourcesMonitored() const { Q_D(const Monitor); return d->resources.toList(); } +int Monitor::numResourcesMonitored() const +{ + Q_D(const Monitor); + return d->resources.count(); +} + bool Monitor::isAllMonitored() const { Q_D(const Monitor); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kdepimlibs-4.14.2/akonadi/monitor.h new/kdepimlibs-4.14.3/akonadi/monitor.h --- old/kdepimlibs-4.14.2/akonadi/monitor.h 2014-10-09 22:09:43.000000000 +0200 +++ new/kdepimlibs-4.14.3/akonadi/monitor.h 2014-11-04 22:19:27.000000000 +0100 @@ -337,6 +337,13 @@ QVector<Item::Id> itemsMonitoredEx() const; /** + * Returns the number of items being monitored. + * Optimization. + * @since 4.14.3 + */ + int numItemsMonitored() const; + + /** * Returns the set of mimetypes being monitored. * * @since 4.3 @@ -344,6 +351,13 @@ QStringList mimeTypesMonitored() const; /** + * Returns the number of mimetypes being monitored. + * Optimization. + * @since 4.14.3 + */ + int numMimeTypesMonitored() const; + + /** * Returns the set of tags being monitored. * * @since 4.13 @@ -365,6 +379,13 @@ QList<QByteArray> resourcesMonitored() const; /** + * Returns the number of resources being monitored. + * Optimization. + * @since 4.14.3 + */ + int numResourcesMonitored() const; + + /** * Returns true if everything is being monitored. * * @since 4.3 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kdepimlibs-4.14.2/akonadi/protocolhelper.cpp new/kdepimlibs-4.14.3/akonadi/protocolhelper.cpp --- old/kdepimlibs-4.14.2/akonadi/protocolhelper.cpp 2014-10-09 22:09:43.000000000 +0200 +++ new/kdepimlibs-4.14.3/akonadi/protocolhelper.cpp 2014-11-04 22:19:27.000000000 +0100 @@ -377,7 +377,7 @@ } if (collection == Collection::root()) { - if (requestedItems.isEmpty()) { // collection content listing + if (requestedItems.isEmpty() && !tag.isValid()) { // collection content listing throw Exception("Cannot perform item operations on root collection."); } } else { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kdepimlibs-4.14.2/akonadi/resourcebase.cpp new/kdepimlibs-4.14.3/akonadi/resourcebase.cpp --- old/kdepimlibs-4.14.2/akonadi/resourcebase.cpp 2014-10-09 22:09:43.000000000 +0200 +++ new/kdepimlibs-4.14.3/akonadi/resourcebase.cpp 2014-11-04 22:19:27.000000000 +0100 @@ -81,6 +81,7 @@ , mAutomaticProgressReporting(true) , mDisableAutomaticItemDeliveryDone(false) , mItemSyncBatchSize(10) + , mCurrentCollectionFetchJob(0) { Internal::setClientType(Internal::Resource); mStatusMessage = defaultReadyMessage(); @@ -137,10 +138,12 @@ void slotCollectionSyncDone(KJob *job); void slotLocalListDone(KJob *job); void slotSynchronizeCollection(const Collection &col); + void slotItemRetrievalCollectionFetchDone(KJob *job); void slotCollectionListDone(KJob *job); void slotSynchronizeCollectionAttributes(const Collection &col); void slotCollectionListForAttributesDone(KJob *job); void slotCollectionAttributesSyncDone(KJob *job); + void slotAttributeRetrievalCollectionFetchDone(KJob *job); void slotItemSyncDone(KJob *job); @@ -455,6 +458,7 @@ QPointer<RecursiveMover> m_recursiveMover; int mItemSyncBatchSize; QSet<QByteArray> mKeepLocalCollectionChanges; + KJob *mCurrentCollectionFetchJob; }; ResourceBase::ResourceBase(const QString &id) @@ -905,13 +909,30 @@ if (mAutomaticProgressReporting) { emit q->status(AgentBase::Running, i18nc("@info:status", "Syncing folder '%1'", currentCollection.displayName())); } - q->retrieveItems(currentCollection); + + Akonadi::CollectionFetchJob *fetchJob = new Akonadi::CollectionFetchJob(col, CollectionFetchJob::Base, this); + fetchJob->setFetchScope(q->changeRecorder()->collectionFetchScope()); + connect(fetchJob, SIGNAL(result(KJob*)), q, SLOT(slotItemRetrievalCollectionFetchDone(KJob*))); + mCurrentCollectionFetchJob = fetchJob; return; } } scheduler->taskDone(); } +void ResourceBasePrivate::slotItemRetrievalCollectionFetchDone(KJob *job) +{ + Q_Q(ResourceBase); + mCurrentCollectionFetchJob = 0; + if (job->error()) { + kWarning() << "Failed to retrieve collection for sync: " << job->errorString(); + q->cancelTask(i18n("Failed to retrieve collection for sync.")); + return; + } + Akonadi::CollectionFetchJob *fetchJob = static_cast<Akonadi::CollectionFetchJob*>(job); + q->retrieveItems(fetchJob->collections().first()); +} + int ResourceBase::itemSyncBatchSize() const { Q_D(const ResourceBase); @@ -927,7 +948,24 @@ void ResourceBasePrivate::slotSynchronizeCollectionAttributes(const Collection &col) { Q_Q(ResourceBase); - QMetaObject::invokeMethod(q, "retrieveCollectionAttributes", Q_ARG(Akonadi::Collection, col)); + Akonadi::CollectionFetchJob *fetchJob = new Akonadi::CollectionFetchJob(col, CollectionFetchJob::Base, this); + fetchJob->setFetchScope(q->changeRecorder()->collectionFetchScope()); + connect(fetchJob, SIGNAL(result(KJob*)), q, SLOT(slotAttributeRetrievalCollectionFetchDone(KJob*))); + Q_ASSERT(!mCurrentCollectionFetchJob); + mCurrentCollectionFetchJob = fetchJob; +} + +void ResourceBasePrivate::slotAttributeRetrievalCollectionFetchDone(KJob *job) +{ + mCurrentCollectionFetchJob = 0; + Q_Q(ResourceBase); + if (job->error()) { + kWarning() << "Failed to retrieve collection for attribute sync: " << job->errorString(); + q->cancelTask(i18n("Failed to retrieve collection for attribute sync.")); + return; + } + Akonadi::CollectionFetchJob *fetchJob = static_cast<Akonadi::CollectionFetchJob*>(job); + QMetaObject::invokeMethod(q, "retrieveCollectionAttributes", Q_ARG(Akonadi::Collection, fetchJob->collections().first())); } void ResourceBasePrivate::slotPrepareItemRetrieval(const Akonadi::Item &item) @@ -1041,6 +1079,10 @@ void ResourceBase::cancelTask() { Q_D(ResourceBase); + if (d->mCurrentCollectionFetchJob) { + d->mCurrentCollectionFetchJob->kill(); + d->mCurrentCollectionFetchJob = 0; + } switch (d->scheduler->currentTask().type) { case ResourceScheduler::FetchItem: itemRetrieved(Item()); // sends the error reply and @@ -1107,6 +1149,8 @@ Q_FOREACH (const Collection &collection, list) { //We also get collections that should not be synced but are part of the tree. if (collection.shouldList(Collection::ListSync)) { + // Schedule attribute sync before each collection sync + scheduler->scheduleAttributesSync(collection); scheduler->scheduleSync(collection); } } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kdepimlibs-4.14.2/akonadi/resourcebase.h new/kdepimlibs-4.14.3/akonadi/resourcebase.h --- old/kdepimlibs-4.14.2/akonadi/resourcebase.h 2014-10-09 22:09:43.000000000 +0200 +++ new/kdepimlibs-4.14.3/akonadi/resourcebase.h 2014-11-04 22:19:27.000000000 +0100 @@ -781,6 +781,8 @@ Q_PRIVATE_SLOT(d_func(), void slotSessionReconnected()) Q_PRIVATE_SLOT(d_func(), void slotRecursiveMoveReplay(RecursiveMover *)) Q_PRIVATE_SLOT(d_func(), void slotRecursiveMoveReplayResult(KJob *)) + Q_PRIVATE_SLOT(d_func(), void slotItemRetrievalCollectionFetchDone(KJob *)); + Q_PRIVATE_SLOT(d_func(), void slotAttributeRetrievalCollectionFetchDone(KJob *)); }; } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kdepimlibs-4.14.2/akonadi/specialcollectionshelperjobs.cpp new/kdepimlibs-4.14.3/akonadi/specialcollectionshelperjobs.cpp --- old/kdepimlibs-4.14.2/akonadi/specialcollectionshelperjobs.cpp 2014-10-09 22:09:43.000000000 +0200 +++ new/kdepimlibs-4.14.3/akonadi/specialcollectionshelperjobs.cpp 2014-11-04 22:19:27.000000000 +0100 @@ -199,9 +199,11 @@ void ResourceScanJob::doStart() { if (d->mResourceId.isEmpty()) { - kError() << "No resource ID given."; - setError(Job::Unknown); - setErrorText(i18n("No resource ID given.")); + if(!qobject_cast<DefaultResourceJob *>(this)) { + kError() << "No resource ID given."; + setError(Job::Unknown); + setErrorText(i18n("No resource ID given.")); + } emitResult(); return; } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kdepimlibs-4.14.2/akonadi/tests/itemsynctest.cpp new/kdepimlibs-4.14.3/akonadi/tests/itemsynctest.cpp --- old/kdepimlibs-4.14.2/akonadi/tests/itemsynctest.cpp 2014-10-09 22:09:43.000000000 +0200 +++ new/kdepimlibs-4.14.3/akonadi/tests/itemsynctest.cpp 2014-11-04 22:19:27.000000000 +0100 @@ -448,6 +448,116 @@ QCOMPARE(fetchJob->items().first().remoteId(), QString::fromLatin1("rid3")); } + /* + * This test verifies that ItemSync doesn't prematurly emit it's result if a job inside a transaction fails. + * ItemSync is supposed to continue the sync but simply ignoring all delivered data. + */ + void testFailingJob() + { + const Collection col = Collection( collectionIdFromPath( "res1/foo" ) ); + QVERIFY( col.isValid() ); + Item::List origItems = fetchItems( col ); + + ItemSync* syncer = new ItemSync( col ); + QSignalSpy transactionSpy(syncer, SIGNAL(transactionCommitted())); + QVERIFY(transactionSpy.isValid()); + QSignalSpy spy( syncer, SIGNAL(result(KJob*)) ); + QVERIFY( spy.isValid() ); + syncer->setStreamingEnabled( true ); + syncer->setTransactionMode(ItemSync::MultipleTransactions); + QTest::qWait( 0 ); + QCOMPARE( spy.count(), 0 ); + + for ( int i = 0; i < syncer->batchSize(); ++i ) { + Item::List l; + //Modify to trigger a changed signal + Item item = modifyItem(origItems[i]); + // item.setRemoteId(QByteArray("foo")); + item.setRemoteId(QByteArray()); + item.setId(-1); + l << item; + syncer->setIncrementalSyncItems( l, Item::List() ); + if ( i < (syncer->batchSize() - 1) ) { + QTest::qWait( 0 ); // enter the event loop so itemsync actually can do something + } + QCOMPARE( spy.count(), 0 ); + } + QTest::qWait(100); + QTRY_COMPARE( spy.count(), 0 ); + + for ( int i = syncer->batchSize(); i < origItems.count(); ++i ) { + Item::List l; + //Modify to trigger a changed signal + l << modifyItem(origItems[i]); + syncer->setIncrementalSyncItems( l, Item::List() ); + if ( i < origItems.count() - 1 ) { + QTest::qWait( 0 ); // enter the event loop so itemsync actually can do something + } + QCOMPARE( spy.count(), 0 ); + } + + syncer->deliveryDone(); + QTRY_COMPARE( spy.count(), 1 ); + } + + /* + * This test verifies that ItemSync doesn't prematurly emit it's result if a job inside a transaction fails, due to a duplicate. + * This case used to break the TransactionSequence. + * ItemSync is supposed to continue the sync but simply ignoring all delivered data. + */ + void testFailingDueToDuplicateJob() + { + const Collection col = Collection( collectionIdFromPath( "res1/foo" ) ); + QVERIFY( col.isValid() ); + Item::List origItems = fetchItems( col ); + + //Create a duplicate that will trigger an error during the first batch + Item duplicate = origItems.first(); + duplicate.setId(-1); + { + ItemCreateJob *job = new ItemCreateJob(duplicate, col); + AKVERIFYEXEC(job); + } + origItems = fetchItems( col ); + + ItemSync* syncer = new ItemSync( col ); + QSignalSpy transactionSpy(syncer, SIGNAL(transactionCommitted())); + QVERIFY(transactionSpy.isValid()); + QSignalSpy spy( syncer, SIGNAL(result(KJob*)) ); + QVERIFY( spy.isValid() ); + syncer->setStreamingEnabled( true ); + syncer->setTransactionMode(ItemSync::MultipleTransactions); + QTest::qWait( 0 ); + QCOMPARE( spy.count(), 0 ); + + for ( int i = 0; i < syncer->batchSize(); ++i ) { + Item::List l; + //Modify to trigger a changed signal + l << modifyItem(origItems[i]); + syncer->setIncrementalSyncItems( l, Item::List() ); + if ( i < (syncer->batchSize() - 1) ) { + QTest::qWait( 0 ); // enter the event loop so itemsync actually can do something + } + QCOMPARE( spy.count(), 0 ); + } + QTest::qWait(100); + //Ensure the job hasn't finished yet due to the errors + QTRY_COMPARE( spy.count(), 0 ); + + for ( int i = syncer->batchSize(); i < origItems.count(); ++i ) { + Item::List l; + //Modify to trigger a changed signal + l << modifyItem(origItems[i]); + syncer->setIncrementalSyncItems( l, Item::List() ); + if ( i < origItems.count() - 1 ) { + QTest::qWait( 0 ); // enter the event loop so itemsync actually can do something + } + QCOMPARE( spy.count(), 0 ); + } + + syncer->deliveryDone(); + QTRY_COMPARE( spy.count(), 1 ); + } }; QTEST_AKONADIMAIN( ItemsyncTest, NoGUI ) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kdepimlibs-4.14.2/akonadi/tests/testresource/knutresource.cpp new/kdepimlibs-4.14.3/akonadi/tests/testresource/knutresource.cpp --- old/kdepimlibs-4.14.2/akonadi/tests/testresource/knutresource.cpp 2014-10-09 22:09:43.000000000 +0200 +++ new/kdepimlibs-4.14.3/akonadi/tests/testresource/knutresource.cpp 2014-11-04 22:19:27.000000000 +0100 @@ -283,6 +283,46 @@ changeProcessed(); } +void KnutResource::itemMoved(const Item &item, const Collection &collectionSource, const Collection &collectionDestination) +{ + const QDomElement oldElem = mDocument.itemElementByRemoteId(item.remoteId()); + if (oldElem.isNull()) { + kWarning() << "Moved item not found in DOM tree"; + changeProcessed(); + return; + } + + QDomElement sourceParentElem = mDocument.collectionElementByRemoteId(collectionSource.remoteId()); + if (sourceParentElem.isNull()) { + emit error(i18n("Parent collection '%1' not found in DOM tree.", collectionSource.remoteId())); + changeProcessed(); + return; + } + + QDomElement destParentElem = mDocument.collectionElementByRemoteId(collectionDestination.remoteId()); + if (destParentElem.isNull()) { + emit error(i18n("Parent collection '%1' not found in DOM tree.", collectionDestination.remoteId())); + changeProcessed(); + return; + } + + QDomElement itemElem = mDocument.itemElementByRemoteId(item.remoteId()); + if (itemElem.isNull()) { + emit error(i18n("No item found for remoteid %1", item.remoteId())); + } + + sourceParentElem.removeChild(itemElem); + destParentElem.appendChild(itemElem); + + if (XmlWriter::writeItem(item, destParentElem).isNull()) { + emit error(i18n("Unable to write item.")); + } else { + save(); + } + changeProcessed(); +} + + QSet<qint64> KnutResource::parseQuery(const QString &queryString) { QSet<qint64> resultSet; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kdepimlibs-4.14.2/akonadi/tests/testresource/knutresource.h new/kdepimlibs-4.14.3/akonadi/tests/testresource/knutresource.h --- old/kdepimlibs-4.14.2/akonadi/tests/testresource/knutresource.h 2014-10-09 22:09:43.000000000 +0200 +++ new/kdepimlibs-4.14.3/akonadi/tests/testresource/knutresource.h 2014-11-04 22:19:27.000000000 +0100 @@ -35,7 +35,9 @@ class QFileSystemWatcher; -class KnutResource : public Akonadi::ResourceBase, public Akonadi::AgentBase::Observer, public Akonadi::AgentSearchInterface +class KnutResource : public Akonadi::ResourceBase, + public Akonadi::AgentBase::ObserverV2, + public Akonadi::AgentSearchInterface { Q_OBJECT @@ -58,6 +60,7 @@ void itemAdded( const Akonadi::Item &item, const Akonadi::Collection &collection ); void itemChanged( const Akonadi::Item &item, const QSet<QByteArray> &parts ); void itemRemoved( const Akonadi::Item &ref ); + void itemMoved( const Akonadi::Item &item, const Akonadi::Collection &collectionSource, const Akonadi::Collection &collectionDestination ); void search(const QString& query, const Akonadi::Collection& collection); void addSearch(const QString& query, const QString& queryLanguage, const Akonadi::Collection& resultCollection); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kdepimlibs-4.14.2/akonadi/transactionsequence.cpp new/kdepimlibs-4.14.3/akonadi/transactionsequence.cpp --- old/kdepimlibs-4.14.2/akonadi/transactionsequence.cpp 2014-10-09 22:09:43.000000000 +0200 +++ new/kdepimlibs-4.14.3/akonadi/transactionsequence.cpp 2014-11-04 22:19:27.000000000 +0100 @@ -84,6 +84,16 @@ { Q_D(TransactionSequence); + //Don't abort the rollback job, while keeping the state set. + if (d->mState == TransactionSequencePrivate::RollingBack) { + return Job::addSubjob(job); + } + + if (error()) { + //This can happen if a rollback is in progress, so make sure we don't set the state back to running. + job->kill(EmitResult); + return false; + } // TODO KDE5: remove property hack once SpecialCollectionsRequestJob has been fixed if (d->mState == TransactionSequencePrivate::Idle && !property("transactionsDisabled").toBool()) { d->mState = TransactionSequencePrivate::Running; // needs to be set before creating the transaction job to avoid infinite recursion diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kdepimlibs-4.14.2/kalarmcal/kaevent.cpp new/kdepimlibs-4.14.3/kalarmcal/kaevent.cpp --- old/kdepimlibs-4.14.2/kalarmcal/kaevent.cpp 2014-10-09 22:09:43.000000000 +0200 +++ new/kdepimlibs-4.14.3/kalarmcal/kaevent.cpp 2014-11-04 22:19:27.000000000 +0100 @@ -329,7 +329,7 @@ KDateTime mAtLoginDateTime; // repeat-at-login end time DateTime mDeferralTime; // extra time to trigger alarm (if alarm or reminder deferred) DateTime mDisplayingTime; // date/time shown in the alarm currently being displayed - int mDisplayingFlags; // type of alarm which is currently being displayed + int mDisplayingFlags; // type of alarm which is currently being displayed (for display alarm) int mReminderMinutes; // how long in advance reminder is to be, or 0 if none (<0 for reminder AFTER the alarm) DateTime mReminderAfterTime; // if mReminderActive true, time to trigger reminder AFTER the main alarm, or invalid if not pending ReminderType mReminderActive; // whether a reminder is due (before next, or after last, main alarm/recurrence) @@ -612,7 +612,8 @@ KAEventPrivate::KAEventPrivate(const KDateTime& dt, const QString& message, const QColor& bg, const QColor& fg, const QFont& f, KAEvent::SubAction action, int lateCancel, KAEvent::Flags flags, bool changesPending) - : mRecurrence(0) + : mRevision(0), + mRecurrence(0) { set(dt, message, bg, fg, f, action, lateCancel, flags, changesPending); } @@ -1184,11 +1185,11 @@ { // Convert a repetition with no recurrence into a recurrence if (mRepetition.isDaily()) - recur->setDaily(mRepetition.intervalDays()); + setRecur(RecurrenceRule::rDaily, mRepetition.intervalDays(), mRepetition.count() + 1, QDate()); else - recur->setMinutely(mRepetition.intervalMinutes()); - recur->setDuration(mRepetition.count() + 1); + setRecur(RecurrenceRule::rMinutely, mRepetition.intervalMinutes(), mRepetition.count() + 1, KDateTime()); mRepetition.set(0, 0); + mTriggerChanged = true; } if (mRepeatAtLogin) @@ -2970,22 +2971,18 @@ void KAEventPrivate::setRecurrence(const KARecurrence& recurrence) { startChanges(); // prevent multiple trigger time evaluation here - delete mRecurrence; if (recurrence.recurs()) { + delete mRecurrence; mRecurrence = new KARecurrence(recurrence); mRecurrence->setStartDateTime(mStartDateTime.effectiveKDateTime(), mStartDateTime.isDateOnly()); mTriggerChanged = true; + + // Adjust sub-repetition values to fit the recurrence. + setRepetition(mRepetition); } else - { - if (mRecurrence) - mTriggerChanged = true; - mRecurrence = 0; - } - - // Adjust sub-repetition values to fit the recurrence. - setRepetition(mRepetition); + clearRecur(); endChanges(); } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kdepimlibs-4.14.2/kholidays/holidays/plan2/holiday_fi_fi new/kdepimlibs-4.14.3/kholidays/holidays/plan2/holiday_fi_fi --- old/kdepimlibs-4.14.2/kholidays/holidays/plan2/holiday_fi_fi 2014-10-09 22:09:43.000000000 +0200 +++ new/kdepimlibs-4.14.3/kholidays/holidays/plan2/holiday_fi_fi 2014-11-04 22:19:27.000000000 +0100 @@ -6,9 +6,12 @@ :: Author: Steven Wahlberg <[email protected]> :: Lasse Liehu <[email protected]> :: -:: Updated: 2014-05-18 +:: Updated: 2014-07-09 :: :: Source: University of Helsinki Almanac office (http://almanakka.helsinki.fi) +:: http://fi.wikipedia.org +:: http://en.wikipedia.org +:: http://www.usno.navy.mil/USNO/astronomical-applications/data-services/earth-seasons :: :: Metadata @@ -21,78 +24,73 @@ :: Public Holidays : New Year's Day -"Uudenvuodenpäivä" public on 1 january +"Uudenvuodenpäivä" public cultural on 1 january : Epiphany "Loppiainen" public religious on 6 january : May Day -"Vappu" public on 1 may -: Midsummer -"Juhannuspäivä" public on saturday after 20 june -: All Saints -"Pyhäinpäivä" public religious on first saturday in november +"Vappu, suomalaisen työn päivä" public cultural on 1 may +: Midsummer (Saturday on 20 Jun - 26 Jun) +"Juhannuspäivä" public cultural on saturday after 19 june +: All Saints (Saturday on 31 Oct - 6 Nov) +"Pyhäinpäivä" public religious commemorative on saturday before 7 november : Independence Day -"Itsenäisyyspäivä" public on 6 december +"Itsenäisyyspäivä" public historical on 6 december : Christmas Day "Joulupäivä" public religious on 25 december -: Boxing Day -"Tapaninpäivä" public on 26 december +: St. Stephen's Day +"Tapaninpäivä" public religious on 26 december + + +: Determined by Easter -: pääsiäisen määräämät - determined by Easter : Shrove Sunday "Laskiaissunnuntai" public religious on easter minus 49 days -: Shrove Tuesday +: Shrove Tuesday (not a day off) "Laskiaistiistai" religious on easter minus 47 days -: Annunciation -"Marianpäivä" public religious on ( (( [sunday before ([03/28])] == [easter]) || - ( [sunday before ([03/28])] == ([easter] - 7)) ) ? +: Annunciation (sunday on 22 Mar - 28 Mar unless said day is Palm Sunday or Good Friday) +"Marian ilmestyspäivä" public religious on ( (( [sunday before ([03/29])] == [easter]) || + ( [sunday before ([03/29])] == ([easter] - 7)) ) ? ([easter] - 14) : - [sunday before ([03/28])] ) + [sunday before ([03/29])] ) : Palm Sunday "Palmusunnuntai" public religious on easter minus 7 days : Good Friday "Pitkäperjantai" public religious on easter minus 2 days : Easter Day -"Pääsiäinen" public religious on easter +"Pääsiäispäivä" public religious on easter : Easter Monday "2. pääsiäispäivä" public on easter plus 1 days -: Rogation Sunday -"Rukoussunnuntai" public religious on easter plus 35 days : Ascension "Helatorstai" public religious on easter plus 39 days -: : Whitsunday +: Pentecost or Whitsunday "Helluntaipäivä" public religious on easter plus 49 days - :: Religious Holidays -: Kynttilänpäivä, Pyhän Kolminaisuuden päivä, Apostolien päivä, -: Mikkelinpäivä and Valvomisen sunnuntai could be here, but they're always -: on Sundays and don't know if we really want them here - -: Sleepyhead Day (not a holiday) -"Unikeonpäivä" cultural on 27 july +: Seven Sleepers Day (not a day off) +"Unikeonpäivä" religious on 27 july : The First Advent Sunday -"1. adventtisunnuntai" public religious on sunday before 24 december minus 21 days +"1. adventtisunnuntai" religious on sunday before 24 december minus 21 days : The Second Advent Sunday -"2. adventtisunnuntai" public religious on sunday before 24 december minus 14 days +"2. adventtisunnuntai" religious on sunday before 24 december minus 14 days : The Third Advent Sunday -"3. adventtisunnuntai" public religious on sunday before 24 december minus 7 days +"3. adventtisunnuntai" religious on sunday before 24 december minus 7 days : The Fourth Advent Sunday -"4. adventtisunnuntai" public religious on sunday before 24 december -: Holy Innocents' Day (not a holiday) +"4. adventtisunnuntai" religious on sunday before 24 december +: Holy Innocents' Day (not a day off), refers to Massacre of the Innocents "Viattomien lasten päivä" religious on 28 december -:: Financial +:: Commemorative -: Enterpreneur's Day -"Yrittäjän päivä" cultural on 5 september +: International Holocaust Remembrance Day +"Vainojen uhrien muistopäivä" commemorative on 27 january +: Remembrance Day +"Kaatuneitten muistopäivä" commemorative on third sunday in may :: Cultural -: International Holocaust Remembrance Day -"Vainojen uhrien muistopäivä" cultural on 27 january : J. L. Runeberg's Day "Runebergin päivä" cultural on 5 february : Sami National Day @@ -105,52 +103,97 @@ "Naistenpäivä" cultural on 8 march : Minna Canth's Day, The Day of Equality "Minna Canthin päivä, tasa-arvon päivä" cultural on 19 march +: National version of International Romani Day +"Romanien kansallispäivä" cultural on 8 april : Michael Agricola' Day, (Finnish Language Day) -"Agricolan päivä" cultural on 9 april +"Mikael Agricolan päivä, suomen kielen päivä" cultural on 9 april : National Veteran's Day -"Veteraanipäivä" cultural on 27 april +"Kansallinen veteraanipäivä" cultural on 27 april : Mother's Day -"Äitienpäivä" cultural on second sunday in may +"Äitienpäivä" cultural on second sunday in may : Europe Day "Eurooppa-päivä" cultural on 9 may : J. V. Snellman's Day, (The Day of Finnishness) -"Snellmanin päivä" cultural on 12 may -: Remembrance Day -"Kaatuneitten muistopäivä" cultural on third sunday in may +"J. V. Snellmanin päivä, suomalaisuuden päivä" cultural on 12 may : Flag Day of Defence Forces -"Puolustusvoimien lippujuhla" cultural on 4 june +"Puolustusvoimien lippujuhlan päivä" cultural on 4 june +: Midsummer Eve (Friday on 19 Jun - 25 Jun) +: Although usually not listed in calendars, it is a day off for many and an important day anyway. +"Juhannusaatto" financial government cultural on friday after 18 june : Eino Leino's Day, (Summer and Poetry Day) -"Eino Leinon päivä" cultural on 6 july +"Eino Leinon päivä, runon ja suven päivä" cultural on 6 july +: Entrepreneur's Day +"Yrittäjän päivä" cultural on 5 september : Aleksis Kivi's Day, (Finnish Literature Day) -"Aleksis Kiven päivä" cultural on 10 october -: United Nations Day -"YK:n päivä" cultural on 24 october +"Aleksis Kiven päivä, suomalaisen kirjallisuuden päivä" cultural on 10 october : Finnish Swedish Heritage Day "Svenska dagen" cultural on 6 november : Father's Day "Isänpäivä" cultural on second sunday in november : Children's Day -"Lapsen oikeuksien päivä" cultural on 20 november +"Lasten oikeuksien päivä" cultural on 20 november : Jean Sibelius's Day, (Finnish Music Day) -"Jean Sibeliuksen päivä" cultural on 8 december +"Jean Sibeliuksen päivä, suomalaisen musiikin päivä" cultural on 8 december +: Christmas Eve (listed here even though it is usually not listed in calendars) +"Jouluaatto" financial government cultural on 24 december -:: School - -:: Daylight Saving -"Kesäaika alkaa (+1 tunti)" seasonal on last sunday in march -"Kesäaika päättyy (-1 tunti)" seasonal on last sunday in october +:: Historical +: United Nations Day +"YK:n päivä" historical on 24 october -:: Seasons +:: School -:: Name Days +:: Daylight Saving (Winter/Summer Time) -: Name days in Finland are under copyright by University of Helsinki Almanac office and not free +"Kesäaika alkaa (tunti eteenpäin)" seasonal on last sunday in march +"Kesäaika päättyy (tunti taaksepäin)" seasonal on last sunday in october -:: To be sorted +:: Seasons : Leap Day "Karkauspäivä" seasonal on 29 february +: Vernal equinox +"Kevätpäiväntasaus" seasonal on 20 march 2013 +"Kevätpäiväntasaus" seasonal on 20 march 2014 +"Kevätpäiväntasaus" seasonal on 21 march 2015 +"Kevätpäiväntasaus" seasonal on 20 march 2016 +"Kevätpäiväntasaus" seasonal on 20 march 2017 +"Kevätpäiväntasaus" seasonal on 20 march 2018 +"Kevätpäiväntasaus" seasonal on 20 march 2019 +"Kevätpäiväntasaus" seasonal on 20 march 2020 +: Summer solstice +"Kesäpäivänseisaus" seasonal on 21 june 2013 +"Kesäpäivänseisaus" seasonal on 21 june 2014 +"Kesäpäivänseisaus" seasonal on 21 june 2015 +"Kesäpäivänseisaus" seasonal on 21 june 2016 +"Kesäpäivänseisaus" seasonal on 21 june 2017 +"Kesäpäivänseisaus" seasonal on 21 june 2018 +"Kesäpäivänseisaus" seasonal on 21 june 2019 +"Kesäpäivänseisaus" seasonal on 21 june 2020 +: Autumnal equinox +"Syyspäiväntasaus" seasonal on 22 september 2013 +"Syyspäiväntasaus" seasonal on 23 september 2014 +"Syyspäiväntasaus" seasonal on 23 september 2015 +"Syyspäiväntasaus" seasonal on 22 september 2016 +"Syyspäiväntasaus" seasonal on 22 september 2017 +"Syyspäiväntasaus" seasonal on 23 september 2018 +"Syyspäiväntasaus" seasonal on 23 september 2019 +"Syyspäiväntasaus" seasonal on 22 september 2020 +: Winter solstice +"Talvipäivänseisaus" seasonal on 21 december 2013 +"Talvipäivänseisaus" seasonal on 22 december 2014 +"Talvipäivänseisaus" seasonal on 22 december 2015 +"Talvipäivänseisaus" seasonal on 21 december 2016 +"Talvipäivänseisaus" seasonal on 21 december 2017 +"Talvipäivänseisaus" seasonal on 22 december 2018 +"Talvipäivänseisaus" seasonal on 22 december 2019 +"Talvipäivänseisaus" seasonal on 21 december 2020 + + +:: Name Days + +: Name days in Finland are under copyright by University of Helsinki Almanac office and are not free. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kdepimlibs-4.14.2/kholidays/holidays/plan2/holiday_us_en-us new/kdepimlibs-4.14.3/kholidays/holidays/plan2/holiday_us_en-us --- old/kdepimlibs-4.14.2/kholidays/holidays/plan2/holiday_us_en-us 2014-10-09 22:09:43.000000000 +0200 +++ new/kdepimlibs-4.14.3/kholidays/holidays/plan2/holiday_us_en-us 2014-11-04 22:19:27.000000000 +0100 @@ -56,6 +56,7 @@ "World Poetry Day" cultural on october 15 "United Nations' Day" cultural on october 24 "Halloween" cultural on october 31 +"Election Day" cultural on tuesday after 11/2 "Bill of Rights' Day" cultural on december 15 "Wright Brothers' Day" cultural on december 17 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kdepimlibs-4.14.2/kpimtextedit/selectspecialchar.cpp new/kdepimlibs-4.14.3/kpimtextedit/selectspecialchar.cpp --- old/kdepimlibs-4.14.2/kpimtextedit/selectspecialchar.cpp 2014-10-09 22:09:43.000000000 +0200 +++ new/kdepimlibs-4.14.3/kpimtextedit/selectspecialchar.cpp 2014-11-04 22:19:27.000000000 +0100 @@ -31,7 +31,7 @@ : q( qq ) { q->setCaption( i18n( "Select Special Characters" ) ); - q->setButtons( KDialog::Ok|KDialog::Cancel|KDialog::User1 ); + q->setButtons( KDialog::Close|KDialog::User1 ); q->setButtonText( KDialog::User1, i18n( "Select" ) ); QWidget *page = new QWidget( q ); q->setMainWidget( page ); @@ -70,7 +70,7 @@ void SelectSpecialChar::showSelectButton( bool show ) { if ( show ) { - setButtons( Ok|Cancel|User1 ); + setButtons( Close|User1 ); } else { setButtons( Ok|Cancel ); } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kdepimlibs-4.14.2/mailtransport/transport.cpp new/kdepimlibs-4.14.3/mailtransport/transport.cpp --- old/kdepimlibs-4.14.2/mailtransport/transport.cpp 2014-10-09 22:09:43.000000000 +0200 +++ new/kdepimlibs-4.14.3/mailtransport/transport.cpp 2014-11-04 22:19:27.000000000 +0100 @@ -232,6 +232,7 @@ void Transport::usrWriteConfig() { if ( requiresAuthentication() && storePassword() && d->passwordDirty ) { + const QString storePassword = d->password; Wallet *wallet = TransportManager::self()->wallet(); if ( !wallet || wallet->writePassword( QString::number( id() ), d->password ) != 0 ) { // wallet saving failed, ask if we should store in the config file instead @@ -250,7 +251,7 @@ KGuiItem( i18n( "Do Not Store Password" ) ) ) == KMessageBox::Yes ) { // write to config file KConfigGroup group( config(), currentGroup() ); - group.writeEntry( "password", KStringHandler::obscure( d->password ) ); + group.writeEntry( "password", KStringHandler::obscure( storePassword ) ); d->storePasswordInFile = true; } } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kdepimlibs-4.14.2/mailtransport/transportmanager.cpp new/kdepimlibs-4.14.3/mailtransport/transportmanager.cpp --- old/kdepimlibs-4.14.2/mailtransport/transportmanager.cpp 2014-10-09 22:09:43.000000000 +0200 +++ new/kdepimlibs-4.14.3/mailtransport/transportmanager.cpp 2014-11-04 22:19:27.000000000 +0100 @@ -408,6 +408,12 @@ d->transports.removeAll( t ); d->validateDefault(); QString group = t->currentGroup(); + if (t->storePassword()) { + Wallet *currentWallet = wallet(); + if ( currentWallet ) { + currentWallet->removeEntry( QString::number(t->id()) ); + } + } delete t; d->config->deleteGroup( group ); d->writeConfig(); -- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
