[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Bug#692601: unblock: apper/0.7.2-5



Package: release.debian.org
Severity: normal
User: release.debian.org@packages.debian.org
Usertags: unblock

Please unblock package apper

The change includes only one patch, which makes Apper able to replace the
package "update-notifier-kde", which will be retired in favour of Apper in
Debian/KDE default selection then.
The code in the patch is to a very high degree already used in the old update
notifier and has not been changed.
Having an Apper which is able to listen for restart signals from non-PackageKit
tools makes it possible to remove the old update-notifier from default, and by
doing this, this bug will be fixed: http://bugs.debian.org/691757

The concepts have been discussed with Niels Thykier who wanted a patch for
review.

Thank you for looking into this!
Kind regards,
    Matthias Klumpp

Here is the full patch applied to the Apper sources:
Forwarded: yes
Author: Matthias Klumpp <matthias@tenstral.net>
Last-Update: 2012-11-06
diff --git a/Sentinel/ApperSentinel.cpp b/Sentinel/ApperSentinel.cpp
index e0ae70d..384bcc7 100644
--- a/Sentinel/ApperSentinel.cpp
+++ b/Sentinel/ApperSentinel.cpp
@@ -81,6 +81,10 @@ ApperSentinel::ApperSentinel()
     connect(m_interface, SIGNAL(refreshCache()),
             m_refreshCache, SLOT(refreshCache()));

+    // connect the reboot-notify DBus request
+    connect(m_interface, SIGNAL(aptNotifyReboot()),
+            m_trayIcon, SLOT(showRebootNotificationApt()));
+
     // connect the watch transaction coming from the updater icon to our
watcher
 //     connect(m_updateIcon, SIGNAL(watchTransaction(const QString &, bool)),
 //             m_transWatcher, SLOT(watchTransaction(const QString &, bool)));
diff --git a/Sentinel/DBusInterface.cpp b/Sentinel/DBusInterface.cpp
index e71a4f8..8e0af0c 100644
--- a/Sentinel/DBusInterface.cpp
+++ b/Sentinel/DBusInterface.cpp
@@ -64,6 +64,11 @@ void DBusInterface::CheckForUpdates(bool system_ready)
     emit checkForUpdates(system_ready);
 }

+void DBusInterface::AptNotifyReboot()
+{
+    emit aptNotifyReboot();
+}
+
 void DBusInterface::SetupDebconfDialog(const QString &tid, const QString
&socketPath, uint xidParent)
 {
 #ifdef HAVE_DEBCONFKDE
diff --git a/Sentinel/DBusInterface.h b/Sentinel/DBusInterface.h
index 9b79c94..cfc7c6f 100644
--- a/Sentinel/DBusInterface.h
+++ b/Sentinel/DBusInterface.h
@@ -41,10 +41,14 @@ public:
     void CheckForUpdates(bool system_ready);
     void SetupDebconfDialog(const QString &tid, const QString &socketPath,
uint xidParent);

+    void AptNotifyReboot();
+
 signals:
     void checkForUpdates(bool system_ready);
     void refreshCache();

+    void aptNotifyReboot();
+
 private slots:
     void debconfActivate();
     void transactionFinished();
diff --git a/Sentinel/TransactionWatcher.cpp b/Sentinel/TransactionWatcher.cpp
index d0f16b5..3f8ce3f 100644
--- a/Sentinel/TransactionWatcher.cpp
+++ b/Sentinel/TransactionWatcher.cpp
@@ -151,6 +151,29 @@ void TransactionWatcher::setCurrentTransaction(const
QString &tid)
     }
 }

