This allows the program to distinguish between some other, unspecified, warnings and this one which can and does happen whenever too many changes occur too quickly but which has a clearly defined work around: the state kept inside the program just needs to be refreshed by rescanning the directory anew. See #12847. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@74950 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
		
			
				
	
	
		
			346 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			Objective-C
		
	
	
	
	
	
			
		
		
	
	
			346 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			Objective-C
		
	
	
	
	
	
/////////////////////////////////////////////////////////////////////////////
 | 
						|
// Name:        wx/fswatcher.h
 | 
						|
// Purpose:     wxFileSystemWatcher
 | 
						|
// Author:      Bartosz Bekier
 | 
						|
// Created:     2009-05-23
 | 
						|
// Copyright:   (c) 2009 Bartosz Bekier <bartosz.bekier@gmail.com>
 | 
						|
// Licence:     wxWindows licence
 | 
						|
/////////////////////////////////////////////////////////////////////////////
 | 
						|
 | 
						|
/**
 | 
						|
    @class wxFileSystemWatcher
 | 
						|
 | 
						|
    The wxFileSystemWatcher class allows to receive notifications of file
 | 
						|
    system changes.
 | 
						|
 | 
						|
    @note Implementation limitations: this class is currently implemented for
 | 
						|
          MSW, OS X and GTK ports but doesn't detect all changes correctly
 | 
						|
          everywhere: under MSW accessing the file is not detected (only
 | 
						|
          modifying it is) and under OS X neither accessing nor modifying is
 | 
						|
          detected (only creating and deleting files is). Moreover, OS X
 | 
						|
          version doesn't currently collapse pairs of create/delete events in a
 | 
						|
          rename event, unlike the other ones.
 | 
						|
 | 
						|
    For the full list of change types that are reported see wxFSWFlags.
 | 
						|
 | 
						|
    This class notifies the application about the file system changes by
 | 
						|
    sending events of wxFileSystemWatcherEvent class. By default these events
 | 
						|
    are sent to the wxFileSystemWatcher object itself so you can derive from it
 | 
						|
    and use the event table @c EVT_FSWATCHER macro to handle these events in a
 | 
						|
    derived class method. Alternatively, you can use
 | 
						|
    wxFileSystemWatcher::SetOwner() to send the events to another object. Or
 | 
						|
    you could use wxEvtHandler::Connect() with @c wxEVT_FSWATCHER to handle
 | 
						|
    these events in any other object. See the fswatcher sample for an example
 | 
						|
    of the latter approach.
 | 
						|
 | 
						|
    @library{wxbase}
 | 
						|
    @category{file}
 | 
						|
 | 
						|
    @since 2.9.1
 | 
						|
 */
 | 
						|
