/**
  * 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;
 }
 /**
  * move messages from one folder to another
  * 
  * @param Tinebase_Record_RecordSet $_messages
  * @param string $_folderId
  * @param Expressomail_Model_Folder|string $_targetFolder
  * @return boolean did we move messages?
  */
 protected function _moveMessagesByFolder(Tinebase_Record_RecordSet $_messages, $_folderId, $_targetFolder)
 {
     $messagesInFolder = $_messages->filter('folder_id', $_folderId);
     if (Tinebase_Core::isLogLevel(Zend_Log::TRACE)) {
         Tinebase_Core::getLogger()->trace(__METHOD__ . '::' . __LINE__ . ' Moving messages: ' . print_r($messagesInFolder->getArrayOfIds(), TRUE));
     }
     $result = TRUE;
     if ($_targetFolder === Expressomail_Model_Folder::FOLDER_TRASH) {
         $result = $this->_moveMessagesToTrash($messagesInFolder, $_folderId);
     } else {
         if ($_folderId === $_targetFolder->getId()) {
             // no need to move
             $result = FALSE;
         } else {
             if ($messagesInFolder->getFirstRecord()->account_id == $_targetFolder->account_id) {
                 $this->_moveMessagesInFolderOnSameAccount($messagesInFolder, $_targetFolder);
             } else {
                 $this->_moveMessagesToAnotherAccount($messagesInFolder, $_targetFolder);
             }
         }
     }
     if (!$result) {
         $_messages->removeRecords($messagesInFolder);
     }
     return $result;
 }
 /**
  * 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;
 }