1 ///////////////////////////////////////////////////////////////////////////// 
   3 // Purpose:     interface of wxFileSystem, wxFileSystemHandler, wxFSFile 
   4 // Author:      wxWidgets team 
   6 // Licence:     wxWindows license 
   7 ///////////////////////////////////////////////////////////////////////////// 
  13 enum wxFileSystemOpenFlags
 
  15     wxFS_READ 
= 1,      /**< Open for reading */ 
  16     wxFS_SEEKABLE 
= 4   /**< Returned stream will be seekable */ 
  23     This class provides an interface for opening files on different file systems. 
  24     It can handle absolute and/or local filenames. 
  26     It uses a system of handlers (see wxFileSystemHandler) to provide access to 
  27     user-defined virtual file systems. 
  32     @see wxFileSystemHandler, wxFSFile, @ref overview_fs 
  34 class wxFileSystem 
: public wxObject
 
  43         This static function adds new handler into the list of handlers 
  44         (see wxFileSystemHandler) which provide access to virtual FS. 
  46         Note that if two handlers for the same protocol are added, the last 
  47         added one takes precedence. 
  51               wxFileSystem::AddHandler(new My_FS_Handler); 
  53               This is because (a) AddHandler is a static method, and (b) the 
  54               handlers are deleted in wxFileSystem's destructor so that you 
  55               don't have to care about it. 
  57     static void AddHandler(wxFileSystemHandler handler
); 
  60         Sets the current location. @a location parameter passed to OpenFile() is 
  61         relative to this path. 
  63         @remarks Unless @a is_dir is @true the @a location parameter is not the 
  64                  directory name but the name of the file in this directory. 
  66         All these commands change the path to "dir/subdir/": 
  69         ChangePathTo("dir/subdir/xh.htm"); 
  70         ChangePathTo("dir/subdir", true); 
  71         ChangePathTo("dir/subdir/", true); 
  76         f = fs->OpenFile("hello.htm"); // opens file 'hello.htm' 
  77         fs->ChangePathTo("subdir/folder", true); 
  78         f = fs->OpenFile("hello.htm"); // opens file 'subdir/folder/hello.htm' !! 
  82             the new location. Its meaning depends on the value of is_dir 
  84             if @true location is new directory. 
  85             If @false (the default) location is file in the new directory. 
  87     void ChangePathTo(const wxString
& location
, bool is_dir 
= false); 
  90         Converts a wxFileName into an URL. 
  92         @see URLToFileName(), wxFileName 
  94     static wxString 
