~ubuntu-branches/ubuntu/wily/sessioninstaller/wily-proposed

« back to all changes in this revision

Viewing changes to .pc/fix-defer-callback.patch/sessioninstaller/backends/aptd.py

  • Committer: Package Import Robot
  • Author(s): Martin Pitt
  • Date: 2012-08-21 08:50:56 UTC
  • mfrom: (1.1.9)
  • Revision ID: package-import@ubuntu.com-20120821085056-y14a277r80llr45f
Tags: 0.20+bzr131-0ubuntu1
* debian/control: Update Vcs-* to Quantal branch.
* New upstream snapshot:
  - Fix typo in error message. (LP: #790500)
  - Make sure not to accidentally call defer.callback() twice (LP #848605)
  - Work around static vs. GI gobject binding crash. (LP: #1028640)
* Drop fix-defer-callback.patch, included upstream.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
#!/usr/bin/env python
2
 
# -*- coding: utf-8 -*-
3
 
"""
4
 
Provides an aptdaemon based backend
5
 
"""
6
 
# Copyright (C) 2008-2010 Sebastian Heinlein <devel@glatzor.de>
7
 
#
8
 
# Licensed under the GNU General Public License Version 2
9
 
#
10
 
# This program is free software; you can redistribute it and/or modify
11
 
# it under the terms of the GNU General Public License as published by
12
 
# the Free Software Foundation; either version 2 of the License, or
13
 
# (at your option) any later version.
14
 
#
15
 
# This program is distributed in the hope that it will be useful,
16
 
# but WITHOUT ANY WARRANTY; without even the implied warranty of
17
 
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18
 
# GNU General Public License for more details.
19
 
#
20
 
# You should have received a copy of the GNU General Public License
21
 
# along with this program; if not, write to the Free Software
22
 
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
23
 
 
24
 
__author__ = "Sebastian Heinlein <devel@glatzor.de>"
25
 
 
26
 
from gi.repository import Gtk
27
 
 
28
 
from aptdaemon import enums
29
 
import defer
30
 
import aptdaemon.client
31
 
import aptdaemon.errors
32
 
import aptdaemon.gtk3widgets
33
 
 
34
 
import sessioninstaller.errors
35
 
 
36
 
 
37
 
class AptDaemonBackend(object):
38
 
 
39
 
    """Provides a graphical test application."""
40
 
 
41
 
    def __init__(self):
42
 
        self.ac = aptdaemon.client.AptClient()
43
 
 
44
 
    def _run_trans(self, trans, parent, interaction):
45
 
        deferred = defer.Deferred()
46
 
        dia = aptdaemon.gtk3widgets.AptProgressDialog(trans)
47
 
        dia.connect("finished", lambda x: deferred.callback())
48
 
        if parent:
49
 
            dia.realize()
50
 
            dia.set_transient_for(parent)
51
 
        dia.run(close_on_finished=True, show_error=True,
52
 
                reply_handler=lambda: True,
53
 
                error_handler=deferred.errback)
54
 
        return deferred
55
 
 
56
 
    def _simulate_trans(self, trans, parent, interaction):
57
 
        deferred = defer.Deferred()
58
 
        trans.simulate(reply_handler=lambda: deferred.callback(trans),
59
 
                       error_handler=deferred.errback)
60
 
        return deferred
61
 
 
62
 
    def _confirm_deps(self, trans, parent, interaction):
63
 
        if not [pkgs for pkgs in trans.dependencies if pkgs]:
64
 
            return trans
65
 
        dia = aptdaemon.gtk3widgets.AptConfirmDialog(trans)
66
 
        if parent:
67
 
            dia.realize()
68
 
            dia.set_transient_for(parent)
69
 
        res = dia.run()
70
 
        dia.hide()
71
 
        if res == Gtk.ResponseType.OK:
72
 
            return trans
73
 
        raise sessioninstaller.errors.ModifyCancelled
74
 
 
75
 
    def install_packages(self, xid, package_names, interaction):
76
 
        deferred = defer.Deferred()
77
 
        parent = None # should get from XID, but removed from Gdk 3
78
 
        self.ac.install_packages(package_names, reply_handler=deferred.callback,
79
 
                                 error_handler=deferred.errback)
80
 
        deferred.add_callback(self._simulate_trans, parent, interaction)
81
 
        deferred.add_callback(self._confirm_deps, parent, interaction)
82
 
        deferred.add_callback(self._run_trans, parent, interaction)
83
 
        deferred.add_errback(self._show_error, parent)
84
 
        return deferred
85
 
 
86
 
    def install_package_files(self, xid, files, interaction):
87
 
        deferred = defer.Deferred()
88
 
        parent = None # should get from XID, but removed from Gdk 3
89
 
        #FIXME: Add support for installing serveral files at the same time
90
 
        self.ac.install_file(files[0], reply_handler=deferred.callback,
91
 
                             error_handler=deferred.errback)
92
 
        deferred.add_callback(self._simulate_trans, parent, interaction)
93
 
        deferred.add_callback(self._confirm_deps, parent, interaction)
94
 
        deferred.add_callback(self._run_trans, parent, interaction)
95
 
        deferred.add_errback(self._show_error, parent)
96
 
        return deferred
97
 
 
98
 
    def remove_packages(self, xid, package_names, interaction):
99
 
        deferred = defer.Deferred()
100
 
        parent = None # should get from XID, but removed from Gdk 3
101
 
        self.ac.remove_packages(package_names, reply_handler=deferred.callback,
102
 
                                error_handler=deferred.errback)
103
 
        deferred.add_callback(self._simulate_trans, parent, interaction)
104
 
        deferred.add_callback(self._confirm_deps, parent, interaction)
105
 
        deferred.add_callback(self._run_trans, parent, interaction)
106
 
        deferred.add_errback(self._show_error, parent)
107
 
        return deferred
108
 
 
109
 
    def _show_error(self, error, parent):
110
 
        try:
111
 
            error.raise_exception()
112
 
        except aptdaemon.errors.NotAuthorizedError:
113
 
            raise sessioninstaller.errors.ModifyForbidden
114
 
        except aptdaemon.errors.TransactionCancelled:
115
 
            raise sessioninstaller.errors.ModifyCancelled
116
 
        except aptdaemon.errors.TransactionFailed, error:
117
 
            pass
118
 
        except sessioninstaller.errors.ModifyCancelled, error:
119
 
            raise error
120
 
        except Exception, error:
121
 
            error = aptdaemon.errors.TransactionFailed(enums.ERROR_UNKNOWN,
122
 
                                                       str(error))
123
 
        dia = aptdaemon.gtk3widgets.AptErrorDialog(error)
124
 
        if parent:
125
 
            dia.realize()
126
 
            dia.set_transient_for(parent)
127
 
        dia.run()
128
 
        dia.hide()
129
 
        msg = "%s - %s\n%s" % (enums.get_error_string_from_enum(error.code),
130
 
                              enums.get_error_description_from_enum(error.code),
131
 
                              error.details)
132
 
        raise sessioninstaller.errors.ModifyFailed(msg)
133
 
 
134
 
 
135
 
# vim:ts=4:sw=4:et