/** * get subfolders * * @param string|Felamimail_Model_Account $_account * @param string $_globalname * @return Tinebase_Record_RecordSet */ public function getSubfolders($_account, $_globalname) { $account = $_account instanceof Felamimail_Model_Account ? $_account : Felamimail_Controller_Account::getInstance()->get($_account); $globalname = empty($_globalname) ? '' : $_globalname . $account->delimiter; $filter = new Felamimail_Model_FolderFilter(array(array('field' => 'globalname', 'operator' => 'startswith', 'value' => $globalname), array('field' => 'account_id', 'operator' => 'equals', 'value' => $account->getId()))); return $this->_backend->search($filter); }
/** * remove folders from cache that no longer exist on the imap server * * @param Felamimail_Model_Account $_account * @param string $_parentFolder * @param array $_imapFolderIds if empty, remove all found cached folders */ protected function _removeFromCache(Felamimail_Model_Account $_account, $_parentFolder = NULL, $_imapFolderIds = array()) { $filterData = array(array('field' => 'account_id', 'operator' => 'equals', 'value' => $_account->getId())); if ($_parentFolder !== NULL) { $filterData[] = array('field' => 'parent', 'operator' => 'equals', 'value' => $_parentFolder); } $filter = new Felamimail_Model_FolderFilter($filterData); $cachedFolderIds = $this->_backend->search($filter, NULL, TRUE); if (count($cachedFolderIds) > count($_imapFolderIds)) { // remove folders from cache $idsToRemove = array_diff($cachedFolderIds, $_imapFolderIds); if (Tinebase_Core::isLogLevel(Zend_Log::INFO)) { Tinebase_Core::getLogger()->info(__METHOD__ . '::' . __LINE__ . ' Removing ' . count($idsToRemove) . ' folders from cache.'); } $this->delete($idsToRemove); } }
/** * 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 $accountIdFilter = $_filter->createFilter(array('field' => 'account_id', 'operator' => 'in', 'value' => Felamimail_Controller_Account::getInstance()->search()->getArrayOfIds())); $_filter->addFilter($accountIdFilter); $folderBackend = new Felamimail_Backend_Folder(); $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); try { $folder = Felamimail_Controller_Cache_Folder::getInstance()->getIMAPFolderCounter($folder); } catch (Zend_Mail_Storage_Exception $zmse) { if (Tinebase_Core::isLogLevel(Zend_Log::NOTICE)) { Tinebase_Core::getLogger()->notice(__METHOD__ . '::' . __LINE__ . ' ' . $zmse->getMessage()); } if (Tinebase_Core::isLogLevel(Zend_Log::INFO)) { Tinebase_Core::getLogger()->info(__METHOD__ . '::' . __LINE__ . ' Removing folder and contained messages from cache.'); } Felamimail_Controller_Message::getInstance()->deleteByFolder($folder); Felamimail_Controller_Cache_Folder::getInstance()->delete($folder->getId()); continue; } 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; }
/** * get folder ids of all inboxes for accounts of current user * * @return array */ protected function _getFolderIdsOfAllInboxes() { $folderFilter = new Felamimail_Model_FolderFilter(array(array('field' => 'account_id', 'operator' => 'in', 'value' => $this->_getUserAccountIds()), array('field' => 'localname', 'operator' => 'equals', 'value' => 'INBOX'))); $folderBackend = new Felamimail_Backend_Folder(); $folderIds = $folderBackend->search($folderFilter, NULL, TRUE); return $folderIds; }