? privatemsgapi/privatemsgapi.inc_api
? privatemsgapi/privatemsgapi.test
? privatemsgapi/privatemsgapi_escape.diff
Index: privatemsgapi/privatemsgapi.inc
===================================================================
RCS file: /cvs/drupal/contributions/modules/privatemsg/privatemsgapi/privatemsgapi.inc,v
retrieving revision 1.8
diff -w -u -p -r1.8 privatemsgapi.inc
--- privatemsgapi/privatemsgapi.inc	15 Dec 2008 16:53:34 -0000	1.8
+++ privatemsgapi/privatemsgapi.inc	28 Dec 2008 13:22:05 -0000
@@ -1,53 +1,9 @@
 <?php
-
-
+// $Id$
 
 /**
- * Message sending helper functions
- */
-/**
- * Saves message to group association
- *
- * group could be thread!
- *
- * @param $pmid - privatemsg id
- * @param $gid  - group id
+ * @file Message sending helper functions
  */
-function _save_privatemsg_group($pmid, $gid) {
-  //make sure that group and msg id are numeric
-  if (!is_numeric($pmid) || !is_numeric($gid)) {
-    return FALSE;
-  }
-  db_query("INSERT INTO {privatemsg_group} (pmid, gid) VALUES (%d, %d)", $pmid, $gid);
-}
-
-/**
- * Save group to users association
- *
- * This message is called only when a new message is being sent
- * 'new message' or 'forward message' are qualified new messages for which group_user must be created
- *
- * @param $gid - group id
- * @param $users - array of user ID
- */
-function _save_privatemsg_group_user($gid, $users = array()) {
-  //make sure all conditions are met for this function to work
-  if (!is_numeric($gid) || !is_array($user) || empty($user)) {
-    return FALSE;
-  }
-  //build the query, regardless of how many users added, this will execute only one query
-  $query = "INSERT INTO {privatemsg_group_user} (gid, uid) VALUES ";
-  $values = array();
-  $replacement = array();
-  foreach ( $users as $index => $user ) {
-    $values[]      = "(%d, %d)";
-    $replacement[] = $gid;
-    $replacement[] = $uid;
-  }
-
-  $query .= implode(", ", $values);
-  db_query($query, $replacement);
-}
 
 /**
  * Privatemsg load single msg api
@@ -158,3 +114,152 @@ function _privatemsg_assemble_query($que
   }
   return FALSE;
 }
+
+function privatemsg_new_thread($subject, $body, $recipients, $author = NULL) {
+  if ($author == NULL) {
+    global $user;
+    $author = drupal_clone($user);
+  }
+
+  $message = array();
+  $message['subject'] = $subject;
+  $message['author'] = $author;
+  $message['body'] = $body;
+  $message['timestamp'] = time();
+  $message['recipients'] = $recipients;
+
+  $errors = _privatemsg_validate_message($message, $author);
+  if (!empty($errors)) {
+     return $errors;
+  }
+   else {
+     return _privatemsg_send($message);
+  }
+}
+
+function privatemsg_answer($thread_id, $body, $author = NULL) {
+  if ($author == NULL) {
+    global $user;
+    $author = drupal_clone($user);
+  }
+
+  $message = array();
+  $message['author'] = $author;
+  $message['body'] = $body;
+  $message['timestamp'] = time();
+  $message['thread_id'] = $thread_id;
+
+  // We don't know the subject and the recipients, so we need to load them..
+  // thread_id == mid on the first message of the thread
+  $first_message = _privatemsg_load($thread_id, $author->uid);
+  if (!$first_message) {
+    return array(t('Thread %thread_id not found, unable to answer', array('%thread_id' => $thread_id)));
+  }
+  
+    
+  $query = _privatemsg_assemble_query('privatemsg_participants', $thread_id);
+  $participants = db_query($query['query']);
+  while ($result = db_fetch_object($participants)) {
+    $recipient = user_load($result->uid);
+      $message['recipients'][$recipient->uid] = $recipient;
+  }
+
+  $message['subject'] = $first_message['subject'];
+
+  $errors = _privatemsg_validate_message($message, $author);
+  if (!empty($errors)) {
+     return $errors;
+  }
+   else {
+     return _privatemsg_send($message);
+  }
+}
+
+function _privatemsg_validate_message($message, $author) {
+
+  $errors = array();
+  if (!user_access('write privatemsg', $author)) {
+    // no need to do further checks in this case...
+    return array(t('User @user is not allowed to write messages', array('@user' => $author->name)));
+  }
+
+  if (empty($message['subject'])) {
+    $errors[] = t('Disallowed to send a message without subject');
+  }
+
+  $trimmed = trim(strip_tags($message['body']));
+  if (empty($trimmed)) {
+    $errors[] = t('Disallowed to send a message without body');
+  }
+
+  if (!is_array($message['recipients']) || empty($message['recipients'])) {
+    $errors[] = t('Disallowed to send a message without atleast one recipient, parameter recipients needs to be an array');
+  }
+
+  if (is_array($message['recipients'])) {
+    foreach ($message['recipients'] as $uid => $recipient) {
+      if (count(module_invoke_all('privatemsg_block_message', $author, $recipient)) > 0) {
+        unset($message['recipients'][$uid]);
+      }
+    }
+  }
+
+  // Check again, give another error message if all recipients are blocked
+  if (empty($message['recipients'])) {
+    $errors[] = t('Disallowed to send message because all recipients are blocked');
+  }
+
+  return $errors += module_invoke_all('privatemsg_message_validate', $message);
+}
+
+function _privatemsg_send($message) {
+
+  drupal_alter('privatemsg_message_presave', $message);
+
+  // 1) Save the message body first.
+  $args = array();
+  $args[] = $message['subject'];
+  $args[] = $message['author']->uid;
+  $args[] = $message['body'];
+  $args[] = $message['timestamp'];
+  $query = "INSERT INTO {pm_message} (subject, author, body, timestamp) VALUES ('%s', %d, '%s', %d)";
+  $resuld = db_query($query, $args);
+  $mid = db_last_insert_id('pm_message', 'mid');
+  $message['mid'] = $mid;
+
+  // Thread ID is the same as the mid if it's the first message in the thread.
+  if (!isset($message['thread_id'])) {
+    $message['thread_id'] = $mid;
+  }
+
+  // 2) Save message to recipients.
+  // Each recipient gets a record in the pm_index table.
+
+  $query = "INSERT INTO {pm_index} (mid, thread_id, uid, is_new, deleted) VALUES (%d, %d, %d, %d, 0)";
+  foreach ($message['recipients'] as $recipient) {
+    $mid = $message['mid'];
+    db_query($query, $mid, $message['thread_id'], $recipient->uid, 1);
+  }
+  // Also add a record for tha author to the pm_index table - set  column "new" to 0.
+  db_query($query, $mid, $message['thread_id'], $message['author']->uid, 0);
+
+  drupal_alter('privatemsg_message_insert', $message);
+
+  return TRUE;
+}
+
+function privatemsg_get_link($recipient, $account = NULL) {
+  if ($account == NULL) {
+    global $user;
+    $account = $user;
+  }
+  if (!user_access('write privatemsg', $account) || $recipient->uid == $account->uid) {
+    return FALSE;
+  }
+
+  if (count(module_invoke_all('privatemsg_block_message', $account, $recipient)) > 0) {
+    return FALSE;
+  }
+
+  return 'messages/new/'. $recipient->uid;
+}
