plugins/calendar plugins/kolab_addressbook plugins/libkolab plugins/tasklist

Thomas Brüderli bruederli at kolabsys.com
Thu Jul 18 17:48:03 CEST 2013


 plugins/calendar/drivers/kolab/kolab_driver.php          |   15 +---
 plugins/kolab_addressbook/kolab_addressbook.php          |   13 +---
 plugins/libkolab/config.inc.php.dist                     |    4 +
 plugins/libkolab/lib/kolab_storage.php                   |   46 ++++++++++++---
 plugins/tasklist/drivers/kolab/tasklist_kolab_driver.php |   36 +++++------
 5 files changed, 67 insertions(+), 47 deletions(-)

New commits:
commit 64174f4fac0f703170866254bc1c05f7147a7445
Author: Thomas Bruederli <bruederli at kolabsys.com>
Date:   Thu Jul 18 17:47:49 2013 +0200

    Use a global function to sort folder names by namespace/name; add option to control the use of displayname folder annotations

diff --git a/plugins/calendar/drivers/kolab/kolab_driver.php b/plugins/calendar/drivers/kolab/kolab_driver.php
index f873166..3e0b8b0 100644
--- a/plugins/calendar/drivers/kolab/kolab_driver.php
+++ b/plugins/calendar/drivers/kolab/kolab_driver.php
@@ -72,19 +72,12 @@ class kolab_driver extends calendar_driver
     if (isset($this->calendars))
       return $this->calendars;
 
-    // get all folders that have "event" type
-    $folders = kolab_storage::get_folders('event');
+    // get all folders that have "event" type, sorted by namespace/name
+    $folders = kolab_storage::sort_folders(kolab_storage::get_folders('event'));
     $this->calendars = array();
 
