33
33
#define GUAYADEQUE_MPRIS2_INTERFACE_ROOT "org.mpris.MediaPlayer2"
34
34
#define GUAYADEQUE_MPRIS2_INTERFACE_PLAYER "org.mpris.MediaPlayer2.Player"
35
35
#define GUAYADEQUE_MPRIS2_INTERFACE_TRACKLIST "org.mpris.MediaPlayer2.TrackList"
36
#define GUAYADEQUE_MPRIS2_INTERFACE_PLAYLISTS "org.mpris.MediaPlayer2.Playlists"
37
38
const char * guMPRIS2_INTROSPECTION_XML =
39
" <interface name='org.mpris.MediaPlayer2'>"
40
" <method name='Raise'/>"
41
" <method name='Quit'/>"
42
" <property name='CanQuit' type='b' access='read'/>"
43
" <property name='CanRaise' type='b' access='read'/>"
44
" <property name='HasTrackList' type='b' access='read'/>"
45
" <property name='Identity' type='s' access='read'/>"
46
" <property name='DesktopEntry' type='s' access='read'/>"
47
" <property name='SupportedUriSchemes' type='as' access='read'/>"
48
" <property name='SupportedMimeTypes' type='as' access='read'/>"
50
" <interface name='org.mpris.MediaPlayer2.Player'>"
51
" <method name='Next'/>"
52
" <method name='Previous'/>"
53
" <method name='Pause'/>"
54
" <method name='PlayPause'/>"
55
" <method name='Stop'/>"
56
" <method name='Play'/>"
57
" <method name='Seek'>"
58
" <arg direction='in' name='Offset' type='x'/>"
60
" <method name='SetPosition'>"
61
" <arg direction='in' name='TrackId' type='o'/>"
62
" <arg direction='in' name='Position' type='x'/>"
64
" <method name='OpenUri'>"
65
" <arg direction='in' name='Uri' type='s'/>"
67
" <signal name='Seeked'>"
68
" <arg name='Position' type='x'/>"
70
" <property name='PlaybackStatus' type='s' access='read'/>"
71
" <property name='LoopStatus' type='s' access='readwrite'/>"
72
" <property name='Rate' type='d' access='readwrite'/>"
73
" <property name='Shuffle' type='b' access='readwrite'/>"
74
" <property name='Metadata' type='a{sv}' access='read'/>"
75
" <property name='Volume' type='d' access='readwrite'/>"
76
" <property name='Position' type='x' access='read'/>"
77
" <property name='MinimumRate' type='d' access='read'/>"
78
" <property name='MaximumRate' type='d' access='read'/>"
79
" <property name='CanGoNext' type='b' access='read'/>"
80
" <property name='CanGoPrevious' type='b' access='read'/>"
81
" <property name='CanPlay' type='b' access='read'/>"
82
" <property name='CanPause' type='b' access='read'/>"
83
" <property name='CanSeek' type='b' access='read'/>"
84
" <property name='CanControl' type='b' access='read'/>"
86
" <interface name='org.mpris.MediaPlayer2.TrackList'>"
87
" <method name='GetTracksMetadata'>"
88
" <arg direction='in' name='TrackIds' type='ao'/>"
89
" <arg direction='out' name='Metadata' type='aa{sv}'/>"
91
" <method name='AddTrack'>"
92
" <arg direction='in' name='Uri' type='s'/>"
93
" <arg direction='in' name='AfterTrack' type='o'/>"
94
" <arg direction='in' name='SetAsCurrent' type='b'/>"
96
" <method name='RemoveTrack'>"
97
" <arg direction='in' name='TrackId' type='o'/>"
99
" <method name='GoTo'>"
100
" <arg direction='in' name='TrackId' type='o'/>"
102
" <signal name='TrackListReplaced'>"
103
" <arg name='Tracks' type='ao'/>"
104
" <arg name='CurrentTrack' type='o'/>"
106
" <signal name='TrackAdded'>"
107
" <arg name='Metadata' type='a{sv}'/>"
108
" <arg name='AfterTrack' type='o'/>"
110
" <signal name='TrackRemoved'>"
111
" <arg name='TrackId' type='o'/>"
113
" <signal name='TrackMetadataChanged'>"
114
" <arg name='TrackId' type='o'/>"
115
" <arg name='Metadata' type='a{sv}'/>"
117
" <property name='Tracks' type='ao' access='read'/>"
118
" <property name='CanEditTracks' type='b' access='read'/>"
39
"<!DOCTYPE node PUBLIC \"-//freedesktop//DTD D-BUS Object Introspection 1.0//EN\"\n"
40
"\"http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd\">\n"
42
" <interface name='org.mpris.MediaPlayer2'>\n"
43
" <method name='Raise'/>\n"
44
" <method name='Quit'/>\n"
45
" <property name='CanQuit' type='b' access='read'/>\n"
46
" <property name='CanRaise' type='b' access='read'/>\n"
47
" <property name='HasTrackList' type='b' access='read'/>\n"
48
" <property name='Identity' type='s' access='read'/>\n"
49
" <property name='DesktopEntry' type='s' access='read'/>\n"
50
" <property name='SupportedUriSchemes' type='as' access='read'/>\n"
51
" <property name='SupportedMimeTypes' type='as' access='read'/>\n"
53
" <interface name='org.mpris.MediaPlayer2.Player'>\n"
54
" <method name='Next'/>\n"
55
" <method name='Previous'/>\n"
56
" <method name='Pause'/>\n"
57
" <method name='PlayPause'/>\n"
58
" <method name='Stop'/>\n"
59
" <method name='Play'/>\n"
60
" <method name='Seek'>\n"
61
" <arg direction='in' name='Offset' type='x'/>\n"
63
" <method name='SetPosition'>\n"
64
" <arg direction='in' name='TrackId' type='o'/>\n"
65
" <arg direction='in' name='Position' type='x'/>\n"
67
" <method name='OpenUri'>\n"
68
" <arg direction='in' name='Uri' type='s'/>\n"
70
" <signal name='Seeked'>\n"
71
" <arg name='Position' type='x'/>\n"
73
" <property name='PlaybackStatus' type='s' access='read'/>\n"
74
" <property name='LoopStatus' type='s' access='readwrite'/>\n"
75
" <property name='Rate' type='d' access='readwrite'/>\n"
76
" <property name='Shuffle' type='b' access='readwrite'/>\n"
77
" <property name='Metadata' type='a{sv}' access='read'/>\n"
78
" <property name='Volume' type='d' access='readwrite'/>\n"
79
" <property name='Position' type='x' access='read'/>\n"
80
" <property name='MinimumRate' type='d' access='read'/>\n"
81
" <property name='MaximumRate' type='d' access='read'/>\n"
82
" <property name='CanGoNext' type='b' access='read'/>\n"
83
" <property name='CanGoPrevious' type='b' access='read'/>\n"
84
" <property name='CanPlay' type='b' access='read'/>\n"
85
" <property name='CanPause' type='b' access='read'/>\n"
86
" <property name='CanSeek' type='b' access='read'/>\n"
87
" <property name='CanControl' type='b' access='read'/>\n"
89
" <interface name='org.mpris.MediaPlayer2.TrackList'>\n"
90
" <method name='GetTracksMetadata'>\n"
91
" <arg direction='in' name='TrackIds' type='ao'/>\n"
92
" <arg direction='out' name='Metadata' type='aa{sv}'/>\n"
94
" <method name='AddTrack'>\n"
95
" <arg direction='in' name='Uri' type='s'/>\n"
96
" <arg direction='in' name='AfterTrack' type='o'/>\n"
97
" <arg direction='in' name='SetAsCurrent' type='b'/>\n"
99
" <method name='RemoveTrack'>\n"
100
" <arg direction='in' name='TrackId' type='o'/>\n"
102
" <method name='GoTo'>\n"
103
" <arg direction='in' name='TrackId' type='o'/>\n"
105
" <signal name='TrackListReplaced'>\n"
106
" <arg name='Tracks' type='ao'/>\n"
107
" <arg name='CurrentTrack' type='o'/>\n"
109
" <signal name='TrackAdded'>\n"
110
" <arg name='Metadata' type='a{sv}'/>\n"
111
" <arg name='AfterTrack' type='o'/>\n"
113
" <signal name='TrackRemoved'>\n"
114
" <arg name='TrackId' type='o'/>\n"
116
" <signal name='TrackMetadataChanged'>\n"
117
" <arg name='TrackId' type='o'/>\n"
118
" <arg name='Metadata' type='a{sv}'/>\n"
120
" <property name='Tracks' type='ao' access='read'/>\n"
121
" <property name='CanEditTracks' type='b' access='read'/>\n"
123
" <interface name='org.mpris.MediaPlayer2.Playlists'>\n"
124
" <method name='ActivatePlaylist'>\n"
125
" <arg direction='in' name='PlaylistId' type='o'/>\n"
127
" <method name='GetPlaylists'>\n"
128
" <arg direction='in' name='Index' type='u'/>\n"
129
" <arg direction='in' name='MaxCount' type='u'/>\n"
130
" <arg direction='in' name='Order' type='s'/>\n"
131
" <arg direction='in' name='ReverseOrder' type='b'/>\n"
132
" <arg direction='out' name='Playlists' type='a(oss)'/>\n"
134
" <signal name='PlaylistChanged'>\n"
135
" <arg name='Playlist' type='b(oss)'/>\n"
137
" <property name='PlaylistCount' type='u' access='read'/>\n"
138
" <property name='Orderings' type='as' access='read'/>\n"
139
" <property name='ActivePlaylist' type='b(oss)' access='read'/>\n"
143
guMPRIS2 * guMPRIS2::m_MPRIS2 = NULL;
123
145
// -------------------------------------------------------------------------------- //
124
guMPRIS2::guMPRIS2( guDBusServer * server, guPlayerPanel * playerpanel ) : guDBusClient( server )
146
guMPRIS2::guMPRIS2( guDBusServer * server, guPlayerPanel * playerpanel, guDbLibrary * db ) : guDBusClient( server )
126
148
m_PlayerPanel = playerpanel;
128
151
RegisterClient();
657
767
if( !strcmp( Member, "Introspect" ) )
659
DBusMessageIter args;
660
dbus_message_iter_init_append( reply->GetMessage(), &args );
769
const char * Dest = msg->GetDestination();
770
if( Dest && !strcmp( Dest, GUAYADEQUE_MPRIS2_SERVICE_NAME ) )
772
DBusMessageIter args;
773
dbus_message_iter_init_append( reply->GetMessage(), &args );
662
if( !dbus_message_iter_append_basic( &args, DBUS_TYPE_STRING, &guMPRIS2_INTROSPECTION_XML ) )
664
guLogError( wxT( "Failed to attach the Introspection info" ) );
775
if( !dbus_message_iter_append_basic( &args, DBUS_TYPE_STRING, &guMPRIS2_INTROSPECTION_XML ) )
777
guLogError( wxT( "Failed to attach the Introspection info" ) );
781
RetVal = DBUS_HANDLER_RESULT_HANDLED;
668
RetVal = DBUS_HANDLER_RESULT_HANDLED;
671
785
else if( !strcmp( Interface, GUAYADEQUE_PROPERTIES_INTERFACE ) )
674
dbus_error_init( &error );
676
const char * QueryIface;
677
const char * QueryProperty;
679
dbus_message_get_args( msg->GetMessage(), &error,
680
DBUS_TYPE_STRING, &QueryIface,
681
DBUS_TYPE_STRING, &QueryProperty,
684
//guLogMessage( wxT( "Asking for '%s' -> '%s' parameter" ), wxString( QueryIface, wxConvUTF8 ).c_str(), wxString( QueryProperty, wxConvUTF8 ).c_str() );
686
if( dbus_error_is_set( &error ) )
688
guLogMessage( wxT( "Could not read the '"GUAYADEQUE_PROPERTIES_INTERFACE "' parameter : %s" ), wxString( error.message, wxConvUTF8 ).c_str() );
689
dbus_error_free( &error );
693
if( !strcmp( Path, "/org/mpris/MediaPlayer2" ) )
787
if( !strcmp( Path, "/org/mpris/MediaPlayer2" ) )
790
dbus_error_init( &error );
792
if( !strcmp( Member, "GetAll" ) )
695
if( !strcmp( Member, "Get" ) )
794
const char * QueryIface;
796
dbus_message_get_args( msg->GetMessage(), &error,
797
DBUS_TYPE_STRING, &QueryIface,
800
// guLogMessage( wxT( "QIface : %s" ), wxString::FromAscii( QueryIface ).c_str() );
802
if( dbus_error_is_set( &error ) )
804
guLogMessage( wxT( "Could not read the parameter : %s" ), wxString( error.message, wxConvUTF8 ).c_str() );
805
dbus_error_free( &error );
809
DBusMessageIter args;
810
DBusMessageIter dict;
697
812
if( !strcmp( QueryIface, "org.mpris.MediaPlayer2" ) )
699
if( !strcmp( QueryProperty, "CanQuit" ) )
701
bool ReplyVal = true;
702
if( AddVariant( reply->GetMessage(), DBUS_TYPE_BOOLEAN, &ReplyVal ) )
706
RetVal = DBUS_HANDLER_RESULT_HANDLED;
709
else if( !strcmp( QueryProperty, "CanRaise" ) )
711
bool ReplyVal = true;
712
if( AddVariant( reply->GetMessage(), DBUS_TYPE_BOOLEAN, &ReplyVal ) )
716
RetVal = DBUS_HANDLER_RESULT_HANDLED;
719
else if( !strcmp( QueryProperty, "HasTrackList" ) )
721
bool ReplyVal = true;
722
if( AddVariant( reply->GetMessage(), DBUS_TYPE_BOOLEAN, &ReplyVal ) )
726
RetVal = DBUS_HANDLER_RESULT_HANDLED;
729
else if( !strcmp( QueryProperty, "Identity" ) )
731
const char * AppName = "Guayadeque " ID_GUAYADEQUE_VERSION;
732
if( AddVariant( reply->GetMessage(), DBUS_TYPE_STRING, &AppName ) )
736
RetVal = DBUS_HANDLER_RESULT_HANDLED;
739
else if( !strcmp( QueryProperty, "DesktopEntry" ) )
741
const char * DesktopPath = "/usr/share/applications/guayadeque.desktop";
742
if( !wxFileExists( wxString( DesktopPath, wxConvUTF8 ) ) )
744
const char * DesktopPath = "/usr/local/share/applications/guayadeque.desktop";
745
if( !wxFileExists( wxString( DesktopPath, wxConvUTF8 ) ) )
751
if( DesktopPath && AddVariant( reply->GetMessage(), DBUS_TYPE_STRING, &DesktopPath ) )
755
RetVal = DBUS_HANDLER_RESULT_HANDLED;
758
else if( !strcmp( QueryProperty, "SupportedUriSchemes" ) )
760
const char * SupportedUriSchemes[] = { "file", "http", "smb", "sftp", NULL };
761
if( AddVariant( reply->GetMessage(), DBUS_TYPE_ARRAY, &SupportedUriSchemes ) )
765
RetVal = DBUS_HANDLER_RESULT_HANDLED;
768
else if( !strcmp( QueryProperty, "SupportedMimeTypes" ) )
770
const char * SupportedMimeTypes[] = {
773
"application/x-ogm-audio",
781
"audio/vnd.rn-realaudio",
790
"audio/x-pn-realaudio",
794
"audio/x-vorbis+ogg",
797
"x-content/audio-player",
799
if( AddVariant( reply->GetMessage(), DBUS_TYPE_ARRAY, &SupportedMimeTypes ) )
803
RetVal = DBUS_HANDLER_RESULT_HANDLED;
814
dbus_bool_t ReplyVal = true;
816
dbus_message_iter_init_append( reply->GetMessage(), &args );
818
dbus_message_iter_open_container( &args, DBUS_TYPE_ARRAY, "{sv}", &dict );
820
FillMetadataDetails( &dict, "CanQuit", ReplyVal );
821
FillMetadataDetails( &dict, "CanRaise", ReplyVal );
822
FillMetadataDetails( &dict, "HasTrackList", ReplyVal );
823
const char * AppName = "Guayadeque Music Player";
824
FillMetadataDetails( &dict, "Identity", AppName );
825
const char * DesktopPath = "guayadeque";
826
FillMetadataDetails( &dict, "DesktopEntry", DesktopPath );
827
const char * SupportedUriSchemes[] = { "file", "http", "smb", "sftp", "cdda", NULL };
828
FillMetadataDetails( &dict, "SupportedUriSchemes", SupportedUriSchemes );
829
const char * SupportedMimeTypes[] = {
832
"application/x-ogm-audio",
840
"audio/vnd.rn-realaudio",
849
"audio/x-pn-realaudio",
853
"audio/x-vorbis+ogg",
856
"x-content/audio-player",
858
FillMetadataDetails( &dict, "SupportedMimeTypes", SupportedMimeTypes );
860
dbus_message_iter_close_container( &args, &dict );
864
RetVal = DBUS_HANDLER_RESULT_HANDLED;
807
866
else if( !strcmp( QueryIface, "org.mpris.MediaPlayer2.Player" ) )
809
if( !strcmp( QueryProperty, "PlaybackStatus" ) )
811
const char * PlaybackStatus;
812
guMediaState State = m_PlayerPanel->GetState();
813
if( State == guMEDIASTATE_STOPPED )
814
PlaybackStatus = "Stopped";
815
else if( State == guMEDIASTATE_PAUSED )
816
PlaybackStatus = "Paused";
817
else //if( State == guMEDIASTATE_PLAYING )
818
PlaybackStatus = "Playing";
820
if( AddVariant( reply->GetMessage(), DBUS_TYPE_STRING, &PlaybackStatus ) )
824
RetVal = DBUS_HANDLER_RESULT_HANDLED;
827
else if( !strcmp( QueryProperty, "LoopStatus" ) )
829
const char * LoopStatus;
830
int PlayLoop = m_PlayerPanel->GetPlayLoop();
831
if( PlayLoop == guPLAYER_PLAYLOOP_NONE )
833
else if( PlayLoop == guPLAYER_PLAYLOOP_TRACK )
834
LoopStatus = "Track";
835
else //if( PlayLoop == guPLAYER_PLAYLOOP_PLAYLIST )
836
LoopStatus = "Playlist";
838
if( AddVariant( reply->GetMessage(), DBUS_TYPE_STRING, &LoopStatus ) )
842
RetVal = DBUS_HANDLER_RESULT_HANDLED;
845
else if( !strcmp( QueryProperty, "Rate" ) )
848
if( AddVariant( reply->GetMessage(), DBUS_TYPE_DOUBLE, &Rate ) )
852
RetVal = DBUS_HANDLER_RESULT_HANDLED;
855
else if( !strcmp( QueryProperty, "Shuffle" ) )
857
bool Shuffle = false;
858
if( AddVariant( reply->GetMessage(), DBUS_TYPE_BOOLEAN, &Shuffle ) )
862
RetVal = DBUS_HANDLER_RESULT_HANDLED;
865
else if( !strcmp( QueryProperty, "Metadata" ) )
867
const guCurrentTrack * CurTrack = m_PlayerPanel->GetCurrentTrack();
869
FillMetadataArgs( reply, CurTrack, m_PlayerPanel->GetCurrentItem() );
873
RetVal = DBUS_HANDLER_RESULT_HANDLED;
875
else if( !strcmp( QueryProperty, "Volume" ) )
877
double CurVolume = m_PlayerPanel->GetVolume() / 100;
878
if( AddVariant( reply->GetMessage(), DBUS_TYPE_DOUBLE, &CurVolume ) )
882
RetVal = DBUS_HANDLER_RESULT_HANDLED;
885
else if( !strcmp( QueryProperty, "Position" ) )
887
double CurPosition = m_PlayerPanel->GetPosition() * 1000;
888
if( AddVariant( reply->GetMessage(), DBUS_TYPE_DOUBLE, &CurPosition ) )
892
RetVal = DBUS_HANDLER_RESULT_HANDLED;
895
else if( !strcmp( QueryProperty, "MinimumRate" ) )
898
if( AddVariant( reply->GetMessage(), DBUS_TYPE_DOUBLE, &Rate ) )
902
RetVal = DBUS_HANDLER_RESULT_HANDLED;
905
else if( !strcmp( QueryProperty, "MaximumRate" ) )
908
if( AddVariant( reply->GetMessage(), DBUS_TYPE_DOUBLE, &Rate ) )
912
RetVal = DBUS_HANDLER_RESULT_HANDLED;
915
else if( !strcmp( QueryProperty, "CanGoNext" ) )
917
bool CanGoNext = m_PlayerPanel->GetCaps() & MPRIS_CAPS_CAN_GO_NEXT;
918
if( AddVariant( reply->GetMessage(), DBUS_TYPE_BOOLEAN, &CanGoNext ) )
922
RetVal = DBUS_HANDLER_RESULT_HANDLED;
925
else if( !strcmp( QueryProperty, "CanGoPrevious" ) )
927
bool CanGoPrev = m_PlayerPanel->GetCaps() & MPRIS_CAPS_CAN_GO_PREV;
928
if( AddVariant( reply->GetMessage(), DBUS_TYPE_BOOLEAN, &CanGoPrev ) )
932
RetVal = DBUS_HANDLER_RESULT_HANDLED;
935
else if( !strcmp( QueryProperty, "CanPlay" ) )
937
bool CanPlay = m_PlayerPanel->GetCaps() & MPRIS_CAPS_CAN_PLAY;
938
if( AddVariant( reply->GetMessage(), DBUS_TYPE_BOOLEAN, &CanPlay ) )
942
RetVal = DBUS_HANDLER_RESULT_HANDLED;
945
else if( !strcmp( QueryProperty, "CanPause" ) )
947
bool CanPause = m_PlayerPanel->GetCaps() & MPRIS_CAPS_CAN_PAUSE;
948
if( AddVariant( reply->GetMessage(), DBUS_TYPE_BOOLEAN, &CanPause ) )
952
RetVal = DBUS_HANDLER_RESULT_HANDLED;
955
else if( !strcmp( QueryProperty, "CanSeek" ) )
957
bool CanSeek = m_PlayerPanel->GetCaps() & MPRIS_CAPS_CAN_SEEK;
958
if( AddVariant( reply->GetMessage(), DBUS_TYPE_BOOLEAN, &CanSeek ) )
962
RetVal = DBUS_HANDLER_RESULT_HANDLED;
965
else if( !strcmp( QueryProperty, "CanControl" ) )
967
bool CanControl = true;
968
if( AddVariant( reply->GetMessage(), DBUS_TYPE_BOOLEAN, &CanControl ) )
972
RetVal = DBUS_HANDLER_RESULT_HANDLED;
976
else if( !strcmp( QueryIface, "org.mpris.MediaPlayer2.TrackList" ) )
978
if( !strcmp( QueryProperty, "Tracks" ) )
981
else if( !strcmp( QueryProperty, "CanEditTracks" ) )
986
else if( !strcmp( Member, "Set" ) )
988
if( !strcmp( QueryIface, "org.mpris.MediaPlayer2.Player" ) )
990
if( !strcmp( QueryProperty, "LoopStatus" ) )
992
const char * LoopStatus;
993
if( GetVariant( msg->GetMessage(), DBUS_TYPE_STRING, &LoopStatus ) )
996
if( !strcmp( LoopStatus, "None" ) )
998
PlayLoop = guPLAYER_PLAYLOOP_NONE;
1000
else if( !strcmp( LoopStatus, "Track" ) )
1002
PlayLoop = guPLAYER_PLAYLOOP_TRACK;
1004
else //if( !strcmp( LoopStatus, "Playlist" ) )
1006
PlayLoop = guPLAYER_PLAYLOOP_PLAYLIST;
1009
wxCommandEvent event( wxEVT_COMMAND_MENU_SELECTED, ID_PLAYERPANEL_SETLOOP );
1010
event.SetInt( PlayLoop );
1011
wxPostEvent( m_PlayerPanel, event );
1015
RetVal = DBUS_HANDLER_RESULT_HANDLED;
1018
else if( !strcmp( QueryProperty, "Rate" ) )
1020
// We are not going to support rate
1023
RetVal = DBUS_HANDLER_RESULT_HANDLED;
1025
else if( !strcmp( QueryProperty, "Shuffle" ) )
1027
wxCommandEvent event( wxEVT_COMMAND_MENU_SELECTED, ID_PLAYERPANEL_SETRANDOM );
1028
wxPostEvent( m_PlayerPanel, event );
1031
RetVal = DBUS_HANDLER_RESULT_HANDLED;
1033
else if( !strcmp( QueryProperty, "Volume" ) )
1036
if( GetVariant( msg->GetMessage(), DBUS_TYPE_DOUBLE, &Volume ) )
1038
wxCommandEvent event( wxEVT_COMMAND_MENU_SELECTED, ID_PLAYERPANEL_SETVOLUME );
1039
event.SetInt( Volume );
1040
wxPostEvent( m_PlayerPanel, event );
1043
RetVal = DBUS_HANDLER_RESULT_HANDLED;
868
dbus_message_iter_init_append( reply->GetMessage(), &args );
870
dbus_message_iter_open_container( &args, DBUS_TYPE_ARRAY, "{sv}", &dict );
872
////////////////////////////////////////////////////////////////////////
873
const char * PlaybackStatus;
874
guMediaState State = m_PlayerPanel->GetState();
875
if( State == guMEDIASTATE_STOPPED )
876
PlaybackStatus = "Stopped";
877
else if( State == guMEDIASTATE_PAUSED )
878
PlaybackStatus = "Paused";
879
else //if( State == guMEDIASTATE_PLAYING )
880
PlaybackStatus = "Playing";
882
FillMetadataDetails( &dict, "PlaybackStatus", PlaybackStatus );
884
////////////////////////////////////////////////////////////////////////
885
const char * LoopStatus;
886
int PlayLoop = m_PlayerPanel->GetPlayLoop();
887
if( PlayLoop == guPLAYER_PLAYLOOP_NONE )
889
else if( PlayLoop == guPLAYER_PLAYLOOP_TRACK )
890
LoopStatus = "Track";
891
else //if( PlayLoop == guPLAYER_PLAYLOOP_PLAYLIST )
892
LoopStatus = "Playlist";
894
FillMetadataDetails( &dict, "LoopStatus", LoopStatus );
896
////////////////////////////////////////////////////////////////////////
898
FillMetadataDetails( &dict, "Rate", Rate );
901
////////////////////////////////////////////////////////////////////////
902
dbus_bool_t Shuffle = false;
903
FillMetadataDetails( &dict, "Shuffle", Shuffle );
906
////////////////////////////////////////////////////////////////////////
907
const guCurrentTrack * CurTrack = m_PlayerPanel->GetCurrentTrack();
908
FillMetadataDetails( &dict, "Metadata", CurTrack, m_PlayerPanel->GetCurrentItem() );
911
////////////////////////////////////////////////////////////////////////
912
double CurVolume = m_PlayerPanel->GetVolume() / 100;
913
FillMetadataDetails( &dict, "Volume", CurVolume );
916
////////////////////////////////////////////////////////////////////////
917
double CurPosition = m_PlayerPanel->GetPosition() * 1000;
918
FillMetadataDetails( &dict, "Position", CurPosition );
921
////////////////////////////////////////////////////////////////////////
922
FillMetadataDetails( &dict, "MinimumRate", Rate );
925
////////////////////////////////////////////////////////////////////////
926
FillMetadataDetails( &dict, "MaximumRate", Rate );
929
////////////////////////////////////////////////////////////////////////
930
dbus_bool_t CanGoNext = ( m_PlayerPanel->GetCaps() & MPRIS_CAPS_CAN_GO_NEXT ) > 0;
931
FillMetadataDetails( &dict, "CanGoNext", CanGoNext );
934
////////////////////////////////////////////////////////////////////////
935
dbus_bool_t CanGoPrev = ( m_PlayerPanel->GetCaps() & MPRIS_CAPS_CAN_GO_PREV ) > 0;
936
FillMetadataDetails( &dict, "CanGoPrev", CanGoPrev );
939
////////////////////////////////////////////////////////////////////////
940
dbus_bool_t CanPlay = ( m_PlayerPanel->GetCaps() & MPRIS_CAPS_CAN_PLAY ) > 0;
941
FillMetadataDetails( &dict, "CanPlay", CanPlay );
944
////////////////////////////////////////////////////////////////////////
945
dbus_bool_t CanPause = ( m_PlayerPanel->GetCaps() & MPRIS_CAPS_CAN_PAUSE ) > 0;
946
FillMetadataDetails( &dict, "CanPause", CanPause );
949
////////////////////////////////////////////////////////////////////////
950
dbus_bool_t CanSeek = ( m_PlayerPanel->GetCaps() & MPRIS_CAPS_CAN_SEEK ) > 0;
951
FillMetadataDetails( &dict, "CanSeek", CanSeek );
954
////////////////////////////////////////////////////////////////////////
955
dbus_bool_t CanControl = true;
956
FillMetadataDetails( &dict, "CanControl", CanControl );
958
dbus_message_iter_close_container( &args, &dict );
962
RetVal = DBUS_HANDLER_RESULT_HANDLED;
964
else if( !strcmp( QueryIface, "org.mpris.MediaPlayer2.Tracklist" ) )
967
else if( !strcmp( QueryIface, "org.mpris.MediaPlayer2.Playlists" ) )
969
dbus_message_iter_init_append( reply->GetMessage(), &args );
971
dbus_message_iter_open_container( &args, DBUS_TYPE_ARRAY, "{sv}", &dict );
973
int PlaylistCount = m_Db->GetPlayListsCount();
974
FillMetadataDetails( &dict, "PlaylistCount", PlaylistCount );
976
const char * PlaylistOrders[] = {
979
FillMetadataDetails( &dict, "Orderings", PlaylistOrders );
981
dbus_bool_t plstate = false;
982
const char * plpath = "/org/mpris/MediaPlayer2/guayadeque/Playlist/0";
983
const char * plname = "";
984
const char * plicon = "";
985
FillMetadataDetails( &dict, "ActivePlaylist", plstate, plpath, plname, plicon );
987
dbus_message_iter_close_container( &args, &dict );
991
RetVal = DBUS_HANDLER_RESULT_HANDLED;
997
const char * QueryIface;
998
const char * QueryProperty;
1000
dbus_message_get_args( msg->GetMessage(), &error,
1001
DBUS_TYPE_STRING, &QueryIface,
1002
DBUS_TYPE_STRING, &QueryProperty,
1003
DBUS_TYPE_INVALID );
1005
// guLogMessage( wxT( "QIface : %s" ), wxString::FromAscii( QueryIface ).c_str() );
1006
// guLogMessage( wxT( "QProp. : %s" ), wxString::FromAscii( QueryProperty ).c_str() );
1008
if( dbus_error_is_set( &error ) )
1010
guLogMessage( wxT( "Could not read the '" GUAYADEQUE_PROPERTIES_INTERFACE "' parameter : %s" ), wxString( error.message, wxConvUTF8 ).c_str() );
1011
dbus_error_free( &error );
1015
if( !strcmp( Member, "Get" ) )
1017
if( !strcmp( QueryIface, "org.mpris.MediaPlayer2" ) )
1019
if( !strcmp( QueryProperty, "CanQuit" ) )
1021
dbus_bool_t ReplyVal = true;
1022
if( AddVariant( reply->GetMessage(), DBUS_TYPE_BOOLEAN, &ReplyVal ) )
1026
RetVal = DBUS_HANDLER_RESULT_HANDLED;
1029
else if( !strcmp( QueryProperty, "CanRaise" ) )
1031
dbus_bool_t ReplyVal = true;
1032
if( AddVariant( reply->GetMessage(), DBUS_TYPE_BOOLEAN, &ReplyVal ) )
1036
RetVal = DBUS_HANDLER_RESULT_HANDLED;
1039
else if( !strcmp( QueryProperty, "HasTrackList" ) )
1041
dbus_bool_t ReplyVal = true;
1042
if( AddVariant( reply->GetMessage(), DBUS_TYPE_BOOLEAN, &ReplyVal ) )
1046
RetVal = DBUS_HANDLER_RESULT_HANDLED;
1049
else if( !strcmp( QueryProperty, "Identity" ) )
1051
const char * AppName = "Guayadeque Music Player";
1052
if( AddVariant( reply->GetMessage(), DBUS_TYPE_STRING, &AppName ) )
1056
RetVal = DBUS_HANDLER_RESULT_HANDLED;
1059
else if( !strcmp( QueryProperty, "DesktopEntry" ) )
1061
const char * DesktopPath = "guayadeque";
1062
if( AddVariant( reply->GetMessage(), DBUS_TYPE_STRING, &DesktopPath ) )
1066
RetVal = DBUS_HANDLER_RESULT_HANDLED;
1069
else if( !strcmp( QueryProperty, "SupportedUriSchemes" ) )
1071
const char * SupportedUriSchemes[] = { "file", "http", "smb", "sftp", "cdda", NULL };
1072
if( AddVariant( reply->GetMessage(), DBUS_TYPE_ARRAY, &SupportedUriSchemes ) )
1076
RetVal = DBUS_HANDLER_RESULT_HANDLED;
1079
else if( !strcmp( QueryProperty, "SupportedMimeTypes" ) )
1081
const char * SupportedMimeTypes[] = {
1083
"application/x-ogg",
1084
"application/x-ogm-audio",
1092
"audio/vnd.rn-realaudio",
1101
"audio/x-pn-realaudio",
1105
"audio/x-vorbis+ogg",
1108
"x-content/audio-player",
1110
if( AddVariant( reply->GetMessage(), DBUS_TYPE_ARRAY, &SupportedMimeTypes ) )
1114
RetVal = DBUS_HANDLER_RESULT_HANDLED;
1118
else if( !strcmp( QueryIface, "org.mpris.MediaPlayer2.Player" ) )
1120
if( !strcmp( QueryProperty, "PlaybackStatus" ) )
1122
const char * PlaybackStatus;
1123
guMediaState State = m_PlayerPanel->GetState();
1124
if( State == guMEDIASTATE_STOPPED )
1125
PlaybackStatus = "Stopped";
1126
else if( State == guMEDIASTATE_PAUSED )
1127
PlaybackStatus = "Paused";
1128
else //if( State == guMEDIASTATE_PLAYING )
1129
PlaybackStatus = "Playing";
1131
if( AddVariant( reply->GetMessage(), DBUS_TYPE_STRING, &PlaybackStatus ) )
1135
RetVal = DBUS_HANDLER_RESULT_HANDLED;
1138
else if( !strcmp( QueryProperty, "LoopStatus" ) )
1140
const char * LoopStatus;
1141
int PlayLoop = m_PlayerPanel->GetPlayLoop();
1142
if( PlayLoop == guPLAYER_PLAYLOOP_NONE )
1143
LoopStatus = "None";
1144
else if( PlayLoop == guPLAYER_PLAYLOOP_TRACK )
1145
LoopStatus = "Track";
1146
else //if( PlayLoop == guPLAYER_PLAYLOOP_PLAYLIST )
1147
LoopStatus = "Playlist";
1149
if( AddVariant( reply->GetMessage(), DBUS_TYPE_STRING, &LoopStatus ) )
1153
RetVal = DBUS_HANDLER_RESULT_HANDLED;
1156
else if( !strcmp( QueryProperty, "Rate" ) )
1159
if( AddVariant( reply->GetMessage(), DBUS_TYPE_DOUBLE, &Rate ) )
1163
RetVal = DBUS_HANDLER_RESULT_HANDLED;
1166
else if( !strcmp( QueryProperty, "Shuffle" ) )
1168
dbus_bool_t Shuffle = false;
1169
if( AddVariant( reply->GetMessage(), DBUS_TYPE_BOOLEAN, &Shuffle ) )
1173
RetVal = DBUS_HANDLER_RESULT_HANDLED;
1176
else if( !strcmp( QueryProperty, "Metadata" ) )
1178
const guCurrentTrack * CurTrack = m_PlayerPanel->GetCurrentTrack();
1180
FillMetadataArgs( reply, CurTrack, m_PlayerPanel->GetCurrentItem() );
1184
RetVal = DBUS_HANDLER_RESULT_HANDLED;
1186
else if( !strcmp( QueryProperty, "Volume" ) )
1188
double CurVolume = m_PlayerPanel->GetVolume() / 100;
1189
if( AddVariant( reply->GetMessage(), DBUS_TYPE_DOUBLE, &CurVolume ) )
1193
RetVal = DBUS_HANDLER_RESULT_HANDLED;
1196
else if( !strcmp( QueryProperty, "Position" ) )
1198
double CurPosition = m_PlayerPanel->GetPosition() * 1000;
1199
if( AddVariant( reply->GetMessage(), DBUS_TYPE_DOUBLE, &CurPosition ) )
1203
RetVal = DBUS_HANDLER_RESULT_HANDLED;
1206
else if( !strcmp( QueryProperty, "MinimumRate" ) )
1209
if( AddVariant( reply->GetMessage(), DBUS_TYPE_DOUBLE, &Rate ) )
1213
RetVal = DBUS_HANDLER_RESULT_HANDLED;
1216
else if( !strcmp( QueryProperty, "MaximumRate" ) )
1219
if( AddVariant( reply->GetMessage(), DBUS_TYPE_DOUBLE, &Rate ) )
1223
RetVal = DBUS_HANDLER_RESULT_HANDLED;
1226
else if( !strcmp( QueryProperty, "CanGoNext" ) )
1228
dbus_bool_t CanGoNext = ( m_PlayerPanel->GetCaps() & MPRIS_CAPS_CAN_GO_NEXT ) > 0;
1229
if( AddVariant( reply->GetMessage(), DBUS_TYPE_BOOLEAN, &CanGoNext ) )
1233
RetVal = DBUS_HANDLER_RESULT_HANDLED;
1236
else if( !strcmp( QueryProperty, "CanGoPrevious" ) )
1238
dbus_bool_t CanGoPrev = ( m_PlayerPanel->GetCaps() & MPRIS_CAPS_CAN_GO_PREV ) > 0;
1239
if( AddVariant( reply->GetMessage(), DBUS_TYPE_BOOLEAN, &CanGoPrev ) )
1243
RetVal = DBUS_HANDLER_RESULT_HANDLED;
1246
else if( !strcmp( QueryProperty, "CanPlay" ) )
1248
dbus_bool_t CanPlay = ( m_PlayerPanel->GetCaps() & MPRIS_CAPS_CAN_PLAY ) > 0;
1249
if( AddVariant( reply->GetMessage(), DBUS_TYPE_BOOLEAN, &CanPlay ) )
1253
RetVal = DBUS_HANDLER_RESULT_HANDLED;
1256
else if( !strcmp( QueryProperty, "CanPause" ) )
1258
dbus_bool_t CanPause = ( m_PlayerPanel->GetCaps() & MPRIS_CAPS_CAN_PAUSE ) > 0;
1259
if( AddVariant( reply->GetMessage(), DBUS_TYPE_BOOLEAN, &CanPause ) )
1263
RetVal = DBUS_HANDLER_RESULT_HANDLED;
1266
else if( !strcmp( QueryProperty, "CanSeek" ) )
1268
dbus_bool_t CanSeek = ( m_PlayerPanel->GetCaps() & MPRIS_CAPS_CAN_SEEK ) > 0;
1269
if( AddVariant( reply->GetMessage(), DBUS_TYPE_BOOLEAN, &CanSeek ) )
1273
RetVal = DBUS_HANDLER_RESULT_HANDLED;
1276
else if( !strcmp( QueryProperty, "CanControl" ) )
1278
dbus_bool_t CanControl = true;
1279
if( AddVariant( reply->GetMessage(), DBUS_TYPE_BOOLEAN, &CanControl ) )
1283
RetVal = DBUS_HANDLER_RESULT_HANDLED;
1287
else if( !strcmp( QueryIface, "org.mpris.MediaPlayer2.TrackList" ) )
1289
if( !strcmp( QueryProperty, "Tracks" ) )
1292
else if( !strcmp( QueryProperty, "CanEditTracks" ) )
1294
dbus_bool_t CanEdit = true;
1295
if( AddVariant( reply->GetMessage(), DBUS_TYPE_BOOLEAN, &CanEdit ) )
1299
RetVal = DBUS_HANDLER_RESULT_HANDLED;
1303
else if( !strcmp( QueryIface, "org.mpris.MediaPlayer2.Playlists" ) )
1305
if( !strcmp( QueryProperty, "PlaylistCount" ) )
1308
else if( !strcmp( QueryProperty, "Orderings" ) )
1311
else if( !strcmp( QueryProperty, "ActivePlaylist" ) )
1316
else if( !strcmp( Member, "Set" ) )
1318
if( !strcmp( QueryIface, "org.mpris.MediaPlayer2.Player" ) )
1320
if( !strcmp( QueryProperty, "LoopStatus" ) )
1322
const char * LoopStatus;
1323
if( GetVariant( msg->GetMessage(), DBUS_TYPE_STRING, &LoopStatus ) )
1326
if( !strcmp( LoopStatus, "None" ) )
1328
PlayLoop = guPLAYER_PLAYLOOP_NONE;
1330
else if( !strcmp( LoopStatus, "Track" ) )
1332
PlayLoop = guPLAYER_PLAYLOOP_TRACK;
1334
else //if( !strcmp( LoopStatus, "Playlist" ) )
1336
PlayLoop = guPLAYER_PLAYLOOP_PLAYLIST;
1339
wxCommandEvent event( wxEVT_COMMAND_MENU_SELECTED, ID_PLAYERPANEL_SETLOOP );
1340
event.SetInt( PlayLoop );
1341
wxPostEvent( m_PlayerPanel, event );
1345
RetVal = DBUS_HANDLER_RESULT_HANDLED;
1348
else if( !strcmp( QueryProperty, "Rate" ) )
1350
// We are not going to support rate
1353
RetVal = DBUS_HANDLER_RESULT_HANDLED;
1355
else if( !strcmp( QueryProperty, "Shuffle" ) )
1357
wxCommandEvent event( wxEVT_COMMAND_MENU_SELECTED, ID_PLAYERPANEL_SETRANDOM );
1358
wxPostEvent( m_PlayerPanel, event );
1361
RetVal = DBUS_HANDLER_RESULT_HANDLED;
1363
else if( !strcmp( QueryProperty, "Volume" ) )
1366
if( GetVariant( msg->GetMessage(), DBUS_TYPE_DOUBLE, &Volume ) )
1368
wxCommandEvent event( wxEVT_COMMAND_MENU_SELECTED, ID_PLAYERPANEL_SETVOLUME );
1369
event.SetInt( Volume );
1370
wxPostEvent( m_PlayerPanel, event );
1373
RetVal = DBUS_HANDLER_RESULT_HANDLED;