From e4370b885408e5f552c9d5a81de4c47c56f928c8 Mon Sep 17 00:00:00 2001 From: Adenilson Cavalcanti Date: Sun, 24 Aug 2008 16:51:14 -0400 Subject: [PATCH] Adding sinks and format for both calendar and contacts. TODO: provide distinct callbacks for each OSyncFormatEnv, for some reason, using the same is making 'getchanges' losing track when its fast or slow sync. --- src/gcalendar.c | 108 ++++++++++++++++++++++++++++++++++++++------------------ 1 file changed, 74 insertions(+), 34 deletions(-) diff --git a/src/gcalendar.c b/src/gcalendar.c index cc6c207..9bc467d 100644 --- a/src/gcalendar.c +++ b/src/gcalendar.c @@ -51,8 +51,13 @@ struct gc_plgdata /* TODO: add a anchor here */ struct gcal_event_array all_events; struct gcal_contact_array all_contacts; - OSyncObjTypeSink *sink; - OSyncObjFormat *objformat; + /* calendar sink/format */ + OSyncObjTypeSink *gcal_sink; + OSyncObjFormat *gcal_format; + /* contact sink/format */ + OSyncObjTypeSink *gcont_sink; + OSyncObjFormat *gcont_format; + }; static void free_plg(struct gc_plgdata *plgdata) @@ -72,10 +77,14 @@ static void free_plg(struct gc_plgdata *plgdata) xmlFree(plgdata->username); if (plgdata->password) xmlFree(plgdata->password); - if (plgdata->sink) - osync_objtype_sink_unref(plgdata->sink); - if (plgdata->objformat) - osync_objformat_unref(plgdata->objformat); + if (plgdata->gcal_sink) + osync_objtype_sink_unref(plgdata->gcal_sink); + if (plgdata->gcal_format) + osync_objformat_unref(plgdata->gcal_format); + if (plgdata->gcont_sink) + osync_objtype_sink_unref(plgdata->gcont_sink); + if (plgdata->gcont_format) + osync_objformat_unref(plgdata->gcont_format); g_free(plgdata); } @@ -134,13 +143,23 @@ static void gc_get_changes(void *data, OSyncPluginInfo *info, OSyncContext *ctx) OSyncError *error = NULL; int result; - if (osync_objtype_sink_get_slowsync(plgdata->sink)) { - /* TODO: write getall */ - fprintf(stderr, "\n\t\tClient asked for slow syncing...\n"); - } else { - /* TODO: write getchanges */ - fprintf(stderr, "\n\t\tIts a fast sync!\n"); - } + if (plgdata->gcal_sink) + if (osync_objtype_sink_get_slowsync(plgdata->gcal_sink)) { + /* TODO: write getall */ + fprintf(stderr, "\n\t\tgcal: Client asked for slow syncing...\n"); + } else { + /* TODO: write getchanges */ + fprintf(stderr, "\n\t\tgcal: Its a fast sync!\n"); + } + + if (plgdata->gcont_sink) + if (osync_objtype_sink_get_slowsync(plgdata->gcont_sink)) { + /* TODO: write getall */ + fprintf(stderr, "\n\t\tgcont: Client asked for slow syncing...\n"); + } else { + /* TODO: write getchanges */ + fprintf(stderr, "\n\t\tgcont: Its a fast sync!\n"); + } osync_context_report_success(ctx); @@ -327,7 +346,7 @@ static void gc_disconnect(void *data, OSyncPluginInfo *info, OSyncContext *ctx) osync_trace(TRACE_ENTRY, "%s(%p, %p, %p)", __func__, data, info, ctx); struct gc_plgdata *plgdata = data; -osync_context_report_success(ctx); + osync_context_report_success(ctx); osync_trace(TRACE_EXIT, "%s", __func__); } @@ -365,11 +384,11 @@ static void *gc_initialize(OSyncPlugin *plugin, numobjs = osync_plugin_info_num_objtypes(info); for (i = 1, r = resources; r; r = r->next, i++) { - if (!(strcmp(osync_plugin_resource_get_objtype(r->data), "contact"))) + if (!(strcmp(osync_plugin_resource_get_objtype(r->data), "calendar"))) if (!(plgdata->calendar = gcal_new(GCALENDAR))) goto error_freeplg; - if (!(strcmp(osync_plugin_resource_get_objtype(r->data), "calendar"))) + if (!(strcmp(osync_plugin_resource_get_objtype(r->data), "contact"))) if (!(plgdata->contacts = gcal_new(GCONTACT))) goto error_freeplg; } @@ -402,21 +421,6 @@ static void *gc_initialize(OSyncPlugin *plugin, } - OSyncFormatEnv *formatenv = osync_plugin_info_get_format_env(info); - plgdata->objformat = osync_format_env_find_objformat(formatenv, "xmlformat-event"); - if (!plgdata->objformat) - goto error_freeplg; - osync_objformat_ref(plgdata->objformat); - - plgdata->sink = osync_objtype_sink_new("event", error); - if (!plgdata->sink) - goto error_freeplg; - - /* TODO: is this correct? And how to handle contacts too? Probably I will need - * 2 sinks... - */ - //osync_objtype_sink_add_objformat(plgdata->sink, "xmlformat-event"); - OSyncObjTypeSinkFunctions functions; memset(&functions, 0, sizeof(functions)); functions.connect = gc_connect; @@ -424,8 +428,41 @@ static void *gc_initialize(OSyncPlugin *plugin, functions.get_changes = gc_get_changes; functions.commit = gc_commit_change; - osync_objtype_sink_set_functions(plgdata->sink, functions, plgdata); - osync_plugin_info_add_objtype(info, plgdata->sink); + + if (plgdata->calendar) { + fprintf(stderr, "\n\n\tcreating calendar sink...\n"); + OSyncFormatEnv *formatenv1 = osync_plugin_info_get_format_env(info); + plgdata->gcal_format = osync_format_env_find_objformat(formatenv1, "xmlformat-event"); + if (!plgdata->gcal_format) + goto error_freeplg; + osync_objformat_ref(plgdata->gcal_format); + + plgdata->gcal_sink = osync_objtype_sink_new("event", error); + if (!plgdata->gcal_sink) + goto error_freeplg; + + osync_objtype_sink_set_functions(plgdata->gcal_sink, functions, plgdata); + osync_plugin_info_add_objtype(info, plgdata->gcal_sink); + + } + + if (plgdata->contacts) { + fprintf(stderr, "\n\n\tcreating contact sink...\n"); + OSyncFormatEnv *formatenv2 = osync_plugin_info_get_format_env(info); + plgdata->gcont_format = osync_format_env_find_objformat(formatenv2, "xmlformat-contact"); + if (!plgdata->gcont_format) + goto error_freeplg; + osync_objformat_ref(plgdata->gcont_format); + + plgdata->gcont_sink = osync_objtype_sink_new("contact", error); + if (!plgdata->gcont_sink) + goto error_freeplg; + + osync_objtype_sink_set_functions(plgdata->gcont_sink, functions, plgdata); + osync_plugin_info_add_objtype(info, plgdata->gcont_sink); + + } + osync_trace(TRACE_EXIT, "%s", __func__); @@ -445,7 +482,10 @@ static osync_bool gc_discover(void *data, OSyncPluginInfo *info, OSyncError **er struct gc_plgdata *plgdata = data; - osync_objtype_sink_set_available(plgdata->sink, TRUE); + if (plgdata->calendar) + osync_objtype_sink_set_available(plgdata->gcal_sink, TRUE); + if (plgdata->contacts) + osync_objtype_sink_set_available(plgdata->gcont_sink, TRUE); OSyncVersion *version = osync_version_new(error); osync_version_set_plugin(version, "google-data"); -- 2.11.4.GIT