static DBusHandlerResult message_cb(DBusConnection *conn, DBusMessage *msg, void *user_data) { pa_dbusobj_server_lookup *sl = user_data; pa_assert(conn); pa_assert(msg); pa_assert(sl); /* pa_log("Got message! type = %s path = %s iface = %s member = %s dest = %s", dbus_message_type_to_string(dbus_message_get_type(msg)), dbus_message_get_path(msg), dbus_message_get_interface(msg), dbus_message_get_member(msg), dbus_message_get_destination(msg)); */ if (dbus_message_get_type(msg) != DBUS_MESSAGE_TYPE_METHOD_CALL) return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; if (dbus_message_is_method_call(msg, DBUS_INTERFACE_INTROSPECTABLE, "Introspect") || (!dbus_message_get_interface(msg) && dbus_message_has_member(msg, "Introspect"))) return handle_introspect(conn, msg, sl); if (dbus_message_is_method_call(msg, DBUS_INTERFACE_PROPERTIES, "Get") || (!dbus_message_get_interface(msg) && dbus_message_has_member(msg, "Get"))) return handle_get(conn, msg, sl); if (dbus_message_is_method_call(msg, DBUS_INTERFACE_PROPERTIES, "Set") || (!dbus_message_get_interface(msg) && dbus_message_has_member(msg, "Set"))) return handle_set(conn, msg, sl); if (dbus_message_is_method_call(msg, DBUS_INTERFACE_PROPERTIES, "GetAll") || (!dbus_message_get_interface(msg) && dbus_message_has_member(msg, "GetAll"))) return handle_get_all(conn, msg, sl); return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; }
/** * MPRISEntryPoint() routes incoming messages to their respective interface * implementation. * * This function is called during dbus_connection_dispatch() */ static DBusHandlerResult MPRISEntryPoint ( DBusConnection *p_conn, DBusMessage *p_from, void *p_this ) { const char *psz_target_interface; const char *psz_interface = dbus_message_get_interface( p_from ); const char *psz_method = dbus_message_get_member( p_from ); DBusError error; if( psz_interface && strcmp( psz_interface, DBUS_INTERFACE_PROPERTIES ) ) psz_target_interface = psz_interface; else { dbus_error_init( &error ); dbus_message_get_args( p_from, &error, DBUS_TYPE_STRING, &psz_target_interface, DBUS_TYPE_INVALID ); if( dbus_error_is_set( &error ) ) { msg_Err( (vlc_object_t*) p_this, "D-Bus error on %s.%s: %s", psz_interface, psz_method, error.message ); dbus_error_free( &error ); return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; } } msg_Dbg( (vlc_object_t*) p_this, "Routing %s.%s D-Bus method call to %s", psz_interface, psz_method, psz_target_interface ); if( !strcmp( psz_target_interface, DBUS_INTERFACE_INTROSPECTABLE ) ) return handle_introspect( p_conn, p_from, p_this ); if( !strcmp( psz_target_interface, DBUS_MPRIS_ROOT_INTERFACE ) ) return handle_root( p_conn, p_from, p_this ); if( !strcmp( psz_target_interface, DBUS_MPRIS_PLAYER_INTERFACE ) ) return handle_player( p_conn, p_from, p_this ); if( !strcmp( psz_target_interface, DBUS_MPRIS_TRACKLIST_INTERFACE ) ) return handle_tracklist( p_conn, p_from, p_this ); return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; }
static DBusHandlerResult handle_dbus_message (DBusConnection * connection, DBusMessage * message, void *data) { int msg_type; msg_type = dbus_message_get_type (message); switch (msg_type) { case DBUS_MESSAGE_TYPE_METHOD_CALL: { const char *method_name; const char *interface_name; method_name = dbus_message_get_member (message); if (method_name == NULL) { fprintf (stderr, "pcb_dbus: Method had no name specified\n"); break; } interface_name = dbus_message_get_interface (message); if (interface_name == NULL) { fprintf (stderr, "pcb_dbus: Method had no interface specified\n"); break; } if (strcmp (interface_name, PCB_DBUS_INTERFACE) == 0) { if (strcmp (method_name, "GetFilename") == 0) { return handle_get_filename (connection, message, data); } fprintf (stderr, "pcb_dbus: Interface '%s' has no method '%s'\n", interface_name, method_name); break; } else if (strcmp (interface_name, PCB_DBUS_ACTIONS_INTERFACE) == 0) { if (strcmp (method_name, "ExecAction") == 0) { return handle_exec_action (connection, message, data); } fprintf (stderr, "pcb_dbus: Interface '%s' has no method '%s'\n", interface_name, method_name); break; } else if (strcmp (interface_name, DBUS_INTERFACE_INTROSPECTABLE) == 0) { if (strcmp (method_name, "Introspect") == 0) { return handle_introspect (connection, message, data); } fprintf (stderr, "pcb_dbus: Interface '%s' has no method '%s'\n", interface_name, method_name); break; } else { fprintf (stderr, "pcb_dbus: Interface '%s' was not recognised\n", interface_name); break; } } break; case DBUS_MESSAGE_TYPE_METHOD_RETURN: fprintf (stderr, "pcb_dbus: DBUG: Method return message\n"); // WON'T ACTUALLY BE ANY UNLESS WE MAKE AN ASYNCRONOUS CALL? break; case DBUS_MESSAGE_TYPE_ERROR: fprintf (stderr, "pcb_dbus: DEBUG: Error message\n"); // HOPE NOT! break; case DBUS_MESSAGE_TYPE_SIGNAL: fprintf (stderr, "pcb_dbus: DEBUG: Signal message\n"); // NONE AT PRESENT break; default: fprintf (stderr, "pcb_dbus: DEBUG: Message type wasn't one we know about!\n"); return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; } return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; }