From: <dg...@su...> - 2009-01-31 17:02:02
|
Author: dgollub Date: Sat Jan 31 18:00:28 2009 New Revision: 5242 URL: http://www.opensync.org/changeset/5242 Log: Implement for OSyncMember a hashtable which stores the "alternative" objtypes. "alternative" objtypes are those objtypes which could be handled by the member with a "native" objtype, when doing mixed-objtype-syncing. Modified: trunk/opensync/group/opensync_group.c trunk/opensync/group/opensync_member.c trunk/opensync/group/opensync_member_internals.h Modified: trunk/opensync/group/opensync_group.c ============================================================================== --- trunk/opensync/group/opensync_group.c Sat Jan 31 17:57:47 2009 (r5241) +++ trunk/opensync/group/opensync_group.c Sat Jan 31 18:00:28 2009 (r5242) @@ -216,14 +216,20 @@ for (t=targetformats; t; t = t->next) { const char *targetformat_name = t->data; OSyncObjFormat *targetformat = osync_format_env_find_objformat(formatenv, targetformat_name); + OSyncObjFormat *sourceformat; + const char *source_objtype; const char *target_objtype = osync_objformat_get_objtype(targetformat); osync_assert(target_objtype); /* If targetformat is not supported, skip it */ - if (!osync_member_support_targetformat(member, formatenv, targetformat)) + sourceformat = osync_member_support_targetformat(member, formatenv, targetformat); + if (!sourceformat) continue; + source_objtype = osync_objformat_get_objtype(sourceformat); + osync_member_add_alternative_objtype(member, source_objtype, target_objtype); + /* For each objtype, add 1 to the hashtable. */ g_hash_table_replace(table, (char *)target_objtype, NULL); Modified: trunk/opensync/group/opensync_member.c ============================================================================== --- trunk/opensync/group/opensync_member.c Sat Jan 31 17:57:47 2009 (r5241) +++ trunk/opensync/group/opensync_member.c Sat Jan 31 18:00:28 2009 (r5242) @@ -142,6 +142,12 @@ goto error; member->ref_count = 1; + + member->alternative_objtype_table = g_hash_table_new_full(g_str_hash, g_str_equal, osync_free, osync_free); + if (!member->alternative_objtype_table) { + osync_error_set(error, OSYNC_ERROR_GENERIC, "No memory left"); + goto error; + } osync_trace(TRACE_EXIT, "%s: %p", __func__, member); return member; @@ -180,6 +186,9 @@ if (osync_member_get_capabilities(member)) osync_capabilities_unref(osync_member_get_capabilities(member)); + + if (member->alternative_objtype_table) + g_hash_table_destroy(member->alternative_objtype_table); osync_member_flush_objtypes(member); @@ -680,7 +689,7 @@ return list; } -osync_bool osync_member_support_targetformat(OSyncMember *member, OSyncFormatEnv *formatenv, OSyncObjFormat *targetformat) +OSyncObjFormat *osync_member_support_targetformat(OSyncMember *member, OSyncFormatEnv *formatenv, OSyncObjFormat *targetformat) { GList *o; @@ -694,11 +703,25 @@ /** TODO error handling */ if (osync_format_env_find_path(formatenv, sourceformat, targetformat, NULL)) - return TRUE; + return sourceformat; } } - return FALSE; + return NULL; +} + +const char *osync_member_get_alternative_objtype(OSyncMember *member, const char *orig_objtype) +{ + const char *alternative_objtype = NULL; + + alternative_objtype = g_hash_table_lookup(member->alternative_objtype_table, orig_objtype); + + return alternative_objtype; +} + +void osync_member_add_alternative_objtype(OSyncMember *member, const char *native_objtype, const char *alternative_objtype) +{ + g_hash_table_insert(member->alternative_objtype_table, osync_strdup(alternative_objtype), osync_strdup(native_objtype)); } OSyncList *osync_member_get_all_objformats(OSyncMember *member) Modified: trunk/opensync/group/opensync_member_internals.h ============================================================================== --- trunk/opensync/group/opensync_member_internals.h Sat Jan 31 17:57:47 2009 (r5241) +++ trunk/opensync/group/opensync_member_internals.h Sat Jan 31 18:00:28 2009 (r5242) @@ -40,6 +40,8 @@ char *name; char *pluginname; + + GHashTable *alternative_objtype_table; GList *objtypes; /* OSyncObjTypeSink */ OSyncObjTypeSink *main_sink; @@ -80,10 +82,31 @@ * @param member Pointer to member * @param formatenv Pointer to a loaded OSyncFormatEnv for conversion path building * @param targetformat The target format to test - * @returns TRUE if member supports with the given OSyncFormatEnv the targetformat, FALSE otherwise + * @returns Source OSyncObjFormat which can convert to targetformat, NULL if not supported + * + */ +OSYNC_TEST_EXPORT OSyncObjFormat *osync_member_support_targetformat(OSyncMember *member, OSyncFormatEnv *formatenv, OSyncObjFormat *targetformat); + +/** @brief Get the alternative Object Type to a provided Object Type + * + * The alternative Object Type is the Object Type which could be handled by + * this member due to format-conversion and mixed-objtype syncing. + * + * @param member Pointer to member + * @param orig_objtype The original object type to look for an alternative for + * @returns The name of the alternative object type or NULL if there is no alternative for this member + * + */ +OSYNC_TEST_EXPORT const char *osync_member_get_alternative_objtype(OSyncMember *member, const char *orig_objtype); + +/** @brief Add an alternative object type for this member + * + * @param member Pointer to member + * @param native_objtype The native object type of this member which can reprsent the alternative + * @param alternative_objtype The alternative object type t add * */ -OSYNC_TEST_EXPORT osync_bool osync_member_support_targetformat(OSyncMember *member, OSyncFormatEnv *formatenv, OSyncObjFormat *targetformat); +OSYNC_TEST_EXPORT void osync_member_add_alternative_objtype(OSyncMember *member, const char *native_objtype, const char *alternative_objtype); #ifdef OPENSYNC_UNITTESTS /** @brief Set the schemadir for configuration validation to a custom directory. |