add swf and mp3 support
authortokul <tokul@7612ce4b-ef26-0410-bec9-ea0150e637f0>
Thu, 17 Feb 2005 12:01:16 +0000 (12:01 +0000)
committertokul <tokul@7612ce4b-ef26-0410-bec9-ea0150e637f0>
Thu, 17 Feb 2005 12:01:16 +0000 (12:01 +0000)
restore user media support
use only html 4.01 compatible tags by default
use pcm encoded wavs instead of mp3 encoded

git-svn-id: https://svn.code.sf.net/p/squirrelmail/code/trunk/squirrelmail@8860 7612ce4b-ef26-0410-bec9-ea0150e637f0

25 files changed:
plugins/newmail/COPYRIGHTS [new file with mode: 0644]
plugins/newmail/HISTORY
plugins/newmail/config-sample.php [new file with mode: 0644]
plugins/newmail/config_default.php [new file with mode: 0644]
plugins/newmail/functions.php [new file with mode: 0644]
plugins/newmail/loadfile.php [new file with mode: 0644]
plugins/newmail/media/austin_mail.mp3 [new file with mode: 0644]
plugins/newmail/media/austin_mail.swf [new file with mode: 0644]
plugins/newmail/media/austin_mail.wav [new file with mode: 0644]
plugins/newmail/media/got_a_message.mp3 [new file with mode: 0644]
plugins/newmail/media/got_a_message.swf [new file with mode: 0644]
plugins/newmail/media/got_a_message.wav [new file with mode: 0644]
plugins/newmail/media/monty_message.mp3 [new file with mode: 0644]
plugins/newmail/media/monty_message.swf [new file with mode: 0644]
plugins/newmail/media/monty_message.wav [new file with mode: 0644]
plugins/newmail/media/notify.mp3 [new file with mode: 0644]
plugins/newmail/media/notify.swf [new file with mode: 0644]
plugins/newmail/media/notify.wav [new file with mode: 0644]
plugins/newmail/newmail_opt.php
plugins/newmail/setup.php
plugins/newmail/sounds/FanFair.wav
plugins/newmail/sounds/Friends.wav
plugins/newmail/sounds/MontyPython.wav
plugins/newmail/sounds/Notify.wav
plugins/newmail/testsound.php

diff --git a/plugins/newmail/COPYRIGHTS b/plugins/newmail/COPYRIGHTS
new file mode 100644 (file)
index 0000000..137c60f
--- /dev/null
@@ -0,0 +1,41 @@
+* media/got_a_message.wav
+(swf and mp3 files are created from it with swftools and lame)
+
+Sound file is downloaded from 
+http://simplythebest.net/sounds/WAV/events_WAV/email_wavs.html
+
+Page indicates that media is public domain.
+--------------------------------------------------------------
+* sounds/MontyPython.wav
+* media/montypython.wav
+(swf and mp3 files are created from it with swftools and lame)
+
+http://simplythebest.net/sounds/WAV/events_WAV/email_wavs.html
+Original file name: monty_message.wav
+Copyright: Columbia/Tristar Studios
+Type: Demo
+
+--------------------------------------------------------------
+* media/austin_mail.wav
+(swf and mp3 files are created from it with swftools and lame)
+
+http://simplythebest.net/sounds/WAV/events_WAV/email_wavs.html
+Original file name: austin_mail.wav
+Copyright: New Line Productions
+Type: Demo
+
+--------------------------------------------------------------
+* media/notify.wav
+(swf and mp3 files are created from it with swftools and lame)
+
+Sound file is downloaded from
+http://www.freesoundfiles.tintagel.net/Audio/
+
+
+Copyright information from www.freesoundfiles.tintagel.net:
+These sound files are provided free of charge, without any 
+representation or warranty whatsoever. To the best of our 
+knowledge, all wave, midi, and audio files presented here are 
+in the public domain and are available for use without restriction.
+
+--------------------------------------------------------------
index 70c4bf0..7d0b0b9 100644 (file)
@@ -1,28 +1,22 @@
 This is the history for the newmail plugin in SquirrelMail.  Currently
 works with the 1.1.2+ versions of SquirrelMail.
 
-2.1
+From SquirrelMail v.1.2.0 plugin is included in main SquirrelMail package.
+All changes are logged in main SquirrelMail changelog.
 
+2.1
 Fixes bug in when used with the 1.1.3 distro 
 
-
-
 2.0
-
 Adds a "try" sounds option to the Newmail plugins works with 1.1.2
 
-
-
-
 1.4
-
 Tyler Akins cleaned up the javascript and now it can change the title
 bar's text if you have new mail.  Additionally, this now correctly
 uses the new 1.1.1 validate.php format.  Uses the new
 sqimap_unseen_messages() format in 1.1.2.
 
 1.3a
-
 Hm. Apparently the Sent box is being used to indicate new mail when
 checking all folders.  Disabled this.  Ditto for the Trash folder
 as well.
@@ -32,7 +26,6 @@ than just a sound plugin ;)
 
 
 1.3
-
 Now added the ability to only check for RECENT messages (those that
 have not had their information not yet looked at).  Once a message
 is "noticed", it will not show up again as recent.  Nice for
@@ -47,7 +40,6 @@ from any file in that directory via a drop-down menu in the options
 screen (or, they can still choose a local file).
 
 1.2
-
 Added the ability to show a popup window on new mail arrival (via a
 JavaScript function).
 
