Index: mock-plugin/mock_format.c
===================================================================
--- mock-plugin/mock_format.c	(révision 6033)
+++ mock-plugin/mock_format.c	(copie de travail)
@@ -102,7 +102,7 @@
 	osync_assert(file);
 
 	file->path = osync_rand_str(g_random_int_range(1, 100), error);
-	osync_assert(error == NULL);
+	osync_assert(*error == NULL);
 	
 	file->data = input;
 	file->size = inpsize - 1;
@@ -112,6 +112,56 @@
 	return TRUE;
 }
 
+static osync_bool conv_mockformat1a_to_mockformat1(char *input, unsigned int inpsize, char **output, unsigned int *outpsize, osync_bool *free_input, const char *config, void *userdata, OSyncError **error)
+{
+	osync_trace(TRACE_INTERNAL, "Converting fileA to file");
+	
+	*free_input = FALSE;
+	OSyncFileFormat *fileA = (OSyncFileFormat *)input;
+	OSyncFileFormat *file = osync_try_malloc0(sizeof(OSyncFileFormat), error);
+	osync_assert(file);
+
+	char *filedata = osync_try_malloc0(fileA->size - 2, error);
+	memcpy(filedata, fileA->data, fileA->size - 2);
+
+	file->path = fileA->path;
+	osync_assert(*error == NULL);
+	
+	file->data = filedata;
+	file->size = fileA->size - 2;
+
+	*output = (char *)file;
+	*outpsize = sizeof(OSyncFileFormat);
+	return TRUE;
+}
+
+static osync_bool conv_mockformat1_to_mockformat1a(char *input, unsigned int inpsize, char **output, unsigned int *outpsize, osync_bool *free_input, const char *config, void *userdata, OSyncError **error)
+{
+	osync_trace(TRACE_INTERNAL, "Converting file to fileA");
+	
+	*free_input = FALSE;
+	char *identifier = " ";
+
+	OSyncFileFormat *file = (OSyncFileFormat *)input;
+	OSyncFileFormat *fileA = osync_try_malloc0(sizeof(OSyncFileFormat), error);
+	osync_assert(fileA);
+
+	char *filedata = osync_try_malloc0(file->size + 2, error);
+	memcpy(filedata, file->data, file->size);
+	memcpy(filedata + file->size, identifier , 2);
+
+	fileA->path = file->path;
+	osync_assert(*error == NULL);
+	
+	fileA->data = filedata;
+	fileA->size = file->size + 2;
+	
+	*output = (char *)fileA;
+	*outpsize = sizeof(OSyncFileFormat);
+
+	return TRUE;
+}
+
 static osync_bool destroy_file(char *input, unsigned int inpsize, void *user_data, OSyncError **error)
 {
 	OSyncFileFormat *file = (OSyncFileFormat *)input;
@@ -211,7 +261,7 @@
 	osync_trace(TRACE_ENTRY, "%s(%p, %i, %p, %p)", __func__, input, inpsize, marshal, error);
 	
 	OSyncFileFormat *file = (OSyncFileFormat *)input;
-	
+
 	if (!osync_marshal_write_string(marshal, file->path, error))
 		goto error;
 	if (!osync_marshal_write_buffer(marshal, file->data, file->size, error))
@@ -296,6 +346,15 @@
 	osync_assert(osync_format_env_register_objformat(env, format, error));
 	osync_objformat_unref(format);
 
+	/* mockformat1a */
+	format = osync_objformat_new("mockformat1a", "mockobjtype1", error);
+	osync_assert(format);
+
+	_format_set_functions(format);
+
+	osync_assert(osync_format_env_register_objformat(env, format, error));
+	osync_objformat_unref(format);
+
 	return TRUE;
 }
 
@@ -310,6 +369,9 @@
 	OSyncObjFormat *mockformat2 = osync_format_env_find_objformat(env, "mockformat2");
 	osync_assert(mockformat2);
 	
