TIVI-320: Add dbus-python to repos to support connman-test
[profile/ivi/dbus-python.git] / _dbus_bindings / exceptions.c
1 /* D-Bus exception base classes.
2  *
3  * Copyright (C) 2006 Collabora Ltd. <http://www.collabora.co.uk/>
4  *
5  * Permission is hereby granted, free of charge, to any person
6  * obtaining a copy of this software and associated documentation
7  * files (the "Software"), to deal in the Software without
8  * restriction, including without limitation the rights to use, copy,
9  * modify, merge, publish, distribute, sublicense, and/or sell copies
10  * of the Software, and to permit persons to whom the Software is
11  * furnished to do so, subject to the following conditions:
12  *
13  * The above copyright notice and this permission notice shall be
14  * included in all copies or substantial portions of the Software.
15  *
16  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19  * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
20  * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
21  * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
22  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
23  * DEALINGS IN THE SOFTWARE.
24  */
25
26 #include "dbus_bindings-internal.h"
27
28 static PyObject *imported_dbus_exception = NULL;
29
30 static dbus_bool_t
31 import_exception(void)
32 {
33     PyObject *name;
34     PyObject *exceptions;
35
36     if (imported_dbus_exception != NULL) {
37         return TRUE;
38     }
39
40     name = PyString_FromString("dbus.exceptions");
41     if (name == NULL) {
42         return FALSE;
43     }
44     exceptions = PyImport_Import(name);
45     Py_DECREF(name);
46     if (exceptions == NULL) {
47         return FALSE;
48     }
49     imported_dbus_exception = PyObject_GetAttrString(exceptions,
50                                                      "DBusException");
51     Py_DECREF(exceptions);
52
53     return (imported_dbus_exception != NULL);
54 }
55
56 PyObject *
57 DBusPyException_SetString(const char *msg)
58 {
59     if (imported_dbus_exception != NULL || import_exception()) {
60         PyErr_SetString(imported_dbus_exception, msg);
61     }
62     return NULL;
63 }
64
65 PyObject *
66 DBusPyException_ConsumeError(DBusError *error)
67 {
68     PyObject *exc_value = NULL;
69
70     if (imported_dbus_exception == NULL && !import_exception()) {
71         goto finally;
72     }
73
74     exc_value = PyObject_CallFunction(imported_dbus_exception,
75                                       "s",
76                                       error->message ? error->message
77                                                      : "");
78     if (error->name) {
79         PyObject *name = PyString_FromString(error->name);
80         int ret;
81
82         if (!name)
83             goto finally;
84         ret = PyObject_SetAttrString(exc_value, "_dbus_error_name", name);
85         Py_DECREF(name);
86         if (ret < 0) {
87             goto finally;
88         }
89     }
90
91     PyErr_SetObject(imported_dbus_exception, exc_value);
92
93 finally:
94     Py_XDECREF(exc_value);
95     dbus_error_free(error);
96     return NULL;
97 }
98
99 /* vim:set ft=c cino< sw=4 sts=4 et: */