2
# -*- coding: utf-8 -*-
4
Provides an aptdaemon based backend
6
# Copyright (C) 2008-2010 Sebastian Heinlein <devel@glatzor.de>
8
# Licensed under the GNU General Public License Version 2
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.
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.
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.
24
__author__ = "Sebastian Heinlein <devel@glatzor.de>"
26
from gi.repository import Gtk
28
from aptdaemon import enums
30
import aptdaemon.client
31
import aptdaemon.errors
32
import aptdaemon.gtk3widgets
34
import sessioninstaller.errors
37
class AptDaemonBackend(object):
39
"""Provides a graphical test application."""
42
self.ac = aptdaemon.client.AptClient()
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())
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)
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)
62
def _confirm_deps(self, trans, parent, interaction):
63
if not [pkgs for pkgs in trans.dependencies if pkgs]:
65
dia = aptdaemon.gtk3widgets.AptConfirmDialog(trans)
68
dia.set_transient_for(parent)
71
if res == Gtk.ResponseType.OK:
73
raise sessioninstaller.errors.ModifyCancelled
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)
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)
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)
109
def _show_error(self, error, parent):
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:
118
except sessioninstaller.errors.ModifyCancelled, error:
120
except Exception, error:
121
error = aptdaemon.errors.TransactionFailed(enums.ERROR_UNKNOWN,
123
dia = aptdaemon.gtk3widgets.AptErrorDialog(error)
126
dia.set_transient_for(parent)
129
msg = "%s - %s\n%s" % (enums.get_error_string_from_enum(error.code),
130
enums.get_error_description_from_enum(error.code),
132
raise sessioninstaller.errors.ModifyFailed(msg)