[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    playground/sysadmin/shaman
From:       Dario Freddi <drf () kde ! org>
Date:       2010-01-14 17:03:59
Message-ID: 1263488639.836611.32395.nullmailer () svn ! kde ! org
[Download RAW message or body]

SVN commit 1074732 by dafre:

New reload stuff

Signed-off-by: Dario Freddi <drf@kde.org>

 M  +9 -0      libshaman/backends/aqpm/AqpmPlugin.cpp  
 M  +1 -0      libshaman/backends/aqpm/AqpmPlugin.h  
 M  +18 -1     libshaman/backends/packagekit/PKPlugin.cpp  
 M  +2 -0      libshaman/backends/packagekit/PKPlugin.h  
 M  +17 -46    libshaman/shamanbackend.cpp  
 M  +0 -19     libshaman/shamanbackend.h  
 M  +3 -1      libshaman/shamanbackend_p.h  
 M  +0 -6      libshaman/shamanbackendinterface.cpp  
 M  +1 -3      libshaman/shamanbackendinterface.h  
 M  +0 -1      libshaman/shamanbase.cpp  
 M  +6 -8      plugins/packagedetail/PackageDetailDockWidget.cpp  
 M  +1 -1      plugins/packagedetail/PackageDetailDockWidget.h  
 M  +0 -2      shaman/src/MainWindow.cpp  


--- trunk/playground/sysadmin/shaman/libshaman/backends/aqpm/AqpmPlugin.cpp \
#1074731:1074732 @@ -156,10 +156,19 @@
 
     // All systems are up and running, let's go!
     setState(Shaman::Backend::Idling);
+    // Reload as we go
+    QTimer::singleShot(100, this, SLOT(reload()));
 }
 
+void AqpmPlugin::onTransactionEnded()
+{
+    // Just reload
+    reload();
+}
+
 void AqpmPlugin::reload()
 {
+    setState(Shaman::Backend::Reloading);
     QHash< QString, Shaman::AbstractPackage*> pkglist;
     Shaman::PackageGroup::List grplist;
     Shaman::Repository::List repolist;
--- trunk/playground/sysadmin/shaman/libshaman/backends/aqpm/AqpmPlugin.h \
#1074731:1074732 @@ -34,6 +34,7 @@
 
     public slots:
         void reload();
+        virtual void onTransactionEnded();
 
         void updateRepositories();
 
--- trunk/playground/sysadmin/shaman/libshaman/backends/packagekit/PKPlugin.cpp \
#1074731:1074732 @@ -161,10 +161,13 @@
     connect(backend(), SIGNAL(stateChanged(Shaman::Backend::State)), this, \
SLOT(slotStateChanged(Shaman::Backend::State)));  
     setState(Backend::Idling);
+    // Go and reload!
+    reload();
 }
 
 void PKPlugin::reload()
 {
+    setState(Shaman::Backend::Reloading);
     stopBackgroundTransactions();
 
     setRepositories(Shaman::Repository::List());
@@ -305,14 +308,28 @@
     connect(transaction, SIGNAL(finished(PackageKit::Transaction::ExitStatus,uint)), \
SLOT(reloadNextPackageGroup()));  }
 
-void PKPlugin::partialReload(const Shaman::AbstractPackage::List& packages)
+void PKPlugin::onTransactionEnded()
 {
     if (!(PackageKit::Client::instance()->getActions() & \
PackageKit::Client::ActionResolve)) {  // No room for partial reloading...
         reload();
         return;
     }
+    // Reload only the interested packages
+    AbstractPackage::List toReload;
+    foreach (Shaman::AbstractPackage *package, backend()->packages()) {
+        if (package->action() != AbstractPackage::NoAction) {
+            kDebug() << package->name() << " should be reloaded";
+            toReload.append(package);
+        }
+    }
+    partialReload(toReload);
+}
 
+void PKPlugin::partialReload(const Shaman::AbstractPackage::List& packages)
+{
+    setState(Shaman::Backend::Reloading);
+
     qDebug() << "Partial reload triggered";
 
     QStringList packageNames;
--- trunk/playground/sysadmin/shaman/libshaman/backends/packagekit/PKPlugin.h \
#1074731:1074732 @@ -52,6 +52,8 @@
     public slots:
         virtual void markAdditionalTargetsForQueue(const \
Shaman::ProcessQueueOption::List &options);  
+        virtual void onTransactionEnded();
+
         virtual void reload();
 
         virtual void partialReload(const Shaman::AbstractPackage::List& packages);
--- trunk/playground/sysadmin/shaman/libshaman/shamanbackend.cpp #1074731:1074732
@@ -219,6 +219,11 @@
 
     Q_Q(Backend);
 
+    if (newstate == Backend::Reloading) {
+        upgradeablePackages.clear();
+        emit q->upgradeablePackagesChanged(upgradeablePackages);
+    }
+
     if (state == Backend::MarkingAdditionalTargets && newstate == Backend::Idling) {
         // We have all of our targets marked now. Let's cache the size for each one \
of them  Shaman::AbstractPackage::List::const_iterator i;
@@ -240,25 +245,24 @@
         }
     }
 
