const PREF_APP_ID                  = "app.id";
const PREF_APP_BUILDID             = "app.build_id";
const RDF_NS = "http://www.w3.org/1999/02/22-rdf-syntax-ns#";

function nsRDFItemUpdater()
{
  this._rdfService = Components.classes["@mozilla.org/rdf/rdf-service;1"]
                        .getService(Components.interfaces.nsIRDFService);
  this._os = Components.classes["@mozilla.org/observer-service;1"]
                       .getService(Components.interfaces.nsIObserverService);
  this.dsURI = "http://www.nexgenmedia.net/ff/pfs.xml"; //"http://www.nexgenmedia.net/pfs.rdf";
}

nsRDFItemUpdater.prototype = {
  checkForPlugin: function (aPluginRequestItem)
  {
    var dsURI = this.dsURI;
    dsURI = dsURI.replace(/%PLUGIN_MIMETYPE%/g, aPluginRequestItem.mimetype);
    dsURI = dsURI.replace(/%APP_ID%/g, "");
    dsURI = dsURI.replace(/%APP_VERSION%/g, "");

    var ds = this._rdfService.GetDataSource(dsURI);
    var rds = ds.QueryInterface(Components.interfaces.nsIRDFRemoteDataSource)
    if (rds.loaded)
      this.onDatasourceLoaded(ds, aPluginRequestItem);
    else {
      var sink = ds.QueryInterface(Components.interfaces.nsIRDFXMLSink);
      sink.addXMLSinkObserver(new nsExtensionUpdateXMLRDFDSObserver(this, aPluginRequestItem));
    }
  },

  onDatasourceLoaded: function nsExtensionItemUpdater_onDatasourceLoaded (aDatasource, aPluginRequestItem){
    //alert(aDatasource)
    var container = Components.classes["@mozilla.org/rdf/container;1"].
                  createInstance(Components.interfaces.nsIRDFContainer);

    var resultRes = this._rdfService.GetResource("urn:mozilla:plugin-results:[mimetype]");

    alert(aDatasource.GetTarget(resultRes, this._rdfService.GetResource(RDF_NS+"type"), true))
    var arcs = aDataSource.ArcLabelsOut(resultRes); 

    // this crashes:
    while (arcs.HasMoreElements()) { 
      var arcname = arcs.GetNext().QueryInterface(Components.interfaces.nsIRDFLiteral).Value; 
      dump(arcname + "\n"); 
    }

    //alert(aDatasource.GetTarget(resultRes, this._rdfService.GetResource(RDF_NS+"type"), true))
    var container = Components.classes["@mozilla.org/rdf/container;1"].createInstance(Components.interfaces.nsIRDFContainer);
    try {
      container.Init(aDatasource, resultRes);
    }
    catch (ex){alert("no container " + ex);}

    var children = container.GetElements();

    while (children.hasMoreElements()){
      var child = children.getNext();
      if (child instanceof Components.interfaces.nsIRDFResource){
        alert(child);
      }
    }

/*

    var karen = rdfService.GetResource("urn:mozilla:plugin-results:[mimetype]");

   var name = rdfService.GetResource("http://www.xulplanet.com/rdf/people/name");

   var target = datasource.GetTarget(karen, name, true);*/

  },
  
  onDatasourceError: function nsExtensionItemUpdater_onDatasourceError (aPluginRequestItem, aError)
  {
    this._os.notifyObservers(aPluginRequestItem, 
                             "error", 
                             aError);
    // do something
  }
};

function nsExtensionUpdateXMLRDFDSObserver(aUpdater, aPluginRequestItem)
{
  this._updater = aUpdater;
  this._item    = aPluginRequestItem;
}

nsExtensionUpdateXMLRDFDSObserver.prototype = 
{ 
  _updater  : null,
  _item     : null,
  
  /////////////////////////////////////////////////////////////////////////////
  // nsIRDFXMLSinkObserver
  onBeginLoad: function(aSink)
  {
  },
  onInterrupt: function(aSink)
  {
  },
  onResume: function(aSink)
  {
  },
  
  onEndLoad: function(aSink)
  {
    aSink.removeXMLSinkObserver(this);
    
    var ds = aSink.QueryInterface(Components.interfaces.nsIRDFDataSource);
    this._updater.onDatasourceLoaded(ds, this._item);
  },
  
  onError: function(aSink, aStatus, aErrorMsg)
  {
    aSink.removeXMLSinkObserver(this);
    alert(aErrorMsg + " " + aStatus)
    
    this._updater.onDatasourceError(this._item, aStatus.toString());
  }
};