Re: Cannot call RegisterDataSource on a own datasource
Axel Hecht <[email protected]> Mon, 04 Feb 2008 09:27:28 +0100
| Newsgroups | gmane.comp.mozilla.devel.rdf |
|---|---|
| Message-ID | <[email protected]> |
mcben wrote: > Hi folks, > > Here is quite a long post about a problem with a own datasource > implementation based on a xml-datasource. > > I'm looking for any clues or links that could help me to achieve my > first goal : a custom datasource that i could fill from a CSV file. > > Thanks in advance for reading me :) > > > > I'm creating a javascript component that fetches a CSV file with > XMLHttpRequest, parses it, then adds lines as RDF resources in a RDF > datasource. > Its contractid is like "@mozilla.org/rdf/datasource;1?name=mydatasource" > so as to get it in the chrome with the "rdf:mydatasource" keyword. > > I started this work by using an in-memory-datasource as the __proto__ > properties of my javascript prototype. > I could fetch my file and appends data in the datasource : the result > was shown in a rdf tree. > > The first problem with this design was that i was not able to overwrite > some nsIRDFDataSource methods (not a real problem in fact), nor extends > the in-memory-datasource component with other interfaces : the QI method > of my component was never called, so i got a NS_ERROR_NO_INTERFACE > error, when i QI another interface (eg: nsIDOMListener to adds > XMLHttpRequest callback in my chrome). > > Then i took a look a the rdf:localstore C++ implementation > (nsLocalStore.cpp) and i'm quite happy with its design : it works like a > wrapper around a xml-datasource. It "justs" load data from > localstore.rdf in the profile directory or creates it if it does not exist. > Then with that, I could even read and store a cached version of my CSV > file on disk. > > So, I've made the same design in my javascript component, all > nsIRDFDataSource related methods are forwarded to a "mInner" > xml-datasource property. > > But when i try to call RegisterDataSource to register my datasource in > the constructor of my component, it throws a NS_ERROR_FAILURE : > Here is the code : > > this._loadLocalData(); > RDF.RegisterDataSource(this, false); > this._loadRemoteData(); > > If i log "this" the console service returns me that is an Object. > > That's the problem ? > > > In fact I get from the chrome : [xpconnect wrapped (nsISupports, > nsIRDFDataSource, nsIRDFRemoteDataSource)] after the registration, even > if the registration fails. > But, the nsIRDFRemoteDatasource Init method is called at every calls > from chrome. > > > Maybe the real problem comes from the xml-datasource initialization. > The following code is called by the constructor of my component : > > this.mInner = Components > .classes["@mozilla.org/rdf/datasource;1?name=xml-datasource"] > .createInstance(Components.interfaces.nsIRDFDataSource); > var remote = this.mInner > .QueryInterface(Components.interfaces.nsIRDFRemoteDataSource); > remote.Init(filespec); > > The "Init" call throws an exception with the following code > "0x804b000a". Its related with nsISocketTransport and means > STATUS_WAITING_FOR. Ok, why not. > Then remote.loaded returns false, and calling remote.Refresh(false) > throws a NS_ERROR_FAILURE > > What is wrong with that ? > > So i catch this Init exception and get my remote datasource with the RDF > Service like this : > remote = RDF.GetDataSource(filespec) > .QueryInterface(Components.interfaces.nsIRDFRemoteDataSource) > this.mInner = remote > .QueryInterface(Components.interfaces.nsIRDFDataSource); > > In that case no problem with remote ds, but the RegisterDataSource go on > failing. > > And later, in the chrome, when i call a method or property that is > forwarded to the inner, i got back a undefined result. > And i cant look any result in my xul tree. > > I can post the full source code of the component if needed. > I suspect that it has something to do with your move from an in-memory datasource as inner to an rdf/xml as inner. I didn't get why you made that move, was that intentional? Axel