/** * create new folders or get existing folders from db and return record set * * @param array $_folders * @param Felamimail_Model_Account $_account * @param string $_parentFolder * @return Tinebase_Record_RecordSet of Felamimail_Model_Folder * * @todo move delete sync to extra function */ protected function _getOrCreateFolders(array $_folders, $_account, $_parentFolder) { $parentFolder = $_parentFolder !== NULL ? $_parentFolder : ''; $result = new Tinebase_Record_RecordSet('Felamimail_Model_Folder'); $systemFolders = Felamimail_Controller_Folder::getInstance()->getSystemFolders($_account); // get configured account standard folders here if (strtolower($_account->sent_folder) != $systemFolders[2]) { $systemFolders[2] = strtolower($_account->sent_folder); } if (strtolower($_account->trash_folder) != $systemFolders[5]) { $systemFolders[5] = strtolower($_account->trash_folder); } if (Tinebase_Core::isLogLevel(Zend_Log::TRACE)) { Tinebase_Core::getLogger()->trace(__METHOD__ . '::' . __LINE__ . ' ' . print_r($_folders, TRUE)); } // do some mapping and save folder in db (if it doesn't exist foreach ($_folders as $folderData) { try { $folderData['localName'] = Felamimail_Model_Folder::decodeFolderName($folderData['localName']); $folderData['globalName'] = Felamimail_Model_Folder::decodeFolderName($folderData['globalName']); $isSelectable = $this->_isSelectable($folderData, $_account); $folder = Felamimail_Controller_Folder::getInstance()->getByBackendAndGlobalName($_account->getId(), $folderData['globalName']); $folder->is_selectable = $isSelectable; $folder->supports_condstore = $this->_supportsCondStore($folder, $_account); $folder->imap_status = Felamimail_Model_Folder::IMAP_STATUS_OK; $folder->has_children = $folderData['hasChildren'] == '1'; $folder->parent = $parentFolder; if (Tinebase_Core::isLogLevel(Zend_Log::DEBUG)) { Tinebase_Core::getLogger()->debug(__METHOD__ . '::' . __LINE__ . ' Update cached folder ' . $folderData['globalName']); } } catch (Tinebase_Exception_NotFound $tenf) { // create new folder if (empty($folderData['localName'])) { // skip if (Tinebase_Core::isLogLevel(Zend_Log::INFO)) { Tinebase_Core::getLogger()->info(__METHOD__ . '::' . __LINE__ . ' Do not add folder ' . $folderData['globalName'] . '. Localname is empty.'); } continue; } else { $delimiter = strlen($folderData['delimiter']) === 1 ? $folderData['delimiter'] : ''; $folder = new Felamimail_Model_Folder(array('localname' => $folderData['localName'], 'globalname' => $folderData['globalName'], 'is_selectable' => $isSelectable, 'supports_condstore' => $this->_supportsCondStore($folderData['globalName'], $_account), 'has_children' => $folderData['hasChildren'] == '1', 'account_id' => $_account->getId(), 'imap_timestamp' => Tinebase_DateTime::now(), 'imap_status' => Felamimail_Model_Folder::IMAP_STATUS_OK, 'user_id' => Tinebase_Core::getUser()->getId(), 'parent' => $parentFolder, 'system_folder' => in_array(strtolower($folderData['localName']), $systemFolders), 'delimiter' => $delimiter)); // update delimiter setting of account if ($folder->delimiter && $folder->delimiter !== $_account->delimiter && $folder->localname === 'INBOX') { $_account->delimiter = $folder->delimiter; $_account = Felamimail_Controller_Account::getInstance()->update($_account); } if (Tinebase_Core::isLogLevel(Zend_Log::INFO)) { Tinebase_Core::getLogger()->info(__METHOD__ . '::' . __LINE__ . ' Adding new folder ' . $folderData['globalName'] . ' to cache.'); } if (Tinebase_Core::isLogLevel(Zend_Log::TRACE)) { Tinebase_Core::getLogger()->trace(__METHOD__ . '::' . __LINE__ . print_r($folder->toArray(), true)); } $folder = $this->_backend->create($folder); } } $result->addRecord($folder); } if (count($_folders) > 0) { $this->_removeFromCache($_account, $parentFolder, $result->getArrayOfIds()); } return $result; }
/** * Gets one entry (by id) * * @param string $_id * @param $_getDeleted get deleted records * @return Tinebase_Record_Interface * @throws Tinebase_Exception_NotFound */ public function get($_id, $_getDeleted = FALSE) { $folderDecoded = self::decodeFolderUid($_id); try { $imap = Felamimail_Backend_ImapFactory::factory($folderDecoded['accountId']); $folder = $imap->getFolders('', $folderDecoded['globalName']); $counter = $imap->examineFolder($folderDecoded['globalName']); $status = $imap->getFolderStatus($folderDecoded['globalName']); $quota = $imap->getQuota($folderDecoded['globalName']); } catch (Zend_Mail_Storage_Exception $ex) { // we can not access folder, create Model as unselectable $globalname = $folderDecoded['globalName']; $localname = array_pop(explode(self::IMAPDELIMITER, $globalname)); $translate = Tinebase_Translation::getTranslation("Felamimail"); return new Felamimail_Model_Folder(array('id' => $_id, 'account_id' => Tinebase_Core::getPreference('Felamimail')->{Felamimail_Preference::DEFAULTACCOUNT}, 'localname' => $localname == 'user' ? $translate->_("Shared Folders") : $localname, 'globalname' => $folderDecoded['globalName'], 'parent' => $globalname === 'user' ? '' : substr($globalname, 0, strrpos($globalname, self::IMAPDELIMITER)), 'delimiter' => self::IMAPDELIMITER, 'is_selectable' => 0, 'has_children' => 1, 'system_folder' => 1, 'imap_status' => Felamimail_Model_Folder::IMAP_STATUS_OK, 'imap_timestamp' => Tinebase_DateTime::now(), 'cache_status' => 'complete', 'cache_timestamp' => Tinebase_DateTime::now(), 'cache_job_lowestuid' => 0, 'cache_job_startuid' => 0, 'cache_job_actions_est' => 0, 'cache_job_actions_done' => 0)); if (Tinebase_Core::isLogLevel(Zend_Log::INFO)) { Tinebase_Core::getLogger()->info(__METHOD__ . '::' . __LINE__ . $ex->getMessage()); } } $globalName = $folderDecoded['globalName']; if ($globalName == 'INBOX' || $globalName == 'user') { $folder[$folderDecoded['globalName']]['parent'] = ''; } else { $folder[$folderDecoded['globalName']]['parent'] = substr($globalName, 0, strrpos($globalName, self::IMAPDELIMITER)); } /* * @todo must see if it is not better do this on the model directly */ $systemFolders = FALSE; if (strtolower($folder[$folderDecoded['globalName']]['parent']) === 'inbox') { $systemFolders = in_array(strtolower($folder[$folderDecoded['globalName']]['localName']), Felamimail_Controller_Folder::getInstance()->getSystemFolders($folderDecoded['accountId'])); } return new Felamimail_Model_Folder(array('id' => $_id, 'account_id' => $folderDecoded['accountId'], 'localname' => Felamimail_Model_Folder::decodeFolderName($folder[$folderDecoded['globalName']]['localName']), 'globalname' => Felamimail_Model_Folder::decodeFolderName($folder[$folderDecoded['globalName']]['globalName']), 'parent' => $folder[$folderDecoded['globalName']]['parent'], 'delimiter' => $folder[$folderDecoded['globalName']]['delimiter'], 'is_selectable' => $folder[$folderDecoded['globalName']]['isSelectable'], 'has_children' => $folder[$folderDecoded['globalName']]['hasChildren'], 'system_folder' => $systemFolders, 'imap_status' => Felamimail_Model_Folder::IMAP_STATUS_OK, 'imap_uidvalidity' => $counter['uidvalidity'], 'imap_totalcount' => array_key_exists('exists', $status) ? $status['exists'] : '', 'imap_timestamp' => Tinebase_DateTime::now(), 'cache_status' => 'complete', 'cache_totalcount' => array_key_exists('messages', $status) ? $status['messages'] : '', 'cache_recentcount' => array_key_exists('recent', $status) ? $status['recent'] : '', 'cache_unreadcount' => array_key_exists('unseen', $status) ? $status['unseen'] : '', 'cache_timestamp' => Tinebase_DateTime::now(), 'cache_job_lowestuid' => 0, 'cache_job_startuid' => 0, 'cache_job_actions_est' => 0, 'cache_job_actions_done' => 0, 'quota_usage' => $quota['STORAGE']['usage'], 'quota_limit' => $quota['STORAGE']['limit'])); }