Thanks very much for your interest and for taking the time to prepare a
patch.
We'll have a look at it and let you know if we have to make changes and
when things go into CVS.
Thanks again,
Tom
On Fri, 2004-07-09 at 12:34, YuLei wrote:
> 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
-------------------------------------------------------
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