提交 838d0b04 编写于 作者: D Daniel P. Berrange

Refactor dbus helper methods for method calls

Split the virDBusMethodCall method into a couple of new methods
virDBusCall, virDBusCreateMethod and virDBusCreateMethodV.
Signed-off-by: NDaniel P. Berrange <berrange@redhat.com>
上级 835a1cdf
...@@ -1160,8 +1160,11 @@ virCryptoHashString; ...@@ -1160,8 +1160,11 @@ virCryptoHashString;
# util/virdbus.h # util/virdbus.h
virDBusCall;
virDBusCallMethod; virDBusCallMethod;
virDBusCloseSystemBus; virDBusCloseSystemBus;
virDBusCreateMethod;
virDBusCreateMethodV;
virDBusGetSessionBus; virDBusGetSessionBus;
virDBusGetSystemBus; virDBusGetSystemBus;
virDBusHasSystemBus; virDBusHasSystemBus;
......
...@@ -1051,23 +1051,21 @@ int virDBusMessageDecode(DBusMessage* msg, ...@@ -1051,23 +1051,21 @@ int virDBusMessageDecode(DBusMessage* msg,
# define VIR_DBUS_METHOD_CALL_TIMEOUT_MILLIS 30 * 1000 # define VIR_DBUS_METHOD_CALL_TIMEOUT_MILLIS 30 * 1000
/** /**
* virDBusCallMethod: * virDBusCreateMethodV:
* @conn: a DBus connection * @call: pointer to be filled with a method call message
* @replyout: pointer to receive reply message, or NULL
* @destination: bus identifier of the target service * @destination: bus identifier of the target service
* @path: object path of the target service * @path: object path of the target service
* @iface: the interface of the object * @iface: the interface of the object
* @member: the name of the method in the interface * @member: the name of the method in the interface
* @types: type signature for following method arguments * @types: type signature for following method arguments
* @...: method arguments * @args: method arguments
* *
* This invokes a method on a remote service on the * This creates a DBus method call message and saves a
* DBus bus @conn. The @destination, @path, @iface * pointer to it in @call. The @destination, @path, @iface
* and @member parameters identify the object method to * and @member parameters identify the object method to
* be invoked. The optional @replyout parameter will be * be invoked. The optional @replyout parameter will be
* filled with any reply to the method call. The * filled with any reply to the method call. The method
* virDBusMethodReply method can be used to decode the * can be later invoked using virDBusCall.
* return values.
* *
* The @types parameter is a DBus signature describing * The @types parameter is a DBus signature describing
* the method call parameters which will be provided * the method call parameters which will be provided
...@@ -1168,38 +1166,91 @@ int virDBusMessageDecode(DBusMessage* msg, ...@@ -1168,38 +1166,91 @@ int virDBusMessageDecode(DBusMessage* msg,
* (3, "email", "s", "joe@blogs.com", "age", "i", 35, * (3, "email", "s", "joe@blogs.com", "age", "i", 35,
* "address", "as", 3, "Some house", "Some road", "some city") * "address", "as", 3, "Some house", "Some road", "some city")
*/ */
int virDBusCreateMethodV(DBusMessage **call,
int virDBusCallMethod(DBusConnection *conn, const char *destination,
DBusMessage **replyout, const char *path,
const char *destination, const char *iface,
const char *path, const char *member,
const char *iface, const char *types,
const char *member, va_list args)
const char *types, ...)
{ {
DBusMessage *call = NULL;
DBusMessage *reply = NULL;
DBusError error;
int ret = -1; int ret = -1;
va_list args;
dbus_error_init(&error); if (!(*call = dbus_message_new_method_call(destination,
path,
if (!(call = dbus_message_new_method_call(destination, iface,
path, member))) {
iface,
member))) {
virReportOOMError(); virReportOOMError();
goto cleanup; goto cleanup;
} }
if (virDBusMessageEncodeArgs(*call, types, args) < 0) {
dbus_message_unref(*call);
*call = NULL;
goto cleanup;
}
ret = 0;
cleanup:
return ret;
}
/**
* virDBusCreateMethod:
* @call: pointer to be filled with a method call message
* @destination: bus identifier of the target service
* @path: object path of the target service
* @iface: the interface of the object
* @member: the name of the method in the interface
* @types: type signature for following method arguments
* @...: method arguments
*
* See virDBusCreateMethodV for a description of the
* behaviour of this method.
*/
int virDBusCreateMethod(DBusMessage **call,
const char *destination,
const char *path,
const char *iface,
const char *member,
const char *types, ...)
{
va_list args;
int ret;
va_start(args, types); va_start(args, types);
ret = virDBusMessageEncodeArgs(call, types, args); ret = virDBusCreateMethodV(call, destination, path,
iface, member, types, args);
va_end(args); va_end(args);
if (ret < 0)
goto cleanup;
ret = -1; return ret;
}
/**
* virDBusCall:
* @conn: a DBus connection
* @call: pointer to a message to send
* @replyout: pointer to receive reply message, or NULL
*
* This invokes a method encoded in @call on a remote
* service on the DBus bus @conn. The optional @replyout
* parameter will be filled with any reply to the method
* call. The virDBusMethodReply method can be used to
* decode the return values.
*
* Returns 0 on success, or -1 upon error
*/
int virDBusCall(DBusConnection *conn,
DBusMessage *call,
DBusMessage **replyout)
{
DBusMessage *reply = NULL;
DBusError error;
int ret = -1;
dbus_error_init(&error);
if (!(reply = dbus_connection_send_with_reply_and_block(conn, if (!(reply = dbus_connection_send_with_reply_and_block(conn,
call, call,
...@@ -1219,10 +1270,8 @@ int virDBusCallMethod(DBusConnection *conn, ...@@ -1219,10 +1270,8 @@ int virDBusCallMethod(DBusConnection *conn,
ret = 0; ret = 0;
cleanup: cleanup:
dbus_error_free(&error); dbus_error_free(&error);
if (call)
dbus_message_unref(call);
if (reply) { if (reply) {
if (ret == 0 && replyout) if (ret == 0 && replyout)
*replyout = reply; *replyout = reply;
...@@ -1233,6 +1282,62 @@ cleanup: ...@@ -1233,6 +1282,62 @@ cleanup:
} }
/**
* virDBusCallMethod:
* @conn: a DBus connection
* @replyout: pointer to receive reply message, or NULL
* @destination: bus identifier of the target service
* @path: object path of the target service
* @iface: the interface of the object
* @member: the name of the method in the interface
* @types: type signature for following method arguments
* @...: method arguments
*
* This invokes a method on a remote service on the
* DBus bus @conn. The @destination, @path, @iface
* and @member parameters identify the object method to
* be invoked. The optional @replyout parameter will be
* filled with any reply to the method call. The
* virDBusMethodReply method can be used to decode the
* return values.
*
* The @types parameter is a DBus signature describing
* the method call parameters which will be provided
* as variadic args. See virDBusCreateMethodV for a
* description of this parameter.
*
* Returns: 0 on success, -1 on error
*/
int virDBusCallMethod(DBusConnection *conn,
DBusMessage **replyout,
const char *destination,
const char *path,
const char *iface,
const char *member,
const char *types, ...)
{
DBusMessage *call = NULL;
int ret = -1;
va_list args;
va_start(args, types);
ret = virDBusCreateMethodV(&call, destination, path,
iface, member, types, args);
va_end(args);
if (ret < 0)
goto cleanup;
ret = -1;
ret = virDBusCall(conn, call, replyout);
cleanup:
if (call)
dbus_message_unref(call);
return ret;
}
/** /**
* virDBusMessageRead: * virDBusMessageRead:
* @msg: the reply to decode * @msg: the reply to decode
...@@ -1371,6 +1476,40 @@ DBusConnection *virDBusGetSessionBus(void) ...@@ -1371,6 +1476,40 @@ DBusConnection *virDBusGetSessionBus(void)
return NULL; return NULL;
} }
int virDBusCreateMethod(DBusMessage **call ATTRIBUTE_UNUSED,
const char *destination ATTRIBUTE_UNUSED,
const char *path ATTRIBUTE_UNUSED,
const char *iface ATTRIBUTE_UNUSED,
const char *member ATTRIBUTE_UNUSED,
const char *types ATTRIBUTE_UNUSED, ...)
{
virReportError(VIR_ERR_INTERNAL_ERROR,
"%s", _("DBus support not compiled into this binary"));
return -1;
}
int virDBusCreateMethodV(DBusMessage **call ATTRIBUTE_UNUSED,
const char *destination ATTRIBUTE_UNUSED,
const char *path ATTRIBUTE_UNUSED,
const char *iface ATTRIBUTE_UNUSED,
const char *member ATTRIBUTE_UNUSED,
const char *types ATTRIBUTE_UNUSED,
va_list args ATTRIBUTE_UNUSED)
{
virReportError(VIR_ERR_INTERNAL_ERROR,
"%s", _("DBus support not compiled into this binary"));
return -1;
}
int virDBusCall(DBusConnection *conn ATTRIBUTE_UNUSED,
DBusMessage *call ATTRIBUTE_UNUSED,
DBusMessage **reply ATTRIBUTE_UNUSED)
{
virReportError(VIR_ERR_INTERNAL_ERROR,
"%s", _("DBus support not compiled into this binary"));
return -1;
}
int virDBusCallMethod(DBusConnection *conn ATTRIBUTE_UNUSED, int virDBusCallMethod(DBusConnection *conn ATTRIBUTE_UNUSED,
DBusMessage **reply ATTRIBUTE_UNUSED, DBusMessage **reply ATTRIBUTE_UNUSED,
const char *destination ATTRIBUTE_UNUSED, const char *destination ATTRIBUTE_UNUSED,
......
...@@ -31,6 +31,8 @@ ...@@ -31,6 +31,8 @@
# endif # endif
# include "internal.h" # include "internal.h"
# include <stdarg.h>
void virDBusSetSharedBus(bool shared); void virDBusSetSharedBus(bool shared);
DBusConnection *virDBusGetSystemBus(void); DBusConnection *virDBusGetSystemBus(void);
...@@ -38,6 +40,20 @@ bool virDBusHasSystemBus(void); ...@@ -38,6 +40,20 @@ bool virDBusHasSystemBus(void);
void virDBusCloseSystemBus(void); void virDBusCloseSystemBus(void);
DBusConnection *virDBusGetSessionBus(void); DBusConnection *virDBusGetSessionBus(void);
int virDBusCreateMethod(DBusMessage **call,
const char *destination,
const char *path,
const char *iface,
const char *member,
const char *types, ...);
int virDBusCreateMethodV(DBusMessage **call,
const char *destination,
const char *path,
const char *iface,
const char *member,
const char *types,
va_list args);
int virDBusCallMethod(DBusConnection *conn, int virDBusCallMethod(DBusConnection *conn,
DBusMessage **reply, DBusMessage **reply,
const char *destination, const char *destination,
...@@ -45,6 +61,9 @@ int virDBusCallMethod(DBusConnection *conn, ...@@ -45,6 +61,9 @@ int virDBusCallMethod(DBusConnection *conn,
const char *iface, const char *iface,
const char *member, const char *member,
const char *types, ...); const char *types, ...);
int virDBusCall(DBusConnection *conn,
DBusMessage *call,
DBusMessage **reply);
int virDBusMessageRead(DBusMessage *msg, int virDBusMessageRead(DBusMessage *msg,
const char *types, ...); const char *types, ...);
......
...@@ -24,7 +24,6 @@ ...@@ -24,7 +24,6 @@
# include "virdbus.h" # include "virdbus.h"
# include <stdarg.h>
int virDBusMessageEncodeArgs(DBusMessage* msg, int virDBusMessageEncodeArgs(DBusMessage* msg,
const char *types, const char *types,
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册