void mpd_database_search_stats_start(MpdObj *mi) { /* * Check argument */ if(mi == NULL) { debug_printf(DEBUG_ERROR, "Argument error"); return ; } if(!mpd_check_connected(mi)) { debug_printf(DEBUG_ERROR, "Not Connected\n"); return ; } if(!mpd_server_check_version(mi, 0,12,0)) { debug_printf(DEBUG_ERROR, "Advanced search requires mpd 0.12.0 or higher"); return ; } /* lock, so we can work on mi->connection */ if(mpd_lock_conn(mi) != MPD_OK) { debug_printf(DEBUG_ERROR, "Failed to lock connection"); return ; } mpd_startStatsSearch(mi->connection); /* Set search type */ mi->search_type = MPD_SEARCH_TYPE_STATS; /* unlock, let the error handler handle any possible error. */ mpd_unlock_conn(mi); return; }
void mpd_playlist_search_start(MpdObj *mi, int exact) { /* * Check argument */ if(mi == NULL || exact > 1 || exact < 0) { debug_printf(DEBUG_ERROR, "Argument error"); return ; } if(!mpd_check_connected(mi)) { debug_printf(DEBUG_ERROR, "Not Connected\n"); return ; } if(!mpd_server_check_version(mi, 0,12,1)) { debug_printf(DEBUG_ERROR, "Advanced search requires mpd 0.12.2 or higher"); return ; } /* lock, so we can work on mi->connection */ if(mpd_lock_conn(mi) != MPD_OK) { debug_printf(DEBUG_ERROR, "Failed to lock connection"); return ; } mpd_startPlaylistSearch(mi->connection, exact); /* Set search type */ mi->search_type = (exact)? MPD_SEARCH_TYPE_PLAYLIST_FIND:MPD_SEARCH_TYPE_PLAYLIST_SEARCH; /* unlock, let the error handler handle any possible error. */ mpd_unlock_conn(mi); return; }
/** * @param mi A #MpdObj * @param field A #mpd_TagItems * * Adds a constraint to the search */ void mpd_database_search_add_constraint(MpdObj *mi, mpd_TagItems field, const char *value) { if(mi == NULL || value == NULL || value[0] == '\0') { debug_printf(DEBUG_ERROR,"Failed to parse arguments"); return; } if(mi->search_type == MPD_SEARCH_TYPE_NONE) { debug_printf(DEBUG_ERROR, "No search to constraint"); return; } if(!mpd_check_connected(mi)) { debug_printf(DEBUG_ERROR, "Not Connected\n"); return ; } if(!mpd_server_check_version(mi, 0,12,0)) { debug_printf(DEBUG_ERROR, "Advanced search requires mpd 0.12.0 or higher"); return ; } /* lock, so we can work on mi->connection */ if(mpd_lock_conn(mi) != MPD_OK) { debug_printf(DEBUG_ERROR, "Failed to lock connection"); return ; } mpd_addConstraintSearch(mi->connection, field, value); /* unlock, let the error handler handle any possible error. */ mpd_unlock_conn(mi); return; }
void mpd_database_search_field_start(MpdObj *mi, mpd_TagItems field) { /* * Check argument */ if(mi == NULL || field >= MPD_TAG_NUM_OF_ITEM_TYPES || field < 0) { debug_printf(DEBUG_ERROR, "Argument error"); return ; } if(!mpd_check_connected(mi)) { debug_printf(DEBUG_ERROR, "Not Connected\n"); return ; } if(!mpd_server_check_version(mi, 0,12,0)) { debug_printf(DEBUG_ERROR, "Advanced field list requires mpd 0.12.0 or higher"); return ; } /* lock, so we can work on mi->connection */ if(mpd_lock_conn(mi) != MPD_OK) { debug_printf(DEBUG_ERROR, "Failed to lock connection"); return ; } mpd_startFieldSearch(mi->connection, field); /* Set search type */ mi->search_type = MPD_SEARCH_TYPE_LIST; mi->search_field = field; /* unlock, let the error handler handle any possible error. */ mpd_unlock_conn(mi); return; }
MpdData *mpd_database_get_playlist_content(MpdObj *mi,char *playlist) { MpdData *data = NULL; mpd_InfoEntity *ent = NULL; if(!mpd_check_connected(mi)) { debug_printf(DEBUG_WARNING,"not connected\n"); return NULL; } if(!mpd_server_check_version(mi, 0,12,0)) { debug_printf(DEBUG_WARNING, "only works with mpd higher then 0.12.0"); return NULL; } if(mpd_server_check_command_allowed(mi, "listplaylistinfo") != MPD_SERVER_COMMAND_ALLOWED) { debug_printf(DEBUG_WARNING, "Listing playlist content not supported or allowed"); return NULL; } if(mpd_lock_conn(mi)) { debug_printf(DEBUG_WARNING,"lock failed\n"); return NULL; } mpd_sendListPlaylistInfoCommand(mi->connection, playlist); while (( ent = mpd_getNextInfoEntity(mi->connection)) != NULL) { data = mpd_new_data_struct_append( data ); if(ent->type == MPD_INFO_ENTITY_TYPE_DIRECTORY) { data->type = MPD_DATA_TYPE_DIRECTORY; data->directory = ent->info.directory->path; ent->info.directory->path = NULL; } else if (ent->type == MPD_INFO_ENTITY_TYPE_SONG) { data->type = MPD_DATA_TYPE_SONG; data->song = ent->info.song; ent->info.song = NULL; } else if (ent->type == MPD_INFO_ENTITY_TYPE_PLAYLISTFILE) { data->type = MPD_DATA_TYPE_PLAYLIST; data->playlist = ent->info.playlistFile->path; ent->info.playlistFile->path = NULL; } mpd_freeInfoEntity(ent); } mpd_finishCommand(mi->connection); /* unlock */ mpd_unlock_conn(mi); if(data == NULL) { return NULL; } return mpd_data_get_first(data); }
int mpd_server_get_allowed_commands(MpdObj *mi) { char *temp = NULL; int num_commands = 0; if(!mi){ debug_printf(DEBUG_ERROR, "mi != NULL failed\n"); return MPD_ARGS_ERROR; } if(!mpd_check_connected(mi)) { debug_printf(DEBUG_WARNING, "Not Connected"); return MPD_NOT_CONNECTED; } if(!mpd_server_check_version(mi,0,12,0)){ debug_printf(DEBUG_INFO, "Not supported by mpd"); return MPD_SERVER_NOT_SUPPORTED; } mpd_server_free_commands(mi); if(mpd_lock_conn(mi)) { debug_printf(DEBUG_ERROR, "lock failed"); return MPD_LOCK_FAILED; } mpd_sendCommandsCommand(mi->connection); while((temp = mpd_getNextCommand(mi->connection))) { num_commands++; mi->commands = realloc(mi->commands, (num_commands+1)*sizeof(MpdCommand)); mi->commands[num_commands-1].command_name = temp; mi->commands[num_commands-1].enabled = TRUE; mi->commands[num_commands].command_name = NULL; mi->commands[num_commands].enabled = FALSE; } mpd_finishCommand(mi->connection); mpd_sendNotCommandsCommand(mi->connection); while((temp = mpd_getNextCommand(mi->connection))) { num_commands++; mi->commands = realloc(mi->commands, (num_commands+1)*sizeof(MpdCommand)); mi->commands[num_commands-1].command_name = temp; mi->commands[num_commands-1].enabled = FALSE; mi->commands[num_commands].command_name = NULL; mi->commands[num_commands].enabled = FALSE; } mpd_finishCommand(mi->connection); if(mpd_unlock_conn(mi)) { return MPD_LOCK_FAILED; } return MPD_OK; }
static void serverstats_combo_changed(GtkComboBox * box, GtkWidget * pb) { ss_str *s; int hits, total; gulong max_i; MpdData *node, *data; GtkTreeModel *model = gtk_tree_view_get_model(GTK_TREE_VIEW(serverstats_tree)); int tag = gtk_combo_box_get_active(box); if (!mpd_check_connected(connection)) return; if (!mpd_server_check_version(connection, 0, 13, 0)) { playlist3_show_error_message("This feature is not supported in mpd older then version 0.13.0.", ERROR_WARNING); return; } /* reset the cancel flag */ cancel_query = FALSE; /* show progress bar */ gtk_widget_show_all(gtk_widget_get_parent(pb)); /** make the combo box insensitive and remove the model from the treeview */ gtk_tree_view_set_model(GTK_TREE_VIEW(serverstats_tree), NULL); gtk_widget_set_sensitive(GTK_WIDGET(box), FALSE); gtk_list_store_clear(GTK_LIST_STORE(model)); mpd_database_search_field_start(connection, tag); data = mpd_database_search_commit(connection); max_i = 0; hits = 0; total = 0; for (node = mpd_data_get_first(data); node != NULL; node = (MpdData *) mpd_data_get_next_real(node, FALSE)) total++; s = g_malloc0(sizeof(*s)); s->total = total; s->model = model; s->data = data; s->hits = 0; s->tag = tag; s->pb = pb; s->box = GTK_WIDGET(box); g_idle_add((GSourceFunc) serverstats_idle_handler, s); }
int mpd_server_check_command_allowed(MpdObj *mi, const char *command) { int i; if(!mi || !command) return MPD_SERVER_COMMAND_ERROR; /* when we are connected to a mpd server that doesn't support commands and not commands * feature. (like mpd 0.11.5) allow everything */ if(!mpd_server_check_version(mi, 0,12,0)) return MPD_SERVER_COMMAND_ALLOWED; /* * Also when somehow we failted to get commands */ if(mi->commands == NULL) return MPD_SERVER_COMMAND_ALLOWED; for(i=0;mi->commands[i].command_name;i++) { if(!strcasecmp(mi->commands[i].command_name, command)) return mi->commands[i].enabled; } return MPD_SERVER_COMMAND_NOT_SUPPORTED; }
static void serverstats_update(void) { gchar **handlers = NULL; gchar *value = NULL; serverstats_clear(); if (!mpd_check_connected(connection)) return; mpd_stats_update(connection); /** Version */ value = mpd_server_get_version(connection); gtk_label_set_text(GTK_LABEL(serverstats_labels[SERVERSTATS_MPD_VERSION]), value); free(value); /** Uptime */ value = format_time_real(mpd_stats_get_uptime(connection), ""); gtk_label_set_text(GTK_LABEL(serverstats_labels[SERVERSTATS_MPD_UPTIME]), value); g_free(value); /** Playtime*/ value = format_time_real(mpd_stats_get_playtime(connection), ""); gtk_label_set_text(GTK_LABEL(serverstats_labels[SERVERSTATS_MPD_PLAYTIME]), value); g_free(value); /** DB Playtime*/ value = format_time_real(mpd_stats_get_db_playtime(connection), ""); gtk_label_set_text(GTK_LABEL(serverstats_labels[SERVERSTATS_MPD_DB_PLAYTIME]), value); g_free(value); /** DB ARTIST*/ value = g_strdup_printf("%i", mpd_stats_get_total_artists(connection)); gtk_label_set_text(GTK_LABEL(serverstats_labels[SERVERSTATS_MPD_DB_ARTISTS]), value); g_free(value); /** DB ALBUMS*/ value = g_strdup_printf("%i", mpd_stats_get_total_albums(connection)); gtk_label_set_text(GTK_LABEL(serverstats_labels[SERVERSTATS_MPD_DB_ALBUMS]), value); g_free(value); /** DB SONGS*/ value = g_strdup_printf("%i", mpd_stats_get_total_songs(connection)); gtk_label_set_text(GTK_LABEL(serverstats_labels[SERVERSTATS_MPD_DB_SONGS]), value); g_free(value); /** URL_HANDLERS*/ handlers = mpd_server_get_url_handlers(connection); if (handlers) { value = g_strjoinv(",", handlers); g_strfreev(handlers); handlers = NULL; } else value = g_strdup("N/A"); gtk_label_set_text(GTK_LABEL(serverstats_labels[SERVERSTATS_MPD_URLHANDLERS]), value); g_free(value); if (mpd_server_check_version(connection, 0, 13, 0)) handlers = mpd_server_get_tag_types(connection); if (handlers) { value = g_strjoinv(", ", handlers); g_strfreev(handlers); handlers = NULL; } else value = g_strdup("N/A"); gtk_label_set_text(GTK_LABEL(serverstats_labels[SERVERSTATS_MPD_TAG_TYPES]), value); g_free(value); }