-    if (state == Backend::OnTransaction && newstate == Backend::Idling) {
+    if (state == Backend::OnTransaction) {
         // Something has just ended, before changing the state, let's run the hooks
+        // Let's queue the hook run
+        runHooksWhenBackIdle = true;
+    }
+
+    if (newstate == Backend::Idling && runHooksWhenBackIdle) {
+        // Go with the hooks!
         // But - first check the transaction errors: if any, skip the hooks
         if (Base::instance()->core()->transactionInterface()->lastError() != \
TransactionInterface::NoError) {  // In this case, skip the hooks
-            // Ok, now reload the backend as well
-            if (transactionType == "queue") {
-                // Attempt a partial reload
-                interface->partialReload(Base::instance()->core()->transactionInterface()->packages());
                
-            } else if (transactionType == "repoupdate") {
-                interface->reload();
-            }
 
             // Set the transaction state to NoTransaction to declare the end of the \
                operation :)
             setTransactionState(Shaman::TransactionInterface::NoTransaction);
-
-            // Return: reloading functions will take care of setting the backend \
                back to idle
-            return;
+            state = newstate;
+            emit q->stateChanged(state);
         }
+
         setTransactionState(Shaman::TransactionInterface::RunningPostHooks);
         CorePlugin::Hook hook = CorePlugin::NoHooks;
         if (transactionType == "queue") {
@@ -301,50 +305,17 @@
             }
         }
 
-        state = newstate;
+        // Now the hooks of the backend
+        interface->onTransactionEnded();
 
-        // Ok, now reload the backend as well
-        if (transactionType == "queue") {
-            // Attempt a partial reload
-            interface->partialReload(Base::instance()->core()->transactionInterface()->packages());
                
-        } else if (transactionType == "repoupdate") {
-            interface->reload();
-        }
-
         // Set the transaction state to NoTransaction to declare the end of the \
operation :)  setTransactionState(Shaman::TransactionInterface::NoTransaction);
-
-        // Return: reloading functions will take care of setting the backend back to \
                idle
-        return;
     }
 
     state = newstate;
     emit q->stateChanged(state);
 }
 
