wxHtmlWindow LoadPage и картинки

Это русская секция форума wxWidjets. В этой секции вы можете обсуждать любые вопросы, связанные с wxWidgets на вашем родном языке.
Post Reply
tramvon
Earned a small fee
Earned a small fee
Posts: 15
Joined: Sat Mar 25, 2017 5:27 am

wxHtmlWindow LoadPage и картинки

Post by tramvon »

Здравствуйте!

wxWidgets 3.1.0

Создал я wxHtmlWindow, создал startpgtpl.htm и в ней картинки <IMG> с SRC без указания пути, только имя. Работает, все грузится и отображается.
Загружал через LoadFile с указанием полного пути до основного html.

Далее мне нужно все это зашить в exe. О механизмах рассказывать не буду, имхо это не важно.
Создал обработчик протокола clires - все ссылки вида clires://bla-bla.bla идут через него, проверено. На всякий случай приведу код:

Code: Select all

bool pfsWxCliResVFS::CanOpen(const wxString& location)
{
    return (GetProtocol(location) == wxT("clires"));
}

wxFSFile* pfsWxCliResVFS::OpenFile(wxFileSystem& WXUNUSED(fs), const wxString& location)
{
    #if defined(CLIRES_VFS_DEBUG)
    {
    std::wstring loc  = location;
    std::wstring lLoc = GetLeftLocation(location);
    std::wstring rLoc = GetRightLocation(location);

    ::cli::format::cli_log::message( L"--- VFS" );
    ::cli::format::cli_log::message( L"VFS: location: [%1], left: [%2], right: [%3]", ::cli::format::arg( loc ) % lLoc % rLoc);
    }
    #endif

    std::wstring rcName = GetRightLocation(location);
    while(!rcName.empty() && rcName[0]==L'/')
       rcName.erase(0,1);

    #if defined(CLIRES_VFS_DEBUG)
    ::cli::format::cli_log::message( L"VFS: resource file name: %1", ::cli::format::arg( rcName ) );
    #endif

    ::std::string rcStr = readResourceFileHelper( rcName
                                                , 0 // ENUM_CLI_ERCMANFINDFLAGS    flags
                                                );

    if (rcStr.empty())
       {
        #if defined(CLIRES_VFS_DEBUG)
        ::cli::format::cli_log::message( L"VFS: resource file not found" );
        #endif
        return 0;
       }
    else
       {
        #if defined(CLIRES_VFS_DEBUG)
        ::cli::format::cli_log::message( L"VFS: data size: %1", ::cli::format::arg( rcStr.size() ) );
        #endif
       }

    std::string mimeType = GetMimeTypeFromExt( location );
    std::string anchor   = GetAnchor(location);
    #if defined(CLIRES_VFS_DEBUG)
    ::cli::format::cli_log::message( L"VFS: mime-type: %1, anchor: [%2]", ::cli::format::arg( mimeType.c_str() ) % anchor.c_str() );
    #endif

    wxString dataStr = wxString(rcStr.data(), (size_t)rcStr.size());

    return new wxFSFile( 
                         //new wxMemoryInputStream( (const void *)rcStr.data(), (size_t)rcStr.size())
                         new wxStringInputStream ( dataStr )
                       , location
                       , mimeType
                       , anchor
#if wxUSE_DATETIME
                       , wxDefaultDateTime
#endif // wxUSE_DATETIME
                       );
}
Протокол зарегистрирован в App::OnInit: wxFileSystem::AddHandler(new pfsWxCliResVFS);

Загружаю startpgtpl.htm как LoadPage(L"clires://startpgtpl.htm") - страница грузится, но отображается диалог: "Unknown image file format". В раскрывющихся Details - "Unknown image file format" повторяется столько раз, сколько у меня картинок в html'ке. При этом сама html'ка отображается, но нет и следа картинок.

Загружаю startpgtpl.htm как LoadPage(L"file:startpgtpl.htm") - страница грузится без ошибок (без диалогов), но на месте картинок квадратики с красным крестом - типа не удалось загрузить.

