/**
  * 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;
 }
Exemple #4
0
 /**
  * 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;
 }
Exemple #11
0
 /**
  * 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;
 }