Hi and sorry for the email barrage. Should have done some more testing before sending the first ones. Now here's a list of some test results:
1. Multisync doesn't store a copy of the devinf from the device nor request it. If the device doesn't send it (like a 7650 never does after the initial connection), then MS doesn't know e.g. what version of iCal it should send. A 7650 can only handle 1.0. The handling of devinf should probably be done by somebody more familiar with the codebase. (For testing further I modified the plugin to always send 1.0). 2. As I mentioned earlier, the 7650 only handles DESCRIPTION and not SUMMARY, whereas evo wants SUMMARY. I've added some code to sync_vtype_convert that adds a SUMMARY if none is found. A diff (ms-desc-summary.diff) against the cvs snapshot is attached. 3. Again, as mentioned, multisync assumes that changes have been successfully sent after sending them to the phone, regardless of if the phone responds with the UID mapping. So if any error occurs, the entry is lost. Who is responsible for setting entries as synched? 4. If after (3.) changes are made to those entries, MS thinks it can send a 'Replace' to the device, but can't of course send the Target/LocURI. The sync client on the phone then breaks the connection. I don't quite know how this should be fixed. Is the object marked for modification since we thought it was added? Or is it wrong to try to modify something that we don't have an ID mapping for? And would that mean that it should me multisync that changes the operation, and not the plugin? If it is correct for the plugin to do this, then the attached diff (ms-syncml-uid.diff) could be used. 5. Minor thing: the user interface that shows conflicts doesn't decode the quoted-printable text. 6. The 7650 supports recurring events, but not exclusions for them, which makes them pretty useless. I wonder if we should fake the recurrence in this case or not? Regards, Mika Raento -- Mika Raento mailto:[EMAIL PROTECTED] http://www.iki.fi/mikie/ "You can't *ADD* things and come out with *LESS* than you started with!" "I can do that! It's a free country! I've got my rights!" -from Calvin & Hobbes by Watterson
--- multisync-cvs-snapshot/src/sync_vtype.c Tue Apr 6 13:34:07 2004 +++ multisync/src/sync_vtype.c Mon Dec 13 19:10:57 2004 @@ -98,6 +98,7 @@ gboolean triggervaluedatetime = FALSE, triggerrelatedend = FALSE; gboolean ver2rrule = FALSE, ver1rrule = FALSE; gboolean addfn = FALSE; + gboolean addsummary = FALSE; gboolean addlabel = FALSE; gboolean adr = FALSE; gboolean fixlocaltime = FALSE; @@ -180,6 +181,13 @@ } else g_free(fn); } + if (!g_strcasecmp(name, "DESCRIPTION")) { + char *summary = sync_get_key_data(card, "SUMMARY"); + if (!summary) { + addsummary = TRUE; + } else + g_free(summary); + } if (!g_strcasecmp(name, "ADR")) { char *label = sync_get_key_data(card, "LABEL"); adr = TRUE; @@ -278,6 +286,7 @@ g_string_sprintfa(outcard, "DESCRIPTION:%s\r\n", descr); } else { summary = sync_get_key_data(card, "SUMMARY"); + if (!summary) summary = sync_get_key_data(card, "DESCRIPTION"); if (summary) { g_string_sprintfa(outcard, "DESCRIPTION:%s\r\n", summary); g_free(summary); @@ -598,6 +607,13 @@ } g_strfreev(data); } + if (addsummary && value) { + char* summary = sync_vtype_encode_qp(value); + g_string_append(outcard, "SUMMARY"); + g_string_sprintfa(outcard, ";ENCODING=QUOTED-PRINTABLE:%s\r\n", + summary); + g_free(summary); + } g_free(value); } @@ -605,6 +621,7 @@ if (incard) incard += 1; } + ret = outcard->str; g_string_free(outcard, FALSE); g_free(incard);
--- multisync-cvs-snapshot/plugins/syncml_plugin/src/syncml_engine.c Sat Apr 3 20:08:02 2004 +++ multisync/plugins/syncml_plugin/src/syncml_engine.c Mon Dec 13 19:54:40 2004 @@ -572,12 +572,13 @@ if (maxsizereached) return(FALSE); // We want to send, but we cannot obj->sent = TRUE; - if (obj->change.change_type == SYNC_OBJ_MODIFIED) + if (obj->change.change_type == SYNC_OBJ_MODIFIED && obj->change.uid) cmd = xmlNewChild(hdr, NULL, "Replace", NULL); - else if (obj->change.change_type == SYNC_OBJ_ADDED) + else if (obj->change.change_type == SYNC_OBJ_ADDED || ! obj->change.uid) cmd = xmlNewChild(hdr, NULL, "Add", NULL); - else if (obj->change.change_type == SYNC_OBJ_SOFTDELETED || - obj->change.change_type == SYNC_OBJ_HARDDELETED) + else if ( obj->change.uid && ( + obj->change.change_type == SYNC_OBJ_SOFTDELETED || + obj->change.change_type == SYNC_OBJ_HARDDELETED ) ) cmd = xmlNewChild(hdr, NULL, "Delete", NULL); if (cmd) { node = xmlNewChildInt(cmd, NULL, "CmdID", state->cmdid++);