-    // convert to UTF8 and sort
-    $names = array();
-    foreach ($folders as $folder)
-      $names[$folder->name] = rcube_charset::convert($folder->name, 'UTF7-IMAP');
-
-    asort($names, SORT_LOCALE_STRING);
-
-    foreach (array_keys($names) as $utf7name) {
-      $calendar = new kolab_calendar($utf7name, $this->cal);
+    foreach ($folders as $folder) {
+      $calendar = new kolab_calendar($folder->name, $this->cal);
       $this->calendars[$calendar->id] = $calendar;
       if (!$calendar->readonly)
         $this->has_writeable = true;
diff --git a/plugins/kolab_addressbook/kolab_addressbook.php b/plugins/kolab_addressbook/kolab_addressbook.php
index ac38f6a..2059dea 100644
--- a/plugins/kolab_addressbook/kolab_addressbook.php
+++ b/plugins/kolab_addressbook/kolab_addressbook.php
@@ -233,7 +233,7 @@ class kolab_addressbook extends rcube_plugin
         }
 
         // get all folders that have "contact" type
-        $this->folders = kolab_storage::get_folders('contact');
+        $this->folders = kolab_storage::sort_folders(kolab_storage::get_folders('contact'));
 
         if (PEAR::isError($this->folders)) {
             rcube::raise_error(array(
@@ -245,15 +245,10 @@ class kolab_addressbook extends rcube_plugin
         else {
             // convert to UTF8 and sort
             $names = array();
-            foreach ($this->folders as $c_folder)
-                $names[$c_folder->name] = rcube_charset::convert($c_folder->name, 'UTF7-IMAP');
-
-            asort($names, SORT_LOCALE_STRING);
-
-            foreach (array_keys($names) as $utf7name) {
+            foreach ($this->folders as $folder) {
                 // create instance of rcube_contacts
-                $abook_id = kolab_storage::folder_id($utf7name);
-                $abook = new rcube_kolab_contacts($utf7name);
+                $abook_id = kolab_storage::folder_id($folder->name);
+                $abook = new rcube_kolab_contacts($folder->name);
                 $this->sources[$abook_id] = $abook;
             }
         }
diff --git a/plugins/libkolab/config.inc.php.dist b/plugins/libkolab/config.inc.php.dist
index 01e1334..aa0c8d0 100644
--- a/plugins/libkolab/config.inc.php.dist
+++ b/plugins/libkolab/config.inc.php.dist
@@ -19,4 +19,8 @@ $rcmail_config['kolab_ssl_verify_peer'] = false;
 // folders in calendar view or available addressbooks
 $rcmail_config['kolab_use_subscriptions'] = false;
 
+// Enables the use of displayname folder annotations as introduced in KEP:?
+// for displaying resource folder names (experimental!)
+$rcmail_config['kolab_custom_display_names'] = false;
+
 ?>
diff --git a/plugins/libkolab/lib/kolab_storage.php b/plugins/libkolab/lib/kolab_storage.php
index 2f3cdc5..777702d 100644
--- a/plugins/libkolab/lib/kolab_storage.php
+++ b/plugins/libkolab/lib/kolab_storage.php
@@ -388,9 +388,11 @@ class kolab_storage
         self::setup();
 
         // find custom display name in folder METADATA
-        $metadata = self::$imap->get_metadata($folder, array(self::NAME_KEY_PRIVATE, self::NAME_KEY_SHARED));
-        if (($name = $metadata[$folder][self::NAME_KEY_PRIVATE]) || ($name = $metadata[$folder][self::NAME_KEY_SHARED])) {
-            return $name;
+        if (self::$config->get('kolab_custom_display_names', true)) {
+            $metadata = self::$imap->get_metadata($folder, array(self::NAME_KEY_PRIVATE, self::NAME_KEY_SHARED));
+            if (($name = $metadata[$folder][self::NAME_KEY_PRIVATE]) || ($name = $metadata[$folder][self::NAME_KEY_SHARED])) {
+                return $name;
+            }
         }
 
         $found     = false;
@@ -645,13 +647,43 @@ class kolab_storage
 
 
     /**
+     * Sort the given list of kolab folders by namespace/name
+     *
+     * @param array List of kolab_storage_folder objects
+     * @return array Sorted list of folders
+     */
+    public static function sort_folders($folders)
+    {
+        $nsnames = array('personal' => array(), 'shared' => array(), 'other' => array());
+        foreach ($folders as $folder) {
+            $folders[$folder->name] = $folder;
+            $ns = $folder->get_namespace();
+            $nsnames[$ns][$folder->name] = strtolower(html_entity_decode(self::object_name($folder->name, $ns), ENT_COMPAT, RCUBE_CHARSET));  // decode »
+        }
+
+        $names = array();
+        foreach ($nsnames as $ns => $dummy) {
+            asort($nsnames[$ns], SORT_LOCALE_STRING);
+            $names += $nsnames[$ns];
+        }
+
+        $out = array();
+        foreach ($names as $utf7name => $name) {
+            $out[] = $folders[$utf7name];
+        }
+
+        return $out;
+    }
+
+
+    /**
      * Returns folder types indexed by folder name
      *
      * @param string $prefix Folder prefix (Default '*' for all folders)
      *
      * @return array|bool List of folders, False on failure
      */
-    static function folders_typedata($prefix = '*')
+    public static function folders_typedata($prefix = '*')
     {
         if (!self::setup()) {
             return false;
@@ -670,7 +702,7 @@ class kolab_storage
     /**
      * Callback for array_map to select the correct annotation value
      */
-    static function folder_select_metadata($types)
+    public static function folder_select_metadata($types)
     {
         if (!empty($types[self::CTYPE_KEY_PRIVATE])) {
             return $types[self::CTYPE_KEY_PRIVATE];
@@ -690,7 +722,7 @@ class kolab_storage
      *
      * @return string Folder type
      */
-    static function folder_type($folder)
+    public static function folder_type($folder)
     {
         self::setup();
 
@@ -716,7 +748,7 @@ class kolab_storage
      *
      * @return boolean True on success
      */
-    static function set_folder_type($folder, $type='mail')
+    public static function set_folder_type($folder, $type='mail')
     {
         self::setup();
 
diff --git a/plugins/tasklist/drivers/kolab/tasklist_kolab_driver.php b/plugins/tasklist/drivers/kolab/tasklist_kolab_driver.php
index 078243a..0d98c2f 100644
--- a/plugins/tasklist/drivers/kolab/tasklist_kolab_driver.php
+++ b/plugins/tasklist/drivers/kolab/tasklist_kolab_driver.php
@@ -62,26 +62,21 @@ class tasklist_kolab_driver extends tasklist_driver
             return $this->lists;
 
         // get all folders that have type "task"
-        $this->folders = kolab_storage::get_folders('task');
-        $this->lists = array();
-
-        // convert to UTF8 and sort
-        $names = array();
-        $default_folder = null;
-        foreach ($this->folders as $folder) {
-            $names[$folder->name] = rcube_charset::convert($folder->name, 'UTF7-IMAP');
-            $this->folders[$folder->name] = $folder;
+        $folders = kolab_storage::sort_folders(kolab_storage::get_folders('task'));
+        $this->lists = $this->folders = array();
+
+        // find default folder
+        $default_index = 0;
+        foreach ($folders as $i => $folder) {
             if ($folder->default)
-                $default_folder = $folder->name;
+                $default_index = $i;
         }
 
-        asort($names, SORT_LOCALE_STRING);
-
         // put default folder (aka INBOX) on top of the list
-        if ($default_folder) {
-            $default_name = $names[$default_folder];
-            unset($names[$default_folder]);
-            $names = array_merge(array($default_folder => $default_name), $names);
+        if ($default_index > 0) {
+            $default_folder = $folders[$default_index];
+            unset($folders[$default_index]);
+            array_unshift($folders, $default_folder);
         }
 
         $delim = $this->rc->get_storage()->get_hierarchy_delimiter();
@@ -89,11 +84,12 @@ class tasklist_kolab_driver extends tasklist_driver
 
         $prefs = $this->rc->config->get('kolab_tasklists', array());
 
-        foreach ($names as $utf7name => $name) {
-            $folder = $this->folders[$utf7name];
+        foreach ($folders as $folder) {
+            $utf7name = $folder->name;
+            $this->folders[$folder->name] = $folder;
 
-            $path_imap = explode($delim, $name);
-            $editname = array_pop($path_imap);  // pop off raw name part
+            $path_imap = explode($delim, $utf7name);
+            $editname = rcube_charset::convert(array_pop($path_imap), 'UTF7-IMAP');  // pop off raw name part
             $path_imap = join($delim, $path_imap);
 
             $name = kolab_storage::folder_displayname(kolab_storage::object_name($utf7name), $listnames);




More information about the commits mailing list