/**************************************** * * * * *************************************/ #include #include #include #include #include #include void *thread_func(void *); typedef struct _BzdObject BzdObject; typedef struct _BzdObjectClass BzdObjectClass; GType bzd_object_get_type(void); struct _BzdObject { GObject parent; }; struct _BzdObjectClass { GObjectClass parent; }; static guint bzd_object_signals[2] = { 0 }; #define DDB_TYPE_OBJECT (bzd_object_get_type()) G_DEFINE_TYPE(BzdObject, bzd_object, G_TYPE_OBJECT) gboolean bzd_object_plusone_in_10_min_async(BzdObject *obj, const guint value, DBusGMethodInvocation *context); gboolean bzd_object_plustwo_in_10_min(BzdObject *obj, guint value, guint *ret, GError **err); #include "study_glue.h" static void bzd_object_init(BzdObject *obj) { } static void bzd_object_class_init(BzdObjectClass *obj_class) { bzd_object_signals[0] = g_signal_new ("return_three", G_OBJECT_CLASS_TYPE (obj_class), (GSignalFlags)(G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED), 0, NULL, NULL, g_cclosure_marshal_VOID__UINT, G_TYPE_NONE, 1, G_TYPE_UINT); } /***********************for thread**************************/ typedef struct _ThreadArg { BzdObject *obj; DBusGMethodInvocation *context; guint value; }ThreadArgStr; void *thread_func(void *arg) { ThreadArgStr *pkg = (ThreadArgStr *)arg; sleep(10); dbus_g_method_return(pkg->context, pkg->value+1); g_signal_emit(pkg->obj, bzd_object_signals[0], 0, 3); free(pkg); } /************************************************************/ gboolean bzd_object_plusone_in_10_min_async(BzdObject *obj, const guint value, DBusGMethodInvocation *context) { printf("value = %d\n", value); ThreadArgStr *pkg = NULL; pkg = (ThreadArgStr *)malloc(sizeof(ThreadArgStr)); pkg->obj = obj; pkg->context = context; pkg->value = value; pthread_t tid; if(pthread_create(&tid, NULL, thread_func, (void *)pkg) != 0) { printf("pthread_create------------failed!\n"); } return TRUE; } gboolean bzd_object_plustwo_in_10_min(BzdObject *obj, guint value, guint *ret, GError **err) { printf("value = %d\n", value); (*ret) = value + 2; return TRUE; } int main(int argc, char **argv) { GMainLoop *main_loop = NULL; g_type_init(); if((main_loop = g_main_loop_new(NULL, FALSE)) == NULL) { printf("g_main_loop_new -------------failed!\n"); return 0; } DBusGConnection *connection = NULL; GError *err = NULL; if((connection = dbus_g_bus_get(DBUS_BUS_SESSION, &err)) == NULL) { printf("dbus_g_bus_get---------------failed!\n"); return 0; } DBusGProxy *proxy = NULL; guint request_name_result; proxy = dbus_g_proxy_new_for_name (connection, DBUS_SERVICE_DBUS, DBUS_PATH_DBUS, DBUS_INTERFACE_DBUS); if (!dbus_g_proxy_call(proxy, "RequestName", &err, G_TYPE_STRING, "bzd.object", G_TYPE_UINT, 0, G_TYPE_INVALID, G_TYPE_UINT, &request_name_result, G_TYPE_INVALID)) { printf("Failed to acquire org.example.TestService: %s", err->message); dbus_g_connection_unref(connection); return 0; } dbus_g_object_type_install_info(DDB_TYPE_OBJECT, &dbus_glib_bzd_object_object_info); BzdObject *obj = NULL; obj = g_object_new(DDB_TYPE_OBJECT, NULL); dbus_g_connection_register_g_object(connection, "/bzd/bzd_object", G_OBJECT(obj)); g_main_loop_run(main_loop); dbus_g_connection_unref(connection); return 0; } |