class wxFileSystemWatcher: public wxEvtHandler
 | 
						|
{
 | 
						|
public:
 | 
						|
    /**
 | 
						|
        Default constructor.
 | 
						|
     */
 | 
						|
    wxFileSystemWatcher();
 | 
						|
 | 
						|
    /**
 | 
						|
        Destructor. Stops all paths from being watched and frees any system
 | 
						|
        resources used by this file system watcher object.
 | 
						|
     */
 | 
						|
    virtual ~wxFileSystemWatcher();
 | 
						|
 | 
						|
    /**
 | 
						|
        Adds @a path to currently watched files.
 | 
						|
 | 
						|
        The @a path argument can currently only be a directory and any changes
 | 
						|
        to this directory itself or its immediate children will generate the
 | 
						|
        events. Use AddTree() to monitor the directory recursively.
 | 
						|
 | 
						|
        Note that on platforms that use symbolic links, you should consider the
 | 
						|
        possibility that @a path is a symlink. To watch the symlink itself and
 | 
						|
        not its target you may call wxFileName::DontFollowLink() on @a path.
 | 
						|
 | 
						|
        @param path
 | 
						|
            The name of the path to watch.
 | 
						|
        @param events
 | 
						|
            An optional filter to receive only events of particular types.
 | 
						|
            This is currently implemented only for GTK.
 | 
						|
     */
 | 
						|
    virtual bool Add(const wxFileName& path, int events = wxFSW_EVENT_ALL);
 | 
						|
 | 
						|
    /**
 | 
						|
        This is the same as Add(), but also recursively adds every
 | 
						|
        file/directory in the tree rooted at @a path.
 | 
						|
 | 
						|
        Additionally a file mask can be specified to include only files
 | 
						|
        matching that particular mask.
 | 
						|
 | 
						|
        This method is implemented efficiently on MSW, but should be used with
 | 
						|
        care on other platforms for directories with lots of children (e.g. the
 | 
						|
        root directory) as it calls Add() for each subdirectory, potentially
 | 
						|
        creating a lot of watches and taking a long time to execute.
 | 
						|
 | 
						|
        Note that on platforms that use symbolic links, you will probably want
 | 
						|
        to have called wxFileName::DontFollowLink on @a path. This is especially
 | 
						|
        important if the symlink targets may themselves be watched.
 | 
						|
     */
 | 
						|
    virtual bool AddTree(const wxFileName& path, int events = wxFSW_EVENT_ALL,
 | 
						|
                         const wxString& filter = wxEmptyString);
 | 
						|
 | 
						|
    /**
 | 
						|
        Removes @a path from the list of watched paths.
 | 
						|
 | 
						|
        See the comment in Add() about symbolic links. @a path should treat
 | 
						|
        symbolic links in the same way as in the original Add() call.
 | 
						|
     */
 | 
						|
    virtual bool Remove(const wxFileName& path);
 | 
						|
 | 
						|
    /**
 | 
						|
        This is the same as Remove(), but also removes every file/directory
 | 
						|
        belonging to the tree rooted at @a path.
 | 
						|
 | 
						|
        See the comment in AddTree() about symbolic links. @a path should treat
 | 
						|
        symbolic links in the same way as in the original AddTree() call.
 | 
						|
     */
 | 
						|
    virtual bool RemoveTree(const wxFileName& path);
 | 
						|
 | 
						|
    /**
 | 
						|
        Clears the list of currently watched paths.
 | 
						|
     */
 | 
						|
    virtual bool RemoveAll();
 | 
						|
 | 
						|
    /**
 | 
						|
        Returns the number of currently watched paths.
 | 
						|
 | 
						|
        @see GetWatchedPaths()
 | 
						|
     */
 | 
						|
    int GetWatchedPathsCount() const;
 | 
						|
 | 
						|
    /**
 | 
						|
        Retrieves all watched paths and places them in @a paths. Returns
 | 
						|
        the number of watched paths, which is also the number of entries added
 | 
						|
        to @a paths.
 | 
						|
     */
 | 
						|
    int GetWatchedPaths(wxArrayString* paths) const;
 | 
						|
 | 
						|
    /**
 | 
						|
        Associates the file system watcher with the given @a handler object.
 | 
						|
 | 
						|
        All the events generated by this object will be passed to the specified
 | 
						|
        owner.
 | 
						|
     */
 | 
						|
    void SetOwner(wxEvtHandler* handler);
 | 
						|
};
 | 
						|
 | 
						|
 | 
						|
 | 
						|
/**
 | 
						|
    @class wxFileSystemWatcherEvent
 | 
						|
 | 
						|
    A class of events sent when a file system event occurs. Types of events
 | 
						|
    reported may vary depending on a platform, however all platforms report
 | 
						|
    at least creation of new file/directory and access, modification, move
 | 
						|
    (rename) or deletion of an existing one.
 | 
						|
 | 
						|
    @library{wxbase}
 | 
						|
    @category{events}
 | 
						|
 | 
						|
    @see wxFileSystemWatcher
 | 
						|
    @see @ref overview_events
 | 
						|
 | 
						|
    @since 2.9.1
 | 
						|
*/
 | 
						|
