shell-provider: use GcalEvent instead of event data

Following the sequence of porting commits, make the Shell's
search provider class handle events using GcalEvent classes
instead of the old GcalEventData structure.
This commit is contained in:
Georges Basile Stavracas Neto
2016-02-14 12:17:37 -02:00
parent e31e6eeac0
commit eb360dc809
5 changed files with 56 additions and 133 deletions
+2 -2
View File
@@ -563,8 +563,8 @@ gcal_application_set_uuid (GcalApplication *application,
void void
gcal_application_set_initial_date (GcalApplication *application, gcal_application_set_initial_date (GcalApplication *application,
const icaltimetype *date) GDateTime *date)
{ {
g_free (application->initial_date); g_free (application->initial_date);
application->initial_date = gcal_dup_icaltime (date); application->initial_date = datetime_to_icaltime (date);
} }
+2 -1
View File
@@ -35,8 +35,9 @@ GcalManager* gcal_application_get_manager (GcalApplication *app);
GSettings* gcal_application_get_settings (GcalApplication *app); GSettings* gcal_application_get_settings (GcalApplication *app);
void gcal_application_set_uuid (GcalApplication *application, void gcal_application_set_uuid (GcalApplication *application,
const gchar *uuid); const gchar *uuid);
void gcal_application_set_initial_date (GcalApplication *application, void gcal_application_set_initial_date (GcalApplication *application,
const icaltimetype *date); GDateTime *date);
G_END_DECLS G_END_DECLS
+16 -37
View File
@@ -17,7 +17,6 @@
* with this program. If not, see <http://www.gnu.org/licenses/>. * with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
#include "gcal-event.h"
#include "gcal-manager.h" #include "gcal-manager.h"
#include "gcal-utils.h" #include "gcal-utils.h"
@@ -263,25 +262,6 @@ free_unit_data (GcalManagerUnit *data)
g_free (data); g_free (data);
} }
static gboolean
gather_components (ECalDataModel *data_model,
ECalClient *client,
const ECalComponentId *id,
ECalComponent *comp,
time_t instance_start,
time_t instance_end,
gpointer user_data)
{
GList **result = user_data;
GcalEventData *new_data = g_new0 (GcalEventData, 1);
new_data->source = e_client_get_source (E_CLIENT (client));
new_data->event_component = g_object_ref (comp);
*result = g_list_append (*result, new_data);/* FIXME: add me sorted */
return TRUE;
}
static gboolean static gboolean
gather_events (ECalDataModel *data_model, gather_events (ECalDataModel *data_model,
ECalClient *client, ECalClient *client,
@@ -1112,7 +1092,7 @@ gcal_manager_get_shell_search_events (GcalManager *manager)
e_cal_data_model_get_subscriber_range (manager->shell_search_data_model, manager->search_view_data->subscriber, e_cal_data_model_get_subscriber_range (manager->shell_search_data_model, manager->search_view_data->subscriber,
&range_start, &range_end); &range_start, &range_end);
e_cal_data_model_foreach_component (manager->shell_search_data_model, range_start, range_end, gather_components, &list); e_cal_data_model_foreach_component (manager->shell_search_data_model, range_start, range_end, gather_events, &list);
return list; return list;
} }
@@ -1552,39 +1532,38 @@ gcal_manager_load_completed (GcalManager *manager)
return manager->sources_at_launch == 0; return manager->sources_at_launch == 0;
} }
GcalEventData* GcalEvent*
gcal_manager_get_event_from_shell_search (GcalManager *manager, gcal_manager_get_event_from_shell_search (GcalManager *manager,
const gchar *uuid) const gchar *uuid)
{ {
GcalEvent *new_event;
GList *l, *list;
time_t range_start, range_end; time_t range_start, range_end;
GList *l, *list = NULL;
GcalEventData *data, *new_data = NULL; list = NULL;
gchar *cuuid; new_event = NULL;
e_cal_data_model_get_subscriber_range (manager->shell_search_data_model, manager->search_view_data->subscriber, e_cal_data_model_get_subscriber_range (manager->shell_search_data_model, manager->search_view_data->subscriber,
&range_start, &range_end); &range_start, &range_end);
e_cal_data_model_foreach_component (manager->shell_search_data_model, range_start, range_end, gather_components, &list); e_cal_data_model_foreach_component (manager->shell_search_data_model, range_start, range_end, gather_events, &list);
if (list != NULL)
new_data = g_new0 (GcalEventData, 1);
for (l = list; l != NULL; l = g_list_next (l)) for (l = list; l != NULL; l = g_list_next (l))
{ {
data = l->data; GcalEvent *event;
cuuid = get_uuid_from_component (data->source, data->event_component);
if (g_strcmp0 (cuuid, uuid) == 0) event = l->data;
if (g_strcmp0 (gcal_event_get_uid (event), uuid) == 0)
{ {
new_data->source = data->source; new_event = event;
new_data->event_component = g_object_ref (data->event_component);
} }
g_object_unref (data->event_component); g_object_unref (event);
g_free (data);
g_free (cuuid);
} }
g_list_free (list); g_list_free (list);
return new_data; return new_event;
} }
gboolean gboolean
+2 -1
View File
@@ -21,6 +21,7 @@
#define __GCAL_MANAGER_H__ #define __GCAL_MANAGER_H__
#include "e-cal-data-model.h" #include "e-cal-data-model.h"
#include "gcal-event.h"
#include <libical/icaltime.h> #include <libical/icaltime.h>
#include <goa/goa.h> #include <goa/goa.h>
@@ -134,7 +135,7 @@ GList* gcal_manager_get_events (GcalManager *manager
gboolean gcal_manager_load_completed (GcalManager *manager); gboolean gcal_manager_load_completed (GcalManager *manager);
GcalEventData* gcal_manager_get_event_from_shell_search (GcalManager *manager, GcalEvent* gcal_manager_get_event_from_shell_search (GcalManager *manager,
const gchar *uuid); const gchar *uuid);
gboolean gcal_manager_is_goa_client_ready (GcalManager *manager); gboolean gcal_manager_is_goa_client_ready (GcalManager *manager);
+34 -92
View File
@@ -20,6 +20,7 @@
#include "gcal-shell-search-provider-generated.h" #include "gcal-shell-search-provider-generated.h"
#include "gcal-application.h" #include "gcal-application.h"
#include "gcal-event.h"
#include "gcal-window.h" #include "gcal-window.h"
#include "gcal-utils.h" #include "gcal-utils.h"
@@ -54,40 +55,12 @@ G_DEFINE_TYPE_WITH_CODE (GcalShellSearchProvider, gcal_shell_search_provider, G_
G_ADD_PRIVATE (GcalShellSearchProvider) G_ADD_PRIVATE (GcalShellSearchProvider)
G_IMPLEMENT_INTERFACE (E_TYPE_CAL_DATA_MODEL_SUBSCRIBER, gcal_subscriber_interface_init)); G_IMPLEMENT_INTERFACE (E_TYPE_CAL_DATA_MODEL_SUBSCRIBER, gcal_subscriber_interface_init));
static void
free_event_data (gpointer data)
{
GcalEventData *event_data = data;
g_object_unref (event_data->event_component);
g_free (event_data);
}
static gint static gint
sort_event_data (gconstpointer a, sort_event_data (GcalEvent *a,
gconstpointer b, GcalEvent *b,
gpointer user_data) gpointer user_data)
{ {
ECalComponent *comp1, *comp2; return gcal_event_compare_with_current (a, b, user_data);
ECalComponentDateTime date1, date2;
gint result;
comp1 = ((GcalEventData*) a)->event_component;
comp2 = ((GcalEventData*) b)->event_component;
e_cal_component_get_dtstart (comp1, &date1);
e_cal_component_get_dtstart (comp2, &date2);
if (date1.tzid != NULL)
date1.value->zone = icaltimezone_get_builtin_timezone_from_tzid (date1.tzid);
if (date2.tzid != NULL)
date2.value->zone = icaltimezone_get_builtin_timezone_from_tzid (date2.tzid);
result = icaltime_compare_with_current (date1.value, date2.value, user_data);
e_cal_component_free_datetime (&date1);
e_cal_component_free_datetime (&date2);
return result;
} }
static gboolean static gboolean
@@ -214,22 +187,14 @@ get_result_metas_cb (GcalShellSearchProvider *search_provider,
GcalShellSearchProvider2 *skel) GcalShellSearchProvider2 *skel)
{ {
GcalShellSearchProviderPrivate *priv; GcalShellSearchProviderPrivate *priv;
gint i; GDateTime *local_datetime;
gchar *uuid, *desc;
const gchar* location;
g_autoptr(GTimeZone) tz;
g_autoptr (GDateTime) datetime;
g_autoptr (GDateTime) local_datetime;
ECalComponentDateTime dtstart;
gchar *start_date;
ECalComponentText summary;
GdkRGBA color;
GVariantBuilder abuilder, builder; GVariantBuilder abuilder, builder;
GVariant *icon_variant; GVariant *icon_variant;
GcalEventData *data; GcalEvent *event;
GdkPixbuf *gicon; GdkPixbuf *gicon;
gchar *uuid, *desc;
gchar *start_date;
gint i;
priv = search_provider->priv; priv = search_provider->priv;
@@ -237,50 +202,29 @@ get_result_metas_cb (GcalShellSearchProvider *search_provider,
for (i = 0; i < g_strv_length (results); i++) for (i = 0; i < g_strv_length (results); i++)
{ {
uuid = results[i]; uuid = results[i];
data = g_hash_table_lookup (priv->events, uuid); event = g_hash_table_lookup (priv->events, uuid);
g_variant_builder_init (&builder, G_VARIANT_TYPE ("a{sv}")); g_variant_builder_init (&builder, G_VARIANT_TYPE ("a{sv}"));
g_variant_builder_add (&builder, "{sv}", "id", g_variant_new_string (uuid)); g_variant_builder_add (&builder, "{sv}", "id", g_variant_new_string (uuid));
g_variant_builder_add (&builder, "{sv}", "name", g_variant_new_string (gcal_event_get_summary (event)));
e_cal_component_get_summary (data->event_component, &summary); gicon = get_circle_pixbuf_from_color (gcal_event_get_color (event), 128);
g_variant_builder_add (&builder, "{sv}", "name", g_variant_new_string (summary.value));
get_color_name_from_source (data->source, &color);
gicon = get_circle_pixbuf_from_color (&color, 128);
icon_variant = g_icon_serialize (G_ICON (gicon)); icon_variant = g_icon_serialize (G_ICON (gicon));
g_variant_builder_add (&builder, "{sv}", "icon", icon_variant); g_variant_builder_add (&builder, "{sv}", "icon", icon_variant);
g_object_unref (gicon); g_object_unref (gicon);
g_variant_unref (icon_variant); g_variant_unref (icon_variant);
e_cal_component_get_dtstart (data->event_component, &dtstart); local_datetime = g_date_time_to_local (gcal_event_get_date_start (event));
if (dtstart.tzid != NULL)
tz = g_time_zone_new (dtstart.tzid);
else if (dtstart.value->zone != NULL)
tz = g_time_zone_new (icaltimezone_get_tzid ((icaltimezone*) dtstart.value->zone));
else
tz = g_time_zone_new_local ();
datetime = g_date_time_new (tz,
dtstart.value->year, dtstart.value->month, dtstart.value->day,
dtstart.value->hour, dtstart.value->minute, dtstart.value->second);
local_datetime = g_date_time_to_local (datetime);
/* FIXME: respect 24h time format */ /* FIXME: respect 24h time format */
start_date = g_date_time_format (local_datetime, start_date = g_date_time_format (local_datetime, gcal_event_get_all_day (event) ? "%x" : "%c");
(dtstart.value->is_date == 1) ? "%x" : "%c");
e_cal_component_free_datetime (&dtstart);
e_cal_component_get_location (data->event_component, &location); if (gcal_event_get_location (event))
if (location != NULL) desc = g_strconcat (start_date, ". ", gcal_event_get_location (event), NULL);
desc = g_strconcat (start_date, ". ", location, NULL);
else else
desc = g_strdup (start_date); desc = g_strdup (start_date);
g_variant_builder_add (&builder, "{sv}", "description", g_variant_new_string (desc)); g_variant_builder_add (&builder, "{sv}", "description", g_variant_new_string (desc));
g_free (start_date);
g_free (desc);
g_variant_builder_add_value (&abuilder, g_variant_builder_end (&builder)); g_variant_builder_add_value (&abuilder, g_variant_builder_end (&builder));
} }
g_dbus_method_invocation_return_value (invocation, g_variant_new ("(aa{sv})", &abuilder)); g_dbus_method_invocation_return_value (invocation, g_variant_new ("(aa{sv})", &abuilder));
@@ -298,25 +242,22 @@ activate_result_cb (GcalShellSearchProvider *search_provider,
{ {
GcalShellSearchProviderPrivate *priv; GcalShellSearchProviderPrivate *priv;
GApplication *application; GApplication *application;
GcalEventData *data; GcalEvent *event;
ECalComponentDateTime dtstart; GDateTime *dtstart;
priv = search_provider->priv; priv = search_provider->priv;
application = g_application_get_default (); application = g_application_get_default ();
data = gcal_manager_get_event_from_shell_search (priv->manager, result); event = gcal_manager_get_event_from_shell_search (priv->manager, result);
e_cal_component_get_dtstart (data->event_component, &dtstart); dtstart = gcal_event_get_date_start (event);
if (dtstart.tzid != NULL)
dtstart.value->zone = icaltimezone_get_builtin_timezone_from_tzid (dtstart.tzid);
gcal_application_set_uuid (GCAL_APPLICATION (application), result); gcal_application_set_uuid (GCAL_APPLICATION (application), result);
gcal_application_set_initial_date (GCAL_APPLICATION (application), dtstart.value); gcal_application_set_initial_date (GCAL_APPLICATION (application), dtstart);
e_cal_component_free_datetime (&dtstart);
g_application_activate (application); g_application_activate (application);
g_object_unref (data->event_component); g_clear_object (&event);
g_free (data);
return TRUE; return TRUE;
} }
@@ -355,9 +296,6 @@ query_completed_cb (GcalShellSearchProvider *search_provider,
GcalShellSearchProviderPrivate *priv = search_provider->priv; GcalShellSearchProviderPrivate *priv = search_provider->priv;
GList *events, *l; GList *events, *l;
GVariantBuilder builder; GVariantBuilder builder;
GcalEventData *data;
gchar *uuid;
time_t current_time_t; time_t current_time_t;
g_hash_table_remove_all (priv->events); g_hash_table_remove_all (priv->events);
@@ -372,15 +310,19 @@ query_completed_cb (GcalShellSearchProvider *search_provider,
g_variant_builder_init (&builder, G_VARIANT_TYPE ("as")); g_variant_builder_init (&builder, G_VARIANT_TYPE ("as"));
current_time_t = time (NULL); current_time_t = time (NULL);
events = g_list_sort_with_data (events, sort_event_data, &current_time_t); events = g_list_sort_with_data (events, (GCompareDataFunc) sort_event_data, &current_time_t);
for (l = events; l != NULL; l = g_list_next (l)) for (l = events; l != NULL; l = g_list_next (l))
{ {
data = l->data; const gchar *uid;
uuid = get_uuid_from_component (data->source, data->event_component);
g_variant_builder_add (&builder, "s", uuid); uid = gcal_event_get_uid (l->data);
g_hash_table_insert (priv->events, uuid, data); if (g_hash_table_contains (priv->events, uid))
continue;
g_variant_builder_add (&builder, "s", uid);
g_hash_table_insert (priv->events, g_strdup (uid), l->data);
} }
g_list_free (events); g_list_free (events);
@@ -456,7 +398,7 @@ gcal_shell_search_provider_init (GcalShellSearchProvider *self)
{ {
GcalShellSearchProviderPrivate *priv = gcal_shell_search_provider_get_instance_private (self); GcalShellSearchProviderPrivate *priv = gcal_shell_search_provider_get_instance_private (self);
priv->events = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, free_event_data); priv->events = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_object_unref);
priv->skel = gcal_shell_search_provider2_skeleton_new (); priv->skel = gcal_shell_search_provider2_skeleton_new ();
g_signal_connect_swapped (priv->skel, "handle-get-initial-result-set", G_CALLBACK (get_initial_result_set_cb), self); g_signal_connect_swapped (priv->skel, "handle-get-initial-result-set", G_CALLBACK (get_initial_result_set_cb), self);