From e70a7bcf07097097cfa62aebef27f4180de3b5bd Mon Sep 17 00:00:00 2001 From: Klaus Leithoff Date: Thu, 30 Jan 2014 09:35:56 +0000 Subject: [PATCH] make uploaded/attached files clickable on compose --- mail/inc/class.mail_compose.inc.php | 98 ++++++++++++++++++++ mail/index.php | 4 +- mail/js/app.js | 133 ++++++++++++++++++++++++++-- mail/templates/default/compose.xet | 2 +- 4 files changed, 225 insertions(+), 12 deletions(-) diff --git a/mail/inc/class.mail_compose.inc.php b/mail/inc/class.mail_compose.inc.php index e771b770cd..240e0c3b23 100644 --- a/mail/inc/class.mail_compose.inc.php +++ b/mail/inc/class.mail_compose.inc.php @@ -22,6 +22,7 @@ class mail_compose var $public_functions = array ( 'compose' => True, + 'getAttachment' => True, ); /** @@ -1329,6 +1330,7 @@ class mail_compose case 'composeasnew': case 'composefromdraft': $content = $this->getDraftData($icServer, $folder, $msgUID, $part_id); + $content['processedmail_id'] = $mail_id; $_focusElement = 'body'; $suppressSigOnTop = true; @@ -1717,6 +1719,102 @@ class mail_compose ); } + function getAttachment() + { + if(isset($_GET['filename'])) $attachment['filename'] = $_GET['filename']; + if(isset($_GET['tmpname'])) $attachment['tmp_name'] = $_GET['tmpname']; + if(isset($_GET['name'])) $attachment['name'] = $_GET['name']; + //if(isset($_GET['size'])) $attachment['size'] = $_GET['size']; + if(isset($_GET['type'])) $attachment['type'] = $_GET['type']; + + error_log(__METHOD__.__LINE__.array2string($_GET)); + if (isset($attachment['filename']) && parse_url($attachment['filename'],PHP_URL_SCHEME) == 'vfs') + { + egw_vfs::load_wrapper('vfs'); + } + $attachment['attachment'] = file_get_contents($attachment['tmp_name']); + //error_log(__METHOD__.__LINE__.' FileSize:'.filesize($attachment['tmp_name'])); + if ($_GET['mode'] != "save") + { + if (strtoupper($attachment['type']) == 'TEXT/DIRECTORY') + { + $sfxMimeType = $attachment['type']; + $buff = explode('.',$attachment['filename']); + $suffix = ''; + if (is_array($buff)) $suffix = array_pop($buff); // take the last extension to check with ext2mime + if (!empty($suffix)) $sfxMimeType = mime_magic::ext2mime($suffix); + $attachment['type'] = $sfxMimeType; + if (strtoupper($sfxMimeType) == 'TEXT/VCARD' || strtoupper($sfxMimeType) == 'TEXT/X-VCARD') $attachment['type'] = strtoupper($sfxMimeType); + } + //error_log(__METHOD__.print_r($attachment,true)); + if (strtoupper($attachment['type']) == 'TEXT/CALENDAR' || strtoupper($attachment['type']) == 'TEXT/X-VCALENDAR') + { + //error_log(__METHOD__."about to call calendar_ical"); + $calendar_ical = new calendar_ical(); + $eventid = $calendar_ical->search($attachment['attachment'],-1); + //error_log(__METHOD__.array2string($eventid)); + if (!$eventid) $eventid = -1; + $event = $calendar_ical->importVCal($attachment['attachment'],(is_array($eventid)?$eventid[0]:$eventid),null,true); + //error_log(__METHOD__.$event); + if ((int)$event > 0) + { + $vars = array( + 'menuaction' => 'calendar.calendar_uiforms.edit', + 'cal_id' => $event, + ); + $GLOBALS['egw']->redirect_link('../index.php',$vars); + } + //Import failed, download content anyway + } + if (strtoupper($attachment['type']) == 'TEXT/X-VCARD' || strtoupper($attachment['type']) == 'TEXT/VCARD') + { + $addressbook_vcal = new addressbook_vcal(); + // double \r\r\n seems to end a vcard prematurely, so we set them to \r\n + //error_log(__METHOD__.__LINE__.$attachment['attachment']); + $attachment['attachment'] = str_replace("\r\r\n", "\r\n", $attachment['attachment']); + $vcard = $addressbook_vcal->vcardtoegw($attachment['attachment']); + if ($vcard['uid']) + { + $vcard['uid'] = trim($vcard['uid']); + //error_log(__METHOD__.__LINE__.print_r($vcard,true)); + $contact = $addressbook_vcal->find_contact($vcard,false); + } + if (!$contact) $contact = null; + // if there are not enough fields in the vcard (or the parser was unable to correctly parse the vcard (as of VERSION:3.0 created by MSO)) + if ($contact || count($vcard)>2) + { + $contact = $addressbook_vcal->addVCard($attachment['attachment'],(is_array($contact)?array_shift($contact):$contact),true); + } + if ((int)$contact > 0) + { + $vars = array( + 'menuaction' => 'addressbook.addressbook_ui.edit', + 'contact_id' => $contact, + ); + $GLOBALS['egw']->redirect_link('../index.php',$vars); + } + //Import failed, download content anyway + } + } + header ("Content-Type: ".$attachment['type']."; name=\"". $attachment['filename'] ."\""); + if($_GET['mode'] == "save") { + // ask for download + header ("Content-Disposition: attachment; filename=\"". $attachment['filename'] ."\""); + } else { + // display it + header ("Content-Disposition: inline; filename=\"". $attachment['filename'] ."\""); + } + header("Expires: 0"); + // the next headers are for IE and SSL + header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); + header("Pragma: public"); + + echo $attachment['attachment']; + + $GLOBALS['egw']->common->egw_exit(); + exit; + } + /** * getRandomString - function to be used to fetch a random string and md5 encode that one * @param none diff --git a/mail/index.php b/mail/index.php index 8375d48132..b03a1d7c2b 100644 --- a/mail/index.php +++ b/mail/index.php @@ -4,9 +4,9 @@ * * @link http://www.egroupware.org * @package mail - * @author Klaus Leithoff [kl@stylite.de] + * @author Stylite AG [info@stylite.de] * @version 1.0 - * @copyright (c) 2013 by Klaus Leithoff + * @copyright (c) 2013-2014 by Stylite AG * @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License * @version $Id$ */ diff --git a/mail/js/app.js b/mail/js/app.js index cb29ae2d7b..7480df5d91 100644 --- a/mail/js/app.js +++ b/mail/js/app.js @@ -1413,24 +1413,33 @@ app.classes.mail = AppJS.extend( }, /** - * + * displayAttachment */ - displayAttachment: function(tag_info, widget) + displayAttachment: function(tag_info, widget, calledForCompose) { //console.log(this, arguments, widget); var mailid; var attgrid; - if (this.mail_isMainWindow) + if (typeof calledForCompose == 'undefined') calledForCompose=false; + if (calledForCompose==false) { - mailid = this.mail_currentlyFocussed;//this.et2.getArrayMgr("content").getEntry('mail_id'); - var p = widget.getParent(); - var cont = p.getArrayMgr("content").data; - attgrid = cont[widget.id.replace(/\[filename\]/,'')]; + if (this.mail_isMainWindow) + { + mailid = this.mail_currentlyFocussed;//this.et2.getArrayMgr("content").getEntry('mail_id'); + var p = widget.getParent(); + var cont = p.getArrayMgr("content").data; + attgrid = cont[widget.id.replace(/\[filename\]/,'')]; + } + else + { + mailid = this.et2.getArrayMgr("content").getEntry('mail_id'); + attgrid = this.et2.getArrayMgr("content").getEntry('mail_displayattachments')[widget.id.replace(/\[filename\]/,'')]; + } } else { - mailid = this.et2.getArrayMgr("content").getEntry('mail_id'); - attgrid = this.et2.getArrayMgr("content").getEntry('mail_displayattachments')[widget.id.replace(/\[filename\]/,'')]; + attgrid = this.et2.getArrayMgr("content").getEntry('attachments')[widget.id.replace(/\[name\]/,'')]; + mailid = this.et2.getArrayMgr("content").getEntry('processedmail_id'); } //console.log(mailid,attgrid.partID,attgrid.filename,attgrid.mimetype); var url = window.egw_webserverUrl+'/index.php?'; @@ -1516,6 +1525,112 @@ app.classes.mail = AppJS.extend( egw_openWindowCentered(url,windowName,width,height); }, + /** + * displayUploadedFile + */ + displayUploadedFile: function(tag_info, widget) + { + //console.log(this, tag_info, widget); + var attgrid; + attgrid = this.et2.getArrayMgr("content").getEntry('attachments')[widget.id.replace(/\[name\]/,'')]; + //console.log(attgrid); + if (attgrid.uid && attgrid.partID) + { + this.displayAttachment(tag_info, widget, true); + return; + } + var url = window.egw_webserverUrl+'/index.php?'; + var width; + var height; + var windowName ='mail'; + switch(attgrid.type.toUpperCase()) + { + case 'IMAGE/JPEG': + case 'IMAGE/PNG': + case 'IMAGE/GIF': + case 'IMAGE/BMP': + case 'APPLICATION/PDF': + case 'TEXT/PLAIN': + case 'TEXT/HTML': + case 'TEXT/DIRECTORY': +/* + $sfxMimeType = $value['mimeType']; + $buff = explode('.',$value['name']); + $suffix = ''; + if (is_array($buff)) $suffix = array_pop($buff); // take the last extension to check with ext2mime + if (!empty($suffix)) $sfxMimeType = mime_magic::ext2mime($suffix); + if (strtoupper($sfxMimeType) == 'TEXT/VCARD' || strtoupper($sfxMimeType) == 'TEXT/X-VCARD') + { + $attachments[$key]['mimeType'] = $sfxMimeType; + $value['mimeType'] = strtoupper($sfxMimeType); + } +*/ + case 'TEXT/X-VCARD': + case 'TEXT/VCARD': + case 'TEXT/CALENDAR': + case 'TEXT/X-VCALENDAR': + url += 'menuaction=mail.mail_compose.getAttachment'; // todo compose for Draft folder + url += '&filename='+attgrid.file; + url += '&tmpname='+attgrid.tmp_name; + url += '&name='+attgrid.name; + //url += '&size='+attgrid.size; + url += '&type='+attgrid.type; + + windowName = windowName+'displayAttachment_'+attgrid.file.replace(/\//g,"_"); + var reg = '800x600'; + var reg2; + // handle calendar/vcard + if (attgrid.type.toUpperCase()=='TEXT/CALENDAR') + { + windowName = 'maildisplayEvent_'+attgrid.file.replace(/\//g,"_"); + reg2 = egw.link_get_registry('calendar'); + if (typeof app_registry['view'] != 'undefined' && typeof app_registry['view_popup'] != 'undefined' ) + { + reg = app_registry['view_popup']; + } + } + if (attgrid.type.toUpperCase()=='TEXT/X-VCARD' || attgrid.type.toUpperCase()=='TEXT/VCARD') + { + windowName = 'maildisplayContact_'+attgrid.file.replace(/\//g,"_"); + reg2 = egw.link_get_registry('addressbook'); + if (typeof app_registry['add'] != 'undefined' && typeof app_registry['add_popup'] != 'undefined' ) + { + reg = app_registry['add_popup']; + } + } + var w_h =reg.split('x'); + width = w_h[0]; + height = w_h[1]; + break; + case 'MESSAGE/RFC822': +/* + url += 'menuaction=mail.mail_ui.displayMessage'; // todo compose for Draft folder + url += '&id='+mailid; + url += '&part='+attgrid.partID; + url += '&is_winmail='+attgrid.winmailFlag; + windowName = windowName+'displayMessage_'+mailid+'_'+attgrid.partID; + width = 870; + height = egw_getWindowOuterHeight(); + break; +*/ + default: + url += 'menuaction=mail.mail_compose.getAttachment'; // todo compose for Draft folder + url += '&filename='+attgrid.file; + url += '&tmpname='+attgrid.tmp_name; + url += '&name='+attgrid.name; + //url += '&size='+attgrid.size; + url += '&type='+attgrid.type; + url += '&mode='+'save'; + + windowName = windowName+'displayAttachment_'+attgrid.file.replace(/\//g,"_"); + width = 870; + height = 600; + //document.location = url; + //return; + } + egw_openWindowCentered(url,windowName,width,height); + }, + saveAttachment: function(tag_info, widget) { //console.log(this, arguments); diff --git a/mail/templates/default/compose.xet b/mail/templates/default/compose.xet index ff65dc096f..b66163b3b7 100644 --- a/mail/templates/default/compose.xet +++ b/mail/templates/default/compose.xet @@ -122,7 +122,7 @@ - +