[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--