/** * Generates AJAX response task data from the queue. * * For compose autocomplete address error data (key: 'compose-addr'), an * array with keys as the autocomplete DOM element and the values as * arrays. The value arrays have keys as the autocomplete address ID, and * the value is a space-separated list of classnames to add. * * For compose attachment data (key: 'compose-atc'), an array of objects * with these properties: * - icon: (string) Data url string containing icon information. * - name: (string) The attachment name * - num: (integer) The current attachment number * - size: (string) The size of the attachment * - type: (string) The MIME type of the attachment * - view: (boolean) Link to attachment preivew page * * For compose cacheid data (key: 'compose'), an object with these * properties: * - atclimit: (integer) If set, no further attachments are allowed. * - cacheid: (string) Current cache ID of the compose message. * * For flag data (key: 'flag'), an array of objects with these properties: * - add: (array) The list of flags that were added. * - buids: (string) Indices of the messages that have changed (IMAP * sequence string; mboxes are base64url encoded). * - remove: (array) The list of flags that were removed. * - replace: (array) Replace the flag list with these flags. * * For flag configuration data (key: 'flag-config'), an array containing * flag data. All flags returned in dynamic mode; only flags labeled below * as [sm] are returned in smartmobile mode: * - a: (boolean) Indicates a flag that can be *a*ltered. * - b: (string) Background color [sm]. * - c: (string) CSS class. * - f: (string) Foreground color [sm]. * - i: (string) CSS icon [sm]. * - id: (string) Flag ID (IMAP flag id). * - l: (string) Flag label [sm]. * - s: (boolean) Indicates a flag that can be *s*earched for [sm]. * - u: (boolean) Indicates a *u*ser flag. * * For mailbox data (key: 'mailbox'), an array with these keys: * - a: (array) Mailboxes that were added (base64url encoded). * - all: (integer) TODO * - base: (string) TODO * - c: (array) Mailboxes that were changed (base64url encoded). * - d: (array) Mailboxes that were deleted (base64url encoded). * - expand: (integer) Expand subfolders on load. * - switch: (string) Load this mailbox (base64url encoded). * * For maillog data (key: 'maillog'), an object with these properties: * - buid: (integer) BUID. * - log: (array) List of log entries. * - mbox: (string) Mailbox. * * For message preview data (key: 'message'), an object with these * properties: * - buid: (integer) BUID. * - data: (object) Message viewport data. * - mbox: (string) Mailbox. * * For poll data (key: 'poll'), an array with keys as base64url encoded * mailbox names, values as the number of unseen messages. * * For quota data (key: 'quota'), an array with these keys: * - m: (string) Quota message. * - p: (integer) Quota percentage. * * @param IMP_Ajax_Application $ajax The AJAX object. */ public function add(IMP_Ajax_Application $ajax) { global $injector; /* Add autocomplete address error information. */ if (!empty($this->_addr)) { $ajax->addTask('compose-addr', $this->_addr); $this->_addr = array(); } /* Add compose attachment information. */ if (!empty($this->_atc)) { $ajax->addTask('compose-atc', $this->_atc); $this->_atc = array(); } /* Add compose information. */ if (!is_null($this->_compose)) { $compose = new stdClass(); if (!$this->_compose->additionalAttachmentsAllowed()) { $compose->atclimit = 1; } $compose->cacheid = $this->_compose->getCacheId(); $compose->hmac = $this->_compose->getHmac(); $ajax->addTask('compose', $compose); $this->_compose = null; } /* Add flag information. */ if (!empty($this->_flag)) { $ajax->addTask('flag', array_unique($this->_flag, SORT_REGULAR)); $this->_flag = array(); } /* Add flag configuration. */ switch ($this->_flagconfig) { case Horde_Registry::VIEW_DYNAMIC: case Horde_Registry::VIEW_SMARTMOBILE: $flags = array(); foreach ($injector->getInstance('IMP_Flags')->getList() as $val) { $tmp = array('b' => $val->bgdefault ? null : $val->bgcolor, 'f' => $val->fgcolor, 'id' => $val->id, 'l' => $val->label, 's' => intval($val instanceof IMP_Flag_Imap)); if ($this->_flagconfig === Horde_Registry::VIEW_DYNAMIC) { $tmp += array('a' => $val->canset, 'c' => $val->css, 'i' => $val->css ? null : $val->cssicon, 'u' => intval($val instanceof IMP_Flag_User)); } $flags[] = array_filter($tmp); } $ajax->addTask('flag-config', $flags); break; } /* Add folder tree information. */ $this->_addFtreeInfo($ajax); /* Add maillog information. */ $this->_addMaillogInfo($ajax); /* Add message information. */ if (!empty($this->_messages)) { $ajax->addTask('message', $this->_messages); $this->_messages = array(); } /* Add poll information. */ $poll = $poll_list = array(); if (!empty($this->_poll)) { foreach ($this->_poll as $val) { $poll_list[strval($val)] = 1; } } if (count($poll_list)) { $imap_ob = $injector->getInstance('IMP_Factory_Imap')->create(); if ($imap_ob->init) { try { foreach ($imap_ob->status(array_keys($poll_list), Horde_Imap_Client::STATUS_UNSEEN) as $key => $val) { $poll[IMP_Mailbox::formTo($key)] = intval($val['unseen']); } } catch (Exception $e) { // Ignore errors in status() calls. } } if (!empty($poll)) { $ajax->addTask('poll', $poll); $this->_poll = array(); } } /* Add quota information. */ if ($this->_quota && ($quotadata = $injector->getInstance('IMP_Quota_Ui')->quota($this->_quota[0], $this->_quota[1]))) { $ajax->addTask('quota', array('m' => $quotadata['message'], 'p' => round($quotadata['percent']), 'l' => $quotadata['percent'] >= 90 ? 'alert' : ($quotadata['percent'] >= 75 ? 'warn' : ''))); $this->_quota = false; } }