+ function mime_get_element (&$structure, $msg, $ent_id) {
+ global $debug_mime;
+ $elem_num = 1;
+ $msg->header = new msg_header();
+ $msg->header->entity_id = $ent_id;
+ $properties = array();
+
+ while (strlen($structure) > 0) {
+ $structure = trim($structure);
+ $char = substr($structure, 0, 1);
+
+ if (strtolower(substr($structure, 0, 3)) == "nil") {
+ $text = "";
+ $structure = substr($structure, 3);
+ } else if ($char == "\"") {
+ // loop through until we find the matching quote, and return that as a string
+ $pos = 1;
+ $char = substr($structure, $pos, 1);
+ $text = "";
+ while ($char != "\"" && $pos < strlen($structure)) {
+ $text .= $char;
+ $pos++;
+ $char = substr($structure, $pos, 1);
+ }
+ $structure = substr($structure, strlen($text) + 2);
+ } else if ($char == "(") {
+ // comment me
+ $end = mime_match_parenthesis (0, $structure);
+ $sub = substr($structure, 1, $end-1);
+ $properties = mime_get_props($properties, $sub);
+ $structure = substr($structure, strlen($sub) + 2);
+ } else {
+ // loop through until we find a space or an end parenthesis
+ $pos = 0;
+ $char = substr($structure, $pos, 1);
+ $text = "";
+ while ($char != " " && $char != ")" && $pos < strlen($structure)) {
+ $text .= $char;
+ $pos++;
+ $char = substr($structure, $pos, 1);
+ }
+ $structure = substr($structure, strlen($text));
+ }
+ if ($debug_mime) echo "<tt>$elem_num : $text</tt><br>";
+
+ // This is where all the text parts get put into the header
+ switch ($elem_num) {
+ case 1:
+ $msg->header->type0 = strtolower($text);
+ if ($debug_mime) echo "<tt>type0 = ".strtolower($text)."</tt><br>";
+ break;
+ case 2:
+ $msg->header->type1 = strtolower($text);
+ if ($debug_mime) echo "<tt>type1 = ".strtolower($text)."</tt><br>";
+ break;
+ case 5:
+ $msg->header->description = $text;
+ if ($debug_mime) echo "<tt>description = $text</tt><br>";
+ break;
+ case 6:
+ $msg->header->encoding = strtolower($text);
+ if ($debug_mime) echo "<tt>encoding = ".strtolower($text)."</tt><br>";
+ break;
+ case 7:
+ $msg->header->size = $text;
+ if ($debug_mime) echo "<tt>size = $text</tt><br>";
+ break;
+ default:
+ if ($msg->header->type0 == "text" && $elem_num == 8) {
+ // This is a plain text message, so lets get the number of lines
+ // that it contains.
+ $msg->header->num_lines = $text;
+ if ($debug_mime) echo "<tt>num_lines = $text</tt><br>";
+
+ } else if ($msg->header->type0 == "message" && $msg->header->type1 == "rfc822" && $elem_num == 8) {
+ // This is an encapsulated message, so lets start all over again and
+ // parse this message adding it on to the existing one.
+ $structure = trim($structure);
+ if (substr($structure, 0, 1) == "(") {
+ $e = mime_match_parenthesis (0, $structure);
+ $structure = substr($structure, 0, $e);
+ $structure = substr($structure, 1);
+ $m = mime_parse_structure($structure, $msg->header->entity_id);
+
+ // the following conditional is there to correct a bug that wasn't
+ // incrementing the entity IDs correctly because of the special case
+ // that message/rfc822 is. This fixes it fine.
+ if (substr($structure, 1, 1) != "(")
+ $m->header->entity_id = mime_increment_id(mime_new_element_level($ent_id));
+
+ // Now we'll go through and reformat the results.
+ if ($m->entities) {
+ for ($i=0; $i < count($m->entities); $i++) {
+ $msg->addEntity($m->entities[$i]);
+ }
+ } else {
+ $msg->addEntity($m);
+ }
+ $structure = "";
+ }
+ }
+ break;
+ }
+ $elem_num++;
+ $text = "";
+ }
+ // loop through the additional properties and put those in the various headers
+ if ($msg->header->type0 != "message") {
+ for ($i=0; $i < count($properties); $i++) {
+ $msg->header->{$properties[$i]["name"]} = $properties[$i]["value"];
+ if ($debug_mime) echo "<tt>".$properties[$i]["name"]." = " . $properties[$i]["value"] . "</tt><br>";
+ }
+ }