You can subscribe to this list here.
2005 |
Jan
|
Feb
|
Mar
(56) |
Apr
(109) |
May
(15) |
Jun
(3) |
Jul
(37) |
Aug
(96) |
Sep
(40) |
Oct
(4) |
Nov
(54) |
Dec
|
---|---|---|---|---|---|---|---|---|---|---|---|---|
2006 |
Jan
(47) |
Feb
(30) |
Mar
(102) |
Apr
(120) |
May
(68) |
Jun
(54) |
Jul
(53) |
Aug
(122) |
Sep
(190) |
Oct
(71) |
Nov
(85) |
Dec
(108) |
2007 |
Jan
(72) |
Feb
(190) |
Mar
(53) |
Apr
(101) |
May
(145) |
Jun
(148) |
Jul
(167) |
Aug
(143) |
Sep
(23) |
Oct
(198) |
Nov
(223) |
Dec
(195) |
2008 |
Jan
(100) |
Feb
(129) |
Mar
(79) |
Apr
(77) |
May
(34) |
Jun
(95) |
Jul
(112) |
Aug
(160) |
Sep
(82) |
Oct
(124) |
Nov
(199) |
Dec
(355) |
2009 |
Jan
(436) |
Feb
(89) |
Mar
(298) |
Apr
(189) |
May
(33) |
Jun
(88) |
Jul
(105) |
Aug
(44) |
Sep
(181) |
Oct
(87) |
Nov
(75) |
Dec
(1) |
2010 |
Jan
(63) |
Feb
(21) |
Mar
(3) |
Apr
(1) |
May
(1) |
Jun
(3) |
Jul
(26) |
Aug
(37) |
Sep
(26) |
Oct
(15) |
Nov
(13) |
Dec
|
From: <svn...@op...> - 2009-11-05 18:13:49
|
Author: dgollub Date: Thu Nov 5 19:13:34 2009 New Revision: 5930 URL: http://www.opensync.org/changeset/5930 Log: Start sub-error-message in a new line Modified: trunk/opensync/common/opensync_error.c Modified: trunk/opensync/common/opensync_error.c ============================================================================== --- trunk/opensync/common/opensync_error.c Thu Nov 5 17:31:39 2009 (r5929) +++ trunk/opensync/common/opensync_error.c Thu Nov 5 19:13:34 2009 (r5930) @@ -136,7 +136,7 @@ submessage = osync_error_print_stack(&((*error)->child)); if (submessage) { - message = g_strdup_printf("NEXT ERROR: \"%s\"; %s", (*error)->message, submessage); + message = g_strdup_printf("NEXT ERROR: \"%s\"\n%s", (*error)->message, submessage); g_free(submessage); } else message = g_strdup_printf("ROOT CAUSE: \"%s\"", (*error)->message); |
From: <svn...@op...> - 2009-11-05 16:31:53
|
Author: dgollub Date: Thu Nov 5 17:31:39 2009 New Revision: 5929 URL: http://www.opensync.org/changeset/5929 Log: Introduced context-unittest Currently only the osync_context_report_uid_update() function gets tested. Fixes #1161 Added: trunk/tests/plugin-tests/check_context.c - copied, changed from r5920, trunk/tests/engine-tests/check_engine.c Modified: trunk/tests/CMakeLists.txt trunk/tests/mock-plugin/mock_sync.c Modified: trunk/tests/CMakeLists.txt ============================================================================== --- trunk/tests/CMakeLists.txt Thu Nov 5 17:30:06 2009 (r5928) +++ trunk/tests/CMakeLists.txt Thu Nov 5 17:31:39 2009 (r5929) @@ -350,6 +350,10 @@ OSYNC_TESTCASE(objformat objformat_marshal) OSYNC_TESTCASE(objformat objformat_demarshal) +BUILD_CHECK_TEST( context plugin-tests/check_context.c ${TEST_TARGET_LIBRARIES} ) +OSYNC_TESTCASE(context context_new) +OSYNC_TESTCASE(context context_uid_update) + BUILD_CHECK_TEST( plugin_config plugin-tests/check_plugin_config.c ${TEST_TARGET_LIBRARIES} ) OSYNC_TESTCASE(plugin_config plugin_config_new) OSYNC_TESTCASE(plugin_config plugin_config_new_nomemory) Modified: trunk/tests/mock-plugin/mock_sync.c ============================================================================== --- trunk/tests/mock-plugin/mock_sync.c Thu Nov 5 17:30:06 2009 (r5928) +++ trunk/tests/mock-plugin/mock_sync.c Thu Nov 5 17:31:39 2009 (r5929) @@ -528,6 +528,19 @@ } if (mock_get_error(info->memberid, "SYNC_DONE_TIMEOUT")) return; + + if (mock_get_error(info->memberid, "SYNC_DONE_REPORT_UID_UPDATE")) { + unsigned int i, updates = atoi(g_getenv("SYNC_DONE_REPORT_UID_UPDATES")); + const char *olduids = g_getenv("SYNC_DONE_REPORT_UID_UPDATES_OLDUIDS"); + const char *newuids = g_getenv("SYNC_DONE_REPORT_UID_UPDATES_NEWUIDS"); + + for (i=0; i < updates; i++) { + + char *olduid = g_strdup_printf("%c", olduids[i]); + char *newuid = g_strdup_printf("%c", newuids[i]); + osync_context_report_uid_update(ctx, olduid, newuid); + } + } osync_assert_msg(osync_sink_state_set(state_db, "path", dir->path, NULL), "Not expected to fail!"); Copied and modified: trunk/tests/plugin-tests/check_context.c (from r5920, trunk/tests/engine-tests/check_engine.c) ============================================================================== --- trunk/tests/engine-tests/check_engine.c Tue Nov 3 19:20:53 2009 (r5920, copy source) +++ trunk/tests/plugin-tests/check_context.c Thu Nov 5 17:31:39 2009 (r5929) @@ -1,5 +1,4 @@ #include "support.h" -#include "engine_support.h" #include <opensync/opensync-group.h> #include <opensync/opensync-data.h> @@ -9,346 +8,73 @@ #include <opensync/opensync-plugin.h> #include "opensync/engine/opensync_engine_internals.h" -#include "opensync/engine/opensync_engine_private.h" - +#include "opensync/group/opensync_group_internals.h" #include "opensync/group/opensync_member_internals.h" #include "opensync/client/opensync_client_internals.h" #include "../mock-plugin/mock_sync.h" #include "../mock-plugin/mock_format.h" -static void _member_add_format(OSyncMember *member, const char *objtype, const char *objformat) -{ - OSyncObjTypeSink *sink = NULL; - OSyncError *error = NULL; - osync_assert(member); - osync_assert(objtype); - - if (!osync_member_find_objtype_sink(member, objtype)) { - sink = osync_objtype_sink_new(objtype, &error); - osync_member_add_objtype_sink(member, sink); - osync_objtype_sink_unref(sink); - } - - osync_member_add_objformat(member, objtype, objformat, &error); -} - -START_TEST (engine_new) +START_TEST (context_new) { - char *testbed = setup_testbed(NULL); - OSyncError *error = NULL; - OSyncGroup *group = osync_group_new(&error); - fail_unless(group != NULL, NULL); - fail_unless(error == NULL, NULL); - - osync_group_set_configdir(group, testbed); - - OSyncMember *member1 = osync_member_new(&error); - fail_unless(member1 != NULL, NULL); - fail_unless(error == NULL, NULL); - osync_group_add_member(group, member1); - - OSyncMember *member2 = osync_member_new(&error); - fail_unless(member2 != NULL, NULL); - fail_unless(error == NULL, NULL); - osync_group_add_member(group, member2); - - OSyncEngine *engine = osync_engine_new(group, &error); - fail_unless(engine != NULL, NULL); + OSyncContext *context = osync_context_new(&error); + fail_unless(context != NULL, NULL); fail_unless(error == NULL, NULL); - osync_engine_ref(engine); - osync_engine_unref(engine); - osync_engine_unref(engine); - - osync_member_unref(member1); - osync_member_unref(member2); - osync_group_unref(group); - - destroy_testbed(testbed); + osync_context_ref(context); + osync_context_unref(context); + osync_context_unref(context); } END_TEST -START_TEST (engine_init) +START_TEST (context_uid_update) { - char *path = NULL; - char *testbed = setup_testbed("sync_setup"); - char *formatdir = g_strdup_printf("%s/formats", testbed); - char *plugindir = g_strdup_printf("%s/plugins", testbed); + char *testbed = setup_testbed("sync"); + char *formatdir = g_strdup_printf("%s/formats", testbed); + char *plugindir = g_strdup_printf("%s/plugins", testbed); + + g_setenv("SYNC_DONE_REPORT_UID_UPDATE", "1", TRUE); + g_setenv("SYNC_DONE_REPORT_UID_UPDATES", "10", TRUE); + g_setenv("SYNC_DONE_REPORT_UID_UPDATES_OLDUIDS", "0123456789", TRUE); + g_setenv("SYNC_DONE_REPORT_UID_UPDATES_NEWUIDS", "abcdefghij", TRUE); + + osync_testing_system_abort("cp testdata data2/0"); + osync_testing_system_abort("cp testdata data2/1"); + osync_testing_system_abort("cp testdata data2/2"); + osync_testing_system_abort("cp testdata data2/3"); + osync_testing_system_abort("cp testdata data2/4"); + osync_testing_system_abort("cp testdata data2/5"); + osync_testing_system_abort("cp testdata data2/6"); + osync_testing_system_abort("cp testdata data2/7"); + osync_testing_system_abort("cp testdata data2/8"); + osync_testing_system_abort("cp testdata data2/9"); + OSyncError *error = NULL; OSyncGroup *group = osync_group_new(&error); fail_unless(group != NULL, NULL); fail_unless(error == NULL, NULL); - - osync_group_set_configdir(group, testbed); - - OSyncMember *member1 = osync_member_new(&error); - fail_unless(member1 != NULL, NULL); - fail_unless(error == NULL, NULL); - osync_group_add_member(group, member1); - _member_add_format(member1, "mockobjtype1", "mockformat1"); - osync_member_set_pluginname(member1, "mock-sync"); - path = g_strdup_printf("%s/configs/group/1", testbed); - osync_member_set_configdir(member1, path); - osync_member_set_schemadir(member1, testbed); - g_free(path); - OSyncMember *member2 = osync_member_new(&error); - fail_unless(member2 != NULL, NULL); + osync_group_set_schemadir(group, testbed); + fail_unless(osync_group_load(group, "configs/group", &error), NULL); fail_unless(error == NULL, NULL); - osync_group_add_member(group, member2); - _member_add_format(member2, "mockobjtype1", "mockformat1"); - osync_member_set_pluginname(member2, "mock-sync"); - path = g_strdup_printf("%s/configs/group/1", testbed); - osync_member_set_configdir(member2, path); - osync_member_set_schemadir(member2, testbed); - g_free(path); OSyncEngine *engine = osync_engine_new(group, &error); fail_unless(engine != NULL, NULL); fail_unless(error == NULL, NULL); - + osync_group_unref(group); + osync_engine_set_schemadir(engine, testbed); osync_engine_set_plugindir(engine, plugindir); osync_engine_set_formatdir(engine, formatdir); - - - fail_unless(osync_engine_initialize(engine, &error), NULL); - fail_unless(error == NULL, NULL); - - fail_unless(osync_engine_finalize(engine, &error), NULL); - fail_unless(error == NULL, NULL); - - osync_engine_unref(engine); - - osync_member_unref(member1); - osync_member_unref(member2); - - osync_group_unref(group); - - g_free(formatdir); - g_free(plugindir); - - destroy_testbed(testbed); -} -END_TEST - -static void connect1(OSyncObjTypeSink *sink, OSyncPluginInfo *info, OSyncContext *ctx, void *data) -{ - mock_env *env = data; - osync_trace(TRACE_ENTRY, "%s(%p, %p, %p)", __func__, data, info, ctx); - - osync_assert(env); - osync_assert(env->num_connect == 0); - osync_assert(env->num_disconnect == 0); - osync_assert(env->num_get_changes == 0); - osync_assert(env->main_connect == 0); - osync_assert(env->main_disconnect == 0); - osync_assert(env->main_get_changes == 0); - - g_atomic_int_inc(&(env->num_connect)); - - osync_context_report_success(ctx); - - osync_trace(TRACE_EXIT, "%s", __func__); -} - -static void disconnect(OSyncObjTypeSink *sink, OSyncPluginInfo *info, OSyncContext *ctx, void *data) -{ - mock_env *env = data; - osync_trace(TRACE_ENTRY, "%s(%p, %p, %p)", __func__, data, info, ctx); - osync_assert(env); - osync_assert(env->num_connect == 1); - osync_assert(env->num_disconnect == 0); - osync_assert(env->num_get_changes == 1); - osync_assert(env->main_connect == 0); - osync_assert(env->main_disconnect == 0); - osync_assert(env->main_get_changes == 0); + osync_engine_set_conflict_callback(engine, conflict_handler_choose_first, GINT_TO_POINTER(1)); + osync_engine_set_changestatus_callback(engine, entry_status, GINT_TO_POINTER(1)); + osync_engine_set_mappingstatus_callback(engine, mapping_status, GINT_TO_POINTER(1)); + osync_engine_set_enginestatus_callback(engine, engine_status, GINT_TO_POINTER(1)); + osync_engine_set_memberstatus_callback(engine, member_status, GINT_TO_POINTER(1)); - g_atomic_int_inc(&(env->num_disconnect)); - - osync_context_report_success(ctx); - - osync_trace(TRACE_EXIT, "%s", __func__); -} - -static void get_changes(OSyncObjTypeSink *sink, OSyncPluginInfo *info, OSyncContext *ctx, osync_bool slow_sync, void *data) -{ - mock_env *env = data; - osync_trace(TRACE_ENTRY, "%s(%p, %p, %p)", __func__, data, info, ctx); - - osync_assert(env); - osync_assert(env->num_connect == 1); - osync_assert(env->num_disconnect == 0); - osync_assert(env->num_get_changes == 0); - osync_assert(env->main_connect == 0); - osync_assert(env->main_disconnect == 0); - osync_assert(env->main_get_changes == 0); - - g_atomic_int_inc(&(env->num_get_changes)); - - osync_context_report_success(ctx); - - osync_trace(TRACE_EXIT, "%s", __func__); -} - -static void *initialize(OSyncPlugin *plugin, OSyncPluginInfo *info, OSyncError **error) -{ - osync_trace(TRACE_ENTRY, "%s(%p, %p)", __func__, info, error); - - mock_env *env = osync_try_malloc0(sizeof(mock_env), error); - if (!env) - goto error; - - OSyncObjTypeSink *sink = osync_objtype_sink_new("mockobjtype1", error); - if (!sink) - goto error; - - OSyncObjFormatSink *format_sink = osync_objformat_sink_new("mockobjtype1", error); - osync_objtype_sink_add_objformat_sink(sink, format_sink); - osync_objformat_sink_unref(format_sink); - - osync_objtype_sink_set_connect_func(sink, connect1); - osync_objtype_sink_set_disconnect_func(sink, disconnect); - osync_objtype_sink_set_get_changes_func(sink, get_changes); - - /* ObjTypeSink port - functions and userdata never got set! */ - osync_objtype_sink_set_userdata(sink, env); - - osync_plugin_info_add_objtype(info, sink); - osync_objtype_sink_unref(sink); - - osync_trace(TRACE_EXIT, "%s: %p", __func__, env); - return (void *)env; - -error: - osync_trace(TRACE_EXIT_ERROR, "%s: %s", __func__, osync_error_print(error)); - return NULL; -} - -static void finalize(void *data) -{ - mock_env *env = data; - - osync_assert(env); - osync_assert(env->num_connect == 1); - osync_assert(env->num_disconnect == 1); - osync_assert(env->num_get_changes == 1); - osync_assert(env->main_connect == 0); - osync_assert(env->main_disconnect == 0); - osync_assert(env->main_get_changes == 0); - - g_free(env); -} - -static OSyncDebugGroup *_create_group(char *testbed) -{ - OSyncDebugGroup *debug = g_malloc0(sizeof(OSyncDebugGroup)); - - OSyncError *error = NULL; - debug->group = osync_group_new(&error); - fail_unless(debug->group != NULL, NULL); - fail_unless(error == NULL, NULL); - - osync_group_set_configdir(debug->group, testbed); - - debug->member1 = osync_member_new(&error); - fail_unless(debug->member1 != NULL, NULL); - fail_unless(error == NULL, NULL); - osync_group_add_member(debug->group, debug->member1); - osync_member_set_pluginname(debug->member1, "mock-sync-foo"); - char *path = g_strdup_printf("%s/configs/group/1", testbed); - osync_member_set_configdir(debug->member1, path); - g_free(path); - - _member_add_format(debug->member1, "mockobjtype1", "mockformat1"); - - debug->member2 = osync_member_new(&error); - fail_unless(debug->member2 != NULL, NULL); - fail_unless(error == NULL, NULL); - osync_group_add_member(debug->group, debug->member2); - osync_member_set_pluginname(debug->member2, "mock-sync-foo"); - path = g_strdup_printf("%s/configs/group/2", testbed); - osync_member_set_configdir(debug->member2, path); - g_free(path); - - _member_add_format(debug->member2, "mockobjtype1", "mockformat1"); - - debug->plugin = osync_plugin_new(&error); - fail_unless(debug->plugin != NULL, NULL); - fail_unless(error == NULL, NULL); - - osync_plugin_set_name(debug->plugin, "mock-sync-foo"); - osync_plugin_set_longname(debug->plugin, "Mock Sync Plugin"); - osync_plugin_set_description(debug->plugin, "This is a pseudo plugin"); - osync_plugin_set_start_type(debug->plugin, OSYNC_START_TYPE_EXTERNAL); - osync_plugin_set_config_type(debug->plugin, OSYNC_PLUGIN_NO_CONFIGURATION); - - osync_plugin_set_initialize(debug->plugin, initialize); - osync_plugin_set_finalize(debug->plugin, finalize); - - debug->client1 = osync_client_new(&error); - fail_unless(debug->client1 != NULL, NULL); - fail_unless(error == NULL, NULL); - char *pipe_path = g_strdup_printf("%s/configs/group/1/pluginpipe", testbed); - osync_client_run_external(debug->client1, pipe_path, debug->plugin, &error); - g_free(pipe_path); - - debug->client2 = osync_client_new(&error); - fail_unless(debug->client2 != NULL, NULL); - fail_unless(error == NULL, NULL); - pipe_path = g_strdup_printf("%s/configs/group/2/pluginpipe", testbed); - osync_client_run_external(debug->client2, pipe_path, debug->plugin, &error); - g_free(pipe_path); - - return debug; -} - -static void _free_group(OSyncDebugGroup *debug) -{ - osync_client_unref(debug->client1); - osync_client_unref(debug->client2); - - osync_plugin_unref(debug->plugin); - - osync_member_unref(debug->member1); - osync_member_unref(debug->member2); - osync_group_unref(debug->group); - - g_free(debug); -} - -static void _engine_instrument_pluginenv(OSyncEngine *engine, OSyncDebugGroup *debug) -{ - fail_unless(engine->pluginenv == NULL, NULL); - engine->pluginenv = osync_plugin_env_new(NULL); - - if (debug->plugin) - osync_plugin_env_register_plugin(engine->pluginenv, debug->plugin, NULL); - - if (debug->plugin2) - osync_plugin_env_register_plugin(engine->pluginenv, debug->plugin2, NULL); -} - -START_TEST (engine_sync) -{ - char *testbed = setup_testbed("sync_setup"); - char *formatdir = g_strdup_printf("%s/formats", testbed); - - OSyncError *error = NULL; - OSyncDebugGroup *debug = _create_group(testbed); - - OSyncEngine *engine = osync_engine_new(debug->group, &error); - osync_engine_set_schemadir(engine, testbed); - - fail_unless(engine != NULL, NULL); - fail_unless(error == NULL, NULL); - osync_engine_set_formatdir(engine, formatdir); - - _engine_instrument_pluginenv(engine, debug); fail_unless(osync_engine_initialize(engine, &error), NULL); fail_unless(error == NULL, NULL); @@ -359,1685 +85,61 @@ fail_unless(osync_engine_finalize(engine, &error), NULL); fail_unless(error == NULL, NULL); - _free_group(debug); - osync_engine_unref(engine); - g_free(formatdir); - - destroy_testbed(testbed); -} -END_TEST - -static void connect2(OSyncObjTypeSink *sink, OSyncPluginInfo *info, OSyncContext *ctx, void *data) -{ - mock_env *env = data; - osync_trace(TRACE_ENTRY, "%s(%p, %p, %p)", __func__, data, info, ctx); - - osync_assert(env); - osync_assert(env->num_connect < 3); - osync_assert(env->num_disconnect == 0); - osync_assert(env->num_get_changes == 0); - osync_assert(env->main_connect == 0); - osync_assert(env->main_disconnect == 0); - osync_assert(env->main_get_changes == 0); - - g_atomic_int_inc(&(env->num_connect)); - - osync_context_report_success(ctx); - - osync_trace(TRACE_EXIT, "%s", __func__); -} - -static void disconnect2(OSyncObjTypeSink *sink, OSyncPluginInfo *info, OSyncContext *ctx, void *data) -{ - mock_env *env = data; - osync_trace(TRACE_ENTRY, "%s(%p, %p, %p)", __func__, data, info, ctx); - - osync_assert(env); - osync_assert(env->num_connect == 3); - osync_assert(env->num_disconnect < 3); - osync_assert(env->num_get_changes == 3); - osync_assert(env->main_connect == 1); - osync_assert(env->main_disconnect == 0); - osync_assert(env->main_get_changes == 1); - - g_atomic_int_inc(&(env->num_disconnect)); - - osync_context_report_success(ctx); - - osync_trace(TRACE_EXIT, "%s", __func__); -} - -static void get_changes2(OSyncObjTypeSink *sink, OSyncPluginInfo *info, OSyncContext *ctx, osync_bool slow_sync, void *data) -{ - mock_env *env = data; - osync_trace(TRACE_ENTRY, "%s(%p, %p, %p)", __func__, data, info, ctx); - - osync_assert(env); - osync_assert(env->num_connect == 3); - osync_assert(env->num_disconnect == 0); - osync_assert(env->num_get_changes < 3); - osync_assert(env->main_connect == 1); - osync_assert(env->main_disconnect == 0); - osync_assert(env->main_get_changes == 0); - - g_atomic_int_inc(&(env->num_get_changes)); - - osync_context_report_success(ctx); - - osync_trace(TRACE_EXIT, "%s", __func__); -} - -static void main_connect2(OSyncObjTypeSink *sink, OSyncPluginInfo *info, OSyncContext *ctx, void *data) -{ - mock_env *env = data; - osync_trace(TRACE_ENTRY, "%s(%p, %p, %p)", __func__, data, info, ctx); - - osync_assert(env); - osync_assert(env->num_connect == 3); - osync_assert(env->num_disconnect == 0); - osync_assert(env->num_get_changes == 0); - osync_assert(env->main_connect == 0); - osync_assert(env->main_disconnect == 0); - osync_assert(env->main_get_changes == 0); - - g_atomic_int_inc(&(env->main_connect)); - - osync_context_report_success(ctx); - - osync_trace(TRACE_EXIT, "%s", __func__); -} - -static void main_disconnect2(OSyncObjTypeSink *sink, OSyncPluginInfo *info, OSyncContext *ctx, void *data) -{ - mock_env *env = data; - osync_trace(TRACE_ENTRY, "%s(%p, %p, %p)", __func__, data, info, ctx); - - osync_assert(env); - osync_assert(env->num_connect == 3); - osync_assert(env->num_disconnect == 3); - osync_assert(env->num_get_changes == 3); - osync_assert(env->main_connect == 1); - osync_assert(env->main_disconnect == 0); - osync_assert(env->main_get_changes == 1); - - g_atomic_int_inc(&(env->main_disconnect)); - - osync_context_report_success(ctx); - - osync_trace(TRACE_EXIT, "%s", __func__); -} - -static void main_get_changes2(OSyncObjTypeSink *sink, OSyncPluginInfo *info, OSyncContext *ctx, osync_bool slow_sync, void *data) -{ - mock_env *env = data; - osync_trace(TRACE_ENTRY, "%s(%p, %p, %p)", __func__, data, info, ctx); - - osync_assert(env); - osync_assert(env->num_connect == 3); - osync_assert(env->num_disconnect == 0); - osync_assert(env->num_get_changes == 3); - osync_assert(env->main_connect == 1); - osync_assert(env->main_disconnect == 0); - osync_assert(env->main_get_changes == 0); - - g_atomic_int_inc(&(env->main_get_changes)); - - osync_context_report_success(ctx); - - osync_trace(TRACE_EXIT, "%s", __func__); -} - -static void *initialize_multi(OSyncPlugin *plugin, OSyncPluginInfo *info, OSyncError **error) -{ - osync_trace(TRACE_ENTRY, "%s(%p, %p)", __func__, info, error); - - mock_env *env = osync_try_malloc0(sizeof(mock_env), error); - if (!env) - goto error; - - OSyncObjTypeSink *sink = osync_objtype_sink_new("mockobjtype1", error); - if (!sink) - goto error; - - OSyncObjFormatSink *format_sink = osync_objformat_sink_new("mockformat1", error); - osync_objtype_sink_add_objformat_sink(sink, format_sink); - osync_objformat_sink_unref(format_sink); - - osync_objtype_sink_set_connect_func(sink, connect2); - osync_objtype_sink_set_disconnect_func(sink, disconnect2); - osync_objtype_sink_set_get_changes_func(sink, get_changes2); - - osync_objtype_sink_set_userdata(sink, env); - - osync_plugin_info_add_objtype(info, sink); - osync_objtype_sink_unref(sink); - - sink = osync_objtype_sink_new("mockobjtype2", error); - if (!sink) - goto error; - - format_sink = osync_objformat_sink_new("vcard", error); - osync_objtype_sink_add_objformat_sink(sink, format_sink); - osync_objformat_sink_unref(format_sink); - - osync_objtype_sink_set_connect_func(sink, connect2); - osync_objtype_sink_set_disconnect_func(sink, disconnect2); - osync_objtype_sink_set_get_changes_func(sink, get_changes2); - - osync_objtype_sink_set_userdata(sink, env); - - - osync_plugin_info_add_objtype(info, sink); - osync_objtype_sink_unref(sink); - - sink = osync_objtype_sink_new("mockobjtype3", error); - if (!sink) - goto error; - - format_sink = osync_objformat_sink_new("plain", error); - osync_objtype_sink_add_objformat_sink(sink, format_sink); - osync_objformat_sink_unref(format_sink); - - osync_objtype_sink_set_connect_func(sink, connect2); - osync_objtype_sink_set_disconnect_func(sink, disconnect2); - osync_objtype_sink_set_get_changes_func(sink, get_changes2); - - osync_objtype_sink_set_userdata(sink, env); + char *path = g_strdup_printf("%s/configs/group/archive.db", testbed); + OSyncMappingTable *maptable = mappingtable_load(path, "mockobjtype1", 10); + g_free(path); - osync_plugin_info_add_objtype(info, sink); - osync_objtype_sink_unref(sink); - - /* The main sink */ - sink = osync_objtype_main_sink_new(error); - if (!sink) - goto error; - - osync_objtype_sink_set_connect_func(sink, main_connect2); - osync_objtype_sink_set_disconnect_func(sink, main_disconnect2); - osync_objtype_sink_set_get_changes_func(sink, main_get_changes2); + check_mapping(maptable, 2, 1, 2, "0"); + check_mapping(maptable, 1, 1, 2, "a"); - osync_objtype_sink_set_userdata(sink, env); + /* ... gap ... mapping id ... 2 to 4 ... */ - osync_plugin_info_set_main_sink(info, sink); - osync_objtype_sink_unref(sink); - - osync_trace(TRACE_EXIT, "%s: %p", __func__, env); - return (void *)env; + check_mapping(maptable, 2, 5, 2, "4"); + check_mapping(maptable, 1, 5, 2, "e"); -error: - osync_trace(TRACE_EXIT_ERROR, "%s: %s", __func__, osync_error_print(error)); - return NULL; -} + /* ... gap ... mapping id ... 6 to 8 ... */ -static void finalize_multi(void *data) -{ - mock_env *env = data; - - osync_assert(env); - osync_assert(env->num_connect == 3); - osync_assert(env->num_disconnect == 3); - osync_assert(env->num_get_changes == 3); - osync_assert(env->main_connect == 1); - osync_assert(env->main_disconnect == 1); - osync_assert(env->main_get_changes == 1); - - g_free(env); -} + check_mapping(maptable, 2, 9, 2, "8"); + check_mapping(maptable, 1, 9, 2, "i"); -static OSyncDebugGroup *_create_group2(char *testbed) -{ - osync_trace(TRACE_ENTRY, "%s(%s)", __func__, testbed); - - OSyncDebugGroup *debug = g_malloc0(sizeof(OSyncDebugGroup)); - - OSyncError *error = NULL; - debug->group = osync_group_new(&error); - fail_unless(debug->group != NULL, NULL); - fail_unless(error == NULL, NULL); - - osync_group_set_configdir(debug->group, testbed); + check_mapping(maptable, 2, 10, 2, "9"); + check_mapping(maptable, 1, 10, 2, "j"); - debug->member1 = osync_member_new(&error); - fail_unless(debug->member1 != NULL, NULL); - fail_unless(error == NULL, NULL); - osync_group_add_member(debug->group, debug->member1); - osync_member_set_pluginname(debug->member1, "mock-sync-foo"); - char *path = g_strdup_printf("%s/configs/group/1", testbed); - osync_member_set_configdir(debug->member1, path); - g_free(path); - _member_add_format(debug->member1, "mockobjtype1", "mockformat1"); - _member_add_format(debug->member1, "mockobjtype2", "mockformat2"); - _member_add_format(debug->member1, "mockobjtype3", "mockformat3"); - - debug->member2 = osync_member_new(&error); - fail_unless(debug->member2 != NULL, NULL); - fail_unless(error == NULL, NULL); - osync_group_add_member(debug->group, debug->member2); - osync_member_set_pluginname(debug->member2, "mock-sync-foo"); - path = g_strdup_printf("%s/configs/group/2", testbed); - osync_member_set_configdir(debug->member2, path); + osync_mapping_table_close(maptable); + osync_mapping_table_unref(maptable); + + path = g_strdup_printf("%s/configs/group/1/hashtable.db", testbed); + OSyncHashTable *table = hashtable_load(path, "mockobjtype1", 10); g_free(path); + check_hash(table, "a"); /* This is the important check here ... hashtable needs also get updated if uid changes */ + check_hash(table, "e"); /* This is the important check here ... hashtable needs also get updated if uid changes */ + check_hash(table, "i"); /* This is the important check here ... hashtable needs also get updated if uid changes */ + check_hash(table, "j"); /* This is the important check here ... hashtable needs also get updated if uid changes */ + osync_hashtable_unref(table); - _member_add_format(debug->member2, "mockobjtype1", "mockformat1"); - _member_add_format(debug->member2, "mockobjtype2", "mockformat2"); - _member_add_format(debug->member2, "mockobjtype3", "mockformat3"); - - debug->plugin = osync_plugin_new(&error); - fail_unless(debug->plugin != NULL, NULL); - fail_unless(error == NULL, NULL); - - osync_plugin_set_name(debug->plugin, "mock-sync-foo"); - osync_plugin_set_longname(debug->plugin, "Mock Sync Plugin"); - osync_plugin_set_description(debug->plugin, "This is a pseudo plugin"); - osync_plugin_set_start_type(debug->plugin, OSYNC_START_TYPE_EXTERNAL); - osync_plugin_set_config_type(debug->plugin, OSYNC_PLUGIN_NO_CONFIGURATION); - - osync_plugin_set_initialize(debug->plugin, initialize_multi); - osync_plugin_set_finalize(debug->plugin, finalize_multi); - - debug->client1 = osync_client_new(&error); - fail_unless(debug->client1 != NULL, NULL); - fail_unless(error == NULL, NULL); - char *pipe_path = g_strdup_printf("%s/configs/group/1/pluginpipe", testbed); - osync_client_run_external(debug->client1, pipe_path, debug->plugin, &error); - g_free(pipe_path); - - debug->client2 = osync_client_new(&error); - fail_unless(debug->client2 != NULL, NULL); - fail_unless(error == NULL, NULL); - pipe_path = g_strdup_printf("%s/configs/group/2/pluginpipe", testbed); - osync_client_run_external(debug->client2, pipe_path, debug->plugin, &error); - g_free(pipe_path); - - osync_trace(TRACE_EXIT, "%s: %p", __func__, debug); - return debug; -} - -START_TEST (engine_sync_multi_obj) -{ - char *testbed = setup_testbed("sync_setup"); - char *formatdir = g_strdup_printf("%s/formats", testbed); - - OSyncError *error = NULL; - OSyncDebugGroup *debug = _create_group2(testbed); - - OSyncEngine *engine = osync_engine_new(debug->group, &error); - fail_unless(engine != NULL, NULL); - fail_unless(error == NULL, NULL); - osync_engine_set_formatdir(engine, formatdir); - osync_engine_set_schemadir(engine, testbed); + path = g_strdup_printf("%s/configs/group/2/hashtable.db", testbed); + table = hashtable_load(path, "mockobjtype1", 10); + g_free(path); + check_hash(table, "0"); + check_hash(table, "4"); + check_hash(table, "8"); + check_hash(table, "9"); + osync_hashtable_unref(table); - _engine_instrument_pluginenv(engine, debug); - - fail_unless(osync_engine_initialize(engine, &error), NULL); - fail_unless(error == NULL, NULL); - - fail_unless(osync_engine_synchronize_and_block(engine, &error), NULL); - fail_unless(error == NULL, NULL); - - fail_unless(osync_engine_finalize(engine, &error), NULL); - fail_unless(error == NULL, NULL); - - _free_group(debug); - - osync_engine_unref(engine); - g_free(formatdir); - + g_free(plugindir); + destroy_testbed(testbed); } END_TEST -static void connect3(OSyncObjTypeSink *sink, OSyncPluginInfo *info, OSyncContext *ctx, void *data) -{ - mock_env *env = data; - osync_trace(TRACE_ENTRY, "%s(%p, %p, %p)", __func__, data, info, ctx); - - osync_assert(env); - osync_assert(env->num_connect < 3); - osync_assert(env->num_disconnect == 0); - osync_assert(env->num_get_changes == 0); - osync_assert(env->main_connect == 0); - osync_assert(env->main_disconnect == 0); - osync_assert(env->main_get_changes == 0); - - env->ctx[env->num_connect] = ctx; - osync_context_ref(ctx); - - g_atomic_int_inc(&(env->num_connect)); - - osync_trace(TRACE_EXIT, "%s", __func__); -} - -static void disconnect3(OSyncObjTypeSink *sink, OSyncPluginInfo *info, OSyncContext *ctx, void *data) -{ - mock_env *env = data; - osync_trace(TRACE_ENTRY, "%s(%p, %p, %p)", __func__, data, info, ctx); - - osync_assert(env); - osync_assert(env->num_connect == 3); - osync_assert(env->num_disconnect < 3); - osync_assert(env->num_get_changes == 3); - osync_assert(env->num_sync_done == 3); - osync_assert(env->main_connect == 1); - osync_assert(env->main_disconnect == 0); - osync_assert(env->main_get_changes == 1); - osync_assert(env->main_sync_done == 1); - - env->ctx[env->num_disconnect] = ctx; - osync_context_ref(ctx); - - g_atomic_int_inc(&(env->num_disconnect)); - - osync_trace(TRACE_EXIT, "%s", __func__); -} - -static void get_changes3(OSyncObjTypeSink *sink, OSyncPluginInfo *info, OSyncContext *ctx, osync_bool slow_sync, void *data) -{ - mock_env *env = data; - osync_trace(TRACE_ENTRY, "%s(%p, %p, %p)", __func__, data, info, ctx); - - osync_assert(env); - osync_assert(env->num_connect == 3); - osync_assert(env->num_disconnect == 0); - osync_assert(env->num_get_changes < 3); - osync_assert(env->main_connect == 1); - osync_assert(env->main_disconnect == 0); - osync_assert(env->main_get_changes == 0); - - env->ctx[env->num_get_changes] = ctx; - osync_context_ref(ctx); - - g_atomic_int_inc(&(env->num_get_changes)); - - osync_trace(TRACE_EXIT, "%s", __func__); -} - -static void sync_done3(OSyncObjTypeSink *sink, OSyncPluginInfo *info, OSyncContext *ctx, void *data) -{ - mock_env *env = data; - osync_trace(TRACE_ENTRY, "%s(%p, %p, %p)", __func__, data, info, ctx); - - osync_assert(env); - osync_assert(env->num_connect == 3); - osync_assert(env->num_disconnect == 0); - osync_assert(env->num_get_changes == 3); - osync_assert(env->num_sync_done < 3); - osync_assert(env->main_connect == 1); - osync_assert(env->main_disconnect == 0); - osync_assert(env->main_get_changes == 1); - osync_assert(env->main_sync_done == 0); - - env->ctx[env->num_sync_done] = ctx; - osync_context_ref(ctx); - - g_atomic_int_inc(&(env->num_sync_done)); - - osync_trace(TRACE_EXIT, "%s", __func__); -} - -static void main_connect3(OSyncObjTypeSink *sink, OSyncPluginInfo *info, OSyncContext *ctx, void *data) -{ - mock_env *env = data; - osync_trace(TRACE_ENTRY, "%s(%p, %p, %p)", __func__, data, info, ctx); - - osync_assert(env); - osync_assert(env->num_connect == 3); - osync_assert(env->num_disconnect == 0); - osync_assert(env->num_get_changes == 0); - osync_assert(env->main_connect == 0); - osync_assert(env->main_disconnect == 0); - osync_assert(env->main_get_changes == 0); - - g_atomic_int_inc(&(env->main_connect)); - - osync_context_report_success(ctx); - osync_context_report_success(env->ctx[0]); - osync_context_report_success(env->ctx[1]); - osync_context_report_success(env->ctx[2]); - - osync_context_unref(env->ctx[0]); - osync_context_unref(env->ctx[1]); - osync_context_unref(env->ctx[2]); - - osync_trace(TRACE_EXIT, "%s", __func__); -} - -static void main_disconnect3(OSyncObjTypeSink *sink, OSyncPluginInfo *info, OSyncContext *ctx, void *data) -{ - mock_env *env = data; - osync_trace(TRACE_ENTRY, "%s(%p, %p, %p)", __func__, data, info, ctx); - - osync_assert(env); - osync_assert(env->num_connect == 3); - osync_assert(env->num_disconnect == 3); - osync_assert(env->num_get_changes == 3); - osync_assert(env->num_sync_done == 3); - osync_assert(env->main_connect == 1); - osync_assert(env->main_disconnect == 0); - osync_assert(env->main_get_changes == 1); - osync_assert(env->main_sync_done == 1); - - g_atomic_int_inc(&(env->main_disconnect)); - - osync_context_report_success(env->ctx[0]); - osync_context_report_success(env->ctx[2]); - osync_context_report_success(ctx); - osync_context_report_success(env->ctx[1]); - - osync_context_unref(env->ctx[0]); - osync_context_unref(env->ctx[1]); - osync_context_unref(env->ctx[2]); - - osync_trace(TRACE_EXIT, "%s", __func__); -} - -static void main_get_changes3(OSyncObjTypeSink *sink, OSyncPluginInfo *info, OSyncContext *ctx, osync_bool slow_sync, void *data) -{ - mock_env *env = data; - osync_trace(TRACE_ENTRY, "%s(%p, %p, %p)", __func__, data, info, ctx); - - osync_assert(env); - osync_assert(env->num_connect == 3); - osync_assert(env->num_disconnect == 0); - osync_assert(env->num_get_changes == 3); - osync_assert(env->main_connect == 1); - osync_assert(env->main_disconnect == 0); - osync_assert(env->main_get_changes == 0); - - g_atomic_int_inc(&(env->main_get_changes)); - - - osync_context_report_success(ctx); - osync_context_report_success(env->ctx[2]); - osync_context_report_success(env->ctx[1]); - osync_context_report_success(env->ctx[0]); - - osync_context_unref(env->ctx[0]); - osync_context_unref(env->ctx[1]); - osync_context_unref(env->ctx[2]); - - osync_trace(TRACE_EXIT, "%s", __func__); -} - -static void main_sync_done3(OSyncObjTypeSink *sink, OSyncPluginInfo *info, OSyncContext *ctx, void *data) -{ - mock_env *env = data; - osync_trace(TRACE_ENTRY, "%s(%p, %p, %p)", __func__, data, info, ctx); - - osync_assert(env); - osync_assert(env->num_connect == 3); - osync_assert(env->num_disconnect == 0); - osync_assert(env->num_get_changes == 3); - osync_assert(env->num_sync_done == 3); - osync_assert(env->main_connect == 1); - osync_assert(env->main_disconnect == 0); - osync_assert(env->main_get_changes == 1); - osync_assert(env->main_sync_done == 0); - - g_atomic_int_inc(&(env->main_sync_done)); - - - osync_context_report_success(ctx); - osync_context_report_success(env->ctx[2]); - osync_context_report_success(env->ctx[1]); - osync_context_report_success(env->ctx[0]); - - osync_context_unref(env->ctx[0]); - osync_context_unref(env->ctx[1]); - osync_context_unref(env->ctx[2]); - - osync_trace(TRACE_EXIT, "%s", __func__); -} - -static void *initialize_order(OSyncPlugin *plugin, OSyncPluginInfo *info, OSyncError **error) -{ - osync_trace(TRACE_ENTRY, "%s(%p, %p)", __func__, info, error); - - mock_env *env = osync_try_malloc0(sizeof(mock_env), error); - if (!env) - goto error; - - OSyncObjTypeSink *sink = osync_objtype_sink_new("mockobjtype1", error); - if (!sink) - goto error; - - OSyncObjFormatSink *format_sink = osync_objformat_sink_new("mockobjtype1", error); - osync_objtype_sink_add_objformat_sink(sink, format_sink); - osync_objformat_sink_unref(format_sink); - - osync_objtype_sink_set_connect_func(sink, connect3); - osync_objtype_sink_set_disconnect_func(sink, disconnect3); - osync_objtype_sink_set_get_changes_func(sink, get_changes3); - osync_objtype_sink_set_sync_done_func(sink, sync_done3); - - osync_objtype_sink_set_userdata(sink, env); - - osync_plugin_info_add_objtype(info, sink); - osync_objtype_sink_unref(sink); - - sink = osync_objtype_sink_new("mockobjtype2", error); - if (!sink) - goto error; - - format_sink = osync_objformat_sink_new("vcard", error); - osync_objtype_sink_add_objformat_sink(sink, format_sink); - osync_objformat_sink_unref(format_sink); - - osync_objtype_sink_set_connect_func(sink, connect3); - osync_objtype_sink_set_disconnect_func(sink, disconnect3); - osync_objtype_sink_set_get_changes_func(sink, get_changes3); - osync_objtype_sink_set_sync_done_func(sink, sync_done3); - - osync_objtype_sink_set_userdata(sink, env); - - osync_plugin_info_add_objtype(info, sink); - osync_objtype_sink_unref(sink); - - sink = osync_objtype_sink_new("mockobjtype3", error); - if (!sink) - goto error; - - format_sink = osync_objformat_sink_new("plain", error); - osync_objtype_sink_add_objformat_sink(sink, format_sink); - osync_objformat_sink_unref(format_sink); - - osync_objtype_sink_set_connect_func(sink, connect3); - osync_objtype_sink_set_disconnect_func(sink, disconnect3); - osync_objtype_sink_set_get_changes_func(sink, get_changes3); - osync_objtype_sink_set_sync_done_func(sink, sync_done3); - - osync_objtype_sink_set_userdata(sink, env); - - osync_plugin_info_add_objtype(info, sink); - osync_objtype_sink_unref(sink); - - /* The main sink */ - sink = osync_objtype_main_sink_new(error); - if (!sink) - goto error; - - osync_objtype_sink_set_connect_func(sink, main_connect3); - osync_objtype_sink_set_disconnect_func(sink, main_disconnect3); - osync_objtype_sink_set_get_changes_func(sink, main_get_changes3); - osync_objtype_sink_set_sync_done_func(sink, main_sync_done3); - - osync_objtype_sink_set_userdata(sink, env); - - osync_plugin_info_set_main_sink(info, sink); - osync_objtype_sink_unref(sink); - - osync_trace(TRACE_EXIT, "%s: %p", __func__, env); - return (void *)env; - -error: - osync_trace(TRACE_EXIT_ERROR, "%s: %s", __func__, osync_error_print(error)); - return NULL; -} - -static void finalize_order(void *data) -{ - mock_env *env = data; - - osync_assert(env->num_connect == 3); - osync_assert(env->num_disconnect == 3); - osync_assert(env->num_get_changes == 3); - osync_assert(env->num_sync_done == 3); - osync_assert(env->main_connect == 1); - osync_assert(env->main_disconnect == 1); - osync_assert(env->main_get_changes == 1); - osync_assert(env->main_sync_done == 1); - - g_free(env); -} - -static OSyncDebugGroup *_create_group3(char *testbed) -{ - osync_trace(TRACE_ENTRY, "%s(%s)", __func__, testbed); - - OSyncDebugGroup *debug = g_malloc0(sizeof(OSyncDebugGroup)); - - OSyncError *error = NULL; - debug->group = osync_group_new(&error); - fail_unless(debug->group != NULL, NULL); - fail_unless(error == NULL, NULL); - - osync_group_set_configdir(debug->group, testbed); - - debug->member1 = osync_member_new(&error); - fail_unless(debug->member1 != NULL, NULL); - fail_unless(error == NULL, NULL); - osync_group_add_member(debug->group, debug->member1); - osync_member_set_pluginname(debug->member1, "mock-sync-foo"); - char *path = g_strdup_printf("%s/configs/group/1", testbed); - osync_member_set_configdir(debug->member1, path); - g_free(path); - _member_add_format(debug->member1, "mockobjtype1", "mockformat1"); - _member_add_format(debug->member1, "mockobjtype2", "mockformat2"); - _member_add_format(debug->member1, "mockobjtype3", "mockformat3"); - - debug->member2 = osync_member_new(&error); - fail_unless(debug->member2 != NULL, NULL); - fail_unless(error == NULL, NULL); - osync_group_add_member(debug->group, debug->member2); - osync_member_set_pluginname(debug->member2, "mock-sync-foo"); - path = g_strdup_printf("%s/configs/group/2", testbed); - osync_member_set_configdir(debug->member2, path); - g_free(path); - - _member_add_format(debug->member2, "mockobjtype1", "mockformat1"); - _member_add_format(debug->member2, "mockobjtype2", "mockformat2"); - _member_add_format(debug->member2, "mockobjtype3", "mockformat3"); - - debug->plugin = osync_plugin_new(&error); - fail_unless(debug->plugin != NULL, NULL); - fail_unless(error == NULL, NULL); - - osync_plugin_set_name(debug->plugin, "mock-sync-foo"); - osync_plugin_set_longname(debug->plugin, "Mock Sync Plugin"); - osync_plugin_set_description(debug->plugin, "This is a pseudo plugin"); - osync_plugin_set_start_type(debug->plugin, OSYNC_START_TYPE_EXTERNAL); - osync_plugin_set_config_type(debug->plugin, OSYNC_PLUGIN_NO_CONFIGURATION); - - osync_plugin_set_initialize(debug->plugin, initialize_order); - osync_plugin_set_finalize(debug->plugin, finalize_order); - - - debug->client1 = osync_client_new(&error); - fail_unless(debug->client1 != NULL, NULL); - fail_unless(error == NULL, NULL); - char *pipe_path = g_strdup_printf("%s/configs/group/1/pluginpipe", testbed); - osync_client_run_external(debug->client1, pipe_path, debug->plugin, &error); - g_free(pipe_path); - - debug->client2 = osync_client_new(&error); - fail_unless(debug->client2 != NULL, NULL); - fail_unless(error == NULL, NULL); - pipe_path = g_strdup_printf("%s/configs/group/2/pluginpipe", testbed); - osync_client_run_external(debug->client2, pipe_path, debug->plugin, &error); - g_free(pipe_path); - - osync_trace(TRACE_EXIT, "%s: %p", __func__, debug); - return debug; -} - -START_TEST (engine_sync_out_of_order) -{ - char *testbed = setup_testbed("sync_setup"); - char *formatdir = g_strdup_printf("%s/formats", testbed); - - OSyncError *error = NULL; - OSyncDebugGroup *debug = _create_group3(testbed); - - OSyncEngine *engine = osync_engine_new(debug->group, &error); - fail_unless(engine != NULL, NULL); - fail_unless(error == NULL, NULL); - osync_engine_set_formatdir(engine, formatdir); - osync_engine_set_schemadir(engine, testbed); - - _engine_instrument_pluginenv(engine, debug); - - fail_unless(osync_engine_initialize(engine, &error), NULL); - fail_unless(error == NULL, NULL); - - fail_unless(osync_engine_synchronize_and_block(engine, &error), NULL); - fail_unless(error == NULL, NULL); - - fail_unless(osync_engine_finalize(engine, &error), NULL); - fail_unless(error == NULL, NULL); - - _free_group(debug); - - osync_engine_unref(engine); - - g_free(formatdir); - - destroy_testbed(testbed); -} -END_TEST - -static void main_disconnect4(OSyncObjTypeSink *sink, OSyncPluginInfo *info, OSyncContext *ctx, void *data) -{ - mock_env *env = data; - osync_trace(TRACE_ENTRY, "%s(%p, %p, %p)", __func__, data, info, ctx); - - osync_assert(env); - osync_assert(env->num_connect == 3); - osync_assert(env->num_disconnect == 3); - osync_assert(env->num_get_changes == 3); - osync_assert(env->main_connect == 1); - osync_assert(env->main_disconnect == 0); - osync_assert(env->main_get_changes == 1); - - g_atomic_int_inc(&(env->main_disconnect)); - - osync_context_report_success(env->ctx[0]); - osync_context_report_success(env->ctx[2]); - osync_context_report_success(ctx); - osync_context_report_success(env->ctx[1]); - - osync_context_unref(env->ctx[0]); - osync_context_unref(env->ctx[1]); - osync_context_unref(env->ctx[2]); - - env->num_connect = 0; - env->num_disconnect = 0; - env->num_get_changes = 0; - env->num_sync_done = 0; - env->main_connect = 0; - env->main_disconnect = 0; - env->main_get_changes = 0; - env->main_sync_done = 0; - - osync_trace(TRACE_EXIT, "%s", __func__); -} - -static void *initialize_reuse(OSyncPlugin *plugin, OSyncPluginInfo *info, OSyncError **error) -{ - osync_trace(TRACE_ENTRY, "%s(%p, %p)", __func__, info, error); - - mock_env *env = osync_try_malloc0(sizeof(mock_env), error); - if (!env) - goto error; - - OSyncObjTypeSink *sink = osync_objtype_sink_new("mockobjtype1", error); - if (!sink) - goto error; - - OSyncObjFormatSink *format_sink = osync_objformat_sink_new("mockobjtype1", error); - osync_objtype_sink_add_objformat_sink(sink, format_sink); - osync_objformat_sink_unref(format_sink); - - osync_objtype_sink_set_connect_func(sink, connect3); - osync_objtype_sink_set_disconnect_func(sink, disconnect3); - osync_objtype_sink_set_get_changes_func(sink, get_changes3); - osync_objtype_sink_set_sync_done_func(sink, sync_done3); - - osync_objtype_sink_set_userdata(sink, env); - - osync_plugin_info_add_objtype(info, sink); - osync_objtype_sink_unref(sink); - - sink = osync_objtype_sink_new("mockobjtype2", error); - if (!sink) - goto error; - - format_sink = osync_objformat_sink_new("vcard", error); - osync_objtype_sink_add_objformat_sink(sink, format_sink); - osync_objformat_sink_unref(format_sink); - - osync_objtype_sink_set_connect_func(sink, connect3); - osync_objtype_sink_set_disconnect_func(sink, disconnect3); - osync_objtype_sink_set_get_changes_func(sink, get_changes3); - osync_objtype_sink_set_sync_done_func(sink, sync_done3); - - osync_objtype_sink_set_userdata(sink, env); - - osync_plugin_info_add_objtype(info, sink); - osync_objtype_sink_unref(sink); - - sink = osync_objtype_sink_new("mockobjtype3", error); - if (!sink) - goto error; - - format_sink = osync_objformat_sink_new("plain", error); - osync_objtype_sink_add_objformat_sink(sink, format_sink); - osync_objformat_sink_unref(format_sink); - - osync_objtype_sink_set_connect_func(sink, connect3); - osync_objtype_sink_set_disconnect_func(sink, disconnect3); - osync_objtype_sink_set_get_changes_func(sink, get_changes3); - osync_objtype_sink_set_sync_done_func(sink, sync_done3); - - osync_objtype_sink_set_userdata(sink, env); - - osync_plugin_info_add_objtype(info, sink); - osync_objtype_sink_unref(sink); - - /* The main sink */ - sink = osync_objtype_main_sink_new(error); - if (!sink) - goto error; - - osync_objtype_sink_set_connect_func(sink, main_connect3); - osync_objtype_sink_set_disconnect_func(sink, main_disconnect4); - osync_objtype_sink_set_get_changes_func(sink, main_get_changes3); - osync_objtype_sink_set_sync_done_func(sink, main_sync_done3); - - osync_objtype_sink_set_userdata(sink, env); - - osync_plugin_info_set_main_sink(info, sink); - osync_objtype_sink_unref(sink); - - osync_trace(TRACE_EXIT, "%s: %p", __func__, env); - return (void *)env; - -error: - osync_trace(TRACE_EXIT_ERROR, "%s: %s", __func__, osync_error_print(error)); - return NULL; -} - -static void finalize_reuse(void *data) -{ - mock_env *env = data; - - g_free(env); -} - -static OSyncDebugGroup *_create_group4(char *testbed) -{ - osync_trace(TRACE_ENTRY, "%s(%s)", __func__, testbed); - - OSyncDebugGroup *debug = g_malloc0(sizeof(OSyncDebugGroup)); - - OSyncError *error = NULL; - debug->group = osync_group_new(&error); - fail_unless(debug->group != NULL, NULL); - fail_unless(error == NULL, NULL); - - osync_group_set_configdir(debug->group, testbed); - - debug->member1 = osync_member_new(&error); - fail_unless(debug->member1 != NULL, NULL); - fail_unless(error == NULL, NULL); - osync_group_add_member(debug->group, debug->member1); - osync_member_set_pluginname(debug->member1, "mock-sync-foo"); - char *path = g_strdup_printf("%s/configs/group/1", testbed); - osync_member_set_configdir(debug->member1, path); - g_free(path); - - _member_add_format(debug->member1, "mockobjtype1", "mockformat1"); - _member_add_format(debug->member1, "mockobjtype2", "mockformat2"); - _member_add_format(debug->member1, "mockobjtype3", "mockformat3"); - - debug->member2 = osync_member_new(&error); - fail_unless(debug->member2 != NULL, NULL); - fail_unless(error == NULL, NULL); - osync_group_add_member(debug->group, debug->member2); - osync_member_set_pluginname(debug->member2, "mock-sync-foo"); - path = g_strdup_printf("%s/configs/group/2", testbed); - osync_member_set_configdir(debug->member2, path); - g_free(path); - - _member_add_format(debug->member2, "mockobjtype1", "mockformat1"); - _member_add_format(debug->member2, "mockobjtype2", "mockformat2"); - _member_add_format(debug->member2, "mockobjtype3", "mockformat3"); - - debug->plugin = osync_plugin_new(&error); - fail_unless(debug->plugin != NULL, NULL); - fail_unless(error == NULL, NULL); - - osync_plugin_set_name(debug->plugin, "mock-sync-foo"); - osync_plugin_set_longname(debug->plugin, "Mock Sync Plugin"); - osync_plugin_set_description(debug->plugin, "This is a pseudo plugin"); - osync_plugin_set_start_type(debug->plugin, OSYNC_START_TYPE_EXTERNAL); - osync_plugin_set_config_type(debug->plugin, OSYNC_PLUGIN_NO_CONFIGURATION); - - osync_plugin_set_initialize(debug->plugin, initialize_reuse); - osync_plugin_set_finalize(debug->plugin, finalize_reuse); - - debug->client1 = osync_client_new(&error); - fail_unless(debug->client1 != NULL, NULL); - fail_unless(error == NULL, NULL); - char *pipe_path = g_strdup_printf("%s/configs/group/1/pluginpipe", testbed); - osync_client_run_external(debug->client1, pipe_path, debug->plugin, &error); - g_free(pipe_path); - - debug->client2 = osync_client_new(&error); - fail_unless(debug->client2 != NULL, NULL); - fail_unless(error == NULL, NULL); - pipe_path = g_strdup_printf("%s/configs/group/2/pluginpipe", testbed); - osync_client_run_external(debug->client2, pipe_path, debug->plugin, &error); - g_free(pipe_path); - - osync_trace(TRACE_EXIT, "%s: %p", __func__, debug); - return debug; -} - -START_TEST (engine_sync_reuse) -{ - char *testbed = setup_testbed("sync_setup"); - char *formatdir = g_strdup_printf("%s/formats", testbed); - - OSyncError *error = NULL; - OSyncDebugGroup *debug = _create_group4(testbed); - - OSyncEngine *engine = osync_engine_new(debug->group, &error); - fail_unless(engine != NULL, NULL); - fail_unless(error == NULL, NULL); - osync_engine_set_formatdir(engine, formatdir); - osync_engine_set_schemadir(engine, testbed); - - _engine_instrument_pluginenv(engine, debug); - - fail_unless(osync_engine_initialize(engine, &error), NULL); - fail_unless(error == NULL, NULL); - - fail_unless(osync_engine_synchronize_and_block(engine, &error), NULL); - fail_unless(error == NULL, NULL); - - fail_unless(osync_engine_synchronize_and_block(engine, &error), NULL); - fail_unless(error == NULL, NULL); - - fail_unless(osync_engine_synchronize_and_block(engine, &error), NULL); - fail_unless(error == NULL, NULL); - - fail_unless(osync_engine_finalize(engine, &error), NULL); - fail_unless(error == NULL, NULL); - - _free_group(debug); - - osync_engine_unref(engine); - - g_free(formatdir); - - destroy_testbed(testbed); -} -END_TEST - -START_TEST (engine_sync_stress) -{ - int n = 250; /* FIXME: Used to be 1000 - #1040 */ - int i = 0; - - char *testbed = setup_testbed("sync_setup"); - char *formatdir = g_strdup_printf("%s/formats", testbed); - - OSyncError *error = NULL; - OSyncDebugGroup *debug = _create_group4(testbed); - - OSyncEngine *engine = osync_engine_new(debug->group, &error); - fail_unless(engine != NULL, NULL); - fail_unless(error == NULL, NULL); - osync_engine_set_formatdir(engine, formatdir); - osync_engine_set_schemadir(engine, testbed); - - _engine_instrument_pluginenv(engine, debug); - - fail_unless(osync_engine_initialize(engine, &error), NULL); - fail_unless(error == NULL, NULL); - - for (i = 0; i < n; i++) { - fail_unless(osync_engine_synchronize_and_block(engine, &error), NULL); - fail_unless(error == NULL, NULL); - } - - fail_unless(osync_engine_finalize(engine, &error), NULL); - fail_unless(error == NULL, NULL); - - _free_group(debug); - - osync_engine_unref(engine); - - g_free(formatdir); - - destroy_testbed(testbed); -} -END_TEST - -static void connect5(OSyncObjTypeSink *sink, OSyncPluginInfo *info, OSyncContext *ctx, void *data) -{ - mock_env *env = data; - osync_trace(TRACE_ENTRY, "%s(%p, %p, %p)", __func__, data, info, ctx); - - g_atomic_int_inc(&(env->num_connect)); - - osync_context_report_success(ctx); - - osync_trace(TRACE_EXIT, "%s", __func__); -} - -static void disconnect5(OSyncObjTypeSink *sink, OSyncPluginInfo *info, OSyncContext *ctx, void *data) -{ - mock_env *env = data; - osync_trace(TRACE_ENTRY, "%s(%p, %p, %p)", __func__, data, info, ctx); - - g_atomic_int_inc(&(env->num_disconnect)); - - osync_context_report_success(ctx); - - osync_trace(TRACE_EXIT, "%s", __func__); -} - -static void get_changes5(OSyncObjTypeSink *sink, OSyncPluginInfo *info, OSyncContext *ctx, osync_bool slow_sync, void *data) -{ - mock_env *env = data; - osync_trace(TRACE_ENTRY, "%s(%p, %p, %p)", __func__, data, info, ctx); - - OSyncFormatEnv *formatenv = osync_plugin_info_get_format_env(info); - osync_assert(formatenv != NULL); - - OSyncObjFormat *format = osync_format_env_find_objformat(formatenv, "mockformat1"); - osync_assert(format != NULL); - - OSyncError *error = NULL; - OSyncChange *change = osync_change_new(&error); - osync_assert(change != NULL); - osync_assert(error == NULL); - - osync_change_set_changetype(change, OSYNC_CHANGE_TYPE_ADDED); - - char *uid = osync_rand_str(16, &error); - osync_assert(error == NULL); - osync_change_set_uid(change, uid); - g_free(uid); - - OSyncFileFormat *file = osync_try_malloc0(sizeof(OSyncFileFormat), &error); - osync_assert(file != NULL); - file->path = g_strdup(osync_change_get_uid(change)); - - file->data = g_strdup_printf("%p", change); - file->size = strlen(file->data); - - OSyncData *changedata = osync_data_new((char *)file, sizeof(OSyncFileFormat), format, &error); - osync_data_set_objtype(changedata, "mockobjtype1"); - - osync_assert(changedata != NULL); - osync_assert(error == NULL); - osync_change_set_data(change, changedata); - osync_data_unref(changedata); - - osync_context_report_change(ctx, change); - osync_change_unref(change); - - g_atomic_int_inc(&(env->num_get_changes)); - - osync_context_report_success(ctx); - - osync_trace(TRACE_EXIT, "%s", __func__); -} - -static void commit_change5(OSyncObjTypeSink *sink, OSyncPluginInfo *info, OSyncContext *ctx, OSyncChange *change, void *data) -{ - mock_env *env = data; - osync_trace(TRACE_ENTRY, "%s(%p, %p, %p, %p)", __func__, data, info, ctx, change); - - g_atomic_int_inc(&(env->num_commit_changes)); - - osync_context_report_success(ctx); - - osync_trace(TRACE_EXIT, "%s", __func__); -} - -static void *initialize5(OSyncPlugin *plugin, OSyncPluginInfo *info, OSyncError **error) -{ - osync_trace(TRACE_ENTRY, "%s(%p, %p)", __func__, info, error); - - mock_env *env = osync_try_malloc0(sizeof(mock_env), error); - if (!env) - goto error; - - OSyncObjTypeSink *sink = osync_objtype_sink_new("mockobjtype1", error); - if (!sink) - goto error; - - OSyncObjFormatSink *format_sink = osync_objformat_sink_new("mockformat1", error); - osync_objtype_sink_add_objformat_sink(sink, format_sink); - osync_objformat_sink_unref(format_sink); - - osync_objtype_sink_set_connect_func(sink, connect5); - osync_objtype_sink_set_disconnect_func(sink, disconnect5); - osync_objtype_sink_set_get_changes_func(sink, get_changes5); - osync_objtype_sink_set_commit_func(sink, commit_change5); - - osync_objtype_sink_set_userdata(sink, env); - - osync_plugin_info_add_objtype(info, sink); - osync_objtype_sink_unref(sink); - - osync_trace(TRACE_EXIT, "%s: %p", __func__, env); - return (void *)env; - -error: - osync_trace(TRACE_EXIT_ERROR, "%s: %s", __func__, osync_error_print(error)); - return NULL; -} - -static void finalize5(void *data) -{ - mock_env *env = data; - - osync_assert(env->num_connect == 1); - osync_assert(env->num_disconnect == 1); - osync_assert(env->num_get_changes == 1); - osync_assert(env->num_commit_changes == 1); - osync_assert(env->main_connect == 0); - osync_assert(env->main_disconnect == 0); - osync_assert(env->main_get_changes == 0); - - g_free(env); -} - -static OSyncDebugGroup *_create_group5(char *testbed) -{ - osync_trace(TRACE_ENTRY, "%s(%s)", __func__, testbed); - - OSyncDebugGroup *debug = g_malloc0(sizeof(OSyncDebugGroup)); - - OSyncError *error = NULL; - debug->group = osync_group_new(&error); - fail_unless(debug->group != NULL, NULL); - fail_unless(error == NULL, NULL); - - osync_group_set_configdir(debug->group, testbed); - - debug->member1 = osync_member_new(&error); - fail_unless(debug->member1 != NULL, NULL); - fail_unless(error == NULL, NULL); - osync_group_add_member(debug->group, debug->member1); - osync_member_set_pluginname(debug->member1, "mock-sync-foo"); - char *path = g_strdup_printf("%s/configs/group/1", testbed); - osync_member_set_configdir(debug->member1, path); - g_free(path); - _member_add_format(debug->member1, "mockobjtype1", "mockformat1"); - - debug->member2 = osync_member_new(&error); - fail_unless(debug->member2 != NULL, NULL); - fail_unless(error == NULL, NULL); - osync_group_add_member(debug->group, debug->member2); - osync_member_set_pluginname(debug->member2, "mock-sync-foo"); - path = g_strdup_printf("%s/configs/group/2", testbed); - osync_member_set_configdir(debug->member2, path); - g_free(path); - - _member_add_format(debug->member2, "mockobjtype1", "mockformat1"); - - debug->plugin = osync_plugin_new(&error); - fail_unless(debug->plugin != NULL, NULL); - fail_unless(error == NULL, NULL); - - osync_plugin_set_name(debug->plugin, "mock-sync-foo"); - osync_plugin_set_longname(debug->plugin, "Mock Sync Plugin"); - osync_plugin_set_description(debug->plugin, "This is a pseudo plugin"); - osync_plugin_set_start_type(debug->plugin, OSYNC_START_TYPE_EXTERNAL); - osync_plugin_set_config_type(debug->plugin, OSYNC_PLUGIN_NO_CONFIGURATION); - - osync_plugin_set_initialize(debug->plugin, initialize5); - osync_plugin_set_finalize(debug->plugin, finalize5); - - debug->client1 = osync_client_new(&error); - fail_unless(debug->client1 != NULL, NULL); - fail_unless(error == NULL, NULL); - char *pipe_path = g_strdup_printf("%s/configs/group/1/pluginpipe", testbed); - osync_client_run_external(debug->client1, pipe_path, debug->plugin, &error); - g_free(pipe_path); - - debug->client2 = osync_client_new(&error); - fail_unless(debug->client2 != NULL, NULL); - fail_unless(error == NULL, NULL); - pipe_path = g_strdup_printf("%s/configs/group/2/pluginpipe", testbed); - osync_client_run_external(debug->client2, pipe_path, debug->plugin, &error); - g_free(pipe_path); - - osync_trace(TRACE_EXIT, "%s: %p", __func__, debug); - return debug; -} - -START_TEST (engine_sync_read_write) -{ - char *testbed = setup_testbed("sync_setup"); - char *formatdir = g_strdup_printf("%s/formats", testbed); - - OSyncError *error = NULL; - OSyncDebugGroup *debug = _create_group5(testbed); - - OSyncEngine *engine = osync_engine_new(debug->group, &error); - fail_unless(engine != NULL, NULL); - fail_unless(error == NULL, NULL); - osync_engine_set_formatdir(engine, formatdir); - osync_engine_set_schemadir(engine, testbed); - - _engine_instrument_pluginenv(engine, debug); - - fail_unless(osync_engine_initialize(engine, &error), NULL); - fail_unless(error == NULL, NULL); - - fail_unless(osync_engine_synchronize_and_block(engine, &error), NULL); - fail_unless(error == NULL, NULL); - - fail_unless(osync_engine_finalize(engine, &error), NULL); - fail_unless(error == NULL, NULL); - - _free_group(debug); - - osync_engine_unref(engine); - - g_free(formatdir); - - destroy_testbed(testbed); -} -END_TEST - -#define COMMIT_STRESS_GROUP6 250 - -static void get_changes6(OSyncObjTypeSink *sink, OSyncPluginInfo *info, OSyncContext *ctx, osync_bool slow_sync, void *data) -{ - mock_env *env = data; - int i; - osync_trace(TRACE_ENTRY, "%s(%p, %p, %p)", __func__, data, info, ctx); - - OSyncFormatEnv *formatenv = osync_plugin_info_get_format_env(info); - osync_assert(formatenv != NULL); - - OSyncObjFormat *format = osync_format_env_find_objformat(formatenv, "mockformat1"); - osync_assert(format != NULL); - - OSyncError *error = NULL; - - for (i = 0; i < COMMIT_STRESS_GROUP6; i++) { - OSyncChange *change = osync_change_new(&error); - osync_assert(change != NULL); - osync_assert(error == NULL); - - osync_change_set_changetype(change, OSYNC_CHANGE_TYPE_ADDED); - char *rand = osync_rand_str(16, &error); - osync_assert(error == NULL); - char *uid = osync_strdup_printf("uid_%s_%u", rand, i); - osync_change_set_uid(change, uid); - osync_free(uid); - osync_free(rand); - - OSyncFileFormat *file = osync_try_malloc0(sizeof(OSyncFileFormat), &error); - osync_assert(file != NULL); - file->path = g_strdup(osync_change_get_uid(change)); - - file->data = g_strdup_printf("%p", change); - file->size = strlen(file->data); - - OSyncData *changedata = osync_data_new((char *)file, sizeof(OSyncFileFormat), format, &error); - osync_assert(changedata != NULL); - - osync_data_set_objtype(changedata, "mockobjtype1"); - - osync_assert(changedata != NULL); - osync_assert(error == NULL); - osync_change_set_data(change, changedata); - osync_data_unref(changedata); - - osync_context_report_change(ctx, change); - osync_change_unref(change); - } - - g_atomic_int_inc(&(env->num_get_changes)); - - osync_context_report_success(ctx); - - osync_trace(TRACE_EXIT, "%s", __func__); -} - -static void *initialize6(OSyncPlugin *plugin, OSyncPluginInfo *info, OSyncError **error) -{ - osync_trace(TRACE_ENTRY, "%s(%p, %p)", __func__, info, error); - - mock_env *env = osync_try_malloc0(sizeof(mock_env), error); - if (!env) - goto error; - - OSyncObjTypeSink *sink = osync_objtype_sink_new("mockobjtype1", error); - if (!sink) - goto error; - - OSyncObjFormatSink *format_sink = osync_objformat_sink_new("mockformat1", error); - osync_objtype_sink_add_objformat_sink(sink, format_sink); - osync_objformat_sink_unref(format_sink); - - osync_objtype_sink_set_connect_func(sink, connect5); - osync_objtype_sink_set_disconnect_func(sink, disconnect5); - osync_objtype_sink_set_get_changes_func(sink, get_changes6); - osync_objtype_sink_set_commit_func(sink, commit_change5); - - osync_objtype_sink_set_userdata(sink, env); - - osync_plugin_info_add_objtype(info, sink); - osync_objtype_sink_unref(sink); - - osync_trace(TRACE_EXIT, "%s... [truncated message content] |
From: <svn...@op...> - 2009-11-05 16:30:35
|
Author: dgollub Date: Thu Nov 5 17:30:06 2009 New Revision: 5928 URL: http://www.opensync.org/changeset/5928 Log: Implement the required mapping-table update calls for a UID-update during the sync-done phase. osync_context_report_uid_update() is no longer NOP. see #1161 Modified: trunk/opensync/engine/opensync_engine.c trunk/opensync/engine/opensync_obj_engine.c trunk/opensync/engine/opensync_obj_engine_internals.h Modified: trunk/opensync/engine/opensync_engine.c ============================================================================== --- trunk/opensync/engine/opensync_engine.c Thu Nov 5 17:28:53 2009 (r5927) +++ trunk/opensync/engine/opensync_engine.c Thu Nov 5 17:30:06 2009 (r5928) @@ -174,7 +174,19 @@ static void _osync_engine_receive_uid_update(OSyncClientProxy *proxy, void *userdata, const char *objtype, const char *olduid, const char *newuid) { - printf("OBJTYPE: %s OLDUID: %s NEWUID: %s\n", objtype, olduid, newuid); + OSyncError *error = NULL; + OSyncEngine *engine = (OSyncEngine *) userdata; + OSyncObjEngine *objengine = osync_engine_find_objengine(engine, objtype); + + if (!osync_objengine_uid_update(objengine, proxy, olduid, newuid, &error)) + goto error; + + return; +error: + osync_engine_set_error(engine, error); + osync_error_unref(&error); + + return; } static void _osync_engine_receive_change(OSyncClientProxy *proxy, void *userdata, OSyncChange *change) Modified: trunk/opensync/engine/opensync_obj_engine.c ============================================================================== --- trunk/opensync/engine/opensync_obj_engine.c Thu Nov 5 17:28:53 2009 (r5927) +++ trunk/opensync/engine/opensync_obj_engine.c Thu Nov 5 17:30:06 2009 (r5928) @@ -1504,3 +1504,17 @@ return FALSE; } + +osync_bool osync_objengine_uid_update(OSyncObjEngine *engine, OSyncClientProxy *proxy, const char *olduid, const char *newuid, OSyncError **error) +{ + long long int memberid = osync_member_get_id(osync_client_proxy_get_member(proxy)); + + if (!osync_archive_update_change_uid(engine->archive, olduid, newuid, memberid, engine->objtype, error)) + goto error; + + return TRUE; + +error: + return FALSE; +} + Modified: trunk/opensync/engine/opensync_obj_engine_internals.h ============================================================================== --- trunk/opensync/engine/opensync_obj_engine_internals.h Thu Nov 5 17:28:53 2009 (r5927) +++ trunk/opensync/engine/opensync_obj_engine_internals.h Thu Nov 5 17:30:06 2009 (r5928) @@ -181,5 +181,8 @@ */ OSYNC_TEST_EXPORT OSyncMember *osync_obj_engine_nth_member(OSyncObjEngine *engine, unsigned int nth); + +OSYNC_TEST_EXPORT osync_bool osync_objengine_uid_update(OSyncObjEngine *objengine, OSyncClientProxy *proxy, const char *olduid, const char *newuid, OSyncError **error); + #endif /* OPENSYNC_OBJ_ENGINE_INTERNALS_H_ */ |
From: <svn...@op...> - 2009-11-05 16:29:02
|
Author: dgollub Date: Thu Nov 5 17:28:53 2009 New Revision: 5927 URL: http://www.opensync.org/changeset/5927 Log: Update hashtable if a plugin sends a osync_context_report_uid_update() event. see #1161 Modified: trunk/opensync/client/opensync_client.c Modified: trunk/opensync/client/opensync_client.c ============================================================================== --- trunk/opensync/client/opensync_client.c Thu Nov 5 17:27:29 2009 (r5926) +++ trunk/opensync/client/opensync_client.c Thu Nov 5 17:28:53 2009 (r5927) @@ -402,15 +402,25 @@ OSyncError *locerror = NULL; OSyncClient *client = NULL; OSyncMessage *message = NULL; + OSyncHashTable *hashtable = NULL; const char *objtype = NULL; client = data; - osync_trace(TRACE_ENTRY, "%s(%p, %s, %s, %p, %p)", __func__, __NULLSTR(olduid), __NULLSTR(newuid), sink, data); + osync_trace(TRACE_ENTRY, "%s(%s, %s, %p, %p)", __func__, __NULLSTR(olduid), __NULLSTR(newuid), sink, data); objtype = osync_objtype_sink_get_name(sink); /* We don't expect main-sink here */ osync_assert(objtype); + + + /* Update Hashtable, if available, first. */ + if ((hashtable = osync_objtype_sink_get_hashtable(sink))) { + + if (!osync_hashtable_update_uid(hashtable, olduid, newuid, &locerror)) + goto error; + + } message = osync_message_new(OSYNC_MESSAGE_MAPPING_CHANGED, 0, &locerror); if (!message) |
From: <svn...@op...> - 2009-11-05 16:27:52
|
Author: dgollub Date: Thu Nov 5 17:27:29 2009 New Revision: 5926 URL: http://www.opensync.org/changeset/5926 Log: Introduce archive function to update the UID in the mapping-table, which is inside the archive-database. see #1161 Modified: trunk/opensync/archive/opensync_archive.c trunk/opensync/archive/opensync_archive_internals.h Modified: trunk/opensync/archive/opensync_archive.c ============================================================================== --- trunk/opensync/archive/opensync_archive.c Thu Nov 5 17:25:05 2009 (r5925) +++ trunk/opensync/archive/opensync_archive.c Thu Nov 5 17:27:29 2009 (r5926) @@ -632,3 +632,45 @@ return FALSE; } +osync_bool osync_archive_update_change_uid(OSyncArchive *archive, const char *olduid, const char *newuid, long long int memberid, const char *objengine, OSyncError **error) +{ + char *query = NULL; + char *escaped_newuid = NULL; + char *escaped_olduid = NULL; + char *escaped_objengine = NULL; + + osync_trace(TRACE_ENTRY, "%s(%p, %s, %s, %lli, %s, %p)", __func__, archive, __NULLSTR(olduid), __NULLSTR(newuid), memberid, __NULLSTR(objengine), error); + osync_assert(archive); + osync_assert(olduid); + osync_assert(newuid); + osync_assert(objengine); + + escaped_newuid = osync_db_sql_escape(newuid); + escaped_olduid = osync_db_sql_escape(olduid); + escaped_objengine = osync_db_sql_escape(objengine); + + query = osync_strdup_printf("UPDATE tbl_changes SET uid='%s' WHERE objengine='%s' AND memberid=%lli AND uid='%s'", escaped_newuid, escaped_objengine, memberid, escaped_olduid); + + osync_free(escaped_objengine); + osync_free(escaped_olduid); + osync_free(escaped_newuid); + escaped_objengine = NULL; + escaped_olduid = NULL; + escaped_newuid = NULL; + + if (!osync_db_query(archive->db, query, error)) { + osync_free(query); + goto error; + } + + osync_free(query); + + osync_trace(TRACE_EXIT, "%s", __func__); + return TRUE; + +error: + osync_trace(TRACE_EXIT_ERROR, "%s: %s", __func__, osync_error_print(error)); + return FALSE; +} + + Modified: trunk/opensync/archive/opensync_archive_internals.h ============================================================================== --- trunk/opensync/archive/opensync_archive_internals.h Thu Nov 5 17:25:05 2009 (r5925) +++ trunk/opensync/archive/opensync_archive_internals.h Thu Nov 5 17:27:29 2009 (r5926) @@ -166,6 +166,10 @@ osync_bool osync_archive_flush_ignored_conflict(OSyncArchive *archive, const char *objtype, OSyncError **error); osync_bool osync_archive_get_mixed_objengines(OSyncArchive *archive, const char *objengine, OSyncList **objengines, OSyncError **error); + + +osync_bool osync_archive_update_change_uid(OSyncArchive *archive, const char *olduid, const char *newuid, long long int memberid, const char *objengine, OSyncError **error); + /*@}*/ #endif /*OPENSYNC_ARCHIVE_INTERNALS_H_*/ |
From: <svn...@op...> - 2009-11-05 16:25:52
|
Author: dgollub Date: Thu Nov 5 17:25:05 2009 New Revision: 5925 URL: http://www.opensync.org/changeset/5925 Log: Introduce internal hashtable function to update the UID. This got introduced for osync_context_report_uid_update() see #1161 Modified: trunk/opensync/helper/opensync_hashtable.c trunk/opensync/helper/opensync_hashtable_internals.h Modified: trunk/opensync/helper/opensync_hashtable.c ============================================================================== --- trunk/opensync/helper/opensync_hashtable.c Wed Nov 4 23:20:52 2009 (r5924) +++ trunk/opensync/helper/opensync_hashtable.c Thu Nov 5 17:25:05 2009 (r5925) @@ -350,6 +350,45 @@ osync_trace(TRACE_EXIT, "%s", __func__); } +osync_bool osync_hashtable_update_uid(OSyncHashTable *table, const char *olduid, const char *newuid, OSyncError **error) +{ + const char *hash = NULL; + char *origkey = NULL; + + osync_assert(table); + osync_assert(table->dbhandle); + + osync_trace(TRACE_ENTRY, "%s(%p)", __func__, table); + + + /* Get the old hash */ + hash = osync_hashtable_get_hash(table, olduid); + + if (!g_hash_table_lookup_extended(table->db_entries, olduid, (gpointer *) &origkey, NULL)) { + osync_error_set(error, OSYNC_ERROR_GENERIC, "Couldn't found hash with UID \"%s\" which requires an UID update.", olduid); + goto error; + } + + if (g_hash_table_lookup(table->db_entries, newuid)) { + osync_error_set(error, OSYNC_ERROR_GENERIC, "Couldn't update UID in hashtable, UID \"%s\" already exists!", newuid); + goto error; + } + + g_hash_table_insert(table->db_entries, g_strdup(newuid), g_strdup(hash)); + + if (!g_hash_table_remove(table->db_entries, olduid)) { + osync_error_set(error, OSYNC_ERROR_GENERIC, "Couldn't remove old hash entry with UID \"%s\".", olduid); + goto error; + } + + osync_trace(TRACE_EXIT, "%s", __func__); + return TRUE; + +error: + osync_trace(TRACE_EXIT_ERROR, "%s: %s", __func__, osync_error_print(error)); + return FALSE; +} + struct callback_data { OSyncList *deleted_entries; OSyncHashTable *table; Modified: trunk/opensync/helper/opensync_hashtable_internals.h ============================================================================== --- trunk/opensync/helper/opensync_hashtable_internals.h Wed Nov 4 23:20:52 2009 (r5924) +++ trunk/opensync/helper/opensync_hashtable_internals.h Thu Nov 5 17:25:05 2009 (r5925) @@ -105,5 +105,8 @@ */ OSYNC_TEST_EXPORT unsigned int osync_hashtable_num_entries(OSyncHashTable *table); + +OSYNC_TEST_EXPORT osync_bool osync_hashtable_update_uid(OSyncHashTable *table, const char *olduid, const char *newuid, OSyncError **error); + #endif /*_OPENSYNC_HASHTABLE_INTERNALS_H_*/ |
From: <svn...@op...> - 2009-11-04 22:21:12
|
Author: ianmartin Date: Wed Nov 4 23:20:52 2009 New Revision: 5924 URL: http://www.opensync.org/changeset/5924 Log: Run plugin as process to stop segfault inside libecal Modified: plugins/evolution2/src/evolution2_sync.c Modified: plugins/evolution2/src/evolution2_sync.c ============================================================================== --- plugins/evolution2/src/evolution2_sync.c Wed Nov 4 17:07:07 2009 (r5923) +++ plugins/evolution2/src/evolution2_sync.c Wed Nov 4 23:20:52 2009 (r5924) @@ -24,6 +24,8 @@ #include <libedataserver/eds-version.h> #endif /* HAVE_EDS_VERSION_H */ +#include <gmodule.h> + #include <opensync/opensync.h> #include <opensync/opensync-format.h> #include <opensync/opensync-capabilities.h> @@ -220,6 +222,7 @@ osync_plugin_set_initialize(plugin, evo2_initialize); osync_plugin_set_finalize(plugin, evo2_finalize); osync_plugin_set_discover(plugin, evo2_discover); + osync_plugin_set_start_type(plugin, OSYNC_START_TYPE_PROCESS); if (!osync_plugin_env_register_plugin(env, plugin, error)) goto error; @@ -251,3 +254,9 @@ { return 1; } + +const char * g_module_check_init (GModule *module) +{ + g_module_make_resident (module); + return NULL; +} |
From: <svn...@op...> - 2009-11-04 16:07:51
|
Author: dgollub Date: Wed Nov 4 17:07:07 2009 New Revision: 5923 URL: http://www.opensync.org/changeset/5923 Log: Introduce osync_context_report_uid_update() to report mapping changes for async protocolos (e.g. syncml, ...). This context function is useable inside the sync_done() phase. The interface it self is currently NOP. Mapping table update still needs to be implemented. See #1161 Added: trunk/opensync/plugin/opensync_context_internals.h - copied, changed from r5920, trunk/opensync/plugin/opensync_context.h Modified: trunk/opensync.sym trunk/opensync/client/opensync_client.c trunk/opensync/client/opensync_client_proxy.c trunk/opensync/client/opensync_client_proxy_internals.h trunk/opensync/client/opensync_client_proxy_private.h trunk/opensync/engine/opensync_engine.c trunk/opensync/plugin/opensync_context.c trunk/opensync/plugin/opensync_context.h trunk/opensync/plugin/opensync_context_private.h Modified: trunk/opensync.sym ============================================================================== --- trunk/opensync.sym Tue Nov 3 20:28:17 2009 (r5922) +++ trunk/opensync.sym Wed Nov 4 17:07:07 2009 (r5923) @@ -72,6 +72,7 @@ osync_context_report_osyncwarning osync_context_report_slowsync osync_context_report_success +osync_context_report_uid_update osync_context_set_callback osync_context_set_changes_callback osync_context_set_slowsync_callback Modified: trunk/opensync/client/opensync_client.c ============================================================================== --- trunk/opensync/client/opensync_client.c Tue Nov 3 20:28:17 2009 (r5922) +++ trunk/opensync/client/opensync_client.c Wed Nov 4 17:07:07 2009 (r5923) @@ -25,6 +25,7 @@ #include "plugin/opensync_plugin_internals.h" #include "plugin/opensync_objtype_sink_internals.h" #include "plugin/opensync_plugin_info_internals.h" +#include "plugin/opensync_context_internals.h" #include "opensync-helper.h" #include "helper/opensync_hashtable_internals.h" @@ -395,6 +396,56 @@ return; } +static void _osync_client_uid_update_callback(const char *olduid, const char *newuid, OSyncObjTypeSink *sink, void *data) +{ + callContext *baton = NULL; + OSyncError *locerror = NULL; + OSyncClient *client = NULL; + OSyncMessage *message = NULL; + const char *objtype = NULL; + + client = data; + osync_trace(TRACE_ENTRY, "%s(%p, %s, %s, %p, %p)", __func__, __NULLSTR(olduid), __NULLSTR(newuid), sink, data); + + objtype = osync_objtype_sink_get_name(sink); + + /* We don't expect main-sink here */ + osync_assert(objtype); + + message = osync_message_new(OSYNC_MESSAGE_MAPPING_CHANGED, 0, &locerror); + if (!message) + goto error; + + /** objtype */ + if (!osync_message_write_string(message, objtype, &locerror)) + goto error_free_message; + + /** olduid */ + if (!osync_message_write_string(message, olduid, &locerror)) + goto error_free_message; + + /** newuid */ + if (!osync_message_write_string(message, newuid, &locerror)) + goto error_free_message; + + if (!osync_queue_send_message(client->outgoing, NULL, message, &locerror)) + goto error_free_message; + + osync_message_unref(message); + + osync_trace(TRACE_EXIT, "%s", __func__); + return; + + error_free_message: + osync_message_unref(message); + error: + _free_baton(baton); + osync_client_error_shutdown(client, locerror); + osync_error_unref(&locerror); + osync_trace(TRACE_EXIT, "%s", __func__); + return; +} + static void _osync_client_ignored_conflict_callback(OSyncChange *change, void *data) { callContext *baton = NULL; @@ -1449,6 +1500,8 @@ if (!context) goto error; + osync_context_set_uid_update_callback(context, _osync_client_uid_update_callback, sink, client); + osync_plugin_info_set_sink(client->plugin_info, sink); osync_objtype_sink_sync_done(sink, client->plugin_info, context); Modified: trunk/opensync/client/opensync_client_proxy.c ============================================================================== --- trunk/opensync/client/opensync_client_proxy.c Tue Nov 3 20:28:17 2009 (r5922) +++ trunk/opensync/client/opensync_client_proxy.c Wed Nov 4 17:07:07 2009 (r5923) @@ -827,6 +827,7 @@ OSyncClientProxy *proxy = user_data; OSyncError *error = NULL; OSyncChange *change = NULL; + char *objtype = NULL, *olduid = NULL, *newuid = NULL; osync_trace(TRACE_ENTRY, "%s(%p, %p)", __func__, message, user_data); @@ -850,13 +851,52 @@ osync_change_unref(change); break; + case OSYNC_MESSAGE_MAPPING_CHANGED: + + osync_assert(proxy->uid_update_callback); + + if (proxy->error) { + osync_trace(TRACE_INTERNAL, "WARNING: Proxy error taintend! Ignoring incoming changes!"); + break; + } + + if (!osync_message_read_string(message, &objtype, &error)) + goto error; + + if (!osync_message_read_string(message, &olduid, &error)) + goto error; + + if (!osync_message_read_string(message, &newuid, &error)) + goto error; + + proxy->uid_update_callback(proxy, proxy->uid_update_callback_data, objtype, olduid, newuid); + + osync_free(objtype); + osync_free(olduid); + osync_free(newuid); + + objtype = NULL; + olduid = NULL; + newuid = NULL; + + break; + default: break; } osync_trace(TRACE_EXIT, "%s", __func__); return; - error: +error: + if (objtype) + osync_free(objtype); + + if (olduid) + osync_free(olduid); + + if (newuid) + osync_free(newuid); + osync_trace(TRACE_EXIT_ERROR, "%s: %s", __func__, osync_error_print(&error)); osync_error_unref(&error); } @@ -946,6 +986,14 @@ proxy->change_callback_data = userdata; } +void osync_client_proxy_set_uid_update_callback(OSyncClientProxy *proxy, uid_update_cb cb, void *userdata) +{ + osync_assert(proxy); + + proxy->uid_update_callback = cb; + proxy->uid_update_callback_data = userdata; +} + OSyncMember *osync_client_proxy_get_member(OSyncClientProxy *proxy) { osync_assert(proxy); Modified: trunk/opensync/client/opensync_client_proxy_internals.h ============================================================================== --- trunk/opensync/client/opensync_client_proxy_internals.h Tue Nov 3 20:28:17 2009 (r5922) +++ trunk/opensync/client/opensync_client_proxy_internals.h Wed Nov 4 17:07:07 2009 (r5923) @@ -32,6 +32,7 @@ typedef void (* read_cb) (OSyncClientProxy *proxy, void *userdata, OSyncError *error); typedef void (* get_changes_cb) (OSyncClientProxy *proxy, void *userdata, OSyncError *error); typedef void (* change_cb) (OSyncClientProxy *proxy, void *userdata, OSyncChange *change); +typedef void (* uid_update_cb) (OSyncClientProxy *proxy, void *userdata, const char *objtype, const char *olduid, const char *newuid); typedef void (* commit_change_cb) (OSyncClientProxy *proxy, void *userdata, const char *uid, OSyncError *error); typedef void (* committed_all_cb) (OSyncClientProxy *proxy, void *userdata, OSyncError *error); typedef void (* sync_done_cb) (OSyncClientProxy *proxy, void *userdata, OSyncError *error); @@ -42,6 +43,7 @@ void osync_client_proxy_set_context(OSyncClientProxy *proxy, GMainContext *ctx); void osync_client_proxy_set_change_callback(OSyncClientProxy *proxy, change_cb cb, void *userdata); +void osync_client_proxy_set_uid_update_callback(OSyncClientProxy *proxy, uid_update_cb cb, void *userdata); OSyncMember *osync_client_proxy_get_member(OSyncClientProxy *proxy); OSYNC_TEST_EXPORT osync_bool osync_client_proxy_spawn(OSyncClientProxy *proxy, OSyncStartType type, const char *path, const char* external_command, OSyncError **error); Modified: trunk/opensync/client/opensync_client_proxy_private.h ============================================================================== --- trunk/opensync/client/opensync_client_proxy_private.h Tue Nov 3 20:28:17 2009 (r5922) +++ trunk/opensync/client/opensync_client_proxy_private.h Wed Nov 4 17:07:07 2009 (r5923) @@ -72,6 +72,9 @@ change_cb change_callback; void *change_callback_data; + uid_update_cb uid_update_callback; + void *uid_update_callback_data; + /** Proxy specific error struct */ OSyncError *error; }; Modified: trunk/opensync/engine/opensync_engine.c ============================================================================== --- trunk/opensync/engine/opensync_engine.c Tue Nov 3 20:28:17 2009 (r5922) +++ trunk/opensync/engine/opensync_engine.c Wed Nov 4 17:07:07 2009 (r5923) @@ -172,6 +172,11 @@ osync_converter_path_unref(converter_path); } +static void _osync_engine_receive_uid_update(OSyncClientProxy *proxy, void *userdata, const char *objtype, const char *olduid, const char *newuid) +{ + printf("OBJTYPE: %s OLDUID: %s NEWUID: %s\n", objtype, olduid, newuid); +} + static void _osync_engine_receive_change(OSyncClientProxy *proxy, void *userdata, OSyncChange *change) { OSyncEngine *engine = userdata; @@ -788,6 +793,7 @@ osync_client_proxy_set_context(proxy, engine->context); osync_client_proxy_set_change_callback(proxy, _osync_engine_receive_change, engine); + osync_client_proxy_set_uid_update_callback(proxy, _osync_engine_receive_uid_update, engine); if (osync_plugin_get_start_type(plugin) == OSYNC_START_TYPE_EXTERNAL) { Modified: trunk/opensync/plugin/opensync_context.c ============================================================================== --- trunk/opensync/plugin/opensync_context.c Tue Nov 3 20:28:17 2009 (r5922) +++ trunk/opensync/plugin/opensync_context.c Wed Nov 4 17:07:07 2009 (r5923) @@ -24,6 +24,7 @@ #include "opensync-data.h" #include "opensync_context.h" +#include "opensync_context_internals.h" #include "opensync_context_private.h" OSyncContext *osync_context_new(OSyncError **error) @@ -81,6 +82,14 @@ context->warning_function = warning; } +void osync_context_set_uid_update_callback(OSyncContext *context, OSyncContextUidUpdateFn uid_update_func, OSyncObjTypeSink *sink, void *userdata) +{ + osync_assert(context); + context->uid_update_function = uid_update_func; + context->uid_update_sink = sink; + context->uid_update_data = userdata; +} + void osync_context_report_osyncerror(OSyncContext *context, OSyncError *error) { osync_trace(TRACE_ENTRY, "%s(%p, %p:(%s))", __func__, context, error, osync_error_print(&error)); @@ -168,3 +177,16 @@ osync_trace(TRACE_EXIT, "%s", __func__); } +void osync_context_report_uid_update(OSyncContext *context, const char *olduid, const char *newuid) +{ + osync_trace(TRACE_ENTRY, "%s(%p, %s, %s)", __func__, context, __NULLSTR(olduid), __NULLSTR(newuid)); + + osync_return_if_fail(context); + osync_return_if_fail(olduid); + osync_return_if_fail(newuid); + + context->uid_update_function(olduid, newuid, context->uid_update_sink, context->uid_update_data); + + osync_trace(TRACE_EXIT, "%s", __func__); +} + Modified: trunk/opensync/plugin/opensync_context.h ============================================================================== --- trunk/opensync/plugin/opensync_context.h Tue Nov 3 20:28:17 2009 (r5922) +++ trunk/opensync/plugin/opensync_context.h Wed Nov 4 17:07:07 2009 (r5923) @@ -51,6 +51,7 @@ OSYNC_EXPORT void osync_context_report_osyncwarning(OSyncContext *context, OSyncError *error); OSYNC_EXPORT void osync_context_report_change(OSyncContext *context, OSyncChange *change); OSYNC_EXPORT void osync_context_report_slowsync(OSyncContext *contextr); +OSYNC_EXPORT void osync_context_report_uid_update(OSyncContext *ctx, const char *olduid, const char *newuid); /*@}*/ Copied and modified: trunk/opensync/plugin/opensync_context_internals.h (from r5920, trunk/opensync/plugin/opensync_context.h) ============================================================================== --- trunk/opensync/plugin/opensync_context.h Tue Nov 3 19:20:53 2009 (r5920, copy source) +++ trunk/opensync/plugin/opensync_context_internals.h Wed Nov 4 17:07:07 2009 (r5923) @@ -1,6 +1,7 @@ /* * libopensync - A synchronization framework * Copyright (C) 2004-2005 Armin Bauer <arm...@op...> + * Copyright (C) 2009 Daniel Gollub <go...@b1...> * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -18,42 +19,21 @@ * */ -#ifndef _OPENSYNC_CONTEXT_H -#define _OPENSYNC_CONTEXT_H - -OPENSYNC_BEGIN_DECLS +#ifndef _OPENSYNC_CONTEXT_INTERNALS_H +#define _OPENSYNC_CONTEXT_INTERNALS_H /** * @defgroup OSyncContextAPI OpenSync Context - * @ingroup OSyncPlugin - * Public part of OpenSync Context + * @ingroup OSyncPluginInternals + * Internal part of OpenSync Context */ /*@{*/ -typedef void (* OSyncContextCallbackFn)(void *, OSyncError *); -typedef void (* OSyncContextChangeFn) (OSyncChange *, void *); -typedef void (* OSyncContextSlowSyncFn) (void *); - -OSYNC_EXPORT OSyncContext *osync_context_new(OSyncError **error); -OSYNC_EXPORT OSyncContext *osync_context_ref(OSyncContext *context); -OSYNC_EXPORT void osync_context_unref(OSyncContext *context); - -OSYNC_EXPORT void osync_context_set_callback(OSyncContext *context, OSyncContextCallbackFn callback, void *userdata); -OSYNC_EXPORT void osync_context_set_changes_callback(OSyncContext *context, OSyncContextChangeFn changes); -OSYNC_EXPORT void osync_context_set_slowsync_callback(OSyncContext *context, OSyncContextSlowSyncFn slowsync_func, void *userdata); -OSYNC_EXPORT void osync_context_set_warning_callback(OSyncContext *context, OSyncContextCallbackFn warning); - -OSYNC_EXPORT void osync_context_report_error(OSyncContext *context, OSyncErrorType type, const char *format, ...); -OSYNC_EXPORT void osync_context_report_success(OSyncContext *context); -OSYNC_EXPORT void osync_context_report_osyncerror(OSyncContext *context, OSyncError *error); - -OSYNC_EXPORT void osync_context_report_osyncwarning(OSyncContext *context, OSyncError *error); -OSYNC_EXPORT void osync_context_report_change(OSyncContext *context, OSyncChange *change); -OSYNC_EXPORT void osync_context_report_slowsync(OSyncContext *contextr); +typedef void (* OSyncContextUidUpdateFn) (const char *olduid, const char *newuid, OSyncObjTypeSink *sink, void *); -/*@}*/ +OSYNC_TEST_EXPORT void osync_context_set_uid_update_callback(OSyncContext *context, OSyncContextUidUpdateFn uid_update_func, OSyncObjTypeSink *sink, void *userdata); -OPENSYNC_END_DECLS +/*@}*/ -#endif //_OPENSYNC_CONTEXT_H +#endif /* _OPENSYNC_CONTEXT_INTERNALS_H */ Modified: trunk/opensync/plugin/opensync_context_private.h ============================================================================== --- trunk/opensync/plugin/opensync_context_private.h Tue Nov 3 20:28:17 2009 (r5922) +++ trunk/opensync/plugin/opensync_context_private.h Wed Nov 4 17:07:07 2009 (r5923) @@ -35,6 +35,12 @@ OSyncContextChangeFn changes_function; OSyncContextSlowSyncFn slowsync_function; void *slowsync_data; + + /* uid_update callback */ + OSyncContextUidUpdateFn uid_update_function; + OSyncObjTypeSink *uid_update_sink; + void *uid_update_data; + void *plugindata; int ref_count; }; |
From: <svn...@op...> - 2009-11-03 19:28:36
|
Author: henrik Date: Tue Nov 3 20:28:17 2009 New Revision: 5922 URL: http://www.opensync.org/changeset/5922 Log: Following last checkin: THe actual mozilla-sync external plugin xml file Added: plugins/mozilla-sync/trunk/src/mozilla-sync.xml Added: plugins/mozilla-sync/trunk/src/mozilla-sync.xml ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ plugins/mozilla-sync/trunk/src/mozilla-sync.xml Tue Nov 3 20:28:17 2009 (r5922) @@ -0,0 +1,8 @@ +<?xml version="1.0"?> +<!-- $Id$ --> +<ExternalPlugin version="1"> + <Name>mozilla-sync</Name> + <LongName>Mozilla Thunderbird synchronization</LongName> + <Description>Mozilla Thunderbird (and Lightning+Sunbird and Debian ice*) synchronization</Description> + <ExternalCommand>thunderbird --mozilla-sync %s</ExternalCommand> +</ExternalPlugin> |
From: <svn...@op...> - 2009-11-03 19:15:55
|
Author: henrik Date: Tue Nov 3 20:15:41 2009 New Revision: 5921 URL: http://www.opensync.org/changeset/5921 Log: Following the latest OpenSync API changes, mozilla-sync is now a pure external plugin, so all that is left in the OpenSync tree is configuration files. The main plugin code is now over at http://bluezync.kaarposoft.dk/ Deleted: plugins/mozilla-sync/trunk/src/mozilla-sync.cpp Modified: plugins/mozilla-sync/trunk/CMakeLists.txt plugins/mozilla-sync/trunk/src/CMakeLists.txt Modified: plugins/mozilla-sync/trunk/CMakeLists.txt ============================================================================== --- plugins/mozilla-sync/trunk/CMakeLists.txt Tue Nov 3 19:20:53 2009 (r5920) +++ plugins/mozilla-sync/trunk/CMakeLists.txt Tue Nov 3 20:15:41 2009 (r5921) @@ -4,7 +4,7 @@ # See http://www.KaarPoSoft.dk/bluezync/ # $Id$ # -# Copyright (C) 2007 Henrik Kaare Poulsen /KaarPoSoft +# Copyright (C) 2007-2009 Henrik Kaare Poulsen /KaarPoSoft # # This plugin is free software: you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by @@ -29,20 +29,11 @@ ENDIF(COMMAND cmake_policy) SET( PROJECT_NAME mozilla-sync ) -PROJECT( ${PROJECT_NAME} C CXX ) +PROJECT( ${PROJECT_NAME} C ) -SET( CPACK_PACKAGE_VERSION_MAJOR "0") -SET( CPACK_PACKAGE_VERSION_MINOR "1") -SET( CPACK_PACKAGE_VERSION_PATCH "7") -SET( VERSION "${CPACK_PACKAGE_VERSION_MAJOR}.${CPACK_PACKAGE_VERSION_MINOR}.${CPACK_PACKAGE_VERSION_PATCH}" ) - -#INCLUDE( FindPkgConfig ) SET( CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${DESTDIR}${CMAKE_INSTALL_PREFIX}/share/libopensync1/cmake/modules/" "${CMAKE_SOURCE_DIR}/cmake/modules" ) - -FIND_PACKAGE( GLIB2 2.14 REQUIRED) FIND_PACKAGE( OpenSync REQUIRED ) - INCLUDE( OpenSyncInternal ) # OpenSyncInternal sets RelWithDebInfo, so we need to wait until now to set anything else @@ -50,18 +41,4 @@ ADD_SUBDIRECTORY( src ) -# cmake is great. but four back-slashes to escape a dot? Go figure... -SET ( CPACK_SOURCE_IGNORE_FILES "\\\\.svn/;.*~" ) - -# now we can "make package_source" -# but "make package" does not work -# maybe this is why: -# http://marc.info/?l=cmake&m=119419269837083&w=2 -# can't be bothered now to change all this in OpenSync... - -MESSAGE ("CMAKING ${PROJECT_NAME} ${VERSION}") -OPENSYNC_PACKAGE( ${PROJECT_NAME} ${VERSION} ) - -# For debugging... -#INCLUDE ( CMakePrintSystemInformation ) Modified: plugins/mozilla-sync/trunk/src/CMakeLists.txt ============================================================================== --- plugins/mozilla-sync/trunk/src/CMakeLists.txt Tue Nov 3 19:20:53 2009 (r5920) +++ plugins/mozilla-sync/trunk/src/CMakeLists.txt Tue Nov 3 20:15:41 2009 (r5921) @@ -22,26 +22,10 @@ # ================================================================ -INCLUDE_DIRECTORIES( - ${OPENSYNC_INCLUDE_DIRS} - ${GLIB2_INCLUDE_DIRS} -) - -LINK_DIRECTORIES( - ${OPENSYNC_LIBRARY_DIRS} - ${GLIB2_LIBRARY_DIRS} - ) - - -OPENSYNC_PLUGIN_ADD( mozilla-sync mozilla-sync.cpp ) - OPENSYNC_PLUGIN_DESCRIPTIONS( mozilla-sync-desc.xml ) OPENSYNC_PLUGIN_CAPABILITIES( mozilla-sync-caps.xml ) OPENSYNC_PLUGIN_CONFIG( mozilla-sync ) -OPENSYNC_PLUGIN_INSTALL( mozilla-sync ) - -TARGET_LINK_LIBRARIES( mozilla-sync - ${OPENSYNC_LIBRARIES} ${GLIB2_LIBRARIES} ) +OPENSYNC_EXTERNAL_PLUGIN_INSTALL ( mozilla-sync.xml ) |
From: <svn...@op...> - 2009-11-03 18:21:08
|
Author: dgollub Date: Tue Nov 3 19:20:53 2009 New Revision: 5920 URL: http://www.opensync.org/changeset/5920 Log: Fix parsing and assembling of ObjFormatSink XML configuration by replacing prepend with append. Not very likely that parsing the configuration is getting to complex ... Added testcase plugin_config_save_load_save Adapted sanity checks of various testcases to deal with the new order of assembling of the ObjFormatSink XML fields. Fixes #969 Modified: trunk/opensync/plugin/opensync_plugin_resource.c trunk/tests/plugin-tests/check_plugin_config.c Modified: trunk/opensync/plugin/opensync_plugin_resource.c ============================================================================== --- trunk/opensync/plugin/opensync_plugin_resource.c Tue Nov 3 18:01:39 2009 (r5919) +++ trunk/opensync/plugin/opensync_plugin_resource.c Tue Nov 3 19:20:53 2009 (r5920) @@ -161,7 +161,7 @@ return; osync_objformat_sink_ref(formatsink); - resource->objformatsinks = osync_list_prepend(resource->objformatsinks, formatsink); + resource->objformatsinks = osync_list_append(resource->objformatsinks, formatsink); } void osync_plugin_resource_remove_objformat_sink(OSyncPluginResource *resource, OSyncObjFormatSink *formatsink) Modified: trunk/tests/plugin-tests/check_plugin_config.c ============================================================================== --- trunk/tests/plugin-tests/check_plugin_config.c Tue Nov 3 18:01:39 2009 (r5919) +++ trunk/tests/plugin-tests/check_plugin_config.c Tue Nov 3 19:20:53 2009 (r5920) @@ -6,11 +6,11 @@ #include "opensync/plugin/opensync_plugin_config_private.h" #include "opensync/plugin/opensync_plugin_config_internals.h" -static const char *_format_sink_get_objformat(OSyncPluginResource *res) { +static const char *_format_sink_get_objformat(OSyncPluginResource *res, unsigned int nth) { OSyncObjFormatSink *format_sink; OSyncList *objformats = osync_plugin_resource_get_objformat_sinks(res); - format_sink = (OSyncObjFormatSink *) osync_list_nth_data(objformats, 0); + format_sink = (OSyncObjFormatSink *) osync_list_nth_data(objformats, nth); fail_unless(!!format_sink, NULL); osync_list_free(objformats); return osync_objformat_sink_get_objformat(format_sink); @@ -675,7 +675,7 @@ osync_plugin_resource_add_objformat_sink(resource, format_sink); osync_objformat_sink_unref(format_sink); - fail_unless(!strcmp(_format_sink_get_objformat(resource), "foobar"), NULL); + fail_unless(!strcmp(_format_sink_get_objformat(resource, 0), "foobar"), NULL); /* Overwrite (leak check) */ OSyncObjFormatSink *format_sink2 = osync_objformat_sink_new("barfoo", &error); @@ -686,7 +686,7 @@ osync_plugin_resource_add_objformat_sink(resource, format_sink2); osync_objformat_sink_unref(format_sink2); - fail_unless(!strcmp(_format_sink_get_objformat(resource), "barfoo"), NULL); + fail_unless(!strcmp(_format_sink_get_objformat(resource, 1), "barfoo"), NULL); /* Check for correct number objformat sinks: 2 sinks! */ OSyncList *objformats = osync_plugin_resource_get_objformat_sinks(resource); @@ -911,7 +911,7 @@ char *value = g_strdup_printf("foobar%i", i); fail_unless(!strcmp(osync_plugin_resource_get_name(r->data), value), NULL); fail_unless(!strcmp(osync_plugin_resource_get_mime(r->data), value), NULL); - fail_unless(!strcmp(_format_sink_get_objformat(r->data), value), NULL); + fail_unless(!strcmp(_format_sink_get_objformat(r->data, 0), value), NULL); fail_unless(!strcmp(osync_plugin_resource_get_objtype(r->data), value), NULL); fail_unless(!strcmp(osync_plugin_resource_get_path(r->data), value), NULL); @@ -1231,6 +1231,77 @@ } END_TEST +START_TEST (plugin_config_save_load_save) +{ + char *testbed = setup_testbed(NULL); + + OSyncError *error = NULL; + OSyncPluginConfig *config = osync_plugin_config_new(&error); + OSyncPluginConfig *reloaded_config = osync_plugin_config_new(&error); + + fail_unless(error == NULL, NULL); + fail_unless(config != NULL, NULL); + + /* Resource #1 */ + OSyncPluginResource *resource1 = osync_plugin_resource_new(&error); + fail_unless(error == NULL, NULL); + fail_unless(resource1 != NULL, NULL); + + /* OSyncObjFormatSink */ + OSyncObjFormatSink *format_sink1 = osync_objformat_sink_new("foobar1fmt1", &error); + fail_unless(format_sink1 != NULL, NULL); + osync_objformat_sink_set_config(format_sink1, "random1"); + + OSyncObjFormatSink *format_sink2 = osync_objformat_sink_new("foobar1fmt2", &error); + fail_unless(format_sink2 != NULL, NULL); + osync_objformat_sink_set_config(format_sink2, "random2"); + + /* Name */ + osync_plugin_resource_set_name(resource1, "foobar1"); + osync_plugin_resource_set_mime(resource1, "foobar1"); + osync_plugin_resource_add_objformat_sink(resource1, format_sink1); + osync_plugin_resource_add_objformat_sink(resource1, format_sink2); + osync_objformat_sink_unref(format_sink1); + osync_plugin_resource_set_objtype(resource1, "foobar1"); + osync_plugin_resource_set_path(resource1, "foobar1"); + osync_plugin_resource_set_url(resource1, "foobar1"); + + osync_plugin_config_add_resource(config, resource1); + + /* Set subcomponents */ + osync_plugin_config_set_schemadir(reloaded_config, testbed); + char *config_file = g_strdup_printf("%s/dummy_config.xml", testbed); + fail_unless(osync_plugin_config_file_save(config, config_file, &error), "%s", osync_error_print(&error)); + fail_unless(osync_plugin_config_file_load(reloaded_config, config_file, &error), NULL); + + + char *config_file2 = g_strdup_printf("%s/dummy_config2.xml", testbed); + osync_plugin_config_file_save(reloaded_config, config_file2, &error); + fail_unless(error == NULL, "%s", osync_error_print(&error)); + + char *config_file_contents = NULL; + char *config_file2_contents = NULL; + fail_unless(g_file_get_contents(config_file, &config_file_contents, NULL, NULL), NULL); + fail_unless(g_file_get_contents(config_file2, &config_file2_contents, NULL, NULL), NULL); + g_free(config_file); + g_free(config_file2); + + fail_unless(config_file_contents != NULL, NULL); + fail_unless(config_file2_contents != NULL, NULL); + + fail_unless(!strcmp(config_file_contents, config_file2_contents), "Config file changed after reading in then writing out"); + + g_free(config_file_contents); + g_free(config_file2_contents); + + osync_plugin_config_unref(config); + osync_plugin_config_unref(reloaded_config); + destroy_testbed(testbed); +} +END_TEST + + + OSYNC_TESTCASE_START("plugin_config") OSYNC_TESTCASE_ADD(plugin_config_new) OSYNC_TESTCASE_ADD(plugin_config_new_nomemory) @@ -1250,5 +1321,6 @@ OSYNC_TESTCASE_ADD(plugin_config_save_and_load_connection_irda) OSYNC_TESTCASE_ADD(plugin_config_save_and_load_connection_network) OSYNC_TESTCASE_ADD(plugin_config_save_and_load_connection_serial) +OSYNC_TESTCASE_ADD(plugin_config_save_load_save) OSYNC_TESTCASE_END |
From: <svn...@op...> - 2009-11-03 17:01:53
|
Author: dgollub Date: Tue Nov 3 18:01:39 2009 New Revision: 5919 URL: http://www.opensync.org/changeset/5919 Log: Check if conflict handlers use_latest and ignore are supported for the current mapping-engines in advance. Fixes #1185 Modified: trunk/opensync/engine/opensync_engine.c Modified: trunk/opensync/engine/opensync_engine.c ============================================================================== --- trunk/opensync/engine/opensync_engine.c Tue Nov 3 14:29:10 2009 (r5918) +++ trunk/opensync/engine/opensync_engine.c Tue Nov 3 18:01:39 2009 (r5919) @@ -418,12 +418,15 @@ { OSyncEngineCommand *cmd = NULL; osync_trace(TRACE_ENTRY, "%s(%p, %p)", __func__, mapping_engine, error); + + if (!osync_mapping_engine_supports_ignore(mapping_engine)) { + osync_error_set(error, OSYNC_ERROR_GENERIC, "Can't resolve the conflict by ignore it!"); + goto error; + } cmd = osync_try_malloc0(sizeof(OSyncEngineCommand), error); - if (!cmd) { - osync_trace(TRACE_EXIT_ERROR, "%s: %s", __func__, osync_error_print(error)); - return FALSE; - } + if (!cmd) + goto error; cmd->cmd = OSYNC_ENGINE_COMMAND_SOLVE; cmd->mapping_engine = mapping_engine; @@ -433,18 +436,25 @@ osync_trace(TRACE_EXIT, "%s", __func__); return TRUE; + +error: + osync_trace(TRACE_EXIT_ERROR, "%s: %s", __func__, osync_error_print(error)); + return FALSE; } osync_bool osync_engine_mapping_use_latest(OSyncEngine *engine, OSyncMappingEngine *mapping_engine, OSyncError **error) { OSyncEngineCommand *cmd = NULL; osync_trace(TRACE_ENTRY, "%s(%p, %p)", __func__, mapping_engine, error); + + if (!osync_mapping_engine_supports_use_latest(mapping_engine)) { + osync_error_set(error, OSYNC_ERROR_GENERIC, "Can't resolve the conflict by using the latest change!"); + goto error; + } cmd = osync_try_malloc0(sizeof(OSyncEngineCommand), error); - if (!cmd) { - osync_trace(TRACE_EXIT_ERROR, "%s: %s", __func__, osync_error_print(error)); - return FALSE; - } + if (!cmd) + goto error; cmd->cmd = OSYNC_ENGINE_COMMAND_SOLVE; cmd->mapping_engine = mapping_engine; @@ -454,6 +464,10 @@ osync_trace(TRACE_EXIT, "%s", __func__); return TRUE; + +error: + osync_trace(TRACE_EXIT_ERROR, "%s: %s", __func__, osync_error_print(error)); + return FALSE; } OSyncEngine *osync_engine_new(OSyncGroup *group, OSyncError **error) |
From: <svn...@op...> - 2009-11-03 13:29:29
|
Author: henrik Date: Tue Nov 3 14:29:10 2009 New Revision: 5918 URL: http://www.opensync.org/changeset/5918 Log: The mozilla-sync configuration file now accepts the NAME of a lightning calender, not the ID (which nobody knows anyway and is hard to get at without manually running sqlite3) Modified: plugins/mozilla-sync/trunk/src/mozilla-sync Modified: plugins/mozilla-sync/trunk/src/mozilla-sync ============================================================================== --- plugins/mozilla-sync/trunk/src/mozilla-sync Mon Nov 2 22:40:13 2009 (r5917) +++ plugins/mozilla-sync/trunk/src/mozilla-sync Tue Nov 3 14:29:10 2009 (r5918) @@ -22,22 +22,13 @@ </Resource> <Resource> - <!-- Identifier of the Mozilla calendar. - Under the profile directory there should be a file called storage.sdb - This file contains the Mozilla calendars. - Try the shell command sqlite3 /home/someone/.thunderbird/ab1cde23/storage.sdb - And in this sqlite3 command window give the command - SELECT p.value, c.uri FROM cal_calendars AS c - LEFT JOIN cal_calendars_prefs AS p ON c.id=p.calendar WHERE p.name='name'; - The identifier is given in the URL after moz-profile-calendar://?id= - If the URL has no ?id= the identifier is zero --> <Enabled>1</Enabled> <Formats> <Format> <Name>vevent20</Name> </Format> </Formats> - <Name>0</Name> + <Name>MyLightningCalendar</Name> <ObjType>event</ObjType> </Resource> |
From: <svn...@op...> - 2009-11-02 21:40:33
|
Author: scriptor Date: Mon Nov 2 22:40:13 2009 New Revision: 5917 URL: http://www.opensync.org/changeset/5917 Log: I have downgraded the dependency on libsasl2. Without this library no "strong" authentication method will be available. But at least one method will be left, that does NOT depend on SASL: The "simple" bind. Although this method is not recommended, it is nevertheless a possible authentication mechanism. So compiling the LDAP plugin must be possible even when no libsasl2 has been found. It is then up to the user to prepare his system for stronger, SASL based authentication methods. And if he decides against the stronger methods, we should stand in this way. So from now on it is possible to compile the LDAP plugin without libsasl2. In CMakeLists.txt I have also written something about CMP0010. But the "make package_source" target still complains about this. I don't know why. Modified: plugins/ldap-sync/CMakeLists.txt plugins/ldap-sync/src/ldap_connect.c plugins/ldap-sync/src/ldap_plugin.h plugins/ldap-sync/src/ldap_sasl.c Modified: plugins/ldap-sync/CMakeLists.txt ============================================================================== --- plugins/ldap-sync/CMakeLists.txt Mon Nov 2 14:52:11 2009 (r5916) +++ plugins/ldap-sync/CMakeLists.txt Mon Nov 2 22:40:13 2009 (r5917) @@ -28,13 +28,22 @@ SET( OPENSYNC_MIN_VERSION "${VERSION}" ) cmake_minimum_required(VERSION 2.4) -IF(COMMAND cmake_policy) +IF (COMMAND cmake_policy) cmake_policy(SET CMP0003 NEW) cmake_policy(SET CMP0010 NEW) -ENDIF(COMMAND cmake_policy) + MESSAGE( STATUS "Policies CMP0003 and CMP0010 have just been set to NEW." ) + cmake_policy(GET CMP0010 policy_ten) + MESSAGE( STATUS "policy_ten = \"${policy_ten}\"" ) +ELSE (COMMAND cmake_policy) + MESSAGE( STATUS " Could NOT find the command \"cmake_policy\". Ignoring.") +ENDIF (COMMAND cmake_policy) # SET(CMAKE_BUILD_WITH_INSTALL_RPATH TRUE) +################# Making a package: ##################### +SET(CPACK_SOURCE_IGNORE_FILES "/Testing/;tags;/obsolete/;build;build_debug;svn_;/CVS/;/\\.svn/;\\.swp$;.*~;") + + ######################################################### # Look for 3rd Party CMake modules SET( CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake/modules" ) @@ -45,7 +54,7 @@ FIND_PACKAGE( LibXslt REQUIRED ) FIND_PACKAGE( LibLdap ) FIND_PACKAGE( LibMozLdap ) -FIND_PACKAGE( LibSASL2 REQUIRED ) +FIND_PACKAGE( LibSASL2 ) FIND_PACKAGE( LibGSSAPIV2 ) FIND_PACKAGE( Check ) Modified: plugins/ldap-sync/src/ldap_connect.c ============================================================================== --- plugins/ldap-sync/src/ldap_connect.c Mon Nov 2 14:52:11 2009 (r5916) +++ plugins/ldap-sync/src/ldap_connect.c Mon Nov 2 22:40:13 2009 (r5917) @@ -861,9 +861,11 @@ osync_bool ldap_plugin_makebind(OSyncContext *ctx, sink_environment *sinkenv, OSyncError **error) { +#ifdef LIBSASL2_FOUND unsigned sasl_flags = LDAP_SASL_AUTOMATIC; +#endif // ifdef LIBSASL2_FOUND struct berval passwd = { 0, NULL }; - lutilSASLdefaults *defaults = NULL; + lutilSASLdefaults *defaults = NULL; ///< This struct can be found in ldap_plugin.h const char *authmech = NULL, *binddn = NULL, *bindpwd = NULL, *authcid = NULL, *authzid = NULL, *realm = NULL; char *tmp_authmech = NULL, *tmp_binddn = NULL, *tmp_authcid = NULL, *tmp_authzid = NULL, *tmp_realm = NULL; osync_bool rv = TRUE; @@ -952,6 +954,7 @@ osync_trace(TRACE_INTERNAL, "SASL based authentication towards LDAP server selected"); +#ifdef LIBSASL2_FOUND passwd.bv_val = g_strdup(bindpwd); passwd.bv_len = strlen( passwd.bv_val ); tmp_authmech = g_strdup(authmech); @@ -1049,7 +1052,16 @@ rv = FALSE; goto out1; - } + + + } // if (ldap_errno != LDAP_SUCCESS) + + +#else // ifdef LIBSASL2_FOUND + osync_error_set(error, OSYNC_ERROR_NO_CONNECTION, "%s:%i: A strong, SASL based authentication method has been chosen, althouth the LDAP plugin has not been compiled with the SASL library. The \"bind\" with the LDAP server has failed, therefore. Only the \"simple\" authentication is available. Please change this in the configuration of the LDAP plugin.", __FILE__, __LINE__); + rv = FALSE; + goto out1; +#endif // ifdef LIBSASL2_FOUND } // if (!strcmp(authmech, "SIMPLE")) Modified: plugins/ldap-sync/src/ldap_plugin.h ============================================================================== --- plugins/ldap-sync/src/ldap_plugin.h Mon Nov 2 14:52:11 2009 (r5916) +++ plugins/ldap-sync/src/ldap_plugin.h Mon Nov 2 22:40:13 2009 (r5917) @@ -37,7 +37,6 @@ #include <errno.h> #include <ctype.h> -#include <gcrypt.h> #include <glib.h> #ifdef LIBLDAP_FOUND @@ -79,7 +78,9 @@ #include <opensync/opensync-version.h> #include <opensync/xmlformat/opensync_xmlformat.h> #include <opensync/xmlformat/opensync_xmlformat_schema.h> -#include <sasl/sasl.h> +#ifdef LIBSASL2_FOUND + #include <sasl/sasl.h> +#endif #include <stdarg.h> #include <stdio.h> #include <stdlib.h> @@ -539,7 +540,9 @@ osync_bool ldap_plugin_list_libldap_sasl_mechanisms(OSyncContext *ctx, sink_environment *sinkenv, OSyncError **error); osync_bool ldap_plugin_list_libsasl2_mechanisms(const char *serverFQDN); lutilSASLdefaults *ldap_plugin_lutil_sasl_defaults(LDAP *ld, char *mech, char *realm, char *authcid, char *passwd, char *authzid); +#ifdef LIBSASL2_FOUND int ldap_plugin_lutil_sasl_interact (LDAP *ld, unsigned flags, lutilSASLdefaults *defaults, void *in); +#endif #endif // #ifndef _LDAP_PLUGIN_H Modified: plugins/ldap-sync/src/ldap_sasl.c ============================================================================== --- plugins/ldap-sync/src/ldap_sasl.c Mon Nov 2 14:52:11 2009 (r5916) +++ plugins/ldap-sync/src/ldap_sasl.c Mon Nov 2 22:40:13 2009 (r5917) @@ -43,17 +43,28 @@ /** - * @brief Performs SASL based authentication with the LDAP server. This is - * a callback-function for ldap_sasl_interactive_bind_s(). + * @brief This is a callback-function for ldap_sasl_interactive_bind_s(). + * It fills the "struct sasl_interact in" (see also sasl/sasl.h) with + * authentication data as found in the configuration file for + * the LDAP plugin. Thus it plays its role in performing the + * authentication procedure. But only as far as the "strong" + * or "sasl based" authentication goes, as opposed to the so-called + * "simple" bind. * See also: man ldap_sasl_bind * * @param ld The LDAP connection handle * @param flags Not used. - * @param defaults This contains certain default settings. - * @param in This contains the actual command. + * @param defaults This struct contains certain default settings. Its type + * is defined in ldap_plugin.h. So this struct does NOT + * depend on libsasl*. + * @param in This struct contains the actual command. Its type is of + * sasl_interact_t, which is defined in sasl.h. This IS a + * dependency on the sasl library. * * @returns LDAP_SASL_BIND_IN_PROGRESS in case of error, or LDAP_SUCCESS otherwise */ + +#ifdef LIBSASL2_FOUND int ldap_plugin_lutil_sasl_interact (LDAP *ld, unsigned flags, lutilSASLdefaults *defaults, void *in) { OSyncError *error = NULL; @@ -126,7 +137,7 @@ return LDAP_SASL_BIND_IN_PROGRESS; } - +#endif // ifdef LIBSASL2_FOUND @@ -136,6 +147,8 @@ * * @returns Certain SASL related default parameters for the authentication. * Has to be freed by ber_free(); likewise the members of this struct. + * The datatype of this return value is defined in ldap_plugin.h and is + * NOT dependant on libsasl*. * * @param ld The LDAP connection handle. * @param mech The SASL authentication mechanism. @@ -214,7 +227,7 @@ /** - * @brief This function lists all all the SASL authentication mechanisms + * @brief This function lists all of the SASL authentication mechanisms * offered by libsasl installed on the LDAP server. * Whether or not libldap can deal with them, as well, * is NOT answered by this function. This function is @@ -229,6 +242,7 @@ osync_bool ldap_plugin_list_libsasl2_mechanisms(const char *serverFQDN) { +#ifdef LIBSASL2_FOUND sasl_conn_t *conn = NULL; const char *mechlist = NULL; int rv = 0; @@ -240,6 +254,7 @@ {SASL_CB_NOECHOPROMPT, NULL, NULL}, {SASL_CB_LIST_END, NULL, NULL} }; +#endif // ifdef LIBSASL2_FOUND if (serverFQDN == NULL) { @@ -247,6 +262,7 @@ goto error; } +#ifdef LIBSASL2_FOUND rv = sasl_client_init(NULL); if (rv != SASL_OK) { @@ -298,6 +314,13 @@ sasl_dispose(&conn); return FALSE; + + +#else // ifdef LIBSASL2_FOUND +error: + ldap_plugin_printf("%s:%i: WARNING: The LDAP plugin has NOT been compiled with libsasl-... So it cannot list the authentication mechanisms as offered by libsasl.", __FILE__, __LINE__); + return FALSE; +#endif // ifdef LIBSASL2_FOUND } |
From: <svn...@op...> - 2009-11-02 13:52:27
|
Author: dgollub Date: Mon Nov 2 14:52:11 2009 New Revision: 5916 URL: http://www.opensync.org/changeset/5916 Log: Validate External Plugin Configuration XML files against OSYNC_EXTERNAL_PLUGIN_CONFIG_SCHEMA Modified: trunk/opensync/plugin/opensync_plugin_env.c trunk/opensync/plugin/opensync_plugin_env_internals.h trunk/opensync/plugin/opensync_plugin_env_private.h Modified: trunk/opensync/plugin/opensync_plugin_env.c ============================================================================== --- trunk/opensync/plugin/opensync_plugin_env.c Mon Nov 2 14:02:51 2009 (r5915) +++ trunk/opensync/plugin/opensync_plugin_env.c Mon Nov 2 14:52:11 2009 (r5916) @@ -77,6 +77,10 @@ osync_module_unref(env->modules->data); env->modules = osync_list_remove(env->modules, env->modules->data); } + + if (env->schemapath) + osync_free(env->schemapath); + osync_free(env); } @@ -229,10 +233,19 @@ return FALSE; } +#ifdef OPENSYNC_UNITTESTING +void osync_plugin_env_set_schemapath(OSyncPluginEnv *env, const char *schemapth) +{ + env->schemapth = osync_strdup(schempath); +} +#endif /* OPENSYNC_UNITTESTING */ + osync_bool osync_plugin_env_load_module_xml(OSyncPluginEnv *env, const char *filename, OSyncError **error) { OSyncModule *module = NULL; int version = 0; + const char *schemapath = env->schemapath ? env->schemapath : OPENSYNC_SCHEMASDIR; + char *schemafile = NULL; gchar *name = NULL, *longname = NULL, *description = NULL, *command = NULL; xmlChar *version_str = NULL; xmlDocPtr doc; @@ -245,6 +258,15 @@ if (!osync_xml_open_file(&doc, &cur, filename, "ExternalPlugin", error)) goto error; + /* Validate external plugin configuration file */ + schemafile = osync_strdup_printf("%s%c%s", schemapath, G_DIR_SEPARATOR, OSYNC_EXTERNAL_PLUGIN_CONFIG_SCHEMA); + if (!osync_xml_validate_document(doc, schemafile)) { + osync_error_set(error, OSYNC_ERROR_MISCONFIGURATION, "Plugin configuration file is not valid! %s", schemafile); + osync_free(schemafile); + goto error; + } + osync_free(schemafile); + version_str = xmlGetProp(cur->parent, BAD_CAST "version"); if (version_str) { version = atoi((const char *) version_str); Modified: trunk/opensync/plugin/opensync_plugin_env_internals.h ============================================================================== --- trunk/opensync/plugin/opensync_plugin_env_internals.h Mon Nov 2 14:02:51 2009 (r5915) +++ trunk/opensync/plugin/opensync_plugin_env_internals.h Mon Nov 2 14:52:11 2009 (r5916) @@ -30,6 +30,8 @@ /*@{*/ +#define OSYNC_EXTERNAL_PLUGIN_CONFIG_SCHEMA "external_plugin_config.xsd" + /** @brief Loads a module into the plugin environment * * @param env Pointer to a plugin environment @@ -72,6 +74,19 @@ */ OSYNC_TEST_EXPORT unsigned int osync_plugin_env_num_plugins(OSyncPluginEnv *env); + +#ifdef OPENSYNC_UNITTESTING +/** @brief Change the schema path to a non-default directory + * + * XXX: This is only intended for unittesting. + * + * @param env Pointer to a OSyncPluginEnv environment + * @param schemapath Path to the non-default schema-path + * + */ +OSYNC_TEST_EXPORT void osync_plugin_env_set_schemapath(OSyncPluginEnv *env, const char *schemapth); +#endif /* OPENSYNC_UNITTESTING */ + /*@}*/ #endif /* _OPENSYNC_PLUGIN_ENV_INTERNALS_H_ */ Modified: trunk/opensync/plugin/opensync_plugin_env_private.h ============================================================================== --- trunk/opensync/plugin/opensync_plugin_env_private.h Mon Nov 2 14:02:51 2009 (r5915) +++ trunk/opensync/plugin/opensync_plugin_env_private.h Mon Nov 2 14:52:11 2009 (r5916) @@ -35,6 +35,9 @@ GModule *current_module; + /** Non-default schemapath, only for unit-testing */ + char *schemapath; + int ref_count; }; |
From: <svn...@op...> - 2009-11-02 13:03:07
|
Author: dgollub Date: Mon Nov 2 14:02:51 2009 New Revision: 5915 URL: http://www.opensync.org/changeset/5915 Log: Created XML Schema (XSD) for ExternalPlugin XML configuraiton file. Based on ./docs/examples/plugins/src/external_plugin.xml and it's C parsing implementation by Graham. Hint for everyone how needs to write XSD from scratch on an already exisitng XML file. Use this commandline: xmllint --schema external_plugin_config.xsd external_plugin.xml Added: trunk/misc/schemas/external_plugin_config.xsd - copied, changed from r5908, trunk/misc/schemas/plugin_config.xsd Copied and modified: trunk/misc/schemas/external_plugin_config.xsd (from r5908, trunk/misc/schemas/plugin_config.xsd) ============================================================================== --- trunk/misc/schemas/plugin_config.xsd Mon Nov 2 13:03:43 2009 (r5908, copy source) +++ trunk/misc/schemas/external_plugin_config.xsd Mon Nov 2 14:02:51 2009 (r5915) @@ -1,174 +1,16 @@ <?xml version="1.0" encoding="UTF-8"?> <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" version="1.0"> - <xsd:element name="config"> + <xsd:element name="ExternalPlugin"> <xsd:complexType> <xsd:sequence> - <xsd:element maxOccurs="1" minOccurs="0" name="AdvancedOptions" type="AdvancedOptions"/> - <xsd:element maxOccurs="1" minOccurs="0" name="Authentication" type="Authentication"/> - <xsd:element maxOccurs="1" minOccurs="0" name="Connection" type="Connection"/> - <xsd:element maxOccurs="1" minOccurs="0" name="Localization" type="Localization"/> - <xsd:element maxOccurs="1" minOccurs="0" name="Resources" type="Resources"/> - <xsd:element maxOccurs="1" minOccurs="0" name="ExternalPlugin" type="ExternalPlugin"/> + <xsd:element maxOccurs="1" minOccurs="1" name="Name" type="xsd:string" /> + <xsd:element maxOccurs="1" minOccurs="1" name="LongName" type="xsd:string" /> + <xsd:element maxOccurs="1" minOccurs="1" name="Description" type="xsd:string" /> + <xsd:element maxOccurs="1" minOccurs="1" name="ExternalCommand" type="xsd:string" /> </xsd:sequence> <xsd:attribute name="version" type="xsd:string"/> </xsd:complexType> </xsd:element> - <xsd:complexType name="AdvancedOptions"> - <xsd:sequence> - <xsd:element maxOccurs="unbounded" minOccurs="0" name="AdvancedOption" type="AdvancedOption"/> - </xsd:sequence> - </xsd:complexType> - - <xsd:complexType name="AdvancedOption"> - <xsd:sequence> - <xsd:element maxOccurs="1" minOccurs="0" name="DisplayName" type="xsd:string" /> - <xsd:element maxOccurs="1" minOccurs="0" name="MaxOccurs" type="xsd:integer" /> - <xsd:element maxOccurs="1" minOccurs="0" name="Max" type="xsd:integer" /> - <xsd:element maxOccurs="1" minOccurs="0" name="Min" type="xsd:integer" /> - <xsd:element maxOccurs="1" minOccurs="1" name="Name" type="xsd:string" /> - <xsd:element maxOccurs="unbounded" minOccurs="0" name="Parameter" type="AdvancedParameter" /> - <xsd:element maxOccurs="1" minOccurs="0" name="Type" type="AdvancedType" /> - <xsd:element maxOccurs="unbounded" minOccurs="0" name="ValEnum" type="xsd:string" /> - <xsd:element maxOccurs="1" minOccurs="1" name="Value" type="xsd:string" /> - </xsd:sequence> - </xsd:complexType> - - <xsd:complexType name="AdvancedParameter"> - <xsd:sequence> - <xsd:element maxOccurs="1" minOccurs="0" name="DisplayName" type="xsd:string" /> - <xsd:element maxOccurs="1" minOccurs="1" name="Name" type="xsd:string" /> - <xsd:element maxOccurs="1" minOccurs="0" name="Type" type="AdvancedType" /> - <xsd:element maxOccurs="unbounded" minOccurs="0" name="ValEnum" type="xsd:string" /> - <xsd:element maxOccurs="1" minOccurs="1" name="Value" type="xsd:string" /> - </xsd:sequence> - </xsd:complexType> - - <xsd:simpleType name="AdvancedType"> - <xsd:restriction base="xsd:string"> - <!-- bool is 1/0 --> - <xsd:enumeration value="bool"/> - <!-- single character --> - <xsd:enumeration value="char"/> - <xsd:enumeration value="double"/> - <xsd:enumeration value="int"/> - <xsd:enumeration value="long"/> - <xsd:enumeration value="longlong"/> - <xsd:enumeration value="string" /> - <xsd:enumeration value="uint"/> - <xsd:enumeration value="ulong"/> - <xsd:enumeration value="ulonglong"/> - </xsd:restriction> - </xsd:simpleType> - - <xsd:complexType name="Authentication"> - <xsd:sequence> - <xsd:element maxOccurs="1" minOccurs="0" name="Username" type="xsd:string" /> - <xsd:element maxOccurs="1" minOccurs="0" name="Password" type="xsd:string" /> - <xsd:element maxOccurs="1" minOccurs="0" name="Reference" type="xsd:string" /> - </xsd:sequence> - </xsd:complexType> - - <xsd:complexType name="Localization"> - <xsd:sequence> - <xsd:element maxOccurs="1" minOccurs="0" name="Encoding" type="xsd:string" /> - <xsd:element maxOccurs="1" minOccurs="0" name="Timezone" type="xsd:string" /> - <xsd:element maxOccurs="1" minOccurs="0" name="Language" type="xsd:string" /> - </xsd:sequence> - </xsd:complexType> - - <xsd:complexType name="Format"> - <xsd:sequence> - <xsd:element maxOccurs="1" minOccurs="0" name="Config" type="xsd:string" /> - <xsd:element maxOccurs="1" minOccurs="0" name="Name" type="xsd:string" /> - </xsd:sequence> - </xsd:complexType> - - <xsd:complexType name="Formats"> - <xsd:sequence> - <xsd:element maxOccurs="unbounded" minOccurs="1" name="Format" type="Format" /> - <!-- The preferred format is a hint for the converter. - If you like to get vCards and you do not support vCards directly - (e.g. the file plugin only supports raw data) - but you have only a source which supports only XML format - then you can specify vcard30 and you will get vCard 3.0. - --> - <xsd:element maxOccurs="1" minOccurs="0" name="Preferred" type="xsd:string" /> - </xsd:sequence> - </xsd:complexType> - - <xsd:complexType name="Resource"> - <xsd:sequence> - <xsd:element maxOccurs="1" minOccurs="1" name="Enabled" type="xsd:integer" /> - <xsd:element maxOccurs="1" minOccurs="0" name="Formats" type="Formats" /> - <xsd:element maxOccurs="1" minOccurs="0" name="Name" type="xsd:string" /> - <xsd:element maxOccurs="1" minOccurs="0" name="MIME" type="xsd:string" /> - <xsd:element maxOccurs="1" minOccurs="1" name="ObjType" type="xsd:string" /> - <xsd:element maxOccurs="1" minOccurs="0" name="Path" type="xsd:string" /> - <xsd:element maxOccurs="1" minOccurs="0" name="Url" type="xsd:string" /> - </xsd:sequence> - </xsd:complexType> - - <xsd:complexType name="Resources"> - <xsd:sequence> - <xsd:element maxOccurs="unbounded" minOccurs="1" name="Resource" type="Resource" /> - </xsd:sequence> - </xsd:complexType> - - <xsd:complexType name="ConnectionBluetooth"> - <xsd:sequence> - <xsd:element maxOccurs="1" minOccurs="1" name="MAC" type="xsd:string" /> - <xsd:element maxOccurs="1" minOccurs="0" name="RFCommChannel" type="xsd:integer" /> - <xsd:element maxOccurs="1" minOccurs="0" name="SDPUUID" type="xsd:string" /> - </xsd:sequence> - </xsd:complexType> - - <xsd:complexType name="ConnectionUSB"> - <xsd:sequence> - <xsd:element maxOccurs="1" minOccurs="0" name="VendorID" type="xsd:string" /> - <xsd:element maxOccurs="1" minOccurs="0" name="ProductID" type="xsd:string" /> - <xsd:element maxOccurs="1" minOccurs="0" name="Interface" type="xsd:integer" /> - </xsd:sequence> - </xsd:complexType> - - <xsd:complexType name="ConnectionNetwork"> - <xsd:sequence> - <xsd:element maxOccurs="1" minOccurs="0" name="Address" type="xsd:string" /> - <xsd:element maxOccurs="1" minOccurs="0" name="Port" type="xsd:integer" /> - <xsd:element maxOccurs="1" minOccurs="0" name="Protocol" type="xsd:string" /> - <xsd:element maxOccurs="1" minOccurs="0" name="DNSSD" type="xsd:string" /> - </xsd:sequence> - </xsd:complexType> - - <xsd:complexType name="ConnectionSerial"> - <xsd:sequence> - <xsd:element maxOccurs="1" minOccurs="0" name="Speed" type="xsd:integer" /> - <xsd:element maxOccurs="1" minOccurs="0" name="DeviceNode" type="xsd:string" /> - </xsd:sequence> - </xsd:complexType> - - <xsd:complexType name="ConnectionIrDA"> - <xsd:sequence> - <xsd:element maxOccurs="1" minOccurs="1" name="Service" type="xsd:string" /> - </xsd:sequence> - </xsd:complexType> - - <xsd:complexType name="Connection"> - <xsd:all> - <xsd:element maxOccurs="1" minOccurs="1" name="ActiveConnection" type="xsd:string" /> - <xsd:element maxOccurs="1" minOccurs="0" name="Bluetooth" type="ConnectionBluetooth" /> - <xsd:element maxOccurs="1" minOccurs="0" name="IrDA" type="ConnectionIrDA" /> - <xsd:element maxOccurs="1" minOccurs="0" name="Network" type="ConnectionNetwork" /> - <xsd:element maxOccurs="1" minOccurs="0" name="Serial" type="ConnectionSerial" /> - <xsd:element maxOccurs="1" minOccurs="0" name="USB" type="ConnectionUSB" /> - </xsd:all> - </xsd:complexType> - - <xsd:complexType name="ExternalPlugin"> - <xsd:all> - <xsd:element maxOccurs="1" minOccurs="1" name="ExternalCommand" type="xsd:string" /> - </xsd:all> - </xsd:complexType> - </xsd:schema> |
From: <svn...@op...> - 2009-11-02 12:49:44
|
Author: dgollub Date: Mon Nov 2 13:49:22 2009 New Revision: 5914 URL: http://www.opensync.org/changeset/5914 Log: Introduced internal interfaces: - osync_plugin_{set,get}_external_command This functions get and set the default plugin external command. The default external_command value is set inside the XML external plugin configuration file. Once this configuration file got parsed (during plugin_env_load phase) osync_plugin_get_external_command will return the default external_command. If none external_command is set in the indiviual plugin-member-configuration (aka. OSyncPuginConfig) the external_command of OSyncPlugin gets used (osync_plugin_get_external_command) to spawn the external process. Modified: trunk/opensync/client/opensync_client_proxy.c trunk/opensync/engine/opensync_engine.c trunk/opensync/plugin/opensync_plugin.c trunk/opensync/plugin/opensync_plugin_env.c trunk/opensync/plugin/opensync_plugin_internals.h trunk/opensync/plugin/opensync_plugin_private.h Modified: trunk/opensync/client/opensync_client_proxy.c ============================================================================== --- trunk/opensync/client/opensync_client_proxy.c Mon Nov 2 13:27:58 2009 (r5913) +++ trunk/opensync/client/opensync_client_proxy.c Mon Nov 2 13:49:22 2009 (r5914) @@ -963,7 +963,7 @@ char *writefd = NULL; char *name = NULL; - osync_trace(TRACE_ENTRY, "%s(%p, %i, %s, %p)", __func__, proxy, type, path, error); + osync_trace(TRACE_ENTRY, "%s(%p, %i, %s, %s, %p)", __func__, proxy, type, path, __NULLSTR(external_command), error); osync_assert(proxy); osync_assert(type != OSYNC_START_TYPE_UNKNOWN); Modified: trunk/opensync/engine/opensync_engine.c ============================================================================== --- trunk/opensync/engine/opensync_engine.c Mon Nov 2 13:27:58 2009 (r5913) +++ trunk/opensync/engine/opensync_engine.c Mon Nov 2 13:49:22 2009 (r5914) @@ -36,6 +36,7 @@ #include "group/opensync_member_internals.h" #include "format/opensync_objformat_internals.h" #include "common/opensync_marshal_internals.h" +#include "plugin/opensync_plugin_internals.h" #include "opensync_status_internals.h" #include "opensync_obj_engine_internals.h" @@ -790,7 +791,7 @@ * command, if available */ if (!external_command) { - /* TODO: Grahams code to retrieve the external_command from the external-plugin config */ + external_command = osync_plugin_get_external_command(plugin); } } Modified: trunk/opensync/plugin/opensync_plugin.c ============================================================================== --- trunk/opensync/plugin/opensync_plugin.c Mon Nov 2 13:27:58 2009 (r5913) +++ trunk/opensync/plugin/opensync_plugin.c Mon Nov 2 13:49:22 2009 (r5914) @@ -65,6 +65,9 @@ if (plugin->description) osync_free(plugin->description); + + if (plugin->external_command) + osync_free(plugin->external_command); osync_free(plugin); } @@ -112,6 +115,20 @@ plugin->description = osync_strdup(description); } +const char *osync_plugin_get_external_command(OSyncPlugin *plugin) +{ + osync_assert(plugin); + return plugin->external_command; +} + +void osync_plugin_set_external_command(OSyncPlugin *plugin, const char *external_command) +{ + osync_assert(plugin); + if (plugin->external_command) + osync_free(plugin->external_command); + plugin->external_command = osync_strdup(external_command); +} + void *osync_plugin_get_data(OSyncPlugin *plugin) { osync_assert(plugin); Modified: trunk/opensync/plugin/opensync_plugin_env.c ============================================================================== --- trunk/opensync/plugin/opensync_plugin_env.c Mon Nov 2 13:27:58 2009 (r5913) +++ trunk/opensync/plugin/opensync_plugin_env.c Mon Nov 2 13:49:22 2009 (r5914) @@ -23,6 +23,7 @@ #include "opensync-module.h" #include "module/opensync_module_internals.h" +#include "plugin/opensync_plugin_internals.h" #include "opensync-plugin.h" #include "opensync_plugin_env_internals.h" @@ -291,6 +292,11 @@ osync_plugin_set_description(plugin, description); osync_plugin_set_start_type(plugin, OSYNC_START_TYPE_EXTERNAL); + if (command) { + osync_plugin_set_external_command(plugin, command); + osync_free(command); + } + if (!osync_plugin_env_register_plugin(env, plugin, error)) { osync_plugin_unref(plugin); goto error_free_module; Modified: trunk/opensync/plugin/opensync_plugin_internals.h ============================================================================== --- trunk/opensync/plugin/opensync_plugin_internals.h Mon Nov 2 13:27:58 2009 (r5913) +++ trunk/opensync/plugin/opensync_plugin_internals.h Mon Nov 2 13:49:22 2009 (r5914) @@ -33,6 +33,29 @@ /*@{*/ +/** @brief Get default external command of the plugin + * + * The default external command is set in the plugin external configuration (XML) file + * + * @param plugin The plugin to check + * @returns external command as const-char* string if a command is set, NULL otherwise. + * + */ +OSYNC_TEST_EXPORT const char *osync_plugin_get_external_command(OSyncPlugin *plugin); + +/** @brief Get default external command of the plugin + * + * External command as const-char* string get substitued with the pipe-path. + * For this, one %s is required, which will be substriuted with the pipe-path. + * + * Example: /usr/local/bin/foobar --pipe %s + * + * @param plugin The plugin to check + * @param external_command External command as const-char* string like-printf with %s which get substitured with pipe-path + * + */ +OSYNC_TEST_EXPORT void osync_plugin_set_external_command(OSyncPlugin *plugin, const char *external_command); + /** @brief Checks if a plugin is available and usable * * @param plugin The plugin to check Modified: trunk/opensync/plugin/opensync_plugin_private.h ============================================================================== --- trunk/opensync/plugin/opensync_plugin_private.h Mon Nov 2 13:27:58 2009 (r5913) +++ trunk/opensync/plugin/opensync_plugin_private.h Mon Nov 2 13:49:22 2009 (r5914) @@ -53,6 +53,10 @@ char *longname; /** A short description what the plugin does */ char *description; + + /** Default external command (optional) */ + char *external_command; + /** The function to initialize the plugin. */ initialize_fn initialize; /** The function to finalize the plugin. The input will be the output of the initialize function */ |
From: <svn...@op...> - 2009-11-02 12:37:53
|
Author: dgollub Date: Mon Nov 2 13:27:58 2009 New Revision: 5913 URL: http://www.opensync.org/changeset/5913 Log: Drop external-demo configuration from the build-env. The default config got dropped in a previous commit. This fixes the build of the example plugins. Modified: trunk/docs/examples/plugins/src/CMakeLists.txt Modified: trunk/docs/examples/plugins/src/CMakeLists.txt ============================================================================== --- trunk/docs/examples/plugins/src/CMakeLists.txt Mon Nov 2 13:26:41 2009 (r5912) +++ trunk/docs/examples/plugins/src/CMakeLists.txt Mon Nov 2 13:27:58 2009 (r5913) @@ -12,7 +12,6 @@ OPENSYNC_PLUGIN_INSTALL( example_plugin ) ### External Synchronization Plugin ######## -OPENSYNC_PLUGIN_CONFIG( external-demo ) OPENSYNC_EXTERNAL_PLUGIN_INSTALL( external_plugin.xml ) ADD_EXECUTABLE( example_external_demo external_demo.c ) |
From: <svn...@op...> - 2009-11-02 12:37:53
|
Author: dgollub Date: Mon Nov 2 13:19:13 2009 New Revision: 5910 URL: http://www.opensync.org/changeset/5910 Log: Changed INSTALL parameter from TARGETS to FILES, since external plugin configuration files are not in the build directory, neither they're targets. Modified: trunk/cmake/OpenSyncPlugin.cmake Modified: trunk/cmake/OpenSyncPlugin.cmake ============================================================================== --- trunk/cmake/OpenSyncPlugin.cmake Mon Nov 2 13:15:46 2009 (r5909) +++ trunk/cmake/OpenSyncPlugin.cmake Mon Nov 2 13:19:13 2009 (r5910) @@ -23,7 +23,7 @@ ### Got introduced to be able in future to move those plugins into ### a seperated directory, without fixing all plugin build environments MACRO( OPENSYNC_EXTERNAL_PLUGIN_INSTALL _pluginName ) - INSTALL( TARGETS ${_pluginName} DESTINATION ${OPENSYNC_PLUGINDIR} ) + INSTALL( FILES ${_pluginName} DESTINATION ${OPENSYNC_PLUGINDIR} ) ENDMACRO( OPENSYNC_EXTERNAL_PLUGIN_INSTALL ) ## Install format plugin |
From: <svn...@op...> - 2009-11-02 12:32:54
|
Author: dgollub Date: Mon Nov 2 13:15:46 2009 New Revision: 5909 URL: http://www.opensync.org/changeset/5909 Log: Introduced OPENSYNC_EXTERNAL_PLUGIN_INSTALL CMake Macro to install external (XML) plugin configuration Modified: trunk/cmake/OpenSyncPlugin.cmake Modified: trunk/cmake/OpenSyncPlugin.cmake ============================================================================== --- trunk/cmake/OpenSyncPlugin.cmake Mon Nov 2 13:03:43 2009 (r5908) +++ trunk/cmake/OpenSyncPlugin.cmake Mon Nov 2 13:15:46 2009 (r5909) @@ -19,6 +19,13 @@ INSTALL( TARGETS ${_pluginName} DESTINATION ${OPENSYNC_PLUGINDIR} ) ENDMACRO( OPENSYNC_PLUGIN_INSTALL ) +## Install external plugin +### Got introduced to be able in future to move those plugins into +### a seperated directory, without fixing all plugin build environments +MACRO( OPENSYNC_EXTERNAL_PLUGIN_INSTALL _pluginName ) + INSTALL( TARGETS ${_pluginName} DESTINATION ${OPENSYNC_PLUGINDIR} ) +ENDMACRO( OPENSYNC_EXTERNAL_PLUGIN_INSTALL ) + ## Install format plugin MACRO( OPENSYNC_FORMAT_INSTALL _pluginName ) INSTALL( TARGETS ${_pluginName} DESTINATION ${OPENSYNC_FORMATSDIR} ) |
From: <svn...@op...> - 2009-11-02 12:28:41
|
Author: dgollub Date: Mon Nov 2 13:26:41 2009 New Revision: 5912 URL: http://www.opensync.org/changeset/5912 Log: Renamed the external-demo plugin to external-plugin. plugin developers don't need to know that there are other possibilities beside XML to register such a plugin. The XML way is the prefered way to register external-plugins. Modified: trunk/docs/examples/plugins/src/external_plugin.xml Modified: trunk/docs/examples/plugins/src/external_plugin.xml ============================================================================== --- trunk/docs/examples/plugins/src/external_plugin.xml Mon Nov 2 13:24:32 2009 (r5911) +++ trunk/docs/examples/plugins/src/external_plugin.xml Mon Nov 2 13:26:41 2009 (r5912) @@ -5,7 +5,7 @@ but creating a real plugin is still supported. Use one or the other, but not both! --> <ExternalPlugin version="1"> - <Name>external-demo-xml</Name> + <Name>external-plugin</Name> <LongName>long name. maybe < 50 chars</LongName> <Description>A longer description. < 200 chars</Description> <ExternalCommand>example_external_demo %s</ExternalCommand> |
From: <svn...@op...> - 2009-11-02 12:25:52
|
Author: dgollub Date: Mon Nov 2 13:24:32 2009 New Revision: 5911 URL: http://www.opensync.org/changeset/5911 Log: Drop plugin-stub which is obsolete since we have external-plugin xml configuration which register external plugins in the PluginEnv. Also drop stub configuration file, since we try to support plugins without any configuration: OSyncPluginConfigurationType: None Deleted: trunk/docs/examples/plugins/src/external-demo trunk/docs/examples/plugins/src/external_plugin.c Modified: trunk/docs/examples/plugins/src/CMakeLists.txt Modified: trunk/docs/examples/plugins/src/CMakeLists.txt ============================================================================== --- trunk/docs/examples/plugins/src/CMakeLists.txt Mon Nov 2 13:19:13 2009 (r5910) +++ trunk/docs/examples/plugins/src/CMakeLists.txt Mon Nov 2 13:24:32 2009 (r5911) @@ -12,10 +12,7 @@ OPENSYNC_PLUGIN_INSTALL( example_plugin ) ### External Synchronization Plugin ######## -OPENSYNC_PLUGIN_ADD( example_external_plugin external_plugin.c ) -OPENSYNC_PLUGIN_CONFIG(external-demo ) -TARGET_LINK_LIBRARIES( example_external_plugin ${OPENSYNC_LIBRARIES} ) -OPENSYNC_PLUGIN_INSTALL( example_external_plugin ) +OPENSYNC_PLUGIN_CONFIG( external-demo ) OPENSYNC_EXTERNAL_PLUGIN_INSTALL( external_plugin.xml ) ADD_EXECUTABLE( example_external_demo external_demo.c ) |
From: <svn...@op...> - 2009-11-02 12:03:57
|
Author: dgollub Date: Mon Nov 2 13:03:43 2009 New Revision: 5908 URL: http://www.opensync.org/changeset/5908 Log: Fixed compiler warnings/errors, with gcc optimzation. Fixed wrong refrence of OSyncError - it got dereferecd twice. Changed some signed chars and unsigned chars for xmlChar API Fixed potential memory leak of returned pointer of xmlPropGet, which needs to get freed, not only in error condition, with the xmlFree/osync_xml_free function. Modified: trunk/opensync/plugin/opensync_plugin_env.c Modified: trunk/opensync/plugin/opensync_plugin_env.c ============================================================================== --- trunk/opensync/plugin/opensync_plugin_env.c Mon Nov 2 13:01:07 2009 (r5907) +++ trunk/opensync/plugin/opensync_plugin_env.c Mon Nov 2 13:03:43 2009 (r5908) @@ -232,7 +232,8 @@ { OSyncModule *module = NULL; int version = 0; - gchar *name = NULL, *longname = NULL, *description = NULL, *command = NULL, *version_str = NULL; + gchar *name = NULL, *longname = NULL, *description = NULL, *command = NULL; + xmlChar *version_str = NULL; xmlDocPtr doc; xmlNodePtr cur; @@ -240,11 +241,14 @@ osync_assert(env); osync_assert(filename); - if (!osync_xml_open_file(&doc, &cur, filename, "ExternalPlugin", &error)) + if (!osync_xml_open_file(&doc, &cur, filename, "ExternalPlugin", error)) goto error; - version_str = xmlGetProp(cur->parent, (const xmlChar *)"version"); - if (version_str) version = atoi(version_str); + version_str = xmlGetProp(cur->parent, BAD_CAST "version"); + if (version_str) { + version = atoi((const char *) version_str); + osync_xml_free(version_str); + } for (; cur != NULL; cur = cur->next) { char *str = NULL; @@ -303,7 +307,7 @@ osync_module_unref(module); error: osync_free(name); osync_free(longname); osync_free(description); - osync_free(command); osync_free(version_str); + osync_free(command); osync_trace(TRACE_EXIT_ERROR, "%s: %s", __func__, osync_error_print(error)); return FALSE; } |
From: <svn...@op...> - 2009-11-02 12:01:25
|
Author: dgollub Date: Mon Nov 2 13:01:07 2009 New Revision: 5907 URL: http://www.opensync.org/changeset/5907 Log: Fixed build of swig-wrapper, due to renaming enum OSyncConfigratuionType to OSyncPluginConfigurationType Modified: trunk/wrapper/opensync.i Modified: trunk/wrapper/opensync.i ============================================================================== --- trunk/wrapper/opensync.i Mon Nov 2 00:18:35 2009 (r5906) +++ trunk/wrapper/opensync.i Mon Nov 2 13:01:07 2009 (r5907) @@ -18,7 +18,7 @@ typedef OSyncCapability Capability; typedef OSyncChange Change; typedef OSyncChangeType ChangeType; -typedef OSyncConfigurationType ConfigurationType; +typedef OSyncPluginConfigurationType ConfigurationType; typedef OSyncConflictResolution ConflictResolution; typedef OSyncContext Context; typedef OSyncConvCmpResult ConvCmpResult; |
From: <svn...@op...> - 2009-11-01 23:18:51
|
Author: Graham Cobb Date: Mon Nov 2 00:18:35 2009 New Revision: 5906 URL: http://www.opensync.org/changeset/5906 Log: External plugin configuration file support Added: trunk/docs/examples/plugins/src/external_plugin.xml Modified: trunk/docs/examples/plugins/src/CMakeLists.txt trunk/docs/examples/plugins/src/external_plugin.c trunk/opensync/plugin/opensync_plugin_env.c trunk/opensync/plugin/opensync_plugin_env_internals.h Modified: trunk/docs/examples/plugins/src/CMakeLists.txt ============================================================================== --- trunk/docs/examples/plugins/src/CMakeLists.txt Sun Nov 1 22:46:11 2009 (r5905) +++ trunk/docs/examples/plugins/src/CMakeLists.txt Mon Nov 2 00:18:35 2009 (r5906) @@ -16,6 +16,7 @@ OPENSYNC_PLUGIN_CONFIG(external-demo ) TARGET_LINK_LIBRARIES( example_external_plugin ${OPENSYNC_LIBRARIES} ) OPENSYNC_PLUGIN_INSTALL( example_external_plugin ) +OPENSYNC_EXTERNAL_PLUGIN_INSTALL( external_plugin.xml ) ADD_EXECUTABLE( example_external_demo external_demo.c ) TARGET_LINK_LIBRARIES( example_external_demo ${OPENSYNC_LIBRARIES} ) Modified: trunk/docs/examples/plugins/src/external_plugin.c ============================================================================== --- trunk/docs/examples/plugins/src/external_plugin.c Sun Nov 1 22:46:11 2009 (r5905) +++ trunk/docs/examples/plugins/src/external_plugin.c Mon Nov 2 00:18:35 2009 (r5906) @@ -1,9 +1,10 @@ /* * - * !!! This is only a temporary solution and will be soon obsolete. !!! + * !!! This approach still works but the preferred approach is to use !!! + * !!! the XML file: see external_plugin.xml. Using a real plugin, !!! + * !!! as in this code, is now deprecated. !!! * * This plugin is just a stub to register an external plugin to the plugin-env - * In the future this will be done via configuration files. * */ Added: trunk/docs/examples/plugins/src/external_plugin.xml ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ trunk/docs/examples/plugins/src/external_plugin.xml Mon Nov 2 00:18:35 2009 (r5906) @@ -0,0 +1,12 @@ +<?xml version="1.0"?> +<!-- Note: this is the XML version of the example external plugin. + Either this or the external_plugin.c version can be used - they + have the same effect. Using this XML file is the preferred approach, + but creating a real plugin is still supported. Use one or the other, + but not both! --> + <ExternalPlugin version="1"> + <Name>external-demo-xml</Name> + <LongName>long name. maybe < 50 chars</LongName> + <Description>A longer description. < 200 chars</Description> + <ExternalCommand>example_external_demo %s</ExternalCommand> + </ExternalPlugin> Modified: trunk/opensync/plugin/opensync_plugin_env.c ============================================================================== --- trunk/opensync/plugin/opensync_plugin_env.c Sun Nov 1 22:46:11 2009 (r5905) +++ trunk/opensync/plugin/opensync_plugin_env.c Mon Nov 2 00:18:35 2009 (r5906) @@ -28,6 +28,8 @@ #include "opensync_plugin_env_internals.h" #include "opensync_plugin_env_private.h" +#include "common/opensync_xml_internals.h" + OSyncPluginEnv *osync_plugin_env_new(OSyncError **error) { OSyncPluginEnv *env = NULL; @@ -69,9 +71,8 @@ env->plugins = osync_list_remove(env->plugins, env->plugins->data); } - /* Unload all modules */ + /* Unref (and so unload) all modules */ while (env->modules) { - osync_module_unload(env->modules->data); osync_module_unref(env->modules->data); env->modules = osync_list_remove(env->modules, env->modules->data); } @@ -107,6 +108,33 @@ } } + /* First try to load config files for external plugins */ + dir = g_dir_open(path, 0, &gerror); + if (!dir) { + osync_error_set(error, OSYNC_ERROR_IO_ERROR, "Unable to open directory %s: %s", path, gerror->message); + g_error_free(gerror); + goto error; + } + + while ((de = g_dir_read_name(dir))) { + filename = osync_strdup_printf ("%s%c%s", path, G_DIR_SEPARATOR, de); + + if (!g_file_test(filename, G_FILE_TEST_IS_REGULAR) || !g_pattern_match_simple("*.xml", filename)) { + osync_free(filename); + continue; + } + + if (!osync_plugin_env_load_module_xml(env, filename, error)) { + osync_trace(TRACE_ERROR, "Unable to load module: %s", osync_error_print(error)); + /* FIXME: report error to user and free error */ + } + + osync_free(filename); + } + + g_dir_close(dir); + + /* Then try to load loadable plugins */ dir = g_dir_open(path, 0, &gerror); if (!dir) { osync_error_set(error, OSYNC_ERROR_IO_ERROR, "Unable to open directory %s: %s", path, gerror->message); @@ -124,6 +152,7 @@ if (!osync_plugin_env_load_module(env, filename, error)) { osync_trace(TRACE_ERROR, "Unable to load module: %s", osync_error_print(error)); + /* FIXME: report error to user and free error */ } osync_free(filename); @@ -198,6 +227,86 @@ osync_trace(TRACE_EXIT_ERROR, "%s: %s", __func__, osync_error_print(error)); return FALSE; } + +osync_bool osync_plugin_env_load_module_xml(OSyncPluginEnv *env, const char *filename, OSyncError **error) +{ + OSyncModule *module = NULL; + int version = 0; + gchar *name = NULL, *longname = NULL, *description = NULL, *command = NULL, *version_str = NULL; + xmlDocPtr doc; + xmlNodePtr cur; + + osync_trace(TRACE_ENTRY, "%s(%p, %s, %p)", __func__, env, filename, error); + osync_assert(env); + osync_assert(filename); + + if (!osync_xml_open_file(&doc, &cur, filename, "ExternalPlugin", &error)) + goto error; + + version_str = xmlGetProp(cur->parent, (const xmlChar *)"version"); + if (version_str) version = atoi(version_str); + + for (; cur != NULL; cur = cur->next) { + char *str = NULL; + if (cur->type != XML_ELEMENT_NODE) + continue; + + str = (char*)xmlNodeGetContent(cur); + if (!str) + continue; + + if (!xmlStrcmp(cur->name, BAD_CAST "Name")) + name = osync_strdup(str); + else if (!xmlStrcmp(cur->name, BAD_CAST "LongName")) + longname = osync_strdup(str); + else if (!xmlStrcmp(cur->name, BAD_CAST "Description")) + description = osync_strdup(str); + else if (!xmlStrcmp(cur->name, BAD_CAST "ExternalCommand")) + command = osync_strdup(str); + + osync_xml_free(str); + } + osync_xml_free_doc(doc); + + module = osync_module_new(error); + if (!module) + goto error; + + if (version != OPENSYNC_PLUGINVERSION) { + osync_error_set(error, OSYNC_ERROR_GENERIC, "External plugin API version mismatch. Is: %i. Should be %i", version, OPENSYNC_PLUGINVERSION); + goto error_free_module; + } + + /* This code simulates the get_sync_info code of a normal plugin */ + OSyncPlugin *plugin = osync_plugin_new(error); + if (!plugin) + goto error_free_module; + + osync_plugin_set_name(plugin, name); + osync_plugin_set_longname(plugin, longname); + osync_plugin_set_description(plugin, description); + osync_plugin_set_start_type(plugin, OSYNC_START_TYPE_EXTERNAL); + + if (!osync_plugin_env_register_plugin(env, plugin, error)) { + osync_plugin_unref(plugin); + goto error_free_module; + } + + osync_plugin_unref(plugin); + + env->modules = osync_list_append(env->modules, module); + + osync_trace(TRACE_EXIT, "%s", __func__); + return TRUE; + +error_free_module: + osync_module_unref(module); +error: + osync_free(name); osync_free(longname); osync_free(description); + osync_free(command); osync_free(version_str); + osync_trace(TRACE_EXIT_ERROR, "%s: %s", __func__, osync_error_print(error)); + return FALSE; +} OSyncPlugin *osync_plugin_env_find_plugin(OSyncPluginEnv *env, const char *name) { Modified: trunk/opensync/plugin/opensync_plugin_env_internals.h ============================================================================== --- trunk/opensync/plugin/opensync_plugin_env_internals.h Sun Nov 1 22:46:11 2009 (r5905) +++ trunk/opensync/plugin/opensync_plugin_env_internals.h Mon Nov 2 00:18:35 2009 (r5906) @@ -40,6 +40,16 @@ */ osync_bool osync_plugin_env_load_module(OSyncPluginEnv *env, const char *filename, OSyncError **error); +/** @brief Loads a configuration file for an external module into the plugin environment + * + * @param env Pointer to a plugin environment + * @param filename Config filename, as full path, to load + * @param error Pointer to error-struct + * @returns TRUE on success, FALSE otherwise + * + */ +osync_bool osync_plugin_env_load_module_xml(OSyncPluginEnv *env, const char *filename, OSyncError **error); + /** @brief Checks if plugin is usable * * @param env Pointer to a OSyncPluginEnv environment |