From ae579cee860c90183b3968d9658ffe0b3ba29dd5 Mon Sep 17 00:00:00 2001
From: thomascube <thomas@roundcube.net>
Date: Thu, 18 Sep 2008 16:48:04 -0400
Subject: [PATCH] Also list message/rfc822 parts as attachment if a filename is specified

---
 program/lib/mime.inc |   45 ++++++++++++++++++++++++++-------------------
 1 files changed, 26 insertions(+), 19 deletions(-)

diff --git a/program/lib/mime.inc b/program/lib/mime.inc
index 75c2d40..16fc52d 100644
--- a/program/lib/mime.inc
+++ b/program/lib/mime.inc
@@ -32,13 +32,15 @@
 $MIME_VIDEO = 6;
 $MIME_OTHER = 7;
 
-function iml_ClosingParenPos($str, $start){
+function iml_ClosingParenPos($str, $start) {
     $level=0;
     $len = strlen($str);
     $in_quote = 0;
-    for ($i=$start;$i<$len;$i++){
-    	if ($str[$i]=="\"") $in_quote = ($in_quote + 1) % 2;
-    	if (!$in_quote){
+
+    for ($i=$start; $i<$len; $i++) {
+    	if ($str[$i] == '"' && $str[$i-1] != "\\")
+		$in_quote = ($in_quote + 1) % 2;
+    	if (!$in_quote) {
         	if ($str[$i]=="(") $level++;
         	else if (($level > 0) && ($str[$i]==")")) $level--;
         	else if (($level == 0) && ($str[$i]==")")) return $i;
@@ -51,27 +53,32 @@
     $id = 0;
     $a = array();
     $len = strlen($str);
-    
     $in_quote = 0;
-    for ($i=0; $i<$len; $i++){
-        if ($str[$i] == "\"") $in_quote = ($in_quote + 1) % 2;
-        else if (!$in_quote){
-            if ($str[$i] == " ") $id++; //space means new element
-            else if ($str[$i]=="("){ //new part
+
+    for ($i=0; $i<$len; $i++) {
+        if ($str[$i] == '"') {
+	    $in_quote = ($in_quote + 1) % 2;
+        } else if (!$in_quote) {
+            if ($str[$i] == " ") { //space means new element
+                $id++;
+                while ($str[$i+1] == " ") $i++;  // skip additional spaces
+            } else if ($str[$i]=="(") { //new part
                 $i++;
                 $endPos = iml_ClosingParenPos($str, $i);
                 $partLen = $endPos - $i;
+                if ($partLen < 0) break;
                 $part = substr($str, $i, $partLen);
                 $a[$id] = iml_ParseBSString($part); //send part string
-                if ($verbose){
-					echo "{>".$endPos."}";
-					flush();
-				}
                 $i = $endPos;
-            }else $a[$id].=$str[$i]; //add to current element in array
-        }else if ($in_quote){
-            if ($str[$i]=="\\") $i++; //escape backslashes
-            else $a[$id].=$str[$i]; //add to current element in array
+            } else
+		$a[$id].=$str[$i]; //add to current element in array
+        } else if ($in_quote) {
+            if ($str[$i]=="\\") {
+		$i++; //escape backslashes
+		if ($str[$i] == '"' || $str[$i] == "\\")
+		    $a[$id] .= $str[$i];
+            } else
+		$a[$id] .= $str[$i]; //add to current element in array
         }
     }
         
@@ -82,7 +89,7 @@
 function iml_GetRawStructureArray($str){
     $line=substr($str, 1, strlen($str) - 2);
     $line = str_replace(")(", ") (", $line);
-	
+
 	$struct = iml_ParseBSString($line);
 	if ((strcasecmp($struct[0], "message")==0) && (strcasecmp($struct[1], "rfc822")==0)){
 		$struct = array($struct);

--
Gitblit v1.9.1