/**
  * move messages on imap server
  * 
  * @param array $_uids
  * @param string $_targetFolderName
  * @param Expressomail_Backend_ImapProxy $_imap
  * 
  * @todo perhaps we should check the existance of the messages on the imap instead of catching the exceptions here
  */
 protected function _moveBatchOfMessages($_uids, $_targetFolderName, Expressomail_Backend_ImapProxy $_imap)
 {
     if (Tinebase_Core::isLogLevel(Zend_Log::DEBUG)) {
         Tinebase_Core::getLogger()->debug(__METHOD__ . '::' . __LINE__ . ' Move ' . count($_uids) . ' messages to folder ' . $_targetFolderName . ' on imap server');
     }
     try {
         $_imap->copyMessage($_uids, Expressomail_Model_Folder::encodeFolderName($_targetFolderName));
         $_imap->addFlags($_uids, array(Zend_Mail_Storage::FLAG_DELETED));
     } catch (Zend_Mail_Storage_Exception $zmse) {
         if (Tinebase_Core::isLogLevel(Zend_Log::NOTICE)) {
             Tinebase_Core::getLogger()->notice(__METHOD__ . '::' . __LINE__ . ' ' . $zmse);
         }
     } catch (Expressomail_Exception_IMAP $fei) {
         if (Tinebase_Core::isLogLevel(Zend_Log::NOTICE)) {
             Tinebase_Core::getLogger()->notice(__METHOD__ . '::' . __LINE__ . ' ' . $fei);
         }
     }
 }
 /**
  * get imap backend and folder (and select folder)
  *
  * @param string                    $_folderId
  * @param Expressomail_Backend_Folder &$_folder
  * @param boolean                   $_select
  * @param Expressomail_Backend_ImapProxy   $_imapBackend
  * @throws Expressomail_Exception_IMAPServiceUnavailable
  * @throws Expressomail_Exception_IMAPFolderNotFound
  * @return Expressomail_Backend_ImapProxy
  */
 protected function _getBackendAndSelectFolder($_folderId = NULL, &$_folder = NULL, $_select = TRUE, Expressomail_Backend_ImapProxy $_imapBackend = NULL)
 {
     if ($_folder === NULL || empty($_folder)) {
         $folderBackend = new Expressomail_Backend_Folder();
         $_folder = $folderBackend->get($_folderId);
     }
     try {
         $imapBackend = $_imapBackend === NULL ? Expressomail_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(Expressomail_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 Expressomail_Exception_IMAPFolderNotFound($zmse->getMessage());
     } catch (Zend_Mail_Protocol_Exception $zmpe) {
         throw new Expressomail_Exception_IMAPServiceUnavailable($zmpe->getMessage());
     }
     return $imapBackend;
 }
 /**
  * get Syncroton_Model_Folder folders recursively by parentFolder
  *
  * @param Expressomail_Model_Folder $parentFolder
  * @param array $result
  * @return array of Syncroton_Model_Folder
  */
 protected function _getFolders($parentFolder = NULL, &$result = array())
 {
     $globalname = $parentFolder ? $parentFolder->globalname : '';
     $account = $this->_getAccount();
     if (!$account) {
         return array();
     }
     $filter = new Expressomail_Model_FolderFilter(array(array('field' => 'globalname', 'operator' => 'startswith', 'value' => $globalname), array('field' => 'account_id', 'operator' => 'equals', 'value' => $account->getId())));
     try {
         $folders = Expressomail_Controller_Folder::getInstance()->search($filter);
     } catch (Expressomail_Exception_IMAPInvalidCredentials $feiic) {
         Tinebase_Exception::log($feiic, null, array('accountname' => $account->name));
         return array();
     }
     if (Tinebase_Core::isLogLevel(Zend_Log::DEBUG)) {
         Tinebase_Core::getLogger()->debug(__METHOD__ . '::' . __LINE__ . " Found " . count($folders) . ' subfolders of folder "' . $globalname . '"');
     }
     foreach ($folders as $folder) {
         if (!$folder->is_selectable) {
             continue;
         }
         $serverId = md5($folder->getId());
         $result[$serverId] = new Syncroton_Model_Folder(array('serverId' => $serverId, 'parentId' => $parentFolder ? md5($parentFolder->getId()) : 0, 'displayName' => substr($folder->localname, 0, 254), 'type' => $this->_getFolderType($folder), 'bigfolderid' => $folder->getId()));
         if ($folder->has_children) {
             $this->_getFolders($folder, $result);
         }
     }
     return $result;
 }
 /**
  * delete all messages in one folder -> be careful, they are completly removed and not moved to trash
  * -> delete subfolders if param set
  *
  * @param string $_folderId
  * @param boolean $_deleteSubfolders
  * @return Expressomail_Model_Folder
  * @throws Expressomail_Exception_IMAPServiceUnavailable
  */
 public function emptyFolder($_folderId, $_deleteSubfolders = FALSE)
 {
     $folder = $this->_backend->get($_folderId);
     $account = Expressomail_Controller_Account::getInstance()->get($folder->account_id);
     if ($folder) {
         $cache = Tinebase_Core::getCache();
         $cacheKey = 'Expressomail_Model_Folder_' . $folder->id;
         $cache->remove($cacheKey);
     }
     $imap = Expressomail_Backend_ImapFactory::factory($account);
     try {
         // try to delete messages in imap folder
         Tinebase_Core::getLogger()->info(__METHOD__ . '::' . __LINE__ . ' Delete all messages in folder ' . $folder->globalname);
         $imap->emptyFolder(Expressomail_Model_Folder::encodeFolderName($folder->globalname));
     } catch (Zend_Mail_Protocol_Exception $zmpe) {
         Tinebase_Core::getLogger()->warn(__METHOD__ . '::' . __LINE__ . ' ' . $zmpe->getMessage());
         throw new Expressomail_Exception_IMAPServiceUnavailable($zmpe->getMessage());
     } catch (Zend_Mail_Storage_Exception $zmse) {
         Tinebase_Core::getLogger()->warn(__METHOD__ . '::' . __LINE__ . ' Folder could be empty (' . $zmse->getMessage() . ')');
     }
     if ($_deleteSubfolders) {
         $this->deleteSubfolders($folder);
     }
     return $folder;
 }
 /**
  * Creates new entry
  *
  * @param   Tinebase_Record_Interface $_record
  * @return  Tinebase_Record_Interface
  * @throws  Tinebase_Exception_InvalidArgument
  * @throws  Tinebase_Exception_UnexpectedValue
  *
  * @todo    remove autoincremental ids later
  */
 public function create(Tinebase_Record_Interface $_record)
 {
     $folder = $_record->toArray();
     $return = $this->get($this->encodeFolderUid(Expressomail_Model_Folder::encodeFolderName($folder['globalname']), $folder['account_id']), FALSE);
     return $return;
 }
 /**
  * create new system folder
  *
  * @param Expressomail_Model_Account $_account
  * @param string $_systemFolder
  * @return Expressomail_Model_Folder
  */
 protected function _createSystemFolder(Expressomail_Model_Account $_account, $_systemFolder)
 {
     Tinebase_Core::getLogger()->notice(__METHOD__ . '::' . __LINE__ . ' Folder not found: ' . $_systemFolder . '. Trying to add it.');
     $splitFolderName = Expressomail_Model_Folder::extractLocalnameAndParent($_systemFolder, $_account->delimiter);
     try {
         $result = Expressomail_Controller_Folder::getInstance()->create($_account, $splitFolderName['localname'], $splitFolderName['parent']);
     } catch (Expressomail_Exception_IMAPServiceUnavailable $feisu) {
         if (Tinebase_Core::isLogLevel(Zend_Log::DEBUG)) {
             Tinebase_Core::getLogger()->debug(__METHOD__ . '::' . __LINE__ . ' ' . $feisu->getMessage());
         }
         // try again with INBOX as parent because some IMAP servers can not handle namespaces correctly
         $result = Expressomail_Controller_Folder::getInstance()->create($_account, $splitFolderName['localname'], 'INBOX');
     }
     return $result;
 }
 /**
  * Get Ids for filter
  * @param array $imapFilters
  * @param Tinebase_Model_Pagination $_pagination
  * @return array
  *
  * @todo pass the search parameters
  */
 protected function _getIds(array $_imapFilters, Tinebase_Model_Pagination $_pagination = NULL)
 {
     $messages = array();
     if (empty($_imapFilters['paths'])) {
         $_imapFilters['paths'] = $this->_getAllFolders();
     }
     $sort = $this->_getImapSortParams($_pagination);
     // do a search for each path on $imapFilters
     foreach ($_imapFilters['paths'] as $folderId => $path) {
         list($accountId, $mailbox) = $path;
         $imap = Expressomail_Backend_ImapFactory::factory($accountId);
         $imap->selectFolder(Expressomail_Model_Folder::encodeFolderName($mailbox));
         // TODO: pass the search parameter too.
         $messages[$folderId] = $imap->sort((array) $sort, (array) $_imapFilters['filters']);
     }
     return $messages;
 }
 /**
  * search message by header (X-Tine20TestMessage) and add it to cache
  *
  * @param string $_testHeaderValue
  * @param Expressomail_Model_Folder $_folder
  * @param boolean $assert
  * @param string $testHeader
  * @return Expressomail_Model_Message|NULL
  */
 public function searchAndCacheMessage($_testHeaderValue, $_folder = NULL, $assert = TRUE, $testHeader = 'X-Tine20TestMessage')
 {
     $folder = $_folder !== NULL ? $_folder : $this->_folder;
     $message = $this->_searchMessage($_testHeaderValue, $folder, $assert, $testHeader);
     if ($message === NULL && !$assert) {
         return NULL;
     }
     //        $cachedMessage = $this->_cache->addMessage($message, $folder);
     //        if ($cachedMessage === FALSE) {
     //            // try to add message again (it had a duplicate)
     //            $this->_cache->clear($folder);
     //            $cachedMessage = $this->_cache->addMessage($message, $folder);
     //        }
     //
     //        if ($assert) {
     //            $this->assertTrue($cachedMessage instanceof Expressomail_Model_Message, 'could not add message to cache');
     //        }
     //
     //        $this->_createdMessages->addRecord($cachedMessage);
     //
     //        return $cachedMessage;
     $expressoMessage = new Expressomail_Model_Message(array('account_id' => $_folder->account_id, 'messageuid' => $message['uid'], 'folder_id' => $_folder->getId(), 'timestamp' => Tinebase_DateTime::now(), 'received' => Expressomail_Message::convertDate($message['received']), 'size' => $message['size'], 'flags' => $message['flags']));
     $expressoMessage->parseStructure($message['structure']);
     $expressoMessage->parseHeaders($message['header']);
     $expressoMessage->parseBodyParts();
     $attachments = Expressomail_Controller_Message::getInstance()->getAttachments($expressoMessage);
     $expressoMessage->has_attachment = count($attachments) > 0 ? true : false;
     return $expressoMessage;
 }
 /**
  * Tears down the fixture
  * This method is called after a test is executed.
  *
  * @access protected
  */
 protected function tearDown()
 {
     if (count($this->_createdFolders) > 0) {
         foreach ($this->_createdFolders as $folderName) {
             //echo "delete $folderName\n";
             try {
                 $this->_imap->removeFolder(Expressomail_Model_Folder::encodeFolderName($folderName));
             } catch (Zend_Mail_Storage_Exception $zmse) {
                 // already deleted
             }
         }
         //No necessary with Expressomail
         //           Expressomail_Controller_Cache_Folder::getInstance()->clear($this->_account);
     }
     if (!empty($this->_foldersToClear)) {
         foreach ($this->_foldersToClear as $folderName) {
             // delete test messages from given folders on imap server (search by special header)
             $this->_imap->selectFolder($folderName);
             $result = $this->_imap->search(array('HEADER X-Tine20TestMessage jsontest'));
             //print_r($result);
             foreach ($result as $messageUid) {
                 $this->_imap->removeMessage($messageUid);
             }
             // clear message cache
             $folder = Expressomail_Controller_Folder::getInstance()->getByBackendAndGlobalName($this->_account->getId(), $folderName);
             //No necessary with Expressomail
             //              Expressomail_Controller_Cache_Message::getInstance()->clear($folder);
         }
     }
     // sieve cleanup
     if ($this->_testSieveScriptName !== NULL) {
         Expressomail_Controller_Sieve::getInstance()->setScriptName($this->_testSieveScriptName);
         try {
             Expressomail_Controller_Sieve::getInstance()->deleteScript($this->_account->getId());
         } catch (Zend_Mail_Protocol_Exception $zmpe) {
             // do not delete script if active
         }
         Expressomail_Controller_Account::getInstance()->setVacationActive($this->_account, $this->_oldSieveVacationActiveState);
         if ($this->_oldSieveData !== NULL) {
             $this->_oldSieveData->save();
         }
     }
     if ($this->_oldActiveSieveScriptName !== NULL) {
         Expressomail_Controller_Sieve::getInstance()->setScriptName($this->_oldActiveSieveScriptName);
         Expressomail_Controller_Sieve::getInstance()->activateScript($this->_account->getId());
     }
     // vfs cleanup
     foreach ($this->_pathsToDelete as $path) {
         $webdavRoot = new Sabre_DAV_ObjectTree(new Tinebase_WebDav_Root());
         //echo "delete $path";
         $webdavRoot->delete($path);
     }
 }