You are here

function mailhandler_node_prepare_message in Mailhandler 6

Same name and namespace in other branches
  1. 7 mailhandler.module \mailhandler_node_prepare_message()

Append default commands. Separate commands from body. Strip signature. Return a node object.

1 call to mailhandler_node_prepare_message()
mailhandler_node_process_message in ./mailhandler.module

File

./mailhandler.module, line 804
Mailhandler module code.

Code

function mailhandler_node_prepare_message($header, $body, $mailbox) {

  // Initialise a node object
  $node = new stdClass();
  $node->pass = NULL;

  // Initialize parameters
  $sep = $mailbox['sigseparator'];

  // Copy any name/value pairs from In-Reply-To or References e-mail headers to $node. Useful for maintaining threading info.
  if (!empty($header->references)) {

    // we want the final element in references header, watching out for white space
    $threading = substr(strrchr($header->references, '<'), 0);
  }
  else {
    if (!empty($header->in_reply_to)) {
      $threading = str_replace(strstr($header->in_reply_to, '>'), '>', $header->in_reply_to);

      // Some MUAs send more info in that header.
    }
  }
  if (isset($threading) && ($threading = rtrim(ltrim($threading, '<'), '>'))) {

    //strip angle brackets
    if ($threading) {
      $node->threading = $threading;
    }
    parse_str($threading, $tmp);
    if (isset($tmp['host']) && $tmp['host']) {
      $tmp['host'] = ltrim($tmp['host'], '@');

      // strip unnecessary @ from 'host' element
    }
    foreach ($tmp as $key => $value) {
      $node->{$key} = $value;
    }
  }

  // Prepend the default commands for this mailbox
  if ($mailbox['commands']) {
    $body = trim($mailbox['commands']) . "\n" . $body;
  }
  if ($commands = mailhandler_commands_parse($body, $sep)) {

    // Record debug information.
    mailhandler_watchdog_record('Message unprocessed commands: @commands', array(
      '@commands' => var_export($commands, TRUE),
    ), WATCHDOG_DEBUG);

    // The node type must be set first in order to properly initialize the node
    foreach ($commands['commands'] as $command) {
      if ($command[0] == 'type') {
        $node->type = $command[1];
      }
    }
  }

  // Set a default type if none provided
  if (!isset($node->type)) {
    $node->type = mailhandler_default_type();
  }

  // Apply defaults to the $node object, and allow modules to add default values
  require_once drupal_get_path('module', 'node') . '/node.pages.inc';
  if ($node->type != 'comment') {
    node_object_prepare($node);
  }

  // If cron is called by anon then node_object_prepare sets uid to 0, but otherwise global $user.
  // Manually set this to 0 since that's what the rest of the code expects.
  $node->uid = 0;

  // In order to fall back to the permission system for comment status, the status property must
  // be unset if type is comment.  It will get set by explicit commands, and if not, by
  // comment_save itself.
  if ($node->type == 'comment') {
    unset($node->status);
  }

  // Execute the commands
  if (!empty($commands['commands'])) {
    mailhandler_node_process_message_commands($node, $commands['commands']);

    // Record debug information.
    mailhandler_watchdog_record('Node processed commands: @node', array(
      '@node' => var_export($node, TRUE),
    ), WATCHDOG_DEBUG);
  }

  // Isolate the body from the commands and the sig
  $tmp = array_slice($commands['lines'], $commands['endcommands'], $commands['i'] - $commands['endcommands']);

  // flatten and assign the body to node object. note that filter() is called within node_save() [tested with blog post]
  if ($node->type != 'comment') {
    $type = node_get_types('type', $node->type);
  }
  if (isset($type) && $type && $type->has_body || $node->type == 'comment') {
    $node->body = implode("\n", $tmp);
  }
  if (empty($node->teaser)) {
    $node->teaser = node_teaser($node->body);
  }

  // decode encoded subject line
  $subjectarr = imap_mime_header_decode($header->subject);
  if (empty($subjectarr)) {
    $node->title = truncate_utf8(trim(decode_entities(strip_tags(check_markup($node->body)))), 29, TRUE);
  }
  else {
    for ($i = 0; $i < count($subjectarr); $i++) {
      if ($subjectarr[$i]->charset != 'default') {
        $node->title .= drupal_convert_to_utf8($subjectarr[$i]->text, $subjectarr[$i]->charset);
      }
      else {
        $node->title .= $subjectarr[$i]->text;
      }
    }
  }
  $node->date = $node->changed = format_date($header->udate, 'custom', 'Y-m-d H:i:s O');
  $node->format = $mailbox['format'];

  // If an nid command was supplied, and type is not 'comment', append the revision number
  if (isset($node->nid) && !empty($node->nid) && $node->type != 'comment') {
    $vid = db_result(db_query('SELECT n.vid FROM {node} n WHERE n.nid = %d', $node->nid));
    if ($vid) {
      $node->revision = $node->vid = $vid;
    }
  }

  // Debug message with node before creation.
  mailhandler_watchdog_record('Node or comment: @node', array(
    '@node' => var_export($node, TRUE),
  ), WATCHDOG_DEBUG);
  return $node;
}