+void TransactionWatcher::showRebootNotificationApt() {
+    // Create the notification about this transaction
+    KNotification *notify = new KNotification("RestartRequired");
+    QString text("<b>" + i18n("The system update has completed") + "</b>");
+    text.append("<br>" +
PkStrings::restartType(PackageKit::Package::RestartSystem));
+
notify->setPixmap(PkIcons::restartIcon(PackageKit::Package::RestartSystem).pixmap(KPK_ICON_SIZE,
KPK_ICON_SIZE));
+    notify->setText(text);
+    notify->sendEvent();
+
+    m_restartType = Package::RestartSystem;
+
+    if (m_restartSNI == 0) {
+        m_restartSNI = new StatusNotifierItem(this);
+        connect(m_restartSNI, SIGNAL(activateRequested(bool,QPoint)),
+                this, SLOT(logout()));
+        // Right click shows HIDE action
+        QAction *action;
+        action = m_restartSNI->contextMenu()->addAction(i18n("Hide"));
+        connect(action, SIGNAL(triggered(bool)),
+                 this, SLOT(hideRestartIcon()));
+    }
+}
+
 void TransactionWatcher::finished(PackageKit::Transaction::Exit exit)
 {
     // check if the transaction emitted any require restart
diff --git a/Sentinel/TransactionWatcher.h b/Sentinel/TransactionWatcher.h
index bf98201..5e1f833 100644
--- a/Sentinel/TransactionWatcher.h
+++ b/Sentinel/TransactionWatcher.h
@@ -55,6 +55,9 @@ private slots:
     void hideMessageIcon();
     void hideRestartIcon();

+public slots:
+    void showRebootNotificationApt();
+
 private:
     void suppressSleep(bool enable, const QString &reason = QString());
     void setCurrentTransaction(const QString &tid);
diff --git a/Sentinel/org.kde.ApperSentinel.xml
b/Sentinel/org.kde.ApperSentinel.xml
index 673a497..1d2a813 100644
--- a/Sentinel/org.kde.ApperSentinel.xml
+++ b/Sentinel/org.kde.ApperSentinel.xml
@@ -11,5 +11,7 @@
            <arg type="s" name="socket_path" direction="in" />
            <arg type="u" name="xid_parent" direction="in" />
        </method>
+       <method name="AptNotifyReboot" >
+       </method>
    </interface>
 </node>
diff --git a/apperd/ApperdThread.cpp b/apperd/ApperdThread.cpp
index d10a3f4..e1f3122 100644
--- a/apperd/ApperdThread.cpp
+++ b/apperd/ApperdThread.cpp
@@ -37,6 +37,8 @@

 #include <KDebug>

+#include "reboot_listener.h"
+
 #define FIVE_MIN 360000
 #define ONE_MIN   72000

@@ -51,7 +53,8 @@
 ApperdThread::ApperdThread(QObject *parent) :
     QObject(parent),
     m_actRefreshCacheChecked(false),
-    m_refreshCacheInterval(Enum::TimeIntervalDefault)
+    m_refreshCacheInterval(Enum::TimeIntervalDefault),
+    m_AptRebootListener(new reboot_listener_t(this))
 {
     // Make all our init code run on the thread since
     // the DBus calls were made blocking
@@ -133,6 +136,10 @@ void ApperdThread::init()
         transactionListChanged(reply.value()); // In case of a running
transaction fire up sentinel
     }

+    // listen to Debian/Apt reboot signals from other sources (apt)
+    connect(m_AptRebootListener, SIGNAL(request_reboot()),
this,SLOT(aptNotifyReboot()));
+    QTimer::singleShot(2 /*minutes*/ * 60 /*seconds*/ * 1000 /*msec*/,
m_AptRebootListener, SLOT(check_for_reboot()));
+
     // read the current settings
     configFileChanged();
 }
@@ -170,6 +177,12 @@ void ApperdThread::poll()
     }
 }

