scott%scott-macgregor.org 2ab40a2847 Bug #250247 --> Framework work for News & Blog account settings for Thunderbird.
newsblog.js is now an account manager extension so it can overlay custom panels into the account manager.

Implement "download new articles at startup". Implement Check for new articles every n minutes.

Add a property on nsIMsgIncomingServer that allows the incoming server
to specify the main account manager xul file that is loaded for that server
instead of hard coding am-main.xul in the account manager data source.


git-svn-id: svn://10.0.0.236/trunk@159012 18797224-902f-48f8-a5cc-f745e15eee43
2004-07-10 22:52:48 +00:00

265 lines
8.3 KiB
JavaScript
Executable File

// XXX Rename this to global.js
// Whether or not to dump debugging messages to the console.
const DEBUG = true;
var debug;
if (DEBUG)
debug = function(msg) { dump(' -- FZ -- : ' + msg + '\n'); }
else
debug = function() {}
var rdf =
Components
.classes["@mozilla.org/rdf/rdf-service;1"]
.getService(Components.interfaces.nsIRDFService);
const RDF_NS = "http://www.w3.org/1999/02/22-rdf-syntax-ns#";
const RDF_TYPE = rdf.GetResource(RDF_NS + "type");
const RSS_NS = "http://purl.org/rss/1.0/";
const RSS_CHANNEL = rdf.GetResource(RSS_NS + "channel");
const RSS_TITLE = rdf.GetResource(RSS_NS + "title");
const RSS_DESCRIPTION = rdf.GetResource(RSS_NS + "description");
const RSS_ITEMS = rdf.GetResource(RSS_NS + "items");
const RSS_ITEM = rdf.GetResource(RSS_NS + "item");
const RSS_LINK = rdf.GetResource(RSS_NS + "link");
const RSS_CONTENT_NS = "http://purl.org/rss/1.0/modules/content/";
const RSS_CONTENT_ENCODED = rdf.GetResource(RSS_CONTENT_NS + "encoded");
const DC_NS = "http://purl.org/dc/elements/1.1/";
const DC_CREATOR = rdf.GetResource(DC_NS + "creator");
const DC_SUBJECT = rdf.GetResource(DC_NS + "subject");
const DC_DATE = rdf.GetResource(DC_NS + "date");
const DC_TITLE = rdf.GetResource(DC_NS + "title");
const DC_IDENTIFIER = rdf.GetResource(DC_NS + "identifier");
const FZ_NS = "urn:forumzilla:";
const FZ_ROOT = rdf.GetResource(FZ_NS + "root");
const FZ_FEEDS = rdf.GetResource(FZ_NS + "feeds");
const FZ_FEED = rdf.GetResource(FZ_NS + "feed");
const FZ_QUICKMODE = rdf.GetResource(FZ_NS + "quickMode");
const FZ_DESTFOLDER = rdf.GetResource(FZ_NS + "destFolder");
const FZ_STORED = rdf.GetResource(FZ_NS + "stored");
const FZ_VALID = rdf.GetResource(FZ_NS + "valid");
const RDF_LITERAL_TRUE = rdf.GetLiteral("true");
const RDF_LITERAL_FALSE = rdf.GetLiteral("false");
// XXX There's a containerutils in forumzilla.js that this should be merged with.
var containerUtils =
Components
.classes["@mozilla.org/rdf/container-utils;1"]
.getService(Components.interfaces.nsIRDFContainerUtils);
var fileHandler =
Components
.classes["@mozilla.org/network/io-service;1"]
.getService(Components.interfaces.nsIIOService)
.getProtocolHandler("file")
.QueryInterface(Components.interfaces.nsIFileProtocolHandler);
function addFeed(url, title, quickMode, destFolder) {
var ds = getSubscriptionsDS();
var feeds = getSubscriptionsList();
// Give quickMode a default value of "true"; otherwise convert value
// to either "true" or "false" string.
quickMode = quickMode == null ? "false" : quickMode ? "true" : "false";
// Generate a unique ID for the feed.
var id = url;
var i = 1;
while (feeds.IndexOf(rdf.GetResource(id)) != -1 && ++i < 1000)
id = url + i;
if (id == 1000)
throw("couldn't generate a unique ID for feed " + url);
// Add the feed to the list.
id = rdf.GetResource(id);
feeds.AppendElement(id);
ds.Assert(id, RDF_TYPE, FZ_FEED, true);
ds.Assert(id, DC_IDENTIFIER, rdf.GetLiteral(url), true);
if (title)
ds.Assert(id, DC_TITLE, rdf.GetLiteral(title), true);
ds.Assert(id, FZ_QUICKMODE, rdf.GetLiteral(quickMode), true);
ds.Assert(id, FZ_DESTFOLDER, destFolder, true);
ds = ds.QueryInterface(Components.interfaces.nsIRDFRemoteDataSource);
ds.Flush();
// Create a new feed object for the feed.
feed = new Feed(id);
// Downloading the feed synchronously will pick up the title.
feed.download(false, false);
}
function getNodeValue(node) {
if (node && node.textContent)
return node.textContent;
else if (node && node.firstChild) {
var ret = "";
for (var child = node.firstChild; child; child = child.nextSibling) {
var value = getNodeValue(child);
if (value)
ret += value;
}
if (ret)
return ret;
}
return null;
}
function getRDFTargetValue(ds, source, property) {
var node = ds.GetTarget(source, property, true);
if (node) {
node = node.QueryInterface(Components.interfaces.nsIRDFLiteral);
if (node)
return node.Value;
}
return null;
}
var gFzSubscriptionsDS; // cache
function getSubscriptionsDS() {
if (gFzSubscriptionsDS)
return gFzSubscriptionsDS;
var file = getSubscriptionsFile();
var url = fileHandler.getURLSpecFromFile(file);
gFzSubscriptionsDS = rdf.GetDataSource(url);
if (!gFzSubscriptionsDS)
throw("can't get subscriptions data source");
// Note that it this point the datasource may not be loaded yet.
// You have to QueryInterface it to nsIRDFRemoteDataSource and check
// its "loaded" property to be sure. You can also attach an observer
// which will get notified when the load is complete.
return gFzSubscriptionsDS;
}
function getSubscriptionsList() {
var ds = getSubscriptionsDS();
var list = ds.GetTarget(FZ_ROOT, FZ_FEEDS, true);
//list = feeds.QueryInterface(Components.interfaces.nsIRDFContainer);
list = list.QueryInterface(Components.interfaces.nsIRDFResource);
list = containerUtils.MakeSeq(ds, list);
return list;
}
function getSubscriptionsFile() {
// Get the app directory service so we can look up the user's profile dir.
var appDirectoryService =
Components
.classes["@mozilla.org/file/directory_service;1"]
.getService(Components.interfaces.nsIProperties);
if ( !appDirectoryService )
throw("couldn't get the directory service");
// Get the user's profile directory.
var profileDir =
appDirectoryService.get("ProfD", Components.interfaces.nsIFile);
if ( !profileDir )
throw ("couldn't get the user's profile directory");
// Get the user's subscriptions file.
var file = profileDir.clone();
file.append("feeds.rdf");
// If the file doesn't exist, create it.
if (!file.exists())
createSubscriptionsFile(file);
return file;
}
function createSubscriptionsFile(file) {
file = new LocalFile(file, MODE_WRONLY | MODE_CREATE);
file.write('\
<?xml version="1.0"?>\n\
<RDF:RDF xmlns:dc="http://purl.org/dc/elements/1.1/"\n\
xmlns:fz="' + FZ_NS + '"\n\
xmlns:RDF="http://www.w3.org/1999/02/22-rdf-syntax-ns#">\n\
<RDF:Description about="' + FZ_ROOT.Value + '">\n\
<fz:feeds>\n\
<RDF:Seq>\n\
</RDF:Seq>\n\
</fz:feeds>\n\
</RDF:Description>\n\
</RDF:RDF>\n\
');
file.close();
}
var gFzItemsDS; // cache
function getItemsDS() {
if (gFzItemsDS)
return gFzItemsDS;
var file = getItemsFile();
var url = fileHandler.getURLSpecFromFile(file);
gFzItemsDS = rdf.GetDataSourceBlocking(url);
if (!gFzItemsDS)
throw("can't get subscriptions data source");
// Note that it this point the datasource may not be loaded yet.
// You have to QueryInterface it to nsIRDFRemoteDataSource and check
// its "loaded" property to be sure. You can also attach an observer
// which will get notified when the load is complete.
return gFzItemsDS;
}
function getItemsFile() {
// Get the app directory service so we can look up the user's profile dir.
var appDirectoryService =
Components
.classes["@mozilla.org/file/directory_service;1"]
.getService(Components.interfaces.nsIProperties);
if ( !appDirectoryService )
throw("couldn't get the directory service");
// Get the user's profile directory.
var profileDir =
appDirectoryService.get("ProfD", Components.interfaces.nsIFile);
if ( !profileDir )
throw ("couldn't get the user's profile directory");
// Get the user's subscriptions file.
var file = profileDir.clone();
file.append("feeditems.rdf");
// If the file doesn't exist, create it.
if (!file.exists()) {
var newfile = new LocalFile(file, MODE_WRONLY | MODE_CREATE);
newfile.write('\
<?xml version="1.0"?>\n\
<RDF:RDF xmlns:dc="http://purl.org/dc/elements/1.1/"\n\
xmlns:fz="' + FZ_NS + '"\n\
xmlns:RDF="http://www.w3.org/1999/02/22-rdf-syntax-ns#">\n\
</RDF:RDF>\n\
');
newfile.close();
}
return file;
}
function removeAssertions(ds, resource) {
var properties = ds.ArcLabelsOut(resource);
var property;
while (properties.hasMoreElements()) {
property = properties.getNext();
var values = ds.GetTargets(resource, property, true);
var value;
while (values.hasMoreElements()) {
value = values.getNext();
ds.Unassert(resource, property, value, true);
}
}
}