+	OSyncObjFormat *mockformat1a = osync_format_env_find_objformat(env, "mockformat1a");
+	osync_assert(mockformat1a);
+	
 	conv = osync_converter_new(OSYNC_CONVERTER_ENCAP, mockformat1, mockformat2, conv_mockformat1_to_mockformat2, error);
 	osync_assert(conv);
 	
@@ -322,6 +384,17 @@
 	osync_format_env_register_converter(env, conv, error);
 	osync_converter_unref(conv);
 
+	conv = osync_converter_new(OSYNC_CONVERTER_ENCAP, mockformat1, mockformat1a, conv_mockformat1_to_mockformat1a, error);
+	osync_assert(conv);
+	
+	osync_format_env_register_converter(env, conv, error);
+	osync_converter_unref(conv);
+	
+	conv = osync_converter_new(OSYNC_CONVERTER_DECAP, mockformat1a, mockformat1, conv_mockformat1a_to_mockformat1, error);
+	osync_assert(conv);
+	
+	osync_format_env_register_converter(env, conv, error);
+	osync_converter_unref(conv);
 
 	return TRUE;
 }
Index: data/multisync_multiformats/configs/group/1/mock-sync.conf
===================================================================
--- data/multisync_multiformats/configs/group/1/mock-sync.conf	(révision 0)
+++ data/multisync_multiformats/configs/group/1/mock-sync.conf	(révision 0)
@@ -0,0 +1,15 @@
+<?xml version="1.0"?>
+<config version="1.0">
+  <Resources>
+    <Resource>
+     <Enabled>1</Enabled>
+     <Formats>
+       <Format>
+         <Name>mockformat1</Name>
+       </Format>
+     </Formats>
+     <ObjType>mockobjtype1</ObjType>
+     <Path>data1</Path>
+    </Resource>
+  </Resources>
+</config>
Index: data/multisync_multiformats/configs/group/1/syncmember.conf
===================================================================
--- data/multisync_multiformats/configs/group/1/syncmember.conf	(révision 0)
+++ data/multisync_multiformats/configs/group/1/syncmember.conf	(révision 0)
@@ -0,0 +1,15 @@
+<?xml version="1.0"?>
+<syncmember version="1.0">
+  <pluginname>mock-sync</pluginname>
+  <objtype>
+    <name>mockobjtype1</name>
+      <enabled>1</enabled>
+      <read>1</read>
+      <getchanges>1</getchanges>
+      <write>1</write>
+      <objformat>
+	<name>mockformat1</name>
+	<config/>
+      </objformat>
+  </objtype>
+</syncmember>
Index: data/multisync_multiformats/configs/group/2/mock-sync.conf
===================================================================
--- data/multisync_multiformats/configs/group/2/mock-sync.conf	(révision 0)
+++ data/multisync_multiformats/configs/group/2/mock-sync.conf	(révision 0)
@@ -0,0 +1,15 @@
+<?xml version="1.0"?>
+<config version="1.0">
+  <Resources>
+    <Resource>
+     <Enabled>1</Enabled>
+     <Formats>
+       <Format>
+         <Name>mockformat1a</Name>
+       </Format>
+     </Formats>
+     <ObjType>mockobjtype1</ObjType>
+     <Path>data2</Path>
+    </Resource>
+  </Resources>
+</config>
Index: data/multisync_multiformats/configs/group/2/syncmember.conf
===================================================================
--- data/multisync_multiformats/configs/group/2/syncmember.conf	(révision 0)
+++ data/multisync_multiformats/configs/group/2/syncmember.conf	(révision 0)
@@ -0,0 +1,15 @@
+<?xml version="1.0"?>
+<syncmember version="1.0">
+  <pluginname>mock-sync</pluginname>
+  <objtype>
+    <name>mockobjtype1</name>
+      <enabled>1</enabled>
+      <read>1</read>
+      <getchanges>1</getchanges>
+      <write>1</write>
+      <objformat>
+	<name>mockformat1a</name>
+	<config/>
+      </objformat>
+  </objtype>
+</syncmember>
Index: data/multisync_multiformats/configs/group/3/mock-sync.conf
===================================================================
--- data/multisync_multiformats/configs/group/3/mock-sync.conf	(révision 0)
+++ data/multisync_multiformats/configs/group/3/mock-sync.conf	(révision 0)
@@ -0,0 +1,15 @@
+<?xml version="1.0"?>
+<config version="1.0">
+  <Resources>
+    <Resource>
+     <Enabled>1</Enabled>
+     <Formats>
+       <Format>
+         <Name>mockformat1a</Name>
+       </Format>
+     </Formats>
+     <ObjType>mockobjtype1</ObjType>
+     <Path>data3</Path>
+    </Resource>
+  </Resources>
+</config>
Index: data/multisync_multiformats/configs/group/3/syncmember.conf
===================================================================
--- data/multisync_multiformats/configs/group/3/syncmember.conf	(révision 0)
+++ data/multisync_multiformats/configs/group/3/syncmember.conf	(révision 0)
@@ -0,0 +1,15 @@
+<?xml version="1.0"?>
+<syncmember version="1.0">
+  <pluginname>mock-sync</pluginname>
+  <objtype>
+    <name>mockobjtype1</name>
+      <enabled>1</enabled>
+      <read>1</read>
+      <getchanges>1</getchanges>
+      <write>1</write>
+      <objformat>
+	<name>mockformat1a</name>
+	<config />
+      </objformat>
+  </objtype>
+</syncmember>
Index: data/multisync_multiformats/configs/group/4/mock-sync.conf
===================================================================
--- data/multisync_multiformats/configs/group/4/mock-sync.conf	(révision 0)
+++ data/multisync_multiformats/configs/group/4/mock-sync.conf	(révision 0)
@@ -0,0 +1,15 @@
+<?xml version="1.0"?>
+<config version="1.0">
+  <Resources>
+    <Resource>
+     <Enabled>1</Enabled>
+     <Formats>
+       <Format>
+         <Name>mockformat1</Name>
+       </Format>
+     </Formats>
+     <ObjType>mockobjtype1</ObjType>
+     <Path>data4</Path>
+    </Resource>
+  </Resources>
+</config>
Index: data/multisync_multiformats/configs/group/4/syncmember.conf
===================================================================
--- data/multisync_multiformats/configs/group/4/syncmember.conf	(révision 0)
+++ data/multisync_multiformats/configs/group/4/syncmember.conf	(révision 0)
@@ -0,0 +1,15 @@
+<?xml version="1.0"?>
+<syncmember version="1.0">
+  <pluginname>mock-sync</pluginname>
+  <objtype>
+    <name>mockobjtype1</name>
+      <enabled>1</enabled>
+      <read>1</read>
+      <getchanges>1</getchanges>
+      <write>1</write>
+      <objformat>
+	<name>mockformat1</name>
+	<config/>
+      </objformat>
+  </objtype>
+</syncmember>
Index: data/multisync_multiformats/configs/group/syncgroup.conf
===================================================================
--- data/multisync_multiformats/configs/group/syncgroup.conf	(révision 0)
+++ data/multisync_multiformats/configs/group/syncgroup.conf	(révision 0)
@@ -0,0 +1,2 @@
+<?xml version="1.0"?>
+<syncgroup><groupname>test</groupname></syncgroup>
Index: data/multisync_multiformats/data1/testdata_to_sync
===================================================================
Impossible d'afficher : fichier considéré comme binaire.
svn:mime-type = application/octet-stream

