Respect wxFileName::DontFollowLink() in wxFileSystemWatcher.

Watch the link itself and not its target if DontFollowLink() had been called.

Closes #14543.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@72751 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin
2012-10-24 18:21:31 +00:00
parent d2a02746c6
commit 0fccda2ced
4 changed files with 123 additions and 22 deletions

View File

@@ -46,11 +46,13 @@ private:
void OnClear(wxCommandEvent& WXUNUSED(event)) { m_evtConsole->Clear(); }
void OnQuit(wxCommandEvent& WXUNUSED(event)) { Close(true); }
void OnWatch(wxCommandEvent& event);
void OnFollowLinks(wxCommandEvent& event);
void OnAbout(wxCommandEvent& event);
void OnAdd(wxCommandEvent& event);
void OnAddTree(wxCommandEvent& event);
void OnRemove(wxCommandEvent& event);
void OnRemoveUpdateUI(wxUpdateUIEvent& event);
void OnFileSystemEvent(wxFileSystemWatcherEvent& event);
void LogEvent(const wxFileSystemWatcherEvent& event);
@@ -58,6 +60,7 @@ private:
wxTextCtrl *m_evtConsole; // events console
wxListView *m_filesList; // list of watched paths
wxFileSystemWatcher* m_watcher; // file system watcher
bool m_followLinks; // should symlinks be dereferenced
const static wxString LOG_FORMAT; // how to format events
};
@@ -135,7 +138,7 @@ IMPLEMENT_APP(MyApp)
// frame constructor
MyFrame::MyFrame(const wxString& title)
: wxFrame(NULL, wxID_ANY, title),
m_watcher(NULL)
m_watcher(NULL), m_followLinks(false)
{
SetIcon(wxICON(sample));
@@ -145,6 +148,7 @@ MyFrame::MyFrame(const wxString& title)
MENU_ID_QUIT = wxID_EXIT,
MENU_ID_CLEAR = wxID_CLEAR,
MENU_ID_WATCH = 101,
MENU_ID_DEREFERENCE,
BTN_ID_ADD = 200,
BTN_ID_ADD_TREE,
@@ -166,6 +170,18 @@ MyFrame::MyFrame(const wxString& title)
// started by default, because file system watcher is started by default
it->Check(true);
#if defined(__UNIX__)
// Let the user decide whether to dereference symlinks. If he makes the
// wrong choice, asserts will occur if the symlink target is also watched
it = menuMon->AppendCheckItem(MENU_ID_DEREFERENCE,
"&Follow symlinks\tCtrl-F",
_("If checked, dereference symlinks")
);
it->Check(false);
Connect(MENU_ID_DEREFERENCE, wxEVT_COMMAND_MENU_SELECTED,
wxCommandEventHandler(MyFrame::OnFollowLinks));
#endif // __UNIX__
// the "About" item should be in the help menu
wxMenu *menuHelp = new wxMenu;
menuHelp->Append(wxID_ABOUT, "&About\tF1", "Show about dialog");
@@ -263,6 +279,8 @@ MyFrame::MyFrame(const wxString& title)
wxCommandEventHandler(MyFrame::OnAddTree));
Connect(BTN_ID_REMOVE, wxEVT_COMMAND_BUTTON_CLICKED,
wxCommandEventHandler(MyFrame::OnRemove));
Connect(BTN_ID_REMOVE, wxEVT_UPDATE_UI,
wxUpdateUIEventHandler(MyFrame::OnRemoveUpdateUI));
// and show itself (the frames, unlike simple controls, are not shown when
// created initially)
@@ -324,6 +342,11 @@ void MyFrame::OnWatch(wxCommandEvent& event)
}
}
void MyFrame::OnFollowLinks(wxCommandEvent& event)
{
m_followLinks = event.IsChecked();
}
void MyFrame::OnAdd(wxCommandEvent& WXUNUSED(event))
{
AddEntry(wxFSWPath_Dir);
@@ -353,15 +376,23 @@ void MyFrame::AddEntry(wxFSWPathType type, wxString filename)
wxString prefix;
bool ok = false;
// This will tell wxFileSystemWatcher whether to dereference symlinks
wxFileName fn = wxFileName::DirName(filename);
if (!m_followLinks)
{
fn.DontFollowLink();
}
switch ( type )
{
case wxFSWPath_Dir:
ok = m_watcher->Add(wxFileName::DirName(filename));
ok = m_watcher->Add(fn);
prefix = "Dir: ";
break;
case wxFSWPath_Tree:
ok = m_watcher->AddTree(wxFileName::DirName(filename));
ok = m_watcher->AddTree(fn);
prefix = "Tree: ";
break;
@@ -390,15 +421,23 @@ void MyFrame::OnRemove(wxCommandEvent& WXUNUSED(event))
return;
bool ret;
wxString path;
// TODO we know it is a dir, but it doesn't have to be
if (m_filesList->GetItemText(idx).StartsWith("Dir: ", &path))
wxString path = m_filesList->GetItemText(idx).Mid(6);
// This will tell wxFileSystemWatcher whether to dereference symlinks
wxFileName fn = wxFileName::DirName(path);
if (!m_followLinks)
{
ret = m_watcher->Remove(wxFileName::DirName(path));
fn.DontFollowLink();
}
else if (m_filesList->GetItemText(idx).StartsWith("Tree: ", &path))
// TODO we know it is a dir, but it doesn't have to be
if (m_filesList->GetItemText(idx).StartsWith("Dir: "))
{
ret = m_watcher->RemoveTree(wxFileName::DirName(path));
ret = m_watcher->Remove(fn);
}
else if (m_filesList->GetItemText(idx).StartsWith("Tree: "))
{
ret = m_watcher->RemoveTree(fn);
}
else
{
@@ -415,6 +454,11 @@ void MyFrame::OnRemove(wxCommandEvent& WXUNUSED(event))
}
}
void MyFrame::OnRemoveUpdateUI(wxUpdateUIEvent& event)
{
event.Enable(m_filesList->GetFirstSelected() != wxNOT_FOUND);
}
void MyFrame::OnFileSystemEvent(wxFileSystemWatcherEvent& event)
{
// TODO remove when code is rock-solid