More fixes for multi-folder search (#1485234)
| | |
| | | $str = 'ALL'; |
| | | } |
| | | |
| | | if (empty($folder)) { |
| | | $folder = $this->folder; |
| | | } |
| | | |
| | | // multi-folder search |
| | | if (is_array($folder) && count($folder) > 1 && $str != 'ALL') { |
| | | new rcube_result_index; // trigger autoloader and make these classes available for threaded context |
| | |
| | | } |
| | | else { |
| | | $folder = is_array($folder) ? $folder[0] : $folder; |
| | | if (!strlen($folder)) { |
| | | $folder = $this->folder; |
| | | } |
| | | $results = $this->search_index($folder, $str, $charset, $sort_field); |
| | | } |
| | | |
| | |
| | | public function refresh_search() |
| | | { |
| | | if (!empty($this->search_string)) { |
| | | // FIXME: make this work with saved multi-folder searches |
| | | $this->search('', $this->search_string, $this->search_charset, $this->search_sort_field); |
| | | $this->search( |
| | | is_object($this->search_set) ? $this->search_set->get_parameters('MAILBOX') : '', |
| | | $this->search_string, |
| | | $this->search_charset, |
| | | $this->search_sort_field |
| | | ); |
| | | } |
| | | |
| | | return $this->get_search_set(); |
| | |
| | | { |
| | | $pthreads = defined('PTHREADS_INHERIT_ALL'); |
| | | |
| | | $results = new rcube_result_multifolder($folders); |
| | | |
| | | // start a search job for every folder to search in |
| | | foreach ($folders as $folder) { |
| | | $job = new rcube_imap_search_job($folder, $str, $charset, $sort_field, $threading); |
| | |
| | | $this->shutdown(); |
| | | |
| | | // gather results |
| | | $results = new rcube_result_multifolder; |
| | | foreach ($this->jobs as $job) { |
| | | $results->add($job->get_result()); |
| | | } |
| | |
| | | */ |
| | | function __construct($uid, $folder = null) |
| | | { |
| | | // decode combined UID-folder identifier |
| | | if (preg_match('/^\d+-[^,]+$/', $uid)) { |
| | | list($uid, $folder) = explode('-', $uid); |
| | | } |
| | | |
| | | $this->uid = $uid; |
| | | $this->app = rcube::get_instance(); |
| | | $this->storage = $this->app->get_storage(); |
| | |
| | | |
| | | protected $meta = array(); |
| | | protected $index = array(); |
| | | protected $folders = array(); |
| | | protected $sorting; |
| | | protected $order = 'ASC'; |
| | | |
| | |
| | | /** |
| | | * Object constructor. |
| | | */ |
| | | public function __construct() |
| | | public function __construct($folders = array()) |
| | | { |
| | | $this->folders = $folders; |
| | | $this->meta = array('count' => 0); |
| | | } |
| | | |
| | |
| | | $params = array( |
| | | 'SORT' => $this->sorting, |
| | | 'ORDER' => $this->order, |
| | | 'MAILBOX' => $this->folders, |
| | | ); |
| | | |
| | | if ($param !== null) { |
| | |
| | | | program/steps/mail/check_recent.inc | |
| | | | | |
| | | | This file is part of the Roundcube Webmail client | |
| | | | Copyright (C) 2005-2010, The Roundcube Dev Team | |
| | | | Copyright (C) 2005-2014, The Roundcube Dev Team | |
| | | | | |
| | | | Licensed under the GNU General Public License version 3 or | |
| | | | any later version with exceptions for skins & plugins. | |
| | |
| | | $current = $RCMAIL->storage->get_folder(); |
| | | $check_all = $RCMAIL->action != 'refresh' || (bool)$RCMAIL->config->get('check_all_folders'); |
| | | |
| | | $search_request = rcube_utils::get_input_value('_search', rcube_utils::INPUT_GPC); |
| | | if ($search_request && $_SESSION['search_request'] != $search_request) |
| | | $search_request = null; |
| | | |
| | | // list of folders to check |
| | | if ($check_all) { |
| | | $a_mailboxes = $RCMAIL->storage->list_folders_subscribed('', '*', 'mail'); |
| | | } |
| | | else if ($search_request && is_object($_SESSION['search'][1])) { |
| | | $a_mailboxes = (array) $_SESSION['search'][1]->get_parameters('MAILBOX'); |
| | | } |
| | | else { |
| | | $a_mailboxes = (array) $current; |
| | |
| | | |
| | | // check recent/unseen counts |
| | | foreach ($a_mailboxes as $mbox_name) { |
| | | $is_current = $mbox_name == $current; |
| | | $is_current = $mbox_name == $current || ($search_request && is_object($_SESSION['search'][1]) && in_array($mbox_name, (array)$_SESSION['search'][1]->get_parameters('MAILBOX'))); |
| | | if ($is_current) { |
| | | // Synchronize mailbox cache, handle flag changes |
| | | $RCMAIL->storage->folder_sync($mbox_name); |
| | |
| | | |
| | | if ($status && $is_current) { |
| | | // refresh saved search set |
| | | $search_request = rcube_utils::get_input_value('_search', rcube_utils::INPUT_GPC); |
| | | if ($search_request && isset($_SESSION['search']) |
| | | && $_SESSION['search_request'] == $search_request |
| | | ) { |
| | | if ($search_request && isset($_SESSION['search'])) { |
| | | unset($search_request); // only do this once |
| | | $_SESSION['search'] = $RCMAIL->storage->refresh_search(); |
| | | if ($_SESSION['search'][1]->multi) |
| | | $mbox_name = ''; |
| | | } |
| | | |
| | | if (!empty($_GET['_quota'])) |
| | |
| | | } |
| | | } |
| | | // handle flag updates |
| | | else if ($is_current && ($uids = rcube_utils::get_input_value('_uids', rcube_utils::INPUT_GPC))) { |
| | | else if ($is_current && ($uids = rcube_utils::get_input_value('_uids', rcube_utils::INPUT_GPC)) && empty($search_request)) { |
| | | $data = $RCMAIL->storage->folder_data($mbox_name); |
| | | |
| | | if (empty($_SESSION['list_mod_seq']) || $_SESSION['list_mod_seq'] != $data['HIGHESTMODSEQ']) { |
| | |
| | | /** |
| | | * Returns message UID(s) and IMAP folder(s) from GET/POST data |
| | | * |
| | | * @return array List of message UIDs per folder |
| | | * @param string UID value to decode |
| | | * @param string Default mailbox value (if not encoded in UIDs) |
| | | * @return array List of message UIDs per folder |
| | | */ |
| | | function rcmail_get_uids() |
| | | function rcmail_get_uids($uids = null, $mbox = null) |
| | | { |
| | | // message UID (or comma-separated list of IDs) is provided in |
| | | // the form of <ID>-<MBOX>[,<ID>-<MBOX>]* |
| | | |
| | | $_uid = get_input_value('_uid', RCUBE_INPUT_GPC); |
| | | $_mbox = (string)get_input_value('_mbox', RCUBE_INPUT_GPC); |
| | | $_uid = $uids ?: get_input_value('_uid', RCUBE_INPUT_GPC); |
| | | $_mbox = $mbox ?: (string)get_input_value('_mbox', RCUBE_INPUT_GPC); |
| | | |
| | | if (is_array($uid)) { |
| | | return $uid; |
| | |
| | | { |
| | | $parts = array(); |
| | | foreach ($p as $key => $val) { |
| | | $parts[] = $key . '=' . ($key == 'folder' ? base64_encode($val) : $val); |
| | | $encode = $key == 'folder' || strpos($val, ';') !== false; |
| | | $parts[] = $key . '=' . ($encode ? 'B::' . base64_encode($val) : $val); |
| | | } |
| | | |
| | | return join('; ', $parts); |
| | |
| | | |
| | | foreach (preg_split('/;\s+/', $str) as $part) { |
| | | list($key, $val) = explode('=', $part, 2); |
| | | if ($key == 'folder') { |
| | | if (strpos($val, 'B::') === 0) { |
| | | $val = base64_decode(substr($val, 3)); |
| | | } |
| | | else if ($key == 'folder') { |
| | | $val = base64_decode($val); |
| | | } |
| | | |
| | |
| | | } |
| | | |
| | | // set replied/forwarded flag |
| | | if ($COMPOSE['reply_uid']) |
| | | $RCMAIL->storage->set_flag($COMPOSE['reply_uid'], 'ANSWERED', $COMPOSE['mailbox']); |
| | | else if ($COMPOSE['forward_uid']) |
| | | $RCMAIL->storage->set_flag($COMPOSE['forward_uid'], 'FORWARDED', $COMPOSE['mailbox']); |
| | | if ($COMPOSE['reply_uid']) { |
| | | foreach (rcmail_get_uids($COMPOSE['reply_uid'], $COMPOSE['mailbox']) as $mbox => $uids) { |
| | | $RCMAIL->storage->set_flag($uids, 'ANSWERED', $mbox); |
| | | } |
| | | } |
| | | else if ($COMPOSE['forward_uid']) { |
| | | foreach (rcmail_get_uids($COMPOSE['forward_uid'], $COMPOSE['mailbox']) as $mbox => $uids) { |
| | | $RCMAIL->storage->set_flag($uids, 'FORWARDED', $mbox); |
| | | } |
| | | } |
| | | } |
| | | |
| | | // Determine which folder to save message |