class wxFileSystemWatcherEvent : public wxEvent
 | 
						|
{
 | 
						|
public:
 | 
						|
    wxFileSystemWatcherEvent(int changeType = 0,
 | 
						|
                             int watchid = wxID_ANY);
 | 
						|
    wxFileSystemWatcherEvent(int changeType,
 | 
						|
                             wxFSWWarningType warningType,
 | 
						|
                             const wxString& errorMsg,
 | 
						|
                             int watchid = wxID_ANY);
 | 
						|
    wxFileSystemWatcherEvent(int changeType,
 | 
						|
                             const wxFileName& path,
 | 
						|
                             const wxFileName& newPath,
 | 
						|
                             int watchid = wxID_ANY);
 | 
						|
 | 
						|
    /**
 | 
						|
        Returns the path at which the event occurred.
 | 
						|
     */
 | 
						|
    const wxFileName& GetPath() const;
 | 
						|
 | 
						|
    /**
 | 
						|
        Returns the new path of the renamed file/directory if this is a rename
 | 
						|
        event.
 | 
						|
 | 
						|
        Otherwise it returns the same path as GetPath().
 | 
						|
     */
 | 
						|
    const wxFileName& GetNewPath() const;
 | 
						|
 | 
						|
    /**
 | 
						|
        Returns the type of file system change that occurred. See wxFSWFlags for
 | 
						|
        the list of possible file system change types.
 | 
						|
     */
 | 
						|
    int GetChangeType() const;
 | 
						|
 | 
						|
    /**
 | 
						|
        Returns @c true if this error is an error event
 | 
						|
 | 
						|
        Error event is an event generated when a warning or error condition
 | 
						|
        arises.
 | 
						|
     */
 | 
						|
    bool IsError() const;
 | 
						|
 | 
						|
    /**
 | 
						|
        Return a description of the warning or error if this is an error event.
 | 
						|
 | 
						|
        This string may be empty if the exact reason for the error or the
 | 
						|
        warning is not known.
 | 
						|
     */
 | 
						|
    wxString GetErrorDescription() const;
 | 
						|
 | 
						|
    /**
 | 
						|
        Return the type of the warning if this event is a warning one.
 | 
						|
 | 
						|
        If this is not a warning event, i.e. if GetChangeType() doesn't include
 | 
						|
        ::wxFSW_EVENT_WARNING, returns ::wxFSW_WARNING_NONE.
 | 
						|
 | 
						|
        @since 3.0
 | 
						|
     */
 | 
						|
    wxFSWWarningType GetWarningType() const;
 | 
						|
 | 
						|
    /**
 | 
						|
        Returns a wxString describing an event, useful for logging, debugging
 | 
						|
        or testing.
 | 
						|
     */
 | 
						|
    wxString ToString() const;
 | 
						|
};
 | 
						|
 | 
						|
wxEventType wxEVT_FSWATCHER;
 | 
						|
 | 
						|
/**
 | 
						|
    These are the possible types of file system change events.
 | 
						|
 | 
						|
    Not all of these events are reported on all platforms currently.
 | 
						|
 | 
						|
    @since 2.9.1
 | 
						|
 */
 | 
						|
enum wxFSWFlags
 | 
						|
{
 | 
						|
    /// File or directory was created.
 | 
						|
    wxFSW_EVENT_CREATE = 0x01,
 | 
						|
 | 
						|
    /// File or directory was deleted.
 | 
						|
    wxFSW_EVENT_DELETE = 0x02,
 | 
						|
 | 
						|
    /**
 | 
						|
        File or directory was renamed.
 | 
						|
 | 
						|
        Notice that under MSW this event is sometimes -- although not always --
 | 
						|
        followed by a ::wxFSW_EVENT_MODIFY for the new file.
 | 
						|
 | 
						|
        Under OS X this event is currently not detected and instead separate
 | 
						|
        ::wxFSW_EVENT_CREATE and ::wxFSW_EVENT_DELETE events are.
 | 
						|
     */
 | 
						|
    wxFSW_EVENT_RENAME = 0x04,
 | 
						|
 | 
						|
    /**
 | 
						|
        File or directory was modified.
 | 
						|
 | 
						|
        Depending on the program doing the file modification, multiple such
 | 
						|
        events can be reported for a single logical file update.
 | 
						|
 | 
						|
        Under OS X this event is currently not detected.
 | 
						|
     */
 | 
						|
    wxFSW_EVENT_MODIFY = 0x08,
 | 
						|
 | 
						|
    /**
 | 
						|
        File or directory was accessed.
 | 
						|
 | 
						|
        This event is currently only detected under Linux.
 | 
						|
     */
 | 
						|
    wxFSW_EVENT_ACCESS = 0x10,
 | 
						|
 | 
						|
    /**
 | 
						|
        The item's metadata was changed, e.g.\ its permissions or timestamps.
 | 
						|
 | 
						|
        This event is currently only detected under Linux.
 | 
						|
 | 
						|
        @since 2.9.5
 | 
						|
     */
 | 
						|
    wxFSW_EVENT_ATTRIB = 0x20,
 | 
						|
 | 
						|
    /**
 | 
						|
        The file system containing a watched item was unmounted.
 | 
						|
 | 
						|
        wxFSW_EVENT_UNMOUNT cannot be set; unmount events are produced automatically. This flag
 | 
						|
        is therefore not included in wxFSW_EVENT_ALL.
 | 
						|
 | 
						|
        This event is currently only detected under Linux.
 | 
						|
 | 
						|
        @since 2.9.5
 | 
						|
    */
 | 
						|
    wxFSW_EVENT_UNMOUNT = 0x2000,
 | 
						|
 | 
						|
    /**
 | 
						|
        A warning condition arose.
 | 
						|
 | 
						|
        This is something that probably needs to be shown to the user in an
 | 
						|
        interactive program as it can indicate a relatively serious problem,
 | 
						|
        e.g. some events could have been missed because of an overflow. But
 | 
						|
        more events will still be coming in the future, unlike for the error
 | 
						|
        condition below.
 | 
						|
     */
 | 
						|
    wxFSW_EVENT_WARNING = 0x40,
 | 
						|
 | 
						|
    /**
 | 
						|
        An error condition arose.
 | 
						|
 | 
						|
        Errors are fatal, i.e. no more events will be reported after an error
 | 
						|
        and the program can stop watching the directories currently being
 | 
						|
        monitored.
 | 
						|
    */
 | 
						|
    wxFSW_EVENT_ERROR = 0x80,
 | 
						|
 | 
						|
    wxFSW_EVENT_ALL = wxFSW_EVENT_CREATE | wxFSW_EVENT_DELETE |
 | 
						|
                         wxFSW_EVENT_RENAME | wxFSW_EVENT_MODIFY |
 | 
						|
                         wxFSW_EVENT_ACCESS | wxFSW_EVENT_ATTRIB |
 | 
						|
                         wxFSW_EVENT_WARNING | wxFSW_EVENT_ERROR
 | 
						|
};
 | 
						|
 | 
						|
/**
 | 
						|
    Possible warning types for the warning events generated by
 | 
						|
    wxFileSystemWatcher.
 | 
						|
 | 
						|
    @since 3.0
 | 
						|
 */
 | 
						|
enum wxFSWWarningType
 | 
						|
{
 | 
						|
    /**
 | 
						|
        This is not a warning at all.
 | 
						|
     */
 | 
						|
    wxFSW_WARNING_NONE,
 | 
						|
 | 
						|
    /**
 | 
						|
        A generic warning.
 | 
						|
 | 
						|
        Further information may be provided in the user-readable message
 | 
						|
        available from wxFileSystemWatcherEvent::GetErrorDescription()
 | 
						|
     */
 | 
						|
    wxFSW_WARNING_GENERAL,
 | 
						|
 | 
						|
    /**
 | 
						|
        An overflow event.
 | 
						|
 | 
						|
        This warning indicates that some file system changes were not signaled
 | 
						|
        by any events, usually because there were too many of them and the
 | 
						|
        internally used queue has overflown. If such event is received it is
 | 
						|
        recommended to completely rescan the files or directories being
 | 
						|
        monitored.
 | 
						|
     */
 | 
						|
    wxFSW_WARNING_OVERFLOW
 | 
						|
};
 |