Jelajahi Sumber

*** empty log message ***

Pascal Peridont 17 tahun lalu
induk
melakukan
59b090cd56
2 mengubah file dengan 50 tambahan dan 15 penghapusan
  1. 18 13
      std/mtwin/mail/Part.hx
  2. 32 2
      std/mtwin/mail/Tools.hx

+ 18 - 13
std/mtwin/mail/Part.hx

@@ -316,9 +316,10 @@ class MetaPart<T> {
 		var head : List<String> = new List();
 		var head : List<String> = new List();
 		var buf = new StringBuf();
 		var buf = new StringBuf();
 
 
-		var arr = str.split("\n");
-		while( arr.length > 0 ){
-			var ln = arr.shift();
+		var i = 0;
+		var oi = 0;
+		while( (i=str.indexOf("\n",oi)) >= 0 ){
+			var ln = str.substr(oi,i-oi);
 			if( ln.length == 0 || ln == "\r" ){
 			if( ln.length == 0 || ln == "\r" ){
 				head.add( buf.toString() );
 				head.add( buf.toString() );
 				break;
 				break;
@@ -331,8 +332,9 @@ class MetaPart<T> {
 					buf.add( Tools.removeCRLF(ln) );
 					buf.add( Tools.removeCRLF(ln) );
 				}
 				}
 			}
 			}
+			oi = ++i;
 		}
 		}
-		content = arr.join("\n");
+		content = str.substr(i);
 		
 		
 		for( ln in head ){
 		for( ln in head ){
 			if( REG_HEADER.match(ln) ){
 			if( REG_HEADER.match(ln) ){
@@ -412,21 +414,24 @@ class MetaPart<T> {
 
 
 		if( reg.match( content ) ){
 		if( reg.match( content ) ){
 			content = reg.matched(1);
 			content = reg.matched(1);
-
-			var tmp = reg.matched(2).split("--"+boundary);
+			var b = "--"+boundary;
+			var ts = reg.matched(2);
+			var tmp = new Array();
+			var i = 0;
+			var oi = 0;
+			while( (i=ts.indexOf(b,oi)) >= 0 ){
+				tmp.push(ts.substr(oi,i-oi));
+				i+=b.length;
+				oi = i;
+			}
+			tmp.push(ts.substr(oi));
 
 
 			var myId = if(id == null || id.length == 0) "" else id + ".";
 			var myId = if(id == null || id.length == 0) "" else id + ".";
 			var i = 0;
 			var i = 0;
 			for( str in tmp ){
 			for( str in tmp ){
 				i++;
 				i++;
-				var t = str.substr(-2,2);
-				if( t == "\r\n" )
-					str = str.substr(0,-2);
-				else if( t.substr(1) == "\n" )
-					str = str.substr(0,-1);
-				
 				var p = cast newPart("text/plain");
 				var p = cast newPart("text/plain");
-				p.parse( StringTools.trim(str), myId+i );
+				p.parse( StringTools.trim(str)+"\r\n", myId+i );
 			}
 			}
 		}
 		}
 	}
 	}

+ 32 - 2
std/mtwin/mail/Tools.hx

@@ -69,8 +69,38 @@ class Tools {
 		return StringTools.rtrim(chunkSplit(haxe.BaseCode.encode( content, BASE64 ), 76, "\r\n")) + suffix;
 		return StringTools.rtrim(chunkSplit(haxe.BaseCode.encode( content, BASE64 ), 76, "\r\n")) + suffix;
 	}
 	}
 
 
+	#if neko
+	static var regexp_match = neko.Lib.load("regexp","regexp_match",4);
+	static var regexp_matched_pos : Dynamic -> Int -> { pos : Int, len : Int } = neko.Lib.load("regexp","regexp_matched_pos",2);
+	#end
+
 	public static function decodeBase64( content : String ){
 	public static function decodeBase64( content : String ){
+		#if neko
+		var r = untyped ~/[\s=]+/.r;
+		var b = new StringBuf();
+		var pos = 0;
+		var len = content.length;
+		var first = true;
+		do {
+			if( !regexp_match(r,untyped content.__s,pos,len) )
+				break;
+			var p = regexp_matched_pos(r,0);
+			if( p.len == 0 && !first ) {
+				if( p.pos == content.length )
+					break;
+				p.pos += 1;
+			}
+			b.addSub(content,pos,p.pos-pos);
+			var tot = p.pos + p.len - pos;
+			pos += tot;
+			len -= tot;
+			first = false;
+		} while( true );
+		b.addSub(content,pos,len);
+		content = b.toString();
+		#else
 		content = REG_SPACES_EQUAL.replace(content,"");
 		content = REG_SPACES_EQUAL.replace(content,"");
+		#end
 		return try haxe.BaseCode.decode( content, BASE64 ) catch( e : Dynamic ) content;
 		return try haxe.BaseCode.decode( content, BASE64 ) catch( e : Dynamic ) content;
 	}
 	}
 
 
@@ -129,7 +159,7 @@ class Tools {
 				var h = t.substr(0,2).toUpperCase();
 				var h = t.substr(0,2).toUpperCase();
 				if( REG_HEXA.match(h) ){
 				if( REG_HEXA.match(h) ){
 					ret.add(haxe.BaseCode.decode(h,HEXA));
 					ret.add(haxe.BaseCode.decode(h,HEXA));
-					ret.add(t.substr(2,t.length - 2));
+					ret.addSub(t,2,t.length - 2);
 				}else{
 				}else{
 					ret.add("=");
 					ret.add("=");
 					ret.add(t);
 					ret.add(t);
@@ -426,7 +456,7 @@ class Tools {
 							sb.add( sep );
 							sb.add( sep );
 							cur = 0;
 							cur = 0;
 						}
 						}
-						sb.add(e.substr(is,1));
+						sb.addSub(e,is,1);
 						cur++;
 						cur++;
 					}
 					}
 					if( cur + 1 + n.length > length ){
 					if( cur + 1 + n.length > length ){