/**
  * Fetches index data from IMAP server
  */
 private function get_index_data($mailbox, $sort_field, $sort_order, $mbox_data = array())
 {
     $data = array();
     if (empty($mbox_data)) {
         $mbox_data = $this->imap->mailbox_data($mailbox);
     }
     // Prevent infinite loop.
     // It happens when rcube_imap::message_index_direct() is called.
     // There id2uid() is called which will again call get_index() and so on.
     if (!$sort_field && !$this->skip_deleted) {
         $this->icache['pending_index_update'] = true;
     }
     if ($mbox_data['EXISTS']) {
         // fetch sorted sequence numbers
         $data_seq = $this->imap->message_index_direct($mailbox, $sort_field, $sort_order);
         // fetch UIDs
         if (!empty($data_seq)) {
             // Seek in internal cache
             if (array_key_exists('index', (array) $this->icache[$mailbox]) && array_key_exists('result', (array) $this->icache[$mailbox]['index'])) {
                 $data_uid = $this->icache[$mailbox]['index']['result'];
             } else {
                 $data_uid = $this->imap->conn->fetchUIDs($mailbox, $data_seq);
             }
             // build index
             if (!empty($data_uid)) {
                 foreach ($data_seq as $seq) {
                     if ($uid = $data_uid[$seq]) {
                         $data[$seq] = $uid;
                     }
                 }
             }
         }
     }
     // Reset internal flags
     $this->icache['pending_index_update'] = false;
     return $data;
 }