From: <dg...@su...> - 2009-01-06 14:06:15
|
Author: dgollub Date: Tue Jan 6 15:05:53 2009 New Revision: 5043 URL: http://www.opensync.org/changeset/5043 Log: More refacotring of ObjEngine WRITE command. This time: conversion to peer format. Modified: trunk/opensync/engine/opensync_mapping_entry_engine.c trunk/opensync/engine/opensync_mapping_entry_engine_internals.h trunk/opensync/engine/opensync_obj_engine.c Modified: trunk/opensync/engine/opensync_mapping_entry_engine.c ============================================================================== --- trunk/opensync/engine/opensync_mapping_entry_engine.c Tue Jan 6 14:31:14 2009 (r5042) +++ trunk/opensync/engine/opensync_mapping_entry_engine.c Tue Jan 6 15:05:53 2009 (r5043) @@ -27,6 +27,7 @@ #include "opensync-data.h" #include "opensync-mapping.h" #include "opensync-format.h" +#include "opensync-plugin.h" #include "archive/opensync_archive_internals.h" #include "format/opensync_objformat_internals.h" @@ -205,3 +206,65 @@ return FALSE; } +osync_bool osync_entry_engine_convert(OSyncMappingEntryEngine *entry_engine, OSyncFormatEnv *formatenv, OSyncObjTypeSink *objtype_sink, OSyncFormatConverterPath **cachedpath, OSyncError **error) +{ + char *objtype = NULL; + OSyncList *format_sinks = NULL; + unsigned int length = 0; + OSyncFormatConverter *converter = NULL; + OSyncChange *change = entry_engine->change; + OSyncFormatConverterPath *path; + + osync_trace(TRACE_INTERNAL, "Starting to convert from objtype %s and format %s", osync_change_get_objtype(entry_engine->change), osync_objformat_get_name(osync_change_get_objformat(entry_engine->change))); + /* We have to save the objtype of the change so that it does not get + * overwritten by the conversion */ + objtype = g_strdup(osync_change_get_objtype(change)); + + /* Now we have to convert to one of the formats + * that the client can understand */ + format_sinks = osync_objtype_sink_get_objformat_sinks(objtype_sink); + if (!format_sinks) { + osync_error_set(error, OSYNC_ERROR_GENERIC, "There are no available format sinks."); + goto error_free_objtype; + } + + /* We cache the converter path for each sink/member couple */ + if (!*cachedpath) + path = osync_format_env_find_path_formats_with_detectors(formatenv, osync_change_get_data(entry_engine->change), format_sinks, osync_objtype_sink_get_preferred_format(objtype_sink), error); + else + path = osync_converter_path_ref(*cachedpath); + + if (!path) + goto error_free_objtype; + + length = osync_converter_path_num_edges(path); + converter = osync_converter_path_nth_edge(path, length - 1); + if (converter) { + OSyncObjFormat *format = osync_converter_get_targetformat(converter); + OSyncObjFormatSink *formatsink = osync_objtype_sink_find_objformat_sink(objtype_sink, format); + osync_converter_path_set_config(path, osync_objformat_sink_get_config(formatsink)); + } + + if (!osync_format_env_convert(formatenv, path, osync_change_get_data(entry_engine->change), error)) { + goto error_free_path; + } + osync_trace(TRACE_INTERNAL, "converted to format %s", osync_objformat_get_name(osync_change_get_objformat(entry_engine->change))); + + if (*cachedpath) + osync_converter_path_unref(*cachedpath); + + *cachedpath = path; + + osync_change_set_objtype(change, objtype); + g_free(objtype); + + return TRUE; + +error_free_path: + osync_converter_path_unref(path); +error_free_objtype: + g_free(objtype); +/*error:*/ + return FALSE; +} + Modified: trunk/opensync/engine/opensync_mapping_entry_engine_internals.h ============================================================================== --- trunk/opensync/engine/opensync_mapping_entry_engine_internals.h Tue Jan 6 14:31:14 2009 (r5042) +++ trunk/opensync/engine/opensync_mapping_entry_engine_internals.h Tue Jan 6 15:05:53 2009 (r5043) @@ -107,7 +107,6 @@ */ void osync_entry_engine_set_dirty(OSyncMappingEntryEngine *engine, osync_bool dirty); - /*! @brief Demerge the entry in the OSyncMappingEntryEngine * * The demerge includes storing the "entire" entry in the Archive. The demerging is done @@ -121,6 +120,25 @@ */ osync_bool osync_entry_engine_demerge(OSyncMappingEntryEngine *engine, OSyncArchive *archive, OSyncCapabilities *caps, OSyncError **error); +/*! @brief convert the entry in the OSyncMappingEntryEngine + * + * The conversion of the entry of OSyncMappingEntryEngine, uses the format + * configurations of OSyncObjTypeSink (i.e. which supported formats, preferred + * formats and format-configuration). + * + * The OSyncFormatConverterPath can be "cached" by supplied a refernce to the parameter. + * Which should be reused, since this avoids conversion-path building and detection. + * + * @param engine Pointer to an OSyncMappingEntryEngine + * @param formatenv Pointer to format environment + * @param objtype_sink Pointer to Object Type Sink which stores format configurations + * @param path Reference to OSyncFormatConverterPath to supplied or store the cache conversion path + * @param error Pointer to error struct, which get set on any error + * @returns TRUE on successful demerge, FALSE otherwise + */ + +osync_bool osync_entry_engine_convert(OSyncMappingEntryEngine *engine, OSyncFormatEnv *formatenv, OSyncObjTypeSink *objtype_sink, OSyncFormatConverterPath **path, OSyncError **error); + /*@}*/ #endif /* OPENSYNC_MAPPING_ENTRY_ENGINE_INTERNALS_H_ */ Modified: trunk/opensync/engine/opensync_obj_engine.c ============================================================================== --- trunk/opensync/engine/opensync_obj_engine.c Tue Jan 6 14:31:14 2009 (r5042) +++ trunk/opensync/engine/opensync_obj_engine.c Tue Jan 6 15:05:53 2009 (r5043) @@ -1102,6 +1102,7 @@ objtype_sink = osync_member_find_objtype_sink(member, engine->objtype); /* If sink could not be found use "data" sink if available */ + /* TODO: Get rid of hardcoded-"data". Make this indepdendent of "data" */ if (!objtype_sink) objtype_sink = osync_member_find_objtype_sink(member, "data"); /* TODO: Review if objtype_sink = NULL is valid at all. */ @@ -1137,49 +1138,9 @@ /* Convert to requested target format if the changetype is not DELETED */ if (osync_group_get_converter_enabled(osync_engine_get_group(engine->parent)) && (osync_change_get_changetype(change) != OSYNC_CHANGE_TYPE_DELETED)) { - - char *objtype = NULL; - OSyncList *format_sinks = NULL; - unsigned int length = 0; - OSyncFormatConverter *converter = NULL; - - osync_trace(TRACE_INTERNAL, "Starting to convert from objtype %s and format %s", osync_change_get_objtype(entry_engine->change), osync_objformat_get_name(osync_change_get_objformat(entry_engine->change))); - /* We have to save the objtype of the change so that it does not get - * overwritten by the conversion */ - objtype = g_strdup(osync_change_get_objtype(change)); - - /* Now we have to convert to one of the formats - * that the client can understand */ - format_sinks = osync_objtype_sink_get_objformat_sinks(objtype_sink); - if (!format_sinks) { - osync_error_set(error, OSYNC_ERROR_GENERIC, "There are no available format sinks."); - goto error; - } - - /* We cache the converter path for each sink/member couple */ - if (!path) { - path = osync_format_env_find_path_formats_with_detectors(engine->formatenv, osync_change_get_data(entry_engine->change), format_sinks, osync_objtype_sink_get_preferred_format(objtype_sink), error); - } - if (!path) + if (!osync_entry_engine_convert(entry_engine, engine->formatenv, objtype_sink, &path, error)) goto error; - length = osync_converter_path_num_edges(path); - converter = osync_converter_path_nth_edge(path, length - 1); - if (converter) { - OSyncObjFormat *format = osync_converter_get_targetformat(converter); - OSyncObjFormatSink *formatsink = osync_objtype_sink_find_objformat_sink(objtype_sink, format); - osync_converter_path_set_config(path, osync_objformat_sink_get_config(formatsink)); - } - - if (!osync_format_env_convert(engine->formatenv, path, osync_change_get_data(entry_engine->change), error)) { - osync_converter_path_unref(path); - goto error; - } - osync_trace(TRACE_INTERNAL, "converted to format %s", osync_objformat_get_name(osync_change_get_objformat(entry_engine->change))); - - - osync_change_set_objtype(change, objtype); - g_free(objtype); } osync_trace(TRACE_INTERNAL, "Writing change %s, changetype %i, format %s , objtype %s from member %lli", |