Modification de propriétés sur data/multisync_multiformats/data1/testdata_to_sync
___________________________________________________________________
Ajouté : svn:mime-type
   + application/octet-stream

Index: data/multisync_multiformats/data1/testdata
===================================================================
Impossible d'afficher : fichier considéré comme binaire.
svn:mime-type = application/octet-stream

Modification de propriétés sur data/multisync_multiformats/data1/testdata
___________________________________________________________________
Ajouté : svn:mime-type
   + application/octet-stream

Index: data/multisync_multiformats/data2/testdata
===================================================================
Impossible d'afficher : fichier considéré comme binaire.
svn:mime-type = application/octet-stream

Modification de propriétés sur data/multisync_multiformats/data2/testdata
___________________________________________________________________
Ajouté : svn:mime-type
   + application/octet-stream

Index: data/multisync_multiformats/data3/testdata
===================================================================
Impossible d'afficher : fichier considéré comme binaire.
svn:mime-type = application/octet-stream

Modification de propriétés sur data/multisync_multiformats/data3/testdata
___________________________________________________________________
Ajouté : svn:mime-type
   + application/octet-stream

Index: sync-tests/check_multisync.c
===================================================================
--- sync-tests/check_multisync.c	(révision 6033)
+++ sync-tests/check_multisync.c	(copie de travail)
@@ -471,6 +471,47 @@
 	osync_engine_unref(engine);
 }
 
