alecpl
2009-01-07 46b48e6d349d48e6e211858a82589223b1364518
program/lib/imap.inc
@@ -73,6 +73,9 @@
      - fix iil_C_FetchPartHeader() in some cases by use of iil_C_HandlePartBody()
      - allow iil_C_HandlePartBody() to fetch whole message
      - optimize iil_C_FetchHeaders() to use only one FETCH command
      - added 4th argument to iil_Connect()
      - allow setting rootdir and delimiter before connect
      - support multiquota result
********************************************************/
@@ -476,13 +479,14 @@
function iil_C_NameSpace(&$conn) {
   global $my_prefs;
   if (isset($my_prefs['rootdir']) && is_string($my_prefs['rootdir'])) {
          $conn->rootdir = $my_prefs['rootdir'];
      return true;
   }
   
   if (!iil_C_GetCapability($conn, 'NAMESPACE')) {
       return false;
   }
   if ($my_prefs["rootdir"]) {
       return true;
   }
    
   iil_PutLine($conn->fp, "ns1 NAMESPACE");
@@ -510,12 +514,13 @@
    
   $conn->rootdir       = $first_userspace[0];
   $conn->delimiter     = $first_userspace[1];
   $my_prefs["rootdir"] = substr($conn->rootdir, 0, -1);
   $my_prefs['rootdir'] = substr($conn->rootdir, 0, -1);
   $my_prefs['delimiter'] = $conn->delimiter;
   
   return true;
}
function iil_Connect($host, $user, $password) {
function iil_Connect($host, $user, $password, $options=null) {
   global $iil_error, $iil_errornum;
   global $ICL_SSL, $ICL_PORT;
   global $IMAP_NO_CACHE;
@@ -523,18 +528,23 @@
   
   $iil_error = '';
   $iil_errornum = 0;
   //set auth method
   $auth_method = 'plain';
   if (func_num_args() >= 4) {
      $auth_array = func_get_arg(3);
      if (is_array($auth_array)) {
         $auth_method = $auth_array['imap'];
          }
      if (empty($auth_method)) {
              $auth_method = "plain";
          }
   // set some imap options
   if (is_array($options)) {
      foreach($options as $optkey => $optval) {
         if ($optkey == 'imap') {
            $auth_method = $optval;
         } else if ($optkey == 'rootdir') {
                $my_prefs['rootdir'] = $optval;
         } else if ($optkey == 'delimiter') {
                $my_prefs['delimiter'] = $optval;
         }
      }
   }
   if (empty($auth_method))
          $auth_method = 'check';
   $message = "INITIAL: $auth_method\n";
      
   $result = false;
@@ -1733,7 +1743,7 @@
               //get timezone
               $time_str      = substr($time_str, 0, -1);
               $time_zone_str = substr($time_str, -5); // extract timezone
               $time_str      = substr($time_str, 1, -6); // remove quotes
               $time_str      = substr($time_str, 0, -5); // remove timezone
               $time_zone     = (float)substr($time_zone_str, 1, 2); // get first two digits
         
               if ($time_zone_str[3] != '0') {
@@ -1746,7 +1756,7 @@
               //calculate timestamp
                                        $timestamp     = strtotime($time_str); //return's server's time
               $timestamp    -= $time_zone * 3600; //compensate for tz, get GMT
               $result[$id]->internaldate = $time_str;
               $result[$id]->timestamp = $timestamp;
               $result[$id]->date = $time_str;
@@ -2138,8 +2148,14 @@
 * @see iil_Connect()
 */
function iil_C_GetHierarchyDelimiter(&$conn) {
   global $my_prefs;
   if ($conn->delimiter) {
        return $conn->delimiter;
          return $conn->delimiter;
   }
   if (!empty($my_prefs['delimiter'])) {
           return ($conn->delimiter = $my_prefs['delimiter']);
   }
    
   $fp        = $conn->fp;
@@ -2641,31 +2657,41 @@
 * GETQUOTAROOT "INBOX"
 * QUOTAROOT INBOX user/rchijiiwa1
 * QUOTA user/rchijiiwa1 (STORAGE 654 9765)
 b OK Completed
 * OK Completed
 */
   $fp         = $conn->fp;
   $result     = false;
   $quota_line = '';
   $quota_lines = array();
   
   //get line containing quota info
   // get line(s) containing quota info
   if (iil_PutLine($fp, 'QUOT1 GETQUOTAROOT "INBOX"')) {
      do {
         $line=chop(iil_ReadLine($fp, 5000));
         if (iil_StartsWith($line, '* QUOTA ')) {
            $quota_line = $line;
            $quota_lines[] = $line;
              }
      } while (!iil_StartsWith($line, 'QUOT1', true));
   }
   
   //return false if not found, parse if found
   if (!empty($quota_line)) {
   // return false if not found, parse if found
   $min_free = PHP_INT_MAX;
   foreach ($quota_lines as $key => $quota_line) {
      $quota_line   = eregi_replace('[()]', '', $quota_line);
      $parts        = explode(' ', $quota_line);
      $storage_part = array_search('STORAGE', $parts);
      if ($storage_part > 0) {
         $result['used']    = intval($parts[$storage_part+1]);
         $result['total']   = intval($parts[$storage_part+2]);
         $result['percent'] = min(100, round(($result['used']/max(1,$result['total']))*100));
      if (!$storage_part) continue;
      $used   = intval($parts[$storage_part+1]);
      $total   = intval($parts[$storage_part+2]);
      $free   = $total - $used;
      // return lowest available space from all quotas
      if ($free < $min_free) {
              $min_free = $free;
         $result['used']    = $used;
         $result['total']   = $total;
         $result['percent'] = min(100, round(($used/max(1,$total))*100));
         $result['free']    = 100 - $result['percent'];
      }
   }