1: <?php
2: /**
3: * Defines an AJAX variable queue for IMP. These are variables that may be
4: * generated by various IMP code that should be added to the eventual output
5: * to the browser.
6: *
7: * Copyright 2011-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_Ajax_Queue
18: {
19: /**
20: * Flag entries to add to response.
21: *
22: * @var array
23: */
24: protected $_flag = array();
25:
26: /**
27: * Poll mailboxes.
28: *
29: * @var array
30: */
31: protected $_poll = array();
32:
33: /**
34: * Add quota information to response?
35: *
36: * @var boolean
37: */
38: protected $_quota = false;
39:
40: /**
41: * Generates variable data from the queue.
42: *
43: * @return array Queue data.
44: * <pre>
45: * For flag data (key: 'flag'), an array of objects with these properties:
46: * - add: (array) The list of flags that were added.
47: * - remove: (array) The list of flags that were removed.
48: * - uids: (string) Indices of the messages that have changed (IMAP
49: * sequence string; mboxes are base64url encoded).
50: *
51: * For poll data (key: 'poll'), an array with keys as base64url encoded
52: * mailbox names, values as the number of unseen messages.
53: *
54: * For quota data (key: 'quota'), an array with these keys:
55: * - m: (string) Quota message.
56: * - p: (integer) Quota percentage.
57: * </pre>
58: */
59: public function generate()
60: {
61: $res = array();
62:
63: /* Add flag information. */
64: if (!empty($this->_flag)) {
65: $res['flag'] = $this->_flag;
66: $this->_flag = array();
67: }
68:
69: /* Add poll information. */
70: $poll = $poll_list = array();
71: foreach ($this->_poll as $val) {
72: $poll_list[strval($val)] = 1;
73: }
74:
75: $imap_ob = $GLOBALS['injector']->getInstance('IMP_Factory_Imap')->create();
76: if ($imap_ob->ob) {
77: foreach ($imap_ob->statusMultiple(array_keys($poll_list), Horde_Imap_Client::STATUS_UNSEEN) as $key => $val) {
78: $poll[IMP_Mailbox::formTo($key)] = intval($val['unseen']);
79: }
80: }
81:
82: if (!empty($poll)) {
83: $res['poll'] = $poll;
84: $this->_poll = array();
85: }
86:
87: /* Add quota information. */
88: if ($this->_quota &&
89: $GLOBALS['session']->get('imp', 'imap_quota') &&
90: ($quotadata = IMP::quotaData(false))) {
91: $res['quota'] = array(
92: 'm' => $quotadata['message'],
93: 'p' => round($quotadata['percent'])
94: );
95: $this->_quota = false;
96: }
97:
98: return $res;
99: }
100:
101: /**
102: * Add flag entry to response queue.
103: *
104: * @param array $flags List of flags that have changed.
105: * @param boolean $add Were the flags added?
106: * @param IMP_Indices $indices Indices object.
107: */
108: public function flag($flags, $add, $indices)
109: {
110: global $injector;
111:
112: if (!$injector->getInstance('IMP_Factory_Imap')->create()->access(IMP_Imap::ACCESS_FLAGS)) {
113: return;
114: }
115:
116: $changed = $injector->getInstance('IMP_Flags')->changed($flags, $add);
117:
118: $result = new stdClass;
119: if (!empty($changed['add'])) {
120: $result->add = array_map('strval', $changed['add']);
121: }
122: if (!empty($changed['remove'])) {
123: $result->remove = array_map('strval', $changed['remove']);
124: }
125:
126: if (count($indices)) {
127: $result->uids = $indices->formTo();
128: $this->_flag[] = $result;
129: }
130: }
131:
132: /**
133: * Add poll entry to response queue.
134: *
135: * @param mixed $mboxes A mailbox name or list of mailbox names.
136: */
137: public function poll($mboxes)
138: {
139: if (!is_array($mboxes)) {
140: $mboxes = array($mboxes);
141: }
142:
143: foreach (IMP_Mailbox::get($mboxes) as $val) {
144: if ($val->polled) {
145: $this->_poll[] = $val;
146: }
147: }
148: }
149:
150: /**
151: * Add quota entry to response queue.
152: */
153: public function quota()
154: {
155: $this->_quota = true;
156: }
157:
158: }
159: