From: <dg...@su...> - 2009-01-14 21:24:17
|
Author: dgollub Date: Wed Jan 14 22:23:28 2009 New Revision: 5145 URL: http://www.opensync.org/changeset/5145 Log: Make osync_format_env_detect_objformat_full() function more error handling friendly. Return FALSE only on errors, otherwise always TRUE. The result of the detection get stored via referenced in the second last parameter. Patch based on the bug-fix from Graham Cobb #1036. Don't call format detection function when recieving reported changes when changetype is DELETED. Graham, thanks a lot! Modified: trunk/opensync/engine/opensync_engine.c trunk/opensync/format/opensync_format_env.c trunk/opensync/format/opensync_format_env.h Modified: trunk/opensync/engine/opensync_engine.c ============================================================================== --- trunk/opensync/engine/opensync_engine.c Wed Jan 14 22:21:10 2009 (r5144) +++ trunk/opensync/engine/opensync_engine.c Wed Jan 14 22:23:28 2009 (r5145) @@ -205,7 +205,10 @@ data = osync_change_get_data(change); /* try to detect encapsulated formats */ - detected_format = osync_format_env_detect_objformat_full(engine->formatenv, data, &error); + if (osync_change_get_changetype(change) != OSYNC_CHANGE_TYPE_DELETED) + if (!osync_format_env_detect_objformat_full(engine->formatenv, data, &detected_format, &error)) + goto error; + if (detected_format && detected_format != osync_change_get_objformat(change)) { osync_trace(TRACE_INTERNAL, "Detected format (%s) different then the reported format (%s)!", osync_objformat_get_name(detected_format), Modified: trunk/opensync/format/opensync_format_env.c ============================================================================== --- trunk/opensync/format/opensync_format_env.c Wed Jan 14 22:21:10 2009 (r5144) +++ trunk/opensync/format/opensync_format_env.c Wed Jan 14 22:23:28 2009 (r5145) @@ -968,13 +968,17 @@ return NULL; } -OSyncObjFormat *osync_format_env_detect_objformat_full(OSyncFormatEnv *env, OSyncData *input, OSyncError **error) +osync_bool osync_format_env_detect_objformat_full(OSyncFormatEnv *env, OSyncData *input, OSyncObjFormat **detected_format, OSyncError **error) { - OSyncObjFormat *detected_format = NULL; OSyncData *new_data = NULL; OSyncList *d = NULL; osync_trace(TRACE_ENTRY, "%s(%p, %p, %p)", __func__, env, input, error); + + if (!input || !osync_data_has_data(input)) { + osync_trace(TRACE_EXIT, "%s: No data provided to detect.", __func__); + return TRUE; + } /* Make a copy of the data */ new_data = osync_data_clone(input, error); @@ -1006,23 +1010,23 @@ if (!converter) break; - if ((detected_format = osync_format_env_detect_objformat(env, new_data))) { + if ((*detected_format = osync_format_env_detect_objformat(env, new_data))) { /* We detected the format. So we replace the original format. */ - osync_data_set_objformat(new_data, detected_format); + osync_data_set_objformat(new_data, *detected_format); } else - detected_format = osync_data_get_objformat(new_data); + *detected_format = osync_data_get_objformat(new_data); } osync_data_unref(new_data); - osync_trace(TRACE_EXIT, "%s: %p", __func__, detected_format); - return detected_format; + osync_trace(TRACE_EXIT, "%s: %p", __func__, *detected_format); + return TRUE; error_free_data: osync_data_unref(new_data); error: osync_trace(TRACE_EXIT_ERROR, "%s: %s", __func__, osync_error_print(error)); - return NULL; + return FALSE; } osync_bool osync_format_env_convert(OSyncFormatEnv *env, OSyncFormatConverterPath *path, OSyncData *data, OSyncError **error) Modified: trunk/opensync/format/opensync_format_env.h ============================================================================== --- trunk/opensync/format/opensync_format_env.h Wed Jan 14 22:21:10 2009 (r5144) +++ trunk/opensync/format/opensync_format_env.h Wed Jan 14 22:23:28 2009 (r5145) @@ -186,11 +186,12 @@ * * @param env The conversion environment to use * @param input The data object to detect - * @param error The error-return location - * @returns The encapsulated format on success, NULL otherwise + * @param detected_format Reference to OSyncObjFormat which get set with detected format, if any got detected + * @param error The error-return location, get set on any error + * @returns TRUE when format detection successfully completed, FALSE on any error. * */ -OSYNC_EXPORT OSyncObjFormat *osync_format_env_detect_objformat_full(OSyncFormatEnv *env, OSyncData *input, OSyncError **error); +OSYNC_EXPORT osync_bool osync_format_env_detect_objformat_full(OSyncFormatEnv *env, OSyncData *input, OSyncObjFormat **deteted_format, OSyncError **error); /** @brief Convert a data object using a specific conversion path * |