使用wxWebViewHandler注册协议

时间:2012-01-30 17:46:28

标签: c++ wxwidgets

我目前正在尝试实现一个过度使用wxWebView的应用程序。我使用静态页面以及在用户PC上存储/缓存的动态页面。对于该应用程序,我希望使用两种方案/协议:

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();
}

使用它的网址看起来像这样:

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()。我还检查了调试器,路径在构建后是有效的。但页面不会改变。

有人对此有任何见解吗?

编辑:

临时解决方法:

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或者它是如何工作的。我查看了组件的代码,但我不熟悉IE的API。对我来说,看起来实际的文件从未给IE。或者我是否必须将源“馈送”到控件的某个地方?我无法在wxArchiveWebHandler或示例的源代码中发现类似的内容。

1 个答案:

答案 0 :(得分:1)

我刚刚通过使用以下类对此进行了测试,该类对您进行了一些小的更改。

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,并希望它能正常工作。