~aptdaemon-developers/aptdaemon/glib

« back to all changes in this revision

Viewing changes to aptdaemon/errors.py

  • Committer: Sebastian Heinlein
  • Date: 2012-12-30 07:36:15 UTC
  • mfrom: (658.2.227 aptdaemon)
  • Revision ID: devel@glatzor.de-20121230073615-7kh8omvn9f3ucsxo
Merge with trunk

Show diffs side-by-side

added added

removed removed

Lines of Context:
17
17
# with this program; if not, write to the Free Software Foundation, Inc.,
18
18
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
19
19
 
20
 
__author__  = "Sebastian Heinlein <devel@glatzor.de>"
 
20
__author__ = "Sebastian Heinlein <devel@glatzor.de>"
21
21
 
22
22
__all__ = ("AptDaemonError", "ForeignTransaction", "InvalidMetaDataError",
23
23
           "InvalidProxyError", "RepositoryInvalidError",
24
24
           "TransactionAlreadyRunning", "TransactionCancelled",
 
25
           "TransactionAlreadySimulating",
25
26
           "TransactionFailed", "TransactionRoleAlreadySet",
26
27
           "NotAuthorizedError", "convert_dbus_exception",
27
28
           "get_native_exception")
28
29
 
29
30
import inspect
 
31
from functools import wraps
 
32
import sys
 
33
 
30
34
import dbus
31
 
from functools import wraps
32
35
 
33
36
import aptdaemon.enums
34
37
 
 
38
PY3K = sys.version_info.major > 2
 
39
 
35
40
 
36
41
class AptDaemonError(dbus.DBusException):
37
42
 
48
53
        """Overwrite the DBusException method, since it calls
49
54
        Exception.__str__() internally which doesn't support unicode or
50
55
        or non-ascii encodings."""
51
 
        return self._message.encode("UTF-8")
 
56
        if PY3K:
 
57
            return dbus.DBusException.get_dbus_message(self)
 
58
        else:
 
59
            return self._message.encode("UTF-8")
52
60
 
53
61
 
54
62
class TransactionRoleAlreadySet(AptDaemonError):
65
73
    _dbus_error_name = "org.debian.apt.TransactionAlreadyRunning"
66
74
 
67
75
 
 
76
class TransactionAlreadySimulating(AptDaemonError):
 
77
 
 
78
    """Error if a transaction should be simulated but a simulation is
 
79
    already processed.
 
80
    """
 
81
 
 
82
    _dbus_error_name = "org.debian.apt.TransactionAlreadySimulating"
 
83
 
 
84
 
68
85
class ForeignTransaction(AptDaemonError):
69
86
 
70
87
    """Error if a transaction was initialized by a different user."""
82
99
        if not args:
83
100
            # Avoid string replacements if not used
84
101
            details = details.replace("%", "%%")
85
 
        args = [_convert_unicode(arg) for arg in args]
 
102
        args = tuple([_convert_unicode(arg) for arg in args])
86
103
        details = _convert_unicode(details)
87
 
        AptDaemonError.__init__(self, "%s: %s" % (code, details % args))
88
104
        self.code = code
89
105
        self.details = details
90
106
        self.details_args = args
 
107
        AptDaemonError.__init__(self, "%s: %s" % (code, details % args))
91
108
 
92
 
    def __str__(self):
 
109
    def __unicode__(self):
93
110
        return "Transaction failed: %s\n%s" % \
94
 
               (aptdaemon.enums.get_role_error_from_enum(self.code),
 
111
               (aptdaemon.enums.get_error_string_from_enum(self.code),
95
112
                self.details)
96
113
 
 
114
    def __str__(self):
 
115
        if PY3K:
 
116
            return self.__unicode__()
 
117
        else:
 
118
            return self.__unicode__().encode("utf-8")
 
119
 
97
120
 
98
121
class InvalidMetaDataError(AptDaemonError):
99
122
 
129
152
class PolicyKitError(dbus.DBusException):
130
153
    pass
131
154
 
 
155
 
132
156
class NotAuthorizedError(PolicyKitError):
133
157
 
134
158
    _dbus_error_name = "org.freedesktop.PolicyKit.Error.NotAuthorized"
151
175
    cannot be used on any already decorated method.
152
176
    """
153
177
    argnames, varargs, kwargs, defaults = inspect.getargspec(func)
 
178
 
154
179
    @wraps(func)
155
180
    def _convert_dbus_exception(*args, **kwargs):
156
181
        try:
163
188
            except (IndexError, ValueError):
164
189
                pass
165
190
            else:
166
 
                _args[index] = \
167
 
                        lambda err: error_handler(get_native_exception(err))
 
191
                _args[index] = lambda err: error_handler(
 
192
                    get_native_exception(err))
168
193
                args = tuple(_args)
169
194
        else:
170
 
            kwargs["error_handler"] = \
171
 
                    lambda err: error_handler(get_native_exception(err))
 
195
            kwargs["error_handler"] = lambda err: error_handler(
 
196
                get_native_exception(err))
172
197
        try:
173
198
            return func(*args, **kwargs)
174
 
        except dbus.exceptions.DBusException, error:
 
199
        except dbus.exceptions.DBusException as error:
175
200
            raise get_native_exception(error)
176
201
    return _convert_dbus_exception
177
202
 
 
203
 
178
204
def get_native_exception(error):
179
205
    """Map a DBus exception to a native one. This allows to make use of
180
206
    try/except on the client side without having to check for the error name.
197
223
            return error_cls(dbus_msg)
198
224
    return error
199
225
 
 
226
 
200
227
def _convert_unicode(text, encoding="UTF-8"):
201
228
    """Always return an unicode."""
202
 
    if not isinstance(text, unicode):
 
229
    if PY3K and not isinstance(text, str):
 
230
        text = str(text, encoding, errors="ignore")
 
231
    elif not PY3K and not isinstance(text, unicode):
203
232
        text = unicode(text, encoding, errors="ignore")
204
233
    return text
205
234