#include "control_commands.h" #include "servers.h" #include "music.h" #include "server_communication.h" #include #include static void list_servers(GSocketConnection *connection, const gchar *cmd) { GSocket *socket = g_socket_connection_get_socket(connection); for(GSList *node = servers; node; node = g_slist_next(node)) { struct server *s = node->data; gchar *buffer = g_strdup_printf("%s:%d\n", s->host, s->port); g_socket_send(socket, buffer, strlen(buffer), NULL, NULL); } } static void commands_find(GSocketConnection *connection, const gchar *cmd) { GError *error = NULL; gchar **data = g_strsplit(cmd, " ", 3); if(g_strv_length(data) != 3) { const gchar *buf = "syntax: find (artist) search\n"; GSocket *socket = g_socket_connection_get_socket(connection); g_socket_send(socket, buf, strlen(buf), NULL, NULL); return; } GSList *list = NULL; g_debug("strlen(%s) == %d", data[1], strlen(data[1])); if(g_ascii_strcasecmp(data[1], "artist") == 0) { list = music_find_artist(data[2]); } else if(g_ascii_strcasecmp(data[1] , "title") == 0) { list = music_find_title(data[2]); } else if(g_ascii_strcasecmp(data[1], "album") == 0) { list = music_find_album(data[2]); } else { g_debug("unknown search"); } GString *string = g_string_new(NULL); for(GSList *node = list; node; node = g_slist_next(node)) { struct file *f = node->data; gchar *relpath = g_build_filename(f->parent->path + strlen(music_root->path), f->name, NULL); g_string_append_printf(string, "%s\n", relpath); g_free(relpath); } g_slist_free(list); for(GSList *node = servers; node; node = g_slist_next(node)) { struct server *server = node->data; g_debug("fetching data from server %s", server->host); gchar **temp = server_find(server, data[1], data[2]); if(temp == NULL) { continue; } for(gint i = 0; i < g_strv_length(temp); i++) { if(strlen(temp[i]) == 0) { break; } g_string_append_printf(string, "%s:%s\n", server->host, temp[i]); } g_strfreev(temp); } GOutputStream *os = g_io_stream_get_output_stream((GIOStream*)connection); if(g_output_stream_write_all(os, string->str, string->len, NULL, NULL, &error) == FALSE) { g_warning(error->message); g_error_free(error); } g_string_free(string, TRUE); } void control_commands_handle(GSocketConnection *connection, const gchar *cmd) { if(g_strcmp0(cmd, "servers") == 0) { list_servers(connection, cmd); } else if(g_strncasecmp(cmd, "find", 4) == 0) { commands_find(connection, cmd); } else { g_debug("unknown command"); gchar *buf = g_strdup_printf("error: unknown command %s\n", cmd); GSocket *socket = g_socket_connection_get_socket(connection); g_socket_send(socket, buf, strlen(buf), NULL, NULL); g_free(buf); } }