Example #1
0
 /**
  * @param string $sSearch
  * @param string $sFolderName
  * @param string|bool $sFolderHash
  * @param bool $bUseSortIfSupported = true
  * @param bool $bUseESearchOrESortRequest = false
  * @param \MailSo\Cache\CacheClient|null $oCacher = null
  *
  * @return Array|bool
  */
 private function getSearchUidsResult($sSearch, $sFolderName, $sFolderHash, $bUseSortIfSupported = true, $bUseESearchOrESortRequest = false, $oCacher = null)
 {
     $bUidsFromCacher = false;
     $aResultUids = false;
     $bUseCacheAfterSearch = true;
     $sSerializedHash = '';
     $bESortSupported = $bUseSortIfSupported && $bUseESearchOrESortRequest ? $this->oImapClient->IsSupported('ESORT') : false;
     $bESearchSupported = $bUseESearchOrESortRequest ? $this->oImapClient->IsSupported('ESEARCH') : false;
     $bUseSortIfSupported = $bUseSortIfSupported ? $this->oImapClient->IsSupported('SORT') : false;
     $sSearchCriterias = $this->getImapSearchCriterias($sSearch, 0, $bUseCacheAfterSearch);
     if ($bUseCacheAfterSearch && $oCacher && $oCacher->IsInited()) {
         $sSerializedHash = ($bUseSortIfSupported ? 'S' : 'N') . '/' . $this->oImapClient->GetLogginedUser() . '@' . $this->oImapClient->GetConnectedHost() . ':' . $this->oImapClient->GetConnectedPort() . '/' . $sFolderName . '/' . $sSearchCriterias;
         $sSerializedLog = '"' . $sFolderName . '" / ' . $sSearchCriterias . '';
         $sSerialized = $oCacher->Get($sSerializedHash);
         if (!empty($sSerialized)) {
             $aSerialized = @\unserialize($sSerialized);
             if (\is_array($aSerialized) && isset($aSerialized['FolderHash'], $aSerialized['Uids']) && \is_array($aSerialized['Uids']) && $sFolderHash === $aSerialized['FolderHash']) {
                 if ($this->oLogger) {
                     $this->oLogger->Write('Get Serialized UIDS from cache (' . $sSerializedLog . ') [count:' . \count($aSerialized['Uids']) . ']');
                 }
                 $aResultUids = $aSerialized['Uids'];
                 $bUidsFromCacher = true;
             }
         }
     }
     if (!\is_array($aResultUids)) {
         if ($bUseSortIfSupported) {
             if ($bESortSupported) {
                 $aESorthData = $this->oImapClient->MessageSimpleESort(array('ARRIVAL'), $sSearchCriterias, array('ALL'), true, '');
                 if (isset($aESorthData['ALL'])) {
                     $aResultUids = \MailSo\Base\Utils::ParseFetchSequence($aESorthData['ALL']);
                     $aResultUids = \array_reverse($aResultUids);
                 }
                 unset($aESorthData);
             } else {
                 $aResultUids = $this->oImapClient->MessageSimpleSort(array('REVERSE ARRIVAL'), $sSearchCriterias, true);
             }
         } else {
             if (!\MailSo\Base\Utils::IsAscii($sSearch)) {
                 try {
                     if ($bESearchSupported) {
                         $aESearchData = $this->oImapClient->MessageSimpleESearch($sSearchCriterias, array('ALL'), true, '', 'UTF-8');
                         if (isset($aESearchData['ALL'])) {
                             $aResultUids = \MailSo\Base\Utils::ParseFetchSequence($aESearchData['ALL']);
                             $aResultUids = \array_reverse($aResultUids);
                         }
                         unset($aESearchData);
                     } else {
                         $aResultUids = $this->oImapClient->MessageSimpleSearch($sSearchCriterias, true, 'UTF-8');
                     }
                 } catch (\MailSo\Imap\Exceptions\NegativeResponseException $oException) {
                     $oException = null;
                     $aResultUids = false;
                 }
             }
             if (false === $aResultUids) {
                 if ($bESearchSupported) {
                     $aESearchData = $this->oImapClient->MessageSimpleESearch($sSearchCriterias, array('ALL'), true);
                     if (isset($aESearchData['ALL'])) {
                         $aResultUids = \MailSo\Base\Utils::ParseFetchSequence($aESearchData['ALL']);
                         $aResultUids = \array_reverse($aResultUids);
                     }
                     unset($aESearchData);
                 } else {
                     $aResultUids = $this->oImapClient->MessageSimpleSearch($sSearchCriterias, true);
                 }
             }
         }
         if (!$bUidsFromCacher && $bUseCacheAfterSearch && \is_array($aResultUids) && $oCacher && $oCacher->IsInited() && 0 < \strlen($sSerializedHash)) {
             $oCacher->Set($sSerializedHash, \serialize(array('FolderHash' => $sFolderHash, 'Uids' => $aResultUids)));
             if ($this->oLogger) {
                 $this->oLogger->Write('Save Serialized UIDS to cache (' . $sSerializedLog . ') [count:' . \count($aResultUids) . ']');
             }
         }
     }
     return $aResultUids;
 }
