1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181
|
<?php
/**
* tree.php
*
* This file provides functions to walk trees of folders, for
* instance to delete a whole tree.
*
* @copyright 1999-2012 The SquirrelMail Project Team
* @license http://opensource.org/licenses/gpl-license.php GNU Public License
* @version $Id: tree.php 14248 2012-01-02 00:18:17Z pdontthink $
* @package squirrelmail
*/
/** Clearly, this needs the IMAP functions.. */
require_once(SM_PATH . 'functions/imap.php');
/**
* 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']) {
// 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;
}
// if we aren't a child of one of the subNodes, must be a child of current node
return $treeIndexToStart;
} else
return $treeIndexToStart;
} 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);
// 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;
}
}
/**
* 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;
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) {
sqimap_mailbox_delete($imap_stream, $tree[$index]['value']);
} else {
$mbx_response = sqimap_mailbox_select($imap_stream, $trash_folder);
if ($mbx_response['EXISTS'] > 0) {
sqimap_messages_flag ($imap_stream, 1, '*', 'Deleted', true);
// CLOSE === EXPUNGE and UNSELECT
sqimap_run_command($imap_stream,'CLOSE',false,$response,$message);
}
}
} else {
if ($tree[$index]['value'] != $trash_folder) {
sqimap_mailbox_delete($imap_stream, $tree[$index]['value']);
} else {
$mbx_response = sqimap_mailbox_select($imap_stream, $trash_folder);
if ($mbx_response['EXISTS'] > 0) {
sqimap_messages_flag ($imap_stream, 1, '*', 'Deleted', true);
// CLOSE === EXPUNGE and UNSELECT
sqimap_run_command($imap_stream,'CLOSE',false,$response,$message);
}
}
}
}
/**
* 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']);
}
}
/**
* 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);
if ($position !== FALSE) {
$position++;
}
$subFolderName = substr($tree[$index]['value'], $position);
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) {
sqimap_msgs_list_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, '');
$mbx_response = sqimap_mailbox_select($imap_stream, $tree[$index]['value']);
$messageCount = $mbx_response['EXISTS'];
if ($messageCount > 0) {
sqimap_msgs_list_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);
}
}
/**
* 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'] . '<br />';
} else {
echo $tree[$index]['value'] . '<br />';
}
}
|