gecko-dev/calendar/resources/content/calendarMail.js

337 строки
11 KiB
JavaScript

/* ***** BEGIN LICENSE BLOCK *****
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Mozilla Public License Version
* 1.1 (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
* http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is OEone Calendar Code, released October 31st, 2001.
*
* The Initial Developer of the Original Code is
* OEone Corporation.
* Portions created by the Initial Developer are Copyright (C) 2001
* the Initial Developer. All Rights Reserved.
*
* Contributor(s): Dan Parent <danp@oeone.com>
*
* Alternatively, the contents of this file may be used under the terms of
* either the GNU General Public License Version 2 or later (the "GPL"), or
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to
* use your version of this file under the terms of the MPL, indicate your
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the MPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK ***** */
var gMailAccounts = false;
var gMAILDEBUG = 1; // 0 - no output, 1 dump to terminal, > 1 use alerts
var gMailIdentity;
var emailStringBundle;
/**** checkForMailNews
*
* PURPOSE: if mailnews is installed return true, else false
*
*/
function checkForMailNews()
{
emailStringBundle = srGetStrBundle("chrome://calendar/locale/email.properties");
var AccountManagerComponent;
var AccountManagerService;
var AccountManager;
var DefaultAccount;
var SmtpServiceComponent;
var SmtpService;
var Smtp;
var DefaultSmtp;
try
{
AccountManagerComponent = Components.classes["@mozilla.org/messenger/account-manager;1"];
AccountManagerService = AccountManagerComponent.getService();
}
catch(ex) // yikes no account manager == no accounts
{
// from bug 122651 - scenario 1
noMail();
return;
}
try
{
AccountManager = AccountManagerService.QueryInterface(Components.interfaces.nsIMsgAccountManager);
DefaultAccount = AccountManager.defaultAccount;
gMailIdentity = DefaultAccount.defaultIdentity; // we'll store the user's account info globally for now
}
catch(ex)
{
// from bug 122651 - scenario 2
noAccount();
return;
}
try
{
SmtpServiceComponent = Components.classes["@mozilla.org/messengercompose/smtp;1"];
SmtpService = SmtpServiceComponent.getService();
Smtp = SmtpService.QueryInterface(Components.interfaces.nsISmtpService);
DefaultSmtp = Smtp.defaultServer;
}
catch(ex)
{
// if we don't have an SMTP server to use I'm not going
// to allow mail features to be enabled for now
// from bug 122651: scenarios 3, and 6
noSmtp();
return;
}
// if we get here that means we must have a default account and default smtp server otherwise
// the thrown exceptions would have been caught.
// from bug 122651 - scenarios 4, 5, 7, and 8
// we'll just use the default account for now.
gMailAccounts = true;
}
/**** noMail
*
* PURPOSE: function to handle the scenario when mailnews is not installed
*
*/
function noMail()
{
// maybe provide a way of telling the user how to get a mailnews build
// this should be a pref with a window that has a checkbox to shut off
// this warning (for people that don't want mailnews installed)
mdebug("You don't have mail installed");
}
/**** noAccount
*
* PURPOSE: function to handle the scenario where mailnews is installed but
* an account has not been created
*/
function noAccount()
{
// this could call the account wizard I guess thats a later feature
mdebug("You don't have a mail account");
}
/**** noSmtp
*
* PURPOSE: function to handle the scenario where mailnews is installed, has
* a default incoming account but does not have an smtp service
*
* XXX: can this happen?
*
*/
function noSmtp()
{
/* I don't really know if its possible to create this scenario, I'm putting it here for
* the sake of completion so that I can say I've at least covered all possible scenarios
* from bug 122651
*/
mdebug("You don't have an smtp account");
}
/**** sendEvent
*
* PURPOSE: implement iMip :) - that is send out a calendar event both
* as an attachment of type text/calendar and as text/plain
*/
function sendEvent()
{
var Event;
var CalendarDataFilePath;
var nsIMsgCompFieldsComponent;
var nsIMsgCompFields;
var nsIMsgComposeParamsComponent;
var nsIMsgComposeParams;
var nsIMsgComposeServiceComponent;
var nsIMsgComposeService;
var nsIMsgCompFormat;
var nsIMsgCompType;
var nsIMsgAttachmentComponent;
var nsIMsgAttachment;
Event = gCalendarWindow.EventSelection.selectedEvents[0].clone();
CalendarDataFilePath = getCalendarDataFilePath();
if (! CalendarDataFilePath)
{
return;
}
/* Want output like
* When: Thursday, November 09, 2000 11:00 PM-11:30 PM (GMT-08:00) Pacific Time
* (US & Canada); Tijuana.
* Where: San Francisco
* see bug 59630
*/
if (Event)
{
// lets open a composer with fields and body prefilled
try
{
Event.alarm = false;
if(Event.method == 0)
Event.method = Event.ICAL_METHOD_PUBLISH;
saveCalendarObject(CalendarDataFilePath, Event.getIcalString());
nsIMsgAttachmentComponent = Components.classes["@mozilla.org/messengercompose/attachment;1"];
nsIMsgAttachment = nsIMsgAttachmentComponent.createInstance(Components.interfaces.nsIMsgAttachment);
nsIMsgAttachment.name = emailStringBundle.GetStringFromName( "AttachmentName" );
nsIMsgAttachment.contentType = "text/calendar;"
nsIMsgAttachment.temporary = true;
nsIMsgAttachment.url = "file://" + CalendarDataFilePath;
// lets setup the fields for the message
nsIMsgCompFieldsComponent = Components.classes["@mozilla.org/messengercompose/composefields;1"];
nsIMsgCompFields = nsIMsgCompFieldsComponent.createInstance(Components.interfaces.nsIMsgCompFields);
nsIMsgCompFields.useMultipartAlternative = true;
nsIMsgCompFields.attachVCard = true;
nsIMsgCompFields.from = gMailIdentity.email;
nsIMsgCompFields.replyTo = gMailIdentity.replyTo;
nsIMsgCompFields.subject = Event.title;
nsIMsgCompFields.organization = gMailIdentity.organization;
nsIMsgCompFields.body = emailStringBundle.GetStringFromName( "When" )+" " + Event.start + "-" + Event.end + "\n"+emailStringBundle.GetStringFromName( "Where" )+" " + Event.location + "\n"+emailStringBundle.GetStringFromName( "Organizer" )+" " + gMailIdentity.fullName + " <" + gMailIdentity.email + ">" + "\n"+emailStringBundle.GetStringFromName( "Summary" )+":" + Event.description;
nsIMsgCompFields.addAttachment(nsIMsgAttachment);
/* later on we may be able to add:
* returnReceipt, attachVCard
*/
// time to handle the message paramaters
nsIMsgComposeParamsComponent = Components.classes["@mozilla.org/messengercompose/composeparams;1"];
nsIMsgComposeParams = nsIMsgComposeParamsComponent.createInstance(Components.interfaces.nsIMsgComposeParams);
nsIMsgComposeParams.composeFields = nsIMsgCompFields;
nsIMsgCompFormat = Components.interfaces.nsIMsgCompFormat;
nsIMsgCompType = Components.interfaces.nsIMsgCompType;
nsIMsgComposeParams.format = nsIMsgCompFormat.PlainText; // this could be a pref for the user
nsIMsgComposeParams.type = nsIMsgCompType.New;
// finally lets pop open a composer window after all this work :)
nsIMsgComposeServiceComponent = Components.classes["@mozilla.org/messengercompose;1"];
nsIMsgComposeService = nsIMsgComposeServiceComponent.getService().QueryInterface(Components.interfaces.nsIMsgComposeService);
nsIMsgComposeService.OpenComposeWindowWithParams(null, nsIMsgComposeParams);
}
catch(ex)
{
mdebug("failed to get composer window\nex: " + ex);
}
}
}
/**** getCalendarDataFilePath
*
* PURPOSE: get the user's current profile directory and use it as a place
* to temporarily store the iCal tempfile that I need to attach
* to the email
*/
function getCalendarDataFilePath()
{
var FilePath;
var DirUtilsComponent;
var DirUtilsInstance;
var nsIFile;
try
{
DirUtilsComponent = Components.classes["@mozilla.org/file/directory_service;1"];
DirUtilsInstance = DirUtilsComponent.createInstance(Components.interfaces.nsIProperties);
nsIFile = Components.interfaces.nsIFile;
FilePath = DirUtilsInstance.get("ProfD", nsIFile).path;
var aFile = Components.classes["@mozilla.org/file/local;1"].createInstance();
var aLocalFile = aFile.QueryInterface(Components.interfaces.nsILocalFile);
if (!aLocalFile) return false;
aLocalFile.initWithPath(FilePath);
aLocalFile.append( "tempIcal.ics" );
FilePath = aLocalFile.path;
}
catch(ex)
{
mdebug("No filepath has been found, ex:\n" + ex);
FilePath = null;
}
return(FilePath);
}
/**** saveCalendarObject
*
* PURPOSE: open a tmp file and write Ical info to it, this has
* to be done until there is a way to pass an ical URL to
* the messenger attachment code
*/
function saveCalendarObject(FilePath, CalendarStream)
{
var LocalFileComponent;
var LocalFileInstance;
var FileChannelComponent;
var FileChannelInstance;
var FileTransportComponent;
var FileTransportService;
var FileTransport;
var FileOutput;
// need LocalFile, otherwise what are we going to write to?
LocalFileComponent = Components.classes["@mozilla.org/file/local;1"];
LocalFileInstance = LocalFileComponent.createInstance(Components.interfaces.nsILocalFile);
LocalFileInstance.initWithPath(FilePath);
if (!LocalFileInstance.exists())
{
try
{
LocalFileInstance.create(LocalFileInstance.NORMAL_FILE_TYPE, 0644);
}
catch(ex)
{
mdebug("Unable to create temporary iCal file");
}
}
// need nsIFileChannel for ioflags
FileChannelComponent = Components.classes["@mozilla.org/network/local-file-channel;1"];
FileChannelInstance = FileChannelComponent.createInstance(Components.interfaces.nsIFileChannel);
// need nsIFileTransport to create a transport
FileTransportComponent = Components.classes["@mozilla.org/network/file-transport-service;1"];
FileTransportService = FileTransportComponent.getService(Components.interfaces.nsIFileTransportService);
// need nsITransport to open an output stream
FileTransport = FileTransportService.createTransport(LocalFileInstance, FileChannelInstance.NS_RDWR, 0644, true);
// need nsIOutputStream to write out the actual file
FileOutput = FileTransport.openOutputStream(0, -1, null);
// now lets actually write the output to the file
FileOutput.write(CalendarStream, CalendarStream.length);
FileOutput.close();
}
/**** mdebug
*
* PURPOSE: display debugging messages
*
*/
function mdebug(message)
{
if (gMAILDEBUG == 1)
{
dump(message + "\n");
}
else if (gMAILDEBUG > 1)
{
alert(message);
}
}