По моим логам - видно, что из моего VFS хэндлера наверх все отдается корректно. Но решил потестить на всякий случай. Есть в ресурсах файл configuration.xml. Добавил на него ссылки из главной html'ки как "clires://configuration.xml" и как "configuration.xml". Обе ссылки обрабатываются нормально, вне зависимости от того, гружу я основной файл из своих ресурсов или с диска (в этом случае configuration.xml должна лежать рядом со страничкой). При переходе оба варианта отображают этот xml как простой текст.

Попробовал побегать в отладчике по wxWidgets - выяснил, что были незарегистрированны обработчики I/O для форматов картинок. Хотя PNG при чтении базового HTML из файла (LoadFile) и так работало. Добавил регистрацию обработчиков - wxInitAllImageHandlers(); Ничего не изменилось.

А потом я там заблудился. Не пойму, что где и как не то и не так. Я ресурсы отдаю:

Code: Select all

[Sat Mar 25 09:29:17 2017] --- VFS
[Sat Mar 25 09:29:17 2017] VFS: location: [clires://startpgtpl.htm], left: [], right: [//startpgtpl.htm]
[Sat Mar 25 09:29:17 2017] VFS: resource file name: startpgtpl.htm
[Sat Mar 25 09:29:17 2017] VFS: data size: 2232
[Sat Mar 25 09:29:17 2017] VFS: mime-type: text/html, anchor: []
[Sat Mar 25 09:29:17 2017] --- VFS
[Sat Mar 25 09:29:17 2017] VFS: location: [clires:sp_arrow.jpg], left: [], right: [sp_arrow.jpg]
[Sat Mar 25 09:29:17 2017] VFS: resource file name: sp_arrow.jpg
[Sat Mar 25 09:29:17 2017] VFS: data size: 1197
[Sat Mar 25 09:29:17 2017] VFS: mime-type: image/jpeg, anchor: []
[Sat Mar 25 09:29:17 2017] --- VFS
[Sat Mar 25 09:29:17 2017] VFS: location: [clires:sp_arrow_small.jpg], left: [], right: [sp_arrow_small.jpg]
[Sat Mar 25 09:29:17 2017] VFS: resource file name: sp_arrow_small.jpg
[Sat Mar 25 09:29:17 2017] VFS: data size: 840
[Sat Mar 25 09:29:17 2017] VFS: mime-type: image/jpeg, anchor: []
[Sat Mar 25 09:29:17 2017] --- VFS
[Sat Mar 25 09:29:17 2017] VFS: location: [clires:sp_arrow_small.png], left: [], right: [sp_arrow_small.png]
[Sat Mar 25 09:29:17 2017] VFS: resource file name: sp_arrow_small.png
[Sat Mar 25 09:29:17 2017] VFS: data size: 211
[Sat Mar 25 09:29:17 2017] VFS: mime-type: image/png, anchor: []
[Sat Mar 25 09:29:17 2017] --- VFS
[Sat Mar 25 09:29:17 2017] VFS: location: [clires:sp_arrow_small.png], left: [], right: [sp_arrow_small.png]
[Sat Mar 25 09:29:17 2017] VFS: resource file name: sp_arrow_small.png
[Sat Mar 25 09:29:18 2017] VFS: data size: 211
[Sat Mar 25 09:29:18 2017] VFS: mime-type: image/png, anchor: []
[Sat Mar 25 09:29:18 2017] --- VFS
[Sat Mar 25 09:29:18 2017] VFS: location: [clires:], left: [], right: []
[Sat Mar 25 09:29:18 2017] VFS: resource file name: 
[Sat Mar 25 09:29:18 2017] File '' not found in resource paths at all.
[Sat Mar 25 09:29:18 2017] File '' not found in builtin resources at all.
[Sat Mar 25 09:29:18 2017] VFS: resource file not found
[Sat Mar 25 09:29:18 2017] --- VFS
[Sat Mar 25 09:29:18 2017] VFS: location: [clires:popcorn1.gif], left: [], right: [popcorn1.gif]
[Sat Mar 25 09:29:18 2017] VFS: resource file name: popcorn1.gif
[Sat Mar 25 09:29:18 2017] VFS: data size: 14749
[Sat Mar 25 09:29:18 2017] VFS: mime-type: image/gif, anchor: []
[Sat Mar 25 09:29:18 2017] --- VFS
[Sat Mar 25 09:29:18 2017] VFS: location: [clires:popcorn2.gif], left: [], right: [popcorn2.gif]
[Sat Mar 25 09:29:18 2017] VFS: resource file name: popcorn2.gif
[Sat Mar 25 09:29:18 2017] VFS: data size: 8743
[Sat Mar 25 09:29:18 2017] VFS: mime-type: image/gif, anchor: []
PS Думаю, надо написать и в английскую ветку, но пока не понял, в какой раздел лучше, я тут впервой, посоветуйте :)
User avatar
T-Rex
Moderator
Moderator
Posts: 1248
Joined: Sat Oct 23, 2004 9:58 am
Location: Zaporizhzhya, Ukraine
Contact:

