Hi, all:

  I am using multisync with my Clie, T68 and Evolution in chinese
  environment (Debian-sarge), it's just what I am seeking for,
  but seems that multisync did not deal chinese characters well,
  after dig into the source code (thanks to GPL), I made two fixes
  to resolve problems:

1. If properties of key contains charset specification, like
'N;CHARSET=UTF-7:+...", then remove this property and convert its value to UTF-8, 
because Evolution can process UTF-8 properly even if no charset specified

2. Because UTF-8 use all 8 bits of byte, so escape (in palm plugin) is needn't
after convert to UTF-8 or will corrupt the character encoding

here is my patch:

diff -ur multisync-0.82.orig/src/sync_vtype.c multisync-0.82/src/sync_vtype.c
--- multisync-0.82.orig/src/sync_vtype.c        2004-04-13 05:03:29.000000000 +0800
+++ multisync-0.82/src/sync_vtype.c     2004-07-07 22:44:28.000000000 +0800
@@ -61,6 +61,46 @@
   VTYPE_VCARD = 0xc
 } vtype_type;
 
+// convert charset of value from which specified in properties
+static void
+convert_charset (char* line, unsigned char** value, const char* charset)
+{ 
+  while (line = strchr (line, ';')) {
+    const char* key = "CHARSET=";
+    char org_charset[64];
+    int len;
+    iconv_t ic;
+
+    line++; // skip the ';' character
+
+    if ((strlen (line) <= strlen (key))
+       || g_strncasecmp (line, key, sizeof (key)))
+    // key not found
+      continue;
+
+    org_charset[0] = 0;
+    len = strcspn (line + strlen (key), ";: \r\n");
+    if (len >= sizeof (org_charset))
+      len = sizeof (org_charset) - 1;
+    strncat (org_charset, line + strlen (key), len);
+
+    ic = iconv_open (charset, org_charset);
+    if (ic >= 0) {
+      char *utfvalue = g_malloc0(65536);
+      size_t inbytes = strlen(*value);
+      size_t outbytes = 65536;
+      char *inbuf = *value, *outbuf = utfvalue;
+
+      iconv(ic, &inbuf, &inbytes, &outbuf, &outbytes);
+      g_free(*value);
+      *value = utfvalue;
+      iconv_close(ic);
+    }
+
+    break;
+  } // while every ';' character
+}
+
 // Parse and correct a number of errors in the VCARD/VTODO data
 // The "opts" parameter decides which errors/features that should be corrected
 char* sync_vtype_convert(char *card, sync_voption opts, char* charset) {
@@ -74,6 +114,7 @@
   gboolean output = TRUE; // If feedthrough output is enabled
   vtype_type datatype = VTYPE_UNKNOWN;
 
   outcard = g_string_new("");
   while (incard) {
     char* endln;
@@ -136,6 +177,7 @@
        value = tmp;
       }
       qp = FALSE; // Do a proper QP detection
+      convert_charset (line, &value, "UTF-8");
       if (endent)
        endent[0] = 0;
       strncpy(name, line, 255);
@@ -312,7 +354,10 @@
              !g_strcasecmp(propdata, "END"))
            triggerrelatedend = TRUE;
          if (!g_strcasecmp(propname, "CHARSET"))
+         {
            strncpy(linecharset, propdata, 255);
+           outputprop = FALSE; // value has been converted to UTF-8
+         }
          if (adr && 
              (!g_strcasecmp(propname, "HOME") || 
              !g_strcasecmp(propname, "WORK"))) {
@@ -362,7 +407,7 @@
        value = sync_vtype_decode_qp(value);
        g_free(tmp);
       }
-      if ((opts & VOPTION_FIXCHARSET) && value && charset) {
+      if ((opts & VOPTION_FIXCHARSET) && value && charset && !linecharset[0]) {
        iconv_t ic;
        int t;
        gboolean highchar = FALSE;
@@ -1132,6 +1177,7 @@
          res = tmp;
          start = newstart;
        } while(start < card+strlen(card) && start[0] == ' ');
+       convert_charset (pos, &res, "UTF-8");
        return(res);
       }
     }

diff -ur multisync-0.82.orig/plugins/palm_sync/src/vcard.c 
multisync-0.82/plugins/palm_sync/src/vcard.c
--- multisync-0.82.orig/plugins/palm_sync/src/vcard.c   2004-04-13 05:03:20.000000000 
+0800
+++ multisync-0.82/plugins/palm_sync/src/vcard.c        2004-07-07 23:19:14.000000000 
+0800
@@ -116,11 +116,11 @@
 
        /* note */
        if(appointment.note && strlen(appointment.note))
-               prop = addPropValueO(vevent, VCDescriptionPropO, 
g_strescape(appointment.note, NULL));
+               prop = addPropValueO(vevent, VCDescriptionPropO, appointment.note);
 
        /* description */
        if(appointment.description) {
-               prop = addPropValueO(vevent, VCSummaryPropO, 
escape_chars(g_strescape(appointment.description, NULL)));
+               prop = addPropValueO(vevent, VCSummaryPropO, appointment.description);
        }
 
        /* begin and end*/
@@ -584,13 +584,13 @@
 
        /* note */
        if(todo.note && strlen(todo.note)) {
-               prop = addPropValueO(vtodo, VCDescriptionPropO, 
escape_chars(g_strescape(todo.note, NULL)));
+               prop = addPropValueO(vtodo, VCDescriptionPropO, todo.note);
                //addPropValueO(prop, "ENCODING", "QUOTED-PRINTABLE");
        }
 
        /* description */
        if(todo.description) {
-               addPropValueO(vtodo, VCSummaryPropO,  
escape_chars(g_strescape(todo.description, NULL)));
+               addPropValueO(vtodo, VCSummaryPropO,  todo.description);
        }
        
        if (category) {



-------------------------------------------------------
This SF.Net email sponsored by Black Hat Briefings & Training.
Attend Black Hat Briefings & Training, Las Vegas July 24-29 - 
digital self defense, top technical experts, no vendor pitches, 
unmatched networking opportunities. Visit www.blackhat.com
_______________________________________________
Multisync-devel mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/multisync-devel

Reply via email to