Example #2
0
 /**
  * @deprecated
  *
  * @param string $sFolderName
  * @param int $iOffset = 0
  * @param int $iLimit = 10
  * @param string $sSearch = ''
  * @param string $sPrevUidNext = ''
  * @param mixed $oCacher = null
  * @param string $sCachePrefix = ''
  * @param bool $bUseSortIfSupported = false
  * @param bool $bUseThreadSortIfSupported = false
  * @param array $aExpandedThreadsUids = array()
  * @param bool $bUseESearchOrESortRequest = false
  *
  * @return \MailSo\Mail\MessageCollection
  *
  * @throws \MailSo\Base\Exceptions\InvalidArgumentException
  * @throws \MailSo\Net\Exceptions\Exception
  * @throws \MailSo\Imap\Exceptions\Exception
  */
 public function MessageListDepr($sFolderName, $iOffset = 0, $iLimit = 10, $sSearch = '', $sPrevUidNext = '', $oCacher = null, $bUseSortIfSupported = false, $bUseThreadSortIfSupported = false, $aExpandedThreadsUids = array(), $bUseESearchOrESortRequest = false)
 {
     $sSearch = \trim($sSearch);
     if (!\MailSo\Base\Validator::RangeInt($iOffset, 0) || !\MailSo\Base\Validator::RangeInt($iLimit, 0, 999) || !is_string($sSearch)) {
         throw new \MailSo\Base\Exceptions\InvalidArgumentException();
     }
     $this->oImapClient->FolderExamine($sFolderName);
     $oMessageCollection = MessageCollection::NewInstance();
     $oMessageCollection->FolderName = $sFolderName;
     $oMessageCollection->Offset = $iOffset;
     $oMessageCollection->Limit = $iLimit;
     $oMessageCollection->Search = $sSearch;
     $aLastCollapsedThreadUids = array();
     $aThreads = array();
     $iMessageCount = 0;
     $iMessageRealCount = 0;
     $iMessageUnseenCount = 0;
     $iMessageCacheCount = 100;
     $sUidNext = '0';
     $sSerializedHash = '';
     $bESearchSupported = $bUseESearchOrESortRequest ? $this->oImapClient->IsSupported('ESEARCH') : false;
     $bUseSortIfSupported = $bUseSortIfSupported ? $this->oImapClient->IsSupported('SORT') : false;
     $bESortSupported = $bUseSortIfSupported && $bUseESearchOrESortRequest ? $this->oImapClient->IsSupported('ESORT') : false;
     $bUseThreadSortIfSupported = $bUseThreadSortIfSupported ? $this->oImapClient->IsSupported('THREAD=REFS') || $this->oImapClient->IsSupported('THREAD=REFERENCES') || $this->oImapClient->IsSupported('THREAD=ORDEREDSUBJECT') : false;
     if (!$oCacher || !$oCacher instanceof \MailSo\Cache\CacheClient) {
         $oCacher = null;
     }
     $this->initFolderValues($sFolderName, $iMessageRealCount, $iMessageUnseenCount, $sUidNext);
     $iMessageCount = $iMessageRealCount;
     $oMessageCollection->FolderHash = self::GenerateHash($sFolderName, $iMessageRealCount, $iMessageUnseenCount, $sUidNext);
     $oMessageCollection->UidNext = $sUidNext;
     $oMessageCollection->NewMessages = $this->getFolderNextMessageInformation($sFolderName, $sPrevUidNext, $sUidNext);
     $bCacher = false;
     $bSearch = false;
     if (0 < $iMessageRealCount) {
         $bIndexAsUid = false;
         $aIndexOrUids = array();
         $bSearch = 0 < \strlen($sSearch);
         if ($bSearch || $bUseSortIfSupported && !$bUseThreadSortIfSupported) {
             $bIndexAsUid = true;
             $aIndexOrUids = null;
             $sSearchCriterias = $this->getImapSearchCriterias($sSearch);
             if ($iMessageCacheCount < $iMessageRealCount && $oCacher && $oCacher->IsInited()) {
                 $sSerializedHash = ($bUseSortIfSupported ? 'S' : 'N') . '/' . ($bUseThreadSortIfSupported ? 'T' : 'N') . '/' . $this->oImapClient->GetLogginedUser() . '@' . $this->oImapClient->GetConnectedHost() . ':' . $this->oImapClient->GetConnectedPort() . '/' . $oMessageCollection->FolderName . '/' . $sSearchCriterias;
                 $sSerialized = $oCacher->Get($sSerializedHash);
                 if (!empty($sSerialized)) {
                     $aSerialized = @\unserialize($sSerialized);
                     if (\is_array($aSerialized) && isset($aSerialized['FolderHash'], $aSerialized['Uids']) && \is_array($aSerialized['Uids']) && $oMessageCollection->FolderHash === $aSerialized['FolderHash']) {
                         $aIndexOrUids = $aSerialized['Uids'];
                         $bCacher = true;
                     }
                 }
             }
             if (!\is_array($aIndexOrUids)) {
                 if ($bUseSortIfSupported && !$bUseThreadSortIfSupported) {
                     if ($bESortSupported) {
                         $aESorthData = $this->oImapClient->MessageSimpleESort(array('ARRIVAL'), $sSearchCriterias, array('ALL'), $bIndexAsUid, '');
                         if (isset($aESorthData['ALL'])) {
                             $aIndexOrUids = \MailSo\Base\Utils::ParseFetchSequence($aESorthData['ALL']);
                             $aIndexOrUids = \array_reverse($aIndexOrUids);
                         }
                         unset($aESorthData);
                     } else {
                         $aIndexOrUids = $this->oImapClient->MessageSimpleSort(array('REVERSE ARRIVAL'), $sSearchCriterias, $bIndexAsUid);
                     }
                 } else {
                     if (!\MailSo\Base\Utils::IsAscii($sSearch)) {
                         try {
                             if ($bESearchSupported) {
                                 $aESearchData = $this->oImapClient->MessageSimpleESearch($sSearchCriterias, array('ALL'), $bIndexAsUid, '', 'UTF-8');
                                 if (isset($aESearchData['ALL'])) {
                                     $aIndexOrUids = \MailSo\Base\Utils::ParseFetchSequence($aESearchData['ALL']);
                                     $aIndexOrUids = \array_reverse($aIndexOrUids);
                                 }
                                 unset($aESearchData);
                             } else {
                                 $aIndexOrUids = $this->oImapClient->MessageSimpleSearch($sSearchCriterias, $bIndexAsUid, 'UTF-8');
                             }
                         } catch (\MailSo\Imap\Exceptions\NegativeResponseException $oException) {
                             $oException = null;
                             $aIndexOrUids = null;
                         }
                     }
                     if (null === $aIndexOrUids) {
                         if ($bESearchSupported) {
                             $aESearchData = $this->oImapClient->MessageSimpleESearch($sSearchCriterias, array('ALL'), $bIndexAsUid);
                             if (isset($aESearchData['ALL'])) {
                                 $aIndexOrUids = \MailSo\Base\Utils::ParseFetchSequence($aESearchData['ALL']);
                                 $aIndexOrUids = \array_reverse($aIndexOrUids);
                             }
                             unset($aESearchData);
                         } else {
                             $aIndexOrUids = $this->oImapClient->MessageSimpleSearch($sSearchCriterias, $bIndexAsUid);
                         }
                     }
                 }
             }
         } else {
             if ($bUseThreadSortIfSupported && 1 < $iMessageCount) {
                 $bIndexAsUid = true;
                 $aThreads = $this->MessageListThreadsMap($oMessageCollection->FolderName, $oMessageCollection->FolderHash, $oCacher);
                 $aIndexOrUids = $this->compileLineThreadUids($aThreads, $aLastCollapsedThreadUids, $aExpandedThreadsUids, 0);
                 $iMessageCount = \count($aIndexOrUids);
             } else {
                 $bIndexAsUid = false;
                 $aIndexOrUids = array(1);
                 if (1 < $iMessageCount) {
                     $aIndexOrUids = \array_reverse(\range(1, $iMessageCount));
                 }
             }
         }
         if ($bIndexAsUid && !$bCacher && \is_array($aIndexOrUids) && $oCacher && $oCacher->IsInited() && 0 < \strlen($sSerializedHash)) {
             $oCacher->Set($sSerializedHash, \serialize(array('FolderHash' => $oMessageCollection->FolderHash, 'Uids' => $aIndexOrUids)));
         }
         if (\is_array($aIndexOrUids)) {
             $oMessageCollection->MessageCount = $iMessageRealCount;
             $oMessageCollection->MessageUnseenCount = $iMessageUnseenCount;
             $oMessageCollection->MessageResultCount = 0 === \strlen($sSearch) ? $iMessageCount : \count($aIndexOrUids);
             if (0 < count($aIndexOrUids)) {
                 $iOffset = 0 > $iOffset ? 0 : $iOffset;
                 $aRequestIndexOrUids = \array_slice($aIndexOrUids, $iOffset, $iLimit);
                 $this->MessageListByRequestIndexOrUids($oMessageCollection, $aRequestIndexOrUids, $bIndexAsUid);
             }
         }
     }
     $aLastCollapsedThreadUidsForPage = array();
     if (!$bSearch && $bUseThreadSortIfSupported && 0 < \count($aThreads)) {
         $oMessageCollection->ForeachList(function ($oMessage) use($aThreads, $aLastCollapsedThreadUids, &$aLastCollapsedThreadUidsForPage) {
             $iUid = $oMessage->Uid();
             if (in_array($iUid, $aLastCollapsedThreadUids)) {
                 $aLastCollapsedThreadUidsForPage[] = $iUid;
             }
             if (isset($aThreads[$iUid]) && \is_array($aThreads[$iUid]) && 0 < \count($aThreads[$iUid])) {
                 $oMessage->SetThreads($aThreads[$iUid]);
                 $oMessage->SetThreadsLen(\count($aThreads[$iUid]));
             } else {
                 if (!isset($aThreads[$iUid])) {
                     foreach ($aThreads as $iKeyUid => $mSubItem) {
                         if (is_array($mSubItem) && in_array($iUid, $mSubItem)) {
                             $oMessage->SetParentThread($iKeyUid);
                             $oMessage->SetThreadsLen(\count($mSubItem));
                         }
                     }
                 }
             }
         });
         $oMessageCollection->LastCollapsedThreadUids = $aLastCollapsedThreadUidsForPage;
     }
     return $oMessageCollection;
 }