Observer — распаковка файлов из различных контейнеров

Здесь можно обсудить ваш любимый плагин.
Ariman
Posts: 1351
Joined: Fri 30 Nov, 2007 15:32
Location: Крым
Has thanked: 15 times
Been thanked: 50 times
Contact:

Observer — распаковка файлов из различных контейнеров

Post by Ariman »

Тема для обсуждения плагина Observer.
Плагин предназначен только для распаковки файлов. Запаковка/редактирование архивов не планируется.

Хотелки/баги:

Известные проблемы:

Планируемые новые модули:

Если "ничего не работает", то прежде чем писать сюда:


Сторонние модули:
  • Dir — поддержка вывода команд dir и ls в качестве виртуального архива.
  • Inno Setup — поддержка файлов Inno Setup (сделан на основе innounp).
  • cab — распаковка нестандартных .cab архивов (Windows Update и др.)
Last edited by Ariman on Wed 04 May, 2022 14:36, edited 7 times in total.
User avatar
HaRT
Moderator
Posts: 10867
Joined: Tue 30 Aug, 2005 17:21
Has thanked: 221 times
Been thanked: 358 times

Observer — распаковка файлов из различных контейнеров

Post by HaRT »

Latest post of the previous page:

Ariman
В файле [i][b]PstProcessing.cpp[/b][/i] в функции process_message есть такой цикл:
  1. int dupCounter = 0;
  2.  
  3. while (true)
  4.  
  5. {
  6.  
  7.     bool dupFound = false;
  8.  
  9.     wstring testName = GetDupTestFilename(strBaseFileName, dupCounter);
  10.  
  11.     for (auto it = fileInfoObj->Entries.begin(); it != fileInfoObj->Entries.end(); it++)
  12.  
  13.     {
  14.  
  15.         const PstFileEntry& prevEntry = *it;
  16.  
  17.         if ((prevEntry.Folder == parentPath) && (prevEntry.Name == testName))
  18.  
  19.         {
  20.  
  21.             dupFound = true;
  22.  
  23.         }
  24.  
  25.     }
  26.  
  27.     if (!dupFound) break;
  28.  
  29.    
  30.  
  31.     dupCounter++;
  32.  
  33. }
Внутренний for бегает всегда по одному и тому же контейнеру. Выход из внешнего while происходит только в том случае, если в том контейнере не обнаружен дубликат (dupFound == false). Если же дубликат есть, то из while никогда не выйдем.

Кроме того, когда дубликат уже нашли, зачем дальше бежать по коллекции?
Фар есть инструмент, а не нянька. © 2009 DrKnS
Ariman
Posts: 1351
Joined: Fri 30 Nov, 2007 15:32
Location: Крым
Has thanked: 15 times
Been thanked: 50 times
Contact:

Observer — распаковка файлов из различных контейнеров

Post by Ariman »

HaRT wrote:Если же дубликат есть, то из while никогда не выйдем.
Если дубликат есть, то увеличивается счетчик dupCounter, на его основе строится новое имя, и снова прогоняем весь набор.
HaRT wrote:Кроме того, когда дубликат уже нашли, зачем дальше бежать по коллекции?
Да, тут протупил. Я уже добавил break, заметил пока сам рассматривал цикл.
User avatar
HaRT
Moderator
Posts: 10867
Joined: Tue 30 Aug, 2005 17:21
Has thanked: 221 times
Been thanked: 358 times

Observer — распаковка файлов из различных контейнеров

Post by HaRT »

Ariman wrote: строится новое имя
Да, это я проглядел.

Там получается вообще смешно: в некой папке для некоторых сообщений m.get_subject() возвращает в строке какой-то откровенный мусор, и в GetDupTestFilename вызов swprintf_s обламывается, оставляя testName пустым. Т.е. он не меняется в зависимости от dupCounter — отсюда и зацикливание.

Вот фикс: (добавленный break там тоже есть).
Фар есть инструмент, а не нянька. © 2009 DrKnS
Ariman
Posts: 1351
Joined: Fri 30 Nov, 2007 15:32
Location: Крым
Has thanked: 15 times
Been thanked: 50 times
Contact:

Observer — распаковка файлов из различных контейнеров

Post by Ariman »

HaRT wrote:m.get_subject() возвращает в строке какой-то откровенный мусор
Неожиданный поворот. То, что там пустышка вместо имени будет в цикле, я даже не предполагал. Спасибо за диагностику и патч.

А, ради интереса, что в поле Subject показывает Outlook для этого сообщения? А то может get_subject чинить надо заодно. Странно что там мусор выдает.
User avatar
HaRT
Moderator
Posts: 10867
Joined: Tue 30 Aug, 2005 17:21
Has thanked: 221 times
Been thanked: 358 times

Observer — распаковка файлов из различных контейнеров

Post by HaRT »

Ariman wrote: что в поле Subject показывает Outlook для этого сообщения?
Там у меня их таких с десяток — у них Тема с кириллицей, притом в словах латиницей я узнаю фрагменты того „мусора“, уоторый видел при отладке. Кстати, папки этих сообщений на панели плагина оказываются пустыми.

