| | |
| | | | Author: Thomas Bruederli <roundcube@gmail.com> | |
| | | | Author: Aleksander Machniak <alec@alec.pl> | |
| | | +-----------------------------------------------------------------------+ |
| | | |
| | | $Id$ |
| | | |
| | | */ |
| | | |
| | | |
| | |
| | | */ |
| | | public function check_permflag($flag) |
| | | { |
| | | $flag = strtoupper($flag); |
| | | $imap_flag = $this->conn->flags[$flag]; |
| | | $flag = strtoupper($flag); |
| | | $imap_flag = $this->conn->flags[$flag]; |
| | | $perm_flags = $this->get_permflags($this->folder); |
| | | |
| | | if ($this->folder !== null) { |
| | | $this->check_connection(); |
| | | return in_array_nocase($imap_flag, $perm_flags); |
| | | } |
| | | |
| | | |
| | | /** |
| | | * Returns PERMANENTFLAGS of the specified folder |
| | | * |
| | | * @param string $folder Folder name |
| | | * |
| | | * @return array Flags |
| | | */ |
| | | public function get_permflags($folder) |
| | | { |
| | | if (!strlen($folder)) { |
| | | return array(); |
| | | } |
| | | // @TODO: cache permanent flags (?) |
| | | /* |
| | | Checking PERMANENTFLAGS is rather rare, so we disable caching of it |
| | | Re-think when we'll use it for more than only MDNSENT flag |
| | | |
| | | return (in_array_nocase($imap_flag, $this->conn->data['PERMANENTFLAGS'])); |
| | | $cache_key = 'mailboxes.permanentflags.' . $folder; |
| | | $permflags = $this->get_cache($cache_key); |
| | | |
| | | if ($permflags !== null) { |
| | | return explode(' ', $permflags); |
| | | } |
| | | */ |
| | | if (!$this->check_connection()) { |
| | | return array(); |
| | | } |
| | | |
| | | if ($this->conn->select($folder)) { |
| | | $permflags = $this->conn->data['PERMANENTFLAGS']; |
| | | } |
| | | else { |
| | | return array(); |
| | | } |
| | | |
| | | if (!is_array($permflags)) { |
| | | $permflags = array(); |
| | | } |
| | | /* |
| | | // Store permflags as string to limit cached object size |
| | | $this->update_cache($cache_key, implode(' ', $permflags)); |
| | | */ |
| | | return $permflags; |
| | | } |
| | | |
| | | |
| | |
| | | return array(); |
| | | } |
| | | |
| | | $config = rcube::get_instance()->config; |
| | | |
| | | // #1486796: some server configurations doesn't return folders in all namespaces |
| | | if ($root == '' && $name == '*' && $config->get('imap_force_ns')) { |
| | | $this->list_folders_update($result); |
| | |
| | | return false; |
| | | } |
| | | |
| | | $this->clear_cache('mailboxes.metadata.' . $folder); |
| | | $this->clear_cache('mailboxes.metadata.', true); |
| | | |
| | | if ($this->get_capability('METADATA') || |
| | | (!strlen($folder) && $this->get_capability('METADATA-SERVER')) |
| | |
| | | return false; |
| | | } |
| | | |
| | | $this->clear_cache('mailboxes.metadata.' . $folder); |
| | | $this->clear_cache('mailboxes.metadata.', true); |
| | | |
| | | if ($this->get_capability('METADATA') || |
| | | if ($this->get_capability('METADATA') || |
| | | (!strlen($folder) && $this->get_capability('METADATA-SERVER')) |
| | | ) { |
| | | return $this->conn->deleteMetadata($folder, $entries); |
| | |
| | | */ |
| | | public function get_metadata($folder, $entries, $options=array()) |
| | | { |
| | | $entries = (array)$entries; |
| | | |
| | | // create cache key |
| | | // @TODO: this is the simplest solution, but we do the same with folders list |
| | | // maybe we should store data per-entry and merge on request |
| | | sort($options); |
| | | sort($entries); |
| | | $cache_key = 'mailboxes.metadata.' . $folder; |
| | | $cache_key .= '.' . md5(serialize($options).serialize($entries)); |
| | | |
| | | // get cached data |
| | | $cached_data = $this->get_cache($cache_key); |
| | | |
| | | if (is_array($cached_data)) { |
| | | return $cached_data; |
| | | } |
| | | |
| | | if (!$this->check_connection()) { |
| | | return null; |
| | | } |
| | | |
| | | $cache_key = 'mailboxes.metadata.' . $folder; |
| | | if ($cached = $this->get_cache($cache_key)) |
| | | return $cached; |
| | | |
| | | if ($this->get_capability('METADATA') || |
| | | (!strlen($folder) && $this->get_capability('METADATA-SERVER')) |
| | | ) { |
| | | $res = $this->conn->getMetadata($folder, $entries, $options); |
| | | $this->update_cache($cache_key, $res); |
| | | return $res; |
| | | } |
| | | else if ($this->get_capability('ANNOTATEMORE') || $this->get_capability('ANNOTATEMORE2')) { |
| | | $queries = array(); |
| | | $res = array(); |
| | | |
| | | // Convert entry names |
| | | foreach ((array)$entries as $entry) { |
| | | foreach ($entries as $entry) { |
| | | list($ent, $attr) = $this->md2annotate($entry); |
| | | $queries[$attr][] = $ent; |
| | | } |
| | |
| | | $res = array_merge_recursive($res, $result); |
| | | } |
| | | } |
| | | } |
| | | |
| | | if (isset($res)) { |
| | | $this->update_cache($cache_key, $res); |
| | | return $res; |
| | | } |
| | |
| | | return $this->list_messages($folder, $page, $sort_field, $sort_order, $slice); |
| | | } |
| | | |
| | | public function get_headers($uid, $folder = null, $force = false) |
| | | { |
| | | return $this->get_message_headers($uid, $folder, $force); |
| | | } |
| | | |
| | | public function mailbox_status($folder = null) |
| | | { |
| | | return $this->folder_status($folder); |