X-Git-Url: https://vcs.fsf.org/?a=blobdiff_plain;f=functions%2Ftree.php;h=44a99e848329b3ad073f30c2ec2cc6fa136d804f;hb=10bf80c009d938fc0cf85a70d0a6b3834365b146;hp=5d9657943c8db0cc2e1955194da26d71f56ae00c;hpb=15e6162eacc97158393bc75aed3afeb7b19c24a6;p=squirrelmail.git diff --git a/functions/tree.php b/functions/tree.php index 5d965794..44a99e84 100644 --- a/functions/tree.php +++ b/functions/tree.php @@ -3,154 +3,196 @@ /** * tree.php * - * Copyright (c) 1999-2002 The SquirrelMail Project Team - * Licensed under the GNU GPL. For full terms see the file COPYING. + * This file provides functions to walk trees of folders, for + * instance to delete a whole tree. * - * This code provides various string manipulation functions that are - * used by the rest of the Squirrelmail code. - * - * $Id$ + * @copyright © 1999-2005 The SquirrelMail Project Team + * @license http://opensource.org/licenses/gpl-license.php GNU Public License + * @version $Id$ + * @package squirrelmail */ -/*****************************************************************/ -/*** THIS FILE NEEDS TO HAVE ITS FORMATTING FIXED!!! ***/ -/*** PLEASE DO SO AND REMOVE THIS COMMENT SECTION. ***/ -/*** + Base level indent should begin at left margin, as ***/ -/*** the require_once below. ***/ -/*** + All identation should consist of four space blocks ***/ -/*** + Tab characters are evil. ***/ -/*** + all comments should use "slash-star ... star-slash" ***/ -/*** style -- no pound characters, no slash-slash style ***/ -/*** + FLOW CONTROL STATEMENTS (if, while, etc) SHOULD ***/ -/*** ALWAYS USE { AND } CHARACTERS!!! ***/ -/*** + Please use ' instead of ", when possible. Note " ***/ -/*** should always be used in _( ) function calls. ***/ -/*** Thank you for your help making the SM code more readable. ***/ -/*****************************************************************/ - -require_once('../functions/imap.php'); +/** Clearly, this needs the IMAP functions.. */ +require_once(SM_PATH . 'functions/imap.php'); /** - * findParentForChild + * Recursive function to find the correct parent for a new node. * - * Recursive function to find the correct parent for a new node + * @param mixed value the value to find a parent for + * @param int treeIndexToStart where to start the search, usually the root node (0) + * @param array tree the tree to search + * @return int the index of the parent */ - - function findParentForChild($value, $treeIndexToStart, $tree) { - // is $value in $tree[$treeIndexToStart]['value'] - if ((isset($tree[$treeIndexToStart])) && (strstr($value, $tree[$treeIndexToStart]['value']))) { - // do I have children, if not then must be a childnode of the current node - if ($tree[$treeIndexToStart]['doIHaveChildren']) { +function findParentForChild($value, $treeIndexToStart, $tree) { + // is $value in $tree[$treeIndexToStart]['value'] + if ((isset($tree[$treeIndexToStart])) && (strstr($value, $tree[$treeIndexToStart]['value']))) { + // do I have children, if not then must be a childnode of the current node + if ($tree[$treeIndexToStart]['doIHaveChildren']) { // loop through each subNode checking to see if we are a subNode of one of them for ($i=0;$i< count($tree[$treeIndexToStart]['subNodes']);$i++) { - $result = findParentForChild($value, $tree[$treeIndexToStart]['subNodes'][$i], $tree); - if ($result > -1) - return $result; + $result = findParentForChild($value, $tree[$treeIndexToStart]['subNodes'][$i], $tree); + if ($result > -1) + return $result; } // if we aren't a child of one of the subNodes, must be a child of current node return $treeIndexToStart; - } else + } else return $treeIndexToStart; - } else { - // we aren't a child of this node at all - return -1; - } - } + } else { + // we aren't a child of this node at all + return -1; + } +} + +/** + * Will insert a new value into the tree, based on a given comparison value. + * + * @param mixed comparisonValue the value to determine where the new element should be placed. + * @param mixed value the new node to insert + * @param array tree the tree to insert the node in, by ref + */ +function addChildNodeToTree($comparisonValue, $value, &$tree) { + $parentNode = findParentForChild($comparisonValue, 0, $tree); - function addChildNodeToTree($comparisonValue, $value, &$tree) { - $parentNode = findParentForChild($comparisonValue, 0, $tree); + // create a new subNode + $newNodeIndex = count($tree); + $tree[$newNodeIndex]['value'] = $value; + $tree[$newNodeIndex]['doIHaveChildren'] = false; - // create a new subNode - $newNodeIndex = count($tree); - $tree[$newNodeIndex]['value'] = $value; - $tree[$newNodeIndex]['doIHaveChildren'] = false; + if ($tree[$parentNode]['doIHaveChildren'] == false) { + // make sure the parent knows it has children + $tree[$parentNode]['subNodes'][0] = $newNodeIndex; + $tree[$parentNode]['doIHaveChildren'] = true; + } else { + $nextSubNode = count($tree[$parentNode]['subNodes']); + // make sure the parent knows it has children + $tree[$parentNode]['subNodes'][$nextSubNode] = $newNodeIndex; + } +} - if ($tree[$parentNode]['doIHaveChildren'] == false) { - // make sure the parent knows it has children - $tree[$parentNode]['subNodes'][0] = $newNodeIndex; - $tree[$parentNode]['doIHaveChildren'] = true; - } else { - $nextSubNode = count($tree[$parentNode]['subNodes']); - // make sure the parent knows it has children - $tree[$parentNode]['subNodes'][$nextSubNode] = $newNodeIndex; - } - } +/** + * Recursively walk the tree of trash mailboxes and delete all folders and messages + * + * @param int index the place in the tree to start, usually 0 + * @param stream imap_stream the IMAP connection to send commands to + * @param array tree the tree to walk + * @return void + */ +function walkTreeInPreOrderEmptyTrash($index, $imap_stream, $tree) { + global $trash_folder; + walkTreeInPreOrderEmptyFolder($index, $imap_stream, $tree, $trash_folder); +} - function walkTreeInPreOrderEmptyTrash($index, $imap_stream, $tree) { - global $trash_folder; - if ($tree[$index]['doIHaveChildren']) { - for ($j = 0; $j < count($tree[$index]['subNodes']); $j++) { +/** + * Recursively walk the tree of mailboxes in the given folder and delete all folders and messages + * + * @param int index the place in the tree to start, usually 0 + * @param stream imap_stream the IMAP connection to send commands to + * @param array tree the tree to walk + * @param mailbox the name of the root folder to empty + * @return void + */ +function walkTreeInPreOrderEmptyFolder($index, $imap_stream, $tree, $mailbox) { + if ($tree[$index]['doIHaveChildren']) { + for ($j = 0; $j < count($tree[$index]['subNodes']); $j++) { walkTreeInPreOrderEmptyTrash($tree[$index]['subNodes'][$j], $imap_stream, $tree); - } - if ($tree[$index]['value'] != $trash_folder) { + } + if ($tree[$index]['value'] != $mailbox) { sqimap_mailbox_delete($imap_stream, $tree[$index]['value']); - } else { - $numMessages = sqimap_get_num_messages($imap_stream, $trash_folder); - if ($numMessages > 0) { - sqimap_mailbox_select($imap_stream, $trash_folder); - sqimap_messages_flag ($imap_stream, 1, $numMessages, 'Deleted'); - sqimap_mailbox_expunge($imap_stream, $trash_folder, true); + } else { + $mbx_response = sqimap_mailbox_select($imap_stream, $mailbox); + if ($mbx_response['EXISTS'] > 0) { + sqimap_toggle_flag($imap_stream, '1:*', '\\Deleted', true, true); + // CLOSE === EXPUNGE and UNSELECT + sqimap_run_command($imap_stream,'CLOSE',false,$response,$message); } - } - } else { - if ($tree[$index]['value'] != $trash_folder) { + } + } else { + if ($tree[$index]['value'] != $mailbox) { sqimap_mailbox_delete($imap_stream, $tree[$index]['value']); - } else { - $numMessages = sqimap_get_num_messages($imap_stream, $trash_folder); - if ($numMessages > 0) { - sqimap_mailbox_select($imap_stream, $trash_folder); - sqimap_messages_flag ($imap_stream, 1, $numMessages, 'Deleted'); - sqimap_mailbox_expunge($imap_stream, $trash_folder, true); + } else { + $mbx_response = sqimap_mailbox_select($imap_stream, $mailbox); + if ($mbx_response['EXISTS'] > 0) { + sqimap_toggle_flag($imap_stream, '1:*', '\\Deleted', true, true); + // CLOSE === EXPUNGE and UNSELECT + sqimap_run_command($imap_stream,'CLOSE',false,$response,$message); } - } - } - } - - function walkTreeInPreOrderDeleteFolders($index, $imap_stream, $tree) { - if ($tree[$index]['doIHaveChildren']) { - for ($j = 0; $j < count($tree[$index]['subNodes']); $j++) { + } + } +} + + +/** + * Recursively delete a tree of mail folders. + * + * @param int index the place in the tree to start, usually 0 + * @param stream imap_stream the IMAP connection to send commands to + * @param array tree the tree to walk + * @return void + */ +function walkTreeInPreOrderDeleteFolders($index, $imap_stream, $tree) { + if ($tree[$index]['doIHaveChildren']) { + for ($j = 0; $j < count($tree[$index]['subNodes']); $j++) { walkTreeInPreOrderDeleteFolders($tree[$index]['subNodes'][$j], $imap_stream, $tree); - } - sqimap_mailbox_delete($imap_stream, $tree[$index]['value']); - } else { - sqimap_mailbox_delete($imap_stream, $tree[$index]['value']); - } - } + } + sqimap_mailbox_delete($imap_stream, $tree[$index]['value']); + } else { + sqimap_mailbox_delete($imap_stream, $tree[$index]['value']); + } +} - function walkTreeInPostOrderCreatingFoldersUnderTrash($index, $imap_stream, $tree, $topFolderName) { - global $trash_folder, $delimiter; +/** + * Recursively walk a tree of folders to create them under the trash folder. + */ +function walkTreeInPostOrderCreatingFoldersUnderTrash($index, $imap_stream, $tree, $topFolderName) { + global $trash_folder, $delimiter; - $position = strrpos($topFolderName, $delimiter) + 1; - $subFolderName = substr($tree[$index]['value'], $position); + $position = strrpos($topFolderName, $delimiter); + if ($position !== FALSE) { + $position++; + } + $subFolderName = substr($tree[$index]['value'], $position); - if ($tree[$index]['doIHaveChildren']) { - sqimap_mailbox_create($imap_stream, $trash_folder . $delimiter . $subFolderName, ""); - sqimap_mailbox_select($imap_stream, $tree[$index]['value']); - - $messageCount = sqimap_get_num_messages($imap_stream, $tree[$index]['value']); - if ($messageCount > 0) - sqimap_messages_copy($imap_stream, 1, $messageCount, $trash_folder . $delimiter . $subFolderName); - - for ($j = 0;$j < count($tree[$index]['subNodes']); $j++) + if ($tree[$index]['doIHaveChildren']) { + sqimap_mailbox_create($imap_stream, $trash_folder . $delimiter . $subFolderName, ""); + $mbx_response = sqimap_mailbox_select($imap_stream, $tree[$index]['value']); + $messageCount = $mbx_response['EXISTS']; + if ($messageCount > 0) { + // FIXME: broken call + sqimap_messages_copy($imap_stream, 1, '*', $trash_folder . $delimiter . $subFolderName); + } + // after copy close the mailbox to get in unselected state + sqimap_run_command($imap_stream,'CLOSE',false,$response,$message); + for ($j = 0;$j < count($tree[$index]['subNodes']); $j++) walkTreeInPostOrderCreatingFoldersUnderTrash($tree[$index]['subNodes'][$j], $imap_stream, $tree, $topFolderName); - } else { - sqimap_mailbox_create($imap_stream, $trash_folder . $delimiter . $subFolderName, ''); - sqimap_mailbox_select($imap_stream, $tree[$index]['value']); - - $messageCount = sqimap_get_num_messages($imap_stream, $tree[$index]['value']); - if ($messageCount > 0) - sqimap_messages_copy($imap_stream, 1, $messageCount, $trash_folder . $delimiter . $subFolderName); - } - } + } else { + sqimap_mailbox_create($imap_stream, $trash_folder . $delimiter . $subFolderName, ''); + $mbx_response = sqimap_mailbox_select($imap_stream, $tree[$index]['value']); + $messageCount = $mbx_response['EXISTS']; + if ($messageCount > 0) { + // FIXME: broken call + sqimap_messages_copy($imap_stream, 1, '*', $trash_folder . $delimiter . $subFolderName); + } + // after copy close the mailbox to get in unselected state + sqimap_run_command($imap_stream,'CLOSE',false,$response,$message); + } +} - function simpleWalkTreePre($index, $tree) { - if ($tree[$index]['doIHaveChildren']) { - for ($j = 0; $j < count($tree[$index]['subNodes']); $j++) { +/** + * Recursive function that outputs a tree In-Pre-Order. + * @param int index the node to start (usually 0) + * @param array tree the tree to walk + * @return void + */ +function simpleWalkTreePre($index, $tree) { + if ($tree[$index]['doIHaveChildren']) { + for ($j = 0; $j < count($tree[$index]['subNodes']); $j++) { simpleWalkTreePre($tree[$index]['subNodes'][$j], $tree); - } - echo $tree[$index]['value'] . '
'; - } else { - echo $tree[$index]['value'] . '
'; - } - } -?> + } + echo $tree[$index]['value'] . '
'; + } else { + echo $tree[$index]['value'] . '
'; + } +} + +?> \ No newline at end of file