@@ -55,7 +47,6 @@ Added the ability to check for ONLY the INBOX for unseen messages
 (the default).  Also fixed a bug in counting unseen messages. ;)
 
 1.1
-
 Now added the ability to turn off this feature for users who don't want
 it.  The default is NOT enabled, so you need to go to the options menu to
 turn it on.
@@ -63,10 +54,8 @@ turn it on.
 Also a nice way to reset the file back to the server default.
 
 1.0
-
 First release (with an option page)!
 
 0.9
-
 First pass-through of making a plugin.  Hack hack hack . . .
 
diff --git a/plugins/newmail/config-sample.php b/plugins/newmail/config-sample.php
new file mode 100644 (file)
index 0000000..009d709
--- /dev/null
@@ -0,0 +1,17 @@
+<?php
+// Set $allowsound to false if you don't want sound files available
+$newmail_allowsound = true;
+
+// controls insertion of embed tags
+$newmail_mediacompat_mode=false;
+
+// List of enabled media files
+$newmail_mmedia['notify']['types'] = array(SM_NEWMAIL_FILETYPE_SWF,SM_NEWMAIL_FILETYPE_MP3,SM_NEWMAIL_FILETYPE_WAV);
+$newmail_mmedia['notify']['args']  = array('width'=>0,'height'=>0);
+$newmail_mmedia['got_a_message']['types'] = array(SM_NEWMAIL_FILETYPE_SWF,SM_NEWMAIL_FILETYPE_MP3,SM_NEWMAIL_FILETYPE_WAV);
+$newmail_mmedia['got_a_message']['args']  = array('width'=>0,'height'=>0);
+$newmail_mmedia['monty_message']['types'] = array(SM_NEWMAIL_FILETYPE_SWF,SM_NEWMAIL_FILETYPE_MP3,SM_NEWMAIL_FILETYPE_WAV);
+$newmail_mmedia['monty_message']['args']  = array('width'=>0,'height'=>0);
+$newmail_mmedia['austin_mail']['types'] = array(SM_NEWMAIL_FILETYPE_SWF,SM_NEWMAIL_FILETYPE_MP3,SM_NEWMAIL_FILETYPE_WAV);
+$newmail_mmedia['austin_mail']['args']  = array('width'=>0,'height'=>0);
+?>
\ No newline at end of file
diff --git a/plugins/newmail/config_default.php b/plugins/newmail/config_default.php
new file mode 100644 (file)
index 0000000..63d1b0a
--- /dev/null
@@ -0,0 +1,13 @@
+<?php
+// Set $allowsound to false if you don't want sound files available
+global $newmail_allowsound;
+$newmail_allowsound = true;
+
+// controls insertion of embed tags
+global $newmail_mediacompat_mode;
+$newmail_mediacompat_mode=false;
+
+// Default setting should create empty array.
+global $newmail_mmedia;
+$newmail_mmedia=array();
+?>
\ No newline at end of file
diff --git a/plugins/newmail/functions.php b/plugins/newmail/functions.php
new file mode 100644 (file)
index 0000000..ee2ebec
--- /dev/null
@@ -0,0 +1,445 @@
+<?php
+/**
+ * SquirrelMail NewMail plugin
+ *
+ * Functions
+ * @version $Id$
+ * @package plugins
+ * @subpackage new_mail
+ */
+
+/** file type defines */
+define('SM_NEWMAIL_FILETYPE_WAV',2);
+define('SM_NEWMAIL_FILETYPE_MP3',3);
+define('SM_NEWMAIL_FILETYPE_OGG',4);
+define('SM_NEWMAIL_FILETYPE_SWF',5);
+define('SM_NEWMAIL_FILETYPE_SVG',6);
+
+/** load default config */
+if (file_exists(SM_PATH . 'plugins/newmail/config_default.php')) {
+    include_once(SM_PATH . 'plugins/newmail/config_default.php');
+}
+
+/** load config */
+if (file_exists(SM_PATH . 'config/newmail_config.php')) {
+    include_once(SM_PATH . 'config/newmail_config.php');
+} elseif (file_exists(SM_PATH . 'plugins/newmail/config.php')) {
+    include_once(SM_PATH . 'plugins/newmail/config.php');
+}
+
+/**
+ * Function tries to detect if file contents match declared file type
+ *
+ * Function returns default extension for detected mime type or 'false'
+ *
+ * TODO: use $contents to check if file is in specified type
+ * @param string $contents file contents
+ * @param string $type file mime type
+ * @return string
+ */
+function newmail_detect_filetype($contents,$type) {
+    // convert $type to lower case
+    $type=strtolower($type);
+
+    $ret=false;
+
+    switch ($type) {
+    case 'audio/x-wav':
+        $ret='wav';
+        break;
+    case 'audio/mpeg':
+        $ret='mp3';
+        break;
+    case 'application/ogg':
+        $ret='ogg';
+        break;
+    case 'application/x-shockwave-flash':
+        $ret='swf';
+        break;
+    case 'image/svg+xml':
+        $ret='svg';
+        break;
+    default:
+        $ret=false;
+    }
+    return $ret;
+}
+
+/**
+ * @param string $type
+ * @param string $filename
+ * @return integer
+ */
+function newmail_get_mediatype($type,$filename) {
+    switch ($type) {
+    // fix for browser's that upload file as application/octet-stream
+    case 'application/octet-stream':
+        $ret=newmail_get_mediatype_by_ext($filename);
+        break;
+    case 'audio/x-wav':
+        $ret=SM_NEWMAIL_FILETYPE_WAV;
+        break;
+    case 'audio/mpeg':
+        $ret=SM_NEWMAIL_FILETYPE_MP3;
+        break;
+    case 'application/ogg':
+        $ret=SM_NEWMAIL_FILETYPE_OGG;
+        break;
+    case 'application/x-shockwave-flash':
+        $ret=SM_NEWMAIL_FILETYPE_SWF;
+        break;
+    case 'image/svg+xml':
+        $ret=SM_NEWMAIL_FILETYPE_SVG;
+        break;
+    default:
+        $ret=false;
+    }
+    return $ret;
+}
+
+/**
+ * Function provides filetype detection for browsers, that
+ * upload files with application/octet-stream file type.
+ * Ex. Opera.
+ * @param string $filename
+ * @return string
+ */
+function newmail_get_mediatype_by_ext($filename) {
+    if (preg_match("/\.wav$/i",$filename)) return SM_NEWMAIL_FILETYPE_WAV;
+    if (preg_match("/\.mp3$/i",$filename)) return SM_NEWMAIL_FILETYPE_MP3;
+    if (preg_match("/\.ogg$/i",$filename)) return SM_NEWMAIL_FILETYPE_OGG;
+    if (preg_match("/\.swf$/i",$filename)) return SM_NEWMAIL_FILETYPE_SWF;
+    if (preg_match("/\.svg$/i",$filename)) return SM_NEWMAIL_FILETYPE_SVG;
+    return false;
+}
+
+/**
+ * Creates html object tags of multimedia object
+ *
+ * Main function that creates multimedia object tags
+ * @param string $object object name
+ * @param integer $type media object type
+ * @param string $path URL to media object
+ * @param array $args media object attributes
+ * @param string $extra tags that have to buried deep inside object tags
+ * @param bool $addsuffix controls addition of suffix to media object url
+ * @return string object html tags and attributes required by selected media type.
+ */
+function newmail_media_objects($object,$types,$path,$args=array(),$extra='',$addsuffix=true) {
+    global $newmail_mediacompat_mode;
+
+    // first prepare single object for IE
+    $ret = newmail_media_object_ie($object,$types[0],$path,$args,$addsuffix);
+
+    // W3.org nested objects
+    $ret.= "<!--[if !IE]> <-->\n"; // not for IE
+
+    foreach ($types as $type) {
+        $ret.= newmail_media_object($object,$type,$path,$args,$addsuffix);
+    }
+
+    if (isset($newmail_mediacompat_mode) && $newmail_mediacompat_mode)
+        $ret.= newmail_media_embed($object,$types[0],$path,$args,$addsuffix);
+    // add $extra code inside objects 
+    if ($extra!='')
+        $ret.=$extra . "\n";
+
+    if (isset($newmail_mediacompat_mode) && $newmail_mediacompat_mode)
+        $ret.= newmail_media_embed_close($types[0]);
+
+    foreach (array_reverse($types) as $type) {
+        $ret.= newmail_media_object_close($type);
+    }
+    $ret.= "<!--> <![endif]-->\n"; // end non-IE mode
+    // close IE object
+    $ret.= newmail_media_object_ie_close($types[0]);
+
+    return $ret;
+}
+
+/**
+ * Creates object tags of multimedia object for browsers that comply to w3.org
+ * specifications.
+ *
+ * Warnings:
+ * * Returned string does not contain html closing tag.
+ * * This is internal function, use newmail_media_objects() instead
+ * @param string $object object name
+ * @param integer $type media object type
+ * @param string $path URL to media object
+ * @param array $args media object attributes
+ * @param bool $addsuffix controls addition of suffix to media object url
+ * @return string object html tags and attributes required by selected media type.
+ */
+function newmail_media_object($object,$type,$path,$args=array(),$addsuffix=true) {
+    $ret_w3='';
+    $suffix='';
+    $sArgs=newmail_media_prepare_args($args);
+
+    switch ($type) {
+    case SM_NEWMAIL_FILETYPE_SWF:
+        if ($addsuffix) $suffix='.swf';
+        $ret_w3 = '<object data="' . $path . $object . $suffix . '" '
+            .$sArgs
+            .'type="application/x-shockwave-flash">' . "\n";
+        break;
+    case SM_NEWMAIL_FILETYPE_WAV:
+        if ($addsuffix) $suffix='.wav';
+        $ret_w3 = '<object data="' . $path . $object . $suffix . '" '
+            .$sArgs
+            .'type="audio/x-wav">' . "\n";
+        break;
+    case SM_NEWMAIL_FILETYPE_OGG:
+        if ($addsuffix) $suffix='.ogg';
+        $ret_w3 = '<object data="' . $path . $object . $suffix . '" '
+            .$sArgs
+            .'type="application/ogg">' . "\n";
+        break;
+    case SM_NEWMAIL_FILETYPE_MP3:
+        if ($addsuffix) $suffix='.mp3';
+        $ret_w3 = '<object data="' . $path . $object . $suffix . '" '
+            .$sArgs
+            .'type="audio/mpeg">' . "\n";
+        break;
+    case SM_NEWMAIL_FILETYPE_SVG:
+        if ($addsuffix) $suffix='.svg';
+        $ret_w3 = '<object data="' . $path . $object . $suffix . '" '
+            .$sArgs
+            .'type="image/svg+xml">' . "\n";
+        break;
+    default:
+        $ret_w3='';
+    }
+    return $ret_w3;
+}
+
+/**
+ * Creates multimedia object tags for Internet Explorer (Win32)
+ *
+ * Warning:
+ * * Returned string does not contain html closing tag, because
+ * this multimedia object can include other media objects.
+ * * This is internal function, use newmail_media_objects() instead
+ *
+ * @param string $object object name
+ * @param integer $type media object type
+ * @param string $path URL to media object
+ * @param array $args media object attributes
+ * @param bool $addsuffix controls addition of suffix to media object url
+ * @return string object html tags and attributes required by selected media type.
+ */
+function newmail_media_object_ie($object,$type,$path,$args=array(),$addsuffix) {
+    $ret_ie='';
+    $suffix='';
+    $sArgs=newmail_media_prepare_args($args);
+
+    switch ($type) {
+    case SM_NEWMAIL_FILETYPE_SWF:
+        if ($addsuffix) $suffix='.swf';
+        $ret_ie ='<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" '
+            .'codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0" '
+            . $sArgs . 'id="' . $object ."\">\n"
+            .'<param name="movie" value="' . $path . $object . $suffix . "\">\n"
+            .'<param name="hidden" value="true">' . "\n";
+        break;
+    case SM_NEWMAIL_FILETYPE_WAV:
+        if ($addsuffix) $suffix='.wav';
+        $ret_ie ='<object classid="clsid:22D6F312-B0F6-11D0-94AB-0080C74C7E95" '
+            .'codebase="http://activex.microsoft.com/activex/controls/mplayer/en/nsmp2inf.cab#Version=6,0,02,0902" '
+            . $sArgs . 'id="' . $object ."\" \n"
+            .'type="audio/x-wav">' ."\n"
+            .'<param name="FileName" value="' . $path . $object . $suffix . "\">\n";
+        break;
+    case SM_NEWMAIL_FILETYPE_MP3:
+        if ($addsuffix) $suffix='.mp3';
+        $ret_ie ='<object classid="clsid:22D6F312-B0F6-11D0-94AB-0080C74C7E95" '
+            .'codebase="http://activex.microsoft.com/activex/controls/mplayer/en/nsmp2inf.cab#Version=6,0,02,0902" '
+            . $sArgs . 'id="' . $object ."\" \n"
+            .'type="audio/mpeg">' ."\n"
+            .'<param name="FileName" value="' . $path . $object . $suffix . "\">\n";
+            break;
+    case SM_NEWMAIL_FILETYPE_OGG:
+    case SM_NEWMAIL_FILETYPE_SVG:
+    default:
+        $ret_ie='';
+    }
+    return $ret_ie;
+}
+
+/**
+ * Creates embed tags of multimedia object
+ *        
+ * docs about embed
+ * Apple: http://www.apple.com/quicktime/authoring/embed.html
+ *
+ * Warnings:
+ * * Returned string does not contain html closing tag.
+ * * embed tags will be created by newmail_media_objects() only
+ *   when $newmail_mediacompat_mode option is enabled. Option is not
+ *   enabled by default in order to comply to w3.org specs.
+ * * This is internal function, use newmail_media_objects() instead
+ * @link http://www.apple.com/quicktime/authoring/embed.html Info about embed tag
+ * @param string $object object name
+ * @param integer $type media object type
+ * @param string $path URL to media object
+ * @param array $args media object attributes
+ * @param bool $addsuffix controls addition of suffix to media object url
+ * @return string embed html tags and attributes required by selected media type.
+ */
+function newmail_media_embed($object,$type,$path,$args=array(),$addsuffix=true) {
+    $ret_embed='';
+    $suffix='';
+    $sArgs=newmail_media_prepare_args($args);
+
+    switch ($type) {
+    case SM_NEWMAIL_FILETYPE_SWF:
+        if ($addsuffix) $suffix='.swf';
+        $ret_embed='<embed src="' . $path . $object . $suffix . '" '. "\n"
+            .'hidden="true" autostart="true" '. "\n"
+            .$sArgs . "\n"
+            .'name="' . $object .'" ' . "\n"
+            .'type="application/x-shockwave-flash" ' . "\n"
+            .'pluginspage="http://www.macromedia.com/go/getflashplayer">' . "\n";
+        break;
+    case SM_NEWMAIL_FILETYPE_WAV:
+        if ($addsuffix) $suffix='.wav';
+        $ret_embed='<embed src="' . $path . $object . $suffix . '" '. "\n"
+            .' hidden="true" autostart="true" '. "\n"
+            .' ' .$sArgs . "\n"
+            .' name="' . $object .'" ' . "\n"
+            .' type="audio/x-wav">' . "\n";
+        break;
+    case SM_NEWMAIL_FILETYPE_OGG:
+    case SM_NEWMAIL_FILETYPE_MP3:
+    case SM_NEWMAIL_FILETYPE_SVG:
+    default:
+        $ret_embed='';    
+    }
+    return $ret_embed;
+}
+
+/**
+ * Adds closing tags for ie object
+ * Warning:
+ * * This is internal function, use newmail_media_objects() instead 
+ * @param integer $type media object type
+ * @return string closing tag of media object
+ */
+function newmail_media_object_ie_close($type) {
+    $ret_end='';
+    switch ($type) {
+    case SM_NEWMAIL_FILETYPE_SWF:
+    case SM_NEWMAIL_FILETYPE_WAV:
+    case SM_NEWMAIL_FILETYPE_MP3:
+        $ret_end="</object>\n";
+        break;
+    case SM_NEWMAIL_FILETYPE_OGG:
+    case SM_NEWMAIL_FILETYPE_SVG:
+    default:
+        $ret_end='';    
+    }
+    return $ret_end;
+}
+
+/**
+ * Adds closing tags for object
+ * Warning:
+ * * This is internal function, use newmail_media_objects() instead 
+ * @param integer $type media object type
+ * @return string closing tag of media object
+ */
+function newmail_media_object_close($type) {
+    $ret_end='';
+    switch ($type) {
+    case SM_NEWMAIL_FILETYPE_SWF:
+    case SM_NEWMAIL_FILETYPE_WAV:
+    case SM_NEWMAIL_FILETYPE_OGG:
+    case SM_NEWMAIL_FILETYPE_MP3:
+    case SM_NEWMAIL_FILETYPE_SVG:
+        $ret_end="</object>\n";
+        break;
+    default:
+        $ret_end='';    
+    }
+    return $ret_end;
+}
+
+/**
+ * Adds closing tags for object
+ * Warning:
+ * * This is internal function, use newmail_media_objects() instead 
+ * @param integer $type media object type
+ * @return string closing tag of media object
+ */
+function newmail_media_embed_close($type) {
+    $ret_end='';
+    switch ($type) {
+    case SM_NEWMAIL_FILETYPE_SWF:
+    case SM_NEWMAIL_FILETYPE_WAV:
+       $ret_end="</embed>\n";
+        break;
+    case SM_NEWMAIL_FILETYPE_OGG:
+    case SM_NEWMAIL_FILETYPE_MP3:
+    case SM_NEWMAIL_FILETYPE_SVG:
+    default:
+        $ret_end='';    
+    }
+    return $ret_end;
+}
+
+/**
+ * Converts media attributes to string
+ * Warning:
+ * * attribute values are automatically sanitized by htmlspecialchars()
+ * * This is internal function, use newmail_media_objects() instead 
+ * @param array $args array with object attributes
+ * @return string string with object attributes
+ */
+function newmail_media_prepare_args($args) {
+    $ret_args='';
+    foreach ($args as $arg => $value) {
+        $ret_args.= $arg . '="' . htmlspecialchars($value) . '" '; 
+    }
+    return $ret_args;
+}
+
+/**
+ * Detects used media type and creates all need tags
+ * @param string $newmail_media
+ * @return string html tags with media objects
+ */
+function newmail_create_media_tags($newmail_media) {
+    global $newmail_mmedia, $newmail_userfile_type;
+
+    if (preg_match("/^mmedia_+/",$newmail_media)) {
+        $ret_media = "<!-- newmail mmedia option -->\n";
+        // remove mmedia key
+        $newmail_mmedia_short=preg_replace("/^mmedia_/",'',$newmail_media);
+        // check if media option is not removed
+        if (isset($newmail_mmedia[$newmail_mmedia_short])) {
+            $ret_media.= newmail_media_objects($newmail_mmedia_short,
+                                       $newmail_mmedia[$newmail_mmedia_short]['types'],
+                                       sqm_baseuri() . 'plugins/newmail/media/',
+                                       $newmail_mmedia[$newmail_mmedia_short]['args']);
+        }
+        $ret_media.= "<!-- end of newmail mmedia option -->\n";
+    } elseif ($newmail_media=='(userfile)') {
+        $ret_media = "<!-- newmail usermedia option -->\n";
+        $ret_media.= newmail_media_objects('loadfile.php',
+                                   array($newmail_userfile_type),
+                                   sqm_baseuri() . 'plugins/newmail/',
+                                   array('width'=>0,'height'=>0),
+                                   '',false);
+        $ret_media.= "<!-- end of newmail usermedia option -->\n";
+    } else {
+        $ret_media = "<!-- newmail sounds from sounds/*.wav -->\n";
+        $ret_media.= newmail_media_objects(basename($newmail_media),
+                                   array(SM_NEWMAIL_FILETYPE_WAV),
+                                   sqm_baseuri() . 'plugins/newmail/sounds/',
+                                   array('width'=>0,'height'=>0),
+                                   '',false);
+        $ret_media.= "<!-- end of newmail sounds from sounds/*.wav -->\n";
+    }
+    return $ret_media;
+}
+?>
\ No newline at end of file
diff --git a/plugins/newmail/loadfile.php b/plugins/newmail/loadfile.php
new file mode 100644 (file)
index 0000000..e12e6c9
--- /dev/null
@@ -0,0 +1,79 @@
+<?php
+/**
+ * SquirrelMail NewMail plugin
+ *
+ * Script loads user's media file.
+ * @version $Id$
+ * @package plugins
+ * @subpackage new_mail
+ */
+
+/** define SM_PATH */
+define('SM_PATH','../../');
+
+/** Load squirrelmail functions */
+include_once(SM_PATH . 'include/validate.php');
+/** Load plugin functions */
+include_once(SM_PATH . 'plugins/newmail/functions.php');
+
+sqgetGlobalVar('username',$username,SQ_SESSION);
+global $data_dir;
+
+$media = getPref($data_dir,$username,'newmail_media', '(none)');
+    // get other prefs
+    $newmail_userfile_type=getPref($data_dir,$username,'newmail_userfile_type',false);
+    
+    $newmail_userfile_location=getHashedFile($username, $data_dir, $username . '.sound');
+
+    if ($newmail_userfile_type!=false && file_exists($newmail_userfile_location)) {
+        // open media file
+        $newmail_userfile_handle = fopen($newmail_userfile_location,'rb');
+        if ($newmail_userfile_handle) {
+            $newmail_userfile_filesize = filesize($newmail_userfile_location);
+            $newmail_userfile_contents = fread($newmail_userfile_handle,$newmail_userfile_filesize);
+            fclose ($newmail_userfile_handle);
+
+            // user prefs use only integer values to store file type
+            switch($newmail_userfile_type) {
+            case SM_NEWMAIL_FILETYPE_WAV:
+                // wav file
+                $newmail_userfile_contenttype='audio/x-wav';
+                break;
+            case SM_NEWMAIL_FILETYPE_MP3:
+                // mp3 file
+                $newmail_userfile_contenttype='audio/mpeg';
+                break;
+            case SM_NEWMAIL_FILETYPE_OGG:
+                // ogg file
+                $newmail_userfile_contenttype='application/ogg';
+                break;
+            case SM_NEWMAIL_FILETYPE_SWF:
+                // flash file
+                $newmail_userfile_contenttype='application/x-shockwave-flash';
+                break;
+            case SM_NEWMAIL_FILETYPE_SVG:
+                // svg file
+                $newmail_userfile_contenttype='image/svg+xml';
+                break;
+            default:
+                // none of above
+                $newmail_userfile_contenttype='unknown';
+            }
+
+            // make sure that media file is in correct format
+            $newmail_userfile_extension=newmail_detect_filetype($newmail_userfile_contents,$newmail_userfile_contenttype);
+
+            // last check before sending file contents to browser.
+            if ($newmail_userfile_extension!=false) {
+                $newmail_send_filename='mediafile.' . $newmail_userfile_extension;
+                header ('Content-Disposition: inline; filename="' . $newmail_send_filename . '"');
+                header('Content-Type: "' . $newmail_userfile_contenttype .'"; ' .
+                       'name="' . $newmail_send_filename . '"');
+                header('Content-Length: ' . $newmail_userfile_filesize );
+                echo $newmail_userfile_contents;
+                exit;
+            } // file type detection failed
+        } // failed to open userfile
+    } // userfile is missing or preferences don't store file type.
+// maybe we should send some error code
+?>
\ No newline at end of file
diff --git a/plugins/newmail/media/austin_mail.mp3 b/plugins/newmail/media/austin_mail.mp3
new file mode 100644 (file)
index 0000000..8fb68e5
Binary files /dev/null and b/plugins/newmail/media/austin_mail.mp3 differ
diff --git a/plugins/newmail/media/austin_mail.swf b/plugins/newmail/media/austin_mail.swf
new file mode 100644 (file)
index 0000000..398f1a4
Binary files /dev/null and b/plugins/newmail/media/austin_mail.swf differ
diff --git a/plugins/newmail/media/austin_mail.wav b/plugins/newmail/media/austin_mail.wav
new file mode 100644 (file)
index 0000000..99ea5c8
Binary files /dev/null and b/plugins/newmail/media/austin_mail.wav differ
diff --git a/plugins/newmail/media/got_a_message.mp3 b/plugins/newmail/media/got_a_message.mp3
new file mode 100644 (file)
index 0000000..bf93cd9
Binary files /dev/null and b/plugins/newmail/media/got_a_message.mp3 differ
diff --git a/plugins/newmail/media/got_a_message.swf b/plugins/newmail/media/got_a_message.swf
new file mode 100644 (file)
index 0000000..ad8a875
Binary files /dev/null and b/plugins/newmail/media/got_a_message.swf differ
diff --git a/plugins/newmail/media/got_a_message.wav b/plugins/newmail/media/got_a_message.wav
new file mode 100644 (file)
index 0000000..32407f0
Binary files /dev/null and b/plugins/newmail/media/got_a_message.wav differ
diff --git a/plugins/newmail/media/monty_message.mp3 b/plugins/newmail/media/monty_message.mp3
new file mode 100644 (file)
index 0000000..9f0ba8b
Binary files /dev/null and b/plugins/newmail/media/monty_message.mp3 differ
diff --git a/plugins/newmail/media/monty_message.swf b/plugins/newmail/media/monty_message.swf
new file mode 100644 (file)
index 0000000..58258f0
Binary files /dev/null and b/plugins/newmail/media/monty_message.swf differ
diff --git a/plugins/newmail/media/monty_message.wav b/plugins/newmail/media/monty_message.wav
new file mode 100644 (file)
index 0000000..17dac21
Binary files /dev/null and b/plugins/newmail/media/monty_message.wav differ
diff --git a/plugins/newmail/media/notify.mp3 b/plugins/newmail/media/notify.mp3
new file mode 100644 (file)
index 0000000..09a8a8d
Binary files /dev/null and b/plugins/newmail/media/notify.mp3 differ
diff --git a/plugins/newmail/media/notify.swf b/plugins/newmail/media/notify.swf
new file mode 100644 (file)
index 0000000..76958c5
Binary files /dev/null and b/plugins/newmail/media/notify.swf differ
diff --git a/plugins/newmail/media/notify.wav b/plugins/newmail/media/notify.wav
new file mode 100644 (file)
index 0000000..7877ba1
Binary files /dev/null and b/plugins/newmail/media/notify.wav differ
index 8e57179..4b450c7 100644 (file)
 define('SM_PATH','../../');
 
 /* SquirrelMail required files. */
