? overlay_subtabs_invisible.png
Index: privatemsg.module
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/privatemsg/privatemsg.module,v
retrieving revision 1.70.2.30.2.91.2.64.2.70
diff -u -p -r1.70.2.30.2.91.2.64.2.70 privatemsg.module
--- privatemsg.module	9 Jul 2010 20:21:52 -0000	1.70.2.30.2.91.2.64.2.70
+++ privatemsg.module	11 Jul 2010 07:24:10 -0000
@@ -1767,9 +1767,6 @@ function privatemsg_message_load_multipl
       // If user does not exist, load anonymous user.
       $message->author = _privatemsg_user_load(0);
     }
-    if (!empty($returned)) {
-      $message = array_merge_recursive($returned, $message);
-    }
     $messages[$message->mid] = $message;
   }
   field_attach_load('privatemsg_message', $messages);
Index: privatemsg.pages.inc
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/privatemsg/privatemsg.pages.inc,v
retrieving revision 1.1.2.11
diff -u -p -r1.1.2.11 privatemsg.pages.inc
--- privatemsg.pages.inc	7 Jul 2010 09:55:15 -0000	1.1.2.11
+++ privatemsg.pages.inc	11 Jul 2010 07:24:10 -0000
@@ -411,6 +411,7 @@ function privatemsg_new_validate($form, 
   // The actual message that is being sent, we create this during validation and
   // pass to submit to send out.
   $message = (object)$form_state['values'];
+  $message->mid       = 0;
   $message->format    = $message->body['format'];
   $message->body      = $message->body['value'];
   $message->timestamp = time();
@@ -441,15 +442,17 @@ function privatemsg_new_validate($form, 
 }
 
 function privatemsg_new_preview($form, &$form_state) {
-
-  drupal_validate_form($form['form_id']['#value'], $form, $form_state);
-  if (!form_get_errors()) {
-    $form_state['privatemsg_preview'] = array(
-        '#markup' => theme('privatemsg_view', array('message' => $form_state['validate_built_message'])),
-    );
-  }
-
-  $form_state['rebuild'] = TRUE; // this forces our form to be rebuilt instead of being submitted.
+  $message = $form_state['validate_built_message'];
+  // Execute submit hook, removes empty fields.
+  field_attach_submit('privatemsg_message', $message, $form, $form_state);
+  // Load information attached to the message. Use an internal function
+  // to avoid the internal field cache.
+  _field_invoke_multiple('load', 'privatemsg_message', array($message->mid => $message));
+  $form_state['privatemsg_preview'] = array(
+    '#markup' => theme('privatemsg_view', array('message' => $message)),
+  );
+  // This forces the form to be rebuilt instead of being submitted.
+  $form_state['rebuild'] = TRUE;
 }
 
 
@@ -457,18 +460,28 @@ function privatemsg_new_preview($form, &
  * Submit callback for the privatemsg_new form.
  */
 function privatemsg_new_submit($form, &$form_state) {
-  $status = _privatemsg_send($form_state['validate_built_message']);
+  $message = $form_state['validate_built_message'];
+  field_attach_submit('privatemsg_message', $message, $form, $form_state);
+
   // Format each recipient.
   $recipient_names = array();
-  foreach ($form_state['validate_built_message']->recipients as $recipient) {
+  foreach ($message->recipients as $recipient) {
     $recipient_names[] = privatemsg_recipient_format($recipient);
   }
-  if ($status !== FALSE )  {
-    _privatemsg_handle_recipients($status->mid, $status->recipients);
+  try {
+    $message = _privatemsg_send($message);
+    _privatemsg_handle_recipients($message->mid, $message->recipients);
     drupal_set_message(t('A message has been sent to !recipients.', array('!recipients' => implode(', ', $recipient_names))));
   }
-  else {
-    drupal_set_message(t('An attempt to send a message <em>may have failed</em> when sending to !recipients.', array('!recipients' => implode(', ', $recipient_names))), 'error');
+  catch (Exception $e) {
+    if (error_displayable()) {
+      require_once DRUPAL_ROOT . '/includes/errors.inc';
+      $variables = _drupal_decode_exception($e);
+      drupal_set_message(t('Failed to send a message to !recipients. %type: %message in %function (line %line of %file).', array('!recipients' => implode(', ', $recipient_names)) + $variables), 'error');
+    }
+    else {
+      drupal_set_message(t('Failed to send a message to !recipients. Contact your site administrator.', array('!recipients' => implode(', ', $recipient_names))), 'error');
+    }
   }
 }
 
Index: privatemsg.test
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/privatemsg/privatemsg.test,v
retrieving revision 1.2.2.1.2.27
diff -u -p -r1.2.2.1.2.27 privatemsg.test
--- privatemsg.test	8 Jul 2010 09:41:57 -0000	1.2.2.1.2.27
+++ privatemsg.test	11 Jul 2010 07:24:11 -0000
@@ -788,14 +788,17 @@ class PrivatemsgFieldsTestCase extends D
     $this->drupalPost(NULL, array(), t('Save field settings'));
     $this->drupalPost(NULL, array(), t('Save settings'));
 
-    // Send message.
+    // Preview message.
     $message = array(
       'recipient' => $user->name,
       'subject' => $this->randomName(),
       'body[value]'    => $this->randomName(50),
       'field_' . $name . '[und][0][value]' => $this->randomName(50),
     );
-    $this->drupalPost('messages/new', $message, t('Send message'));
+    $this->drupalPost('messages/new', $message, t('Preview message'));
+
+    // Send message.
+    $this->drupalPost(NULL, array(), t('Send message'));
 
     // Check message.
     $this->drupalLogin($user);
@@ -820,6 +823,45 @@ class PrivatemsgFieldsTestCase extends D
     $this->assertText($response['body[value]'], t('Message body displayed.'));
     $this->assertText($response['field_' . $name . '[und][0][value]'], t('Content of new field is displayed.'));
   }
+
+  /**
+   * Verify that a message with an empty image can be sent.
+   */
+  function testEmptyImage() {
+    $admin = $this->drupalCreateUser(array('administer privatemsg settings', 'write privatemsg', 'read privatemsg'));
+    $user = $this->drupalCreateUser(array('write privatemsg', 'read privatemsg'));
+
+    $this->drupalLogin($admin);
+
+    // Create a new field.
+    $edit = array(
+      '_add_new_field[label]' => $label = $this->randomName(),
+      '_add_new_field[field_name]' => $name = strtolower($this->randomName()),
+      '_add_new_field[type]' => 'image',
+      '_add_new_field[widget_type]' => 'image_image',
+    );
+    $this->drupalPost('admin/config/messaging/privatemsg/fields', $edit, t('Save'));
+    $this->drupalPost(NULL, array(), t('Save field settings'));
+    $this->drupalPost(NULL, array(), t('Save settings'));
+
+    // Preview message.
+    $message = array(
+      'recipient' => $user->name,
+      'subject' => $this->randomName(),
+      'body[value]'    => $this->randomName(50),
+    );
+    $this->drupalPost('messages/new', $message, t('Preview message'));
+
+    // Send message.
+    $this->drupalPost(NULL, array(), t('Send message'));
+
+    // Check message.
+    $this->drupalLogin($user);
+    $this->drupalGet('messages');
+    $this->clickLink($message['subject']);
+
+    $this->assertText($message['body[value]'], t('Message body displayed.'));
+  }
 }
 
 /**
