1 /////////////////////////////////////////////////////////////////////////////
2 // Name: wx/fswatcher.h
3 // Purpose: wxFileSystemWatcherBase
4 // Author: Bartosz Bekier
7 // Copyright: (c) 2009 Bartosz Bekier <bartosz.bekier@gmail.com>
8 // Licence: wxWindows licence
9 /////////////////////////////////////////////////////////////////////////////
11 #ifndef _WX_FSWATCHER_BASE_H_
12 #define _WX_FSWATCHER_BASE_H_
20 #include "wx/evtloop.h"
21 #include "wx/filename.h"
23 #include "wx/hashmap.h"
25 #define wxTRACE_FSWATCHER "fswatcher"
27 // ----------------------------------------------------------------------------
28 // wxFileSystemWatcherEventType & wxFileSystemWatcherEvent
29 // ----------------------------------------------------------------------------
32 * Possible types of file system events.
33 * This is a subset that will work fine an all platforms (actually, we will
34 * see how it works on Mac).
36 * We got 2 types of error events:
37 * - warning: these are not fatal and further events can still be generated
38 * - error: indicates fatal error and causes that no more events will happen
42 wxFSW_EVENT_CREATE
= 0x01,
43 wxFSW_EVENT_DELETE
= 0x02,
44 wxFSW_EVENT_RENAME
= 0x04,
45 wxFSW_EVENT_MODIFY
= 0x08,
46 wxFSW_EVENT_ACCESS
= 0x10,
49 wxFSW_EVENT_WARNING
= 0x20,
50 wxFSW_EVENT_ERROR
= 0x40,
52 wxFSW_EVENT_ALL
= wxFSW_EVENT_CREATE
| wxFSW_EVENT_DELETE
|
53 wxFSW_EVENT_RENAME
| wxFSW_EVENT_MODIFY
|
55 wxFSW_EVENT_WARNING
| wxFSW_EVENT_ERROR
58 // Type of the path watched, used only internally for now.
61 wxFSWPath_None
, // Invalid value for an initialized watch.
62 wxFSWPath_File
, // Plain file.
63 wxFSWPath_Dir
, // Watch a directory and the files in it.
64 wxFSWPath_Tree
// Watch a directory and all its children recursively.
69 * Event containing information about file system change.
71 class WXDLLIMPEXP_FWD_BASE wxFileSystemWatcherEvent
;
72 wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_BASE
, wxEVT_FSWATCHER
,
73 wxFileSystemWatcherEvent
);
75 class WXDLLIMPEXP_BASE wxFileSystemWatcherEvent
: public wxEvent
78 wxFileSystemWatcherEvent(int changeType
, int watchid
= wxID_ANY
) :
79 wxEvent(watchid
, wxEVT_FSWATCHER
),
80 m_changeType(changeType
)
84 wxFileSystemWatcherEvent(int changeType
, const wxString
& errorMsg
,
85 int watchid
= wxID_ANY
) :
86 wxEvent(watchid
, wxEVT_FSWATCHER
),
87 m_changeType(changeType
), m_errorMsg(errorMsg
)
91 wxFileSystemWatcherEvent(int changeType
,
92 const wxFileName
& path
, const wxFileName
& newPath
,
93 int watchid
= wxID_ANY
) :
94 wxEvent(watchid
, wxEVT_FSWATCHER
),
95 m_changeType(changeType
), m_path(path
), m_newPath(newPath
)
100 * Returns the path at which the event occurred.
102 const wxFileName
& GetPath() const
108 * Sets the path at which the event occurred
110 void SetPath(const wxFileName
& path
)
116 * In case of rename(move?) events, returns the new path related to the
117 * event. The "new" means newer in the sense of time. In case of other
118 * events it returns the same path as GetPath().
120 const wxFileName
& GetNewPath() const
126 * Sets the new path related to the event. See above.
128 void SetNewPath(const wxFileName
& path
)
134 * Returns the type of file system event that occurred.
136 int GetChangeType() const
141 virtual wxEvent
* Clone() const
143 wxFileSystemWatcherEvent
* evt
= new wxFileSystemWatcherEvent(*this);
144 evt
->m_errorMsg
= m_errorMsg
.Clone();
145 evt
->m_path
= wxFileName(m_path
.GetFullPath().Clone());
146 evt
->m_newPath
= wxFileName(m_newPath
.GetFullPath().Clone());
150 virtual wxEventCategory
GetEventCategory() const
152 // TODO this has to be merged with "similiar" categories and changed
153 return wxEVT_CATEGORY_UNKNOWN
;
157 * Returns if this error is an error event
161 return (m_changeType
& (wxFSW_EVENT_ERROR
| wxFSW_EVENT_WARNING
)) != 0;
164 wxString
GetErrorDescription() const
170 * Returns a wxString describing an event useful for debugging or testing
172 wxString
ToString() const;
177 wxFileName m_newPath
;
181 typedef void (wxEvtHandler::*wxFileSystemWatcherEventFunction
)
182 (wxFileSystemWatcherEvent
&);
184 #define wxFileSystemWatcherEventHandler(func) \
185 wxEVENT_HANDLER_CAST(wxFileSystemWatcherEventFunction, func)
187 #define EVT_FSWATCHER(winid, func) \
188 wx__DECLARE_EVT1(wxEVT_FSWATCHER, winid, wxFileSystemWatcherEventHandler(func))
190 // ----------------------------------------------------------------------------
191 // wxFileSystemWatcherBase: interface for wxFileSystemWatcher
192 // ----------------------------------------------------------------------------
194 // Simple container to store information about one watched path.
199 m_events(-1), m_type(wxFSWPath_None
)
203 wxFSWatchInfo(const wxString
& path
, int events
, wxFSWPathType type
) :
204 m_path(path
), m_events(events
), m_type(type
)
208 const wxString
& GetPath() const
218 wxFSWPathType
GetType() const
226 wxFSWPathType m_type
;
229 WX_DECLARE_STRING_HASH_MAP(wxFSWatchInfo
, wxFSWatchInfoMap
);
232 * Encapsulation of platform-specific file system event mechanism
234 class wxFSWatcherImpl
;
237 * Main entry point for clients interested in file system events.
238 * Defines interface that can be used to receive that kind of events.
240 class WXDLLIMPEXP_BASE wxFileSystemWatcherBase
: public wxEvtHandler
243 wxFileSystemWatcherBase();
245 virtual ~wxFileSystemWatcherBase();
248 * Adds path to currently watched files. Any events concerning this
249 * particular path will be sent to handler. Optionally a filter can be
250 * specified to receive only events of particular type.
252 * Please note that when adding a dir, immediate children will be watched
255 virtual bool Add(const wxFileName
& path
, int events
= wxFSW_EVENT_ALL
);
258 * Like above, but recursively adds every file/dir in the tree rooted in
259 * path. Additionally a file mask can be specified to include only files
260 * of particular type.
262 virtual bool AddTree(const wxFileName
& path
, int events
= wxFSW_EVENT_ALL
,
263 const wxString
& filter
= wxEmptyString
);
266 * Removes path from the list of watched paths.
268 virtual bool Remove(const wxFileName
& path
);
271 * Same as above, but also removes every file belonging to the tree rooted
274 virtual bool RemoveTree(const wxFileName
& path
);
277 * Clears the list of currently watched paths.
279 virtual bool RemoveAll();
282 * Returns the number of watched paths
284 int GetWatchedPathsCount() const;
287 * Retrevies all watched paths and places them in wxArrayString. Returns
288 * the number of paths.
290 * TODO think about API here: we need to return more information (like is
291 * the path watched recursively)
293 int GetWatchedPaths(wxArrayString
* paths
) const;
295 wxEvtHandler
* GetOwner() const
300 void SetOwner(wxEvtHandler
* handler
)
310 static wxString
GetCanonicalPath(const wxFileName
& path
)
312 wxFileName path_copy
= wxFileName(path
);
313 if ( !path_copy
.Normalize() )
315 wxFAIL_MSG(wxString::Format("Unable to normalize path '%s'",
316 path
.GetFullPath()));
317 return wxEmptyString
;
320 return path_copy
.GetFullPath();
323 // Delegates the real work of adding the path to wxFSWatcherImpl::Add() and
324 // updates m_watches if the new path was successfully added.
325 bool DoAdd(const wxFileName
& path
, int events
, wxFSWPathType type
);
328 wxFSWatchInfoMap m_watches
; // path=>wxFSWatchInfo map
329 wxFSWatcherImpl
* m_service
; // file system events service
330 wxEvtHandler
* m_owner
; // handler for file system events
332 friend class wxFSWatcherImpl
;
335 // include the platform specific file defining wxFileSystemWatcher
336 // inheriting from wxFileSystemWatcherBase
339 #include "wx/unix/fswatcher_inotify.h"
340 #define wxFileSystemWatcher wxInotifyFileSystemWatcher
341 #elif defined(wxHAS_KQUEUE)
342 #include "wx/unix/fswatcher_kqueue.h"
343 #define wxFileSystemWatcher wxKqueueFileSystemWatcher
344 #elif defined(__WXMSW__)
345 #include "wx/msw/fswatcher.h"
346 #define wxFileSystemWatcher wxMSWFileSystemWatcher
348 #include "wx/generic/fswatcher.h"
349 #define wxFileSystemWatcher wxPollingFileSystemWatcher
352 #endif // wxUSE_FSWATCHER
354 #endif /* _WX_FSWATCHER_BASE_H_ */