alecpl
2010-05-12 488074965bde14657c94bb53f675f0dc49ef1b7c
program/include/rcube_imap_generic.php
@@ -186,8 +186,8 @@
          $buffer = fgets($this->fp, $size);
          if ($buffer === false) {
                fclose($this->fp);
                $this->fp = null;
               @fclose($this->fp);
               $this->fp = null;
              break;
          }
          if (!empty($this->prefs['debug_mode'])) {
@@ -263,7 +263,7 @@
          } else if ($res == 'BAD') {
             return -2;
          } else if ($res == 'BYE') {
                fclose($this->fp);
                @fclose($this->fp);
                $this->fp = null;
             return -3;
          }
@@ -286,7 +286,7 @@
       }
       if ($error && preg_match('/^\* (BYE|BAD) /i', $string, $m)) {
            if (strtoupper($m[1]) == 'BYE') {
                fclose($this->fp);
                @fclose($this->fp);
                $this->fp = null;
            }
          return true;
@@ -311,7 +311,7 @@
       }
       if ($error && preg_match('/^\* (BYE|BAD) /i', $string, $m)) {
            if (strtoupper($m[1]) == 'BYE') {
                fclose($this->fp);
                @fclose($this->fp);
                $this->fp = null;
            }
          return true;
@@ -394,14 +394,12 @@
        // process result
        $result = $this->parseResult($line);
        if ($result == 0) {
            $this->error    .= '';
            $this->errornum  = 0;
            $this->errornum = 0;
            return $this->fp;
        }
        $this->error    .= 'Authentication for ' . $user . ' failed (AUTH): "';
        $this->error    .= htmlspecialchars($line) . '"';
        $this->errornum  = $result;
        $this->error    = "Authentication for $user failed (AUTH): $line";
        $this->errornum = $result;
        return $result;
    }
@@ -416,17 +414,15 @@
        $result = $this->parseResult($line);
        if ($result == 0) {
            $this->error    .= '';
            $this->errornum  = 0;
            $this->errornum = 0;
            return $this->fp;
        }
        fclose($this->fp);
        @fclose($this->fp);
        $this->fp = false;
    
        $this->error    .= 'Authentication for ' . $user . ' failed (LOGIN): "';
        $this->error    .= htmlspecialchars($line)."\"";
        $this->errornum  = $result;
        $this->error    = "Authentication for $user failed (LOGIN): $line";
        $this->errornum = $result;
        return $result;
    }
@@ -1616,6 +1612,16 @@
    function listMailboxes($ref, $mailbox)
    {
        return $this->_listMailboxes($ref, $mailbox, false);
    }
    function listSubscribed($ref, $mailbox)
    {
        return $this->_listMailboxes($ref, $mailbox, true);
    }
    private function _listMailboxes($ref, $mailbox, $subscribed=false)
    {
      if (empty($mailbox)) {
           $mailbox = '*';
       }
@@ -1624,105 +1630,44 @@
           $ref = $this->rootdir;
       }
    
        if ($subscribed) {
            $key     = 'lsb';
            $command = 'LSUB';
        }
        else {
            $key     = 'lmb';
            $command = 'LIST';
        }
       // send command
       if (!$this->putLine("lmb LIST \"". $this->escape($ref) ."\" \"". $this->escape($mailbox) ."\"")) {
       if (!$this->putLine($key." ".$command." \"". $this->escape($ref) ."\" \"". $this->escape($mailbox) ."\"")) {
          $this->error = "Couldn't send $command command";
           return false;
       }
    
       $i = 0;
       // get folder list
       do {
          $line = $this->readLine(500);
          $line = $this->multLine($line, true);
          $a    = explode(' ', $line);
          $a = explode(' ', $line);
          if (($line[0] == '*') && ($a[1] == 'LIST')) {
          if (($line[0] == '*') && ($a[1] == $command)) {
             $line = rtrim($line);
              // split one line
             $a = rcube_explode_quoted_string(' ', $line);
              // last string is folder name
             $folders[$i] = preg_replace(array('/^"/', '/"$/'), '', $this->unEscape($a[count($a)-1]));
             $folders[] = preg_replace(array('/^"/', '/"$/'), '', $this->unEscape($a[count($a)-1]));
              // second from last is delimiter
              $delim = trim($a[count($a)-2], '"');
              // is it a container?
              $i++;
          }
       } while (!$this->startsWith($line, 'lmb', true));
       } while (!$this->startsWith($line, $key, true));
       if (is_array($folders)) {
           if (!empty($ref)) {
               // if rootdir was specified, make sure it's the first element
               // some IMAP servers (i.e. Courier) won't return it
               if ($ref[strlen($ref)-1]==$delim)
                  $ref = substr($ref, 0, strlen($ref)-1);
              if ($folders[0]!=$ref)
                  array_unshift($folders, $ref);
           }
           return $folders;
       } else if ($this->parseResult($line) == 0) {
          return array('INBOX');
            return array();
        }
       $this->error = $line;
       return false;
    }
    function listSubscribed($ref, $mailbox)
    {
       if (empty($mailbox)) {
          $mailbox = '*';
       }
       if (empty($ref) && $this->rootdir) {
          $ref = $this->rootdir;
       }
       $folders = array();
       // send command
       if (!$this->putLine('lsb LSUB "'. $this->escape($ref) . '" "' . $this->escape($mailbox).'"')) {
          $this->error = "Couldn't send LSUB command";
          return false;
       }
       $i = 0;
       // get folder list
       do {
          $line = $this->readLine(500);
          $line = $this->multLine($line, true);
          $a    = explode(' ', $line);
          if (($line[0] == '*') && ($a[1] == 'LSUB' || $a[1] == 'LIST')) {
             $line = rtrim($line);
              // split one line
             $a = rcube_explode_quoted_string(' ', $line);
              // last string is folder name
             $folder = preg_replace(array('/^"/', '/"$/'), '', $this->UnEscape($a[count($a)-1]));
             // @TODO: do we need this check???
             if (!in_array($folder, $folders)) {
                 $folders[$i] = $folder;
              }
              // second from last is delimiter
              $delim = trim($a[count($a)-2], '"');
              // is it a container?
              $i++;
          }
       } while (!$this->startsWith($line, 'lsb', true));
       if (is_array($folders)) {
           if (!empty($ref)) {
               // if rootdir was specified, make sure it's the first element
               // some IMAP servers (i.e. Courier) won't return it
               if ($ref[strlen($ref)-1]==$delim) {
                   $ref = substr($ref, 0, strlen($ref)-1);
               }
               if ($folders[0]!=$ref) {
                   array_unshift($folders, $ref);
               }
           }
           return $folders;
       }
       $this->error = $line;
       return false;
    }