Когда я подключал этот файл к Аутлуку, он выдал предупреждение, что это, мол, . Из интересных свойств этого файла вижу только “Format: Outlook Data File (97-2002)”.
Ariman wrote: может get_subject чинить надо заодно
Похоже на то.

(Не)кстати, я собирал в 2013-ой Студии — потребовалось сделать всего 3 мелкие правки в 2 заголовочниках из pstsdk.
Last edited by HaRT on Thu 01 Jan, 1970 01:00, edited 0 times in total.
Reason: Добавлено сообщение про non-Unicode capable store
Фар есть инструмент, а не нянька. © 2009 DrKnS
Ariman
Posts: 1351
Joined: Fri 30 Nov, 2007 15:32
Location: Крым
Has thanked: 15 times
Been thanked: 50 times
Contact:

Observer — распаковка файлов из различных контейнеров

Post by Ariman »

HaRT wrote:Там у меня их таких с десяток — у них Тема с кириллицей
Это многое объясняет. В pstsdk конвертация в юникод через ж. выполняется.
Обновил по прежним ссылкам дебажную сборку и исходники. Немного изменил предложенный патч. Проверьте, как теперь насчет бесконечных циклов. Такие случаи всё равно исправить надо, но дополнительно попробую ещё и с кодировкой починить проблему.
Ariman
Posts: 1351
Joined: Fri 30 Nov, 2007 15:32
Location: Крым
Has thanked: 15 times
Been thanked: 50 times
Contact:

Observer — распаковка файлов из различных контейнеров

Post by Ariman »

Добавил чтение темы письма с учетом кодировки сообщения. Версия для теста.
Attachments
pst_update3_x64.7z
(77.5 KiB) Downloaded 64 times
pst_update3_x86.7z
(69.23 KiB) Downloaded 67 times
User avatar
HaRT
Moderator
Posts: 10867
Joined: Tue 30 Aug, 2005 17:21
Has thanked: 221 times
Been thanked: 358 times

Observer — распаковка файлов из различных контейнеров

Post by HaRT »

Ariman wrote: чтение темы письма с учетом кодировки сообщения
На том файле не циклится. Кириллица в названии папок–сообщений нормальная. Спасибо.
16:36 MSK
Только вот в той папке с письмами (она внутри [i][b]PST:\Top of Personal Folders\Inbox[/b][/i]) сами папки сообщений пустые — ни тела, ни вложений. :( А в соседней папке там же — нормальные. Где посмотреть, что там происходит?
Фар есть инструмент, а не нянька. © 2009 DrKnS
Ariman
Posts: 1351
Joined: Fri 30 Nov, 2007 15:32
Location: Крым
Has thanked: 15 times
Been thanked: 50 times
Contact:

Observer — распаковка файлов из различных контейнеров

Post by Ariman »

HaRT wrote:На том файле не циклится. Кириллица в названии папок–сообщений нормальная.
Отлично. Спасибо за тест, наугад правки делал :).
HaRT wrote:Где посмотреть, что там происходит?
Создание всех псевдо-файлов происходит в process_message, чуть дальше того места где цикл с проверкой дубликатов. Обновил дебажную сборку и исходники по прежним ссылкам.
User avatar
HaRT
Moderator
Posts: 10867
Joined: Tue 30 Aug, 2005 17:21
Has thanked: 221 times
Been thanked: 358 times

Observer — распаковка файлов из различных контейнеров

Post by HaRT »

Ariman wrote: Обновил дебажную сборку
Да я же всё равно сам собираю — сначала не смог легко найти [i][b]MSVCR100[u]D[/u].DLL[/b][/i] из надёжного источника, а потом и вовсе стал правки вносить.
Фар есть инструмент, а не нянька. © 2009 DrKnS
User avatar
HaRT
Moderator
Posts: 10867
Joined: Tue 30 Aug, 2005 17:21
Has thanked: 221 times
Been thanked: 358 times

Observer — распаковка файлов из различных контейнеров

Post by HaRT »

Ariman wrote: Создание всех псевдо-файлов происходит в process_message
Оказывается, в той злополучной папке у пары писем всё-таки есть заголовки и тело. А для остальных функции m.has_body(), m.has_html_body(), m.has_compressed_rtf_body(), m.has_transport_headers() просто возвращают false. Впрочем, и сам Аутлук не может показать их тело или открыть их на просмотр.

Однако для них всё же показываются From, Size, Modified time, Attachment (скрепка). В связи с этим пожелание: отображать From в колонку Owner, Size — в колонку Size, Modified time — в колонку Last Access (доступна в предопределённых режимах панелей) либо же Change Time (доступна в настройке режима панели), Attachments — либо в атрибут A, либо в колонку Number of data streams.
Фар есть инструмент, а не нянька. © 2009 DrKnS
User avatar
HaRT
Moderator
Posts: 10867
Joined: Tue 30 Aug, 2005 17:21
Has thanked: 221 times
Been thanked: 358 times

Observer — распаковка файлов из различных контейнеров

Post by HaRT »

HaRT wrote: собирал в 2013-ой Студии — потребовалось сделать всего 3 мелкие правки в 2 заголовочниках из pstsdk.
Вот они:
  1. --- Observer/modules/pst/pstsdk/ndb/node.h
  2.  
  3. +++ Observer/modules/pst/pstsdk/ndb/node.h  Fri Mar 18 20:47:53 2016
  4.  
  5. @@ -113 +113 @@ class node_impl : public std::tr1::enable_shared_f
  6.  
  7. -    bool is_subnode() { return m_pcontainer_node; }
  8.  
  9. +    bool is_subnode() { return !!m_pcontainer_node; }
  10.  
  11. --- Observer/modules/pst/pstsdk/ltp/nameid.h
  12.  
  13. +++ Observer/modules/pst/pstsdk/ltp/nameid.h    Fri Mar 18 20:50:19 2016
  14.  
  15. @@ -271 +271 @@ inline std::vector<prop_id> pstsdk::name_id_map::g
  16.  
  17. -    while(m_entry_stream.read((char*)&entry, sizeof(entry)) != 0)
  18.  
  19. +    while(!!m_entry_stream.read((char*)&entry, sizeof(entry)))
  20.  
  21. @@ -315 +315 @@ inline pstsdk::prop_id pstsdk::name_id_map::lookup
  22.  
  23. -    while(bucket.read((char*)&entry, sizeof(entry)) != 0)
  24.  
  25. +    while(!!bucket.read((char*)&entry, sizeof(entry)))
Фар есть инструмент, а не нянька. © 2009 DrKnS
Ariman
Posts: 1351
Joined: Fri 30 Nov, 2007 15:32
Location: Крым
Has thanked: 15 times
Been thanked: 50 times
Contact:

Observer — распаковка файлов из различных контейнеров

Post by Ariman »

HaRT wrote:В связи с этим пожелание
Это, в смысле, у кого отображать, у каталога? Внутри то файлов никаких нет.
HaRT wrote:Вот они:
А что это за мощное колдунство с !!?
User avatar
HaRT
Moderator
Posts: 10867
Joined: Tue 30 Aug, 2005 17:21
Has thanked: 221 times
Been thanked: 358 times

Observer — распаковка файлов из различных контейнеров

Post by HaRT »

Ariman wrote: у кого отображать, у каталога
Да, именно у каталога. Впрочем, если FarAPI не позволяет установить Size каталогу, то можно те, которые получаются пустыми, отображать файлами (и выключить у панели “Show directories first”).
Ariman wrote:А что это за мощное колдунство с !!?
Двойное отрицание — простейший из известных мне способов явного (explicit) приведения значения к bool. :)
Фар есть инструмент, а не нянька. © 2009 DrKnS
Ariman
Posts: 1351
Joined: Fri 30 Nov, 2007 15:32
Location: Крым
Has thanked: 15 times
Been thanked: 50 times
Contact:

Observer — распаковка файлов из различных контейнеров

Post by Ariman »

HaRT wrote:если FarAPI не позволяет установить Size каталогу
API то позволяет, но сам Фар не показывает в колонке Size чисел для каталогов.
HaRT wrote:Двойное отрицание — простейший из известных мне способов явного (explicit) приведения значения к bool
Оригинально :). Я уж было подумал, что какой-то новый оператор ввели.
HaRT wrote: Attachments — либо в атрибут A, либо в колонку Number of data streams.
А у тех сообщений есть аттачи? Они по идее должны отдельными файлами появиться.

Есть какие-то мысли как такие сообщения получить в аутлуке? Хотелось бы для тестов такое создать, чтобы самому пощупать.
User avatar
HaRT
Moderator
Posts: 10867
Joined: Tue 30 Aug, 2005 17:21
Has thanked: 221 times
Been thanked: 358 times

Observer — распаковка файлов из различных контейнеров

Post by HaRT »

Ariman wrote: А у тех сообщений есть аттачи? Они по идее должны отдельными файлами появиться.
Аутлук показывает — скрепкой в соответствующей колонке — что вложения есть, но в самом письме их даже не перечисляет (думаю, потому же, почему и не показывает тело письма).
Ariman wrote: Есть какие-то мысли как такие сообщения получить в аутлуке? Хотелось бы для тестов такое создать, чтобы самому пощупать.
Тот ящик у меня был в Outlook 2003 натравлен через IMAP на сервер, которого давно нет. Какие настройки использовались для получения почты, я уже и не помню, но вроде бы при скачивании письма с сервера не удалялись. Т.ч. есть шанс, что эти пустые письма и не были скачаны. Однако есть и ещё одно интересное обстоятельство: лишь у нескольких из этих проблемных писем показывается флаг Заголовок, обычный для нескчанных писем.
Фар есть инструмент, а не нянька. © 2009 DrKnS
Post Reply

Return to “Обсуждение плагинов”