00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00024 #include <gtk/gtk.h>
00025
00026 #include "application-data.h"
00027 #include "constants.h"
00028 #include "log-player-dbus.h"
00029 #include "log-player.h"
00030 #include "log-player-dbus-marshal.h"
00031
00032
00033
00034 void player_dbus_playback_ended_callback (DBusGProxy *proxy, gpointer user_data)
00035 {
00036 synema_instance_t *inst = synema_instance ();
00037 g_return_if_fail (proxy != NULL);
00038 player_on_stop_button_pressed (GTK_BUTTON (gtk_builder_get_object (inst->builder, "player_button_stop")), GINT_TO_POINTER (0));
00039 }
00040
00041
00042
00043 void player_dbus_date_being_played_callback (DBusGProxy *proxy, guint64 time, gpointer user_data)
00044 {
00045 synema_instance_t *inst = synema_instance ();
00046 g_return_if_fail (proxy != NULL);
00047 inst->player_curr_time = time;
00048 player_set_status_label (time, "Playing logs from");
00049 }
00050
00051
00052
00053 gboolean player_dbus_try_ping (gboolean set_values)
00054 {
00055 synema_instance_t *inst = synema_instance ();
00056 g_return_val_if_fail (inst->dbus_connection != NULL, FALSE);
00057
00058 gboolean pong = FALSE;
00059 GError *err = NULL;
00060 GtkWidget *status = (GtkWidget *) gtk_builder_get_object (inst->builder, "player_align_status");
00061 GtkWidget *start = (GtkWidget *) gtk_builder_get_object (inst->builder, "player_align_start");
00062 GtkWidget *stopafter = (GtkWidget *) gtk_builder_get_object (inst->builder, "player_align_stopafter");
00063 GtkWidget *speed = (GtkWidget *) gtk_builder_get_object (inst->builder, "player_align_speed");
00064 GtkWidget *errlabel = (GtkWidget *) gtk_builder_get_object (inst->builder, "player_align_errlabel");
00065
00066 if (!fr_ensi_bourges_synema_log_player_ping (inst->dbus_proxy, &pong, &err)) {
00067 g_warning ("player_dbus_try_ping: Ping failed (%s)", err->message);
00068 g_clear_error (&err);
00069 pong = FALSE;
00070 }
00071
00072 if (pong) {
00073 gtk_widget_hide (errlabel);
00074
00075 gtk_widget_show (status);
00076 gtk_widget_show (start);
00077 gtk_widget_show (stopafter);
00078 gtk_widget_show (speed);
00079
00080 if (set_values)
00081 player_update_values_from_dbus ();
00082 } else {
00083 gtk_widget_show (errlabel);
00084
00085 gtk_widget_hide (status);
00086 gtk_widget_hide (start);
00087 gtk_widget_hide (stopafter);
00088 gtk_widget_hide (speed);
00089
00090 player_on_stop_button_pressed (GTK_BUTTON (gtk_builder_get_object (inst->builder, "player_button_stop")), GINT_TO_POINTER (0));
00091 }
00092
00093 return pong;
00094 }
00095
00096
00097
00098 gboolean player_dbus_set_speed (double speed)
00099 {
00100 GError *err = NULL;
00101 synema_instance_t *inst = synema_instance ();
00102 g_return_val_if_fail (inst->dbus_connection != NULL, FALSE);
00103
00104 if (!fr_ensi_bourges_synema_log_player_set_speed (inst->dbus_proxy, speed, &err)) {
00105 g_warning ("player_dbus_set_speed: DBus call failed (%s)", err->message);
00106 g_clear_error (&err);
00107 player_dbus_try_ping (FALSE);
00108 return FALSE;
00109 }
00110
00111 return TRUE;
00112 }
00113
00114
00115
00116 gboolean player_dbus_get_speed (double *speed)
00117 {
00118 GError *err = NULL;
00119 synema_instance_t *inst = synema_instance ();
00120 g_return_val_if_fail (inst->dbus_connection != NULL, FALSE);
00121
00122 if (!fr_ensi_bourges_synema_log_player_get_speed (inst->dbus_proxy, speed, &err)) {
00123 g_warning ("player_dbus_get_speed: DBus call failed (%s)", err->message);
00124 g_clear_error (&err);
00125 player_dbus_try_ping (FALSE);
00126 return FALSE;
00127 }
00128
00129 return TRUE;
00130 }
00131
00132
00133
00134 gboolean player_dbus_get_start_date (guint64 *date)
00135 {
00136 GError *err = NULL;
00137 synema_instance_t *inst = synema_instance ();
00138 g_return_val_if_fail (inst->dbus_connection != NULL, FALSE);
00139
00140 if (!fr_ensi_bourges_synema_log_player_get_start_date (inst->dbus_proxy, date, &err)) {
00141 g_warning ("player_dbus_get_start_date: DBus call failed (%s)", err->message);
00142 g_clear_error (&err);
00143 player_dbus_try_ping (FALSE);
00144 return FALSE;
00145 }
00146
00147 return TRUE;
00148 }
00149
00150
00151
00152 gboolean player_dbus_get_duration (guint64 *duration)
00153 {
00154 GError *err = NULL;
00155 synema_instance_t *inst = synema_instance ();
00156 g_return_val_if_fail (inst->dbus_connection != NULL, FALSE);
00157
00158 if (!fr_ensi_bourges_synema_log_player_get_duration (inst->dbus_proxy, duration, &err)) {
00159 g_warning ("player_dbus_get_duration: DBus call failed (%s)", err->message);
00160 g_clear_error (&err);
00161 player_dbus_try_ping (FALSE);
00162 return FALSE;
00163 }
00164
00165 return TRUE;
00166 }
00167
00168
00169
00170 gboolean player_dbus_get_state (gboolean *started, gboolean *paused)
00171 {
00172 GError *err = NULL;
00173 synema_instance_t *inst = synema_instance ();
00174 g_return_val_if_fail (inst->dbus_connection != NULL, FALSE);
00175
00176 if (!fr_ensi_bourges_synema_log_player_get_state (inst->dbus_proxy, started, paused, &err)) {
00177 g_warning ("player_dbus_get_state: DBus call failed (%s)", err->message);
00178 g_clear_error (&err);
00179 player_dbus_try_ping (FALSE);
00180 return FALSE;
00181 }
00182
00183 return TRUE;
00184 }
00185
00186
00187
00188 gboolean player_dbus_stop ()
00189 {
00190 GError *err = NULL;
00191 synema_instance_t *inst = synema_instance ();
00192 g_return_val_if_fail (inst->dbus_connection != NULL, FALSE);
00193
00194 if (!fr_ensi_bourges_synema_log_player_stop (inst->dbus_proxy, &err)) {
00195 g_warning ("player_dbus_stop: DBus call failed (%s)", err->message);
00196 g_clear_error (&err);
00197 player_dbus_try_ping (FALSE);
00198 return FALSE;
00199 }
00200
00201 return TRUE;
00202 }
00203
00204
00205
00206 gboolean player_dbus_set_paused (gboolean paused)
00207 {
00208 GError *err = NULL;
00209 synema_instance_t *inst = synema_instance ();
00210 g_return_val_if_fail (inst->dbus_connection != NULL, FALSE);
00211
00212 if (!fr_ensi_bourges_synema_log_player_set_paused (inst->dbus_proxy, paused, &err)) {
00213 g_warning ("player_dbus_set_paused: DBus call failed (%s)", err->message);
00214 g_clear_error (&err);
00215 player_dbus_try_ping (FALSE);
00216 return FALSE;
00217 }
00218
00219 return TRUE;
00220 }
00221
00222
00223
00224 gboolean player_dbus_start (guint64 start_date, guint64 duration)
00225 {
00226 GError *err = NULL;
00227 synema_instance_t *inst = synema_instance ();
00228 g_return_val_if_fail (inst->dbus_connection != NULL, FALSE);
00229
00230 if (!fr_ensi_bourges_synema_log_player_start (inst->dbus_proxy, start_date, duration, &err)) {
00231 g_warning ("player_dbus_start: DBus call failed (%s)", err->message);
00232 g_clear_error (&err);
00233 player_dbus_try_ping (FALSE);
00234 return FALSE;
00235 }
00236
00237 return TRUE;
00238 }
00239
00240
00241
00242 static void player_dbus_on_lost_proxy (DBusGConnection **connection)
00243 {
00244 g_critical ("The DBus proxy has been lost. Unreferencing the DBus connection.");
00245 dbus_g_connection_unref (*connection);
00246 *connection = NULL;
00247 }
00248
00249
00250
00251 gboolean player_dbus_connect (DBusGConnection **connection, DBusGProxy **proxy)
00252 {
00253 GError *err = NULL;
00254
00255 *connection = dbus_g_bus_get (DBUS_BUS_SESSION, &err);
00256 if (err) {
00257 g_warning ("player_dbus_connect: Could not get the DBus session bus (%s)", err->message);
00258 g_clear_error (&err);
00259 return FALSE;
00260 }
00261
00262 *proxy = dbus_g_proxy_new_for_name (*connection, PLAYER_SERVICE_NAME, PLAYER_PATH, PLAYER_INTERFACE_NAME);
00263 if (*proxy == NULL) {
00264 g_warning ("player_dbus_connect: Failed to create a DBus proxy for the log player");
00265 return FALSE;
00266 }
00267
00268 g_signal_connect_swapped (*proxy, "destroy", G_CALLBACK (player_dbus_on_lost_proxy), connection);
00269
00270 dbus_g_object_register_marshaller (g_cclosure_user_marshal_VOID__UINT64, G_TYPE_NONE, G_TYPE_UINT64, G_TYPE_INVALID);
00271 dbus_g_proxy_add_signal (*proxy, "DateBeingPlayed", G_TYPE_UINT64, G_TYPE_INVALID);
00272 dbus_g_proxy_connect_signal (*proxy,
00273 "DateBeingPlayed",
00274 G_CALLBACK (player_dbus_date_being_played_callback),
00275 NULL,
00276 NULL);
00277
00278 dbus_g_object_register_marshaller (g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, G_TYPE_INVALID);
00279 dbus_g_proxy_add_signal (*proxy, "PlaybackEnded", G_TYPE_INVALID);
00280 dbus_g_proxy_connect_signal (*proxy,
00281 "PlaybackEnded",
00282 G_CALLBACK (player_dbus_playback_ended_callback),
00283 NULL,
00284 NULL);
00285 return TRUE;
00286 }
00287