Changeset View
Changeset View
Standalone View
Standalone View
plugins/libkolab/lib/kolab_storage.php
Show First 20 Lines • Show All 41 Lines • ▼ Show 20 Lines | class kolab_storage | ||||
public static $version = '3.0'; | public static $version = '3.0'; | ||||
public static $last_error; | public static $last_error; | ||||
public static $encode_ids = false; | public static $encode_ids = false; | ||||
private static $ready = false; | private static $ready = false; | ||||
private static $with_tempsubs = true; | private static $with_tempsubs = true; | ||||
private static $subscriptions; | private static $subscriptions; | ||||
private static $ldapcache = array(); | private static $ldapcache = array(); | ||||
private static $typedata = array(); | |||||
private static $ldap = array(); | private static $ldap = array(); | ||||
private static $states; | private static $states; | ||||
private static $config; | private static $config; | ||||
private static $imap; | private static $imap; | ||||
// Default folder names | // Default folder names | ||||
private static $default_folders = array( | private static $default_folders = array( | ||||
▲ Show 20 Lines • Show All 805 Lines • ▼ Show 20 Lines | public static function list_folders($root = '', $mbox = '*', $filter = null, $subscribed = null, &$folderdata = array()) | ||||
// get folders types for all folders | // get folders types for all folders | ||||
$folderdata = self::folders_typedata($prefix); | $folderdata = self::folders_typedata($prefix); | ||||
if (!is_array($folderdata)) { | if (!is_array($folderdata)) { | ||||
return array(); | return array(); | ||||
} | } | ||||
// In some conditions we can skip LIST command (?) | // If we only want groupware folders and don't care about the subscription state, | ||||
// then the metadata will already contain all folder names and we can avoid the LIST below. | |||||
if (!$subscribed && $filter != 'mail' && $prefix == '*') { | if (!$subscribed && $filter != 'mail' && $prefix == '*') { | ||||
foreach ($folderdata as $folder => $type) { | foreach ($folderdata as $folder => $type) { | ||||
if (!preg_match($regexp, $type)) { | if (!preg_match($regexp, $type)) { | ||||
unset($folderdata[$folder]); | unset($folderdata[$folder]); | ||||
} | } | ||||
} | } | ||||
return self::$imap->sort_folder_list(array_keys($folderdata), true); | return self::$imap->sort_folder_list(array_keys($folderdata), true); | ||||
▲ Show 20 Lines • Show All 220 Lines • ▼ Show 20 Lines | |||||
* @return array|bool List of folders, False on failure | * @return array|bool List of folders, False on failure | ||||
*/ | */ | ||||
public static function folders_typedata($prefix = '*') | public static function folders_typedata($prefix = '*') | ||||
{ | { | ||||
if (!self::setup()) { | if (!self::setup()) { | ||||
return false; | return false; | ||||
} | } | ||||
// return cached result | |||||
if (is_array(self::$typedata[$prefix])) { | |||||
return self::$typedata[$prefix]; | |||||
} | |||||
$type_keys = array(self::CTYPE_KEY, self::CTYPE_KEY_PRIVATE); | $type_keys = array(self::CTYPE_KEY, self::CTYPE_KEY_PRIVATE); | ||||
// fetch metadata from *some* folders only | // fetch metadata from *some* folders only | ||||
if (($prefix == '*' || $prefix == '') && ($skip_ns = self::$config->get('kolab_skip_namespace'))) { | if (($prefix == '*' || $prefix == '') && ($skip_ns = self::$config->get('kolab_skip_namespace'))) { | ||||
$delimiter = self::$imap->get_hierarchy_delimiter(); | $delimiter = self::$imap->get_hierarchy_delimiter(); | ||||
$folderdata = $blacklist = array(); | $folderdata = $blacklist = array(); | ||||
foreach ((array)$skip_ns as $ns) { | foreach ((array)$skip_ns as $ns) { | ||||
if ($ns_root = rtrim(self::namespace_root($ns), $delimiter)) { | if ($ns_root = rtrim(self::namespace_root($ns), $delimiter)) { | ||||
Show All 26 Lines | public static function folders_typedata($prefix = '*') | ||||
else { | else { | ||||
$folderdata = self::$imap->get_metadata($prefix, $type_keys); | $folderdata = self::$imap->get_metadata($prefix, $type_keys); | ||||
} | } | ||||
if (!is_array($folderdata)) { | if (!is_array($folderdata)) { | ||||
return false; | return false; | ||||
} | } | ||||
// keep list in memory | return array_map(array('kolab_storage', 'folder_select_metadata'), $folderdata); | ||||
self::$typedata[$prefix] = array_map(array('kolab_storage', 'folder_select_metadata'), $folderdata); | |||||
return self::$typedata[$prefix]; | |||||
} | } | ||||
/** | /** | ||||
* Callback for array_map to select the correct annotation value | * Callback for array_map to select the correct annotation value | ||||
*/ | */ | ||||
public static function folder_select_metadata($types) | public static function folder_select_metadata($types) | ||||
{ | { | ||||
if (!empty($types[self::CTYPE_KEY_PRIVATE])) { | if (!empty($types[self::CTYPE_KEY_PRIVATE])) { | ||||
Show All 12 Lines | |||||
* @param string $folder Folder name (UTF7-IMAP) | * @param string $folder Folder name (UTF7-IMAP) | ||||
* | * | ||||
* @return string Folder type | * @return string Folder type | ||||
*/ | */ | ||||
public static function folder_type($folder) | public static function folder_type($folder) | ||||
{ | { | ||||
self::setup(); | self::setup(); | ||||
// return in-memory cached result | |||||
foreach (self::$typedata as $typedata) { | |||||
if (array_key_exists($folder, $typedata)) { | |||||
return $typedata[$folder]; | |||||
} | |||||
} | |||||
$metadata = self::$imap->get_metadata($folder, array(self::CTYPE_KEY, self::CTYPE_KEY_PRIVATE)); | $metadata = self::$imap->get_metadata($folder, array(self::CTYPE_KEY, self::CTYPE_KEY_PRIVATE)); | ||||
if (!is_array($metadata)) { | if (!is_array($metadata)) { | ||||
return null; | return null; | ||||
} | } | ||||
if (!empty($metadata[$folder])) { | if (!empty($metadata[$folder])) { | ||||
return self::folder_select_metadata($metadata[$folder]); | return self::folder_select_metadata($metadata[$folder]); | ||||
▲ Show 20 Lines • Show All 608 Lines • Show Last 20 Lines |