/** * Server that exposes a method call and waits for it to be called */ void listen() { DBusMessage* msg; DBusMessage* reply; DBusMessageIter args; DBusConnection* conn; DBusError err; int ret; char* param; printf("Listening for method calls\n"); // initialise the error dbus_error_init(&err); // connect to the bus and check for errors conn = dbus_bus_get(DBUS_BUS_SYSTEM, &err); if (dbus_error_is_set(&err)) { fprintf(stderr, "Connection Error (%s)\n", err.message); dbus_error_free(&err); } if (NULL == conn) { fprintf(stderr, "Connection Null\n"); exit(1); } // request our name on the bus and check for errors ret = dbus_bus_request_name(conn, "task.method.server", DBUS_NAME_FLAG_REPLACE_EXISTING , &err); if (dbus_error_is_set(&err)) { fprintf(stderr, "Name Error (%s)\n", err.message); dbus_error_free(&err); } if (DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER != ret) { fprintf(stderr, "Not Primary Owner (%d)\n", ret); exit(1); } // loop, testing for new messages while (true) { // non blocking read of the next available message dbus_connection_read_write(conn, 0); msg = dbus_connection_pop_message(conn); // loop again if we haven't got a message if (NULL == msg) { sleep(1); continue; } printf("hmm\n"); // check this is a method call for the right interface & method if (dbus_message_is_method_call(msg, "task.method.Type", "Method")) reply_to_method_call(msg, conn); // free the message dbus_message_unref(msg); } // close the connection dbus_connection_close(conn); }
int main() { DBusError err; DBusConnection* conn; DBusMessage* msg; int ret; // initialise the errors dbus_error_init( &err ); // connect to the bus conn = dbus_bus_get( DBUS_BUS_SESSION, &err ); if ( dbus_error_is_set( &err ) ) { fprintf( stderr, "Connection Error (%s)\n", err.message ); dbus_error_free( &err ); } if ( NULL == conn ) { _exit( 1 ); } // request a name on the bus ret = dbus_bus_request_name(conn, "dbuscxx.example.calculator.server", DBUS_NAME_FLAG_REPLACE_EXISTING , &err); if (dbus_error_is_set(&err)) { fprintf(stderr, "Name Error (%s)\n", err.message); dbus_error_free(&err); } if (DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER != ret) { _exit(1); } // loop, testing for new messages while ( true ) { // non blocking read of the next available message dbus_connection_read_write( conn, 0 ); msg = dbus_connection_pop_message( conn ); // loop again if we haven't got a message if ( NULL == msg ) { sleep( 1 ); continue; } if ( dbus_message_has_interface(msg, "Calculator.Basic") ) reply_to_method_call( msg, conn ); // free the message dbus_message_unref( msg ); } }
void serve(char *method_name) { DBusMessage* msg; DBusConnection* conn; DBusError err; int ret; if (!method_name) return; log("Listening for method calls [%s]", method_name); dbus_error_init(&err); conn = dbus_bus_get(DBUS_BUS_SYSTEM, &err); if (dbus_error_is_set(&err)) { log("Connection Error (%s)", err.message); dbus_error_free(&err); } if (NULL == conn) { log_err("Connection Null"); exit(1); } ret = dbus_bus_request_name(conn, SERVER, DBUS_NAME_FLAG_REPLACE_EXISTING , &err); if (dbus_error_is_set(&err)) { log_err("Name Error (%s)", err.message); dbus_error_free(&err); } if (DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER != ret) { log_err("Not Primary Owner (%d)", ret); exit(1); } while (true) { dbus_connection_read_write(conn, 0); msg = dbus_connection_pop_message(conn); if (NULL == msg) { sleep(1); continue; } log_dbg("Received\n"); if (dbus_message_is_method_call(msg, INTERFCE, method_name)) reply_to_method_call(msg, conn); dbus_message_unref(msg); } }
void listen_dbus() { DBusMessage *msg; DBusMessageIter arg; DBusConnection *connection; DBusError err; int ret; char *sigvalue; dbus_error_init(&err); /* Connection DBus */ connection = dbus_bus_get(DBUS_BUS_SESSION, &err); if (dbus_error_is_set(&err)) { fprintf(stderr, "Connection Error %s\n", err.message); dbus_error_free(&err); } if (connection == NULL) { return ; } /* set a bus name */ ret = dbus_bus_request_name(connection, "test.wei.dest", DBUS_NAME_FLAG_REPLACE_EXISTING, &err); if (dbus_error_is_set(&err)) { fprintf(stderr, "Name Error %s\n", err.message); dbus_error_free(&err); } if (ret != DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER) { return ; } /* listen someone sinal: from test.signal.Type */ dbus_bus_add_match(connection, "type='signal', interface='test.signal.Type'", &err); dbus_connection_flush(connection); if (dbus_error_is_set(&err)) { fprintf(stderr, "Match Error %s\n", err.message); dbus_error_free(&err); } while (1) { dbus_connection_read_write(connection, 0); msg = dbus_connection_pop_message(connection); if (msg == NULL) { sleep(1); continue; } if (dbus_message_is_signal(msg, "test.signal.Type", "Test")) { if (!dbus_message_iter_init(msg, &arg)) { fprintf(stderr, "Message Has no Param"); } else if (dbus_message_iter_get_arg_type(&arg) != DBUS_TYPE_STRING) { g_printerr("Param is not string"); } else { dbus_message_iter_get_basic(&arg, &sigvalue); } } else if (dbus_message_is_method_call(msg, "test.method.Type", "Method")) { /* XXX: at first, we should compare path */ if (strcmp(dbus_message_get_path(msg), "/test/method/Object") == 0) { reply_to_method_call(msg, connection); } } dbus_message_unref(msg); }//End while }
void asdbus_process_messages (ASDBusFd* fd) { //show_progress ("checking dbus messages for fd = %d", fd->fd); #ifndef ASDBUS_DISPATCH while (ASDBus.session_conn) { DBusMessage *msg; const char *interface, *member; /* non blocking read of the next available message */ dbus_connection_read_write (ASDBus.session_conn, 0); msg = dbus_connection_pop_message (ASDBus.session_conn); if (NULL == msg) { /* show_progress ("no more Dbus messages..."); */ //show_progress("time(%ld):dbus message not received during the timeout - sleeping...", time (NULL)); return; } interface = dbus_message_get_interface (msg); member = dbus_message_get_member (msg); show_debug(__FILE__,__FUNCTION__, __LINE__, "dbus msg iface = \"%s\", member = \"%s\"", interface?interface:"(nil)", member?member:"(nil)"); if (interface == NULL || member == NULL) { show_progress ("time(%ld):dbus message cannot be parsed...", time (NULL)); } else { show_progress ("time(%ld):dbus message received from \"%s\", member \"%s\"", time (NULL), interface, member); if (strcmp (interface, IFACE_SESSION_PRIVATE) == 0) { if (strcmp (member, "QueryEndSession") == 0) { /* must replay yes within 10 seconds */ asdbus_EndSessionOk (); asdbus_Notify ("Session is ending ...", "Checking if it is safe to logout", 0); SaveSession (True); } else if (strcmp (member, "EndSession") == 0) { /*cover_desktop (); display_progress (True, "Session is ending, please wait ..."); */ asdbus_Notify ("Session is ending ...", "Closing apps, please wait.", 0); dbus_connection_read_write (ASDBus.session_conn, 0); /* Yield to let other clients process Session Management requests */ sleep_a_millisec (300); CloseSessionClients (False); /* we want to end to the very end */ } else if (strcmp (member, "Stop") == 0) { asdbus_Notify ("Session is over.", "Bye-bye!", 0); dbus_connection_read_write (ASDBus.session_conn, 0); Done (False, NULL); } } } #if 0 if (dbus_message_is_method_call (msg, "test.method.Type", "Method")) reply_to_method_call (msg, conn); #endif dbus_message_unref (msg); } #else if (ASDBus.session_conn) do { dbus_connection_read_write_dispatch (ASDBus.session_conn, 0); } while (dbus_connection_get_dispatch_status (ASDBus.session_conn) == DBUS_DISPATCH_DATA_REMAINS); #endif }