diff --git a/pandora_applet/ChangeLog b/pandora_applet/ChangeLog index 8fd8da480a..c7f17a20f3 100644 --- a/pandora_applet/ChangeLog +++ b/pandora_applet/ChangeLog @@ -1,3 +1,21 @@ +2006-12-12 Esteban Sanchez + + * src/pandora_status.[ch]: pandora_status_set_* removed and replaced + by an unique pandora_status_set_all function. Added a new signal + throwed for each status property when it changes. Added a new signal + throwed when there is an incidence (any of the values changed to bad + or good. + + * src/pandora-status-checker.c: Error message when SQL connects failed + rewritten. Fixed the return of a gboolean value on functions that + returns PandoraState. Check code replaced with the new functions. + + * src/pandora-info-window.c: Listen to new signals of PandoraStatus + object. Style correction. + + * src/pandora-applet.c: Listen to new "incidence" signal of + PandoraStatus object. Callback rewritten. Removed unused function. + 2006-12-12 Esteban Sanchez * src/pandora-status-checker.c: Wait one second before starting to diff --git a/pandora_applet/src/pandora-applet.c b/pandora_applet/src/pandora-applet.c index b52ce1e5d0..4d3d2661ca 100644 --- a/pandora_applet/src/pandora-applet.c +++ b/pandora_applet/src/pandora-applet.c @@ -66,8 +66,9 @@ static void pandora_applet_set_image_from_stock (PandoraApplet *a static gboolean pandora_applet_toplevel_menu_button_press_cb (GtkWidget *widget, GdkEventButton *event, gpointer data); -static void pandora_applet_changed_status_cb (GObject *object, - gpointer *data); +static void pandora_applet_incidence_cb (GObject *object, + gint data, + gpointer user_data); static GtkWidget *pandora_applet_context_menu_create (PandoraApplet *applet); static GObject *pandora_applet_constructor (GType type, guint n_props, @@ -133,8 +134,8 @@ pandora_applet_init (PandoraApplet *applet) gtk_widget_show_all (GTK_WIDGET (applet)); - g_signal_connect (G_OBJECT (applet->priv->status), "changed", - G_CALLBACK (pandora_applet_changed_status_cb), + g_signal_connect (G_OBJECT (applet->priv->status), "incidence", + G_CALLBACK (pandora_applet_incidence_cb), (gpointer) applet); pandora_status_checker_run (applet->priv->checker); @@ -278,48 +279,25 @@ pandora_applet_show_setup_cb (GtkMenuItem *mi, PandoraApplet *applet) } static void -pandora_applet_changed_status_cb (GObject *object, - gpointer *data) +pandora_applet_incidence_cb (GObject *object, + gint data, + gpointer user_data) { - PandoraApplet *applet = PANDORA_APPLET (data); + PandoraState state = data; + PandoraApplet *applet = PANDORA_APPLET (user_data); - switch (pandora_status_get_alerts (PANDORA_STATUS (object))) { + switch (state) { case STATE_BAD: pandora_applet_set_image_from_pixbuf (applet, applet->priv->icon_bad); - return; + break; case STATE_OK: - break; - default: - pandora_applet_set_image_from_pixbuf (applet, applet->priv->icon_unknown); - return; - } + pandora_applet_set_image_from_pixbuf (applet, applet->priv->icon_good); - switch (pandora_status_get_servers (PANDORA_STATUS (object))) { - case STATE_BAD: - pandora_applet_set_image_from_pixbuf (applet, applet->priv->icon_bad); - return; - break; - case STATE_OK: break; default: pandora_applet_set_image_from_pixbuf (applet, applet->priv->icon_unknown); - return; } - - switch (pandora_status_get_agents (PANDORA_STATUS (object))) { - case STATE_BAD: - pandora_applet_set_image_from_pixbuf (applet, applet->priv->icon_bad); - return; - break; - case STATE_OK: - break; - default: - pandora_applet_set_image_from_pixbuf (applet, applet->priv->icon_unknown); - return; - } - - pandora_applet_set_image_from_pixbuf (applet, applet->priv->icon_good); } static GtkWidget * @@ -382,10 +360,10 @@ pandora_applet_menu_position_func (GtkMenu *menu G_GNUC_UNUSED, int *x, int *y, gboolean *push_in, gpointer user_data) { - int screen_w, screen_h, button_x, button_y, panel_w, panel_h; + gint screen_w, screen_h, button_x, button_y, panel_w, panel_h; GtkRequisition requisition; - GdkScreen *screen; - PandoraApplet *applet = (PandoraApplet *)user_data; + GdkScreen *screen; + PandoraApplet *applet = PANDORA_APPLET (user_data); screen = gtk_widget_get_screen (applet->priv->event_box); screen_w = gdk_screen_get_width (screen); @@ -412,7 +390,6 @@ pandora_applet_toplevel_menu_button_press_cb (GtkWidget *widget, GdkEventButton *event, gpointer data) { - PandoraApplet *applet; applet = PANDORA_APPLET (data); @@ -435,11 +412,6 @@ pandora_applet_toplevel_menu_button_press_cb (GtkWidget *widget, return FALSE; } -static void -pandora_applet_setup_widgets (PandoraApplet *applet) -{ -} - static void pandora_applet_set_image_from_stock (PandoraApplet *applet, gchar *stock_id) diff --git a/pandora_applet/src/pandora-info-window.c b/pandora_applet/src/pandora-info-window.c index d5165d7e30..17a7f59e73 100644 --- a/pandora_applet/src/pandora-info-window.c +++ b/pandora_applet/src/pandora-info-window.c @@ -71,16 +71,25 @@ static gboolean pandora_info_window_delete_cb (GtkWidget *dialog, static gboolean pandora_info_window_close_cb (GtkWidget *widget, gpointer data); -static void pandora_info_window_status_changed_cb (GObject *object, - gpointer data); +static void pandora_info_window_alerts_changed_cb (GObject *object, + gint data, + gpointer user_data); -static void pandora_info_window_status_update (PandoraInfoWindow *window); +static void pandora_info_window_agents_changed_cb (GObject *object, + gint data, + gpointer user_data); -static void pandora_info_window_status_update_alerts (PandoraInfoWindow *window, +static void pandora_info_window_servers_changed_cb (GObject *object, + gint data, + gpointer user_data); + +static void pandora_info_window_status_update_all (PandoraInfoWindow *window); + +static void pandora_info_window_status_update_alerts (PandoraInfoWindow *window, PandoraState state); -static void pandora_info_window_status_update_agents (PandoraInfoWindow *window, +static void pandora_info_window_status_update_agents (PandoraInfoWindow *window, PandoraState state); -static void pandora_info_window_status_update_servers (PandoraInfoWindow *window, +static void pandora_info_window_status_update_servers (PandoraInfoWindow *window, PandoraState state); GType @@ -117,7 +126,7 @@ pandora_info_window_init (PandoraInfoWindow *window) GtkWidget *button_close; window->priv = PANDORA_INFO_WINDOW_GET_PRIVATE (window); - + window->priv->status = NULL; window->priv->state_alerts = STATE_INVALID; window->priv->state_servers = STATE_INVALID; @@ -159,7 +168,7 @@ pandora_info_window_init (PandoraInfoWindow *window) gtk_table_attach (GTK_TABLE (table), window->priv->label_alerts, 1, 2, 0, 1, GTK_FILL | GTK_EXPAND, GTK_FILL, 0, 0); - /* Third row */ + /* Second row */ window->priv->label_agents = gtk_label_new (_("Agents status.")); gtk_misc_set_alignment (GTK_MISC (window->priv->label_agents), 0, 0.5); @@ -171,7 +180,7 @@ pandora_info_window_init (PandoraInfoWindow *window) gtk_table_attach (GTK_TABLE (table), window->priv->label_agents, 1, 2, 1, 2, GTK_FILL | GTK_EXPAND, GTK_FILL, 0, 0); - /* Second row */ + /* Third row */ window->priv->label_servers = gtk_label_new (_("Servers status.")); gtk_misc_set_alignment (GTK_MISC (window->priv->label_servers), 0, 0.5); @@ -262,7 +271,8 @@ pandora_info_window_new (void) } static gboolean -pandora_info_window_close_cb (GtkWidget *widget, gpointer data) +pandora_info_window_close_cb (GtkWidget *widget, + gpointer data) { GtkWidget *window; @@ -275,7 +285,9 @@ pandora_info_window_close_cb (GtkWidget *widget, gpointer data) } static gboolean -pandora_info_window_delete_cb (GtkWidget *widget, GdkEvent *event, gpointer data) +pandora_info_window_delete_cb (GtkWidget *widget, + GdkEvent *event, + gpointer data) { gtk_widget_hide (widget); @@ -284,7 +296,7 @@ pandora_info_window_delete_cb (GtkWidget *widget, GdkEvent *event, gpointer data void pandora_info_window_set_status (PandoraInfoWindow *window, - PandoraStatus *status) + PandoraStatus *status) { if (window->priv->status) { g_object_unref (window->priv->status); @@ -292,16 +304,22 @@ pandora_info_window_set_status (PandoraInfoWindow *window, window->priv->status = status; - g_signal_connect (status, "changed", - G_CALLBACK (pandora_info_window_status_changed_cb), + g_signal_connect (status, "changed_alerts", + G_CALLBACK (pandora_info_window_alerts_changed_cb), + (gpointer) window); + g_signal_connect (status, "changed_agents", + G_CALLBACK (pandora_info_window_agents_changed_cb), + (gpointer) window); + g_signal_connect (status, "changed_servers", + G_CALLBACK (pandora_info_window_servers_changed_cb), (gpointer) window); - pandora_info_window_status_update (window); + pandora_info_window_status_update_all (window); } static void pandora_info_window_status_update_alerts (PandoraInfoWindow *window, - PandoraState state) + PandoraState state) { switch (state) { case STATE_BAD: @@ -328,7 +346,7 @@ pandora_info_window_status_update_alerts (PandoraInfoWindow *window, static void pandora_info_window_status_update_agents (PandoraInfoWindow *window, - PandoraState state) + PandoraState state) { switch (state) { case STATE_BAD: @@ -355,7 +373,7 @@ pandora_info_window_status_update_agents (PandoraInfoWindow *window, static void pandora_info_window_status_update_servers (PandoraInfoWindow *window, - PandoraState state) + PandoraState state) { switch (state) { case STATE_BAD: @@ -381,34 +399,55 @@ pandora_info_window_status_update_servers (PandoraInfoWindow *window, } static void -pandora_info_window_status_update (PandoraInfoWindow *window) +pandora_info_window_status_update_all (PandoraInfoWindow *window) { - PandoraStatus *status; - PandoraState state; + PandoraState state; - status = window->priv->status; - - if (status == NULL) { + if (window->priv->status == NULL) { pandora_info_window_status_update_alerts (window, TRUE); pandora_info_window_status_update_agents (window, TRUE); pandora_info_window_status_update_servers (window, TRUE); } else { - state = pandora_status_get_alerts (status); + state = pandora_status_get_alerts (window->priv->status); pandora_info_window_status_update_alerts (window, state); - - state = pandora_status_get_agents (status); + + state = pandora_status_get_agents (window->priv->status); pandora_info_window_status_update_agents (window, state); - state = pandora_status_get_servers (status); + state = pandora_status_get_servers (window->priv->status); pandora_info_window_status_update_servers (window, state); } } static void -pandora_info_window_status_changed_cb (GObject *object, - gpointer data) +pandora_info_window_alerts_changed_cb (GObject *object, + gint data, + gpointer user_data) { - PandoraInfoWindow *window = PANDORA_INFO_WINDOW (data); - - pandora_info_window_status_update (window); + PandoraState state = data; + PandoraInfoWindow *window = PANDORA_INFO_WINDOW (user_data); + + pandora_info_window_status_update_alerts (window, state); +} + +static void +pandora_info_window_agents_changed_cb (GObject *object, + gint data, + gpointer user_data) +{ + PandoraState state = data; + PandoraInfoWindow *window = PANDORA_INFO_WINDOW (user_data); + + pandora_info_window_status_update_agents (window, state); +} + +static void +pandora_info_window_servers_changed_cb (GObject *object, + gint data, + gpointer user_data) +{ + PandoraState state = data; + PandoraInfoWindow *window = PANDORA_INFO_WINDOW (user_data); + + pandora_info_window_status_update_servers (window, state); } diff --git a/pandora_applet/src/pandora-status-checker.c b/pandora_applet/src/pandora-status-checker.c index c62a12bc31..b85ac7aef7 100644 --- a/pandora_applet/src/pandora-status-checker.c +++ b/pandora_applet/src/pandora-status-checker.c @@ -50,16 +50,16 @@ struct _PandoraStatusCheckerPrivate { (G_TYPE_INSTANCE_GET_PRIVATE ((object), PANDORA_STATUS_CHECKER_TYPE, \ PandoraStatusCheckerPrivate)) -static gboolean pandora_status_checker_connect (PandoraStatusChecker *checker); -static gboolean pandora_status_checker_disconnect (PandoraStatusChecker *checker); +static gboolean pandora_status_checker_connect (PandoraStatusChecker *checker); +static gboolean pandora_status_checker_disconnect (PandoraStatusChecker *checker); static PandoraState pandora_status_checker_check_alerts (PandoraStatusChecker *checker); static PandoraState pandora_status_checker_check_servers (PandoraStatusChecker *checker); static PandoraState pandora_status_checker_check_agents (PandoraStatusChecker *checker); -static void pandora_status_checker_init (PandoraStatusChecker *checker); -static void pandora_status_checker_class_init (PandoraStatusCheckerClass *klass); -static void pandora_status_checker_finalize (GObject *object); +static void pandora_status_checker_init (PandoraStatusChecker *checker); +static void pandora_status_checker_class_init (PandoraStatusCheckerClass *klass); +static void pandora_status_checker_finalize (GObject *object); static gpointer pandora_status_checker_run_thread (gpointer data); @@ -135,7 +135,6 @@ pandora_status_checker_finalize (GObject *object) checker->priv->status = NULL; } - if (checker->priv->state_mutex) { g_mutex_free (checker->priv->state_mutex); checker->priv->state_mutex = NULL; @@ -192,7 +191,7 @@ pandora_status_checker_connect (PandoraStatusChecker *checker) password, dbname, 3306, NULL, 0) == NULL) { - g_print ("mysql_real_connect() failed. %s\n", + g_print ("SQL connection failed. %s\n", mysql_error (checker->priv->connection)); mysql_close (checker->priv->connection); checker->priv->connection = NULL; @@ -232,7 +231,7 @@ pandora_status_checker_check_agents (PandoraStatusChecker *checker) "WHERE estado != 100 and datos = 0.0"; if (checker->priv->connection == NULL) { - return FALSE; + return STATE_UNKNOWN; } if (mysql_query (checker->priv->connection, query_time) != 0) { @@ -272,7 +271,7 @@ pandora_status_checker_check_servers (PandoraStatusChecker *checker) "WHERE status = 0"; if (checker->priv->connection == NULL) { - return FALSE; + return STATE_UNKNOWN; } if (mysql_query (checker->priv->connection, query) != 0) { @@ -305,7 +304,7 @@ pandora_status_checker_check_alerts (PandoraStatusChecker *checker) gchar *query; if (checker->priv->connection == NULL) { - return FALSE; + return STATE_UNKNOWN; } if (mysql_query (checker->priv->connection, query_all_agents) != 0) { @@ -377,17 +376,22 @@ pandora_status_checker_run_thread (gpointer data) while (checker->priv->state == CHECKER_STATE_RUNNING) { g_mutex_unlock (checker->priv->state_mutex); - pandora_status_checker_connect (checker); + if (pandora_status_checker_connect (checker)) { - alerts = pandora_status_checker_check_alerts (checker); - servers = pandora_status_checker_check_servers (checker); - agents = pandora_status_checker_check_agents (checker); - - pandora_status_set_alerts (checker->priv->status, alerts); - pandora_status_set_servers (checker->priv->status, servers); - pandora_status_set_agents (checker->priv->status, agents); - - pandora_status_checker_disconnect (checker); + alerts = pandora_status_checker_check_alerts (checker); + servers = pandora_status_checker_check_servers (checker); + agents = pandora_status_checker_check_agents (checker); + + pandora_status_set_all (checker->priv->status, + alerts, agents, servers); + + pandora_status_checker_disconnect (checker); + } else { + pandora_status_set_all (checker->priv->status, + STATE_UNKNOWN, + STATE_UNKNOWN, + STATE_UNKNOWN); + } g_usleep (G_USEC_PER_SEC * 10); diff --git a/pandora_applet/src/pandora-status.c b/pandora_applet/src/pandora-status.c index d34b92327b..afd12d9193 100644 --- a/pandora_applet/src/pandora-status.c +++ b/pandora_applet/src/pandora-status.c @@ -27,7 +27,11 @@ #include "pandora-status.h" enum { - CHANGED, + NONE, + INCIDENCE, + CHANGED_ALERTS, + CHANGED_AGENTS, + CHANGED_SERVERS, N_SIGNALS }; @@ -45,9 +49,9 @@ static guint pandora_status_signals[N_SIGNALS]; (G_TYPE_INSTANCE_GET_PRIVATE ((object), PANDORA_STATUS_TYPE, \ PandoraStatusPrivate)) -static void pandora_status_init (PandoraStatus *status); -static void pandora_status_class_init (PandoraStatusClass *klass); -static void pandora_status_finalize (GObject *object); +static void pandora_status_init (PandoraStatus *status); +static void pandora_status_class_init (PandoraStatusClass *klass); +static void pandora_status_finalize (GObject *object); GType pandora_status_get_type (void) @@ -85,7 +89,6 @@ pandora_status_init (PandoraStatus *status) status->priv->mutex = g_mutex_new (); } - static void pandora_status_class_init (PandoraStatusClass *klass) { @@ -95,15 +98,42 @@ pandora_status_class_init (PandoraStatusClass *klass) object_class = G_OBJECT_CLASS (klass); object_class->finalize = pandora_status_finalize; - - pandora_status_signals[CHANGED] = - g_signal_new ("changed", + + pandora_status_signals[INCIDENCE] = + g_signal_new ("incidence", G_TYPE_FROM_CLASS (object_class), G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION, G_STRUCT_OFFSET (PandoraStatusClass, changed), NULL, NULL, - g_cclosure_marshal_VOID__VOID, - G_TYPE_NONE, 0); + g_cclosure_marshal_VOID__INT, + G_TYPE_NONE, 1, G_TYPE_INT); + + pandora_status_signals[CHANGED_ALERTS] = + g_signal_new ("changed_alerts", + G_TYPE_FROM_CLASS (object_class), + G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION, + G_STRUCT_OFFSET (PandoraStatusClass, changed), + NULL, NULL, + g_cclosure_marshal_VOID__INT, + G_TYPE_NONE, 1, G_TYPE_INT); + + pandora_status_signals[CHANGED_AGENTS] = + g_signal_new ("changed_agents", + G_TYPE_FROM_CLASS (object_class), + G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION, + G_STRUCT_OFFSET (PandoraStatusClass, changed), + NULL, NULL, + g_cclosure_marshal_VOID__INT, + G_TYPE_NONE, 1, G_TYPE_INT); + + pandora_status_signals[CHANGED_SERVERS] = + g_signal_new ("changed_servers", + G_TYPE_FROM_CLASS (object_class), + G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION, + G_STRUCT_OFFSET (PandoraStatusClass, changed), + NULL, NULL, + g_cclosure_marshal_VOID__INT, + G_TYPE_NONE, 1, G_TYPE_INT); } static void @@ -131,54 +161,55 @@ pandora_status_new (void) } void -pandora_status_set_alerts (PandoraStatus *status, PandoraState value) +pandora_status_set_all (PandoraStatus *status, + PandoraState alerts, + PandoraState agents, + PandoraState servers) { - g_return_if_fail (PANDORA_IS_STATUS (status)); - - g_mutex_lock (status->priv->mutex); - - if (status->priv->alerts != value) { - status->priv->alerts = value; - g_mutex_unlock (status->priv->mutex); - - g_signal_emit (status, pandora_status_signals[CHANGED], 0); - } else { - g_mutex_unlock (status->priv->mutex); - } -} - -void -pandora_status_set_agents (PandoraStatus *status, PandoraState value) -{ - g_return_if_fail (PANDORA_IS_STATUS (status)); - - g_mutex_lock (status->priv->mutex); - - if (status->priv->agents != value) { - status->priv->agents = value; - g_mutex_unlock (status->priv->mutex); - - g_signal_emit (status, pandora_status_signals[CHANGED], 0); - } else { - g_mutex_unlock (status->priv->mutex); - } -} - -void -pandora_status_set_servers (PandoraStatus *status, PandoraState value) -{ - g_return_if_fail (PANDORA_IS_STATUS (status)); - - g_mutex_lock (status->priv->mutex); + PandoraState incidence = STATE_INVALID; - if (status->priv->servers != value) { - status->priv->servers = value; - g_mutex_unlock (status->priv->mutex); + g_return_if_fail (PANDORA_IS_STATUS (status)); + + g_mutex_lock (status->priv->mutex); + + if (status->priv->alerts != alerts) { + status->priv->alerts = alerts; + + g_signal_emit (status, pandora_status_signals[CHANGED_ALERTS], + 0, alerts); - g_signal_emit (status, pandora_status_signals[CHANGED], 0); - } else { - g_mutex_unlock (status->priv->mutex); + incidence = alerts; } + + if (status->priv->agents != agents) { + status->priv->agents = agents; + + g_signal_emit (status, pandora_status_signals[CHANGED_AGENTS], + 0, agents); + + /* Change value if it was invalid or OK, so + * "incidence" signal will be emmited only if there + * are any bad value or all are ok. */ + if (incidence == STATE_INVALID || incidence == STATE_OK) + incidence = agents; + } + + if (status->priv->servers != servers) { + status->priv->servers = servers; + + g_signal_emit (status, pandora_status_signals[CHANGED_SERVERS], + 0, servers); + + if (incidence == STATE_INVALID || incidence == STATE_OK) + incidence = agents; + } + + /* Emit incidence_any signal if necessary */ + if (incidence != STATE_INVALID) + g_signal_emit (status, pandora_status_signals[INCIDENCE], + 0, incidence); + + g_mutex_unlock (status->priv->mutex); } PandoraState diff --git a/pandora_applet/src/pandora-status.h b/pandora_applet/src/pandora-status.h index 540f1ae447..2e2e0fde36 100644 --- a/pandora_applet/src/pandora-status.h +++ b/pandora_applet/src/pandora-status.h @@ -27,10 +27,10 @@ #include typedef enum { - STATE_INVALID, - STATE_UNKNOWN, - STATE_OK, - STATE_BAD + STATE_INVALID = 0, + STATE_UNKNOWN = 1, + STATE_OK = 2, + STATE_BAD = 3 } PandoraState; #define PANDORA_STATUS_TYPE (pandora_status_get_type()) @@ -55,9 +55,10 @@ typedef struct { } PandoraStatusClass; PandoraStatus *pandora_status_new (void); -void pandora_status_set_alerts (PandoraStatus *status, PandoraState value); -void pandora_status_set_agents (PandoraStatus *status, PandoraState value); -void pandora_status_set_servers (PandoraStatus *status, PandoraState value); +void pandora_status_set_all (PandoraStatus *status, + PandoraState alerts, + PandoraState agents, + PandoraState servers); PandoraState pandora_status_get_alerts (PandoraStatus *status); PandoraState pandora_status_get_agents (PandoraStatus *status);