diff Plugins/General/scrobbler/gtkstuff.c @ 688:cc1969408403 trunk

[svn] - add scrobbler support
author nenolod
date Sat, 25 Feb 2006 12:11:20 -0800
parents
children f3595214b6b9
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Plugins/General/scrobbler/gtkstuff.c	Sat Feb 25 12:11:20 2006 -0800
@@ -0,0 +1,189 @@
+#include "libaudacious/util.h"
+#include "libaudacious/configdb.h"
+
+#include <glib.h>
+#include <glib/gi18n.h>
+
+#include <stdio.h>
+#include <string.h>
+#include "config.h"
+#include "md5.h"
+
+static GtkWidget 	*eduname,
+			*edpwd;
+static int errorbox_done;
+void about_show(void)
+{
+	static GtkWidget *aboutbox;
+	gchar *tmp;
+	if (aboutbox)
+		return;
+
+	tmp = g_strdup_printf("Audacious AudioScrobbler Plugin\n\n"
+				"Originally created by Audun Hove <audun@nlc.no> and Pipian <pipian@pipian.com>\n");
+	aboutbox = xmms_show_message(_("About Scrobbler Plugin"),
+			_(tmp),
+			_("Ok"), FALSE, NULL, NULL);
+
+	g_free(tmp);
+	gtk_signal_connect(GTK_OBJECT(aboutbox), "destroy",
+			GTK_SIGNAL_FUNC(gtk_widget_destroyed), &aboutbox);
+}
+
+static void set_errorbox_done(GtkWidget *errorbox, GtkWidget **errorboxptr)
+{
+	errorbox_done = -1;
+	gtk_widget_destroyed(errorbox, errorboxptr);
+}
+
+void init_errorbox_done(void)
+{
+	errorbox_done = 1;
+}
+
+int get_errorbox_done(void)
+{
+	return errorbox_done;
+}
+
+void errorbox_show(char *errortxt)
+{
+	static GtkWidget *errorbox;
+	gchar *tmp;
+
+	if(errorbox_done != 1)
+		return;
+	errorbox_done = 0;
+	tmp = g_strdup_printf("There has been an error"
+			" that may require your attention.\n\n"
+			"Contents of server error:\n\n"
+			"%s\n",
+			errortxt);
+
+	errorbox = xmms_show_message("Scrobbler Error",
+			tmp,
+			"OK", FALSE, NULL, NULL);
+	g_free(tmp);
+	gtk_signal_connect(GTK_OBJECT(errorbox), "destroy",
+			GTK_SIGNAL_FUNC(set_errorbox_done), &errorbox);
+}
+
+static char *hexify(char *pass, int len)
+{
+	static char buf[33];
+	char *bp = buf;
+	char hexchars[] = "0123456789abcdef";
+	int i;
+	
+	memset(buf, 0, sizeof(buf));
+	
+	for(i = 0; i < len; i++) {
+		*(bp++) = hexchars[(pass[i] >> 4) & 0x0f];
+		*(bp++) = hexchars[pass[i] & 0x0f];
+	}
+	*bp = 0;
+	return buf;
+}
+
+static void saveconfig(GtkWidget *wid, gpointer data)
+{
+	ConfigDb *cfgfile;
+
+	const char *pwd = gtk_entry_get_text(GTK_ENTRY(edpwd));
+	const char *uid = gtk_entry_get_text(GTK_ENTRY(eduname));
+
+	if ((cfgfile = bmp_cfg_db_open())) {
+	
+		md5_state_t md5state;
+		unsigned char md5pword[16];
+	
+		bmp_cfg_db_set_string(cfgfile, "audioscrobbler", "username", (char *)uid);
+
+		if (pwd != NULL && pwd[0] != '\0') {
+			md5_init(&md5state);
+			md5_append(&md5state, (unsigned const char *)pwd, strlen(pwd));
+			md5_finish(&md5state, md5pword);
+			bmp_cfg_db_set_string(cfgfile, "audioscrobbler", "password",
+					(char *)hexify(md5pword, sizeof(md5pword)));
+		}
+		bmp_cfg_db_close(cfgfile);
+	}
+	gtk_widget_destroy(GTK_WIDGET(data));
+}
+
+void configure_dialog(void)
+{
+	static GtkWidget *cnfdlg;
+	GtkWidget	*btnok,
+			*btncancel,
+			*vbox,
+			*hbox,
+			*unhbox,
+			*pwhbox,
+			*lblun,
+			*lblpw,
+			*frame;
+			
+	ConfigDb 	*cfgfile;
+	
+	if (cnfdlg)
+		return;
+
+	cnfdlg = gtk_window_new(GTK_WINDOW_TOPLEVEL);
+	gtk_window_set_type_hint(GTK_WINDOW(cnfdlg),
+			GDK_WINDOW_TYPE_HINT_DIALOG);
+	gtk_window_set_title(GTK_WINDOW(cnfdlg),
+			"Scrobbler configuration");
+
+	gtk_signal_connect(GTK_OBJECT(cnfdlg), "destroy",
+			GTK_SIGNAL_FUNC(gtk_widget_destroyed), &cnfdlg);
+	
+	vbox = gtk_vbox_new(FALSE, 0);
+
+	unhbox = gtk_hbox_new(FALSE, 0);
+	eduname = gtk_entry_new();
+	lblun = gtk_label_new("Username");
+	gtk_box_pack_start(GTK_BOX(unhbox), lblun, FALSE, FALSE, 3);
+	gtk_box_pack_start(GTK_BOX(unhbox), eduname, FALSE, FALSE, 3);
+	
+	pwhbox = gtk_hbox_new(FALSE, 0);
+	edpwd = gtk_entry_new();
+	lblpw = gtk_label_new("Password");
+	gtk_entry_set_visibility(GTK_ENTRY(edpwd), FALSE);
+	gtk_box_pack_start(GTK_BOX(pwhbox), lblpw, FALSE, FALSE, 3);
+	gtk_box_pack_start(GTK_BOX(pwhbox), edpwd, FALSE, FALSE, 3);
+	
+	gtk_box_pack_start(GTK_BOX(vbox), unhbox, FALSE, FALSE, 3);
+	gtk_box_pack_start(GTK_BOX(vbox), pwhbox, FALSE, FALSE, 3);
+	
+	hbox = gtk_hbox_new(FALSE, 0);
+
+	btnok = gtk_button_new_with_label("Ok");
+	gtk_signal_connect(GTK_OBJECT(btnok), "clicked",
+			GTK_SIGNAL_FUNC(saveconfig), GTK_OBJECT(cnfdlg));
+	
+	btncancel = gtk_button_new_with_label("Cancel");
+	gtk_signal_connect_object(GTK_OBJECT(btncancel), "clicked",
+			GTK_SIGNAL_FUNC(gtk_widget_destroy), GTK_OBJECT(cnfdlg));
+	gtk_box_pack_start(GTK_BOX(hbox), btnok, FALSE, FALSE, 3);
+	gtk_box_pack_start(GTK_BOX(hbox), btncancel, FALSE, FALSE, 3);
+	
+	gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 3);
+
+	frame = gtk_frame_new(" The plugin will have to be restarted for changes to take effect! ");
+	gtk_container_add(GTK_CONTAINER(frame), vbox);
+	gtk_container_add(GTK_CONTAINER(cnfdlg), frame);
+
+	if ((cfgfile = bmp_cfg_db_open())) {
+		gchar *username = NULL;
+		bmp_cfg_db_get_string(cfgfile, "audioscrobbler", "username",
+			&username);
+		if (username) {
+			gtk_entry_set_text(GTK_ENTRY(eduname), username);
+			g_free(username);
+		}
+		bmp_cfg_db_close(cfgfile);
+	}
+	
+	gtk_widget_show_all(cnfdlg);
+}