Overview

Packages

  • IMP

Classes

  • IMP
  • IMP_Ajax_Addresses
  • IMP_Ajax_Application
  • IMP_Ajax_Application_Compose
  • IMP_Ajax_Application_Handler_Common
  • IMP_Ajax_Application_Handler_ComposeAttach
  • IMP_Ajax_Application_Handler_Draft
  • IMP_Ajax_Application_Handler_Dynamic
  • IMP_Ajax_Application_Handler_ImageUnblock
  • IMP_Ajax_Application_Handler_Mboxtoggle
  • IMP_Ajax_Application_Handler_Passphrase
  • IMP_Ajax_Application_Handler_Remote
  • IMP_Ajax_Application_Handler_RemotePrefs
  • IMP_Ajax_Application_Handler_Search
  • IMP_Ajax_Application_Handler_Smartmobile
  • IMP_Ajax_Application_ListMessages
  • IMP_Ajax_Application_ShowMessage
  • IMP_Ajax_Application_Viewport
  • IMP_Ajax_Application_Viewport_Error
  • IMP_Ajax_Imple_ImportEncryptKey
  • IMP_Ajax_Imple_ItipRequest
  • IMP_Ajax_Imple_PassphraseDialog
  • IMP_Ajax_Imple_VcardImport
  • IMP_Ajax_Queue
  • IMP_Api
  • IMP_Application
  • IMP_Auth
  • IMP_Basic_Base
  • IMP_Basic_Compose
  • IMP_Basic_Contacts
  • IMP_Basic_Error
  • IMP_Basic_Folders
  • IMP_Basic_Listinfo
  • IMP_Basic_Mailbox
  • IMP_Basic_Message
  • IMP_Basic_Pgp
  • IMP_Basic_Saveimage
  • IMP_Basic_Search
  • IMP_Basic_Searchbasic
  • IMP_Basic_Smime
  • IMP_Basic_Thread
  • IMP_Block_Newmail
  • IMP_Block_Summary
  • IMP_Compose
  • IMP_Compose_Attachment
  • IMP_Compose_Attachment_Linked_Metadata
  • IMP_Compose_Attachment_Metadata
  • IMP_Compose_Attachment_Storage
  • IMP_Compose_Attachment_Storage_AutoDetermine
  • IMP_Compose_Attachment_Storage_Temp
  • IMP_Compose_Attachment_Storage_VfsLinked
  • IMP_Compose_Exception
  • IMP_Compose_Exception_Address
  • IMP_Compose_HtmlSignature
  • IMP_Compose_Link
  • IMP_Compose_LinkedAttachment
  • IMP_Compose_Ui
  • IMP_Compose_View
  • IMP_Contacts
  • IMP_Contacts_Avatar_Addressbook
  • IMP_Contacts_Avatar_Gravatar
  • IMP_Contacts_Avatar_Unknown
  • IMP_Contacts_Flag_Host
  • IMP_Contacts_Image
  • IMP_Contents
  • IMP_Contents_InlineOutput
  • IMP_Contents_View
  • IMP_Crypt_Pgp
  • IMP_Crypt_Smime
  • IMP_Dynamic_AddressList
  • IMP_Dynamic_Base
  • IMP_Dynamic_Compose
  • IMP_Dynamic_Compose_Common
  • IMP_Dynamic_Helper_Base
  • IMP_Dynamic_Mailbox
  • IMP_Dynamic_Message
  • IMP_Exception
  • IMP_Factory_AuthImap
  • IMP_Factory_Compose
  • IMP_Factory_ComposeAtc
  • IMP_Factory_Contacts
  • IMP_Factory_Contents
  • IMP_Factory_Flags
  • IMP_Factory_Ftree
  • IMP_Factory_Identity
  • IMP_Factory_Imap
  • IMP_Factory_Mail
  • IMP_Factory_MailAutoconfig
  • IMP_Factory_Mailbox
  • IMP_Factory_MailboxCache
  • IMP_Factory_MailboxList
  • IMP_Factory_Maillog
  • IMP_Factory_MimeViewer
  • IMP_Factory_Pgp
  • IMP_Factory_PrefsSort
  • IMP_Factory_Quota
  • IMP_Factory_Search
  • IMP_Factory_Sentmail
  • IMP_Factory_Smime
  • IMP_Factory_Spam
  • IMP_Filter
  • IMP_Flag_Base
  • IMP_Flag_Imap
  • IMP_Flag_Imap_Answered
  • IMP_Flag_Imap_Deleted
  • IMP_Flag_Imap_Draft
  • IMP_Flag_Imap_Flagged
  • IMP_Flag_Imap_Forwarded
  • IMP_Flag_Imap_Junk
  • IMP_Flag_Imap_NotJunk
  • IMP_Flag_Imap_Seen
  • IMP_Flag_System_Attachment
  • IMP_Flag_System_Encrypted
  • IMP_Flag_System_HighPriority
  • IMP_Flag_System_List
  • IMP_Flag_System_LowPriority
  • IMP_Flag_System_Match_Address
  • IMP_Flag_System_Match_Flag
  • IMP_Flag_System_Match_Header
  • IMP_Flag_System_Personal
  • IMP_Flag_System_Signed
  • IMP_Flag_System_Unseen
  • IMP_Flag_User
  • IMP_Flags
  • IMP_Ftree
  • IMP_Ftree_Account
  • IMP_Ftree_Account_Imap
  • IMP_Ftree_Account_Inboxonly
  • IMP_Ftree_Account_Remote
  • IMP_Ftree_Account_Vfolder
  • IMP_Ftree_Element
  • IMP_Ftree_Eltdiff
  • IMP_Ftree_Iterator
  • IMP_Ftree_Iterator_Ancestors
  • IMP_Ftree_IteratorFilter
  • IMP_Ftree_IteratorFilter_Children
  • IMP_Ftree_IteratorFilter_Containers
  • IMP_Ftree_IteratorFilter_Expanded
  • IMP_Ftree_IteratorFilter_Invisible
  • IMP_Ftree_IteratorFilter_Mailboxes
  • IMP_Ftree_IteratorFilter_Nonimap
  • IMP_Ftree_IteratorFilter_Polled
  • IMP_Ftree_IteratorFilter_Remote
  • IMP_Ftree_IteratorFilter_Special
  • IMP_Ftree_IteratorFilter_Subscribed
  • IMP_Ftree_IteratorFilter_Vfolder
  • IMP_Ftree_Prefs
  • IMP_Ftree_Prefs_Expanded
  • IMP_Ftree_Prefs_Poll
  • IMP_Ftree_Select
  • IMP_Images
  • IMP_Imap
  • IMP_Imap_Acl
  • IMP_Imap_Cache_Wrapper
  • IMP_Imap_Config
  • IMP_Imap_Exception
  • IMP_Imap_Password
  • IMP_Imap_PermanentFlags
  • IMP_Imap_Remote
  • IMP_Indices
  • IMP_Indices_Mailbox
  • IMP_LoginTasks_SystemTask_GarbageCollection
  • IMP_LoginTasks_SystemTask_Upgrade
  • IMP_LoginTasks_SystemTask_UpgradeAuth
  • IMP_LoginTasks_Task_Autocreate
  • IMP_LoginTasks_Task_DeleteAttachmentsMonthly
  • IMP_LoginTasks_Task_DeleteSentmailMonthly
  • IMP_LoginTasks_Task_FilterOnLogin
  • IMP_LoginTasks_Task_PurgeSentmail
  • IMP_LoginTasks_Task_PurgeSpam
  • IMP_LoginTasks_Task_PurgeTrash
  • IMP_LoginTasks_Task_RecoverDraft
  • IMP_LoginTasks_Task_RenameSentmailMonthly
  • IMP_Mailbox
  • IMP_Mailbox_List
  • IMP_Mailbox_List_Pop3
  • IMP_Mailbox_List_Thread
  • IMP_Mailbox_List_Virtual
  • IMP_Mailbox_SessionCache
  • IMP_Mailbox_Ui
  • IMP_Maillog
  • IMP_Maillog_Log_Base
  • IMP_Maillog_Log_Forward
  • IMP_Maillog_Log_Mdn
  • IMP_Maillog_Log_Redirect
  • IMP_Maillog_Log_Reply
  • IMP_Maillog_Log_Replyall
  • IMP_Maillog_Log_Replylist
  • IMP_Maillog_Message
  • IMP_Maillog_Storage_Base
  • IMP_Maillog_Storage_Composite
  • IMP_Maillog_Storage_History
  • IMP_Maillog_Storage_Mdnsent
  • IMP_Maillog_Storage_Null
  • IMP_Mbox_Generate
  • IMP_Mbox_Import
  • IMP_Mbox_Size
  • IMP_Message
  • IMP_Message_Date
  • IMP_Message_Ui
  • IMP_Mime_Headers
  • IMP_Mime_Status
  • IMP_Mime_Status_RenderIssue
  • IMP_Mime_Status_RenderIssue_Display
  • IMP_Mime_Viewer_Alternative
  • IMP_Mime_Viewer_Appledouble
  • IMP_Mime_Viewer_Audio
  • IMP_Mime_Viewer_Enriched
  • IMP_Mime_Viewer_Externalbody
  • IMP_Mime_Viewer_Html
  • IMP_Mime_Viewer_Images
  • IMP_Mime_Viewer_Itip
  • IMP_Mime_Viewer_Mdn
  • IMP_Mime_Viewer_Partial
  • IMP_Mime_Viewer_Pdf
  • IMP_Mime_Viewer_Pgp
  • IMP_Mime_Viewer_Plain
  • IMP_Mime_Viewer_Related
  • IMP_Mime_Viewer_Rfc822
  • IMP_Mime_Viewer_Smil
  • IMP_Mime_Viewer_Smime
  • IMP_Mime_Viewer_Status
  • IMP_Mime_Viewer_Vcard
  • IMP_Mime_Viewer_Video
  • IMP_Mime_Viewer_Zip
  • IMP_Minimal_Base
  • IMP_Minimal_Compose
  • IMP_Minimal_Error
  • IMP_Minimal_Folders
  • IMP_Minimal_Mailbox
  • IMP_Minimal_Message
  • IMP_Minimal_Messagepart
  • IMP_Minimal_Search
  • IMP_Notification_Event_Status
  • IMP_Notification_Handler_Decorator_ImapAlerts
  • IMP_Notification_Handler_Decorator_NewmailNotify
  • IMP_Perms
  • IMP_Prefs_AttribText
  • IMP_Prefs_Identity
  • IMP_Prefs_Sort
  • IMP_Prefs_Sort_FixedDate
  • IMP_Prefs_Sort_None
  • IMP_Prefs_Sort_Sortpref
  • IMP_Prefs_Sort_Sortpref_Locked
  • IMP_Prefs_Special_Acl
  • IMP_Prefs_Special_ComposeTemplates
  • IMP_Prefs_Special_Drafts
  • IMP_Prefs_Special_Encrypt
  • IMP_Prefs_Special_Flag
  • IMP_Prefs_Special_HtmlSignature
  • IMP_Prefs_Special_ImageReplacement
  • IMP_Prefs_Special_InitialPage
  • IMP_Prefs_Special_Mailto
  • IMP_Prefs_Special_NewmailSound
  • IMP_Prefs_Special_PgpPrivateKey
  • IMP_Prefs_Special_PgpPublicKey
  • IMP_Prefs_Special_Remote
  • IMP_Prefs_Special_Searches
  • IMP_Prefs_Special_Sentmail
  • IMP_Prefs_Special_SmimePrivateKey
  • IMP_Prefs_Special_SmimePublicKey
  • IMP_Prefs_Special_Sourceselect
  • IMP_Prefs_Special_Spam
  • IMP_Prefs_Special_SpecialMboxes
  • IMP_Prefs_Special_Trash
  • IMP_Quota
  • IMP_Quota_Hook
  • IMP_Quota_Imap
  • IMP_Quota_Null
  • IMP_Quota_Ui
  • IMP_Remote
  • IMP_Remote_Account
  • IMP_Script_Package_Autocomplete
  • IMP_Script_Package_ComposeBase
  • IMP_Script_Package_DynamicBase
  • IMP_Script_Package_Editor
  • IMP_Script_Package_Imp
  • IMP_Search
  • IMP_Search_Element
  • IMP_Search_Element_Attachment
  • IMP_Search_Element_Autogenerated
  • IMP_Search_Element_Bulk
  • IMP_Search_Element_Contacts
  • IMP_Search_Element_Daterange
  • IMP_Search_Element_Flag
  • IMP_Search_Element_Header
  • IMP_Search_Element_Mailinglist
  • IMP_Search_Element_Or
  • IMP_Search_Element_Personal
  • IMP_Search_Element_Recipient
  • IMP_Search_Element_Size
  • IMP_Search_Element_Text
  • IMP_Search_Element_Within
  • IMP_Search_Filter
  • IMP_Search_Filter_Attachment
  • IMP_Search_Filter_Autogenerated
  • IMP_Search_Filter_Builtin
  • IMP_Search_Filter_Bulk
  • IMP_Search_Filter_Contacts
  • IMP_Search_Filter_Mailinglist
  • IMP_Search_Filter_Personal
  • IMP_Search_IteratorFilter
  • IMP_Search_Query
  • IMP_Search_Ui
  • IMP_Search_Vfolder
  • IMP_Search_Vfolder_Builtin
  • IMP_Search_Vfolder_Vinbox
  • IMP_Search_Vfolder_Vtrash
  • IMP_Sentmail
  • IMP_Sentmail_Mongo
  • IMP_Sentmail_Null
  • IMP_Sentmail_Sql
  • IMP_Smartmobile
  • IMP_Spam
  • IMP_Spam_Email
  • IMP_Spam_Null
  • IMP_Spam_Program
  • IMP_Test
  • IMP_Tree_Flist
  • IMP_Tree_Jquerymobile
  • IMP_Tree_Simplehtml
  • IMP_View_Subinfo

