/**
  * delete messages from cache
  *
  * @param array $_ids
  * @param Expressomail_Model_Folder $_folder
  * @return integer number of removed messages
  */
 protected function _deleteMessagesByIdAndUpdateCounters($_ids, Expressomail_Model_Folder $_folder)
 {
     if (count($_ids) == 0) {
         if (Tinebase_Core::isLogLevel(Zend_Log::DEBUG)) {
             Tinebase_Core::getLogger()->debug(__METHOD__ . '::' . __LINE__ . ' No messages to delete.');
         }
         return 0;
     }
     $decrementMessagesCounter = 0;
     $decrementUnreadCounter = 0;
     if (Tinebase_Core::isLogLevel(Zend_Log::DEBUG)) {
         Tinebase_Core::getLogger()->debug(__METHOD__ . '::' . __LINE__ . ' Delete ' . count($_ids) . ' messages');
     }
     $messagesToBeDeleted = $this->_backend->getMultiple($_ids);
     foreach ($messagesToBeDeleted as $messageToBeDeleted) {
         $this->_backend->delete($messageToBeDeleted);
         $_folder->cache_job_actions_done++;
         $decrementMessagesCounter++;
         if (!$messageToBeDeleted->hasSeenFlag()) {
             $decrementUnreadCounter++;
         }
     }
     $_folder = Expressomail_Controller_Folder::getInstance()->updateFolderCounter($_folder, array('cache_totalcount' => "-{$decrementMessagesCounter}", 'cache_unreadcount' => "-{$decrementUnreadCounter}"));
     return $decrementMessagesCounter;
 }
 /**
  * add to/cc/bcc and flags custom filters
  *
  * @param  Zend_Db_Select                       $_select
  * @param  Expressomail_Backend_Message $_backend
  * @param  array                                $_filterData
  * @return void
  */
 protected function _addRecipientAndFlagsSql($_select, $_backend, $_filterData)
 {
     $db = $_backend->getAdapter();
     $foreignTables = $_backend->getForeignTables();
     // add conditions
     $tablename = $foreignTables[$_filterData['field']]['table'];
     if ($_filterData['field'] !== 'flags') {
         $fieldName = $tablename . '.name';
         $fieldEmail = $tablename . '.email';
     }
     // add filter value
     if (!is_array($_filterData['value'])) {
         $value = '%' . $_filterData['value'] . '%';
     } else {
         $value = array();
         foreach ((array) $_filterData['value'] as $customValue) {
             $value[] = '%' . $customValue . '%';
         }
     }
     if ($_filterData['field'] == 'flags') {
         if ($_filterData['operator'] == 'equals' || $_filterData['operator'] == 'contains') {
             $_select->having($db->quoteInto('flags LIKE ?', $value));
         } else {
             if ($_filterData['operator'] == 'in' || $_filterData['operator'] == 'notin') {
                 if (empty($value)) {
                     $whereString = 'flags IS NULL';
                 } else {
                     $value = (array) $value;
                     $where = array();
                     $op = $_filterData['operator'] == 'in' ? 'LIKE' : 'NOT LIKE';
                     $opImplode = $_filterData['operator'] == 'in' ? ' OR ' : ' AND ';
                     foreach ($value as $flag) {
                         $where[] = $db->quoteInto('flags ' . $op . ' ?', $flag);
                     }
                     $whereString = implode($opImplode, $where);
                     if ($_filterData['operator'] == 'notin') {
                         $whereString = '(' . $whereString . ') OR flags IS NULL';
                     }
                 }
                 $_select->having($whereString);
             } else {
                 $_select->having($db->quoteInto('flags NOT LIKE ? OR flags IS NULL', $value));
             }
         }
     } else {
         $_select->where($db->quoteInto($fieldName . ' LIKE ?', $value) . ' OR ' . $db->quoteInto($fieldEmail . ' LIKE ?', $value));
     }
 }
 /**
  * save message in folder (target folder can be within a different account)
  *
  * @param string|Expressomail_Model_Folder $_folder globalname or folder record
  * @param Expressomail_Model_Message $_message
  * @return Expressomail_Model_Message
  */
 public function saveMessageInFolder($_folder, $_message)
 {
     $sourceAccount = Expressomail_Controller_Account::getInstance()->get($_message->account_id);
     $folder = $_folder instanceof Expressomail_Model_Folder ? $_folder : Expressomail_Controller_Folder::getInstance()->getByBackendAndGlobalName($_message->account_id, $_folder);
     $targetAccount = $_message->account_id == $folder->account_id ? $sourceAccount : Expressomail_Controller_Account::getInstance()->get($folder->account_id);
     $this->_resolveOriginalMessage($_message);
     $mailToAppend = $this->createMailForSending($_message, $sourceAccount);
     $transport = new Expressomail_Transport();
     $mailAsString = $transport->getRawMessage($mailToAppend, $this->_getAdditionalHeaders($_message));
     $flags = $folder->globalname === $targetAccount->drafts_folder ? array(Zend_Mail_Storage::FLAG_DRAFT) : null;
     if (Tinebase_Core::isLogLevel(Zend_Log::DEBUG)) {
         Tinebase_Core::getLogger()->debug(__METHOD__ . '::' . __LINE__ . ' Appending message ' . $_message->subject . ' to folder ' . $folder->globalname . ' in account ' . $targetAccount->name);
     }
     if (Tinebase_Core::isLogLevel(Zend_Log::TRACE)) {
         Tinebase_Core::getLogger()->trace(__METHOD__ . '::' . __LINE__ . ' ' . $mailAsString);
     }
     try {
         Expressomail_Backend_ImapFactory::factory($targetAccount)->appendMessage($mailAsString, $folder->globalname, $flags);
     } catch (Zend_Mail_Protocol_Exception $e) {
         if ($folder->system_folder) {
             Expressomail_Backend_ImapFactory::factory($targetAccount)->createFolder($folder->localname, $folder->parent);
             Expressomail_Backend_ImapFactory::factory($targetAccount)->appendMessage($mailAsString, $folder->globalname, $flags);
         } else {
             throw $e;
         }
     }
     // update original_id of saved message
     $res = Expressomail_Backend_ImapFactory::factory($targetAccount)->examineFolder($folder->globalname);
     $_messageid = Expressomail_Backend_Message::createMessageId($_message->account_id, $folder->id, $res['uidnext'] - 1);
     $_message->original_id = $_messageid;
     return $_message;
 }
 /**
  * delete messages with given messageuids by folder (id)
  *
  * @param  array  $_msguids
  * @param  mixed  $_folderId
  * @return integer number of deleted rows or false if no message are given
  */
 public function deleteMessageuidsByFolderId($_msguids, $_folderId)
 {
     $return = FALSE;
     if (!(empty($_msguids) || !is_array($_msguids))) {
         Tinebase_Core::getLogger()->debug(__METHOD__ . '::' . __LINE__ . ' Logicaly delete the messages ' . print_r($_msguids, true));
         $return = count($_msguids);
     }
     //return $return;
     /**
      * TODO: remove the code below and uncomment the code above
      */
     $aux = new Expressomail_Backend_Message();
     $retorno = $aux->deleteMessageuidsByFolderId($_msguids, $_folderId);
     return $retorno;
 }