first pass at publish and import calendars (bugs 285016 and 285019)

This commit is contained in:
pavlov%pavlov.net 2005-03-22 21:37:26 +00:00
Родитель 51e6317cd9
Коммит 229acd7e9d
2 изменённых файлов: 231 добавлений и 218 удалений

Просмотреть файл

@ -763,6 +763,41 @@ function jsDateToDateTime(date)
return newDate; return newDate;
} }
function appendCalendars(to, froms, listener)
{
var getListener = {
onOperationComplete: function(aCalendar, aStatus, aOperationType, aId, aDetail)
{
if (listener)
listener.onOperationComplete(aCalendar, aStatus, aOperationType,
aId, aDetail);
},
onGetResult: function(aCalendar, aStatus, aItemType, aDetail, aCount, aItems)
{
if (!Components.isSuccessCode(aStatus)) {
aborted = true;
return;
}
if (aCount) {
for (var i=0; i<aCount; ++i) {
// Store a (short living) reference to the item.
var itemCopy = aItems[i].clone();
to.addItem(itemCopy, null);
}
}
}
};
for each(var from in froms) {
from.getItems(Components.interfaces.calICalendar.ITEM_FILTER_TYPE_ALL,
0, null, null, getListener);
}
}
/* /*
* returns true if lastModified match * returns true if lastModified match
* *
@ -1388,44 +1423,45 @@ function print()
function publishEntireCalendar() function publishEntireCalendar()
{ {
var args = new Object(); var args = new Object();
args.onOk = self.publishEntireCalendarDialogResponse; args.onOk = self.publishEntireCalendarDialogResponse;
var name = gCalendarWindow.calendarManager.getSelectedCalendarId();
var node = gCalendarWindow.calendarManager.rdf.getNode( name );
var remotePath = node.getAttribute( "http://home.netscape.com/NC-rdf#remotePath" ); var remotePath = ""; // get a remote path as a pref of the calendar
if( remotePath != "" && remotePath != null ) if (remotePath != "" && remotePath != null) {
{ var publishObject = new Object( );
var publishObject = new Object( ); publishObject.remotePath = remotePath;
publishObject.remotePath = remotePath; args.publishObject = publishObject;
args.publishObject = publishObject; }
}
openDialog("chrome://calendar/content/publishDialog.xul", "caPublishEvents", "chrome,titlebar,modal", args ); openDialog("chrome://calendar/content/publishDialog.xul", "caPublishEvents", "chrome,titlebar,modal", args );
} }
function publishEntireCalendarDialogResponse( CalendarPublishObject ) function publishEntireCalendarDialogResponse( CalendarPublishObject )
{ {
//update the calendar object with the publish information var icsURL = makeURL(CalendarPublishObject.remotePath);
var name = gCalendarWindow.calendarManager.getSelectedCalendarId();
//get the node var oldCalendar = getCalendar(); // get the currently selected calendar
var node = gCalendarWindow.calendarManager.rdf.getNode( name );
node.setAttribute( "http://home.netscape.com/NC-rdf#remotePath", CalendarPublishObject.remotePath ); // create an ICS calendar, but don't register it
var calManager = getCalendarManager();
try {
var newCalendar = calManager.createCalendar(oldCalendar.name, "ics", icsURL);
} catch (ex) {
dump(ex);
return false;
}
if( node.getAttribute("http://home.netscape.com/NC-rdf#publishAutomatically") != "true" ) var getListener = {
node.setAttribute("http://home.netscape.com/NC-rdf#publishAutomatically", "false"); onOperationComplete: function(aCalendar, aStatus, aOperationType, aId, aDetail)
{
// delete the new calendar now that we're done with it
calManager.deleteCalendar(newCalendar);
}
};
gCalendarWindow.calendarManager.rdf.flush(); appendCalendars(newCalendar, [oldCalendar], getListener);
calendarUploadFile(node.getAttribute( "http://home.netscape.com/NC-rdf#path" ),
CalendarPublishObject.remotePath,
"text/calendar");
return( false );
} }
function publishCalendarData() function publishCalendarData()

Просмотреть файл

@ -1,4 +1,5 @@
/* ***** BEGIN LICENSE BLOCK ***** /* -*- Mode: javascript; tab-width: 20; indent-tabs-mode: nil; c-basic-offset: 4 -*-
* ***** BEGIN LICENSE BLOCK *****
* Version: MPL 1.1/GPL 2.0/LGPL 2.1 * Version: MPL 1.1/GPL 2.0/LGPL 2.1
* *
* The contents of this file are subject to the Mozilla Public License Version * The contents of this file are subject to the Mozilla Public License Version
@ -104,155 +105,155 @@ function convertToUnicode(aCharset, aSrc )
function loadEventsFromFile() function loadEventsFromFile()
{ {
const nsIFilePicker = Components.interfaces.nsIFilePicker; const nsIFilePicker = Components.interfaces.nsIFilePicker;
var fp = Components.classes["@mozilla.org/filepicker;1"].createInstance(nsIFilePicker); var fp = Components.classes["@mozilla.org/filepicker;1"].createInstance(nsIFilePicker);
fp.init(window, gCalendarBundle.getString("Open"), nsIFilePicker.modeOpenMultiple); fp.init(window, gCalendarBundle.getString("Open"), nsIFilePicker.modeOpenMultiple);
fp.defaultExtension = "ics"; fp.defaultExtension = "ics";
fp.appendFilter( filterCalendar, "*" + extensionCalendar ); fp.appendFilter( filterCalendar, "*" + extensionCalendar );
fp.appendFilter( filterXcs, "*" + extensionXcs ); fp.appendFilter( filterXcs, "*" + extensionXcs );
fp.appendFilter( filterOutlookCsv, "*" + extensionCsv ); fp.appendFilter( filterOutlookCsv, "*" + extensionCsv );
fp.appendFilter( filtervCalendar, "*" + extensionvCalendar ); fp.appendFilter( filtervCalendar, "*" + extensionvCalendar );
fp.show(); fp.show();
var filesToAppend = fp.files; var filesToAppend = fp.files;
if (filesToAppend && filesToAppend.hasMoreElements()) if (filesToAppend && filesToAppend.hasMoreElements()) {
{ var calendarEventArray = new Array();
var calendarEventArray = new Array(); var duplicateEventArray = new Array();
var duplicateEventArray = new Array(); var calendarToDoArray = new Array();
var calendarToDoArray = new Array(); var duplicateToDoArray = new Array();
var duplicateToDoArray = new Array(); var currentFile;
var currentFile; var aDataStream;
var aDataStream; var i;
var i; var parsedEventArray = null, parsedToDoArray = null;
var parsedEventArray = null, parsedToDoArray = null; var date = new Date();
var date = new Date();
var promptService = Components.classes["@mozilla.org/embedcomp/prompt-service;1"].getService(); var promptService = Components.classes["@mozilla.org/embedcomp/prompt-service;1"].getService();
promptService = promptService.QueryInterface(Components.interfaces.nsIPromptService); promptService = promptService.QueryInterface(Components.interfaces.nsIPromptService);
var flags = ( promptService.BUTTON_TITLE_IS_STRING * promptService.BUTTON_POS_0 ) + var flags = ( promptService.BUTTON_TITLE_IS_STRING * promptService.BUTTON_POS_0 ) +
( promptService.BUTTON_TITLE_IS_STRING * promptService.BUTTON_POS_1 ) + ( promptService.BUTTON_TITLE_IS_STRING * promptService.BUTTON_POS_1 ) +
( promptService.BUTTON_TITLE_IS_STRING * promptService.BUTTON_POS_2 ); ( promptService.BUTTON_TITLE_IS_STRING * promptService.BUTTON_POS_2 );
var intoCalName = getSelectedCalendarNameOrDefault(); var intoCalName = getSelectedCalendarNameOrDefault();
var importAllStr = gCalendarBundle.getString( "importAll" ); var importAllStr = gCalendarBundle.getString( "importAll" );
var promptStr = gCalendarBundle.getString( "promptForEach" ); var promptStr = gCalendarBundle.getString( "promptForEach" );
var discardAllStr = gCalendarBundle.getString( "discardAll" ); var discardAllStr = gCalendarBundle.getString( "discardAll" );
var importNewEventsTitle = gCalendarBundle.getString( "aboutToImportNewEventsTitle" ); var importNewEventsTitle = gCalendarBundle.getString( "aboutToImportNewEventsTitle" );
var importDupEventsTitle = gCalendarBundle.getString( "aboutToImportDupEventsTitle" ); var importDupEventsTitle = gCalendarBundle.getString( "aboutToImportDupEventsTitle" );
var importNewTasksTitle = gCalendarBundle.getString( "aboutToImportNewTasksTitle" ); var importNewTasksTitle = gCalendarBundle.getString( "aboutToImportNewTasksTitle" );
var importDupTasksTitle = gCalendarBundle.getString( "aboutToImportDupTasksTitle" ); var importDupTasksTitle = gCalendarBundle.getString( "aboutToImportDupTasksTitle" );
var fromFileNames = ""; var fromFileNames = "";
while (filesToAppend.hasMoreElements()) // create a temp memory calendar to put all the events and todos in to
{ var tmpCalendar = getCalendarManager().createCalendar("tmpcal", "memory", null);
currentFile = filesToAppend.getNext().QueryInterface(Components.interfaces.nsILocalFile);
fromFileNames += (fromFileNames == "" ? "" : ", ") + currentFile.leafName;
aDataStream = readDataFromFile( currentFile.path, "UTF-8" );
switch (fp.filterIndex) { while (filesToAppend.hasMoreElements()) {
case 1 : // xcs: transform data into ics data currentFile = filesToAppend.getNext().QueryInterface(Components.interfaces.nsILocalFile);
aDataStream = transformXCSData( aDataStream ); fromFileNames += (fromFileNames == "" ? "" : ", ") + currentFile.leafName;
// fall thru to process ics data aDataStream = readDataFromFile( currentFile.path, "UTF-8" );
case 0 : // ics
case 3 : // vcs switch (fp.filterIndex) {
parsedEventArray = parseIcalEvents( aDataStream ); case 1 : // xcs: transform data into ics data
parsedToDoArray = parseIcalToDos( aDataStream ); aDataStream = transformXCSData( aDataStream );
break; // fall thru to process ics data
case 2: // csv case 0 : // ics
parsedEventArray = parseOutlookCSVEvents( aDataStream ); case 3 : // vcs
break; parseIcalEvents(tmpCalendar, aDataStream);
default: parseIcalToDos(tmpCalendar, aDataStream);
break; break;
case 2: // csv
parseOutlookCSVEvents(tmpCalendar, aDataStream);
break;
default:
break;
}
} }
if( parsedEventArray ) {
for( i = 0; i < parsedEventArray.length; i++ ) {
var parsedEvent = parsedEventArray[i];
date.setTime( parsedEvent.start.getTime() );
if( eventExists( date, parsedEvent.title ) )
duplicateEventArray[duplicateEventArray.length] = parsedEvent;
else
calendarEventArray[calendarEventArray.length] = parsedEvent;
}
}
if( parsedToDoArray ) {
for( i = 0; i < parsedToDoArray.length; i++ ) {
var parsedToDo = parsedToDoArray[i];
date.setTime( parsedToDo.start.getTime() );
if( toDoExists( date, parsedToDo.title ) )
duplicateToDoArray[duplicateToDoArray.length] = parsedToDo;
else
calendarToDoArray[calendarToDoArray.length] = parsedToDo;
}
}
}
var result = {value:0}; var listener = {
var buttonPressed; onOperationComplete: function(aCalendar, aStatus, aOperationType, aId, aDetail)
{
// delete the new calendar now that we're done with it
getCalendarManager().deleteCalendar(tmpCalendar);
}
};
// EVENTS:
if (calendarEventArray.length > 0) { appendCalendars(getCalendar(), [tmpCalendar], listener);
// Ask user what to import (all / prompt each / none)
var importNewEventsText = gCalendarBundle.getFormattedString( "aboutToImportNewEvents", [calendarEventArray.length, intoCalName, fromFileNames]); return true;
buttonPressed = promptService.confirmEx( window, importNewEventsTitle, importNewEventsText, flags,
// XXX handle all this stuff
var result = {value:0};
var buttonPressed;
// EVENTS:
if (calendarEventArray.length > 0) {
// Ask user what to import (all / prompt each / none)
var importNewEventsText = gCalendarBundle.getFormattedString( "aboutToImportNewEvents",
[calendarEventArray.length,
intoCalName, fromFileNames]);
buttonPressed = promptService.confirmEx( window, importNewEventsTitle, importNewEventsText,
flags, importAllStr, discardAllStr, promptStr,
null, result );
if(buttonPressed == 0) // Import all
addEventsToCalendar( calendarEventArray, true );
else if(buttonPressed == 2) // prompt
addEventsToCalendar( calendarEventArray );
//else if(buttonPressed == 1) // discard all
}
if (duplicateEventArray.length > 0) {
// Ask user what to do with duplicates
var importDupEventsText = gCalendarBundle.getFormattedString( "aboutToImportDupEvents",
[duplicateEventArray.length,
intoCalName, fromFileNames]);
buttonPressed = promptService.confirmEx( window, importDupEventsTitle, importDupEventsText, flags,
importAllStr, discardAllStr, promptStr,
null, result );
if(buttonPressed == 0) // Import all
addEventsToCalendar( duplicateEventArray, true );
else if(buttonPressed == 2) // Prompt for each
addEventsToCalendar( duplicateEventArray );
//else if(buttonPressed == 1) // Discard all
}
// TODOS
if (calendarToDoArray.length > 0) {
// Ask user what to import (all / prompt each / none)
var importNewTasksText = gCalendarBundle.getFormattedString( "aboutToImportNewTasks", [calendarToDoArray.length, intoCalName, fromFileNames]);
buttonPressed = promptService.confirmEx( window, importNewTasksTitle, importNewTasksText, flags,
importAllStr, discardAllStr, promptStr, importAllStr, discardAllStr, promptStr,
null, result ); null, result );
if(buttonPressed == 0) // Import all if(buttonPressed == 0) // Import all
addEventsToCalendar( calendarEventArray, true ); addToDosToCalendar( calendarToDoArray, true );
else if(buttonPressed == 2) // prompt else if(buttonPressed == 2) // prompt
addEventsToCalendar( calendarEventArray ); addToDosToCalendar( calendarToDoArray );
//else if(buttonPressed == 1) // discard all //else if(buttonPressed == 1) // discard all
} }
if (duplicateEventArray.length > 0) {
// Ask user what to do with duplicates // Ask user what to do with duplicates
var importDupEventsText = gCalendarBundle.getFormattedString( "aboutToImportDupEvents", [duplicateEventArray.length, intoCalName, fromFileNames]); if (duplicateToDoArray.length > 0) {
buttonPressed = promptService.confirmEx( window, importDupEventsTitle, importDupEventsText, flags, var importDupTasksText = gCalendarBundle.getFormattedString( "aboutToImportDupTasks", [duplicateToDoArray.length, intoCalName, fromFileNames]);
buttonPressed = promptService.confirmEx( window, importDupTasksTitle, importDupTasksText, flags,
importAllStr, discardAllStr, promptStr, importAllStr, discardAllStr, promptStr,
null, result ); null, result );
if(buttonPressed == 0) // Import all if(buttonPressed == 0) // Import all
addEventsToCalendar( duplicateEventArray, true ); addToDosToCalendar( duplicateToDoArray, true );
else if(buttonPressed == 2) // Prompt for each else if(buttonPressed == 2) // Prompt for each
addEventsToCalendar( duplicateEventArray ); addToDosToCalendar( duplicateToDoArray );
//else if(buttonPressed == 1) // Discard all //else if(buttonPressed == 1) // Discard all
} }
// TODOS // If there were no events or todos to import, let the user know
if (calendarToDoArray.length > 0) { //
// Ask user what to import (all / prompt each / none) if (calendarEventArray.length == 0 && duplicateEventArray.length == 0 &&
var importNewTasksText = gCalendarBundle.getFormattedString( "aboutToImportNewTasks", [calendarToDoArray.length, intoCalName, fromFileNames]); calendarToDoArray.length == 0 && duplicateToDoArray.length == 0)
buttonPressed = promptService.confirmEx( window, importNewTasksTitle, importNewTasksText, flags, alert( gCalendarBundle.getFormattedString( "noEventsOrTasksToImport", [fromFileNames] ) );
importAllStr, discardAllStr, promptStr, }
null, result ); return true;
if(buttonPressed == 0) // Import all
addToDosToCalendar( calendarToDoArray, true );
else if(buttonPressed == 2) // prompt
addToDosToCalendar( calendarToDoArray );
//else if(buttonPressed == 1) // discard all
}
// Ask user what to do with duplicates
if (duplicateToDoArray.length > 0) {
var importDupTasksText = gCalendarBundle.getFormattedString( "aboutToImportDupTasks", [duplicateToDoArray.length, intoCalName, fromFileNames]);
buttonPressed = promptService.confirmEx( window, importDupTasksTitle, importDupTasksText, flags,
importAllStr, discardAllStr, promptStr,
null, result );
if(buttonPressed == 0) // Import all
addToDosToCalendar( duplicateToDoArray, true );
else if(buttonPressed == 2) // Prompt for each
addToDosToCalendar( duplicateToDoArray );
//else if(buttonPressed == 1) // Discard all
}
// If there were no events or todos to import, let the user know
//
if (calendarEventArray.length == 0 && duplicateEventArray.length == 0 &&
calendarToDoArray.length == 0 && duplicateToDoArray.length == 0)
alert( gCalendarBundle.getFormattedString( "noEventsOrTasksToImport", [fromFileNames] ) );
}
return true;
} }
@ -895,36 +896,22 @@ function parseOutlookTextField(args, textIndexName, eventFields)
/**** parseIcalEvents /**** parseIcalEvents
* *
* Takes a text block of iCalendar events and tries to split that into individual events. * Takes a text block of iCalendar events and tries to split that into individual events.
* Parses those events and returns an array of calendarEvents. * Parses those events and adds them to a calendar.
*/ */
function parseIcalEvents( icalStr ) function parseIcalEvents(calendar, icalStr)
{ {
var calendarEventArray = new Array(); for (var i=0, j=0; (i = icalStr.indexOf("BEGIN:VEVENT", j)) != -1; ) {
// try to find the begin and end of an event. ParseIcalString does not support VCALENDAR
j = icalStr.indexOf("END:VEVENT", i + "BEGIN:VEVENT".length);
j = (j == -1? icalStr.length : j + "END:VEVENT".length);
for(var i=0, j=0; (i = icalStr.indexOf("BEGIN:VEVENT", j)) != -1; ) var eventData = icalStr.substring(i, j);
{ var calendarEvent = createEvent();
// try to find the begin and end of an event. ParseIcalString does not support VCALENDAR calendarEvent.icalString = eventData;
j = icalStr.indexOf("END:VEVENT", i + "BEGIN:VEVENT".length);
j = (j == -1? icalStr.length : j + "END:VEVENT".length);
var eventData = icalStr.substring(i, j);
var calendarEvent = createEvent(); calendar.addItem(calendarEvent, null);
}
// if parsing import iCalendar failed, add data as description
if ( !calendarEvent.parseIcalString(eventData) )
{
// initialize start and end dates.
initCalendarEvent( calendarEvent );
// Save the parsed text as description.
calendarEvent.description = eventData;
}
calendarEventArray[ calendarEventArray.length ] = calendarEvent;
}
return calendarEventArray;
} }
/**** parseIcalToDos /**** parseIcalToDos
@ -933,33 +920,19 @@ function parseIcalEvents( icalStr )
* Parses those toDos and returns an array of calendarToDos. * Parses those toDos and returns an array of calendarToDos.
*/ */
function parseIcalToDos( icalStr ) function parseIcalToDos(calendar, icalStr)
{ {
var calendarToDoArray = new Array(); for(var i=0, j=0; (i = icalStr.indexOf("BEGIN:VTODO", j)) != -1; ) {
for(var i=0, j=0; (i = icalStr.indexOf("BEGIN:VTODO", j)) != -1; )
{
// try to find the begin and end of an toDo. ParseIcalString does not support VCALENDAR // try to find the begin and end of an toDo. ParseIcalString does not support VCALENDAR
j = icalStr.indexOf("END:VTODO", i + "BEGIN:VTODO".length); j = icalStr.indexOf("END:VTODO", i + "BEGIN:VTODO".length);
j = (j == -1? icalStr.length : j + "END:VTODO".length); j = (j == -1? icalStr.length : j + "END:VTODO".length);
var toDoData = icalStr.substring(i, j);
var eventData = icalStr.substring(i, j);
var calendarToDo = createToDo(); var calendarToDo = createToDo();
calendarToDo.icalString = eventData;
// if parsing import iCalendar failed, add data as description calendar.addItem(calendarToDo, null);
if ( !calendarToDo.parseIcalString(toDoData) )
{
// initialize start and end dates.
initCalendarToDo( calendarToDo );
// Save the parsed text as description.
calendarToDo.description = toDoData;
}
calendarToDoArray[ calendarToDoArray.length ] = calendarToDo;
} }
return calendarToDoArray;
} }
/**** transformXCSData: transform into ics data /**** transformXCSData: transform into ics data
@ -2013,6 +1986,7 @@ function getXmlDocument ( eventList )
} }
function startImport() { function startImport() {
/*
var ImportExportErrorHandler = { var ImportExportErrorHandler = {
errorreport : "", errorreport : "",
onLoad : function() {}, onLoad : function() {},
@ -2033,7 +2007,10 @@ function startImport() {
} }
gICalLib.addObserver( ImportExportErrorHandler ); gICalLib.addObserver( ImportExportErrorHandler );
loadEventsFromFile();
ImportExportErrorHandler.showErrors(); ImportExportErrorHandler.showErrors();
gICalLib.removeObserver( ImportExportErrorHandler ); gICalLib.removeObserver( ImportExportErrorHandler );
*/
loadEventsFromFile();
} }