В настоящее время я пытаюсь реализовать приложение, которое чрезмерно использует wxWebView.Я использую статические страницы, а также динамические страницы, которые хранятся / кэшируются на ПК пользователя.Для приложения я хочу использовать две схемы / протоколы:
static://
и profile://
Цель состоит в том, чтобы они обрабатывали локальный контент, но облегчали его решение.Например, код перевода для статических сайтов:
wxString Mainframe::GetStaticContent(wxString file)
{
// Choose based on language
wxString language = wxGetApp().GetSelectedLanguage();
// Construct Filename
wxFileName fname(wxGetApp().GetAppPath() + wxString("/static/") + language + wxString("/") + file + wxString(".html"));
// Return full path, which is corrected by wxWidgets
return fname.GetFullPath();
}
URL для использования этого будет выглядеть так:
static://start
Теперь у меня есть класс, который наследуется от wxWebViewHandler, чтобы это произошло:
class WebViewHandlerStatic : public wxWebViewHandler
{
public:
WebViewHandlerStatic(const wxString& protocol, Mainframe* parent)
: wxWebViewHandler(protocol), m_parent(parent)
{
m_fs = new wxFileSystem();
}
virtual WebViewHandlerStatic::~WebViewHandlerStatic()
{
wxDELETE(m_fs);
}
virtual wxFSFile* GetFile (const wxString &uri)
{
wxString content = uri.substr(9, uri.length()).BeforeLast('/');
wxString path = m_parent->GetStaticContent(content);
if ( wxFileName::FileExists(path) && wxFileSystem::HasHandlerForPath(path) )
{
//path = wxFileSystem::FileNameToURL(path);
return m_fs->OpenFile(path);
}
else
return NULL;
}
private:
Mainframe* m_parent;
wxFileSystem* m_fs;
};
Однако проблема в том, что если я нажму на ссылку static: // about или любого другого с этим протоколом, ничего не произойдет.Я пробовал с и без FilenameToURL ().Я также проверил в отладчике, путь действителен после его построения.Но страница не меняется.
Кто-нибудь имеет представление об этом?
edit:
Временное решение:
class WebViewHandlerStatic : public wxWebViewHandler
{
public:
WebViewHandlerStatic(const wxString& protocol, Mainframe* parent)
: wxWebViewHandler(protocol), m_parent(parent)
{
//m_fs = new wxFileSystem();
}
virtual WebViewHandlerStatic::~WebViewHandlerStatic()
{
//wxDELETE(m_fs);
}
virtual wxFSFile* GetFile (const wxString &uri)
{
wxString content = uri.substr(9, uri.length()).BeforeLast('/');
wxFileName path = m_parent->GetStaticContent(content);
wxString url = path.GetFullPath();
if ( wxFileSystem::HasHandlerForPath(url) )
{
m_parent->LoadURL(url);
// The content of url is in this state: "d:\Source\wxSteamStats\bin\static\en_GB\about.html" (Copied from debugger)
}
return NULL;
}
private:
Mainframe* m_parent;
wxFileSystem* m_fs;
};
Это работает без каких-либо исключений.Поэтому я не совсем уверен, зачем здесь вообще нужен wxFileSystem или как он работает внутри.Я посмотрел на код компонента, но я не знаком с API IE.Мне кажется, что настоящий документ никогда не передается в IE.Или мне нужно «кормить» источник где-то до контроля?Я не смог обнаружить что-то подобное в исходном коде wxArchiveWebHandler или в примере.