Kaydet (Commit) aaffc591 authored tarafından Bahadır Kandemir's avatar Bahadır Kandemir

Don't use py_call_method() to call COMAR methods in CSL scripts. Open

a private D-Bus connection instead.
üst 43cbf9fc
...@@ -75,10 +75,9 @@ c_call(PyObject *self, PyObject *args) ...@@ -75,10 +75,9 @@ c_call(PyObject *self, PyObject *args)
* @return Called method's reply * @return Called method's reply
*/ */
PyObject *tuple = NULL; PyObject *ret, *tuple = NULL;
PyObject *result; char *app, *model, *method, *interface, *path;
char *app, *model, *method; int size, i;
int ret;
if (!PyArg_ParseTuple(args, "sss|O", &app, &model, &method, &tuple)) if (!PyArg_ParseTuple(args, "sss|O", &app, &model, &method, &tuple))
return NULL; return NULL;
...@@ -88,21 +87,76 @@ c_call(PyObject *self, PyObject *args) ...@@ -88,21 +87,76 @@ c_call(PyObject *self, PyObject *args)
tuple = PyTuple_New(0); tuple = PyTuple_New(0);
} }
if (db_check_model(app, model) && model_lookup_method(model, method) != -1) { DBusConnection *conn;
ret = py_call_method(app, model, method, tuple, &result); DBusError err;
DBusMessage *msg, *reply;
DBusMessageIter iter;
if (ret == 0) { dbus_error_init(&err);
return result; conn = dbus_bus_get_private(DBUS_BUS_SYSTEM, &err);
} if (dbus_error_is_set(&err)) {
else if (ret == 1) { PyErr_SetString(PyExc_Exception, "Unable to open connection for call() method.");
PyErr_SetString(PyExc_Exception, "Internal error, unable to find script."); dbus_error_free(&err);
}
return NULL; return NULL;
} }
size = strlen(cfg_bus_interface) + 1 + strlen(model) + 1;
interface = malloc(size);
snprintf(interface, size, "%s.%s", cfg_bus_interface, model);
interface[size - 1] = '\0';
size = strlen("/package/") + strlen(app) + 1;
path = malloc(size);
snprintf(path, size, "/package/%s", app);
path[size - 1] = '\0';
msg = dbus_message_new_method_call(cfg_bus_name, path, interface, method);
free(interface);
free(path);
dbus_message_iter_init_append(msg, &iter);
if (PyTuple_Check(tuple)) {
if (PyTuple_Size(tuple) > 0) {
for (i = 0; i < PyTuple_Size(tuple); i++) {
if (dbus_py_export(&iter, PyTuple_GetItem(tuple, i)) != 0) {
return NULL;
}
}
}
}
else { else {
PyErr_SetString(PyExc_Exception, "Invalid application, model or method."); if (dbus_py_export(&iter, tuple) != 0) {
return NULL;
}
}
reply = dbus_connection_send_with_reply_and_block(conn, msg, -1, &err);
dbus_message_unref(msg);
dbus_connection_close(conn);
dbus_connection_unref(conn);
if (dbus_error_is_set(&err)) {
PyErr_Format(PyExc_Exception, "Unable to call method: %s", err.message);
dbus_error_free(&err);
return NULL; return NULL;
} }
switch (dbus_message_get_type(reply)) {
case DBUS_MESSAGE_TYPE_METHOD_RETURN:
ret = PyList_AsTuple(dbus_py_import(reply));
if (PyTuple_Size(ret) == 1) {
ret = PyTuple_GetItem(ret, 0);
}
dbus_message_unref(reply);
return ret;
case DBUS_MESSAGE_TYPE_ERROR:
PyErr_SetString(PyExc_Exception, dbus_message_get_error_name(reply));
dbus_message_unref(reply);
return NULL;
}
Py_INCREF(Py_None);
return Py_None;
} }
//! CSL method: notify(model, signal, message) //! CSL method: notify(model, signal, message)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment