2009-07-30 8 views
0

Ich habe eine C++ App ich gebaut, die als Standard-Handler für eine Datei mit einer bestimmten Erweiterung registriert ist. Wenn ich also eine dieser Dateien mit Firefox von einer Website herunterlade, lädt sie sie in ein temporäres Verzeichnis herunter und dann führt Shell meine App aus, während der vollständige Pfad zur heruntergeladenen Datei in der Befehlszeile übergeben wird.Wie kann ich die Quell-URL einer Datei lesen, die mit FireFox von einer externen Anwendung heruntergeladen wurde?

Was ist der beste Weg, um aus der externen App herauszufinden, was die ursprüngliche Download-URL der Datei war, nur den Pfad auf der Festplatte gegeben? Kann ich XPCOM-API-Aufrufe verwenden, um die FireFox-Download-Manager-Datenbank zu überprüfen?

Ich habe herausgefunden, dass diese gespeicherte Daten erhalten im „% AppData% \ Mozilla \ Firefox \ ($ Profil) \ downloads.sqlite“-Datei, die eine SqlLite db-Datei ist, aber ich wirklich lieber nicht versuchen, um diese Datei direkt zu öffnen, da FireFox während der Ausführung einen offenen Schreibzugriff auf die Datei hat.

Nachdem ich das Mozilla Developer Center eine Weile durchgelesen habe, bin ich über den nsIDownloadManager Dienst gelaufen, der genau das Richtige zu sein scheint. Aber ich kann nicht scheinen, von XPCOM in einem separaten Prozess darauf zuzugreifen?

Hier ist der Code, den ich verwende:

nsresult rv; 

//init XPCOM 
nsCOMPtr<nsIServiceManager> servMgr; 
rv = NS_InitXPCOM2(getter_AddRefs(servMgr), nsnull, nsnull); 
NS_ENSURE_SUCCESS(rv, rv); 

//Get a download manager instance 
nsCOMPtr<nsIDownloadManager> downloadMgr; 
rv = servMgr->GetServiceByContractID(NS_DOWNLOADMANAGER_CONTRACTID, 
     nsIDownloadManager::GetIID(), getter_AddRefs(downloadMgr)); 
NS_ENSURE_SUCCESS(rv, rv); 

Als ich dies ausführen, die GetServiceByContractID() Aufruf zurückkehrt 0x8007000e, die in nsError.h als NS_ERROR_OUT_OF_MEMORY definiert ist. (was ich sehr seltsam finde).

Irgendwelche Ideen hier? Melde ich den richtigen Baum an?

Antwort

1

Nein, Sie können nicht von einem externen Prozess auf die XPCOM-Objekte von Firefox zugreifen, und Sie sollten die SQLite-Datenbank auch nicht öffnen, während Firefox geöffnet ist. Ich weiß nicht, dass es eine einfache Möglichkeit gibt, das zu tun, was Sie wollen, ohne eine Firefox-Erweiterung zu schreiben, die Zugriff auf die Interna von Firefox hat.

+0

Hmmm, das ist eine Schande. Die IE-Version von diesem war ziemlich direkt. Eine benutzerdefinierte FireFox-Erweiterung zu schreiben, nur damit ich nach der Ursprungssite fragen kann, erscheint mir als Overkill. Ich frage mich, ob ich eine Kopie der SQLite-Datei erstellen und öffnen kann nur lesen ... –

+0

OK, ich habe aufgegeben, mit FireFox extern kommunizieren zu kommunizieren, jetzt schreibe ich eine Erweiterung für Download-Ereignisse zu hören. Meine Frage ist jetzt, was ist der beste Weg, um die ursprüngliche Download-URL zu meinem Programm zu bekommen? Ist es Shell möglich, ein externes Programm innerhalb einer Erweiterung auszuführen und die Ursprungs-URL auf der Kommandozeile zu übergeben? Oder gibt es einen besseren Weg? –

0

Ich bin jetzt ein wenig verschwommen auf die Details, aber vorausgesetzt, dass Ihr Download mit einem benutzerdefinierten MIME-Typ geliefert wird, ist es möglich, einen Handler für diesen Typ zu registrieren; Ihr Handler kann dann den Download abbrechen und die URL an Ihre Anwendung weitergeben.

Verwandte Themen