-require_once(SM_PATH . 'include/validate.php');
+include_once(SM_PATH . 'include/validate.php');
 /* sqm_baseuri function */
-require_once(SM_PATH . 'functions/display_messages.php');
+include_once(SM_PATH . 'functions/display_messages.php');
+/** Plugin functions (also loads plugin's config) */
+include_once(SM_PATH . 'plugins/newmail/functions.php');
 
 displayPageHeader($color, 'None');
 
@@ -28,6 +30,7 @@ $media_allbox = getPref($data_dir,$username,'newmail_allbox');
 $media_recent = getPref($data_dir,$username,'newmail_recent');
 $media_changetitle = getPref($data_dir,$username,'newmail_changetitle');
 $media = getPref($data_dir,$username,'newmail_media', '(none)');
+$media_userfile_name = getPref($data_dir,$username,'newmail_userfile_name','');
 
 // Set $allowsound to false if you don't want sound files available
 $allowsound = "true";
@@ -65,7 +68,7 @@ echo '</td></tr>' .
         html_tag( 'tr' ) .
             html_tag( 'td', '', 'center', $color[4] ) . "\n" . '<hr style="width: 25%; height: 1px;" />' . "\n";
 
-echo '<form action="'.sqm_baseuri().'src/options.php" method="post">' . "\n" .
+echo '<form action="'.sqm_baseuri().'src/options.php" method="post" enctype="multipart/form-data">' . "\n" .
         html_tag( 'table', '', '', '', 'width="100%" cellpadding="5" cellspacing="0" border="0"' ) . "\n";
 
 // Option: media_allbox