-void Backend::reload()
-{
-    // Empty the upgradeable packages first
-    d->upgradeablePackages.clear();
-    emit upgradeablePackagesChanged(d->upgradeablePackages);
-    d->setState(Reloading);
-    QMetaObject::invokeMethod(d->interface, "reload", Qt::QueuedConnection);
-}
-
-void Shaman::Backend::partialReload(const Shaman::AbstractPackage::List& packages)
-{
-    // Check the upgradeable packages first
-    foreach (Shaman::AbstractPackage *package, packages) {
-        if (d->upgradeablePackages.contains(package)) {
-            d->upgradeablePackages.removeOne(package);
-        }
-    }
-    emit upgradeablePackagesChanged(d->upgradeablePackages);
-    d->setState(Reloading);
-    QMetaObject::invokeMethod(d->interface, "partialReload", Qt::QueuedConnection, \
                Q_ARG(Shaman::AbstractPackage::List,
-packages));
-}
-
 void Shaman::BackendPrivate::setError(Shaman::Backend::Error error, const QString \
&details)  {
     Q_Q(Backend);
--- trunk/playground/sysadmin/shaman/libshaman/shamanbackend.h #1074731:1074732
@@ -308,25 +308,6 @@
         void markAdditionalTargetsForQueue(const Shaman::ProcessQueueOption::List \
&options);  
         /**
-         * Reloads all the information of the backend.
-         *
-         * \note Do not call manually inside this function, unless you know what
-         *       you're doing: libshaman will take care of calling it when \
                appropriate
-         *
-         * @see setBackgroundOperation
-         */
-        void reload();
-
-        /**
-         * Reloads only a given list of packages. This is useful for partial \
                reloads, where one needs
-         * just to reload a part of the available info because they could have \
                changed. The list of packages
-         * passed as an argument can be (and should be) deleted by the backend.
-         *
-         * @param packges a list of packages to be reloaded
-         */
-        void partialReload(const Shaman::AbstractPackage::List &packages);
-
-        /**
          * Asks the backend to search for packages. The state will switch to \c \
                Searching and the signal
          * \c searchCompleted will be emitted upon completion. Call this function \
                only if the shamanbackend.has
          * specified in its capabilities the ability to search for packages from the \
                backend
--- trunk/playground/sysadmin/shaman/libshaman/shamanbackend_p.h #1074731:1074732
@@ -26,7 +26,8 @@
             error(Shaman::Backend::NoError),
             capabilities(0),
             properties(0),
-            interface(iface)
+            interface(iface),
+            runHooksWhenBackIdle(false)
         {
         }
         ~BackendPrivate()
@@ -64,6 +65,7 @@
         BackendInterface *interface;
         QList<Shaman::DistUpgrade*> distUpgrades;
         Shaman::ProcessQueueOption::List availablePQOptions;
+        bool runHooksWhenBackIdle;
 };
 
 class BackendCapabilities::Private
--- trunk/playground/sysadmin/shaman/libshaman/shamanbackendinterface.cpp \
#1074731:1074732 @@ -85,12 +85,6 @@
     return d->manualProgressReporter;
 }
 
-void BackendInterface::partialReload(const Shaman::AbstractPackage::List& packages)
-{
-    Q_UNUSED(packages)
-    reload();
-}
-
 void BackendInterface::setState(Backend::State state)
 {
     d->backend->d->setState(state);
--- trunk/playground/sysadmin/shaman/libshaman/shamanbackendinterface.h \
#1074731:1074732 @@ -158,8 +158,6 @@
          *
          * @see setBackgroundOperation
          */
-        virtual void reload() = 0;
-
         /**
          * Reloads only a given list of packages. This is useful for partial \
                reloads, where one needs
          * just to reload a part of the available info because they could have \
changed. The list of packages @@ -176,7 +174,7 @@
          *
          * @see reload
          */
-        virtual void partialReload(const Shaman::AbstractPackage::List &packages);
+        virtual void onTransactionEnded() = 0;
 
         /**
          * Reimplement this function only if you specified in the backend \
                capabilities \c BasicSearchFromBackendCapability
--- trunk/playground/sysadmin/shaman/libshaman/shamanbase.cpp #1074731:1074732
@@ -184,7 +184,6 @@
     emit q->initCompleted();
     // After doing that, happily start reloading the whole backend
     // Doing this we can start the GUI earlier
-    coreInterface->backend()->reload();
     foreach (Shaman::Provider *provider, coreInterface->providers()) {
         provider->reload();
     }
--- trunk/playground/sysadmin/shaman/plugins/packagedetail/PackageDetailDockWidget.cpp \
#1074731:1074732 @@ -28,8 +28,7 @@
     requiredBy(0),
     conflicts(0),
     providers(0),
-    currentPackage(0),
-    m_currentWatcher(0)
+    currentPackage(0)
 {
     setupUi(this);
     connect(backend, SIGNAL(stateChanged(Shaman::Backend::State)),
@@ -156,9 +155,8 @@
 
 void PackageDetailDockWidget::slotCurrentPackageChanged(Shaman::AbstractPackage \
*pkg)  {
-    if (m_currentWatcher) {
-        m_currentWatcher->deleteLater();
-        m_currentWatcher = 0;
+    if (!m_currentWatcher.isNull()) {
+        m_currentWatcher.data()->deleteLater();
     }
     if (! pkg) {
         reset();
@@ -222,9 +220,9 @@
     // Create a watcher
     m_currentWatcher = new Shaman::PackageWatcher(currentPackage, this);
 
-    connect(m_currentWatcher, \
                SIGNAL(actionChanged(Shaman::AbstractPackage::Action)), \
                SLOT(actionChanged()));
-    connect(m_currentWatcher, SIGNAL(stateChanged(Shaman::AbstractPackage::State)), \
                SLOT(stateChanged()));
-    connect(m_currentWatcher, \
SIGNAL(valueCached(Shaman::AbstractPackage::CachedValue)), this, \
SLOT(reloadCurrentPackage())); +    connect(m_currentWatcher.data(), \
SIGNAL(actionChanged(Shaman::AbstractPackage::Action)), SLOT(actionChanged())); +    \
connect(m_currentWatcher.data(), \
SIGNAL(stateChanged(Shaman::AbstractPackage::State)), SLOT(stateChanged())); +    \
connect(m_currentWatcher.data(), \
SIGNAL(valueCached(Shaman::AbstractPackage::CachedValue)), this, \
                SLOT(reloadCurrentPackage()));
     if (!(currentPackage->cachedValues() & Shaman::AbstractPackage::CustomValues)) {
         // If it's not cached, cache them now!
         currentPackage->cacheValue(Shaman::AbstractPackage::CustomValues);
--- trunk/playground/sysadmin/shaman/plugins/packagedetail/PackageDetailDockWidget.h \
#1074731:1074732 @@ -41,7 +41,7 @@
         Shaman::Backend * m_backend;
         QTreeWidgetItem *depends, *requiredBy, *conflicts, *providers;
         Shaman::AbstractPackage *currentPackage;
-        Shaman::PackageWatcher *m_currentWatcher;
+        QPointer<Shaman::PackageWatcher> m_currentWatcher;
         QHash<int, QString> m_pages;
 
         void reset();
--- trunk/playground/sysadmin/shaman/shaman/src/MainWindow.cpp #1074731:1074732
@@ -236,8 +236,6 @@
     }
     if (m_saved & BackendSettingsType) {
         kDebug() << "Backend settings have been modified";
-        // Reload the backend then
-        m_shaman->core()->backend()->reload();
     }
 }
 


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic