X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/19008b7bb87c7fdbc2c6fd9b44f6ab24ca4d6c47..cbeda384e51acb82e13994cb67ac1714669cae10:/include/wx/filesys.h diff --git a/include/wx/filesys.h b/include/wx/filesys.h index 071b33ebe9..51f06fad21 100644 --- a/include/wx/filesys.h +++ b/include/wx/filesys.h @@ -1,20 +1,18 @@ ///////////////////////////////////////////////////////////////////////////// -// Name: filesys.h +// Name: wx/filesys.h // Purpose: class for opening files - virtual file system // Author: Vaclav Slavik // Copyright: (c) 1999 Vaclav Slavik // RCS-ID: $Id$ -// Licence: wxWindows Licence +// Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// #ifndef __FILESYS_H__ #define __FILESYS_H__ -#ifdef __GNUG__ -#pragma interface -#endif +#include "wx/defs.h" -#include "wx/setup.h" +#if wxUSE_FILESYSTEM #if !wxUSE_STREAMS #error You cannot compile virtual file systems without wxUSE_STREAMS @@ -24,15 +22,14 @@ #error You cannot compile wxHTML without virtual file systems #endif -#if wxUSE_FILESYSTEM - #include "wx/stream.h" -#include "wx/url.h" #include "wx/datetime.h" +#include "wx/filename.h" +#include "wx/hashmap.h" -class wxFSFile; -class wxFileSystemHandler; -class wxFileSystem; +class WXDLLIMPEXP_FWD_BASE wxFSFile; +class WXDLLIMPEXP_FWD_BASE wxFileSystemHandler; +class WXDLLIMPEXP_FWD_BASE wxFileSystem; //-------------------------------------------------------------------------------- // wxFSFile @@ -41,41 +38,68 @@ class wxFileSystem; // (in 'index.htm#chapter2', 'chapter2' is anchor) //-------------------------------------------------------------------------------- -class WXDLLEXPORT wxFSFile : public wxObject +class WXDLLIMPEXP_BASE wxFSFile : public wxObject { public: - wxFSFile(wxInputStream *stream, const wxString& loc, - const wxString& mimetype, const wxString& anchor, - wxDateTime modif) + wxFSFile(wxInputStream *stream, const wxString& loc, + const wxString& mimetype, const wxString& anchor +#if wxUSE_DATETIME + , wxDateTime modif +#endif // wxUSE_DATETIME + ) { m_Stream = stream; m_Location = loc; - m_MimeType = mimetype; m_MimeType.MakeLower(); + m_MimeType = mimetype.Lower(); m_Anchor = anchor; +#if wxUSE_DATETIME m_Modif = modif; +#endif // wxUSE_DATETIME + } + + virtual ~wxFSFile() { delete m_Stream; } + + // returns stream. This doesn't give away ownership of the stream object. + wxInputStream *GetStream() const { return m_Stream; } + + // gives away the ownership of the current stream. + wxInputStream *DetachStream() + { + wxInputStream *stream = m_Stream; + m_Stream = NULL; + return stream; } - virtual ~wxFSFile() { if (m_Stream) delete m_Stream; } - // returns stream. This doesn't _create_ stream, it only returns - // pointer to it!! - wxInputStream *GetStream() const {return m_Stream;} + // deletes the current stream and takes ownership of another. + void SetStream(wxInputStream *stream) + { + delete m_Stream; + m_Stream = stream; + } // returns file's mime type - const wxString& GetMimeType() const {return m_MimeType;} + const wxString& GetMimeType() const; // returns the original location (aka filename) of the file - const wxString& GetLocation() const {return m_Location;} + const wxString& GetLocation() const { return m_Location; } - const wxString& GetAnchor() const {return m_Anchor;} + const wxString& GetAnchor() const { return m_Anchor; } - wxDateTime GetModificationTime() const {return m_Modif;} +#if wxUSE_DATETIME + wxDateTime GetModificationTime() const { return m_Modif; } +#endif // wxUSE_DATETIME private: wxInputStream *m_Stream; wxString m_Location; wxString m_MimeType; wxString m_Anchor; +#if wxUSE_DATETIME wxDateTime m_Modif; +#endif // wxUSE_DATETIME + + DECLARE_ABSTRACT_CLASS(wxFSFile) + wxDECLARE_NO_COPY_CLASS(wxFSFile); }; @@ -89,12 +113,12 @@ private: // kinds of files (HTPP, FTP, local, tar.gz etc..) //-------------------------------------------------------------------------------- -class WXDLLEXPORT wxFileSystemHandler : public wxObject +class WXDLLIMPEXP_BASE wxFileSystemHandler : public wxObject { public: wxFileSystemHandler() : wxObject() {} - // returns TRUE if this handler is able to open given location + // returns true if this handler is able to open given location virtual bool CanOpen(const wxString& location) = 0; // opens given file and returns pointer to input stream. @@ -108,28 +132,28 @@ public: virtual wxString FindFirst(const wxString& spec, int flags = 0); virtual wxString FindNext(); + // Returns MIME type of the file - w/o need to open it + // (default behaviour is that it returns type based on extension) + static wxString GetMimeTypeFromExt(const wxString& location); + protected: // returns protocol ("file", "http", "tar" etc.) The last (most right) // protocol is used: // {it returns "tar" for "file:subdir/archive.tar.gz#tar:/README.txt"} - wxString GetProtocol(const wxString& location) const; + static wxString GetProtocol(const wxString& location); // returns left part of address: // {it returns "file:subdir/archive.tar.gz" for "file:subdir/archive.tar.gz#tar:/README.txt"} - wxString GetLeftLocation(const wxString& location) const; + static wxString GetLeftLocation(const wxString& location); // returns anchor part of address: // {it returns "anchor" for "file:subdir/archive.tar.gz#tar:/README.txt#anchor"} // NOTE: anchor is NOT a part of GetLeftLocation()'s return value - wxString GetAnchor(const wxString& location) const; + static wxString GetAnchor(const wxString& location); // returns right part of address: // {it returns "/README.txt" for "file:subdir/archive.tar.gz#tar:/README.txt"} - wxString GetRightLocation(const wxString& location) const; - - // Returns MIME type of the file - w/o need to open it - // (default behaviour is that it returns type based on extension) - wxString GetMimeTypeFromExt(const wxString& location); + static wxString GetRightLocation(const wxString& location); DECLARE_ABSTRACT_CLASS(wxFileSystemHandler) }; @@ -143,18 +167,28 @@ protected: // kinds of files (HTPP, FTP, local, tar.gz etc..) //-------------------------------------------------------------------------------- -class WXDLLEXPORT wxFileSystem : public wxObject +// Open Bit Flags +enum wxFileSystemOpenFlags +{ + wxFS_READ = 1, // Open for reading + wxFS_SEEKABLE = 4 // Returned stream will be seekable +}; + +WX_DECLARE_VOIDPTR_HASH_MAP_WITH_DECL(wxFileSystemHandler*, wxFSHandlerHash, class WXDLLIMPEXP_BASE); + +class WXDLLIMPEXP_BASE wxFileSystem : public wxObject { public: - wxFileSystem() : wxObject() {m_Path = m_LastName = wxEmptyString; m_Handlers.DeleteContents(TRUE); m_FindFileHandler = NULL;} + wxFileSystem() : wxObject() { m_FindFileHandler = NULL;} + virtual ~wxFileSystem(); // sets the current location. Every call to OpenFile is // relative to this location. // NOTE !! - // unless is_dir = TRUE 'location' is *not* the directory but + // unless is_dir = true 'location' is *not* the directory but // file contained in this directory // (so ChangePathTo("dir/subdir/xh.htm") sets m_Path to "dir/subdir/") - void ChangePathTo(const wxString& location, bool is_dir = FALSE); + void ChangePathTo(const wxString& location, bool is_dir = false); wxString GetPath() const {return m_Path;} @@ -163,7 +197,7 @@ public: // It first tries to open the file in relative scope // (based on ChangePathTo()'s value) and then as an absolute // path. - wxFSFile* OpenFile(const wxString& location); + wxFSFile* OpenFile(const wxString& location, int flags = wxFS_READ); // Finds first/next file that matches spec wildcard. flags can be wxDIR for restricting // the query to directories or wxFILE for files only or 0 for either. @@ -171,14 +205,33 @@ public: wxString FindFirst(const wxString& spec, int flags = 0); wxString FindNext(); + // find a file in a list of directories, returns false if not found + bool FindFileInPath(wxString *pStr, + const wxString& path, const wxString& file); + // Adds FS handler. - // In fact, this class is only front-end to the FS hanlers :-) + // In fact, this class is only front-end to the FS handlers :-) static void AddHandler(wxFileSystemHandler *handler); + // Removes FS handler + static wxFileSystemHandler* RemoveHandler(wxFileSystemHandler *handler); + + // Returns true if there is a handler which can open the given location. + static bool HasHandlerForPath(const wxString& location); + // remove all items from the m_Handlers list static void CleanUpHandlers(); + // Returns the native path for a file URL + static wxFileName URLToFileName(const wxString& url); + + // Returns the file URL for a native path + static wxString FileNameToURL(const wxFileName& filename); + + protected: + wxFileSystemHandler *MakeLocal(wxFileSystemHandler *h); + wxString m_Path; // the path (location) we are currently in // this is path, not file! @@ -190,8 +243,11 @@ protected: // list of FS handlers wxFileSystemHandler *m_FindFileHandler; // handler that succeed in FindFirst query + wxFSHandlerHash m_LocalHandlers; + // Handlers local to this instance DECLARE_DYNAMIC_CLASS(wxFileSystem) + wxDECLARE_NO_COPY_CLASS(wxFileSystem); }; @@ -219,20 +275,20 @@ special characters : */ -class wxLocalFSHandler : public wxFileSystemHandler +class WXDLLIMPEXP_BASE wxLocalFSHandler : public wxFileSystemHandler { public: virtual bool CanOpen(const wxString& location); virtual wxFSFile* OpenFile(wxFileSystem& fs, const wxString& location); virtual wxString FindFirst(const wxString& spec, int flags = 0); virtual wxString FindNext(); - + // wxLocalFSHandler will prefix all filenames with 'root' before accessing // files on disk. This effectively makes 'root' the top-level directory - // and prevents access to files outside this directory. + // and prevents access to files outside this directory. // (This is similar to Unix command 'chroot'.) static void Chroot(const wxString& root) { ms_root = root; } - + protected: static wxString ms_root; };