@@ -143,14 +146,62 @@ if ($allowsound == "true") {
         }
     }
     $d->close();
-    $media_output = ($media == '(none)') ? _("(none)") : substr($media, strrpos($media, '/')+1);
+    // display media selection
+    foreach($newmail_mmedia as $newmail_mm_name => $newmail_mm_data) {
+        echo '<option ';
+        if ($media=='mmedia_' . $newmail_mm_name) {
+            echo 'selected="selected" ';
+        }
+        echo 'value="mmedia_' . $newmail_mm_name . '">'
+            .htmlspecialchars($newmail_mm_name) . "</option>\n";
+    }
+    // display local file option
+    echo '<option ';
+    if ($media=='(userfile)') {
+        echo 'selected="selected" ';
+    }
+    echo 'value="(userfile)">'.
+        _("uploaded media file") . "</option>\n";
+    // end of local file option
+
+    // Set media file name
+    if ($media == '(none)') {
+        $media_output = _("none");
+    } elseif ($media == '(userfile)') {
+        $media_output = basename($media_userfile_name);
+    } elseif (preg_match("/^mmedia_+/",$media)) {
+        $media_output = preg_replace("/^mmedia_/",'',$media);
+    } else {
+        $media_output = substr($media, strrpos($media, '/')+1);
+    }
+
     echo '</select>'.
         '<input type="submit" value="' . _("Try") . '" name="test" onclick="' .
             "window.open('testsound.php?sound='+media_sel.options[media_sel.selectedIndex].value, 'TestSound'," .
             "'width=150,height=30,scrollbars=no');" .
             'return false;' .
