if (typeof(JS_LIB_LOADED)=='boolean') { // test to make sure rdf base classes are loaded include(jslib_rdfbase); include(jslib_rdfresource); include(jslib_rdfcontainer); const JS_RDF_LOADED = true; const JS_RDF_FILE = "rdf.js"; const JS_RDF_FLAG_SYNC = 1; // load RDF source synchronously function RDF(src, flags) { this.loaded = false; if (src) { this._rdf_init(src, flags); } } RDF.prototype = new RDFBase; RDF.prototype.src = null; RDF.prototype._rdf_init = function (src, flags) { flags = flags || 0; this.src = src; var load = true; // load source jslibPrint("* RDFFile: Opening file \n"); // Create an RDF/XML datasource using the XPCOM Component Manager this.dsource = C .classes[JS_RDFBASE_RDF_DS_PROGID] .createInstance(C.interfaces.nsIRDFDataSource); // The nsIRDFRemoteDataSource interface has the interfaces // that we need to setup the datasource. var remote = this.dsource.QueryInterface(C.interfaces.nsIRDFRemoteDataSource); try { jslibPrint("* RDFFile: doing remote init \n"); remote.Init(src); // throws an exception if URL already in use } catch(err) { // loading already load = false; jslibDebug(JS_RDF_FILE+":_rdf_init: Init of "+src+" failed."); } if (load) { try { jslibPrint("* RDFFile: refresh remote \n"); remote.Refresh((flags & JS_RDF_FLAG_SYNC) ? true: false); } catch(err) { this.dsource = null; jslibError(err, "Error refreshing remote rdf: "+src, "NS_ERROR_UNEXPECTED", JS_RDF_FILE+":_rdf_init"); return; } } else { try { jslibPrint("* RDFFile: getting ds \n"); this.dsource = this.RDF.GetDataSource(src); remote = this.dsource.QueryInterface(C.interfaces.nsIRDFRemoteDataSource); } catch(err) { this.dsource = null; jslibError(err, "Error getting datasource: "+src, "NS_ERROR_UNEXPECTED", JS_RDF_FILE+":_rdf_init"); return; } } try { if (remote.loaded) { this.loaded = true; this.setValid(true); } else { var obs = { rdf: this, // backreference to ourselves onBeginLoad: function (aSink) { }, onInterrupt: function (aSink) {}, onResume: function (aSink) {}, onEndLoad: function (aSink) { this.rdf.loaded = true; this.rdf.setValid(true); }, onError: function (aSink, aStatus, aErrorMsg) { jslibError(null,"Error loading datasource: "+aErrorMsg, "NS_ERROR_UNEXPECTED", JS_RDF_FILE+":_rdf_init (observer)"); } }; // RDF/XML Datasources are all nsIRDFXMLSinks var sink = this.dsource.QueryInterface(C.interfaces.nsIRDFXMLSink); // Attach the observer to the datasource-as-sink sink.addXMLSinkObserver(obs); } } catch(err) { jslibError(err, "Error loading rdf!\n", "NS_ERROR_UNEXPECTED", JS_RDF_FILE+":_rdf_init"); return; } }; RDF.prototype.getSource = function () { return this.src; }; RDF.prototype.getNode = function (aPath) { jslibDebug("entering getNode"); if (this.isValid()) { var res = this.RDF.GetResource(aPath); return new RDFResource("node", res.Value, null, this.dsource); } else { return jslibErrorMsg("NS_ERROR_UNEXPECTED"); } }; RDF.prototype.addRootSeq = function (aSeq) { return this.addRootContainer(aSeq, "seq"); }; RDF.prototype.addRootAlt = function (aAlt) { return this.addRootContainer(aAlt, "alt"); }; RDF.prototype.addRootBag = function (aBag) { return this.addRootContainer(aBag, "bag"); }; RDF.prototype.addRootContainer = function (aContainer, aType) { var rv = null; if (this.isValid()) { if (!aContainer) jslibErrorMsg("NS_ERROR_NOT_INITIALIZED"); var res = this.RDF.GetResource(aContainer); // FIXME: should test if exists and is already a container if (aType == "bag") { this.RDFCUtils.MakeBag(this.dsource, res); } else if (aType == "alt") { this.RDFCUtils.MakeAlt(this.dsource, res); } else if (aType == "seq") { this.RDFCUtils.MakeSeq(this.dsource, res); } else { // FIXME: this.RDFCUtils.MakeContainer.... } rv = new RDFContainer(aType, aContainer, null, this.dsource); } else { jslibErrorMsg("NS_ERROR_FAILURE"); } return rv; }; RDF.prototype.getRootSeq = function (aSeq) { return this.getContainer(aSeq, "seq"); }; RDF.prototype.getRootAlt = function (aAlt) { return this.getContainer(aAlt, "alt"); }; RDF.prototype.getRootBag = function (aBag) { return this.getContainer(aBag, "bag"); }; RDF.prototype.getContainer = function (aContainer, aType) { var rv = null; if (this.isValid()) { var res = this.RDF.GetResource(aContainer); if (res) { rv = new RDFContainer(aType, aContainer, null, this.dsource); } } return rv; }; RDF.prototype.getAllSeqs = function () { return this.getRootContainers("seq"); }; RDF.prototype.getAllAlts = function () { return this.getRootContainers("alt"); }; RDF.prototype.getAllBags = function () { return this.getRootContainers("bag"); }; RDF.prototype.getAllContainers = function () { return this.getRootContainers("all"); }; RDF.prototype.getRootContainers = function (aType) { var rv = new Array; if (this.isValid()) { var elems = this.dsource.GetAllResources(); while(elems.hasMoreElements()) { var elem = elems.getNext(); elem = elem.QueryInterface(C.interfaces.nsIRDFResource); if (aType == "bag") { if (this.RDFCUtils.IsBag(this.dsource, elem)) { rv.push(new RDFContainer(aType, elem.Value, null, this.dsource)); } } else if (aType == "alt") { if (this.RDFCUtils.IsAlt(this.dsource, elem)) { rv.push(new RDFContainer(aType, elem.Value, null, this.dsource)); } } else if (aType == "seq") { if (this.RDFCUtils.IsSeq(this.dsource, elem)) { rv.push(new RDFContainer(aType, elem.Value, null, this.dsource)); } } else if (aType == "all") { if (this.RDFCUtils.IsContainer(this.dsource, elem)) { rv.push(new RDFContainer(aType, elem.Value, null, this.dsource)); } } else { if (!this.RDFCUtils.IsContainer(this.dsource, elem)) { rv.push(new RDFResource(aType, elem.Value, null, this.dsource)); } } } } else { jslibErrorMsg("NS_ERROR_UNEXPECTED"); } return rv; }; RDF.prototype.flush = function () { if (this.isValid()) this.dsource.QueryInterface(C.interfaces.nsIRDFRemoteDataSource).Flush(); }; RDF.prototype.refresh = function (aBlocking) { if (this.isValid()) this.dsource.QueryInterface(C.interfaces.nsIRDFRemoteDataSource).Refresh(aBlocking); }; jslibDebug('*** load: '+JS_RDF_FILE+' OK'); } // END BLOCK JS_LIB_LOADED CHECK else { dump("JS_RDF library not loaded:\n" + " \tTo load use: chrome://jslib/content/jslib.js\n" + " \tThen: include('chrome://jslib/content/rdf/rdf.js');\n\n"); }