/**
  * 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;
 }