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