From: <svn...@op...> - 2009-09-03 00:34:34
|
Author: dgollub Date: Thu Sep 3 02:28:18 2009 New Revision: 5730 URL: http://www.opensync.org/changeset/5730 Log: Allow reporting of discovered capabilities during the get_changes phase. This is required for plugins/protocols which are only able to get capabilities information during a sync. Modified: trunk/opensync/client/opensync_client.c trunk/opensync/client/opensync_client_proxy.c Modified: trunk/opensync/client/opensync_client.c ============================================================================== --- trunk/opensync/client/opensync_client.c Wed Sep 2 19:55:58 2009 (r5729) +++ trunk/opensync/client/opensync_client.c Thu Sep 3 02:28:18 2009 (r5730) @@ -259,6 +259,47 @@ return; } +static osync_bool _osync_client_handle_capabilities_message(OSyncClient *client, OSyncMessage *reply, OSyncError **error) +{ + + OSyncVersion *version = NULL; + OSyncCapabilities *capabilities = NULL; + char* buffer = NULL; + unsigned int size = 0; + + version = osync_plugin_info_get_version(client->plugin_info); + if (version) { + osync_message_write_int(reply, 1); + osync_message_write_string(reply, osync_version_get_plugin(version)); + osync_message_write_string(reply, osync_version_get_priority(version)); + osync_message_write_string(reply, osync_version_get_vendor(version)); + osync_message_write_string(reply, osync_version_get_modelversion(version)); + osync_message_write_string(reply, osync_version_get_firmwareversion(version)); + osync_message_write_string(reply, osync_version_get_softwareversion(version)); + osync_message_write_string(reply, osync_version_get_hardwareversion(version)); + osync_message_write_string(reply, osync_version_get_identifier(version)); + } else { + osync_message_write_int(reply, 0); + } + + /* Report detected capabilities */ + capabilities = osync_plugin_info_get_capabilities(client->plugin_info); + if (capabilities) { + osync_message_write_int(reply, 1); + if (!osync_capabilities_assemble(capabilities, &buffer, &size, error)) + goto error; + osync_message_write_string(reply, buffer); + g_free(buffer); + } else { + osync_message_write_int(reply, 0); + } + + return TRUE; + +error: + return FALSE; +} + static void _osync_client_get_changes_callback(void *data, OSyncError *error) { OSyncError *locerror = NULL; @@ -282,6 +323,11 @@ goto error; osync_trace(TRACE_INTERNAL, "Reply id %lli", osync_message_get_id(reply)); + + /* Handle capabilities if those got discovered during the sync .... */ + if (!_osync_client_handle_capabilities_message(client, reply, &locerror)) + goto error_free_message; + _free_baton(baton); if (!osync_queue_send_message(client->outgoing, NULL, reply, &locerror)) @@ -824,6 +870,7 @@ return FALSE; } + static osync_bool _osync_client_handle_discover(OSyncClient *client, OSyncMessage *message, OSyncError **error) { OSyncMessage *reply = NULL; @@ -831,10 +878,6 @@ OSyncList *res = NULL; unsigned int avail = 0; OSyncObjTypeSink *sink = NULL; - OSyncVersion *version = NULL; - OSyncCapabilities *capabilities = NULL; - char* buffer = NULL; - unsigned int size = 0; unsigned int num_res = 0; OSyncPluginResource *resource = NULL; OSyncList *objtypesinks = NULL; @@ -879,31 +922,9 @@ list = list->next; } osync_list_free(objtypesinks); - - version = osync_plugin_info_get_version(client->plugin_info); - if (version) { - osync_message_write_int(reply, 1); - osync_message_write_string(reply, osync_version_get_plugin(version)); - osync_message_write_string(reply, osync_version_get_priority(version)); - osync_message_write_string(reply, osync_version_get_vendor(version)); - osync_message_write_string(reply, osync_version_get_modelversion(version)); - osync_message_write_string(reply, osync_version_get_firmwareversion(version)); - osync_message_write_string(reply, osync_version_get_softwareversion(version)); - osync_message_write_string(reply, osync_version_get_hardwareversion(version)); - osync_message_write_string(reply, osync_version_get_identifier(version)); - }else - osync_message_write_int(reply, 0); - - /* Report detected capabilities */ - capabilities = osync_plugin_info_get_capabilities(client->plugin_info); - if (capabilities) { - osync_message_write_int(reply, 1); - if (!osync_capabilities_assemble(capabilities, &buffer, &size, error)) - goto error_free_message; - osync_message_write_string(reply, buffer); - g_free(buffer); - }else - osync_message_write_int(reply, 0); + + if (!_osync_client_handle_capabilities_message(client, reply, error)) + goto error_free_message; /* Report, detected Resources */ res = osync_plugin_config_get_resources(config); Modified: trunk/opensync/client/opensync_client_proxy.c ============================================================================== --- trunk/opensync/client/opensync_client_proxy.c Wed Sep 2 19:55:58 2009 (r5729) +++ trunk/opensync/client/opensync_client_proxy.c Thu Sep 3 02:28:18 2009 (r5730) @@ -314,22 +314,112 @@ return; } +static osync_bool _osync_client_proxy_read_discover_message(OSyncClientProxy *proxy, OSyncMessage *message, OSyncError **error) +{ + + char* str = NULL; + int sent_version = 0; + int sent_capabilities = 0; + OSyncVersion *version = NULL; + OSyncCapabilities *capabilities = NULL; + OSyncCapabilities *version_cap = NULL; + OSyncMember *member = osync_client_proxy_get_member(proxy); + + + /* Merger - Set the capabilities */ + osync_message_read_int(message, &sent_version); + if (sent_version) { + version = osync_version_new(error); + if (!version) + goto error; + + osync_message_read_string(message, &str); + osync_version_set_plugin(version, str); + osync_free(str); + osync_message_read_string(message, &str); + osync_version_set_priority(version, str); + osync_free(str); + osync_message_read_string(message, &str); + osync_version_set_vendor(version, str); + osync_free(str); + osync_message_read_string(message, &str); + osync_version_set_modelversion(version, str); + osync_free(str); + osync_message_read_string(message, &str); + osync_version_set_firmwareversion(version, str); + osync_free(str); + osync_message_read_string(message, &str); + osync_version_set_softwareversion(version, str); + osync_free(str); + osync_message_read_string(message, &str); + osync_version_set_hardwareversion(version, str); + osync_free(str); + osync_message_read_string(message, &str); + osync_version_set_identifier(version, str); + osync_free(str); + } + + osync_message_read_int(message, &sent_capabilities); + if (sent_capabilities) { + osync_message_read_string(message, &str); + capabilities = osync_capabilities_parse(str, strlen(str), error); + osync_free(str); + if (!capabilities) + goto error_free_version; + } + + /* we set the capabilities for the member only if they are not set yet */ + if (member && osync_member_get_capabilities(member) == NULL) { + osync_trace(TRACE_INTERNAL, "No capabilities set for the member right now. version: %p capabilities: %p\n", version, capabilities); + + /* we take our own capabilities rather then from the client */ + if (version) + version_cap = osync_version_find_capabilities(version, error); + + if (*error) + goto error_free_capabilities; + + if (version_cap) { + if (capabilities) + osync_capabilities_unref(capabilities); + capabilities = version_cap; + } + + if (capabilities) { + if (!osync_member_set_capabilities(member, capabilities, error)) + goto error_free_capabilities; + + osync_capabilities_unref(capabilities); + } + } + + if (version) + osync_version_unref(version); + + return TRUE; + +error_free_capabilities: + if (capabilities) + osync_capabilities_unref(capabilities); +error_free_version: + if (version) + osync_version_unref(version); + +error: + + return FALSE; +} + static void _osync_client_proxy_discover_handler(OSyncMessage *message, void *user_data) { callContext *ctx = user_data; OSyncClientProxy *proxy = ctx->proxy; OSyncError *error = NULL; OSyncError *locerror = NULL; - OSyncVersion *version = NULL; - OSyncCapabilities *capabilities = NULL; unsigned int num_sinks = 0; unsigned int i = 0; OSyncObjTypeSink *sink = NULL; - int sent_version = 0; - char* str = NULL; - int sent_capabilities = 0; - OSyncMember *member = NULL; - OSyncCapabilities *version_cap = NULL; + OSyncMember *member = osync_client_proxy_get_member(proxy); unsigned int num_res = 0; OSyncPluginConfig *config = NULL; OSyncPluginResource *resource = NULL; @@ -353,82 +443,10 @@ if (proxy->member) osync_member_add_objtype_sink(proxy->member, sink); } - - /* Merger - Set the capabilities */ - osync_message_read_int(message, &sent_version); - if (sent_version) { - version = osync_version_new(&locerror); - if(!version) { - goto error; - } - - osync_message_read_string(message, &str); - osync_version_set_plugin(version, str); - osync_free(str); - osync_message_read_string(message, &str); - osync_version_set_priority(version, str); - osync_free(str); - osync_message_read_string(message, &str); - osync_version_set_vendor(version, str); - osync_free(str); - osync_message_read_string(message, &str); - osync_version_set_modelversion(version, str); - osync_free(str); - osync_message_read_string(message, &str); - osync_version_set_firmwareversion(version, str); - osync_free(str); - osync_message_read_string(message, &str); - osync_version_set_softwareversion(version, str); - osync_free(str); - osync_message_read_string(message, &str); - osync_version_set_hardwareversion(version, str); - osync_free(str); - osync_message_read_string(message, &str); - osync_version_set_identifier(version, str); - osync_free(str); - } - - osync_message_read_int(message, &sent_capabilities); - if (sent_capabilities) { - osync_message_read_string(message, &str); - capabilities = osync_capabilities_parse(str, strlen(str), &locerror); - osync_free(str); - if(!capabilities) { - goto error_free_version; - } - } - - /* we set the capabilities for the member only if they are not set yet */ - member = osync_client_proxy_get_member(proxy); - if (member && osync_member_get_capabilities(member) == NULL) - { - osync_trace(TRACE_INTERNAL, "No capabilities set for the member right now. version: %p capabilities: %p\n", version, capabilities); - - /* we take our own capabilities rather then from the client */ - if (version) - version_cap = osync_version_find_capabilities(version, &locerror); - - if (locerror) - goto error_free_capabilities; - - if (version_cap) { - if (capabilities) - osync_capabilities_unref(capabilities); - capabilities = version_cap; - } - - if (capabilities) { - if (!osync_member_set_capabilities(member, capabilities, &locerror)) - goto error_free_capabilities; - - osync_capabilities_unref(capabilities); - } - } - - if (version) - osync_version_unref(version); - + if (!_osync_client_proxy_read_discover_message(proxy, message, &locerror)) + goto error; + /* Store stuff in member configuration */ if (member) { @@ -466,12 +484,6 @@ osync_trace(TRACE_EXIT, "%s", __func__); return; - error_free_capabilities: - if (capabilities) - osync_capabilities_unref(capabilities); - error_free_version: - if (version) - osync_version_unref(version); error: ctx->discover_callback(proxy, ctx->discover_callback_data, locerror); osync_free(ctx); @@ -625,6 +637,12 @@ if (osync_message_get_cmd(message) == OSYNC_MESSAGE_REPLY) { ctx->get_changes_callback(proxy, ctx->get_changes_callback_data, NULL); + + if (osync_message_get_message_size(message)) { + if (!_osync_client_proxy_read_discover_message(proxy, message, &locerror)) + goto error; + } + } else if (osync_message_get_cmd(message) == OSYNC_MESSAGE_ERRORREPLY) { osync_demarshal_error(message, &error); ctx->get_changes_callback(proxy, ctx->get_changes_callback_data, error); |