Interfaces

  • IMP_Compose_Attachment_Linked
  • IMP_Contacts_Avatar_Backend
  • IMP_Contacts_Flag_Backend
  • IMP_Spam_Base
  • Overview
  • Package
  • Class
  • Tree
  1: <?php
  2: /**
  3:  * Copyright 2010-2014 Horde LLC (http://www.horde.org/)
  4:  *
  5:  * See the enclosed file COPYING for license information (GPL). If you
  6:  * did not receive this file, see http://www.horde.org/licenses/gpl.
  7:  *
  8:  * @category  Horde
  9:  * @copyright 2010-2014 Horde LLC
 10:  * @license   http://www.horde.org/licenses/gpl GPL
 11:  * @package   IMP
 12:  */
 13: 
 14: /**
 15:  * Defines the AJAX interface for IMP.
 16:  *
 17:  * Global tasks:
 18:  *   - msgload: (string) BUID of a message to load in the background (mailbox
 19:  *              is located in 'mailbox' parameter).
 20:  *   - poll: (string) The list of mailboxes to process (JSON encoded
 21:  *           array; mailboxes are base64url encoded). If an empty array, polls
 22:  *           all mailboxes.
 23:  *
 24:  * Global parameters (in viewport parameter):
 25:  *   - force: (integer) If set, always return viewport information if changed.
 26:  *
 27:  * @author    Michael Slusarz <slusarz@horde.org>
 28:  * @category  Horde
 29:  * @copyright 2010-2014 Horde LLC
 30:  * @license   http://www.horde.org/licenses/gpl GPL
 31:  * @package   IMP
 32:  */
 33: class IMP_Ajax_Application extends Horde_Core_Ajax_Application
 34: {
 35:     /**
 36:      * The IMP_Indices_Mailbox object based on form data.
 37:      *
 38:      * @var IMP_Indices_Mailbox
 39:      */
 40:     public $indices;
 41: 
 42:     /**
 43:      * Queue object.
 44:      *
 45:      * @var IMP_Ajax_Queue
 46:      */
 47:     public $queue;
 48: 
 49:     /**
 50:      */
 51:     protected function _init()
 52:     {
 53:         global $injector, $registry;
 54: 
 55:         $this->queue = $injector->getInstance('IMP_Ajax_Queue');
 56: 
 57:         switch ($registry->getView()) {
 58:         case $registry::VIEW_BASIC:
 59:             $this->addHandler('IMP_Ajax_Application_Handler_Mboxtoggle');
 60:             $this->addHandler('IMP_Ajax_Application_Handler_Passphrase');
 61:             $this->addHandler('IMP_Ajax_Application_Handler_Search');
 62:             if ($injector->getInstance('IMP_Factory_Imap')->create()->access(IMP_Imap::ACCESS_REMOTE)) {
 63:                 $this->addHandler('IMP_Ajax_Application_Handler_RemotePrefs');
 64:             }
 65:             break;
 66: 
 67:         case $registry::VIEW_DYNAMIC:
 68:             $this->addHandler('IMP_Ajax_Application_Handler_Common');
 69:             $this->addHandler('IMP_Ajax_Application_Handler_ComposeAttach');
 70:             $this->addHandler('IMP_Ajax_Application_Handler_Draft');
 71:             $this->addHandler('IMP_Ajax_Application_Handler_Dynamic');
 72:             $this->addHandler('IMP_Ajax_Application_Handler_Mboxtoggle');
 73:             $this->addHandler('IMP_Ajax_Application_Handler_Passphrase');
 74:             $this->addHandler('IMP_Ajax_Application_Handler_Search');
 75:             if ($injector->getInstance('IMP_Factory_Imap')->create()->access(IMP_Imap::ACCESS_REMOTE)) {
 76:                 $this->addHandler('IMP_Ajax_Application_Handler_Remote');
 77:                 $this->addHandler('IMP_Ajax_Application_Handler_RemotePrefs');
 78:             }
 79:             break;
 80: 
 81:         case $registry::VIEW_SMARTMOBILE:
 82:             $this->addHandler('IMP_Ajax_Application_Handler_Common');
 83:             $this->addHandler('IMP_Ajax_Application_Handler_ComposeAttach');
 84:             $this->addHandler('IMP_Ajax_Application_Handler_Draft')->disabled = array(
 85:                 'autoSaveDraft',
 86:                 'saveTemplate'
 87:             );
 88:             $this->addHandler('IMP_Ajax_Application_Handler_Smartmobile');
 89:             break;
 90:         }
 91: 
 92:         $this->addHandler('IMP_Ajax_Application_Handler_ImageUnblock');
 93:         $this->addHandler('Horde_Core_Ajax_Application_Handler_Imple');
 94:         $this->addHandler('Horde_Core_Ajax_Application_Handler_Prefs');
 95: 
 96:         /* Copy 'view' paramter to 'mailbox', because this is what
 97:          * IMP_Indices_Mailbox expects. */
 98:         if (isset($this->_vars->view)) {
 99:             $this->_vars->mailbox = $this->_vars->view;
100:         }
101: 
102:         $this->indices = new IMP_Indices_Mailbox($this->_vars);
103: 
104:         /* Make sure the viewport entry is initialized. */
105:         $vp = isset($this->_vars->viewport)
106:             ? json_decode($this->_vars->viewport)
107:             : new stdClass;
108:         $this->_vars->viewport = new Horde_Support_ObjectStub($vp);
109: 
110:         /* GLOBAL TASKS */
111: 
112:         /* Check for global msgload task. */
113:         if (isset($this->_vars->msgload)) {
114:             $this->queue->message($this->indices->mailbox->fromBuids(array($this->_vars->msgload)), true, true);
115:         }
116: 
117:         /* Check for global poll task. */
118:         if (isset($this->_vars->poll)) {
119:             $poll = json_decode($this->_vars->poll);
120:             $this->queue->poll(
121:                 empty($poll)
122:                     ? $injector->getInstance('IMP_Ftree')->poll->getPollList()
123:                     : IMP_Mailbox::formFrom($poll),
124:                 true
125:             );
126:         }
127:     }
128: 
129:     /**
130:      */
131:     public function send()
132:     {
133:         $this->getTasks();
134:         parent::send();
135:     }
136: 
137:     /**
138:      * Get the list of tasks.
139:      *
140:      * @return array  Task list.
141:      */
142:     public function getTasks()
143:     {
144:         $this->queue->add($this);
145: 
146:         /* Convert viewport to output format. */
147:         $name = 'imp:viewport';
148:         if (isset($this->tasks->$name)) {
149:             $this->tasks->$name = $this->tasks->$name->toObject();
150:         }
151: 
152:         return $this->tasks;
153:     }
154: 
155:     /* Shared code between handlers. */
156: 
157:     /**
158:      * Initialize the objects needed to compose.
159:      *
160:      * @return object  Object with the following properties:
161:      *   - ajax: IMP_Ajax_Application_Compose object
162:      *   - compose: IMP_Compose object
163:      *   - contents: IMP_Contents object
164:      */
165:     public function initCompose()
166:     {
167:         global $injector;
168: 
169:         $ob = new stdClass;
170: 
171:         $ob->compose = $injector->getInstance('IMP_Factory_Compose')->create($this->_vars->imp_compose);
172:         $ob->ajax = new IMP_Ajax_Application_Compose($ob->compose, $this->_vars->type);
173: 
174:         if (!($ob->contents = $ob->compose->getContentsOb()) &&
175:             count($this->indices)) {
176:             $ob->contents = $injector->getInstance('IMP_Factory_Contents')->create($this->indices);
177:         }
178: 
179:         $this->queue->compose($ob->compose);
180: 
181:         return $ob;
182:     }
183: 
184:     /**
185:      * Check the UID validity of the mailbox.
186:      *
187:      * See the list of variables needed for viewPortData().
188:      */
189:     public function checkUidvalidity()
190:     {
191:         try {
192:             $this->indices->mailbox->uidvalid;
193:         } catch (IMP_Exception $e) {
194:             $this->addTask('viewport', $this->viewPortData(true));
195:         }
196:     }
197: 
198:     /**
199:      * Generate the information necessary for a ViewPort request from/to the
200:      * browser.
201:      *
202:      * Variables used (contained in 'viewport' object):
203:      *   - applyfilter
204:      *   - cache
205:      *   - cacheid
206:      *   - delhide
207:      *   - initial
208:      *   - qsearch
209:      *   - qsearchfield
210:      *   - qsearchfilter
211:      *   - qsearchflag
212:      *   - qsearchflagnot
213:      *   - qsearchmbox
214:      *   - rangeslice
215:      *   - sortby
216:      *   - sortdir
217:      *
218:      * @param boolean $change  True if cache information has changed.
219:      *
220:      * @return IMP_Ajax_Application_Viewport  Viewport data object.
221:      */
222:     public function viewPortData($change)
223:     {
224:         $args = array(
225:             'change' => $change,
226:             'mbox' => strval($this->indices->mailbox)
227:         );
228: 
229:         $params = array(
230:             'applyfilter', 'cache', 'cacheid', 'delhide', 'initial', 'qsearch',
231:             'qsearchfield', 'qsearchfilter', 'qsearchflag', 'qsearchflagnot',
232:             'qsearchmbox', 'rangeslice', 'sortby', 'sortdir'
233:         );
234: 
235:         $vp = $this->_vars->viewport;
236: 
237:         foreach ($params as $val) {
238:             $args[$val] = $vp->$val;
239:         }
240: 
241:         if ($vp->search || $args['initial']) {
242:             $args += array(
243:                 'after' => intval($vp->after),
244:                 'before' => intval($vp->before)
245:             );
246:         }
247: 
248:         if ($vp->search) {
249:             $search = json_decode($vp->search);
250:             $args += array(
251:                 'search_buid' => isset($search->buid) ? $search->buid : null,
252:                 'search_unseen' => isset($search->unseen) ? $search->unseen : null
253:             );
254:         } else {
255:             list($slice_start, $slice_end) = explode(':', $vp->slice, 2);
256:             $args += array(
257:                 'slice_start' => intval($slice_start),
258:                 'slice_end' => intval($slice_end)
259:             );
260:         }
261: 
262:         return $GLOBALS['injector']->getInstance('IMP_Ajax_Application_ListMessages')->listMessages($args);
263:     }
264: 
265:     /**
266:      * Determine if the cache information has changed.
267:      *
268:      * Variables used:
269:      *   - cacheid: (string) The browser (ViewPort) cache identifier.
270:      *   - forceUpdate: (integer) If 1, forces an update.
271:      *
272:      * @param boolean $rw  Open mailbox as READ+WRITE?
273:      *
274:      * @return boolean  True if the server state differs from the browser
275:      *                  state.
276:      */
277:     public function changed($rw = null)
278:     {
279:         /* Forced viewport return. */
280:         if ($this->_vars->viewport->force) {
281:             return true;
282:         }
283: 
284:         /* Only update search mailboxes on forced refreshes. */
285:         if ($this->indices->mailbox->search) {
286:             return !empty($this->_vars->forceUpdate);
287:         }
288: 
289:         if (!$this->_vars->viewport->cacheid) {
290:             return false;
291:         }
292: 
293:         /* We know we are going to be dealing with this mailbox, so select it
294:          * on the IMAP server (saves some STATUS calls). */
295:         if (!is_null($rw)) {
296:             try {
297:                 $this->indices->mailbox->imp_imap->openMailbox($this->indices->mailbox, $rw ? Horde_Imap_Client::OPEN_READWRITE : Horde_Imap_Client::OPEN_AUTO);
298:             } catch (IMP_Imap_Exception $e) {
299:                 $e->notify();
300:                 return null;
301:             }
302:         }
303: 
304:         return ($this->indices->mailbox->cacheid_date != $this->_vars->viewport->cacheid);
305:     }
306: 
307:     /**
308:      * Setup environment for compose actions.
309:      *
310:      * Variables used:
311:      *   - bcc: (string) Bcc address to use.
312:      *   - bcc_ac: (string) Bcc address to use (autocompleter JSON data).
313:      *   - cc: (string) Cc address to use.
314:      *   - cc_ac: (string) Cc address to use (autocompleter JSON data).
315:      *   - composeCache: (string) The IMP_Compose cache identifier.
316:      *   - from: (string) From address to use.
317:      *   - from_ac: (string) From address to use (autocompleter JSON data).
318:      *   - identity: (integer) The identity to use
319:      *   - redirect_to: (string) To address to use (for redirect).
320:      *   - redirect_to_ac: (string) To address to use (for redirect)
321:      *                     (autocompleter JSON data).
322:      *   - to: (string) To address to use.
323:      *   - to_ac: (string) To address to use (autocompleter JSON data).
324:      *
325:      * @param string $action  AJAX action.
326:      *
327:      * @return array  An array with the following values:
328:      *   - (object) AJAX base return object (with action and success
329:      *     parameters defined).
330:      *   - (IMP_Compose) The IMP_Compose object for the message.
331:      *   - (array) The list of headers for the object.
332:      *   - (Horde_Prefs_Identity) The identity used for the composition.
333:      *
334:      * @throws Horde_Exception
335:      */
336:     public function composeSetup($action)
337:     {
338:         global $injector, $prefs;
339: 
340:         /* Set up identity. */
341:         $identity = $injector->getInstance('IMP_Identity');
342:         if (isset($this->_vars->identity) &&
343:             !$prefs->isLocked('default_identity')) {
344:             $identity->setDefault($this->_vars->identity);
345:         }
346: 
347:         $addr = $this->getAddrFields();
348: 
349:         $headers = array(
350:             /* Set up the From address based on the identity. */
351:             'from' => strval($identity->getFromLine(null, $this->_vars->from)),
352:             'to' => implode(',', $addr['to']['addr']),
353:             'cc' => implode(',', $addr['cc']['addr']),
354:             'bcc' => implode(',', $addr['bcc']['addr']),
355:             'redirect_to' => implode(',', $addr['redirect_to']['addr']),
356:             'subject' => $this->_vars->subject
357:         );
358: 
359:         $imp_compose = $injector->getInstance('IMP_Factory_Compose')->create($this->_vars->composeCache);
360: 
361:         $result = new stdClass;
362:         $result->action = $action;
363:         $result->success = 1;
364: 
365:         return array($result, $imp_compose, $headers, $identity);
366:     }
367: 
368:     /**
369:      * Return address field data from the browser form.
370:      *
371:      * @return array  Keys are header names, values are arrays with two keys:
372:      *   - addr: (array) List of addresses.
373:      *   - map: (boolean) If true, addr keys are autocomplete IDs.
374:      */
375:     public function getAddrFields()
376:     {
377:         $out = array();
378: 
379:         foreach (array('to', 'cc', 'bcc', 'redirect_to') as $val) {
380:             $data = $this->_vars->get($val);
381:             $data_ac = $this->_vars->get($val . '_ac');
382:             $tmp = array(
383:                 'addr' => array(),
384:                 'map' => false
385:             );
386: 
387:             if (strlen($data)) {
388:                 if (strlen($data_ac)) {
389:                     $tmp['map'] = true;
390:                     foreach (json_decode($data_ac, true) as $val2) {
391:                         $tmp['addr'][$val2[1]] = $val2[0];
392:                     }
393:                 } else {
394:                     $tmp['addr'][] = $data;
395:                 }
396:             }
397: 
398:             $out[$val] = $tmp;
399:         }
400: 
401:         return $out;
402:     }
403: 
404:     /**
405:      * Processes delete message requests.
406:      * See the list of variables needed for viewPortData().
407:      *
408:      * @param IMP_Indices $indices  An indices object.
409:      * @param boolean $changed      If true, add full ViewPort information.
410:      * @param boolean $force        If true, forces addition of disappear
411:      *                              information.
412:      */
413:     public function deleteMsgs(IMP_Indices $indices, $changed, $force = false)
414:     {
415:         /* Check if we need to update thread information. */
416:         if (!$changed) {
417:             $changed = ($this->indices->mailbox->getSort()->sortby == Horde_Imap_Client::SORT_THREAD);
418:         }
419: 
420:         if ($changed) {
421:             $this->addTask('viewport', $this->viewPortData(true));
422:         } elseif (($indices instanceof IMP_Indices_Mailbox) &&
423:                   ($force || $this->indices->mailbox->hideDeletedMsgs(true))) {
424:             $vp = new IMP_Ajax_Application_Viewport($this->indices->mailbox);
425:             $vp->disappear = $indices->buids[strval($this->indices->mailbox)];
426:             $this->addTask('viewport', $vp);
427:         }
428: 
429:         $this->queue->poll(array_keys($indices->indices()));
430:     }
431: 
432: }
433: 
API documentation generated by ApiGen