/**
* Message.class.php
*
- * Copyright (c) 2003-2004 The SquirrelMail Project Team
+ * Copyright (c) 2003-2005 The SquirrelMail Project Team
* Licensed under the GNU GPL. For full terms see the file COPYING.
*
* This contains functions needed to handle mime messages.
*
- * $Id$
+ * @version $Id$
* @package squirrelmail
+ * @subpackage mime
+ * @since 1.3.2
*/
/**
* more objects of type message. See documentation in mime.txt for
* a better description of how this works.
* @package squirrelmail
+ * @subpackage mime
+ * @since 1.3.0
*/
class Message {
var $rfc822_header = '',
$att_local_name = ''; /* location where the tempory attachment
is stored. For future usage in smtp.php */
+ /**
+ * @param mixed $ent entity id
+ */
function setEnt($ent) {
$this->entity_id= $ent;
}
+ /**
+ * @param mixed $msg
+ */
function addEntity ($msg) {
$this->entities[] = $msg;
}
+ /**
+ * Get file name used for mime part
+ * @return string file name
+ * @since 1.3.2
+ */
function getFilename() {
- $filename = '';
- $filename = $this->header->getParameter('filename');
- if (!$filename) {
- $filename = $this->header->getParameter('name');
- }
-
- if (!$filename) {
- $filename = 'untitled-'.$this->entity_id;
- }
- return $filename;
+ $filename = '';
+ $header = $this->header;
+ if (is_object($header->disposition)) {
+ $filename = $header->disposition->getProperty('filename');
+ if (trim($filename) == '') {
+ $name = decodeHeader($header->disposition->getProperty('name'));
+ if (!trim($name)) {
+ $name = $header->getParameter('name');
+ if(!trim($name)) {
+ if (!trim( $header->id )) {
+ $filename = 'untitled-[' . $this->entity_id . ']' ;
+ } else {
+ $filename = 'cid: ' . $header->id;
+ }
+ } else {
+ $filename = $name;
+ }
+ } else {
+ $filename = $name;
+ }
+ }
+ } else {
+ $filename = $header->getParameter('filename');
+ if (!trim($filename)) {
+ $filename = $header->getParameter('name');
+ if (!trim($filename)) {
+ if (!trim( $header->id )) {
+ $filename = 'untitled-[' . $this->entity_id . ']' ;
+ } else {
+ $filename = 'cid: ' . $header->id;
+ }
+ }
+ }
+ }
+ return $filename;
}
-
+ /**
+ * Add header object to message object.
+ * WARNING: Unfinished code. Don't expect it to work in older sm versions.
+ * @param mixed $read array or string with message headers
+ * @todo FIXME: rfc822header->parseHeader() does not return rfc822header object
+ */
function addRFC822Header($read) {
$header = new Rfc822Header();
$this->rfc822_header = $header->parseHeader($read);
}
+ /**
+ * @param string $ent
+ */
function getEntity($ent) {
$cur_ent = $this->entity_id;
$msg = $this;
$cur_ent_a = explode('.', $this->entity_id);
}
$ent_a = explode('.', $ent);
-
+
for ($i = 0,$entCount = count($ent_a) - 1; $i < $entCount; ++$i) {
if (isset($cur_ent_a[$i]) && ($cur_ent_a[$i] != $ent_a[$i])) {
$msg = $msg->parent;
return $msg;
}
+ /**
+ * Set message body
+ * @param string $s message body
+ */
function setBody($s) {
$this->body_part = $s;
}
+ /**
+ * Clean message object
+ */
function clean_up() {
$msg = $this;
$msg->body_part = '';
}
}
+ /**
+ * @return string
+ */
function getMailbox() {
$msg = $this;
while (is_object($msg->parent)) {
* Question/Bugs:
*
* Ask for me (Marc Groot Koerkamp, stekkel@users.sourceforge.net)
- *
+ * @param string $read
+ * @param integer $i
+ * @param mixed $sub_msg
+ * @return object Message object
+ * @todo define argument and return types
*/
function parseStructure($read, &$i, $sub_msg = '') {
$msg = Message::parseBodyStructure($read, $i, $sub_msg);
if($msg) $msg->setEntIds($msg,false,0);
return $msg;
}
-
+
+ /**
+ * @param object $msg
+ * @param mixed $init
+ * @param integer $i
+ * @todo document me
+ * @since 1.4.0
+ */
function setEntIds(&$msg,$init=false,$i=0) {
$iCnt = count($msg->entities);
if ($init !==false) {
$iEntSub = $i+1;
- if ($msg->parent->type0 == 'message' &&
+ if ($msg->parent->type0 == 'message' &&
$msg->parent->type1 == 'rfc822' &&
$msg->type0 == 'multipart') {
$iEntSub = '0';
$msg->entity_id='1';
}
for ($i=0;$i<$iCnt;++$i) {
- $msg->entities[$i]->parent =& $msg;
- if (strrchr($msg->entity_id, '.') != '.0') {
+ $msg->entities[$i]->parent =& $msg;
+ if (strrchr($msg->entity_id, '.') != '.0') {
$msg->entities[$i]->setEntIds($msg->entities[$i],$msg->entity_id,$i);
} else {
$msg->entities[$i]->setEntIds($msg->entities[$i],$msg->parent->entity_id,$i);
}
}
+ /**
+ * @param string $read
+ * @param integer $i
+ * @param mixed $sub_msg
+ * @return object Message object
+ * @todo document me
+ * @since 1.4.0 (code was part of parseStructure() in 1.3.x)
+ */
function parseBodyStructure($read, &$i, $sub_msg = '') {
$arg_no = 0;
$arg_a = array();
} else {
$message = new Message();
}
-
+
for ($cnt = strlen($read); $i < $cnt; ++$i) {
$char = strtoupper($read{$i});
switch ($char) {
$arg_a[] = $msg->parseLiteral($read, $i);
++$arg_no;
break;
- case '0':
+ case '0':
case is_numeric($read{$i}):
/* process integers */
if ($read{$i} == ' ') { break; }
} /* for */
} /* parsestructure */
+ /**
+ * @param string $read
+ * @param integer $i
+ * @return array
+ */
function parseProperties($read, &$i) {
$properties = array();
$prop_name = '';
return $properties;
}
+ /**
+ * @param string $read
+ * @param integer $i
+ * @param object $hdr MessageHeader object
+ * @return object MessageHeader object
+ */
function parseEnvelope($read, &$i, $hdr) {
$arg_no = 0;
$arg_a = array();
if (count($arg_a) > 9) {
$d = strtr($arg_a[0], array(' ' => ' '));
$d = explode(' ', $d);
- if (!$arg_a[1]) $arg_1[1] = _("(no subject)");
+ if (!$arg_a[1]) $arg_a[1] = _("(no subject)");
$hdr->date = getTimeStamp($d); /* argument 1: date */
$hdr->subject = $arg_a[1]; /* argument 2: subject */
return $hdr;
}
+ /**
+ * @param string $read
+ * @param integer $i
+ * @return string
+ * @todo document me
+ */
function parseLiteral($read, &$i) {
$lit_cnt = '';
++$i;
return $s;
}
+ /**
+ * @param string $read
+ * @param integer $i
+ * @return string
+ * @todo document me
+ */
function parseQuote($read, &$i) {
$s = '';
$iPos = ++$i;
return $s;
}
+ /**
+ * @param string $read
+ * @param integer $i
+ * @return object AddressStructure object
+ */
function parseAddress($read, &$i) {
$arg_a = array();
for (; $read{$i} != ')'; ++$i) {
return $adr;
}
+ /**
+ * @param string $read
+ * @param integer $i
+ * @param object Disposition object or empty string
+ */
function parseDisposition($read, &$i) {
$arg_a = array();
for (; $read{$i} != ')'; ++$i) {
return (is_object($disp) ? $disp : '');
}
+ /**
+ * @param string $read
+ * @param integer $i
+ * @return object Language object or empty string
+ */
function parseLanguage($read, &$i) {
/* no idea how to process this one without examples */
$arg_a = array();
return (is_object($lang) ? $lang : '');
}
+ /**
+ * Parse message text enclosed in parenthesis
+ * @param string $read
+ * @param integer $i
+ * @return integer
+ */
function parseParenthesis($read, $i) {
for (; $read{$i} != ')'; ++$i) {
switch ($read{$i}) {
return $i;
}
- /* Function to fill the message structure in case the */
- /* bodystructure is not available NOT FINISHED YET */
+ /**
+ * Function to fill the message structure in case the
+ * bodystructure is not available
+ * NOT FINISHED YET
+ * @param string $read
+ * @param string $type0 message part type
+ * @param string $type1 message part subtype
+ * @return string
+ */
function parseMessage($read, $type0, $type1) {
switch ($type0) {
case 'message':
}
}
+ /**
+ * @param array $entity
+ * @param array $alt_order
+ * @param boolean $strict
+ * @return array
+ */
function findDisplayEntity($entity = array(), $alt_order = array('text/plain', 'text/html'), $strict=false) {
$found = false;
if ($this->type0 == 'multipart') {
}
} else { /* Treat as multipart/mixed */
foreach ($this->entities as $ent) {
- if((strtolower($ent->header->disposition->name) != 'attachment') &&
+ if(!(is_object($ent->header->disposition) && strtolower($ent->header->disposition->name) == 'attachment') &&
(!isset($ent->header->parameters['filename'])) &&
(!isset($ent->header->parameters['name'])) &&
(($ent->type0 != 'message') && ($ent->type1 != 'rfc822'))) {
// $alt_order[] = "message/rfc822";
foreach ($alt_order as $alt) {
if( ($alt == $type) && isset($this->entity_id) ) {
- if ((count($this->entities) == 0) &&
- (!isset($ent->header->parameters['filename'])) &&
- (!isset($ent->header->parameters['name'])) &&
- (strtolower($this->header->disposition->name) != 'attachment')) {
+ if ((count($this->entities) == 0) &&
+ (!isset($this->header->parameters['filename'])) &&
+ (!isset($this->header->parameters['name'])) &&
+ isset($this->header->disposition) && is_object($this->header->disposition) &&
+ !(is_object($this->header->disposition) && strtolower($this->header->disposition->name) == 'attachment')) {
$entity[] = $this->entity_id;
$found = true;
}
}
if(!$found) {
foreach ($this->entities as $ent) {
- if((strtolower($ent->header->disposition->name) != 'attachment') &&
+ if(!(is_object($ent->header->disposition) && strtolower($ent->header->disposition->name) == 'attachment') &&
(($ent->type0 != 'message') && ($ent->type1 != 'rfc822'))) {
$entity = $ent->findDisplayEntity($entity, $alt_order, $strict);
$found = true;
in_array($this->type1, array('plain', 'html', 'message')) &&
isset($this->entity_id)) {
if (count($this->entities) == 0) {
- if (strtolower($this->header->disposition->name) != 'attachment') {
+ if (!is_object($this->header->disposition) || strtolower($this->header->disposition->name) != 'attachment') {
$entity[] = $this->entity_id;
}
}
return $entity;
}
+ /**
+ * @param array $alt_order
+ * @return array
+ */
function findAlternativeEntity($alt_order) {
/* If we are dealing with alternative parts then we */
/* choose the best viewable message supported by SM. */
return $entity;
}
+ /**
+ * @return array
+ */
function findRelatedEntity() {
$msgs = array();
$related_type = $this->header->getParameter('type');
return $msgs;
}
+ /**
+ * @param array $exclude_id
+ * @param array $result
+ * @return array
+ */
function getAttachments($exclude_id=array(), $result = array()) {
/*
- if (($this->type0 == 'message') &&
+ if (($this->type0 == 'message') &&
($this->type1 == 'rfc822') &&
($this->entity_id) ) {
$this = $this->entities[0];
}
return $result;
}
-
+
+ /**
+ * Add attachment to message object
+ * @param string $type attachment type
+ * @param string $name attachment name
+ * @param string $location path to attachment
+ */
function initAttachment($type, $name, $location) {
$attachment = new Message();
$mime_header = new MessageHeader();
$mime_header->setParameter('name', $name);
+ // FIXME: duplicate code. see ContentType class
$pos = strpos($type, '/');
if ($pos > 0) {
$mime_header->type0 = substr($type, 0, $pos);
}
}
-?>
+?>
\ No newline at end of file