From: Marc G. K. <st...@us...> - 2002-07-12 15:52:26
|
Update of /cvsroot/squirrelmail/squirrelmail/class In directory usw-pr-cvs1:/tmp/cvs-serv17702 Modified Files: mime.class Log Message: Added finddisplayentity functions and getattachment functions Index: mime.class =================================================================== RCS file: /cvsroot/squirrelmail/squirrelmail/class/mime.class,v retrieving revision 1.4 retrieving revision 1.5 diff -u -w -r1.4 -r1.5 --- mime.class 8 Jul 2002 22:18:35 -0000 1.4 +++ mime.class 12 Jul 2002 15:52:23 -0000 1.5 @@ -39,18 +39,18 @@ * example2: header->getAddr_s(array('to','cc','bcc')) */ function getAddr_s($arr) { - $s = ''; if (is_array($arr)) { + $s = ''; foreach($arr as $arg ) { $result = $this->getAddr_s($arg); if ($result) { $s .= ', ' . $result; } } - if ($s) { - $s = substr($s,2); - } + if ($s) $s = substr($s,2); + return $s; } else { + $s = ''; eval('$addr = $this->'.$arr.';') ; if (is_array($addr)) { foreach ($addr as $addr_o) { @@ -64,9 +64,9 @@ $s .= $addr->getAddress(); } } - } return $s; } + } function getAddr_a($arg, $excl_arr=array(), $arr = array()) { if (is_array($arg)) { @@ -134,9 +134,7 @@ } else { return $best_dpl; } - } else { - return ''; - } + } else return ''; } } @@ -170,7 +168,9 @@ } function getEntity($ent) { + $cur_ent = $this->entity_id; + $msg = $this; if ($cur_ent == '' || $cur_ent == '0') { $cur_ent_a = array(); } else { @@ -179,9 +179,8 @@ $ent_a = explode('.',$ent); $cnt = count($ent_a); - $cnt = $cnt - 1; /* this is how we use the count, so we'll save some time */ - $msg = $this; - for ($i=0;$i<$cnt;$i++) { + + for ($i=0;$i<$cnt -1;$i++) { if (isset($cur_ent_a[$i]) && $cur_ent_a[$i] != $ent_a[$i]) { $msg = $msg->parent; $cur_ent_a = explode('.',$msg->entity_id); @@ -203,11 +202,20 @@ $msg = $msg->entities[0]; } - if (isset($msg->entities[($ent_a[$cnt])-1])) { - $msg = $msg->entities[($ent_a[$cnt]-1)]; + if (isset($msg->entities[($ent_a[$cnt-1])-1])) { + $msg = $msg->entities[($ent_a[$cnt-1]-1)]; } return $msg; } + + function getMailbox() { + $msg = $this; + while (is_object($msg->parent)) { + $msg = $msg->parent; + } + return $msg->mailbox; + } + /* * Bodystructure parser, a recursive function for generating the * entity-tree with all the mime-parts. @@ -224,7 +232,7 @@ $arg_no = 0; $arg_a = array(); $cnt = strlen($read); - for (;$i < $cnt;$i++) { + while ($i < $cnt) { $char = strtoupper($read{$i}); switch ($char) { case '(': @@ -283,7 +291,7 @@ if (isset($msg->type0) && $msg->type0 == 'multipart') { $i++; $arg_a[]= $msg->parseDisposition($read,&$i); - } else { + } else { /* properties */ /* properties */ $arg_a[] = $msg->parseProperties($read,&$i); } @@ -291,10 +299,13 @@ break; case 7: if ($arg_a[0] == 'message' && $arg_a[1] == 'rfc822') { + $msg->header->type0 = $arg_a[0]; $msg->type0 = $arg_a[0]; + $msg->header->type1 = $arg_a[1]; $msg->type1 = $arg_a[1]; + $msg->parseEnvelope($read,&$i,&$hdr); $i++; while ($i < $cnt && $read{$i} != '(') { @@ -341,9 +352,7 @@ $debug = substr($read,$i,20); $arg_s = $msg->parseQuote($read,&$i); $arg_no++; - if ($arg_no < 3) { - $arg_s = strtolower($arg_s); /* type0 and type1 */ - } + if ($arg_no < 3) $arg_s = strtolower($arg_s); /* type0 and type1 */ $arg_a[] = $arg_s; break; case 'N': @@ -361,12 +370,10 @@ break; case (is_numeric($read{$i}) ): /* process integers */ - if ($read{$i} == ' ') { - break; - } + if ($read{$i} == ' ') break; $arg_s = $read{$i};; $i++; - while (preg_match('/\d+/',$read{$i})) { /* != ' ') {*/ + while (preg_match('/\d+/',$read{$i})) { // != ' ') { $arg_s .= $read{$i}; $i++; } @@ -458,7 +465,8 @@ default: break; } /* switch */ - } /* for */ + $i++; + } /* while */ } /* parsestructure */ function parseProperties($read, $i) { @@ -636,9 +644,7 @@ $adr->adl = $arg_a[1]; $adr->mailbox = $arg_a[2]; $adr->host = $arg_a[3]; - } else { - $adr = ''; - } + } else $adr = ''; return $adr; } @@ -666,9 +672,7 @@ $disp->properties = $arg_a[1]; } } - if (is_object($disp)) { - return $disp; - } + if (is_object($disp)) return $disp; } function parseLanguage($read,&$i) { @@ -694,6 +698,126 @@ $i++; } } + + function findDisplayEntity ($entity = array(), $alt_order = array('text/plain','text/html')) { + + $found = false; + $type = $this->type0.'/'.$this->type1; + if ( $type == 'multipart/alternative') { + $msg = $this->findAlternativeEntity($alt_order); + if (count($msg->entities) == 0) { + $entity[] = $msg->entity_id; + } else { + $msg->findDisplayEntity(&$entity, $alt_order); + } + $found = true; + } else if ( $type == 'multipart/related') { + $msgs = $this->findRelatedEntity(); + for ($i = 0; $i < count($msgs); $i++) { + $msg = $msgs[$i]; + if (count($msg->entities) == 0) { + $entity[] = $msg->entity_id; + } else { + $msg->findDisplayEntity(&$entity,$alt_order); + } + $found = true; + } + } else if ( $this->type0 == 'text' && + ( $this->type1 == 'plain' || + $this->type1 == 'html' ) && + isset($this->entity_id) ) { + if (count($this->entities) == 0) { + if (!$this->header->disposition->name == 'attachment') { + $entity[] = $this->entity_id; + } + } + } + $i = 0; + while ( isset($this->entities[$i]) && !$found && + !($this->entities[$i]->header->disposition->name + == 'attachment') && + !($this->entities[$i]->type0 == 'message' && + $this->entities[$i]->type1 == 'rfc822' ) + ) + { + $this->entities[$i]->findDisplayEntity(&$entity, $alt_order); + $i++; + } + + if ( !isset($entity[0]) ) { + $entity[]=""; + } + return( $entity ); + } + + function findAlternativeEntity ($alt_order) { + /* if we are dealing with alternative parts then we choose the best + * viewable message supported by SM. + */ + $best_view = 0; + $ent_id = 0; + $k = 0; + for ($i = 0; $i < count($this->entities); $i ++) { + $type = $this->entities[$i]->header->type0.'/'.$this->entities[$i]->header->type1; + if ($type == 'multipart/related') { + $type = $this->entities[$i]->header->type; + } + for ($j = $k; $j < count($alt_order); $j++) { + if ($alt_order[$j] == $type && $j > $best_view) { + $best_view = $j; + $ent_id = $i; + $k = $j; + } + } + } + return $this->entities[$ent_id]; + } + + function findRelatedEntity () { + $msgs = array(); + for ($i = 0; $i < count($this->entities); $i ++) { + $type = $this->entities[$i]->header->type0.'/'.$this->entities[$i]->header->type1; + if ($this->header->type == $type) { + $msgs[] = $this->entities[$i]; + } + } + return $msgs; + } + + function getAttachments($exclude_id=array(), $result = array()) { + if ($this->type0 == 'message' && $this->type1 == 'rfc822') { + $this = $this->entities[0]; + } + if (count($this->entities)) { + foreach ($this->entities as $entity) { + $exclude = false; + foreach ($exclude_id as $excl) { + if ($entity->entity_id == $excl) { + $exclude = true; + } + } + if (!$exclude) { + if ($entity->type0 == 'multipart' && $entity->type1 == 'digest') { + $result = $entity->getAttachments($exclude_id, $result); + } else if ($entity->type0 != 'multipart') { + $result[] = $entity; + } + } + } + } else { + $exclude = false; + foreach ($exclude_id as $excl) { + if ($this->entity_id == $excl) { + $exclude = true; + } + } + if (!$exclude) { + $result[] = $this; + } + } + return $result; + } + } class disposition { |