diff options
Diffstat (limited to 'mailnews/base/prefs/content/ispUtils.js')
-rw-r--r-- | mailnews/base/prefs/content/ispUtils.js | 166 |
1 files changed, 166 insertions, 0 deletions
diff --git a/mailnews/base/prefs/content/ispUtils.js b/mailnews/base/prefs/content/ispUtils.js new file mode 100644 index 000000000..7735d8a47 --- /dev/null +++ b/mailnews/base/prefs/content/ispUtils.js @@ -0,0 +1,166 @@ +/* -*- Mode: Java; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +// using the rdf service extensively here +var rdf = Components.classes["@mozilla.org/rdf/rdf-service;1"].getService(Components.interfaces.nsIRDFService); + +// all the RDF resources we'll be retrieving +var NC = "http://home.netscape.com/NC-rdf#"; +var Server = rdf.GetResource(NC + "Server"); +var SmtpServer = rdf.GetResource(NC + "SmtpServer"); +var ServerHost = rdf.GetResource(NC + "ServerHost"); +var ServerType = rdf.GetResource(NC + "ServerType"); +var PrefixIsUsername = rdf.GetResource(NC + "PrefixIsUsername"); +var UseAuthenticatedSmtp= rdf.GetResource(NC + "UseAuthenticatedSmtp"); + +// this is possibly expensive, not sure what to do here +var ispDefaults; + +var nsIRDFResource = Components.interfaces.nsIRDFResource; +var nsIRDFLiteral = Components.interfaces.nsIRDFLiteral; + +var ispRoot = rdf.GetResource("NC:ispinfo"); + +// given an ISP's domain URI, look up all relevant information about it +function getIspDefaultsForUri(domainURI) +{ + if (!ispDefaults) + ispDefaults = rdf.GetDataSource("rdf:ispdefaults"); + + var domainRes = rdf.GetResource(domainURI); + + var result = dataSourceToObject(ispDefaults, domainRes); + + if (!result) return null; + + // The domainURI should be in the format domain:example.com. (Where + // example.com is the domain name to use for all email addresses). If + // it does not match this pattern, then it is possible no domain + // has been specified, so we should leave it uninitialized. + if (domainURI.startsWith("domain:")) { + // add this extra attribute which is the domain itself + var domainData = domainURI.split(':'); + if (domainData.length > 1) { + // To faciltate distributing two different account types for one ISP, + // it's possible to add parameters to the domain URI + // - e.g. domain:example.com?type=imap. + // This is necessary so RDF doesn't think they're the same. + + // Save the domain, but only the part up to the (possible) question mark. + result.domain = domainData[1].replace(/\?.*/, ""); + } + } + return result; +} + +// construct an ISP's domain URI based on it's domain +// (i.e. turns example.com -> domain:example.com) +function getIspDefaultsForDomain(domain) { + let domainURI = "domain:" + domain; + return getIspDefaultsForUri(domainURI); +} + +// Given an email address (like "joe@example.com") look up +function getIspDefaultsForEmail(email) { + + var emailData = getEmailInfo(email); + + var ispData = null; + if (emailData) + ispData = getIspDefaultsForDomain(emailData.domain); + + prefillIspData(ispData, email); + + return ispData; +} + +// given an email address, split it into username and domain +// return in an associative array +function getEmailInfo(email) { + if (!email) return null; + + var result = new Object; + + var emailData = email.split('@'); + + if (emailData.length != 2) { + dump("bad e-mail address!\n"); + return null; + } + + // all the variables we'll be returning + result.username = emailData[0]; + result.domain = emailData[1]; + + return result; +} + +function prefillIspData(ispData, email, fullName) { + if (!ispData) return; + + // make sure these objects exist + if (!ispData.identity) ispData.identity = new Object; + if (!ispData.incomingServer) ispData.incomingServer = new Object; + + // fill in e-mail if it's not already there + if (email && !ispData.identity.email) + ispData.identity.email = email; + + var emailData = getEmailInfo(email); + if (emailData) { + + // fill in the username (assuming the ISP doesn't prevent it) + if (!ispData.incomingServer.userName && + !ispData.incomingServer.noDefaultUsername) + ispData.incomingServer.username = emailData.username; + } +} + +// this function will extract an entire datasource into a giant +// associative array for easy retrieval from JS +var NClength = NC.length; +function dataSourceToObject(datasource, root) +{ + var result = null; + var arcs = datasource.ArcLabelsOut(root); + + while (arcs.hasMoreElements()) { + var arc = arcs.getNext().QueryInterface(nsIRDFResource); + + var arcName = arc.Value; + arcName = arcName.substring(NClength, arcName.length); + + if (!result) result = new Object; + + var target = datasource.GetTarget(root, arc, true); + + var value; + var targetHasChildren = false; + try { + target = target.QueryInterface(nsIRDFResource); + targetHasChildren = true; + } catch (ex) { + target = target.QueryInterface(nsIRDFLiteral); + } + + if (targetHasChildren) + value = dataSourceToObject(datasource, target); + else { + value = target.Value; + + // fixup booleans/numbers/etc + if (value == "true") value = true; + else if (value == "false") value = false; + else { + var num = Number(value); + if (!isNaN(num)) value = num; + } + } + + // add this value + result[arcName] = value; + } + return result; +} |