summaryrefslogtreecommitdiff
path: root/tools/bluetooth-player.c
diff options
context:
space:
mode:
authorLuiz Augusto von Dentz <luiz.von.dentz@intel.com>2017-12-08 08:52:51 -0200
committerJohan Hedberg <johan.hedberg@intel.com>2017-12-08 13:06:14 +0200
commita469cdb8be01179a5b9e1b255a8bc32c971fcaf5 (patch)
tree1f09ad5308af738ae704b715dfe99df386405be9 /tools/bluetooth-player.c
parentc235db8066b291092463aae6192a1c8de927ec55 (diff)
downloadbluez-a469cdb8be01179a5b9e1b255a8bc32c971fcaf5.tar.gz
tools/bluetooth-player: Use bt_shell helpers
This makes bluetooth-player use bt_shell to manage the menus and command handling.
Diffstat (limited to 'tools/bluetooth-player.c')
-rw-r--r--tools/bluetooth-player.c499
1 files changed, 100 insertions, 399 deletions
diff --git a/tools/bluetooth-player.c b/tools/bluetooth-player.c
index c95b7497f..f13d8187f 100644
--- a/tools/bluetooth-player.c
+++ b/tools/bluetooth-player.c
@@ -30,15 +30,12 @@
#include <errno.h>
#include <unistd.h>
#include <stdlib.h>
-#include <signal.h>
-#include <sys/signalfd.h>
+#include <string.h>
-#include <readline/readline.h>
-#include <readline/history.h>
#include <glib.h>
#include "gdbus/gdbus.h"
-#include "client/display.h"
+#include "src/shared/shell.h"
/* String display constants */
#define COLORED_NEW COLOR_GREEN "NEW" COLOR_OFF
@@ -61,18 +58,12 @@ static GSList *items = NULL;
static void connect_handler(DBusConnection *connection, void *user_data)
{
- rl_set_prompt(PROMPT_ON);
- printf("\r");
- rl_on_new_line();
- rl_redisplay();
+ bt_shell_set_prompt(PROMPT_ON);
}
static void disconnect_handler(DBusConnection *connection, void *user_data)
{
- rl_set_prompt(PROMPT_OFF);
- printf("\r");
- rl_on_new_line();
- rl_redisplay();
+ bt_shell_set_prompt(PROMPT_OFF);
}
static void cmd_quit(int argc, char *argv[])
@@ -83,7 +74,7 @@ static void cmd_quit(int argc, char *argv[])
static bool check_default_player(void)
{
if (!default_player) {
- rl_printf("No default player available\n");
+ bt_shell_printf("No default player available\n");
return FALSE;
}
@@ -97,12 +88,12 @@ static void play_reply(DBusMessage *message, void *user_data)
dbus_error_init(&error);
if (dbus_set_error_from_message(&error, message) == TRUE) {
- rl_printf("Failed to play: %s\n", error.name);
+ bt_shell_printf("Failed to play: %s\n", error.name);
dbus_error_free(&error);
return;
}
- rl_printf("Play successful\n");
+ bt_shell_printf("Play successful\n");
}
static GDBusProxy *find_item(const char *path)
@@ -125,17 +116,17 @@ static void cmd_play_item(int argc, char *argv[])
proxy = find_item(argv[1]);
if (proxy == NULL) {
- rl_printf("Item %s not available\n", argv[1]);
+ bt_shell_printf("Item %s not available\n", argv[1]);
return;
}
if (g_dbus_proxy_method_call(proxy, "Play", NULL, play_reply,
NULL, NULL) == FALSE) {
- rl_printf("Failed to play\n");
+ bt_shell_printf("Failed to play\n");
return;
}
- rl_printf("Attempting to play %s\n", argv[1]);
+ bt_shell_printf("Attempting to play %s\n", argv[1]);
}
static void cmd_play(int argc, char *argv[])
@@ -148,11 +139,11 @@ static void cmd_play(int argc, char *argv[])
if (g_dbus_proxy_method_call(default_player, "Play", NULL, play_reply,
NULL, NULL) == FALSE) {
- rl_printf("Failed to play\n");
+ bt_shell_printf("Failed to play\n");
return;
}
- rl_printf("Attempting to play\n");
+ bt_shell_printf("Attempting to play\n");
}
static void pause_reply(DBusMessage *message, void *user_data)
@@ -162,12 +153,12 @@ static void pause_reply(DBusMessage *message, void *user_data)
dbus_error_init(&error);
if (dbus_set_error_from_message(&error, message) == TRUE) {
- rl_printf("Failed to pause: %s\n", error.name);
+ bt_shell_printf("Failed to pause: %s\n", error.name);
dbus_error_free(&error);
return;
}
- rl_printf("Pause successful\n");
+ bt_shell_printf("Pause successful\n");
}
static void cmd_pause(int argc, char *argv[])
@@ -177,11 +168,11 @@ static void cmd_pause(int argc, char *argv[])
if (g_dbus_proxy_method_call(default_player, "Pause", NULL,
pause_reply, NULL, NULL) == FALSE) {
- rl_printf("Failed to play\n");
+ bt_shell_printf("Failed to play\n");
return;
}
- rl_printf("Attempting to pause\n");
+ bt_shell_printf("Attempting to pause\n");
}
static void stop_reply(DBusMessage *message, void *user_data)
@@ -191,12 +182,12 @@ static void stop_reply(DBusMessage *message, void *user_data)
dbus_error_init(&error);
if (dbus_set_error_from_message(&error, message) == TRUE) {
- rl_printf("Failed to stop: %s\n", error.name);
+ bt_shell_printf("Failed to stop: %s\n", error.name);
dbus_error_free(&error);
return;
}
- rl_printf("Stop successful\n");
+ bt_shell_printf("Stop successful\n");
}
static void cmd_stop(int argc, char *argv[])
@@ -206,11 +197,11 @@ static void cmd_stop(int argc, char *argv[])
if (g_dbus_proxy_method_call(default_player, "Stop", NULL, stop_reply,
NULL, NULL) == FALSE) {
- rl_printf("Failed to stop\n");
+ bt_shell_printf("Failed to stop\n");
return;
}
- rl_printf("Attempting to stop\n");
+ bt_shell_printf("Attempting to stop\n");
}
static void next_reply(DBusMessage *message, void *user_data)
@@ -220,12 +211,12 @@ static void next_reply(DBusMessage *message, void *user_data)
dbus_error_init(&error);
if (dbus_set_error_from_message(&error, message) == TRUE) {
- rl_printf("Failed to jump to next: %s\n", error.name);
+ bt_shell_printf("Failed to jump to next: %s\n", error.name);
dbus_error_free(&error);
return;
}
- rl_printf("Next successful\n");
+ bt_shell_printf("Next successful\n");
}
static void cmd_next(int argc, char *argv[])
@@ -235,11 +226,11 @@ static void cmd_next(int argc, char *argv[])
if (g_dbus_proxy_method_call(default_player, "Next", NULL, next_reply,
NULL, NULL) == FALSE) {
- rl_printf("Failed to jump to next\n");
+ bt_shell_printf("Failed to jump to next\n");
return;
}
- rl_printf("Attempting to jump to next\n");
+ bt_shell_printf("Attempting to jump to next\n");
}
static void previous_reply(DBusMessage *message, void *user_data)
@@ -249,12 +240,12 @@ static void previous_reply(DBusMessage *message, void *user_data)
dbus_error_init(&error);
if (dbus_set_error_from_message(&error, message) == TRUE) {
- rl_printf("Failed to jump to previous: %s\n", error.name);
+ bt_shell_printf("Failed to jump to previous: %s\n", error.name);
dbus_error_free(&error);
return;
}
- rl_printf("Previous successful\n");
+ bt_shell_printf("Previous successful\n");
}
static void cmd_previous(int argc, char *argv[])
@@ -264,11 +255,11 @@ static void cmd_previous(int argc, char *argv[])
if (g_dbus_proxy_method_call(default_player, "Previous", NULL,
previous_reply, NULL, NULL) == FALSE) {
- rl_printf("Failed to jump to previous\n");
+ bt_shell_printf("Failed to jump to previous\n");
return;
}
- rl_printf("Attempting to jump to previous\n");
+ bt_shell_printf("Attempting to jump to previous\n");
}
static void fast_forward_reply(DBusMessage *message, void *user_data)
@@ -278,12 +269,12 @@ static void fast_forward_reply(DBusMessage *message, void *user_data)
dbus_error_init(&error);
if (dbus_set_error_from_message(&error, message) == TRUE) {
- rl_printf("Failed to fast forward: %s\n", error.name);
+ bt_shell_printf("Failed to fast forward: %s\n", error.name);
dbus_error_free(&error);
return;
}
- rl_printf("FastForward successful\n");
+ bt_shell_printf("FastForward successful\n");
}
static void cmd_fast_forward(int argc, char *argv[])
@@ -293,11 +284,11 @@ static void cmd_fast_forward(int argc, char *argv[])
if (g_dbus_proxy_method_call(default_player, "FastForward", NULL,
fast_forward_reply, NULL, NULL) == FALSE) {
- rl_printf("Failed to jump to previous\n");
+ bt_shell_printf("Failed to jump to previous\n");
return;
}
- rl_printf("Fast forward playback\n");
+ bt_shell_printf("Fast forward playback\n");
}
static void rewind_reply(DBusMessage *message, void *user_data)
@@ -307,12 +298,12 @@ static void rewind_reply(DBusMessage *message, void *user_data)
dbus_error_init(&error);
if (dbus_set_error_from_message(&error, message) == TRUE) {
- rl_printf("Failed to rewind: %s\n", error.name);
+ bt_shell_printf("Failed to rewind: %s\n", error.name);
dbus_error_free(&error);
return;
}
- rl_printf("Rewind successful\n");
+ bt_shell_printf("Rewind successful\n");
}
static void cmd_rewind(int argc, char *argv[])
@@ -322,11 +313,11 @@ static void cmd_rewind(int argc, char *argv[])
if (g_dbus_proxy_method_call(default_player, "Rewind", NULL,
rewind_reply, NULL, NULL) == FALSE) {
- rl_printf("Failed to rewind\n");
+ bt_shell_printf("Failed to rewind\n");
return;
}
- rl_printf("Rewind playback\n");
+ bt_shell_printf("Rewind playback\n");
}
static void generic_callback(const DBusError *error, void *user_data)
@@ -334,9 +325,9 @@ static void generic_callback(const DBusError *error, void *user_data)
char *str = user_data;
if (dbus_error_is_set(error))
- rl_printf("Failed to set %s: %s\n", str, error->name);
+ bt_shell_printf("Failed to set %s: %s\n", str, error->name);
else
- rl_printf("Changing %s succeeded\n", str);
+ bt_shell_printf("Changing %s succeeded\n", str);
}
static void cmd_equalizer(int argc, char *argv[])
@@ -347,13 +338,8 @@ static void cmd_equalizer(int argc, char *argv[])
if (!check_default_player())
return;
- if (argc < 2) {
- rl_printf("Missing on/off argument\n");
- return;
- }
-
if (!g_dbus_proxy_get_property(default_player, "Equalizer", &iter)) {
- rl_printf("Operation not supported\n");
+ bt_shell_printf("Operation not supported\n");
return;
}
@@ -363,12 +349,12 @@ static void cmd_equalizer(int argc, char *argv[])
DBUS_TYPE_STRING, &value,
generic_callback, value,
g_free) == FALSE) {
- rl_printf("Failed to setting equalizer\n");
+ bt_shell_printf("Failed to setting equalizer\n");
g_free(value);
return;
}
- rl_printf("Attempting to set equalizer\n");
+ bt_shell_printf("Attempting to set equalizer\n");
}
static void cmd_repeat(int argc, char *argv[])
@@ -379,13 +365,9 @@ static void cmd_repeat(int argc, char *argv[])
if (!check_default_player())
return;
- if (argc < 2) {
- rl_printf("Missing mode argument\n");
- return;
- }
if (!g_dbus_proxy_get_property(default_player, "Repeat", &iter)) {
- rl_printf("Operation not supported\n");
+ bt_shell_printf("Operation not supported\n");
return;
}
@@ -395,12 +377,12 @@ static void cmd_repeat(int argc, char *argv[])
DBUS_TYPE_STRING, &value,
generic_callback, value,
g_free) == FALSE) {
- rl_printf("Failed to set repeat\n");
+ bt_shell_printf("Failed to set repeat\n");
g_free(value);
return;
}
- rl_printf("Attempting to set repeat\n");
+ bt_shell_printf("Attempting to set repeat\n");
}
static void cmd_shuffle(int argc, char *argv[])
@@ -411,13 +393,8 @@ static void cmd_shuffle(int argc, char *argv[])
if (!check_default_player())
return;
- if (argc < 2) {
- rl_printf("Missing mode argument\n");
- return;
- }
-
if (!g_dbus_proxy_get_property(default_player, "Shuffle", &iter)) {
- rl_printf("Operation not supported\n");
+ bt_shell_printf("Operation not supported\n");
return;
}
@@ -427,12 +404,12 @@ static void cmd_shuffle(int argc, char *argv[])
DBUS_TYPE_STRING, &value,
generic_callback, value,
g_free) == FALSE) {
- rl_printf("Failed to set shuffle\n");
+ bt_shell_printf("Failed to set shuffle\n");
g_free(value);
return;
}
- rl_printf("Attempting to set shuffle\n");
+ bt_shell_printf("Attempting to set shuffle\n");
}
static void cmd_scan(int argc, char *argv[])
@@ -443,13 +420,8 @@ static void cmd_scan(int argc, char *argv[])
if (!check_default_player())
return;
- if (argc < 2) {
- rl_printf("Missing mode argument\n");
- return;
- }
-
if (!g_dbus_proxy_get_property(default_player, "Shuffle", &iter)) {
- rl_printf("Operation not supported\n");
+ bt_shell_printf("Operation not supported\n");
return;
}
@@ -459,12 +431,12 @@ static void cmd_scan(int argc, char *argv[])
DBUS_TYPE_STRING, &value,
generic_callback, value,
g_free) == FALSE) {
- rl_printf("Failed to set scan\n");
+ bt_shell_printf("Failed to set scan\n");
g_free(value);
return;
}
- rl_printf("Attempting to set scan\n");
+ bt_shell_printf("Attempting to set scan\n");
}
static char *proxy_description(GDBusProxy *proxy, const char *title,
@@ -487,7 +459,7 @@ static void print_player(GDBusProxy *proxy, const char *description)
str = proxy_description(proxy, "Player", description);
- rl_printf("%s%s\n", str, default_player == proxy ? "[default]" : "");
+ bt_shell_printf("%s%s\n", str, default_player == proxy ? "[default]" : "");
g_free(str);
}
@@ -527,35 +499,35 @@ static void print_iter(const char *label, const char *name,
DBusMessageIter subiter;
if (iter == NULL) {
- rl_printf("%s%s is nil\n", label, name);
+ bt_shell_printf("%s%s is nil\n", label, name);
return;
}
switch (dbus_message_iter_get_arg_type(iter)) {
case DBUS_TYPE_INVALID:
- rl_printf("%s%s is invalid\n", label, name);
+ bt_shell_printf("%s%s is invalid\n", label, name);
break;
case DBUS_TYPE_STRING:
case DBUS_TYPE_OBJECT_PATH:
dbus_message_iter_get_basic(iter, &valstr);
- rl_printf("%s%s: %s\n", label, name, valstr);
+ bt_shell_printf("%s%s: %s\n", label, name, valstr);
break;
case DBUS_TYPE_BOOLEAN:
dbus_message_iter_get_basic(iter, &valbool);
- rl_printf("%s%s: %s\n", label, name,
+ bt_shell_printf("%s%s: %s\n", label, name,
valbool == TRUE ? "yes" : "no");
break;
case DBUS_TYPE_UINT32:
dbus_message_iter_get_basic(iter, &valu32);
- rl_printf("%s%s: 0x%06x\n", label, name, valu32);
+ bt_shell_printf("%s%s: 0x%06x\n", label, name, valu32);
break;
case DBUS_TYPE_UINT16:
dbus_message_iter_get_basic(iter, &valu16);
- rl_printf("%s%s: 0x%04x\n", label, name, valu16);
+ bt_shell_printf("%s%s: 0x%04x\n", label, name, valu16);
break;
case DBUS_TYPE_INT16:
dbus_message_iter_get_basic(iter, &vals16);
- rl_printf("%s%s: %d\n", label, name, vals16);
+ bt_shell_printf("%s%s: %d\n", label, name, vals16);
break;
case DBUS_TYPE_VARIANT:
dbus_message_iter_recurse(iter, &subiter);
@@ -576,7 +548,7 @@ static void print_iter(const char *label, const char *name,
print_iter(label, valstr, &subiter);
break;
default:
- rl_printf("%s%s has unsupported type\n", label, name);
+ bt_shell_printf("%s%s has unsupported type\n", label, name);
break;
}
}
@@ -609,18 +581,13 @@ static void cmd_show_item(int argc, char *argv[])
{
GDBusProxy *proxy;
- if (argc < 2) {
- rl_printf("Missing item address argument\n");
- return;
- }
-
proxy = find_item(argv[1]);
if (!proxy) {
- rl_printf("Item %s not available\n", argv[1]);
+ bt_shell_printf("Item %s not available\n", argv[1]);
return;
}
- rl_printf("Item %s\n", g_dbus_proxy_get_path(proxy));
+ bt_shell_printf("Item %s\n", g_dbus_proxy_get_path(proxy));
print_property(proxy, "Player");
print_property(proxy, "Name");
@@ -646,12 +613,12 @@ static void cmd_show(int argc, char *argv[])
} else {
proxy = find_player(argv[1]);
if (!proxy) {
- rl_printf("Player %s not available\n", argv[1]);
+ bt_shell_printf("Player %s not available\n", argv[1]);
return;
}
}
- rl_printf("Player %s\n", g_dbus_proxy_get_path(proxy));
+ bt_shell_printf("Player %s\n", g_dbus_proxy_get_path(proxy));
print_property(proxy, "Name");
print_property(proxy, "Repeat");
@@ -666,7 +633,7 @@ static void cmd_show(int argc, char *argv[])
if (folder == NULL)
return;
- rl_printf("Folder %s\n", g_dbus_proxy_get_path(proxy));
+ bt_shell_printf("Folder %s\n", g_dbus_proxy_get_path(proxy));
print_property(folder, "Name");
print_property(folder, "NumberOfItems");
@@ -680,7 +647,7 @@ static void cmd_show(int argc, char *argv[])
if (item == NULL)
return;
- rl_printf("Playlist %s\n", path);
+ bt_shell_printf("Playlist %s\n", path);
print_property(item, "Name");
}
@@ -689,14 +656,9 @@ static void cmd_select(int argc, char *argv[])
{
GDBusProxy *proxy;
- if (argc < 2) {
- rl_printf("Missing player address argument\n");
- return;
- }
-
proxy = find_player(argv[1]);
if (proxy == NULL) {
- rl_printf("Player %s not available\n", argv[1]);
+ bt_shell_printf("Player %s not available\n", argv[1]);
return;
}
@@ -714,12 +676,12 @@ static void change_folder_reply(DBusMessage *message, void *user_data)
dbus_error_init(&error);
if (dbus_set_error_from_message(&error, message) == TRUE) {
- rl_printf("Failed to change folder: %s\n", error.name);
+ bt_shell_printf("Failed to change folder: %s\n", error.name);
dbus_error_free(&error);
return;
}
- rl_printf("ChangeFolder successful\n");
+ bt_shell_printf("ChangeFolder successful\n");
}
static void change_folder_setup(DBusMessageIter *iter, void *user_data)
@@ -733,13 +695,8 @@ static void cmd_change_folder(int argc, char *argv[])
{
GDBusProxy *proxy;
- if (argc < 2) {
- rl_printf("Missing item argument\n");
- return;
- }
-
if (dbus_validate_path(argv[1], NULL) == FALSE) {
- rl_printf("Not a valid path\n");
+ bt_shell_printf("Not a valid path\n");
return;
}
@@ -748,17 +705,17 @@ static void cmd_change_folder(int argc, char *argv[])
proxy = find_folder(g_dbus_proxy_get_path(default_player));
if (proxy == NULL) {
- rl_printf("Operation not supported\n");
+ bt_shell_printf("Operation not supported\n");
return;
}
if (g_dbus_proxy_method_call(proxy, "ChangeFolder", change_folder_setup,
change_folder_reply, argv[1], NULL) == FALSE) {
- rl_printf("Failed to change current folder\n");
+ bt_shell_printf("Failed to change current folder\n");
return;
}
- rl_printf("Attempting to change folder\n");
+ bt_shell_printf("Attempting to change folder\n");
}
static void append_variant(DBusMessageIter *iter, int type, void *val)
@@ -832,12 +789,12 @@ static void list_items_reply(DBusMessage *message, void *user_data)
dbus_error_init(&error);
if (dbus_set_error_from_message(&error, message) == TRUE) {
- rl_printf("Failed to list items: %s\n", error.name);
+ bt_shell_printf("Failed to list items: %s\n", error.name);
dbus_error_free(&error);
return;
}
- rl_printf("ListItems successful\n");
+ bt_shell_printf("ListItems successful\n");
}
static void cmd_list_items(int argc, char *argv[])
@@ -850,7 +807,7 @@ static void cmd_list_items(int argc, char *argv[])
proxy = find_folder(g_dbus_proxy_get_path(default_player));
if (proxy == NULL) {
- rl_printf("Operation not supported\n");
+ bt_shell_printf("Operation not supported\n");
return;
}
@@ -864,7 +821,7 @@ static void cmd_list_items(int argc, char *argv[])
errno = 0;
args->start = strtol(argv[1], NULL, 10);
if (errno != 0) {
- rl_printf("%s(%d)\n", strerror(errno), errno);
+ bt_shell_printf("%s(%d)\n", strerror(errno), errno);
g_free(args);
return;
}
@@ -875,7 +832,7 @@ static void cmd_list_items(int argc, char *argv[])
errno = 0;
args->end = strtol(argv[2], NULL, 10);
if (errno != 0) {
- rl_printf("%s(%d)\n", strerror(errno), errno);
+ bt_shell_printf("%s(%d)\n", strerror(errno), errno);
g_free(args);
return;
}
@@ -883,12 +840,12 @@ static void cmd_list_items(int argc, char *argv[])
done:
if (g_dbus_proxy_method_call(proxy, "ListItems", list_items_setup,
list_items_reply, args, g_free) == FALSE) {
- rl_printf("Failed to change current folder\n");
+ bt_shell_printf("Failed to change current folder\n");
g_free(args);
return;
}
- rl_printf("Attempting to list items\n");
+ bt_shell_printf("Attempting to list items\n");
}
static void search_setup(DBusMessageIter *iter, void *user_data)
@@ -915,12 +872,12 @@ static void search_reply(DBusMessage *message, void *user_data)
dbus_error_init(&error);
if (dbus_set_error_from_message(&error, message) == TRUE) {
- rl_printf("Failed to search: %s\n", error.name);
+ bt_shell_printf("Failed to search: %s\n", error.name);
dbus_error_free(&error);
return;
}
- rl_printf("Search successful\n");
+ bt_shell_printf("Search successful\n");
}
static void cmd_search(int argc, char *argv[])
@@ -928,17 +885,12 @@ static void cmd_search(int argc, char *argv[])
GDBusProxy *proxy;
char *string;
- if (argc < 2) {
- rl_printf("Missing string argument\n");
- return;
- }
-
if (check_default_player() == FALSE)
return;
proxy = find_folder(g_dbus_proxy_get_path(default_player));
if (proxy == NULL) {
- rl_printf("Operation not supported\n");
+ bt_shell_printf("Operation not supported\n");
return;
}
@@ -946,12 +898,12 @@ static void cmd_search(int argc, char *argv[])
if (g_dbus_proxy_method_call(proxy, "Search", search_setup,
search_reply, string, g_free) == FALSE) {
- rl_printf("Failed to search\n");
+ bt_shell_printf("Failed to search\n");
g_free(string);
return;
}
- rl_printf("Attempting to search\n");
+ bt_shell_printf("Attempting to search\n");
}
static void add_to_nowplaying_reply(DBusMessage *message, void *user_data)
@@ -961,45 +913,37 @@ static void add_to_nowplaying_reply(DBusMessage *message, void *user_data)
dbus_error_init(&error);
if (dbus_set_error_from_message(&error, message) == TRUE) {
- rl_printf("Failed to queue: %s\n", error.name);
+ bt_shell_printf("Failed to queue: %s\n", error.name);
dbus_error_free(&error);
return;
}
- rl_printf("AddToNowPlaying successful\n");
+ bt_shell_printf("AddToNowPlaying successful\n");
}
static void cmd_queue(int argc, char *argv[])
{
GDBusProxy *proxy;
- if (argc < 2) {
- rl_printf("Missing item address argument\n");
- return;
- }
-
proxy = find_item(argv[1]);
if (proxy == NULL) {
- rl_printf("Item %s not available\n", argv[1]);
+ bt_shell_printf("Item %s not available\n", argv[1]);
return;
}
if (g_dbus_proxy_method_call(proxy, "AddtoNowPlaying", NULL,
add_to_nowplaying_reply, NULL,
NULL) == FALSE) {
- rl_printf("Failed to play\n");
+ bt_shell_printf("Failed to play\n");
return;
}
- rl_printf("Attempting to queue %s\n", argv[1]);
+ bt_shell_printf("Attempting to queue %s\n", argv[1]);
}
-static const struct {
- const char *cmd;
- const char *arg;
- void (*func) (int argc, char *argv[]);
- const char *desc;
-} cmd_table[] = {
+static const struct bt_shell_menu main_menu = {
+ .name = "main",
+ .entries = {
{ "list", NULL, cmd_list, "List available players" },
{ "show", "[player]", cmd_show, "Player information" },
{ "select", "<player>", cmd_select, "Select default player" },
@@ -1030,218 +974,9 @@ static const struct {
{ "quit", NULL, cmd_quit, "Quit program" },
{ "exit", NULL, cmd_quit },
{ "help" },
- {}
-};
-
-static char *cmd_generator(const char *text, int state)
-{
- static int index, len;
- const char *cmd;
-
- if (!state) {
- index = 0;
- len = strlen(text);
- }
-
- while ((cmd = cmd_table[index].cmd)) {
- index++;
-
- if (!strncmp(cmd, text, len))
- return strdup(cmd);
- }
-
- return NULL;
-}
-
-static char **cmd_completion(const char *text, int start, int end)
-{
- char **matches = NULL;
-
- if (start == 0) {
- rl_completion_display_matches_hook = NULL;
- matches = rl_completion_matches(text, cmd_generator);
- }
-
- if (!matches)
- rl_attempted_completion_over = 1;
-
- return matches;
-}
-
-static void rl_handler(char *input)
-{
- int argc;
- char **argv = NULL;
- int i;
-
- if (!input) {
- rl_insert_text("quit");
- rl_redisplay();
- rl_crlf();
- g_main_loop_quit(main_loop);
- return;
- }
-
- if (!strlen(input))
- goto done;
-
- g_strstrip(input);
-
- if (history_search(input, -1))
- add_history(input);
-
- argv = g_strsplit(input, " ", -1);
- if (argv == NULL)
- goto done;
-
- for (argc = 0; argv[argc];)
- argc++;
-
- if (argc == 0)
- goto done;
-
- for (i = 0; cmd_table[i].cmd; i++) {
- if (strcmp(argv[0], cmd_table[i].cmd))
- continue;
-
- if (cmd_table[i].func) {
- cmd_table[i].func(argc, argv);
- goto done;
- }
- }
-
- if (strcmp(argv[0], "help")) {
- printf("Invalid command\n");
- goto done;
- }
-
- printf("Available commands:\n");
-
- for (i = 0; cmd_table[i].cmd; i++) {
- if (cmd_table[i].desc)
- printf("\t%s %s\t%s\n", cmd_table[i].cmd,
- cmd_table[i].arg ? : " ",
- cmd_table[i].desc);
- }
-
-done:
- g_strfreev(argv);
- free(input);
-}
-
-static gboolean option_version = FALSE;
-
-static GOptionEntry options[] = {
- { "version", 'v', 0, G_OPTION_ARG_NONE, &option_version,
- "Show version information and exit" },
- { NULL },
+ {} },
};
-static gboolean signal_handler(GIOChannel *channel, GIOCondition condition,
- gpointer user_data)
-{
- static unsigned int __terminated = 0;
- struct signalfd_siginfo si;
- ssize_t result;
- int fd;
-
- if (condition & (G_IO_NVAL | G_IO_ERR | G_IO_HUP)) {
- g_main_loop_quit(main_loop);
- return FALSE;
- }
-
- fd = g_io_channel_unix_get_fd(channel);
-
- result = read(fd, &si, sizeof(si));
- if (result != sizeof(si))
- return FALSE;
-
- switch (si.ssi_signo) {
- case SIGINT:
- rl_replace_line("", 0);
- rl_crlf();
- rl_on_new_line();
- rl_redisplay();
- break;
- case SIGTERM:
- if (__terminated == 0) {
- rl_replace_line("", 0);
- rl_crlf();
- g_main_loop_quit(main_loop);
- }
-
- __terminated = 1;
- break;
- }
-
- return TRUE;
-}
-
-static guint setup_signalfd(void)
-{
- GIOChannel *channel;
- guint source;
- sigset_t mask;
- int fd;
-
- sigemptyset(&mask);
- sigaddset(&mask, SIGINT);
- sigaddset(&mask, SIGTERM);
-
- if (sigprocmask(SIG_BLOCK, &mask, NULL) < 0) {
- perror("Failed to set signal mask");
- return 0;
- }
-
- fd = signalfd(-1, &mask, 0);
- if (fd < 0) {
- perror("Failed to create signal descriptor");
- return 0;
- }
-
- channel = g_io_channel_unix_new(fd);
-
- g_io_channel_set_close_on_unref(channel, TRUE);
- g_io_channel_set_encoding(channel, NULL, NULL);
- g_io_channel_set_buffered(channel, FALSE);
-
- source = g_io_add_watch(channel,
- G_IO_IN | G_IO_HUP | G_IO_ERR | G_IO_NVAL,
- signal_handler, NULL);
-
- g_io_channel_unref(channel);
-
- return source;
-}
-
-static gboolean input_handler(GIOChannel *channel, GIOCondition condition,
- gpointer user_data)
-{
- if (condition & (G_IO_HUP | G_IO_ERR | G_IO_NVAL)) {
- g_main_loop_quit(main_loop);
- return FALSE;
- }
-
- rl_callback_read_char();
- return TRUE;
-}
-
-static guint setup_standard_input(void)
-{
- GIOChannel *channel;
- guint source;
-
- channel = g_io_channel_unix_new(fileno(stdin));
-
- source = g_io_add_watch(channel,
- G_IO_IN | G_IO_HUP | G_IO_ERR | G_IO_NVAL,
- input_handler, NULL);
-
- g_io_channel_unref(channel);
-
- return source;
-}
-
static void player_added(GDBusProxy *proxy)
{
players = g_slist_append(players, proxy);
@@ -1258,7 +993,7 @@ static void print_folder(GDBusProxy *proxy, const char *description)
path = g_dbus_proxy_get_path(proxy);
- rl_printf("%s%s%sFolder %s\n", description ? "[" : "",
+ bt_shell_printf("%s%s%sFolder %s\n", description ? "[" : "",
description ? : "",
description ? "] " : "",
path);
@@ -1283,7 +1018,7 @@ static void print_item(GDBusProxy *proxy, const char *description)
else
name = "<unknown>";
- rl_printf("%s%s%sItem %s %s\n", description ? "[" : "",
+ bt_shell_printf("%s%s%sItem %s %s\n", description ? "[" : "",
description ? : "",
description ? "] " : "",
path, name);
@@ -1395,43 +1130,15 @@ static void property_changed(GDBusProxy *proxy, const char *name,
int main(int argc, char *argv[])
{
- GOptionContext *context;
- GError *error = NULL;
GDBusClient *client;
- guint signal, input;
-
- context = g_option_context_new(NULL);
- g_option_context_add_main_entries(context, options, NULL);
-
- if (g_option_context_parse(context, &argc, &argv, &error) == FALSE) {
- if (error != NULL) {
- g_printerr("%s\n", error->message);
- g_error_free(error);
- } else
- g_printerr("An unknown error occurred\n");
- exit(1);
- }
- g_option_context_free(context);
-
- if (option_version == TRUE) {
- printf("%s\n", VERSION);
- exit(0);
- }
+ bt_shell_init(&argc, &argv, NULL);
+ bt_shell_set_menu(&main_menu);
+ bt_shell_set_prompt(PROMPT_OFF);
+ bt_shell_attach(fileno(stdin));
- main_loop = g_main_loop_new(NULL, FALSE);
dbus_conn = g_dbus_setup_bus(DBUS_BUS_SYSTEM, NULL, NULL);
- rl_attempted_completion_function = cmd_completion;
-
- rl_erase_empty_line = 1;
- rl_callback_handler_install(NULL, rl_handler);
-
- rl_set_prompt(PROMPT_OFF);
- rl_redisplay();
-
- input = setup_standard_input();
- signal = setup_signalfd();
client = g_dbus_client_new(dbus_conn, "org.bluez", "/org/bluez");
g_dbus_client_set_connect_watch(client, connect_handler, NULL);
@@ -1440,17 +1147,11 @@ int main(int argc, char *argv[])
g_dbus_client_set_proxy_handlers(client, proxy_added, proxy_removed,
property_changed, NULL);
- g_main_loop_run(main_loop);
+ bt_shell_run();
g_dbus_client_unref(client);
- g_source_remove(signal);
- g_source_remove(input);
-
- rl_message("");
- rl_callback_handler_remove();
dbus_connection_unref(dbus_conn);
- g_main_loop_unref(main_loop);
return 0;
}