From: <svn...@op...> - 2009-03-25 16:22:44
|
Author: dgollub Date: Wed Mar 25 17:22:32 2009 New Revision: 5313 URL: http://www.opensync.org/changeset/5313 Log: Fix sync_detect_obj2 and outstanding issue as described in #992 comment:16 and comment:17 fixes #992 Modified: trunk/opensync/engine/opensync_engine.c trunk/opensync/engine/opensync_engine_internals.h Modified: trunk/opensync/engine/opensync_engine.c ============================================================================== --- trunk/opensync/engine/opensync_engine.c Wed Mar 25 16:43:18 2009 (r5312) +++ trunk/opensync/engine/opensync_engine.c Wed Mar 25 17:22:32 2009 (r5313) @@ -1556,9 +1556,9 @@ return FALSE; } -unsigned int osync_engine_num_active_proxies_for_objtypes(OSyncEngine *engine, const char *objtype) +unsigned int osync_engine_num_proxies_for_objtypes(OSyncEngine *engine, const char *objtype) { - unsigned int num, i, active_proxies = 0; + unsigned int num, i, proxies = 0; osync_trace(TRACE_ENTRY, "%s(%p, %s)", __func__, engine, objtype); @@ -1567,17 +1567,44 @@ OSyncClientProxy *proxy = osync_engine_nth_proxy(engine, i); OSyncObjTypeSink *sink = osync_client_proxy_find_objtype_sink(proxy, objtype); - if (!sink) { - OSyncMember *member = osync_client_proxy_get_member(proxy); - if (!osync_member_get_alternative_objtype(member, objtype)) - continue; - } + if (!sink) + continue; - active_proxies++; + proxies++; } - osync_trace(TRACE_EXIT, "%s: %u", __func__, active_proxies); - return active_proxies; + osync_trace(TRACE_EXIT, "%s: %u", __func__, proxies); + return proxies; +} + +unsigned int osync_engine_num_proxies_for_alternative_objtypes(OSyncEngine *engine, const char *objtype) +{ + const char *alternative_objtype; + unsigned int num, i, proxies = 0; + + osync_trace(TRACE_ENTRY, "%s(%p, %s)", __func__, engine, objtype); + + num = osync_engine_num_proxies(engine); + for (i = 0; i < num; i++) { + OSyncClientProxy *proxy = osync_engine_nth_proxy(engine, i); + OSyncMember *member = osync_client_proxy_get_member(proxy); + OSyncObjTypeSink *sink = osync_client_proxy_find_objtype_sink(proxy, objtype); + + if (sink) + continue; + + /* Don't count alternative_objtype of the member if this alternative_objtype has + * is already in a (potential) sink pair/objengine. + */ + if (!(alternative_objtype = osync_member_get_alternative_objtype(member, objtype)) + || osync_engine_num_proxies_for_objtypes(engine, alternative_objtype) > 1) + continue; + + proxies++; + } + + osync_trace(TRACE_EXIT, "%s: %u", __func__, proxies); + return proxies; } osync_bool osync_engine_initialize(OSyncEngine *engine, OSyncError **error) @@ -1643,8 +1670,6 @@ const char *objtype = o->data; OSyncObjEngine *objengine = NULL; - osync_trace(TRACE_INTERNAL, "ObjType: %s", objtype); - /* Respect if the object type is disabled */ if (!osync_group_objtype_enabled(engine->group, objtype)) continue; @@ -1652,9 +1677,12 @@ /* Check if there are at least two proxies with native objtype * and alternative-objtypes to sync this objtype */ - if (osync_engine_num_active_proxies_for_objtypes(engine, objtype) < 2) + if (osync_engine_num_proxies_for_alternative_objtypes(engine, objtype) + + osync_engine_num_proxies_for_objtypes(engine, objtype) < 2) continue; + osync_trace(TRACE_INTERNAL, "Activating ObjType: %s", objtype); + objengine = osync_obj_engine_new(engine, objtype, engine->formatenv, error); if (!objengine) goto error_finalize; Modified: trunk/opensync/engine/opensync_engine_internals.h ============================================================================== --- trunk/opensync/engine/opensync_engine_internals.h Wed Mar 25 16:43:18 2009 (r5312) +++ trunk/opensync/engine/opensync_engine_internals.h Wed Mar 25 17:22:32 2009 (r5313) @@ -144,6 +144,28 @@ */ osync_bool osync_engine_slowsync_for_mixed_objengines(OSyncEngine *engine, OSyncError **error); +/** @brief Returns the number of proxies which support natively the specific ObjType + * + * @param engine Pointer to engine + * @param objtype The name of the ObjType + * @returns Number of proxies which support the supplied objtype natively. + * + */ +unsigned int osync_engine_num_proxies_for_objtypes(OSyncEngine *engine, const char *objtype); + + +/** @brief Returns the number of proxies which support an ObjType indirect via an alternative + * ObjType + * + * This function is useful to setup sinks for mixed-objtype synchronization + * + * @param engine Pointer to engine + * @param objtype The name of the ObjType + * @returns Number of proxies which support the supplied objtype via an alternative ObjType (mixed objtype syncing) + * + */ +unsigned int osync_engine_num_proxies_for_alternative_objtypes(OSyncEngine *engine, const char *objtype); + /*@}*/ #endif /*OPENSYNC_ENGINE_INTERNALS_H_*/ |