702 lines
19 KiB
JavaScript
702 lines
19 KiB
JavaScript
/* -*- Mode: Java; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
|
|
*
|
|
* 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 mozilla.org code.
|
|
*
|
|
* The Initial Developer of the Original Code is Netscape
|
|
* Communications Corporation. Portions created by Netscape are
|
|
* Copyright (C) 1999 Netscape Communications Corporation. All
|
|
* Rights Reserved.
|
|
*
|
|
* Contributor(s):
|
|
*/
|
|
|
|
var importType = 0;
|
|
var bundle = 0;
|
|
var importService = 0;
|
|
var successStr = null;
|
|
var errorStr = null;
|
|
var progressInfo = null;
|
|
var selectedModuleName = null;
|
|
|
|
function GetBundleString( strId)
|
|
{
|
|
try {
|
|
return( top.bundle.GetStringFromName( strId));
|
|
} catch( ex) {
|
|
}
|
|
|
|
return( "String Bundle Bad");
|
|
}
|
|
|
|
function OnLoadImportDialog()
|
|
{
|
|
top.bundle = srGetStrBundle("chrome://messenger/locale/importMsgs.properties");
|
|
top.importService = Components.classes["component://mozilla/import/import-service"].createInstance();
|
|
top.importService = top.importService.QueryInterface(Components.interfaces.nsIImportService);
|
|
|
|
top.progressInfo = new Object();
|
|
top.progressInfo.progressWindow = null;
|
|
top.progressInfo.importInterface = null;
|
|
top.progressInfo.mainWindow = top.window;
|
|
top.progressInfo.intervalState = 0;
|
|
top.progressInfo.importSuccess = false;
|
|
top.progressInfo.importType = null;
|
|
|
|
doSetOKCancel(ImportDialogOKButton, 0);
|
|
|
|
// look in arguments[0] for parameters
|
|
if (window.arguments && window.arguments[0] && window.arguments.importType)
|
|
{
|
|
// keep parameters in global for later
|
|
top.importType = window.arguments[0].importType;
|
|
top.progressInfo.importType = top.importType;
|
|
}
|
|
else
|
|
{
|
|
top.importType = "addressbook";
|
|
top.progressInfo.importType = "addressbook";
|
|
}
|
|
|
|
SetUpImportType();
|
|
}
|
|
|
|
|
|
function SetUpImportType()
|
|
{
|
|
// set dialog title
|
|
switch ( top.importType )
|
|
{
|
|
case "mail":
|
|
// top.window.title = top.bundle.GetStringFromName('ImportMailDialogTitle');
|
|
SetDivText('listLabel', GetBundleString('ImportMailListLabel'));
|
|
document.getElementById( "mailRadio").checked = true;
|
|
document.getElementById( "addressbookRadio").checked = false;
|
|
document.getElementById( "settingsRadio").checked = false;
|
|
break;
|
|
case "addressbook":
|
|
// top.window.title = top.bundle.GetStringFromName('ImportAddressBooksDialogTitle');
|
|
SetDivText('listLabel', GetBundleString('ImportAddressBooksListLabel'));
|
|
document.getElementById( "addressbookRadio").checked = true;
|
|
document.getElementById( "mailRadio").checked = false;
|
|
document.getElementById( "settingsRadio").checked = false;
|
|
break;
|
|
case "settings":
|
|
// top.window.title = top.bundle.GetStringFromName('ImportSettingsDialogTitle');
|
|
SetDivText('listLabel', GetBundleString('ImportSettingsListLabel'));
|
|
document.getElementById( "settingsRadio").checked = true;
|
|
document.getElementById( "addressbookRadio").checked = false;
|
|
document.getElementById( "mailRadio").checked = false;
|
|
break;
|
|
}
|
|
|
|
ListModules();
|
|
}
|
|
|
|
|
|
function SetDivText(id, text)
|
|
{
|
|
var div = document.getElementById(id);
|
|
|
|
if ( div )
|
|
{
|
|
if ( div.childNodes.length == 0 )
|
|
{
|
|
var textNode = document.createTextNode(text);
|
|
div.appendChild(textNode);
|
|
}
|
|
else if ( div.childNodes.length == 1 ) {
|
|
div.childNodes[0].nodeValue = text;
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
function ImportDialogOKButton()
|
|
{
|
|
var tree = document.getElementById('moduleList');
|
|
if ( tree && tree.selectedItems && (tree.selectedItems.length == 1) )
|
|
{
|
|
var index = tree.selectedItems[0].getAttribute('list-index');
|
|
var module = top.importService.GetModule( top.importType, index);
|
|
var name = top.importService.GetModuleName( top.importType, index);
|
|
top.selectedModuleName = name;
|
|
if (module != null)
|
|
{
|
|
switch( top.importType )
|
|
{
|
|
case "mail":
|
|
top.successStr = Components.classes["component://netscape/supports-wstring"].createInstance();
|
|
if (top.successStr != null) {
|
|
top.successStr = top.successStr.QueryInterface( Components.interfaces.nsISupportsWString);
|
|
}
|
|
top.errorStr = Components.classes["component://netscape/supports-wstring"].createInstance();
|
|
if (top.errorStr != null)
|
|
top.errorStr = top.errorStr.QueryInterface( Components.interfaces.nsISupportsWString);
|
|
|
|
if (ImportMail( module, top.successStr, top.errorStr) == true)
|
|
{
|
|
// We think it was a success, either, we need to
|
|
// wait for the import to finish
|
|
// or we are done!
|
|
if (top.progressInfo.importInterface == null) {
|
|
ShowMailComplete( true);
|
|
return( true);
|
|
}
|
|
else {
|
|
var meterText = GetBundleString( 'MailProgressMeterText') + " " + name;
|
|
// show the progress window...
|
|
top.window.openDialog(
|
|
"chrome://messenger/content/importProgress.xul",
|
|
"",
|
|
"chrome,modal",
|
|
{windowTitle: GetBundleString( 'MailProgressTitle'),
|
|
progressTitle: meterText,
|
|
progressStatus: "",
|
|
progressInfo: top.progressInfo});
|
|
|
|
dump( "*** Returned from progress window\n");
|
|
|
|
return( true);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
ShowMailComplete( false);
|
|
return( false);
|
|
}
|
|
break;
|
|
|
|
case "addressbook":
|
|
top.successStr = Components.classes["component://netscape/supports-wstring"].createInstance();
|
|
if (top.successStr != null) {
|
|
top.successStr = top.successStr.QueryInterface( Components.interfaces.nsISupportsWString);
|
|
}
|
|
top.errorStr = Components.classes["component://netscape/supports-wstring"].createInstance();
|
|
if (top.errorStr != null)
|
|
top.errorStr = top.errorStr.QueryInterface( Components.interfaces.nsISupportsWString);
|
|
|
|
if (ImportAddress( module, top.successStr, top.errorStr) == true)
|
|
{
|
|
// We think it was a success, either, we need to
|
|
// wait for the import to finish
|
|
// or we are done!
|
|
if (top.progressInfo.importInterface == null) {
|
|
ShowAddressComplete( true);
|
|
return( true);
|
|
}
|
|
else {
|
|
var meterText = GetBundleString( 'AddrProgressMeterText') + " " + name;
|
|
// show the progress window...
|
|
top.window.openDialog(
|
|
"chrome://messenger/content/importProgress.xul",
|
|
"",
|
|
"chrome,modal",
|
|
{windowTitle: GetBundleString( 'AddrProgressTitle'),
|
|
progressTitle: meterText,
|
|
progressStatus: "",
|
|
progressInfo: top.progressInfo});
|
|
|
|
return( true);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
ShowAddressComplete( false);
|
|
return( false);
|
|
}
|
|
break;
|
|
|
|
case "settings":
|
|
var error = new Object();
|
|
error.value = null;
|
|
var newAccount = new Object();
|
|
if (!ImportSettings( module, newAccount, error))
|
|
{
|
|
if (error.value != null)
|
|
{
|
|
// Show error alert with error
|
|
// information
|
|
alert( GetBundleString( 'ImportSettingsError') + name + ":\n" + error.value);
|
|
}
|
|
// the user canceled the operation, shoud we dismiss
|
|
// this dialog or not?
|
|
return false;
|
|
}
|
|
else
|
|
{
|
|
// Alert to show success
|
|
alert( GetBundleString( 'ImportSettingsSuccess') + name);
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
|
|
function ImportSelectionChanged()
|
|
{
|
|
var tree = document.getElementById('moduleList');
|
|
if ( tree && tree.selectedItems && (tree.selectedItems.length == 1) )
|
|
{
|
|
var index = tree.selectedItems[0].getAttribute('list-index');
|
|
SetDivText('description', top.importService.GetModuleDescription(top.importType, index));
|
|
}
|
|
}
|
|
|
|
function ListModules() {
|
|
if (top.importService == null)
|
|
return;
|
|
|
|
var body = document.getElementById( "bucketBody");
|
|
var max = body.childNodes.length - 1;
|
|
while (max >= 0) {
|
|
body.removeChild( body.childNodes[max]);
|
|
max--;
|
|
}
|
|
|
|
var count = top.importService.GetModuleCount( top.importType);
|
|
for (var i = 0; i < count; i++) {
|
|
AddModuleToList( top.importService.GetModuleName( top.importType, i), i);
|
|
}
|
|
}
|
|
|
|
function AddModuleToList(moduleName, index)
|
|
{
|
|
var body = document.getElementById("bucketBody");
|
|
|
|
var item = document.createElement('treeitem');
|
|
var row = document.createElement('treerow');
|
|
var cell = document.createElement('treecell');
|
|
cell.setAttribute('value', moduleName);
|
|
item.setAttribute('list-index', index);
|
|
|
|
row.appendChild(cell);
|
|
item.appendChild(row);
|
|
body.appendChild(item);
|
|
}
|
|
|
|
|
|
function ContinueImport( info) {
|
|
var isMail = false;
|
|
|
|
/* dump( "*** ContinueImport\n"); */
|
|
|
|
if (info.importType == 'mail')
|
|
isMail = true;
|
|
else
|
|
isMail = false;
|
|
|
|
var clear = true;
|
|
if (info.importInterface) {
|
|
if (!info.importInterface.ContinueImport()) {
|
|
info.importSuccess = false;
|
|
clearInterval( info.intervalState);
|
|
if (info.progressWindow != null) {
|
|
info.progressWindow.close();
|
|
info.progressWindow = null;
|
|
}
|
|
|
|
if (isMail == true)
|
|
ShowMailComplete( false);
|
|
else
|
|
ShowAddressComplete( false);
|
|
}
|
|
else if ((pcnt = info.importInterface.GetProgress()) < 100) {
|
|
clear = false;
|
|
if (info.progressWindow != null) {
|
|
if (pcnt < 5)
|
|
pcnt = 5;
|
|
info.progressWindow.SetProgress( pcnt);
|
|
if (isMail == true) {
|
|
var mailName = info.importInterface.GetData( "currentMailbox");
|
|
if (mailName != null) {
|
|
mailName = mailName.QueryInterface( Components.interfaces.nsISupportsWString);
|
|
if (mailName != null)
|
|
info.progressWindow.SetDivText( 'progressStatus', mailName.data);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
else {
|
|
clearInterval( info.intervalState);
|
|
info.importSuccess = true;
|
|
if (info.progressWindow != null) {
|
|
info.progressWindow.close();
|
|
info.progressWindow = null;
|
|
}
|
|
|
|
if (isMail == true)
|
|
ShowMailComplete( true);
|
|
else
|
|
ShowAddressComplete( true);
|
|
}
|
|
}
|
|
else {
|
|
dump( "*** ERROR: info.importInterface is null\n");
|
|
}
|
|
|
|
if (clear == true) {
|
|
info.intervalState = null;
|
|
info.importInterface = null;
|
|
}
|
|
}
|
|
|
|
|
|
function ShowMailComplete( good)
|
|
{
|
|
var str = null;
|
|
if (good == true) {
|
|
str = GetBundleString( 'ImportMailSuccess');
|
|
if ((top.selectedModuleName != null) && (top.selectedModuleName.length > 0))
|
|
str += " " + top.selectedModuleName;
|
|
str += "\n";
|
|
str += "\n" + top.successStr.data;
|
|
if ((top.errorStr.data != null) && (top.errorStr.data.length > 0))
|
|
str += "\n" + "\n" + top.errorStr.data;
|
|
}
|
|
else {
|
|
if ((top.errorStr.data != null) && (top.errorStr.data.length > 0)) {
|
|
str = GetBundleString( 'ImportMailFailed');
|
|
str += "\n" + top.errorStr.data;
|
|
}
|
|
}
|
|
|
|
if (str != null)
|
|
alert( str);
|
|
}
|
|
|
|
|
|
function ShowAddressComplete( good)
|
|
{
|
|
var str = null;
|
|
if (good == true) {
|
|
str = GetBundleString( 'ImportAddressSuccess');
|
|
if ((top.selectedModuleName != null) && (top.selectedModuleName.length > 0))
|
|
str += " " + top.selectedModuleName;
|
|
str += "\n";
|
|
str += "\n" + top.successStr.data;
|
|
}
|
|
else {
|
|
if ((top.errorStr.data != null) && (top.errorStr.data.length > 0)) {
|
|
str = GetBundleString( 'ImportAddressFailed');
|
|
str += "\n" + top.errorStr.data;
|
|
}
|
|
}
|
|
|
|
if (str != null)
|
|
alert( str);
|
|
}
|
|
|
|
|
|
/*
|
|
Import Settings from a specific module, returns false if it failed
|
|
and true if successful. A "local mail" account is returned in newAccount.
|
|
This is only useful in upgrading - import the settings first, then
|
|
import mail into the account returned from ImportSettings, then
|
|
import address books.
|
|
An error string is returned as error.value
|
|
*/
|
|
function ImportSettings( module, newAccount, error) {
|
|
var setIntf = module.GetImportInterface( "settings");
|
|
if (setIntf != null)
|
|
setIntf = setIntf.QueryInterface( Components.interfaces.nsIImportSettings);
|
|
if (setIntf == null) {
|
|
error.value = GetBundleString( 'ImportSettingsBadModule');
|
|
return( false);
|
|
}
|
|
|
|
// determine if we can auto find the settings or if we need to ask the user
|
|
var location = new Object();
|
|
var description = new Object();
|
|
var result = setIntf.AutoLocate( description, location);
|
|
if (result == false) {
|
|
// In this case, we couldn't not find the settings
|
|
if (location.value != null) {
|
|
// Settings were not found, however, they are specified
|
|
// in a file, so ask the user for the settings file.
|
|
var filePicker = Components.classes["component://netscape/filespecwithui"].createInstance();
|
|
if (filePicker != null) {
|
|
filePicker = filePicker.QueryInterface( Components.interfaces.nsIFileSpecWithUI);
|
|
if (filePicker != null) {
|
|
// filePicker.create( window.top, "Select settings file", filePicker.modeLoad);
|
|
try {
|
|
filePicker.chooseInputFile( "Select settings file", filePicker.eAllFiles, null, null);
|
|
setIntf.SetLocation( filePicker.QueryInterface( Components.interfaces.nsIFileSpec));
|
|
} catch( ex) {
|
|
error.value = null;
|
|
return( false);
|
|
}
|
|
}
|
|
else {
|
|
error.value = GetBundleString( 'ImportSettingsNotFound');
|
|
return( false);
|
|
}
|
|
}
|
|
else {
|
|
error.value = GetBundleString( 'ImportSettingsNotFound');
|
|
return( false);
|
|
}
|
|
}
|
|
else {
|
|
error.value = GetBundleString( 'ImportSettingsNotFound');
|
|
return( false);
|
|
}
|
|
}
|
|
|
|
// interesting, we need to return the account that new
|
|
// mail should be imported into?
|
|
// that's really only useful for "Upgrade"
|
|
var result = setIntf.Import( newAccount);
|
|
if (result == false) {
|
|
error.value = GetBundleString( 'ImportSettingsFailed');
|
|
}
|
|
return( result);
|
|
}
|
|
|
|
function CreateNewFileSpec( inFile)
|
|
{
|
|
var file = Components.classes["component://netscape/filespec"].createInstance();
|
|
if (file != null) {
|
|
file = file.QueryInterface( Components.interfaces.nsIFileSpec);
|
|
if (file != null) {
|
|
file.fromFileSpec( inFile);
|
|
}
|
|
}
|
|
|
|
return( file);
|
|
}
|
|
|
|
function ImportMail( module, success, error) {
|
|
if (top.progressInfo.importInterface || top.progressInfo.intervalState) {
|
|
error.data = GetBundleString( 'ImportAlreadyInProgress');
|
|
return( false);
|
|
}
|
|
|
|
top.progressInfo.importSuccess = false;
|
|
|
|
var mailInterface = module.GetImportInterface( "mail");
|
|
if (mailInterface != null)
|
|
mailInterface = mailInterface.QueryInterface( Components.interfaces.nsIImportGeneric);
|
|
if (mailInterface == null) {
|
|
error.data = GetBundleString( 'ImportMailBadModule');
|
|
return( false);
|
|
}
|
|
|
|
var loc = mailInterface.GetData( "mailLocation");
|
|
|
|
if (loc == null) {
|
|
// No location found, check to see if we can ask the user.
|
|
if (mailInterface.GetStatus( "canUserSetLocation") != 0) {
|
|
var filePicker = Components.classes["component://netscape/filespecwithui"].createInstance();
|
|
if (filePicker != null) {
|
|
filePicker = filePicker.QueryInterface( Components.interfaces.nsIFileSpecWithUI);
|
|
if (filePicker != null) {
|
|
try {
|
|
filePicker.chooseDirectory( "Select mail directory");
|
|
mailInterface.SetData( "mailLocation", CreateNewFileSpec( filePicker.QueryInterface( Components.interfaces.nsIFileSpec)));
|
|
} catch( ex) {
|
|
// don't show an error when we return!
|
|
return( false);
|
|
}
|
|
}
|
|
else {
|
|
error.data = GetBundleString( 'ImportMailNotFound');
|
|
return( false);
|
|
}
|
|
}
|
|
else {
|
|
error.data = GetBundleString( 'ImportMailNotFound');
|
|
return( false);
|
|
}
|
|
}
|
|
else {
|
|
error.data = GetBundleString( 'ImportMailNotFound');
|
|
return( false);
|
|
}
|
|
}
|
|
|
|
if (mailInterface.WantsProgress()) {
|
|
if (mailInterface.BeginImport( success, error)) {
|
|
top.progressInfo.importInterface = mailInterface;
|
|
// top.intervalState = setInterval( "ContinueImport()", 100);
|
|
return( true);
|
|
}
|
|
else {
|
|
return( false);
|
|
}
|
|
}
|
|
else {
|
|
dump( "*** WantsProgress returned false\n");
|
|
|
|
if (mailInterface.BeginImport( success, error)) {
|
|
return( true);
|
|
}
|
|
else {
|
|
return( false);
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
// The address import! A little more complicated than the mail import
|
|
// due to field maps...
|
|
function ImportAddress( module, success, error) {
|
|
if (top.progressInfo.importInterface || top.progressInfo.intervalState) {
|
|
error.data = GetBundleString( 'ImportAlreadyInProgress');
|
|
return( false);
|
|
}
|
|
|
|
top.progressInfo.importSuccess = false;
|
|
|
|
var addInterface = module.GetImportInterface( "addressbook");
|
|
if (addInterface != null)
|
|
addInterface = addInterface.QueryInterface( Components.interfaces.nsIImportGeneric);
|
|
if (addInterface == null) {
|
|
error.data = GetBundleString( 'ImportAddressBadModule');
|
|
return( false);
|
|
}
|
|
|
|
|
|
var loc = addInterface.GetStatus( "autoFind");
|
|
if (loc == false) {
|
|
loc = addInterface.GetData( "addressLocation");
|
|
if (loc != null) {
|
|
loc = loc.QueryInterface( Components.interfaces.nsIFileSpec);
|
|
if (loc != null) {
|
|
if (!loc.exists)
|
|
loc = null;
|
|
}
|
|
}
|
|
}
|
|
|
|
if (loc == null) {
|
|
// Couldn't find the address book, see if we can
|
|
// as the user for the location or not?
|
|
if (addInterface.GetStatus( "canUserSetLocation") == 0) {
|
|
// an autofind address book that could not be found!
|
|
error.data = GetBundleString( 'ImportAddressNotFound');
|
|
return( false);
|
|
}
|
|
|
|
var filePicker = Components.classes["component://netscape/filespecwithui"].createInstance();
|
|
if (filePicker != null) {
|
|
filePicker = filePicker.QueryInterface( Components.interfaces.nsIFileSpecWithUI);
|
|
if (filePicker == null) {
|
|
error.data = GetBundleString( 'ImportAddressNotFound');
|
|
return( false);
|
|
}
|
|
}
|
|
else {
|
|
error.data = GetBundleString( 'ImportAddressNotFound');
|
|
return( false);
|
|
}
|
|
|
|
// The address book location was not found.
|
|
// Determine if we need to ask for a directory
|
|
// or a single file.
|
|
var file = null;
|
|
if (addInterface.GetStatus( "supportsMultiple") != 0) {
|
|
// ask for dir
|
|
try {
|
|
filePicker.chooseDirectory( "Select address book directory");
|
|
file = filePicker.QueryInterface( Components.interfaces.nsIFileSpec);
|
|
} catch( ex) {
|
|
file = null;
|
|
}
|
|
}
|
|
else {
|
|
// ask for file
|
|
try {
|
|
filePicker.chooseInputFile( "Select address book file", filePicker.eAllFiles, null, null);
|
|
file = filePicker.QueryInterface( Components.interfaces.nsIFileSpec);
|
|
} catch( ex) {
|
|
file = null;
|
|
}
|
|
}
|
|
|
|
if (file == null) {
|
|
return( false);
|
|
}
|
|
|
|
file = CreateNewFileSpec( file);
|
|
|
|
addInterface.SetData( "addressLocation", file);
|
|
}
|
|
|
|
var map = addInterface.GetData( "fieldMap");
|
|
if (map != null) {
|
|
map = map.QueryInterface( Components.interfaces.nsIImportFieldMap);
|
|
if (map != null) {
|
|
var result = new Object();
|
|
result.ok = false;
|
|
top.window.openDialog(
|
|
"chrome://messenger/content/fieldMapImport.xul",
|
|
"",
|
|
"chrome,modal",
|
|
{fieldMap: map,
|
|
addInterface: addInterface,
|
|
result: result});
|
|
}
|
|
if (result.ok == false)
|
|
return( false);
|
|
}
|
|
|
|
if (addInterface.WantsProgress()) {
|
|
if (addInterface.BeginImport( success, error)) {
|
|
top.progressInfo.importInterface = addInterface;
|
|
// top.intervalState = setInterval( "ContinueImport()", 100);
|
|
return( true);
|
|
}
|
|
else {
|
|
return( false);
|
|
}
|
|
}
|
|
else {
|
|
if (addInterface.BeginImport( success, error)) {
|
|
return( true);
|
|
}
|
|
else {
|
|
return( false);
|
|
}
|
|
}
|
|
}
|
|
|
|
function SwitchType( newType)
|
|
{
|
|
top.importType = newType;
|
|
top.progressInfo.importType = newType;
|
|
|
|
SetUpImportType();
|
|
|
|
SetDivText('description', "");
|
|
}
|
|
|
|
function OnMailType()
|
|
{
|
|
SwitchType( "mail");
|
|
}
|
|
|
|
function OnSettingsType()
|
|
{
|
|
SwitchType( "settings");
|
|
}
|
|
|
|
function OnAddressType()
|
|
{
|
|
SwitchType( "addressbook");
|
|
}
|
|
|