/* Controle du lecteur
 */
static void cd_quodlibet_control (MyPlayerControl pControl, const char* song)
{
	const gchar *cCommand = NULL;
		
	switch (pControl) {
		case PLAYER_PREVIOUS :
			cCommand = "Previous";
		break;
		
		case PLAYER_PLAY_PAUSE :
			cCommand = "PlayPause";
		break;

		case PLAYER_NEXT :
			cCommand = "Next";
		break;

		default :
			return;
		break;
	}
	
	if (cCommand != NULL)
	{
		cd_debug ("MP : Handler QuodLibet : will use '%s'", cCommand);
		cairo_dock_dbus_call (myData.dbus_proxy_player, cCommand);
	}
}
/* Controle du lecteur
 */
static void cd_exaile_control (MyPlayerControl pControl, const char* file)
{
	gchar *cCommand = NULL;
	
	switch (pControl) {
		case PLAYER_PREVIOUS :
			cCommand = "prev_track";
		break;
		
		case PLAYER_PLAY_PAUSE :
			cCommand = "play_pause";
		break;

		case PLAYER_NEXT :
			cCommand = "next_track";
		break;

		default :
			return;
		break;
	}
	
	if (cCommand != NULL)
	{
		cd_debug ("MP : will use '%s'", cCommand);
		cairo_dock_dbus_call(myData.dbus_proxy_player, cCommand);
	}
}
/* Controle du lecteur (permet d'effectuer les actions de bases sur le lecteur)
 */
void cd_rhythmbox_control (MyPlayerControl pControl, const char* song)
{
	cd_debug ("");
	gchar *cCommand = NULL;
		
	switch (pControl) {
		case PLAYER_PREVIOUS :
			cCommand = myData.DBus_commands.previous;  // ou bien rhythmbox-client --previous
		break;
		
		case PLAYER_PLAY_PAUSE :
			cCommand = myData.DBus_commands.play;  // ou bien rhythmbox-client --pause/--play
		break;

		case PLAYER_NEXT :
			cCommand = myData.DBus_commands.next;  // ou bien rhythmbox-client --next
		break;
		
		case PLAYER_ENQUEUE :
			cCommand = g_strdup_printf ("rhythmbox-client --enqueue %s", song);
			g_spawn_command_line_async (cCommand, NULL);
			g_free (cCommand);
			cCommand = NULL;
		break;
		
		default :
			return;
		break;
	}
	
	if (pControl == PLAYER_PLAY_PAUSE) // Cas special pour RB qui necessite un argument pour le PlayPause
	{
		gboolean bStartPlaying = (myData.iPlayingStatus != PLAYER_PLAYING);
		dbus_g_proxy_call_no_reply (myData.dbus_proxy_player, cCommand, 
			G_TYPE_BOOLEAN, bStartPlaying,
			G_TYPE_INVALID,
			G_TYPE_INVALID);
	}
	else if (cCommand != NULL) 
	{
		cd_debug ("MP : Handler rhythmbox : will use '%s'", cCommand);
		cairo_dock_dbus_call (myData.dbus_proxy_player, cCommand);
	}
}
static gboolean _quit (void)
{
	if (! s_bGotCanQuit)
	{
		s_bCanQuit = cairo_dock_dbus_get_property_as_boolean_with_timeout (myData.dbus_proxy_shell, "org.mpris.MediaPlayer2", "CanQuit", 1000);
		cd_debug ("s_bCanQuit : %d", s_bCanQuit);
		s_bGotCanQuit = TRUE;
	}
	
	if (s_bCanQuit)
	{
		cairo_dock_dbus_call (myData.dbus_proxy_shell, "Quit");
		return TRUE;
	}
	else
	{
		return FALSE;
	}
}
/* Controle du lecteur (permet d'effectuer les actions de bases sur le lecteur).
 */
static void cd_mpris2_control (MyPlayerControl pControl, const char* song)
{
	static GValue s_pValue = G_VALUE_INIT;
	gboolean bToggleValue;
	switch (pControl)
	{
		case PLAYER_PREVIOUS :
			cairo_dock_dbus_call (myData.dbus_proxy_shell, "Previous");
		break;
		
		case PLAYER_STOP :
			cairo_dock_dbus_call (myData.dbus_proxy_shell, "Stop");
		break;
		
		case PLAYER_PLAY_PAUSE :
			if (myData.iPlayingStatus != PLAYER_PLAYING)
				cairo_dock_dbus_call (myData.dbus_proxy_shell, "Play");
			else
				cairo_dock_dbus_call (myData.dbus_proxy_shell, "Pause");
		break;
		
		case PLAYER_NEXT :
			cairo_dock_dbus_call (myData.dbus_proxy_shell, "Next");
		break;
		
		case PLAYER_JUMPBOX :
			
		break;
		
		case PLAYER_SHUFFLE :
			bToggleValue = cd_mpris2_is_shuffle ();
			cd_debug ("SetRandom <- %d", !bToggleValue);
			g_value_init (&s_pValue, G_TYPE_BOOLEAN);
			g_value_set_boolean (&s_pValue, !bToggleValue);
			cairo_dock_dbus_set_property (myData.dbus_proxy_player, "org.mpris.MediaPlayer2.Player", "Shuffle", &s_pValue);
			g_value_unset (&s_pValue);
		break;
		
		case PLAYER_REPEAT :
			bToggleValue = cd_mpris2_is_loop ();
			cd_debug ("SetLoop <- %d", !bToggleValue);
			g_value_init (&s_pValue, G_TYPE_STRING);
			g_value_set_static_string (&s_pValue, bToggleValue ? "None" : "Playlist");
			cairo_dock_dbus_set_property (myData.dbus_proxy_player, "org.mpris.MediaPlayer2.Player", "LoopStatus", &s_pValue);
			g_value_unset (&s_pValue);
		break;
		
		case PLAYER_ENQUEUE :
		{
			cd_debug ("enqueue %s", song);
			GError *erreur = NULL;
			DBusGProxy *proxy = cairo_dock_create_new_session_proxy ("org.mpris.MediaPlayer2",
				"/org/mpris/MediaPlayer2",
				"org.mpris.MediaPlayer2.TrackList");
			dbus_g_proxy_call (proxy, "AddTrack", &erreur,
				G_TYPE_INVALID,
				G_TYPE_STRING, song,  // Uri
				DBUS_TYPE_G_OBJECT_PATH, "",  // AfterTrack
				G_TYPE_BOOLEAN, TRUE,  // SetAsCurrent
				G_TYPE_INVALID);
			g_object_unref (proxy);
			
			if (erreur != NULL)  // the TrackList interface may not exist.
			{
				g_error_free (erreur);
				erreur = NULL;
				dbus_g_proxy_call_no_reply (proxy, "OpenUri",
					G_TYPE_STRING, song,
					G_TYPE_INVALID);
			}
		}
		break;
		
		case PLAYER_VOLUME :
		{
			double fVolume = cd_mpris2_get_volume ();  // [0, 1]
			if (song && strcmp (song, "up") == 0)
				fVolume += .05;
			else
				fVolume -= .05;
			if (fVolume > 1) fVolume = 1;
			if (fVolume < 0) fVolume = 0;
			cd_debug ("volume <- %f", fVolume);
			g_value_init (&s_pValue, G_TYPE_DOUBLE);
			g_value_set_double (&s_pValue, fVolume);
			cairo_dock_dbus_set_property (myData.dbus_proxy_player, "org.mpris.MediaPlayer2.Player", "Volume", &s_pValue);
			g_value_unset (&s_pValue);
		}
		
		default :
		break;
	}
}