Added support for moving events between sources.

Added support in GcalManager for moving events.
The implementation is pretty simplistic. It doesn't handle
any errors, but since I'm lazy I'm planning to let it that
way till the day bugs start appearing.
This commit is contained in:
Erick Pérez Castellanos
2012-12-01 15:28:53 -05:00
committed by Rene A. Viant Moran
parent 21ab796fb3
commit 6ada73c619
2 changed files with 104 additions and 2 deletions
+99 -2
View File
@@ -71,6 +71,17 @@ struct _DeleteEventData
typedef struct _DeleteEventData DeleteEventData;
struct _MoveEventData
{
gchar *event_uid;
GcalManagerUnit *unit;
GcalManagerUnit *new_unit;
ECalComponent *new_component;
GcalManager *manager;
};
typedef struct _MoveEventData MoveEventData;
struct _GcalManagerPrivate
{
/**
@@ -164,6 +175,11 @@ static void gcal_manager_on_event_removed (GObject *sour
GAsyncResult *result,
gpointer user_data);
static void gcal_manager_on_event_removed_for_move (GObject *source_object,
GAsyncResult *result,
gpointer user_data);
static void gcal_manager_send_fake_events_added (GcalManager *manager);
static void gcal_manager_send_fave_events_removed (GcalManager *manager,
@@ -869,6 +885,48 @@ gcal_manager_on_event_removed (GObject *source_object,
g_free (data);
}
static void
gcal_manager_on_event_removed_for_move (GObject *source_object,
GAsyncResult *result,
gpointer user_data)
{
GcalManagerPrivate *priv;
ECalClient *client;
MoveEventData *data;
GError *error;
client = E_CAL_CLIENT (source_object);
data = (MoveEventData*) user_data;
priv = ((GcalManager*) data->manager)->priv;
error = NULL;
if (e_cal_client_remove_object_finish (client, result, &error))
{
icalcomponent *new_event_icalcomp;
/* removing events from hash */
g_hash_table_remove (data->unit->events, data->event_uid);
e_cal_component_commit_sequence (data->new_component);
new_event_icalcomp =
e_cal_component_get_icalcomponent (data->new_component);
e_cal_client_create_object (data->new_unit->client,
new_event_icalcomp,
priv->async_ops,
gcal_manager_on_event_created,
data->manager);
g_object_unref (data->new_component);
}
else
{
//FIXME: do something when there was some error
;
}
g_free (data->event_uid);
g_free (data);
}
static void
gcal_manager_send_fake_events_added (GcalManager *manager)
{
@@ -1627,9 +1685,7 @@ gcal_manager_create_event (GcalManager *manager,
if (final_date != NULL)
{
g_debug ("setting final_date");
*dt.value = *final_date;
g_debug ("dt_end :%s", icaltime_as_ical_string (*final_date));
e_cal_component_set_dtend (event, &dt);
}
else
@@ -1814,3 +1870,44 @@ gcal_manager_set_event_description (GcalManager *manager,
gcal_manager_on_event_modified,
manager);
}
void
gcal_manager_move_event_to_source (GcalManager *manager,
const gchar *source_uid,
const gchar *event_uid,
const gchar *new_source_uid)
{
GcalManagerPrivate *priv;
GcalManagerUnit *unit;
GcalManagerUnit *new_unit;
ECalComponent *old_event;
ECalComponent *new_event;
g_return_if_fail (GCAL_IS_MANAGER (manager));
priv = manager->priv;
unit = g_hash_table_lookup (priv->clients, source_uid);
old_event = g_hash_table_lookup (unit->events, event_uid);
new_unit = g_hash_table_lookup (priv->clients, new_source_uid);
if (old_event != NULL)
{
//FIXME: here sends notifications to everyone.
//FIXME: reload the events in all the views, etc, etc, etc
MoveEventData *data;
new_event = e_cal_component_clone (old_event);
data = g_new0 (MoveEventData, 1);
data->event_uid = g_strdup (event_uid);
data->unit = unit;
data->new_unit = new_unit;
data->new_component = new_event;
data->manager = manager;
e_cal_client_remove_object (unit->client,
event_uid,
NULL,
CALOBJ_MOD_ALL,
priv->async_ops,
gcal_manager_on_event_removed_for_move,
data);
}
}
+5
View File
@@ -163,6 +163,11 @@ void gcal_manager_set_event_description (GcalManager *manager
const gchar *event_uid,
const gchar *description);
void gcal_manager_move_event_to_source (GcalManager *manager,
const gchar *source_uid,
const gchar *event_uid,
const gchar *new_source_uid);
G_END_DECLS
#endif /* __GCAL_MANAGER_H__ */