From ade8e117dfbb62f6dbd16b4aca81dfbdbd054579 Mon Sep 17 00:00:00 2001
From: thomascube <thomas@roundcube.net>
Date: Tue, 02 Sep 2008 03:42:46 -0400
Subject: [PATCH] Let rcmail class create address book instances

---
 program/include/rcmail.php         |   32 ++++++++++++++++
 program/steps/addressbook/func.inc |   11 -----
 program/steps/addressbook/copy.inc |    9 +---
 program/steps/mail/addcontact.inc  |   16 +-------
 4 files changed, 38 insertions(+), 30 deletions(-)

diff --git a/program/include/rcmail.php b/program/include/rcmail.php
index 00dca6e..348a916 100644
--- a/program/include/rcmail.php
+++ b/program/include/rcmail.php
@@ -235,6 +235,38 @@
   
   
   /**
+   * Return instance of the internal address book class
+   *
+   * @param boolean True if the address book needs to be writeable
+   * @return object rcube_contacts Address book object
+   */
+  public function get_address_book($id, $writeable = false)
+  {
+    $contacts = null;
+    $ldap_config = (array)$this->config->get('ldap_public');
+    $abook_type = strtolower($this->config->get('address_book_type'));
+    
+    if ($id && $ldap_config[$id]) {
+      $contacts = new rcube_ldap($ldap_config[$id]);
+    }
+    else if ($abook_type == 'ldap') {
+      // Use the first writable LDAP address book.
+      foreach ($ldap_config as $id => $prop) {
+        if (!$writeable || $prop['writable']) {
+          $contacts = new rcube_ldap($prop);
+          break;
+        }
+      }
+    }
+    else {
+      $contacts = new rcube_contacts($this->db, $this->user->ID);
+    }
+    
+    return $contacts;
+  }
+  
+  
+  /**
    * Init output object for GUI and add common scripts.
    * This will instantiate a rcmail_template object and set
    * environment vars according to the current session and configuration
diff --git a/program/steps/addressbook/copy.inc b/program/steps/addressbook/copy.inc
index af8b87c..268903b 100644
--- a/program/steps/addressbook/copy.inc
+++ b/program/steps/addressbook/copy.inc
@@ -23,12 +23,9 @@
 $target = get_input_value('_to', RCUBE_INPUT_POST);
 if ($cid && preg_match('/^[a-z0-9\-_=]+(,[a-z0-9\-_=]+)*$/i', $cid) && strlen($target) && $target != $source)
 {
-  if ($target != '0')
-    $TARGET = new rcube_ldap($CONFIG['ldap_public'][$target]);
-  else
-    $TARGET = new rcube_contacts($DB, $_SESSION['user_id']);
-    
-  $success = false;  
+  $success = false;
+  $TARGET = $RCMAIL->get_address_book($target);
+
   if ($TARGET && $TARGET->ready && !$TARGET->readonly)
     $success = $TARGET->insert($CONTACTS->search($CONTACTS->primary_key, $cid), true);
 
diff --git a/program/steps/addressbook/func.inc b/program/steps/addressbook/func.inc
index 98c56af..c4fbab2 100644
--- a/program/steps/addressbook/func.inc
+++ b/program/steps/addressbook/func.inc
@@ -20,16 +20,7 @@
 */
 
 // instantiate a contacts object according to the given source
-if (($source = get_input_value('_source', RCUBE_INPUT_GPC)) && isset($CONFIG['ldap_public'][$source]))
-  $CONTACTS = new rcube_ldap($CONFIG['ldap_public'][$source]);
-else if (strtolower($CONFIG['address_book_type']) == 'ldap') {
-    // Get the first LDAP address book.
-    $source = key((array)$CONFIG['ldap_public']);
-    $prop = current((array)$CONFIG['ldap_public']);
-    $CONTACTS = new rcube_ldap($prop);
-} else {
-    $CONTACTS = new rcube_contacts($DB, $_SESSION['user_id']);
-} // end else
+$CONTACTS = $RCMAIL->get_address_book(($source = get_input_value('_source', RCUBE_INPUT_GPC)));
 
 $CONTACTS->set_pagesize($CONFIG['pagesize']);
 
diff --git a/program/steps/mail/addcontact.inc b/program/steps/mail/addcontact.inc
index aefdd83..d98d71f 100644
--- a/program/steps/mail/addcontact.inc
+++ b/program/steps/mail/addcontact.inc
@@ -20,22 +20,10 @@
 */
 
 $done = false;
+$CONTACTS = $RCMAIL->get_address_book(null, true);
 
-if (!empty($_POST['_address']))
+if (!empty($_POST['_address']) && is_object($CONTACTS))
 {
-  $CONTACTS = array();
-  if (strtolower($CONFIG['address_book_type']) == 'ldap') {
-    // Use the first writable LDAP address book.
-    foreach ($CONFIG["ldap_public"] as $id => $prop) {
-      if ($prop["writable"]) {
-        $CONTACTS = new rcube_ldap($prop);
-        break;
-      } // end if
-    } // end foreach
-  } // end if
-  else {
-    $CONTACTS = new rcube_contacts($DB, $_SESSION['user_id']);
-  } // end else
   $contact_arr = $IMAP->decode_address_list(get_input_value('_address', RCUBE_INPUT_POST, true), 1, false);
   
   if (!empty($contact_arr[1]['mailto']))

--
Gitblit v1.9.1