+wxFSFile *wxHtmlWinParser::OpenURL(wxHtmlURLType type,
+ const wxString& url) const
+{
+ if ( !m_windowInterface )
+ return wxHtmlParser::OpenURL(type, url);
+
+ wxString myurl(url);
+ wxHtmlOpeningStatus status;
+ for (;;)
+ {
+ wxString myfullurl(myurl);
+
+ // consider url as absolute path first
+ wxURI current(myurl);
+ myfullurl = current.BuildUnescapedURI();
+
+ // if not absolute then ...
+ if( current.IsReference() )
+ {
+ wxString basepath = GetFS()->GetPath();
+ wxURI base(basepath);
+
+ // ... try to apply base path if valid ...
+ if( !base.IsReference() )
+ {
+ wxURI path(myfullurl);
+ path.Resolve( base );
+ myfullurl = path.BuildUnescapedURI();
+ }
+ else
+ {
+ // ... or force such addition if not included already
+ if( !current.GetPath().Contains(base.GetPath()) )
+ {
+ basepath += myurl;
+ wxURI connected( basepath );
+ myfullurl = connected.BuildUnescapedURI();
+ }
+ }
+ }
+
+ wxString redirect;
+ status = m_windowInterface->OnHTMLOpeningURL(type, myfullurl, &redirect);
+ if ( status != wxHTML_REDIRECT )
+ break;
+
+ myurl = redirect;
+ }
+
+ if ( status == wxHTML_BLOCK )
+ return NULL;
+
+ int flags = wxFS_READ;
+ if (type == wxHTML_URL_IMAGE)
+ flags |= wxFS_SEEKABLE;
+
+ return GetFS()->OpenFile(myurl, flags);
+}