Merge SOC2009_FSWATCHER branch into trunk.
Merges everything from the branch with only some minor changes, mostly renamed wxUSE_FSWATCHER_{INOTIFY,KQUEUE} to wxHAS_{INOTIFY,KQUEUE}. Add wxFileSystemWatcher and related classes. Also introduces wxEventLoopSource. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@62474 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -1,4 +1,4 @@
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
// Name: wx/unix/evtloop.h
|
||||
// Purpose: declares wxEventLoop class
|
||||
// Author: Lukasz Michalski (lm@zork.pl)
|
||||
@@ -27,6 +27,8 @@ namespace wxPrivate
|
||||
class WXDLLIMPEXP_BASE wxConsoleEventLoop : public wxEventLoopManual
|
||||
{
|
||||
public:
|
||||
typedef wxUnixEventLoopSource Source;
|
||||
|
||||
// initialize the event loop, use IsOk() to check if we were successful
|
||||
wxConsoleEventLoop();
|
||||
virtual ~wxConsoleEventLoop();
|
||||
@@ -39,7 +41,27 @@ public:
|
||||
virtual bool IsOk() const { return m_dispatcher != NULL; }
|
||||
virtual bool YieldFor(long WXUNUSED(eventsToProcess)) { return true; }
|
||||
|
||||
#if wxUSE_EVENTLOOP_SOURCE
|
||||
virtual wxUnixEventLoopSource* CreateSource() const
|
||||
{
|
||||
return new wxUnixEventLoopSource();
|
||||
}
|
||||
|
||||
virtual wxUnixEventLoopSource* CreateSource(int res,
|
||||
wxEventLoopSourceHandler* handler,
|
||||
int flags) const
|
||||
{
|
||||
return new wxUnixEventLoopSource(res, handler, flags);
|
||||
}
|
||||
#endif
|
||||
|
||||
protected:
|
||||
#if wxUSE_EVENTLOOP_SOURCE
|
||||
// adding/removing sources
|
||||
virtual bool DoAddSource(wxAbstractEventLoopSource* source);
|
||||
virtual bool DoRemoveSource(wxAbstractEventLoopSource* source);
|
||||
#endif
|
||||
|
||||
virtual void OnNextIteration();
|
||||
|
||||
private:
|
||||
|
35
include/wx/unix/fswatcher_inotify.h
Normal file
35
include/wx/unix/fswatcher_inotify.h
Normal file
@@ -0,0 +1,35 @@
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
// Name: wx/unix/fswatcher_inotify.h
|
||||
// Purpose: wxInotifyFileSystemWatcher
|
||||
// Author: Bartosz Bekier
|
||||
// Created: 2009-05-26
|
||||
// RCS-ID: $Id$
|
||||
// Copyright: (c) 2009 Bartosz Bekier <bartosz.bekier@gmail.com>
|
||||
// Licence: wxWindows licence
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#ifndef _WX_FSWATCHER_UNIX_H_
|
||||
#define _WX_FSWATCHER_UNIX_H_
|
||||
|
||||
#include "wx/defs.h"
|
||||
|
||||
#if wxUSE_FSWATCHER
|
||||
|
||||
class WXDLLIMPEXP_BASE wxInotifyFileSystemWatcher :
|
||||
public wxFileSystemWatcherBase
|
||||
{
|
||||
public:
|
||||
wxInotifyFileSystemWatcher();
|
||||
|
||||
wxInotifyFileSystemWatcher(const wxFileName& path,
|
||||
int events = wxFSW_EVENT_ALL);
|
||||
|
||||
virtual ~wxInotifyFileSystemWatcher();
|
||||
|
||||
protected:
|
||||
bool Init();
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
#endif /* _WX_FSWATCHER_UNIX_H_ */
|
35
include/wx/unix/fswatcher_kqueue.h
Normal file
35
include/wx/unix/fswatcher_kqueue.h
Normal file
@@ -0,0 +1,35 @@
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
// Name: wx/unix/fswatcher_kqueue.h
|
||||
// Purpose: wxKqueueFileSystemWatcher
|
||||
// Author: Bartosz Bekier
|
||||
// Created: 2009-05-26
|
||||
// RCS-ID: $Id$
|
||||
// Copyright: (c) 2009 Bartosz Bekier <bartosz.bekier@gmail.com>
|
||||
// Licence: wxWindows licence
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#ifndef _WX_FSWATCHER_KQUEUE_H_
|
||||
#define _WX_FSWATCHER_KQUEUE_H_
|
||||
|
||||
#include "wx/defs.h"
|
||||
|
||||
#if wxUSE_FSWATCHER
|
||||
|
||||
class WXDLLIMPEXP_BASE wxKqueueFileSystemWatcher :
|
||||
public wxFileSystemWatcherBase
|
||||
{
|
||||
public:
|
||||
wxKqueueFileSystemWatcher();
|
||||
|
||||
wxKqueueFileSystemWatcher(const wxFileName& path,
|
||||
int events = wxFSW_EVENT_ALL);
|
||||
|
||||
virtual ~wxKqueueFileSystemWatcher();
|
||||
|
||||
protected:
|
||||
bool Init();
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
#endif /* _WX_FSWATCHER_OSX_H_ */
|
71
include/wx/unix/private/fswatcher_inotify.h
Normal file
71
include/wx/unix/private/fswatcher_inotify.h
Normal file
@@ -0,0 +1,71 @@
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
// Name: wx/unix/private/fswatcher_inotify.h
|
||||
// Purpose: File system watcher impl classes
|
||||
// Author: Bartosz Bekier
|
||||
// Created: 2009-05-26
|
||||
// RCS-ID: $Id$
|
||||
// Copyright: (c) 2009 Bartosz Bekier <bartosz.bekier@gmail.com>
|
||||
// Licence: wxWindows licence
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#ifndef WX_UNIX_PRIVATE_FSWATCHER_INOTIFY_H_
|
||||
#define WX_UNIX_PRIVATE_FSWATCHER_INOTIFY_H_
|
||||
|
||||
#include "wx/filename.h"
|
||||
|
||||
// ============================================================================
|
||||
// wxFSWatcherEntry implementation & helper declarations
|
||||
// ============================================================================
|
||||
|
||||
class wxFSWatcherImplUNIX;
|
||||
|
||||
class wxFSWatchEntry : public wxFSWatchInfo
|
||||
{
|
||||
public:
|
||||
wxFSWatchEntry(const wxFSWatchInfo& winfo) :
|
||||
wxFSWatchInfo(winfo)
|
||||
{
|
||||
}
|
||||
|
||||
int GetWatchDescriptor() const
|
||||
{
|
||||
return m_wd;
|
||||
}
|
||||
|
||||
void SetWatchDescriptor(int wd)
|
||||
{
|
||||
m_wd = wd;
|
||||
}
|
||||
|
||||
private:
|
||||
int m_wd;
|
||||
|
||||
wxDECLARE_NO_COPY_CLASS(wxFSWatchEntry);
|
||||
};
|
||||
|
||||
|
||||
// ============================================================================
|
||||
// wxFSWSourceHandler helper class
|
||||
// ============================================================================
|
||||
|
||||
class wxFSWatcherImplUnix;
|
||||
|
||||
/**
|
||||
* Handler for handling i/o from inotify descriptor
|
||||
*/
|
||||
class wxFSWSourceHandler : public wxEventLoopSourceHandler
|
||||
{
|
||||
public:
|
||||
wxFSWSourceHandler(wxFSWatcherImplUnix* service) :
|
||||
m_service(service)
|
||||
{ }
|
||||
|
||||
virtual void OnReadWaiting();
|
||||
virtual void OnWriteWaiting();
|
||||
virtual void OnExceptionWaiting();
|
||||
|
||||
protected:
|
||||
wxFSWatcherImplUnix* m_service;
|
||||
};
|
||||
|
||||
#endif /* WX_UNIX_PRIVATE_FSWATCHER_INOTIFY_H_ */
|
134
include/wx/unix/private/fswatcher_kqueue.h
Normal file
134
include/wx/unix/private/fswatcher_kqueue.h
Normal file
@@ -0,0 +1,134 @@
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
// Name: wx/unix/private/fswatcher_kqueue.h
|
||||
// Purpose: File system watcher impl classes
|
||||
// Author: Bartosz Bekier
|
||||
// Created: 2009-05-26
|
||||
// RCS-ID: $Id$
|
||||
// Copyright: (c) 2009 Bartosz Bekier <bartosz.bekier@gmail.com>
|
||||
// Licence: wxWindows licence
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#ifndef WX_UNIX_PRIVATE_FSWATCHER_KQUEUE_H_
|
||||
#define WX_UNIX_PRIVATE_FSWATCHER_KQUEUE_H_
|
||||
|
||||
#include <fcntl.h>
|
||||
#include <unistd.h>
|
||||
#include "wx/dir.h"
|
||||
#include "wx/debug.h"
|
||||
#include "wx/arrstr.h"
|
||||
|
||||
// ============================================================================
|
||||
// wxFSWatcherEntry implementation & helper declarations
|
||||
// ============================================================================
|
||||
|
||||
class wxFSWatcherImplKqueue;
|
||||
|
||||
class wxFSWatchEntryKq : public wxFSWatchInfo
|
||||
{
|
||||
public:
|
||||
struct wxDirState
|
||||
{
|
||||
wxDirState(const wxFSWatchInfo& winfo)
|
||||
{
|
||||
if (!wxDir::Exists(winfo.GetPath()))
|
||||
return;
|
||||
|
||||
wxDir dir(winfo.GetPath());
|
||||
wxCHECK_RET( dir.IsOpened(),
|
||||
wxString::Format("Unable to open dir '%s'", winfo.GetPath()));
|
||||
|
||||
wxString filename;
|
||||
bool ret = dir.GetFirst(&filename);
|
||||
while (ret)
|
||||
{
|
||||
files.push_back(filename);
|
||||
ret = dir.GetNext(&filename);
|
||||
}
|
||||
}
|
||||
|
||||
wxSortedArrayString files;
|
||||
};
|
||||
|
||||
wxFSWatchEntryKq(const wxFSWatchInfo& winfo) :
|
||||
wxFSWatchInfo(winfo), m_lastState(winfo)
|
||||
{
|
||||
m_fd = wxOpen(m_path, O_RDONLY, 0);
|
||||
if (m_fd == -1)
|
||||
{
|
||||
wxLogSysError(_("Unable to open path '%s'"), m_path);
|
||||
}
|
||||
}
|
||||
|
||||
virtual ~wxFSWatchEntryKq()
|
||||
{
|
||||
(void) Close();
|
||||
}
|
||||
|
||||
bool Close()
|
||||
{
|
||||
if (!IsOk())
|
||||
return false;
|
||||
|
||||
int ret = close(m_fd);
|
||||
if (ret == -1)
|
||||
{
|
||||
wxLogSysError(_("Unable to close path '%s'"), m_path);
|
||||
}
|
||||
m_fd = -1;
|
||||
|
||||
return ret != -1;
|
||||
}
|
||||
|
||||
bool IsOk() const
|
||||
{
|
||||
return m_fd != -1;
|
||||
}
|
||||
|
||||
int GetFileDescriptor() const
|
||||
{
|
||||
return m_fd;
|
||||
}
|
||||
|
||||
void RefreshState()
|
||||
{
|
||||
m_lastState = wxDirState(*this);
|
||||
}
|
||||
|
||||
const wxDirState& GetLastState() const
|
||||
{
|
||||
return m_lastState;
|
||||
}
|
||||
|
||||
private:
|
||||
int m_fd;
|
||||
wxDirState m_lastState;
|
||||
|
||||
wxDECLARE_NO_COPY_CLASS(wxFSWatchEntryKq);
|
||||
};
|
||||
|
||||
|
||||
// ============================================================================
|
||||
// wxFSWSourceHandler helper class
|
||||
// ============================================================================
|
||||
|
||||
class wxFSWatcherImplKqueue;
|
||||
|
||||
/**
|
||||
* Handler for handling i/o from inotify descriptor
|
||||
*/
|
||||
class wxFSWSourceHandler : public wxEventLoopSourceHandler
|
||||
{
|
||||
public:
|
||||
wxFSWSourceHandler(wxFSWatcherImplKqueue* service) :
|
||||
m_service(service)
|
||||
{ }
|
||||
|
||||
virtual void OnReadWaiting();
|
||||
virtual void OnWriteWaiting();
|
||||
virtual void OnExceptionWaiting();
|
||||
|
||||
protected:
|
||||
wxFSWatcherImplKqueue* m_service;
|
||||
};
|
||||
|
||||
#endif /* WX_UNIX_PRIVATE_FSWATCHER_KQUEUE_H_ */
|
Reference in New Issue
Block a user