From: Michael M Slusarz Date: Wed, 16 Sep 2009 20:25:10 +0000 (-0600) Subject: Request #6875: Add IMP 4 virtual folder upgrade code X-Git-Url: https://git.internetallee.de/?a=commitdiff_plain;h=0d051afdd02da0d2bd95b36d1a8a3213cb18db2c;p=horde.git Request #6875: Add IMP 4 virtual folder upgrade code --- diff --git a/imp/lib/LoginTasks/SystemTask/UpgradeFromImp4.php b/imp/lib/LoginTasks/SystemTask/UpgradeFromImp4.php index 2ef3fc5ad..438a57aba 100644 --- a/imp/lib/LoginTasks/SystemTask/UpgradeFromImp4.php +++ b/imp/lib/LoginTasks/SystemTask/UpgradeFromImp4.php @@ -26,7 +26,15 @@ class IMP_LoginTasks_SystemTask_UpgradeFromImp4 extends Horde_LoginTasks_SystemT { IMP::initialize(); - /* Check for old, non-existent sort values. See Bug #7296. */ + $this->_upgradeSortPrefs(); + $this->_upgradeVirtualFolders(); + } + + /** + * Check for old, non-existent sort values. See Bug #7296. + */ + protected function _upgradeSortPrefs() + { $sortby = $GLOBALS['prefs']->getValue('sortby'); if ($sortby > 10) { $GLOBALS['prefs']->setValue('sortby', Horde_Imap_Client::SORT_ARRIVAL); @@ -43,8 +51,112 @@ class IMP_LoginTasks_SystemTask_UpgradeFromImp4 extends Horde_LoginTasks_SystemT if ($update) { $GLOBALS['prefs']->setValue('sortpref', serialize($sortpref)); } + } + + /** + * Upgrade IMP 4 style virtual folders. + */ + protected function _upgradeVirtualFolders() + { + $vfolders = $GLOBALS['prefs']->getValue('vfolder'); + if (!empty($vfolders)) { + $vfolders = @unserialize($vfolders); + } + + if (empty($vfolders) || !is_array($vfolders)) { + return; + } + + $imp_ui_search = new IMP_UI_Search(); + + foreach ($vfolders as $id => $vfolder) { + /* If this is already a stdClass object, we have already + * upgraded. */ + if (is_object($vfolder)) { + return; + } - /* Upgrade old virtual folders. */ + $ui = $vfolder['uiinfo']; + + // TODO: match == 'or' ($ob['match'] + if ($ui['match'] == 'or') { + $GLOBALS['imp_search']->deleteSearchQuery($id); + continue; + } + + /* BC: Convert old (IMP < 4.2.1) style w/separate flag entry to + * new style where flags are part of the fields to query. */ + if (!empty($ui['flag'])) { + $lookup = array( + 1 => 'seen', + 2 => 'answered', + 3 => 'flagged', + 4 => 'deleted' + ); + + foreach ($ui['flag'] as $key => $val) { + if (($val == 0) || ($val == 1)) { + $ui['field'][] = (($val == 1) ? 'un' : '') . $lookup[$key]; + } + } + } + + $rules = array(); + + foreach ($ui['field'] as $key => $val) { + $tmp = new stdClass; + + switch ($val) { + case 'from': + case 'to': + case 'cc': + case 'bcc': + case 'subject': + case 'body': + case 'text': + $tmp->t = $val; + $tmp->v = $ob['text'][$key]; + $tmp->n = !empty($ob['text_not'][$key]); + break; + + case 'date_on': + case 'date_until': + case 'date_since': + $tmp->t = $val; + $tmp->v = new stdClass; + $tmp->v->y = $ob['date'][$key]['year']; + $tmp->v->m = $ob['date'][$key]['month'] - 1; + $tmp->v->d = $ob['date'][$key]['day']; + break; + + case 'size_smaller': + case 'size_larger': + $tmp->t = $val; + $tmp->v = $ob['text'][$key]; + break; + + case 'seen': + case 'unseen': + case 'answered': + case 'unanswered': + case 'flagged': + case 'unflagged': + case 'deleted': + case 'undeleted': + $tmp->t = 'flag'; + $tmp->v = (strpos($val, 'un') === false) + ? '\\' . $val + : '0\\\\' . substr($val, 2); + break; + } + + $rules[] = $tmp; + } + + /* This will overwrite the existing entry. */ + $query = $imp_ui_search->createQuery($rules); + $GLOBALS['imp_search']->addVFolder($query, $ui['folders'], $rules, $ui['vfolder_label'], $id); + } } } diff --git a/imp/lib/Search.php b/imp/lib/Search.php index ef6aac224..3791402c8 100644 --- a/imp/lib/Search.php +++ b/imp/lib/Search.php @@ -24,8 +24,7 @@ * array( * stdClass object { * 't' => (string) 'Type' - The criteria type - * Values: header, customhdr, body, text, date, within, size, - * flag + * Values: Keys from self::searchFields() and 'flag'. * 'v' => (mixed) 'Value' - The data used to build the search * 'header' - (string) The value to search for in the header * 'customhdr' - (stdClass object) Contains 2 elements: