[GroupDAV] Patch for charset usage in vcalendar1.0
Ole Dalgaard
groupdav@opengroupware.org
Tue, 15 Aug 2006 21:20:18 +0200
This is a multi-part message in MIME format.
--------------020306040802030804010200
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 7bit
Hi
Here is the promised patch, so far it only handles quoted-printable text.
/Ole
--------------020306040802030804010200
Content-Type: text/x-patch;
name="groupdav-charset.patch"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline;
filename="groupdav-charset.patch"
*** GroupDAVConnector.java.ORG 2006-08-03 08:09:26.783694000 +0200
--- GroupDAVConnector.java 2006-08-15 21:15:23.104747750 +0200
*************** import com.funambol.foundation.pdi.parse
*** 34,39 ****
--- 34,42 ----
import com.funambol.foundation.pdi.converter.*;
import java.sql.Connection;
import java.util.List;
+
+ import org.apache.commons.codec.net.QuotedPrintableCodec;
+
import net.fortuna.ical4j.model.*;
import net.fortuna.ical4j.model.property.*;
import net.fortuna.ical4j.data.CalendarBuilder;
*************** public class GroupDAVConnector
*** 510,517 ****
|| line.contains("DCREATED")) {
contribute = false;
}
if (contribute)
! newdata.append(line+"\r\n");
}
Calendar cal = cbuild.build(new StringReader(newdata.toString()));
BMIcalSanitizer.sanitizeIcal20(cal,
--- 513,549 ----
|| line.contains("DCREATED")) {
contribute = false;
}
+
+ if(line.contains("CHARSET")) {
+ String[] charsetSplit = line.substring(0,line.indexOf(':')).split(";");
+ if(charsetSplit.length>0) {
+ String charset = null;
+ String encoding = null;
+ String newline = charsetSplit[0];
+ for(int o=1; o<charsetSplit.length; o++) {
+ if(charsetSplit[o].startsWith("CHARSET"))
+ charset = charsetSplit[o].substring(charsetSplit[o].indexOf('=')+1);
+ else if(charsetSplit[o].startsWith("ENCODING"))
+ encoding = charsetSplit[o].substring(charsetSplit[o].indexOf('=')+1);
+ else
+ newline += ";"+charsetSplit[o];
+ }
+ String decoderLine = "";
+ while(split[i].endsWith("=")) {
+ decoderLine += split[i].substring(split[i].indexOf(':') == -1 ? 0 : split[i].indexOf(':')+1,split[i].length()-1) + split[++i];
+ }
+ String decoded = "";
+ if(encoding != null && encoding.equalsIgnoreCase("QUOTED-PRINTABLE")) {
+ decoded = new QuotedPrintableCodec(charset).decode(decoderLine);
+ } else {
+ System.out.println("unhandled encoding = "+encoding);
+ }
+ line = newline + ":" + decoded;
+
+ }
+ }
if (contribute)
! newdata.append(line+"\r\n");
}
Calendar cal = cbuild.build(new StringReader(newdata.toString()));
BMIcalSanitizer.sanitizeIcal20(cal,
*************** public class GroupDAVConnector
*** 827,832 ****
--- 859,865 ----
FileOutputStream fos = new FileOutputStream(f);
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(sm);
+ oos.flush();
oos.close();
sm = null;
}
--------------020306040802030804010200--