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 2005-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 2005-2014 Horde LLC
 10:  * @license   http://www.horde.org/licenses/gpl GPL
 11:  * @package   IMP
 12:  */
 13: 
 14: /**
 15:  * Message viewing action for AJAX application handler.
 16:  *
 17:  * @author    Michael Slusarz <slusarz@horde.org>
 18:  * @category  Horde
 19:  * @copyright 2005-2014 Horde LLC
 20:  * @license   http://www.horde.org/licenses/gpl GPL
 21:  * @package   IMP
 22:  */
 23: class IMP_Ajax_Application_ShowMessage
 24: {
 25:     /**
 26:      * Contents object.
 27:      *
 28:      * @var IMP_Contents
 29:      */
 30:     protected $_contents;
 31: 
 32:     /**
 33:      * Envelope object.
 34:      *
 35:      * @var Horde_Imap_Client_Data_Envelope
 36:      */
 37:     protected $_envelope;
 38: 
 39:     /**
 40:      * Indices object.
 41:      *
 42:      * @var IMP_Indices
 43:      */
 44:     protected $_indices;
 45: 
 46:     /**
 47:      * Don't seen seen flag?
 48:      *
 49:      * @var boolean
 50:      */
 51:     protected $_peek;
 52: 
 53:     /**
 54:      * Constructor.
 55:      *
 56:      * @param IMP_Indices $indices  The index of the message.
 57:      * @param boolean $peek         Don't set seen flag?
 58:      */
 59:     public function __construct(IMP_Indices $indices, $peek = false)
 60:     {
 61:         global $injector;
 62: 
 63:         /* Get envelope/header information. We don't use flags in this
 64:          * view. */
 65:         try {
 66:             list($mbox, $uid) = $indices->getSingle();
 67:             if (!$uid) {
 68:                 throw new Exception();
 69:             }
 70: 
 71:             $query = new Horde_Imap_Client_Fetch_Query();
 72:             $query->envelope();
 73: 
 74:             $imp_imap = $mbox->imp_imap;
 75:             $imp_imap->openMailbox($mbox, Horde_Imap_Client::OPEN_READWRITE);
 76: 
 77:             $ret = $imp_imap->fetch($mbox, $query, array(
 78:                 'ids' => $imp_imap->getIdsOb($uid)
 79:             ));
 80: 
 81:             if (!($ob = $ret->first())) {
 82:                 throw new Exception();
 83:             }
 84: 
 85:             $imp_contents = $injector->getInstance('IMP_Factory_Contents')->create($indices);
 86:         } catch (Exception $e) {
 87:             throw new IMP_Exception(_("Requested message not found."));
 88:         }
 89: 
 90:         $this->_contents = $imp_contents;
 91:         $this->_envelope = $ob->getEnvelope();
 92:         $this->_indices = $indices;
 93:         $this->_peek = $peek;
 94:     }
 95: 
 96:     /**
 97:      * Create the object used to display the message.
 98:      *
 99:      * @param array $args  Configuration parameters:
100:      *   - headers: (array) The headers desired in the returned headers array
101:      *              (only used with non-preview view).
102:      *   - preview: (boolean) Is this the preview view?
103:      *
104:      * @return array  Array with the following keys:
105:      *   - atc_download: The download all link
106:      *   - atc_label: The label to use for Attachments
107:      *   - atc_list: The list (HTML code) of attachments
108:      *   - bcc (FULL): The Bcc addresses
109:      *   - cc: The CC addresses
110:      *   - fulldate (FULL): The full canonical date.
111:      *   - from: The From addresses
112:      *   - headers (FULL): An array of headers (not including basic headers)
113:      *   - js: Javascript code to run on display
114:      *   - list_info (FULL): List information.
115:      *   - localdate (PREVIEW): The date formatted to the user's timezone
116:      *   - md: Metadata
117:      *   - msgtext: The text of the message
118:      *   - onepart: True if message only contains one part.
119:      *   - replyTo (FULL): The Reply-to addresses
120:      *   - save_as: The save link
121:      *   - subject: The subject
122:      *   - subjectlink: The subject with linked URLs/email addresses (defaults
123:      *                  to 'subject')
124:      *   - title (FULL): The title of the page
125:      *   - to: The To addresses
126:      *
127:      * @throws IMP_Exception
128:      */
129:     public function showMessage($args)
130:     {
131:         global $injector, $page_output, $prefs, $registry, $session;
132: 
133:         $preview = !empty($args['preview']);
134:         $result = array();
135: 
136:         $mime_headers = $this->_peek
137:             ? $this->_contents->getHeader()
138:             : $this->_contents->getHeaderAndMarkAsSeen();
139: 
140:         $headers = array();
141:         $imp_ui = $injector->getInstance('IMP_Message_Ui');
142: 
143:         /* Develop the list of Headers to display now. Deal with the 'basic'
144:          * header information first since there are various manipulations
145:          * done to them. */
146:         $basic_headers = $imp_ui->basicHeaders();
147:         if (empty($args['headers'])) {
148:             $args['headers'] = array('from', 'date', 'to', 'cc', 'bcc');
149:         }
150: 
151:         $headers_list = array_intersect_key($basic_headers, array_flip($args['headers']));
152: 
153:         /* Build From/To/Cc/Bcc/Reply-To links. */
154:         foreach (array('from', 'to', 'cc', 'bcc', 'reply-to') as $val) {
155:             if (isset($headers_list[$val]) &&
156:                 (!$preview || ($val != 'reply-to'))) {
157:                 if ($tmp = $this->getAddressHeader($val)) {
158:                     $result[$val] = $tmp;
159:                 }
160:                 if ($preview) {
161:                     unset($headers_list[$val]);
162:                 }
163:             }
164:         }
165: 
166:         /* Build the rest of the headers. */
167:         foreach ($headers_list as $head => $str) {
168:             if ($val = $mime_headers->getValue($head)) {
169:                 if ($head == 'date') {
170:                     /* Add local time to date header. */
171:                     $date_ob = new IMP_Message_Date($this->_envelope->date);
172:                     $val = htmlspecialchars($date_ob->format($date_ob::DATE_LOCAL));
173:                     if ($preview) {
174:                         $result['localdate'] = $val;
175:                     } else {
176:                         $result['fulldate'] = $date_ob->format($date_ob::DATE_FORCE);
177:                     }
178:                 } elseif (!$preview) {
179:                     $val = htmlspecialchars($val);
180:                 }
181: 
182:                 if (!$preview) {
183:                     $headers[$head] = array(
184:                         'id' => Horde_String::ucfirst($head),
185:                         'name' => $str,
186:                         'value' => $val
187:                     );
188:                 }
189:             }
190:         }
191: 
192:         if (empty($result['reply-to']) ||
193:             ($result['from']['addr'][0]->b == $result['reply-to']['addr'][0]->b)) {
194:             unset($result['reply-to'], $headers['reply-to']);
195:         }
196: 
197:         /* JS requires camelized name for reply-to. */
198:         if (!$preview && isset($headers['reply-to'])) {
199:             $result['replyTo'] = $result['reply-to'];
200:             $headers['reply-to']['id'] = 'ReplyTo';
201:             unset($result['reply-to']);
202:         }
203: 
204:         /* Maillog information. */
205:         $ajax_queue = $injector->getInstance('IMP_Ajax_Queue');
206:         $ajax_queue->maillog($this->_indices);
207: 
208:         if (!$preview) {
209:             /* Display the user-specified headers for the current identity. */
210:             $user_hdrs = $imp_ui->getUserHeaders();
211:             foreach ($user_hdrs as $user_hdr) {
212:                 $user_val = $mime_headers->getValue($user_hdr);
213:                 if (!empty($user_val)) {
214:                     if (!is_array($user_val)) {
215:                         $user_val = array($user_val);
216:                     }
217:                     foreach ($user_val as $val) {
218:                         $headers[] = array(
219:                             'name' => $user_hdr,
220:                             'value' => htmlspecialchars($val)
221:                         );
222:                     }
223:                 }
224:             }
225:             $result['headers'] = array_values($headers);
226:         }
227: 
228:         /* Process the subject. */
229:         $subject = $mime_headers->getValue('subject');
230:         if ($subject) {
231:             $text_filter = $injector->getInstance('Horde_Core_Factory_TextFilter');
232:             $filtered_subject = preg_replace("/\b\s+\b/", ' ', IMP::filterText($subject));
233: 
234:             $result['subject'] = $text_filter->filter($filtered_subject, 'text2html', array(
235:                 'parselevel' => Horde_Text_Filter_Text2html::NOHTML
236:             ));
237:             $subjectlink = $text_filter->filter($filtered_subject, 'text2html', array(
238:                 'parselevel' => Horde_Text_Filter_Text2html::MICRO
239:             ));
240: 
241:             if ($subjectlink != $result['subject']) {
242:                 $result['subjectlink'] = $subjectlink;
243:             }
244:             if (!$preview) {
245:                 $result['title'] = $subject;
246:             }
247:         } else {
248:             $result['subject'] = _("[No Subject]");
249:             if (!$preview) {
250:                 $result['title'] = _("[No Subject]");
251:             }
252:         }
253: 
254:         // Create message text and attachment list.
255:         $result['msgtext'] = '';
256:         $show_parts = $prefs->getValue('parts_display');
257: 
258:         switch ($registry->getView()) {
259:         case $registry::VIEW_SMARTMOBILE:
260:             $contents_mask = 0;
261:             break;
262: 
263:         default:
264:             $contents_mask = IMP_Contents::SUMMARY_BYTES |
265:                 IMP_Contents::SUMMARY_SIZE |
266:                 IMP_Contents::SUMMARY_ICON |
267:                 IMP_Contents::SUMMARY_DESCRIP_LINK |
268:                 IMP_Contents::SUMMARY_DOWNLOAD |
269:                 IMP_Contents::SUMMARY_DOWNLOAD_ZIP |
270:                 IMP_Contents::SUMMARY_PRINT_STUB;
271:             break;
272:         }
273: 
274:         $part_info = $part_info_display = array('icon', 'description', 'size', 'download', 'download_zip');
275:         $part_info_display[] = 'print';
276: 
277:         list($mbox, $uid) = $this->_indices->getSingle();
278: 
279:         /* Do MDN processing now. */
280:         switch ($registry->getView()) {
281:         case $registry::VIEW_DYNAMIC:
282:             if ($imp_ui->MDNCheck(new IMP_Indices($mbox, $uid), $mime_headers)) {
283:                 $status = new IMP_Mime_Status(array(
284:                     _("The sender of this message is requesting notification from you when you have read this message."),
285:                     sprintf(_("Click %s to send the notification message."), Horde::link('#', '', '', '', '', '', '', array('id' => 'send_mdn_link')) . _("HERE") . '</a>')
286:                 ));
287:                 $status->domid('sendMdnMessage');
288:                 $result['msgtext'] .= strval($status);
289:             }
290:         }
291: 
292:         /* Build body text. This needs to be done before we build the
293:          * attachment list. */
294:         $session->close();
295:         $inline_ob = new IMP_Contents_InlineOutput();
296:         $inlineout = $inline_ob->getInlineOutput($this->_contents, array(
297:             'mask' => $contents_mask,
298:             'part_info_display' => $part_info_display,
299:             'show_parts' => $show_parts
300:         ));
301:         $session->start();
302: 
303:         $result['md'] = $inlineout['metadata'];
304:         $result['msgtext'] .= $inlineout['msgtext'];
305:         if ($inlineout['one_part']) {
306:             $result['onepart'] = true;
307:         }
308: 
309:         if (count($inlineout['atc_parts']) ||
310:             (($show_parts == 'all') && count($inlineout['display_ids']) > 2)) {
311:             $result['atc_label'] = ($show_parts == 'all')
312:                 ? _("Parts")
313:                 : sprintf(ngettext("%d Attachment", "%d Attachments", count($inlineout['atc_parts'])), count($inlineout['atc_parts']));
314:             if (count($inlineout['atc_parts']) > 2) {
315:                 $result['atc_download'] = Horde::link($this->_contents->urlView($this->_contents->getMIMEMessage(), 'download_all')) . '[' . _("Save All") . ']</a>';
316:             }
317:         }
318: 
319:         /* Show attachment information in headers? */
320:         if (!empty($inlineout['atc_parts'])) {
321:             $partlist = array();
322: 
323:             if ($show_parts == 'all') {
324:                 array_unshift($part_info, 'id');
325:             }
326: 
327:             foreach ($inlineout['atc_parts'] as $id) {
328:                 $contents_mask |= IMP_Contents::SUMMARY_DESCRIP |
329:                     IMP_Contents::SUMMARY_DOWNLOAD |
330:                     IMP_Contents::SUMMARY_ICON |
331:                     IMP_Contents::SUMMARY_SIZE;
332:                 $part_info[] = 'description_raw';
333:                 $part_info[] = 'download_url';
334: 
335:                 $summary = $this->_contents->getSummary($id, $contents_mask);
336:                 $tmp = array();
337:                 foreach ($part_info as $val) {
338:                     if (isset($summary[$val])) {
339:                         $tmp[$val] = ($summary[$val] instanceof Horde_Url)
340:                             ? strval($summary[$val]->setRaw(true))
341:                             : $summary[$val];
342:                     }
343:                 }
344:                 $partlist[] = array_filter($tmp);
345:             }
346: 
347:             $result['atc_list'] = $partlist;
348:         }
349: 
350:         $result['save_as'] = IMP_Contents_View::downloadUrl(
351:             htmlspecialchars_decode($result['subject']),
352:             array_merge(
353:                 array('actionID' => 'save_message'),
354:                 $mbox->urlParams($uid)
355:             )
356:         );
357: 
358:         if ($preview) {
359:             /* Need to grab cached inline scripts. */
360:             Horde::startBuffer();
361:             $page_output->outputInlineScript(true);
362:             if ($js_inline = Horde::endBuffer()) {
363:                 $result['js'] = array($js_inline);
364:             }
365: 
366:             $result['save_as'] = strval($result['save_as']->setRaw(true));
367:         } else {
368:             $list_info = $imp_ui->getListInformation($mime_headers);
369:             if (!empty($list_info['exists'])) {
370:                 $result['list_info'] = $list_info;
371:             }
372:         }
373: 
374:         /* Add changed flag information. */
375:         if (!$this->_peek && $mbox->is_imap) {
376:             $status = $mbox->imp_imap->status($mbox, Horde_Imap_Client::STATUS_PERMFLAGS);
377:             if (in_array(Horde_Imap_Client::FLAG_SEEN, $status['permflags'])) {
378:                 $ajax_queue->flag(array(Horde_Imap_Client::FLAG_SEEN), true, $this->_indices);
379:             }
380:         }
381: 
382:         return array_filter($result);
383:     }
384: 
385:     /**
386:      * Return data to build an address header.
387:      *
388:      * @param string $header  The address header.
389:      * @param integer $limit  Limit display to this many addresses. If null,
390:      *                        shows all addresses.
391:      *
392:      * @return array  An array with the following entries:
393:      *   - addr: (array) List of addresses/groups.
394:      *           Group keys: 'a' (list of addresses); 'g' (group name)
395:      *           Address keys: 'b' (bare address); 'p' (personal part)
396:      *   - limit: (integer) If limit was reached, the number of total
397:      *            addresses.
398:      *   - raw: (string) A raw string to display instead of addresses.
399:      */
400:     public function getAddressHeader($header, $limit = 50)
401:     {
402:         $addrlist = ($header == 'reply-to')
403:             ? $this->_envelope->reply_to
404:             : $this->_envelope->$header;
405:         $addrlist->unique();
406: 
407:         $addr_ob = new IMP_Ajax_Addresses($addrlist);
408:         $addr_array = $addr_ob->toArray($limit);
409: 
410:         $out = array();
411:         if ($addr_array->limit) {
412:             $out['limit'] = $addr_array->total;
413:         }
414: 
415:         if (!empty($addr_array->addr)) {
416:             $out['addr'] = $addr_array->addr;
417:         } elseif ($header == 'to') {
418:             $out['raw'] = _("Undisclosed Recipients");
419:         }
420: 
421:         return $out;
422:     }
423: 
424: }
425: 
API documentation generated by ApiGen