Monday, March 31, 2008

XPCOM Proxy and getting access to the GUI from non-GUI thread

It was a frustrating week of pulling out hair trying to get this to work.

First, you'll need to get nsIProxyObjectManager which is not part of the Gecko-sdk but the idl file is part of the Firefox source code. So download the Firefox source code for the Firefox version that you're using. If you are using Firefox 2.0, downloading Firefox 3.0 source code and using the idl included there will not suffice. The UID of the IDL in Firefox 3.0 is different from that of Firefox 2.0. It would've saved me half a week of frsutration had I realized this sooner.

I'm sure there are several ways to proceed from here. I found the IDL in the Firefox source, generated a header file out of it using the xpidl command from Gecko-sdk and included that in my project. You'll find that when you try to compile your project with the nsIProxyObejctManager.h inculded, it'll require other header files as well and so you'll have to find and generate header files from a few other IDLs as well. I think in total it comes out to about 10. Not too frustrating a process, but frustrating enough.

Finally, you'll need to access the method you want via the proxy
Declare the proxy object
nsCOMPtr pmgr;
pmgr=do_GetService("@mozilla.org/xpcomproxy;1",&rv);

Now, i'm trying to write to an RDF file via the proxy. So I'll declare an RDF datasource to access via the proxy
nsCOMPtr proxyObject;

And then try to get proxy access to the nsIRDFDataSource
if (pmgr){
rv = pmgr->GetProxyForObject(NS_UI_THREAD_EVENTQ, NS_GET_IID(nsIRDFDataSource), dsource, 1|4, getter_AddRefs(proxyObject));

Now we have a proxy object for calling all functions declared in nsIRDFDataSource. For instance, to call the assert, we would do
proxyObject->Assert(ns_subject, ns_predicate, ns_literal, PR_TRUE);

Its the same for any other XPCOM Interface. You'll need to get access to it via GetProxyForObject and then you can access all functions to it via the proxy as above. Hope this helped.

3 comments:

Anonymous said...

Whaɑt time period will it taκe me tto ƅe as ǥood as yoou at blogs and site-building?
Whatеver suɡgestіons would be really benefiсial.

Thаnks a lot!

Feel feee to suyrf tto mmy blog ... e cig liquid
refill pгices ()

Anonymous said...

For most recent news you have to pay a quick visit world-wide-web and on web I found
this web site as a best web site for hottest updates.



My web-site ... mirahealth garcinia

Anonymous said...

First of all I want to say fantastic blog! I had a quick question which I'd like to
ask if you do not mind. I was curious to find out how you
center yourself and clear your mind prior to writing.
I've had trouble clearing my thoughts in getting my ideas
out. I truly do take pleasure in writing but it just seems like the first 10to 15 minutes are usually wasted just trying to figure out how to begin. Any recommendations or tips?
Thanks!

Stop by my web blog - Arthur Falcone

  • Book reviews