+void ApperdThread::aptNotifyReboot()
+{
+    // Notify user about restart by calling ApperSentinel
+    callApperSentinel(QLatin1String("AptNotifyReboot"));
+}
+
 void ApperdThread::configFileChanged()
 {
     KConfig config("apper");
diff --git a/apperd/ApperdThread.h b/apperd/ApperdThread.h
index 12c279a..86b2ae6 100644
--- a/apperd/ApperdThread.h
+++ b/apperd/ApperdThread.h
@@ -26,6 +26,8 @@
 #include <QDBusConnection>
 #include <QDateTime>

+class reboot_listener_t;
+
 class ApperdThread : public QObject
 {
     Q_OBJECT
@@ -42,6 +44,8 @@ private slots:
     void updatesChanged();
     void serviceOwnerChanged(const QString &serviceName, const QString
&oldOwner, const QString &newOwner);

+    void aptNotifyReboot();
+
 private:
     void callApperSentinel(const QString &method,
                            const QList<QVariant> &arguments =
QList<QVariant>());
@@ -57,6 +61,9 @@ private:
     uint m_refreshCacheInterval;
     QTimer *m_qtimer;
     QThread *m_thread;
+
+    // Apt reboot listener
+    reboot_listener_t *m_AptRebootListener;
 };

 #endif // APPERDTHREAD_H
diff --git a/apperd/CMakeLists.txt b/apperd/CMakeLists.txt
index ebc84fc..66f6c80 100644
--- a/apperd/CMakeLists.txt
+++ b/apperd/CMakeLists.txt
@@ -1,5 +1,6 @@
 kde4_add_plugin(kded_apperd
     ApperdThread.cpp
+    reboot_listener.cpp
     apperd.cpp
 )

diff --git a/apperd/reboot_listener.cpp b/apperd/reboot_listener.cpp
new file mode 100644
index 0000000..c252248
--- /dev/null
+++ b/apperd/reboot_listener.cpp
@@ -0,0 +1,60 @@
+/*
+    Copyright (c) 2010 Sune Vuorela <sune@vuorela.dk>
+
+    Permission is hereby granted, free of charge, to any person
+    obtaining a copy of this software and associated documentation
+    files (the "Software"), to deal in the Software without
+    restriction, including without limitation the rights to use,
+    copy, modify, merge, publish, distribute, sublicense, and/or sell
+    copies of the Software, and to permit persons to whom the
+    Software is furnished to do so, subject to the following
+    conditions:
+
+    The above copyright notice and this permission notice shall be
+    included in all copies or substantial portions of the Software.
+
+    THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+    EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+    OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+    NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+    HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+    WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+    FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+    OTHER DEALINGS IN THE SOFTWARE.
+
+*/
+
+#include "reboot_listener.h"
+#include <QFileSystemWatcher>
+#include <QDebug>
+#include <KDirWatch>
+#include <QTimer>
+#include <QFile>
+
+static const char reboot_required_path[] = "/var/run/reboot-required";
+
+reboot_listener_t::reboot_listener_t(QObject* parent): QObject(parent) {
+  m_watcher = new KDirWatch(this);
+  m_watcher->addFile(QString::fromLatin1(reboot_required_path));
+
connect(m_watcher,SIGNAL(created(QString)),this,SLOT(directory_changed_slot(QString)));
+  m_timer = new QTimer(this);
+  m_timer->setSingleShot(true);
+  m_timer->setInterval(500);
+  connect(m_timer,SIGNAL(timeout()),SIGNAL(request_reboot()));
+}
+void reboot_listener_t::check_for_reboot() {
+  if(QFile::exists(QString::fromLatin1(reboot_required_path))) {
+    m_timer->start();
+  }
+}
+
+
+void reboot_listener_t::directory_changed_slot(const QString& path) {
+  if(path==QLatin1String(reboot_required_path)) {
+     m_timer->start();
+  }
+}
+
+
+
+#include <reboot_listener.moc>
diff --git a/apperd/reboot_listener.h b/apperd/reboot_listener.h
new file mode 100644
index 0000000..57c48a8
--- /dev/null
+++ b/apperd/reboot_listener.h
@@ -0,0 +1,50 @@
+/*
+    Copyright (c) 2010 Sune Vuorela <sune@vuorela.dk>
+
+    Permission is hereby granted, free of charge, to any person
+    obtaining a copy of this software and associated documentation
+    files (the "Software"), to deal in the Software without
+    restriction, including without limitation the rights to use,
+    copy, modify, merge, publish, distribute, sublicense, and/or sell
+    copies of the Software, and to permit persons to whom the
+    Software is furnished to do so, subject to the following
+    conditions:
+
+    The above copyright notice and this permission notice shall be
+    included in all copies or substantial portions of the Software.
+
+    THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+    EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+    OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+    NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+    HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+    WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+    FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+    OTHER DEALINGS IN THE SOFTWARE.
+
+*/
+
+#ifndef REBOOT_LISTENER_H
+#define REBOOT_LISTENER_H
+
+#include <QObject>
+
+class KDirWatch;
+class QTimer;
+
+class reboot_listener_t : public QObject {
+  Q_OBJECT
+  public:
+    reboot_listener_t(QObject* parent=0);
+  Q_SIGNALS:
+    void request_reboot();
+  public Q_SLOTS:
+    void check_for_reboot();
+  private Q_SLOTS:
+    void directory_changed_slot(const QString& path);
+  private:
+    KDirWatch* m_watcher;
+    QTimer* m_timer;
+};
+
+#endif // REBOOT_LISTENER_H


unblock apper/0.7.2-5

-- System Information:
Debian Release: wheezy/sid
Architecture: amd64 (x86_64)
Foreign Architectures: i386


Reply to: