Bläddra i källkod

*** empty log message ***

Pascal Peridont 19 år sedan
förälder
incheckning
b5f1f03c58
4 ändrade filer med 63 tillägg och 3 borttagningar
  1. 4 0
      std/mtwin/mail/Browser.hx
  2. 1 0
      std/mtwin/mail/Part.hx
  3. 42 3
      std/mtwin/mail/Tools.hx
  4. 16 0
      std/mtwin/mail/imap/Tools.hx

+ 4 - 0
std/mtwin/mail/Browser.hx

@@ -186,6 +186,10 @@ class Browser extends MetaPart<Browser> {
 		return headers.exists( name );
 		return headers.exists( name );
 	}
 	}
 
 
+	public function getHeader( name, ?charset ){
+		return super.getHeader( Tools.formatHeaderTitle(name),charset );
+	}
+
 	function mkBody() : {ctype_primary: String,ctype_secondary: String,charset: String,content: String} {
 	function mkBody() : {ctype_primary: String,ctype_secondary: String,charset: String,content: String} {
 		var ctype = contentType.split("/");
 		var ctype = contentType.split("/");
 
 

+ 1 - 0
std/mtwin/mail/Part.hx

@@ -291,6 +291,7 @@ class MetaPart<T> {
 				}else{
 				}else{
 					var nbTab = Tools.countInitTab(ln);
 					var nbTab = Tools.countInitTab(ln);
 					if( nbTab > 0 ){
 					if( nbTab > 0 ){
+						buf.add(" ");
 						buf.add( Tools.removeCRLF(ln.substr(nbTab,ln.length-nbTab)) );
 						buf.add( Tools.removeCRLF(ln.substr(nbTab,ln.length-nbTab)) );
 					}else{
 					}else{
 						head.add( buf.toString() );
 						head.add( buf.toString() );

+ 42 - 3
std/mtwin/mail/Tools.hx

@@ -30,7 +30,7 @@ class Tools {
 	static var HEXA = "0123456789ABCDEF";
 	static var HEXA = "0123456789ABCDEF";
 
 
 
 
-	static var REG_HEADER_DECODE = ~/^(.*?)=\?([^\?]+)\?(Q|B)\?([^?]*)\?= ?(.*?)$/i;
+	static var REG_HEADER_DECODE = ~/^(.*?)=\?([^\?]+)\?(Q|B)\?([^?]*)\?=\s?(.*?)$/i;
 	static var REG_QP_LB = ~/=\\r?\\n/;
 	static var REG_QP_LB = ~/=\\r?\\n/;
 	static var REG_QP = ~/=([A-Fa-f0-9]{1,2})/;
 	static var REG_QP = ~/=([A-Fa-f0-9]{1,2})/;
 	static var REG_START_TAB = ~/^(\t| )+/;
 	static var REG_START_TAB = ~/^(\t| )+/;
@@ -122,7 +122,7 @@ class Tools {
 
 
 	// TODO Protect address in "non ascii chars" <[email protected]>
 	// TODO Protect address in "non ascii chars" <[email protected]>
 	public static function headerQpEncode( ostr : String, initSize : Int, charset : String ){
 	public static function headerQpEncode( ostr : String, initSize : Int, charset : String ){
-		var str = removeCRLF(ostr);
+		var str = ~/\r?\n\s*/.replace(ostr," ");
 		
 		
 		var csl = charset.length;
 		var csl = charset.length;
 		var len = str.length;
 		var len = str.length;
@@ -166,13 +166,14 @@ class Tools {
 		quotedStr.add(line.toString());
 		quotedStr.add(line.toString());
 
 
 		if( !useQuoted ){
 		if( !useQuoted ){
-			return ostr;
+			return wordWrap(ostr,75,"\r\n\t",initSize);
 		}else{
 		}else{
 			return "=?"+charset+"?Q?"+quotedStr.join("?=\r\n\t=?"+charset+"?Q?")+"?=";
 			return "=?"+charset+"?Q?"+quotedStr.join("?=\r\n\t=?"+charset+"?Q?")+"?=";
 		}
 		}
 	}
 	}
 
 
 	public static function headerDecode( str : String, charsetOut : String ){
 	public static function headerDecode( str : String, charsetOut : String ){
+		str = ~/\r?\n\s*/.replace(str," ");
 		while( REG_HEADER_DECODE.match(str) ){
 		while( REG_HEADER_DECODE.match(str) ){
 			var charset = StringTools.trim(REG_HEADER_DECODE.matched(2).toLowerCase());
 			var charset = StringTools.trim(REG_HEADER_DECODE.matched(2).toLowerCase());
 			var encoding = StringTools.trim(REG_HEADER_DECODE.matched(3).toLowerCase());
 			var encoding = StringTools.trim(REG_HEADER_DECODE.matched(3).toLowerCase());
@@ -262,6 +263,7 @@ class Tools {
 	}
 	}
 
 
 	public static function formatHeader( name : String, content : String, charset : String ){
 	public static function formatHeader( name : String, content : String, charset : String ){
+		// TODO if To, From, Cc, Bcc, use a special encode to keep addresses
 		return name+": "+headerQpEncode(content,name.length,charset)+"\r\n";
 		return name+": "+headerQpEncode(content,name.length,charset)+"\r\n";
 	}
 	}
 
 
@@ -300,4 +302,41 @@ class Tools {
 
 
 	}
 	}
 
 
+	public static function wordWrap( str : String, ?length : Int, ?sep : String, ?initCur : Int ){
+		if( length == null ) length = 75;
+		if( sep == null ) sep = "\n";
+		if( initCur == null ) initCur = 0;
+		
+		var reg = ~/(.*?)(\s+)/;
+		var a = new Array();
+		while( reg.match(str) ){
+			var c = reg.matched(1);
+			var s = reg.matched(2);
+			var l = c.length+s.length;
+			a.push( c );
+			a.push( s );
+			str = str.substr(l,str.length-l);
+		}
+		a.push( str );
+
+		var sb = new StringBuf();
+		var cur = initCur;
+		for( i in 0...a.length ){
+			var e = a[i];
+			var l = e.length;
+			var cut = false;
+			if( cur+l > length ){
+				sb.add( sep );
+				cur = 0;
+				cut = true;
+			}
+			if( i % 2 != 1 || !cut ){
+				sb.add( e );
+				cur += l;
+			}
+		}
+
+		return sb.toString();
+	}
+
 }
 }

+ 16 - 0
std/mtwin/mail/imap/Tools.hx

@@ -24,6 +24,8 @@
  */
  */
 package mtwin.mail.imap;
 package mtwin.mail.imap;
 
 
+import mtwin.mail.imap.Envelope;
+
 typedef Flags = Array<String>
 typedef Flags = Array<String>
 
 
 enum Section {
 enum Section {
@@ -152,4 +154,18 @@ class Tools {
 		}
 		}
 	}
 	}
 
 
+	public static function addressListToString( l : List<Address>, ?charset : String ){
+		if( charset == null ) charset = "utf-8";
+		if( l == null ) return "";
+		var r = new List();
+		for( a in l ){
+			if( a.name != null ){
+				r.add("\""+mtwin.mail.Tools.headerDecode(a.name,charset).split("\"").join("\\\"")+"\" <"+a.address+">");
+			}else{
+				r.add(a.address);
+			}
+		}
+		return r.join(", ");
+	}
+
 }
 }