From: <svn...@op...> - 2009-09-04 20:06:45
|
Author: dgollub Date: Fri Sep 4 22:06:31 2009 New Revision: 5740 URL: http://www.opensync.org/changeset/5740 Log: - initial OSyncMerger implement of drafted API - added support for Child-Capability fields in OSyncCapability API Modified: trunk/misc/schemas/capabilities.xsd trunk/opensync/capabilities/opensync_capability.c trunk/opensync/capabilities/opensync_capability.h trunk/opensync/capabilities/opensync_capability_internals.h trunk/opensync/capabilities/opensync_capability_private.h trunk/opensync/format/opensync_format_env.c trunk/opensync/format/opensync_format_env_internals.h trunk/opensync/format/opensync_merger.c trunk/opensync/format/opensync_merger.h trunk/opensync/format/opensync_merger_private.h trunk/opensync/opensync-format.h trunk/tests/capabilities-tests/check_capabilities.c Modified: trunk/misc/schemas/capabilities.xsd ============================================================================== --- trunk/misc/schemas/capabilities.xsd Fri Sep 4 15:10:21 2009 (r5739) +++ trunk/misc/schemas/capabilities.xsd Fri Sep 4 22:06:31 2009 (r5740) @@ -20,6 +20,7 @@ <xsd:complexType name="Cap"> <xsd:sequence> + <xsd:element maxOccurs="unbounded" minOccurs="0" name="Cap" type="Cap" /> <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" /> Modified: trunk/opensync/capabilities/opensync_capability.c ============================================================================== --- trunk/opensync/capabilities/opensync_capability.c Fri Sep 4 15:10:21 2009 (r5739) +++ trunk/opensync/capabilities/opensync_capability.c Fri Sep 4 22:06:31 2009 (r5740) @@ -35,26 +35,43 @@ return strcmp(osync_capability_get_name(*(OSyncCapability **)capability1), osync_capability_get_name(*(OSyncCapability **)capability2)); } -OSyncCapability *osync_capability_parse(OSyncCapabilitiesObjType *capabilitiesobjtype, xmlNodePtr node, OSyncError **error) + +OSyncCapability *osync_capability_parse_child(OSyncCapability *cap, xmlNodePtr node, OSyncError **error) { xmlNode *cur; - OSyncCapability *cap = NULL; - osync_assert(capabilitiesobjtype); + osync_assert(cap); osync_assert(node); cur = node; - cap = osync_capability_new(capabilitiesobjtype, error); - if (!cap) - goto error; + if (cur) + printf("%s: %s\n", __func__, cur->name); + else + printf("%s:\n", __func__); cur = cur->children; for (; cur != NULL; cur = cur->next) { char *str = NULL; + if (cur->name) + printf("-> %s\n", cur->name); + else + printf("-> NIX\n"); + if (cur->type != XML_ELEMENT_NODE) continue; + if (!xmlStrcmp(cur->name, BAD_CAST "Cap")) { + OSyncCapability *child = osync_capability_new_child(cap, error); + if (!child) + goto error; + + osync_capability_parse_child(child, cur, error); + + continue; + } + + str = (char*)xmlNodeGetContent(cur); if (!str) continue; @@ -76,6 +93,7 @@ else if (!xmlStrcmp(cur->name, BAD_CAST "ValEnum")) osync_list_prepend(cap->valenum, osync_strdup(str)); + osync_xml_free(str); } @@ -86,6 +104,26 @@ return NULL; } + +OSyncCapability *osync_capability_parse(OSyncCapabilitiesObjType *capabilitiesobjtype, xmlNodePtr node, OSyncError **error) +{ + OSyncCapability *cap = NULL; + osync_assert(capabilitiesobjtype); + osync_assert(node); + + cap = osync_capability_new(capabilitiesobjtype, error); + if (!cap) + goto error; + + if (!osync_capability_parse_child(cap, node, error)) + goto error; + + return cap; + +error: + return NULL; +} + osync_bool osync_capability_assemble(OSyncCapability *cap, xmlNodePtr node, OSyncError **error) { char *tmp; @@ -151,27 +189,50 @@ goto error_oom; } + /* Cap */ + for (l = cap->childs; l; l = l->next) { + if (!osync_capability_assemble(l->data, cur, error)) + goto error; + + } + return TRUE; error_oom: osync_error_set(error, OSYNC_ERROR_GENERIC, "No memory left to assemble capability."); -/* + error: -*/ osync_trace(TRACE_EXIT_ERROR, "%s: %s" , __func__, osync_error_print(error)); return FALSE; } -OSyncCapability *osync_capability_new(OSyncCapabilitiesObjType *capobjtype, OSyncError **error) +OSyncCapability *osync_capability_new_internal(OSyncError **error) { OSyncCapability *capability = NULL; - osync_trace(TRACE_ENTRY, "%s(%p, %p)", __func__, capobjtype, error); - osync_assert(capobjtype); + osync_trace(TRACE_ENTRY, "%s(%p)", __func__, error); capability = osync_try_malloc0(sizeof(OSyncCapability), error); if(!capability) goto error; + osync_trace(TRACE_EXIT, "%s: %p", __func__, capability); + return capability; + +error: + osync_trace(TRACE_EXIT_ERROR, "%s: %s" , __func__, osync_error_print(error)); + return NULL; + +} + +OSyncCapability *osync_capability_new(OSyncCapabilitiesObjType *capobjtype, OSyncError **error) +{ + OSyncCapability *capability = NULL; + osync_trace(TRACE_ENTRY, "%s(%p, %p)", __func__, capobjtype, error); + + capability = osync_capability_new_internal(error); + if (!capability) + goto error; + osync_capabilities_objtype_add_capability(capobjtype, capability); osync_trace(TRACE_EXIT, "%s: %p", __func__, capability); @@ -183,6 +244,27 @@ } +OSyncCapability *osync_capability_new_child(OSyncCapability *parent, OSyncError **error) +{ + OSyncCapability *capability = NULL; + osync_trace(TRACE_ENTRY, "%s(%p, %p)", __func__, parent, error); + osync_assert(parent); + + capability = osync_capability_new_internal(error); + if(!capability) + goto error; + + osync_capability_add_child(parent, capability); + + osync_trace(TRACE_EXIT, "%s: %p", __func__, capability); + return capability; + +error: + osync_trace(TRACE_EXIT_ERROR, "%s: %s" , __func__, osync_error_print(error)); + return NULL; + +} + OSyncCapability *osync_capability_ref(OSyncCapability *capability) { osync_assert(capability); @@ -320,6 +402,21 @@ return capability->valenum; } +OSyncList *osync_capability_get_childs(OSyncCapability *capability) +{ + osync_assert(capability); + + return capability->childs; +} + +void osync_capability_add_child(OSyncCapability *capability, OSyncCapability *child) +{ + osync_assert(capability); + osync_assert(child); + + capability->childs = osync_list_append(capability->childs, child); +} + OSyncCapabilityParameter *osync_capability_parameter_new(OSyncError **error) { OSyncCapabilityParameter *capparam; Modified: trunk/opensync/capabilities/opensync_capability.h ============================================================================== --- trunk/opensync/capabilities/opensync_capability.h Fri Sep 4 15:10:21 2009 (r5739) +++ trunk/opensync/capabilities/opensync_capability.h Fri Sep 4 22:06:31 2009 (r5740) @@ -179,6 +179,11 @@ */ OSYNC_EXPORT OSyncList *osync_capability_get_valenums(OSyncCapability *capability); /* const char* list */ +/** TODO Doxygen */ +OSYNC_EXPORT OSyncList *osync_capability_get_childs(OSyncCapability *capability); /* OSyncCapability* list */ +OSYNC_EXPORT void osync_capability_add_child(OSyncCapability *capability, OSyncCapability *child); +OSYNC_EXPORT OSyncCapability *osync_capability_new_child(OSyncCapability *parent, OSyncError **error); + /*@}*/ #endif /*OPENSYNC_CAPABILITY_H_*/ Modified: trunk/opensync/capabilities/opensync_capability_internals.h ============================================================================== --- trunk/opensync/capabilities/opensync_capability_internals.h Fri Sep 4 15:10:21 2009 (r5739) +++ trunk/opensync/capabilities/opensync_capability_internals.h Fri Sep 4 22:06:31 2009 (r5740) @@ -44,6 +44,7 @@ /* TODO - Doxygen */ osync_bool osync_capability_assemble(OSyncCapability *cap, xmlNodePtr node, OSyncError **error); +OSyncCapability *osync_capability_parse_child(OSyncCapability *cap, xmlNodePtr node, OSyncError **error); /** * @brief Frees a capability object @@ -58,6 +59,8 @@ */ int osync_capability_compare_stdlib(const void *capability1, const void *capability2); + + /*@}*/ #endif /*OPENSYNC_CAPABILITY_INTERNALS_H_*/ Modified: trunk/opensync/capabilities/opensync_capability_private.h ============================================================================== --- trunk/opensync/capabilities/opensync_capability_private.h Fri Sep 4 15:10:21 2009 (r5739) +++ trunk/opensync/capabilities/opensync_capability_private.h Fri Sep 4 22:06:31 2009 (r5740) @@ -56,6 +56,10 @@ /** Value */ char *value; + /** Childs */ + OSyncList *childs; /* OSYncCapability * list */ + + /** Reference counting */ int ref_count; }; Modified: trunk/opensync/format/opensync_format_env.c ============================================================================== --- trunk/opensync/format/opensync_format_env.c Fri Sep 4 15:10:21 2009 (r5739) +++ trunk/opensync/format/opensync_format_env.c Fri Sep 4 22:06:31 2009 (r5740) @@ -34,8 +34,6 @@ #include "opensync_converter_internals.h" - - static osync_bool osync_format_env_load_modules(OSyncFormatEnv *env, const char *path, osync_bool must_exist, OSyncError **error) { GDir *dir = NULL; @@ -955,6 +953,16 @@ return osync_list_nth_data(env->custom_filters, nth); } + +void osync_format_env_register_merger(OSyncFormatEnv *env, OSyncMerger *merger) +{ + osync_assert(env); + osync_assert(merger); + + env->mergers = osync_list_append(env->mergers, merger); + osync_merger_ref(merger); +} + OSyncObjFormat *osync_format_env_detect_objformat(OSyncFormatEnv *env, OSyncData *data) { OSyncList *d = NULL; Modified: trunk/opensync/format/opensync_format_env_internals.h ============================================================================== --- trunk/opensync/format/opensync_format_env_internals.h Fri Sep 4 15:10:21 2009 (r5739) +++ trunk/opensync/format/opensync_format_env_internals.h Fri Sep 4 22:06:31 2009 (r5740) @@ -46,6 +46,8 @@ OSyncList *converters; /** A list of filter functions */ OSyncList *custom_filters; + /** A list of mergers (OSyncMergers *) */ + OSyncList *mergers; OSyncList *modules; GModule *current_module; Modified: trunk/opensync/format/opensync_merger.c ============================================================================== --- trunk/opensync/format/opensync_merger.c Fri Sep 4 15:10:21 2009 (r5739) +++ trunk/opensync/format/opensync_merger.c Fri Sep 4 22:06:31 2009 (r5740) @@ -79,3 +79,15 @@ osync_return_if_fail(merger); merger->finalize_func = finalize_func; } + +void osync_merger_set_merge_func(OSyncMerger *merger, OSyncMergerMergeFunc merge_func) +{ + osync_return_if_fail(merger); + merger->merge_func = merge_func; +} + +void osync_merger_set_demerge_func(OSyncMerger *merger, OSyncMergerDemergeFunc demerge_func) +{ + osync_return_if_fail(merger); + merger->demerge_func = demerge_func; +} Modified: trunk/opensync/format/opensync_merger.h ============================================================================== --- trunk/opensync/format/opensync_merger.h Fri Sep 4 15:10:21 2009 (r5739) +++ trunk/opensync/format/opensync_merger.h Fri Sep 4 22:06:31 2009 (r5740) @@ -32,16 +32,20 @@ typedef void * (* OSyncMergerInitializeFunc) (OSyncError **error); typedef void (* OSyncMergerFinalizeFunc) (void *user_data); +typedef osync_bool (* OSyncMergerMergeFunc) (char **buf, unsigned int *size, const char *entirebuf, unsigned int entiresize, OSyncCapabilities *caps, void *userdata, OSyncError **error); +typedef osync_bool (* OSyncMergerDemergeFunc) (char **buf, unsigned int *size, OSyncCapabilities *caps, void *userdata, OSyncError **error); + OSYNC_EXPORT OSyncMerger *osync_merger_new(const char *objformat, const char *capsformat, OSyncError **error); OSYNC_EXPORT OSyncMerger *osync_merger_ref(OSyncMerger *merger); - OSYNC_EXPORT void osync_merger_unref(OSyncMerger *merger); OSYNC_EXPORT void osync_merger_set_initialize_func(OSyncMerger *merger, OSyncMergerInitializeFunc initialize_func); - OSYNC_EXPORT void osync_merger_set_finalize_func(OSyncMerger *merger, OSyncMergerFinalizeFunc finalize_func); +OSYNC_EXPORT void osync_merger_set_merge_func(OSyncMerger *merger, OSyncMergerMergeFunc merge_func); +OSYNC_EXPORT void osync_merger_set_demerge_func(OSyncMerger *merger, OSyncMergerDemergeFunc demerge_func); + /*@}*/ #endif /* OPENSYNC_MERGER_H_ */ Modified: trunk/opensync/format/opensync_merger_private.h ============================================================================== --- trunk/opensync/format/opensync_merger_private.h Fri Sep 4 15:10:21 2009 (r5739) +++ trunk/opensync/format/opensync_merger_private.h Fri Sep 4 22:06:31 2009 (r5740) @@ -35,6 +35,8 @@ int ref_count; OSyncMergerInitializeFunc initialize_func; OSyncMergerFinalizeFunc finalize_func; + OSyncMergerMergeFunc merge_func; + OSyncMergerDemergeFunc demerge_func; void *user_data; }; Modified: trunk/opensync/opensync-format.h ============================================================================== --- trunk/opensync/opensync-format.h Fri Sep 4 15:10:21 2009 (r5739) +++ trunk/opensync/opensync-format.h Fri Sep 4 22:06:31 2009 (r5740) @@ -27,6 +27,7 @@ #include "format/opensync_format_env.h" #include "format/opensync_objformat.h" #include "format/opensync_objformat_sink.h" +#include "format/opensync_merger.h" OPENSYNC_END_DECLS Modified: trunk/tests/capabilities-tests/check_capabilities.c ============================================================================== --- trunk/tests/capabilities-tests/check_capabilities.c Fri Sep 4 15:10:21 2009 (r5739) +++ trunk/tests/capabilities-tests/check_capabilities.c Fri Sep 4 22:06:31 2009 (r5740) @@ -85,6 +85,13 @@ osync_capability_set_name(capability, "capmock3"); + /** capmock4 as child */ + capability = osync_capability_new_child(capability, &error); + fail_unless(capability != NULL, NULL); + fail_unless(error == NULL, NULL); + + osync_capability_set_name(capability, "capmock4"); + fail_unless(osync_capabilities_save(capabilities, dummy_caps_file, &error) != FALSE, NULL); fail_unless(error == NULL, NULL); @@ -115,6 +122,12 @@ cap = osync_list_nth_data(c, 2); fail_unless(cap != NULL, NULL); fail_unless(!strcmp(osync_capability_get_name(cap), "capmock3"), NULL); + + /** capmock4, as child */ + cap = osync_list_nth_data(osync_capability_get_childs(cap), 0); + fail_unless(cap != NULL, NULL); + fail_unless(!strcmp(osync_capability_get_name(cap), "capmock4"), NULL); + osync_capabilities_unref(capabilities); |