FileNameToURL(const wxFileName
& filename
); 
  97         Looks for the file with the given name @a file in a colon or semi-colon 
  98         (depending on the current platform) separated list of directories in @a path. 
 100         If the file is found in any directory, returns @true and the full path 
 101         of the file in @a str, otherwise returns @false and doesn't modify @a str. 
 104             Receives the full path of the file, must not be @NULL 
 106             wxPATH_SEP-separated list of directories 
 108             the name of the file to look for 
 110     bool FindFileInPath(wxString
* pStr
, const wxString
& path
, 
 111                         const wxString
& file
); 
 114         Works like ::wxFindFirstFile(). 
 116         Returns the name of the first filename (within filesystem's current path) 
 117         that matches @a wildcard. 
 120             The wildcard that the filename must match 
 122             One of wxFILE (only files), wxDIR (only directories) or 0 (both). 
 124     wxString 
FindFirst(const wxString
& wildcard
, int flags 
= 0); 
 127         Returns the next filename that matches the parameters passed to FindFirst(). 
 132         Returns the actual path (set by wxFileSystem::ChangePathTo). 
 134     wxString 
GetPath() const; 
 137         This static function returns @true if there is a registered handler which can 
 138         open the given location. 
 140     static bool HasHandlerForPath(const wxString
& location
); 
 143         Opens the file and returns a pointer to a wxFSFile object or @NULL if failed. 
 145         It first tries to open the file in relative scope (based on value passed to 
 146         ChangePathTo() method) and then as an absolute path. 
 148         Note that the user is responsible for deleting the returned wxFSFile. 
 149         @a flags can be one or more of the ::wxFileSystemOpenFlags values 
 152         A stream opened with just the default @e wxFS_READ flag may 
 153         or may not be seekable depending on the underlying source. 
 155         Passing @e "wxFS_READ | wxFS_SEEKABLE" for @a flags will back 
 156         a stream that is not natively seekable with memory or a file 
 157         and return a stream that is always seekable. 
 159     wxFSFile
* OpenFile(const wxString
& location
, 
 160                        int flags 
= wxFS_READ
); 
 163         Converts URL into a well-formed filename. 
 164         The URL must use the @c file protocol. 
 166     static wxFileName 
URLToFileName(const wxString
& url
); 
 174     This class represents a single file opened by wxFileSystem. 
 175     It provides more information than wxWindow's input stream 
 176     (stream, filename, mime type, anchor). 
 178     @note Any pointer returned by a method of wxFSFile is valid only as long as 
 179           the wxFSFile object exists. For example a call to GetStream() 
 180           doesn't @e create the stream but only returns the pointer to it. 
 181           In other words after 10 calls to GetStream() you will have obtained 
 182           ten identical pointers. 
 187     @see wxFileSystemHandler, wxFileSystem, @ref overview_fs 
 189 class wxFSFile 
: public wxObject
 
 193         Constructor. You probably won't use it. See the Note for details. 
 195         It is seldom used by the application programmer but you will need it if 
 196         you are writing your own virtual FS. For example you may need something 
 197         similar to wxMemoryInputStream, but because wxMemoryInputStream doesn't 
 198         free the memory when destroyed and thus passing a memory stream pointer 
 199         into wxFSFile constructor would lead to memory leaks, you can write your 
 200         own class derived from wxFSFile: 
 203         class wxMyFSFile : public wxFSFile 
 209                 ~wxMyFSFile() {free(m_Mem);} 
 210                     // of course dtor is virtual ;-) 
 214         If you are not sure of the meaning of these params, see the description 
 215         of the GetXXXX() functions. 
 218             The input stream that will be used to access data 
 220             The full location (aka filename) of the file 
 222             MIME type of this file. It may be left empty, in which 
 223             case the type will be determined from file's extension (location must 
 224             not be empty in this case). 
 226             Anchor. See GetAnchor() for details. 
 228             Modification date and time for this file. 
 230     wxFSFile(wxInputStream
* stream
, const wxString
& location
, 
 231              const wxString
& mimetype
, const wxString
& anchor
, 
 235         Detaches the stream from the wxFSFile object. That is, the 
 236         stream obtained with GetStream() will continue its existance 
 237         after the wxFSFile object is deleted. 
 239         You will have to delete the stream yourself. 
 241     wxInputStream
* DetachStream(); 
 244         Returns anchor (if present). The term of @b anchor can be easily 
 245         explained using few examples: 
 248         index.htm#anchor                      // 'anchor' is anchor 
 249         index/wx001.htm                       // NO anchor here! 
 250         archive/main.zip#zip:index.htm#global // 'global' 
 251         archive/main.zip#zip:index.htm        // NO anchor here! 
 254         Usually an anchor is presented only if the MIME type is 'text/html'. 
 255         But it may have some meaning with other files; for example myanim.avi#200 
 256         may refer to position in animation or reality.wrl#MyView may refer 
 257         to a predefined view in VRML. 
 259     const wxString
& GetAnchor() const; 
 262         Returns full location of the file, including path and protocol. 
 266         http://www.wxwidgets.org 
 267         http://www.ms.mff.cuni.cz/~vsla8348/wxhtml/archive.zip#zip:info.txt 
 268         file:/home/vasek/index.htm 
 272     const wxString
& GetLocation() const; 
 275         Returns the MIME type of the content of this file. 
 277         It is either extension-based (see wxMimeTypesManager) or extracted from 
 278         HTTP protocol Content-Type header. 
 280     const wxString
& GetMimeType() const; 
 283         Returns time when this file was modified. 
 285     wxDateTime 
GetModificationTime() const; 
 288         Returns pointer to the stream. 
 290         You can use the returned stream to directly access data. 
 291         You may suppose that the stream provide Seek and GetSize functionality 
 292         (even in the case of the HTTP protocol which doesn't provide 
 293         this by default. wxHtml uses local cache to work around 
 294         this and to speed up the connection). 
 296     wxInputStream
* GetStream() const; 
 302     @class wxFileSystemHandler 
 304     Classes derived from wxFileSystemHandler are used to access virtual file systems. 
 306     Its public interface consists of two methods: wxFileSystemHandler::CanOpen 
 307     and wxFileSystemHandler::OpenFile. 
 309     It provides additional protected methods to simplify the process 
 310     of opening the file: GetProtocol(), GetLeftLocation(), GetRightLocation(), 
 311     GetAnchor(), GetMimeTypeFromExt(). 
 313     Please have a look at overview (see wxFileSystem) if you don't know how locations 
 316     Also consult the @ref overview_fs_wxhtmlfs "list of available handlers". 
 318     Note that the handlers are shared by all instances of wxFileSystem. 
 321     wxHTML library provides handlers for local files and HTTP or FTP protocol. 
 324     The location parameter passed to OpenFile() or CanOpen() methods is always an 
 325     absolute path. You don't need to check the FS's current path. 
 328     In wxPerl, you need to derive your file system handler class 
 329     from Wx::PlFileSystemHandler. 
 335     @see wxFileSystem, wxFSFile, @ref overview_fs 
 337 class wxFileSystemHandler 
: public wxObject
 
 343     wxFileSystemHandler(); 
 346         Returns @true if the handler is able to open this file. This function doesn't 
 347         check whether the file exists or not, it only checks if it knows the protocol. 
 351         bool MyHand::CanOpen(const wxString& location) 
 353             return (GetProtocol(location) == "http"); 
 357         Must be overridden in derived handlers. 
 359     virtual bool CanOpen(const wxString
& location
) = 0; 
 362         Works like ::wxFindFirstFile(). 
 364         Returns the name of the first filename (within filesystem's current path) 
 365         that matches @e wildcard. @a flags may be one of wxFILE (only files), 
 366         wxDIR (only directories) or 0 (both). 
 368         This method is only called if CanOpen() returns @true. 
 370     virtual wxString 
FindFirst(const wxString
& wildcard
, 
 374         Returns next filename that matches parameters passed to wxFileSystem::FindFirst. 
 376         This method is only called if CanOpen() returns @true and FindFirst() 
 377         returned a non-empty string. 
 379     virtual wxString 
FindNext(); 
 382         Returns the anchor if present in the location. 
 383         See wxFSFile::GetAnchor for details. 
 387         GetAnchor("index.htm#chapter2") == "chapter2" 
 390         @note the anchor is NOT part of the left location. 
 392     static wxString 
GetAnchor(const wxString
& location
); 
 395         Returns the left location string extracted from @e location. 
 399         GetLeftLocation("file:myzipfile.zip#zip:index.htm") == "file:myzipfile.zip" 
 402     static wxString 
GetLeftLocation(const wxString
& location
); 
 405         Returns the MIME type based on @b extension of @a location. 
 406         (While wxFSFile::GetMimeType() returns real MIME type - either 
 407          extension-based or queried from HTTP.) 
 411         GetMimeTypeFromExt("index.htm") == "text/html" 
 414     static wxString 
GetMimeTypeFromExt(const wxString
& location
); 
 417         Returns the protocol string extracted from @a location. 
 421         GetProtocol("file:myzipfile.zip#zip:index.htm") == "zip" 
 424     static wxString 
GetProtocol(const wxString
& location
); 
 427         Returns the right location string extracted from @a location. 
 431         GetRightLocation("file:myzipfile.zip#zip:index.htm") == "index.htm" 
 434     static wxString 
GetRightLocation(const wxString
& location
); 
 437         Opens the file and returns wxFSFile pointer or @NULL if failed. 
 438         Must be overridden in derived handlers. 
 441             Parent FS (the FS from that OpenFile was called). 
 442             See the ZIP handler for details of how to use it. 
 444             The absolute location of file. 
 446     virtual wxFSFile
* OpenFile(wxFileSystem
& fs
, const wxString
& location
) = 0;