Регистрация протокола с помощью wxWebViewHandler - PullRequest
1 голос
/ 30 января 2012

В настоящее время я пытаюсь реализовать приложение, которое чрезмерно использует 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 или в примере.

1 Ответ

1 голос
/ 30 января 2012

Я только что проверил это, используя следующий класс, который вносит несколько небольших изменений в ваш.

class WebViewHandlerStatic : public wxWebViewHandler
{
public:
    WebViewHandlerStatic(const wxString& protocol) : wxWebViewHandler(protocol)
    {
        m_fs = new wxFileSystem();
    }

    virtual WebViewHandlerStatic::~WebViewHandlerStatic()
    {
        wxDELETE(m_fs);
    }

    virtual wxFSFile* GetFile (const wxString &uri)
    {
        wxFileName path = "C:/Users/Steven/Desktop/doc.htm";
        wxString url = wxFileSystem::FileNameToURL(path);

        if (wxFileSystem::HasHandlerForPath(url))        
            return m_fs->OpenFile(url);
        else
            return NULL;
    }   
private:
    wxFileSystem* m_fs;
};

Затем я зарегистрировал его в соответствии с другим примером в образце, и он работал просто отлично. Основное отличие состоит в том, что я использовал wxFileSystem::FileNameToURL, так как wxFileSystem ожидает URI, а не путь к файлу. Я подозреваю, что когда вы раскомментируете свой вызов, происходит некоторое хитрое неявное преобразование, когда вы передаете wxString, а не wxFileName. Попробуйте вернуть fname из Mainframe::GetStaticContent, затем позвонить FileNameToURL и, надеюсь, это сработает.

...