Re: wxHtmlWindow LoadPage и картинки

Post by T-Rex »

Вероятно, до загрузки страницы нужно проинициализировать все image handler'ы.

Как вариант, сравнить md5 от файла и от загруженного массива байт из протокола.

А еще поговаривают что в этом проекте есть примеры. https://sourceforge.net/p/mahogany/m/ci/master/tree/
tramvon
Earned a small fee
Earned a small fee
Posts: 15
Joined: Sat Mar 25, 2017 5:27 am

Re: wxHtmlWindow LoadPage и картинки

Post by tramvon »

T-Rex wrote:Вероятно, до загрузки страницы нужно проинициализировать все image handler'ы.
Я об этом писал:
Попробовал побегать в отладчике по wxWidgets - выяснил, что были незарегистрированны обработчики I/O для форматов картинок. Хотя PNG при чтении базового HTML из файла (LoadFile) и так работало. Добавил регистрацию обработчиков - wxInitAllImageHandlers(); Ничего не изменилось.
T-Rex wrote: Как вариант, сравнить md5 от файла и от загруженного массива байт из протокола.
Да, отличается. Проблема оказалась в том, что я использую wxString и wxStringInputStream, а он MBCS конвертацию делает. Получается, что wxString нельзя использовать как массив байт и не понятно, что тогда вообще wxStringInputStream делает. Да и стало как-то страшно свои старые проекты под новую версию перетаскивать, что там отвалится. До этого использовал wxMemoryInputStream, тоже не работало, потому что, как оказалось, что он не копирует буфер, и буфер должен жить не меньше объекта stream'а, а как это сделать, если я по new его создаю?
Тут надо какую-то другую реализацию input stream'а использовать, но я не нашел, какую. Ну, или в своем объекте, который реализует VFS, хранить. Это как-то через одно место, не понятно, когда строки можно освобождать. Вечно что-ли хранить?

UPD Вообщем, сделал кэш, в котором вечно храню std::string'и и через wxMemoryInputStream отдаю - из ресурсов все грузится нормально, картинки на месте. Но - почему та же страничка не грузит картинки, когда загружается из файла, показывая красные крестики?
User avatar
T-Rex
Moderator
Moderator
Posts: 1248
Joined: Sat Oct 23, 2004 9:58 am
Location: Zaporizhzhya, Ukraine
Contact:

Re: wxHtmlWindow LoadPage и картинки

Post by T-Rex »

Получается, что wxString нельзя использовать как массив байт и не понятно, что тогда вообще wxStringInputStream делает
А так вообще не надо делать. Зачем вообще тут wxString если данные бинарные? вон wxMemoryInputStream есть, wxMemoryBuffer для этого. С виртуального файла в памяти можно сразу input stream получить. А из стрима сразу в конструктор wxImage.
Post Reply