1: <?php
2: /**
3: * This class contains code related to generating and handling a mailbox
4: * message list. This class will keep track of the current index within
5: * a mailbox.
6: *
7: * Copyright 2010-2012 Horde LLC (http://www.horde.org/)
8: *
9: * See the enclosed file COPYING for license information (GPL). If you
10: * did not receive this file, see http://www.horde.org/licenses/gpl.
11: *
12: * @author Michael Slusarz <slusarz@horde.org>
13: * @category Horde
14: * @license http://www.horde.org/licenses/gpl GPL
15: * @package IMP
16: */
17: class IMP_Mailbox_List_Track extends IMP_Mailbox_List
18: {
19: /**
20: * Check the IMAP cache ID?
21: *
22: * @var boolean
23: */
24: public $checkcache = true;
25:
26: /**
27: * The IMAP cache ID of the mailbox.
28: *
29: * @var string
30: */
31: protected $_cacheid = null;
32:
33: /**
34: * The location in the sorted array we are at.
35: *
36: * @var integer
37: */
38: protected $_index = null;
39:
40: /**
41: * The list of additional variables to serialize.
42: *
43: * @var array
44: */
45: protected $_slist = array('_cacheid', '_index');
46:
47: /**
48: * Returns the current message array index. If the array index has
49: * run off the end of the message array, will return the last index.
50: *
51: * @return integer The message array index.
52: */
53: public function getMessageIndex()
54: {
55: return $this->isValidIndex()
56: ? ($this->_index + 1)
57: : 1;
58: }
59:
60: /**
61: * Checks to see if the current index is valid.
62: *
63: * @return boolean True if index is valid, false if not.
64: */
65: public function isValidIndex()
66: {
67: return !is_null($this->_index);
68: }
69:
70: /**
71: * Returns IMAP mbox/UID information on a message.
72: *
73: * @param integer $offset The offset from the current message.
74: *
75: * @return array Array with the following entries:
76: * <pre>
77: * 'mailbox' - (IMP_Mailbox) The mailbox.
78: * 'uid' - (integer) The message UID.
79: * </pre>
80: */
81: public function getIMAPIndex($offset = 0)
82: {
83: $index = $this->_index + $offset;
84:
85: return isset($this->_sorted[$index])
86: ? array(
87: 'mailbox' => isset($this->_sortedMbox[$index]) ? IMP_Mailbox::get($this->_sortedMbox[$index]) : $this->_mailbox,
88: 'uid' => $this->_sorted[$index]
89: )
90: : array();
91: }
92:
93: /**
94: * Using the preferences and the current mailbox, determines the messages
95: * to view on the current page.
96: */
97: public function buildMailboxPage($page = 0, $start = 0, $opts = array())
98: {
99: $ret = parent::buildMailboxPage($page, $start, $opts);
100:
101: if (!$this->_mailbox->search) {
102: $ret['index'] = $this->_index;
103: }
104:
105: return $ret;
106: }
107:
108: /**
109: * Updates the message array index.
110: *
111: * @param mixed $data If an integer, the number of messages to increase
112: * array index by. If an indices object, sets array
113: * index to the index value. If null, rebuilds the
114: * internal index.
115: */
116: public function setIndex($data)
117: {
118: if ($data instanceof IMP_Indices) {
119: list($mailbox, $uid) = $data->getSingle();
120: $this->_index = $this->getArrayIndex($uid, $mailbox);
121: if (is_null($this->_index)) {
122: $this->_rebuild(true);
123: $this->_index = $this->getArrayIndex($uid, $mailbox);
124: }
125: } elseif (is_null($data)) {
126: $this->_index = null;
127: $this->_rebuild(true);
128: } else {
129: $index = $this->_index += $data;
130: if (isset($this->_sorted[$this->_index])) {
131: $this->_rebuild();
132: } else {
133: $this->_rebuild(true);
134: $this->_index = isset($this->_sorted[$index])
135: ? $index
136: : null;
137: }
138: }
139: }
140:
141: /**
142: */
143: protected function _buildMailbox()
144: {
145: $cacheid = $this->_mailbox->cacheid;
146:
147: /* Check cache ID: will catch changes to the mailbox after coming out
148: * of message view mode. */
149: if (!$this->isBuilt() ||
150: ($this->checkcache && ($this->_cacheid != $cacheid))) {
151: $this->_sorted = null;
152: $this->_cacheid = $cacheid;
153: parent::_buildMailbox();
154: }
155: }
156:
157: /**
158: */
159: protected function _rebuild($force = false)
160: {
161: if ($force ||
162: (!is_null($this->_index) && !$this->getIMAPIndex(1))) {
163: $this->_sorted = null;
164: $this->_buildMailbox();
165: }
166: }
167:
168: /**
169: */
170: public function removeMsgs($indices)
171: {
172: if (parent::removeMsgs($indices)) {
173: /* Update the current array index to its new position in the
174: * message array. */
175: $this->setIndex(0);
176:
177: return true;
178: }
179:
180: return false;
181: }
182:
183: }
184: