Changeset 5216 for trunk


Ignore:
Timestamp:
11/29/11 13:34:40 (12 years ago)
Author:
gustavo
Message:

Ticket #2354 - Refatorar Função get_folders_list

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/expressoMail1_2/inc/class.imap_functions.inc.php

    r5212 r5216  
    23292329            return $contentType; 
    23302330    } 
    2331  
    2332          /** 
    2333      * Metodo que retorna todas as pastas do usuario logado. 
    2334      * @param $params array opcional para repassar os argumentos ao metodo. 
    2335      * Se usar $params['noSharedFolders'] = true, ira retornar todas as pastas do usuário logado, 
    2336      * excluindo as compartilhadas para ele. 
    2337      * Se usar $params['folderType'] = "default" irá retornar somente as pastas defaults 
    2338      * Se usar $params['folderType'] = "personal" irá retornar somente as pastas pessoais 
    2339      * Se usar $params['folderType'] = null irá retornar todas as pastas 
    2340      * @return Retorna um array contendo as seguintes informacoes de cada pasta: folder_unseen, 
    2341      * folder_id, folder_name, folder_parent e folder_hasChildren. 
    2342      */ 
     2331     
     2332        function getFolderPos(&$array , $find) 
     2333        {             
     2334                foreach($array as $i => $v) 
     2335                        if($v['id'] === $find) 
     2336                                return $i; 
     2337                return false; 
     2338        } 
     2339         
     2340        /** 
     2341        * Ordenas as pastas padrões do usuario na ordem INBOX > SENT > DRAFTS > SPAM > TRASH > OTHERS 
     2342        * 
     2343        * @license    http://www.gnu.org/copyleft/gpl.html GPL 
     2344        * @author     Consórcio Expresso Livre - 4Linux (www.4linux.com.br) e Prognus Software Livre (www.prognus.com.br) 
     2345        * @sponsor    Caixa Econômica Federal 
     2346        * @author     Cristiano Corrêa Schmidt 
     2347        * @access     public 
     2348        */ 
     2349        function orderDefaultFolders( &$folders , $user) 
     2350        { 
     2351                $principals = array(); 
     2352                for($x = 0; $x < 5 ; $x++) 
     2353                { 
     2354                        switch ($x) { 
     2355                                case 0:                              
     2356                                        if( ($p = $this->getFolderPos($folders , $user )) || $p === 0 ) 
     2357                                                $principals[] = $folders[$p]; 
     2358                                        break; 
     2359                                case 1: 
     2360                                        if( ($p = $this->getFolderPos($folders , $user . $this->imap_delimiter . $_SESSION['phpgw_info']['expressomail']['email_server']['imapDefaultDraftsFolder'] )) || $p === 0 ) 
     2361                                                $principals[] = $folders[$p]; 
     2362                                        break; 
     2363                                case 2: 
     2364                                        if( ($p = $this->getFolderPos($folders , $user . $this->imap_delimiter . $_SESSION['phpgw_info']['expressomail']['email_server']['imapDefaultSentFolder'] )) || $p === 0 ) 
     2365                                                $principals[] = $folders[$p]; 
     2366                                        break; 
     2367                                case 3: 
     2368                                        if( ($p = $this->getFolderPos($folders , $user . $this->imap_delimiter . $_SESSION['phpgw_info']['expressomail']['email_server']['imapDefaultSpamFolder'] )) || $p === 0 ) 
     2369                                                $principals[] = $folders[$p]; 
     2370                                        break; 
     2371                                case 4: 
     2372                                        if( ($p = $this->getFolderPos($folders , $user . $this->imap_delimiter . $_SESSION['phpgw_info']['expressomail']['email_server']['imapDefaultTrashFolder'] )) || $p === 0  ) 
     2373                                                $principals[] = $folders[$p];                                            
     2374                                        break; 
     2375                        } 
     2376                        if($p !== false) 
     2377                                unset($folders[$p]); 
     2378                } 
     2379                $folders = array_merge($principals, $folders); 
     2380        } 
     2381         
     2382        /** 
     2383        * Retorna lista de pastas do usuario no padrão que a lib javascript espera. 
     2384        * 
     2385        * @license    http://www.gnu.org/copyleft/gpl.html GPL 
     2386        * @author     Consórcio Expresso Livre - 4Linux (www.4linux.com.br) e Prognus Software Livre (www.prognus.com.br) 
     2387        * @sponsor    Caixa Econômica Federal 
     2388        * @author     Cristiano Corrêa Schmidt 
     2389        * @access     public 
     2390        */ 
    23432391        function get_folders_list($params = null) 
    23442392        { 
    2345                 $mbox_stream = $this->open_mbox(); 
    2346                 if($params &&  array_key_exists('onload', $params)   &&  $params['onload'] && $_SESSION['phpgw_info']['expressomail']['server']['certificado']){ 
    2347                         $this->delete_mailbox(array("del_past" => "INBOX".$this->imap_delimiter."decifradas")); 
    2348                 } 
    2349  
    2350                 $inbox = 'INBOX'; 
    2351                 $drafts = $inbox . $this->imap_delimiter . $_SESSION['phpgw_info']['expressomail']['email_server']['imapDefaultDraftsFolder']; 
    2352                 $sent = $inbox . $this->imap_delimiter . $_SESSION['phpgw_info']['expressomail']['email_server']['imapDefaultSentFolder']; 
    2353                 $spam = $inbox . $this->imap_delimiter . $_SESSION['phpgw_info']['expressomail']['email_server']['imapDefaultSpamFolder']; 
    2354                 $trash = $inbox . $this->imap_delimiter . $_SESSION['phpgw_info']['expressomail']['email_server']['imapDefaultTrashFolder']; 
    2355  
    2356                 if(array_key_exists('uid2cn', $_SESSION['phpgw_info']['user']['preferences']['expressoMail'] )) 
    2357                 $uid2cn = $_SESSION['phpgw_info']['user']['preferences']['expressoMail']['uid2cn'];  
     2393                ///Define Variaveis 
     2394                $prefixShared = 'user'; //Prefixo das pastas compartilhadas 
     2395                $uid2cn = (isset($_SESSION['phpgw_info']['user']['preferences']['expressoMail']['uid2cn'])) ? $_SESSION['phpgw_info']['user']['preferences']['expressoMail']['uid2cn'] : false;  
     2396                $mboxStream = $this->open_mbox(); //abre conexão imap 
     2397                $currentFolder = isset($params['folder']) ? $params['folder'] : 'INBOX'; 
     2398                $folders = array(); 
     2399                $return = array(); 
     2400                /////////////////////////////////////////////////////////////// 
     2401                     
     2402                if( isset($params['onload']) && $_SESSION['phpgw_info']['expressomail']['server']['certificado']) 
     2403                        $this->delete_mailbox(array('del_past' => 'INBOX'.$this->imap_delimiter.'decifradas')); //Deleta Pasta decifradas 
     2404                 
     2405                session_write_close(); // Free others requests  
     2406                $serverString = "{".$this->imap_server.":".$this->imap_port.$this->imap_options."}";  
     2407                 
     2408                if ( isset($params['noSharedFolders']) ) 
     2409                        $folders_list = array_merge(imap_getmailboxes($mboxStream, $serverString, 'INBOX' ), imap_getmailboxes($mboxStream, $serverString, 'INBOX/*' ) ); 
    23582410                else 
    2359                         $uid2cn = false; 
    2360                 // Free others requests  
    2361                 session_write_close();  
    2362  
    2363                 $serverString = "{".$this->imap_server.":".$this->imap_port.$this->imap_options."}";  
    2364                  
    2365                 if ( $params && isset($params['noSharedFolders']) ) 
    2366                         $folders_list = array_merge(imap_getmailboxes($mbox_stream, $serverString, 'INBOX' ), imap_getmailboxes($mbox_stream, $serverString, 'INBOX/*' ) ); 
    2367                 else 
    2368                         $folders_list = imap_getmailboxes($mbox_stream, $serverString, '*' ); 
     2411                        $folders_list = imap_getmailboxes($mboxStream, $serverString, '*' ); 
    23692412 
    23702413                $folders_list = array_slice($folders_list,0,$this->foldersLimit);  
    23712414 
    2372                 $tmp = array();  
    2373                 $resultMine = array();  
    2374                 $resultSharedMine = array();  
    2375                 $resultDefault = array();  
    2376                 $resultSharedDefault = array();  
    2377                 $aux = ""; 
    2378                 $qtd = -1 ; 
    2379  
    2380                 if (is_array($folders_list)) { 
    2381                         reset($folders_list); 
    2382                         $this->ldap = new ldap_functions(); 
    2383  
    2384                         $i = 0; 
    2385                         while (list($key, $val) = each($folders_list)) { 
    2386                                 $status = imap_status($mbox_stream, $val->name, SA_UNSEEN); 
    2387  
    2388                                 //$tmp_folder_id = explode("}", imap_utf7_decode($val->name)); 
    2389                                 $tmp_folder_id = explode("}", $val->name ); 
    2390  
    2391                                 $folderUser = trim( strpos( $tmp_folder_id[1], $this->imap_delimiter , 5 ) ); 
    2392  
    2393                                 $folderUser = trim( substr( $tmp_folder_id[1], 0, $folderUser ) ); 
    2394  
    2395                                 $Permission = true; 
    2396  
    2397                                 if( $folderUser != "INBOX" && $folderUser != "" ) 
    2398                                 { 
    2399                                         $Permission = @imap_getacl( $mbox_stream, $folderUser ); 
    2400                                 } 
    2401                                 $tmp_folder_id[1] = mb_convert_encoding( $tmp_folder_id[1], "ISO-8859-1", "UTF7-IMAP" ); 
    2402  
    2403                                 if( $tmp_folder_id[1]=='INBOX'.$this->imap_delimiter.'decifradas') 
    2404                                 { 
    2405                                         continue; 
    2406                                 } 
    2407                                  
    2408                                 if(isset($status->unseen)) 
    2409                                         $result[$i]['folder_unseen'] = $status->unseen; 
    2410                                  
    2411                                 $folder_id = $tmp_folder_id[1]; 
    2412                                 $result[$i]['folder_id'] = $folder_id; 
    2413  
    2414                                 $tmp_folder_parent = explode($this->imap_delimiter, $folder_id); 
    2415                                 $result[$i]['folder_name'] = array_pop($tmp_folder_parent); 
    2416                                 $result[$i]['folder_name'] = $result[$i]['folder_name'] == 'INBOX' ? 'Inbox' : $result[$i]['folder_name']; 
     2415                if (!is_array($folders_list)) return false; 
     2416                        if($uid2cn) 
     2417                                $this->ldap = new ldap_functions(); 
     2418                 
     2419                foreach ($folders_list as $i => $v ) //Separando Pastas e informações 
     2420                { 
     2421                        $folderId = substr($v->name,(strpos($v->name , '}') + 1)); 
     2422                        $nameArray = explode($this->imap_delimiter, $folderId); 
     2423                        $nameCount = count($nameArray); 
     2424                        $decifrada = mb_convert_encoding('INBOX'.$this->imap_delimiter.'decifradas','UTF7-IMAP','ISO-8859-1'); //Ignorar esta pasta decifrada 
     2425                        $parent = ($nameCount > 1 && $nameArray[($nameCount - 2)] !== 'INBOX') ? implode($this->imap_delimiter, array_slice($nameArray, 0, ($nameCount - 1))): ''; //Pega folder pai 
     2426                        if($nameArray[0] === 'user') 
     2427                                $folders[$prefixShared.$this->imap_delimiter.$nameArray[1]][] = array('id' => $folderId , 'stream' => $v->name , 'attributes' => $v->attributes , 'name' => $nameArray[($nameCount-1)] , 'user' => $nameArray[1] ,'parent' => $parent); 
     2428                        else if( $folderId !== $decifrada) //Escapa pasta decifrada 
     2429                                $folders['INBOX'][] =  array('id' => $folderId , 'stream' => $v->name , 'attributes' => $v->attributes ,'name' => $nameArray[($nameCount-1)] , 'parent' => $parent); 
     2430                } 
     2431                unset($folders_list); //destroy array de objetos desnecessarios 
     2432                foreach($folders as $i => $v) //Ordenando e resgatando novas informações 
     2433                { 
     2434                        $this->orderDefaultFolders($folders[$i] , $i);  //Ordenando Pastas Padrões 
    24172435                         
    2418                                 if ($uid2cn && substr($folder_id,0,4) == 'user') { 
    2419                                         //$this->ldap = new ldap_functions(); 
    2420                                         if ($cn = $this->ldap->uid2cn($result[$i]['folder_name'])) { 
    2421                                                 $result[$i]['folder_name'] = $cn; 
    2422                                         } 
    2423                                 } 
    2424  
    2425                                 $tmp_folder_parent = implode($this->imap_delimiter, $tmp_folder_parent); 
    2426                                 $result[$i]['folder_parent'] = $tmp_folder_parent == 'INBOX' ? '' : $tmp_folder_parent; 
    2427  
    2428                                 if (($val->attributes == 32) && ($result[$i]['folder_name'] != 'Inbox')) 
    2429                                         $result[$i]['folder_hasChildren'] = 1; 
    2430                                 else 
    2431                                         $result[$i]['folder_hasChildren'] = 0; 
    2432                                 $user = explode($this->imap_delimiter , $tmp_folder_id[1]); 
    2433                                 switch ($tmp_folder_id[1]) { 
    2434                                         case $inbox: 
    2435                                         case $drafts: 
    2436                                         case $sent: 
    2437                                         case $spam: 
    2438                                         case $trash: 
    2439                                                 $resultDefault[]=$result[$i]; 
    2440                                                 break; 
    2441                                         case "user". $this->imap_delimiter . $user[1]: 
    2442                                         case "user". $this->imap_delimiter . $user[1] . $this->imap_delimiter . $_SESSION['phpgw_info']['expressomail']['email_server']['imapDefaultDraftsFolder']: 
    2443                                         case "user". $this->imap_delimiter . $user[1] . $this->imap_delimiter . $_SESSION['phpgw_info']['expressomail']['email_server']['imapDefaultSentFolder']: 
    2444                                         case "user". $this->imap_delimiter . $user[1] . $this->imap_delimiter . $_SESSION['phpgw_info']['expressomail']['email_server']['imapDefaultSpamFolder']: 
    2445                                         case "user". $this->imap_delimiter . $user[1] . $this->imap_delimiter . $_SESSION['phpgw_info']['expressomail']['email_server']['imapDefaultTrashFolder']: 
    2446                                                 if($aux != $user[1]){ 
    2447                                                         $aux = $user[1]; 
    2448                                                         $qtd += 1; 
    2449                                                 } 
    2450                                                 if( isset($resultSharedDefault[$qtd]) && !is_array($resultSharedDefault[$qtd])) 
    2451                                                         $resultSharedDefault[$qtd] = array(); 
    2452                                                 $resultSharedDefault[$qtd][]=$result[$i]; 
    2453                                                 break;   
    2454                                         default: 
    2455                                                 if($user[0] == $inbox) 
    2456                                                         $resultMine[]=$result[$i]; 
    2457                                                 else{ 
    2458                                                         if($aux != $user[1]){ 
    2459                                                                 $aux = $user[1]; 
    2460                                                                 $qtd += 1; 
    2461                                                         } 
    2462                                                         if(!is_array($resultSharedDefault[$qtd])) 
    2463                                                                 $resultSharedMine[$qtd] = array(); 
    2464                                                         $resultSharedMine[$qtd][]=$result[$i]; 
    2465                                                 } 
    2466  
    2467                                 } 
    2468                             $i++; 
    2469                         } 
    2470                 } 
    2471  
    2472                 if ( $params && !array_key_exists('noQuotaInfo',$params) ) { 
    2473                         //Get quota info of current folder 
    2474                         $current_folder = "INBOX"; 
    2475                         if($params && isset($params['folder'])) 
    2476                                 $current_folder = $params['folder']; 
    2477  
    2478                         $arr_quota_info = $this->get_quota(array('folder_id' => $current_folder)); 
    2479                 } else { 
    2480                         $arr_quota_info = array(); 
    2481                 } 
    2482  
    2483                 $result2 = array(); 
    2484                  
    2485                 // Sorting resultMine 
    2486                 if(count($resultMine)){ 
    2487                         foreach ($resultMine as $folder_info) 
     2436                        foreach ($folders[$i] as $ii => $vv) 
    24882437                        { 
    2489                                 $array_tmp[] = $folder_info['folder_id']; 
    2490                         } 
    2491          
    2492                         if(is_array($array_tmp)) 
    2493                         { 
    2494                                 natcasesort($array_tmp); 
    2495                  
    2496                                 foreach ($array_tmp as $key => $folder_id) 
    2497                                 { 
    2498                                         $result2[] = $resultMine[$key]; 
    2499                                 } 
    2500                         } 
    2501                 } 
    2502                 // Sorting resultDefault 
    2503                 $resultDefault2 = array(); 
    2504                  
    2505                 foreach ($resultDefault as $key => $folder_id) 
    2506                 { 
    2507  
    2508                         switch ($resultDefault[$key]['folder_id']) { 
    2509                                 case $inbox:  
    2510                                         $resultDefault2[0] = $resultDefault[$key]; 
    2511                                         break; 
    2512                                 case $drafts:  
    2513                                         $resultDefault2[1] = $resultDefault[$key]; 
    2514                                         break; 
    2515                                 case $sent:  
    2516                                         $resultDefault2[2] = $resultDefault[$key]; 
    2517                                         break; 
    2518                                 case $spam:  
    2519                                         $resultDefault2[3] = $resultDefault[$key]; 
    2520                                         break; 
    2521                                 case $trash:  
    2522                                         $resultDefault2[4] = $resultDefault[$key]; 
    2523                                         break; 
    2524                         } 
    2525                 } 
    2526                 //RE-ORDENA INDICES 
    2527                 ksort($resultDefault2); 
    2528                 $shareds = array(); 
    2529                 if(!empty($resultSharedDefault)) 
    2530                 for($i = array_shift(array_keys($resultSharedDefault)); $i <= $qtd; $i++){                       
    2531                         foreach ($resultSharedDefault[$i] as $key => $folder_id) 
    2532                         { 
    2533                                 $user = explode($this->imap_delimiter , $resultSharedDefault[$i][$key]['folder_id']); 
    2534  
    2535                                 switch ($resultSharedDefault[$i][$key]['folder_id']) { 
    2536                                         case "user". $this->imap_delimiter . $user[1]:  
    2537                                                 $resultSharedDefault2[0] = $resultSharedDefault[$i][$key]; 
    2538                                                 break; 
    2539                                         case "user". $this->imap_delimiter . $user[1]. $this->imap_delimiter . $_SESSION['phpgw_info']['expressomail']['email_server']['imapDefaultDraftsFolder']:   
    2540                                                 $resultSharedDefault2[1] = $resultSharedDefault[$i][$key]; 
    2541                                                 break;   
    2542                                         case "user". $this->imap_delimiter . $user[1]. $this->imap_delimiter . $_SESSION['phpgw_info']['expressomail']['email_server']['imapDefaultSentFolder']:   
    2543                                                 $resultSharedDefault2[2] = $resultSharedDefault[$i][$key]; 
    2544                                                 break; 
    2545                                         case "user". $this->imap_delimiter . $user[1]. $this->imap_delimiter . $_SESSION['phpgw_info']['expressomail']['email_server']['imapDefaultSpamFolder']:   
    2546                                                 $resultSharedDefault2[3] = $resultSharedDefault[$i][$key]; 
    2547                                                 break; 
    2548                                         case "user". $this->imap_delimiter . $user[1] . $this->imap_delimiter . $_SESSION['phpgw_info']['expressomail']['email_server']['imapDefaultTrashFolder']: 
    2549                                                 $resultSharedDefault2[4] = $resultSharedDefault[$i][$key]; 
    2550                                                 break; 
    2551                                 } 
    2552                         } 
    2553                         if($resultDefault2 != null) 
    2554                                 $shareds = array_merge($shareds, $resultSharedDefault2); 
    2555                         if(isset($resultSharedMine[$i]) && $resultSharedMine[$i] != null) 
    2556                                 $shareds = array_merge($shareds, $resultSharedMine[$i]); 
    2557                         $resultSharedDefault2 = array(); 
    2558                 } 
    2559                 if ( $params && isset($params['folderType']) && $params['folderType'] == 'default' ) 
    2560                         return array_merge($resultDefault2, $arr_quota_info); 
    2561  
    2562                 if ( $params && array_key_exists('folderType', $params) && $params['folderType'] == 'personal' ) 
    2563                         return array_merge($result2, $arr_quota_info); 
    2564  
    2565                 // Merge default folders and personal 
    2566                 $result2 = array_merge($resultDefault2, $result2); 
    2567                 if(!empty($shareds)) 
    2568                         $result2 = array_merge($result2, $shareds); 
    2569                 return array_merge($result2, $arr_quota_info); 
    2570         } 
     2438                                $append = array();                               
     2439                                $append['folder_id'] = mb_convert_encoding($vv['id'],'ISO-8859-1','UTF7-IMAP');//DECODIFICA ID DAS PASTAS COM ACENTOS 
     2440                                $append['folder_name'] = (($uid2cn && isset($vv['user'])) && ($cn = $this->ldap->uid2cn($vv['user']))) ? $cn : $vv['name']; 
     2441                                $append['folder_name'] = mb_convert_encoding($append['folder_name'],'ISO-8859-1','UTF7-IMAP');//DECODIFICA NOME DAS PASTAS COM ACENTOS 
     2442                                $status = imap_status($mboxStream, $vv['stream'], SA_UNSEEN); //Resgata Numero de mensagens não lidas 
     2443                                $append['folder_unseen'] = isset($status->unseen) ? $status->unseen : 0 ; 
     2444                                $append['folder_hasChildren'] = (($vv['attributes'] == 32) && ($vv['name'] != 'INBOX')) ? 1 : 0; 
     2445                                $append['folder_parent'] = $vv['parent']; 
     2446                                $return[] = $append; 
     2447                        } 
     2448                } 
     2449                 
     2450                $quotaInfo =  (!isset($params['noQuotaInfo'])) ? $this->get_quota( array('folder_id' => $currentFolder)) : false; //VERIFICA SE O USUARIO TEM COTA 
     2451                 
     2452                return ( ( is_array($quotaInfo) ) ?  array_merge($return, $quotaInfo) : $return );         
     2453        } 
     2454     
    25712455 
    25722456        function create_mailbox($arr) 
Note: See TracChangeset for help on using the changeset viewer.