+/* Synchronize slow sync with two same data .
+It ends up with two entry_engines pointing to the same change.
+Which could lead to double conversion of the change pointed to.
+This also lead to wrong conversion path cached if this shared change
+appears first. This is the latter that I use to detect the bug.
+*/
+START_TEST (multisync_easy_same)
+{
+	char *testbed = setup_testbed("multisync_multiformats");
+	OSyncError *error = NULL;
+	OSyncEngine *engine = setup_engine(testbed);
+	fail_unless(osync_engine_initialize(engine, &error), NULL);
+	fail_unless(error == NULL, NULL);
+
+	osync_testing_system_abort("cp data1/testdata data4/");
+
+	mark_point();
+
+	synchronize_once(engine, NULL);
+
+	fail_unless(num_change_read == 5, NULL);
+	fail_unless(num_change_written == 3, NULL);
+	fail_unless(num_change_error == 0, NULL);
+
+	fail_unless(num_mapping_conflicts == 0, NULL);
+
+	fail_unless(num_engine_connected == 1, NULL);
+	fail_unless(num_engine_read == 1, NULL);
+	fail_unless(num_engine_written == 1, NULL);
+	fail_unless(num_engine_disconnected == 1, NULL);
+	fail_unless(num_engine_end_conflicts = 1, NULL);
+		
+	fail_unless(osync_testing_diff("data1", "data4"));
+	fail_unless(osync_testing_diff("data2", "data3"));
+
+	destroy_engine(engine);
+
+	destroy_testbed(testbed);
+}
+END_TEST
+
 /* Sync the single item testdata from data 1 to data2 and data3
  * then change testdata in data3 */
 START_TEST (multisync_easy_mod)
@@ -1968,6 +2009,8 @@
 OSYNC_TESTCASE_ADD(multisync_dual_new)
 OSYNC_TESTCASE_ADD(multisync_triple_new)
 
+OSYNC_TESTCASE_ADD(multisync_easy_same)
+
 OSYNC_TESTCASE_ADD(multisync_easy_mod)
 OSYNC_TESTCASE_ADD(multisync_dual_mod)
 OSYNC_TESTCASE_ADD(multisync_triple_mod)
Index: CMakeLists.txt
===================================================================
--- CMakeLists.txt	(révision 6033)
+++ CMakeLists.txt	(copie de travail)
@@ -296,6 +296,7 @@
 OSYNC_TESTCASE( multisync multisync_easy_new)
 OSYNC_TESTCASE( multisync multisync_dual_new)
 OSYNC_TESTCASE( multisync multisync_triple_new)
+OSYNC_TESTCASE( multisync multisync_easy_same)
 OSYNC_TESTCASE( multisync multisync_easy_mod)
 OSYNC_TESTCASE( multisync multisync_dual_mod)
 OSYNC_TESTCASE( multisync multisync_triple_mod)

