| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502 |
- /////////////////////////////////////////////////////////////////////////////
- // Name: filesys.h
- // Purpose: interface of wxFileSystem, wxFileSystemHandler, wxFSFile
- // Author: wxWidgets team
- // Licence: wxWindows licence
- /////////////////////////////////////////////////////////////////////////////
- /**
- Open Bit Flags
- */
- enum wxFileSystemOpenFlags
- {
- wxFS_READ = 1, /**< Open for reading */
- wxFS_SEEKABLE = 4 /**< Returned stream will be seekable */
- };
- /**
- @class wxFileSystem
- This class provides an interface for opening files on different file systems.
- It can handle absolute and/or local filenames.
- It uses a system of handlers (see wxFileSystemHandler) to provide access to
- user-defined virtual file systems.
- @library{wxbase}
- @category{vfs}
- @see wxFileSystemHandler, wxFSFile, @ref overview_fs
- */
- class wxFileSystem : public wxObject
- {
- public:
- /**
- Constructor.
- The initial current path of this object will be empty
- (i.e. GetPath() == wxEmptyString) which means that e.g. OpenFile()
- or FindFirst() functions will use current working directory as
- current path (see also wxGetCwd).
- */
- wxFileSystem();
- /**
- This static function adds new handler into the list of handlers
- (see wxFileSystemHandler) which provide access to virtual FS.
- Note that if two handlers for the same protocol are added, the last
- added one takes precedence.
- @note You can call:
- @code
- wxFileSystem::AddHandler(new My_FS_Handler);
- @endcode
- This is because (a) AddHandler is a static method, and (b) the
- handlers are deleted in wxFileSystem's destructor so that you
- don't have to care about it.
- */
- static void AddHandler(wxFileSystemHandler* handler);
- /**
- Remove a filesystem handler from the list of handlers.
- */
- static wxFileSystemHandler* RemoveHandler(wxFileSystemHandler *handler);
-
- /**
- Sets the current location. @a location parameter passed to OpenFile() is
- relative to this path.
- @remarks Unless @a is_dir is @true the @a location parameter is not the
- directory name but the name of the file in this directory.
- All these commands change the path to "dir/subdir/":
- @code
- ChangePathTo("dir/subdir/xh.htm");
- ChangePathTo("dir/subdir", true);
- ChangePathTo("dir/subdir/", true);
- @endcode
- Example:
- @code
- f = fs->OpenFile("hello.htm"); // opens file 'hello.htm'
- fs->ChangePathTo("subdir/folder", true);
- f = fs->OpenFile("hello.htm"); // opens file 'subdir/folder/hello.htm' !!
- @endcode
- @param location
- the new location. Its meaning depends on the value of is_dir
- @param is_dir
- if @true location is new directory.
- If @false (the default) location is file in the new directory.
- */
- void ChangePathTo(const wxString& location, bool is_dir = false);
- /**
- Converts a wxFileName into an URL.
- @see URLToFileName(), wxFileName
- */
- static wxString FileNameToURL(const wxFileName& filename);
- /**
- Looks for the file with the given name @a file in a colon or semi-colon
- (depending on the current platform) separated list of directories in @a path.
- If the file is found in any directory, returns @true and the full path
- of the file in @a str, otherwise returns @false and doesn't modify @a str.
- @param pStr
- Receives the full path of the file, must not be @NULL
- @param path
- wxPATH_SEP-separated list of directories
- @param file
- the name of the file to look for
- */
- bool FindFileInPath(wxString* pStr, const wxString& path,
- const wxString& file);
- /**
- Works like ::wxFindFirstFile().
- Returns the name of the first filename (within filesystem's current path)
- that matches @a wildcard.
- @param wildcard
- The wildcard that the filename must match
- @param flags
- One of wxFILE (only files), wxDIR (only directories) or 0 (both).
- */
- wxString FindFirst(const wxString& wildcard, int flags = 0);
- /**
- Returns the next filename that matches the parameters passed to FindFirst().
- */
- wxString FindNext();
- /**
- Returns the actual path (set by wxFileSystem::ChangePathTo).
- */
- wxString GetPath() const;
- /**
- This static function returns @true if there is a registered handler which can
- open the given location.
- */
- static bool HasHandlerForPath(const wxString& location);
- /**
- Opens the file and returns a pointer to a wxFSFile object or @NULL if failed.
- It first tries to open the file in relative scope (based on value passed to
- ChangePathTo() method) and then as an absolute path.
- Note that the user is responsible for deleting the returned wxFSFile.
- @a flags can be one or more of the ::wxFileSystemOpenFlags values
- combined together.
- A stream opened with just the default @e wxFS_READ flag may
- or may not be seekable depending on the underlying source.
- Passing @e "wxFS_READ | wxFS_SEEKABLE" for @a flags will back
- a stream that is not natively seekable with memory or a file
- and return a stream that is always seekable.
- @note
- The @a location argument is, despite this method's name @em not
- a filename. It is a "location", aka wxFileSystem URL (see
- @ref overview_fs).
- */
- wxFSFile* OpenFile(const wxString& location,
- int flags = wxFS_READ);
- /**
- Converts URL into a well-formed filename.
- The URL must use the @c file protocol.
- */
- static wxFileName URLToFileName(const wxString& url);
- };
- /**
- @class wxFSFile
- This class represents a single file opened by wxFileSystem.
- It provides more information than wxWidgets' input streams
- (stream, filename, mime type, anchor).
- @note Any pointer returned by a method of wxFSFile is valid only as long as
- the wxFSFile object exists. For example a call to GetStream()
- doesn't @e create the stream but only returns the pointer to it.
- In other words after 10 calls to GetStream() you will have obtained
- ten identical pointers.
- @library{wxbase}
- @category{vfs,file}
- @see wxFileSystemHandler, wxFileSystem, @ref overview_fs
- */
- class wxFSFile : public wxObject
- {
- public:
- /**
- Constructor. You probably won't use it. See the Note for details.
- It is seldom used by the application programmer but you will need it if
- you are writing your own virtual FS. For example you may need something
- similar to wxMemoryInputStream, but because wxMemoryInputStream doesn't
- free the memory when destroyed and thus passing a memory stream pointer
- into wxFSFile constructor would lead to memory leaks, you can write your
- own class derived from wxFSFile:
- @code
- class wxMyFSFile : public wxFSFile
- {
- private:
- void *m_Mem;
- public:
- wxMyFSFile(.....)
- ~wxMyFSFile() {free(m_Mem);}
- // of course dtor is virtual ;-)
- };
- @endcode
- If you are not sure of the meaning of these params, see the description
- of the GetXXXX() functions.
- @param stream
- The input stream that will be used to access data
- @param location
- The full location (aka filename) of the file
- @param mimetype
- MIME type of this file. It may be left empty, in which
- case the type will be determined from file's extension (location must
- not be empty in this case).
- @param anchor
- Anchor. See GetAnchor() for details.
- @param modif
- Modification date and time for this file.
- */
- wxFSFile(wxInputStream* stream, const wxString& location,
- const wxString& mimetype, const wxString& anchor,
- wxDateTime modif);
- /**
- Detaches the stream from the wxFSFile object. That is, the
- stream obtained with GetStream() will continue its existence
- after the wxFSFile object is deleted.
- You will have to delete the stream yourself.
- */
- wxInputStream* DetachStream();
- /**
- Returns anchor (if present). The term of @b anchor can be easily
- explained using few examples:
- @verbatim
- index.htm#anchor // 'anchor' is anchor
- index/wx001.htm // NO anchor here!
- archive/main.zip#zip:index.htm#global // 'global'
- archive/main.zip#zip:index.htm // NO anchor here!
- @endverbatim
- Usually an anchor is presented only if the MIME type is 'text/html'.
- But it may have some meaning with other files; for example myanim.avi#200
- may refer to position in animation or reality.wrl#MyView may refer
- to a predefined view in VRML.
- */
- const wxString& GetAnchor() const;
- /**
- Returns full location of the file, including path and protocol.
- Examples:
- @verbatim
- http://www.wxwidgets.org
- http://www.ms.mff.cuni.cz/~vsla8348/wxhtml/archive.zip#zip:info.txt
- file:/home/vasek/index.htm
- relative-file.htm
- @endverbatim
- */
- const wxString& GetLocation() const;
- /**
- Returns the MIME type of the content of this file.
- It is either extension-based (see wxMimeTypesManager) or extracted from
- HTTP protocol Content-Type header.
- */
- const wxString& GetMimeType() const;
- /**
- Returns time when this file was modified.
- */
- wxDateTime GetModificationTime() const;
- /**
- Returns pointer to the stream.
- You can use the returned stream to directly access data.
- You may suppose that the stream provide Seek and GetSize functionality
- (even in the case of the HTTP protocol which doesn't provide
- this by default. wxHtml uses local cache to work around
- this and to speed up the connection).
- */
- wxInputStream* GetStream() const;
- };
- /**
- @class wxFileSystemHandler
- Classes derived from wxFileSystemHandler are used to access virtual file systems.
- Its public interface consists of two methods: wxFileSystemHandler::CanOpen
- and wxFileSystemHandler::OpenFile.
- It provides additional protected methods to simplify the process
- of opening the file: GetProtocol(), GetLeftLocation(), GetRightLocation(),
- GetAnchor(), GetMimeTypeFromExt().
- Please have a look at overview (see wxFileSystem) if you don't know how locations
- are constructed.
- Also consult the @ref overview_fs_wxhtmlfs "list of available handlers".
- Note that the handlers are shared by all instances of wxFileSystem.
- @remarks
- wxHTML library provides handlers for local files and HTTP or FTP protocol.
- @note
- The location parameter passed to OpenFile() or CanOpen() methods is always an
- absolute path. You don't need to check the FS's current path.
- @beginWxPerlOnly
- In wxPerl, you need to derive your file system handler class
- from @c Wx::PlFileSystemHandler.
- @endWxPerlOnly
- @library{wxbase}
- @category{vfs}
- @see wxFileSystem, wxFSFile, @ref overview_fs
- */
- class wxFileSystemHandler : public wxObject
- {
- public:
- /**
- Constructor.
- */
- wxFileSystemHandler();
- /**
- Returns @true if the handler is able to open this file. This function doesn't
- check whether the file exists or not, it only checks if it knows the protocol.
- Example:
- @code
- bool MyHand::CanOpen(const wxString& location)
- {
- return (GetProtocol(location) == "http");
- }
- @endcode
- Must be overridden in derived handlers.
- */
- virtual bool CanOpen(const wxString& location) = 0;
- /**
- Works like ::wxFindFirstFile().
- Returns the name of the first filename (within filesystem's current path)
- that matches @e wildcard. @a flags may be one of wxFILE (only files),
- wxDIR (only directories) or 0 (both).
- This method is only called if CanOpen() returns @true.
- */
- virtual wxString FindFirst(const wxString& wildcard,
- int flags = 0);
- /**
- Returns next filename that matches parameters passed to wxFileSystem::FindFirst.
- This method is only called if CanOpen() returns @true and FindFirst()
- returned a non-empty string.
- */
- virtual wxString FindNext();
- /**
- Returns the MIME type based on @b extension of @a location.
- (While wxFSFile::GetMimeType() returns real MIME type - either
- extension-based or queried from HTTP.)
- Example:
- @code
- GetMimeTypeFromExt("index.htm") == "text/html"
- @endcode
- */
- static wxString GetMimeTypeFromExt(const wxString& location);
- /**
- Opens the file and returns wxFSFile pointer or @NULL if failed.
- Must be overridden in derived handlers.
- @param fs
- Parent FS (the FS from that OpenFile was called).
- See the ZIP handler for details of how to use it.
- @param location
- The absolute location of file.
- */
- virtual wxFSFile* OpenFile(wxFileSystem& fs, const wxString& location) = 0;
- protected:
- /**
- Returns the anchor if present in the location.
- See wxFSFile::GetAnchor for details.
- Example:
- @code
- GetAnchor("index.htm#chapter2") == "chapter2"
- @endcode
- @note the anchor is NOT part of the left location.
- */
- static wxString GetAnchor(const wxString& location);
- /**
- Returns the left location string extracted from @e location.
- Example:
- @code
- GetLeftLocation("file:myzipfile.zip#zip:index.htm") == "file:myzipfile.zip"
- @endcode
- */
- static wxString GetLeftLocation(const wxString& location);
- /**
- Returns the protocol string extracted from @a location.
- Example:
- @code
- GetProtocol("file:myzipfile.zip#zip:index.htm") == "zip"
- @endcode
- */
- static wxString GetProtocol(const wxString& location);
- /**
- Returns the right location string extracted from @a location.
- Example:
- @code
- GetRightLocation("file:myzipfile.zip#zip:index.htm") == "index.htm"
- @endcode
- */
- static wxString GetRightLocation(const wxString& location);
- };
- /**
- Input stream for virtual file stream files.
- The stream reads data from wxFSFile obtained from wxFileSystem. It is
- especially useful to allow using virtual files with other wxWidgets
- functions and classes working with streams, e.g. for loading images or
- animations from virtual files and not only physical ones.
- @library{wxbase}
- @category{streams}
- @see wxWrapperInputStream, wxFSFile
- @since 2.9.4
- */
- class wxFSInputStream : public wxWrapperInputStream
- {
- public:
- /**
- Create a stream associated with the data of the given virtual file
- system file.
- @param filename
- The name of the input file passed to wxFileSystem::OpenFile().
- @param flags
- Combination of flags from wxFileSystemOpenFlags. ::wxFS_READ is
- implied, i.e. it is always added to the flags value.
- Use wxStreamBase::IsOk() to verify if the constructor succeeded.
- */
- wxFileInputStream(const wxString& filename, int flags = 0);
- /**
- Returns @true if the stream is initialized and ready.
- */
- bool IsOk() const;
- };
|