-            '" /></td></tr>' .
-            html_tag( 'tr', "\n" .
+            '" /></td></tr>';
+    echo  '<tr>'.
+        '<td align="right" nowrap>' . _("Upload Media File:") .
+        '</td><td>'.
+        '<input type="file" size="40" name="media_file">'.
+        '</td>'.
+        '</tr>';
+
+    echo  '<tr>'.
+        '<td align="right" nowrap>' . _("Uploaded Media File:") .
+        '</td><td>'.
+        ($media_userfile_name!='' ? htmlspecialchars($media_userfile_name) : _("unavailable")).
+        '</td>'.
+        '</tr>';
+
+    if ($media_userfile_name!='') {
+        echo '<tr>'
+            .'<td colspan="2" align="center">'
+            .sprintf(_("Media file %s will be removed, if you upload other media file."),basename($media_userfile_name))
+            .'</td></tr>';
+    }
+    echo html_tag( 'tr', "\n" .
                 html_tag( 'td', _("Current File:"), 'right', '', 'style="white-space: nowrap;"' ) .
                     html_tag( 'td', '<input type="hidden" value="' .
                         htmlspecialchars($media) . '" name="media_default" />' .
index 22087fd..40a6187 100644 (file)
  */
 
 /**
+ * sqm_baseuri function for setups that don't load it by default
  */
 include_once(SM_PATH . 'functions/display_messages.php');
 
+/** Load plugin functions */
+include_once(SM_PATH . 'plugins/newmail/functions.php');
+
 /**
  * Checks if mailbox contains new messages.
  *
@@ -105,7 +109,7 @@ function newmail_optpage_register_block() {
  * Save newmail plugin settings
  */
 function newmail_sav() {
-    global $data_dir, $username;
+    global $data_dir, $username, $_FILES;
 
     if ( sqgetGlobalVar('submit_newmail', $submit, SQ_POST) ) {
         $media_enable = '';
@@ -128,11 +132,41 @@ function newmail_sav() {
         setPref($data_dir,$username,'newmail_changetitle',$media_changetitle);
 
         if( sqgetGlobalVar('media_sel', $media_sel, SQ_POST) &&
-            ($media_sel == '(none)' || $media_sel == '(local media)') ) {
+            $media_sel == '(none)' ) {
             removePref($data_dir,$username,'newmail_media');
         } else {
             setPref($data_dir,$username,'newmail_media',$media_sel);
         }
+
+        // process uploaded file
+        if (isset($_FILES['media_file']['tmp_name']) && $_FILES['media_file']['tmp_name']!='') {
+            // set temp file and get media file name
+            $newmail_tempmedia=getHashedDir($username, $data_dir) . "/$username.tempsound";
+            $newmail_mediafile=getHashedFile($username, $data_dir, $username . '.sound');
+            if (move_uploaded_file($_FILES['media_file']['tmp_name'], $newmail_tempmedia)) {
+                // new media file is in $newmail_tempmedia
+                if (file_exists($newmail_mediafile)) unlink($newmail_mediafile);
+                if (! rename($newmail_tempmedia,$newmail_mediafile)) {
+                    // remove (userfile), if file rename fails
+                    removePref($data_dir,$username,'newmail_media');
+                } else {
+                    // store media type
+                    if (isset($_FILES['media_file']['type']) && isset($_FILES['media_file']['name'])) {
+                        setPref($data_dir,$username,'newmail_userfile_type',
+                           newmail_get_mediatype($_FILES['media_file']['type'],$_FILES['media_file']['name']));
+                    } else {
+                        removePref($data_dir,$username,'newmail_userfile_type');
+                    }
+                    // store file name
+                    if (isset($_FILES['media_file']['name'])) {
+                        setPref($data_dir,$username,'newmail_userfile_name',basename($_FILES['media_file']['name']));
+                    } else {
+                        setPref($data_dir,$username,'newmail_userfile_name','mediafile.unknown');
+                    }
+
+                }
+            }
+        }
     }
 }
 
@@ -143,6 +177,7 @@ function newmail_pref() {
     global $username,$data_dir;
     global $newmail_media,$newmail_enable,$newmail_popup,$newmail_allbox;
     global $newmail_recent, $newmail_changetitle;
+    global $newmail_userfile_type;
 
     $newmail_recent = getPref($data_dir,$username,'newmail_recent');
     $newmail_enable = getPref($data_dir,$username,'newmail_enable');
@@ -150,6 +185,8 @@ function newmail_pref() {
     $newmail_popup = getPref($data_dir, $username, 'newmail_popup');
     $newmail_allbox = getPref($data_dir, $username, 'newmail_allbox');
     $newmail_changetitle = getPref($data_dir, $username, 'newmail_changetitle');
+
+    $newmail_userfile_type = getPref($data_dir, $username, 'newmail_userfile_type');
 }
 
 /**
@@ -170,6 +207,8 @@ function newmail_set_loadinfo() {
 function newmail_plugin() {
     global $username, $newmail_media, $newmail_enable, $newmail_popup,
         $newmail_recent, $newmail_changetitle, $imapConnection, $PHP_SELF;
+    global $newmail_mmedia;
+    global $newmail_userfile_type;
 
     if ($newmail_enable == 'on' ||
         $newmail_popup == 'on' ||
@@ -234,14 +273,11 @@ function newmail_plugin() {
                 "</script>\n";
         }
 
+        // create media output if there are new email messages
         if ($totalNew > 0 && $newmail_enable == 'on' && $newmail_media != '' ) {
-            /**
-             * docs about embed
-             * Apple: http://www.apple.com/quicktime/authoring/embed.html
-             */
-            echo '<embed src="'.htmlspecialchars($newmail_media) .
-                "\" hidden=\"true\" autostart=\"true\" width=\"2\" height=\"2\">\n";
+            echo newmail_create_media_tags($newmail_media);
         }
+
         if ($totalNew > 0 && $newmail_popup == 'on') {
             echo "<script language=\"JavaScript\">\n".
                 "<!--\n".
index 697371e..a1da46d 100644 (file)
Binary files a/plugins/newmail/sounds/FanFair.wav and b/plugins/newmail/sounds/FanFair.wav differ
index b9397de..e5f1e87 100644 (file)
Binary files a/plugins/newmail/sounds/Friends.wav and b/plugins/newmail/sounds/Friends.wav differ
index 0dc3655..b160118 100644 (file)
Binary files a/plugins/newmail/sounds/MontyPython.wav and b/plugins/newmail/sounds/MontyPython.wav differ
index 658bc7f..931b9d3 100644 (file)
Binary files a/plugins/newmail/sounds/Notify.wav and b/plugins/newmail/sounds/Notify.wav differ
index 9a78ce7..fa1192d 100644 (file)
@@ -35,7 +35,7 @@ if ( ! sqgetGlobalVar('sound', $sound, SQ_GET) ) {
 echo html_tag( 'table',
          html_tag( 'tr',
              html_tag( 'td',
-                    '<embed src="'.htmlspecialchars($sound).'" hidden="true" autostart="true" width="2" height="2">'."\n".
+                    newmail_create_media_tags($sound)."\n".
                     '<br />'.
                     '<b>' . _("Loading the sound...") . '</b><br />'.
                     '<form>'.