manager: Use GcalCalendar internally

Make GcalManager operate on GcalCalendar instead of ESources
internally. This is far from being a total switch.
This commit is contained in:
Georges Basile Stavracas Neto
2019-05-04 12:05:39 -03:00
parent b9848e5443
commit 5aa0dd910a
2 changed files with 71 additions and 134 deletions
+70 -134
View File
@@ -51,17 +51,11 @@ typedef struct
gboolean search_done; gboolean search_done;
} ViewStateData; } ViewStateData;
typedef struct
{
ECalClient *client;
gboolean connected;
} GcalManagerUnit;
typedef struct typedef struct
{ {
gchar *event_uid; gchar *event_uid;
GcalManagerUnit *unit; GcalCalendar *calendar;
GcalManagerUnit *new_unit; GcalCalendar *new_calendar;
ECalComponent *new_component; ECalComponent *new_component;
GcalManager *manager; GcalManager *manager;
} MoveEventData; } MoveEventData;
@@ -121,13 +115,6 @@ free_async_ops_data (AsyncOpsData *data)
g_free (data); g_free (data);
} }
static void
free_unit_data (GcalManagerUnit *data)
{
g_object_unref (data->client);
g_free (data);
}
static gboolean static gboolean
gather_events (ECalDataModel *data_model, gather_events (ECalDataModel *data_model,
ECalClient *client, ECalClient *client,
@@ -161,8 +148,6 @@ static void
remove_source (GcalManager *self, remove_source (GcalManager *self,
ESource *source) ESource *source)
{ {
GcalManagerUnit *unit;
GCAL_ENTRY; GCAL_ENTRY;
g_return_if_fail (GCAL_IS_MANAGER (self)); g_return_if_fail (GCAL_IS_MANAGER (self));
@@ -171,10 +156,6 @@ remove_source (GcalManager *self,
e_cal_data_model_remove_client (self->e_data_model, e_cal_data_model_remove_client (self->e_data_model,
e_source_get_uid (source)); e_source_get_uid (source));
unit = g_hash_table_lookup (self->clients, source);
if (unit && unit->client)
g_signal_handlers_disconnect_by_data (unit->client, self);
g_hash_table_remove (self->clients, source); g_hash_table_remove (self->clients, source);
g_signal_emit (self, signals[SOURCE_REMOVED], 0, source); g_signal_emit (self, signals[SOURCE_REMOVED], 0, source);
@@ -196,27 +177,6 @@ source_changed (GcalManager *self,
GCAL_EXIT; GCAL_EXIT;
} }
static void
on_client_readonly_changed (EClient *client,
GParamSpec *pspec,
gpointer user_data)
{
GcalManager *self;
ESource *source;
GcalManagerUnit *unit;
GCAL_ENTRY;
self = GCAL_MANAGER (user_data);
source = e_client_get_source (client);
unit = g_hash_table_lookup (self->clients, source);
if (unit && is_source_enabled (source))
source_changed (self, source);
GCAL_EXIT;
}
static void static void
on_client_refreshed (GObject *source_object, on_client_refreshed (GObject *source_object,
GAsyncResult *result, GAsyncResult *result,
@@ -242,62 +202,41 @@ on_client_refreshed (GObject *source_object,
} }
static void static void
on_client_connected (GObject *source_object, on_calendar_created_cb (GObject *source_object,
GAsyncResult *result, GAsyncResult *result,
gpointer user_data) gpointer user_data)
{ {
GcalManagerUnit *unit; g_autoptr (GError) error = NULL;
ESourceRefresh *refresh_extension; ESourceRefresh *refresh_extension;
ESourceOffline *offline_extension; ESourceOffline *offline_extension;
GcalCalendar *calendar;
GcalManager *self; GcalManager *self;
ECalClient *client; ECalClient *client;
ESource *source; ESource *source;
GError *error; gboolean visible;
gboolean enabled;
GCAL_ENTRY;
self = GCAL_MANAGER (user_data); self = GCAL_MANAGER (user_data);
source = e_client_get_source (E_CLIENT (source_object)); calendar = gcal_calendar_new_finish (result, &error);
enabled = is_source_enabled (source);
self->sources_at_launch--; if (error &&
!g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED) &&
if (self->sources_at_launch == 0) !g_error_matches (error, GCAL_CALENDAR_ERROR, GCAL_CALENDAR_ERROR_NOT_CALENDAR))
g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_LOADING]);
error = NULL;
client = E_CAL_CLIENT (e_cal_client_connect_finish (result, &error));
if (error)
{ {
remove_source (GCAL_MANAGER (user_data), source); g_warning ("Failed to open/connect to calendar: %s", error->message);
g_warning ("%s: Failed to open/connect '%s': %s",
G_STRFUNC,
e_source_get_display_name (source),
error->message);
g_object_unref (source);
g_error_free (error);
return; return;
} }
g_object_set_data (G_OBJECT (source), "client", client);
unit = g_new0 (GcalManagerUnit, 1);
unit->connected = TRUE;
unit->client = g_object_ref (client);
g_hash_table_insert (self->clients, source, unit);
g_debug ("Source %s (%s) connected", g_debug ("Source %s (%s) connected",
e_source_get_display_name (source), gcal_calendar_get_name (calendar),
e_source_get_uid (source)); gcal_calendar_get_id (calendar));
/* notify the readonly property */ visible = gcal_calendar_get_visible (calendar);
g_signal_connect (client, "notify::readonly", G_CALLBACK (on_client_readonly_changed), user_data); client = gcal_calendar_get_client (calendar);
source = gcal_calendar_get_source (calendar);
if (enabled) g_hash_table_insert (self->clients, source, calendar);
if (visible)
{ {
e_cal_data_model_add_client (self->e_data_model, client); e_cal_data_model_add_client (self->e_data_model, client);
if (self->shell_search_data_model != NULL) if (self->shell_search_data_model != NULL)
@@ -305,7 +244,7 @@ on_client_connected (GObject *source_object,
} }
/* refresh client when it's added */ /* refresh client when it's added */
if (enabled && e_client_check_refresh_supported (E_CLIENT (client))) if (visible && e_client_check_refresh_supported (E_CLIENT (client)))
e_client_refresh (E_CLIENT (client), NULL, on_client_refreshed, user_data); e_client_refresh (E_CLIENT (client), NULL, on_client_refreshed, user_data);
/* Cache all the online calendars, so the user can see them offline */ /* Cache all the online calendars, so the user can see them offline */
@@ -323,11 +262,7 @@ on_client_connected (GObject *source_object,
NULL, NULL,
NULL); NULL);
g_signal_emit (GCAL_MANAGER (user_data), signals[SOURCE_ADDED], 0, source, enabled); g_signal_emit (self, signals[SOURCE_ADDED], 0, gcal_calendar_get_source (calendar), visible);
g_clear_object (&client);
GCAL_EXIT;
} }
static void static void
@@ -336,22 +271,16 @@ load_source (GcalManager *self,
{ {
GCAL_ENTRY; GCAL_ENTRY;
if (g_hash_table_lookup (self->clients, source) == NULL && if (g_hash_table_contains (self->clients, source))
e_source_has_extension (source, E_SOURCE_EXTENSION_CALENDAR))
{
/* NULL: because maybe the operation cannot be really cancelled */
e_cal_client_connect (source,
E_CAL_CLIENT_SOURCE_TYPE_EVENTS, 1, NULL,
on_client_connected,
self);
}
else
{ {
g_warning ("%s: Skipping already loaded source: %s", g_warning ("%s: Skipping already loaded source: %s",
G_STRFUNC, G_STRFUNC,
e_source_get_uid (source)); e_source_get_uid (source));
return;
} }
gcal_calendar_new (source, self->async_ops, on_calendar_created_cb, self);
GCAL_EXIT; GCAL_EXIT;
} }
@@ -1088,19 +1017,21 @@ gcal_manager_query_client_data (GcalManager *self,
ESource *source, ESource *source,
const gchar *field) const gchar *field)
{ {
GcalManagerUnit *unit; GcalCalendar *calendar;
ECalClient *client;
gchar *out; gchar *out;
GCAL_ENTRY; GCAL_ENTRY;
g_return_val_if_fail (GCAL_IS_MANAGER (self), NULL); g_return_val_if_fail (GCAL_IS_MANAGER (self), NULL);
unit = g_hash_table_lookup (self->clients, source); calendar = g_hash_table_lookup (self->clients, source);
if (!unit) if (!calendar)
GCAL_RETURN (NULL); GCAL_RETURN (NULL);
g_object_get (unit->client, field, &out, NULL); client = gcal_calendar_get_client (calendar);
g_object_get (client, field, &out, NULL);
GCAL_RETURN (out); GCAL_RETURN (out);
} }
@@ -1173,14 +1104,15 @@ gcal_manager_enable_source (GcalManager *self,
ESource *source) ESource *source)
{ {
ESourceSelectable *selectable; ESourceSelectable *selectable;
GcalManagerUnit *unit; GcalCalendar *calendar;
ECalClient *client;
GCAL_ENTRY; GCAL_ENTRY;
g_return_if_fail (GCAL_IS_MANAGER (self)); g_return_if_fail (GCAL_IS_MANAGER (self));
g_return_if_fail (E_IS_SOURCE (source)); g_return_if_fail (E_IS_SOURCE (source));
unit = g_hash_table_lookup (self->clients, source); calendar = g_hash_table_lookup (self->clients, source);
selectable = e_source_get_extension (source, E_SOURCE_EXTENSION_CALENDAR); selectable = e_source_get_extension (source, E_SOURCE_EXTENSION_CALENDAR);
if (is_source_enabled (source)) if (is_source_enabled (source))
@@ -1190,10 +1122,11 @@ gcal_manager_enable_source (GcalManager *self,
return; return;
} }
e_cal_data_model_add_client (self->e_data_model, unit->client); client = gcal_calendar_get_client (calendar);
e_cal_data_model_add_client (self->e_data_model, client);
if (self->shell_search_data_model) if (self->shell_search_data_model)
e_cal_data_model_add_client (self->shell_search_data_model, unit->client); e_cal_data_model_add_client (self->shell_search_data_model, client);
g_signal_emit (self, signals[SOURCE_ENABLED], 0, source, TRUE); g_signal_emit (self, signals[SOURCE_ENABLED], 0, source, TRUE);
@@ -1300,12 +1233,15 @@ gcal_manager_refresh (GcalManager *self)
/* refresh clients */ /* refresh clients */
for (l = clients; l != NULL; l = l->next) for (l = clients; l != NULL; l = l->next)
{ {
GcalManagerUnit *unit = l->data; GcalCalendar *calendar = l->data;
EClient *client;
if (!unit->connected || ! e_client_check_refresh_supported (E_CLIENT (unit->client))) client = E_CLIENT (gcal_calendar_get_client (calendar));
if (!e_client_check_refresh_supported (client))
continue; continue;
e_client_refresh (E_CLIENT (unit->client), e_client_refresh (client,
NULL, NULL,
on_client_refreshed, on_client_refreshed,
self); self);
@@ -1329,16 +1265,16 @@ gboolean
gcal_manager_is_client_writable (GcalManager *self, gcal_manager_is_client_writable (GcalManager *self,
ESource *source) ESource *source)
{ {
GcalManagerUnit *unit; GcalCalendar *calendar;
GCAL_ENTRY; GCAL_ENTRY;
unit = g_hash_table_lookup (self->clients, source); calendar = g_hash_table_lookup (self->clients, source);
if (!unit) if (!calendar)
GCAL_RETURN (FALSE); GCAL_RETURN (FALSE);
GCAL_RETURN (unit->connected && !e_client_is_readonly (E_CLIENT (unit->client))); GCAL_RETURN (!gcal_calendar_is_read_only (calendar));
} }
/** /**
@@ -1352,9 +1288,9 @@ void
gcal_manager_create_event (GcalManager *self, gcal_manager_create_event (GcalManager *self,
GcalEvent *event) GcalEvent *event)
{ {
GcalManagerUnit *unit;
icalcomponent *new_event_icalcomp; icalcomponent *new_event_icalcomp;
ECalComponent *component; ECalComponent *component;
GcalCalendar *calendar;
AsyncOpsData *data; AsyncOpsData *data;
ESource *source; ESource *source;
@@ -1365,9 +1301,7 @@ gcal_manager_create_event (GcalManager *self,
source = gcal_event_get_source (event); source = gcal_event_get_source (event);
component = gcal_event_get_component (event); component = gcal_event_get_component (event);
unit = g_hash_table_lookup (self->clients, source); calendar = g_hash_table_lookup (self->clients, source);
g_return_if_fail (unit != NULL);
new_event_icalcomp = e_cal_component_get_icalcomponent (component); new_event_icalcomp = e_cal_component_get_icalcomponent (component);
@@ -1375,7 +1309,7 @@ gcal_manager_create_event (GcalManager *self,
data->event = g_object_ref (event); data->event = g_object_ref (event);
data->manager = self; data->manager = self;
e_cal_client_create_object (unit->client, e_cal_client_create_object (gcal_calendar_get_client (calendar),
new_event_icalcomp, new_event_icalcomp,
self->async_ops, self->async_ops,
on_event_created, on_event_created,
@@ -1397,15 +1331,15 @@ gcal_manager_update_event (GcalManager *self,
GcalEvent *event, GcalEvent *event,
GcalRecurrenceModType mod) GcalRecurrenceModType mod)
{ {
GcalManagerUnit *unit;
ECalComponent *component; ECalComponent *component;
GcalCalendar *calendar;
GCAL_ENTRY; GCAL_ENTRY;
g_return_if_fail (GCAL_IS_MANAGER (self)); g_return_if_fail (GCAL_IS_MANAGER (self));
g_return_if_fail (GCAL_IS_EVENT (event)); g_return_if_fail (GCAL_IS_EVENT (event));
unit = g_hash_table_lookup (self->clients, gcal_event_get_source (event)); calendar = g_hash_table_lookup (self->clients, gcal_event_get_source (event));
component = gcal_event_get_component (event); component = gcal_event_get_component (event);
/* /*
@@ -1424,7 +1358,7 @@ gcal_manager_update_event (GcalManager *self,
*/ */
g_object_ref (component); g_object_ref (component);
e_cal_client_modify_object (unit->client, e_cal_client_modify_object (gcal_calendar_get_client (calendar),
e_cal_component_get_icalcomponent (component), e_cal_component_get_icalcomponent (component),
(ECalObjModType) mod, (ECalObjModType) mod,
NULL, NULL,
@@ -1447,8 +1381,8 @@ gcal_manager_remove_event (GcalManager *self,
GcalEvent *event, GcalEvent *event,
GcalRecurrenceModType mod) GcalRecurrenceModType mod)
{ {
GcalManagerUnit *unit;
ECalComponent *component; ECalComponent *component;
GcalCalendar *calendar;
gchar *rid; gchar *rid;
const gchar *uid; const gchar *uid;
@@ -1458,7 +1392,7 @@ gcal_manager_remove_event (GcalManager *self,
g_return_if_fail (GCAL_IS_EVENT (event)); g_return_if_fail (GCAL_IS_EVENT (event));
component = gcal_event_get_component (event); component = gcal_event_get_component (event);
unit = g_hash_table_lookup (self->clients, gcal_event_get_source (event)); calendar = g_hash_table_lookup (self->clients, gcal_event_get_source (event));
rid = NULL; rid = NULL;
e_cal_component_get_uid (component, &uid); e_cal_component_get_uid (component, &uid);
@@ -1466,7 +1400,7 @@ gcal_manager_remove_event (GcalManager *self,
if (gcal_event_has_recurrence (event)) if (gcal_event_has_recurrence (event))
rid = e_cal_component_get_recurid_as_string (component); rid = e_cal_component_get_recurid_as_string (component);
e_cal_client_remove_object (unit->client, e_cal_client_remove_object (gcal_calendar_get_client (calendar),
uid, uid,
mod == GCAL_RECURRENCE_MOD_ALL ? NULL : rid, mod == GCAL_RECURRENCE_MOD_ALL ? NULL : rid,
(ECalObjModType) mod, (ECalObjModType) mod,
@@ -1497,7 +1431,7 @@ gcal_manager_move_event_to_source (GcalManager *self,
ECalComponent *ecomponent; ECalComponent *ecomponent;
ECalComponent *clone; ECalComponent *clone;
icalcomponent *comp; icalcomponent *comp;
GcalManagerUnit *unit; GcalCalendar *calendar;
ECalComponentId *id; ECalComponentId *id;
GError *error; GError *error;
@@ -1510,13 +1444,13 @@ gcal_manager_move_event_to_source (GcalManager *self,
error = NULL; error = NULL;
/* First, try to create the component on the destination source */ /* First, try to create the component on the destination source */
unit = g_hash_table_lookup (self->clients, dest); calendar = g_hash_table_lookup (self->clients, dest);
ecomponent = gcal_event_get_component (event); ecomponent = gcal_event_get_component (event);
clone = e_cal_component_clone (ecomponent); clone = e_cal_component_clone (ecomponent);
comp = e_cal_component_get_icalcomponent (clone); comp = e_cal_component_get_icalcomponent (clone);
e_cal_client_create_object_sync (unit->client, e_cal_client_create_object_sync (gcal_calendar_get_client (calendar),
comp, comp,
NULL, NULL,
NULL, NULL,
@@ -1535,11 +1469,11 @@ gcal_manager_move_event_to_source (GcalManager *self,
* created, try to remove the old component. Data loss it the last * created, try to remove the old component. Data loss it the last
* thing we want to happen here. * thing we want to happen here.
*/ */
unit = g_hash_table_lookup (self->clients, gcal_event_get_source (event)); calendar = g_hash_table_lookup (self->clients, gcal_event_get_source (event));
id = e_cal_component_get_id (ecomponent); id = e_cal_component_get_id (ecomponent);
e_cal_client_remove_object_sync (unit->client, e_cal_client_remove_object_sync (gcal_calendar_get_client (calendar),
id->uid, id->uid,
id->rid, id->rid,
E_CAL_OBJ_MOD_THIS, E_CAL_OBJ_MOD_THIS,
@@ -1675,8 +1609,10 @@ gcal_manager_startup (GcalManager *self)
GCAL_ENTRY; GCAL_ENTRY;
self->clients = g_hash_table_new_full ((GHashFunc) e_source_hash, (GEqualFunc) e_source_equal, self->clients = g_hash_table_new_full ((GHashFunc) e_source_hash,
g_object_unref, (GDestroyNotify) free_unit_data); (GEqualFunc) e_source_equal,
g_object_unref,
g_object_unref);
/* reading sources and schedule its connecting */ /* reading sources and schedule its connecting */
self->source_registry = e_source_registry_new_sync (NULL, &error); self->source_registry = e_source_registry_new_sync (NULL, &error);
@@ -1783,10 +1719,10 @@ ECalClient*
gcal_manager_get_client (GcalManager *self, gcal_manager_get_client (GcalManager *self,
ESource *source) ESource *source)
{ {
GcalManagerUnit *unit; GcalCalendar *calendar;
g_return_val_if_fail (GCAL_IS_MANAGER (self), NULL); g_return_val_if_fail (GCAL_IS_MANAGER (self), NULL);
unit = g_hash_table_lookup (self->clients, source); calendar = g_hash_table_lookup (self->clients, source);
return unit ? unit->client : NULL; return calendar ? gcal_calendar_get_client (calendar) : NULL;
} }
+1
View File
@@ -20,6 +20,7 @@
#define __GCAL_MANAGER_H__ #define __GCAL_MANAGER_H__
#include "e-cal-data-model.h" #include "e-cal-data-model.h"
#include "gcal-calendar.h"
#include "gcal-event.h" #include "gcal-event.h"
#include <libical/icaltime.h> #include <libical/icaltime.h>