/** * Tears down the fixture * This method is called after a test is executed. * * @access protected */ protected function tearDown() { foreach ($this->_createdFolders as $foldername) { $this->_controller->delete($this->_account->getId(), $foldername); } // delete all remaining folders from cache of account $folderBackend = new Felamimail_Backend_Folder(); $folders = $folderBackend->getMultipleByProperty($this->_account->getId(), 'account_id'); foreach ($folders as $folder) { $folderBackend->delete($folder); } }
/** * 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); }
/** * check if folder cache is updating atm * * @param Felamimail_Model_Folder $_folder * @param boolean $_lockFolder * @return boolean * * @todo we should check the time of the last update to dynamically decide if process could have died */ public function updateAllowed(Felamimail_Model_Folder $_folder, $_lockFolder = TRUE) { // if cache status is CACHE_STATUS_UPDATING and timestamp is less than 5 minutes ago, don't update if ($_folder->cache_status == Felamimail_Model_Folder::CACHE_STATUS_UPDATING && (is_object($_folder->cache_timestamp) && $_folder->cache_timestamp instanceof Tinebase_DateTime && $_folder->cache_timestamp->compare(Tinebase_DateTime::now()->subMinute(5)) == 1)) { return false; } $result = $_lockFolder ? $this->_backend->lockFolder($_folder) : TRUE; return $result; }
/** * the singleton pattern * * @return Felamimail_Backend_Cache_Imap_Folder or Felamimail_Backend_Cache_Sql_Folder */ public static function getInstance() { if (self::$_instance === NULL) { $adapter = Tinebase_Core::getConfig()->messagecache; $adapter = empty($adapter) ? 'sql' : $adapter; $classname = 'Felamimail_Backend_Cache_' . ucfirst($adapter) . '_Folder'; self::$_instance = new $classname(); } return self::$_instance; }
/** * 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->deleteCacheFolder($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 $_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; }
/** * 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 * @throws Felamimail_Exception_IMAPFolderNotFound * @return Felamimail_Backend_ImapProxy */ protected function _getBackendAndSelectFolder($_folderId = NULL, &$_folder = NULL, $_select = TRUE, Felamimail_Backend_ImapProxy $_imapBackend = NULL) { if ($_folder === NULL || empty($_folder)) { $folderBackend = new Felamimail_Backend_Folder(); $_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); } $imapBackend->selectFolder(Felamimail_Model_Folder::encodeFolderName($_folder->globalname)); } } catch (Zend_Mail_Storage_Exception $zmse) { // @todo remove the folder from cache if it could not be found on the IMAP server? throw new Felamimail_Exception_IMAPFolderNotFound($zmse->getMessage()); } catch (Zend_Mail_Protocol_Exception $zmpe) { throw new Felamimail_Exception_IMAPServiceUnavailable($zmpe->getMessage()); } return $imapBackend; }
/** * 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; }
/** * the constructor * * don't use the constructor. use the singleton */ private function __construct() { $this->_backend = Felamimail_Backend_Folder::getInstance(); $this->_currentAccount = Tinebase_Core::getUser(); }
/** * testGetCountOfChanges (inbox folder cache should be updated here by _inspectGetServerEntries fn) * * @see 0006232: Emails get only synched, if the user is logged on with an browser */ public function testGetCountOfChanges() { $controller = $this->_getController($this->_getDevice(Syncroton_Model_Device::TYPE_IPHONE)); // set inbox timestamp a long time ago (15 mins) $inbox = $this->_emailTestClass->getFolder('INBOX'); $inbox->cache_timestamp = Tinebase_DateTime::now()->subMinute(15); $folderBackend = new Felamimail_Backend_Folder(); $folderBackend->update($inbox); $numberOfChanges = $controller->getCountOfChanges(Syncroton_Registry::getContentStateBackend(), new Syncroton_Model_Folder(array('id' => Tinebase_Record_Abstract::generateUID(), 'serverId' => $inbox->getId(), 'lastfiltertype' => Syncroton_Command_Sync::FILTER_NOTHING)), new Syncroton_Model_SyncState(array('lastsync' => Tinebase_DateTime::now()->subHour(1)))); $inbox = $this->_emailTestClass->getFolder('INBOX'); $this->assertEquals(1, $inbox->cache_timestamp->compare(Tinebase_DateTime::now()->subSecond(15)), 'inbox cache has not been updated: ' . print_r($inbox, TRUE)); }
/** * 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; }