Как я могу прочитать исходный URL-адрес файла, загруженного с помощью FireFox из внешнего приложения? - PullRequest
0 голосов
/ 30 июля 2009

У меня есть приложение на C ++, которое я создал и зарегистрировано как обработчик по умолчанию для файла с определенным расширением. Поэтому, когда я загружаю один из этих файлов с помощью Firefox с веб-сайта, он загружает его во временный каталог, а затем оболочка выполняет мое приложение, передавая полный путь к загруженному файлу в командной строке.

Как лучше всего определить из внешнего приложения исходный URL-адрес файла для загрузки, учитывая только его путь на диске? Могу ли я использовать вызовы API XPCOM для проверки базы данных менеджера загрузок FireFox?

Я выяснил, что эти данные хранятся в файле "% APPData% \ Mozilla \ Firefox \ ($ profile) \ downloads.sqlite" , который является файлом базы данных SqlLite, но я действительно не пытайтесь открыть этот файл напрямую, так как FireFox имеет открытый дескриптор записи в файл во время работы.

Пройдя некоторое время в Центре разработчиков Mozilla, я наткнулся на сервис nsIDownloadManager , который, похоже, просто необходим. Но я не могу получить доступ к нему из XPCOM в отдельном процессе?

Вот код, который я использую:

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);

Когда я запускаю это, вызов GetServiceByContractID () возвращает 0x8007000e, который определен в nsError.h как NS_ERROR_OUT_OF_MEMORY. (что я нахожу очень странным).

Есть идеи здесь? Я лаю на правильное дерево?

Ответы [ 2 ]

1 голос
/ 30 июля 2009

Нет, вы не можете получить доступ к объектам Firefox XPCOM из внешнего процесса, и вам также не следует открывать базу данных sqlite, пока она открыта в Firefox. Я не знаю, есть ли какой-нибудь простой способ сделать то, что вы хотите, без написания расширения Firefox, которое имеет доступ к внутренним компонентам Firefox.

0 голосов
/ 29 января 2011

Я немного запутался в деталях, но, предполагая, что ваша загрузка обслуживается с пользовательским типом MIME, можно зарегистрировать обработчик для этого типа; Затем ваш обработчик может отменить загрузку и передать URL-адрес вашему приложению.

...