/
webviewarchivehandler.cpp
118 lines (102 loc) · 3.44 KB
/
webviewarchivehandler.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
/////////////////////////////////////////////////////////////////////////////
// Name: webviewfilehandler.cpp
// Purpose: Custom webview handler to allow archive browsing
// Author: Steven Lamerton
// Id: $Id$
// Copyright: (c) 2011 Steven Lamerton
// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
// For compilers that support precompilation, includes "wx.h".
#include "wx/wxprec.h"
#if wxUSE_WEBVIEW
#if defined(__BORLANDC__)
#pragma hdrstop
#endif
#include "wx/webviewarchivehandler.h"
#include "wx/filesys.h"
//Taken from wx/filesys.cpp
static wxString EscapeFileNameCharsInURL(const char *in)
{
wxString s;
for ( const unsigned char *p = (const unsigned char*)in; *p; ++p )
{
const unsigned char c = *p;
if ( c == '/' || c == '-' || c == '.' || c == '_' || c == '~' ||
(c >= '0' && c <= '9') ||
(c >= 'a' && c <= 'z') ||
(c >= 'A' && c <= 'Z') )
{
s << c;
}
else
{
s << wxString::Format("%%%02x", c);
}
}
return s;
}
wxWebViewArchiveHandler::wxWebViewArchiveHandler(const wxString& scheme) :
wxWebViewHandler(scheme)
{
m_fileSystem = new wxFileSystem();
}
wxWebViewArchiveHandler::~wxWebViewArchiveHandler()
{
wxDELETE(m_fileSystem);
}
wxFSFile* wxWebViewArchiveHandler::GetFile(const wxString &uri)
{
//If there is a fragment at the end of the path then we need to strip it
//off as not all backends do this for us
wxString path = uri;
size_t hashloc = uri.find('#');
if(hashloc != wxString::npos)
{
path = uri.substr(0, hashloc);
}
//We iterate through the string to see if there is a protocol description
size_t start = wxString::npos;
for(size_t i = 0; i < path.length(); i++)
{
if(path[i] == ';' && path.substr(i, 10) == ";protocol=")
{
start = i;
break;
}
}
//We do not have a protocol string so we just pass the path withouth the
if(start == wxString::npos)
{
size_t doubleslash = path.find("//");
//The path is incorrectly formed without // after the scheme
if(doubleslash == wxString::npos)
return NULL;
wxString fspath = "file:" +
EscapeFileNameCharsInURL(path.substr(doubleslash + 2).c_str());
return m_fileSystem->OpenFile(fspath);
}
//Otherwise we need to extract the protocol
else
{
size_t end = path.find('/', start);
//For the path to be valid there must to a path after the protocol
if(end == wxString::npos)
{
return NULL;
}
wxString mainpath = path.substr(0, start);
wxString archivepath = path.substr(end);
wxString protstring = path.substr(start, end - start);
wxString protocol = protstring.substr(10);
//We can now construct the correct path
size_t doubleslash = path.find("//");
//The path is incorrectly formed without // after the first protocol
if(doubleslash == wxString::npos)
return NULL;
wxString fspath = "file:" +
EscapeFileNameCharsInURL(mainpath.substr(doubleslash + 2).c_str())
+ "#" + protocol +":" + archivepath;
return m_fileSystem->OpenFile(fspath);
}
}
#endif // wxUSE_WEBVIEW