Xpoint
   [напомнить пароль]

Найти картинку в кэше?

Метки: [без меток]
2008-11-20 00:35:19 [обр] Андрей[досье]

Добрый день!
Просмотрел пример с использованием Policy для фильтрации объектов, там в принципе делается то, что нужно, но не совсем.
Нужно составить список jpeg-имаджей на странице с определенными метаданными(типа экзифа).
Для этого надо открывать реальный(существующий) файл и читать оттуда метаданные, это делает уже готовая длл.
Но не хотелось бы дважды скачивать большие имаджи (некоторые фотки могут быть размером более мегабайта).
Вопрос первый, при первоначальном заполнении списка в Policy имаджи уже находятся в кэше? Как тогда получить path на файл в кэше, имея url? Может быть использовать для этого ImageLoadingContent?

Если же имадж еще на скачан, как можно заставить его сначала скачаться, чтобы потом опять же получить path файла из кэша, открыть файл и прочитать данные(так чтобы при отрисовке страницы он не скачивался заново)?
Если воспользоваться кэшем ФаерФокса не судьба, можно ли сделать так, чтобы скачивался не весь имадж, а например первый килобайт?(этого достаточно для решения задачи).
Если нельзя - придется значит на си писать дополнительный код и включать в длл, в принципе ничего страшного, просто надо выбрать оптимальное решение.

спустя 15 часов [обр] Денис Ибаев aka Dionys(15/57)[досье]
Я когда-то делал так. Разбирал для начала страничку для получения URL картинок. Потом каждую такую картинку пытался асинхронно открыть, специальный listener дожидался загрузки картинки в кеш, и далее выполнял необходимые действия.
var listener = {
   QueryInterface: function(iid)
   {
      if (iid.equals(Components.interfaces.nsICacheListener) ||
            iid.equals(Components.interfaces.nsISupports))
         return this;

      throw Components.results.NS_NOINTERFACE;
   },
   onCacheEntryAvailable: function(descriptor, mode, status)
   {
      if (descriptor.isStreamBased())
      {
         var istream = descriptor.openInputStream(0);

         // Do something with file.
         // ...

         istream.close();
      }
   }
};
var session = Components
      .classes["@mozilla.org/network/cache-service;1"]
      .getService(Components.interfaces.nsICacheService);
      .createSession("HTTP", 0, true);

session.asyncOpenCacheEntry(url, Components.interfaces.nsICache.ACCESS_READ, listener);
спустя 53 минуты [обр] Андрей[досье]
Отлично, спасибо за идею!
Powered by POEM™ Engine Copyright © 2002-2005