wxFSFile* wxFileSystem::OpenFile(const wxString& location) { wxString loc = MakeCorrectPath(location); unsigned i, ln; wxChar meta; wxFSFile *s = NULL; wxList::compatibility_iterator node; ln = loc.Length(); meta = 0; for (i = 0; i < ln; i++) { switch (loc[i]) { case wxT('/') : case wxT(':') : case wxT('#') : meta = loc[i]; break; } if (meta != 0) break; } m_LastName = wxEmptyString; // try relative paths first : if (meta != wxT(':')) { node = m_Handlers.GetFirst(); while (node) { wxFileSystemHandler *h = (wxFileSystemHandler*) node -> GetData(); if (h->CanOpen(m_Path + loc)) { s = h->OpenFile(*this, m_Path + loc); if (s) { m_LastName = m_Path + loc; break; } } node = node->GetNext(); } } // if failed, try absolute paths : if (s == NULL) { node = m_Handlers.GetFirst(); while (node) { wxFileSystemHandler *h = (wxFileSystemHandler*) node->GetData(); if (h->CanOpen(loc)) { s = h->OpenFile(*this, loc); if (s) { m_LastName = loc; break; } } node = node->GetNext(); } } return (s); }
void wxFileSystem::ChangePathTo(const wxString& location, bool is_dir) { int i, pathpos = -1; m_Path = MakeCorrectPath(location); if (is_dir) { if (!m_Path.empty() && m_Path.Last() != wxT('/') && m_Path.Last() != wxT(':')) m_Path << wxT('/'); } else { for (i = m_Path.length()-1; i >= 0; i--) { if (m_Path[(unsigned int) i] == wxT('/')) { if ((i > 1) && (m_Path[(unsigned int) (i-1)] == wxT('/')) && (m_Path[(unsigned int) (i-2)] == wxT(':'))) { i -= 2; continue; } else { pathpos = i; break; } } else if (m_Path[(unsigned int) i] == wxT(':')) { pathpos = i; break; } } if (pathpos == -1) { for (i = 0; i < (int) m_Path.length(); i++) { if (m_Path[(unsigned int) i] == wxT(':')) { m_Path.Remove(i+1); break; } } if (i == (int) m_Path.length()) m_Path = wxEmptyString; } else { m_Path.Remove(pathpos+1); } } }
wxFSFile* wxFileSystem::OpenFile(const wxString& location, int flags) { if ((flags & wxFS_READ) == 0) return NULL; wxString loc = MakeCorrectPath(location); unsigned i, ln; wxChar meta; wxFSFile *s = NULL; wxList::compatibility_iterator node; ln = loc.length(); meta = 0; for (i = 0; i < ln; i++) { switch ( loc[i].GetValue() ) { case wxT('/') : case wxT(':') : case wxT('#') : meta = loc[i]; break; } if (meta != 0) break; } m_LastName = wxEmptyString; // try relative paths first : if (meta != wxT(':')) { node = m_Handlers.GetFirst(); while (node) { wxFileSystemHandler *h = (wxFileSystemHandler*) node -> GetData(); if (h->CanOpen(m_Path + loc)) { s = MakeLocal(h)->OpenFile(*this, m_Path + loc); if (s) { m_LastName = m_Path + loc; break; } } node = node->GetNext(); } } // if failed, try absolute paths : if (s == NULL) { node = m_Handlers.GetFirst(); while (node) { wxFileSystemHandler *h = (wxFileSystemHandler*) node->GetData(); if (h->CanOpen(loc)) { s = MakeLocal(h)->OpenFile(*this, loc); if (s) { m_LastName = loc; break; } } node = node->GetNext(); } } if (s && (flags & wxFS_SEEKABLE) != 0 && !s->GetStream()->IsSeekable()) { wxBackedInputStream *stream; stream = new wxBackedInputStream(s->DetachStream()); stream->FindLength(); s->SetStream(stream); } return (s); }