/** * get folder status and return all folders where something needs to be done * * @param Felamimail_Model_FolderFilter $_filter * @return Tinebase_Record_RecordSet */ public function getFolderStatus(Felamimail_Model_FolderFilter $_filter) { $this->_availableUpdateTime = NULL; // add user account ids to filter and use the folder backend to search as the folder controller has some special handling in its search function $_filter->createFilter(array('field' => 'account_id', 'operator' => 'in', 'value' => Felamimail_Controller_Account::getInstance()->search()->getArrayOfIds())); $folderBackend = Felamimail_Backend_Folder::getInstance(); $folders = $folderBackend->search($_filter); if (Tinebase_Core::isLogLevel(Zend_Log::TRACE)) { Tinebase_Core::getLogger()->trace(__METHOD__ . '::' . __LINE__ . ' ' . print_r($_filter->toArray(), TRUE)); } if (Tinebase_Core::isLogLevel(Zend_Log::INFO)) { Tinebase_Core::getLogger()->info(__METHOD__ . '::' . __LINE__ . " Checking status of " . count($folders) . ' folders.'); } $result = new Tinebase_Record_RecordSet('Felamimail_Model_Folder'); foreach ($folders as $folder) { if (Tinebase_Core::isLogLevel(Zend_Log::DEBUG)) { Tinebase_Core::getLogger()->debug(__METHOD__ . '::' . __LINE__ . ' Checking folder ' . $folder->globalname); } if ($this->_doNotUpdateCache($folder, FALSE)) { continue; } $imap = Felamimail_Backend_ImapFactory::factory($folder->account_id); $folder = Felamimail_Controller_Cache_Folder::getInstance()->getIMAPFolderCounter($folder); if ($this->_cacheIsInvalid($folder) || $this->_messagesInCacheButNotOnIMAP($folder)) { $result->addRecord($folder); continue; } if ($folder->imap_totalcount > 0) { try { $this->_updateMessageSequence($folder, $imap); } catch (Felamimail_Exception_IMAPMessageNotFound $feimnf) { $result->addRecord($folder); continue; } if ($this->_messagesDeletedOnIMAP($folder) || $this->_messagesToBeAddedToCache($folder) || $this->_messagesMissingFromCache($folder)) { $result->addRecord($folder); continue; } } } if (Tinebase_Core::isLogLevel(Zend_Log::INFO)) { Tinebase_Core::getLogger()->info(__METHOD__ . '::' . __LINE__ . " Found " . count($result) . ' folders that need an update.'); } return $result; }
protected function _getAllFoldersByAccountId($_accountId, $_globalname = '', $_parent = '') { $return = array(); if (empty($_parent)) { $_parent = self::IMAPDELIMITER . $_accountId; } $folderBackend = Felamimail_Backend_Folder::getInstance(); $folderFilter = new Felamimail_Model_FolderFilter(array(array('field' => 'account_id', 'operator' => 'in', 'value' => $_accountId), array('field' => 'parent', 'operator' => 'equals', 'value' => true), array('field' => 'globalname', 'operator' => 'equals', 'value' => $_globalname))); $folderBackend = Felamimail_Backend_Folder::getInstance(); $folderIds = $folderBackend->search($folderFilter, NULL, TRUE); $return = array(); for ($it = $folderIds->getIterator(), $it->rewind(); $it->valid(); $it->next()) { $folder = $it->current(); if ($folder->has_children) { $return = array_merge($this->_getAllFoldersByAccountId($folder->account_id, $folder->globalname, $_parent . self::IMAPDELIMITER . $folder->id), $return); } // TODO: verify if this test isn't too specific for Cyrus Imapd. if ($folder->globalname !== 'user') { $return = array_merge(array($_parent . self::IMAPDELIMITER . $folder->id), $return); } } return $return; }
/** * get folder ids of all inboxes for accounts of current user * * @return array */ protected function _getFolderIdsOfAllInboxes() { $accounts = Felamimail_Controller_Account::getInstance()->search(); $folderFilter = new Felamimail_Model_FolderFilter(array(array('field' => 'account_id', 'operator' => 'in', 'value' => $accounts->getArrayOfIds()), array('field' => 'localname', 'operator' => 'equals', 'value' => 'INBOX'))); $folderBackend = Felamimail_Backend_Folder::getInstance(); $folderIds = $folderBackend->search($folderFilter, NULL, TRUE); return $folderIds; }
/** * the constructor * * don't use the constructor. use the singleton */ private function __construct() { $this->_backend = Felamimail_Backend_Folder::getInstance(); $this->_currentAccount = Tinebase_Core::getUser(); }
/** * get imap backend and folder (and select folder) * * @param string $_folderId * @param Felamimail_Backend_Folder &$_folder * @param boolean $_select * @param Felamimail_Backend_ImapProxy $_imapBackend * @throws Felamimail_Exception_IMAPServiceUnavailable * @return Felamimail_Backend_ImapProxy */ protected function _getBackendAndSelectFolder($_folderId = NULL, &$_folder = NULL, $_select = TRUE, Felamimail_Backend_ImapProxy $_imapBackend = NULL) { if ($_folder === NULL || empty($_folder)) { $folderBackend = Felamimail_Backend_Folder::getInstance(); $_folder = $folderBackend->get($_folderId); } try { $imapBackend = $_imapBackend === NULL ? Felamimail_Backend_ImapFactory::factory($_folder->account_id) : $_imapBackend; if ($_select) { if (Tinebase_Core::isLogLevel(Zend_Log::TRACE)) { Tinebase_Core::getLogger()->trace(__METHOD__ . '::' . __LINE__ . ' Select folder ' . $_folder->globalname); } $backendFolderValues = $imapBackend->selectFolder(Felamimail_Model_Folder::encodeFolderName($_folder->globalname)); } } catch (Zend_Mail_Protocol_Exception $zmpe) { // no imap connection throw new Felamimail_Exception_IMAPServiceUnavailable(); } return $imapBackend; }