summaryrefslogtreecommitdiff
path: root/shared
diff options
context:
space:
mode:
Diffstat (limited to 'shared')
-rw-r--r--shared/assert_static.h9
-rw-r--r--shared/com_error.h2
-rw-r--r--shared/com_ptr.h142
-rw-r--r--shared/com_util.h28
-rw-r--r--shared/custom_button.cpp89
-rw-r--r--shared/custom_button.h3
-rw-r--r--shared/debug_log.h80
-rw-r--r--shared/dir_name.cpp36
-rw-r--r--shared/dir_watcher.cpp471
-rw-r--r--shared/dir_watcher.h50
-rw-r--r--shared/dll_loader.cpp28
-rw-r--r--shared/dll_loader.h3
-rw-r--r--shared/dst_hack.cpp60
-rw-r--r--shared/file_error.h26
-rw-r--r--shared/file_handling.cpp651
-rw-r--r--shared/file_handling.h32
-rw-r--r--shared/file_id.cpp6
-rw-r--r--shared/file_io.cpp38
-rw-r--r--shared/file_io.h6
-rw-r--r--shared/file_traverser.cpp214
-rw-r--r--shared/file_traverser.h27
-rw-r--r--shared/global_func.cpp71
-rw-r--r--shared/global_func.h31
-rw-r--r--shared/guid.cpp1
-rw-r--r--shared/i18n.cpp2
-rw-r--r--shared/i18n.h23
-rw-r--r--shared/inotify/CHANGELOG98
-rw-r--r--shared/inotify/COPYING13
-rw-r--r--shared/inotify/LICENSE-GPL339
-rw-r--r--shared/inotify/LICENSE-LGPL504
-rw-r--r--shared/inotify/LICENSE-X1122
-rw-r--r--shared/inotify/README70
-rw-r--r--shared/inotify/TODO3
-rw-r--r--shared/inotify/doc/html/annotated.html34
-rw-r--r--shared/inotify/doc/html/classInotify-members.html65
-rw-r--r--shared/inotify/doc/html/classInotify.html1218
-rw-r--r--shared/inotify/doc/html/classInotifyEvent-members.html48
-rw-r--r--shared/inotify/doc/html/classInotifyEvent.html617
-rw-r--r--shared/inotify/doc/html/classInotifyEvent_309ebf3c5b131522295185a926d551bb_icgraph.map4
-rw-r--r--shared/inotify/doc/html/classInotifyEvent_309ebf3c5b131522295185a926d551bb_icgraph.md51
-rw-r--r--shared/inotify/doc/html/classInotifyEvent_309ebf3c5b131522295185a926d551bb_icgraph.pngbin9618 -> 0 bytes
-rw-r--r--shared/inotify/doc/html/classInotifyEvent_5ab91d587bdc7ab3c18c6cdff73f3097_icgraph.map1
-rw-r--r--shared/inotify/doc/html/classInotifyEvent_5ab91d587bdc7ab3c18c6cdff73f3097_icgraph.md51
-rw-r--r--shared/inotify/doc/html/classInotifyEvent_5ab91d587bdc7ab3c18c6cdff73f3097_icgraph.pngbin3331 -> 0 bytes
-rw-r--r--shared/inotify/doc/html/classInotifyEvent__coll__graph.map2
-rw-r--r--shared/inotify/doc/html/classInotifyEvent__coll__graph.md51
-rw-r--r--shared/inotify/doc/html/classInotifyEvent__coll__graph.pngbin4658 -> 0 bytes
-rw-r--r--shared/inotify/doc/html/classInotifyEvent_c08a0a26ea33dbe94aaf1ac830c103a5_icgraph.map1
-rw-r--r--shared/inotify/doc/html/classInotifyEvent_c08a0a26ea33dbe94aaf1ac830c103a5_icgraph.md51
-rw-r--r--shared/inotify/doc/html/classInotifyEvent_c08a0a26ea33dbe94aaf1ac830c103a5_icgraph.pngbin3424 -> 0 bytes
-rw-r--r--shared/inotify/doc/html/classInotifyEvent_c7160544f6f4f24611df57a4422ac47f_icgraph.map1
-rw-r--r--shared/inotify/doc/html/classInotifyEvent_c7160544f6f4f24611df57a4422ac47f_icgraph.md51
-rw-r--r--shared/inotify/doc/html/classInotifyEvent_c7160544f6f4f24611df57a4422ac47f_icgraph.pngbin3681 -> 0 bytes
-rw-r--r--shared/inotify/doc/html/classInotifyException-members.html36
-rw-r--r--shared/inotify/doc/html/classInotifyException.html232
-rw-r--r--shared/inotify/doc/html/classInotifyWatch-members.html46
-rw-r--r--shared/inotify/doc/html/classInotifyWatch.html533
-rw-r--r--shared/inotify/doc/html/classInotifyWatch_2e659c699e7d43bd0a218fe4905784d2_icgraph.map2
-rw-r--r--shared/inotify/doc/html/classInotifyWatch_2e659c699e7d43bd0a218fe4905784d2_icgraph.md51
-rw-r--r--shared/inotify/doc/html/classInotifyWatch_2e659c699e7d43bd0a218fe4905784d2_icgraph.pngbin3258 -> 0 bytes
-rw-r--r--shared/inotify/doc/html/classInotifyWatch_804cdc1e9579a075a60c239b202559f4_icgraph.map1
-rw-r--r--shared/inotify/doc/html/classInotifyWatch_804cdc1e9579a075a60c239b202559f4_icgraph.md51
-rw-r--r--shared/inotify/doc/html/classInotifyWatch_804cdc1e9579a075a60c239b202559f4_icgraph.pngbin3724 -> 0 bytes
-rw-r--r--shared/inotify/doc/html/classInotifyWatch_855f982421402dd63d064dde328f2a59_icgraph.map1
-rw-r--r--shared/inotify/doc/html/classInotifyWatch_855f982421402dd63d064dde328f2a59_icgraph.md51
-rw-r--r--shared/inotify/doc/html/classInotifyWatch_855f982421402dd63d064dde328f2a59_icgraph.pngbin3963 -> 0 bytes
-rw-r--r--shared/inotify/doc/html/classInotifyWatch__coll__graph.map1
-rw-r--r--shared/inotify/doc/html/classInotifyWatch__coll__graph.md51
-rw-r--r--shared/inotify/doc/html/classInotifyWatch__coll__graph.pngbin3053 -> 0 bytes
-rw-r--r--shared/inotify/doc/html/classInotifyWatch_f759f9baca6f4abbbaae57e076486009_icgraph.map3
-rw-r--r--shared/inotify/doc/html/classInotifyWatch_f759f9baca6f4abbbaae57e076486009_icgraph.md51
-rw-r--r--shared/inotify/doc/html/classInotifyWatch_f759f9baca6f4abbbaae57e076486009_icgraph.pngbin7077 -> 0 bytes
-rw-r--r--shared/inotify/doc/html/classInotify_19cde43d082ff92bd02654610019300d_icgraph.map1
-rw-r--r--shared/inotify/doc/html/classInotify_19cde43d082ff92bd02654610019300d_icgraph.md51
-rw-r--r--shared/inotify/doc/html/classInotify_19cde43d082ff92bd02654610019300d_icgraph.pngbin2766 -> 0 bytes
-rw-r--r--shared/inotify/doc/html/classInotify_21c39bb8e5bbc1941b945c18f9005b84_icgraph.map1
-rw-r--r--shared/inotify/doc/html/classInotify_21c39bb8e5bbc1941b945c18f9005b84_icgraph.md51
-rw-r--r--shared/inotify/doc/html/classInotify_21c39bb8e5bbc1941b945c18f9005b84_icgraph.pngbin2751 -> 0 bytes
-rw-r--r--shared/inotify/doc/html/classInotify_2ef771ebaf982d76ebe19b3f5bc9cd83_icgraph.map1
-rw-r--r--shared/inotify/doc/html/classInotify_2ef771ebaf982d76ebe19b3f5bc9cd83_icgraph.md51
-rw-r--r--shared/inotify/doc/html/classInotify_2ef771ebaf982d76ebe19b3f5bc9cd83_icgraph.pngbin2377 -> 0 bytes
-rw-r--r--shared/inotify/doc/html/classInotify_490a3f824c6d041d31ccaabe9bd92008_icgraph.map1
-rw-r--r--shared/inotify/doc/html/classInotify_490a3f824c6d041d31ccaabe9bd92008_icgraph.md51
-rw-r--r--shared/inotify/doc/html/classInotify_490a3f824c6d041d31ccaabe9bd92008_icgraph.pngbin2675 -> 0 bytes
-rw-r--r--shared/inotify/doc/html/classInotify_70b3b57e8661fbb4c5bc404b86225c3b_icgraph.map3
-rw-r--r--shared/inotify/doc/html/classInotify_70b3b57e8661fbb4c5bc404b86225c3b_icgraph.md51
-rw-r--r--shared/inotify/doc/html/classInotify_70b3b57e8661fbb4c5bc404b86225c3b_icgraph.pngbin9913 -> 0 bytes
-rw-r--r--shared/inotify/doc/html/classInotify_734538233ba2136164f76f4df6c3654e_icgraph.map3
-rw-r--r--shared/inotify/doc/html/classInotify_734538233ba2136164f76f4df6c3654e_icgraph.md51
-rw-r--r--shared/inotify/doc/html/classInotify_734538233ba2136164f76f4df6c3654e_icgraph.pngbin10284 -> 0 bytes
-rw-r--r--shared/inotify/doc/html/classInotify_86ae86c43ea1a72f562ca46393309635_icgraph.map1
-rw-r--r--shared/inotify/doc/html/classInotify_86ae86c43ea1a72f562ca46393309635_icgraph.md51
-rw-r--r--shared/inotify/doc/html/classInotify_86ae86c43ea1a72f562ca46393309635_icgraph.pngbin2364 -> 0 bytes
-rw-r--r--shared/inotify/doc/html/classInotify_bc1fd5830ca561efb69bcd2283981741_icgraph.map2
-rw-r--r--shared/inotify/doc/html/classInotify_bc1fd5830ca561efb69bcd2283981741_icgraph.md51
-rw-r--r--shared/inotify/doc/html/classInotify_bc1fd5830ca561efb69bcd2283981741_icgraph.pngbin3286 -> 0 bytes
-rw-r--r--shared/inotify/doc/html/classes.html32
-rw-r--r--shared/inotify/doc/html/doxygen.css441
-rw-r--r--shared/inotify/doc/html/doxygen.pngbin1281 -> 0 bytes
-rw-r--r--shared/inotify/doc/html/files.html32
-rw-r--r--shared/inotify/doc/html/functions.html215
-rw-r--r--shared/inotify/doc/html/functions_func.html177
-rw-r--r--shared/inotify/doc/html/functions_rela.html44
-rw-r--r--shared/inotify/doc/html/functions_vars.html73
-rw-r--r--shared/inotify/doc/html/globals.html81
-rw-r--r--shared/inotify/doc/html/globals_defs.html69
-rw-r--r--shared/inotify/doc/html/globals_enum.html43
-rw-r--r--shared/inotify/doc/html/globals_eval.html47
-rw-r--r--shared/inotify/doc/html/globals_type.html45
-rw-r--r--shared/inotify/doc/html/graph_legend.dot22
-rw-r--r--shared/inotify/doc/html/graph_legend.html84
-rw-r--r--shared/inotify/doc/html/graph_legend.pngbin18687 -> 0 bytes
-rw-r--r--shared/inotify/doc/html/index.html24
-rw-r--r--shared/inotify/doc/html/inotify-cxx_8cpp.html109
-rw-r--r--shared/inotify/doc/html/inotify-cxx_8cpp__incl.map1
-rw-r--r--shared/inotify/doc/html/inotify-cxx_8cpp__incl.md51
-rw-r--r--shared/inotify/doc/html/inotify-cxx_8cpp__incl.pngbin23669 -> 0 bytes
-rw-r--r--shared/inotify/doc/html/inotify-cxx_8h.html387
-rw-r--r--shared/inotify/doc/html/inotify-cxx_8h__dep__incl.map1
-rw-r--r--shared/inotify/doc/html/inotify-cxx_8h__dep__incl.md51
-rw-r--r--shared/inotify/doc/html/inotify-cxx_8h__dep__incl.pngbin2602 -> 0 bytes
-rw-r--r--shared/inotify/doc/html/inotify-cxx_8h__incl.map0
-rw-r--r--shared/inotify/doc/html/inotify-cxx_8h__incl.md51
-rw-r--r--shared/inotify/doc/html/inotify-cxx_8h__incl.pngbin8941 -> 0 bytes
-rw-r--r--shared/inotify/doc/html/inotify-cxx_8h_source.html503
-rw-r--r--shared/inotify/doc/html/tab_b.gifbin35 -> 0 bytes
-rw-r--r--shared/inotify/doc/html/tab_l.gifbin706 -> 0 bytes
-rw-r--r--shared/inotify/doc/html/tab_r.gifbin2585 -> 0 bytes
-rw-r--r--shared/inotify/doc/html/tabs.css105
-rw-r--r--shared/inotify/doc/man/man3/Inotify.3696
-rw-r--r--shared/inotify/doc/man/man3/InotifyEvent.3306
-rw-r--r--shared/inotify/doc/man/man3/InotifyException.3124
-rw-r--r--shared/inotify/doc/man/man3/InotifyWatch.3265
-rw-r--r--shared/inotify/doc/man/man3/inotify-cxx.cpp.380
-rw-r--r--shared/inotify/doc/man/man3/inotify-cxx.h.3198
-rw-r--r--shared/inotify/inotify-cxx.cpp709
-rw-r--r--shared/inotify/inotify-cxx.h890
-rw-r--r--shared/last_error.cpp20
-rw-r--r--shared/last_error.h6
-rw-r--r--shared/localization.cpp86
-rw-r--r--shared/notify_removal.cpp238
-rw-r--r--shared/notify_removal.h40
-rw-r--r--shared/pch.h1
-rw-r--r--shared/privilege.cpp37
-rw-r--r--shared/privilege.h4
-rw-r--r--shared/recycler.cpp72
-rw-r--r--shared/recycler.h14
-rw-r--r--shared/resolve_path.cpp41
-rw-r--r--shared/serialize.cpp6
-rw-r--r--shared/shadow.cpp57
-rw-r--r--shared/shadow.h12
-rw-r--r--shared/standard_paths.cpp15
-rw-r--r--shared/string_conv.h102
-rw-r--r--shared/string_utf8.h50
-rw-r--r--shared/symlink_target.h29
-rw-r--r--shared/system_constants.h29
-rw-r--r--shared/taskbar.cpp13
-rw-r--r--shared/taskbar.h2
-rw-r--r--shared/util.cpp20
-rw-r--r--shared/util.h14
-rw-r--r--shared/xml_base.cpp11
-rw-r--r--shared/zstring.h3
162 files changed, 1804 insertions, 10979 deletions
diff --git a/shared/assert_static.h b/shared/assert_static.h
index 37705ded..9b1a189e 100644
--- a/shared/assert_static.h
+++ b/shared/assert_static.h
@@ -1,9 +1,10 @@
// **************************************************************************
-// * This file is part of the FreeFileSync project. It is distributed under *
-// * GNU General Public License: http://www.gnu.org/licenses/gpl.html *
-// * Copyright (C) 2008-2011 ZenJu (zhnmju123 AT gmx.de) *
+// * This file is part of the zenXML project. It is distributed under the *
+// * Boost Software License, Version 1.0. See accompanying file *
+// * LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt. *
+// * Copyright (C) 2011 ZenJu (zhnmju123 AT gmx.de) *
// **************************************************************************
-//
+
#ifndef ASSERTSTATIC_H_INCLUDED
#define ASSERTSTATIC_H_INCLUDED
diff --git a/shared/com_error.h b/shared/com_error.h
index c3f7745b..909e04c1 100644
--- a/shared/com_error.h
+++ b/shared/com_error.h
@@ -60,7 +60,7 @@ inline
std::wstring numberToHexString(long number)
{
wchar_t result[100];
- swprintf(result, 100, L"0x%08x", number);
+ ::swprintf(result, 100, L"0x%08x", number);
return std::wstring(result);
}
diff --git a/shared/com_ptr.h b/shared/com_ptr.h
index d7178fbe..fa1b3e8f 100644
--- a/shared/com_ptr.h
+++ b/shared/com_ptr.h
@@ -33,43 +33,49 @@ template <class T>
class ComPtr
{
public:
- ComPtr();
- ComPtr(const ComPtr& rhs);
- ComPtr& operator=(const ComPtr& rhs);
- ~ComPtr();
- T** init(); //get pointer for use with ::CoCreateInstance()
- T* get() const;
- T* release(); //throw()
- void swap(ComPtr& rhs); //throw()
- T* operator->() const;
-
-private:
- T* ptr;
-
- struct ConversionToBool { int dummy; };
-public:
- operator int ConversionToBool::* () const; //use member pointer as implicit conversion to bool (C++ Templates - Vandevoorde/Josuttis; chapter 20)
-};
-
-
-template <class S, class T>
-ComPtr<S> com_dynamic_cast(const ComPtr<T>& other); //throw()
-
-
-
-
+ ComPtr() : ptr(NULL) {}
+ ComPtr(const ComPtr& rhs) : ptr(rhs.ptr) { if (ptr) ptr->AddRef(); }
+ ComPtr& operator=(const ComPtr& rhs)
+ {
+ ComPtr(rhs).swap(*this);
+ return *this;
+ }
+ ~ComPtr() { if (ptr) ptr->Release(); }
+ T** init() //get pointer for use with ::CoCreateInstance()
+ {
+ ComPtr<T>().swap(*this);
+ return &ptr;
+ }
+ T* get() const { return ptr; }
+ T* release() //throw()
+ {
+ T* tmp = ptr;
+ ptr = NULL;
+ return tmp;
+ }
+ void swap(ComPtr& rhs) { std::swap(ptr, rhs.ptr); } //throw()
+ T* operator->() const { return ptr; }
+private:
+ T* ptr;
+ struct ConversionToBool { int dummy; };
+public:
+ //use member pointer as implicit conversion to bool (C++ Templates - Vandevoorde/Josuttis; chapter 20)
+ operator int ConversionToBool::* () const { return ptr != NULL ? &ConversionToBool::dummy : NULL; }
+};
+template <class S, class T>
+ComPtr<S> com_dynamic_cast(const ComPtr<T>& other); //throw()
@@ -79,112 +85,33 @@ ComPtr<S> com_dynamic_cast(const ComPtr<T>& other); //throw()
-//################# Inline Implementation #############################
-template <class T>
-inline
-ComPtr<T>::ComPtr() : ptr(NULL) {}
-template <class T>
-inline
-ComPtr<T>::ComPtr(const ComPtr& rhs) : ptr(rhs.ptr)
-{
- if (ptr)
- ptr->AddRef();
-}
-template <class T>
-inline
-ComPtr<T>& ComPtr<T>::operator=(const ComPtr<T>& rhs)
-{
- ComPtr(rhs).swap(*this);
- return *this;
-}
-template <class T>
-inline
-ComPtr<T>::~ComPtr()
-{
- if (ptr)
- ptr->Release();
-}
-template <class T>
-inline
-T** ComPtr<T>::init() //get pointer for use with ::CoCreateInstance()
-{
- ComPtr<T>().swap(*this);
- return &ptr;
-}
-template <class T>
-inline
-T* ComPtr<T>::get() const
-{
- return ptr;
-}
-template <class T>
-inline
-T* ComPtr<T>::release() //throw()
-{
- T* tmp = ptr;
- ptr = NULL;
- return tmp;
-}
-template <class T>
-inline
-void ComPtr<T>::swap(ComPtr<T>& rhs) //throw()
-{
- std::swap(ptr, rhs.ptr);
-}
+//################# Inline Implementation #############################
//we cannot specialize std::swap() for a class template and are not allowed to overload it => offer swap in own namespace
-template <class T>
-inline
+template <class T> inline
void swap(util::ComPtr<T>& lhs, util::ComPtr<T>& rhs)
{
lhs.swap(rhs);
}
-template <class T>
-inline
-T* ComPtr<T>::operator->() const
-{
- return ptr;
-}
-
-
-/*
-template <class T>
-inline
-ComPtr<T>::operator bool() const
-{
- return ptr != NULL;
-}
-*/
-
-
-template <class T>
-inline
-ComPtr<T>::operator int ComPtr<T>::ConversionToBool::* () const
-{
- return ptr != NULL ? &ConversionToBool::dummy : NULL;
-}
-
-
-template <class S, class T>
-inline
+template <class S, class T> inline
ComPtr<S> com_dynamic_cast(const ComPtr<T>& other) //throw()
{
ComPtr<S> outPtr;
@@ -192,7 +119,6 @@ ComPtr<S> com_dynamic_cast(const ComPtr<T>& other) //throw()
other->QueryInterface(IID_PPV_ARGS(outPtr.init()));
return outPtr;
}
-
}
diff --git a/shared/com_util.h b/shared/com_util.h
index a396fbee..4a8c4f54 100644
--- a/shared/com_util.h
+++ b/shared/com_util.h
@@ -31,10 +31,10 @@ std::wstring getText(ComPtr<T> comObj, MemFun memFun);
class Bstring
{
public:
- Bstring(const std::wstring& str);
- ~Bstring();
+ Bstring(const std::wstring& str) { str_ = ::SysAllocStringLen(str.data(), str.length()); } //string::data() returns unmodified string potentially containing 0-values
+ ~Bstring() { if (str_) ::SysFreeString(str_); }
- const BSTR get() const;
+ const BSTR get() const { return str_; }
private:
Bstring(const Bstring&); //not implemented
@@ -127,28 +127,6 @@ std::wstring getText(ComPtr<T> comObj, MemFun memFun)
}
return text;
}
-
-
-inline
-Bstring::Bstring(const std::wstring& str)
-{
- str_ = ::SysAllocStringLen(str.data(), str.length()); //string::data() returns unmodified string potentially containing 0-values
-}
-
-
-inline
-Bstring::~Bstring()
-{
- if (str_)
- ::SysFreeString(str_);
-}
-
-
-inline
-const BSTR Bstring::get() const
-{
- return str_;
-}
}
diff --git a/shared/custom_button.cpp b/shared/custom_button.cpp
index df65a401..98c0a3cd 100644
--- a/shared/custom_button.cpp
+++ b/shared/custom_button.cpp
@@ -12,6 +12,44 @@
#include <cmath>
+namespace
+{
+bool isEqual(const wxBitmap& lhs, const wxBitmap& rhs)
+{
+ if (lhs.IsOk() != rhs.IsOk())
+ return false;
+
+ if (!lhs.IsOk())
+ return true;
+
+ const int pixelCount = lhs.GetWidth() * lhs.GetHeight();
+ if (pixelCount != rhs.GetWidth() * rhs.GetHeight())
+ return false;
+
+ wxImage imLhs = lhs.ConvertToImage();
+ wxImage imRhs = rhs.ConvertToImage();
+
+ if (imLhs.HasAlpha() != imRhs.HasAlpha())
+ return false;
+
+ if (imLhs.HasAlpha())
+ {
+ if (!std::equal(imLhs.GetAlpha(), imLhs.GetAlpha() + pixelCount, imRhs.GetAlpha()))
+ return false;
+ }
+
+ return std::equal(imLhs.GetData(), imLhs.GetData() + pixelCount * 3, imRhs.GetData());
+}
+}
+
+
+void setBitmapLabel(wxBitmapButton& button, const wxBitmap& bmp)
+{
+ if (!isEqual(button.GetBitmapLabel(), bmp))
+ button.SetBitmapLabel(bmp);
+}
+
+
wxButtonWithImage::wxButtonWithImage(wxWindow* parent,
wxWindowID id,
const wxString& label,
@@ -30,25 +68,34 @@ wxButtonWithImage::wxButtonWithImage(wxWindow* parent,
void wxButtonWithImage::setBitmapFront(const wxBitmap& bitmap, unsigned spaceAfter)
{
- bitmapFront = bitmap;
- m_spaceAfter = spaceAfter;
- refreshButtonLabel();
+ if (!isEqual(bitmap, bitmapFront) || spaceAfter != m_spaceAfter) //avoid flicker
+ {
+ bitmapFront = bitmap;
+ m_spaceAfter = spaceAfter;
+ refreshButtonLabel();
+ }
}
void wxButtonWithImage::setTextLabel(const wxString& text)
{
- textLabel = text;
- wxBitmapButton::SetLabel(text);
- refreshButtonLabel();
+ if (text != textLabel) //avoid flicker
+ {
+ textLabel = text;
+ wxBitmapButton::SetLabel(text);
+ refreshButtonLabel();
+ }
}
void wxButtonWithImage::setBitmapBack(const wxBitmap& bitmap, unsigned spaceBefore)
{
- bitmapBack = bitmap;
- m_spaceBefore = spaceBefore;
- refreshButtonLabel();
+ if (!isEqual(bitmap, bitmapBack) || spaceBefore != m_spaceBefore) //avoid flicker
+ {
+ bitmapBack = bitmap;
+ m_spaceBefore = spaceBefore;
+ refreshButtonLabel();
+ }
}
@@ -293,19 +340,33 @@ void writeToImage(const wxImage& source, const wxPoint pos, wxImage& target)
}
+namespace
+{
+inline
+wxSize getSize(const wxBitmap& bmp)
+{
+ return bmp.IsOk() ? wxSize(bmp.GetWidth(), bmp.GetHeight()) : wxSize(0, 0);
+}
+}
+
+
void wxButtonWithImage::refreshButtonLabel()
{
wxBitmap bitmapText = createBitmapFromText(textLabel);
+ wxSize szFront = getSize(bitmapFront); //
+ wxSize szText = getSize(bitmapText); //make sure to NOT access null-bitmaps!
+ wxSize szBack = getSize(bitmapBack); //
+
//calculate dimensions of new button
- const int height = std::max(std::max(bitmapFront.GetHeight(), bitmapText.GetHeight()), bitmapBack.GetHeight());
- const int width = bitmapFront.GetWidth() + m_spaceAfter + bitmapText.GetWidth() + m_spaceBefore + bitmapBack.GetWidth();
+ const int height = std::max(std::max(szFront.GetHeight(), szText.GetHeight()), szBack.GetHeight());
+ const int width = szFront.GetWidth() + m_spaceAfter + szText.GetWidth() + m_spaceBefore + szBack.GetWidth();
//create a transparent image
wxImage transparentImage(width, height, false);
transparentImage.SetAlpha();
unsigned char* alpha = transparentImage.GetAlpha();
- memset(alpha, wxIMAGE_ALPHA_TRANSPARENT, width * height);
+ ::memset(alpha, wxIMAGE_ALPHA_TRANSPARENT, width * height);
//wxDC::DrawLabel() unfortunately isn't working for transparent images on Linux, so we need to use custom image-concatenation
if (bitmapFront.IsOk())
@@ -315,12 +376,12 @@ void wxButtonWithImage::refreshButtonLabel()
if (bitmapText.IsOk())
writeToImage(bitmapText.ConvertToImage(),
- wxPoint(bitmapFront.GetWidth() + m_spaceAfter, (transparentImage.GetHeight() - bitmapText.GetHeight()) / 2),
+ wxPoint(szFront.GetWidth() + m_spaceAfter, (transparentImage.GetHeight() - bitmapText.GetHeight()) / 2),
transparentImage);
if (bitmapBack.IsOk())
writeToImage(bitmapBack.ConvertToImage(),
- wxPoint(bitmapFront.GetWidth() + m_spaceAfter + bitmapText.GetWidth() + m_spaceBefore, (transparentImage.GetHeight() - bitmapBack.GetHeight()) / 2),
+ wxPoint(szFront.GetWidth() + m_spaceAfter + szText.GetWidth() + m_spaceBefore, (transparentImage.GetHeight() - bitmapBack.GetHeight()) / 2),
transparentImage);
//adjust button size
diff --git a/shared/custom_button.h b/shared/custom_button.h
index 4ebff73c..752c763e 100644
--- a/shared/custom_button.h
+++ b/shared/custom_button.h
@@ -38,5 +38,8 @@ private:
wxBitmap bitmapBack;
};
+//set bitmap label flicker free!
+void setBitmapLabel(wxBitmapButton& button, const wxBitmap& bmp);
+
#endif // CUSTOMBUTTON_H_INCLUDED
diff --git a/shared/debug_log.h b/shared/debug_log.h
new file mode 100644
index 00000000..8e8090f0
--- /dev/null
+++ b/shared/debug_log.h
@@ -0,0 +1,80 @@
+// **************************************************************************
+// * This file is part of the FreeFileSync project. It is distributed under *
+// * GNU General Public License: http://www.gnu.org/licenses/gpl.html *
+// * Copyright (C) 2008-2011 ZenJu (zhnmju123 AT gmx.de) *
+// **************************************************************************
+//
+#ifndef DEBUG_LOG_HEADER_017324601673246392184621895740256342
+#define DEBUG_LOG_HEADER_017324601673246392184621895740256342
+
+#include "zstring.h"
+#include <wx/file.h>
+
+
+class DebugLog
+{
+public:
+ wxDEPRECATED(DebugLog(const wxString& filePrefix = wxString()))
+ prefix(filePrefix),
+ lineCount(0)
+ {
+ logfileName = assembleFileName();
+ logFile.Open(logfileName, wxFile::write);
+ }
+
+ void write(const std::string& logText)
+ {
+ todo;
+ }
+
+ void write(const wxString& logText)
+ {
+ ++lineCount;
+ if (lineCount % 50000 == 0) //prevent logfile from becoming too big
+ {
+ logFile.Close();
+ wxRemoveFile(logfileName);
+
+ logfileName = assembleFileName();
+ logFile.Open(logfileName, wxFile::write);
+ }
+
+ersetze wxDateTime::Now() durch eigene lib:
+ z.b. iso_time.h
+
+ logFile.Write(wxString(wxT("[")) + wxDateTime::Now().FormatTime() + wxT("] "));
+ logFile.Write(logText + LINE_BREAK);
+ }
+
+private:
+ wxString assembleFileName()
+ {
+ wxString tmp = wxDateTime::Now().FormatISOTime();
+ tmp.Replace(wxT(":"), wxEmptyString);
+ return prefix + wxString(wxT("DEBUG_")) + wxDateTime::Now().FormatISODate() + wxChar('_') + tmp + wxT(".log");
+ }
+
+ wxString logfileName;
+ wxString prefix;
+ int lineCount;
+ wxFile logFile; //logFile.close(); <- not needed
+};
+
+inline DebugLog& globalLogFile()
+{
+ static DebugLog inst; //external linkage despite header definition!
+ return inst;
+}
+
+inline wxString getCodeLocation(const wxString& file, int line)
+{
+ return wxString(file).AfterLast(FILE_NAME_SEPARATOR) + wxT(", LINE ") + toString<wxString>(line) + wxT(" | ");
+}
+
+
+//small macro for writing debug information into a logfile
+#define WRITE_DEBUG_LOG(x) globalLogFile().write(getCodeLocation(__TFILE__, __LINE__) + x);
+//speed alternative: wxLogDebug(wxT("text")) + DebugView
+
+
+#endif //DEBUG_LOG_HEADER_017324601673246392184621895740256342
diff --git a/shared/dir_name.cpp b/shared/dir_name.cpp
index dda9407e..6566bb3a 100644
--- a/shared/dir_name.cpp
+++ b/shared/dir_name.cpp
@@ -15,7 +15,6 @@
#include "check_exist.h"
#include "util.h"
#include "i18n.h"
-#include "system_constants.h"
using namespace zen;
@@ -24,7 +23,7 @@ namespace
{
void setDirectoryNameImpl(const wxString& dirname, wxDirPickerCtrl* dirPicker, wxWindow& tooltipWnd, wxStaticBoxSizer* staticBox, size_t timeout)
{
- const wxString dirFormatted = zToWx(getFormattedDirectoryName(wxToZ(dirname)));
+ const wxString dirFormatted = toWx(getFormattedDirectoryName(toZ(dirname)));
tooltipWnd.SetToolTip(dirFormatted); //wxComboBox bug: the edit control is not updated... hope this will be fixed: http://trac.wxwidgets.org/ticket/12659
@@ -32,17 +31,16 @@ void setDirectoryNameImpl(const wxString& dirname, wxDirPickerCtrl* dirPicker, w
{
//change static box label only if there is a real difference to what is shown in wxTextCtrl anyway
wxString dirNormalized = dirname;
- dirNormalized.Trim(true);
- dirNormalized.Trim(false);
- if (!dirNormalized.empty() && !dirNormalized.EndsWith(zToWx(common::FILE_NAME_SEPARATOR)))
- dirNormalized += zToWx(common::FILE_NAME_SEPARATOR);
+ trim(dirNormalized);
+ if (!dirNormalized.empty() && !endsWith(dirNormalized, FILE_NAME_SEPARATOR))
+ dirNormalized += FILE_NAME_SEPARATOR;
staticBox->GetStaticBox()->SetLabel(dirNormalized == dirFormatted ? wxString(_("Drag && drop")) : dirFormatted);
}
if (dirPicker)
{
- if (!dirFormatted.empty() && util::dirExists(wxToZ(dirFormatted), timeout) == util::EXISTING_TRUE) //potentially slow network access: wait 200ms at most
+ if (!dirFormatted.empty() && util::dirExists(toZ(dirFormatted), timeout) == util::EXISTING_TRUE) //potentially slow network access: wait 200ms at most
dirPicker->SetPath(dirFormatted);
}
}
@@ -113,14 +111,14 @@ void DirectoryNameMainDlg::OnFilesDropped(FFSFileDropEvent& event)
if (AcceptDrop(event.getFiles()))
{
- Zstring fileName = wxToZ(event.getFiles()[0]);
- if (dirExists(fileName))
- setDirectoryName(zToWx(fileName), &dirName_, &dirPicker_, dirName_, staticBox_);
+ wxString fileName = event.getFiles()[0];
+ if (dirExists(toZ(fileName)))
+ setDirectoryName(fileName, &dirName_, &dirPicker_, dirName_, staticBox_);
else
{
- fileName = fileName.BeforeLast(common::FILE_NAME_SEPARATOR);
- if (dirExists(fileName))
- setDirectoryName(zToWx(fileName), &dirName_, &dirPicker_, dirName_, staticBox_);
+ fileName = beforeLast(fileName, FILE_NAME_SEPARATOR);
+ if (dirExists(toZ(fileName)))
+ setDirectoryName(fileName, &dirName_, &dirPicker_, dirName_, staticBox_);
}
}
}
@@ -183,14 +181,14 @@ void DirectoryName::OnFilesDropped(FFSFileDropEvent& event)
if (event.getFiles().empty())
return;
- Zstring fileName = wxToZ(event.getFiles()[0]);
- if (dirExists(fileName))
- setDirectoryName(zToWx(fileName), &dirName_, &dirPicker_, dirName_, staticBox_);
+ wxString fileName = event.getFiles()[0];
+ if (dirExists(toZ(fileName)))
+ setDirectoryName(fileName, &dirName_, &dirPicker_, dirName_, staticBox_);
else
{
- fileName = fileName.BeforeLast(common::FILE_NAME_SEPARATOR);
- if (dirExists(fileName))
- setDirectoryName(zToWx(fileName), &dirName_, &dirPicker_, dirName_, staticBox_);
+ fileName = beforeLast(fileName, FILE_NAME_SEPARATOR);
+ if (dirExists(toZ(fileName)))
+ setDirectoryName(fileName, &dirName_, &dirPicker_, dirName_, staticBox_);
}
}
diff --git a/shared/dir_watcher.cpp b/shared/dir_watcher.cpp
new file mode 100644
index 00000000..8e0b7f94
--- /dev/null
+++ b/shared/dir_watcher.cpp
@@ -0,0 +1,471 @@
+// **************************************************************************
+// * This file is part of the FreeFileSync project. It is distributed under *
+// * GNU General Public License: http://www.gnu.org/licenses/gpl.html *
+// * Copyright (C) 2008-2011 ZenJu (zhnmju123 AT gmx.de) *
+// **************************************************************************
+//
+#include "dir_watcher.h"
+#include "last_error.h"
+#include "i18n.h"
+#include <algorithm>
+#include "boost_thread_wrap.h" //include <boost/thread.hpp>
+#include "loki/ScopeGuard.h"
+#include <set>
+#include <wx/log.h> //wxSafeShowMessage
+
+#ifdef FFS_WIN
+#include "notify_removal.h"
+#include <wx/msw/wrapwin.h> //includes "windows.h"
+#include "long_path_prefix.h"
+#include "privilege.h"
+
+#elif defined FFS_LINUX
+#include <sys/inotify.h>
+#include <fcntl.h>
+#include "file_traverser.h"
+#endif
+
+
+using namespace zen;
+
+
+#ifdef FFS_WIN
+namespace
+{
+typedef Zbase<Zchar, StorageDeepCopy> BasicString; //thread safe string class for file names
+typedef Zbase<wchar_t, StorageDeepCopy> BasicWString; //thread safe string class for UI texts
+
+
+struct SharedData
+{
+ boost::mutex lockAccess;
+ std::set<BasicString> changedFiles; //get rid of duplicate entries (actually occur!)
+ BasicWString errorMsg; //non-empty if errors occured in thread
+};
+
+
+void addChanges(SharedData& shared, const char* buffer, DWORD bytesWritten, const BasicString& dirname) //throw ()
+{
+ boost::lock_guard<boost::mutex> dummy(shared.lockAccess);
+
+ std::set<BasicString>& output = shared.changedFiles;
+
+ if (bytesWritten == 0) //according to docu this may happen in case of internal buffer overflow: report some "dummy" change
+ output.insert(L"Overflow!");
+ else
+ {
+ const char* bufPos = &buffer[0];
+ while (true)
+ {
+ const FILE_NOTIFY_INFORMATION& notifyInfo = reinterpret_cast<const FILE_NOTIFY_INFORMATION&>(*bufPos);
+
+ const BasicString fullname = dirname + BasicString(notifyInfo.FileName, notifyInfo.FileNameLength / sizeof(WCHAR));
+
+ //skip modifications sent by changed directories: reason for change, child element creation/deletion, will notify separately!
+ bool skip = false;
+ if (notifyInfo.Action == FILE_ACTION_MODIFIED)
+ {
+ //note: this check will not work if top watched directory has been renamed
+ const DWORD ret = ::GetFileAttributes(applyLongPathPrefix(Zstring(fullname)).c_str());
+ bool isDir = ret != INVALID_FILE_ATTRIBUTES && (ret & FILE_ATTRIBUTE_DIRECTORY); //returns true for (dir-)symlinks also
+ skip = isDir;
+ }
+
+ if (!skip)
+ output.insert(fullname);
+
+ if (notifyInfo.NextEntryOffset == 0)
+ break;
+ bufPos += notifyInfo.NextEntryOffset;
+ }
+ }
+}
+
+
+void getChanges(SharedData& shared, std::vector<Zstring>& output) //throw FileError
+{
+ boost::lock_guard<boost::mutex> dummy(shared.lockAccess);
+
+ //first check whether errors occured in thread
+ if (!shared.errorMsg.empty())
+ throw zen::FileError(shared.errorMsg.c_str());
+
+ std::transform(shared.changedFiles.begin(), shared.changedFiles.end(),
+ std::back_inserter(output), [](const BasicString& str) { return Zstring(str); });
+
+ shared.changedFiles.clear();
+}
+
+
+void reportError(SharedData& shared, const BasicWString& errorMsg) //throw ()
+{
+ boost::lock_guard<boost::mutex> dummy(shared.lockAccess);
+ shared.errorMsg = errorMsg;
+}
+
+
+class ReadChangesAsync
+{
+public:
+ ReadChangesAsync(const BasicString& directory, //make sure to not leak in thread-unsafe types!
+ const std::shared_ptr<SharedData>& shared) :
+ shared_(shared),
+ dirname(directory)
+ {
+ //still in main thread
+ if (!endsWith(dirname, FILE_NAME_SEPARATOR))
+ dirname += FILE_NAME_SEPARATOR;
+
+ //these two privileges are required by ::CreateFile FILE_FLAG_BACKUP_SEMANTICS according to
+ //http://msdn.microsoft.com/en-us/library/aa363858(v=vs.85).aspx
+ try
+ {
+ Privileges::getInstance().ensureActive(SE_BACKUP_NAME); //throw FileError
+ Privileges::getInstance().ensureActive(SE_RESTORE_NAME); //
+ }
+ catch (const FileError&) {}
+
+ hDir = ::CreateFile(applyLongPathPrefix(dirname.c_str()).c_str(),
+ FILE_LIST_DIRECTORY,
+ FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
+ NULL,
+ OPEN_EXISTING,
+ FILE_FLAG_BACKUP_SEMANTICS | FILE_FLAG_OVERLAPPED,
+ NULL);
+ if(hDir == INVALID_HANDLE_VALUE )
+ throw FileError(_("Could not initialize directory monitoring:") + "\n\"" + utf8CvrtTo<std::wstring>(dirname) + "\"" + "\n\n" + zen::getLastErrorFormatted());
+
+ //Loki::ScopeGuard guardDir = Loki::MakeGuard(::CloseHandle, hDir);
+ //guardDir.Dismiss();
+ }
+
+ ~ReadChangesAsync()
+ {
+ if (hDir != INVALID_HANDLE_VALUE)
+ ::CloseHandle(hDir);
+ }
+
+ void operator()() //thread entry
+ {
+ try
+ {
+ std::vector<char> buffer(64 * 1024); //maximum buffer size restricted by some networks protocols (according to docu)
+
+ while (true)
+ {
+ boost::this_thread::interruption_point();
+
+ //actual work
+ OVERLAPPED overlapped = {};
+ overlapped.hEvent = ::CreateEvent(NULL, //__in_opt LPSECURITY_ATTRIBUTES lpEventAttributes,
+ true, //__in BOOL bManualReset,
+ false, //__in BOOL bInitialState,
+ NULL); //__in_opt LPCTSTR lpName
+ if (overlapped.hEvent == NULL)
+ return ::reportError(*shared_, BasicWString(_("Error when monitoring directories.") + "\n\n" + getLastErrorFormatted())); //throw () + quit thread
+
+ Loki::ScopeGuard dummy = Loki::MakeGuard(::CloseHandle, overlapped.hEvent);
+ (void)dummy;
+
+ //asynchronous variant: runs on this thread's APC queue!
+ if (!::ReadDirectoryChangesW(hDir, // __in HANDLE hDirectory,
+ &buffer[0], // __out LPVOID lpBuffer,
+ static_cast<DWORD>(buffer.size()), // __in DWORD nBufferLength,
+ true, // __in BOOL bWatchSubtree,
+ FILE_NOTIFY_CHANGE_FILE_NAME |
+ FILE_NOTIFY_CHANGE_DIR_NAME |
+ FILE_NOTIFY_CHANGE_SIZE |
+ FILE_NOTIFY_CHANGE_LAST_WRITE, // __in DWORD dwNotifyFilter,
+ NULL, // __out_opt LPDWORD lpBytesReturned,
+ &overlapped, // __inout_opt LPOVERLAPPED lpOverlapped,
+ NULL)) // __in_opt LPOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine
+ return ::reportError(*shared_, BasicWString(_("Error when monitoring directories.") + "\n\n" + getLastErrorFormatted())); //throw () + quit thread
+
+ //async I/O is a resource that needs to be guarded since it will write to local variable "buffer"!
+ Loki::ScopeGuard lockAio = Loki::MakeGuard([&]()
+ {
+ //http://msdn.microsoft.com/en-us/library/aa363789(v=vs.85).aspx
+ bool cancelSuccess = ::CancelIo(hDir) == TRUE; //cancel all async I/O related to this handle and thread
+ if (cancelSuccess)
+ {
+ DWORD bytesWritten = 0;
+ ::GetOverlappedResult(hDir, &overlapped, &bytesWritten, true); //wait until cancellation is complete
+ }
+ });
+
+ DWORD bytesWritten = 0;
+
+ //wait for results
+ while (!::GetOverlappedResult(hDir, //__in HANDLE hFile,
+ &overlapped, //__in LPOVERLAPPED lpOverlapped,
+ &bytesWritten, //__out LPDWORD lpNumberOfBytesTransferred,
+ false)) //__in BOOL bWait
+ {
+ if (::GetLastError() != ERROR_IO_INCOMPLETE)
+ return ::reportError(*shared_, BasicWString(_("Error when monitoring directories.") + "\n\n" + getLastErrorFormatted())); //throw () + quit thread
+
+ //execute asynchronous procedure calls (APC) queued on this thread
+ ::SleepEx(50, // __in DWORD dwMilliseconds,
+ true); // __in BOOL bAlertable
+
+ boost::this_thread::interruption_point();
+ }
+ lockAio.Dismiss();
+
+ ::addChanges(*shared_, &buffer[0], bytesWritten, dirname); //throw ()
+ }
+ }
+ catch (boost::thread_interrupted&)
+ {
+ throw; //this is the only reasonable exception!
+ }
+ catch (...) //exceptions must be catched per thread
+ {
+ wxSafeShowMessage(wxString(_("An exception occurred!")) + wxT("(Dir Watcher)"), wxT("Unknown exception in worker thread!")); //simple wxMessageBox won't do for threads
+ }
+ }
+
+ ReadChangesAsync(ReadChangesAsync&& other) :
+ hDir(INVALID_HANDLE_VALUE)
+ {
+ shared_ = std::move(other.shared_);
+ dirname = std::move(other.dirname);
+ std::swap(hDir, other.hDir);
+ }
+
+ HANDLE getDirHandle() const { return hDir; } //for reading purposes only, don't abuse (e.g. close handle)!
+
+private:
+ //shared between main and worker:
+ std::shared_ptr<SharedData> shared_;
+ //worker thread only:
+ BasicString dirname; //conceptually thread-only, but technically moved to thread-local storage on instance creation: -> must not use ref-copying!
+ HANDLE hDir;
+};
+
+
+class HandleVolumeRemoval : public NotifyRequestDeviceRemoval
+{
+public:
+ HandleVolumeRemoval(HANDLE hDir,
+ boost::thread& worker,
+ const std::shared_ptr<SharedData>& shared,
+ const BasicString& dirname) :
+ NotifyRequestDeviceRemoval(hDir), //throw FileError
+ worker_(worker),
+ shared_(shared),
+ dirname_(dirname),
+ removalRequested(false),
+ operationComplete(false) {}
+
+ //all functions are called by main thread!
+
+ bool requestReceived() const { return removalRequested; }
+ bool finished() const { return operationComplete; }
+
+private:
+ virtual void onRequestRemoval(HANDLE hnd)
+ {
+ //must release hDir immediately!
+ worker_.interrupt();
+ worker_.join();
+ //now hDir should have been released
+
+ //report removal as change to main directory
+ {
+ boost::lock_guard<boost::mutex> dummy(shared_->lockAccess);
+ shared_->changedFiles.insert(dirname_);
+ }
+
+ removalRequested = true;
+ } //don't throw!
+ virtual void onRemovalFinished(HANDLE hnd, bool successful) { operationComplete = true; } //throw()!
+
+ boost::thread& worker_;
+ std::shared_ptr<SharedData> shared_;
+ BasicString dirname_;
+ bool removalRequested;
+ bool operationComplete;
+};
+}
+
+
+struct DirWatcher::Pimpl
+{
+ boost::thread worker;
+ std::shared_ptr<SharedData> shared;
+
+ std::unique_ptr<HandleVolumeRemoval> volRemoval;
+};
+
+
+DirWatcher::DirWatcher(const Zstring& directory) : //throw FileError
+ pimpl_(new Pimpl)
+{
+ pimpl_->shared = std::make_shared<SharedData>();
+
+ ReadChangesAsync reader(BasicString(directory), pimpl_->shared); //throw FileError
+ pimpl_->volRemoval.reset(new HandleVolumeRemoval(reader.getDirHandle(), pimpl_->worker, pimpl_->shared, BasicString(directory))); //throw FileError
+ pimpl_->worker = boost::thread(std::move(reader));
+}
+
+
+DirWatcher::~DirWatcher()
+{
+ pimpl_->worker.interrupt();
+ //pimpl_->worker.join(); -> we don't have time to wait... will take ~50ms anyway
+ //caveat: exitting the app may simply kill this thread!
+
+ //wait until device removal is confirmed, to (hopefully!) prevent locking hDir again by new watch!
+ if (pimpl_->volRemoval->requestReceived())
+ {
+ const boost::system_time maxwait = boost::get_system_time() + boost::posix_time::seconds(3); //HandleVolumeRemoval::finished() not guaranteed!
+
+ while (!pimpl_->volRemoval->finished() && boost::get_system_time() < maxwait)
+ boost::thread::sleep(boost::get_system_time() + boost::posix_time::milliseconds(50));
+ }
+}
+
+
+std::vector<Zstring> DirWatcher::getChanges() //throw FileError
+{
+ std::vector<Zstring> output;
+ ::getChanges(*pimpl_->shared, output); //throw FileError
+ return output;
+}
+
+
+#elif defined FFS_LINUX
+struct DirWatcher::Pimpl
+{
+ int notifDescr;
+ std::map<int, Zstring> watchDescrs; //watch descriptor and corresponding directory name (postfixed with separator!)
+};
+
+
+namespace
+{
+class DirsOnlyTraverser : public zen::TraverseCallback
+{
+public:
+ DirsOnlyTraverser(std::vector<Zstring>& dirs) : dirs_(dirs) {}
+
+ virtual void onFile (const Zchar* shortName, const Zstring& fullName, const FileInfo& details) {}
+ virtual void onSymlink(const Zchar* shortName, const Zstring& fullName, const SymlinkInfo& details) {}
+ virtual ReturnValDir onDir (const Zchar* shortName, const Zstring& fullName)
+ {
+ dirs_.push_back(fullName);
+ return ReturnValDir(Loki::Int2Type<ReturnValDir::TRAVERSING_DIR_CONTINUE>(), *this);
+ }
+ virtual HandleError onError(const std::wstring& errorText) { throw FileError(errorText); }
+
+private:
+ std::vector<Zstring>& dirs_;
+};
+}
+
+
+DirWatcher::DirWatcher(const Zstring& directory) : //throw FileError
+ pimpl_(new Pimpl)
+{
+ //still in main thread
+ Zstring dirname = directory;
+ if (endsWith(dirname, FILE_NAME_SEPARATOR))
+ dirname.resize(dirname.size() - 1);
+
+ //get all subdirectories
+ std::vector<Zstring> fullDirList;
+ fullDirList.push_back(dirname);
+
+ DirsOnlyTraverser traverser(fullDirList); //throw FileError
+ zen::traverseFolder(dirname, false, traverser); //don't traverse into symlinks (analog to windows build)
+
+ //init
+ pimpl_->notifDescr = ::inotify_init();
+ if (pimpl_->notifDescr == -1)
+ throw FileError(_("Could not initialize directory monitoring:") + "\n\"" + dirname + "\"" + "\n\n" + getLastErrorFormatted());
+
+ Loki::ScopeGuard guardDescr = Loki::MakeGuard(::close, pimpl_->notifDescr);
+
+ //set non-blocking mode
+ bool initSuccess = false;
+ int flags = ::fcntl(pimpl_->notifDescr, F_GETFL);
+ if (flags != -1)
+ initSuccess = ::fcntl(pimpl_->notifDescr, F_SETFL, flags | O_NONBLOCK) != -1;
+
+ if (!initSuccess)
+ throw FileError(_("Could not initialize directory monitoring:") + "\n\"" + dirname + "\"" + "\n\n" + getLastErrorFormatted());
+
+ //add watches
+ std::for_each(fullDirList.begin(), fullDirList.end(),
+ [&](Zstring subdir)
+ {
+ int wd = ::inotify_add_watch(pimpl_->notifDescr, subdir.c_str(),
+ IN_ONLYDIR | //watch directories only
+ IN_DONT_FOLLOW | //don't follow symbolic links
+ IN_MODIFY |
+ IN_CLOSE_WRITE |
+ IN_MOVE |
+ IN_CREATE |
+ IN_DELETE |
+ IN_DELETE_SELF |
+ IN_MOVE_SELF);
+ if (wd == -1)
+ throw FileError(_("Could not initialize directory monitoring:") + "\n\"" + subdir + "\"" + "\n\n" + getLastErrorFormatted());
+
+ if (!endsWith(subdir, FILE_NAME_SEPARATOR))
+ subdir += FILE_NAME_SEPARATOR;
+ pimpl_->watchDescrs.insert(std::make_pair(wd, subdir));
+ });
+
+ guardDescr.Dismiss();
+}
+
+
+DirWatcher::~DirWatcher()
+{
+ ::close(pimpl_->notifDescr); //associated watches are removed automatically!
+}
+
+
+std::vector<Zstring> DirWatcher::getChanges() //throw FileError
+{
+ std::vector<char> buffer(1024 * (sizeof(struct inotify_event) + 16));
+
+ //non-blocking call, see O_NONBLOCK
+ ssize_t bytesRead = ::read(pimpl_->notifDescr, &buffer[0], buffer.size());
+
+ if (bytesRead == -1)
+ {
+ if (errno == EINTR || //Interrupted function call; When this happens, you should try the call again.
+ errno == EAGAIN) //Non-blocking I/O has been selected using O_NONBLOCK and no data was immediately available for reading
+ return std::vector<Zstring>();
+
+ throw FileError(_("Error when monitoring directories.") + "\n\n" + getLastErrorFormatted());
+ }
+
+ std::set<Zstring> tmp; //get rid of duplicate entries (actually occur!)
+
+ ssize_t bytePos = 0;
+ while (bytePos < bytesRead)
+ {
+ struct inotify_event& evt = reinterpret_cast<struct inotify_event&>(buffer[bytePos]);
+
+ if (evt.len != 0) //exclude case: deletion of "self", already reported by parent directory watch
+ {
+ auto iter = pimpl_->watchDescrs.find(evt.wd);
+ if (iter != pimpl_->watchDescrs.end())
+ {
+ //Note: evt.len is NOT the size of the evt.name c-string, but the array size including all padding 0 characters!
+ //It may be even 0 in which case evt.name must not be used!
+ tmp.insert(iter->second + evt.name);
+ }
+ }
+
+ bytePos += sizeof(struct inotify_event) + evt.len;
+ }
+
+ return std::vector<Zstring>(tmp.begin(), tmp.end());
+}
+
+#endif
diff --git a/shared/dir_watcher.h b/shared/dir_watcher.h
new file mode 100644
index 00000000..572515dc
--- /dev/null
+++ b/shared/dir_watcher.h
@@ -0,0 +1,50 @@
+// **************************************************************************
+// * This file is part of the FreeFileSync project. It is distributed under *
+// * GNU General Public License: http://www.gnu.org/licenses/gpl.html *
+// * Copyright (C) 2008-2011 ZenJu (zhnmju123 AT gmx.de) *
+// **************************************************************************
+//
+#ifndef DIR_WATCHER_348577025748023458
+#define DIR_WATCHER_348577025748023458
+
+#include "file_error.h"
+#include <vector>
+#include <memory>
+
+namespace zen
+{
+//Windows: ReadDirectoryChangesW http://msdn.microsoft.com/en-us/library/aa365465(v=vs.85).aspx
+//Linux: inotify http://linux.die.net/man/7/inotify
+
+//watch directory including subdirectories
+/*
+!Note handling of directories!:
+ Linux: newly added subdirectories are reported but not automatically added for watching! -> reset Dirwatcher!
+ removal of top watched directory is NOT notified!
+ Windows: removal of top watched directory also NOT notified (e.g. brute force usb stick removal)
+ however manual unmount IS notified (e.g. usb stick removal, then re-insert), but watching is stopped!
+ Renaming of top watched directory handled incorrectly: Not notified(!) + changes in subfolders
+ report FILE_ACTION_MODIFIED for directory (check that should prevent this fails!)
+
+ Overcome all issues portably: check existence of watched directory externally + reinstall watch after changes in directory structure (added directories) are possible
+*/
+class DirWatcher
+{
+public:
+ DirWatcher(const Zstring& directory); //throw FileError
+ ~DirWatcher();
+
+ //extract accumulated changes since last call
+ std::vector<Zstring> getChanges(); //throw FileError
+
+private:
+ DirWatcher(const DirWatcher&);
+ DirWatcher& operator=(const DirWatcher&);
+
+ struct Pimpl;
+ std::unique_ptr<Pimpl> pimpl_;
+};
+
+}
+
+#endif
diff --git a/shared/dll_loader.cpp b/shared/dll_loader.cpp
index e942a168..029cabc5 100644
--- a/shared/dll_loader.cpp
+++ b/shared/dll_loader.cpp
@@ -20,20 +20,18 @@ public:
HMODULE getHandle(const std::wstring& libraryName)
{
- HandleMap::const_iterator foundEntry = handles.find(libraryName);
- if (foundEntry == handles.end())
- {
- if (libraryName.empty())
- return ::GetModuleHandle(NULL); //return handle to calling executable
+ if (libraryName.empty())
+ return ::GetModuleHandle(NULL); //return handle to calling executable
- HMODULE newHandle = ::LoadLibrary(libraryName.c_str());
- if (newHandle != NULL)
- handles.insert(std::make_pair(libraryName, newHandle));
+ HandleMap::const_iterator iter = handles.find(libraryName);
+ if (iter != handles.end())
+ return iter->second;
- return newHandle;
- }
- else
- return foundEntry->second;
+ HMODULE newHandle = ::LoadLibrary(libraryName.c_str());
+ if (newHandle != NULL)
+ handles.insert(std::make_pair(libraryName, newHandle));
+
+ return newHandle;
}
private:
@@ -56,11 +54,7 @@ private:
FARPROC util::loadSymbol(const std::wstring& libraryName, const std::string& functionName)
{
const HMODULE libHandle = DllHandler::getInstance().getHandle(libraryName);
-
- if (libHandle != NULL)
- return ::GetProcAddress(libHandle, functionName.c_str());
- else
- return NULL;
+ return libHandle != NULL ? ::GetProcAddress(libHandle, functionName.c_str()) : NULL;
}
diff --git a/shared/dll_loader.h b/shared/dll_loader.h
index 6dedc06e..3efb0d96 100644
--- a/shared/dll_loader.h
+++ b/shared/dll_loader.h
@@ -51,8 +51,7 @@ std::string getResourceStream(const std::wstring& libraryName, size_t resourceId
//---------------Inline Implementation---------------------------------------------------
FARPROC loadSymbol(const std::wstring& libraryName, const std::string& functionName);
-template <typename FunctionType>
-inline
+template <typename FunctionType> inline
FunctionType getDllFun(const std::wstring& libraryName, const std::string& functionName)
{
return reinterpret_cast<FunctionType>(loadSymbol(libraryName, functionName));
diff --git a/shared/dst_hack.cpp b/shared/dst_hack.cpp
index 1a2e705a..a64df448 100644
--- a/shared/dst_hack.cpp
+++ b/shared/dst_hack.cpp
@@ -1,5 +1,4 @@
#include "dst_hack.h"
-#include "system_constants.h"
#include "i18n.h"
#include "long_path_prefix.h"
#include "string_utf8.h"
@@ -9,6 +8,7 @@
#include "global_func.h"
#include <limits>
#include "int64.h"
+#include "file_error.h"
using namespace zen;
@@ -24,8 +24,8 @@ Zstring getVolumeName(const Zstring& filename)
// BUFFER_SIZE)) //__in DWORD cchBufferLength
// ...
// Zstring volumePath = fsName;
- // if (!volumePath.EndsWith(common::FILE_NAME_SEPARATOR)) //a trailing backslash is required
- // volumePath += common::FILE_NAME_SEPARATOR;
+ // if (!volumePath.EndsWith(FILE_NAME_SEPARATOR)) //a trailing backslash is required
+ // volumePath += FILE_NAME_SEPARATOR;
Zstring nameFmt = removeLongPathPrefix(filename); //throw()
if (!nameFmt.EndsWith(Zstr("\\")))
@@ -90,11 +90,11 @@ bool dst::isFatDrive(const Zstring& fileName) //throw()
namespace
{
-//convert zen::UInt64 and zen::Int64 to FILETIME
+//convert UInt64 and Int64 to FILETIME
inline
-FILETIME toFiletime(zen::Int64 number)
+FILETIME toFiletime(Int64 number)
{
- const zen::UInt64 unsig = to<zen::UInt64>(number);
+ const UInt64 unsig = to<UInt64>(number);
FILETIME output = {};
output.dwLowDateTime = unsig.getLo();
@@ -102,7 +102,7 @@ FILETIME toFiletime(zen::Int64 number)
return output;
}
-FILETIME toFiletime(zen::UInt64 number)
+FILETIME toFiletime(UInt64 number)
{
FILETIME output = {};
output.dwLowDateTime = number.getLo();
@@ -111,16 +111,16 @@ FILETIME toFiletime(zen::UInt64 number)
}
inline
-zen::UInt64 toUInt64(const FILETIME& fileTime)
+UInt64 toUInt64(const FILETIME& fileTime)
{
- return zen::UInt64(fileTime.dwLowDateTime, fileTime.dwHighDateTime);
+ return UInt64(fileTime.dwLowDateTime, fileTime.dwHighDateTime);
}
inline
-zen::Int64 toInt64(const FILETIME& fileTime)
+Int64 toInt64(const FILETIME& fileTime)
{
- return to<zen::Int64>(zen::UInt64(fileTime.dwLowDateTime, fileTime.dwHighDateTime));
+ return to<Int64>(UInt64(fileTime.dwLowDateTime, fileTime.dwHighDateTime));
}
@@ -132,9 +132,9 @@ FILETIME utcToLocal(const FILETIME& utcTime) //throw (std::runtime_error)
&utcTime, //__in const FILETIME *lpFileTime,
&localTime)) //__out LPFILETIME lpLocalFileTime
{
- const wxString errorMessage = wxString(_("Conversion error:")) + wxT(" FILETIME -> local FILETIME: ") + wxT("(") +
- wxT("High: ") + toString<wxString>(utcTime.dwHighDateTime) + wxT(" ") +
- wxT("Low: ") + toString<wxString>(utcTime.dwLowDateTime) + wxT(") ") + wxT("\n\n") + zen::getLastErrorFormatted();
+ const std::wstring errorMessage = _("Conversion error:") + " FILETIME -> local FILETIME: " + "(" +
+ "High: " + toString<std::wstring>(utcTime.dwHighDateTime) + " " +
+ "Low: " + toString<std::wstring>(utcTime.dwLowDateTime) + ") " + "\n\n" + getLastErrorFormatted();
throw std::runtime_error(wideToUtf8<std::string>(errorMessage));
}
return localTime;
@@ -149,9 +149,9 @@ FILETIME localToUtc(const FILETIME& localTime) //throw (std::runtime_error)
&localTime, //__in const FILETIME *lpLocalFileTime,
&utcTime)) //__out LPFILETIME lpFileTime
{
- const wxString errorMessage = wxString(_("Conversion error:")) + wxT(" local FILETIME -> FILETIME: ") + wxT("(") +
- wxT("High: ") + toString<wxString>(localTime.dwHighDateTime) + wxT(" ") +
- wxT("Low: ") + toString<wxString>(localTime.dwLowDateTime) + wxT(") ") + wxT("\n\n") + zen::getLastErrorFormatted();
+ const std::wstring errorMessage = _("Conversion error:") + " local FILETIME -> FILETIME: " + "(" +
+ "High: " + toString<std::wstring>(localTime.dwHighDateTime) + " " +
+ "Low: " + toString<std::wstring>(localTime.dwLowDateTime) + ") " + "\n\n" + getLastErrorFormatted();
throw std::runtime_error(wideToUtf8<std::string>(errorMessage));
}
return utcTime;
@@ -181,7 +181,7 @@ const size_t WRITE_TIME_HASH_BITS = CREATE_TIME_INFO_BITS - INDICATOR_EXISTING_B
template <size_t precision>
-FILETIME encodeRawInformation(zen::UInt64 rawInfo)
+FILETIME encodeRawInformation(UInt64 rawInfo)
{
rawInfo *= precision;
rawInfo += toUInt64(FAT_MIN_TIME);
@@ -192,13 +192,13 @@ FILETIME encodeRawInformation(zen::UInt64 rawInfo)
template <size_t precision>
-zen::UInt64 extractRawInformation(const FILETIME& createTime)
+UInt64 extractRawInformation(const FILETIME& createTime)
{
assert(toUInt64(FAT_MIN_TIME) <= toUInt64(createTime));
assert(toUInt64(createTime) <= toUInt64(FAT_MAX_TIME));
//FAT create time ranges from 1980 - 2107 (2^7 years) with 1/100 seconds precision
- zen::UInt64 rawInfo = toUInt64(createTime);
+ UInt64 rawInfo = toUInt64(createTime);
rawInfo -= toUInt64(FAT_MIN_TIME);
rawInfo /= precision; //reduce precision (FILETIME has unit 10^-7 s)
@@ -209,9 +209,9 @@ zen::UInt64 extractRawInformation(const FILETIME& createTime)
//convert write time to it's minimal representation (no restriction to FAT range "1980 - 2107")
-zen::UInt64 extractRawWriteTime(const FILETIME& writeTime)
+UInt64 extractRawWriteTime(const FILETIME& writeTime)
{
- zen::UInt64 rawInfo = toUInt64(writeTime);
+ UInt64 rawInfo = toUInt64(writeTime);
assert(rawInfo % PRECISION_WRITE_TIME == 0U);
rawInfo /= PRECISION_WRITE_TIME; //reduce precision (FILETIME has unit 10^-7 s)
return rawInfo;
@@ -221,7 +221,7 @@ zen::UInt64 extractRawWriteTime(const FILETIME& writeTime)
//files with different resolution than 2 seconds are rounded up when written to FAT
FILETIME roundToFatWriteTime(const FILETIME& writeTime)
{
- zen::UInt64 rawData = toUInt64(writeTime);
+ UInt64 rawData = toUInt64(writeTime);
if (rawData % PRECISION_WRITE_TIME != 0U)
rawData += PRECISION_WRITE_TIME;
@@ -249,8 +249,8 @@ std::bitset<UTC_LOCAL_OFFSET_BITS> getUtcLocalShift()
if (std::bitset<UTC_LOCAL_OFFSET_BITS - 1>(absValue).to_ulong() != static_cast<unsigned long>(absValue) || //time shifts that big shouldn't be possible!
timeShiftSec % (60 * 15) != 0) //all known time shift have at least 15 minute granularity!
{
- const wxString errorMessage = wxString(_("Conversion error:")) + wxT(" Unexpected UTC <-> local time shift: ") +
- wxT("(") + toString<wxString>(timeShiftSec) + wxT(") ") + wxT("\n\n") + zen::getLastErrorFormatted();
+ const std::wstring errorMessage = _("Conversion error:") + " Unexpected UTC <-> local time shift: " +
+ "(" + toString<std::wstring>(timeShiftSec) + ") " + "\n\n" + getLastErrorFormatted();
throw std::runtime_error(wideToUtf8<std::string>(errorMessage));
}
@@ -284,7 +284,7 @@ bool dst::fatHasUtcEncoded(const RawTime& rawTime) //"createTimeRaw" as retrieve
return false;
}
- const zen::UInt64 rawInfo = extractRawInformation<PRECISION_CREATE_TIME>(utcToLocal(rawTime.createTimeRaw));
+ const UInt64 rawInfo = extractRawInformation<PRECISION_CREATE_TIME>(utcToLocal(rawTime.createTimeRaw));
assert_static(WRITE_TIME_HASH_BITS == 30);
return (extractRawWriteTime(utcToLocal(rawTime.writeTimeRaw)) & 0x3FFFFFFFU) == (rawInfo & 0x3FFFFFFFU) && //ensure write time wasn't changed externally
@@ -299,7 +299,7 @@ dst::RawTime dst::fatEncodeUtcTime(const FILETIME& writeTimeRealUtc) //throw (st
//create time lets us store 40 bit of information
//indicator that utc time is encoded -> hopefully results in a date long way in the future; but even if this bit is accidentally set, we still have the hash!
- zen::UInt64 data = 1U;
+ UInt64 data = 1U;
const std::bitset<UTC_LOCAL_OFFSET_BITS> utcShift = getUtcLocalShift();
data <<= UTC_LOCAL_OFFSET_BITS;
@@ -322,14 +322,14 @@ FILETIME dst::fatDecodeUtcTime(const RawTime& rawTime) //return real UTC time; t
if (!fatHasUtcEncoded(rawTime))
return rawTime.writeTimeRaw;
- const zen::UInt64 rawInfo = extractRawInformation<PRECISION_CREATE_TIME>(utcToLocal(rawTime.createTimeRaw));
+ const UInt64 rawInfo = extractRawInformation<PRECISION_CREATE_TIME>(utcToLocal(rawTime.createTimeRaw));
- const std::bitset<UTC_LOCAL_OFFSET_BITS> rawShift(zen::to<int>((rawInfo >> WRITE_TIME_HASH_BITS) & 0x7FU)); //static_cast<int>: a shame MSC... "unsigned long" should be supported instead!
+ const std::bitset<UTC_LOCAL_OFFSET_BITS> rawShift(to<int>((rawInfo >> WRITE_TIME_HASH_BITS) & 0x7FU)); //static_cast<int>: a shame MSC... "unsigned long" should be supported instead!
assert_static(UTC_LOCAL_OFFSET_BITS == 7);
const int timeShiftSec = convertUtcLocalShift(rawShift);
const FILETIME writeTimeLocal = utcToLocal(rawTime.writeTimeRaw);
- const zen::Int64 realUTC = toInt64(writeTimeLocal) - zen::Int64(timeShiftSec) * 10000000;
+ const Int64 realUTC = toInt64(writeTimeLocal) - Int64(timeShiftSec) * 10000000;
return toFiletime(realUTC);
}
diff --git a/shared/file_error.h b/shared/file_error.h
index 7325e14b..ae9cc83e 100644
--- a/shared/file_error.h
+++ b/shared/file_error.h
@@ -7,7 +7,9 @@
#ifndef FILEERROR_H_INCLUDED
#define FILEERROR_H_INCLUDED
-#include <wx/string.h>
+#include "zstring.h"
+#include "string_utf8.h"
+#include <string>
namespace zen
@@ -15,24 +17,32 @@ namespace zen
class FileError //Exception base class used to notify file/directory copy/delete errors
{
public:
- FileError(const wxString& message) : errorMessage(message) {}
+ FileError(const std::wstring& message) : errorMessage(message) {}
virtual ~FileError() {}
- const wxString& msg() const
- {
- return errorMessage;
- }
+ const std::wstring& msg() const { return errorMessage; }
private:
- const wxString errorMessage;
+ std::wstring errorMessage;
};
-#define DEFINE_NEW_FILE_ERROR(X) struct X : public FileError { X(const wxString& message) : FileError(message) {} };
+#define DEFINE_NEW_FILE_ERROR(X) struct X : public FileError { X(const std::wstring& message) : FileError(message) {} };
DEFINE_NEW_FILE_ERROR(ErrorNotExisting);
DEFINE_NEW_FILE_ERROR(ErrorTargetExisting);
DEFINE_NEW_FILE_ERROR(ErrorTargetPathMissing);
DEFINE_NEW_FILE_ERROR(ErrorFileLocked);
+
+
+
+//facilitate usage of std::wstring for error messages:
+
+//allow implicit UTF8 conversion: since std::wstring models a GUI string, convenience is more important than performance
+inline std::wstring operator+(const std::wstring& lhs, const Zstring& rhs) { return std::wstring(lhs) += zen::utf8CvrtTo<std::wstring>(rhs); }
+
+//we musn't put our overloads in namespace std, but namespace zen (+ using directive) is sufficient
+inline std::wstring operator+(const std::wstring& lhs, const char* rhs) { return std::wstring(lhs) += utf8CvrtTo<std::wstring>(rhs); }
+inline std::wstring operator+(const std::wstring& lhs, const std::string& rhs) { return std::wstring(lhs) += utf8CvrtTo<std::wstring>(rhs); }
}
#endif // FILEERROR_H_INCLUDED
diff --git a/shared/file_handling.cpp b/shared/file_handling.cpp
index a17f1fd7..a5e7fa9f 100644
--- a/shared/file_handling.cpp
+++ b/shared/file_handling.cpp
@@ -10,9 +10,7 @@
#include <boost/bind.hpp>
#include <stdexcept>
#include "last_error.h"
-#include "system_constants.h"
#include "file_traverser.h"
-#include "string_conv.h"
#include "loki/ScopeGuard.h"
#include "symlink_target.h"
#include "file_io.h"
@@ -50,7 +48,7 @@ bool zen::fileExists(const Zstring& filename)
return ret != INVALID_FILE_ATTRIBUTES && !(ret & FILE_ATTRIBUTE_DIRECTORY); //returns true for (file-)symlinks also
#elif defined FFS_LINUX
- struct stat fileInfo;
+ struct stat fileInfo = {};
return ::lstat(filename.c_str(), &fileInfo) == 0 &&
(S_ISLNK(fileInfo.st_mode) || S_ISREG(fileInfo.st_mode)); //in Linux a symbolic link is neither file nor directory
#endif
@@ -62,10 +60,10 @@ bool zen::dirExists(const Zstring& dirname)
//symbolic links (broken or not) are also treated as existing directories!
#ifdef FFS_WIN
const DWORD ret = ::GetFileAttributes(applyLongPathPrefix(dirname).c_str());
- return (ret != INVALID_FILE_ATTRIBUTES) && (ret & FILE_ATTRIBUTE_DIRECTORY); //returns true for (dir-)symlinks also
+ return ret != INVALID_FILE_ATTRIBUTES && (ret & FILE_ATTRIBUTE_DIRECTORY); //returns true for (dir-)symlinks also
#elif defined FFS_LINUX
- struct stat dirInfo;
+ struct stat dirInfo = {};
return ::lstat(dirname.c_str(), &dirInfo) == 0 &&
(S_ISLNK(dirInfo.st_mode) || S_ISDIR(dirInfo.st_mode)); //in Linux a symbolic link is neither file nor directory
#endif
@@ -79,7 +77,7 @@ bool zen::symlinkExists(const Zstring& objname)
return ret != INVALID_FILE_ATTRIBUTES && (ret & FILE_ATTRIBUTE_REPARSE_POINT);
#elif defined FFS_LINUX
- struct stat fileInfo;
+ struct stat fileInfo = {};
return ::lstat(objname.c_str(), &fileInfo) == 0 &&
S_ISLNK(fileInfo.st_mode); //symbolic link
#endif
@@ -92,7 +90,7 @@ bool zen::somethingExists(const Zstring& objname) //throw() check whether
return ::GetFileAttributes(applyLongPathPrefix(objname).c_str()) != INVALID_FILE_ATTRIBUTES;
#elif defined FFS_LINUX
- struct stat fileInfo;
+ struct stat fileInfo = {};
return ::lstat(objname.c_str(), &fileInfo) == 0;
#endif
}
@@ -101,6 +99,64 @@ bool zen::somethingExists(const Zstring& objname) //throw() check whether
#ifdef FFS_WIN
namespace
{
+//manage file handle to update existing files (temporarily resetting read-only if necessary)
+//CreateFileCmd: lambda directly returning non-owned file handle from ::CreateFile()
+class FileUpdateHandle
+{
+public:
+ template <class CreateFileCmd>
+ FileUpdateHandle(const Zstring& filename, CreateFileCmd cmd) :
+ filenameFmt(applyLongPathPrefix(filename)),
+ hFile(INVALID_HANDLE_VALUE),
+ attr(INVALID_FILE_ATTRIBUTES)
+ {
+ hFile = cmd();
+ if (hFile != INVALID_HANDLE_VALUE)
+ return;
+
+ const DWORD lastError = ::GetLastError();
+ if (lastError == ERROR_ACCESS_DENIED) //function fails if file is read-only
+ {
+ Loki::ScopeGuard guardErrorCode = Loki::MakeGuard(::SetLastError, lastError); //transactional behavior: ensure cleanup (e.g. network drop) -> cref [!]
+
+ //read-only file attribute may cause trouble: temporarily reset it
+ const DWORD tmpAttr = ::GetFileAttributes(filenameFmt.c_str());
+ if (tmpAttr != INVALID_FILE_ATTRIBUTES && (tmpAttr & FILE_ATTRIBUTE_READONLY))
+ {
+ if (::SetFileAttributes(filenameFmt.c_str(), FILE_ATTRIBUTE_NORMAL))
+ {
+ guardErrorCode.Dismiss();
+ attr = tmpAttr; //"create" guard on read-only attribute
+
+ //now try again
+ hFile = cmd();
+ }
+ }
+ }
+ }
+
+ ~FileUpdateHandle()
+ {
+ if (hFile != INVALID_HANDLE_VALUE)
+ ::CloseHandle(hFile);
+
+ if (attr != INVALID_FILE_ATTRIBUTES)
+ ::SetFileAttributes(filenameFmt.c_str(), attr);
+ }
+
+ //may return INVALID_FILE_ATTRIBUTES, in which case ::GetLastError() may be called directly after FileUpdateHandle()
+ HANDLE get() const { return hFile; }
+
+private:
+ FileUpdateHandle(const FileUpdateHandle&);
+ FileUpdateHandle& operator=(const FileUpdateHandle&);
+
+ Zstring filenameFmt;
+ HANDLE hFile;
+ DWORD attr;
+};
+
+
zen::UInt64 getFileSizeSymlink(const Zstring& linkName) //throw (FileError)
{
//open handle to target of symbolic link
@@ -112,19 +168,14 @@ zen::UInt64 getFileSizeSymlink(const Zstring& linkName) //throw (FileError)
FILE_FLAG_BACKUP_SEMANTICS,
NULL);
if (hFile == INVALID_HANDLE_VALUE)
- {
- const wxString errorMessage = wxString(_("Error reading file attributes:")) + wxT("\n\"") + zen::zToWx(linkName) + wxT("\"");
- throw FileError(errorMessage + wxT("\n\n") + zen::getLastErrorFormatted());
- }
+ throw FileError(_("Error reading file attributes:") + "\n\"" + linkName + "\"" + "\n\n" + zen::getLastErrorFormatted());
+
Loki::ScopeGuard dummy = Loki::MakeGuard(::CloseHandle, hFile);
(void)dummy; //silence warning "unused variable"
BY_HANDLE_FILE_INFORMATION fileInfo = {};
if (!::GetFileInformationByHandle(hFile, &fileInfo))
- {
- const wxString errorMessage = wxString(_("Error reading file attributes:")) + wxT("\n\"") + zen::zToWx(linkName) + wxT("\"");
- throw FileError(errorMessage + wxT("\n\n") + zen::getLastErrorFormatted());
- }
+ throw FileError(_("Error reading file attributes:") + "\n\"" + linkName + "\"" + "\n\n" + zen::getLastErrorFormatted());
return zen::UInt64(fileInfo.nFileSizeLow, fileInfo.nFileSizeHigh);
}
@@ -138,10 +189,8 @@ zen::UInt64 zen::getFilesize(const Zstring& filename) //throw (FileError)
WIN32_FIND_DATA fileInfo = {};
const HANDLE searchHandle = ::FindFirstFile(applyLongPathPrefix(filename).c_str(), &fileInfo);
if (searchHandle == INVALID_HANDLE_VALUE)
- {
- const wxString errorMessage = wxString(_("Error reading file attributes:")) + wxT("\n\"") + zToWx(filename) + wxT("\"");
- throw FileError(errorMessage + wxT("\n\n") + zen::getLastErrorFormatted());
- }
+ throw FileError(_("Error reading file attributes:") + "\n\"" + filename + "\"" + "\n\n" + zen::getLastErrorFormatted());
+
::FindClose(searchHandle);
const bool isSymbolicLink = (fileInfo.dwFileAttributes & FILE_ATTRIBUTE_REPARSE_POINT) != 0;
@@ -153,10 +202,7 @@ zen::UInt64 zen::getFilesize(const Zstring& filename) //throw (FileError)
#elif defined FFS_LINUX
struct stat fileInfo = {};
if (::stat(filename.c_str(), &fileInfo) != 0) //follow symbolic links
- {
- const wxString errorMessage = wxString(_("Error reading file attributes:")) + wxT("\n\"") + zToWx(filename) + wxT("\"");
- throw FileError(errorMessage + wxT("\n\n") + zen::getLastErrorFormatted());
- }
+ throw FileError(_("Error reading file attributes:") + "\n\"" + filename + "\"" + "\n\n" + zen::getLastErrorFormatted());
return zen::UInt64(fileInfo.st_size);
#endif
@@ -177,8 +223,8 @@ DWORD retrieveVolumeSerial(const Zstring& pathName) //return 0 on error!
return 0;
Zstring volumePath = &buffer[0];
- if (!volumePath.EndsWith(common::FILE_NAME_SEPARATOR))
- volumePath += common::FILE_NAME_SEPARATOR;
+ if (!volumePath.EndsWith(FILE_NAME_SEPARATOR))
+ volumePath += FILE_NAME_SEPARATOR;
DWORD volumeSerial = 0;
if (!::GetVolumeInformation(volumePath.c_str(), //__in_opt LPCTSTR lpRootPathName,
@@ -200,13 +246,13 @@ dev_t retrieveVolumeSerial(const Zstring& pathName) //return 0 on error!
Zstring volumePathName = pathName;
//remove trailing slash
- if (volumePathName.size() > 1 && volumePathName.EndsWith(common::FILE_NAME_SEPARATOR)) //exception: allow '/'
- volumePathName = volumePathName.BeforeLast(common::FILE_NAME_SEPARATOR);
+ if (volumePathName.size() > 1 && volumePathName.EndsWith(FILE_NAME_SEPARATOR)) //exception: allow '/'
+ volumePathName = volumePathName.BeforeLast(FILE_NAME_SEPARATOR);
struct stat fileInfo = {};
while (::lstat(volumePathName.c_str(), &fileInfo) != 0) //go up in folder hierarchy until existing folder is found
{
- volumePathName = volumePathName.BeforeLast(common::FILE_NAME_SEPARATOR); //returns empty string if ch not found
+ volumePathName = volumePathName.BeforeLast(FILE_NAME_SEPARATOR); //returns empty string if ch not found
if (volumePathName.empty())
return 0; //this includes path "/" also!
}
@@ -219,13 +265,8 @@ dev_t retrieveVolumeSerial(const Zstring& pathName) //return 0 on error!
zen::ResponseSameVol zen::onSameVolume(const Zstring& folderLeft, const Zstring& folderRight) //throw()
{
-#ifdef FFS_WIN
- typedef DWORD VolSerial;
-#elif defined FFS_LINUX
- typedef dev_t VolSerial;
-#endif
- const VolSerial serialLeft = retrieveVolumeSerial(folderLeft); //returns 0 on error!
- const VolSerial serialRight = retrieveVolumeSerial(folderRight); //returns 0 on error!
+ const auto serialLeft = retrieveVolumeSerial(folderLeft); //returns 0 on error!
+ const auto serialRight = retrieveVolumeSerial(folderRight); //returns 0 on error!
if (serialLeft == 0 || serialRight == 0)
return VOLUME_CANT_SAY;
@@ -254,10 +295,11 @@ bool zen::removeFile(const Zstring& filename) //throw (FileError);
if (::DeleteFile(filenameFmt.c_str()))
return true;
}
-#endif
//eval error code before next call
- wxString errorMessage = wxString(_("Error deleting file:")) + wxT("\n\"") + zToWx(filename) + wxT("\"");
- errorMessage += wxT("\n\n") + zen::getLastErrorFormatted();
+ DWORD lastError = ::GetLastError();
+#elif defined FFS_LINUX
+ int lastError = errno;
+#endif
//no error situation if file is not existing! manual deletion relies on it!
//perf: place check in error handling block
@@ -265,7 +307,7 @@ bool zen::removeFile(const Zstring& filename) //throw (FileError);
if (!somethingExists(filename))
return false; //neither file nor any other object (e.g. broken symlink) with that name existing
- throw FileError(errorMessage);
+ throw FileError(_("Error deleting file:") + "\n\"" + filename + "\"" + "\n\n" + zen::getLastErrorFormatted(lastError));
}
return true;
}
@@ -286,8 +328,6 @@ DEFINE_NEW_FILE_ERROR(ErrorDifferentVolume);
//throw (FileError); ErrorDifferentVolume if it is due to moving file to another volume
void renameFileInternal(const Zstring& oldName, const Zstring& newName) //throw (FileError: ErrorDifferentVolume, ErrorTargetExisting)
{
- using namespace zen; //for zToWx()
-
#ifdef FFS_WIN
const Zstring oldNameFmt = applyLongPathPrefix(oldName);
const Zstring newNameFmt = applyLongPathPrefix(newName);
@@ -296,10 +336,11 @@ void renameFileInternal(const Zstring& oldName, const Zstring& newName) //throw
newNameFmt.c_str(), //__in_opt LPCTSTR lpNewFileName,
0)) //__in DWORD dwFlags
{
- if (::GetLastError() == ERROR_ACCESS_DENIED) //MoveFileEx may fail to rename a read-only file on a SAMBA-share -> (try to) handle this
+ DWORD lastError = ::GetLastError();
+ if (lastError == ERROR_ACCESS_DENIED) //MoveFileEx may fail to rename a read-only file on a SAMBA-share -> (try to) handle this
{
- const DWORD oldNameAttrib = ::GetFileAttributes(oldNameFmt.c_str());
- if (oldNameAttrib != INVALID_FILE_ATTRIBUTES)
+ const DWORD oldAttr = ::GetFileAttributes(oldNameFmt.c_str());
+ if (oldAttr != INVALID_FILE_ATTRIBUTES && (oldAttr & FILE_ATTRIBUTE_READONLY))
{
if (::SetFileAttributes(oldNameFmt.c_str(), FILE_ATTRIBUTE_NORMAL)) //remove readonly-attribute
{
@@ -309,26 +350,21 @@ void renameFileInternal(const Zstring& oldName, const Zstring& newName) //throw
0)) //__in DWORD dwFlags
{
//(try to) restore file attributes
- ::SetFileAttributes(newNameFmt.c_str(), oldNameAttrib); //don't handle error
+ ::SetFileAttributes(newNameFmt.c_str(), oldAttr); //don't handle error
return;
}
else
{
- Loki::ScopeGuard dummy = Loki::MakeGuard(::SetLastError, ::GetLastError()); //use error code from ::MoveFileEx()
- (void)dummy;
+ lastError = ::GetLastError(); //use error code from second call to ::MoveFileEx()
//cleanup: (try to) restore file attributes: assume oldName is still existing
- ::SetFileAttributes(oldNameFmt.c_str(),
- oldNameAttrib);
+ ::SetFileAttributes(oldNameFmt.c_str(), oldAttr);
}
}
}
}
- const DWORD lastError = ::GetLastError();
-
- wxString errorMessage = wxString(_("Error moving file:")) + wxT("\n\"") + zToWx(oldName) + wxT("\" ->\n\"") + zToWx(newName) + wxT("\"");
- errorMessage += wxT("\n\n") + zen::getLastErrorFormatted(lastError);
+ std::wstring errorMessage = _("Error moving file:") + "\n\"" + oldName + "\" ->\n\"" + newName + "\"" + "\n\n" + zen::getLastErrorFormatted(lastError);
if (lastError == ERROR_NOT_SAME_DEVICE)
throw ErrorDifferentVolume(errorMessage);
@@ -343,8 +379,7 @@ void renameFileInternal(const Zstring& oldName, const Zstring& newName) //throw
{
const int lastError = errno;
- wxString errorMessage = wxString(_("Error moving file:")) + wxT("\n\"") + zToWx(oldName) + wxT("\" ->\n\"") + zToWx(newName) + wxT("\"");
- errorMessage += wxT("\n\n") + zen::getLastErrorFormatted(lastError);
+ std::wstring errorMessage = _("Error moving file:") + "\n\"" + oldName + "\" ->\n\"" + newName + "\"" + "\n\n" + zen::getLastErrorFormatted(lastError);
if (lastError == EXDEV)
throw ErrorDifferentVolume(errorMessage);
@@ -384,10 +419,10 @@ Zstring getFilenameFmt(const Zstring& filename, Function fun) //throw(); returns
Zstring createTemp8Dot3Name(const Zstring& fileName) //find a unique 8.3 short name
{
- const Zstring pathPrefix = fileName.find(common::FILE_NAME_SEPARATOR) != Zstring::npos ?
- (fileName.BeforeLast(common::FILE_NAME_SEPARATOR) + common::FILE_NAME_SEPARATOR) : Zstring();
+ const Zstring pathPrefix = fileName.find(FILE_NAME_SEPARATOR) != Zstring::npos ?
+ (fileName.BeforeLast(FILE_NAME_SEPARATOR) + FILE_NAME_SEPARATOR) : Zstring();
- Zstring extension = fileName.AfterLast(common::FILE_NAME_SEPARATOR).AfterLast(Zchar('.')); //extension needn't contain reasonable data
+ Zstring extension = fileName.AfterLast(FILE_NAME_SEPARATOR).AfterLast(Zchar('.')); //extension needn't contain reasonable data
if (extension.empty())
extension = Zstr("FFS");
extension.Truncate(3);
@@ -399,7 +434,7 @@ Zstring createTemp8Dot3Name(const Zstring& fileName) //find a unique 8.3 short n
return output;
}
- throw std::runtime_error(std::string("100000000 files, one for each number, exist in this directory? You're kidding...\n") + std::string(wxString(pathPrefix.c_str()).ToUTF8()));
+ throw std::runtime_error(std::string("100000000 files, one for each number, exist in this directory? You're kidding...\n") + zen::utf8CvrtTo<std::string>(pathPrefix));
}
@@ -408,14 +443,14 @@ bool fix8Dot3NameClash(const Zstring& oldName, const Zstring& newName) //throw
{
using namespace zen;
- if (newName.find(common::FILE_NAME_SEPARATOR) == Zstring::npos)
+ if (newName.find(FILE_NAME_SEPARATOR) == Zstring::npos)
return false;
if (zen::somethingExists(newName)) //name OR directory!
{
- const Zstring fileNameOrig = newName.AfterLast(common::FILE_NAME_SEPARATOR); //returns the whole string if ch not found
- const Zstring fileNameShort = getFilenameFmt(newName, ::GetShortPathName).AfterLast(common::FILE_NAME_SEPARATOR); //throw() returns empty string on error
- const Zstring fileNameLong = getFilenameFmt(newName, ::GetLongPathName) .AfterLast(common::FILE_NAME_SEPARATOR); //throw() returns empty string on error
+ const Zstring fileNameOrig = newName.AfterLast(FILE_NAME_SEPARATOR); //returns the whole string if ch not found
+ const Zstring fileNameShort = getFilenameFmt(newName, ::GetShortPathName).AfterLast(FILE_NAME_SEPARATOR); //throw() returns empty string on error
+ const Zstring fileNameLong = getFilenameFmt(newName, ::GetLongPathName) .AfterLast(FILE_NAME_SEPARATOR); //throw() returns empty string on error
if (!fileNameShort.empty() &&
!fileNameLong.empty() &&
@@ -425,8 +460,7 @@ bool fix8Dot3NameClash(const Zstring& oldName, const Zstring& newName) //throw
//we detected an event where newName is in shortname format (although it is intended to be a long name) and
//writing target file failed because another unrelated file happens to have the same short name
- const Zstring unrelatedPathLong = newName.BeforeLast(common::FILE_NAME_SEPARATOR) + common::FILE_NAME_SEPARATOR +
- fileNameLong;
+ const Zstring unrelatedPathLong = newName.BeforeLast(FILE_NAME_SEPARATOR) + FILE_NAME_SEPARATOR + fileNameLong;
//find another name in short format: this ensures the actual short name WILL be renamed as well!
const Zstring parkedTarget = createTemp8Dot3Name(newName);
@@ -467,8 +501,6 @@ void zen::renameFile(const Zstring& oldName, const Zstring& newName) //throw (Fi
}
-using zen::CallbackMoveFile;
-
class CopyCallbackImpl : public zen::CallbackCopyFile //callback functionality
{
public:
@@ -476,17 +508,9 @@ public:
virtual void deleteTargetFile(const Zstring& targetFile) { assert(!fileExists(targetFile)); }
- virtual Response updateCopyStatus(zen::UInt64 totalBytesTransferred)
+ virtual void updateCopyStatus(zen::UInt64 totalBytesTransferred)
{
- switch (moveCallback.requestUiRefresh(sourceFile_))
- {
- case CallbackMoveFile::CONTINUE:
- return CallbackCopyFile::CONTINUE;
-
- case CallbackMoveFile::CANCEL:
- return CallbackCopyFile::CANCEL;
- }
- return CallbackCopyFile::CONTINUE; //dummy return value
+ moveCallback.requestUiRefresh(sourceFile_);
}
private:
@@ -499,20 +523,13 @@ void zen::moveFile(const Zstring& sourceFile, const Zstring& targetFile, bool ig
{
//call back once per file (moveFile() is called by moveDirectory())
if (callback)
- switch (callback->requestUiRefresh(sourceFile))
- {
- case CallbackMoveFile::CONTINUE:
- break;
- case CallbackMoveFile::CANCEL: //a user aborted operation IS an error condition!
- throw FileError(wxString(_("Error moving file:")) + wxT("\n\"") + zToWx(sourceFile) + wxT("\" ->\n\"") + zToWx(targetFile) + wxT("\"") +
- wxT("\n\n") + _("Operation aborted!"));
- }
+ callback->requestUiRefresh(sourceFile);
const bool targetExisting = fileExists(targetFile);
if (targetExisting && !ignoreExisting) //test file existence: e.g. Linux might silently overwrite existing symlinks
- throw FileError(wxString(_("Error moving file:")) + wxT("\n\"") + zToWx(sourceFile) + wxT("\" ->\n\"") + zToWx(targetFile) + wxT("\"") +
- wxT("\n\n") + _("Target file already existing!"));
+ throw FileError(_("Error moving file:") + "\n\"" + sourceFile + "\" ->\n\"" + targetFile + "\"" +
+ "\n\n" + _("Target file already existing!"));
if (!targetExisting)
{
@@ -571,10 +588,7 @@ public:
return Loki::Int2Type<ReturnValDir::TRAVERSING_DIR_IGNORE>(); //DON'T traverse into subdirs; moveDirectory works recursively!
}
- virtual void onError(const wxString& errorText)
- {
- throw FileError(errorText);
- }
+ virtual HandleError onError(const std::wstring& errorText) { throw FileError(errorText); }
private:
NameList& files_;
@@ -582,30 +596,20 @@ private:
};
-struct RemoveCallbackImpl : public zen::CallbackRemoveDir
+struct RemoveCallbackImpl : public CallbackRemoveDir
{
RemoveCallbackImpl(const Zstring& sourceDir,
- const Zstring& targetDir,
CallbackMoveFile& moveCallback) :
sourceDir_(sourceDir),
- targetDir_(targetDir),
moveCallback_(moveCallback) {}
virtual void notifyDeletion(const Zstring& currentObject)
{
- switch (moveCallback_.requestUiRefresh(sourceDir_))
- {
- case CallbackMoveFile::CONTINUE:
- break;
- case CallbackMoveFile::CANCEL: //a user aborted operation IS an error condition!
- throw zen::FileError(wxString(_("Error moving directory:")) + wxT("\n\"") + zen::zToWx(sourceDir_) + wxT("\" ->\n\"") +
- zen::zToWx(targetDir_) + wxT("\"") + wxT("\n\n") + _("Operation aborted!"));
- }
+ moveCallback_.requestUiRefresh(sourceDir_);
}
private:
const Zstring sourceDir_;
- const Zstring targetDir_;
CallbackMoveFile& moveCallback_;
};
}
@@ -617,20 +621,13 @@ void moveDirectoryImpl(const Zstring& sourceDir, const Zstring& targetDir, bool
//call back once per folder
if (callback)
- switch (callback->requestUiRefresh(sourceDir))
- {
- case CallbackMoveFile::CONTINUE:
- break;
- case CallbackMoveFile::CANCEL: //a user aborted operation IS an error condition!
- throw FileError(wxString(_("Error moving directory:")) + wxT("\n\"") + zToWx(sourceDir) + wxT("\" ->\n\"") +
- zToWx(targetDir) + wxT("\"") + wxT("\n\n") + _("Operation aborted!"));
- }
+ callback->requestUiRefresh(sourceDir);
const bool targetExisting = dirExists(targetDir);
if (targetExisting && !ignoreExisting) //directory or symlink exists (or even a file... this error will be caught later)
- throw FileError(wxString(_("Error moving directory:")) + wxT("\n\"") + zToWx(sourceDir) + wxT("\" ->\n\"") + zToWx(targetDir) + wxT("\"") +
- wxT("\n\n") + _("Target directory already existing!"));
+ throw FileError(_("Error moving directory:") + "\n\"" + sourceDir + "\" ->\n\"" + targetDir + "\"" +
+ "\n\n" + _("Target directory already existing!"));
const bool isSymlink = symlinkExists(sourceDir);
@@ -662,9 +659,9 @@ void moveDirectoryImpl(const Zstring& sourceDir, const Zstring& targetDir, bool
TraverseOneLevel traverseCallback(fileList, dirList);
traverseFolder(sourceDir, false, traverseCallback); //traverse one level, don't follow symlinks
- const Zstring targetDirFormatted = targetDir.EndsWith(common::FILE_NAME_SEPARATOR) ? //ends with path separator
+ const Zstring targetDirFormatted = targetDir.EndsWith(FILE_NAME_SEPARATOR) ? //ends with path separator
targetDir :
- targetDir + common::FILE_NAME_SEPARATOR;
+ targetDir + FILE_NAME_SEPARATOR;
//move files
for (TraverseOneLevel::NameList::const_iterator i = fileList.begin(); i != fileList.end(); ++i)
@@ -678,7 +675,7 @@ void moveDirectoryImpl(const Zstring& sourceDir, const Zstring& targetDir, bool
}
//delete source
- std::auto_ptr<RemoveCallbackImpl> removeCallback(callback != NULL ? new RemoveCallbackImpl(sourceDir, targetDir, *callback) : NULL);
+ std::auto_ptr<RemoveCallbackImpl> removeCallback(callback != NULL ? new RemoveCallbackImpl(sourceDir, *callback) : NULL);
removeDirectory(sourceDir, removeCallback.get()); //throw (FileError);
}
@@ -691,12 +688,12 @@ void zen::moveDirectory(const Zstring& sourceDir, const Zstring& targetDir, bool
#elif defined FFS_LINUX
const Zstring sourceDirFormatted = //remove trailing slash
- sourceDir.size() > 1 && sourceDir.EndsWith(common::FILE_NAME_SEPARATOR) ? //exception: allow '/'
- sourceDir.BeforeLast(common::FILE_NAME_SEPARATOR) :
+ sourceDir.size() > 1 && sourceDir.EndsWith(FILE_NAME_SEPARATOR) ? //exception: allow '/'
+ sourceDir.BeforeLast(FILE_NAME_SEPARATOR) :
sourceDir;
const Zstring targetDirFormatted = //remove trailing slash
- targetDir.size() > 1 && targetDir.EndsWith(common::FILE_NAME_SEPARATOR) ? //exception: allow '/'
- targetDir.BeforeLast(common::FILE_NAME_SEPARATOR) :
+ targetDir.size() > 1 && targetDir.EndsWith(FILE_NAME_SEPARATOR) ? //exception: allow '/'
+ targetDir.BeforeLast(FILE_NAME_SEPARATOR) :
targetDir;
#endif
@@ -727,10 +724,7 @@ public:
m_dirs.push_back(fullName);
return Loki::Int2Type<ReturnValDir::TRAVERSING_DIR_IGNORE>(); //DON'T traverse into subdirs; removeDirectory works recursively!
}
- virtual void onError(const wxString& errorText)
- {
- throw FileError(errorText);
- }
+ virtual HandleError onError(const std::wstring& errorText) { throw FileError(errorText); }
private:
std::vector<Zstring>& m_files;
@@ -759,10 +753,8 @@ void zen::removeDirectory(const Zstring& directory, CallbackRemoveDir* callback)
#elif defined FFS_LINUX
if (::unlink(directory.c_str()) != 0)
#endif
- {
- wxString errorMessage = wxString(_("Error deleting directory:")) + wxT("\n\"") + zToWx(directory) + wxT("\"");
- throw FileError(errorMessage + wxT("\n\n") + zen::getLastErrorFormatted());
- }
+ throw FileError(_("Error deleting directory:") + "\n\"" + directory + "\"" + "\n\n" + zen::getLastErrorFormatted());
+
if (callback) callback->notifyDeletion(directory); //once per symlink
return;
}
@@ -792,8 +784,7 @@ void zen::removeDirectory(const Zstring& directory, CallbackRemoveDir* callback)
if (::rmdir(directory.c_str()) != 0)
#endif
{
- wxString errorMessage = wxString(_("Error deleting directory:")) + wxT("\n\"") + zToWx(directory) + wxT("\"");
- throw FileError(errorMessage + wxT("\n\n") + zen::getLastErrorFormatted());
+ throw FileError(_("Error deleting directory:") + "\n\"" + directory + "\"" + "\n\n" + zen::getLastErrorFormatted());
}
if (callback) callback->notifyDeletion(directory); //and once per folder
}
@@ -810,10 +801,7 @@ void zen::copyFileTimes(const Zstring& sourceObj, const Zstring& targetObj, bool
if (!::GetFileAttributesEx(applyLongPathPrefix(sourceObj).c_str(), //__in LPCTSTR lpFileName,
GetFileExInfoStandard, //__in GET_FILEEX_INFO_LEVELS fInfoLevelId,
&sourceAttr)) //__out LPVOID lpFileInformation
- {
- const wxString errorMessage = wxString(_("Error reading file attributes:")) + wxT("\n\"") + zToWx(sourceObj) + wxT("\"");
- throw FileError(errorMessage + wxT("\n\n") + zen::getLastErrorFormatted());
- }
+ throw FileError(_("Error reading file attributes:") + "\n\"" + sourceObj + "\"" + "\n\n" + zen::getLastErrorFormatted());
const bool isReparsePoint = (sourceAttr.dwFileAttributes & FILE_ATTRIBUTE_REPARSE_POINT) != 0;
const bool isDirectory = (sourceAttr.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) != 0;
@@ -828,10 +816,7 @@ void zen::copyFileTimes(const Zstring& sourceObj, const Zstring& targetObj, bool
FILE_FLAG_BACKUP_SEMANTICS, //needed to open a directory; no FILE_FLAG_OPEN_REPARSE_POINT => deref symlinks
NULL);
if (hSource == INVALID_HANDLE_VALUE)
- {
- const wxString errorMessage = wxString(_("Error reading file attributes:")) + wxT("\n\"") + zToWx(sourceObj) + wxT("\"");
- throw FileError(errorMessage + wxT("\n\n") + zen::getLastErrorFormatted());
- }
+ throw FileError(_("Error reading file attributes:") + "\n\"" + sourceObj + "\"" + "\n\n" + zen::getLastErrorFormatted());
Loki::ScopeGuard dummy = Loki::MakeGuard(::CloseHandle, hSource);
(void)dummy; //silence warning "unused variable"
@@ -840,10 +825,7 @@ void zen::copyFileTimes(const Zstring& sourceObj, const Zstring& targetObj, bool
&creationTime, //__out_opt LPFILETIME lpCreationTime,
NULL, //__out_opt LPFILETIME lpLastAccessTime,
&lastWriteTime)) //__out_opt LPFILETIME lpLastWriteTime
- {
- const wxString errorMessage = wxString(_("Error reading file attributes:")) + wxT("\n\"") + zToWx(sourceObj) + wxT("\"");
- throw FileError(errorMessage + wxT("\n\n") + zen::getLastErrorFormatted());
- }
+ throw FileError(_("Error reading file attributes:") + "\n\"" + sourceObj + "\"" + "\n\n" + zen::getLastErrorFormatted());
}
else
{
@@ -881,21 +863,29 @@ void zen::copyFileTimes(const Zstring& sourceObj, const Zstring& targetObj, bool
//opening newly created target file may fail due to some AV-software scanning it: no error, we will wait!
//http://support.microsoft.com/?scid=kb%3Ben-us%3B316609&x=17&y=20
//-> enable as soon it turns out it is required!
- HANDLE hTarget = INVALID_HANDLE_VALUE;
/*const int retryInterval = 50;
const int maxRetries = 2000 / retryInterval;
for (int i = 0; i < maxRetries; ++i)
{
*/
- hTarget = ::CreateFile(applyLongPathPrefix(targetObj).c_str(),
- FILE_WRITE_ATTRIBUTES,
- FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
- NULL,
- OPEN_EXISTING,
- FILE_FLAG_BACKUP_SEMANTICS | //needed to open a directory
- (deRefSymlinks ? 0 : FILE_FLAG_OPEN_REPARSE_POINT), //process symlinks
- NULL);
+
+ //may need to remove the readonly-attribute (e.g. FAT usb drives)
+ FileUpdateHandle targetHandle(targetObj, [=]()
+ {
+ return ::CreateFile(applyLongPathPrefix(targetObj).c_str(),
+ FILE_GENERIC_WRITE, //ATTENTION: although FILE_WRITE_ATTRIBUTES should(!) be sufficient, this may leads to access denied on NAS shares, unless we specify FILE_GENERIC_WRITE
+ FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
+ NULL,
+ OPEN_EXISTING,
+ FILE_FLAG_BACKUP_SEMANTICS | //needed to open a directory
+ (deRefSymlinks ? 0 : FILE_FLAG_OPEN_REPARSE_POINT), //process symlinks
+ NULL);
+ });
+
+ if (targetHandle.get() == INVALID_HANDLE_VALUE)
+ throw FileError(_("Error changing modification time:") + "\n\"" + targetObj + "\"" + "\n\n" + zen::getLastErrorFormatted());
+
/*
if (hTarget == INVALID_HANDLE_VALUE && ::GetLastError() == ERROR_SHARING_VIOLATION)
::Sleep(retryInterval); //wait then retry
@@ -904,22 +894,11 @@ void zen::copyFileTimes(const Zstring& sourceObj, const Zstring& targetObj, bool
}
*/
- if (hTarget == INVALID_HANDLE_VALUE)
- {
- wxString errorMessage = wxString(_("Error changing modification time:")) + wxT("\n\"") + zToWx(targetObj) + wxT("\"");
- throw FileError(errorMessage + wxT("\n\n") + zen::getLastErrorFormatted());
- }
- Loki::ScopeGuard dummy = Loki::MakeGuard(::CloseHandle, hTarget);
- (void)dummy; //silence warning "unused variable"
-
- if (!::SetFileTime(hTarget,
+ if (!::SetFileTime(targetHandle.get(),
&creationTime,
NULL,
&lastWriteTime))
- {
- wxString errorMessage = wxString(_("Error changing modification time:")) + wxT("\n\"") + zToWx(targetObj) + wxT("\"");
- throw FileError(errorMessage + wxT("\n\n") + zen::getLastErrorFormatted());
- }
+ throw FileError(_("Error changing modification time:") + "\n\"" + targetObj + "\"" + "\n\n" + zen::getLastErrorFormatted());
#ifndef NDEBUG //dst hack: verify data written
if (dst::isFatDrive(targetObj) && !zen::dirExists(targetObj)) //throw()
@@ -939,10 +918,7 @@ void zen::copyFileTimes(const Zstring& sourceObj, const Zstring& targetObj, bool
{
struct stat objInfo = {};
if (::stat(sourceObj.c_str(), &objInfo) != 0) //read file attributes from source directory
- {
- const wxString errorMessage = wxString(_("Error reading file attributes:")) + wxT("\n\"") + zToWx(sourceObj) + wxT("\"");
- throw FileError(errorMessage + wxT("\n\n") + zen::getLastErrorFormatted());
- }
+ throw FileError(_("Error reading file attributes:") + "\n\"" + sourceObj + "\"" + "\n\n" + zen::getLastErrorFormatted());
struct utimbuf newTimes = {};
newTimes.actime = objInfo.st_atime;
@@ -950,19 +926,13 @@ void zen::copyFileTimes(const Zstring& sourceObj, const Zstring& targetObj, bool
//(try to) set new "last write time"
if (::utime(targetObj.c_str(), &newTimes) != 0) //return value not evaluated!
- {
- wxString errorMessage = wxString(_("Error changing modification time:")) + wxT("\n\"") + zToWx(targetObj) + wxT("\"");
- throw FileError(errorMessage + wxT("\n\n") + zen::getLastErrorFormatted());
- }
+ throw FileError(_("Error changing modification time:") + "\n\"" + targetObj + "\"" + "\n\n" + zen::getLastErrorFormatted());
}
else
{
struct stat objInfo = {};
if (::lstat(sourceObj.c_str(), &objInfo) != 0) //read file attributes from source directory
- {
- const wxString errorMessage = wxString(_("Error reading file attributes:")) + wxT("\n\"") + zToWx(sourceObj) + wxT("\"");
- throw FileError(errorMessage + wxT("\n\n") + zen::getLastErrorFormatted());
- }
+ throw FileError(_("Error reading file attributes:") + "\n\"" + sourceObj + "\"" + "\n\n" + zen::getLastErrorFormatted());
struct timeval newTimes[2] = {};
newTimes[0].tv_sec = objInfo.st_atime; /* seconds */
@@ -972,10 +942,7 @@ void zen::copyFileTimes(const Zstring& sourceObj, const Zstring& targetObj, bool
newTimes[1].tv_usec = 0; /* microseconds */
if (::lutimes(targetObj.c_str(), newTimes) != 0) //return value not evaluated!
- {
- wxString errorMessage = wxString(_("Error changing modification time:")) + wxT("\n\"") + zToWx(targetObj) + wxT("\"");
- throw FileError(errorMessage + wxT("\n\n") + zen::getLastErrorFormatted());
- }
+ throw FileError(_("Error changing modification time:") + "\n\"" + targetObj + "\"" + "\n\n" + zen::getLastErrorFormatted());
}
#endif
}
@@ -983,28 +950,6 @@ void zen::copyFileTimes(const Zstring& sourceObj, const Zstring& targetObj, bool
namespace
{
-struct TryCleanUp
-{
- static void tryDeleteDir(const Zstring& dirname) //throw ()
- {
- try
- {
- zen::removeDirectory(dirname, NULL);
- }
- catch (...) {}
- }
-
- static void tryDeleteFile(const Zstring& filename) //throw ()
- {
- try
- {
- zen::removeFile(filename);
- }
- catch (...) {}
- }
-};
-
-
#ifdef FFS_WIN
Zstring resolveDirectorySymlink(const Zstring& dirLinkName) //get full target path of symbolic link to a directory; throw (FileError)
{
@@ -1017,10 +962,7 @@ Zstring resolveDirectorySymlink(const Zstring& dirLinkName) //get full target pa
FILE_FLAG_BACKUP_SEMANTICS, //needed to open a directory
NULL);
if (hDir == INVALID_HANDLE_VALUE)
- {
- wxString errorMessage = wxString(_("Error resolving symbolic link:")) + wxT("\n\"") + zen::zToWx(dirLinkName) + wxT("\"");
- throw FileError(errorMessage + wxT("\n\n") + zen::getLastErrorFormatted());
- }
+ throw FileError(_("Error resolving symbolic link:") + "\n\"" + dirLinkName + "\"" + "\n\n" + zen::getLastErrorFormatted());
Loki::ScopeGuard dummy = Loki::MakeGuard(::CloseHandle, hDir);
(void)dummy; //silence warning "unused variable"
@@ -1038,7 +980,7 @@ Zstring resolveDirectorySymlink(const Zstring& dirLinkName) //get full target pa
util::getDllFun<GetFinalPathNameByHandleWFunc>(L"kernel32.dll", "GetFinalPathNameByHandleW");
if (getFinalPathNameByHandle == NULL)
- throw FileError(wxString(_("Error loading library function:")) + wxT("\n\"") + wxT("GetFinalPathNameByHandleW") + wxT("\""));
+ throw FileError(_("Error loading library function:") + "\n\"" + "GetFinalPathNameByHandleW" + "\"");
const DWORD rv = getFinalPathNameByHandle(
hDir, //__in HANDLE hFile,
@@ -1047,8 +989,9 @@ Zstring resolveDirectorySymlink(const Zstring& dirLinkName) //get full target pa
0); //__in DWORD dwFlags
if (rv >= BUFFER_SIZE || rv == 0)
{
- wxString errorMessage = wxString(_("Error resolving symbolic link:")) + wxT("\n\"") + zen::zToWx(dirLinkName) + wxT("\"");
- if (rv == 0) errorMessage += wxT("\n\n") + zen::getLastErrorFormatted();
+ std::wstring errorMessage = _("Error resolving symbolic link:") + "\n\"" + dirLinkName + "\"";
+ if (rv == 0)
+ errorMessage += L"\n\n" + zen::getLastErrorFormatted();
throw FileError(errorMessage);
}
@@ -1061,8 +1004,6 @@ Zstring resolveDirectorySymlink(const Zstring& dirLinkName) //get full target pa
//copy SELinux security context
void copySecurityContext(const Zstring& source, const Zstring& target, bool derefSymlinks) //throw (FileError)
{
- using zen::zToWx;
-
security_context_t contextSource = NULL;
const int rv = derefSymlinks ?
::getfilecon (source.c_str(), &contextSource) :
@@ -1073,8 +1014,7 @@ void copySecurityContext(const Zstring& source, const Zstring& target, bool dere
errno == EOPNOTSUPP) //extended attributes are not supported by the filesystem
return;
- wxString errorMessage = wxString(_("Error reading security context:")) + wxT("\n\"") + zToWx(source) + wxT("\"");
- throw FileError(errorMessage + wxT("\n\n") + zen::getLastErrorFormatted());
+ throw FileError(_("Error reading security context:") + "\n\"" + source + "\"" + "\n\n" + zen::getLastErrorFormatted());
}
Loki::ScopeGuard dummy1 = Loki::MakeGuard(::freecon, contextSource);
(void)dummy1; //silence warning "unused variable"
@@ -1104,10 +1044,7 @@ void copySecurityContext(const Zstring& source, const Zstring& target, bool dere
::setfilecon (target.c_str(), contextSource) :
::lsetfilecon(target.c_str(), contextSource);
if (rv3 < 0)
- {
- wxString errorMessage = wxString(_("Error writing security context:")) + wxT("\n\"") + zToWx(target) + wxT("\"");
- throw FileError(errorMessage + wxT("\n\n") + zen::getLastErrorFormatted());
- }
+ throw FileError(_("Error writing security context:") + "\n\"" + target + "\"" + "\n\n" + zen::getLastErrorFormatted());
}
#endif //HAVE_SELINUX
@@ -1130,8 +1067,7 @@ void copyObjectPermissions(const Zstring& source, const Zstring& target, bool de
}
catch (const FileError& e)
{
- const wxString errorMessage = wxString(_("Error copying file permissions:")) + wxT("\n\"") + zToWx(source) + wxT("\" ->\n\"") + zToWx(target) + wxT("\"");
- throw FileError(errorMessage + wxT("\n\n") + e.msg());
+ throw FileError(_("Error copying file permissions:") + "\n\"" + source + "\" ->\n\"" + target + "\"" + "\n\n" + e.msg());
}
PSECURITY_DESCRIPTOR buffer = NULL;
@@ -1149,64 +1085,46 @@ void copyObjectPermissions(const Zstring& source, const Zstring& target, bool de
FILE_FLAG_BACKUP_SEMANTICS | (derefSymlinks ? 0 : FILE_FLAG_OPEN_REPARSE_POINT), //FILE_FLAG_BACKUP_SEMANTICS needed to open a directory
NULL);
if (hSource == INVALID_HANDLE_VALUE)
- {
- const wxString errorMessage = wxString(_("Error copying file permissions:")) + wxT("\n\"") + zToWx(source) + wxT("\" ->\n\"") + zToWx(target) + wxT("\"");
- throw FileError(errorMessage + wxT("\n\n") + zen::getLastErrorFormatted() + wxT(" (OR)"));
- }
+ throw FileError(_("Error copying file permissions:") + "\n\"" + source + "\" ->\n\"" + target + "\"" + "\n\n" + zen::getLastErrorFormatted() + " (OR)");
+
Loki::ScopeGuard dummy = Loki::MakeGuard(::CloseHandle, hSource);
(void)dummy; //silence warning "unused variable"
// DWORD rc = ::GetNamedSecurityInfo(const_cast<WCHAR*>(applyLongPathPrefix(source).c_str()), -> does NOT dereference symlinks!
- DWORD rc = ::GetSecurityInfo(
- hSource, //__in LPTSTR pObjectName,
- SE_FILE_OBJECT, //__in SE_OBJECT_TYPE ObjectType,
- OWNER_SECURITY_INFORMATION | GROUP_SECURITY_INFORMATION | DACL_SECURITY_INFORMATION | SACL_SECURITY_INFORMATION, //__in SECURITY_INFORMATION SecurityInfo,
- &owner, //__out_opt PSID *ppsidOwner,
- &group, //__out_opt PSID *ppsidGroup,
- &dacl, //__out_opt PACL *ppDacl,
- &sacl, //__out_opt PACL *ppSacl,
- &buffer); //__out_opt PSECURITY_DESCRIPTOR *ppSecurityDescriptor
+ DWORD rc = ::GetSecurityInfo(hSource, //__in LPTSTR pObjectName,
+ SE_FILE_OBJECT, //__in SE_OBJECT_TYPE ObjectType,
+ OWNER_SECURITY_INFORMATION | GROUP_SECURITY_INFORMATION | DACL_SECURITY_INFORMATION | SACL_SECURITY_INFORMATION, //__in SECURITY_INFORMATION SecurityInfo,
+ &owner, //__out_opt PSID *ppsidOwner,
+ &group, //__out_opt PSID *ppsidGroup,
+ &dacl, //__out_opt PACL *ppDacl,
+ &sacl, //__out_opt PACL *ppSacl,
+ &buffer); //__out_opt PSECURITY_DESCRIPTOR *ppSecurityDescriptor
if (rc != ERROR_SUCCESS)
- {
- const wxString errorMessage = wxString(_("Error copying file permissions:")) + wxT("\n\"") + zToWx(source) + wxT("\" ->\n\"") + zToWx(target) + wxT("\"");
- throw FileError(errorMessage + wxT("\n\n") + zen::getLastErrorFormatted(rc) + wxT(" (R)"));
- }
+ throw FileError(_("Error copying file permissions:") + "\n\"" + source + "\" ->\n\"" + target + "\"" + "\n\n" + zen::getLastErrorFormatted(rc) + " (R)");
Loki::ScopeGuard dummy4 = Loki::MakeGuard(::LocalFree, buffer);
(void)dummy4; //silence warning "unused variable"
- const Zstring targetFmt = zen::applyLongPathPrefix(target);
-
- //read-only file attribute may cause trouble: temporarily reset it
- const DWORD targetAttr = ::GetFileAttributes(targetFmt.c_str());
- Loki::ScopeGuard resetAttributes = Loki::MakeGuard(::SetFileAttributes, targetFmt.c_str(), targetAttr);
- if (targetAttr != INVALID_FILE_ATTRIBUTES &&
- (targetAttr & FILE_ATTRIBUTE_READONLY))
- ::SetFileAttributes(targetFmt.c_str(), targetAttr & (~FILE_ATTRIBUTE_READONLY)); //try to...
- else
- resetAttributes.Dismiss();
-
-
- const HANDLE hTarget = ::CreateFile( targetFmt.c_str(), // lpFileName
- FILE_GENERIC_WRITE | WRITE_OWNER | WRITE_DAC | ACCESS_SYSTEM_SECURITY, // dwDesiredAccess: all four seem to be required!!!
- FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, // dwShareMode
- NULL, // lpSecurityAttributes
- OPEN_EXISTING, // dwCreationDisposition
- FILE_FLAG_BACKUP_SEMANTICS | (derefSymlinks ? 0 : FILE_FLAG_OPEN_REPARSE_POINT), // dwFlagsAndAttributes
- NULL); // hTemplateFile
- if (hTarget == INVALID_HANDLE_VALUE)
+ //may need to remove the readonly-attribute (e.g. FAT usb drives)
+ FileUpdateHandle targetHandle(target, [=]()
{
- const wxString errorMessage = wxString(_("Error copying file permissions:")) + wxT("\n\"") + zToWx(source) + wxT("\" ->\n\"") + zToWx(target) + wxT("\"");
- throw FileError(errorMessage + wxT("\n\n") + zen::getLastErrorFormatted() + wxT(" (OW)"));
- }
- Loki::ScopeGuard dummy2 = Loki::MakeGuard(::CloseHandle, hTarget);
- (void)dummy2; //silence warning "unused variable"
+ return ::CreateFile(applyLongPathPrefix(target).c_str(), // lpFileName
+ FILE_GENERIC_WRITE | WRITE_OWNER | WRITE_DAC | ACCESS_SYSTEM_SECURITY, // dwDesiredAccess: all four seem to be required!!!
+ FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, // dwShareMode
+ NULL, // lpSecurityAttributes
+ OPEN_EXISTING, // dwCreationDisposition
+ FILE_FLAG_BACKUP_SEMANTICS | (derefSymlinks ? 0 : FILE_FLAG_OPEN_REPARSE_POINT), // dwFlagsAndAttributes
+ NULL); // hTemplateFile
+ });
+
+ if (targetHandle.get() == INVALID_HANDLE_VALUE)
+ throw FileError(_("Error copying file permissions:") + "\n\"" + source + "\" ->\n\"" + target + "\"" + "\n\n" + zen::getLastErrorFormatted() + " (OW)");
// rc = ::SetNamedSecurityInfo(const_cast<WCHAR*>(applyLongPathPrefix(target).c_str()), //__in LPTSTR pObjectName, -> does NOT dereference symlinks!
rc = ::SetSecurityInfo(
- hTarget, //__in LPTSTR pObjectName,
- SE_FILE_OBJECT, //__in SE_OBJECT_TYPE ObjectType,
+ targetHandle.get(), //__in LPTSTR pObjectName,
+ SE_FILE_OBJECT, //__in SE_OBJECT_TYPE ObjectType,
OWNER_SECURITY_INFORMATION | GROUP_SECURITY_INFORMATION | DACL_SECURITY_INFORMATION | SACL_SECURITY_INFORMATION, //__in SECURITY_INFORMATION SecurityInfo,
owner, //__in_opt PSID psidOwner,
group, //__in_opt PSID psidGroup,
@@ -1214,10 +1132,7 @@ void copyObjectPermissions(const Zstring& source, const Zstring& target, bool de
sacl); //__in_opt PACL pSacl
if (rc != ERROR_SUCCESS)
- {
- const wxString errorMessage = wxString(_("Error copying file permissions:")) + wxT("\n\"") + zToWx(source) + wxT("\" ->\n\"") + zToWx(target) + wxT("\"");
- throw FileError(errorMessage + wxT("\n\n") + zen::getLastErrorFormatted(rc) + wxT(" (W)"));
- }
+ throw FileError(_("Error copying file permissions:") + "\n\"" + source + "\" ->\n\"" + target + "\"" + "\n\n" + zen::getLastErrorFormatted(rc) + " (W)");
#elif defined FFS_LINUX
@@ -1227,30 +1142,32 @@ void copyObjectPermissions(const Zstring& source, const Zstring& target, bool de
if (derefSymlinks)
{
- struct stat fileInfo;
+ struct stat fileInfo = {};
if (::stat (source.c_str(), &fileInfo) != 0 ||
::chown(target.c_str(), fileInfo.st_uid, fileInfo.st_gid) != 0 || // may require admin rights!
::chmod(target.c_str(), fileInfo.st_mode) != 0)
- {
- const wxString errorMessage = wxString(_("Error copying file permissions:")) + wxT("\n\"") + zToWx(source) + wxT("\" ->\n\"") + zToWx(target) + wxT("\"");
- throw FileError(errorMessage + wxT("\n\n") + zen::getLastErrorFormatted() + wxT(" (R)"));
- }
+ throw FileError(_("Error copying file permissions:") + "\n\"" + source + "\" ->\n\"" + target + "\"" + "\n\n" + zen::getLastErrorFormatted() + " (R)");
}
else
{
- struct stat fileInfo;
+ struct stat fileInfo = {};
if (::lstat (source.c_str(), &fileInfo) != 0 ||
::lchown(target.c_str(), fileInfo.st_uid, fileInfo.st_gid) != 0 || // may require admin rights!
(!symlinkExists(target) && ::chmod(target.c_str(), fileInfo.st_mode) != 0)) //setting access permissions doesn't make sense for symlinks on Linux: there is no lchmod()
- {
- const wxString errorMessage = wxString(_("Error copying file permissions:")) + wxT("\n\"") + zToWx(source) + wxT("\" ->\n\"") + zToWx(target) + wxT("\"");
- throw FileError(errorMessage + wxT("\n\n") + zen::getLastErrorFormatted() + wxT(" (W)"));
- }
+ throw FileError(_("Error copying file permissions:") + "\n\"" + source + "\" ->\n\"" + target + "\"" + "\n\n" + zen::getLastErrorFormatted() + " (W)");
}
#endif
}
+namespace
+{
+//provide uniform binary interface:
+void removeDirSimple(const Zstring& directory) { zen::removeDirectory(directory); } //throw (FileError)
+void removeFileSimple(const Zstring& filename) { zen::removeFile(filename); } //throw (FileError)
+}
+
+
void createDirectoryRecursively(const Zstring& directory, const Zstring& templateDir, bool copyFilePermissions, int level)
{
using namespace zen;
@@ -1262,11 +1179,11 @@ void createDirectoryRecursively(const Zstring& directory, const Zstring& templat
return;
//try to create parent folders first
- const Zstring dirParent = directory.BeforeLast(common::FILE_NAME_SEPARATOR);
+ const Zstring dirParent = directory.BeforeLast(FILE_NAME_SEPARATOR);
if (!dirParent.empty() && !zen::dirExists(dirParent))
{
//call function recursively
- const Zstring templateParent = templateDir.BeforeLast(common::FILE_NAME_SEPARATOR);
+ const Zstring templateParent = templateDir.BeforeLast(FILE_NAME_SEPARATOR);
createDirectoryRecursively(dirParent, templateParent, copyFilePermissions, level + 1);
}
@@ -1284,8 +1201,7 @@ void createDirectoryRecursively(const Zstring& directory, const Zstring& templat
#endif
{
if (level != 0) return;
- wxString errorMessage = wxString(_("Error creating directory:")) + wxT("\n\"") + zToWx(directory) + wxT("\"");
- throw FileError(errorMessage + wxT("\n\n") + zen::getLastErrorFormatted());
+ throw FileError(_("Error creating directory:") + "\n\"" + directory + "\"" + "\n\n" + zen::getLastErrorFormatted());
}
if (!templateDir.empty())
@@ -1351,14 +1267,14 @@ void createDirectoryRecursively(const Zstring& directory, const Zstring& templat
}
#endif
- //try to copy file times: NOT mission critical for a directory
+ //try to copy file times: NOT mission critical for a directory, since modification time is changed on each added, deleted file, however creation time will stay
try
{
copyFileTimes(templateDir, directory, true); //throw (FileError)
}
catch (FileError&) {}
- Loki::ScopeGuard guardNewDir = Loki::MakeGuard(&TryCleanUp::tryDeleteDir, directory); //ensure cleanup:
+ Loki::ScopeGuard guardNewDir = Loki::MakeGuard(&removeDirSimple, directory); //ensure cleanup:
//enforce copying file permissions: it's advertized on GUI...
if (copyFilePermissions)
@@ -1373,12 +1289,12 @@ void createDirectoryRecursively(const Zstring& directory, const Zstring& templat
void zen::createDirectory(const Zstring& directory, const Zstring& templateDir, bool copyFilePermissions)
{
//remove trailing separator
- const Zstring dirFormatted = directory.EndsWith(common::FILE_NAME_SEPARATOR) ?
- directory.BeforeLast(common::FILE_NAME_SEPARATOR) :
+ const Zstring dirFormatted = directory.EndsWith(FILE_NAME_SEPARATOR) ?
+ directory.BeforeLast(FILE_NAME_SEPARATOR) :
directory;
- const Zstring templateFormatted = templateDir.EndsWith(common::FILE_NAME_SEPARATOR) ?
- templateDir.BeforeLast(common::FILE_NAME_SEPARATOR) :
+ const Zstring templateFormatted = templateDir.EndsWith(FILE_NAME_SEPARATOR) ?
+ templateDir.BeforeLast(FILE_NAME_SEPARATOR) :
templateDir;
createDirectoryRecursively(dirFormatted, templateFormatted, copyFilePermissions, 0);
@@ -1400,29 +1316,23 @@ void zen::copySymlink(const Zstring& sourceLink, const Zstring& targetLink, zen:
typedef BOOLEAN (WINAPI *CreateSymbolicLinkFunc)(LPCTSTR lpSymlinkFileName, LPCTSTR lpTargetFileName, DWORD dwFlags);
static const CreateSymbolicLinkFunc createSymbolicLink = util::getDllFun<CreateSymbolicLinkFunc>(L"kernel32.dll", "CreateSymbolicLinkW");
if (createSymbolicLink == NULL)
- throw FileError(wxString(_("Error loading library function:")) + wxT("\n\"") + wxT("CreateSymbolicLinkW") + wxT("\""));
+ throw FileError(_("Error loading library function:") + "\n\"" + "CreateSymbolicLinkW" + "\"");
if (!createSymbolicLink( //seems no long path prefix is required...
targetLink.c_str(), //__in LPTSTR lpSymlinkFileName,
linkPath.c_str(), //__in LPTSTR lpTargetFileName,
(type == SYMLINK_TYPE_DIR ? SYMBOLIC_LINK_FLAG_DIRECTORY : 0))) //__in DWORD dwFlags
- {
- const wxString errorMessage = wxString(_("Error copying symbolic link:")) + wxT("\n\"") + zToWx(sourceLink) + wxT("\" ->\n\"") + zToWx(targetLink) + wxT("\"");
- throw FileError(errorMessage + wxT("\n\n") + zen::getLastErrorFormatted());
- }
+ throw FileError(_("Error copying symbolic link:") + "\n\"" + sourceLink + "\" ->\n\"" + targetLink + "\"" + "\n\n" + zen::getLastErrorFormatted());
#elif defined FFS_LINUX
if (::symlink(linkPath.c_str(), targetLink.c_str()) != 0)
- {
- const wxString errorMessage = wxString(_("Error copying symbolic link:")) + wxT("\n\"") + zToWx(sourceLink) + wxT("\" ->\n\"") + zToWx(targetLink) + wxT("\"");
- throw FileError(errorMessage + wxT("\n\n") + zen::getLastErrorFormatted());
- }
+ throw FileError(_("Error copying symbolic link:") + "\n\"" + sourceLink + "\" ->\n\"" + targetLink + "\"" + "\n\n" + zen::getLastErrorFormatted());
#endif
//allow only consistent objects to be created -> don't place before ::symlink, targetLink may already exist
Loki::ScopeGuard guardNewDir = type == SYMLINK_TYPE_DIR ?
- Loki::MakeGuard(&TryCleanUp::tryDeleteDir, targetLink) :
- Loki::MakeGuard(&TryCleanUp::tryDeleteFile, targetLink);
+ Loki::MakeGuard(&removeDirSimple, targetLink) :
+ Loki::MakeGuard(&removeFileSimple, targetLink);
//file times: essential for a symlink: enforce this! (don't just try!)
copyFileTimes(sourceLink, targetLink, false); //throw (FileError)
@@ -1448,6 +1358,18 @@ Zstring createTempName(const Zstring& filename)
}
#ifdef FFS_WIN
+struct CallbackData
+{
+ CallbackData(CallbackCopyFile& cb) :
+ callback(cb),
+ exceptionCaught(false) {}
+
+ CallbackCopyFile& callback;
+ bool exceptionCaught;
+ zen::UInt64 bytesTransferredOnException;
+};
+
+
DWORD CALLBACK copyCallbackInternal(
LARGE_INTEGER totalFileSize,
LARGE_INTEGER totalBytesTransferred,
@@ -1459,36 +1381,30 @@ DWORD CALLBACK copyCallbackInternal(
HANDLE hDestinationFile,
LPVOID lpData)
{
- using zen::CallbackCopyFile;
-
//small performance optimization: it seems this callback function is called for every 64 kB (depending on cluster size).
static size_t callNr = 0;
if (++callNr % 4 == 0) //executing callback every 256 kB should suffice
{
- if (lpData != NULL)
+ if (lpData)
{
+ CallbackData& cbd = *static_cast<CallbackData*>(lpData);
+
//some odd check for some possible(?) error condition
if (totalBytesTransferred.QuadPart < 0) //let's see if someone answers the call...
- ::MessageBox(NULL, wxT("You've just discovered a bug in WIN32 API function \"CopyFileEx\"! \n\n\
+ ::MessageBox(NULL, L"You've just discovered a bug in WIN32 API function \"CopyFileEx\"! \n\n\
Please write a mail to the author of FreeFileSync at zhnmju123@gmx.de and simply state that\n\
\"totalBytesTransferred.HighPart can be below zero\"!\n\n\
- This will then be handled in future versions of FreeFileSync.\n\nThanks -ZenJu"),
+ This will then be handled in future versions of FreeFileSync.\n\nThanks -ZenJu",
NULL, 0);
-
- CallbackCopyFile* callback = static_cast<CallbackCopyFile*>(lpData);
try
{
- switch (callback->updateCopyStatus(zen::UInt64(totalBytesTransferred.QuadPart)))
- {
- case CallbackCopyFile::CONTINUE:
- break;
- case CallbackCopyFile::CANCEL:
- return PROGRESS_CANCEL;
- }
+ cbd.callback.updateCopyStatus(zen::UInt64(totalBytesTransferred.QuadPart));
}
catch (...)
{
- ::MessageBox(NULL, wxT("Exception in callback zen::copyFile! Please contact the author of FFS."), NULL, 0);
+ cbd.exceptionCaught = true;
+ cbd.bytesTransferredOnException = zen::UInt64(totalBytesTransferred.QuadPart);
+ return PROGRESS_CANCEL;
}
}
}
@@ -1549,21 +1465,26 @@ void rawCopyWinApi(const Zstring& sourceFile,
if (nonEncSupported)
copyFlags |= COPY_FILE_ALLOW_DECRYPTED_DESTINATION;
+ std::unique_ptr<CallbackData> cbd(callback ? new CallbackData(*callback) : NULL);
+
if (!::CopyFileEx( //same performance like CopyFile()
applyLongPathPrefix(sourceFile).c_str(),
applyLongPathPrefix(targetFile).c_str(),
- callback != NULL ? copyCallbackInternal : NULL,
- callback,
+ callback ? copyCallbackInternal : NULL,
+ cbd.get(),
NULL,
copyFlags))
{
+ if (cbd.get() && cbd->exceptionCaught)
+ callback->updateCopyStatus(cbd->bytesTransferredOnException); //rethrow (hopefully!)
+
const DWORD lastError = ::GetLastError();
//don't suppress "lastError == ERROR_REQUEST_ABORTED": a user aborted operation IS an error condition!
//assemble error message...
- wxString errorMessage = wxString(_("Error copying file:")) + wxT("\n\"") + sourceFile.c_str() + wxT("\" ->\n\"") + targetFile.c_str() + wxT("\"") +
- wxT("\n\n") + zen::getLastErrorFormatted(lastError);
+ std::wstring errorMessage = _("Error copying file:") + "\n\"" + sourceFile + "\" ->\n\"" + targetFile + "\"" +
+ "\n\n" + zen::getLastErrorFormatted(lastError);
//if file is locked (try to) use Windows Volume Shadow Copy Service
if (lastError == ERROR_SHARING_VIOLATION ||
@@ -1588,15 +1509,27 @@ void rawCopyWinApi(const Zstring& sourceFile,
if (lastError == ERROR_INVALID_PARAMETER &&
dst::isFatDrive(targetFile) &&
getFilesize(sourceFile) >= 4U * zen::UInt64(1024U * 1024 * 1024)) //throw (FileError)
- errorMessage += wxT("\nFAT volume cannot store files larger than 4 gigabyte!");
+ errorMessage += L"\nFAT volume cannot store files larger than 4 gigabyte!";
}
catch(...) {}
throw FileError(errorMessage);
}
- //adapt file modification time:
- copyFileTimes(sourceFile, targetFile, true); //throw (FileError)
+ try //adapt file modification time
+ {
+ //this is optional, since ::CopyFileEx already copies modification time (but not creation time)
+ //chances are good this also avoids a number of unnecessary access-denied errors on NAS shares!
+ //(one is: missing permission to change file attributes, remove read-only in particular)
+ copyFileTimes(sourceFile, targetFile, true); //throw FileError
+ }
+ catch (FileError&)
+ {
+ //CAVEAT: in case one of the drives is FAT, we still(!) need copyFileTimes to apply the DST hack!
+ if (dst::isFatDrive(sourceFile) || dst::isFatDrive(targetFile)) //throw()
+ throw;
+ assert(false); //maybe this catches some test-case left-overs?
+ }
guardTarget.Dismiss(); //target has been created successfully!
}
@@ -1632,7 +1565,7 @@ void rawCopyWinApi(const Zstring& sourceFile,
// if (hFileIn == INVALID_HANDLE_VALUE)
// {
// const DWORD lastError = ::GetLastError();
-// const wxString& errorMessage = wxString(_("Error opening file:")) + wxT("\n\"") + zToWx(sourceFile) + wxT("\"") + wxT("\n\n") + zen::getLastErrorFormatted(lastError);
+// const std::wstring& errorMessage = _("Error opening file:") + "\n\"" + sourceFile + "\"" + "\n\n" + zen::getLastErrorFormatted(lastError);
//
// //if file is locked (try to) use Windows Volume Shadow Copy Service
// if (lastError == ERROR_SHARING_VIOLATION ||
@@ -1647,10 +1580,7 @@ void rawCopyWinApi(const Zstring& sourceFile,
//
// BY_HANDLE_FILE_INFORMATION infoFileIn = {};
// if (!::GetFileInformationByHandle(hFileIn, &infoFileIn))
-// {
-// const wxString errorMessage = wxString(_("Error reading file attributes:")) + wxT("\n\"") + zToWx(sourceFile) + wxT("\"");
-// throw FileError(errorMessage + wxT("\n\n") + zen::getLastErrorFormatted());
-// }
+// throw FileError(_("Error reading file attributes:") + "\n\"" + sourceFile + "\"" + "\n\n" + zen::getLastErrorFormatted());
//
// //####################################### DST hack ###########################################
// if (dst::isFatDrive(sourceFile)) //throw()
@@ -1689,8 +1619,8 @@ void rawCopyWinApi(const Zstring& sourceFile,
// if (hFileOut == INVALID_HANDLE_VALUE)
// {
// const DWORD lastError = ::GetLastError();
-// const wxString& errorMessage = wxString(_("Error writing file:")) + wxT("\n\"") + zToWx(targetFile) + wxT("\"") +
-// wxT("\n\n") + zen::getLastErrorFormatted(lastError);
+// const std::wstring& errorMessage = _("Error writing file:") + "\n\"" + targetFile + "\"" +
+// "\n\n" + zen::getLastErrorFormatted(lastError);
//
// if (lastError == ERROR_FILE_EXISTS)
// throw ErrorTargetExisting(errorMessage);
@@ -1718,10 +1648,7 @@ void rawCopyWinApi(const Zstring& sourceFile,
// &fsFlags, //__out_opt LPDWORD lpFileSystemFlags,
// NULL, //__out LPTSTR lpFileSystemNameBuffer,
// 0)) //__in DWORD nFileSystemNameSize
-// {
-// const wxString errorMessage = wxString(_("Error reading file attributes:")) + wxT("\n\"") + zToWx(sourceFile) + wxT("\"");
-// throw FileError(errorMessage + wxT("\n\n") + zen::getLastErrorFormatted());
-// }
+// throw FileError(_("Error reading file attributes:") + "\n\"" + sourceFile + "\"" + "\n\n" + zen::getLastErrorFormatted());
//
// const bool sourceIsEncrypted = (infoFileIn.dwFileAttributes & FILE_ATTRIBUTE_ENCRYPTED) != 0;
// const bool sourceIsCompressed = (infoFileIn.dwFileAttributes & FILE_ATTRIBUTE_COMPRESSED) != 0;
@@ -1747,9 +1674,9 @@ void rawCopyWinApi(const Zstring& sourceFile,
// 0, //OutBufferSize
// &bytesReturned, //number of bytes returned
// NULL)) //OVERLAPPED structure
-// throw FileError(wxString(_("Error writing file:")) + wxT("\n\"") + zToWx(targetFile) + wxT("\"") +
-// wxT("\n\n") + zen::getLastErrorFormatted() +
-// wxT("\nFailed to write NTFS compressed attribute!"));
+// throw FileError(_("Error writing file:") + "\n\"" + targetFile + "\"" +
+// "\n\n" + zen::getLastErrorFormatted() +
+// "\nFailed to write NTFS compressed attribute!");
// }
//
// //although it seems the sparse attribute is set automatically by BackupWrite, we are required to do this manually: http://support.microsoft.com/kb/271398/en-us
@@ -1766,9 +1693,9 @@ void rawCopyWinApi(const Zstring& sourceFile,
// 0, //OutBufferSize
// &bytesReturned, //number of bytes returned
// NULL)) //OVERLAPPED structure
-// throw FileError(wxString(_("Error writing file:")) + wxT("\n\"") + zToWx(targetFile) + wxT("\"") +
-// wxT("\n\n") + zen::getLastErrorFormatted() +
-// wxT("\nFailed to write NTFS sparse attribute!"));
+// throw FileError(_("Error writing file:") + "\n\"" + targetFile + "\"" +
+// "\n\n" + zen::getLastErrorFormatted() +
+// "\nFailed to write NTFS sparse attribute!");
// }
// }
//
@@ -1808,20 +1735,20 @@ void rawCopyWinApi(const Zstring& sourceFile,
// false, //__in BOOL bAbort,
// false, //__in BOOL bProcessSecurity,
// &context.read)) //__out LPVOID *lpContext
-// throw FileError(wxString(_("Error reading file:")) + wxT("\n\"") + zToWx(sourceFile) + wxT("\"") +
-// wxT("\n\n") + zen::getLastErrorFormatted());
+// throw FileError(_("Error reading file:") + "\n\"" + sourceFile + "\"" +
+// "\n\n" + zen::getLastErrorFormatted());
// }
// else if (!::ReadFile(hFileIn, //__in HANDLE hFile,
// memory.get(), //__out LPVOID lpBuffer,
// BUFFER_SIZE, //__in DWORD nNumberOfBytesToRead,
// &bytesRead, //__out_opt LPDWORD lpNumberOfBytesRead,
// NULL)) //__inout_opt LPOVERLAPPED lpOverlapped
-// throw FileError(wxString(_("Error reading file:")) + wxT("\n\"") + zToWx(sourceFile) + wxT("\"") +
-// wxT("\n\n") + zen::getLastErrorFormatted());
+// throw FileError(_("Error reading file:") + "\n\"" + sourceFile + "\"" +
+// "\n\n" + zen::getLastErrorFormatted());
//
// if (bytesRead > BUFFER_SIZE)
-// throw FileError(wxString(_("Error reading file:")) + wxT("\n\"") + zToWx(sourceFile) + wxT("\"") +
-// wxT("\n\n") + wxT("buffer overflow"));
+// throw FileError(_("Error reading file:") + "\n\"" + sourceFile + "\"" +
+// "\n\n" + "buffer overflow");
//
// if (bytesRead < BUFFER_SIZE)
// eof = true;
@@ -1837,20 +1764,19 @@ void rawCopyWinApi(const Zstring& sourceFile,
// false, //__in BOOL bAbort,
// false, //__in BOOL bProcessSecurity,
// &context.write)) //__out LPVOID *lpContext
-// throw FileError(wxString(_("Error writing file:")) + wxT("\n\"") + zToWx(targetFile) + wxT("\"") +
-// wxT("\n\n") + zen::getLastErrorFormatted() + wxT(" (w)")); //w -> distinguish from fopen error message!
+// throw FileError(_("Error writing file:") + "\n\"" + targetFile + "\"" +
+// "\n\n" + zen::getLastErrorFormatted() + " (w)"); //w -> distinguish from fopen error message!
// }
// else if (!::WriteFile(hFileOut, //__in HANDLE hFile,
// memory.get(), //__out LPVOID lpBuffer,
// bytesRead, //__in DWORD nNumberOfBytesToWrite,
// &bytesWritten, //__out_opt LPDWORD lpNumberOfBytesWritten,
// NULL)) //__inout_opt LPOVERLAPPED lpOverlapped
-// throw FileError(wxString(_("Error writing file:")) + wxT("\n\"") + zToWx(targetFile) + wxT("\"") +
-// wxT("\n\n") + zen::getLastErrorFormatted() + wxT(" (w)")); //w -> distinguish from fopen error message!
+// throw FileError(_("Error writing file:") + "\n\"" + targetFile + "\"" +
+// "\n\n" + zen::getLastErrorFormatted() + " (w)"); //w -> distinguish from fopen error message!
//
// if (bytesWritten != bytesRead)
-// throw FileError(wxString(_("Error writing file:")) + wxT("\n\"") + zToWx(targetFile) + wxT("\"") +
-// wxT("\n\n") + wxT("incomplete write"));
+// throw FileError(_("Error writing file:") + "\n\"" + targetFile + "\"" + "\n\n" + "incomplete write");
//
// totalBytesTransferred += bytesRead;
//
@@ -1866,8 +1792,8 @@ void rawCopyWinApi(const Zstring& sourceFile,
// break;
//
// case CallbackCopyFile::CANCEL: //a user aborted operation IS an error condition!
-// throw FileError(wxString(_("Error copying file:")) + wxT("\n\"") + zToWx(sourceFile) + wxT("\" ->\n\"") +
-// zToWx(targetFile) + wxT("\"\n\n") + _("Operation aborted!"));
+// throw FileError(_("Error copying file:") + "\n\"" + sourceFile + "\" ->\n\"" +
+// targetFile + "\"\n\n" + _("Operation aborted!"));
// }
// }
// while (!eof);
@@ -1877,12 +1803,10 @@ void rawCopyWinApi(const Zstring& sourceFile,
// {
// LARGE_INTEGER inputSize = {};
// if (!::GetFileSizeEx(hFileIn, &inputSize))
-// throw FileError(wxString(_("Error reading file attributes:")) + wxT("\n\"") + zToWx(sourceFile) + wxT("\"") +
-// wxT("\n\n") + zen::getLastErrorFormatted());
+// throw FileError(_("Error reading file attributes:") + "\n\"" + sourceFile + "\"" + "\n\n" + zen::getLastErrorFormatted());
//
// if (inputSize.QuadPart != 0)
-// throw FileError(wxString(_("Error reading file:")) + wxT("\n\"") + zToWx(sourceFile) + wxT("\"") +
-// wxT("\n\n") + wxT("unknown error"));
+// throw FileError(_("Error reading file:") + "\n\"" + sourceFile + "\"" + "\n\n" + "unknown error");
// }
//
// //time needs to be set at the end: BackupWrite() changes file time
@@ -1890,8 +1814,7 @@ void rawCopyWinApi(const Zstring& sourceFile,
// &infoFileIn.ftCreationTime,
// NULL,
// &infoFileIn.ftLastWriteTime))
-// throw FileError(wxString(_("Error changing modification time:")) + wxT("\n\"") + zToWx(targetFile) + wxT("\"") +
-// wxT("\n\n") + zen::getLastErrorFormatted());
+// throw FileError(_("Error changing modification time:") + "\n\"" + targetFile + "\"" + "\n\n" + zen::getLastErrorFormatted());
//
//
//#ifndef NDEBUG //dst hack: verify data written
@@ -1969,15 +1892,7 @@ void rawCopyStream(const Zstring& sourceFile,
//invoke callback method to update progress indicators
if (callback != NULL)
- switch (callback->updateCopyStatus(totalBytesTransferred))
- {
- case CallbackCopyFile::CONTINUE:
- break;
-
- case CallbackCopyFile::CANCEL: //a user aborted operation IS an error condition!
- throw FileError(wxString(_("Error copying file:")) + wxT("\n\"") + zToWx(sourceFile) + wxT("\" ->\n\"") +
- zToWx(targetFile) + wxT("\"\n\n") + _("Operation aborted!"));
- }
+ callback->updateCopyStatus(totalBytesTransferred);
}
while (!fileIn.eof());
}
@@ -2034,7 +1949,7 @@ void zen::copyFile(const Zstring& sourceFile, //throw (FileError: ErrorTargetPat
//raw file copy
try
{
- copyFileImpl(sourceFile, temporary, callback); //throw (FileError: ErrorTargetPathMissing, ErrorTargetExisting, ErrorFileLocked)
+ copyFileImpl(sourceFile, temporary, callback); //throw FileError: ErrorTargetPathMissing, ErrorTargetExisting, ErrorFileLocked
}
catch (ErrorTargetExisting&)
{
@@ -2043,7 +1958,7 @@ void zen::copyFile(const Zstring& sourceFile, //throw (FileError: ErrorTargetPat
temporary = createTempName(targetFile);
//retry
- copyFileImpl(sourceFile, temporary, callback); //throw (FileError)
+ copyFileImpl(sourceFile, temporary, callback); //throw FileError
}
//have target file deleted (after read access on source and target has been confirmed) => allow for almost transactional overwrite
diff --git a/shared/file_handling.h b/shared/file_handling.h
index 67540de5..0ee4b1e9 100644
--- a/shared/file_handling.h
+++ b/shared/file_handling.h
@@ -37,7 +37,7 @@ ResponseSameVol onSameVolume(const Zstring& folderLeft, const Zstring& folderRig
void copyFileTimes(const Zstring& sourceDir, const Zstring& targetDir, bool derefSymlinks); //throw (FileError)
//symlink handling: always evaluate target
-zen::UInt64 getFilesize(const Zstring& filename); //throw (FileError)
+UInt64 getFilesize(const Zstring& filename); //throw (FileError)
//file handling
@@ -88,19 +88,6 @@ struct CallbackRemoveDir
};
-struct CallbackMoveFile //callback functionality
-{
- virtual ~CallbackMoveFile() {}
-
- enum Response
- {
- CONTINUE,
- CANCEL
- };
- virtual Response requestUiRefresh(const Zstring& currentObject) = 0; //DON'T throw exceptions here, at least in Windows build!
-};
-
-
struct CallbackCopyFile //callback functionality
{
virtual ~CallbackCopyFile() {}
@@ -109,12 +96,17 @@ struct CallbackCopyFile //callback functionality
//at this point full read access on source had been proven, so it's safe to delete it.
virtual void deleteTargetFile(const Zstring& targetFile) = 0; //may throw exceptions
- enum Response
- {
- CONTINUE,
- CANCEL
- };
- virtual Response updateCopyStatus(zen::UInt64 totalBytesTransferred) = 0; //DON'T throw exceptions here, at least in Windows build!
+ //may throw:
+ //Linux: unconditionally
+ //Windows: first exception is swallowed, requestUiRefresh() is then called again where it may throw again and exception will propagate as expected
+ virtual void updateCopyStatus(UInt64 totalBytesTransferred) = 0;
+};
+
+
+struct CallbackMoveFile //callback functionality
+{
+ virtual ~CallbackMoveFile() {}
+ virtual void requestUiRefresh(const Zstring& currentObject) = 0; //see CallbackCopyFile!
};
}
diff --git a/shared/file_id.cpp b/shared/file_id.cpp
index b111b9a2..da8fd815 100644
--- a/shared/file_id.cpp
+++ b/shared/file_id.cpp
@@ -36,7 +36,6 @@ std::string util::retrieveFileID(const Zstring& filename)
//WARNING: CreateFile() is SLOW, while GetFileInformationByHandle() is cheap!
//http://msdn.microsoft.com/en-us/library/aa363788(VS.85).aspx
-
//privilege SE_BACKUP_NAME doesn't seem to be required here at all
const HANDLE hFile = ::CreateFile(zen::applyLongPathPrefix(filename).c_str(),
@@ -68,13 +67,16 @@ std::string util::retrieveFileID(const Zstring& filename)
fileID += numberToBytes(fileInfo.st_ino);
}
#endif
-
+ assert(!fileID.empty());
return fileID;
}
bool util::sameFileSpecified(const Zstring& file1, const Zstring& file2)
{
+ if (EqualFilename()(file1, file2)) //quick check
+ return true;
+
const std::string id1 = retrieveFileID(file1);
const std::string id2 = retrieveFileID(file2);
diff --git a/shared/file_io.cpp b/shared/file_io.cpp
index 51f81da9..c19101aa 100644
--- a/shared/file_io.cpp
+++ b/shared/file_io.cpp
@@ -5,7 +5,6 @@
// **************************************************************************
//
#include "file_io.h"
-#include "string_conv.h"
#include "last_error.h"
#include "i18n.h"
@@ -31,7 +30,7 @@ FileInput::FileInput(const Zstring& filename) : //throw (FileError, ErrorNotExi
#ifdef FFS_WIN
fileHandle = ::CreateFile(zen::applyLongPathPrefix(filename).c_str(),
GENERIC_READ,
- FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, //all shared modes are required to read files that are open in other applications
+ FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, //all shared modes are required to read open files that are shared by other applications
NULL,
OPEN_EXISTING,
FILE_FLAG_SEQUENTIAL_SCAN,
@@ -64,8 +63,7 @@ FileInput::FileInput(const Zstring& filename) : //throw (FileError, ErrorNotExi
{
const DWORD lastError = ::GetLastError();
- wxString errorMessage = wxString(_("Error opening file:")) + wxT("\n\"") + zToWx(filename_) + wxT("\"");
- errorMessage += wxT("\n\n") + zen::getLastErrorFormatted(lastError);
+ std::wstring errorMessage = _("Error opening file:") + "\n\"" + filename_ + "\"" + "\n\n" + zen::getLastErrorFormatted(lastError);
if (lastError == ERROR_FILE_NOT_FOUND ||
lastError == ERROR_PATH_NOT_FOUND)
@@ -73,14 +71,14 @@ FileInput::FileInput(const Zstring& filename) : //throw (FileError, ErrorNotExi
throw FileError(errorMessage);
}
+
#elif defined FFS_LINUX
fileHandle = ::fopen(filename.c_str(), "r,type=record,noseek"); //utilize UTF-8 filename
if (fileHandle == NULL)
{
const int lastError = errno;
- wxString errorMessage = wxString(_("Error opening file:")) + wxT("\n\"") + zToWx(filename_) + wxT("\"");
- errorMessage += wxT("\n\n") + zen::getLastErrorFormatted(lastError);
+ std::wstring errorMessage = _("Error opening file:") + "\n\"" + filename_ + "\"" + "\n\n" + zen::getLastErrorFormatted(lastError);
if (lastError == ENOENT)
throw ErrorNotExisting(errorMessage);
@@ -114,10 +112,7 @@ size_t FileInput::read(void* buffer, size_t bytesToRead) //returns actual number
const size_t bytesRead = ::fread(buffer, 1, bytesToRead, fileHandle);
if (::ferror(fileHandle) != 0)
#endif
- {
- wxString errorMessage = wxString(_("Error reading file:")) + wxT("\n\"") + zToWx(filename_) + wxT("\"");
- throw FileError(errorMessage + wxT("\n\n") + zen::getLastErrorFormatted());
- }
+ throw FileError(_("Error reading file:") + "\n\"" + filename_ + "\"" + "\n\n" + zen::getLastErrorFormatted());
#ifdef FFS_WIN
if (bytesRead < bytesToRead) //falsify only!
@@ -127,10 +122,7 @@ size_t FileInput::read(void* buffer, size_t bytesToRead) //returns actual number
eofReached = true;
if (bytesRead > bytesToRead)
- {
- wxString errorMessage = wxString(_("Error reading file:")) + wxT("\n\"") + zToWx(filename_) + wxT("\"");
- throw FileError(errorMessage + wxT("\n\n") + wxT("buffer overflow"));
- }
+ throw FileError(_("Error reading file:") + "\n\"" + filename_ + "\"" + "\n\n" + "buffer overflow");
return bytesRead;
}
@@ -151,7 +143,7 @@ FileOutput::FileOutput(const Zstring& filename, AccessFlag access) : //throw (Fi
#ifdef FFS_WIN
fileHandle = ::CreateFile(zen::applyLongPathPrefix(filename).c_str(),
GENERIC_WRITE,
- FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, //note: FILE_SHARE_DELETE is required to rename file while handle is open!
+ FILE_SHARE_READ | FILE_SHARE_DELETE, //note: FILE_SHARE_DELETE is required to rename file while handle is open!
NULL,
access == ACC_OVERWRITE ? CREATE_ALWAYS : CREATE_NEW,
FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN,
@@ -159,8 +151,7 @@ FileOutput::FileOutput(const Zstring& filename, AccessFlag access) : //throw (Fi
if (fileHandle == INVALID_HANDLE_VALUE)
{
const DWORD lastError = ::GetLastError();
- wxString errorMessage = wxString(_("Error writing file:")) + wxT("\n\"") + zToWx(filename_) + wxT("\"");
- errorMessage += wxT("\n\n") + zen::getLastErrorFormatted(lastError);
+ std::wstring errorMessage = _("Error writing file:") + "\n\"" + filename_ + "\"" + "\n\n" + zen::getLastErrorFormatted(lastError);
if (lastError == ERROR_FILE_EXISTS)
throw ErrorTargetExisting(errorMessage);
@@ -178,8 +169,7 @@ FileOutput::FileOutput(const Zstring& filename, AccessFlag access) : //throw (Fi
if (fileHandle == NULL)
{
const int lastError = errno;
- wxString errorMessage = wxString(_("Error writing file:")) + wxT("\n\"") + zToWx(filename_) + wxT("\"");
- errorMessage += wxT("\n\n") + zen::getLastErrorFormatted(lastError);
+ std::wstring errorMessage = _("Error writing file:") + "\n\"" + filename_ + "\"" + "\n\n" + zen::getLastErrorFormatted(lastError);
if (lastError == EEXIST)
throw ErrorTargetExisting(errorMessage);
@@ -215,14 +205,8 @@ void FileOutput::write(const void* buffer, size_t bytesToWrite) //throw (FileErr
const size_t bytesWritten = ::fwrite(buffer, 1, bytesToWrite, fileHandle);
if (::ferror(fileHandle) != 0)
#endif
- {
- wxString errorMessage = wxString(_("Error writing file:")) + wxT("\n\"") + zToWx(filename_) + wxT("\"");
- throw FileError(errorMessage + wxT("\n\n") + zen::getLastErrorFormatted() + wxT(" (w)")); //w -> distinguish from fopen error message!
- }
+ throw FileError(_("Error writing file:") + "\n\"" + filename_ + "\"" + "\n\n" + zen::getLastErrorFormatted() + " (w)"); //w -> distinguish from fopen error message!
if (bytesWritten != bytesToWrite) //must be fulfilled for synchronous writes!
- {
- wxString errorMessage = wxString(_("Error writing file:")) + wxT("\n\"") + zToWx(filename_) + wxT("\"");
- throw FileError(errorMessage + wxT("\n\n") + wxT("incomplete write"));
- }
+ throw FileError(_("Error writing file:") + "\n\"" + filename_ + "\"" + "\n\n" + "incomplete write");
}
diff --git a/shared/file_io.h b/shared/file_io.h
index d311346a..79b521f1 100644
--- a/shared/file_io.h
+++ b/shared/file_io.h
@@ -37,6 +37,9 @@ public:
bool eof(); //end of file reached
private:
+ FileInput(const FileInput&);
+ FileInput& operator=(const FileInput&);
+
bool eofReached;
FileHandle fileHandle;
const Zstring filename_;
@@ -58,6 +61,9 @@ public:
void write(const void* buffer, size_t bytesToWrite); //throw (FileError)
private:
+ FileOutput(const FileOutput&);
+ FileOutput& operator=(const FileOutput&);
+
FileHandle fileHandle;
const Zstring filename_;
};
diff --git a/shared/file_traverser.cpp b/shared/file_traverser.cpp
index 2525be58..aced3487 100644
--- a/shared/file_traverser.cpp
+++ b/shared/file_traverser.cpp
@@ -6,9 +6,7 @@
//
#include "file_traverser.h"
#include <limits>
-#include "system_constants.h"
#include "last_error.h"
-#include "string_conv.h"
#include "assert_static.h"
#include "symlink_target.h"
@@ -23,6 +21,36 @@
#include <cerrno>
#endif
+using namespace zen;
+
+
+namespace
+{
+//implement "retry" in a generic way:
+
+//returns "true" if "cmd" was invoked successfully, "false" if error occured and was ignored
+template <class Command> inline //function object with bool operator()(std::wstring& errorMsg), returns "true" on success, "false" on error and writes "errorMsg" in this case
+bool tryReportingError(Command cmd, zen::TraverseCallback& callback)
+{
+ for (;;)
+ {
+ std::wstring errorMsg;
+ if (cmd(errorMsg))
+ return true;
+
+ switch (callback.onError(errorMsg))
+ {
+ case TraverseCallback::TRAV_ERROR_RETRY:
+ break;
+ case TraverseCallback::TRAV_ERROR_IGNORE:
+ return false;
+ default:
+ assert(false);
+ break;
+ }
+ }
+}
+
#ifdef FFS_WIN
inline
@@ -62,6 +90,7 @@ bool setWin32FileInformationFromSymlink(const Zstring& linkName, zen::TraverseCa
return true;
}
#endif
+}
class DirTraverser
@@ -78,8 +107,8 @@ public:
#elif defined FFS_LINUX
const Zstring directoryFormatted = //remove trailing slash
- baseDirectory.size() > 1 && baseDirectory.EndsWith(common::FILE_NAME_SEPARATOR) ? //exception: allow '/'
- baseDirectory.BeforeLast(common::FILE_NAME_SEPARATOR) :
+ baseDirectory.size() > 1 && baseDirectory.EndsWith(FILE_NAME_SEPARATOR) ? //exception: allow '/'
+ baseDirectory.BeforeLast(FILE_NAME_SEPARATOR) :
baseDirectory;
#endif
@@ -97,40 +126,56 @@ public:
}
private:
+ DirTraverser(const DirTraverser&);
+ DirTraverser& operator=(const DirTraverser&);
+
template <bool followSymlinks>
void traverse(const Zstring& directory, zen::TraverseCallback& sink, int level)
{
- using namespace zen;
+ using namespace zen;
- if (level == 100) //catch endless recursion
+ tryReportingError([&](std::wstring& errorMsg) -> bool
{
- sink.onError(wxString(_("Endless loop when traversing directory:")) + wxT("\n\"") + zToWx(directory) + wxT("\""));
- return;
- }
+ if (level == 100) //notify endless recursion
+ {
+ errorMsg = _("Endless loop when traversing directory:") + "\n\"" + directory + "\"";
+ return false;
+ }
+ return true;
+ }, sink);
+
#ifdef FFS_WIN
//ensure directoryFormatted ends with backslash
- const Zstring& directoryFormatted = directory.EndsWith(common::FILE_NAME_SEPARATOR) ?
+ const Zstring& directoryFormatted = directory.EndsWith(FILE_NAME_SEPARATOR) ?
directory :
- directory + common::FILE_NAME_SEPARATOR;
+ directory + FILE_NAME_SEPARATOR;
WIN32_FIND_DATA fileInfo = {};
- HANDLE searchHandle = ::FindFirstFile(applyLongPathPrefix(directoryFormatted + Zchar('*')).c_str(), //__in LPCTSTR lpFileName
- &fileInfo); //__out LPWIN32_FIND_DATA lpFindFileData
- //no noticable performance difference compared to FindFirstFileEx with FindExInfoBasic, FIND_FIRST_EX_CASE_SENSITIVE and/or FIND_FIRST_EX_LARGE_FETCH
- if (searchHandle == INVALID_HANDLE_VALUE)
+ HANDLE searchHandle = INVALID_HANDLE_VALUE;
+ tryReportingError([&](std::wstring& errorMsg) -> bool
{
- const DWORD lastError = ::GetLastError();
- if (lastError == ERROR_FILE_NOT_FOUND)
- return;
+ searchHandle = ::FindFirstFile(
+ applyLongPathPrefix(directoryFormatted + Zchar('*')).c_str(), //__in LPCTSTR lpFileName
+ &fileInfo); //__out LPWIN32_FIND_DATA lpFindFileData
+ //no noticable performance difference compared to FindFirstFileEx with FindExInfoBasic, FIND_FIRST_EX_CASE_SENSITIVE and/or FIND_FIRST_EX_LARGE_FETCH
- //else: we have a problem... report it:
- const wxString errorMessage = wxString(_("Error traversing directory:")) + wxT("\n\"") + zToWx(directory) + wxT("\"");
+ if (searchHandle == INVALID_HANDLE_VALUE)
+ {
+ const DWORD lastError = ::GetLastError();
+ if (lastError == ERROR_FILE_NOT_FOUND)
+ return true; //fine: empty directory
- sink.onError(errorMessage + wxT("\n\n") +zen::getLastErrorFormatted(lastError));
- return;
- }
+ //else: we have a problem... report it:
+ errorMsg = _("Error traversing directory:") + "\n\"" + directory + "\"" + "\n\n" + zen::getLastErrorFormatted(lastError);
+ return false;
+ }
+ return true;
+ }, sink);
+
+ if (searchHandle == INVALID_HANDLE_VALUE)
+ return; //empty dir or ignore error
Loki::ScopeGuard dummy = Loki::MakeGuard(::FindClose, searchHandle);
(void)dummy; //silence warning "unused variable"
@@ -139,9 +184,8 @@ private:
{
//don't return "." and ".."
const Zchar* const shortName = fileInfo.cFileName;
- if ( shortName[0] == Zstr('.') &&
- ((shortName[1] == Zstr('.') && shortName[2] == Zstr('\0')) ||
- shortName[1] == Zstr('\0')))
+ if (shortName[0] == L'.' &&
+ (shortName[1] == L'\0' || (shortName[1] == L'.' && shortName[2] == L'\0')))
continue;
const Zstring& fullName = directoryFormatted + shortName;
@@ -210,65 +254,95 @@ private:
details.fileSize = zen::UInt64(fileInfo.nFileSizeLow, fileInfo.nFileSizeHigh);
}
- sink.onFile(shortName, fullName, details);
+ sink.onFile(shortName, fullName, details);
}
}
- while (::FindNextFile(searchHandle, // handle to search
- &fileInfo)); // pointer to structure for data on found file
+ while ([&]() -> bool
+ {
+ bool moreData = false;
- const DWORD lastError = ::GetLastError();
- if (lastError != ERROR_NO_MORE_FILES) //this is fine
+ tryReportingError([&](std::wstring& errorMsg) -> bool
{
- //else we have a problem... report it:
- const wxString errorMessage = wxString(_("Error traversing directory:")) + wxT("\n\"") + zToWx(directory) + wxT("\"") ;
- sink.onError(errorMessage + wxT("\n\n") + zen::getLastErrorFormatted(lastError));
- }
+ if (!::FindNextFile(searchHandle, // handle to search
+ &fileInfo)) // pointer to structure for data on found file
+ {
+ if (::GetLastError() == ERROR_NO_MORE_FILES) //this is fine
+ return true;
+
+ //else we have a problem... report it:
+ errorMsg = _("Error traversing directory:") + "\n\"" + directory + "\"" + "\n\n" + zen::getLastErrorFormatted();
+ return false;
+ }
+
+ moreData = true;
+ return true;
+ }, sink);
+
+ return moreData;
+ }());
+
#elif defined FFS_LINUX
- DIR* dirObj = ::opendir(directory.c_str()); //directory must NOT end with path separator, except "/"
- if (dirObj == NULL)
- {
- const wxString errorMessage = wxString(_("Error traversing directory:")) + wxT("\n\"") + zToWx(directory) + wxT("\"") ;
- sink.onError(errorMessage + wxT("\n\n") + zen::getLastErrorFormatted());
- return;
- }
+ DIR* dirObj = NULL;
+ if (!tryReportingError([&](std::wstring& errorMsg) -> bool
+ {
+ dirObj = ::opendir(directory.c_str()); //directory must NOT end with path separator, except "/"
+ if (dirObj == NULL)
+ {
+ errorMsg = _("Error traversing directory:") + "\n\"" + directory + "\"" + "\n\n" + zen::getLastErrorFormatted();
+ return false;
+ }
+ return true;
+ }, sink))
+ return;
Loki::ScopeGuard dummy = Loki::MakeGuard(::closedir, dirObj); //never close NULL handles! -> crash
(void)dummy; //silence warning "unused variable"
while (true)
{
- errno = 0; //set errno to 0 as unfortunately this isn't done when readdir() returns NULL because it can't find any files
- struct dirent* dirEntry = ::readdir(dirObj);
- if (dirEntry == NULL)
+ struct dirent* dirEntry = NULL;
+ tryReportingError([&](std::wstring& errorMsg) -> bool
{
- if (errno == 0)
- return; //everything okay
+ errno = 0; //set errno to 0 as unfortunately this isn't done when readdir() returns NULL because it can't find any files
+ dirEntry = ::readdir(dirObj);
+ if (dirEntry == NULL)
+ {
+ if (errno == 0)
+ return true; //everything okay, not more items
- //else: we have a problem... report it:
- const wxString errorMessage = wxString(_("Error traversing directory:")) + wxT("\n\"") + zToWx(directory) + wxT("\"") ;
- sink.onError(errorMessage + wxT("\n\n") + zen::getLastErrorFormatted());
+ //else: we have a problem... report it:
+ errorMsg = _("Error traversing directory:") + "\n\"" + directory + "\"" + "\n\n" + zen::getLastErrorFormatted();
+ return false;
+ }
+ return true;
+ }, sink);
+ if (dirEntry == NULL) //no more items or ignore error
return;
- }
+
//don't return "." and ".."
const Zchar* const shortName = dirEntry->d_name;
- if ( shortName[0] == Zstr('.') &&
- ((shortName[1] == Zstr('.') && shortName[2] == Zstr('\0')) ||
- shortName[1] == Zstr('\0')))
+ if (shortName[0] == '.' &&
+ (shortName[1] == '\0' || (shortName[1] == '.' && shortName[2] == '\0')))
continue;
- const Zstring& fullName = directory.EndsWith(common::FILE_NAME_SEPARATOR) ? //e.g. "/"
+ const Zstring& fullName = directory.EndsWith(FILE_NAME_SEPARATOR) ? //e.g. "/"
directory + shortName :
- directory + common::FILE_NAME_SEPARATOR + shortName;
+ directory + FILE_NAME_SEPARATOR + shortName;
+
+ struct stat fileInfo = {};
- struct stat fileInfo;
+ if (!tryReportingError([&](std::wstring& errorMsg) -> bool
+ {
if (::lstat(fullName.c_str(), &fileInfo) != 0) //lstat() does not resolve symlinks
- {
- const wxString errorMessage = wxString(_("Error reading file attributes:")) + wxT("\n\"") + zToWx(fullName) + wxT("\"");
- sink.onError(errorMessage + wxT("\n\n") + zen::getLastErrorFormatted());
- continue;
- }
+ {
+ errorMsg = _("Error reading file attributes:") + "\n\"" + fullName + "\"" + "\n\n" + zen::getLastErrorFormatted();
+ return false;
+ }
+ return true;
+ }, sink))
+ continue; //ignore error: skip file
const bool isSymbolicLink = S_ISLNK(fileInfo.st_mode);
@@ -278,11 +352,7 @@ private:
{
if (::stat(fullName.c_str(), &fileInfo) != 0) //stat() resolves symlinks
{
- //a broken symbolic link
- TraverseCallback::FileInfo details;
- details.lastWriteTimeRaw = 0; //we are not interested in the modifiation time of the link
- details.fileSize = 0U;
- sink.onFile(shortName, fullName, details); //report broken symlink as file!
+ sink.onFile(shortName, fullName, TraverseCallback::FileInfo()); //report broken symlink as file!
continue;
}
}
@@ -352,7 +422,7 @@ private:
const dst::RawTime encodedTime = dst::fatEncodeUtcTime(i->second); //throw (std::runtime_error)
{
HANDLE hTarget = ::CreateFile(zen::applyLongPathPrefix(i->first).c_str(),
- FILE_WRITE_ATTRIBUTES,
+ GENERIC_WRITE, //just FILE_WRITE_ATTRIBUTES may not be enough for some NAS shares!
FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
NULL,
OPEN_EXISTING,
@@ -410,5 +480,13 @@ private:
void zen::traverseFolder(const Zstring& directory, bool followSymlinks, TraverseCallback& sink, DstHackCallback* dstCallback)
{
+#ifdef FFS_WIN
+ try //traversing certain folders with restricted permissions requires this privilege! (but copying these files may still fail)
+ {
+ zen::Privileges::getInstance().ensureActive(SE_BACKUP_NAME); //throw (FileError)
+ }
+ catch (...) {} //don't cause issues in user mode
+#endif
+
DirTraverser(directory, followSymlinks, sink, dstCallback);
}
diff --git a/shared/file_traverser.h b/shared/file_traverser.h
index db77f7cd..18d692df 100644
--- a/shared/file_traverser.h
+++ b/shared/file_traverser.h
@@ -7,7 +7,6 @@
#ifndef FILETRAVERSER_H_INCLUDED
#define FILETRAVERSER_H_INCLUDED
-#include <wx/string.h>
#include "zstring.h"
#include "loki/TypeManip.h"
#include "int64.h"
@@ -23,15 +22,15 @@ public:
struct FileInfo
{
- zen::UInt64 fileSize; //unit: bytes!
- zen::Int64 lastWriteTimeRaw; //number of seconds since Jan. 1st 1970 UTC
+ UInt64 fileSize; //unit: bytes!
+ Int64 lastWriteTimeRaw; //number of seconds since Jan. 1st 1970 UTC
};
struct SymlinkInfo
{
- zen::Int64 lastWriteTimeRaw; //number of seconds since Jan. 1st 1970 UTC
- Zstring targetPath; //may be empty if something goes wrong
- bool dirLink; //"true": point to dir; "false": point to file (or broken Link on Linux)
+ Int64 lastWriteTimeRaw; //number of seconds since Jan. 1st 1970 UTC
+ Zstring targetPath; //may be empty if something goes wrong
+ bool dirLink; //"true": point to dir; "false": point to file (or broken Link on Linux)
};
struct ReturnValDir
@@ -46,14 +45,20 @@ public:
ReturnValDir(Loki::Int2Type<TRAVERSING_DIR_CONTINUE>, TraverseCallback& subDirCallback) : returnCode(TRAVERSING_DIR_CONTINUE), subDirCb(&subDirCallback) {}
const ReturnValueEnh returnCode;
- TraverseCallback* const subDirCb;
+ TraverseCallback* subDirCb;
+ };
+
+ enum HandleError
+ {
+ TRAV_ERROR_RETRY,
+ TRAV_ERROR_IGNORE
};
//overwrite these virtual methods
- virtual void onError(const wxString& errorText) = 0;
- virtual void onFile( const Zchar* shortName, const Zstring& fullName, const FileInfo& details) = 0;
- virtual void onSymlink( const Zchar* shortName, const Zstring& fullName, const SymlinkInfo& details) = 0;
- virtual ReturnValDir onDir(const Zchar* shortName, const Zstring& fullName) = 0;
+ virtual void onFile (const Zchar* shortName, const Zstring& fullName, const FileInfo& details) = 0;
+ virtual void onSymlink(const Zchar* shortName, const Zstring& fullName, const SymlinkInfo& details) = 0;
+ virtual ReturnValDir onDir (const Zchar* shortName, const Zstring& fullName) = 0;
+ virtual HandleError onError (const std::wstring& errorText) = 0;
};
diff --git a/shared/global_func.cpp b/shared/global_func.cpp
deleted file mode 100644
index d25f30d2..00000000
--- a/shared/global_func.cpp
+++ /dev/null
@@ -1,71 +0,0 @@
-// **************************************************************************
-// * This file is part of the FreeFileSync project. It is distributed under *
-// * GNU General Public License: http://www.gnu.org/licenses/gpl.html *
-// * Copyright (C) 2008-2011 ZenJu (zhnmju123 AT gmx.de) *
-// **************************************************************************
-//
-#include "global_func.h"
-#include "string_tools.h"
-#include <wx/msgdlg.h>
-#include <wx/file.h>
-#include <wx/stopwatch.h>
-#include "system_constants.h"
-
-using namespace common;
-using namespace zen;
-
-
-size_t common::getDigitCount(size_t number) //count number of digits
-{
- return number == 0 ? 1 : static_cast<size_t>(::log10(static_cast<double>(number))) + 1;
-}
-
-//############################################################################
-DebugLog::DebugLog(const wxString& filePrefix) :
- prefix(filePrefix),
- lineCount(0),
- logFile(NULL)
-{
- logFile = new wxFile;
- logfileName = assembleFileName();
- logFile->Open(logfileName.c_str(), wxFile::write);
-}
-
-
-DebugLog::~DebugLog()
-{
- delete logFile; //automatically closes file handle
-}
-
-
-wxString DebugLog::assembleFileName()
-{
- wxString tmp = wxDateTime::Now().FormatISOTime();
- tmp.Replace(wxT(":"), wxEmptyString);
- return prefix + wxString(wxT("DEBUG_")) + wxDateTime::Now().FormatISODate() + wxChar('_') + tmp + wxT(".log");
-}
-
-
-void DebugLog::write(const wxString& logText)
-{
- ++lineCount;
- if (lineCount % 50000 == 0) //prevent logfile from becoming too big
- {
- logFile->Close();
- wxRemoveFile(logfileName);
-
- logfileName = assembleFileName();
- logFile->Open(logfileName.c_str(), wxFile::write);
- }
-
- logFile->Write(wxString(wxT("[")) + wxDateTime::Now().FormatTime() + wxT("] "));
- logFile->Write(logText + LINE_BREAK);
-}
-
-//DebugLog logDebugInfo;
-
-
-wxString getCodeLocation(const wxString& file, int line)
-{
- return wxString(file).AfterLast(FILE_NAME_SEPARATOR) + wxT(", LINE ") + toString<wxString>(line) + wxT(" | ");
-}
diff --git a/shared/global_func.h b/shared/global_func.h
index 1c6bf0ae..bf9f13dd 100644
--- a/shared/global_func.h
+++ b/shared/global_func.h
@@ -12,8 +12,6 @@
#include <vector>
#include <set>
#include <wx/string.h>
-//#include <memory>
-//#include <sstream>
namespace common
@@ -37,28 +35,8 @@ ForwardIterator custom_binary_search(ForwardIterator first, ForwardIterator last
//############################################################################
-class wxFile;
-class DebugLog
-{
-public:
- wxDEPRECATED(DebugLog(const wxString& filePrefix = wxString()));
- ~DebugLog();
- void write(const wxString& logText);
-
-private:
- wxString assembleFileName();
- wxString logfileName;
- wxString prefix;
- int lineCount;
- wxFile* logFile; //logFile.close(); <- not needed
-};
-extern DebugLog logDebugInfo;
-wxString getCodeLocation(const wxString& file, int line);
-//small macro for writing debug information into a logfile
-#define WRITE_DEBUG_LOG(x) logDebugInfo.write(getCodeLocation(__TFILE__, __LINE__) + x);
-//speed alternative: wxLogDebug(wxT("text")) + DebugView
@@ -78,9 +56,14 @@ wxString getCodeLocation(const wxString& file, int line);
+//---------------Inline Implementation---------------------------------------------------
+inline
+size_t common::getDigitCount(size_t number) //count number of digits
+{
+ return number == 0 ? 1 : static_cast<size_t>(::log10(static_cast<double>(number))) + 1;
+}
-//---------------Inline Implementation---------------------------------------------------
//Note: the following lines are a performance optimization for deleting elements from a vector: linear runtime at most!
template <class T>
void common::removeRowsFromVector(const std::set<size_t>& rowsToRemove, std::vector<T>& grid)
@@ -126,4 +109,4 @@ ForwardIterator common::custom_binary_search(ForwardIterator first, ForwardItera
return last;
}
-#endif // GLOBALFUNCTIONS_H_INCLUDED \ No newline at end of file
+#endif // GLOBALFUNCTIONS_H_INCLUDED
diff --git a/shared/guid.cpp b/shared/guid.cpp
index 5e6a64a7..1580a62d 100644
--- a/shared/guid.cpp
+++ b/shared/guid.cpp
@@ -10,6 +10,7 @@
//boost really should clean a bit up...
#ifdef __MINGW32__
#pragma GCC diagnostic ignored "-Wshadow"
+#pragma GCC diagnostic ignored "-Wuninitialized"
#endif
#include <boost/uuid/uuid_generators.hpp>
diff --git a/shared/i18n.cpp b/shared/i18n.cpp
index 8c0e900c..f22dca56 100644
--- a/shared/i18n.cpp
+++ b/shared/i18n.cpp
@@ -5,7 +5,7 @@ using namespace zen;
namespace
{
-std::auto_ptr<TranslationHandler> globalHandler;
+std::unique_ptr<TranslationHandler> globalHandler;
}
void zen::setTranslator(TranslationHandler* newHandler)
diff --git a/shared/i18n.h b/shared/i18n.h
index 03456ede..cac6555c 100644
--- a/shared/i18n.h
+++ b/shared/i18n.h
@@ -7,8 +7,7 @@
#ifndef I18_N_HEADER_3843489325045
#define I18_N_HEADER_3843489325045
-#include <wx/string.h>
-#include <vector>
+#include <string>
namespace zen
{
@@ -17,9 +16,9 @@ struct TranslationHandler
{
virtual ~TranslationHandler() {}
- virtual wxString thousandsSeparator() = 0;
- virtual wxString translate(const wxString& text) = 0; //simple translation
- virtual wxString translate(const wxString& singular, const wxString& plural, int n) = 0;
+ virtual std::wstring thousandsSeparator() = 0;
+ virtual std::wstring translate(const std::wstring& text) = 0; //simple translation
+ virtual std::wstring translate(const std::wstring& singular, const std::wstring& plural, int n) = 0;
};
void setTranslator(TranslationHandler* newHandler = NULL); //takes ownership
@@ -27,26 +26,28 @@ TranslationHandler* getTranslator();
-inline wxString getThousandsSeparator() { return getTranslator() ? getTranslator()->thousandsSeparator() : wxT(","); };
+inline std::wstring getThousandsSeparator() { return getTranslator() ? getTranslator()->thousandsSeparator() : L","; };
-inline wxString translate(const wxString& text) { return getTranslator() ? getTranslator()->translate(text) : text; }
+inline std::wstring translate(const std::wstring& text) { return getTranslator() ? getTranslator()->translate(text) : text; }
//translate plural forms: "%x day" "%x days"
//returns "%x day" if n == 1; "%x days" else for english language
-inline wxString translate(const wxString& singular, const wxString& plural, int n) { return getTranslator() ? getTranslator()->translate(singular, plural, n) : n == 1 ? singular : plural; }
+inline std::wstring translate(const std::wstring& singular, const std::wstring& plural, int n) { return getTranslator() ? getTranslator()->translate(singular, plural, n) : n == 1 ? singular : plural; }
template <class T> inline
-wxString translate(const wxString& singular, const wxString& plural, T n)
+std::wstring translate(const std::wstring& singular, const std::wstring& plural, T n)
{
return translate(singular, plural, static_cast<int>(n % 1000000));
}
}
+#define CONCAT_HELPER(txt1, txt2) txt1 ## txt2
+
#ifndef WXINTL_NO_GETTEXT_MACRO
#error WXINTL_NO_GETTEXT_MACRO must be defined to deactivate wxWidgets underscore macro
#endif
-#define _(s) zen::translate(wxT(s))
-#define _P(s, p, n) zen::translate(wxT(s), wxT(p), n)
+#define _(s) zen::translate(CONCAT_HELPER(L, s))
+#define _P(s, p, n) zen::translate(CONCAT_HELPER(L, s), CONCAT_HELPER(L, p), n)
#endif //I18_N_HEADER_3843489325045
diff --git a/shared/inotify/CHANGELOG b/shared/inotify/CHANGELOG
deleted file mode 100644
index 5c3940fa..00000000
--- a/shared/inotify/CHANGELOG
+++ /dev/null
@@ -1,98 +0,0 @@
-0.7.3 2009-12-09
- * cleanup of includes
-
-0.7.2 2007-04-18
- * added #include <stdint.h> (required for Debian Sarge, #0000155)
-
-0.7.1 2007-01-20
- * incorrect event name handling fixed (#0000135)
-
-0.7.0 2007-01-13
- * added Inotify::SetCloseOnExec() for simple setting this feature
-
-
-0.6.3 2007-01-06
- * incorrect behavior for IN_IGNORED fixed (#0000124)
-
-
-0.6.2 2007-01-03
- * bad IN_MOVE_SELF dumping in IN_ALL_EVENTS fixed (#0000118)
-
-
-0.6.1 2006-12-30
- * fixed incorrect behavior for IN_ONESHOT (#0000113)
-
-
-0.6.0 2006-12-28
- * added methods for getting/setting inotify capabilities and limits
- * added IN_SELF_MOVED flag (if defined)
- * added Inotify::IsRecursive() for identifying recursive watches
- (will be implemented in future versions)
-
-0.5.3 2006-12-06
- * fixed incorrect error handling in WaitForEvents()
-
-
-0.5.2 2006-11-12
- * problem with ignoring IN_OPEN has been fixed (#0000102)
-
-
-0.5.1 2006-11-10
- * problems with includes have been fixed (#0000099)
-
-
-0.5.0 2006-10-29
- * partial thread safety has been implemented (using rwlocks)
- * Inotify::GetEnabledCount() method has been added
-
-
-0.4.1 2006-10-14
- * wrong value returned by Inotify::GetWatchCount() has been fixed
- (#0000092)
-
-
-0.4.0 2006-10-13
- * two additional flags (IN_ONLYDIR and IN_DONT_FOLLOW) may be used
- if available (#0000086)
- * "errorneous" multiple watches on the same path are no longer
- possible (#0000087)
- * tarball structure has been fixed (#0000088)
- * inotify-syscalls.h is included only if inotify.h doesn't contain
- syscall definitions (#0000090)
- * enabling/disabling is now done through watch presence in the kernel
- instead of dropping events (#0000091)
- * InotifyWatch::SetMask() method has been added to allow later mask
- modification
-
-
-0.3.1 2006-10-03
- * fixed: wrong behavior for EWOULDBLOCK (Inotify::WaitForEvents())
-
-
-0.3.0 2006-10-03
- * all errors now handled using exceptions (InotifyException)
- * InotifyEvent no longer use struct inotity_event as its
- internal data structure
- * removed InotifyEvent::GetData() - internal data changed
- * removed Inotify::IsReady() - no longer necessary
- * added Inotify::GetDescriptor() - returns inotify file descriptor
- * added Inotify::SetNonBlock() - switches nonblocking mode on/off
- * added possibility to enable/disable watches
- * some code cleanups
-
-
-0.2.0 2006-09-15
- * InotifyEvent now contains a pointer to the source InotifyWatch
- * fixed: InotifyEvent::IsType() - it now handles the mask correctly
- * added a static method (InotifyEvent::GetMaskByName()) for finding a mask
- for a name
- * added a static version of InotifyEvent::DumpTypes() method
- * added a static version of InotifyEvent::IsType() method
- * dumped types (InotifyEvent::DumpTypes()) now separated by commas
- instead of spaces
- * InotifyEvent::DumpTypes() methods now use as general types as possible
- * InotifyWatch now contains a pointer to the related Inotify
-
-
-0.1.0 2006-09-04
-first alpha version
diff --git a/shared/inotify/COPYING b/shared/inotify/COPYING
deleted file mode 100644
index 17959846..00000000
--- a/shared/inotify/COPYING
+++ /dev/null
@@ -1,13 +0,0 @@
-inotify C++ interface
-
-Copyright (C) 2006, 2007, 2009 Lukas Jelinek, <lukas@aiken.cz>
-
-This program is free software; you can redistribute it and/or
-modify it under the terms of one of the following licenses:
-
-1. X11 license (see LICENSE-X11)
-2. GNU Lesser General Public License, version 2.1 (see LICENSE-LGPL)
-3. GNU General Public License, version 2 (see LICENSE-GPL)
-
-If you want to help with choosing the best license for you,
-please visit http://www.gnu.org/licenses/license-list.html.
diff --git a/shared/inotify/LICENSE-GPL b/shared/inotify/LICENSE-GPL
deleted file mode 100644
index a43ea212..00000000
--- a/shared/inotify/LICENSE-GPL
+++ /dev/null
@@ -1,339 +0,0 @@
- GNU GENERAL PUBLIC LICENSE
- Version 2, June 1991
-
- Copyright (C) 1989, 1991 Free Software Foundation, Inc.
- 675 Mass Ave, Cambridge, MA 02139, USA
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
-
- Preamble
-
- The licenses for most software are designed to take away your
-freedom to share and change it. By contrast, the GNU General Public
-License is intended to guarantee your freedom to share and change free
-software--to make sure the software is free for all its users. This
-General Public License applies to most of the Free Software
-Foundation's software and to any other program whose authors commit to
-using it. (Some other Free Software Foundation software is covered by
-the GNU Library General Public License instead.) You can apply it to
-your programs, too.
-
- When we speak of free software, we are referring to freedom, not
-price. Our General Public Licenses are designed to make sure that you
-have the freedom to distribute copies of free software (and charge for
-this service if you wish), that you receive source code or can get it
-if you want it, that you can change the software or use pieces of it
-in new free programs; and that you know you can do these things.
-
- To protect your rights, we need to make restrictions that forbid
-anyone to deny you these rights or to ask you to surrender the rights.
-These restrictions translate to certain responsibilities for you if you
-distribute copies of the software, or if you modify it.
-
- For example, if you distribute copies of such a program, whether
-gratis or for a fee, you must give the recipients all the rights that
-you have. You must make sure that they, too, receive or can get the
-source code. And you must show them these terms so they know their
-rights.
-
- We protect your rights with two steps: (1) copyright the software, and
-(2) offer you this license which gives you legal permission to copy,
-distribute and/or modify the software.
-
- Also, for each author's protection and ours, we want to make certain
-that everyone understands that there is no warranty for this free
-software. If the software is modified by someone else and passed on, we
-want its recipients to know that what they have is not the original, so
-that any problems introduced by others will not reflect on the original
-authors' reputations.
-
- Finally, any free program is threatened constantly by software
-patents. We wish to avoid the danger that redistributors of a free
-program will individually obtain patent licenses, in effect making the
-program proprietary. To prevent this, we have made it clear that any
-patent must be licensed for everyone's free use or not licensed at all.
-
- The precise terms and conditions for copying, distribution and
-modification follow.
-
- GNU GENERAL PUBLIC LICENSE
- TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
-
- 0. This License applies to any program or other work which contains
-a notice placed by the copyright holder saying it may be distributed
-under the terms of this General Public License. The "Program", below,
-refers to any such program or work, and a "work based on the Program"
-means either the Program or any derivative work under copyright law:
-that is to say, a work containing the Program or a portion of it,
-either verbatim or with modifications and/or translated into another
-language. (Hereinafter, translation is included without limitation in
-the term "modification".) Each licensee is addressed as "you".
-
-Activities other than copying, distribution and modification are not
-covered by this License; they are outside its scope. The act of
-running the Program is not restricted, and the output from the Program
-is covered only if its contents constitute a work based on the
-Program (independent of having been made by running the Program).
-Whether that is true depends on what the Program does.
-
- 1. You may copy and distribute verbatim copies of the Program's
-source code as you receive it, in any medium, provided that you
-conspicuously and appropriately publish on each copy an appropriate
-copyright notice and disclaimer of warranty; keep intact all the
-notices that refer to this License and to the absence of any warranty;
-and give any other recipients of the Program a copy of this License
-along with the Program.
-
-You may charge a fee for the physical act of transferring a copy, and
-you may at your option offer warranty protection in exchange for a fee.
-
- 2. You may modify your copy or copies of the Program or any portion
-of it, thus forming a work based on the Program, and copy and
-distribute such modifications or work under the terms of Section 1
-above, provided that you also meet all of these conditions:
-
- a) You must cause the modified files to carry prominent notices
- stating that you changed the files and the date of any change.
-
- b) You must cause any work that you distribute or publish, that in
- whole or in part contains or is derived from the Program or any
- part thereof, to be licensed as a whole at no charge to all third
- parties under the terms of this License.
-
- c) If the modified program normally reads commands interactively
- when run, you must cause it, when started running for such
- interactive use in the most ordinary way, to print or display an
- announcement including an appropriate copyright notice and a
- notice that there is no warranty (or else, saying that you provide
- a warranty) and that users may redistribute the program under
- these conditions, and telling the user how to view a copy of this
- License. (Exception: if the Program itself is interactive but
- does not normally print such an announcement, your work based on
- the Program is not required to print an announcement.)
-
-These requirements apply to the modified work as a whole. If
-identifiable sections of that work are not derived from the Program,
-and can be reasonably considered independent and separate works in
-themselves, then this License, and its terms, do not apply to those
-sections when you distribute them as separate works. But when you
-distribute the same sections as part of a whole which is a work based
-on the Program, the distribution of the whole must be on the terms of
-this License, whose permissions for other licensees extend to the
-entire whole, and thus to each and every part regardless of who wrote it.
-
-Thus, it is not the intent of this section to claim rights or contest
-your rights to work written entirely by you; rather, the intent is to
-exercise the right to control the distribution of derivative or
-collective works based on the Program.
-
-In addition, mere aggregation of another work not based on the Program
-with the Program (or with a work based on the Program) on a volume of
-a storage or distribution medium does not bring the other work under
-the scope of this License.
-
- 3. You may copy and distribute the Program (or a work based on it,
-under Section 2) in object code or executable form under the terms of
-Sections 1 and 2 above provided that you also do one of the following:
-
- a) Accompany it with the complete corresponding machine-readable
- source code, which must be distributed under the terms of Sections
- 1 and 2 above on a medium customarily used for software interchange; or,
-
- b) Accompany it with a written offer, valid for at least three
- years, to give any third party, for a charge no more than your
- cost of physically performing source distribution, a complete
- machine-readable copy of the corresponding source code, to be
- distributed under the terms of Sections 1 and 2 above on a medium
- customarily used for software interchange; or,
-
- c) Accompany it with the information you received as to the offer
- to distribute corresponding source code. (This alternative is
- allowed only for noncommercial distribution and only if you
- received the program in object code or executable form with such
- an offer, in accord with Subsection b above.)
-
-The source code for a work means the preferred form of the work for
-making modifications to it. For an executable work, complete source
-code means all the source code for all modules it contains, plus any
-associated interface definition files, plus the scripts used to
-control compilation and installation of the executable. However, as a
-special exception, the source code distributed need not include
-anything that is normally distributed (in either source or binary
-form) with the major components (compiler, kernel, and so on) of the
-operating system on which the executable runs, unless that component
-itself accompanies the executable.
-
-If distribution of executable or object code is made by offering
-access to copy from a designated place, then offering equivalent
-access to copy the source code from the same place counts as
-distribution of the source code, even though third parties are not
-compelled to copy the source along with the object code.
-
- 4. You may not copy, modify, sublicense, or distribute the Program
-except as expressly provided under this License. Any attempt
-otherwise to copy, modify, sublicense or distribute the Program is
-void, and will automatically terminate your rights under this License.
-However, parties who have received copies, or rights, from you under
-this License will not have their licenses terminated so long as such
-parties remain in full compliance.
-
- 5. You are not required to accept this License, since you have not
-signed it. However, nothing else grants you permission to modify or
-distribute the Program or its derivative works. These actions are
-prohibited by law if you do not accept this License. Therefore, by
-modifying or distributing the Program (or any work based on the
-Program), you indicate your acceptance of this License to do so, and
-all its terms and conditions for copying, distributing or modifying
-the Program or works based on it.
-
- 6. Each time you redistribute the Program (or any work based on the
-Program), the recipient automatically receives a license from the
-original licensor to copy, distribute or modify the Program subject to
-these terms and conditions. You may not impose any further
-restrictions on the recipients' exercise of the rights granted herein.
-You are not responsible for enforcing compliance by third parties to
-this License.
-
- 7. If, as a consequence of a court judgment or allegation of patent
-infringement or for any other reason (not limited to patent issues),
-conditions are imposed on you (whether by court order, agreement or
-otherwise) that contradict the conditions of this License, they do not
-excuse you from the conditions of this License. If you cannot
-distribute so as to satisfy simultaneously your obligations under this
-License and any other pertinent obligations, then as a consequence you
-may not distribute the Program at all. For example, if a patent
-license would not permit royalty-free redistribution of the Program by
-all those who receive copies directly or indirectly through you, then
-the only way you could satisfy both it and this License would be to
-refrain entirely from distribution of the Program.
-
-If any portion of this section is held invalid or unenforceable under
-any particular circumstance, the balance of the section is intended to
-apply and the section as a whole is intended to apply in other
-circumstances.
-
-It is not the purpose of this section to induce you to infringe any
-patents or other property right claims or to contest validity of any
-such claims; this section has the sole purpose of protecting the
-integrity of the free software distribution system, which is
-implemented by public license practices. Many people have made
-generous contributions to the wide range of software distributed
-through that system in reliance on consistent application of that
-system; it is up to the author/donor to decide if he or she is willing
-to distribute software through any other system and a licensee cannot
-impose that choice.
-
-This section is intended to make thoroughly clear what is believed to
-be a consequence of the rest of this License.
-
- 8. If the distribution and/or use of the Program is restricted in
-certain countries either by patents or by copyrighted interfaces, the
-original copyright holder who places the Program under this License
-may add an explicit geographical distribution limitation excluding
-those countries, so that distribution is permitted only in or among
-countries not thus excluded. In such case, this License incorporates
-the limitation as if written in the body of this License.
-
- 9. The Free Software Foundation may publish revised and/or new versions
-of the General Public License from time to time. Such new versions will
-be similar in spirit to the present version, but may differ in detail to
-address new problems or concerns.
-
-Each version is given a distinguishing version number. If the Program
-specifies a version number of this License which applies to it and "any
-later version", you have the option of following the terms and conditions
-either of that version or of any later version published by the Free
-Software Foundation. If the Program does not specify a version number of
-this License, you may choose any version ever published by the Free Software
-Foundation.
-
- 10. If you wish to incorporate parts of the Program into other free
-programs whose distribution conditions are different, write to the author
-to ask for permission. For software which is copyrighted by the Free
-Software Foundation, write to the Free Software Foundation; we sometimes
-make exceptions for this. Our decision will be guided by the two goals
-of preserving the free status of all derivatives of our free software and
-of promoting the sharing and reuse of software generally.
-
- NO WARRANTY
-
- 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
-FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
-OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
-PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
-OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
-MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
-TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
-PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
-REPAIR OR CORRECTION.
-
- 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
-WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
-REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
-INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
-OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
-TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
-YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
-PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
-POSSIBILITY OF SUCH DAMAGES.
-
- END OF TERMS AND CONDITIONS
-
- Appendix: How to Apply These Terms to Your New Programs
-
- If you develop a new program, and you want it to be of the greatest
-possible use to the public, the best way to achieve this is to make it
-free software which everyone can redistribute and change under these terms.
-
- To do so, attach the following notices to the program. It is safest
-to attach them to the start of each source file to most effectively
-convey the exclusion of warranty; and each file should have at least
-the "copyright" line and a pointer to where the full notice is found.
-
- <one line to give the program's name and a brief idea of what it does.>
- Copyright (C) 19yy <name of author>
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-
-Also add information on how to contact you by electronic and paper mail.
-
-If the program is interactive, make it output a short notice like this
-when it starts in an interactive mode:
-
- Gnomovision version 69, Copyright (C) 19yy name of author
- Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
- This is free software, and you are welcome to redistribute it
- under certain conditions; type `show c' for details.
-
-The hypothetical commands `show w' and `show c' should show the appropriate
-parts of the General Public License. Of course, the commands you use may
-be called something other than `show w' and `show c'; they could even be
-mouse-clicks or menu items--whatever suits your program.
-
-You should also get your employer (if you work as a programmer) or your
-school, if any, to sign a "copyright disclaimer" for the program, if
-necessary. Here is a sample; alter the names:
-
- Yoyodyne, Inc., hereby disclaims all copyright interest in the program
- `Gnomovision' (which makes passes at compilers) written by James Hacker.
-
- <signature of Ty Coon>, 1 April 1989
- Ty Coon, President of Vice
-
-This General Public License does not permit incorporating your program into
-proprietary programs. If your program is a subroutine library, you may
-consider it more useful to permit linking proprietary applications with the
-library. If this is what you want to do, use the GNU Library General
-Public License instead of this License.
diff --git a/shared/inotify/LICENSE-LGPL b/shared/inotify/LICENSE-LGPL
deleted file mode 100644
index 8add30ad..00000000
--- a/shared/inotify/LICENSE-LGPL
+++ /dev/null
@@ -1,504 +0,0 @@
- GNU LESSER GENERAL PUBLIC LICENSE
- Version 2.1, February 1999
-
- Copyright (C) 1991, 1999 Free Software Foundation, Inc.
- 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
-
-[This is the first released version of the Lesser GPL. It also counts
- as the successor of the GNU Library Public License, version 2, hence
- the version number 2.1.]
-
- Preamble
-
- The licenses for most software are designed to take away your
-freedom to share and change it. By contrast, the GNU General Public
-Licenses are intended to guarantee your freedom to share and change
-free software--to make sure the software is free for all its users.
-
- This license, the Lesser General Public License, applies to some
-specially designated software packages--typically libraries--of the
-Free Software Foundation and other authors who decide to use it. You
-can use it too, but we suggest you first think carefully about whether
-this license or the ordinary General Public License is the better
-strategy to use in any particular case, based on the explanations below.
-
- When we speak of free software, we are referring to freedom of use,
-not price. Our General Public Licenses are designed to make sure that
-you have the freedom to distribute copies of free software (and charge
-for this service if you wish); that you receive source code or can get
-it if you want it; that you can change the software and use pieces of
-it in new free programs; and that you are informed that you can do
-these things.
-
- To protect your rights, we need to make restrictions that forbid
-distributors to deny you these rights or to ask you to surrender these
-rights. These restrictions translate to certain responsibilities for
-you if you distribute copies of the library or if you modify it.
-
- For example, if you distribute copies of the library, whether gratis
-or for a fee, you must give the recipients all the rights that we gave
-you. You must make sure that they, too, receive or can get the source
-code. If you link other code with the library, you must provide
-complete object files to the recipients, so that they can relink them
-with the library after making changes to the library and recompiling
-it. And you must show them these terms so they know their rights.
-
- We protect your rights with a two-step method: (1) we copyright the
-library, and (2) we offer you this license, which gives you legal
-permission to copy, distribute and/or modify the library.
-
- To protect each distributor, we want to make it very clear that
-there is no warranty for the free library. Also, if the library is
-modified by someone else and passed on, the recipients should know
-that what they have is not the original version, so that the original
-author's reputation will not be affected by problems that might be
-introduced by others.
-
- Finally, software patents pose a constant threat to the existence of
-any free program. We wish to make sure that a company cannot
-effectively restrict the users of a free program by obtaining a
-restrictive license from a patent holder. Therefore, we insist that
-any patent license obtained for a version of the library must be
-consistent with the full freedom of use specified in this license.
-
- Most GNU software, including some libraries, is covered by the
-ordinary GNU General Public License. This license, the GNU Lesser
-General Public License, applies to certain designated libraries, and
-is quite different from the ordinary General Public License. We use
-this license for certain libraries in order to permit linking those
-libraries into non-free programs.
-
- When a program is linked with a library, whether statically or using
-a shared library, the combination of the two is legally speaking a
-combined work, a derivative of the original library. The ordinary
-General Public License therefore permits such linking only if the
-entire combination fits its criteria of freedom. The Lesser General
-Public License permits more lax criteria for linking other code with
-the library.
-
- We call this license the "Lesser" General Public License because it
-does Less to protect the user's freedom than the ordinary General
-Public License. It also provides other free software developers Less
-of an advantage over competing non-free programs. These disadvantages
-are the reason we use the ordinary General Public License for many
-libraries. However, the Lesser license provides advantages in certain
-special circumstances.
-
- For example, on rare occasions, there may be a special need to
-encourage the widest possible use of a certain library, so that it becomes
-a de-facto standard. To achieve this, non-free programs must be
-allowed to use the library. A more frequent case is that a free
-library does the same job as widely used non-free libraries. In this
-case, there is little to gain by limiting the free library to free
-software only, so we use the Lesser General Public License.
-
- In other cases, permission to use a particular library in non-free
-programs enables a greater number of people to use a large body of
-free software. For example, permission to use the GNU C Library in
-non-free programs enables many more people to use the whole GNU
-operating system, as well as its variant, the GNU/Linux operating
-system.
-
- Although the Lesser General Public License is Less protective of the
-users' freedom, it does ensure that the user of a program that is
-linked with the Library has the freedom and the wherewithal to run
-that program using a modified version of the Library.
-
- The precise terms and conditions for copying, distribution and
-modification follow. Pay close attention to the difference between a
-"work based on the library" and a "work that uses the library". The
-former contains code derived from the library, whereas the latter must
-be combined with the library in order to run.
-
- GNU LESSER GENERAL PUBLIC LICENSE
- TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
-
- 0. This License Agreement applies to any software library or other
-program which contains a notice placed by the copyright holder or
-other authorized party saying it may be distributed under the terms of
-this Lesser General Public License (also called "this License").
-Each licensee is addressed as "you".
-
- A "library" means a collection of software functions and/or data
-prepared so as to be conveniently linked with application programs
-(which use some of those functions and data) to form executables.
-
- The "Library", below, refers to any such software library or work
-which has been distributed under these terms. A "work based on the
-Library" means either the Library or any derivative work under
-copyright law: that is to say, a work containing the Library or a
-portion of it, either verbatim or with modifications and/or translated
-straightforwardly into another language. (Hereinafter, translation is
-included without limitation in the term "modification".)
-
- "Source code" for a work means the preferred form of the work for
-making modifications to it. For a library, complete source code means
-all the source code for all modules it contains, plus any associated
-interface definition files, plus the scripts used to control compilation
-and installation of the library.
-
- Activities other than copying, distribution and modification are not
-covered by this License; they are outside its scope. The act of
-running a program using the Library is not restricted, and output from
-such a program is covered only if its contents constitute a work based
-on the Library (independent of the use of the Library in a tool for
-writing it). Whether that is true depends on what the Library does
-and what the program that uses the Library does.
-
- 1. You may copy and distribute verbatim copies of the Library's
-complete source code as you receive it, in any medium, provided that
-you conspicuously and appropriately publish on each copy an
-appropriate copyright notice and disclaimer of warranty; keep intact
-all the notices that refer to this License and to the absence of any
-warranty; and distribute a copy of this License along with the
-Library.
-
- You may charge a fee for the physical act of transferring a copy,
-and you may at your option offer warranty protection in exchange for a
-fee.
-
- 2. You may modify your copy or copies of the Library or any portion
-of it, thus forming a work based on the Library, and copy and
-distribute such modifications or work under the terms of Section 1
-above, provided that you also meet all of these conditions:
-
- a) The modified work must itself be a software library.
-
- b) You must cause the files modified to carry prominent notices
- stating that you changed the files and the date of any change.
-
- c) You must cause the whole of the work to be licensed at no
- charge to all third parties under the terms of this License.
-
- d) If a facility in the modified Library refers to a function or a
- table of data to be supplied by an application program that uses
- the facility, other than as an argument passed when the facility
- is invoked, then you must make a good faith effort to ensure that,
- in the event an application does not supply such function or
- table, the facility still operates, and performs whatever part of
- its purpose remains meaningful.
-
- (For example, a function in a library to compute square roots has
- a purpose that is entirely well-defined independent of the
- application. Therefore, Subsection 2d requires that any
- application-supplied function or table used by this function must
- be optional: if the application does not supply it, the square
- root function must still compute square roots.)
-
-These requirements apply to the modified work as a whole. If
-identifiable sections of that work are not derived from the Library,
-and can be reasonably considered independent and separate works in
-themselves, then this License, and its terms, do not apply to those
-sections when you distribute them as separate works. But when you
-distribute the same sections as part of a whole which is a work based
-on the Library, the distribution of the whole must be on the terms of
-this License, whose permissions for other licensees extend to the
-entire whole, and thus to each and every part regardless of who wrote
-it.
-
-Thus, it is not the intent of this section to claim rights or contest
-your rights to work written entirely by you; rather, the intent is to
-exercise the right to control the distribution of derivative or
-collective works based on the Library.
-
-In addition, mere aggregation of another work not based on the Library
-with the Library (or with a work based on the Library) on a volume of
-a storage or distribution medium does not bring the other work under
-the scope of this License.
-
- 3. You may opt to apply the terms of the ordinary GNU General Public
-License instead of this License to a given copy of the Library. To do
-this, you must alter all the notices that refer to this License, so
-that they refer to the ordinary GNU General Public License, version 2,
-instead of to this License. (If a newer version than version 2 of the
-ordinary GNU General Public License has appeared, then you can specify
-that version instead if you wish.) Do not make any other change in
-these notices.
-
- Once this change is made in a given copy, it is irreversible for
-that copy, so the ordinary GNU General Public License applies to all
-subsequent copies and derivative works made from that copy.
-
- This option is useful when you wish to copy part of the code of
-the Library into a program that is not a library.
-
- 4. You may copy and distribute the Library (or a portion or
-derivative of it, under Section 2) in object code or executable form
-under the terms of Sections 1 and 2 above provided that you accompany
-it with the complete corresponding machine-readable source code, which
-must be distributed under the terms of Sections 1 and 2 above on a
-medium customarily used for software interchange.
-
- If distribution of object code is made by offering access to copy
-from a designated place, then offering equivalent access to copy the
-source code from the same place satisfies the requirement to
-distribute the source code, even though third parties are not
-compelled to copy the source along with the object code.
-
- 5. A program that contains no derivative of any portion of the
-Library, but is designed to work with the Library by being compiled or
-linked with it, is called a "work that uses the Library". Such a
-work, in isolation, is not a derivative work of the Library, and
-therefore falls outside the scope of this License.
-
- However, linking a "work that uses the Library" with the Library
-creates an executable that is a derivative of the Library (because it
-contains portions of the Library), rather than a "work that uses the
-library". The executable is therefore covered by this License.
-Section 6 states terms for distribution of such executables.
-
- When a "work that uses the Library" uses material from a header file
-that is part of the Library, the object code for the work may be a
-derivative work of the Library even though the source code is not.
-Whether this is true is especially significant if the work can be
-linked without the Library, or if the work is itself a library. The
-threshold for this to be true is not precisely defined by law.
-
- If such an object file uses only numerical parameters, data
-structure layouts and accessors, and small macros and small inline
-functions (ten lines or less in length), then the use of the object
-file is unrestricted, regardless of whether it is legally a derivative
-work. (Executables containing this object code plus portions of the
-Library will still fall under Section 6.)
-
- Otherwise, if the work is a derivative of the Library, you may
-distribute the object code for the work under the terms of Section 6.
-Any executables containing that work also fall under Section 6,
-whether or not they are linked directly with the Library itself.
-
- 6. As an exception to the Sections above, you may also combine or
-link a "work that uses the Library" with the Library to produce a
-work containing portions of the Library, and distribute that work
-under terms of your choice, provided that the terms permit
-modification of the work for the customer's own use and reverse
-engineering for debugging such modifications.
-
- You must give prominent notice with each copy of the work that the
-Library is used in it and that the Library and its use are covered by
-this License. You must supply a copy of this License. If the work
-during execution displays copyright notices, you must include the
-copyright notice for the Library among them, as well as a reference
-directing the user to the copy of this License. Also, you must do one
-of these things:
-
- a) Accompany the work with the complete corresponding
- machine-readable source code for the Library including whatever
- changes were used in the work (which must be distributed under
- Sections 1 and 2 above); and, if the work is an executable linked
- with the Library, with the complete machine-readable "work that
- uses the Library", as object code and/or source code, so that the
- user can modify the Library and then relink to produce a modified
- executable containing the modified Library. (It is understood
- that the user who changes the contents of definitions files in the
- Library will not necessarily be able to recompile the application
- to use the modified definitions.)
-
- b) Use a suitable shared library mechanism for linking with the
- Library. A suitable mechanism is one that (1) uses at run time a
- copy of the library already present on the user's computer system,
- rather than copying library functions into the executable, and (2)
- will operate properly with a modified version of the library, if
- the user installs one, as long as the modified version is
- interface-compatible with the version that the work was made with.
-
- c) Accompany the work with a written offer, valid for at
- least three years, to give the same user the materials
- specified in Subsection 6a, above, for a charge no more
- than the cost of performing this distribution.
-
- d) If distribution of the work is made by offering access to copy
- from a designated place, offer equivalent access to copy the above
- specified materials from the same place.
-
- e) Verify that the user has already received a copy of these
- materials or that you have already sent this user a copy.
-
- For an executable, the required form of the "work that uses the
-Library" must include any data and utility programs needed for
-reproducing the executable from it. However, as a special exception,
-the materials to be distributed need not include anything that is
-normally distributed (in either source or binary form) with the major
-components (compiler, kernel, and so on) of the operating system on
-which the executable runs, unless that component itself accompanies
-the executable.
-
- It may happen that this requirement contradicts the license
-restrictions of other proprietary libraries that do not normally
-accompany the operating system. Such a contradiction means you cannot
-use both them and the Library together in an executable that you
-distribute.
-
- 7. You may place library facilities that are a work based on the
-Library side-by-side in a single library together with other library
-facilities not covered by this License, and distribute such a combined
-library, provided that the separate distribution of the work based on
-the Library and of the other library facilities is otherwise
-permitted, and provided that you do these two things:
-
- a) Accompany the combined library with a copy of the same work
- based on the Library, uncombined with any other library
- facilities. This must be distributed under the terms of the
- Sections above.
-
- b) Give prominent notice with the combined library of the fact
- that part of it is a work based on the Library, and explaining
- where to find the accompanying uncombined form of the same work.
-
- 8. You may not copy, modify, sublicense, link with, or distribute
-the Library except as expressly provided under this License. Any
-attempt otherwise to copy, modify, sublicense, link with, or
-distribute the Library is void, and will automatically terminate your
-rights under this License. However, parties who have received copies,
-or rights, from you under this License will not have their licenses
-terminated so long as such parties remain in full compliance.
-
- 9. You are not required to accept this License, since you have not
-signed it. However, nothing else grants you permission to modify or
-distribute the Library or its derivative works. These actions are
-prohibited by law if you do not accept this License. Therefore, by
-modifying or distributing the Library (or any work based on the
-Library), you indicate your acceptance of this License to do so, and
-all its terms and conditions for copying, distributing or modifying
-the Library or works based on it.
-
- 10. Each time you redistribute the Library (or any work based on the
-Library), the recipient automatically receives a license from the
-original licensor to copy, distribute, link with or modify the Library
-subject to these terms and conditions. You may not impose any further
-restrictions on the recipients' exercise of the rights granted herein.
-You are not responsible for enforcing compliance by third parties with
-this License.
-
- 11. If, as a consequence of a court judgment or allegation of patent
-infringement or for any other reason (not limited to patent issues),
-conditions are imposed on you (whether by court order, agreement or
-otherwise) that contradict the conditions of this License, they do not
-excuse you from the conditions of this License. If you cannot
-distribute so as to satisfy simultaneously your obligations under this
-License and any other pertinent obligations, then as a consequence you
-may not distribute the Library at all. For example, if a patent
-license would not permit royalty-free redistribution of the Library by
-all those who receive copies directly or indirectly through you, then
-the only way you could satisfy both it and this License would be to
-refrain entirely from distribution of the Library.
-
-If any portion of this section is held invalid or unenforceable under any
-particular circumstance, the balance of the section is intended to apply,
-and the section as a whole is intended to apply in other circumstances.
-
-It is not the purpose of this section to induce you to infringe any
-patents or other property right claims or to contest validity of any
-such claims; this section has the sole purpose of protecting the
-integrity of the free software distribution system which is
-implemented by public license practices. Many people have made
-generous contributions to the wide range of software distributed
-through that system in reliance on consistent application of that
-system; it is up to the author/donor to decide if he or she is willing
-to distribute software through any other system and a licensee cannot
-impose that choice.
-
-This section is intended to make thoroughly clear what is believed to
-be a consequence of the rest of this License.
-
- 12. If the distribution and/or use of the Library is restricted in
-certain countries either by patents or by copyrighted interfaces, the
-original copyright holder who places the Library under this License may add
-an explicit geographical distribution limitation excluding those countries,
-so that distribution is permitted only in or among countries not thus
-excluded. In such case, this License incorporates the limitation as if
-written in the body of this License.
-
- 13. The Free Software Foundation may publish revised and/or new
-versions of the Lesser General Public License from time to time.
-Such new versions will be similar in spirit to the present version,
-but may differ in detail to address new problems or concerns.
-
-Each version is given a distinguishing version number. If the Library
-specifies a version number of this License which applies to it and
-"any later version", you have the option of following the terms and
-conditions either of that version or of any later version published by
-the Free Software Foundation. If the Library does not specify a
-license version number, you may choose any version ever published by
-the Free Software Foundation.
-
- 14. If you wish to incorporate parts of the Library into other free
-programs whose distribution conditions are incompatible with these,
-write to the author to ask for permission. For software which is
-copyrighted by the Free Software Foundation, write to the Free
-Software Foundation; we sometimes make exceptions for this. Our
-decision will be guided by the two goals of preserving the free status
-of all derivatives of our free software and of promoting the sharing
-and reuse of software generally.
-
- NO WARRANTY
-
- 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
-WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
-EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
-OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
-KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
-LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
-THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
-
- 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
-WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
-AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
-FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
-CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
-LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
-RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
-FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
-SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
-DAMAGES.
-
- END OF TERMS AND CONDITIONS
-
- How to Apply These Terms to Your New Libraries
-
- If you develop a new library, and you want it to be of the greatest
-possible use to the public, we recommend making it free software that
-everyone can redistribute and change. You can do so by permitting
-redistribution under these terms (or, alternatively, under the terms of the
-ordinary General Public License).
-
- To apply these terms, attach the following notices to the library. It is
-safest to attach them to the start of each source file to most effectively
-convey the exclusion of warranty; and each file should have at least the
-"copyright" line and a pointer to where the full notice is found.
-
- <one line to give the library's name and a brief idea of what it does.>
- Copyright (C) <year> <name of author>
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, write to the Free Software
- Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
-
-Also add information on how to contact you by electronic and paper mail.
-
-You should also get your employer (if you work as a programmer) or your
-school, if any, to sign a "copyright disclaimer" for the library, if
-necessary. Here is a sample; alter the names:
-
- Yoyodyne, Inc., hereby disclaims all copyright interest in the
- library `Frob' (a library for tweaking knobs) written by James Random Hacker.
-
- <signature of Ty Coon>, 1 April 1990
- Ty Coon, President of Vice
-
-That's all there is to it!
-
-
diff --git a/shared/inotify/LICENSE-X11 b/shared/inotify/LICENSE-X11
deleted file mode 100644
index c2db7930..00000000
--- a/shared/inotify/LICENSE-X11
+++ /dev/null
@@ -1,22 +0,0 @@
-Copyright (c) 2006, 2007, 2009 Lukas Jelinek
-
-Permission is hereby granted, free of charge, to any person
-obtaining a copy of this software and associated documentation
-files (the "Software"), to deal in the Software without
-restriction, including without limitation the rights to use,
-copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the
-Software is furnished to do so, subject to the following
-conditions:
-
-The above copyright notice and this permission notice shall be
-included in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
-OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
-OTHER DEALINGS IN THE SOFTWARE.
diff --git a/shared/inotify/README b/shared/inotify/README
deleted file mode 100644
index 2e8e2aa2..00000000
--- a/shared/inotify/README
+++ /dev/null
@@ -1,70 +0,0 @@
-
-inotify C++ interface
-
-(c) Lukas Jelinek, 2006, 2007, 2009
-
-1. About
-2. Requirements
-3. How to use
-4. Bugs, suggestions
-5. Licensing
-6. Documentation
-
-
-========================================================================
-
-
-1. About
-This program is the inotify C++ interface. It is designed for easy use
-of Linux inotify technology in C++ applications. You need not to deal
-with file descriptors and such uncomfortable things. Instead you can
-use a few simple C++ classes.
-
-
-2. Requirements
-* Linux kernel 2.6.13 or later (with inotify compiled in)
-* inotify header(s) installed in <INCLUDE_DIR>/sys. The most common
- place is /usr/include/sys. Some Linux distributions contain only
- inotify.h which defines everything needed. But sometimes must
- be used inotify.h and inotify-syscalls.h as available e.g. at
- the inotify-cxx homepage.
-* GCC 4.x compiler (probably works also with GCC 3.4, possibly with
- older versions too)
-
-
-3. How to use
-Include inotify-cxx.h into your sources and add inotify-cxx.cpp for
-compiling (e.g. through your makefile).
-
-If you have installed it into your system-wide include dir (e.g.
-/usr/include), use #include <inotify-cxx.h> or similar.
-Otherwise use #include "inotify-cxx.h".
-
-For thread-safe behavior, define the INOTIFY_THREAD_SAFE symbol
-(eg. -DINOTIFY_THREAD_SAFE on gcc's command line). See documentation
-for details about thread safety.
-
-
-4. Bugs, suggestions
-THIS PROGRAM IS AN ALPHA VERSION. IT PROBABLY CONTAINS BUGS AND
-THEREFORE IT IS NOT INTENDED FOR PRODUCTION USE.
-
-If you find a bug or have a suggestion how to improve the program,
-please use the bug tracking system at http://bts.aiken.cz.
-
-
-5. Licensing
-This program is free software; you can redistribute it and/or
-modify it under the terms of one of the following licenses:
-
-1. X11 license (see LICENSE-X11)
-2. GNU Lesser General Public License, version 2.1 (see LICENSE-LGPL)
-3. GNU General Public License, version 2 (see LICENSE-GPL)
-
-If you want to help with choosing the best license for you,
-please visit http://www.gnu.org/licenses/license-list.html.
-
-
-6. Documentation
-The API reference documentation is present in the HTML and man format.
-It was generated using the doxygen program.
diff --git a/shared/inotify/TODO b/shared/inotify/TODO
deleted file mode 100644
index 7d493c05..00000000
--- a/shared/inotify/TODO
+++ /dev/null
@@ -1,3 +0,0 @@
-Currently pending tasks:
-
-* recursive watches (for watching whole directory subtrees)
diff --git a/shared/inotify/doc/html/annotated.html b/shared/inotify/doc/html/annotated.html
deleted file mode 100644
index 4f67400b..00000000
--- a/shared/inotify/doc/html/annotated.html
+++ /dev/null
@@ -1,34 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
-<title>inotify-cxx: Class List</title>
-<link href="tabs.css" rel="stylesheet" type="text/css">
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.5.9 -->
-<div class="navigation" id="top">
- <div class="tabs">
- <ul>
- <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
- <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
- <li><a href="files.html"><span>Files</span></a></li>
- </ul>
- </div>
- <div class="tabs">
- <ul>
- <li class="current"><a href="annotated.html"><span>Class&nbsp;List</span></a></li>
- <li><a href="functions.html"><span>Class&nbsp;Members</span></a></li>
- </ul>
- </div>
-</div>
-<div class="contents">
-<h1>Class List</h1>Here are the classes, structs, unions and interfaces with brief descriptions:<table>
- <tr><td class="indexkey"><a class="el" href="classInotify.html">Inotify</a></td><td class="indexvalue"><a class="el" href="classInotify.html" title="inotify class">Inotify</a> class </td></tr>
- <tr><td class="indexkey"><a class="el" href="classInotifyEvent.html">InotifyEvent</a></td><td class="indexvalue"><a class="el" href="classInotify.html" title="inotify class">Inotify</a> event class </td></tr>
- <tr><td class="indexkey"><a class="el" href="classInotifyException.html">InotifyException</a></td><td class="indexvalue">Class for inotify exceptions </td></tr>
- <tr><td class="indexkey"><a class="el" href="classInotifyWatch.html">InotifyWatch</a></td><td class="indexvalue"><a class="el" href="classInotify.html" title="inotify class">Inotify</a> watch class </td></tr>
-</table>
-</div>
-<hr size="1"><address style="text-align: right;"><small><a href="http://www.doxygen.org/index.html">
-<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> </small></address>
-</body>
-</html>
diff --git a/shared/inotify/doc/html/classInotify-members.html b/shared/inotify/doc/html/classInotify-members.html
deleted file mode 100644
index 3370bb6c..00000000
--- a/shared/inotify/doc/html/classInotify-members.html
+++ /dev/null
@@ -1,65 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
-<title>inotify-cxx: Member List</title>
-<link href="tabs.css" rel="stylesheet" type="text/css">
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.5.9 -->
-<div class="navigation" id="top">
- <div class="tabs">
- <ul>
- <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
- <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
- <li><a href="files.html"><span>Files</span></a></li>
- </ul>
- </div>
- <div class="tabs">
- <ul>
- <li><a href="annotated.html"><span>Class&nbsp;List</span></a></li>
- <li><a href="functions.html"><span>Class&nbsp;Members</span></a></li>
- </ul>
- </div>
-</div>
-<div class="contents">
-<h1>Inotify Member List</h1>This is the complete list of members for <a class="el" href="classInotify.html">Inotify</a>, including all inherited members.<p><table>
- <tr class="memlist"><td><a class="el" href="classInotify.html#2ef771ebaf982d76ebe19b3f5bc9cd83">Add</a>(InotifyWatch *pWatch)</td><td><a class="el" href="classInotify.html">Inotify</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="classInotify.html#35dab56d3e10bf28b5e457871adddb58">Add</a>(InotifyWatch &amp;rWatch)</td><td><a class="el" href="classInotify.html">Inotify</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="classInotify.html#86ae86c43ea1a72f562ca46393309635">Close</a>()</td><td><a class="el" href="classInotify.html">Inotify</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="classInotify.html#182d19b667c9e0899802b70a579eff40">FindWatch</a>(int iDescriptor)</td><td><a class="el" href="classInotify.html">Inotify</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="classInotify.html#a4d6b9d1a9a496862febbe5bffd798c2">FindWatch</a>(const std::string &amp;rPath)</td><td><a class="el" href="classInotify.html">Inotify</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="classInotify.html#70b3b57e8661fbb4c5bc404b86225c3b">GetCapability</a>(InotifyCapability_t cap)</td><td><a class="el" href="classInotify.html">Inotify</a></td><td><code> [static]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="classInotify.html#0233ddfe40844d729505fdfd709d22cc">GetCapabilityPath</a>(InotifyCapability_t cap)</td><td><a class="el" href="classInotify.html">Inotify</a></td><td><code> [private, static]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="classInotify.html#abab7015203bf36d0256e75d4f4861f9">GetDescriptor</a>() const </td><td><a class="el" href="classInotify.html">Inotify</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="classInotify.html#6f432affb46f85f7bc19661d5bc77063">GetEnabledCount</a>() const </td><td><a class="el" href="classInotify.html">Inotify</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="classInotify.html#490a3f824c6d041d31ccaabe9bd92008">GetEvent</a>(InotifyEvent *pEvt)</td><td><a class="el" href="classInotify.html">Inotify</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="classInotify.html#b028c8fa988f6bbb2ef773db3ea3a2d3">GetEvent</a>(InotifyEvent &amp;rEvt)</td><td><a class="el" href="classInotify.html">Inotify</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="classInotify.html#a3c533f956871f904949832ac8f5fbde">GetEventCount</a>()</td><td><a class="el" href="classInotify.html">Inotify</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="classInotify.html#d8e4a4a87d005c71c0b5ea9c6dd53c42">GetMaxEvents</a>()</td><td><a class="el" href="classInotify.html">Inotify</a></td><td><code> [inline, static]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="classInotify.html#c18b7732f67832260fbbd47aebb8af51">GetMaxInstances</a>()</td><td><a class="el" href="classInotify.html">Inotify</a></td><td><code> [inline, static]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="classInotify.html#86dae1b7a72c0d8fc2a632444a0f2f1f">GetMaxWatches</a>()</td><td><a class="el" href="classInotify.html">Inotify</a></td><td><code> [inline, static]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="classInotify.html#716ae90a00dd4895709ea9b8f7959075">GetWatchCount</a>() const </td><td><a class="el" href="classInotify.html">Inotify</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="classInotify.html#a6fe6e9cb3343665eb968fcd5170cfb9">Inotify</a>()</td><td><a class="el" href="classInotify.html">Inotify</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="classInotify.html#10880f490c33acd8bd24664fc7bce4ae">InotifyWatch</a> class</td><td><a class="el" href="classInotify.html">Inotify</a></td><td><code> [friend]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="classInotify.html#eee7847efd93b681fddac56860fc7958">m_buf</a></td><td><a class="el" href="classInotify.html">Inotify</a></td><td><code> [private]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="classInotify.html#0c1d6c969292dbb7c8c1283a3d8f55e0">m_events</a></td><td><a class="el" href="classInotify.html">Inotify</a></td><td><code> [private]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="classInotify.html#95d6d0ecefff77bd3ee50f1586a4552b">m_fd</a></td><td><a class="el" href="classInotify.html">Inotify</a></td><td><code> [private]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="classInotify.html#62f275db6375a366023b2e46f73e3ecc">m_paths</a></td><td><a class="el" href="classInotify.html">Inotify</a></td><td><code> [private]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="classInotify.html#4d07f3a4412028d687936d2479d9a976">m_watches</a></td><td><a class="el" href="classInotify.html">Inotify</a></td><td><code> [private]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="classInotify.html#19cde43d082ff92bd02654610019300d">PeekEvent</a>(InotifyEvent *pEvt)</td><td><a class="el" href="classInotify.html">Inotify</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="classInotify.html#287dc0d238fa6edc3269441cb284f979">PeekEvent</a>(InotifyEvent &amp;rEvt)</td><td><a class="el" href="classInotify.html">Inotify</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="classInotify.html#21c39bb8e5bbc1941b945c18f9005b84">Remove</a>(InotifyWatch *pWatch)</td><td><a class="el" href="classInotify.html">Inotify</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="classInotify.html#ac1a52b2ff6bfec07021a44e55d496a6">Remove</a>(InotifyWatch &amp;rWatch)</td><td><a class="el" href="classInotify.html">Inotify</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="classInotify.html#bc1fd5830ca561efb69bcd2283981741">RemoveAll</a>()</td><td><a class="el" href="classInotify.html">Inotify</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="classInotify.html#734538233ba2136164f76f4df6c3654e">SetCapability</a>(InotifyCapability_t cap, uint32_t val)</td><td><a class="el" href="classInotify.html">Inotify</a></td><td><code> [static]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="classInotify.html#124dd5816205900af61034d47ae65255">SetCloseOnExec</a>(bool fClOnEx)</td><td><a class="el" href="classInotify.html">Inotify</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="classInotify.html#66d90ebfa516d4bd1463749def2b58f9">SetMaxEvents</a>(uint32_t val)</td><td><a class="el" href="classInotify.html">Inotify</a></td><td><code> [inline, static]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="classInotify.html#620c891962fe5acd26485c64e9b28d19">SetMaxInstances</a>(uint32_t val)</td><td><a class="el" href="classInotify.html">Inotify</a></td><td><code> [inline, static]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="classInotify.html#5064380cdb4a726ab33f3fa18d15c77a">SetMaxWatches</a>(uint32_t val)</td><td><a class="el" href="classInotify.html">Inotify</a></td><td><code> [inline, static]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="classInotify.html#b2c8ab8ad4322fb6f0dae0eae442402b">SetNonBlock</a>(bool fNonBlock)</td><td><a class="el" href="classInotify.html">Inotify</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="classInotify.html#139c27c6643bb199619f3eae9b32e53b">WaitForEvents</a>(bool fNoIntr=false)</td><td><a class="el" href="classInotify.html">Inotify</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="classInotify.html#f19dd5e491395673e4798eb9dbf5f682">~Inotify</a>()</td><td><a class="el" href="classInotify.html">Inotify</a></td><td></td></tr>
-</table></div>
-<hr size="1"><address style="text-align: right;"><small><a href="http://www.doxygen.org/index.html">
-<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> </small></address>
-</body>
-</html>
diff --git a/shared/inotify/doc/html/classInotify.html b/shared/inotify/doc/html/classInotify.html
deleted file mode 100644
index 1842796c..00000000
--- a/shared/inotify/doc/html/classInotify.html
+++ /dev/null
@@ -1,1218 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
-<title>inotify-cxx: Inotify Class Reference</title>
-<link href="tabs.css" rel="stylesheet" type="text/css">
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.5.9 -->
-<div class="navigation" id="top">
- <div class="tabs">
- <ul>
- <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
- <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
- <li><a href="files.html"><span>Files</span></a></li>
- </ul>
- </div>
- <div class="tabs">
- <ul>
- <li><a href="annotated.html"><span>Class&nbsp;List</span></a></li>
- <li><a href="functions.html"><span>Class&nbsp;Members</span></a></li>
- </ul>
- </div>
-</div>
-<div class="contents">
-<h1>Inotify Class Reference</h1><!-- doxytag: class="Inotify" -->inotify class
-<a href="#_details">More...</a>
-<p>
-<code>#include &lt;<a class="el" href="inotify-cxx_8h_source.html">inotify-cxx.h</a>&gt;</code>
-<p>
-
-<p>
-<a href="classInotify-members.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
-<tr><td></td></tr>
-<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classInotify.html#a6fe6e9cb3343665eb968fcd5170cfb9">Inotify</a> () throw (InotifyException)</td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Constructor. <a href="#a6fe6e9cb3343665eb968fcd5170cfb9"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classInotify.html#f19dd5e491395673e4798eb9dbf5f682">~Inotify</a> ()</td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Destructor. <a href="#f19dd5e491395673e4798eb9dbf5f682"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classInotify.html#86ae86c43ea1a72f562ca46393309635">Close</a> ()</td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Removes all watches and closes the inotify device. <a href="#86ae86c43ea1a72f562ca46393309635"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classInotify.html#2ef771ebaf982d76ebe19b3f5bc9cd83">Add</a> (<a class="el" href="classInotifyWatch.html">InotifyWatch</a> *pWatch) throw (InotifyException)</td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Adds a new watch. <a href="#2ef771ebaf982d76ebe19b3f5bc9cd83"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classInotify.html#35dab56d3e10bf28b5e457871adddb58">Add</a> (<a class="el" href="classInotifyWatch.html">InotifyWatch</a> &amp;rWatch) throw (InotifyException)</td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Adds a new watch. <a href="#35dab56d3e10bf28b5e457871adddb58"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classInotify.html#21c39bb8e5bbc1941b945c18f9005b84">Remove</a> (<a class="el" href="classInotifyWatch.html">InotifyWatch</a> *pWatch) throw (InotifyException)</td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Removes a watch. <a href="#21c39bb8e5bbc1941b945c18f9005b84"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classInotify.html#ac1a52b2ff6bfec07021a44e55d496a6">Remove</a> (<a class="el" href="classInotifyWatch.html">InotifyWatch</a> &amp;rWatch) throw (InotifyException)</td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Removes a watch. <a href="#ac1a52b2ff6bfec07021a44e55d496a6"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classInotify.html#bc1fd5830ca561efb69bcd2283981741">RemoveAll</a> ()</td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Removes all watches. <a href="#bc1fd5830ca561efb69bcd2283981741"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">size_t&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classInotify.html#716ae90a00dd4895709ea9b8f7959075">GetWatchCount</a> () const </td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Returns the count of watches. <a href="#716ae90a00dd4895709ea9b8f7959075"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">size_t&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classInotify.html#6f432affb46f85f7bc19661d5bc77063">GetEnabledCount</a> () const </td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Returns the count of enabled watches. <a href="#6f432affb46f85f7bc19661d5bc77063"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classInotify.html#139c27c6643bb199619f3eae9b32e53b">WaitForEvents</a> (bool fNoIntr=false) throw (InotifyException)</td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Waits for inotify events. <a href="#139c27c6643bb199619f3eae9b32e53b"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">size_t&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classInotify.html#a3c533f956871f904949832ac8f5fbde">GetEventCount</a> ()</td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Returns the count of received and queued events. <a href="#a3c533f956871f904949832ac8f5fbde"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">bool&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classInotify.html#490a3f824c6d041d31ccaabe9bd92008">GetEvent</a> (<a class="el" href="classInotifyEvent.html">InotifyEvent</a> *pEvt) throw (InotifyException)</td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Extracts a queued inotify event. <a href="#490a3f824c6d041d31ccaabe9bd92008"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">bool&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classInotify.html#b028c8fa988f6bbb2ef773db3ea3a2d3">GetEvent</a> (<a class="el" href="classInotifyEvent.html">InotifyEvent</a> &amp;rEvt) throw (InotifyException)</td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Extracts a queued inotify event. <a href="#b028c8fa988f6bbb2ef773db3ea3a2d3"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">bool&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classInotify.html#19cde43d082ff92bd02654610019300d">PeekEvent</a> (<a class="el" href="classInotifyEvent.html">InotifyEvent</a> *pEvt) throw (InotifyException)</td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Extracts a queued inotify event (without removing). <a href="#19cde43d082ff92bd02654610019300d"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">bool&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classInotify.html#287dc0d238fa6edc3269441cb284f979">PeekEvent</a> (<a class="el" href="classInotifyEvent.html">InotifyEvent</a> &amp;rEvt) throw (InotifyException)</td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Extracts a queued inotify event (without removing). <a href="#287dc0d238fa6edc3269441cb284f979"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="el" href="classInotifyWatch.html">InotifyWatch</a> *&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classInotify.html#182d19b667c9e0899802b70a579eff40">FindWatch</a> (int iDescriptor)</td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Searches for a watch by a watch descriptor. <a href="#182d19b667c9e0899802b70a579eff40"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="el" href="classInotifyWatch.html">InotifyWatch</a> *&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classInotify.html#a4d6b9d1a9a496862febbe5bffd798c2">FindWatch</a> (const std::string &amp;rPath)</td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Searches for a watch by a filesystem path. <a href="#a4d6b9d1a9a496862febbe5bffd798c2"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">int&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classInotify.html#abab7015203bf36d0256e75d4f4861f9">GetDescriptor</a> () const </td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Returns the file descriptor. <a href="#abab7015203bf36d0256e75d4f4861f9"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classInotify.html#b2c8ab8ad4322fb6f0dae0eae442402b">SetNonBlock</a> (bool fNonBlock) throw (InotifyException)</td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Enables/disables non-blocking mode. <a href="#b2c8ab8ad4322fb6f0dae0eae442402b"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classInotify.html#124dd5816205900af61034d47ae65255">SetCloseOnExec</a> (bool fClOnEx) throw (InotifyException)</td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Enables/disables closing on exec. <a href="#124dd5816205900af61034d47ae65255"></a><br></td></tr>
-<tr><td colspan="2"><br><h2>Static Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">static uint32_t&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classInotify.html#70b3b57e8661fbb4c5bc404b86225c3b">GetCapability</a> (<a class="el" href="inotify-cxx_8h.html#bccd39d32dd83905178cf42edaae5c4d">InotifyCapability_t</a> cap) throw (InotifyException)</td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Acquires a particular inotify capability/limit. <a href="#70b3b57e8661fbb4c5bc404b86225c3b"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">static void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classInotify.html#734538233ba2136164f76f4df6c3654e">SetCapability</a> (<a class="el" href="inotify-cxx_8h.html#bccd39d32dd83905178cf42edaae5c4d">InotifyCapability_t</a> cap, uint32_t val) throw (InotifyException)</td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Modifies a particular inotify capability/limit. <a href="#734538233ba2136164f76f4df6c3654e"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">static uint32_t&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classInotify.html#d8e4a4a87d005c71c0b5ea9c6dd53c42">GetMaxEvents</a> () throw (InotifyException)</td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Returns the maximum number of events in the kernel queue. <a href="#d8e4a4a87d005c71c0b5ea9c6dd53c42"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">static void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classInotify.html#66d90ebfa516d4bd1463749def2b58f9">SetMaxEvents</a> (uint32_t val) throw (InotifyException)</td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Sets the maximum number of events in the kernel queue. <a href="#66d90ebfa516d4bd1463749def2b58f9"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">static uint32_t&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classInotify.html#c18b7732f67832260fbbd47aebb8af51">GetMaxInstances</a> () throw (InotifyException)</td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Returns the maximum number of inotify instances per process. <a href="#c18b7732f67832260fbbd47aebb8af51"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">static void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classInotify.html#620c891962fe5acd26485c64e9b28d19">SetMaxInstances</a> (uint32_t val) throw (InotifyException)</td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Sets the maximum number of inotify instances per process. <a href="#620c891962fe5acd26485c64e9b28d19"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">static uint32_t&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classInotify.html#86dae1b7a72c0d8fc2a632444a0f2f1f">GetMaxWatches</a> () throw (InotifyException)</td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Returns the maximum number of inotify watches per instance. <a href="#86dae1b7a72c0d8fc2a632444a0f2f1f"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">static void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classInotify.html#5064380cdb4a726ab33f3fa18d15c77a">SetMaxWatches</a> (uint32_t val) throw (InotifyException)</td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Sets the maximum number of inotify watches per instance. <a href="#5064380cdb4a726ab33f3fa18d15c77a"></a><br></td></tr>
-<tr><td colspan="2"><br><h2>Static Private Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">static std::string&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classInotify.html#0233ddfe40844d729505fdfd709d22cc">GetCapabilityPath</a> (<a class="el" href="inotify-cxx_8h.html#bccd39d32dd83905178cf42edaae5c4d">InotifyCapability_t</a> cap) throw (InotifyException)</td></tr>
-
-<tr><td colspan="2"><br><h2>Private Attributes</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">int&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classInotify.html#95d6d0ecefff77bd3ee50f1586a4552b">m_fd</a></td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">file descriptor <a href="#95d6d0ecefff77bd3ee50f1586a4552b"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="el" href="inotify-cxx_8h.html#e6b5ebcb4e0d6a9f5ca8da26bc00cc2a">IN_WATCH_MAP</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classInotify.html#4d07f3a4412028d687936d2479d9a976">m_watches</a></td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">watches (by descriptors) <a href="#4d07f3a4412028d687936d2479d9a976"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="el" href="inotify-cxx_8h.html#5dd7761ff5a6b7cc7271950aebb7ddf6">IN_WP_MAP</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classInotify.html#62f275db6375a366023b2e46f73e3ecc">m_paths</a></td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">watches (by paths) <a href="#62f275db6375a366023b2e46f73e3ecc"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">unsigned char&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classInotify.html#eee7847efd93b681fddac56860fc7958">m_buf</a> [INOTIFY_BUFLEN]</td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">buffer for events <a href="#eee7847efd93b681fddac56860fc7958"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">std::deque&lt; <a class="el" href="classInotifyEvent.html">InotifyEvent</a> &gt;&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classInotify.html#0c1d6c969292dbb7c8c1283a3d8f55e0">m_events</a></td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">event queue <a href="#0c1d6c969292dbb7c8c1283a3d8f55e0"></a><br></td></tr>
-<tr><td colspan="2"><br><h2>Friends</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classInotify.html#10880f490c33acd8bd24664fc7bce4ae">InotifyWatch</a></td></tr>
-
-</table>
-<hr><a name="_details"></a><h2>Detailed Description</h2>
-inotify class
-<p>
-It holds information about the inotify device descriptor and manages the event queue.<p>
-If the INOTIFY_THREAD_SAFE is defined this class is thread-safe. <hr><h2>Constructor &amp; Destructor Documentation</h2>
-<a class="anchor" name="a6fe6e9cb3343665eb968fcd5170cfb9"></a><!-- doxytag: member="Inotify::Inotify" ref="a6fe6e9cb3343665eb968fcd5170cfb9" args="()" -->
-<div class="memitem">
-<div class="memproto">
- <table class="memname">
- <tr>
- <td class="memname">Inotify::Inotify </td>
- <td>(</td>
- <td class="paramname"> </td>
- <td>&nbsp;)&nbsp;</td>
- <td> throw (<a class="el" href="classInotifyException.html">InotifyException</a>)</td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Constructor.
-<p>
-Creates and initializes an instance of inotify communication object (opens the inotify device).<p>
-<dl compact><dt><b>Exceptions:</b></dt><dd>
- <table border="0" cellspacing="2" cellpadding="0">
- <tr><td valign="top"></td><td valign="top"><em><a class="el" href="classInotifyException.html" title="Class for inotify exceptions.">InotifyException</a></em>&nbsp;</td><td>thrown if inotify isn't available </td></tr>
- </table>
-</dl>
-
-</div>
-</div><p>
-<a class="anchor" name="f19dd5e491395673e4798eb9dbf5f682"></a><!-- doxytag: member="Inotify::~Inotify" ref="f19dd5e491395673e4798eb9dbf5f682" args="()" -->
-<div class="memitem">
-<div class="memproto">
- <table class="memname">
- <tr>
- <td class="memname">Inotify::~Inotify </td>
- <td>(</td>
- <td class="paramname"> </td>
- <td>&nbsp;)&nbsp;</td>
- <td></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Destructor.
-<p>
-Calls <a class="el" href="classInotify.html#86ae86c43ea1a72f562ca46393309635" title="Removes all watches and closes the inotify device.">Close()</a> due to clean-up.
-</div>
-</div><p>
-<hr><h2>Member Function Documentation</h2>
-<a class="anchor" name="35dab56d3e10bf28b5e457871adddb58"></a><!-- doxytag: member="Inotify::Add" ref="35dab56d3e10bf28b5e457871adddb58" args="(InotifyWatch &amp;rWatch)" -->
-<div class="memitem">
-<div class="memproto">
- <table class="memname">
- <tr>
- <td class="memname">void Inotify::Add </td>
- <td>(</td>
- <td class="paramtype"><a class="el" href="classInotifyWatch.html">InotifyWatch</a> &amp;&nbsp;</td>
- <td class="paramname"> <em>rWatch</em> </td>
- <td>&nbsp;)&nbsp;</td>
- <td> throw (<a class="el" href="classInotifyException.html">InotifyException</a>)<code> [inline]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Adds a new watch.
-<p>
-<dl compact><dt><b>Parameters:</b></dt><dd>
- <table border="0" cellspacing="2" cellpadding="0">
- <tr><td valign="top"><tt>[in]</tt>&nbsp;</td><td valign="top"><em>rWatch</em>&nbsp;</td><td>inotify watch</td></tr>
- </table>
-</dl>
-<dl compact><dt><b>Exceptions:</b></dt><dd>
- <table border="0" cellspacing="2" cellpadding="0">
- <tr><td valign="top"></td><td valign="top"><em><a class="el" href="classInotifyException.html" title="Class for inotify exceptions.">InotifyException</a></em>&nbsp;</td><td>thrown if adding failed </td></tr>
- </table>
-</dl>
-
-</div>
-</div><p>
-<a class="anchor" name="2ef771ebaf982d76ebe19b3f5bc9cd83"></a><!-- doxytag: member="Inotify::Add" ref="2ef771ebaf982d76ebe19b3f5bc9cd83" args="(InotifyWatch *pWatch)" -->
-<div class="memitem">
-<div class="memproto">
- <table class="memname">
- <tr>
- <td class="memname">void Inotify::Add </td>
- <td>(</td>
- <td class="paramtype"><a class="el" href="classInotifyWatch.html">InotifyWatch</a> *&nbsp;</td>
- <td class="paramname"> <em>pWatch</em> </td>
- <td>&nbsp;)&nbsp;</td>
- <td> throw (<a class="el" href="classInotifyException.html">InotifyException</a>)</td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Adds a new watch.
-<p>
-<dl compact><dt><b>Parameters:</b></dt><dd>
- <table border="0" cellspacing="2" cellpadding="0">
- <tr><td valign="top"><tt>[in]</tt>&nbsp;</td><td valign="top"><em>pWatch</em>&nbsp;</td><td>inotify watch</td></tr>
- </table>
-</dl>
-<dl compact><dt><b>Exceptions:</b></dt><dd>
- <table border="0" cellspacing="2" cellpadding="0">
- <tr><td valign="top"></td><td valign="top"><em><a class="el" href="classInotifyException.html" title="Class for inotify exceptions.">InotifyException</a></em>&nbsp;</td><td>thrown if adding failed </td></tr>
- </table>
-</dl>
-
-<p>
-<div class="dynheader">
-Here is the caller graph for this function:</div>
-<div class="dynsection">
-<p><center><img src="classInotify_2ef771ebaf982d76ebe19b3f5bc9cd83_icgraph.png" border="0" usemap="#classInotify_2ef771ebaf982d76ebe19b3f5bc9cd83_icgraph_map" alt=""></center>
-<map name="classInotify_2ef771ebaf982d76ebe19b3f5bc9cd83_icgraph_map">
-<area shape="rect" href="classInotify.html#35dab56d3e10bf28b5e457871adddb58" title="Adds a new watch." alt="" coords="143,5,228,32"></map>
-</div>
-
-</div>
-</div><p>
-<a class="anchor" name="86ae86c43ea1a72f562ca46393309635"></a><!-- doxytag: member="Inotify::Close" ref="86ae86c43ea1a72f562ca46393309635" args="()" -->
-<div class="memitem">
-<div class="memproto">
- <table class="memname">
- <tr>
- <td class="memname">void Inotify::Close </td>
- <td>(</td>
- <td class="paramname"> </td>
- <td>&nbsp;)&nbsp;</td>
- <td></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Removes all watches and closes the inotify device.
-<p>
-
-<p>
-<div class="dynheader">
-Here is the caller graph for this function:</div>
-<div class="dynsection">
-<p><center><img src="classInotify_86ae86c43ea1a72f562ca46393309635_icgraph.png" border="0" usemap="#classInotify_86ae86c43ea1a72f562ca46393309635_icgraph_map" alt=""></center>
-<map name="classInotify_86ae86c43ea1a72f562ca46393309635_icgraph_map">
-<area shape="rect" href="classInotify.html#f19dd5e491395673e4798eb9dbf5f682" title="Destructor." alt="" coords="151,5,255,32"></map>
-</div>
-
-</div>
-</div><p>
-<a class="anchor" name="a4d6b9d1a9a496862febbe5bffd798c2"></a><!-- doxytag: member="Inotify::FindWatch" ref="a4d6b9d1a9a496862febbe5bffd798c2" args="(const std::string &amp;rPath)" -->
-<div class="memitem">
-<div class="memproto">
- <table class="memname">
- <tr>
- <td class="memname"><a class="el" href="classInotifyWatch.html">InotifyWatch</a> * Inotify::FindWatch </td>
- <td>(</td>
- <td class="paramtype">const std::string &amp;&nbsp;</td>
- <td class="paramname"> <em>rPath</em> </td>
- <td>&nbsp;)&nbsp;</td>
- <td></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Searches for a watch by a filesystem path.
-<p>
-It tries to find a watch by the given filesystem path.<p>
-<dl compact><dt><b>Parameters:</b></dt><dd>
- <table border="0" cellspacing="2" cellpadding="0">
- <tr><td valign="top"><tt>[in]</tt>&nbsp;</td><td valign="top"><em>rPath</em>&nbsp;</td><td>filesystem path </td></tr>
- </table>
-</dl>
-<dl class="return" compact><dt><b>Returns:</b></dt><dd>pointer to a watch; NULL if no such watch exists</dd></dl>
-<dl class="attention" compact><dt><b>Attention:</b></dt><dd>The path must be exactly identical to the one used for the searched watch. Be careful about absolute/relative and case-insensitive paths. </dd></dl>
-
-</div>
-</div><p>
-<a class="anchor" name="182d19b667c9e0899802b70a579eff40"></a><!-- doxytag: member="Inotify::FindWatch" ref="182d19b667c9e0899802b70a579eff40" args="(int iDescriptor)" -->
-<div class="memitem">
-<div class="memproto">
- <table class="memname">
- <tr>
- <td class="memname"><a class="el" href="classInotifyWatch.html">InotifyWatch</a> * Inotify::FindWatch </td>
- <td>(</td>
- <td class="paramtype">int&nbsp;</td>
- <td class="paramname"> <em>iDescriptor</em> </td>
- <td>&nbsp;)&nbsp;</td>
- <td></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Searches for a watch by a watch descriptor.
-<p>
-It tries to find a watch by the given descriptor.<p>
-<dl compact><dt><b>Parameters:</b></dt><dd>
- <table border="0" cellspacing="2" cellpadding="0">
- <tr><td valign="top"><tt>[in]</tt>&nbsp;</td><td valign="top"><em>iDescriptor</em>&nbsp;</td><td>watch descriptor </td></tr>
- </table>
-</dl>
-<dl class="return" compact><dt><b>Returns:</b></dt><dd>pointer to a watch; NULL if no such watch exists </dd></dl>
-
-</div>
-</div><p>
-<a class="anchor" name="70b3b57e8661fbb4c5bc404b86225c3b"></a><!-- doxytag: member="Inotify::GetCapability" ref="70b3b57e8661fbb4c5bc404b86225c3b" args="(InotifyCapability_t cap)" -->
-<div class="memitem">
-<div class="memproto">
- <table class="memname">
- <tr>
- <td class="memname">uint32_t Inotify::GetCapability </td>
- <td>(</td>
- <td class="paramtype"><a class="el" href="inotify-cxx_8h.html#bccd39d32dd83905178cf42edaae5c4d">InotifyCapability_t</a>&nbsp;</td>
- <td class="paramname"> <em>cap</em> </td>
- <td>&nbsp;)&nbsp;</td>
- <td> throw (<a class="el" href="classInotifyException.html">InotifyException</a>)<code> [static]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Acquires a particular inotify capability/limit.
-<p>
-<dl compact><dt><b>Parameters:</b></dt><dd>
- <table border="0" cellspacing="2" cellpadding="0">
- <tr><td valign="top"><tt>[in]</tt>&nbsp;</td><td valign="top"><em>cap</em>&nbsp;</td><td>capability/limit identifier </td></tr>
- </table>
-</dl>
-<dl class="return" compact><dt><b>Returns:</b></dt><dd>capability/limit value </dd></dl>
-<dl compact><dt><b>Exceptions:</b></dt><dd>
- <table border="0" cellspacing="2" cellpadding="0">
- <tr><td valign="top"></td><td valign="top"><em><a class="el" href="classInotifyException.html" title="Class for inotify exceptions.">InotifyException</a></em>&nbsp;</td><td>thrown if the given value cannot be acquired </td></tr>
- </table>
-</dl>
-
-<p>
-<div class="dynheader">
-Here is the caller graph for this function:</div>
-<div class="dynsection">
-<p><center><img src="classInotify_70b3b57e8661fbb4c5bc404b86225c3b_icgraph.png" border="0" usemap="#classInotify_70b3b57e8661fbb4c5bc404b86225c3b_icgraph_map" alt=""></center>
-<map name="classInotify_70b3b57e8661fbb4c5bc404b86225c3b_icgraph_map">
-<area shape="rect" href="classInotify.html#d8e4a4a87d005c71c0b5ea9c6dd53c42" title="Returns the maximum number of events in the kernel queue." alt="" coords="204,5,351,32"><area shape="rect" href="classInotify.html#c18b7732f67832260fbbd47aebb8af51" title="Returns the maximum number of inotify instances per process." alt="" coords="195,56,360,83"><area shape="rect" href="classInotify.html#86dae1b7a72c0d8fc2a632444a0f2f1f" title="Returns the maximum number of inotify watches per instance." alt="" coords="197,107,357,133"></map>
-</div>
-
-</div>
-</div><p>
-<a class="anchor" name="0233ddfe40844d729505fdfd709d22cc"></a><!-- doxytag: member="Inotify::GetCapabilityPath" ref="0233ddfe40844d729505fdfd709d22cc" args="(InotifyCapability_t cap)" -->
-<div class="memitem">
-<div class="memproto">
- <table class="memname">
- <tr>
- <td class="memname">std::string Inotify::GetCapabilityPath </td>
- <td>(</td>
- <td class="paramtype"><a class="el" href="inotify-cxx_8h.html#bccd39d32dd83905178cf42edaae5c4d">InotifyCapability_t</a>&nbsp;</td>
- <td class="paramname"> <em>cap</em> </td>
- <td>&nbsp;)&nbsp;</td>
- <td> throw (<a class="el" href="classInotifyException.html">InotifyException</a>)<code> [static, private]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-
-</div>
-</div><p>
-<a class="anchor" name="abab7015203bf36d0256e75d4f4861f9"></a><!-- doxytag: member="Inotify::GetDescriptor" ref="abab7015203bf36d0256e75d4f4861f9" args="() const " -->
-<div class="memitem">
-<div class="memproto">
- <table class="memname">
- <tr>
- <td class="memname">int Inotify::GetDescriptor </td>
- <td>(</td>
- <td class="paramname"> </td>
- <td>&nbsp;)&nbsp;</td>
- <td> const<code> [inline]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Returns the file descriptor.
-<p>
-The descriptor can be used in standard low-level file functions (poll(), select(), fcntl() etc.).<p>
-<dl class="return" compact><dt><b>Returns:</b></dt><dd>valid file descriptor or -1 for inactive object</dd></dl>
-<dl class="see" compact><dt><b>See also:</b></dt><dd><a class="el" href="classInotify.html#b2c8ab8ad4322fb6f0dae0eae442402b" title="Enables/disables non-blocking mode.">SetNonBlock()</a> </dd></dl>
-
-</div>
-</div><p>
-<a class="anchor" name="6f432affb46f85f7bc19661d5bc77063"></a><!-- doxytag: member="Inotify::GetEnabledCount" ref="6f432affb46f85f7bc19661d5bc77063" args="() const " -->
-<div class="memitem">
-<div class="memproto">
- <table class="memname">
- <tr>
- <td class="memname">size_t Inotify::GetEnabledCount </td>
- <td>(</td>
- <td class="paramname"> </td>
- <td>&nbsp;)&nbsp;</td>
- <td> const<code> [inline]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Returns the count of enabled watches.
-<p>
-<dl class="return" compact><dt><b>Returns:</b></dt><dd>count of enabled watches</dd></dl>
-<dl class="see" compact><dt><b>See also:</b></dt><dd><a class="el" href="classInotify.html#716ae90a00dd4895709ea9b8f7959075" title="Returns the count of watches.">GetWatchCount()</a> </dd></dl>
-
-</div>
-</div><p>
-<a class="anchor" name="b028c8fa988f6bbb2ef773db3ea3a2d3"></a><!-- doxytag: member="Inotify::GetEvent" ref="b028c8fa988f6bbb2ef773db3ea3a2d3" args="(InotifyEvent &amp;rEvt)" -->
-<div class="memitem">
-<div class="memproto">
- <table class="memname">
- <tr>
- <td class="memname">bool Inotify::GetEvent </td>
- <td>(</td>
- <td class="paramtype"><a class="el" href="classInotifyEvent.html">InotifyEvent</a> &amp;&nbsp;</td>
- <td class="paramname"> <em>rEvt</em> </td>
- <td>&nbsp;)&nbsp;</td>
- <td> throw (<a class="el" href="classInotifyException.html">InotifyException</a>)<code> [inline]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Extracts a queued inotify event.
-<p>
-The extracted event is removed from the queue.<p>
-<dl compact><dt><b>Parameters:</b></dt><dd>
- <table border="0" cellspacing="2" cellpadding="0">
- <tr><td valign="top"><tt>[in,out]</tt>&nbsp;</td><td valign="top"><em>rEvt</em>&nbsp;</td><td>event object</td></tr>
- </table>
-</dl>
-<dl compact><dt><b>Exceptions:</b></dt><dd>
- <table border="0" cellspacing="2" cellpadding="0">
- <tr><td valign="top"></td><td valign="top"><em><a class="el" href="classInotifyException.html" title="Class for inotify exceptions.">InotifyException</a></em>&nbsp;</td><td>thrown only in very anomalous cases </td></tr>
- </table>
-</dl>
-
-</div>
-</div><p>
-<a class="anchor" name="490a3f824c6d041d31ccaabe9bd92008"></a><!-- doxytag: member="Inotify::GetEvent" ref="490a3f824c6d041d31ccaabe9bd92008" args="(InotifyEvent *pEvt)" -->
-<div class="memitem">
-<div class="memproto">
- <table class="memname">
- <tr>
- <td class="memname">bool Inotify::GetEvent </td>
- <td>(</td>
- <td class="paramtype"><a class="el" href="classInotifyEvent.html">InotifyEvent</a> *&nbsp;</td>
- <td class="paramname"> <em>pEvt</em> </td>
- <td>&nbsp;)&nbsp;</td>
- <td> throw (<a class="el" href="classInotifyException.html">InotifyException</a>)</td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Extracts a queued inotify event.
-<p>
-The extracted event is removed from the queue. If the pointer is NULL it does nothing.<p>
-<dl compact><dt><b>Parameters:</b></dt><dd>
- <table border="0" cellspacing="2" cellpadding="0">
- <tr><td valign="top"><tt>[in,out]</tt>&nbsp;</td><td valign="top"><em>pEvt</em>&nbsp;</td><td>event object</td></tr>
- </table>
-</dl>
-<dl compact><dt><b>Exceptions:</b></dt><dd>
- <table border="0" cellspacing="2" cellpadding="0">
- <tr><td valign="top"></td><td valign="top"><em><a class="el" href="classInotifyException.html" title="Class for inotify exceptions.">InotifyException</a></em>&nbsp;</td><td>thrown if the provided pointer is NULL </td></tr>
- </table>
-</dl>
-
-<p>
-<div class="dynheader">
-Here is the caller graph for this function:</div>
-<div class="dynsection">
-<p><center><img src="classInotify_490a3f824c6d041d31ccaabe9bd92008_icgraph.png" border="0" usemap="#classInotify_490a3f824c6d041d31ccaabe9bd92008_icgraph_map" alt=""></center>
-<map name="classInotify_490a3f824c6d041d31ccaabe9bd92008_icgraph_map">
-<area shape="rect" href="classInotify.html#b028c8fa988f6bbb2ef773db3ea3a2d3" title="Extracts a queued inotify event." alt="" coords="172,5,287,32"></map>
-</div>
-
-</div>
-</div><p>
-<a class="anchor" name="a3c533f956871f904949832ac8f5fbde"></a><!-- doxytag: member="Inotify::GetEventCount" ref="a3c533f956871f904949832ac8f5fbde" args="()" -->
-<div class="memitem">
-<div class="memproto">
- <table class="memname">
- <tr>
- <td class="memname">size_t Inotify::GetEventCount </td>
- <td>(</td>
- <td class="paramname"> </td>
- <td>&nbsp;)&nbsp;</td>
- <td><code> [inline]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Returns the count of received and queued events.
-<p>
-This number is related to the events in the queue inside this object, not to the events pending in the kernel.<p>
-<dl class="return" compact><dt><b>Returns:</b></dt><dd>count of events </dd></dl>
-
-</div>
-</div><p>
-<a class="anchor" name="d8e4a4a87d005c71c0b5ea9c6dd53c42"></a><!-- doxytag: member="Inotify::GetMaxEvents" ref="d8e4a4a87d005c71c0b5ea9c6dd53c42" args="()" -->
-<div class="memitem">
-<div class="memproto">
- <table class="memname">
- <tr>
- <td class="memname">static uint32_t Inotify::GetMaxEvents </td>
- <td>(</td>
- <td class="paramname"> </td>
- <td>&nbsp;)&nbsp;</td>
- <td> throw (<a class="el" href="classInotifyException.html">InotifyException</a>)<code> [inline, static]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Returns the maximum number of events in the kernel queue.
-<p>
-<dl class="return" compact><dt><b>Returns:</b></dt><dd>maximum number of events in the kernel queue </dd></dl>
-<dl compact><dt><b>Exceptions:</b></dt><dd>
- <table border="0" cellspacing="2" cellpadding="0">
- <tr><td valign="top"></td><td valign="top"><em><a class="el" href="classInotifyException.html" title="Class for inotify exceptions.">InotifyException</a></em>&nbsp;</td><td>thrown if the given value cannot be acquired </td></tr>
- </table>
-</dl>
-
-</div>
-</div><p>
-<a class="anchor" name="c18b7732f67832260fbbd47aebb8af51"></a><!-- doxytag: member="Inotify::GetMaxInstances" ref="c18b7732f67832260fbbd47aebb8af51" args="()" -->
-<div class="memitem">
-<div class="memproto">
- <table class="memname">
- <tr>
- <td class="memname">static uint32_t Inotify::GetMaxInstances </td>
- <td>(</td>
- <td class="paramname"> </td>
- <td>&nbsp;)&nbsp;</td>
- <td> throw (<a class="el" href="classInotifyException.html">InotifyException</a>)<code> [inline, static]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Returns the maximum number of inotify instances per process.
-<p>
-It means the maximum number of open inotify file descriptors per running process.<p>
-<dl class="return" compact><dt><b>Returns:</b></dt><dd>maximum number of inotify instances </dd></dl>
-<dl compact><dt><b>Exceptions:</b></dt><dd>
- <table border="0" cellspacing="2" cellpadding="0">
- <tr><td valign="top"></td><td valign="top"><em><a class="el" href="classInotifyException.html" title="Class for inotify exceptions.">InotifyException</a></em>&nbsp;</td><td>thrown if the given value cannot be acquired </td></tr>
- </table>
-</dl>
-
-</div>
-</div><p>
-<a class="anchor" name="86dae1b7a72c0d8fc2a632444a0f2f1f"></a><!-- doxytag: member="Inotify::GetMaxWatches" ref="86dae1b7a72c0d8fc2a632444a0f2f1f" args="()" -->
-<div class="memitem">
-<div class="memproto">
- <table class="memname">
- <tr>
- <td class="memname">static uint32_t Inotify::GetMaxWatches </td>
- <td>(</td>
- <td class="paramname"> </td>
- <td>&nbsp;)&nbsp;</td>
- <td> throw (<a class="el" href="classInotifyException.html">InotifyException</a>)<code> [inline, static]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Returns the maximum number of inotify watches per instance.
-<p>
-It means the maximum number of inotify watches per inotify file descriptor.<p>
-<dl class="return" compact><dt><b>Returns:</b></dt><dd>maximum number of inotify watches </dd></dl>
-<dl compact><dt><b>Exceptions:</b></dt><dd>
- <table border="0" cellspacing="2" cellpadding="0">
- <tr><td valign="top"></td><td valign="top"><em><a class="el" href="classInotifyException.html" title="Class for inotify exceptions.">InotifyException</a></em>&nbsp;</td><td>thrown if the given value cannot be acquired </td></tr>
- </table>
-</dl>
-
-</div>
-</div><p>
-<a class="anchor" name="716ae90a00dd4895709ea9b8f7959075"></a><!-- doxytag: member="Inotify::GetWatchCount" ref="716ae90a00dd4895709ea9b8f7959075" args="() const " -->
-<div class="memitem">
-<div class="memproto">
- <table class="memname">
- <tr>
- <td class="memname">size_t Inotify::GetWatchCount </td>
- <td>(</td>
- <td class="paramname"> </td>
- <td>&nbsp;)&nbsp;</td>
- <td> const<code> [inline]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Returns the count of watches.
-<p>
-This is the total count of all watches (regardless whether enabled or not).<p>
-<dl class="return" compact><dt><b>Returns:</b></dt><dd>count of watches</dd></dl>
-<dl class="see" compact><dt><b>See also:</b></dt><dd><a class="el" href="classInotify.html#6f432affb46f85f7bc19661d5bc77063" title="Returns the count of enabled watches.">GetEnabledCount()</a> </dd></dl>
-
-</div>
-</div><p>
-<a class="anchor" name="287dc0d238fa6edc3269441cb284f979"></a><!-- doxytag: member="Inotify::PeekEvent" ref="287dc0d238fa6edc3269441cb284f979" args="(InotifyEvent &amp;rEvt)" -->
-<div class="memitem">
-<div class="memproto">
- <table class="memname">
- <tr>
- <td class="memname">bool Inotify::PeekEvent </td>
- <td>(</td>
- <td class="paramtype"><a class="el" href="classInotifyEvent.html">InotifyEvent</a> &amp;&nbsp;</td>
- <td class="paramname"> <em>rEvt</em> </td>
- <td>&nbsp;)&nbsp;</td>
- <td> throw (<a class="el" href="classInotifyException.html">InotifyException</a>)<code> [inline]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Extracts a queued inotify event (without removing).
-<p>
-The extracted event stays in the queue.<p>
-<dl compact><dt><b>Parameters:</b></dt><dd>
- <table border="0" cellspacing="2" cellpadding="0">
- <tr><td valign="top"><tt>[in,out]</tt>&nbsp;</td><td valign="top"><em>rEvt</em>&nbsp;</td><td>event object</td></tr>
- </table>
-</dl>
-<dl compact><dt><b>Exceptions:</b></dt><dd>
- <table border="0" cellspacing="2" cellpadding="0">
- <tr><td valign="top"></td><td valign="top"><em><a class="el" href="classInotifyException.html" title="Class for inotify exceptions.">InotifyException</a></em>&nbsp;</td><td>thrown only in very anomalous cases </td></tr>
- </table>
-</dl>
-
-</div>
-</div><p>
-<a class="anchor" name="19cde43d082ff92bd02654610019300d"></a><!-- doxytag: member="Inotify::PeekEvent" ref="19cde43d082ff92bd02654610019300d" args="(InotifyEvent *pEvt)" -->
-<div class="memitem">
-<div class="memproto">
- <table class="memname">
- <tr>
- <td class="memname">bool Inotify::PeekEvent </td>
- <td>(</td>
- <td class="paramtype"><a class="el" href="classInotifyEvent.html">InotifyEvent</a> *&nbsp;</td>
- <td class="paramname"> <em>pEvt</em> </td>
- <td>&nbsp;)&nbsp;</td>
- <td> throw (<a class="el" href="classInotifyException.html">InotifyException</a>)</td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Extracts a queued inotify event (without removing).
-<p>
-The extracted event stays in the queue. If the pointer is NULL it does nothing.<p>
-<dl compact><dt><b>Parameters:</b></dt><dd>
- <table border="0" cellspacing="2" cellpadding="0">
- <tr><td valign="top"><tt>[in,out]</tt>&nbsp;</td><td valign="top"><em>pEvt</em>&nbsp;</td><td>event object</td></tr>
- </table>
-</dl>
-<dl compact><dt><b>Exceptions:</b></dt><dd>
- <table border="0" cellspacing="2" cellpadding="0">
- <tr><td valign="top"></td><td valign="top"><em><a class="el" href="classInotifyException.html" title="Class for inotify exceptions.">InotifyException</a></em>&nbsp;</td><td>thrown if the provided pointer is NULL </td></tr>
- </table>
-</dl>
-
-<p>
-<div class="dynheader">
-Here is the caller graph for this function:</div>
-<div class="dynsection">
-<p><center><img src="classInotify_19cde43d082ff92bd02654610019300d_icgraph.png" border="0" usemap="#classInotify_19cde43d082ff92bd02654610019300d_icgraph_map" alt=""></center>
-<map name="classInotify_19cde43d082ff92bd02654610019300d_icgraph_map">
-<area shape="rect" href="classInotify.html#287dc0d238fa6edc3269441cb284f979" title="Extracts a queued inotify event (without removing)." alt="" coords="179,5,304,32"></map>
-</div>
-
-</div>
-</div><p>
-<a class="anchor" name="ac1a52b2ff6bfec07021a44e55d496a6"></a><!-- doxytag: member="Inotify::Remove" ref="ac1a52b2ff6bfec07021a44e55d496a6" args="(InotifyWatch &amp;rWatch)" -->
-<div class="memitem">
-<div class="memproto">
- <table class="memname">
- <tr>
- <td class="memname">void Inotify::Remove </td>
- <td>(</td>
- <td class="paramtype"><a class="el" href="classInotifyWatch.html">InotifyWatch</a> &amp;&nbsp;</td>
- <td class="paramname"> <em>rWatch</em> </td>
- <td>&nbsp;)&nbsp;</td>
- <td> throw (<a class="el" href="classInotifyException.html">InotifyException</a>)<code> [inline]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Removes a watch.
-<p>
-If the given watch is not present it does nothing.<p>
-<dl compact><dt><b>Parameters:</b></dt><dd>
- <table border="0" cellspacing="2" cellpadding="0">
- <tr><td valign="top"><tt>[in]</tt>&nbsp;</td><td valign="top"><em>rWatch</em>&nbsp;</td><td>inotify watch</td></tr>
- </table>
-</dl>
-<dl compact><dt><b>Exceptions:</b></dt><dd>
- <table border="0" cellspacing="2" cellpadding="0">
- <tr><td valign="top"></td><td valign="top"><em><a class="el" href="classInotifyException.html" title="Class for inotify exceptions.">InotifyException</a></em>&nbsp;</td><td>thrown if removing failed </td></tr>
- </table>
-</dl>
-
-</div>
-</div><p>
-<a class="anchor" name="21c39bb8e5bbc1941b945c18f9005b84"></a><!-- doxytag: member="Inotify::Remove" ref="21c39bb8e5bbc1941b945c18f9005b84" args="(InotifyWatch *pWatch)" -->
-<div class="memitem">
-<div class="memproto">
- <table class="memname">
- <tr>
- <td class="memname">void Inotify::Remove </td>
- <td>(</td>
- <td class="paramtype"><a class="el" href="classInotifyWatch.html">InotifyWatch</a> *&nbsp;</td>
- <td class="paramname"> <em>pWatch</em> </td>
- <td>&nbsp;)&nbsp;</td>
- <td> throw (<a class="el" href="classInotifyException.html">InotifyException</a>)</td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Removes a watch.
-<p>
-If the given watch is not present it does nothing.<p>
-<dl compact><dt><b>Parameters:</b></dt><dd>
- <table border="0" cellspacing="2" cellpadding="0">
- <tr><td valign="top"><tt>[in]</tt>&nbsp;</td><td valign="top"><em>pWatch</em>&nbsp;</td><td>inotify watch</td></tr>
- </table>
-</dl>
-<dl compact><dt><b>Exceptions:</b></dt><dd>
- <table border="0" cellspacing="2" cellpadding="0">
- <tr><td valign="top"></td><td valign="top"><em><a class="el" href="classInotifyException.html" title="Class for inotify exceptions.">InotifyException</a></em>&nbsp;</td><td>thrown if removing failed </td></tr>
- </table>
-</dl>
-
-<p>
-<div class="dynheader">
-Here is the caller graph for this function:</div>
-<div class="dynsection">
-<p><center><img src="classInotify_21c39bb8e5bbc1941b945c18f9005b84_icgraph.png" border="0" usemap="#classInotify_21c39bb8e5bbc1941b945c18f9005b84_icgraph_map" alt=""></center>
-<map name="classInotify_21c39bb8e5bbc1941b945c18f9005b84_icgraph_map">
-<area shape="rect" href="classInotify.html#ac1a52b2ff6bfec07021a44e55d496a6" title="Removes a watch." alt="" coords="163,5,272,32"></map>
-</div>
-
-</div>
-</div><p>
-<a class="anchor" name="bc1fd5830ca561efb69bcd2283981741"></a><!-- doxytag: member="Inotify::RemoveAll" ref="bc1fd5830ca561efb69bcd2283981741" args="()" -->
-<div class="memitem">
-<div class="memproto">
- <table class="memname">
- <tr>
- <td class="memname">void Inotify::RemoveAll </td>
- <td>(</td>
- <td class="paramname"> </td>
- <td>&nbsp;)&nbsp;</td>
- <td></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Removes all watches.
-<p>
-
-<p>
-<div class="dynheader">
-Here is the caller graph for this function:</div>
-<div class="dynsection">
-<p><center><img src="classInotify_bc1fd5830ca561efb69bcd2283981741_icgraph.png" border="0" usemap="#classInotify_bc1fd5830ca561efb69bcd2283981741_icgraph_map" alt=""></center>
-<map name="classInotify_bc1fd5830ca561efb69bcd2283981741_icgraph_map">
-<area shape="rect" href="classInotify.html#86ae86c43ea1a72f562ca46393309635" title="Removes all watches and closes the inotify device." alt="" coords="179,5,275,32"><area shape="rect" href="classInotify.html#f19dd5e491395673e4798eb9dbf5f682" title="Destructor." alt="" coords="324,5,428,32"></map>
-</div>
-
-</div>
-</div><p>
-<a class="anchor" name="734538233ba2136164f76f4df6c3654e"></a><!-- doxytag: member="Inotify::SetCapability" ref="734538233ba2136164f76f4df6c3654e" args="(InotifyCapability_t cap, uint32_t val)" -->
-<div class="memitem">
-<div class="memproto">
- <table class="memname">
- <tr>
- <td class="memname">void Inotify::SetCapability </td>
- <td>(</td>
- <td class="paramtype"><a class="el" href="inotify-cxx_8h.html#bccd39d32dd83905178cf42edaae5c4d">InotifyCapability_t</a>&nbsp;</td>
- <td class="paramname"> <em>cap</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype">uint32_t&nbsp;</td>
- <td class="paramname"> <em>val</em></td><td>&nbsp;</td>
- </tr>
- <tr>
- <td></td>
- <td>)</td>
- <td></td><td></td><td> throw (<a class="el" href="classInotifyException.html">InotifyException</a>)<code> [static]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Modifies a particular inotify capability/limit.
-<p>
-<dl compact><dt><b>Parameters:</b></dt><dd>
- <table border="0" cellspacing="2" cellpadding="0">
- <tr><td valign="top"><tt>[in]</tt>&nbsp;</td><td valign="top"><em>cap</em>&nbsp;</td><td>capability/limit identifier </td></tr>
- <tr><td valign="top"><tt>[in]</tt>&nbsp;</td><td valign="top"><em>val</em>&nbsp;</td><td>new capability/limit value </td></tr>
- </table>
-</dl>
-<dl compact><dt><b>Exceptions:</b></dt><dd>
- <table border="0" cellspacing="2" cellpadding="0">
- <tr><td valign="top"></td><td valign="top"><em><a class="el" href="classInotifyException.html" title="Class for inotify exceptions.">InotifyException</a></em>&nbsp;</td><td>thrown if the given value cannot be set </td></tr>
- </table>
-</dl>
-<dl class="attention" compact><dt><b>Attention:</b></dt><dd>Using this function requires root privileges. Beware of setting extensive values - it may seriously affect system performance and/or stability. </dd></dl>
-
-<p>
-<div class="dynheader">
-Here is the caller graph for this function:</div>
-<div class="dynsection">
-<p><center><img src="classInotify_734538233ba2136164f76f4df6c3654e_icgraph.png" border="0" usemap="#classInotify_734538233ba2136164f76f4df6c3654e_icgraph_map" alt=""></center>
-<map name="classInotify_734538233ba2136164f76f4df6c3654e_icgraph_map">
-<area shape="rect" href="classInotify.html#66d90ebfa516d4bd1463749def2b58f9" title="Sets the maximum number of events in the kernel queue." alt="" coords="204,5,351,32"><area shape="rect" href="classInotify.html#620c891962fe5acd26485c64e9b28d19" title="Sets the maximum number of inotify instances per process." alt="" coords="196,56,359,83"><area shape="rect" href="classInotify.html#5064380cdb4a726ab33f3fa18d15c77a" title="Sets the maximum number of inotify watches per instance." alt="" coords="197,107,357,133"></map>
-</div>
-
-</div>
-</div><p>
-<a class="anchor" name="124dd5816205900af61034d47ae65255"></a><!-- doxytag: member="Inotify::SetCloseOnExec" ref="124dd5816205900af61034d47ae65255" args="(bool fClOnEx)" -->
-<div class="memitem">
-<div class="memproto">
- <table class="memname">
- <tr>
- <td class="memname">void Inotify::SetCloseOnExec </td>
- <td>(</td>
- <td class="paramtype">bool&nbsp;</td>
- <td class="paramname"> <em>fClOnEx</em> </td>
- <td>&nbsp;)&nbsp;</td>
- <td> throw (<a class="el" href="classInotifyException.html">InotifyException</a>)</td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Enables/disables closing on exec.
-<p>
-Enable this if you want to close the descriptor when executing another program. Otherwise, the descriptor will be inherited.<p>
-Closing on exec is disabled by default.<p>
-<dl compact><dt><b>Parameters:</b></dt><dd>
- <table border="0" cellspacing="2" cellpadding="0">
- <tr><td valign="top"><tt>[in]</tt>&nbsp;</td><td valign="top"><em>fClOnEx</em>&nbsp;</td><td>enable/disable closing on exec</td></tr>
- </table>
-</dl>
-<dl compact><dt><b>Exceptions:</b></dt><dd>
- <table border="0" cellspacing="2" cellpadding="0">
- <tr><td valign="top"></td><td valign="top"><em><a class="el" href="classInotifyException.html" title="Class for inotify exceptions.">InotifyException</a></em>&nbsp;</td><td>thrown if setting failed</td></tr>
- </table>
-</dl>
-<dl class="see" compact><dt><b>See also:</b></dt><dd><a class="el" href="classInotify.html#abab7015203bf36d0256e75d4f4861f9" title="Returns the file descriptor.">GetDescriptor()</a>, <a class="el" href="classInotify.html#b2c8ab8ad4322fb6f0dae0eae442402b" title="Enables/disables non-blocking mode.">SetNonBlock()</a> </dd></dl>
-
-</div>
-</div><p>
-<a class="anchor" name="66d90ebfa516d4bd1463749def2b58f9"></a><!-- doxytag: member="Inotify::SetMaxEvents" ref="66d90ebfa516d4bd1463749def2b58f9" args="(uint32_t val)" -->
-<div class="memitem">
-<div class="memproto">
- <table class="memname">
- <tr>
- <td class="memname">static void Inotify::SetMaxEvents </td>
- <td>(</td>
- <td class="paramtype">uint32_t&nbsp;</td>
- <td class="paramname"> <em>val</em> </td>
- <td>&nbsp;)&nbsp;</td>
- <td> throw (<a class="el" href="classInotifyException.html">InotifyException</a>)<code> [inline, static]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Sets the maximum number of events in the kernel queue.
-<p>
-<dl compact><dt><b>Parameters:</b></dt><dd>
- <table border="0" cellspacing="2" cellpadding="0">
- <tr><td valign="top"><tt>[in]</tt>&nbsp;</td><td valign="top"><em>val</em>&nbsp;</td><td>new value </td></tr>
- </table>
-</dl>
-<dl compact><dt><b>Exceptions:</b></dt><dd>
- <table border="0" cellspacing="2" cellpadding="0">
- <tr><td valign="top"></td><td valign="top"><em><a class="el" href="classInotifyException.html" title="Class for inotify exceptions.">InotifyException</a></em>&nbsp;</td><td>thrown if the given value cannot be set </td></tr>
- </table>
-</dl>
-<dl class="attention" compact><dt><b>Attention:</b></dt><dd>Using this function requires root privileges. Beware of setting extensive values - the greater value is set here the more physical memory may be used for the inotify infrastructure. </dd></dl>
-
-</div>
-</div><p>
-<a class="anchor" name="620c891962fe5acd26485c64e9b28d19"></a><!-- doxytag: member="Inotify::SetMaxInstances" ref="620c891962fe5acd26485c64e9b28d19" args="(uint32_t val)" -->
-<div class="memitem">
-<div class="memproto">
- <table class="memname">
- <tr>
- <td class="memname">static void Inotify::SetMaxInstances </td>
- <td>(</td>
- <td class="paramtype">uint32_t&nbsp;</td>
- <td class="paramname"> <em>val</em> </td>
- <td>&nbsp;)&nbsp;</td>
- <td> throw (<a class="el" href="classInotifyException.html">InotifyException</a>)<code> [inline, static]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Sets the maximum number of inotify instances per process.
-<p>
-<dl compact><dt><b>Parameters:</b></dt><dd>
- <table border="0" cellspacing="2" cellpadding="0">
- <tr><td valign="top"><tt>[in]</tt>&nbsp;</td><td valign="top"><em>val</em>&nbsp;</td><td>new value </td></tr>
- </table>
-</dl>
-<dl compact><dt><b>Exceptions:</b></dt><dd>
- <table border="0" cellspacing="2" cellpadding="0">
- <tr><td valign="top"></td><td valign="top"><em><a class="el" href="classInotifyException.html" title="Class for inotify exceptions.">InotifyException</a></em>&nbsp;</td><td>thrown if the given value cannot be set </td></tr>
- </table>
-</dl>
-<dl class="attention" compact><dt><b>Attention:</b></dt><dd>Using this function requires root privileges. Beware of setting extensive values - the greater value is set here the more physical memory may be used for the inotify infrastructure. </dd></dl>
-
-</div>
-</div><p>
-<a class="anchor" name="5064380cdb4a726ab33f3fa18d15c77a"></a><!-- doxytag: member="Inotify::SetMaxWatches" ref="5064380cdb4a726ab33f3fa18d15c77a" args="(uint32_t val)" -->
-<div class="memitem">
-<div class="memproto">
- <table class="memname">
- <tr>
- <td class="memname">static void Inotify::SetMaxWatches </td>
- <td>(</td>
- <td class="paramtype">uint32_t&nbsp;</td>
- <td class="paramname"> <em>val</em> </td>
- <td>&nbsp;)&nbsp;</td>
- <td> throw (<a class="el" href="classInotifyException.html">InotifyException</a>)<code> [inline, static]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Sets the maximum number of inotify watches per instance.
-<p>
-<dl compact><dt><b>Parameters:</b></dt><dd>
- <table border="0" cellspacing="2" cellpadding="0">
- <tr><td valign="top"><tt>[in]</tt>&nbsp;</td><td valign="top"><em>val</em>&nbsp;</td><td>new value </td></tr>
- </table>
-</dl>
-<dl compact><dt><b>Exceptions:</b></dt><dd>
- <table border="0" cellspacing="2" cellpadding="0">
- <tr><td valign="top"></td><td valign="top"><em><a class="el" href="classInotifyException.html" title="Class for inotify exceptions.">InotifyException</a></em>&nbsp;</td><td>thrown if the given value cannot be set </td></tr>
- </table>
-</dl>
-<dl class="attention" compact><dt><b>Attention:</b></dt><dd>Using this function requires root privileges. Beware of setting extensive values - the greater value is set here the more physical memory may be used for the inotify infrastructure. </dd></dl>
-
-</div>
-</div><p>
-<a class="anchor" name="b2c8ab8ad4322fb6f0dae0eae442402b"></a><!-- doxytag: member="Inotify::SetNonBlock" ref="b2c8ab8ad4322fb6f0dae0eae442402b" args="(bool fNonBlock)" -->
-<div class="memitem">
-<div class="memproto">
- <table class="memname">
- <tr>
- <td class="memname">void Inotify::SetNonBlock </td>
- <td>(</td>
- <td class="paramtype">bool&nbsp;</td>
- <td class="paramname"> <em>fNonBlock</em> </td>
- <td>&nbsp;)&nbsp;</td>
- <td> throw (<a class="el" href="classInotifyException.html">InotifyException</a>)</td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Enables/disables non-blocking mode.
-<p>
-Use this mode if you want to monitor the descriptor (acquired thru <a class="el" href="classInotify.html#abab7015203bf36d0256e75d4f4861f9" title="Returns the file descriptor.">GetDescriptor()</a>) in functions such as poll(), select() etc.<p>
-Non-blocking mode is disabled by default.<p>
-<dl compact><dt><b>Parameters:</b></dt><dd>
- <table border="0" cellspacing="2" cellpadding="0">
- <tr><td valign="top"><tt>[in]</tt>&nbsp;</td><td valign="top"><em>fNonBlock</em>&nbsp;</td><td>enable/disable non-blocking mode</td></tr>
- </table>
-</dl>
-<dl compact><dt><b>Exceptions:</b></dt><dd>
- <table border="0" cellspacing="2" cellpadding="0">
- <tr><td valign="top"></td><td valign="top"><em><a class="el" href="classInotifyException.html" title="Class for inotify exceptions.">InotifyException</a></em>&nbsp;</td><td>thrown if setting mode failed</td></tr>
- </table>
-</dl>
-<dl class="see" compact><dt><b>See also:</b></dt><dd><a class="el" href="classInotify.html#abab7015203bf36d0256e75d4f4861f9" title="Returns the file descriptor.">GetDescriptor()</a>, <a class="el" href="classInotify.html#124dd5816205900af61034d47ae65255" title="Enables/disables closing on exec.">SetCloseOnExec()</a> </dd></dl>
-
-</div>
-</div><p>
-<a class="anchor" name="139c27c6643bb199619f3eae9b32e53b"></a><!-- doxytag: member="Inotify::WaitForEvents" ref="139c27c6643bb199619f3eae9b32e53b" args="(bool fNoIntr=false)" -->
-<div class="memitem">
-<div class="memproto">
- <table class="memname">
- <tr>
- <td class="memname">void Inotify::WaitForEvents </td>
- <td>(</td>
- <td class="paramtype">bool&nbsp;</td>
- <td class="paramname"> <em>fNoIntr</em> = <code>false</code> </td>
- <td>&nbsp;)&nbsp;</td>
- <td> throw (<a class="el" href="classInotifyException.html">InotifyException</a>)</td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Waits for inotify events.
-<p>
-It waits until one or more events occur. When called in nonblocking mode it only retrieves occurred events to the internal queue and exits.<p>
-<dl compact><dt><b>Parameters:</b></dt><dd>
- <table border="0" cellspacing="2" cellpadding="0">
- <tr><td valign="top"><tt>[in]</tt>&nbsp;</td><td valign="top"><em>fNoIntr</em>&nbsp;</td><td>if true it re-calls the system call after a handled signal</td></tr>
- </table>
-</dl>
-<dl compact><dt><b>Exceptions:</b></dt><dd>
- <table border="0" cellspacing="2" cellpadding="0">
- <tr><td valign="top"></td><td valign="top"><em><a class="el" href="classInotifyException.html" title="Class for inotify exceptions.">InotifyException</a></em>&nbsp;</td><td>thrown if reading events failed</td></tr>
- </table>
-</dl>
-<dl class="see" compact><dt><b>See also:</b></dt><dd><a class="el" href="classInotify.html#b2c8ab8ad4322fb6f0dae0eae442402b" title="Enables/disables non-blocking mode.">SetNonBlock()</a> </dd></dl>
-
-</div>
-</div><p>
-<hr><h2>Friends And Related Function Documentation</h2>
-<a class="anchor" name="10880f490c33acd8bd24664fc7bce4ae"></a><!-- doxytag: member="Inotify::InotifyWatch" ref="10880f490c33acd8bd24664fc7bce4ae" args="" -->
-<div class="memitem">
-<div class="memproto">
- <table class="memname">
- <tr>
- <td class="memname">friend class <a class="el" href="classInotifyWatch.html">InotifyWatch</a><code> [friend]</code> </td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-
-</div>
-</div><p>
-<hr><h2>Member Data Documentation</h2>
-<a class="anchor" name="eee7847efd93b681fddac56860fc7958"></a><!-- doxytag: member="Inotify::m_buf" ref="eee7847efd93b681fddac56860fc7958" args="[INOTIFY_BUFLEN]" -->
-<div class="memitem">
-<div class="memproto">
- <table class="memname">
- <tr>
- <td class="memname">unsigned char <a class="el" href="classInotify.html#eee7847efd93b681fddac56860fc7958">Inotify::m_buf</a>[INOTIFY_BUFLEN]<code> [private]</code> </td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-buffer for events
-<p>
-
-</div>
-</div><p>
-<a class="anchor" name="0c1d6c969292dbb7c8c1283a3d8f55e0"></a><!-- doxytag: member="Inotify::m_events" ref="0c1d6c969292dbb7c8c1283a3d8f55e0" args="" -->
-<div class="memitem">
-<div class="memproto">
- <table class="memname">
- <tr>
- <td class="memname">std::deque&lt;<a class="el" href="classInotifyEvent.html">InotifyEvent</a>&gt; <a class="el" href="classInotify.html#0c1d6c969292dbb7c8c1283a3d8f55e0">Inotify::m_events</a><code> [private]</code> </td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-event queue
-<p>
-
-</div>
-</div><p>
-<a class="anchor" name="95d6d0ecefff77bd3ee50f1586a4552b"></a><!-- doxytag: member="Inotify::m_fd" ref="95d6d0ecefff77bd3ee50f1586a4552b" args="" -->
-<div class="memitem">
-<div class="memproto">
- <table class="memname">
- <tr>
- <td class="memname">int <a class="el" href="classInotify.html#95d6d0ecefff77bd3ee50f1586a4552b">Inotify::m_fd</a><code> [private]</code> </td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-file descriptor
-<p>
-
-</div>
-</div><p>
-<a class="anchor" name="62f275db6375a366023b2e46f73e3ecc"></a><!-- doxytag: member="Inotify::m_paths" ref="62f275db6375a366023b2e46f73e3ecc" args="" -->
-<div class="memitem">
-<div class="memproto">
- <table class="memname">
- <tr>
- <td class="memname"><a class="el" href="inotify-cxx_8h.html#5dd7761ff5a6b7cc7271950aebb7ddf6">IN_WP_MAP</a> <a class="el" href="classInotify.html#62f275db6375a366023b2e46f73e3ecc">Inotify::m_paths</a><code> [private]</code> </td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-watches (by paths)
-<p>
-
-</div>
-</div><p>
-<a class="anchor" name="4d07f3a4412028d687936d2479d9a976"></a><!-- doxytag: member="Inotify::m_watches" ref="4d07f3a4412028d687936d2479d9a976" args="" -->
-<div class="memitem">
-<div class="memproto">
- <table class="memname">
- <tr>
- <td class="memname"><a class="el" href="inotify-cxx_8h.html#e6b5ebcb4e0d6a9f5ca8da26bc00cc2a">IN_WATCH_MAP</a> <a class="el" href="classInotify.html#4d07f3a4412028d687936d2479d9a976">Inotify::m_watches</a><code> [private]</code> </td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-watches (by descriptors)
-<p>
-
-</div>
-</div><p>
-<hr>The documentation for this class was generated from the following files:<ul>
-<li><a class="el" href="inotify-cxx_8h_source.html">inotify-cxx.h</a><li><a class="el" href="inotify-cxx_8cpp.html">inotify-cxx.cpp</a></ul>
-</div>
-<hr size="1"><address style="text-align: right;"><small><a href="http://www.doxygen.org/index.html">
-<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> </small></address>
-</body>
-</html>
diff --git a/shared/inotify/doc/html/classInotifyEvent-members.html b/shared/inotify/doc/html/classInotifyEvent-members.html
deleted file mode 100644
index 6b7bcc31..00000000
--- a/shared/inotify/doc/html/classInotifyEvent-members.html
+++ /dev/null
@@ -1,48 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
-<title>inotify-cxx: Member List</title>
-<link href="tabs.css" rel="stylesheet" type="text/css">
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.5.9 -->
-<div class="navigation" id="top">
- <div class="tabs">
- <ul>
- <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
- <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
- <li><a href="files.html"><span>Files</span></a></li>
- </ul>
- </div>
- <div class="tabs">
- <ul>
- <li><a href="annotated.html"><span>Class&nbsp;List</span></a></li>
- <li><a href="functions.html"><span>Class&nbsp;Members</span></a></li>
- </ul>
- </div>
-</div>
-<div class="contents">
-<h1>InotifyEvent Member List</h1>This is the complete list of members for <a class="el" href="classInotifyEvent.html">InotifyEvent</a>, including all inherited members.<p><table>
- <tr class="memlist"><td><a class="el" href="classInotifyEvent.html#c08a0a26ea33dbe94aaf1ac830c103a5">DumpTypes</a>(uint32_t uValue, std::string &amp;rStr)</td><td><a class="el" href="classInotifyEvent.html">InotifyEvent</a></td><td><code> [static]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="classInotifyEvent.html#3e5d18ff8dea01d14286e4b44a2b76ea">DumpTypes</a>(std::string &amp;rStr) const </td><td><a class="el" href="classInotifyEvent.html">InotifyEvent</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="classInotifyEvent.html#7e65e49f7d0f11c71442e31d688e4b17">GetCookie</a>() const </td><td><a class="el" href="classInotifyEvent.html">InotifyEvent</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="classInotifyEvent.html#463aacc1f660fbc1c39108feb2601341">GetDescriptor</a>() const </td><td><a class="el" href="classInotifyEvent.html">InotifyEvent</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="classInotifyEvent.html#30c8c2e1e490b8968ab9cb3364fe579a">GetLength</a>() const </td><td><a class="el" href="classInotifyEvent.html">InotifyEvent</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="classInotifyEvent.html#c7160544f6f4f24611df57a4422ac47f">GetMask</a>() const </td><td><a class="el" href="classInotifyEvent.html">InotifyEvent</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="classInotifyEvent.html#eced3a88a6dea190c5df19c2a6599010">GetMaskByName</a>(const std::string &amp;rName)</td><td><a class="el" href="classInotifyEvent.html">InotifyEvent</a></td><td><code> [static]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="classInotifyEvent.html#5ab91d587bdc7ab3c18c6cdff73f3097">GetName</a>() const </td><td><a class="el" href="classInotifyEvent.html">InotifyEvent</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="classInotifyEvent.html#3aea2437ba8553be703d91b45247a68f">GetName</a>(std::string &amp;rName) const </td><td><a class="el" href="classInotifyEvent.html">InotifyEvent</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="classInotifyEvent.html#979cd46f53ed674331a5a6d47d1cde92">GetWatch</a>()</td><td><a class="el" href="classInotifyEvent.html">InotifyEvent</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="classInotifyEvent.html#f416dbbd4e6ddd3c0eea6cb540f0b046">InotifyEvent</a>()</td><td><a class="el" href="classInotifyEvent.html">InotifyEvent</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="classInotifyEvent.html#6d7f3fc0f51580da4a3ec2348609df64">InotifyEvent</a>(const struct inotify_event *pEvt, InotifyWatch *pWatch)</td><td><a class="el" href="classInotifyEvent.html">InotifyEvent</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="classInotifyEvent.html#309ebf3c5b131522295185a926d551bb">IsType</a>(uint32_t uValue, uint32_t uType)</td><td><a class="el" href="classInotifyEvent.html">InotifyEvent</a></td><td><code> [inline, static]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="classInotifyEvent.html#477ae71116ec393434a1f62a7170a156">IsType</a>(uint32_t uType) const </td><td><a class="el" href="classInotifyEvent.html">InotifyEvent</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="classInotifyEvent.html#6c507a3466515aedc266bdc267079604">m_name</a></td><td><a class="el" href="classInotifyEvent.html">InotifyEvent</a></td><td><code> [private]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="classInotifyEvent.html#2d151cdcc547ee4ce49cfd44328d87ac">m_pWatch</a></td><td><a class="el" href="classInotifyEvent.html">InotifyEvent</a></td><td><code> [private]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="classInotifyEvent.html#bf417d466fb0173d337cc66539ee55af">m_uCookie</a></td><td><a class="el" href="classInotifyEvent.html">InotifyEvent</a></td><td><code> [private]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="classInotifyEvent.html#739a943357af0c3fafd58466803e04fa">m_uMask</a></td><td><a class="el" href="classInotifyEvent.html">InotifyEvent</a></td><td><code> [private]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="classInotifyEvent.html#a48030da1d3a1b1741ca791c9e129888">~InotifyEvent</a>()</td><td><a class="el" href="classInotifyEvent.html">InotifyEvent</a></td><td><code> [inline]</code></td></tr>
-</table></div>
-<hr size="1"><address style="text-align: right;"><small><a href="http://www.doxygen.org/index.html">
-<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> </small></address>
-</body>
-</html>
diff --git a/shared/inotify/doc/html/classInotifyEvent.html b/shared/inotify/doc/html/classInotifyEvent.html
deleted file mode 100644
index ccc3c517..00000000
--- a/shared/inotify/doc/html/classInotifyEvent.html
+++ /dev/null
@@ -1,617 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
-<title>inotify-cxx: InotifyEvent Class Reference</title>
-<link href="tabs.css" rel="stylesheet" type="text/css">
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.5.9 -->
-<div class="navigation" id="top">
- <div class="tabs">
- <ul>
- <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
- <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
- <li><a href="files.html"><span>Files</span></a></li>
- </ul>
- </div>
- <div class="tabs">
- <ul>
- <li><a href="annotated.html"><span>Class&nbsp;List</span></a></li>
- <li><a href="functions.html"><span>Class&nbsp;Members</span></a></li>
- </ul>
- </div>
-</div>
-<div class="contents">
-<h1>InotifyEvent Class Reference</h1><!-- doxytag: class="InotifyEvent" -->inotify event class
-<a href="#_details">More...</a>
-<p>
-<code>#include &lt;<a class="el" href="inotify-cxx_8h_source.html">inotify-cxx.h</a>&gt;</code>
-<p>
-<div class="dynheader">
-Collaboration diagram for InotifyEvent:</div>
-<div class="dynsection">
-<p><center><img src="classInotifyEvent__coll__graph.png" border="0" usemap="#InotifyEvent__coll__map" alt="Collaboration graph"></center>
-<map name="InotifyEvent__coll__map">
-<area shape="rect" href="classInotifyWatch.html" title="inotify watch class" alt="" coords="5,96,99,123"><area shape="rect" href="classInotify.html" title="inotify class" alt="" coords="24,5,80,32"></map>
-<center><font size="2">[<a href="graph_legend.html">legend</a>]</font></center></div>
-
-<p>
-<a href="classInotifyEvent-members.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
-<tr><td></td></tr>
-<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classInotifyEvent.html#f416dbbd4e6ddd3c0eea6cb540f0b046">InotifyEvent</a> ()</td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Constructor. <a href="#f416dbbd4e6ddd3c0eea6cb540f0b046"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classInotifyEvent.html#6d7f3fc0f51580da4a3ec2348609df64">InotifyEvent</a> (const struct inotify_event *pEvt, <a class="el" href="classInotifyWatch.html">InotifyWatch</a> *pWatch)</td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Constructor. <a href="#6d7f3fc0f51580da4a3ec2348609df64"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classInotifyEvent.html#a48030da1d3a1b1741ca791c9e129888">~InotifyEvent</a> ()</td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Destructor. <a href="#a48030da1d3a1b1741ca791c9e129888"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">int32_t&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classInotifyEvent.html#463aacc1f660fbc1c39108feb2601341">GetDescriptor</a> () const </td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Returns the event watch descriptor. <a href="#463aacc1f660fbc1c39108feb2601341"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">uint32_t&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classInotifyEvent.html#c7160544f6f4f24611df57a4422ac47f">GetMask</a> () const </td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Returns the event mask. <a href="#c7160544f6f4f24611df57a4422ac47f"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">bool&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classInotifyEvent.html#477ae71116ec393434a1f62a7170a156">IsType</a> (uint32_t uType) const </td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Checks for the event type. <a href="#477ae71116ec393434a1f62a7170a156"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">uint32_t&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classInotifyEvent.html#7e65e49f7d0f11c71442e31d688e4b17">GetCookie</a> () const </td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Returns the event cookie. <a href="#7e65e49f7d0f11c71442e31d688e4b17"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">uint32_t&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classInotifyEvent.html#30c8c2e1e490b8968ab9cb3364fe579a">GetLength</a> () const </td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Returns the event name length. <a href="#30c8c2e1e490b8968ab9cb3364fe579a"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">const std::string &amp;&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classInotifyEvent.html#5ab91d587bdc7ab3c18c6cdff73f3097">GetName</a> () const </td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Returns the event name. <a href="#5ab91d587bdc7ab3c18c6cdff73f3097"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classInotifyEvent.html#3aea2437ba8553be703d91b45247a68f">GetName</a> (std::string &amp;rName) const </td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Extracts the event name. <a href="#3aea2437ba8553be703d91b45247a68f"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="el" href="classInotifyWatch.html">InotifyWatch</a> *&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classInotifyEvent.html#979cd46f53ed674331a5a6d47d1cde92">GetWatch</a> ()</td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Returns the source watch. <a href="#979cd46f53ed674331a5a6d47d1cde92"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classInotifyEvent.html#3e5d18ff8dea01d14286e4b44a2b76ea">DumpTypes</a> (std::string &amp;rStr) const </td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Fills the string with all types contained in the event mask. <a href="#3e5d18ff8dea01d14286e4b44a2b76ea"></a><br></td></tr>
-<tr><td colspan="2"><br><h2>Static Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">static bool&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classInotifyEvent.html#309ebf3c5b131522295185a926d551bb">IsType</a> (uint32_t uValue, uint32_t uType)</td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Checks a value for the event type. <a href="#309ebf3c5b131522295185a926d551bb"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">static uint32_t&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classInotifyEvent.html#eced3a88a6dea190c5df19c2a6599010">GetMaskByName</a> (const std::string &amp;rName)</td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Finds the appropriate mask for a name. <a href="#eced3a88a6dea190c5df19c2a6599010"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">static void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classInotifyEvent.html#c08a0a26ea33dbe94aaf1ac830c103a5">DumpTypes</a> (uint32_t uValue, std::string &amp;rStr)</td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Fills the string with all types contained in an event mask value. <a href="#c08a0a26ea33dbe94aaf1ac830c103a5"></a><br></td></tr>
-<tr><td colspan="2"><br><h2>Private Attributes</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">uint32_t&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classInotifyEvent.html#739a943357af0c3fafd58466803e04fa">m_uMask</a></td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">mask <a href="#739a943357af0c3fafd58466803e04fa"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">uint32_t&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classInotifyEvent.html#bf417d466fb0173d337cc66539ee55af">m_uCookie</a></td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">cookie <a href="#bf417d466fb0173d337cc66539ee55af"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">std::string&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classInotifyEvent.html#6c507a3466515aedc266bdc267079604">m_name</a></td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">name <a href="#6c507a3466515aedc266bdc267079604"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="el" href="classInotifyWatch.html">InotifyWatch</a> *&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classInotifyEvent.html#2d151cdcc547ee4ce49cfd44328d87ac">m_pWatch</a></td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">source watch <a href="#2d151cdcc547ee4ce49cfd44328d87ac"></a><br></td></tr>
-</table>
-<hr><a name="_details"></a><h2>Detailed Description</h2>
-inotify event class
-<p>
-It holds all information about inotify event and provides access to its particular values.<p>
-This class is not (and is not intended to be) thread-safe and therefore it must not be used concurrently in multiple threads. <hr><h2>Constructor &amp; Destructor Documentation</h2>
-<a class="anchor" name="f416dbbd4e6ddd3c0eea6cb540f0b046"></a><!-- doxytag: member="InotifyEvent::InotifyEvent" ref="f416dbbd4e6ddd3c0eea6cb540f0b046" args="()" -->
-<div class="memitem">
-<div class="memproto">
- <table class="memname">
- <tr>
- <td class="memname">InotifyEvent::InotifyEvent </td>
- <td>(</td>
- <td class="paramname"> </td>
- <td>&nbsp;)&nbsp;</td>
- <td><code> [inline]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Constructor.
-<p>
-Creates a plain event.
-</div>
-</div><p>
-<a class="anchor" name="6d7f3fc0f51580da4a3ec2348609df64"></a><!-- doxytag: member="InotifyEvent::InotifyEvent" ref="6d7f3fc0f51580da4a3ec2348609df64" args="(const struct inotify_event *pEvt, InotifyWatch *pWatch)" -->
-<div class="memitem">
-<div class="memproto">
- <table class="memname">
- <tr>
- <td class="memname">InotifyEvent::InotifyEvent </td>
- <td>(</td>
- <td class="paramtype">const struct inotify_event *&nbsp;</td>
- <td class="paramname"> <em>pEvt</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype"><a class="el" href="classInotifyWatch.html">InotifyWatch</a> *&nbsp;</td>
- <td class="paramname"> <em>pWatch</em></td><td>&nbsp;</td>
- </tr>
- <tr>
- <td></td>
- <td>)</td>
- <td></td><td></td><td><code> [inline]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Constructor.
-<p>
-Creates an event based on inotify event data. For NULL pointers it works the same way as <a class="el" href="classInotifyEvent.html#f416dbbd4e6ddd3c0eea6cb540f0b046" title="Constructor.">InotifyEvent()</a>.<p>
-<dl compact><dt><b>Parameters:</b></dt><dd>
- <table border="0" cellspacing="2" cellpadding="0">
- <tr><td valign="top"><tt>[in]</tt>&nbsp;</td><td valign="top"><em>pEvt</em>&nbsp;</td><td>event data </td></tr>
- <tr><td valign="top"><tt>[in]</tt>&nbsp;</td><td valign="top"><em>pWatch</em>&nbsp;</td><td>inotify watch </td></tr>
- </table>
-</dl>
-
-</div>
-</div><p>
-<a class="anchor" name="a48030da1d3a1b1741ca791c9e129888"></a><!-- doxytag: member="InotifyEvent::~InotifyEvent" ref="a48030da1d3a1b1741ca791c9e129888" args="()" -->
-<div class="memitem">
-<div class="memproto">
- <table class="memname">
- <tr>
- <td class="memname">InotifyEvent::~InotifyEvent </td>
- <td>(</td>
- <td class="paramname"> </td>
- <td>&nbsp;)&nbsp;</td>
- <td><code> [inline]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Destructor.
-<p>
-
-</div>
-</div><p>
-<hr><h2>Member Function Documentation</h2>
-<a class="anchor" name="3e5d18ff8dea01d14286e4b44a2b76ea"></a><!-- doxytag: member="InotifyEvent::DumpTypes" ref="3e5d18ff8dea01d14286e4b44a2b76ea" args="(std::string &amp;rStr) const " -->
-<div class="memitem">
-<div class="memproto">
- <table class="memname">
- <tr>
- <td class="memname">void InotifyEvent::DumpTypes </td>
- <td>(</td>
- <td class="paramtype">std::string &amp;&nbsp;</td>
- <td class="paramname"> <em>rStr</em> </td>
- <td>&nbsp;)&nbsp;</td>
- <td> const</td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Fills the string with all types contained in the event mask.
-<p>
-<dl compact><dt><b>Parameters:</b></dt><dd>
- <table border="0" cellspacing="2" cellpadding="0">
- <tr><td valign="top"><tt>[out]</tt>&nbsp;</td><td valign="top"><em>rStr</em>&nbsp;</td><td>dumped event types </td></tr>
- </table>
-</dl>
-
-</div>
-</div><p>
-<a class="anchor" name="c08a0a26ea33dbe94aaf1ac830c103a5"></a><!-- doxytag: member="InotifyEvent::DumpTypes" ref="c08a0a26ea33dbe94aaf1ac830c103a5" args="(uint32_t uValue, std::string &amp;rStr)" -->
-<div class="memitem">
-<div class="memproto">
- <table class="memname">
- <tr>
- <td class="memname">void InotifyEvent::DumpTypes </td>
- <td>(</td>
- <td class="paramtype">uint32_t&nbsp;</td>
- <td class="paramname"> <em>uValue</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype">std::string &amp;&nbsp;</td>
- <td class="paramname"> <em>rStr</em></td><td>&nbsp;</td>
- </tr>
- <tr>
- <td></td>
- <td>)</td>
- <td></td><td></td><td><code> [static]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Fills the string with all types contained in an event mask value.
-<p>
-<dl compact><dt><b>Parameters:</b></dt><dd>
- <table border="0" cellspacing="2" cellpadding="0">
- <tr><td valign="top"><tt>[in]</tt>&nbsp;</td><td valign="top"><em>uValue</em>&nbsp;</td><td>event mask value </td></tr>
- <tr><td valign="top"><tt>[out]</tt>&nbsp;</td><td valign="top"><em>rStr</em>&nbsp;</td><td>dumped event types </td></tr>
- </table>
-</dl>
-
-<p>
-<div class="dynheader">
-Here is the caller graph for this function:</div>
-<div class="dynsection">
-<p><center><img src="classInotifyEvent_c08a0a26ea33dbe94aaf1ac830c103a5_icgraph.png" border="0" usemap="#classInotifyEvent_c08a0a26ea33dbe94aaf1ac830c103a5_icgraph_map" alt=""></center>
-<map name="classInotifyEvent_c08a0a26ea33dbe94aaf1ac830c103a5_icgraph_map">
-<area shape="rect" href="classInotifyEvent.html#3e5d18ff8dea01d14286e4b44a2b76ea" title="Fills the string with all types contained in the event mask." alt="" coords="220,5,383,32"></map>
-</div>
-
-</div>
-</div><p>
-<a class="anchor" name="7e65e49f7d0f11c71442e31d688e4b17"></a><!-- doxytag: member="InotifyEvent::GetCookie" ref="7e65e49f7d0f11c71442e31d688e4b17" args="() const " -->
-<div class="memitem">
-<div class="memproto">
- <table class="memname">
- <tr>
- <td class="memname">uint32_t InotifyEvent::GetCookie </td>
- <td>(</td>
- <td class="paramname"> </td>
- <td>&nbsp;)&nbsp;</td>
- <td> const<code> [inline]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Returns the event cookie.
-<p>
-<dl class="return" compact><dt><b>Returns:</b></dt><dd>event cookie </dd></dl>
-
-</div>
-</div><p>
-<a class="anchor" name="463aacc1f660fbc1c39108feb2601341"></a><!-- doxytag: member="InotifyEvent::GetDescriptor" ref="463aacc1f660fbc1c39108feb2601341" args="() const " -->
-<div class="memitem">
-<div class="memproto">
- <table class="memname">
- <tr>
- <td class="memname">int32_t InotifyEvent::GetDescriptor </td>
- <td>(</td>
- <td class="paramname"> </td>
- <td>&nbsp;)&nbsp;</td>
- <td> const</td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Returns the event watch descriptor.
-<p>
-<dl class="return" compact><dt><b>Returns:</b></dt><dd>watch descriptor</dd></dl>
-<dl class="see" compact><dt><b>See also:</b></dt><dd><a class="el" href="classInotifyWatch.html#855f982421402dd63d064dde328f2a59" title="Returns the watch descriptor.">InotifyWatch::GetDescriptor()</a> </dd></dl>
-
-</div>
-</div><p>
-<a class="anchor" name="30c8c2e1e490b8968ab9cb3364fe579a"></a><!-- doxytag: member="InotifyEvent::GetLength" ref="30c8c2e1e490b8968ab9cb3364fe579a" args="() const " -->
-<div class="memitem">
-<div class="memproto">
- <table class="memname">
- <tr>
- <td class="memname">uint32_t InotifyEvent::GetLength </td>
- <td>(</td>
- <td class="paramname"> </td>
- <td>&nbsp;)&nbsp;</td>
- <td> const<code> [inline]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Returns the event name length.
-<p>
-<dl class="return" compact><dt><b>Returns:</b></dt><dd>event name length </dd></dl>
-
-</div>
-</div><p>
-<a class="anchor" name="c7160544f6f4f24611df57a4422ac47f"></a><!-- doxytag: member="InotifyEvent::GetMask" ref="c7160544f6f4f24611df57a4422ac47f" args="() const " -->
-<div class="memitem">
-<div class="memproto">
- <table class="memname">
- <tr>
- <td class="memname">uint32_t InotifyEvent::GetMask </td>
- <td>(</td>
- <td class="paramname"> </td>
- <td>&nbsp;)&nbsp;</td>
- <td> const<code> [inline]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Returns the event mask.
-<p>
-<dl class="return" compact><dt><b>Returns:</b></dt><dd>event mask</dd></dl>
-<dl class="see" compact><dt><b>See also:</b></dt><dd><a class="el" href="classInotifyWatch.html#f759f9baca6f4abbbaae57e076486009" title="Returns the watch event mask.">InotifyWatch::GetMask()</a> </dd></dl>
-
-<p>
-<div class="dynheader">
-Here is the caller graph for this function:</div>
-<div class="dynsection">
-<p><center><img src="classInotifyEvent_c7160544f6f4f24611df57a4422ac47f_icgraph.png" border="0" usemap="#classInotifyEvent_c7160544f6f4f24611df57a4422ac47f_icgraph_map" alt=""></center>
-<map name="classInotifyEvent_c7160544f6f4f24611df57a4422ac47f_icgraph_map">
-<area shape="rect" href="classInotify.html#139c27c6643bb199619f3eae9b32e53b" title="Waits for inotify events." alt="" coords="204,5,351,32"></map>
-</div>
-
-</div>
-</div><p>
-<a class="anchor" name="eced3a88a6dea190c5df19c2a6599010"></a><!-- doxytag: member="InotifyEvent::GetMaskByName" ref="eced3a88a6dea190c5df19c2a6599010" args="(const std::string &amp;rName)" -->
-<div class="memitem">
-<div class="memproto">
- <table class="memname">
- <tr>
- <td class="memname">uint32_t InotifyEvent::GetMaskByName </td>
- <td>(</td>
- <td class="paramtype">const std::string &amp;&nbsp;</td>
- <td class="paramname"> <em>rName</em> </td>
- <td>&nbsp;)&nbsp;</td>
- <td><code> [static]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Finds the appropriate mask for a name.
-<p>
-<dl compact><dt><b>Parameters:</b></dt><dd>
- <table border="0" cellspacing="2" cellpadding="0">
- <tr><td valign="top"><tt>[in]</tt>&nbsp;</td><td valign="top"><em>rName</em>&nbsp;</td><td>mask name </td></tr>
- </table>
-</dl>
-<dl class="return" compact><dt><b>Returns:</b></dt><dd>mask for name; 0 on failure </dd></dl>
-
-</div>
-</div><p>
-<a class="anchor" name="3aea2437ba8553be703d91b45247a68f"></a><!-- doxytag: member="InotifyEvent::GetName" ref="3aea2437ba8553be703d91b45247a68f" args="(std::string &amp;rName) const " -->
-<div class="memitem">
-<div class="memproto">
- <table class="memname">
- <tr>
- <td class="memname">void InotifyEvent::GetName </td>
- <td>(</td>
- <td class="paramtype">std::string &amp;&nbsp;</td>
- <td class="paramname"> <em>rName</em> </td>
- <td>&nbsp;)&nbsp;</td>
- <td> const<code> [inline]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Extracts the event name.
-<p>
-<dl compact><dt><b>Parameters:</b></dt><dd>
- <table border="0" cellspacing="2" cellpadding="0">
- <tr><td valign="top"><tt>[out]</tt>&nbsp;</td><td valign="top"><em>rName</em>&nbsp;</td><td>event name </td></tr>
- </table>
-</dl>
-
-</div>
-</div><p>
-<a class="anchor" name="5ab91d587bdc7ab3c18c6cdff73f3097"></a><!-- doxytag: member="InotifyEvent::GetName" ref="5ab91d587bdc7ab3c18c6cdff73f3097" args="() const " -->
-<div class="memitem">
-<div class="memproto">
- <table class="memname">
- <tr>
- <td class="memname">const std::string&amp; InotifyEvent::GetName </td>
- <td>(</td>
- <td class="paramname"> </td>
- <td>&nbsp;)&nbsp;</td>
- <td> const<code> [inline]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Returns the event name.
-<p>
-<dl class="return" compact><dt><b>Returns:</b></dt><dd>event name </dd></dl>
-
-<p>
-<div class="dynheader">
-Here is the caller graph for this function:</div>
-<div class="dynsection">
-<p><center><img src="classInotifyEvent_5ab91d587bdc7ab3c18c6cdff73f3097_icgraph.png" border="0" usemap="#classInotifyEvent_5ab91d587bdc7ab3c18c6cdff73f3097_icgraph_map" alt=""></center>
-<map name="classInotifyEvent_5ab91d587bdc7ab3c18c6cdff73f3097_icgraph_map">
-<area shape="rect" href="classInotifyEvent.html#3aea2437ba8553be703d91b45247a68f" title="Extracts the event name." alt="" coords="207,5,356,32"></map>
-</div>
-
-</div>
-</div><p>
-<a class="anchor" name="979cd46f53ed674331a5a6d47d1cde92"></a><!-- doxytag: member="InotifyEvent::GetWatch" ref="979cd46f53ed674331a5a6d47d1cde92" args="()" -->
-<div class="memitem">
-<div class="memproto">
- <table class="memname">
- <tr>
- <td class="memname"><a class="el" href="classInotifyWatch.html">InotifyWatch</a>* InotifyEvent::GetWatch </td>
- <td>(</td>
- <td class="paramname"> </td>
- <td>&nbsp;)&nbsp;</td>
- <td><code> [inline]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Returns the source watch.
-<p>
-<dl class="return" compact><dt><b>Returns:</b></dt><dd>source watch </dd></dl>
-
-</div>
-</div><p>
-<a class="anchor" name="477ae71116ec393434a1f62a7170a156"></a><!-- doxytag: member="InotifyEvent::IsType" ref="477ae71116ec393434a1f62a7170a156" args="(uint32_t uType) const " -->
-<div class="memitem">
-<div class="memproto">
- <table class="memname">
- <tr>
- <td class="memname">bool InotifyEvent::IsType </td>
- <td>(</td>
- <td class="paramtype">uint32_t&nbsp;</td>
- <td class="paramname"> <em>uType</em> </td>
- <td>&nbsp;)&nbsp;</td>
- <td> const<code> [inline]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Checks for the event type.
-<p>
-<dl compact><dt><b>Parameters:</b></dt><dd>
- <table border="0" cellspacing="2" cellpadding="0">
- <tr><td valign="top"><tt>[in]</tt>&nbsp;</td><td valign="top"><em>uType</em>&nbsp;</td><td>type which is checked for </td></tr>
- </table>
-</dl>
-<dl class="return" compact><dt><b>Returns:</b></dt><dd>true = event mask contains the given type, false = otherwise </dd></dl>
-
-</div>
-</div><p>
-<a class="anchor" name="309ebf3c5b131522295185a926d551bb"></a><!-- doxytag: member="InotifyEvent::IsType" ref="309ebf3c5b131522295185a926d551bb" args="(uint32_t uValue, uint32_t uType)" -->
-<div class="memitem">
-<div class="memproto">
- <table class="memname">
- <tr>
- <td class="memname">static bool InotifyEvent::IsType </td>
- <td>(</td>
- <td class="paramtype">uint32_t&nbsp;</td>
- <td class="paramname"> <em>uValue</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype">uint32_t&nbsp;</td>
- <td class="paramname"> <em>uType</em></td><td>&nbsp;</td>
- </tr>
- <tr>
- <td></td>
- <td>)</td>
- <td></td><td></td><td><code> [inline, static]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Checks a value for the event type.
-<p>
-<dl compact><dt><b>Parameters:</b></dt><dd>
- <table border="0" cellspacing="2" cellpadding="0">
- <tr><td valign="top"><tt>[in]</tt>&nbsp;</td><td valign="top"><em>uValue</em>&nbsp;</td><td>checked value </td></tr>
- <tr><td valign="top"><tt>[in]</tt>&nbsp;</td><td valign="top"><em>uType</em>&nbsp;</td><td>type which is checked for </td></tr>
- </table>
-</dl>
-<dl class="return" compact><dt><b>Returns:</b></dt><dd>true = the value contains the given type, false = otherwise </dd></dl>
-
-<p>
-<div class="dynheader">
-Here is the caller graph for this function:</div>
-<div class="dynsection">
-<p><center><img src="classInotifyEvent_309ebf3c5b131522295185a926d551bb_icgraph.png" border="0" usemap="#classInotifyEvent_309ebf3c5b131522295185a926d551bb_icgraph_map" alt=""></center>
-<map name="classInotifyEvent_309ebf3c5b131522295185a926d551bb_icgraph_map">
-<area shape="rect" href="classInotifyEvent.html#c08a0a26ea33dbe94aaf1ac830c103a5" title="Fills the string with all types contained in an event mask value." alt="" coords="188,5,351,32"><area shape="rect" href="classInotifyEvent.html#477ae71116ec393434a1f62a7170a156" title="Checks for the event type." alt="" coords="203,56,336,83"><area shape="rect" href="classInotify.html#139c27c6643bb199619f3eae9b32e53b" title="Waits for inotify events." alt="" coords="196,107,343,133"><area shape="rect" href="classInotifyEvent.html#3e5d18ff8dea01d14286e4b44a2b76ea" title="Fills the string with all types contained in the event mask." alt="" coords="401,5,564,32"></map>
-</div>
-
-</div>
-</div><p>
-<hr><h2>Member Data Documentation</h2>
-<a class="anchor" name="6c507a3466515aedc266bdc267079604"></a><!-- doxytag: member="InotifyEvent::m_name" ref="6c507a3466515aedc266bdc267079604" args="" -->
-<div class="memitem">
-<div class="memproto">
- <table class="memname">
- <tr>
- <td class="memname">std::string <a class="el" href="classInotifyEvent.html#6c507a3466515aedc266bdc267079604">InotifyEvent::m_name</a><code> [private]</code> </td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-name
-<p>
-
-</div>
-</div><p>
-<a class="anchor" name="2d151cdcc547ee4ce49cfd44328d87ac"></a><!-- doxytag: member="InotifyEvent::m_pWatch" ref="2d151cdcc547ee4ce49cfd44328d87ac" args="" -->
-<div class="memitem">
-<div class="memproto">
- <table class="memname">
- <tr>
- <td class="memname"><a class="el" href="classInotifyWatch.html">InotifyWatch</a>* <a class="el" href="classInotifyEvent.html#2d151cdcc547ee4ce49cfd44328d87ac">InotifyEvent::m_pWatch</a><code> [private]</code> </td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-source watch
-<p>
-
-</div>
-</div><p>
-<a class="anchor" name="bf417d466fb0173d337cc66539ee55af"></a><!-- doxytag: member="InotifyEvent::m_uCookie" ref="bf417d466fb0173d337cc66539ee55af" args="" -->
-<div class="memitem">
-<div class="memproto">
- <table class="memname">
- <tr>
- <td class="memname">uint32_t <a class="el" href="classInotifyEvent.html#bf417d466fb0173d337cc66539ee55af">InotifyEvent::m_uCookie</a><code> [private]</code> </td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-cookie
-<p>
-
-</div>
-</div><p>
-<a class="anchor" name="739a943357af0c3fafd58466803e04fa"></a><!-- doxytag: member="InotifyEvent::m_uMask" ref="739a943357af0c3fafd58466803e04fa" args="" -->
-<div class="memitem">
-<div class="memproto">
- <table class="memname">
- <tr>
- <td class="memname">uint32_t <a class="el" href="classInotifyEvent.html#739a943357af0c3fafd58466803e04fa">InotifyEvent::m_uMask</a><code> [private]</code> </td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-mask
-<p>
-
-</div>
-</div><p>
-<hr>The documentation for this class was generated from the following files:<ul>
-<li><a class="el" href="inotify-cxx_8h_source.html">inotify-cxx.h</a><li><a class="el" href="inotify-cxx_8cpp.html">inotify-cxx.cpp</a></ul>
-</div>
-<hr size="1"><address style="text-align: right;"><small><a href="http://www.doxygen.org/index.html">
-<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> </small></address>
-</body>
-</html>
diff --git a/shared/inotify/doc/html/classInotifyEvent_309ebf3c5b131522295185a926d551bb_icgraph.map b/shared/inotify/doc/html/classInotifyEvent_309ebf3c5b131522295185a926d551bb_icgraph.map
deleted file mode 100644
index e31ea0ca..00000000
--- a/shared/inotify/doc/html/classInotifyEvent_309ebf3c5b131522295185a926d551bb_icgraph.map
+++ /dev/null
@@ -1,4 +0,0 @@
-<area shape="rect" href="$classInotifyEvent.html#c08a0a26ea33dbe94aaf1ac830c103a5" title="Fills the string with all types contained in an event mask value." alt="" coords="188,5,351,32">
-<area shape="rect" href="$classInotifyEvent.html#477ae71116ec393434a1f62a7170a156" title="Checks for the event type." alt="" coords="203,56,336,83">
-<area shape="rect" href="$classInotify.html#139c27c6643bb199619f3eae9b32e53b" title="Waits for inotify events." alt="" coords="196,107,343,133">
-<area shape="rect" href="$classInotifyEvent.html#3e5d18ff8dea01d14286e4b44a2b76ea" title="Fills the string with all types contained in the event mask." alt="" coords="401,5,564,32">
diff --git a/shared/inotify/doc/html/classInotifyEvent_309ebf3c5b131522295185a926d551bb_icgraph.md5 b/shared/inotify/doc/html/classInotifyEvent_309ebf3c5b131522295185a926d551bb_icgraph.md5
deleted file mode 100644
index c108d32f..00000000
--- a/shared/inotify/doc/html/classInotifyEvent_309ebf3c5b131522295185a926d551bb_icgraph.md5
+++ /dev/null
@@ -1 +0,0 @@
-80a24dfdb3ffd06ee1dfd925cc6feb7e \ No newline at end of file
diff --git a/shared/inotify/doc/html/classInotifyEvent_309ebf3c5b131522295185a926d551bb_icgraph.png b/shared/inotify/doc/html/classInotifyEvent_309ebf3c5b131522295185a926d551bb_icgraph.png
deleted file mode 100644
index 72a734da..00000000
--- a/shared/inotify/doc/html/classInotifyEvent_309ebf3c5b131522295185a926d551bb_icgraph.png
+++ /dev/null
Binary files differ
diff --git a/shared/inotify/doc/html/classInotifyEvent_5ab91d587bdc7ab3c18c6cdff73f3097_icgraph.map b/shared/inotify/doc/html/classInotifyEvent_5ab91d587bdc7ab3c18c6cdff73f3097_icgraph.map
deleted file mode 100644
index 61683c0b..00000000
--- a/shared/inotify/doc/html/classInotifyEvent_5ab91d587bdc7ab3c18c6cdff73f3097_icgraph.map
+++ /dev/null
@@ -1 +0,0 @@
-<area shape="rect" href="$classInotifyEvent.html#3aea2437ba8553be703d91b45247a68f" title="Extracts the event name." alt="" coords="207,5,356,32">
diff --git a/shared/inotify/doc/html/classInotifyEvent_5ab91d587bdc7ab3c18c6cdff73f3097_icgraph.md5 b/shared/inotify/doc/html/classInotifyEvent_5ab91d587bdc7ab3c18c6cdff73f3097_icgraph.md5
deleted file mode 100644
index 390b7f98..00000000
--- a/shared/inotify/doc/html/classInotifyEvent_5ab91d587bdc7ab3c18c6cdff73f3097_icgraph.md5
+++ /dev/null
@@ -1 +0,0 @@
-eeb67887bd904a352d248b3a661c09ac \ No newline at end of file
diff --git a/shared/inotify/doc/html/classInotifyEvent_5ab91d587bdc7ab3c18c6cdff73f3097_icgraph.png b/shared/inotify/doc/html/classInotifyEvent_5ab91d587bdc7ab3c18c6cdff73f3097_icgraph.png
deleted file mode 100644
index 66409056..00000000
--- a/shared/inotify/doc/html/classInotifyEvent_5ab91d587bdc7ab3c18c6cdff73f3097_icgraph.png
+++ /dev/null
Binary files differ
diff --git a/shared/inotify/doc/html/classInotifyEvent__coll__graph.map b/shared/inotify/doc/html/classInotifyEvent__coll__graph.map
deleted file mode 100644
index fc3ab859..00000000
--- a/shared/inotify/doc/html/classInotifyEvent__coll__graph.map
+++ /dev/null
@@ -1,2 +0,0 @@
-<area shape="rect" href="$classInotifyWatch.html" title="inotify watch class" alt="" coords="5,96,99,123">
-<area shape="rect" href="$classInotify.html" title="inotify class" alt="" coords="24,5,80,32">
diff --git a/shared/inotify/doc/html/classInotifyEvent__coll__graph.md5 b/shared/inotify/doc/html/classInotifyEvent__coll__graph.md5
deleted file mode 100644
index 6d1a7d05..00000000
--- a/shared/inotify/doc/html/classInotifyEvent__coll__graph.md5
+++ /dev/null
@@ -1 +0,0 @@
-10fc9c98fa3b1e02aafb36817e9e1285 \ No newline at end of file
diff --git a/shared/inotify/doc/html/classInotifyEvent__coll__graph.png b/shared/inotify/doc/html/classInotifyEvent__coll__graph.png
deleted file mode 100644
index 8c7ee763..00000000
--- a/shared/inotify/doc/html/classInotifyEvent__coll__graph.png
+++ /dev/null
Binary files differ
diff --git a/shared/inotify/doc/html/classInotifyEvent_c08a0a26ea33dbe94aaf1ac830c103a5_icgraph.map b/shared/inotify/doc/html/classInotifyEvent_c08a0a26ea33dbe94aaf1ac830c103a5_icgraph.map
deleted file mode 100644
index 1d81e141..00000000
--- a/shared/inotify/doc/html/classInotifyEvent_c08a0a26ea33dbe94aaf1ac830c103a5_icgraph.map
+++ /dev/null
@@ -1 +0,0 @@
-<area shape="rect" href="$classInotifyEvent.html#3e5d18ff8dea01d14286e4b44a2b76ea" title="Fills the string with all types contained in the event mask." alt="" coords="220,5,383,32">
diff --git a/shared/inotify/doc/html/classInotifyEvent_c08a0a26ea33dbe94aaf1ac830c103a5_icgraph.md5 b/shared/inotify/doc/html/classInotifyEvent_c08a0a26ea33dbe94aaf1ac830c103a5_icgraph.md5
deleted file mode 100644
index 2875d2e2..00000000
--- a/shared/inotify/doc/html/classInotifyEvent_c08a0a26ea33dbe94aaf1ac830c103a5_icgraph.md5
+++ /dev/null
@@ -1 +0,0 @@
-ebd2a62891a75f2964da29826a4d947b \ No newline at end of file
diff --git a/shared/inotify/doc/html/classInotifyEvent_c08a0a26ea33dbe94aaf1ac830c103a5_icgraph.png b/shared/inotify/doc/html/classInotifyEvent_c08a0a26ea33dbe94aaf1ac830c103a5_icgraph.png
deleted file mode 100644
index 85b50381..00000000
--- a/shared/inotify/doc/html/classInotifyEvent_c08a0a26ea33dbe94aaf1ac830c103a5_icgraph.png
+++ /dev/null
Binary files differ
diff --git a/shared/inotify/doc/html/classInotifyEvent_c7160544f6f4f24611df57a4422ac47f_icgraph.map b/shared/inotify/doc/html/classInotifyEvent_c7160544f6f4f24611df57a4422ac47f_icgraph.map
deleted file mode 100644
index 15b19bcc..00000000
--- a/shared/inotify/doc/html/classInotifyEvent_c7160544f6f4f24611df57a4422ac47f_icgraph.map
+++ /dev/null
@@ -1 +0,0 @@
-<area shape="rect" href="$classInotify.html#139c27c6643bb199619f3eae9b32e53b" title="Waits for inotify events." alt="" coords="204,5,351,32">
diff --git a/shared/inotify/doc/html/classInotifyEvent_c7160544f6f4f24611df57a4422ac47f_icgraph.md5 b/shared/inotify/doc/html/classInotifyEvent_c7160544f6f4f24611df57a4422ac47f_icgraph.md5
deleted file mode 100644
index 97058b10..00000000
--- a/shared/inotify/doc/html/classInotifyEvent_c7160544f6f4f24611df57a4422ac47f_icgraph.md5
+++ /dev/null
@@ -1 +0,0 @@
-c6ebbbab9c151deb92ff69c8b2dd93a1 \ No newline at end of file
diff --git a/shared/inotify/doc/html/classInotifyEvent_c7160544f6f4f24611df57a4422ac47f_icgraph.png b/shared/inotify/doc/html/classInotifyEvent_c7160544f6f4f24611df57a4422ac47f_icgraph.png
deleted file mode 100644
index 6ede661d..00000000
--- a/shared/inotify/doc/html/classInotifyEvent_c7160544f6f4f24611df57a4422ac47f_icgraph.png
+++ /dev/null
Binary files differ
diff --git a/shared/inotify/doc/html/classInotifyException-members.html b/shared/inotify/doc/html/classInotifyException-members.html
deleted file mode 100644
index 27079a8a..00000000
--- a/shared/inotify/doc/html/classInotifyException-members.html
+++ /dev/null
@@ -1,36 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
-<title>inotify-cxx: Member List</title>
-<link href="tabs.css" rel="stylesheet" type="text/css">
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.5.9 -->
-<div class="navigation" id="top">
- <div class="tabs">
- <ul>
- <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
- <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
- <li><a href="files.html"><span>Files</span></a></li>
- </ul>
- </div>
- <div class="tabs">
- <ul>
- <li><a href="annotated.html"><span>Class&nbsp;List</span></a></li>
- <li><a href="functions.html"><span>Class&nbsp;Members</span></a></li>
- </ul>
- </div>
-</div>
-<div class="contents">
-<h1>InotifyException Member List</h1>This is the complete list of members for <a class="el" href="classInotifyException.html">InotifyException</a>, including all inherited members.<p><table>
- <tr class="memlist"><td><a class="el" href="classInotifyException.html#60d885f998a6cb97d06111e6aded155d">GetErrorNumber</a>() const </td><td><a class="el" href="classInotifyException.html">InotifyException</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="classInotifyException.html#6364ea375697356805d47cff957dd757">GetMessage</a>() const </td><td><a class="el" href="classInotifyException.html">InotifyException</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="classInotifyException.html#619e8b963faebdefb283d79b5ae5c408">GetSource</a>() const </td><td><a class="el" href="classInotifyException.html">InotifyException</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="classInotifyException.html#900dc29e5cfb3ece6c1651d04773b2bb">InotifyException</a>(const std::string &amp;rMsg=&quot;&quot;, int iErr=0, void *pSrc=NULL)</td><td><a class="el" href="classInotifyException.html">InotifyException</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="classInotifyException.html#aa8a163c661ce70e34b3e3e7ad700854">m_err</a></td><td><a class="el" href="classInotifyException.html">InotifyException</a></td><td><code> [protected]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="classInotifyException.html#c113719bd6f4352e12876b2322f1c92c">m_msg</a></td><td><a class="el" href="classInotifyException.html">InotifyException</a></td><td><code> [protected]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="classInotifyException.html#dd106c2255890025561245cf91fe1427">m_pSrc</a></td><td><a class="el" href="classInotifyException.html">InotifyException</a></td><td><code> [mutable, protected]</code></td></tr>
-</table></div>
-<hr size="1"><address style="text-align: right;"><small><a href="http://www.doxygen.org/index.html">
-<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> </small></address>
-</body>
-</html>
diff --git a/shared/inotify/doc/html/classInotifyException.html b/shared/inotify/doc/html/classInotifyException.html
deleted file mode 100644
index 6b3b55bf..00000000
--- a/shared/inotify/doc/html/classInotifyException.html
+++ /dev/null
@@ -1,232 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
-<title>inotify-cxx: InotifyException Class Reference</title>
-<link href="tabs.css" rel="stylesheet" type="text/css">
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.5.9 -->
-<div class="navigation" id="top">
- <div class="tabs">
- <ul>
- <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
- <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
- <li><a href="files.html"><span>Files</span></a></li>
- </ul>
- </div>
- <div class="tabs">
- <ul>
- <li><a href="annotated.html"><span>Class&nbsp;List</span></a></li>
- <li><a href="functions.html"><span>Class&nbsp;Members</span></a></li>
- </ul>
- </div>
-</div>
-<div class="contents">
-<h1>InotifyException Class Reference</h1><!-- doxytag: class="InotifyException" -->Class for inotify exceptions.
-<a href="#_details">More...</a>
-<p>
-<code>#include &lt;<a class="el" href="inotify-cxx_8h_source.html">inotify-cxx.h</a>&gt;</code>
-<p>
-
-<p>
-<a href="classInotifyException-members.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
-<tr><td></td></tr>
-<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classInotifyException.html#900dc29e5cfb3ece6c1651d04773b2bb">InotifyException</a> (const std::string &amp;rMsg=&quot;&quot;, int iErr=0, void *pSrc=NULL)</td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Constructor. <a href="#900dc29e5cfb3ece6c1651d04773b2bb"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">const std::string &amp;&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classInotifyException.html#6364ea375697356805d47cff957dd757">GetMessage</a> () const </td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Returns the exception message. <a href="#6364ea375697356805d47cff957dd757"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">int&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classInotifyException.html#60d885f998a6cb97d06111e6aded155d">GetErrorNumber</a> () const </td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Returns the exception error number. <a href="#60d885f998a6cb97d06111e6aded155d"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">void *&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classInotifyException.html#619e8b963faebdefb283d79b5ae5c408">GetSource</a> () const </td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Returns the exception source. <a href="#619e8b963faebdefb283d79b5ae5c408"></a><br></td></tr>
-<tr><td colspan="2"><br><h2>Protected Attributes</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">std::string&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classInotifyException.html#c113719bd6f4352e12876b2322f1c92c">m_msg</a></td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">message <a href="#c113719bd6f4352e12876b2322f1c92c"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">int&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classInotifyException.html#aa8a163c661ce70e34b3e3e7ad700854">m_err</a></td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">error number <a href="#aa8a163c661ce70e34b3e3e7ad700854"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">void *&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classInotifyException.html#dd106c2255890025561245cf91fe1427">m_pSrc</a></td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">source <a href="#dd106c2255890025561245cf91fe1427"></a><br></td></tr>
-</table>
-<hr><a name="_details"></a><h2>Detailed Description</h2>
-Class for inotify exceptions.
-<p>
-This class allows to acquire information about exceptional events. It makes easier to log or display error messages and to identify problematic code locations.<p>
-Although this class is basically thread-safe it is not intended to be shared between threads. <hr><h2>Constructor &amp; Destructor Documentation</h2>
-<a class="anchor" name="900dc29e5cfb3ece6c1651d04773b2bb"></a><!-- doxytag: member="InotifyException::InotifyException" ref="900dc29e5cfb3ece6c1651d04773b2bb" args="(const std::string &amp;rMsg=&quot;&quot;, int iErr=0, void *pSrc=NULL)" -->
-<div class="memitem">
-<div class="memproto">
- <table class="memname">
- <tr>
- <td class="memname">InotifyException::InotifyException </td>
- <td>(</td>
- <td class="paramtype">const std::string &amp;&nbsp;</td>
- <td class="paramname"> <em>rMsg</em> = <code>&quot;&quot;</code>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype">int&nbsp;</td>
- <td class="paramname"> <em>iErr</em> = <code>0</code>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype">void *&nbsp;</td>
- <td class="paramname"> <em>pSrc</em> = <code>NULL</code></td><td>&nbsp;</td>
- </tr>
- <tr>
- <td></td>
- <td>)</td>
- <td></td><td></td><td><code> [inline]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Constructor.
-<p>
-<dl compact><dt><b>Parameters:</b></dt><dd>
- <table border="0" cellspacing="2" cellpadding="0">
- <tr><td valign="top"><tt>[in]</tt>&nbsp;</td><td valign="top"><em>rMsg</em>&nbsp;</td><td>message </td></tr>
- <tr><td valign="top"><tt>[in]</tt>&nbsp;</td><td valign="top"><em>iErr</em>&nbsp;</td><td>error number (see errno.h) </td></tr>
- <tr><td valign="top"><tt>[in]</tt>&nbsp;</td><td valign="top"><em>pSrc</em>&nbsp;</td><td>source </td></tr>
- </table>
-</dl>
-
-</div>
-</div><p>
-<hr><h2>Member Function Documentation</h2>
-<a class="anchor" name="60d885f998a6cb97d06111e6aded155d"></a><!-- doxytag: member="InotifyException::GetErrorNumber" ref="60d885f998a6cb97d06111e6aded155d" args="() const " -->
-<div class="memitem">
-<div class="memproto">
- <table class="memname">
- <tr>
- <td class="memname">int InotifyException::GetErrorNumber </td>
- <td>(</td>
- <td class="paramname"> </td>
- <td>&nbsp;)&nbsp;</td>
- <td> const<code> [inline]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Returns the exception error number.
-<p>
-If not applicable this value is 0 (zero).<p>
-<dl class="return" compact><dt><b>Returns:</b></dt><dd>error number (standardized; see errno.h) </dd></dl>
-
-</div>
-</div><p>
-<a class="anchor" name="6364ea375697356805d47cff957dd757"></a><!-- doxytag: member="InotifyException::GetMessage" ref="6364ea375697356805d47cff957dd757" args="() const " -->
-<div class="memitem">
-<div class="memproto">
- <table class="memname">
- <tr>
- <td class="memname">const std::string&amp; InotifyException::GetMessage </td>
- <td>(</td>
- <td class="paramname"> </td>
- <td>&nbsp;)&nbsp;</td>
- <td> const<code> [inline]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Returns the exception message.
-<p>
-<dl class="return" compact><dt><b>Returns:</b></dt><dd>message </dd></dl>
-
-</div>
-</div><p>
-<a class="anchor" name="619e8b963faebdefb283d79b5ae5c408"></a><!-- doxytag: member="InotifyException::GetSource" ref="619e8b963faebdefb283d79b5ae5c408" args="() const " -->
-<div class="memitem">
-<div class="memproto">
- <table class="memname">
- <tr>
- <td class="memname">void* InotifyException::GetSource </td>
- <td>(</td>
- <td class="paramname"> </td>
- <td>&nbsp;)&nbsp;</td>
- <td> const<code> [inline]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Returns the exception source.
-<p>
-<dl class="return" compact><dt><b>Returns:</b></dt><dd>source </dd></dl>
-
-</div>
-</div><p>
-<hr><h2>Member Data Documentation</h2>
-<a class="anchor" name="aa8a163c661ce70e34b3e3e7ad700854"></a><!-- doxytag: member="InotifyException::m_err" ref="aa8a163c661ce70e34b3e3e7ad700854" args="" -->
-<div class="memitem">
-<div class="memproto">
- <table class="memname">
- <tr>
- <td class="memname">int <a class="el" href="classInotifyException.html#aa8a163c661ce70e34b3e3e7ad700854">InotifyException::m_err</a><code> [protected]</code> </td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-error number
-<p>
-
-</div>
-</div><p>
-<a class="anchor" name="c113719bd6f4352e12876b2322f1c92c"></a><!-- doxytag: member="InotifyException::m_msg" ref="c113719bd6f4352e12876b2322f1c92c" args="" -->
-<div class="memitem">
-<div class="memproto">
- <table class="memname">
- <tr>
- <td class="memname">std::string <a class="el" href="classInotifyException.html#c113719bd6f4352e12876b2322f1c92c">InotifyException::m_msg</a><code> [protected]</code> </td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-message
-<p>
-
-</div>
-</div><p>
-<a class="anchor" name="dd106c2255890025561245cf91fe1427"></a><!-- doxytag: member="InotifyException::m_pSrc" ref="dd106c2255890025561245cf91fe1427" args="" -->
-<div class="memitem">
-<div class="memproto">
- <table class="memname">
- <tr>
- <td class="memname">void* <a class="el" href="classInotifyException.html#dd106c2255890025561245cf91fe1427">InotifyException::m_pSrc</a><code> [mutable, protected]</code> </td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-source
-<p>
-
-</div>
-</div><p>
-<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="inotify-cxx_8h_source.html">inotify-cxx.h</a></ul>
-</div>
-<hr size="1"><address style="text-align: right;"><small><a href="http://www.doxygen.org/index.html">
-<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> </small></address>
-</body>
-</html>
diff --git a/shared/inotify/doc/html/classInotifyWatch-members.html b/shared/inotify/doc/html/classInotifyWatch-members.html
deleted file mode 100644
index 00668fc3..00000000
--- a/shared/inotify/doc/html/classInotifyWatch-members.html
+++ /dev/null
@@ -1,46 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
-<title>inotify-cxx: Member List</title>
-<link href="tabs.css" rel="stylesheet" type="text/css">
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.5.9 -->
-<div class="navigation" id="top">
- <div class="tabs">
- <ul>
- <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
- <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
- <li><a href="files.html"><span>Files</span></a></li>
- </ul>
- </div>
- <div class="tabs">
- <ul>
- <li><a href="annotated.html"><span>Class&nbsp;List</span></a></li>
- <li><a href="functions.html"><span>Class&nbsp;Members</span></a></li>
- </ul>
- </div>
-</div>
-<div class="contents">
-<h1>InotifyWatch Member List</h1>This is the complete list of members for <a class="el" href="classInotifyWatch.html">InotifyWatch</a>, including all inherited members.<p><table>
- <tr class="memlist"><td><a class="el" href="classInotifyWatch.html#804cdc1e9579a075a60c239b202559f4">__Disable</a>()</td><td><a class="el" href="classInotifyWatch.html">InotifyWatch</a></td><td><code> [private]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="classInotifyWatch.html#855f982421402dd63d064dde328f2a59">GetDescriptor</a>() const </td><td><a class="el" href="classInotifyWatch.html">InotifyWatch</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="classInotifyWatch.html#cbf0042d06841f9503405b104e4c35d0">GetInotify</a>()</td><td><a class="el" href="classInotifyWatch.html">InotifyWatch</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="classInotifyWatch.html#f759f9baca6f4abbbaae57e076486009">GetMask</a>() const </td><td><a class="el" href="classInotifyWatch.html">InotifyWatch</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="classInotifyWatch.html#2e659c699e7d43bd0a218fe4905784d2">GetPath</a>() const </td><td><a class="el" href="classInotifyWatch.html">InotifyWatch</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="classInotifyWatch.html#94bfb861dc18ca5d16abfcff90db8c86">Inotify</a> class</td><td><a class="el" href="classInotifyWatch.html">InotifyWatch</a></td><td><code> [friend]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="classInotifyWatch.html#c9c02f1dbd143eebd711eba03ac366e9">InotifyWatch</a>(const std::string &amp;rPath, int32_t uMask, bool fEnabled=true)</td><td><a class="el" href="classInotifyWatch.html">InotifyWatch</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="classInotifyWatch.html#5ab551a912e5acff6a9c74baaf9ea324">IsEnabled</a>() const </td><td><a class="el" href="classInotifyWatch.html">InotifyWatch</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="classInotifyWatch.html#222c911ef0e8d6f61570489ed6042e55">IsRecursive</a>() const </td><td><a class="el" href="classInotifyWatch.html">InotifyWatch</a></td><td><code> [inline]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="classInotifyWatch.html#b0c23c89cc2996bdf6f41b8ef1f1ed18">m_fEnabled</a></td><td><a class="el" href="classInotifyWatch.html">InotifyWatch</a></td><td><code> [private]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="classInotifyWatch.html#a63ba30ffdb8b9db27970bb1099e4db5">m_path</a></td><td><a class="el" href="classInotifyWatch.html">InotifyWatch</a></td><td><code> [private]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="classInotifyWatch.html#ea695aa11f6105184df1ef265be3f1b9">m_pInotify</a></td><td><a class="el" href="classInotifyWatch.html">InotifyWatch</a></td><td><code> [private]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="classInotifyWatch.html#f725ea61e3252adae6153ecb80de23a8">m_uMask</a></td><td><a class="el" href="classInotifyWatch.html">InotifyWatch</a></td><td><code> [private]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="classInotifyWatch.html#90a78898dc850b238e713e0db284fb0a">m_wd</a></td><td><a class="el" href="classInotifyWatch.html">InotifyWatch</a></td><td><code> [private]</code></td></tr>
- <tr class="memlist"><td><a class="el" href="classInotifyWatch.html#a71aff8650fadff32a3c655ca50945f1">SetEnabled</a>(bool fEnabled)</td><td><a class="el" href="classInotifyWatch.html">InotifyWatch</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="classInotifyWatch.html#3ad7fbc55c21b3fcd08c2d1d388e14b6">SetMask</a>(uint32_t uMask)</td><td><a class="el" href="classInotifyWatch.html">InotifyWatch</a></td><td></td></tr>
- <tr class="memlist"><td><a class="el" href="classInotifyWatch.html#871c16b01aa8841b36246e5b629ecaef">~InotifyWatch</a>()</td><td><a class="el" href="classInotifyWatch.html">InotifyWatch</a></td><td><code> [inline]</code></td></tr>
-</table></div>
-<hr size="1"><address style="text-align: right;"><small><a href="http://www.doxygen.org/index.html">
-<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> </small></address>
-</body>
-</html>
diff --git a/shared/inotify/doc/html/classInotifyWatch.html b/shared/inotify/doc/html/classInotifyWatch.html
deleted file mode 100644
index bc4f53e9..00000000
--- a/shared/inotify/doc/html/classInotifyWatch.html
+++ /dev/null
@@ -1,533 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
-<title>inotify-cxx: InotifyWatch Class Reference</title>
-<link href="tabs.css" rel="stylesheet" type="text/css">
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.5.9 -->
-<div class="navigation" id="top">
- <div class="tabs">
- <ul>
- <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
- <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
- <li><a href="files.html"><span>Files</span></a></li>
- </ul>
- </div>
- <div class="tabs">
- <ul>
- <li><a href="annotated.html"><span>Class&nbsp;List</span></a></li>
- <li><a href="functions.html"><span>Class&nbsp;Members</span></a></li>
- </ul>
- </div>
-</div>
-<div class="contents">
-<h1>InotifyWatch Class Reference</h1><!-- doxytag: class="InotifyWatch" -->inotify watch class
-<a href="#_details">More...</a>
-<p>
-<code>#include &lt;<a class="el" href="inotify-cxx_8h_source.html">inotify-cxx.h</a>&gt;</code>
-<p>
-<div class="dynheader">
-Collaboration diagram for InotifyWatch:</div>
-<div class="dynsection">
-<p><center><img src="classInotifyWatch__coll__graph.png" border="0" usemap="#InotifyWatch__coll__map" alt="Collaboration graph"></center>
-<map name="InotifyWatch__coll__map">
-<area shape="rect" href="classInotify.html" title="inotify class" alt="" coords="24,5,80,32"></map>
-<center><font size="2">[<a href="graph_legend.html">legend</a>]</font></center></div>
-
-<p>
-<a href="classInotifyWatch-members.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
-<tr><td></td></tr>
-<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classInotifyWatch.html#c9c02f1dbd143eebd711eba03ac366e9">InotifyWatch</a> (const std::string &amp;rPath, int32_t uMask, bool fEnabled=true)</td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Constructor. <a href="#c9c02f1dbd143eebd711eba03ac366e9"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classInotifyWatch.html#871c16b01aa8841b36246e5b629ecaef">~InotifyWatch</a> ()</td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Destructor. <a href="#871c16b01aa8841b36246e5b629ecaef"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">int32_t&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classInotifyWatch.html#855f982421402dd63d064dde328f2a59">GetDescriptor</a> () const </td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Returns the watch descriptor. <a href="#855f982421402dd63d064dde328f2a59"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">const std::string &amp;&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classInotifyWatch.html#2e659c699e7d43bd0a218fe4905784d2">GetPath</a> () const </td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Returns the watched file path. <a href="#2e659c699e7d43bd0a218fe4905784d2"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">uint32_t&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classInotifyWatch.html#f759f9baca6f4abbbaae57e076486009">GetMask</a> () const </td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Returns the watch event mask. <a href="#f759f9baca6f4abbbaae57e076486009"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classInotifyWatch.html#3ad7fbc55c21b3fcd08c2d1d388e14b6">SetMask</a> (uint32_t uMask) throw (InotifyException)</td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Sets the watch event mask. <a href="#3ad7fbc55c21b3fcd08c2d1d388e14b6"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="el" href="classInotify.html">Inotify</a> *&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classInotifyWatch.html#cbf0042d06841f9503405b104e4c35d0">GetInotify</a> ()</td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Returns the appropriate inotify class instance. <a href="#cbf0042d06841f9503405b104e4c35d0"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classInotifyWatch.html#a71aff8650fadff32a3c655ca50945f1">SetEnabled</a> (bool fEnabled) throw (InotifyException)</td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Enables/disables the watch. <a href="#a71aff8650fadff32a3c655ca50945f1"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">bool&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classInotifyWatch.html#5ab551a912e5acff6a9c74baaf9ea324">IsEnabled</a> () const </td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Checks whether the watch is enabled. <a href="#5ab551a912e5acff6a9c74baaf9ea324"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">bool&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classInotifyWatch.html#222c911ef0e8d6f61570489ed6042e55">IsRecursive</a> () const </td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Checks whether the watch is recursive. <a href="#222c911ef0e8d6f61570489ed6042e55"></a><br></td></tr>
-<tr><td colspan="2"><br><h2>Private Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">IN_LOCK_DECL void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classInotifyWatch.html#804cdc1e9579a075a60c239b202559f4">__Disable</a> ()</td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Disables the watch (due to removing by the kernel). <a href="#804cdc1e9579a075a60c239b202559f4"></a><br></td></tr>
-<tr><td colspan="2"><br><h2>Private Attributes</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">std::string&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classInotifyWatch.html#a63ba30ffdb8b9db27970bb1099e4db5">m_path</a></td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">watched file path <a href="#a63ba30ffdb8b9db27970bb1099e4db5"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">uint32_t&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classInotifyWatch.html#f725ea61e3252adae6153ecb80de23a8">m_uMask</a></td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">event mask <a href="#f725ea61e3252adae6153ecb80de23a8"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">int32_t&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classInotifyWatch.html#90a78898dc850b238e713e0db284fb0a">m_wd</a></td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">watch descriptor <a href="#90a78898dc850b238e713e0db284fb0a"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="el" href="classInotify.html">Inotify</a> *&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classInotifyWatch.html#ea695aa11f6105184df1ef265be3f1b9">m_pInotify</a></td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">inotify object <a href="#ea695aa11f6105184df1ef265be3f1b9"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">bool&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classInotifyWatch.html#b0c23c89cc2996bdf6f41b8ef1f1ed18">m_fEnabled</a></td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">events enabled yes/no <a href="#b0c23c89cc2996bdf6f41b8ef1f1ed18"></a><br></td></tr>
-<tr><td colspan="2"><br><h2>Friends</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classInotifyWatch.html#94bfb861dc18ca5d16abfcff90db8c86">Inotify</a></td></tr>
-
-</table>
-<hr><a name="_details"></a><h2>Detailed Description</h2>
-inotify watch class
-<p>
-It holds information about the inotify watch on a particular inode.<p>
-If the INOTIFY_THREAD_SAFE is defined this class is thread-safe. <hr><h2>Constructor &amp; Destructor Documentation</h2>
-<a class="anchor" name="c9c02f1dbd143eebd711eba03ac366e9"></a><!-- doxytag: member="InotifyWatch::InotifyWatch" ref="c9c02f1dbd143eebd711eba03ac366e9" args="(const std::string &amp;rPath, int32_t uMask, bool fEnabled=true)" -->
-<div class="memitem">
-<div class="memproto">
- <table class="memname">
- <tr>
- <td class="memname">InotifyWatch::InotifyWatch </td>
- <td>(</td>
- <td class="paramtype">const std::string &amp;&nbsp;</td>
- <td class="paramname"> <em>rPath</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype">int32_t&nbsp;</td>
- <td class="paramname"> <em>uMask</em>, </td>
- </tr>
- <tr>
- <td class="paramkey"></td>
- <td></td>
- <td class="paramtype">bool&nbsp;</td>
- <td class="paramname"> <em>fEnabled</em> = <code>true</code></td><td>&nbsp;</td>
- </tr>
- <tr>
- <td></td>
- <td>)</td>
- <td></td><td></td><td><code> [inline]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Constructor.
-<p>
-Creates an inotify watch. Because this watch is inactive it has an invalid descriptor (-1).<p>
-<dl compact><dt><b>Parameters:</b></dt><dd>
- <table border="0" cellspacing="2" cellpadding="0">
- <tr><td valign="top"><tt>[in]</tt>&nbsp;</td><td valign="top"><em>rPath</em>&nbsp;</td><td>watched file path </td></tr>
- <tr><td valign="top"><tt>[in]</tt>&nbsp;</td><td valign="top"><em>uMask</em>&nbsp;</td><td>mask for events </td></tr>
- <tr><td valign="top"><tt>[in]</tt>&nbsp;</td><td valign="top"><em>fEnabled</em>&nbsp;</td><td>events enabled yes/no </td></tr>
- </table>
-</dl>
-
-</div>
-</div><p>
-<a class="anchor" name="871c16b01aa8841b36246e5b629ecaef"></a><!-- doxytag: member="InotifyWatch::~InotifyWatch" ref="871c16b01aa8841b36246e5b629ecaef" args="()" -->
-<div class="memitem">
-<div class="memproto">
- <table class="memname">
- <tr>
- <td class="memname">InotifyWatch::~InotifyWatch </td>
- <td>(</td>
- <td class="paramname"> </td>
- <td>&nbsp;)&nbsp;</td>
- <td><code> [inline]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Destructor.
-<p>
-
-</div>
-</div><p>
-<hr><h2>Member Function Documentation</h2>
-<a class="anchor" name="804cdc1e9579a075a60c239b202559f4"></a><!-- doxytag: member="InotifyWatch::__Disable" ref="804cdc1e9579a075a60c239b202559f4" args="()" -->
-<div class="memitem">
-<div class="memproto">
- <table class="memname">
- <tr>
- <td class="memname">void InotifyWatch::__Disable </td>
- <td>(</td>
- <td class="paramname"> </td>
- <td>&nbsp;)&nbsp;</td>
- <td><code> [private]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Disables the watch (due to removing by the kernel).
-<p>
-This method must be called after receiving an event. It ensures the watch object is consistent with the kernel data.
-<p>
-<div class="dynheader">
-Here is the caller graph for this function:</div>
-<div class="dynsection">
-<p><center><img src="classInotifyWatch_804cdc1e9579a075a60c239b202559f4_icgraph.png" border="0" usemap="#classInotifyWatch_804cdc1e9579a075a60c239b202559f4_icgraph_map" alt=""></center>
-<map name="classInotifyWatch_804cdc1e9579a075a60c239b202559f4_icgraph_map">
-<area shape="rect" href="classInotify.html#139c27c6643bb199619f3eae9b32e53b" title="Waits for inotify events." alt="" coords="215,5,361,32"></map>
-</div>
-
-</div>
-</div><p>
-<a class="anchor" name="855f982421402dd63d064dde328f2a59"></a><!-- doxytag: member="InotifyWatch::GetDescriptor" ref="855f982421402dd63d064dde328f2a59" args="() const " -->
-<div class="memitem">
-<div class="memproto">
- <table class="memname">
- <tr>
- <td class="memname">int32_t InotifyWatch::GetDescriptor </td>
- <td>(</td>
- <td class="paramname"> </td>
- <td>&nbsp;)&nbsp;</td>
- <td> const<code> [inline]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Returns the watch descriptor.
-<p>
-<dl class="return" compact><dt><b>Returns:</b></dt><dd>watch descriptor; -1 for inactive watch </dd></dl>
-
-<p>
-<div class="dynheader">
-Here is the caller graph for this function:</div>
-<div class="dynsection">
-<p><center><img src="classInotifyWatch_855f982421402dd63d064dde328f2a59_icgraph.png" border="0" usemap="#classInotifyWatch_855f982421402dd63d064dde328f2a59_icgraph_map" alt=""></center>
-<map name="classInotifyWatch_855f982421402dd63d064dde328f2a59_icgraph_map">
-<area shape="rect" href="classInotifyEvent.html#463aacc1f660fbc1c39108feb2601341" title="Returns the event watch descriptor." alt="" coords="235,5,411,32"></map>
-</div>
-
-</div>
-</div><p>
-<a class="anchor" name="cbf0042d06841f9503405b104e4c35d0"></a><!-- doxytag: member="InotifyWatch::GetInotify" ref="cbf0042d06841f9503405b104e4c35d0" args="()" -->
-<div class="memitem">
-<div class="memproto">
- <table class="memname">
- <tr>
- <td class="memname"><a class="el" href="classInotify.html">Inotify</a>* InotifyWatch::GetInotify </td>
- <td>(</td>
- <td class="paramname"> </td>
- <td>&nbsp;)&nbsp;</td>
- <td><code> [inline]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Returns the appropriate inotify class instance.
-<p>
-<dl class="return" compact><dt><b>Returns:</b></dt><dd>inotify instance </dd></dl>
-
-</div>
-</div><p>
-<a class="anchor" name="f759f9baca6f4abbbaae57e076486009"></a><!-- doxytag: member="InotifyWatch::GetMask" ref="f759f9baca6f4abbbaae57e076486009" args="() const " -->
-<div class="memitem">
-<div class="memproto">
- <table class="memname">
- <tr>
- <td class="memname">uint32_t InotifyWatch::GetMask </td>
- <td>(</td>
- <td class="paramname"> </td>
- <td>&nbsp;)&nbsp;</td>
- <td> const<code> [inline]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Returns the watch event mask.
-<p>
-<dl class="return" compact><dt><b>Returns:</b></dt><dd>event mask </dd></dl>
-
-<p>
-<div class="dynheader">
-Here is the caller graph for this function:</div>
-<div class="dynsection">
-<p><center><img src="classInotifyWatch_f759f9baca6f4abbbaae57e076486009_icgraph.png" border="0" usemap="#classInotifyWatch_f759f9baca6f4abbbaae57e076486009_icgraph_map" alt=""></center>
-<map name="classInotifyWatch_f759f9baca6f4abbbaae57e076486009_icgraph_map">
-<area shape="rect" href="classInotify.html#2ef771ebaf982d76ebe19b3f5bc9cd83" title="Adds a new watch." alt="" coords="240,5,325,32"><area shape="rect" href="classInotify.html#139c27c6643bb199619f3eae9b32e53b" title="Waits for inotify events." alt="" coords="209,56,356,83"><area shape="rect" href="classInotify.html#35dab56d3e10bf28b5e457871adddb58" title="Adds a new watch." alt="" coords="407,5,492,32"></map>
-</div>
-
-</div>
-</div><p>
-<a class="anchor" name="2e659c699e7d43bd0a218fe4905784d2"></a><!-- doxytag: member="InotifyWatch::GetPath" ref="2e659c699e7d43bd0a218fe4905784d2" args="() const " -->
-<div class="memitem">
-<div class="memproto">
- <table class="memname">
- <tr>
- <td class="memname">const std::string&amp; InotifyWatch::GetPath </td>
- <td>(</td>
- <td class="paramname"> </td>
- <td>&nbsp;)&nbsp;</td>
- <td> const<code> [inline]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Returns the watched file path.
-<p>
-<dl class="return" compact><dt><b>Returns:</b></dt><dd>file path </dd></dl>
-
-<p>
-<div class="dynheader">
-Here is the caller graph for this function:</div>
-<div class="dynsection">
-<p><center><img src="classInotifyWatch_2e659c699e7d43bd0a218fe4905784d2_icgraph.png" border="0" usemap="#classInotifyWatch_2e659c699e7d43bd0a218fe4905784d2_icgraph_map" alt=""></center>
-<map name="classInotifyWatch_2e659c699e7d43bd0a218fe4905784d2_icgraph_map">
-<area shape="rect" href="classInotify.html#2ef771ebaf982d76ebe19b3f5bc9cd83" title="Adds a new watch." alt="" coords="204,5,289,32"><area shape="rect" href="classInotify.html#35dab56d3e10bf28b5e457871adddb58" title="Adds a new watch." alt="" coords="340,5,425,32"></map>
-</div>
-
-</div>
-</div><p>
-<a class="anchor" name="5ab551a912e5acff6a9c74baaf9ea324"></a><!-- doxytag: member="InotifyWatch::IsEnabled" ref="5ab551a912e5acff6a9c74baaf9ea324" args="() const " -->
-<div class="memitem">
-<div class="memproto">
- <table class="memname">
- <tr>
- <td class="memname">bool InotifyWatch::IsEnabled </td>
- <td>(</td>
- <td class="paramname"> </td>
- <td>&nbsp;)&nbsp;</td>
- <td> const<code> [inline]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Checks whether the watch is enabled.
-<p>
-<dl class="return" compact><dt><b>Returns:</b></dt><dd>true = enables, false = disabled </dd></dl>
-
-</div>
-</div><p>
-<a class="anchor" name="222c911ef0e8d6f61570489ed6042e55"></a><!-- doxytag: member="InotifyWatch::IsRecursive" ref="222c911ef0e8d6f61570489ed6042e55" args="() const " -->
-<div class="memitem">
-<div class="memproto">
- <table class="memname">
- <tr>
- <td class="memname">bool InotifyWatch::IsRecursive </td>
- <td>(</td>
- <td class="paramname"> </td>
- <td>&nbsp;)&nbsp;</td>
- <td> const<code> [inline]</code></td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Checks whether the watch is recursive.
-<p>
-A recursive watch monitors a directory itself and all its subdirectories. This watch is a logical object which may have many underlying kernel watches.<p>
-<dl class="return" compact><dt><b>Returns:</b></dt><dd>currently always false (recursive watches not yet supported) </dd></dl>
-<dl class="attention" compact><dt><b>Attention:</b></dt><dd>Recursive watches are currently NOT supported. They are planned for future versions. </dd></dl>
-
-</div>
-</div><p>
-<a class="anchor" name="a71aff8650fadff32a3c655ca50945f1"></a><!-- doxytag: member="InotifyWatch::SetEnabled" ref="a71aff8650fadff32a3c655ca50945f1" args="(bool fEnabled)" -->
-<div class="memitem">
-<div class="memproto">
- <table class="memname">
- <tr>
- <td class="memname">void InotifyWatch::SetEnabled </td>
- <td>(</td>
- <td class="paramtype">bool&nbsp;</td>
- <td class="paramname"> <em>fEnabled</em> </td>
- <td>&nbsp;)&nbsp;</td>
- <td> throw (<a class="el" href="classInotifyException.html">InotifyException</a>)</td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Enables/disables the watch.
-<p>
-If the watch is active (added to an instance of <a class="el" href="classInotify.html" title="inotify class">Inotify</a>) this method may fail due to unsuccessful re-setting the watch in the kernel.<p>
-Re-setting the current state has no effect.<p>
-<dl compact><dt><b>Parameters:</b></dt><dd>
- <table border="0" cellspacing="2" cellpadding="0">
- <tr><td valign="top"><tt>[in]</tt>&nbsp;</td><td valign="top"><em>fEnabled</em>&nbsp;</td><td>set enabled yes/no</td></tr>
- </table>
-</dl>
-<dl compact><dt><b>Exceptions:</b></dt><dd>
- <table border="0" cellspacing="2" cellpadding="0">
- <tr><td valign="top"></td><td valign="top"><em><a class="el" href="classInotifyException.html" title="Class for inotify exceptions.">InotifyException</a></em>&nbsp;</td><td>thrown if enabling/disabling fails </td></tr>
- </table>
-</dl>
-
-</div>
-</div><p>
-<a class="anchor" name="3ad7fbc55c21b3fcd08c2d1d388e14b6"></a><!-- doxytag: member="InotifyWatch::SetMask" ref="3ad7fbc55c21b3fcd08c2d1d388e14b6" args="(uint32_t uMask)" -->
-<div class="memitem">
-<div class="memproto">
- <table class="memname">
- <tr>
- <td class="memname">void InotifyWatch::SetMask </td>
- <td>(</td>
- <td class="paramtype">uint32_t&nbsp;</td>
- <td class="paramname"> <em>uMask</em> </td>
- <td>&nbsp;)&nbsp;</td>
- <td> throw (<a class="el" href="classInotifyException.html">InotifyException</a>)</td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Sets the watch event mask.
-<p>
-If the watch is active (added to an instance of <a class="el" href="classInotify.html" title="inotify class">Inotify</a>) this method may fail due to unsuccessful re-setting the watch in the kernel.<p>
-<dl compact><dt><b>Parameters:</b></dt><dd>
- <table border="0" cellspacing="2" cellpadding="0">
- <tr><td valign="top"><tt>[in]</tt>&nbsp;</td><td valign="top"><em>uMask</em>&nbsp;</td><td>event mask</td></tr>
- </table>
-</dl>
-<dl compact><dt><b>Exceptions:</b></dt><dd>
- <table border="0" cellspacing="2" cellpadding="0">
- <tr><td valign="top"></td><td valign="top"><em><a class="el" href="classInotifyException.html" title="Class for inotify exceptions.">InotifyException</a></em>&nbsp;</td><td>thrown if changing fails </td></tr>
- </table>
-</dl>
-
-</div>
-</div><p>
-<hr><h2>Friends And Related Function Documentation</h2>
-<a class="anchor" name="94bfb861dc18ca5d16abfcff90db8c86"></a><!-- doxytag: member="InotifyWatch::Inotify" ref="94bfb861dc18ca5d16abfcff90db8c86" args="" -->
-<div class="memitem">
-<div class="memproto">
- <table class="memname">
- <tr>
- <td class="memname">friend class <a class="el" href="classInotify.html">Inotify</a><code> [friend]</code> </td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-
-</div>
-</div><p>
-<hr><h2>Member Data Documentation</h2>
-<a class="anchor" name="b0c23c89cc2996bdf6f41b8ef1f1ed18"></a><!-- doxytag: member="InotifyWatch::m_fEnabled" ref="b0c23c89cc2996bdf6f41b8ef1f1ed18" args="" -->
-<div class="memitem">
-<div class="memproto">
- <table class="memname">
- <tr>
- <td class="memname">bool <a class="el" href="classInotifyWatch.html#b0c23c89cc2996bdf6f41b8ef1f1ed18">InotifyWatch::m_fEnabled</a><code> [private]</code> </td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-events enabled yes/no
-<p>
-
-</div>
-</div><p>
-<a class="anchor" name="a63ba30ffdb8b9db27970bb1099e4db5"></a><!-- doxytag: member="InotifyWatch::m_path" ref="a63ba30ffdb8b9db27970bb1099e4db5" args="" -->
-<div class="memitem">
-<div class="memproto">
- <table class="memname">
- <tr>
- <td class="memname">std::string <a class="el" href="classInotifyWatch.html#a63ba30ffdb8b9db27970bb1099e4db5">InotifyWatch::m_path</a><code> [private]</code> </td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-watched file path
-<p>
-
-</div>
-</div><p>
-<a class="anchor" name="ea695aa11f6105184df1ef265be3f1b9"></a><!-- doxytag: member="InotifyWatch::m_pInotify" ref="ea695aa11f6105184df1ef265be3f1b9" args="" -->
-<div class="memitem">
-<div class="memproto">
- <table class="memname">
- <tr>
- <td class="memname"><a class="el" href="classInotify.html">Inotify</a>* <a class="el" href="classInotifyWatch.html#ea695aa11f6105184df1ef265be3f1b9">InotifyWatch::m_pInotify</a><code> [private]</code> </td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-inotify object
-<p>
-
-</div>
-</div><p>
-<a class="anchor" name="f725ea61e3252adae6153ecb80de23a8"></a><!-- doxytag: member="InotifyWatch::m_uMask" ref="f725ea61e3252adae6153ecb80de23a8" args="" -->
-<div class="memitem">
-<div class="memproto">
- <table class="memname">
- <tr>
- <td class="memname">uint32_t <a class="el" href="classInotifyWatch.html#f725ea61e3252adae6153ecb80de23a8">InotifyWatch::m_uMask</a><code> [private]</code> </td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-event mask
-<p>
-
-</div>
-</div><p>
-<a class="anchor" name="90a78898dc850b238e713e0db284fb0a"></a><!-- doxytag: member="InotifyWatch::m_wd" ref="90a78898dc850b238e713e0db284fb0a" args="" -->
-<div class="memitem">
-<div class="memproto">
- <table class="memname">
- <tr>
- <td class="memname">int32_t <a class="el" href="classInotifyWatch.html#90a78898dc850b238e713e0db284fb0a">InotifyWatch::m_wd</a><code> [private]</code> </td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-watch descriptor
-<p>
-
-</div>
-</div><p>
-<hr>The documentation for this class was generated from the following files:<ul>
-<li><a class="el" href="inotify-cxx_8h_source.html">inotify-cxx.h</a><li><a class="el" href="inotify-cxx_8cpp.html">inotify-cxx.cpp</a></ul>
-</div>
-<hr size="1"><address style="text-align: right;"><small><a href="http://www.doxygen.org/index.html">
-<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> </small></address>
-</body>
-</html>
diff --git a/shared/inotify/doc/html/classInotifyWatch_2e659c699e7d43bd0a218fe4905784d2_icgraph.map b/shared/inotify/doc/html/classInotifyWatch_2e659c699e7d43bd0a218fe4905784d2_icgraph.map
deleted file mode 100644
index f27ca8a7..00000000
--- a/shared/inotify/doc/html/classInotifyWatch_2e659c699e7d43bd0a218fe4905784d2_icgraph.map
+++ /dev/null
@@ -1,2 +0,0 @@
-<area shape="rect" href="$classInotify.html#2ef771ebaf982d76ebe19b3f5bc9cd83" title="Adds a new watch." alt="" coords="204,5,289,32">
-<area shape="rect" href="$classInotify.html#35dab56d3e10bf28b5e457871adddb58" title="Adds a new watch." alt="" coords="340,5,425,32">
diff --git a/shared/inotify/doc/html/classInotifyWatch_2e659c699e7d43bd0a218fe4905784d2_icgraph.md5 b/shared/inotify/doc/html/classInotifyWatch_2e659c699e7d43bd0a218fe4905784d2_icgraph.md5
deleted file mode 100644
index fbd2ff03..00000000
--- a/shared/inotify/doc/html/classInotifyWatch_2e659c699e7d43bd0a218fe4905784d2_icgraph.md5
+++ /dev/null
@@ -1 +0,0 @@
-620e1e417c7b3a584d9a02e4d00e9a65 \ No newline at end of file
diff --git a/shared/inotify/doc/html/classInotifyWatch_2e659c699e7d43bd0a218fe4905784d2_icgraph.png b/shared/inotify/doc/html/classInotifyWatch_2e659c699e7d43bd0a218fe4905784d2_icgraph.png
deleted file mode 100644
index a8cfc58a..00000000
--- a/shared/inotify/doc/html/classInotifyWatch_2e659c699e7d43bd0a218fe4905784d2_icgraph.png
+++ /dev/null
Binary files differ
diff --git a/shared/inotify/doc/html/classInotifyWatch_804cdc1e9579a075a60c239b202559f4_icgraph.map b/shared/inotify/doc/html/classInotifyWatch_804cdc1e9579a075a60c239b202559f4_icgraph.map
deleted file mode 100644
index 45f1c8f4..00000000
--- a/shared/inotify/doc/html/classInotifyWatch_804cdc1e9579a075a60c239b202559f4_icgraph.map
+++ /dev/null
@@ -1 +0,0 @@
-<area shape="rect" href="$classInotify.html#139c27c6643bb199619f3eae9b32e53b" title="Waits for inotify events." alt="" coords="215,5,361,32">
diff --git a/shared/inotify/doc/html/classInotifyWatch_804cdc1e9579a075a60c239b202559f4_icgraph.md5 b/shared/inotify/doc/html/classInotifyWatch_804cdc1e9579a075a60c239b202559f4_icgraph.md5
deleted file mode 100644
index f49498f5..00000000
--- a/shared/inotify/doc/html/classInotifyWatch_804cdc1e9579a075a60c239b202559f4_icgraph.md5
+++ /dev/null
@@ -1 +0,0 @@
-74fca07ef5cdde676f9befabdba3c390 \ No newline at end of file
diff --git a/shared/inotify/doc/html/classInotifyWatch_804cdc1e9579a075a60c239b202559f4_icgraph.png b/shared/inotify/doc/html/classInotifyWatch_804cdc1e9579a075a60c239b202559f4_icgraph.png
deleted file mode 100644
index 9adcc985..00000000
--- a/shared/inotify/doc/html/classInotifyWatch_804cdc1e9579a075a60c239b202559f4_icgraph.png
+++ /dev/null
Binary files differ
diff --git a/shared/inotify/doc/html/classInotifyWatch_855f982421402dd63d064dde328f2a59_icgraph.map b/shared/inotify/doc/html/classInotifyWatch_855f982421402dd63d064dde328f2a59_icgraph.map
deleted file mode 100644
index dff1f4a3..00000000
--- a/shared/inotify/doc/html/classInotifyWatch_855f982421402dd63d064dde328f2a59_icgraph.map
+++ /dev/null
@@ -1 +0,0 @@
-<area shape="rect" href="$classInotifyEvent.html#463aacc1f660fbc1c39108feb2601341" title="Returns the event watch descriptor." alt="" coords="235,5,411,32">
diff --git a/shared/inotify/doc/html/classInotifyWatch_855f982421402dd63d064dde328f2a59_icgraph.md5 b/shared/inotify/doc/html/classInotifyWatch_855f982421402dd63d064dde328f2a59_icgraph.md5
deleted file mode 100644
index 17145c3b..00000000
--- a/shared/inotify/doc/html/classInotifyWatch_855f982421402dd63d064dde328f2a59_icgraph.md5
+++ /dev/null
@@ -1 +0,0 @@
-9338607b3d3a0e2804e6ced197d5c9cc \ No newline at end of file
diff --git a/shared/inotify/doc/html/classInotifyWatch_855f982421402dd63d064dde328f2a59_icgraph.png b/shared/inotify/doc/html/classInotifyWatch_855f982421402dd63d064dde328f2a59_icgraph.png
deleted file mode 100644
index 5e7dd132..00000000
--- a/shared/inotify/doc/html/classInotifyWatch_855f982421402dd63d064dde328f2a59_icgraph.png
+++ /dev/null
Binary files differ
diff --git a/shared/inotify/doc/html/classInotifyWatch__coll__graph.map b/shared/inotify/doc/html/classInotifyWatch__coll__graph.map
deleted file mode 100644
index 59ebb091..00000000
--- a/shared/inotify/doc/html/classInotifyWatch__coll__graph.map
+++ /dev/null
@@ -1 +0,0 @@
-<area shape="rect" href="$classInotify.html" title="inotify class" alt="" coords="24,5,80,32">
diff --git a/shared/inotify/doc/html/classInotifyWatch__coll__graph.md5 b/shared/inotify/doc/html/classInotifyWatch__coll__graph.md5
deleted file mode 100644
index f8ab3a5e..00000000
--- a/shared/inotify/doc/html/classInotifyWatch__coll__graph.md5
+++ /dev/null
@@ -1 +0,0 @@
-4b0e82ffc859966b60e2fb5b19162d43 \ No newline at end of file
diff --git a/shared/inotify/doc/html/classInotifyWatch__coll__graph.png b/shared/inotify/doc/html/classInotifyWatch__coll__graph.png
deleted file mode 100644
index b2a5567f..00000000
--- a/shared/inotify/doc/html/classInotifyWatch__coll__graph.png
+++ /dev/null
Binary files differ
diff --git a/shared/inotify/doc/html/classInotifyWatch_f759f9baca6f4abbbaae57e076486009_icgraph.map b/shared/inotify/doc/html/classInotifyWatch_f759f9baca6f4abbbaae57e076486009_icgraph.map
deleted file mode 100644
index ae5eb580..00000000
--- a/shared/inotify/doc/html/classInotifyWatch_f759f9baca6f4abbbaae57e076486009_icgraph.map
+++ /dev/null
@@ -1,3 +0,0 @@
-<area shape="rect" href="$classInotify.html#2ef771ebaf982d76ebe19b3f5bc9cd83" title="Adds a new watch." alt="" coords="240,5,325,32">
-<area shape="rect" href="$classInotify.html#139c27c6643bb199619f3eae9b32e53b" title="Waits for inotify events." alt="" coords="209,56,356,83">
-<area shape="rect" href="$classInotify.html#35dab56d3e10bf28b5e457871adddb58" title="Adds a new watch." alt="" coords="407,5,492,32">
diff --git a/shared/inotify/doc/html/classInotifyWatch_f759f9baca6f4abbbaae57e076486009_icgraph.md5 b/shared/inotify/doc/html/classInotifyWatch_f759f9baca6f4abbbaae57e076486009_icgraph.md5
deleted file mode 100644
index 30d2f7a4..00000000
--- a/shared/inotify/doc/html/classInotifyWatch_f759f9baca6f4abbbaae57e076486009_icgraph.md5
+++ /dev/null
@@ -1 +0,0 @@
-126051def76cebe39a5ea1e3b30484e7 \ No newline at end of file
diff --git a/shared/inotify/doc/html/classInotifyWatch_f759f9baca6f4abbbaae57e076486009_icgraph.png b/shared/inotify/doc/html/classInotifyWatch_f759f9baca6f4abbbaae57e076486009_icgraph.png
deleted file mode 100644
index 104b6dbb..00000000
--- a/shared/inotify/doc/html/classInotifyWatch_f759f9baca6f4abbbaae57e076486009_icgraph.png
+++ /dev/null
Binary files differ
diff --git a/shared/inotify/doc/html/classInotify_19cde43d082ff92bd02654610019300d_icgraph.map b/shared/inotify/doc/html/classInotify_19cde43d082ff92bd02654610019300d_icgraph.map
deleted file mode 100644
index c916a719..00000000
--- a/shared/inotify/doc/html/classInotify_19cde43d082ff92bd02654610019300d_icgraph.map
+++ /dev/null
@@ -1 +0,0 @@
-<area shape="rect" href="$classInotify.html#287dc0d238fa6edc3269441cb284f979" title="Extracts a queued inotify event (without removing)." alt="" coords="179,5,304,32">
diff --git a/shared/inotify/doc/html/classInotify_19cde43d082ff92bd02654610019300d_icgraph.md5 b/shared/inotify/doc/html/classInotify_19cde43d082ff92bd02654610019300d_icgraph.md5
deleted file mode 100644
index 4dc02268..00000000
--- a/shared/inotify/doc/html/classInotify_19cde43d082ff92bd02654610019300d_icgraph.md5
+++ /dev/null
@@ -1 +0,0 @@
-867a37f8a90b3c381b26aff122c509e1 \ No newline at end of file
diff --git a/shared/inotify/doc/html/classInotify_19cde43d082ff92bd02654610019300d_icgraph.png b/shared/inotify/doc/html/classInotify_19cde43d082ff92bd02654610019300d_icgraph.png
deleted file mode 100644
index 368ea909..00000000
--- a/shared/inotify/doc/html/classInotify_19cde43d082ff92bd02654610019300d_icgraph.png
+++ /dev/null
Binary files differ
diff --git a/shared/inotify/doc/html/classInotify_21c39bb8e5bbc1941b945c18f9005b84_icgraph.map b/shared/inotify/doc/html/classInotify_21c39bb8e5bbc1941b945c18f9005b84_icgraph.map
deleted file mode 100644
index ee280ed5..00000000
--- a/shared/inotify/doc/html/classInotify_21c39bb8e5bbc1941b945c18f9005b84_icgraph.map
+++ /dev/null
@@ -1 +0,0 @@
-<area shape="rect" href="$classInotify.html#ac1a52b2ff6bfec07021a44e55d496a6" title="Removes a watch." alt="" coords="163,5,272,32">
diff --git a/shared/inotify/doc/html/classInotify_21c39bb8e5bbc1941b945c18f9005b84_icgraph.md5 b/shared/inotify/doc/html/classInotify_21c39bb8e5bbc1941b945c18f9005b84_icgraph.md5
deleted file mode 100644
index 631afbc4..00000000
--- a/shared/inotify/doc/html/classInotify_21c39bb8e5bbc1941b945c18f9005b84_icgraph.md5
+++ /dev/null
@@ -1 +0,0 @@
-587f8ec5057bea5f3b570a712828014d \ No newline at end of file
diff --git a/shared/inotify/doc/html/classInotify_21c39bb8e5bbc1941b945c18f9005b84_icgraph.png b/shared/inotify/doc/html/classInotify_21c39bb8e5bbc1941b945c18f9005b84_icgraph.png
deleted file mode 100644
index 0c72efe9..00000000
--- a/shared/inotify/doc/html/classInotify_21c39bb8e5bbc1941b945c18f9005b84_icgraph.png
+++ /dev/null
Binary files differ
diff --git a/shared/inotify/doc/html/classInotify_2ef771ebaf982d76ebe19b3f5bc9cd83_icgraph.map b/shared/inotify/doc/html/classInotify_2ef771ebaf982d76ebe19b3f5bc9cd83_icgraph.map
deleted file mode 100644
index 57880c92..00000000
--- a/shared/inotify/doc/html/classInotify_2ef771ebaf982d76ebe19b3f5bc9cd83_icgraph.map
+++ /dev/null
@@ -1 +0,0 @@
-<area shape="rect" href="$classInotify.html#35dab56d3e10bf28b5e457871adddb58" title="Adds a new watch." alt="" coords="143,5,228,32">
diff --git a/shared/inotify/doc/html/classInotify_2ef771ebaf982d76ebe19b3f5bc9cd83_icgraph.md5 b/shared/inotify/doc/html/classInotify_2ef771ebaf982d76ebe19b3f5bc9cd83_icgraph.md5
deleted file mode 100644
index 44962c4b..00000000
--- a/shared/inotify/doc/html/classInotify_2ef771ebaf982d76ebe19b3f5bc9cd83_icgraph.md5
+++ /dev/null
@@ -1 +0,0 @@
-8d7a6b2b3b84fb672bc0326258ff14f6 \ No newline at end of file
diff --git a/shared/inotify/doc/html/classInotify_2ef771ebaf982d76ebe19b3f5bc9cd83_icgraph.png b/shared/inotify/doc/html/classInotify_2ef771ebaf982d76ebe19b3f5bc9cd83_icgraph.png
deleted file mode 100644
index 65078cda..00000000
--- a/shared/inotify/doc/html/classInotify_2ef771ebaf982d76ebe19b3f5bc9cd83_icgraph.png
+++ /dev/null
Binary files differ
diff --git a/shared/inotify/doc/html/classInotify_490a3f824c6d041d31ccaabe9bd92008_icgraph.map b/shared/inotify/doc/html/classInotify_490a3f824c6d041d31ccaabe9bd92008_icgraph.map
deleted file mode 100644
index dc7351fd..00000000
--- a/shared/inotify/doc/html/classInotify_490a3f824c6d041d31ccaabe9bd92008_icgraph.map
+++ /dev/null
@@ -1 +0,0 @@
-<area shape="rect" href="$classInotify.html#b028c8fa988f6bbb2ef773db3ea3a2d3" title="Extracts a queued inotify event." alt="" coords="172,5,287,32">
diff --git a/shared/inotify/doc/html/classInotify_490a3f824c6d041d31ccaabe9bd92008_icgraph.md5 b/shared/inotify/doc/html/classInotify_490a3f824c6d041d31ccaabe9bd92008_icgraph.md5
deleted file mode 100644
index 2cdfd2b4..00000000
--- a/shared/inotify/doc/html/classInotify_490a3f824c6d041d31ccaabe9bd92008_icgraph.md5
+++ /dev/null
@@ -1 +0,0 @@
-04c6a964e2bb5f8eaec7dbb9c83b2bc7 \ No newline at end of file
diff --git a/shared/inotify/doc/html/classInotify_490a3f824c6d041d31ccaabe9bd92008_icgraph.png b/shared/inotify/doc/html/classInotify_490a3f824c6d041d31ccaabe9bd92008_icgraph.png
deleted file mode 100644
index fd43491a..00000000
--- a/shared/inotify/doc/html/classInotify_490a3f824c6d041d31ccaabe9bd92008_icgraph.png
+++ /dev/null
Binary files differ
diff --git a/shared/inotify/doc/html/classInotify_70b3b57e8661fbb4c5bc404b86225c3b_icgraph.map b/shared/inotify/doc/html/classInotify_70b3b57e8661fbb4c5bc404b86225c3b_icgraph.map
deleted file mode 100644
index 30031126..00000000
--- a/shared/inotify/doc/html/classInotify_70b3b57e8661fbb4c5bc404b86225c3b_icgraph.map
+++ /dev/null
@@ -1,3 +0,0 @@
-<area shape="rect" href="$classInotify.html#d8e4a4a87d005c71c0b5ea9c6dd53c42" title="Returns the maximum number of events in the kernel queue." alt="" coords="204,5,351,32">
-<area shape="rect" href="$classInotify.html#c18b7732f67832260fbbd47aebb8af51" title="Returns the maximum number of inotify instances per process." alt="" coords="195,56,360,83">
-<area shape="rect" href="$classInotify.html#86dae1b7a72c0d8fc2a632444a0f2f1f" title="Returns the maximum number of inotify watches per instance." alt="" coords="197,107,357,133">
diff --git a/shared/inotify/doc/html/classInotify_70b3b57e8661fbb4c5bc404b86225c3b_icgraph.md5 b/shared/inotify/doc/html/classInotify_70b3b57e8661fbb4c5bc404b86225c3b_icgraph.md5
deleted file mode 100644
index cf32572b..00000000
--- a/shared/inotify/doc/html/classInotify_70b3b57e8661fbb4c5bc404b86225c3b_icgraph.md5
+++ /dev/null
@@ -1 +0,0 @@
-d00e8e6b410a8b99056c20c2ae513bab \ No newline at end of file
diff --git a/shared/inotify/doc/html/classInotify_70b3b57e8661fbb4c5bc404b86225c3b_icgraph.png b/shared/inotify/doc/html/classInotify_70b3b57e8661fbb4c5bc404b86225c3b_icgraph.png
deleted file mode 100644
index 5102409d..00000000
--- a/shared/inotify/doc/html/classInotify_70b3b57e8661fbb4c5bc404b86225c3b_icgraph.png
+++ /dev/null
Binary files differ
diff --git a/shared/inotify/doc/html/classInotify_734538233ba2136164f76f4df6c3654e_icgraph.map b/shared/inotify/doc/html/classInotify_734538233ba2136164f76f4df6c3654e_icgraph.map
deleted file mode 100644
index 37e43de7..00000000
--- a/shared/inotify/doc/html/classInotify_734538233ba2136164f76f4df6c3654e_icgraph.map
+++ /dev/null
@@ -1,3 +0,0 @@
-<area shape="rect" href="$classInotify.html#66d90ebfa516d4bd1463749def2b58f9" title="Sets the maximum number of events in the kernel queue." alt="" coords="204,5,351,32">
-<area shape="rect" href="$classInotify.html#620c891962fe5acd26485c64e9b28d19" title="Sets the maximum number of inotify instances per process." alt="" coords="196,56,359,83">
-<area shape="rect" href="$classInotify.html#5064380cdb4a726ab33f3fa18d15c77a" title="Sets the maximum number of inotify watches per instance." alt="" coords="197,107,357,133">
diff --git a/shared/inotify/doc/html/classInotify_734538233ba2136164f76f4df6c3654e_icgraph.md5 b/shared/inotify/doc/html/classInotify_734538233ba2136164f76f4df6c3654e_icgraph.md5
deleted file mode 100644
index 9017da9c..00000000
--- a/shared/inotify/doc/html/classInotify_734538233ba2136164f76f4df6c3654e_icgraph.md5
+++ /dev/null
@@ -1 +0,0 @@
-1d28be277b69710e355fb579217e5b78 \ No newline at end of file
diff --git a/shared/inotify/doc/html/classInotify_734538233ba2136164f76f4df6c3654e_icgraph.png b/shared/inotify/doc/html/classInotify_734538233ba2136164f76f4df6c3654e_icgraph.png
deleted file mode 100644
index a58ed2be..00000000
--- a/shared/inotify/doc/html/classInotify_734538233ba2136164f76f4df6c3654e_icgraph.png
+++ /dev/null
Binary files differ
diff --git a/shared/inotify/doc/html/classInotify_86ae86c43ea1a72f562ca46393309635_icgraph.map b/shared/inotify/doc/html/classInotify_86ae86c43ea1a72f562ca46393309635_icgraph.map
deleted file mode 100644
index 9ddf26fa..00000000
--- a/shared/inotify/doc/html/classInotify_86ae86c43ea1a72f562ca46393309635_icgraph.map
+++ /dev/null
@@ -1 +0,0 @@
-<area shape="rect" href="$classInotify.html#f19dd5e491395673e4798eb9dbf5f682" title="Destructor." alt="" coords="151,5,255,32">
diff --git a/shared/inotify/doc/html/classInotify_86ae86c43ea1a72f562ca46393309635_icgraph.md5 b/shared/inotify/doc/html/classInotify_86ae86c43ea1a72f562ca46393309635_icgraph.md5
deleted file mode 100644
index 5cb8482f..00000000
--- a/shared/inotify/doc/html/classInotify_86ae86c43ea1a72f562ca46393309635_icgraph.md5
+++ /dev/null
@@ -1 +0,0 @@
-2ac402c3a1e1f917bb08f0f7203eb443 \ No newline at end of file
diff --git a/shared/inotify/doc/html/classInotify_86ae86c43ea1a72f562ca46393309635_icgraph.png b/shared/inotify/doc/html/classInotify_86ae86c43ea1a72f562ca46393309635_icgraph.png
deleted file mode 100644
index 83f1c6d4..00000000
--- a/shared/inotify/doc/html/classInotify_86ae86c43ea1a72f562ca46393309635_icgraph.png
+++ /dev/null
Binary files differ
diff --git a/shared/inotify/doc/html/classInotify_bc1fd5830ca561efb69bcd2283981741_icgraph.map b/shared/inotify/doc/html/classInotify_bc1fd5830ca561efb69bcd2283981741_icgraph.map
deleted file mode 100644
index 0ab98b58..00000000
--- a/shared/inotify/doc/html/classInotify_bc1fd5830ca561efb69bcd2283981741_icgraph.map
+++ /dev/null
@@ -1,2 +0,0 @@
-<area shape="rect" href="$classInotify.html#86ae86c43ea1a72f562ca46393309635" title="Removes all watches and closes the inotify device." alt="" coords="179,5,275,32">
-<area shape="rect" href="$classInotify.html#f19dd5e491395673e4798eb9dbf5f682" title="Destructor." alt="" coords="324,5,428,32">
diff --git a/shared/inotify/doc/html/classInotify_bc1fd5830ca561efb69bcd2283981741_icgraph.md5 b/shared/inotify/doc/html/classInotify_bc1fd5830ca561efb69bcd2283981741_icgraph.md5
deleted file mode 100644
index ca0e1018..00000000
--- a/shared/inotify/doc/html/classInotify_bc1fd5830ca561efb69bcd2283981741_icgraph.md5
+++ /dev/null
@@ -1 +0,0 @@
-d6ad52008b7d418d0c5f4e495df76a6f \ No newline at end of file
diff --git a/shared/inotify/doc/html/classInotify_bc1fd5830ca561efb69bcd2283981741_icgraph.png b/shared/inotify/doc/html/classInotify_bc1fd5830ca561efb69bcd2283981741_icgraph.png
deleted file mode 100644
index edba755d..00000000
--- a/shared/inotify/doc/html/classInotify_bc1fd5830ca561efb69bcd2283981741_icgraph.png
+++ /dev/null
Binary files differ
diff --git a/shared/inotify/doc/html/classes.html b/shared/inotify/doc/html/classes.html
deleted file mode 100644
index 604cbade..00000000
--- a/shared/inotify/doc/html/classes.html
+++ /dev/null
@@ -1,32 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
-<title>inotify-cxx: Alphabetical List</title>
-<link href="tabs.css" rel="stylesheet" type="text/css">
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.5.9 -->
-<div class="navigation" id="top">
- <div class="tabs">
- <ul>
- <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
- <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
- <li><a href="files.html"><span>Files</span></a></li>
- </ul>
- </div>
- <div class="tabs">
- <ul>
- <li><a href="annotated.html"><span>Class&nbsp;List</span></a></li>
- <li><a href="functions.html"><span>Class&nbsp;Members</span></a></li>
- </ul>
- </div>
-</div>
-<div class="contents">
-<h1>Class Index</h1><p><div class="qindex"><a class="qindex" href="#letter_I">I</a></div><p>
-<table align="center" width="95%" border="0" cellspacing="0" cellpadding="0">
-<tr><td><a name="letter_I"></a><table border="0" cellspacing="0" cellpadding="0"><tr><td><div class="ah">&nbsp;&nbsp;I&nbsp;&nbsp;</div></td></tr></table>
-</td><td><a class="el" href="classInotify.html">Inotify</a>&nbsp;&nbsp;&nbsp;</td><td><a class="el" href="classInotifyEvent.html">InotifyEvent</a>&nbsp;&nbsp;&nbsp;</td><td><a class="el" href="classInotifyException.html">InotifyException</a>&nbsp;&nbsp;&nbsp;</td><td><a class="el" href="classInotifyWatch.html">InotifyWatch</a>&nbsp;&nbsp;&nbsp;</td></tr></table><p><div class="qindex"><a class="qindex" href="#letter_I">I</a></div><p>
-</div>
-<hr size="1"><address style="text-align: right;"><small><a href="http://www.doxygen.org/index.html">
-<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> </small></address>
-</body>
-</html>
diff --git a/shared/inotify/doc/html/doxygen.css b/shared/inotify/doc/html/doxygen.css
deleted file mode 100644
index 3767dc95..00000000
--- a/shared/inotify/doc/html/doxygen.css
+++ /dev/null
@@ -1,441 +0,0 @@
-body, table, div, p, dl {
- font-family: Lucida Grande, Verdana, Geneva, Arial, sans-serif;
- font-size: 12px;
-}
-
-/* @group Heading Levels */
-
-h1 {
- text-align: center;
- font-size: 150%;
-}
-
-h2 {
- font-size: 120%;
-}
-
-h3 {
- font-size: 100%;
-}
-
-/* @end */
-
-caption {
- font-weight: bold;
-}
-
-div.qindex, div.navtab{
- background-color: #e8eef2;
- border: 1px solid #84b0c7;
- text-align: center;
- margin: 2px;
- padding: 2px;
-}
-
-div.qindex, div.navpath {
- width: 100%;
- line-height: 140%;
-}
-
-div.navtab {
- margin-right: 15px;
-}
-
-/* @group Link Styling */
-
-a {
- color: #153788;
- font-weight: normal;
- text-decoration: none;
-}
-
-.contents a:visited {
- color: #1b77c5;
-}
-
-a:hover {
- text-decoration: underline;
-}
-
-a.qindex {
- font-weight: bold;
-}
-
-a.qindexHL {
- font-weight: bold;
- background-color: #6666cc;
- color: #ffffff;
- border: 1px double #9295C2;
-}
-
-.contents a.qindexHL:visited {
- color: #ffffff;
-}
-
-a.el {
- font-weight: bold;
-}
-
-a.elRef {
-}
-
-a.code {
-}
-
-a.codeRef {
-}
-
-/* @end */
-
-dl.el {
- margin-left: -1cm;
-}
-
-.fragment {
- font-family: monospace, fixed;
- font-size: 105%;
-}
-
-pre.fragment {
- border: 1px solid #CCCCCC;
- background-color: #f5f5f5;
- padding: 4px 6px;
- margin: 4px 8px 4px 2px;
-}
-
-div.ah {
- background-color: black;
- font-weight: bold;
- color: #ffffff;
- margin-bottom: 3px;
- margin-top: 3px
-}
-
-div.groupHeader {
- margin-left: 16px;
- margin-top: 12px;
- margin-bottom: 6px;
- font-weight: bold;
-}
-
-div.groupText {
- margin-left: 16px;
- font-style: italic;
-}
-
-body {
- background: white;
- color: black;
- margin-right: 20px;
- margin-left: 20px;
-}
-
-td.indexkey {
- background-color: #e8eef2;
- font-weight: bold;
- border: 1px solid #CCCCCC;
- margin: 2px 0px 2px 0;
- padding: 2px 10px;
-}
-
-td.indexvalue {
- background-color: #e8eef2;
- border: 1px solid #CCCCCC;
- padding: 2px 10px;
- margin: 2px 0px;
-}
-
-tr.memlist {
- background-color: #f0f0f0;
-}
-
-p.formulaDsp {
- text-align: center;
-}
-
-img.formulaDsp {
-
-}
-
-img.formulaInl {
- vertical-align: middle;
-}
-
-/* @group Code Colorization */
-
-span.keyword {
- color: #008000
-}
-
-span.keywordtype {
- color: #604020
-}
-
-span.keywordflow {
- color: #e08000
-}
-
-span.comment {
- color: #800000
-}
-
-span.preprocessor {
- color: #806020
-}
-
-span.stringliteral {
- color: #002080
-}
-
-span.charliteral {
- color: #008080
-}
-
-span.vhdldigit {
- color: #ff00ff
-}
-
-span.vhdlchar {
- color: #000000
-}
-
-span.vhdlkeyword {
- color: #700070
-}
-
-span.vhdllogic {
- color: #ff0000
-}
-
-/* @end */
-
-.search {
- color: #003399;
- font-weight: bold;
-}
-
-form.search {
- margin-bottom: 0px;
- margin-top: 0px;
-}
-
-input.search {
- font-size: 75%;
- color: #000080;
- font-weight: normal;
- background-color: #e8eef2;
-}
-
-td.tiny {
- font-size: 75%;
-}
-
-.dirtab {
- padding: 4px;
- border-collapse: collapse;
- border: 1px solid #84b0c7;
-}
-
-th.dirtab {
- background: #e8eef2;
- font-weight: bold;
-}
-
-hr {
- height: 0;
- border: none;
- border-top: 1px solid #666;
-}
-
-/* @group Member Descriptions */
-
-.mdescLeft, .mdescRight,
-.memItemLeft, .memItemRight,
-.memTemplItemLeft, .memTemplItemRight, .memTemplParams {
- background-color: #FAFAFA;
- border: none;
- margin: 4px;
- padding: 1px 0 0 8px;
-}
-
-.mdescLeft, .mdescRight {
- padding: 0px 8px 4px 8px;
- color: #555;
-}
-
-.memItemLeft, .memItemRight, .memTemplParams {
- border-top: 1px solid #ccc;
-}
-
-.memTemplParams {
- color: #606060;
-}
-
-/* @end */
-
-/* @group Member Details */
-
-/* Styles for detailed member documentation */
-
-.memtemplate {
- font-size: 80%;
- color: #606060;
- font-weight: normal;
- margin-left: 3px;
-}
-
-.memnav {
- background-color: #e8eef2;
- border: 1px solid #84b0c7;
- text-align: center;
- margin: 2px;
- margin-right: 15px;
- padding: 2px;
-}
-
-.memitem {
- padding: 0;
-}
-
-.memname {
- white-space: nowrap;
- font-weight: bold;
-}
-
-.memproto, .memdoc {
- border: 1px solid #84b0c7;
-}
-
-.memproto {
- padding: 0;
- background-color: #d5e1e8;
- font-weight: bold;
- -webkit-border-top-left-radius: 8px;
- -webkit-border-top-right-radius: 8px;
- -moz-border-radius-topleft: 8px;
- -moz-border-radius-topright: 8px;
-}
-
-.memdoc {
- padding: 2px 5px;
- background-color: #eef3f5;
- border-top-width: 0;
- -webkit-border-bottom-left-radius: 8px;
- -webkit-border-bottom-right-radius: 8px;
- -moz-border-radius-bottomleft: 8px;
- -moz-border-radius-bottomright: 8px;
-}
-
-.paramkey {
- text-align: right;
-}
-
-.paramtype {
- white-space: nowrap;
-}
-
-.paramname {
- color: #602020;
- white-space: nowrap;
-}
-.paramname em {
- font-style: normal;
-}
-
-/* @end */
-
-/* @group Directory (tree) */
-
-/* for the tree view */
-
-.ftvtree {
- font-family: sans-serif;
- margin: 0.5em;
-}
-
-/* these are for tree view when used as main index */
-
-.directory {
- font-size: 9pt;
- font-weight: bold;
-}
-
-.directory h3 {
- margin: 0px;
- margin-top: 1em;
- font-size: 11pt;
-}
-
-/*
-The following two styles can be used to replace the root node title
-with an image of your choice. Simply uncomment the next two styles,
-specify the name of your image and be sure to set 'height' to the
-proper pixel height of your image.
-*/
-
-/*
-.directory h3.swap {
- height: 61px;
- background-repeat: no-repeat;
- background-image: url("yourimage.gif");
-}
-.directory h3.swap span {
- display: none;
-}
-*/
-
-.directory > h3 {
- margin-top: 0;
-}
-
-.directory p {
- margin: 0px;
- white-space: nowrap;
-}
-
-.directory div {
- display: none;
- margin: 0px;
-}
-
-.directory img {
- vertical-align: -30%;
-}
-
-/* these are for tree view when not used as main index */
-
-.directory-alt {
- font-size: 100%;
- font-weight: bold;
-}
-
-.directory-alt h3 {
- margin: 0px;
- margin-top: 1em;
- font-size: 11pt;
-}
-
-.directory-alt > h3 {
- margin-top: 0;
-}
-
-.directory-alt p {
- margin: 0px;
- white-space: nowrap;
-}
-
-.directory-alt div {
- display: none;
- margin: 0px;
-}
-
-.directory-alt img {
- vertical-align: -30%;
-}
-
-/* @end */
-
-address {
- font-style: normal;
- color: #333;
-}
diff --git a/shared/inotify/doc/html/doxygen.png b/shared/inotify/doc/html/doxygen.png
deleted file mode 100644
index f0a274bb..00000000
--- a/shared/inotify/doc/html/doxygen.png
+++ /dev/null
Binary files differ
diff --git a/shared/inotify/doc/html/files.html b/shared/inotify/doc/html/files.html
deleted file mode 100644
index 5c6b0baf..00000000
--- a/shared/inotify/doc/html/files.html
+++ /dev/null
@@ -1,32 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
-<title>inotify-cxx: File Index</title>
-<link href="tabs.css" rel="stylesheet" type="text/css">
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.5.9 -->
-<div class="navigation" id="top">
- <div class="tabs">
- <ul>
- <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
- <li><a href="annotated.html"><span>Classes</span></a></li>
- <li class="current"><a href="files.html"><span>Files</span></a></li>
- </ul>
- </div>
- <div class="tabs">
- <ul>
- <li class="current"><a href="files.html"><span>File&nbsp;List</span></a></li>
- <li><a href="globals.html"><span>File&nbsp;Members</span></a></li>
- </ul>
- </div>
-</div>
-<div class="contents">
-<h1>File List</h1>Here is a list of all files with brief descriptions:<table>
- <tr><td class="indexkey"><a class="el" href="inotify-cxx_8cpp.html">inotify-cxx.cpp</a></td><td class="indexvalue"><a class="el" href="classInotify.html" title="inotify class">Inotify</a> C++ interface implementation </td></tr>
- <tr><td class="indexkey"><a class="el" href="inotify-cxx_8h.html">inotify-cxx.h</a> <a href="inotify-cxx_8h_source.html">[code]</a></td><td class="indexvalue"><a class="el" href="classInotify.html" title="inotify class">Inotify</a> C++ interface header </td></tr>
-</table>
-</div>
-<hr size="1"><address style="text-align: right;"><small><a href="http://www.doxygen.org/index.html">
-<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> </small></address>
-</body>
-</html>
diff --git a/shared/inotify/doc/html/functions.html b/shared/inotify/doc/html/functions.html
deleted file mode 100644
index 00a99ed4..00000000
--- a/shared/inotify/doc/html/functions.html
+++ /dev/null
@@ -1,215 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
-<title>inotify-cxx: Class Members</title>
-<link href="tabs.css" rel="stylesheet" type="text/css">
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.5.9 -->
-<div class="navigation" id="top">
- <div class="tabs">
- <ul>
- <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
- <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
- <li><a href="files.html"><span>Files</span></a></li>
- </ul>
- </div>
- <div class="tabs">
- <ul>
- <li><a href="annotated.html"><span>Class&nbsp;List</span></a></li>
- <li class="current"><a href="functions.html"><span>Class&nbsp;Members</span></a></li>
- </ul>
- </div>
- <div class="tabs">
- <ul>
- <li class="current"><a href="functions.html"><span>All</span></a></li>
- <li><a href="functions_func.html"><span>Functions</span></a></li>
- <li><a href="functions_vars.html"><span>Variables</span></a></li>
- <li><a href="functions_rela.html"><span>Related&nbsp;Functions</span></a></li>
- </ul>
- </div>
- <div class="tabs">
- <ul>
- <li><a href="#index__"><span>_</span></a></li>
- <li><a href="#index_a"><span>a</span></a></li>
- <li><a href="#index_c"><span>c</span></a></li>
- <li><a href="#index_d"><span>d</span></a></li>
- <li><a href="#index_f"><span>f</span></a></li>
- <li><a href="#index_g"><span>g</span></a></li>
- <li><a href="#index_i"><span>i</span></a></li>
- <li><a href="#index_m"><span>m</span></a></li>
- <li><a href="#index_p"><span>p</span></a></li>
- <li><a href="#index_r"><span>r</span></a></li>
- <li><a href="#index_s"><span>s</span></a></li>
- <li><a href="#index_w"><span>w</span></a></li>
- <li><a href="#index_~"><span>~</span></a></li>
- </ul>
- </div>
-</div>
-<div class="contents">
-Here is a list of all class members with links to the classes they belong to:
-<p>
-<h3><a class="anchor" name="index__">- _ -</a></h3><ul>
-<li>__Disable()
-: <a class="el" href="classInotifyWatch.html#804cdc1e9579a075a60c239b202559f4">InotifyWatch</a>
-</ul>
-<h3><a class="anchor" name="index_a">- a -</a></h3><ul>
-<li>Add()
-: <a class="el" href="classInotify.html#2ef771ebaf982d76ebe19b3f5bc9cd83">Inotify</a>
-</ul>
-<h3><a class="anchor" name="index_c">- c -</a></h3><ul>
-<li>Close()
-: <a class="el" href="classInotify.html#86ae86c43ea1a72f562ca46393309635">Inotify</a>
-</ul>
-<h3><a class="anchor" name="index_d">- d -</a></h3><ul>
-<li>DumpTypes()
-: <a class="el" href="classInotifyEvent.html#c08a0a26ea33dbe94aaf1ac830c103a5">InotifyEvent</a>
-</ul>
-<h3><a class="anchor" name="index_f">- f -</a></h3><ul>
-<li>FindWatch()
-: <a class="el" href="classInotify.html#182d19b667c9e0899802b70a579eff40">Inotify</a>
-</ul>
-<h3><a class="anchor" name="index_g">- g -</a></h3><ul>
-<li>GetCapability()
-: <a class="el" href="classInotify.html#70b3b57e8661fbb4c5bc404b86225c3b">Inotify</a>
-<li>GetCapabilityPath()
-: <a class="el" href="classInotify.html#0233ddfe40844d729505fdfd709d22cc">Inotify</a>
-<li>GetCookie()
-: <a class="el" href="classInotifyEvent.html#7e65e49f7d0f11c71442e31d688e4b17">InotifyEvent</a>
-<li>GetDescriptor()
-: <a class="el" href="classInotifyEvent.html#463aacc1f660fbc1c39108feb2601341">InotifyEvent</a>
-, <a class="el" href="classInotifyWatch.html#855f982421402dd63d064dde328f2a59">InotifyWatch</a>
-, <a class="el" href="classInotify.html#abab7015203bf36d0256e75d4f4861f9">Inotify</a>
-<li>GetEnabledCount()
-: <a class="el" href="classInotify.html#6f432affb46f85f7bc19661d5bc77063">Inotify</a>
-<li>GetErrorNumber()
-: <a class="el" href="classInotifyException.html#60d885f998a6cb97d06111e6aded155d">InotifyException</a>
-<li>GetEvent()
-: <a class="el" href="classInotify.html#490a3f824c6d041d31ccaabe9bd92008">Inotify</a>
-<li>GetEventCount()
-: <a class="el" href="classInotify.html#a3c533f956871f904949832ac8f5fbde">Inotify</a>
-<li>GetInotify()
-: <a class="el" href="classInotifyWatch.html#cbf0042d06841f9503405b104e4c35d0">InotifyWatch</a>
-<li>GetLength()
-: <a class="el" href="classInotifyEvent.html#30c8c2e1e490b8968ab9cb3364fe579a">InotifyEvent</a>
-<li>GetMask()
-: <a class="el" href="classInotifyWatch.html#f759f9baca6f4abbbaae57e076486009">InotifyWatch</a>
-, <a class="el" href="classInotifyEvent.html#c7160544f6f4f24611df57a4422ac47f">InotifyEvent</a>
-<li>GetMaskByName()
-: <a class="el" href="classInotifyEvent.html#eced3a88a6dea190c5df19c2a6599010">InotifyEvent</a>
-<li>GetMaxEvents()
-: <a class="el" href="classInotify.html#d8e4a4a87d005c71c0b5ea9c6dd53c42">Inotify</a>
-<li>GetMaxInstances()
-: <a class="el" href="classInotify.html#c18b7732f67832260fbbd47aebb8af51">Inotify</a>
-<li>GetMaxWatches()
-: <a class="el" href="classInotify.html#86dae1b7a72c0d8fc2a632444a0f2f1f">Inotify</a>
-<li>GetMessage()
-: <a class="el" href="classInotifyException.html#6364ea375697356805d47cff957dd757">InotifyException</a>
-<li>GetName()
-: <a class="el" href="classInotifyEvent.html#3aea2437ba8553be703d91b45247a68f">InotifyEvent</a>
-<li>GetPath()
-: <a class="el" href="classInotifyWatch.html#2e659c699e7d43bd0a218fe4905784d2">InotifyWatch</a>
-<li>GetSource()
-: <a class="el" href="classInotifyException.html#619e8b963faebdefb283d79b5ae5c408">InotifyException</a>
-<li>GetWatch()
-: <a class="el" href="classInotifyEvent.html#979cd46f53ed674331a5a6d47d1cde92">InotifyEvent</a>
-<li>GetWatchCount()
-: <a class="el" href="classInotify.html#716ae90a00dd4895709ea9b8f7959075">Inotify</a>
-</ul>
-<h3><a class="anchor" name="index_i">- i -</a></h3><ul>
-<li>Inotify
-: <a class="el" href="classInotifyWatch.html#94bfb861dc18ca5d16abfcff90db8c86">InotifyWatch</a>
-, <a class="el" href="classInotify.html#a6fe6e9cb3343665eb968fcd5170cfb9">Inotify</a>
-<li>InotifyEvent()
-: <a class="el" href="classInotifyEvent.html#6d7f3fc0f51580da4a3ec2348609df64">InotifyEvent</a>
-<li>InotifyException()
-: <a class="el" href="classInotifyException.html#900dc29e5cfb3ece6c1651d04773b2bb">InotifyException</a>
-<li>InotifyWatch()
-: <a class="el" href="classInotifyWatch.html#c9c02f1dbd143eebd711eba03ac366e9">InotifyWatch</a>
-, <a class="el" href="classInotify.html#10880f490c33acd8bd24664fc7bce4ae">Inotify</a>
-<li>IsEnabled()
-: <a class="el" href="classInotifyWatch.html#5ab551a912e5acff6a9c74baaf9ea324">InotifyWatch</a>
-<li>IsRecursive()
-: <a class="el" href="classInotifyWatch.html#222c911ef0e8d6f61570489ed6042e55">InotifyWatch</a>
-<li>IsType()
-: <a class="el" href="classInotifyEvent.html#477ae71116ec393434a1f62a7170a156">InotifyEvent</a>
-</ul>
-<h3><a class="anchor" name="index_m">- m -</a></h3><ul>
-<li>m_buf
-: <a class="el" href="classInotify.html#eee7847efd93b681fddac56860fc7958">Inotify</a>
-<li>m_err
-: <a class="el" href="classInotifyException.html#aa8a163c661ce70e34b3e3e7ad700854">InotifyException</a>
-<li>m_events
-: <a class="el" href="classInotify.html#0c1d6c969292dbb7c8c1283a3d8f55e0">Inotify</a>
-<li>m_fd
-: <a class="el" href="classInotify.html#95d6d0ecefff77bd3ee50f1586a4552b">Inotify</a>
-<li>m_fEnabled
-: <a class="el" href="classInotifyWatch.html#b0c23c89cc2996bdf6f41b8ef1f1ed18">InotifyWatch</a>
-<li>m_msg
-: <a class="el" href="classInotifyException.html#c113719bd6f4352e12876b2322f1c92c">InotifyException</a>
-<li>m_name
-: <a class="el" href="classInotifyEvent.html#6c507a3466515aedc266bdc267079604">InotifyEvent</a>
-<li>m_path
-: <a class="el" href="classInotifyWatch.html#a63ba30ffdb8b9db27970bb1099e4db5">InotifyWatch</a>
-<li>m_paths
-: <a class="el" href="classInotify.html#62f275db6375a366023b2e46f73e3ecc">Inotify</a>
-<li>m_pInotify
-: <a class="el" href="classInotifyWatch.html#ea695aa11f6105184df1ef265be3f1b9">InotifyWatch</a>
-<li>m_pSrc
-: <a class="el" href="classInotifyException.html#dd106c2255890025561245cf91fe1427">InotifyException</a>
-<li>m_pWatch
-: <a class="el" href="classInotifyEvent.html#2d151cdcc547ee4ce49cfd44328d87ac">InotifyEvent</a>
-<li>m_uCookie
-: <a class="el" href="classInotifyEvent.html#bf417d466fb0173d337cc66539ee55af">InotifyEvent</a>
-<li>m_uMask
-: <a class="el" href="classInotifyWatch.html#f725ea61e3252adae6153ecb80de23a8">InotifyWatch</a>
-, <a class="el" href="classInotifyEvent.html#739a943357af0c3fafd58466803e04fa">InotifyEvent</a>
-<li>m_watches
-: <a class="el" href="classInotify.html#4d07f3a4412028d687936d2479d9a976">Inotify</a>
-<li>m_wd
-: <a class="el" href="classInotifyWatch.html#90a78898dc850b238e713e0db284fb0a">InotifyWatch</a>
-</ul>
-<h3><a class="anchor" name="index_p">- p -</a></h3><ul>
-<li>PeekEvent()
-: <a class="el" href="classInotify.html#19cde43d082ff92bd02654610019300d">Inotify</a>
-</ul>
-<h3><a class="anchor" name="index_r">- r -</a></h3><ul>
-<li>Remove()
-: <a class="el" href="classInotify.html#21c39bb8e5bbc1941b945c18f9005b84">Inotify</a>
-<li>RemoveAll()
-: <a class="el" href="classInotify.html#bc1fd5830ca561efb69bcd2283981741">Inotify</a>
-</ul>
-<h3><a class="anchor" name="index_s">- s -</a></h3><ul>
-<li>SetCapability()
-: <a class="el" href="classInotify.html#734538233ba2136164f76f4df6c3654e">Inotify</a>
-<li>SetCloseOnExec()
-: <a class="el" href="classInotify.html#124dd5816205900af61034d47ae65255">Inotify</a>
-<li>SetEnabled()
-: <a class="el" href="classInotifyWatch.html#a71aff8650fadff32a3c655ca50945f1">InotifyWatch</a>
-<li>SetMask()
-: <a class="el" href="classInotifyWatch.html#3ad7fbc55c21b3fcd08c2d1d388e14b6">InotifyWatch</a>
-<li>SetMaxEvents()
-: <a class="el" href="classInotify.html#66d90ebfa516d4bd1463749def2b58f9">Inotify</a>
-<li>SetMaxInstances()
-: <a class="el" href="classInotify.html#620c891962fe5acd26485c64e9b28d19">Inotify</a>
-<li>SetMaxWatches()
-: <a class="el" href="classInotify.html#5064380cdb4a726ab33f3fa18d15c77a">Inotify</a>
-<li>SetNonBlock()
-: <a class="el" href="classInotify.html#b2c8ab8ad4322fb6f0dae0eae442402b">Inotify</a>
-</ul>
-<h3><a class="anchor" name="index_w">- w -</a></h3><ul>
-<li>WaitForEvents()
-: <a class="el" href="classInotify.html#139c27c6643bb199619f3eae9b32e53b">Inotify</a>
-</ul>
-<h3><a class="anchor" name="index_~">- ~ -</a></h3><ul>
-<li>~Inotify()
-: <a class="el" href="classInotify.html#f19dd5e491395673e4798eb9dbf5f682">Inotify</a>
-<li>~InotifyEvent()
-: <a class="el" href="classInotifyEvent.html#a48030da1d3a1b1741ca791c9e129888">InotifyEvent</a>
-<li>~InotifyWatch()
-: <a class="el" href="classInotifyWatch.html#871c16b01aa8841b36246e5b629ecaef">InotifyWatch</a>
-</ul>
-</div>
-<hr size="1"><address style="text-align: right;"><small><a href="http://www.doxygen.org/index.html">
-<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> </small></address>
-</body>
-</html>
diff --git a/shared/inotify/doc/html/functions_func.html b/shared/inotify/doc/html/functions_func.html
deleted file mode 100644
index dad8c830..00000000
--- a/shared/inotify/doc/html/functions_func.html
+++ /dev/null
@@ -1,177 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
-<title>inotify-cxx: Class Members - Functions</title>
-<link href="tabs.css" rel="stylesheet" type="text/css">
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.5.9 -->
-<div class="navigation" id="top">
- <div class="tabs">
- <ul>
- <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
- <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
- <li><a href="files.html"><span>Files</span></a></li>
- </ul>
- </div>
- <div class="tabs">
- <ul>
- <li><a href="annotated.html"><span>Class&nbsp;List</span></a></li>
- <li class="current"><a href="functions.html"><span>Class&nbsp;Members</span></a></li>
- </ul>
- </div>
- <div class="tabs">
- <ul>
- <li><a href="functions.html"><span>All</span></a></li>
- <li class="current"><a href="functions_func.html"><span>Functions</span></a></li>
- <li><a href="functions_vars.html"><span>Variables</span></a></li>
- <li><a href="functions_rela.html"><span>Related&nbsp;Functions</span></a></li>
- </ul>
- </div>
- <div class="tabs">
- <ul>
- <li><a href="#index__"><span>_</span></a></li>
- <li><a href="#index_a"><span>a</span></a></li>
- <li><a href="#index_c"><span>c</span></a></li>
- <li><a href="#index_d"><span>d</span></a></li>
- <li><a href="#index_f"><span>f</span></a></li>
- <li><a href="#index_g"><span>g</span></a></li>
- <li><a href="#index_i"><span>i</span></a></li>
- <li><a href="#index_p"><span>p</span></a></li>
- <li><a href="#index_r"><span>r</span></a></li>
- <li><a href="#index_s"><span>s</span></a></li>
- <li><a href="#index_w"><span>w</span></a></li>
- <li><a href="#index_~"><span>~</span></a></li>
- </ul>
- </div>
-</div>
-<div class="contents">
-&nbsp;
-<p>
-<h3><a class="anchor" name="index__">- _ -</a></h3><ul>
-<li>__Disable()
-: <a class="el" href="classInotifyWatch.html#804cdc1e9579a075a60c239b202559f4">InotifyWatch</a>
-</ul>
-<h3><a class="anchor" name="index_a">- a -</a></h3><ul>
-<li>Add()
-: <a class="el" href="classInotify.html#2ef771ebaf982d76ebe19b3f5bc9cd83">Inotify</a>
-</ul>
-<h3><a class="anchor" name="index_c">- c -</a></h3><ul>
-<li>Close()
-: <a class="el" href="classInotify.html#86ae86c43ea1a72f562ca46393309635">Inotify</a>
-</ul>
-<h3><a class="anchor" name="index_d">- d -</a></h3><ul>
-<li>DumpTypes()
-: <a class="el" href="classInotifyEvent.html#c08a0a26ea33dbe94aaf1ac830c103a5">InotifyEvent</a>
-</ul>
-<h3><a class="anchor" name="index_f">- f -</a></h3><ul>
-<li>FindWatch()
-: <a class="el" href="classInotify.html#182d19b667c9e0899802b70a579eff40">Inotify</a>
-</ul>
-<h3><a class="anchor" name="index_g">- g -</a></h3><ul>
-<li>GetCapability()
-: <a class="el" href="classInotify.html#70b3b57e8661fbb4c5bc404b86225c3b">Inotify</a>
-<li>GetCapabilityPath()
-: <a class="el" href="classInotify.html#0233ddfe40844d729505fdfd709d22cc">Inotify</a>
-<li>GetCookie()
-: <a class="el" href="classInotifyEvent.html#7e65e49f7d0f11c71442e31d688e4b17">InotifyEvent</a>
-<li>GetDescriptor()
-: <a class="el" href="classInotifyEvent.html#463aacc1f660fbc1c39108feb2601341">InotifyEvent</a>
-, <a class="el" href="classInotifyWatch.html#855f982421402dd63d064dde328f2a59">InotifyWatch</a>
-, <a class="el" href="classInotify.html#abab7015203bf36d0256e75d4f4861f9">Inotify</a>
-<li>GetEnabledCount()
-: <a class="el" href="classInotify.html#6f432affb46f85f7bc19661d5bc77063">Inotify</a>
-<li>GetErrorNumber()
-: <a class="el" href="classInotifyException.html#60d885f998a6cb97d06111e6aded155d">InotifyException</a>
-<li>GetEvent()
-: <a class="el" href="classInotify.html#490a3f824c6d041d31ccaabe9bd92008">Inotify</a>
-<li>GetEventCount()
-: <a class="el" href="classInotify.html#a3c533f956871f904949832ac8f5fbde">Inotify</a>
-<li>GetInotify()
-: <a class="el" href="classInotifyWatch.html#cbf0042d06841f9503405b104e4c35d0">InotifyWatch</a>
-<li>GetLength()
-: <a class="el" href="classInotifyEvent.html#30c8c2e1e490b8968ab9cb3364fe579a">InotifyEvent</a>
-<li>GetMask()
-: <a class="el" href="classInotifyWatch.html#f759f9baca6f4abbbaae57e076486009">InotifyWatch</a>
-, <a class="el" href="classInotifyEvent.html#c7160544f6f4f24611df57a4422ac47f">InotifyEvent</a>
-<li>GetMaskByName()
-: <a class="el" href="classInotifyEvent.html#eced3a88a6dea190c5df19c2a6599010">InotifyEvent</a>
-<li>GetMaxEvents()
-: <a class="el" href="classInotify.html#d8e4a4a87d005c71c0b5ea9c6dd53c42">Inotify</a>
-<li>GetMaxInstances()
-: <a class="el" href="classInotify.html#c18b7732f67832260fbbd47aebb8af51">Inotify</a>
-<li>GetMaxWatches()
-: <a class="el" href="classInotify.html#86dae1b7a72c0d8fc2a632444a0f2f1f">Inotify</a>
-<li>GetMessage()
-: <a class="el" href="classInotifyException.html#6364ea375697356805d47cff957dd757">InotifyException</a>
-<li>GetName()
-: <a class="el" href="classInotifyEvent.html#3aea2437ba8553be703d91b45247a68f">InotifyEvent</a>
-<li>GetPath()
-: <a class="el" href="classInotifyWatch.html#2e659c699e7d43bd0a218fe4905784d2">InotifyWatch</a>
-<li>GetSource()
-: <a class="el" href="classInotifyException.html#619e8b963faebdefb283d79b5ae5c408">InotifyException</a>
-<li>GetWatch()
-: <a class="el" href="classInotifyEvent.html#979cd46f53ed674331a5a6d47d1cde92">InotifyEvent</a>
-<li>GetWatchCount()
-: <a class="el" href="classInotify.html#716ae90a00dd4895709ea9b8f7959075">Inotify</a>
-</ul>
-<h3><a class="anchor" name="index_i">- i -</a></h3><ul>
-<li>Inotify()
-: <a class="el" href="classInotify.html#a6fe6e9cb3343665eb968fcd5170cfb9">Inotify</a>
-<li>InotifyEvent()
-: <a class="el" href="classInotifyEvent.html#f416dbbd4e6ddd3c0eea6cb540f0b046">InotifyEvent</a>
-<li>InotifyException()
-: <a class="el" href="classInotifyException.html#900dc29e5cfb3ece6c1651d04773b2bb">InotifyException</a>
-<li>InotifyWatch()
-: <a class="el" href="classInotifyWatch.html#c9c02f1dbd143eebd711eba03ac366e9">InotifyWatch</a>
-<li>IsEnabled()
-: <a class="el" href="classInotifyWatch.html#5ab551a912e5acff6a9c74baaf9ea324">InotifyWatch</a>
-<li>IsRecursive()
-: <a class="el" href="classInotifyWatch.html#222c911ef0e8d6f61570489ed6042e55">InotifyWatch</a>
-<li>IsType()
-: <a class="el" href="classInotifyEvent.html#309ebf3c5b131522295185a926d551bb">InotifyEvent</a>
-</ul>
-<h3><a class="anchor" name="index_p">- p -</a></h3><ul>
-<li>PeekEvent()
-: <a class="el" href="classInotify.html#19cde43d082ff92bd02654610019300d">Inotify</a>
-</ul>
-<h3><a class="anchor" name="index_r">- r -</a></h3><ul>
-<li>Remove()
-: <a class="el" href="classInotify.html#21c39bb8e5bbc1941b945c18f9005b84">Inotify</a>
-<li>RemoveAll()
-: <a class="el" href="classInotify.html#bc1fd5830ca561efb69bcd2283981741">Inotify</a>
-</ul>
-<h3><a class="anchor" name="index_s">- s -</a></h3><ul>
-<li>SetCapability()
-: <a class="el" href="classInotify.html#734538233ba2136164f76f4df6c3654e">Inotify</a>
-<li>SetCloseOnExec()
-: <a class="el" href="classInotify.html#124dd5816205900af61034d47ae65255">Inotify</a>
-<li>SetEnabled()
-: <a class="el" href="classInotifyWatch.html#a71aff8650fadff32a3c655ca50945f1">InotifyWatch</a>
-<li>SetMask()
-: <a class="el" href="classInotifyWatch.html#3ad7fbc55c21b3fcd08c2d1d388e14b6">InotifyWatch</a>
-<li>SetMaxEvents()
-: <a class="el" href="classInotify.html#66d90ebfa516d4bd1463749def2b58f9">Inotify</a>
-<li>SetMaxInstances()
-: <a class="el" href="classInotify.html#620c891962fe5acd26485c64e9b28d19">Inotify</a>
-<li>SetMaxWatches()
-: <a class="el" href="classInotify.html#5064380cdb4a726ab33f3fa18d15c77a">Inotify</a>
-<li>SetNonBlock()
-: <a class="el" href="classInotify.html#b2c8ab8ad4322fb6f0dae0eae442402b">Inotify</a>
-</ul>
-<h3><a class="anchor" name="index_w">- w -</a></h3><ul>
-<li>WaitForEvents()
-: <a class="el" href="classInotify.html#139c27c6643bb199619f3eae9b32e53b">Inotify</a>
-</ul>
-<h3><a class="anchor" name="index_~">- ~ -</a></h3><ul>
-<li>~Inotify()
-: <a class="el" href="classInotify.html#f19dd5e491395673e4798eb9dbf5f682">Inotify</a>
-<li>~InotifyEvent()
-: <a class="el" href="classInotifyEvent.html#a48030da1d3a1b1741ca791c9e129888">InotifyEvent</a>
-<li>~InotifyWatch()
-: <a class="el" href="classInotifyWatch.html#871c16b01aa8841b36246e5b629ecaef">InotifyWatch</a>
-</ul>
-</div>
-<hr size="1"><address style="text-align: right;"><small><a href="http://www.doxygen.org/index.html">
-<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> </small></address>
-</body>
-</html>
diff --git a/shared/inotify/doc/html/functions_rela.html b/shared/inotify/doc/html/functions_rela.html
deleted file mode 100644
index c59a2852..00000000
--- a/shared/inotify/doc/html/functions_rela.html
+++ /dev/null
@@ -1,44 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
-<title>inotify-cxx: Class Members - Related Functions</title>
-<link href="tabs.css" rel="stylesheet" type="text/css">
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.5.9 -->
-<div class="navigation" id="top">
- <div class="tabs">
- <ul>
- <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
- <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
- <li><a href="files.html"><span>Files</span></a></li>
- </ul>
- </div>
- <div class="tabs">
- <ul>
- <li><a href="annotated.html"><span>Class&nbsp;List</span></a></li>
- <li class="current"><a href="functions.html"><span>Class&nbsp;Members</span></a></li>
- </ul>
- </div>
- <div class="tabs">
- <ul>
- <li><a href="functions.html"><span>All</span></a></li>
- <li><a href="functions_func.html"><span>Functions</span></a></li>
- <li><a href="functions_vars.html"><span>Variables</span></a></li>
- <li class="current"><a href="functions_rela.html"><span>Related&nbsp;Functions</span></a></li>
- </ul>
- </div>
-</div>
-<div class="contents">
-&nbsp;
-<p>
-<ul>
-<li>Inotify
-: <a class="el" href="classInotifyWatch.html#94bfb861dc18ca5d16abfcff90db8c86">InotifyWatch</a>
-<li>InotifyWatch
-: <a class="el" href="classInotify.html#10880f490c33acd8bd24664fc7bce4ae">Inotify</a>
-</ul>
-</div>
-<hr size="1"><address style="text-align: right;"><small><a href="http://www.doxygen.org/index.html">
-<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> </small></address>
-</body>
-</html>
diff --git a/shared/inotify/doc/html/functions_vars.html b/shared/inotify/doc/html/functions_vars.html
deleted file mode 100644
index c6f76bf7..00000000
--- a/shared/inotify/doc/html/functions_vars.html
+++ /dev/null
@@ -1,73 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
-<title>inotify-cxx: Class Members - Variables</title>
-<link href="tabs.css" rel="stylesheet" type="text/css">
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.5.9 -->
-<div class="navigation" id="top">
- <div class="tabs">
- <ul>
- <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
- <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
- <li><a href="files.html"><span>Files</span></a></li>
- </ul>
- </div>
- <div class="tabs">
- <ul>
- <li><a href="annotated.html"><span>Class&nbsp;List</span></a></li>
- <li class="current"><a href="functions.html"><span>Class&nbsp;Members</span></a></li>
- </ul>
- </div>
- <div class="tabs">
- <ul>
- <li><a href="functions.html"><span>All</span></a></li>
- <li><a href="functions_func.html"><span>Functions</span></a></li>
- <li class="current"><a href="functions_vars.html"><span>Variables</span></a></li>
- <li><a href="functions_rela.html"><span>Related&nbsp;Functions</span></a></li>
- </ul>
- </div>
-</div>
-<div class="contents">
-&nbsp;
-<p>
-<ul>
-<li>m_buf
-: <a class="el" href="classInotify.html#eee7847efd93b681fddac56860fc7958">Inotify</a>
-<li>m_err
-: <a class="el" href="classInotifyException.html#aa8a163c661ce70e34b3e3e7ad700854">InotifyException</a>
-<li>m_events
-: <a class="el" href="classInotify.html#0c1d6c969292dbb7c8c1283a3d8f55e0">Inotify</a>
-<li>m_fd
-: <a class="el" href="classInotify.html#95d6d0ecefff77bd3ee50f1586a4552b">Inotify</a>
-<li>m_fEnabled
-: <a class="el" href="classInotifyWatch.html#b0c23c89cc2996bdf6f41b8ef1f1ed18">InotifyWatch</a>
-<li>m_msg
-: <a class="el" href="classInotifyException.html#c113719bd6f4352e12876b2322f1c92c">InotifyException</a>
-<li>m_name
-: <a class="el" href="classInotifyEvent.html#6c507a3466515aedc266bdc267079604">InotifyEvent</a>
-<li>m_path
-: <a class="el" href="classInotifyWatch.html#a63ba30ffdb8b9db27970bb1099e4db5">InotifyWatch</a>
-<li>m_paths
-: <a class="el" href="classInotify.html#62f275db6375a366023b2e46f73e3ecc">Inotify</a>
-<li>m_pInotify
-: <a class="el" href="classInotifyWatch.html#ea695aa11f6105184df1ef265be3f1b9">InotifyWatch</a>
-<li>m_pSrc
-: <a class="el" href="classInotifyException.html#dd106c2255890025561245cf91fe1427">InotifyException</a>
-<li>m_pWatch
-: <a class="el" href="classInotifyEvent.html#2d151cdcc547ee4ce49cfd44328d87ac">InotifyEvent</a>
-<li>m_uCookie
-: <a class="el" href="classInotifyEvent.html#bf417d466fb0173d337cc66539ee55af">InotifyEvent</a>
-<li>m_uMask
-: <a class="el" href="classInotifyWatch.html#f725ea61e3252adae6153ecb80de23a8">InotifyWatch</a>
-, <a class="el" href="classInotifyEvent.html#739a943357af0c3fafd58466803e04fa">InotifyEvent</a>
-<li>m_watches
-: <a class="el" href="classInotify.html#4d07f3a4412028d687936d2479d9a976">Inotify</a>
-<li>m_wd
-: <a class="el" href="classInotifyWatch.html#90a78898dc850b238e713e0db284fb0a">InotifyWatch</a>
-</ul>
-</div>
-<hr size="1"><address style="text-align: right;"><small><a href="http://www.doxygen.org/index.html">
-<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> </small></address>
-</body>
-</html>
diff --git a/shared/inotify/doc/html/globals.html b/shared/inotify/doc/html/globals.html
deleted file mode 100644
index 52989e59..00000000
--- a/shared/inotify/doc/html/globals.html
+++ /dev/null
@@ -1,81 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
-<title>inotify-cxx: Class Members</title>
-<link href="tabs.css" rel="stylesheet" type="text/css">
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.5.9 -->
-<div class="navigation" id="top">
- <div class="tabs">
- <ul>
- <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
- <li><a href="annotated.html"><span>Classes</span></a></li>
- <li class="current"><a href="files.html"><span>Files</span></a></li>
- </ul>
- </div>
- <div class="tabs">
- <ul>
- <li><a href="files.html"><span>File&nbsp;List</span></a></li>
- <li class="current"><a href="globals.html"><span>File&nbsp;Members</span></a></li>
- </ul>
- </div>
- <div class="tabs">
- <ul>
- <li class="current"><a href="globals.html"><span>All</span></a></li>
- <li><a href="globals_type.html"><span>Typedefs</span></a></li>
- <li><a href="globals_enum.html"><span>Enumerations</span></a></li>
- <li><a href="globals_eval.html"><span>Enumerator</span></a></li>
- <li><a href="globals_defs.html"><span>Defines</span></a></li>
- </ul>
- </div>
-</div>
-<div class="contents">
-Here is a list of all file members with links to the files they belong to:
-<p>
-<ul>
-<li>DUMP_SEP
-: <a class="el" href="inotify-cxx_8cpp.html#6e5d8f74743466e712bbaf3b1de1e93d">inotify-cxx.cpp</a>
-<li>IN_EXC_MSG
-: <a class="el" href="inotify-cxx_8h.html#fe6b93f7e09db7022f1f9dd102932e12">inotify-cxx.h</a>
-<li>IN_LOCK_DECL
-: <a class="el" href="inotify-cxx_8h.html#904d25c0fd931e1bad4f9d5cd346a766">inotify-cxx.h</a>
-<li>IN_LOCK_DONE
-: <a class="el" href="inotify-cxx_8h.html#08422ec66fb587c1684afbaa575a53dd">inotify-cxx.h</a>
-<li>IN_LOCK_INIT
-: <a class="el" href="inotify-cxx_8h.html#981aa546075fba39715fd2f63a41f575">inotify-cxx.h</a>
-<li>IN_MAX_EVENTS
-: <a class="el" href="inotify-cxx_8h.html#bccd39d32dd83905178cf42edaae5c4d18e969c9c44523b38a13b0a207286dd1">inotify-cxx.h</a>
-<li>IN_MAX_INSTANCES
-: <a class="el" href="inotify-cxx_8h.html#bccd39d32dd83905178cf42edaae5c4d43cc45296a9afe5cb68f568176608dd9">inotify-cxx.h</a>
-<li>IN_MAX_WATCHES
-: <a class="el" href="inotify-cxx_8h.html#bccd39d32dd83905178cf42edaae5c4d594390780d2bdcec064c00aec1f20429">inotify-cxx.h</a>
-<li>IN_READ_BEGIN
-: <a class="el" href="inotify-cxx_8h.html#963a97dc42487e86715b4e04639b0db8">inotify-cxx.h</a>
-<li>IN_READ_END
-: <a class="el" href="inotify-cxx_8h.html#0b82080ab6709175341b97e1f3c3955d">inotify-cxx.h</a>
-<li>IN_READ_END_NOTHROW
-: <a class="el" href="inotify-cxx_8h.html#5c6a5be1898ef17662795cc4b420c851">inotify-cxx.h</a>
-<li>IN_WATCH_MAP
-: <a class="el" href="inotify-cxx_8h.html#e6b5ebcb4e0d6a9f5ca8da26bc00cc2a">inotify-cxx.h</a>
-<li>IN_WP_MAP
-: <a class="el" href="inotify-cxx_8h.html#5dd7761ff5a6b7cc7271950aebb7ddf6">inotify-cxx.h</a>
-<li>IN_WRITE_BEGIN
-: <a class="el" href="inotify-cxx_8h.html#c3a6d87ace9403f7ac58f931bbcd9599">inotify-cxx.h</a>
-<li>IN_WRITE_END
-: <a class="el" href="inotify-cxx_8h.html#f8aeac51b3b4ef56f1791c5c1a2e9cf5">inotify-cxx.h</a>
-<li>IN_WRITE_END_NOTHROW
-: <a class="el" href="inotify-cxx_8h.html#7e68c4884137939c5e3301f40c198dc7">inotify-cxx.h</a>
-<li>INOTIFY_BUFLEN
-: <a class="el" href="inotify-cxx_8h.html#a84911f8e42d71161b60d4a28940abb4">inotify-cxx.h</a>
-<li>INOTIFY_EVENT_SIZE
-: <a class="el" href="inotify-cxx_8h.html#f64b4cc985ba26f31a9cb242153a5014">inotify-cxx.h</a>
-<li>InotifyCapability_t
-: <a class="el" href="inotify-cxx_8h.html#bccd39d32dd83905178cf42edaae5c4d">inotify-cxx.h</a>
-<li>PROCFS_INOTIFY_BASE
-: <a class="el" href="inotify-cxx_8cpp.html#481097f28678020b2cbb26dd071a0085">inotify-cxx.cpp</a>
-</ul>
-</div>
-<hr size="1"><address style="text-align: right;"><small><a href="http://www.doxygen.org/index.html">
-<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> </small></address>
-</body>
-</html>
diff --git a/shared/inotify/doc/html/globals_defs.html b/shared/inotify/doc/html/globals_defs.html
deleted file mode 100644
index 6b434a97..00000000
--- a/shared/inotify/doc/html/globals_defs.html
+++ /dev/null
@@ -1,69 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
-<title>inotify-cxx: Class Members</title>
-<link href="tabs.css" rel="stylesheet" type="text/css">
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.5.9 -->
-<div class="navigation" id="top">
- <div class="tabs">
- <ul>
- <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
- <li><a href="annotated.html"><span>Classes</span></a></li>
- <li class="current"><a href="files.html"><span>Files</span></a></li>
- </ul>
- </div>
- <div class="tabs">
- <ul>
- <li><a href="files.html"><span>File&nbsp;List</span></a></li>
- <li class="current"><a href="globals.html"><span>File&nbsp;Members</span></a></li>
- </ul>
- </div>
- <div class="tabs">
- <ul>
- <li><a href="globals.html"><span>All</span></a></li>
- <li><a href="globals_type.html"><span>Typedefs</span></a></li>
- <li><a href="globals_enum.html"><span>Enumerations</span></a></li>
- <li><a href="globals_eval.html"><span>Enumerator</span></a></li>
- <li class="current"><a href="globals_defs.html"><span>Defines</span></a></li>
- </ul>
- </div>
-</div>
-<div class="contents">
-&nbsp;
-<p>
-<ul>
-<li>DUMP_SEP
-: <a class="el" href="inotify-cxx_8cpp.html#6e5d8f74743466e712bbaf3b1de1e93d">inotify-cxx.cpp</a>
-<li>IN_EXC_MSG
-: <a class="el" href="inotify-cxx_8h.html#fe6b93f7e09db7022f1f9dd102932e12">inotify-cxx.h</a>
-<li>IN_LOCK_DECL
-: <a class="el" href="inotify-cxx_8h.html#904d25c0fd931e1bad4f9d5cd346a766">inotify-cxx.h</a>
-<li>IN_LOCK_DONE
-: <a class="el" href="inotify-cxx_8h.html#08422ec66fb587c1684afbaa575a53dd">inotify-cxx.h</a>
-<li>IN_LOCK_INIT
-: <a class="el" href="inotify-cxx_8h.html#981aa546075fba39715fd2f63a41f575">inotify-cxx.h</a>
-<li>IN_READ_BEGIN
-: <a class="el" href="inotify-cxx_8h.html#963a97dc42487e86715b4e04639b0db8">inotify-cxx.h</a>
-<li>IN_READ_END
-: <a class="el" href="inotify-cxx_8h.html#0b82080ab6709175341b97e1f3c3955d">inotify-cxx.h</a>
-<li>IN_READ_END_NOTHROW
-: <a class="el" href="inotify-cxx_8h.html#5c6a5be1898ef17662795cc4b420c851">inotify-cxx.h</a>
-<li>IN_WRITE_BEGIN
-: <a class="el" href="inotify-cxx_8h.html#c3a6d87ace9403f7ac58f931bbcd9599">inotify-cxx.h</a>
-<li>IN_WRITE_END
-: <a class="el" href="inotify-cxx_8h.html#f8aeac51b3b4ef56f1791c5c1a2e9cf5">inotify-cxx.h</a>
-<li>IN_WRITE_END_NOTHROW
-: <a class="el" href="inotify-cxx_8h.html#7e68c4884137939c5e3301f40c198dc7">inotify-cxx.h</a>
-<li>INOTIFY_BUFLEN
-: <a class="el" href="inotify-cxx_8h.html#a84911f8e42d71161b60d4a28940abb4">inotify-cxx.h</a>
-<li>INOTIFY_EVENT_SIZE
-: <a class="el" href="inotify-cxx_8h.html#f64b4cc985ba26f31a9cb242153a5014">inotify-cxx.h</a>
-<li>PROCFS_INOTIFY_BASE
-: <a class="el" href="inotify-cxx_8cpp.html#481097f28678020b2cbb26dd071a0085">inotify-cxx.cpp</a>
-</ul>
-</div>
-<hr size="1"><address style="text-align: right;"><small><a href="http://www.doxygen.org/index.html">
-<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> </small></address>
-</body>
-</html>
diff --git a/shared/inotify/doc/html/globals_enum.html b/shared/inotify/doc/html/globals_enum.html
deleted file mode 100644
index 58f68878..00000000
--- a/shared/inotify/doc/html/globals_enum.html
+++ /dev/null
@@ -1,43 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
-<title>inotify-cxx: Class Members</title>
-<link href="tabs.css" rel="stylesheet" type="text/css">
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.5.9 -->
-<div class="navigation" id="top">
- <div class="tabs">
- <ul>
- <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
- <li><a href="annotated.html"><span>Classes</span></a></li>
- <li class="current"><a href="files.html"><span>Files</span></a></li>
- </ul>
- </div>
- <div class="tabs">
- <ul>
- <li><a href="files.html"><span>File&nbsp;List</span></a></li>
- <li class="current"><a href="globals.html"><span>File&nbsp;Members</span></a></li>
- </ul>
- </div>
- <div class="tabs">
- <ul>
- <li><a href="globals.html"><span>All</span></a></li>
- <li><a href="globals_type.html"><span>Typedefs</span></a></li>
- <li class="current"><a href="globals_enum.html"><span>Enumerations</span></a></li>
- <li><a href="globals_eval.html"><span>Enumerator</span></a></li>
- <li><a href="globals_defs.html"><span>Defines</span></a></li>
- </ul>
- </div>
-</div>
-<div class="contents">
-&nbsp;
-<p>
-<ul>
-<li>InotifyCapability_t
-: <a class="el" href="inotify-cxx_8h.html#bccd39d32dd83905178cf42edaae5c4d">inotify-cxx.h</a>
-</ul>
-</div>
-<hr size="1"><address style="text-align: right;"><small><a href="http://www.doxygen.org/index.html">
-<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> </small></address>
-</body>
-</html>
diff --git a/shared/inotify/doc/html/globals_eval.html b/shared/inotify/doc/html/globals_eval.html
deleted file mode 100644
index 53cb2d59..00000000
--- a/shared/inotify/doc/html/globals_eval.html
+++ /dev/null
@@ -1,47 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
-<title>inotify-cxx: Class Members</title>
-<link href="tabs.css" rel="stylesheet" type="text/css">
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.5.9 -->
-<div class="navigation" id="top">
- <div class="tabs">
- <ul>
- <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
- <li><a href="annotated.html"><span>Classes</span></a></li>
- <li class="current"><a href="files.html"><span>Files</span></a></li>
- </ul>
- </div>
- <div class="tabs">
- <ul>
- <li><a href="files.html"><span>File&nbsp;List</span></a></li>
- <li class="current"><a href="globals.html"><span>File&nbsp;Members</span></a></li>
- </ul>
- </div>
- <div class="tabs">
- <ul>
- <li><a href="globals.html"><span>All</span></a></li>
- <li><a href="globals_type.html"><span>Typedefs</span></a></li>
- <li><a href="globals_enum.html"><span>Enumerations</span></a></li>
- <li class="current"><a href="globals_eval.html"><span>Enumerator</span></a></li>
- <li><a href="globals_defs.html"><span>Defines</span></a></li>
- </ul>
- </div>
-</div>
-<div class="contents">
-&nbsp;
-<p>
-<ul>
-<li>IN_MAX_EVENTS
-: <a class="el" href="inotify-cxx_8h.html#bccd39d32dd83905178cf42edaae5c4d18e969c9c44523b38a13b0a207286dd1">inotify-cxx.h</a>
-<li>IN_MAX_INSTANCES
-: <a class="el" href="inotify-cxx_8h.html#bccd39d32dd83905178cf42edaae5c4d43cc45296a9afe5cb68f568176608dd9">inotify-cxx.h</a>
-<li>IN_MAX_WATCHES
-: <a class="el" href="inotify-cxx_8h.html#bccd39d32dd83905178cf42edaae5c4d594390780d2bdcec064c00aec1f20429">inotify-cxx.h</a>
-</ul>
-</div>
-<hr size="1"><address style="text-align: right;"><small><a href="http://www.doxygen.org/index.html">
-<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> </small></address>
-</body>
-</html>
diff --git a/shared/inotify/doc/html/globals_type.html b/shared/inotify/doc/html/globals_type.html
deleted file mode 100644
index 3e2f0b63..00000000
--- a/shared/inotify/doc/html/globals_type.html
+++ /dev/null
@@ -1,45 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
-<title>inotify-cxx: Class Members</title>
-<link href="tabs.css" rel="stylesheet" type="text/css">
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.5.9 -->
-<div class="navigation" id="top">
- <div class="tabs">
- <ul>
- <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
- <li><a href="annotated.html"><span>Classes</span></a></li>
- <li class="current"><a href="files.html"><span>Files</span></a></li>
- </ul>
- </div>
- <div class="tabs">
- <ul>
- <li><a href="files.html"><span>File&nbsp;List</span></a></li>
- <li class="current"><a href="globals.html"><span>File&nbsp;Members</span></a></li>
- </ul>
- </div>
- <div class="tabs">
- <ul>
- <li><a href="globals.html"><span>All</span></a></li>
- <li class="current"><a href="globals_type.html"><span>Typedefs</span></a></li>
- <li><a href="globals_enum.html"><span>Enumerations</span></a></li>
- <li><a href="globals_eval.html"><span>Enumerator</span></a></li>
- <li><a href="globals_defs.html"><span>Defines</span></a></li>
- </ul>
- </div>
-</div>
-<div class="contents">
-&nbsp;
-<p>
-<ul>
-<li>IN_WATCH_MAP
-: <a class="el" href="inotify-cxx_8h.html#e6b5ebcb4e0d6a9f5ca8da26bc00cc2a">inotify-cxx.h</a>
-<li>IN_WP_MAP
-: <a class="el" href="inotify-cxx_8h.html#5dd7761ff5a6b7cc7271950aebb7ddf6">inotify-cxx.h</a>
-</ul>
-</div>
-<hr size="1"><address style="text-align: right;"><small><a href="http://www.doxygen.org/index.html">
-<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> </small></address>
-</body>
-</html>
diff --git a/shared/inotify/doc/html/graph_legend.dot b/shared/inotify/doc/html/graph_legend.dot
deleted file mode 100644
index 9a09018a..00000000
--- a/shared/inotify/doc/html/graph_legend.dot
+++ /dev/null
@@ -1,22 +0,0 @@
-digraph G
-{
- edge [fontname="FreeSans",fontsize="10",labelfontname="FreeSans",labelfontsize="10"];
- node [fontname="FreeSans",fontsize="10",shape=record];
- Node9 [shape="box",label="Inherited",fontsize="10",height=0.2,width=0.4,fontname="FreeSans",fillcolor="grey75",style="filled" fontcolor="black"];
- Node10 -> Node9 [dir=back,color="midnightblue",fontsize="10",style="solid",fontname="FreeSans"];
- Node10 [shape="box",label="PublicBase",fontsize="10",height=0.2,width=0.4,fontname="FreeSans",color="black",URL="$classPublicBase.html"];
- Node11 -> Node10 [dir=back,color="midnightblue",fontsize="10",style="solid",fontname="FreeSans"];
- Node11 [shape="box",label="Truncated",fontsize="10",height=0.2,width=0.4,fontname="FreeSans",color="red",URL="$classTruncated.html"];
- Node13 -> Node9 [dir=back,color="darkgreen",fontsize="10",style="solid",fontname="FreeSans"];
- Node13 [shape="box",label="ProtectedBase",fontsize="10",height=0.2,width=0.4,fontname="FreeSans",color="black",URL="$classProtectedBase.html"];
- Node14 -> Node9 [dir=back,color="firebrick4",fontsize="10",style="solid",fontname="FreeSans"];
- Node14 [shape="box",label="PrivateBase",fontsize="10",height=0.2,width=0.4,fontname="FreeSans",color="black",URL="$classPrivateBase.html"];
- Node15 -> Node9 [dir=back,color="midnightblue",fontsize="10",style="solid",fontname="FreeSans"];
- Node15 [shape="box",label="Undocumented",fontsize="10",height=0.2,width=0.4,fontname="FreeSans",color="grey75"];
- Node16 -> Node9 [dir=back,color="midnightblue",fontsize="10",style="solid",fontname="FreeSans"];
- Node16 [shape="box",label="Templ< int >",fontsize="10",height=0.2,width=0.4,fontname="FreeSans",color="black",URL="$classTempl.html"];
- Node17 -> Node16 [dir=back,color="orange",fontsize="10",style="dashed",label="< int >",fontname="FreeSans"];
- Node17 [shape="box",label="Templ< T >",fontsize="10",height=0.2,width=0.4,fontname="FreeSans",color="black",URL="$classTempl.html"];
- Node18 -> Node9 [dir=back,color="darkorchid3",fontsize="10",style="dashed",label="m_usedClass",fontname="FreeSans"];
- Node18 [shape="box",label="Used",fontsize="10",height=0.2,width=0.4,fontname="FreeSans",color="black",URL="$classUsed.html"];
-}
diff --git a/shared/inotify/doc/html/graph_legend.html b/shared/inotify/doc/html/graph_legend.html
deleted file mode 100644
index e86c0cf9..00000000
--- a/shared/inotify/doc/html/graph_legend.html
+++ /dev/null
@@ -1,84 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
-<title>inotify-cxx: Graph Legend</title>
-<link href="tabs.css" rel="stylesheet" type="text/css">
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.5.9 -->
-<div class="navigation" id="top">
- <div class="tabs">
- <ul>
- <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
- <li><a href="annotated.html"><span>Classes</span></a></li>
- <li><a href="files.html"><span>Files</span></a></li>
- </ul>
- </div>
-</div>
-<div class="contents">
-<h1>Graph Legend</h1>This page explains how to interpret the graphs that are generated by doxygen.<p>
-Consider the following example: <div class="fragment"><pre class="fragment"><span class="comment">/*! Invisible class because of truncation */</span>
-<span class="keyword">class </span>Invisible { };
-<span class="comment"></span>
-<span class="comment">/*! Truncated class, inheritance relation is hidden */</span>
-<span class="keyword">class </span>Truncated : <span class="keyword">public</span> Invisible { };
-
-<span class="comment">/* Class not documented with doxygen comments */</span>
-<span class="keyword">class </span>Undocumented { };
-<span class="comment"></span>
-<span class="comment">/*! Class that is inherited using public inheritance */</span>
-<span class="keyword">class </span>PublicBase : <span class="keyword">public</span> Truncated { };
-<span class="comment"></span>
-<span class="comment">/*! A template class */</span>
-<span class="keyword">template</span>&lt;<span class="keyword">class</span> T&gt; <span class="keyword">class </span>Templ { };
-<span class="comment"></span>
-<span class="comment">/*! Class that is inherited using protected inheritance */</span>
-<span class="keyword">class </span>ProtectedBase { };
-<span class="comment"></span>
-<span class="comment">/*! Class that is inherited using private inheritance */</span>
-<span class="keyword">class </span>PrivateBase { };
-<span class="comment"></span>
-<span class="comment">/*! Class that is used by the Inherited class */</span>
-<span class="keyword">class </span>Used { };
-<span class="comment"></span>
-<span class="comment">/*! Super class that inherits a number of other classes */</span>
-<span class="keyword">class </span>Inherited : <span class="keyword">public</span> PublicBase,
- <span class="keyword">protected</span> ProtectedBase,
- <span class="keyword">private</span> PrivateBase,
- <span class="keyword">public</span> Undocumented,
- <span class="keyword">public</span> Templ&lt;int&gt;
-{
- <span class="keyword">private</span>:
- Used *m_usedClass;
-};
-</pre></div> This will result in the following graph:<p>
-<center><div align="center">
-<img src="graph_legend.png" alt="graph_legend.png">
-</div>
-</center> <p>
-The boxes in the above graph have the following meaning: <ul>
-<li>
-A filled gray box represents the struct or class for which the graph is generated. </li>
-<li>
-A box with a black border denotes a documented struct or class. </li>
-<li>
-A box with a grey border denotes an undocumented struct or class. </li>
-<li>
-A box with a red border denotes a documented struct or class forwhich not all inheritance/containment relations are shown. A graph is truncated if it does not fit within the specified boundaries. </li>
-</ul>
-The arrows have the following meaning: <ul>
-<li>
-A dark blue arrow is used to visualize a public inheritance relation between two classes. </li>
-<li>
-A dark green arrow is used for protected inheritance. </li>
-<li>
-A dark red arrow is used for private inheritance. </li>
-<li>
-A purple dashed arrow is used if a class is contained or used by another class. The arrow is labeled with the variable(s) through which the pointed class or struct is accessible. </li>
-<li>
-A yellow dashed arrow denotes a relation between a template instance and the template class it was instantiated from. The arrow is labeled with the template parameters of the instance. </li>
-</ul>
-</div>
-<hr size="1"><address style="text-align: right;"><small><a href="http://www.doxygen.org/index.html">
-<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> </small></address>
-</body>
-</html>
diff --git a/shared/inotify/doc/html/graph_legend.png b/shared/inotify/doc/html/graph_legend.png
deleted file mode 100644
index 67057ca1..00000000
--- a/shared/inotify/doc/html/graph_legend.png
+++ /dev/null
Binary files differ
diff --git a/shared/inotify/doc/html/index.html b/shared/inotify/doc/html/index.html
deleted file mode 100644
index 94cae8a5..00000000
--- a/shared/inotify/doc/html/index.html
+++ /dev/null
@@ -1,24 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
-<title>inotify-cxx: Main Page</title>
-<link href="tabs.css" rel="stylesheet" type="text/css">
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.5.9 -->
-<div class="navigation" id="top">
- <div class="tabs">
- <ul>
- <li class="current"><a href="index.html"><span>Main&nbsp;Page</span></a></li>
- <li><a href="annotated.html"><span>Classes</span></a></li>
- <li><a href="files.html"><span>Files</span></a></li>
- </ul>
- </div>
-</div>
-<div class="contents">
-<h1>inotify-cxx Documentation</h1>
-<p>
-<h3 align="center">0.7.3 </h3></div>
-<hr size="1"><address style="text-align: right;"><small><a href="http://www.doxygen.org/index.html">
-<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> </small></address>
-</body>
-</html>
diff --git a/shared/inotify/doc/html/inotify-cxx_8cpp.html b/shared/inotify/doc/html/inotify-cxx_8cpp.html
deleted file mode 100644
index c307e1ca..00000000
--- a/shared/inotify/doc/html/inotify-cxx_8cpp.html
+++ /dev/null
@@ -1,109 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
-<title>inotify-cxx: inotify-cxx.cpp File Reference</title>
-<link href="tabs.css" rel="stylesheet" type="text/css">
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.5.9 -->
-<div class="navigation" id="top">
- <div class="tabs">
- <ul>
- <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
- <li><a href="annotated.html"><span>Classes</span></a></li>
- <li class="current"><a href="files.html"><span>Files</span></a></li>
- </ul>
- </div>
- <div class="tabs">
- <ul>
- <li><a href="files.html"><span>File&nbsp;List</span></a></li>
- <li><a href="globals.html"><span>File&nbsp;Members</span></a></li>
- </ul>
- </div>
-</div>
-<div class="contents">
-<h1>inotify-cxx.cpp File Reference</h1>inotify C++ interface implementation
-<a href="#_details">More...</a>
-<p>
-<code>#include &lt;errno.h&gt;</code><br>
-<code>#include &lt;unistd.h&gt;</code><br>
-<code>#include &lt;fcntl.h&gt;</code><br>
-<code>#include &lt;fstream&gt;</code><br>
-<code>#include &lt;sys/syscall.h&gt;</code><br>
-<code>#include &lt;sys/inotify-syscalls.h&gt;</code><br>
-<code>#include &quot;<a class="el" href="inotify-cxx_8h_source.html">inotify-cxx.h</a>&quot;</code><br>
-
-<p>
-<div class="dynheader">
-Include dependency graph for inotify-cxx.cpp:</div>
-<div class="dynsection">
-<p><center><img src="inotify-cxx_8cpp__incl.png" border="0" usemap="#inotify-cxx.cpp_map" alt=""></center>
-<map name="inotify-cxx.cpp_map">
-<area shape="rect" href="inotify-cxx_8h.html" title="inotify C++ interface header" alt="" coords="640,80,731,107"></map>
-</div>
-<table border="0" cellpadding="0" cellspacing="0">
-<tr><td></td></tr>
-<tr><td colspan="2"><br><h2>Defines</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">#define&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="inotify-cxx_8cpp.html#481097f28678020b2cbb26dd071a0085">PROCFS_INOTIFY_BASE</a>&nbsp;&nbsp;&nbsp;&quot;/proc/sys/fs/inotify/&quot;</td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">procfs inotify base path <a href="#481097f28678020b2cbb26dd071a0085"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">#define&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="inotify-cxx_8cpp.html#6e5d8f74743466e712bbaf3b1de1e93d">DUMP_SEP</a></td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">dump separator (between particular entries) <a href="#6e5d8f74743466e712bbaf3b1de1e93d"></a><br></td></tr>
-</table>
-<hr><h2>Detailed Description</h2>
-inotify C++ interface implementation
-<p>
-inotify C++ interface<p>
-Copyright (C) 2006, 2007, 2009 Lukas Jelinek &lt;<a href="mailto:lukas@aiken.cz">lukas@aiken.cz</a>&gt;<p>
-This program is free software; you can redistribute it and/or modify it under the terms of one of the following licenses:<p>
-<ul>
-<li>1. X11-style license (see LICENSE-X11) </li>
-<li>2. GNU Lesser General Public License, version 2.1 (see LICENSE-LGPL) </li>
-<li>3. GNU General Public License, version 2 (see LICENSE-GPL)</li>
-</ul>
-If you want to help with choosing the best license for you, please visit <a href="http://www.gnu.org/licenses/license-list.html.">http://www.gnu.org/licenses/license-list.html.</a><p>
-Credits: Mike Frysinger (cleanup of includes) <hr><h2>Define Documentation</h2>
-<a class="anchor" name="6e5d8f74743466e712bbaf3b1de1e93d"></a><!-- doxytag: member="inotify&#45;cxx.cpp::DUMP_SEP" ref="6e5d8f74743466e712bbaf3b1de1e93d" args="" -->
-<div class="memitem">
-<div class="memproto">
- <table class="memname">
- <tr>
- <td class="memname">#define DUMP_SEP </td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-<b>Value:</b><div class="fragment"><pre class="fragment">({ \
- <span class="keywordflow">if</span> (!rStr.empty()) { \
- rStr.append(<span class="stringliteral">","</span>); \
- } \
- })
-</pre></div>dump separator (between particular entries)
-<p>
-
-</div>
-</div><p>
-<a class="anchor" name="481097f28678020b2cbb26dd071a0085"></a><!-- doxytag: member="inotify&#45;cxx.cpp::PROCFS_INOTIFY_BASE" ref="481097f28678020b2cbb26dd071a0085" args="" -->
-<div class="memitem">
-<div class="memproto">
- <table class="memname">
- <tr>
- <td class="memname">#define PROCFS_INOTIFY_BASE&nbsp;&nbsp;&nbsp;&quot;/proc/sys/fs/inotify/&quot; </td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-procfs inotify base path
-<p>
-
-</div>
-</div><p>
-</div>
-<hr size="1"><address style="text-align: right;"><small><a href="http://www.doxygen.org/index.html">
-<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> </small></address>
-</body>
-</html>
diff --git a/shared/inotify/doc/html/inotify-cxx_8cpp__incl.map b/shared/inotify/doc/html/inotify-cxx_8cpp__incl.map
deleted file mode 100644
index 7f997b6b..00000000
--- a/shared/inotify/doc/html/inotify-cxx_8cpp__incl.map
+++ /dev/null
@@ -1 +0,0 @@
-<area shape="rect" href="$inotify-cxx_8h.html" title="inotify C++ interface header" alt="" coords="640,80,731,107">
diff --git a/shared/inotify/doc/html/inotify-cxx_8cpp__incl.md5 b/shared/inotify/doc/html/inotify-cxx_8cpp__incl.md5
deleted file mode 100644
index 9c28c7ef..00000000
--- a/shared/inotify/doc/html/inotify-cxx_8cpp__incl.md5
+++ /dev/null
@@ -1 +0,0 @@
-579c4ee16d330d2021fb9eb25831f079 \ No newline at end of file
diff --git a/shared/inotify/doc/html/inotify-cxx_8cpp__incl.png b/shared/inotify/doc/html/inotify-cxx_8cpp__incl.png
deleted file mode 100644
index ce7631c7..00000000
--- a/shared/inotify/doc/html/inotify-cxx_8cpp__incl.png
+++ /dev/null
Binary files differ
diff --git a/shared/inotify/doc/html/inotify-cxx_8h.html b/shared/inotify/doc/html/inotify-cxx_8h.html
deleted file mode 100644
index e189937d..00000000
--- a/shared/inotify/doc/html/inotify-cxx_8h.html
+++ /dev/null
@@ -1,387 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
-<title>inotify-cxx: inotify-cxx.h File Reference</title>
-<link href="tabs.css" rel="stylesheet" type="text/css">
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.5.9 -->
-<div class="navigation" id="top">
- <div class="tabs">
- <ul>
- <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
- <li><a href="annotated.html"><span>Classes</span></a></li>
- <li class="current"><a href="files.html"><span>Files</span></a></li>
- </ul>
- </div>
- <div class="tabs">
- <ul>
- <li><a href="files.html"><span>File&nbsp;List</span></a></li>
- <li><a href="globals.html"><span>File&nbsp;Members</span></a></li>
- </ul>
- </div>
-</div>
-<div class="contents">
-<h1>inotify-cxx.h File Reference</h1>inotify C++ interface header
-<a href="#_details">More...</a>
-<p>
-<code>#include &lt;stdint.h&gt;</code><br>
-<code>#include &lt;string&gt;</code><br>
-<code>#include &lt;deque&gt;</code><br>
-<code>#include &lt;map&gt;</code><br>
-<code>#include &lt;sys/inotify.h&gt;</code><br>
-
-<p>
-<div class="dynheader">
-Include dependency graph for inotify-cxx.h:</div>
-<div class="dynsection">
-<p><center><img src="inotify-cxx_8h__incl.png" border="0" usemap="#inotify-cxx.h_map" alt=""></center>
-</div>
-
-<p>
-<div class="dynheader">
-This graph shows which files directly or indirectly include this file:</div>
-<div class="dynsection">
-<p><center><img src="inotify-cxx_8h__dep__incl.png" border="0" usemap="#inotify-cxx.hdep_map" alt=""></center>
-<map name="inotify-cxx.hdep_map">
-<area shape="rect" href="inotify-cxx_8cpp.html" title="inotify C++ interface implementation" alt="" coords="5,80,109,107"></map>
-</div>
-
-<p>
-<a href="inotify-cxx_8h_source.html">Go to the source code of this file.</a><table border="0" cellpadding="0" cellspacing="0">
-<tr><td></td></tr>
-<tr><td colspan="2"><br><h2>Classes</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class &nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classInotifyException.html">InotifyException</a></td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Class for inotify exceptions. <a href="classInotifyException.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class &nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classInotifyEvent.html">InotifyEvent</a></td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">inotify event class <a href="classInotifyEvent.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class &nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classInotifyWatch.html">InotifyWatch</a></td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">inotify watch class <a href="classInotifyWatch.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class &nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classInotify.html">Inotify</a></td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">inotify class <a href="classInotify.html#_details">More...</a><br></td></tr>
-<tr><td colspan="2"><br><h2>Defines</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">#define&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="inotify-cxx_8h.html#f64b4cc985ba26f31a9cb242153a5014">INOTIFY_EVENT_SIZE</a>&nbsp;&nbsp;&nbsp;(sizeof(struct inotify_event))</td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Event struct size. <a href="#f64b4cc985ba26f31a9cb242153a5014"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">#define&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="inotify-cxx_8h.html#a84911f8e42d71161b60d4a28940abb4">INOTIFY_BUFLEN</a>&nbsp;&nbsp;&nbsp;(1024 * (INOTIFY_EVENT_SIZE + 16))</td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Event buffer length. <a href="#a84911f8e42d71161b60d4a28940abb4"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">#define&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="inotify-cxx_8h.html#fe6b93f7e09db7022f1f9dd102932e12">IN_EXC_MSG</a>(msg)&nbsp;&nbsp;&nbsp;(std::string(__PRETTY_FUNCTION__) + &quot;: &quot; + msg)</td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Helper macro for creating exception messages. <a href="#fe6b93f7e09db7022f1f9dd102932e12"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">#define&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="inotify-cxx_8h.html#904d25c0fd931e1bad4f9d5cd346a766">IN_LOCK_DECL</a></td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">inotify-cxx thread safety <a href="#904d25c0fd931e1bad4f9d5cd346a766"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">#define&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="inotify-cxx_8h.html#981aa546075fba39715fd2f63a41f575">IN_LOCK_INIT</a></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top">#define&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="inotify-cxx_8h.html#08422ec66fb587c1684afbaa575a53dd">IN_LOCK_DONE</a></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top">#define&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="inotify-cxx_8h.html#963a97dc42487e86715b4e04639b0db8">IN_READ_BEGIN</a></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top">#define&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="inotify-cxx_8h.html#0b82080ab6709175341b97e1f3c3955d">IN_READ_END</a></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top">#define&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="inotify-cxx_8h.html#5c6a5be1898ef17662795cc4b420c851">IN_READ_END_NOTHROW</a></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top">#define&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="inotify-cxx_8h.html#c3a6d87ace9403f7ac58f931bbcd9599">IN_WRITE_BEGIN</a></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top">#define&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="inotify-cxx_8h.html#f8aeac51b3b4ef56f1791c5c1a2e9cf5">IN_WRITE_END</a></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top">#define&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="inotify-cxx_8h.html#7e68c4884137939c5e3301f40c198dc7">IN_WRITE_END_NOTHROW</a></td></tr>
-
-<tr><td colspan="2"><br><h2>Typedefs</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">typedef std::map&lt; int32_t, <br class="typebreak">
-<a class="el" href="classInotifyWatch.html">InotifyWatch</a> * &gt;&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="inotify-cxx_8h.html#e6b5ebcb4e0d6a9f5ca8da26bc00cc2a">IN_WATCH_MAP</a></td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Mapping from watch descriptors to watch objects. <a href="#e6b5ebcb4e0d6a9f5ca8da26bc00cc2a"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">typedef std::map&lt; std::string, <br class="typebreak">
-<a class="el" href="classInotifyWatch.html">InotifyWatch</a> * &gt;&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="inotify-cxx_8h.html#5dd7761ff5a6b7cc7271950aebb7ddf6">IN_WP_MAP</a></td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Mapping from paths to watch objects. <a href="#5dd7761ff5a6b7cc7271950aebb7ddf6"></a><br></td></tr>
-<tr><td colspan="2"><br><h2>Enumerations</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">enum &nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="inotify-cxx_8h.html#bccd39d32dd83905178cf42edaae5c4d">InotifyCapability_t</a> { <a class="el" href="inotify-cxx_8h.html#bccd39d32dd83905178cf42edaae5c4d18e969c9c44523b38a13b0a207286dd1">IN_MAX_EVENTS</a> = 0,
-<a class="el" href="inotify-cxx_8h.html#bccd39d32dd83905178cf42edaae5c4d43cc45296a9afe5cb68f568176608dd9">IN_MAX_INSTANCES</a> = 1,
-<a class="el" href="inotify-cxx_8h.html#bccd39d32dd83905178cf42edaae5c4d594390780d2bdcec064c00aec1f20429">IN_MAX_WATCHES</a> = 2
- }</td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">inotify capability/limit identifiers <a href="inotify-cxx_8h.html#bccd39d32dd83905178cf42edaae5c4d">More...</a><br></td></tr>
-</table>
-<hr><h2>Detailed Description</h2>
-inotify C++ interface header
-<p>
-inotify C++ interface<p>
-Copyright (C) 2006, 2007, 2009 Lukas Jelinek, &lt;<a href="mailto:lukas@aiken.cz">lukas@aiken.cz</a>&gt;<p>
-This program is free software; you can redistribute it and/or modify it under the terms of one of the following licenses:<p>
-<ul>
-<li>1. X11-style license (see LICENSE-X11) </li>
-<li>2. GNU Lesser General Public License, version 2.1 (see LICENSE-LGPL) </li>
-<li>3. GNU General Public License, version 2 (see LICENSE-GPL)</li>
-</ul>
-If you want to help with choosing the best license for you, please visit <a href="http://www.gnu.org/licenses/license-list.html.">http://www.gnu.org/licenses/license-list.html.</a><p>
-Credits: Mike Frysinger (cleanup of includes) <hr><h2>Define Documentation</h2>
-<a class="anchor" name="fe6b93f7e09db7022f1f9dd102932e12"></a><!-- doxytag: member="inotify&#45;cxx.h::IN_EXC_MSG" ref="fe6b93f7e09db7022f1f9dd102932e12" args="(msg)" -->
-<div class="memitem">
-<div class="memproto">
- <table class="memname">
- <tr>
- <td class="memname">#define IN_EXC_MSG </td>
- <td>(</td>
- <td class="paramtype">msg&nbsp;</td>
- <td class="paramname"> </td>
- <td>&nbsp;)&nbsp;</td>
- <td>&nbsp;&nbsp;&nbsp;(std::string(__PRETTY_FUNCTION__) + &quot;: &quot; + msg)</td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Helper macro for creating exception messages.
-<p>
-It prepends the message by the function name.
-</div>
-</div><p>
-<a class="anchor" name="904d25c0fd931e1bad4f9d5cd346a766"></a><!-- doxytag: member="inotify&#45;cxx.h::IN_LOCK_DECL" ref="904d25c0fd931e1bad4f9d5cd346a766" args="" -->
-<div class="memitem">
-<div class="memproto">
- <table class="memname">
- <tr>
- <td class="memname">#define IN_LOCK_DECL </td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-inotify-cxx thread safety
-<p>
-If this symbol is defined you can use this interface safely threaded applications. Remember that it slightly degrades performance.<p>
-Even if INOTIFY_THREAD_SAFE is defined some classes stay unsafe. If you must use them (must you?) in more than one thread concurrently you need to implement explicite locking.<p>
-You need not to define INOTIFY_THREAD_SAFE in that cases where the application is multithreaded but all the inotify infrastructure will be managed only in one thread. This is the recommended way.<p>
-Locking may fail (it is very rare but not impossible). In this case an exception is thrown. But if unlocking fails in case of an error it does nothing (this failure is ignored).
-</div>
-</div><p>
-<a class="anchor" name="08422ec66fb587c1684afbaa575a53dd"></a><!-- doxytag: member="inotify&#45;cxx.h::IN_LOCK_DONE" ref="08422ec66fb587c1684afbaa575a53dd" args="" -->
-<div class="memitem">
-<div class="memproto">
- <table class="memname">
- <tr>
- <td class="memname">#define IN_LOCK_DONE </td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-
-</div>
-</div><p>
-<a class="anchor" name="981aa546075fba39715fd2f63a41f575"></a><!-- doxytag: member="inotify&#45;cxx.h::IN_LOCK_INIT" ref="981aa546075fba39715fd2f63a41f575" args="" -->
-<div class="memitem">
-<div class="memproto">
- <table class="memname">
- <tr>
- <td class="memname">#define IN_LOCK_INIT </td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-
-</div>
-</div><p>
-<a class="anchor" name="963a97dc42487e86715b4e04639b0db8"></a><!-- doxytag: member="inotify&#45;cxx.h::IN_READ_BEGIN" ref="963a97dc42487e86715b4e04639b0db8" args="" -->
-<div class="memitem">
-<div class="memproto">
- <table class="memname">
- <tr>
- <td class="memname">#define IN_READ_BEGIN </td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-
-</div>
-</div><p>
-<a class="anchor" name="0b82080ab6709175341b97e1f3c3955d"></a><!-- doxytag: member="inotify&#45;cxx.h::IN_READ_END" ref="0b82080ab6709175341b97e1f3c3955d" args="" -->
-<div class="memitem">
-<div class="memproto">
- <table class="memname">
- <tr>
- <td class="memname">#define IN_READ_END </td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-
-</div>
-</div><p>
-<a class="anchor" name="5c6a5be1898ef17662795cc4b420c851"></a><!-- doxytag: member="inotify&#45;cxx.h::IN_READ_END_NOTHROW" ref="5c6a5be1898ef17662795cc4b420c851" args="" -->
-<div class="memitem">
-<div class="memproto">
- <table class="memname">
- <tr>
- <td class="memname">#define IN_READ_END_NOTHROW </td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-
-</div>
-</div><p>
-<a class="anchor" name="c3a6d87ace9403f7ac58f931bbcd9599"></a><!-- doxytag: member="inotify&#45;cxx.h::IN_WRITE_BEGIN" ref="c3a6d87ace9403f7ac58f931bbcd9599" args="" -->
-<div class="memitem">
-<div class="memproto">
- <table class="memname">
- <tr>
- <td class="memname">#define IN_WRITE_BEGIN </td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-
-</div>
-</div><p>
-<a class="anchor" name="f8aeac51b3b4ef56f1791c5c1a2e9cf5"></a><!-- doxytag: member="inotify&#45;cxx.h::IN_WRITE_END" ref="f8aeac51b3b4ef56f1791c5c1a2e9cf5" args="" -->
-<div class="memitem">
-<div class="memproto">
- <table class="memname">
- <tr>
- <td class="memname">#define IN_WRITE_END </td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-
-</div>
-</div><p>
-<a class="anchor" name="7e68c4884137939c5e3301f40c198dc7"></a><!-- doxytag: member="inotify&#45;cxx.h::IN_WRITE_END_NOTHROW" ref="7e68c4884137939c5e3301f40c198dc7" args="" -->
-<div class="memitem">
-<div class="memproto">
- <table class="memname">
- <tr>
- <td class="memname">#define IN_WRITE_END_NOTHROW </td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-
-</div>
-</div><p>
-<a class="anchor" name="a84911f8e42d71161b60d4a28940abb4"></a><!-- doxytag: member="inotify&#45;cxx.h::INOTIFY_BUFLEN" ref="a84911f8e42d71161b60d4a28940abb4" args="" -->
-<div class="memitem">
-<div class="memproto">
- <table class="memname">
- <tr>
- <td class="memname">#define INOTIFY_BUFLEN&nbsp;&nbsp;&nbsp;(1024 * (INOTIFY_EVENT_SIZE + 16)) </td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Event buffer length.
-<p>
-
-</div>
-</div><p>
-<a class="anchor" name="f64b4cc985ba26f31a9cb242153a5014"></a><!-- doxytag: member="inotify&#45;cxx.h::INOTIFY_EVENT_SIZE" ref="f64b4cc985ba26f31a9cb242153a5014" args="" -->
-<div class="memitem">
-<div class="memproto">
- <table class="memname">
- <tr>
- <td class="memname">#define INOTIFY_EVENT_SIZE&nbsp;&nbsp;&nbsp;(sizeof(struct inotify_event)) </td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Event struct size.
-<p>
-
-</div>
-</div><p>
-<hr><h2>Typedef Documentation</h2>
-<a class="anchor" name="e6b5ebcb4e0d6a9f5ca8da26bc00cc2a"></a><!-- doxytag: member="inotify&#45;cxx.h::IN_WATCH_MAP" ref="e6b5ebcb4e0d6a9f5ca8da26bc00cc2a" args="" -->
-<div class="memitem">
-<div class="memproto">
- <table class="memname">
- <tr>
- <td class="memname">typedef std::map&lt;int32_t, <a class="el" href="classInotifyWatch.html">InotifyWatch</a>*&gt; <a class="el" href="inotify-cxx_8h.html#e6b5ebcb4e0d6a9f5ca8da26bc00cc2a">IN_WATCH_MAP</a> </td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Mapping from watch descriptors to watch objects.
-<p>
-
-</div>
-</div><p>
-<a class="anchor" name="5dd7761ff5a6b7cc7271950aebb7ddf6"></a><!-- doxytag: member="inotify&#45;cxx.h::IN_WP_MAP" ref="5dd7761ff5a6b7cc7271950aebb7ddf6" args="" -->
-<div class="memitem">
-<div class="memproto">
- <table class="memname">
- <tr>
- <td class="memname">typedef std::map&lt;std::string, <a class="el" href="classInotifyWatch.html">InotifyWatch</a>*&gt; <a class="el" href="inotify-cxx_8h.html#5dd7761ff5a6b7cc7271950aebb7ddf6">IN_WP_MAP</a> </td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-Mapping from paths to watch objects.
-<p>
-
-</div>
-</div><p>
-<hr><h2>Enumeration Type Documentation</h2>
-<a class="anchor" name="bccd39d32dd83905178cf42edaae5c4d"></a><!-- doxytag: member="inotify&#45;cxx.h::InotifyCapability_t" ref="bccd39d32dd83905178cf42edaae5c4d" args="" -->
-<div class="memitem">
-<div class="memproto">
- <table class="memname">
- <tr>
- <td class="memname">enum <a class="el" href="inotify-cxx_8h.html#bccd39d32dd83905178cf42edaae5c4d">InotifyCapability_t</a> </td>
- </tr>
- </table>
-</div>
-<div class="memdoc">
-
-<p>
-inotify capability/limit identifiers
-<p>
-<dl compact><dt><b>Enumerator: </b></dt><dd>
-<table border="0" cellspacing="2" cellpadding="0">
-<tr><td valign="top"><em><a class="anchor" name="bccd39d32dd83905178cf42edaae5c4d18e969c9c44523b38a13b0a207286dd1"></a><!-- doxytag: member="IN_MAX_EVENTS" ref="bccd39d32dd83905178cf42edaae5c4d18e969c9c44523b38a13b0a207286dd1" args="" -->IN_MAX_EVENTS</em>&nbsp;</td><td>
-max. events in the kernel queue </td></tr>
-<tr><td valign="top"><em><a class="anchor" name="bccd39d32dd83905178cf42edaae5c4d43cc45296a9afe5cb68f568176608dd9"></a><!-- doxytag: member="IN_MAX_INSTANCES" ref="bccd39d32dd83905178cf42edaae5c4d43cc45296a9afe5cb68f568176608dd9" args="" -->IN_MAX_INSTANCES</em>&nbsp;</td><td>
-max. inotify file descriptors per process </td></tr>
-<tr><td valign="top"><em><a class="anchor" name="bccd39d32dd83905178cf42edaae5c4d594390780d2bdcec064c00aec1f20429"></a><!-- doxytag: member="IN_MAX_WATCHES" ref="bccd39d32dd83905178cf42edaae5c4d594390780d2bdcec064c00aec1f20429" args="" -->IN_MAX_WATCHES</em>&nbsp;</td><td>
-max. watches per file descriptor </td></tr>
-</table>
-</dl>
-
-</div>
-</div><p>
-</div>
-<hr size="1"><address style="text-align: right;"><small><a href="http://www.doxygen.org/index.html">
-<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> </small></address>
-</body>
-</html>
diff --git a/shared/inotify/doc/html/inotify-cxx_8h__dep__incl.map b/shared/inotify/doc/html/inotify-cxx_8h__dep__incl.map
deleted file mode 100644
index 4ed3629d..00000000
--- a/shared/inotify/doc/html/inotify-cxx_8h__dep__incl.map
+++ /dev/null
@@ -1 +0,0 @@
-<area shape="rect" href="$inotify-cxx_8cpp.html" title="inotify C++ interface implementation" alt="" coords="5,80,109,107">
diff --git a/shared/inotify/doc/html/inotify-cxx_8h__dep__incl.md5 b/shared/inotify/doc/html/inotify-cxx_8h__dep__incl.md5
deleted file mode 100644
index c00ff796..00000000
--- a/shared/inotify/doc/html/inotify-cxx_8h__dep__incl.md5
+++ /dev/null
@@ -1 +0,0 @@
-4b9719ddb81e282b353a01d00e7fc79f \ No newline at end of file
diff --git a/shared/inotify/doc/html/inotify-cxx_8h__dep__incl.png b/shared/inotify/doc/html/inotify-cxx_8h__dep__incl.png
deleted file mode 100644
index 85d373cf..00000000
--- a/shared/inotify/doc/html/inotify-cxx_8h__dep__incl.png
+++ /dev/null
Binary files differ
diff --git a/shared/inotify/doc/html/inotify-cxx_8h__incl.map b/shared/inotify/doc/html/inotify-cxx_8h__incl.map
deleted file mode 100644
index e69de29b..00000000
--- a/shared/inotify/doc/html/inotify-cxx_8h__incl.map
+++ /dev/null
diff --git a/shared/inotify/doc/html/inotify-cxx_8h__incl.md5 b/shared/inotify/doc/html/inotify-cxx_8h__incl.md5
deleted file mode 100644
index c9425ce6..00000000
--- a/shared/inotify/doc/html/inotify-cxx_8h__incl.md5
+++ /dev/null
@@ -1 +0,0 @@
-98ce5d48dec51633b940ca16d76c825f \ No newline at end of file
diff --git a/shared/inotify/doc/html/inotify-cxx_8h__incl.png b/shared/inotify/doc/html/inotify-cxx_8h__incl.png
deleted file mode 100644
index ae9be329..00000000
--- a/shared/inotify/doc/html/inotify-cxx_8h__incl.png
+++ /dev/null
Binary files differ
diff --git a/shared/inotify/doc/html/inotify-cxx_8h_source.html b/shared/inotify/doc/html/inotify-cxx_8h_source.html
deleted file mode 100644
index 99b4b37a..00000000
--- a/shared/inotify/doc/html/inotify-cxx_8h_source.html
+++ /dev/null
@@ -1,503 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
-<title>inotify-cxx: inotify-cxx.h Source File</title>
-<link href="tabs.css" rel="stylesheet" type="text/css">
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.5.9 -->
-<div class="navigation" id="top">
- <div class="tabs">
- <ul>
- <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
- <li><a href="annotated.html"><span>Classes</span></a></li>
- <li class="current"><a href="files.html"><span>Files</span></a></li>
- </ul>
- </div>
- <div class="tabs">
- <ul>
- <li><a href="files.html"><span>File&nbsp;List</span></a></li>
- <li><a href="globals.html"><span>File&nbsp;Members</span></a></li>
- </ul>
- </div>
-<h1>inotify-cxx.h</h1><a href="inotify-cxx_8h.html">Go to the documentation of this file.</a><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001
-<a name="l00003"></a>00003
-<a name="l00029"></a>00029 <span class="preprocessor">#ifndef _INOTIFYCXX_H_</span>
-<a name="l00030"></a>00030 <span class="preprocessor"></span><span class="preprocessor">#define _INOTIFYCXX_H_</span>
-<a name="l00031"></a>00031 <span class="preprocessor"></span>
-<a name="l00032"></a>00032 <span class="preprocessor">#include &lt;stdint.h&gt;</span>
-<a name="l00033"></a>00033 <span class="preprocessor">#include &lt;string&gt;</span>
-<a name="l00034"></a>00034 <span class="preprocessor">#include &lt;deque&gt;</span>
-<a name="l00035"></a>00035 <span class="preprocessor">#include &lt;map&gt;</span>
-<a name="l00036"></a>00036
-<a name="l00037"></a>00037 <span class="comment">// Please ensure that the following header file takes the right place</span>
-<a name="l00038"></a>00038 <span class="preprocessor">#include &lt;sys/inotify.h&gt;</span>
-<a name="l00039"></a>00039
-<a name="l00040"></a>00040
-<a name="l00042"></a><a class="code" href="inotify-cxx_8h.html#f64b4cc985ba26f31a9cb242153a5014">00042</a> <span class="preprocessor">#define INOTIFY_EVENT_SIZE (sizeof(struct inotify_event))</span>
-<a name="l00043"></a>00043 <span class="preprocessor"></span>
-<a name="l00045"></a><a class="code" href="inotify-cxx_8h.html#a84911f8e42d71161b60d4a28940abb4">00045</a> <span class="preprocessor">#define INOTIFY_BUFLEN (1024 * (INOTIFY_EVENT_SIZE + 16))</span>
-<a name="l00046"></a>00046 <span class="preprocessor"></span>
-<a name="l00048"></a>00048
-<a name="l00051"></a><a class="code" href="inotify-cxx_8h.html#fe6b93f7e09db7022f1f9dd102932e12">00051</a> <span class="preprocessor">#define IN_EXC_MSG(msg) (std::string(__PRETTY_FUNCTION__) + ": " + msg)</span>
-<a name="l00052"></a>00052 <span class="preprocessor"></span>
-<a name="l00054"></a><a class="code" href="inotify-cxx_8h.html#bccd39d32dd83905178cf42edaae5c4d">00054</a> <span class="keyword">typedef</span> <span class="keyword">enum</span>
-<a name="l00055"></a>00055 {
-<a name="l00056"></a><a class="code" href="inotify-cxx_8h.html#bccd39d32dd83905178cf42edaae5c4d18e969c9c44523b38a13b0a207286dd1">00056</a> <a class="code" href="inotify-cxx_8h.html#bccd39d32dd83905178cf42edaae5c4d18e969c9c44523b38a13b0a207286dd1" title="max. events in the kernel queue">IN_MAX_EVENTS</a> = 0,
-<a name="l00057"></a><a class="code" href="inotify-cxx_8h.html#bccd39d32dd83905178cf42edaae5c4d43cc45296a9afe5cb68f568176608dd9">00057</a> <a class="code" href="inotify-cxx_8h.html#bccd39d32dd83905178cf42edaae5c4d43cc45296a9afe5cb68f568176608dd9" title="max. inotify file descriptors per process">IN_MAX_INSTANCES</a> = 1,
-<a name="l00058"></a><a class="code" href="inotify-cxx_8h.html#bccd39d32dd83905178cf42edaae5c4d594390780d2bdcec064c00aec1f20429">00058</a> <a class="code" href="inotify-cxx_8h.html#bccd39d32dd83905178cf42edaae5c4d594390780d2bdcec064c00aec1f20429" title="max. watches per file descriptor">IN_MAX_WATCHES</a> = 2
-<a name="l00059"></a>00059 } <a class="code" href="inotify-cxx_8h.html#bccd39d32dd83905178cf42edaae5c4d" title="inotify capability/limit identifiers">InotifyCapability_t</a>;
-<a name="l00060"></a>00060
-<a name="l00062"></a>00062
-<a name="l00080"></a>00080 <span class="preprocessor">#ifdef INOTIFY_THREAD_SAFE</span>
-<a name="l00081"></a>00081 <span class="preprocessor"></span>
-<a name="l00082"></a>00082 <span class="preprocessor">#include &lt;pthread.h&gt;</span>
-<a name="l00083"></a>00083
-<a name="l00084"></a>00084 <span class="preprocessor">#define IN_LOCK_DECL mutable pthread_rwlock_t __m_lock;</span>
-<a name="l00085"></a>00085 <span class="preprocessor"></span>
-<a name="l00086"></a>00086 <span class="preprocessor">#define IN_LOCK_INIT \</span>
-<a name="l00087"></a>00087 <span class="preprocessor"> { \</span>
-<a name="l00088"></a>00088 <span class="preprocessor"> pthread_rwlockattr_t attr; \</span>
-<a name="l00089"></a>00089 <span class="preprocessor"> int res = 0; \</span>
-<a name="l00090"></a>00090 <span class="preprocessor"> if ((res = pthread_rwlockattr_init(&amp;attr)) != 0) \</span>
-<a name="l00091"></a>00091 <span class="preprocessor"> throw InotifyException(IN_EXC_MSG("cannot initialize lock attributes"), res, this); \</span>
-<a name="l00092"></a>00092 <span class="preprocessor"> if ((res = pthread_rwlockattr_setkind_np(&amp;attr, PTHREAD_RWLOCK_PREFER_WRITER_NP)) != 0) \</span>
-<a name="l00093"></a>00093 <span class="preprocessor"> throw InotifyException(IN_EXC_MSG("cannot set lock kind"), res, this); \</span>
-<a name="l00094"></a>00094 <span class="preprocessor"> if ((res = pthread_rwlock_init(&amp;__m_lock, &amp;attr)) != 0) \</span>
-<a name="l00095"></a>00095 <span class="preprocessor"> throw InotifyException(IN_EXC_MSG("cannot initialize lock"), res, this); \</span>
-<a name="l00096"></a>00096 <span class="preprocessor"> pthread_rwlockattr_destroy(&amp;attr); \</span>
-<a name="l00097"></a>00097 <span class="preprocessor"> }</span>
-<a name="l00098"></a>00098 <span class="preprocessor"></span>
-<a name="l00099"></a>00099 <span class="preprocessor">#define IN_LOCK_DONE pthread_rwlock_destroy(&amp;__m_lock);</span>
-<a name="l00100"></a>00100 <span class="preprocessor"></span>
-<a name="l00101"></a>00101 <span class="preprocessor">#define IN_READ_BEGIN \</span>
-<a name="l00102"></a>00102 <span class="preprocessor"> { \</span>
-<a name="l00103"></a>00103 <span class="preprocessor"> int res = pthread_rwlock_rdlock(&amp;__m_lock); \</span>
-<a name="l00104"></a>00104 <span class="preprocessor"> if (res != 0) \</span>
-<a name="l00105"></a>00105 <span class="preprocessor"> throw InotifyException(IN_EXC_MSG("locking for reading failed"), res, (void*) this); \</span>
-<a name="l00106"></a>00106 <span class="preprocessor"> }</span>
-<a name="l00107"></a>00107 <span class="preprocessor"></span>
-<a name="l00108"></a>00108 <span class="preprocessor">#define IN_READ_END \</span>
-<a name="l00109"></a>00109 <span class="preprocessor"> { \</span>
-<a name="l00110"></a>00110 <span class="preprocessor"> int res = pthread_rwlock_unlock(&amp;__m_lock); \</span>
-<a name="l00111"></a>00111 <span class="preprocessor"> if (res != 0) \</span>
-<a name="l00112"></a>00112 <span class="preprocessor"> throw InotifyException(IN_EXC_MSG("unlocking failed"), res, (void*) this); \</span>
-<a name="l00113"></a>00113 <span class="preprocessor"> }</span>
-<a name="l00114"></a>00114 <span class="preprocessor"></span>
-<a name="l00115"></a>00115 <span class="preprocessor">#define IN_READ_END_NOTHROW pthread_rwlock_unlock(&amp;__m_lock);</span>
-<a name="l00116"></a>00116 <span class="preprocessor"></span>
-<a name="l00117"></a>00117 <span class="preprocessor">#define IN_WRITE_BEGIN \</span>
-<a name="l00118"></a>00118 <span class="preprocessor"> { \</span>
-<a name="l00119"></a>00119 <span class="preprocessor"> int res = pthread_rwlock_wrlock(&amp;__m_lock); \</span>
-<a name="l00120"></a>00120 <span class="preprocessor"> if (res != 0) \</span>
-<a name="l00121"></a>00121 <span class="preprocessor"> throw InotifyException(IN_EXC_MSG("locking for writing failed"), res, (void*) this); \</span>
-<a name="l00122"></a>00122 <span class="preprocessor"> }</span>
-<a name="l00123"></a>00123 <span class="preprocessor"></span>
-<a name="l00124"></a>00124 <span class="preprocessor">#define IN_WRITE_END IN_READ_END</span>
-<a name="l00125"></a>00125 <span class="preprocessor"></span><span class="preprocessor">#define IN_WRITE_END_NOTHROW IN_READ_END_NOTHROW</span>
-<a name="l00126"></a>00126 <span class="preprocessor"></span>
-<a name="l00127"></a>00127 <span class="preprocessor">#else // INOTIFY_THREAD_SAFE</span>
-<a name="l00128"></a>00128 <span class="preprocessor"></span>
-<a name="l00129"></a><a class="code" href="inotify-cxx_8h.html#904d25c0fd931e1bad4f9d5cd346a766">00129</a> <span class="preprocessor">#define IN_LOCK_DECL</span>
-<a name="l00130"></a><a class="code" href="inotify-cxx_8h.html#981aa546075fba39715fd2f63a41f575">00130</a> <span class="preprocessor"></span><span class="preprocessor">#define IN_LOCK_INIT</span>
-<a name="l00131"></a><a class="code" href="inotify-cxx_8h.html#08422ec66fb587c1684afbaa575a53dd">00131</a> <span class="preprocessor"></span><span class="preprocessor">#define IN_LOCK_DONE</span>
-<a name="l00132"></a><a class="code" href="inotify-cxx_8h.html#963a97dc42487e86715b4e04639b0db8">00132</a> <span class="preprocessor"></span><span class="preprocessor">#define IN_READ_BEGIN</span>
-<a name="l00133"></a><a class="code" href="inotify-cxx_8h.html#0b82080ab6709175341b97e1f3c3955d">00133</a> <span class="preprocessor"></span><span class="preprocessor">#define IN_READ_END</span>
-<a name="l00134"></a><a class="code" href="inotify-cxx_8h.html#5c6a5be1898ef17662795cc4b420c851">00134</a> <span class="preprocessor"></span><span class="preprocessor">#define IN_READ_END_NOTHROW</span>
-<a name="l00135"></a><a class="code" href="inotify-cxx_8h.html#c3a6d87ace9403f7ac58f931bbcd9599">00135</a> <span class="preprocessor"></span><span class="preprocessor">#define IN_WRITE_BEGIN</span>
-<a name="l00136"></a><a class="code" href="inotify-cxx_8h.html#f8aeac51b3b4ef56f1791c5c1a2e9cf5">00136</a> <span class="preprocessor"></span><span class="preprocessor">#define IN_WRITE_END</span>
-<a name="l00137"></a><a class="code" href="inotify-cxx_8h.html#7e68c4884137939c5e3301f40c198dc7">00137</a> <span class="preprocessor"></span><span class="preprocessor">#define IN_WRITE_END_NOTHROW</span>
-<a name="l00138"></a>00138 <span class="preprocessor"></span>
-<a name="l00139"></a>00139 <span class="preprocessor">#endif // INOTIFY_THREAD_SAFE</span>
-<a name="l00140"></a>00140 <span class="preprocessor"></span>
-<a name="l00141"></a>00141
-<a name="l00142"></a>00142
-<a name="l00143"></a>00143
-<a name="l00144"></a>00144 <span class="comment">// forward declaration</span>
-<a name="l00145"></a>00145 <span class="keyword">class </span><a class="code" href="classInotifyWatch.html" title="inotify watch class">InotifyWatch</a>;
-<a name="l00146"></a>00146 <span class="keyword">class </span><a class="code" href="classInotify.html" title="inotify class">Inotify</a>;
-<a name="l00147"></a>00147
-<a name="l00148"></a>00148
-<a name="l00150"></a>00150
-<a name="l00158"></a><a class="code" href="classInotifyException.html">00158</a> <span class="keyword">class </span><a class="code" href="classInotifyException.html" title="Class for inotify exceptions.">InotifyException</a>
-<a name="l00159"></a>00159 {
-<a name="l00160"></a>00160 <span class="keyword">public</span>:
-<a name="l00162"></a>00162
-<a name="l00167"></a><a class="code" href="classInotifyException.html#900dc29e5cfb3ece6c1651d04773b2bb">00167</a> <a class="code" href="classInotifyException.html#900dc29e5cfb3ece6c1651d04773b2bb" title="Constructor.">InotifyException</a>(<span class="keyword">const</span> std::string&amp; rMsg = <span class="stringliteral">""</span>, <span class="keywordtype">int</span> iErr = 0, <span class="keywordtype">void</span>* pSrc = NULL)
-<a name="l00168"></a>00168 : <a class="code" href="classInotifyException.html#c113719bd6f4352e12876b2322f1c92c" title="message">m_msg</a>(rMsg),
-<a name="l00169"></a>00169 <a class="code" href="classInotifyException.html#aa8a163c661ce70e34b3e3e7ad700854" title="error number">m_err</a>(iErr)
-<a name="l00170"></a>00170 {
-<a name="l00171"></a>00171 <a class="code" href="classInotifyException.html#dd106c2255890025561245cf91fe1427" title="source">m_pSrc</a> = pSrc;
-<a name="l00172"></a>00172 }
-<a name="l00173"></a>00173
-<a name="l00175"></a>00175
-<a name="l00178"></a><a class="code" href="classInotifyException.html#6364ea375697356805d47cff957dd757">00178</a> <span class="keyword">inline</span> <span class="keyword">const</span> std::string&amp; <a class="code" href="classInotifyException.html#6364ea375697356805d47cff957dd757" title="Returns the exception message.">GetMessage</a>()<span class="keyword"> const</span>
-<a name="l00179"></a>00179 <span class="keyword"> </span>{
-<a name="l00180"></a>00180 <span class="keywordflow">return</span> <a class="code" href="classInotifyException.html#c113719bd6f4352e12876b2322f1c92c" title="message">m_msg</a>;
-<a name="l00181"></a>00181 }
-<a name="l00182"></a>00182
-<a name="l00184"></a>00184
-<a name="l00189"></a><a class="code" href="classInotifyException.html#60d885f998a6cb97d06111e6aded155d">00189</a> <span class="keyword">inline</span> <span class="keywordtype">int</span> <a class="code" href="classInotifyException.html#60d885f998a6cb97d06111e6aded155d" title="Returns the exception error number.">GetErrorNumber</a>()<span class="keyword"> const</span>
-<a name="l00190"></a>00190 <span class="keyword"> </span>{
-<a name="l00191"></a>00191 <span class="keywordflow">return</span> <a class="code" href="classInotifyException.html#aa8a163c661ce70e34b3e3e7ad700854" title="error number">m_err</a>;
-<a name="l00192"></a>00192 }
-<a name="l00193"></a>00193
-<a name="l00195"></a>00195
-<a name="l00198"></a><a class="code" href="classInotifyException.html#619e8b963faebdefb283d79b5ae5c408">00198</a> <span class="keyword">inline</span> <span class="keywordtype">void</span>* <a class="code" href="classInotifyException.html#619e8b963faebdefb283d79b5ae5c408" title="Returns the exception source.">GetSource</a>()<span class="keyword"> const</span>
-<a name="l00199"></a>00199 <span class="keyword"> </span>{
-<a name="l00200"></a>00200 <span class="keywordflow">return</span> <a class="code" href="classInotifyException.html#dd106c2255890025561245cf91fe1427" title="source">m_pSrc</a>;
-<a name="l00201"></a>00201 }
-<a name="l00202"></a>00202
-<a name="l00203"></a>00203 <span class="keyword">protected</span>:
-<a name="l00204"></a><a class="code" href="classInotifyException.html#c113719bd6f4352e12876b2322f1c92c">00204</a> std::string <a class="code" href="classInotifyException.html#c113719bd6f4352e12876b2322f1c92c" title="message">m_msg</a>;
-<a name="l00205"></a><a class="code" href="classInotifyException.html#aa8a163c661ce70e34b3e3e7ad700854">00205</a> <span class="keywordtype">int</span> <a class="code" href="classInotifyException.html#aa8a163c661ce70e34b3e3e7ad700854" title="error number">m_err</a>;
-<a name="l00206"></a><a class="code" href="classInotifyException.html#dd106c2255890025561245cf91fe1427">00206</a> <span class="keyword">mutable</span> <span class="keywordtype">void</span>* <a class="code" href="classInotifyException.html#dd106c2255890025561245cf91fe1427" title="source">m_pSrc</a>;
-<a name="l00207"></a>00207 };
-<a name="l00208"></a>00208
-<a name="l00209"></a>00209
-<a name="l00211"></a>00211
-<a name="l00219"></a><a class="code" href="classInotifyEvent.html">00219</a> <span class="keyword">class </span><a class="code" href="classInotifyEvent.html" title="inotify event class">InotifyEvent</a>
-<a name="l00220"></a>00220 {
-<a name="l00221"></a>00221 <span class="keyword">public</span>:
-<a name="l00223"></a>00223
-<a name="l00226"></a><a class="code" href="classInotifyEvent.html#f416dbbd4e6ddd3c0eea6cb540f0b046">00226</a> <a class="code" href="classInotifyEvent.html#f416dbbd4e6ddd3c0eea6cb540f0b046" title="Constructor.">InotifyEvent</a>()
-<a name="l00227"></a>00227 : <a class="code" href="classInotifyEvent.html#739a943357af0c3fafd58466803e04fa" title="mask">m_uMask</a>(0),
-<a name="l00228"></a>00228 <a class="code" href="classInotifyEvent.html#bf417d466fb0173d337cc66539ee55af" title="cookie">m_uCookie</a>(0)
-<a name="l00229"></a>00229 {
-<a name="l00230"></a>00230 <a class="code" href="classInotifyEvent.html#2d151cdcc547ee4ce49cfd44328d87ac" title="source watch">m_pWatch</a> = NULL;
-<a name="l00231"></a>00231 }
-<a name="l00232"></a>00232
-<a name="l00234"></a>00234
-<a name="l00241"></a><a class="code" href="classInotifyEvent.html#6d7f3fc0f51580da4a3ec2348609df64">00241</a> <a class="code" href="classInotifyEvent.html#f416dbbd4e6ddd3c0eea6cb540f0b046" title="Constructor.">InotifyEvent</a>(<span class="keyword">const</span> <span class="keyword">struct</span> inotify_event* pEvt, <a class="code" href="classInotifyWatch.html" title="inotify watch class">InotifyWatch</a>* pWatch)
-<a name="l00242"></a>00242 : <a class="code" href="classInotifyEvent.html#739a943357af0c3fafd58466803e04fa" title="mask">m_uMask</a>(0),
-<a name="l00243"></a>00243 <a class="code" href="classInotifyEvent.html#bf417d466fb0173d337cc66539ee55af" title="cookie">m_uCookie</a>(0)
-<a name="l00244"></a>00244 {
-<a name="l00245"></a>00245 <span class="keywordflow">if</span> (pEvt != NULL) {
-<a name="l00246"></a>00246 <a class="code" href="classInotifyEvent.html#739a943357af0c3fafd58466803e04fa" title="mask">m_uMask</a> = (uint32_t) pEvt-&gt;mask;
-<a name="l00247"></a>00247 <a class="code" href="classInotifyEvent.html#bf417d466fb0173d337cc66539ee55af" title="cookie">m_uCookie</a> = (uint32_t) pEvt-&gt;cookie;
-<a name="l00248"></a>00248 <span class="keywordflow">if</span> (pEvt-&gt;name != NULL) {
-<a name="l00249"></a>00249 <a class="code" href="classInotifyEvent.html#6c507a3466515aedc266bdc267079604" title="name">m_name</a> = pEvt-&gt;len &gt; 0
-<a name="l00250"></a>00250 ? pEvt-&gt;name
-<a name="l00251"></a>00251 : <span class="stringliteral">""</span>;
-<a name="l00252"></a>00252 }
-<a name="l00253"></a>00253 <a class="code" href="classInotifyEvent.html#2d151cdcc547ee4ce49cfd44328d87ac" title="source watch">m_pWatch</a> = pWatch;
-<a name="l00254"></a>00254 }
-<a name="l00255"></a>00255 <span class="keywordflow">else</span> {
-<a name="l00256"></a>00256 <a class="code" href="classInotifyEvent.html#2d151cdcc547ee4ce49cfd44328d87ac" title="source watch">m_pWatch</a> = NULL;
-<a name="l00257"></a>00257 }
-<a name="l00258"></a>00258 }
-<a name="l00259"></a>00259
-<a name="l00261"></a><a class="code" href="classInotifyEvent.html#a48030da1d3a1b1741ca791c9e129888">00261</a> <a class="code" href="classInotifyEvent.html#a48030da1d3a1b1741ca791c9e129888" title="Destructor.">~InotifyEvent</a>() {}
-<a name="l00262"></a>00262
-<a name="l00264"></a>00264
-<a name="l00269"></a>00269 int32_t <a class="code" href="classInotifyEvent.html#463aacc1f660fbc1c39108feb2601341" title="Returns the event watch descriptor.">GetDescriptor</a>() <span class="keyword">const</span>;
-<a name="l00270"></a>00270
-<a name="l00272"></a>00272
-<a name="l00277"></a><a class="code" href="classInotifyEvent.html#c7160544f6f4f24611df57a4422ac47f">00277</a> <span class="keyword">inline</span> uint32_t <a class="code" href="classInotifyEvent.html#c7160544f6f4f24611df57a4422ac47f" title="Returns the event mask.">GetMask</a>()<span class="keyword"> const</span>
-<a name="l00278"></a>00278 <span class="keyword"> </span>{
-<a name="l00279"></a>00279 <span class="keywordflow">return</span> <a class="code" href="classInotifyEvent.html#739a943357af0c3fafd58466803e04fa" title="mask">m_uMask</a>;
-<a name="l00280"></a>00280 }
-<a name="l00281"></a>00281
-<a name="l00283"></a>00283
-<a name="l00288"></a><a class="code" href="classInotifyEvent.html#309ebf3c5b131522295185a926d551bb">00288</a> <span class="keyword">inline</span> <span class="keyword">static</span> <span class="keywordtype">bool</span> <a class="code" href="classInotifyEvent.html#309ebf3c5b131522295185a926d551bb" title="Checks a value for the event type.">IsType</a>(uint32_t uValue, uint32_t uType)
-<a name="l00289"></a>00289 {
-<a name="l00290"></a>00290 <span class="keywordflow">return</span> ((uValue &amp; uType) != 0) &amp;&amp; ((~uValue &amp; uType) == 0);
-<a name="l00291"></a>00291 }
-<a name="l00292"></a>00292
-<a name="l00294"></a>00294
-<a name="l00298"></a><a class="code" href="classInotifyEvent.html#477ae71116ec393434a1f62a7170a156">00298</a> <span class="keyword">inline</span> <span class="keywordtype">bool</span> <a class="code" href="classInotifyEvent.html#309ebf3c5b131522295185a926d551bb" title="Checks a value for the event type.">IsType</a>(uint32_t uType)<span class="keyword"> const</span>
-<a name="l00299"></a>00299 <span class="keyword"> </span>{
-<a name="l00300"></a>00300 <span class="keywordflow">return</span> <a class="code" href="classInotifyEvent.html#309ebf3c5b131522295185a926d551bb" title="Checks a value for the event type.">IsType</a>(<a class="code" href="classInotifyEvent.html#739a943357af0c3fafd58466803e04fa" title="mask">m_uMask</a>, uType);
-<a name="l00301"></a>00301 }
-<a name="l00302"></a>00302
-<a name="l00304"></a>00304
-<a name="l00307"></a><a class="code" href="classInotifyEvent.html#7e65e49f7d0f11c71442e31d688e4b17">00307</a> <span class="keyword">inline</span> uint32_t <a class="code" href="classInotifyEvent.html#7e65e49f7d0f11c71442e31d688e4b17" title="Returns the event cookie.">GetCookie</a>()<span class="keyword"> const</span>
-<a name="l00308"></a>00308 <span class="keyword"> </span>{
-<a name="l00309"></a>00309 <span class="keywordflow">return</span> <a class="code" href="classInotifyEvent.html#bf417d466fb0173d337cc66539ee55af" title="cookie">m_uCookie</a>;
-<a name="l00310"></a>00310 }
-<a name="l00311"></a>00311
-<a name="l00313"></a>00313
-<a name="l00316"></a><a class="code" href="classInotifyEvent.html#30c8c2e1e490b8968ab9cb3364fe579a">00316</a> <span class="keyword">inline</span> uint32_t <a class="code" href="classInotifyEvent.html#30c8c2e1e490b8968ab9cb3364fe579a" title="Returns the event name length.">GetLength</a>()<span class="keyword"> const</span>
-<a name="l00317"></a>00317 <span class="keyword"> </span>{
-<a name="l00318"></a>00318 <span class="keywordflow">return</span> (uint32_t) <a class="code" href="classInotifyEvent.html#6c507a3466515aedc266bdc267079604" title="name">m_name</a>.length();
-<a name="l00319"></a>00319 }
-<a name="l00320"></a>00320
-<a name="l00322"></a>00322
-<a name="l00325"></a><a class="code" href="classInotifyEvent.html#5ab91d587bdc7ab3c18c6cdff73f3097">00325</a> <span class="keyword">inline</span> <span class="keyword">const</span> std::string&amp; <a class="code" href="classInotifyEvent.html#5ab91d587bdc7ab3c18c6cdff73f3097" title="Returns the event name.">GetName</a>()<span class="keyword"> const</span>
-<a name="l00326"></a>00326 <span class="keyword"> </span>{
-<a name="l00327"></a>00327 <span class="keywordflow">return</span> <a class="code" href="classInotifyEvent.html#6c507a3466515aedc266bdc267079604" title="name">m_name</a>;
-<a name="l00328"></a>00328 }
-<a name="l00329"></a>00329
-<a name="l00331"></a>00331
-<a name="l00334"></a><a class="code" href="classInotifyEvent.html#3aea2437ba8553be703d91b45247a68f">00334</a> <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="classInotifyEvent.html#5ab91d587bdc7ab3c18c6cdff73f3097" title="Returns the event name.">GetName</a>(std::string&amp; rName)<span class="keyword"> const</span>
-<a name="l00335"></a>00335 <span class="keyword"> </span>{
-<a name="l00336"></a>00336 rName = <a class="code" href="classInotifyEvent.html#5ab91d587bdc7ab3c18c6cdff73f3097" title="Returns the event name.">GetName</a>();
-<a name="l00337"></a>00337 }
-<a name="l00338"></a>00338
-<a name="l00340"></a>00340
-<a name="l00343"></a><a class="code" href="classInotifyEvent.html#979cd46f53ed674331a5a6d47d1cde92">00343</a> <span class="keyword">inline</span> <a class="code" href="classInotifyWatch.html" title="inotify watch class">InotifyWatch</a>* <a class="code" href="classInotifyEvent.html#979cd46f53ed674331a5a6d47d1cde92" title="Returns the source watch.">GetWatch</a>()
-<a name="l00344"></a>00344 {
-<a name="l00345"></a>00345 <span class="keywordflow">return</span> <a class="code" href="classInotifyEvent.html#2d151cdcc547ee4ce49cfd44328d87ac" title="source watch">m_pWatch</a>;
-<a name="l00346"></a>00346 }
-<a name="l00347"></a>00347
-<a name="l00349"></a>00349
-<a name="l00353"></a>00353 <span class="keyword">static</span> uint32_t <a class="code" href="classInotifyEvent.html#eced3a88a6dea190c5df19c2a6599010" title="Finds the appropriate mask for a name.">GetMaskByName</a>(<span class="keyword">const</span> std::string&amp; rName);
-<a name="l00354"></a>00354
-<a name="l00356"></a>00356
-<a name="l00360"></a>00360 <span class="keyword">static</span> <span class="keywordtype">void</span> <a class="code" href="classInotifyEvent.html#c08a0a26ea33dbe94aaf1ac830c103a5" title="Fills the string with all types contained in an event mask value.">DumpTypes</a>(uint32_t uValue, std::string&amp; rStr);
-<a name="l00361"></a>00361
-<a name="l00363"></a>00363
-<a name="l00366"></a>00366 <span class="keywordtype">void</span> <a class="code" href="classInotifyEvent.html#c08a0a26ea33dbe94aaf1ac830c103a5" title="Fills the string with all types contained in an event mask value.">DumpTypes</a>(std::string&amp; rStr) <span class="keyword">const</span>;
-<a name="l00367"></a>00367
-<a name="l00368"></a>00368 <span class="keyword">private</span>:
-<a name="l00369"></a><a class="code" href="classInotifyEvent.html#739a943357af0c3fafd58466803e04fa">00369</a> uint32_t <a class="code" href="classInotifyEvent.html#739a943357af0c3fafd58466803e04fa" title="mask">m_uMask</a>;
-<a name="l00370"></a><a class="code" href="classInotifyEvent.html#bf417d466fb0173d337cc66539ee55af">00370</a> uint32_t <a class="code" href="classInotifyEvent.html#bf417d466fb0173d337cc66539ee55af" title="cookie">m_uCookie</a>;
-<a name="l00371"></a><a class="code" href="classInotifyEvent.html#6c507a3466515aedc266bdc267079604">00371</a> std::string <a class="code" href="classInotifyEvent.html#6c507a3466515aedc266bdc267079604" title="name">m_name</a>;
-<a name="l00372"></a><a class="code" href="classInotifyEvent.html#2d151cdcc547ee4ce49cfd44328d87ac">00372</a> <a class="code" href="classInotifyWatch.html" title="inotify watch class">InotifyWatch</a>* <a class="code" href="classInotifyEvent.html#2d151cdcc547ee4ce49cfd44328d87ac" title="source watch">m_pWatch</a>;
-<a name="l00373"></a>00373 };
-<a name="l00374"></a>00374
-<a name="l00375"></a>00375
-<a name="l00376"></a>00376
-<a name="l00378"></a>00378
-<a name="l00384"></a><a class="code" href="classInotifyWatch.html">00384</a> <span class="keyword">class </span><a class="code" href="classInotifyWatch.html" title="inotify watch class">InotifyWatch</a>
-<a name="l00385"></a>00385 {
-<a name="l00386"></a>00386 <span class="keyword">public</span>:
-<a name="l00388"></a>00388
-<a name="l00396"></a><a class="code" href="classInotifyWatch.html#c9c02f1dbd143eebd711eba03ac366e9">00396</a> <a class="code" href="classInotifyWatch.html#c9c02f1dbd143eebd711eba03ac366e9" title="Constructor.">InotifyWatch</a>(<span class="keyword">const</span> std::string&amp; rPath, int32_t uMask, <span class="keywordtype">bool</span> fEnabled = <span class="keyword">true</span>)
-<a name="l00397"></a>00397 : <a class="code" href="classInotifyWatch.html#a63ba30ffdb8b9db27970bb1099e4db5" title="watched file path">m_path</a>(rPath),
-<a name="l00398"></a>00398 <a class="code" href="classInotifyWatch.html#f725ea61e3252adae6153ecb80de23a8" title="event mask">m_uMask</a>(uMask),
-<a name="l00399"></a>00399 <a class="code" href="classInotifyWatch.html#90a78898dc850b238e713e0db284fb0a" title="watch descriptor">m_wd</a>((int32_t) -1),
-<a name="l00400"></a>00400 <a class="code" href="classInotifyWatch.html#b0c23c89cc2996bdf6f41b8ef1f1ed18" title="events enabled yes/no">m_fEnabled</a>(fEnabled)
-<a name="l00401"></a>00401 {
-<a name="l00402"></a>00402 <a class="code" href="inotify-cxx_8h.html#981aa546075fba39715fd2f63a41f575">IN_LOCK_INIT</a>
-<a name="l00403"></a>00403 }
-<a name="l00404"></a>00404
-<a name="l00406"></a><a class="code" href="classInotifyWatch.html#871c16b01aa8841b36246e5b629ecaef">00406</a> <a class="code" href="classInotifyWatch.html#871c16b01aa8841b36246e5b629ecaef" title="Destructor.">~InotifyWatch</a>()
-<a name="l00407"></a>00407 {
-<a name="l00408"></a>00408 <a class="code" href="inotify-cxx_8h.html#08422ec66fb587c1684afbaa575a53dd">IN_LOCK_DONE</a>
-<a name="l00409"></a>00409 }
-<a name="l00410"></a>00410
-<a name="l00412"></a>00412
-<a name="l00415"></a><a class="code" href="classInotifyWatch.html#855f982421402dd63d064dde328f2a59">00415</a> <span class="keyword">inline</span> int32_t <a class="code" href="classInotifyWatch.html#855f982421402dd63d064dde328f2a59" title="Returns the watch descriptor.">GetDescriptor</a>()<span class="keyword"> const</span>
-<a name="l00416"></a>00416 <span class="keyword"> </span>{
-<a name="l00417"></a>00417 <span class="keywordflow">return</span> <a class="code" href="classInotifyWatch.html#90a78898dc850b238e713e0db284fb0a" title="watch descriptor">m_wd</a>;
-<a name="l00418"></a>00418 }
-<a name="l00419"></a>00419
-<a name="l00421"></a>00421
-<a name="l00424"></a><a class="code" href="classInotifyWatch.html#2e659c699e7d43bd0a218fe4905784d2">00424</a> <span class="keyword">inline</span> <span class="keyword">const</span> std::string&amp; <a class="code" href="classInotifyWatch.html#2e659c699e7d43bd0a218fe4905784d2" title="Returns the watched file path.">GetPath</a>()<span class="keyword"> const</span>
-<a name="l00425"></a>00425 <span class="keyword"> </span>{
-<a name="l00426"></a>00426 <span class="keywordflow">return</span> <a class="code" href="classInotifyWatch.html#a63ba30ffdb8b9db27970bb1099e4db5" title="watched file path">m_path</a>;
-<a name="l00427"></a>00427 }
-<a name="l00428"></a>00428
-<a name="l00430"></a>00430
-<a name="l00433"></a><a class="code" href="classInotifyWatch.html#f759f9baca6f4abbbaae57e076486009">00433</a> <span class="keyword">inline</span> uint32_t <a class="code" href="classInotifyWatch.html#f759f9baca6f4abbbaae57e076486009" title="Returns the watch event mask.">GetMask</a>()<span class="keyword"> const</span>
-<a name="l00434"></a>00434 <span class="keyword"> </span>{
-<a name="l00435"></a>00435 <span class="keywordflow">return</span> (uint32_t) <a class="code" href="classInotifyWatch.html#f725ea61e3252adae6153ecb80de23a8" title="event mask">m_uMask</a>;
-<a name="l00436"></a>00436 }
-<a name="l00437"></a>00437
-<a name="l00439"></a>00439
-<a name="l00448"></a>00448 <span class="keywordtype">void</span> <a class="code" href="classInotifyWatch.html#3ad7fbc55c21b3fcd08c2d1d388e14b6" title="Sets the watch event mask.">SetMask</a>(uint32_t uMask) <span class="keywordflow">throw</span> (<a class="code" href="classInotifyException.html" title="Class for inotify exceptions.">InotifyException</a>);
-<a name="l00449"></a>00449
-<a name="l00451"></a>00451
-<a name="l00454"></a><a class="code" href="classInotifyWatch.html#cbf0042d06841f9503405b104e4c35d0">00454</a> <span class="keyword">inline</span> <a class="code" href="classInotify.html" title="inotify class">Inotify</a>* <a class="code" href="classInotifyWatch.html#cbf0042d06841f9503405b104e4c35d0" title="Returns the appropriate inotify class instance.">GetInotify</a>()
-<a name="l00455"></a>00455 {
-<a name="l00456"></a>00456 <span class="keywordflow">return</span> <a class="code" href="classInotifyWatch.html#ea695aa11f6105184df1ef265be3f1b9" title="inotify object">m_pInotify</a>;
-<a name="l00457"></a>00457 }
-<a name="l00458"></a>00458
-<a name="l00460"></a>00460
-<a name="l00471"></a>00471 <span class="keywordtype">void</span> <a class="code" href="classInotifyWatch.html#a71aff8650fadff32a3c655ca50945f1" title="Enables/disables the watch.">SetEnabled</a>(<span class="keywordtype">bool</span> fEnabled) <span class="keywordflow">throw</span> (<a class="code" href="classInotifyException.html" title="Class for inotify exceptions.">InotifyException</a>);
-<a name="l00472"></a>00472
-<a name="l00474"></a>00474
-<a name="l00477"></a><a class="code" href="classInotifyWatch.html#5ab551a912e5acff6a9c74baaf9ea324">00477</a> <span class="keyword">inline</span> <span class="keywordtype">bool</span> <a class="code" href="classInotifyWatch.html#5ab551a912e5acff6a9c74baaf9ea324" title="Checks whether the watch is enabled.">IsEnabled</a>()<span class="keyword"> const</span>
-<a name="l00478"></a>00478 <span class="keyword"> </span>{
-<a name="l00479"></a>00479 <span class="keywordflow">return</span> <a class="code" href="classInotifyWatch.html#b0c23c89cc2996bdf6f41b8ef1f1ed18" title="events enabled yes/no">m_fEnabled</a>;
-<a name="l00480"></a>00480 }
-<a name="l00481"></a>00481
-<a name="l00483"></a>00483
-<a name="l00492"></a><a class="code" href="classInotifyWatch.html#222c911ef0e8d6f61570489ed6042e55">00492</a> <span class="keyword">inline</span> <span class="keywordtype">bool</span> <a class="code" href="classInotifyWatch.html#222c911ef0e8d6f61570489ed6042e55" title="Checks whether the watch is recursive.">IsRecursive</a>()<span class="keyword"> const</span>
-<a name="l00493"></a>00493 <span class="keyword"> </span>{
-<a name="l00494"></a>00494 <span class="keywordflow">return</span> <span class="keyword">false</span>;
-<a name="l00495"></a>00495 }
-<a name="l00496"></a>00496
-<a name="l00497"></a>00497 <span class="keyword">private</span>:
-<a name="l00498"></a><a class="code" href="classInotifyWatch.html#94bfb861dc18ca5d16abfcff90db8c86">00498</a> <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="classInotify.html" title="inotify class">Inotify</a>;
-<a name="l00499"></a>00499
-<a name="l00500"></a><a class="code" href="classInotifyWatch.html#a63ba30ffdb8b9db27970bb1099e4db5">00500</a> std::string <a class="code" href="classInotifyWatch.html#a63ba30ffdb8b9db27970bb1099e4db5" title="watched file path">m_path</a>;
-<a name="l00501"></a><a class="code" href="classInotifyWatch.html#f725ea61e3252adae6153ecb80de23a8">00501</a> uint32_t <a class="code" href="classInotifyWatch.html#f725ea61e3252adae6153ecb80de23a8" title="event mask">m_uMask</a>;
-<a name="l00502"></a><a class="code" href="classInotifyWatch.html#90a78898dc850b238e713e0db284fb0a">00502</a> int32_t <a class="code" href="classInotifyWatch.html#90a78898dc850b238e713e0db284fb0a" title="watch descriptor">m_wd</a>;
-<a name="l00503"></a><a class="code" href="classInotifyWatch.html#ea695aa11f6105184df1ef265be3f1b9">00503</a> <a class="code" href="classInotify.html" title="inotify class">Inotify</a>* <a class="code" href="classInotifyWatch.html#ea695aa11f6105184df1ef265be3f1b9" title="inotify object">m_pInotify</a>;
-<a name="l00504"></a><a class="code" href="classInotifyWatch.html#b0c23c89cc2996bdf6f41b8ef1f1ed18">00504</a> <span class="keywordtype">bool</span> <a class="code" href="classInotifyWatch.html#b0c23c89cc2996bdf6f41b8ef1f1ed18" title="events enabled yes/no">m_fEnabled</a>;
-<a name="l00505"></a>00505
-<a name="l00506"></a>00506 <a class="code" href="inotify-cxx_8h.html#904d25c0fd931e1bad4f9d5cd346a766" title="inotify-cxx thread safety">IN_LOCK_DECL</a>
-<a name="l00507"></a>00507
-<a name="l00509"></a>00509
-<a name="l00514"></a>00514 <span class="keywordtype">void</span> <a class="code" href="classInotifyWatch.html#804cdc1e9579a075a60c239b202559f4" title="Disables the watch (due to removing by the kernel).">__Disable</a>();
-<a name="l00515"></a>00515 };
-<a name="l00516"></a>00516
-<a name="l00517"></a>00517
-<a name="l00519"></a><a class="code" href="inotify-cxx_8h.html#e6b5ebcb4e0d6a9f5ca8da26bc00cc2a">00519</a> <span class="keyword">typedef</span> std::map&lt;int32_t, InotifyWatch*&gt; <a class="code" href="inotify-cxx_8h.html#e6b5ebcb4e0d6a9f5ca8da26bc00cc2a" title="Mapping from watch descriptors to watch objects.">IN_WATCH_MAP</a>;
-<a name="l00520"></a>00520
-<a name="l00522"></a><a class="code" href="inotify-cxx_8h.html#5dd7761ff5a6b7cc7271950aebb7ddf6">00522</a> <span class="keyword">typedef</span> std::map&lt;std::string, InotifyWatch*&gt; <a class="code" href="inotify-cxx_8h.html#5dd7761ff5a6b7cc7271950aebb7ddf6" title="Mapping from paths to watch objects.">IN_WP_MAP</a>;
-<a name="l00523"></a>00523
-<a name="l00524"></a>00524
-<a name="l00526"></a>00526
-<a name="l00532"></a><a class="code" href="classInotify.html">00532</a> <span class="keyword">class </span><a class="code" href="classInotify.html" title="inotify class">Inotify</a>
-<a name="l00533"></a>00533 {
-<a name="l00534"></a>00534 <span class="keyword">public</span>:
-<a name="l00536"></a>00536
-<a name="l00542"></a>00542 <a class="code" href="classInotify.html#a6fe6e9cb3343665eb968fcd5170cfb9" title="Constructor.">Inotify</a>() <span class="keywordflow">throw</span> (<a class="code" href="classInotifyException.html" title="Class for inotify exceptions.">InotifyException</a>);
-<a name="l00543"></a>00543
-<a name="l00545"></a>00545
-<a name="l00548"></a>00548 <a class="code" href="classInotify.html#f19dd5e491395673e4798eb9dbf5f682" title="Destructor.">~Inotify</a>();
-<a name="l00549"></a>00549
-<a name="l00551"></a>00551 <span class="keywordtype">void</span> <a class="code" href="classInotify.html#86ae86c43ea1a72f562ca46393309635" title="Removes all watches and closes the inotify device.">Close</a>();
-<a name="l00552"></a>00552
-<a name="l00554"></a>00554
-<a name="l00559"></a>00559 <span class="keywordtype">void</span> <a class="code" href="classInotify.html#2ef771ebaf982d76ebe19b3f5bc9cd83" title="Adds a new watch.">Add</a>(<a class="code" href="classInotifyWatch.html" title="inotify watch class">InotifyWatch</a>* pWatch) <span class="keywordflow">throw</span> (<a class="code" href="classInotifyException.html" title="Class for inotify exceptions.">InotifyException</a>);
-<a name="l00560"></a>00560
-<a name="l00562"></a>00562
-<a name="l00567"></a><a class="code" href="classInotify.html#35dab56d3e10bf28b5e457871adddb58">00567</a> <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="classInotify.html#2ef771ebaf982d76ebe19b3f5bc9cd83" title="Adds a new watch.">Add</a>(<a class="code" href="classInotifyWatch.html" title="inotify watch class">InotifyWatch</a>&amp; rWatch) <span class="keywordflow">throw</span> (<a class="code" href="classInotifyException.html" title="Class for inotify exceptions.">InotifyException</a>)
-<a name="l00568"></a>00568 {
-<a name="l00569"></a>00569 <a class="code" href="classInotify.html#2ef771ebaf982d76ebe19b3f5bc9cd83" title="Adds a new watch.">Add</a>(&amp;rWatch);
-<a name="l00570"></a>00570 }
-<a name="l00571"></a>00571
-<a name="l00573"></a>00573
-<a name="l00580"></a>00580 <span class="keywordtype">void</span> <a class="code" href="classInotify.html#21c39bb8e5bbc1941b945c18f9005b84" title="Removes a watch.">Remove</a>(<a class="code" href="classInotifyWatch.html" title="inotify watch class">InotifyWatch</a>* pWatch) <span class="keywordflow">throw</span> (<a class="code" href="classInotifyException.html" title="Class for inotify exceptions.">InotifyException</a>);
-<a name="l00581"></a>00581
-<a name="l00583"></a>00583
-<a name="l00590"></a><a class="code" href="classInotify.html#ac1a52b2ff6bfec07021a44e55d496a6">00590</a> <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="classInotify.html#21c39bb8e5bbc1941b945c18f9005b84" title="Removes a watch.">Remove</a>(<a class="code" href="classInotifyWatch.html" title="inotify watch class">InotifyWatch</a>&amp; rWatch) <span class="keywordflow">throw</span> (<a class="code" href="classInotifyException.html" title="Class for inotify exceptions.">InotifyException</a>)
-<a name="l00591"></a>00591 {
-<a name="l00592"></a>00592 <a class="code" href="classInotify.html#21c39bb8e5bbc1941b945c18f9005b84" title="Removes a watch.">Remove</a>(&amp;rWatch);
-<a name="l00593"></a>00593 }
-<a name="l00594"></a>00594
-<a name="l00596"></a>00596 <span class="keywordtype">void</span> <a class="code" href="classInotify.html#bc1fd5830ca561efb69bcd2283981741" title="Removes all watches.">RemoveAll</a>();
-<a name="l00597"></a>00597
-<a name="l00599"></a>00599
-<a name="l00607"></a><a class="code" href="classInotify.html#716ae90a00dd4895709ea9b8f7959075">00607</a> <span class="keyword">inline</span> <span class="keywordtype">size_t</span> <a class="code" href="classInotify.html#716ae90a00dd4895709ea9b8f7959075" title="Returns the count of watches.">GetWatchCount</a>()<span class="keyword"> const</span>
-<a name="l00608"></a>00608 <span class="keyword"> </span>{
-<a name="l00609"></a>00609 <a class="code" href="inotify-cxx_8h.html#963a97dc42487e86715b4e04639b0db8">IN_READ_BEGIN</a>
-<a name="l00610"></a>00610 <span class="keywordtype">size_t</span> n = (size_t) <a class="code" href="classInotify.html#62f275db6375a366023b2e46f73e3ecc" title="watches (by paths)">m_paths</a>.size();
-<a name="l00611"></a>00611 <a class="code" href="inotify-cxx_8h.html#0b82080ab6709175341b97e1f3c3955d">IN_READ_END</a>
-<a name="l00612"></a>00612 <span class="keywordflow">return</span> n;
-<a name="l00613"></a>00613 }
-<a name="l00614"></a>00614
-<a name="l00616"></a>00616
-<a name="l00621"></a><a class="code" href="classInotify.html#6f432affb46f85f7bc19661d5bc77063">00621</a> <span class="keyword">inline</span> <span class="keywordtype">size_t</span> <a class="code" href="classInotify.html#6f432affb46f85f7bc19661d5bc77063" title="Returns the count of enabled watches.">GetEnabledCount</a>()<span class="keyword"> const</span>
-<a name="l00622"></a>00622 <span class="keyword"> </span>{
-<a name="l00623"></a>00623 <a class="code" href="inotify-cxx_8h.html#963a97dc42487e86715b4e04639b0db8">IN_READ_BEGIN</a>
-<a name="l00624"></a>00624 <span class="keywordtype">size_t</span> n = (size_t) <a class="code" href="classInotify.html#4d07f3a4412028d687936d2479d9a976" title="watches (by descriptors)">m_watches</a>.size();
-<a name="l00625"></a>00625 <a class="code" href="inotify-cxx_8h.html#0b82080ab6709175341b97e1f3c3955d">IN_READ_END</a>
-<a name="l00626"></a>00626 <span class="keywordflow">return</span> n;
-<a name="l00627"></a>00627 }
-<a name="l00628"></a>00628
-<a name="l00630"></a>00630
-<a name="l00641"></a>00641 <span class="keywordtype">void</span> <a class="code" href="classInotify.html#139c27c6643bb199619f3eae9b32e53b" title="Waits for inotify events.">WaitForEvents</a>(<span class="keywordtype">bool</span> fNoIntr = <span class="keyword">false</span>) throw (<a class="code" href="classInotifyException.html" title="Class for inotify exceptions.">InotifyException</a>);
-<a name="l00642"></a>00642
-<a name="l00644"></a>00644
-<a name="l00650"></a><a class="code" href="classInotify.html#a3c533f956871f904949832ac8f5fbde">00650</a> inline <span class="keywordtype">size_t</span> <a class="code" href="classInotify.html#a3c533f956871f904949832ac8f5fbde" title="Returns the count of received and queued events.">GetEventCount</a>()
-<a name="l00651"></a>00651 {
-<a name="l00652"></a>00652 <a class="code" href="inotify-cxx_8h.html#963a97dc42487e86715b4e04639b0db8">IN_READ_BEGIN</a>
-<a name="l00653"></a>00653 <span class="keywordtype">size_t</span> n = (size_t) <a class="code" href="classInotify.html#0c1d6c969292dbb7c8c1283a3d8f55e0" title="event queue">m_events</a>.size();
-<a name="l00654"></a>00654 <a class="code" href="inotify-cxx_8h.html#0b82080ab6709175341b97e1f3c3955d">IN_READ_END</a>
-<a name="l00655"></a>00655 <span class="keywordflow">return</span> n;
-<a name="l00656"></a>00656 }
-<a name="l00657"></a>00657
-<a name="l00659"></a>00659
-<a name="l00667"></a>00667 <span class="keywordtype">bool</span> <a class="code" href="classInotify.html#490a3f824c6d041d31ccaabe9bd92008" title="Extracts a queued inotify event.">GetEvent</a>(<a class="code" href="classInotifyEvent.html" title="inotify event class">InotifyEvent</a>* pEvt) <span class="keywordflow">throw</span> (<a class="code" href="classInotifyException.html" title="Class for inotify exceptions.">InotifyException</a>);
-<a name="l00668"></a>00668
-<a name="l00670"></a>00670
-<a name="l00677"></a><a class="code" href="classInotify.html#b028c8fa988f6bbb2ef773db3ea3a2d3">00677</a> <span class="keywordtype">bool</span> <a class="code" href="classInotify.html#490a3f824c6d041d31ccaabe9bd92008" title="Extracts a queued inotify event.">GetEvent</a>(<a class="code" href="classInotifyEvent.html" title="inotify event class">InotifyEvent</a>&amp; rEvt) <span class="keywordflow">throw</span> (<a class="code" href="classInotifyException.html" title="Class for inotify exceptions.">InotifyException</a>)
-<a name="l00678"></a>00678 {
-<a name="l00679"></a>00679 <span class="keywordflow">return</span> <a class="code" href="classInotify.html#490a3f824c6d041d31ccaabe9bd92008" title="Extracts a queued inotify event.">GetEvent</a>(&amp;rEvt);
-<a name="l00680"></a>00680 }
-<a name="l00681"></a>00681
-<a name="l00683"></a>00683
-<a name="l00691"></a>00691 <span class="keywordtype">bool</span> <a class="code" href="classInotify.html#19cde43d082ff92bd02654610019300d" title="Extracts a queued inotify event (without removing).">PeekEvent</a>(<a class="code" href="classInotifyEvent.html" title="inotify event class">InotifyEvent</a>* pEvt) <span class="keywordflow">throw</span> (<a class="code" href="classInotifyException.html" title="Class for inotify exceptions.">InotifyException</a>);
-<a name="l00692"></a>00692
-<a name="l00694"></a>00694
-<a name="l00701"></a><a class="code" href="classInotify.html#287dc0d238fa6edc3269441cb284f979">00701</a> <span class="keywordtype">bool</span> <a class="code" href="classInotify.html#19cde43d082ff92bd02654610019300d" title="Extracts a queued inotify event (without removing).">PeekEvent</a>(<a class="code" href="classInotifyEvent.html" title="inotify event class">InotifyEvent</a>&amp; rEvt) <span class="keywordflow">throw</span> (<a class="code" href="classInotifyException.html" title="Class for inotify exceptions.">InotifyException</a>)
-<a name="l00702"></a>00702 {
-<a name="l00703"></a>00703 <span class="keywordflow">return</span> <a class="code" href="classInotify.html#19cde43d082ff92bd02654610019300d" title="Extracts a queued inotify event (without removing).">PeekEvent</a>(&amp;rEvt);
-<a name="l00704"></a>00704 }
-<a name="l00705"></a>00705
-<a name="l00707"></a>00707
-<a name="l00713"></a>00713 <a class="code" href="classInotifyWatch.html" title="inotify watch class">InotifyWatch</a>* <a class="code" href="classInotify.html#182d19b667c9e0899802b70a579eff40" title="Searches for a watch by a watch descriptor.">FindWatch</a>(<span class="keywordtype">int</span> iDescriptor);
-<a name="l00714"></a>00714
-<a name="l00716"></a>00716
-<a name="l00726"></a>00726 <a class="code" href="classInotifyWatch.html" title="inotify watch class">InotifyWatch</a>* <a class="code" href="classInotify.html#182d19b667c9e0899802b70a579eff40" title="Searches for a watch by a watch descriptor.">FindWatch</a>(<span class="keyword">const</span> std::string&amp; rPath);
-<a name="l00727"></a>00727
-<a name="l00729"></a>00729
-<a name="l00737"></a><a class="code" href="classInotify.html#abab7015203bf36d0256e75d4f4861f9">00737</a> <span class="keyword">inline</span> <span class="keywordtype">int</span> <a class="code" href="classInotify.html#abab7015203bf36d0256e75d4f4861f9" title="Returns the file descriptor.">GetDescriptor</a>()<span class="keyword"> const</span>
-<a name="l00738"></a>00738 <span class="keyword"> </span>{
-<a name="l00739"></a>00739 <span class="keywordflow">return</span> <a class="code" href="classInotify.html#95d6d0ecefff77bd3ee50f1586a4552b" title="file descriptor">m_fd</a>;
-<a name="l00740"></a>00740 }
-<a name="l00741"></a>00741
-<a name="l00743"></a>00743
-<a name="l00756"></a>00756 <span class="keywordtype">void</span> <a class="code" href="classInotify.html#b2c8ab8ad4322fb6f0dae0eae442402b" title="Enables/disables non-blocking mode.">SetNonBlock</a>(<span class="keywordtype">bool</span> fNonBlock) <span class="keywordflow">throw</span> (<a class="code" href="classInotifyException.html" title="Class for inotify exceptions.">InotifyException</a>);
-<a name="l00757"></a>00757
-<a name="l00759"></a>00759
-<a name="l00772"></a>00772 <span class="keywordtype">void</span> <a class="code" href="classInotify.html#124dd5816205900af61034d47ae65255" title="Enables/disables closing on exec.">SetCloseOnExec</a>(<span class="keywordtype">bool</span> fClOnEx) <span class="keywordflow">throw</span> (<a class="code" href="classInotifyException.html" title="Class for inotify exceptions.">InotifyException</a>);
-<a name="l00773"></a>00773
-<a name="l00775"></a>00775
-<a name="l00780"></a>00780 <span class="keyword">static</span> uint32_t <a class="code" href="classInotify.html#70b3b57e8661fbb4c5bc404b86225c3b" title="Acquires a particular inotify capability/limit.">GetCapability</a>(<a class="code" href="inotify-cxx_8h.html#bccd39d32dd83905178cf42edaae5c4d" title="inotify capability/limit identifiers">InotifyCapability_t</a> cap) <span class="keywordflow">throw</span> (<a class="code" href="classInotifyException.html" title="Class for inotify exceptions.">InotifyException</a>);
-<a name="l00781"></a>00781
-<a name="l00783"></a>00783
-<a name="l00791"></a>00791 <span class="keyword">static</span> <span class="keywordtype">void</span> <a class="code" href="classInotify.html#734538233ba2136164f76f4df6c3654e" title="Modifies a particular inotify capability/limit.">SetCapability</a>(<a class="code" href="inotify-cxx_8h.html#bccd39d32dd83905178cf42edaae5c4d" title="inotify capability/limit identifiers">InotifyCapability_t</a> cap, uint32_t val) <span class="keywordflow">throw</span> (<a class="code" href="classInotifyException.html" title="Class for inotify exceptions.">InotifyException</a>);
-<a name="l00792"></a>00792
-<a name="l00794"></a>00794
-<a name="l00798"></a><a class="code" href="classInotify.html#d8e4a4a87d005c71c0b5ea9c6dd53c42">00798</a> <span class="keyword">inline</span> <span class="keyword">static</span> uint32_t <a class="code" href="classInotify.html#d8e4a4a87d005c71c0b5ea9c6dd53c42" title="Returns the maximum number of events in the kernel queue.">GetMaxEvents</a>() throw (<a class="code" href="classInotifyException.html" title="Class for inotify exceptions.">InotifyException</a>)
-<a name="l00799"></a>00799 {
-<a name="l00800"></a>00800 <span class="keywordflow">return</span> <a class="code" href="classInotify.html#70b3b57e8661fbb4c5bc404b86225c3b" title="Acquires a particular inotify capability/limit.">GetCapability</a>(<a class="code" href="inotify-cxx_8h.html#bccd39d32dd83905178cf42edaae5c4d18e969c9c44523b38a13b0a207286dd1" title="max. events in the kernel queue">IN_MAX_EVENTS</a>);
-<a name="l00801"></a>00801 }
-<a name="l00802"></a>00802
-<a name="l00804"></a>00804
-<a name="l00812"></a><a class="code" href="classInotify.html#66d90ebfa516d4bd1463749def2b58f9">00812</a> <span class="keyword">inline</span> <span class="keyword">static</span> <span class="keywordtype">void</span> <a class="code" href="classInotify.html#66d90ebfa516d4bd1463749def2b58f9" title="Sets the maximum number of events in the kernel queue.">SetMaxEvents</a>(uint32_t val) <span class="keywordflow">throw</span> (<a class="code" href="classInotifyException.html" title="Class for inotify exceptions.">InotifyException</a>)
-<a name="l00813"></a>00813 {
-<a name="l00814"></a>00814 <a class="code" href="classInotify.html#734538233ba2136164f76f4df6c3654e" title="Modifies a particular inotify capability/limit.">SetCapability</a>(<a class="code" href="inotify-cxx_8h.html#bccd39d32dd83905178cf42edaae5c4d18e969c9c44523b38a13b0a207286dd1" title="max. events in the kernel queue">IN_MAX_EVENTS</a>, val);
-<a name="l00815"></a>00815 }
-<a name="l00816"></a>00816
-<a name="l00818"></a>00818
-<a name="l00825"></a><a class="code" href="classInotify.html#c18b7732f67832260fbbd47aebb8af51">00825</a> <span class="keyword">inline</span> <span class="keyword">static</span> uint32_t <a class="code" href="classInotify.html#c18b7732f67832260fbbd47aebb8af51" title="Returns the maximum number of inotify instances per process.">GetMaxInstances</a>() throw (<a class="code" href="classInotifyException.html" title="Class for inotify exceptions.">InotifyException</a>)
-<a name="l00826"></a>00826 {
-<a name="l00827"></a>00827 <span class="keywordflow">return</span> <a class="code" href="classInotify.html#70b3b57e8661fbb4c5bc404b86225c3b" title="Acquires a particular inotify capability/limit.">GetCapability</a>(<a class="code" href="inotify-cxx_8h.html#bccd39d32dd83905178cf42edaae5c4d43cc45296a9afe5cb68f568176608dd9" title="max. inotify file descriptors per process">IN_MAX_INSTANCES</a>);
-<a name="l00828"></a>00828 }
-<a name="l00829"></a>00829
-<a name="l00831"></a>00831
-<a name="l00839"></a><a class="code" href="classInotify.html#620c891962fe5acd26485c64e9b28d19">00839</a> <span class="keyword">inline</span> <span class="keyword">static</span> <span class="keywordtype">void</span> <a class="code" href="classInotify.html#620c891962fe5acd26485c64e9b28d19" title="Sets the maximum number of inotify instances per process.">SetMaxInstances</a>(uint32_t val) <span class="keywordflow">throw</span> (<a class="code" href="classInotifyException.html" title="Class for inotify exceptions.">InotifyException</a>)
-<a name="l00840"></a>00840 {
-<a name="l00841"></a>00841 <a class="code" href="classInotify.html#734538233ba2136164f76f4df6c3654e" title="Modifies a particular inotify capability/limit.">SetCapability</a>(<a class="code" href="inotify-cxx_8h.html#bccd39d32dd83905178cf42edaae5c4d43cc45296a9afe5cb68f568176608dd9" title="max. inotify file descriptors per process">IN_MAX_INSTANCES</a>, val);
-<a name="l00842"></a>00842 }
-<a name="l00843"></a>00843
-<a name="l00845"></a>00845
-<a name="l00852"></a><a class="code" href="classInotify.html#86dae1b7a72c0d8fc2a632444a0f2f1f">00852</a> <span class="keyword">inline</span> <span class="keyword">static</span> uint32_t <a class="code" href="classInotify.html#86dae1b7a72c0d8fc2a632444a0f2f1f" title="Returns the maximum number of inotify watches per instance.">GetMaxWatches</a>() throw (<a class="code" href="classInotifyException.html" title="Class for inotify exceptions.">InotifyException</a>)
-<a name="l00853"></a>00853 {
-<a name="l00854"></a>00854 <span class="keywordflow">return</span> <a class="code" href="classInotify.html#70b3b57e8661fbb4c5bc404b86225c3b" title="Acquires a particular inotify capability/limit.">GetCapability</a>(<a class="code" href="inotify-cxx_8h.html#bccd39d32dd83905178cf42edaae5c4d594390780d2bdcec064c00aec1f20429" title="max. watches per file descriptor">IN_MAX_WATCHES</a>);
-<a name="l00855"></a>00855 }
-<a name="l00856"></a>00856
-<a name="l00858"></a>00858
-<a name="l00866"></a><a class="code" href="classInotify.html#5064380cdb4a726ab33f3fa18d15c77a">00866</a> <span class="keyword">inline</span> <span class="keyword">static</span> <span class="keywordtype">void</span> <a class="code" href="classInotify.html#5064380cdb4a726ab33f3fa18d15c77a" title="Sets the maximum number of inotify watches per instance.">SetMaxWatches</a>(uint32_t val) <span class="keywordflow">throw</span> (<a class="code" href="classInotifyException.html" title="Class for inotify exceptions.">InotifyException</a>)
-<a name="l00867"></a>00867 {
-<a name="l00868"></a>00868 <a class="code" href="classInotify.html#734538233ba2136164f76f4df6c3654e" title="Modifies a particular inotify capability/limit.">SetCapability</a>(<a class="code" href="inotify-cxx_8h.html#bccd39d32dd83905178cf42edaae5c4d594390780d2bdcec064c00aec1f20429" title="max. watches per file descriptor">IN_MAX_WATCHES</a>, val);
-<a name="l00869"></a>00869 }
-<a name="l00870"></a>00870
-<a name="l00871"></a>00871 <span class="keyword">private</span>:
-<a name="l00872"></a><a class="code" href="classInotify.html#95d6d0ecefff77bd3ee50f1586a4552b">00872</a> <span class="keywordtype">int</span> <a class="code" href="classInotify.html#95d6d0ecefff77bd3ee50f1586a4552b" title="file descriptor">m_fd</a>;
-<a name="l00873"></a><a class="code" href="classInotify.html#4d07f3a4412028d687936d2479d9a976">00873</a> IN_WATCH_MAP <a class="code" href="classInotify.html#4d07f3a4412028d687936d2479d9a976" title="watches (by descriptors)">m_watches</a>;
-<a name="l00874"></a><a class="code" href="classInotify.html#62f275db6375a366023b2e46f73e3ecc">00874</a> IN_WP_MAP <a class="code" href="classInotify.html#62f275db6375a366023b2e46f73e3ecc" title="watches (by paths)">m_paths</a>;
-<a name="l00875"></a><a class="code" href="classInotify.html#eee7847efd93b681fddac56860fc7958">00875</a> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> <a class="code" href="classInotify.html#eee7847efd93b681fddac56860fc7958" title="buffer for events">m_buf</a>[<a class="code" href="inotify-cxx_8h.html#a84911f8e42d71161b60d4a28940abb4" title="Event buffer length.">INOTIFY_BUFLEN</a>];
-<a name="l00876"></a><a class="code" href="classInotify.html#0c1d6c969292dbb7c8c1283a3d8f55e0">00876</a> std::deque&lt;InotifyEvent&gt; <a class="code" href="classInotify.html#0c1d6c969292dbb7c8c1283a3d8f55e0" title="event queue">m_events</a>;
-<a name="l00877"></a>00877
-<a name="l00878"></a>00878 <a class="code" href="inotify-cxx_8h.html#904d25c0fd931e1bad4f9d5cd346a766" title="inotify-cxx thread safety">IN_LOCK_DECL</a>
-<a name="l00879"></a>00879
-<a name="l00880"></a><a class="code" href="classInotify.html#10880f490c33acd8bd24664fc7bce4ae">00880</a> <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="classInotifyWatch.html" title="inotify watch class">InotifyWatch</a>;
-<a name="l00881"></a>00881
-<a name="l00882"></a>00882 <span class="keyword">static</span> std::string <a class="code" href="classInotify.html#0233ddfe40844d729505fdfd709d22cc">GetCapabilityPath</a>(<a class="code" href="inotify-cxx_8h.html#bccd39d32dd83905178cf42edaae5c4d" title="inotify capability/limit identifiers">InotifyCapability_t</a> cap) <span class="keywordflow">throw</span> (<a class="code" href="classInotifyException.html" title="Class for inotify exceptions.">InotifyException</a>);
-<a name="l00883"></a>00883 };
-<a name="l00884"></a>00884
-<a name="l00885"></a>00885
-<a name="l00886"></a>00886 <span class="preprocessor">#endif //_INOTIFYCXX_H_</span>
-<a name="l00887"></a>00887 <span class="preprocessor"></span>
-</pre></div></div>
-<hr size="1"><address style="text-align: right;"><small><a href="http://www.doxygen.org/index.html">
-<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> </small></address>
-</body>
-</html>
diff --git a/shared/inotify/doc/html/tab_b.gif b/shared/inotify/doc/html/tab_b.gif
deleted file mode 100644
index 0d623483..00000000
--- a/shared/inotify/doc/html/tab_b.gif
+++ /dev/null
Binary files differ
diff --git a/shared/inotify/doc/html/tab_l.gif b/shared/inotify/doc/html/tab_l.gif
deleted file mode 100644
index 9b1e6337..00000000
--- a/shared/inotify/doc/html/tab_l.gif
+++ /dev/null
Binary files differ
diff --git a/shared/inotify/doc/html/tab_r.gif b/shared/inotify/doc/html/tab_r.gif
deleted file mode 100644
index ce9dd9f5..00000000
--- a/shared/inotify/doc/html/tab_r.gif
+++ /dev/null
Binary files differ
diff --git a/shared/inotify/doc/html/tabs.css b/shared/inotify/doc/html/tabs.css
deleted file mode 100644
index ab02c624..00000000
--- a/shared/inotify/doc/html/tabs.css
+++ /dev/null
@@ -1,105 +0,0 @@
-/* tabs styles, based on http://www.alistapart.com/articles/slidingdoors */
-
-DIV.tabs
-{
- float : left;
- width : 100%;
- background : url("tab_b.gif") repeat-x bottom;
- margin-bottom : 4px;
-}
-
-DIV.tabs UL
-{
- margin : 0px;
- padding-left : 10px;
- list-style : none;
-}
-
-DIV.tabs LI, DIV.tabs FORM
-{
- display : inline;
- margin : 0px;
- padding : 0px;
-}
-
-DIV.tabs FORM
-{
- float : right;
-}
-
-DIV.tabs A
-{
- float : left;
- background : url("tab_r.gif") no-repeat right top;
- border-bottom : 1px solid #84B0C7;
- font-size : 80%;
- font-weight : bold;
- text-decoration : none;
-}
-
-DIV.tabs A:hover
-{
- background-position: 100% -150px;
-}
-
-DIV.tabs A:link, DIV.tabs A:visited,
-DIV.tabs A:active, DIV.tabs A:hover
-{
- color: #1A419D;
-}
-
-DIV.tabs SPAN
-{
- float : left;
- display : block;
- background : url("tab_l.gif") no-repeat left top;
- padding : 5px 9px;
- white-space : nowrap;
-}
-
-DIV.tabs INPUT
-{
- float : right;
- display : inline;
- font-size : 1em;
-}
-
-DIV.tabs TD
-{
- font-size : 80%;
- font-weight : bold;
- text-decoration : none;
-}
-
-
-
-/* Commented Backslash Hack hides rule from IE5-Mac \*/
-DIV.tabs SPAN {float : none;}
-/* End IE5-Mac hack */
-
-DIV.tabs A:hover SPAN
-{
- background-position: 0% -150px;
-}
-
-DIV.tabs LI.current A
-{
- background-position: 100% -150px;
- border-width : 0px;
-}
-
-DIV.tabs LI.current SPAN
-{
- background-position: 0% -150px;
- padding-bottom : 6px;
-}
-
-DIV.navpath
-{
- background : none;
- border : none;
- border-bottom : 1px solid #84B0C7;
- text-align : center;
- margin : 2px;
- padding : 2px;
-}
diff --git a/shared/inotify/doc/man/man3/Inotify.3 b/shared/inotify/doc/man/man3/Inotify.3
deleted file mode 100644
index 84579325..00000000
--- a/shared/inotify/doc/man/man3/Inotify.3
+++ /dev/null
@@ -1,696 +0,0 @@
-.TH "Inotify" 3 "9 Dec 2009" "Version 0.7.3" "inotify-cxx" \" -*- nroff -*-
-.ad l
-.nh
-.SH NAME
-Inotify \- inotify class
-
-.PP
-.SH SYNOPSIS
-.br
-.PP
-\fC#include <inotify-cxx.h>\fP
-.PP
-.SS "Public Member Functions"
-
-.in +1c
-.ti -1c
-.RI "\fBInotify\fP () throw (InotifyException)"
-.br
-.RI "\fIConstructor. \fP"
-.ti -1c
-.RI "\fB~Inotify\fP ()"
-.br
-.RI "\fIDestructor. \fP"
-.ti -1c
-.RI "void \fBClose\fP ()"
-.br
-.RI "\fIRemoves all watches and closes the inotify device. \fP"
-.ti -1c
-.RI "void \fBAdd\fP (\fBInotifyWatch\fP *pWatch) throw (InotifyException)"
-.br
-.RI "\fIAdds a new watch. \fP"
-.ti -1c
-.RI "void \fBAdd\fP (\fBInotifyWatch\fP &rWatch) throw (InotifyException)"
-.br
-.RI "\fIAdds a new watch. \fP"
-.ti -1c
-.RI "void \fBRemove\fP (\fBInotifyWatch\fP *pWatch) throw (InotifyException)"
-.br
-.RI "\fIRemoves a watch. \fP"
-.ti -1c
-.RI "void \fBRemove\fP (\fBInotifyWatch\fP &rWatch) throw (InotifyException)"
-.br
-.RI "\fIRemoves a watch. \fP"
-.ti -1c
-.RI "void \fBRemoveAll\fP ()"
-.br
-.RI "\fIRemoves all watches. \fP"
-.ti -1c
-.RI "size_t \fBGetWatchCount\fP () const "
-.br
-.RI "\fIReturns the count of watches. \fP"
-.ti -1c
-.RI "size_t \fBGetEnabledCount\fP () const "
-.br
-.RI "\fIReturns the count of enabled watches. \fP"
-.ti -1c
-.RI "void \fBWaitForEvents\fP (bool fNoIntr=false) throw (InotifyException)"
-.br
-.RI "\fIWaits for inotify events. \fP"
-.ti -1c
-.RI "size_t \fBGetEventCount\fP ()"
-.br
-.RI "\fIReturns the count of received and queued events. \fP"
-.ti -1c
-.RI "bool \fBGetEvent\fP (\fBInotifyEvent\fP *pEvt) throw (InotifyException)"
-.br
-.RI "\fIExtracts a queued inotify event. \fP"
-.ti -1c
-.RI "bool \fBGetEvent\fP (\fBInotifyEvent\fP &rEvt) throw (InotifyException)"
-.br
-.RI "\fIExtracts a queued inotify event. \fP"
-.ti -1c
-.RI "bool \fBPeekEvent\fP (\fBInotifyEvent\fP *pEvt) throw (InotifyException)"
-.br
-.RI "\fIExtracts a queued inotify event (without removing). \fP"
-.ti -1c
-.RI "bool \fBPeekEvent\fP (\fBInotifyEvent\fP &rEvt) throw (InotifyException)"
-.br
-.RI "\fIExtracts a queued inotify event (without removing). \fP"
-.ti -1c
-.RI "\fBInotifyWatch\fP * \fBFindWatch\fP (int iDescriptor)"
-.br
-.RI "\fISearches for a watch by a watch descriptor. \fP"
-.ti -1c
-.RI "\fBInotifyWatch\fP * \fBFindWatch\fP (const std::string &rPath)"
-.br
-.RI "\fISearches for a watch by a filesystem path. \fP"
-.ti -1c
-.RI "int \fBGetDescriptor\fP () const "
-.br
-.RI "\fIReturns the file descriptor. \fP"
-.ti -1c
-.RI "void \fBSetNonBlock\fP (bool fNonBlock) throw (InotifyException)"
-.br
-.RI "\fIEnables/disables non-blocking mode. \fP"
-.ti -1c
-.RI "void \fBSetCloseOnExec\fP (bool fClOnEx) throw (InotifyException)"
-.br
-.RI "\fIEnables/disables closing on exec. \fP"
-.in -1c
-.SS "Static Public Member Functions"
-
-.in +1c
-.ti -1c
-.RI "static uint32_t \fBGetCapability\fP (\fBInotifyCapability_t\fP cap) throw (InotifyException)"
-.br
-.RI "\fIAcquires a particular inotify capability/limit. \fP"
-.ti -1c
-.RI "static void \fBSetCapability\fP (\fBInotifyCapability_t\fP cap, uint32_t val) throw (InotifyException)"
-.br
-.RI "\fIModifies a particular inotify capability/limit. \fP"
-.ti -1c
-.RI "static uint32_t \fBGetMaxEvents\fP () throw (InotifyException)"
-.br
-.RI "\fIReturns the maximum number of events in the kernel queue. \fP"
-.ti -1c
-.RI "static void \fBSetMaxEvents\fP (uint32_t val) throw (InotifyException)"
-.br
-.RI "\fISets the maximum number of events in the kernel queue. \fP"
-.ti -1c
-.RI "static uint32_t \fBGetMaxInstances\fP () throw (InotifyException)"
-.br
-.RI "\fIReturns the maximum number of inotify instances per process. \fP"
-.ti -1c
-.RI "static void \fBSetMaxInstances\fP (uint32_t val) throw (InotifyException)"
-.br
-.RI "\fISets the maximum number of inotify instances per process. \fP"
-.ti -1c
-.RI "static uint32_t \fBGetMaxWatches\fP () throw (InotifyException)"
-.br
-.RI "\fIReturns the maximum number of inotify watches per instance. \fP"
-.ti -1c
-.RI "static void \fBSetMaxWatches\fP (uint32_t val) throw (InotifyException)"
-.br
-.RI "\fISets the maximum number of inotify watches per instance. \fP"
-.in -1c
-.SS "Static Private Member Functions"
-
-.in +1c
-.ti -1c
-.RI "static std::string \fBGetCapabilityPath\fP (\fBInotifyCapability_t\fP cap) throw (InotifyException)"
-.br
-.in -1c
-.SS "Private Attributes"
-
-.in +1c
-.ti -1c
-.RI "int \fBm_fd\fP"
-.br
-.RI "\fIfile descriptor \fP"
-.ti -1c
-.RI "\fBIN_WATCH_MAP\fP \fBm_watches\fP"
-.br
-.RI "\fIwatches (by descriptors) \fP"
-.ti -1c
-.RI "\fBIN_WP_MAP\fP \fBm_paths\fP"
-.br
-.RI "\fIwatches (by paths) \fP"
-.ti -1c
-.RI "unsigned char \fBm_buf\fP [INOTIFY_BUFLEN]"
-.br
-.RI "\fIbuffer for events \fP"
-.ti -1c
-.RI "std::deque< \fBInotifyEvent\fP > \fBm_events\fP"
-.br
-.RI "\fIevent queue \fP"
-.in -1c
-.SS "Friends"
-
-.in +1c
-.ti -1c
-.RI "class \fBInotifyWatch\fP"
-.br
-.in -1c
-.SH "Detailed Description"
-.PP
-inotify class
-
-It holds information about the inotify device descriptor and manages the event queue.
-.PP
-If the INOTIFY_THREAD_SAFE is defined this class is thread-safe.
-.SH "Constructor & Destructor Documentation"
-.PP
-.SS "Inotify::Inotify () throw (\fBInotifyException\fP)"
-.PP
-Constructor.
-.PP
-Creates and initializes an instance of inotify communication object (opens the inotify device).
-.PP
-\fBExceptions:\fP
-.RS 4
-\fI\fBInotifyException\fP\fP thrown if inotify isn't available
-.RE
-.PP
-
-.SS "Inotify::~Inotify ()"
-.PP
-Destructor.
-.PP
-Calls \fBClose()\fP due to clean-up.
-.SH "Member Function Documentation"
-.PP
-.SS "void Inotify::Add (\fBInotifyWatch\fP & rWatch) throw (\fBInotifyException\fP)\fC [inline]\fP"
-.PP
-Adds a new watch.
-.PP
-\fBParameters:\fP
-.RS 4
-\fIrWatch\fP inotify watch
-.RE
-.PP
-\fBExceptions:\fP
-.RS 4
-\fI\fBInotifyException\fP\fP thrown if adding failed
-.RE
-.PP
-
-.SS "void Inotify::Add (\fBInotifyWatch\fP * pWatch) throw (\fBInotifyException\fP)"
-.PP
-Adds a new watch.
-.PP
-\fBParameters:\fP
-.RS 4
-\fIpWatch\fP inotify watch
-.RE
-.PP
-\fBExceptions:\fP
-.RS 4
-\fI\fBInotifyException\fP\fP thrown if adding failed
-.RE
-.PP
-
-.SS "void Inotify::Close ()"
-.PP
-Removes all watches and closes the inotify device.
-.PP
-.SS "\fBInotifyWatch\fP * Inotify::FindWatch (const std::string & rPath)"
-.PP
-Searches for a watch by a filesystem path.
-.PP
-It tries to find a watch by the given filesystem path.
-.PP
-\fBParameters:\fP
-.RS 4
-\fIrPath\fP filesystem path
-.RE
-.PP
-\fBReturns:\fP
-.RS 4
-pointer to a watch; NULL if no such watch exists
-.RE
-.PP
-\fBAttention:\fP
-.RS 4
-The path must be exactly identical to the one used for the searched watch. Be careful about absolute/relative and case-insensitive paths.
-.RE
-.PP
-
-.SS "\fBInotifyWatch\fP * Inotify::FindWatch (int iDescriptor)"
-.PP
-Searches for a watch by a watch descriptor.
-.PP
-It tries to find a watch by the given descriptor.
-.PP
-\fBParameters:\fP
-.RS 4
-\fIiDescriptor\fP watch descriptor
-.RE
-.PP
-\fBReturns:\fP
-.RS 4
-pointer to a watch; NULL if no such watch exists
-.RE
-.PP
-
-.SS "uint32_t Inotify::GetCapability (\fBInotifyCapability_t\fP cap) throw (\fBInotifyException\fP)\fC [static]\fP"
-.PP
-Acquires a particular inotify capability/limit.
-.PP
-\fBParameters:\fP
-.RS 4
-\fIcap\fP capability/limit identifier
-.RE
-.PP
-\fBReturns:\fP
-.RS 4
-capability/limit value
-.RE
-.PP
-\fBExceptions:\fP
-.RS 4
-\fI\fBInotifyException\fP\fP thrown if the given value cannot be acquired
-.RE
-.PP
-
-.SS "std::string Inotify::GetCapabilityPath (\fBInotifyCapability_t\fP cap) throw (\fBInotifyException\fP)\fC [static, private]\fP"
-.PP
-.SS "int Inotify::GetDescriptor () const\fC [inline]\fP"
-.PP
-Returns the file descriptor.
-.PP
-The descriptor can be used in standard low-level file functions (poll(), select(), fcntl() etc.).
-.PP
-\fBReturns:\fP
-.RS 4
-valid file descriptor or -1 for inactive object
-.RE
-.PP
-\fBSee also:\fP
-.RS 4
-\fBSetNonBlock()\fP
-.RE
-.PP
-
-.SS "size_t Inotify::GetEnabledCount () const\fC [inline]\fP"
-.PP
-Returns the count of enabled watches.
-.PP
-\fBReturns:\fP
-.RS 4
-count of enabled watches
-.RE
-.PP
-\fBSee also:\fP
-.RS 4
-\fBGetWatchCount()\fP
-.RE
-.PP
-
-.SS "bool Inotify::GetEvent (\fBInotifyEvent\fP & rEvt) throw (\fBInotifyException\fP)\fC [inline]\fP"
-.PP
-Extracts a queued inotify event.
-.PP
-The extracted event is removed from the queue.
-.PP
-\fBParameters:\fP
-.RS 4
-\fIrEvt\fP event object
-.RE
-.PP
-\fBExceptions:\fP
-.RS 4
-\fI\fBInotifyException\fP\fP thrown only in very anomalous cases
-.RE
-.PP
-
-.SS "bool Inotify::GetEvent (\fBInotifyEvent\fP * pEvt) throw (\fBInotifyException\fP)"
-.PP
-Extracts a queued inotify event.
-.PP
-The extracted event is removed from the queue. If the pointer is NULL it does nothing.
-.PP
-\fBParameters:\fP
-.RS 4
-\fIpEvt\fP event object
-.RE
-.PP
-\fBExceptions:\fP
-.RS 4
-\fI\fBInotifyException\fP\fP thrown if the provided pointer is NULL
-.RE
-.PP
-
-.SS "size_t Inotify::GetEventCount ()\fC [inline]\fP"
-.PP
-Returns the count of received and queued events.
-.PP
-This number is related to the events in the queue inside this object, not to the events pending in the kernel.
-.PP
-\fBReturns:\fP
-.RS 4
-count of events
-.RE
-.PP
-
-.SS "static uint32_t Inotify::GetMaxEvents () throw (\fBInotifyException\fP)\fC [inline, static]\fP"
-.PP
-Returns the maximum number of events in the kernel queue.
-.PP
-\fBReturns:\fP
-.RS 4
-maximum number of events in the kernel queue
-.RE
-.PP
-\fBExceptions:\fP
-.RS 4
-\fI\fBInotifyException\fP\fP thrown if the given value cannot be acquired
-.RE
-.PP
-
-.SS "static uint32_t Inotify::GetMaxInstances () throw (\fBInotifyException\fP)\fC [inline, static]\fP"
-.PP
-Returns the maximum number of inotify instances per process.
-.PP
-It means the maximum number of open inotify file descriptors per running process.
-.PP
-\fBReturns:\fP
-.RS 4
-maximum number of inotify instances
-.RE
-.PP
-\fBExceptions:\fP
-.RS 4
-\fI\fBInotifyException\fP\fP thrown if the given value cannot be acquired
-.RE
-.PP
-
-.SS "static uint32_t Inotify::GetMaxWatches () throw (\fBInotifyException\fP)\fC [inline, static]\fP"
-.PP
-Returns the maximum number of inotify watches per instance.
-.PP
-It means the maximum number of inotify watches per inotify file descriptor.
-.PP
-\fBReturns:\fP
-.RS 4
-maximum number of inotify watches
-.RE
-.PP
-\fBExceptions:\fP
-.RS 4
-\fI\fBInotifyException\fP\fP thrown if the given value cannot be acquired
-.RE
-.PP
-
-.SS "size_t Inotify::GetWatchCount () const\fC [inline]\fP"
-.PP
-Returns the count of watches.
-.PP
-This is the total count of all watches (regardless whether enabled or not).
-.PP
-\fBReturns:\fP
-.RS 4
-count of watches
-.RE
-.PP
-\fBSee also:\fP
-.RS 4
-\fBGetEnabledCount()\fP
-.RE
-.PP
-
-.SS "bool Inotify::PeekEvent (\fBInotifyEvent\fP & rEvt) throw (\fBInotifyException\fP)\fC [inline]\fP"
-.PP
-Extracts a queued inotify event (without removing).
-.PP
-The extracted event stays in the queue.
-.PP
-\fBParameters:\fP
-.RS 4
-\fIrEvt\fP event object
-.RE
-.PP
-\fBExceptions:\fP
-.RS 4
-\fI\fBInotifyException\fP\fP thrown only in very anomalous cases
-.RE
-.PP
-
-.SS "bool Inotify::PeekEvent (\fBInotifyEvent\fP * pEvt) throw (\fBInotifyException\fP)"
-.PP
-Extracts a queued inotify event (without removing).
-.PP
-The extracted event stays in the queue. If the pointer is NULL it does nothing.
-.PP
-\fBParameters:\fP
-.RS 4
-\fIpEvt\fP event object
-.RE
-.PP
-\fBExceptions:\fP
-.RS 4
-\fI\fBInotifyException\fP\fP thrown if the provided pointer is NULL
-.RE
-.PP
-
-.SS "void Inotify::Remove (\fBInotifyWatch\fP & rWatch) throw (\fBInotifyException\fP)\fC [inline]\fP"
-.PP
-Removes a watch.
-.PP
-If the given watch is not present it does nothing.
-.PP
-\fBParameters:\fP
-.RS 4
-\fIrWatch\fP inotify watch
-.RE
-.PP
-\fBExceptions:\fP
-.RS 4
-\fI\fBInotifyException\fP\fP thrown if removing failed
-.RE
-.PP
-
-.SS "void Inotify::Remove (\fBInotifyWatch\fP * pWatch) throw (\fBInotifyException\fP)"
-.PP
-Removes a watch.
-.PP
-If the given watch is not present it does nothing.
-.PP
-\fBParameters:\fP
-.RS 4
-\fIpWatch\fP inotify watch
-.RE
-.PP
-\fBExceptions:\fP
-.RS 4
-\fI\fBInotifyException\fP\fP thrown if removing failed
-.RE
-.PP
-
-.SS "void Inotify::RemoveAll ()"
-.PP
-Removes all watches.
-.PP
-.SS "void Inotify::SetCapability (\fBInotifyCapability_t\fP cap, uint32_t val) throw (\fBInotifyException\fP)\fC [static]\fP"
-.PP
-Modifies a particular inotify capability/limit.
-.PP
-\fBParameters:\fP
-.RS 4
-\fIcap\fP capability/limit identifier
-.br
-\fIval\fP new capability/limit value
-.RE
-.PP
-\fBExceptions:\fP
-.RS 4
-\fI\fBInotifyException\fP\fP thrown if the given value cannot be set
-.RE
-.PP
-\fBAttention:\fP
-.RS 4
-Using this function requires root privileges. Beware of setting extensive values - it may seriously affect system performance and/or stability.
-.RE
-.PP
-
-.SS "void Inotify::SetCloseOnExec (bool fClOnEx) throw (\fBInotifyException\fP)"
-.PP
-Enables/disables closing on exec.
-.PP
-Enable this if you want to close the descriptor when executing another program. Otherwise, the descriptor will be inherited.
-.PP
-Closing on exec is disabled by default.
-.PP
-\fBParameters:\fP
-.RS 4
-\fIfClOnEx\fP enable/disable closing on exec
-.RE
-.PP
-\fBExceptions:\fP
-.RS 4
-\fI\fBInotifyException\fP\fP thrown if setting failed
-.RE
-.PP
-\fBSee also:\fP
-.RS 4
-\fBGetDescriptor()\fP, \fBSetNonBlock()\fP
-.RE
-.PP
-
-.SS "static void Inotify::SetMaxEvents (uint32_t val) throw (\fBInotifyException\fP)\fC [inline, static]\fP"
-.PP
-Sets the maximum number of events in the kernel queue.
-.PP
-\fBParameters:\fP
-.RS 4
-\fIval\fP new value
-.RE
-.PP
-\fBExceptions:\fP
-.RS 4
-\fI\fBInotifyException\fP\fP thrown if the given value cannot be set
-.RE
-.PP
-\fBAttention:\fP
-.RS 4
-Using this function requires root privileges. Beware of setting extensive values - the greater value is set here the more physical memory may be used for the inotify infrastructure.
-.RE
-.PP
-
-.SS "static void Inotify::SetMaxInstances (uint32_t val) throw (\fBInotifyException\fP)\fC [inline, static]\fP"
-.PP
-Sets the maximum number of inotify instances per process.
-.PP
-\fBParameters:\fP
-.RS 4
-\fIval\fP new value
-.RE
-.PP
-\fBExceptions:\fP
-.RS 4
-\fI\fBInotifyException\fP\fP thrown if the given value cannot be set
-.RE
-.PP
-\fBAttention:\fP
-.RS 4
-Using this function requires root privileges. Beware of setting extensive values - the greater value is set here the more physical memory may be used for the inotify infrastructure.
-.RE
-.PP
-
-.SS "static void Inotify::SetMaxWatches (uint32_t val) throw (\fBInotifyException\fP)\fC [inline, static]\fP"
-.PP
-Sets the maximum number of inotify watches per instance.
-.PP
-\fBParameters:\fP
-.RS 4
-\fIval\fP new value
-.RE
-.PP
-\fBExceptions:\fP
-.RS 4
-\fI\fBInotifyException\fP\fP thrown if the given value cannot be set
-.RE
-.PP
-\fBAttention:\fP
-.RS 4
-Using this function requires root privileges. Beware of setting extensive values - the greater value is set here the more physical memory may be used for the inotify infrastructure.
-.RE
-.PP
-
-.SS "void Inotify::SetNonBlock (bool fNonBlock) throw (\fBInotifyException\fP)"
-.PP
-Enables/disables non-blocking mode.
-.PP
-Use this mode if you want to monitor the descriptor (acquired thru \fBGetDescriptor()\fP) in functions such as poll(), select() etc.
-.PP
-Non-blocking mode is disabled by default.
-.PP
-\fBParameters:\fP
-.RS 4
-\fIfNonBlock\fP enable/disable non-blocking mode
-.RE
-.PP
-\fBExceptions:\fP
-.RS 4
-\fI\fBInotifyException\fP\fP thrown if setting mode failed
-.RE
-.PP
-\fBSee also:\fP
-.RS 4
-\fBGetDescriptor()\fP, \fBSetCloseOnExec()\fP
-.RE
-.PP
-
-.SS "void Inotify::WaitForEvents (bool fNoIntr = \fCfalse\fP) throw (\fBInotifyException\fP)"
-.PP
-Waits for inotify events.
-.PP
-It waits until one or more events occur. When called in nonblocking mode it only retrieves occurred events to the internal queue and exits.
-.PP
-\fBParameters:\fP
-.RS 4
-\fIfNoIntr\fP if true it re-calls the system call after a handled signal
-.RE
-.PP
-\fBExceptions:\fP
-.RS 4
-\fI\fBInotifyException\fP\fP thrown if reading events failed
-.RE
-.PP
-\fBSee also:\fP
-.RS 4
-\fBSetNonBlock()\fP
-.RE
-.PP
-
-.SH "Friends And Related Function Documentation"
-.PP
-.SS "friend class \fBInotifyWatch\fP\fC [friend]\fP"
-.PP
-.SH "Member Data Documentation"
-.PP
-.SS "unsigned char \fBInotify::m_buf\fP[INOTIFY_BUFLEN]\fC [private]\fP"
-.PP
-buffer for events
-.PP
-.SS "std::deque<\fBInotifyEvent\fP> \fBInotify::m_events\fP\fC [private]\fP"
-.PP
-event queue
-.PP
-.SS "int \fBInotify::m_fd\fP\fC [private]\fP"
-.PP
-file descriptor
-.PP
-.SS "\fBIN_WP_MAP\fP \fBInotify::m_paths\fP\fC [private]\fP"
-.PP
-watches (by paths)
-.PP
-.SS "\fBIN_WATCH_MAP\fP \fBInotify::m_watches\fP\fC [private]\fP"
-.PP
-watches (by descriptors)
-.PP
-
-
-.SH "Author"
-.PP
-Generated automatically by Doxygen for inotify-cxx from the source code.
diff --git a/shared/inotify/doc/man/man3/InotifyEvent.3 b/shared/inotify/doc/man/man3/InotifyEvent.3
deleted file mode 100644
index c45eaba9..00000000
--- a/shared/inotify/doc/man/man3/InotifyEvent.3
+++ /dev/null
@@ -1,306 +0,0 @@
-.TH "InotifyEvent" 3 "9 Dec 2009" "Version 0.7.3" "inotify-cxx" \" -*- nroff -*-
-.ad l
-.nh
-.SH NAME
-InotifyEvent \- inotify event class
-
-.PP
-.SH SYNOPSIS
-.br
-.PP
-\fC#include <inotify-cxx.h>\fP
-.PP
-.SS "Public Member Functions"
-
-.in +1c
-.ti -1c
-.RI "\fBInotifyEvent\fP ()"
-.br
-.RI "\fIConstructor. \fP"
-.ti -1c
-.RI "\fBInotifyEvent\fP (const struct inotify_event *pEvt, \fBInotifyWatch\fP *pWatch)"
-.br
-.RI "\fIConstructor. \fP"
-.ti -1c
-.RI "\fB~InotifyEvent\fP ()"
-.br
-.RI "\fIDestructor. \fP"
-.ti -1c
-.RI "int32_t \fBGetDescriptor\fP () const "
-.br
-.RI "\fIReturns the event watch descriptor. \fP"
-.ti -1c
-.RI "uint32_t \fBGetMask\fP () const "
-.br
-.RI "\fIReturns the event mask. \fP"
-.ti -1c
-.RI "bool \fBIsType\fP (uint32_t uType) const "
-.br
-.RI "\fIChecks for the event type. \fP"
-.ti -1c
-.RI "uint32_t \fBGetCookie\fP () const "
-.br
-.RI "\fIReturns the event cookie. \fP"
-.ti -1c
-.RI "uint32_t \fBGetLength\fP () const "
-.br
-.RI "\fIReturns the event name length. \fP"
-.ti -1c
-.RI "const std::string & \fBGetName\fP () const "
-.br
-.RI "\fIReturns the event name. \fP"
-.ti -1c
-.RI "void \fBGetName\fP (std::string &rName) const "
-.br
-.RI "\fIExtracts the event name. \fP"
-.ti -1c
-.RI "\fBInotifyWatch\fP * \fBGetWatch\fP ()"
-.br
-.RI "\fIReturns the source watch. \fP"
-.ti -1c
-.RI "void \fBDumpTypes\fP (std::string &rStr) const "
-.br
-.RI "\fIFills the string with all types contained in the event mask. \fP"
-.in -1c
-.SS "Static Public Member Functions"
-
-.in +1c
-.ti -1c
-.RI "static bool \fBIsType\fP (uint32_t uValue, uint32_t uType)"
-.br
-.RI "\fIChecks a value for the event type. \fP"
-.ti -1c
-.RI "static uint32_t \fBGetMaskByName\fP (const std::string &rName)"
-.br
-.RI "\fIFinds the appropriate mask for a name. \fP"
-.ti -1c
-.RI "static void \fBDumpTypes\fP (uint32_t uValue, std::string &rStr)"
-.br
-.RI "\fIFills the string with all types contained in an event mask value. \fP"
-.in -1c
-.SS "Private Attributes"
-
-.in +1c
-.ti -1c
-.RI "uint32_t \fBm_uMask\fP"
-.br
-.RI "\fImask \fP"
-.ti -1c
-.RI "uint32_t \fBm_uCookie\fP"
-.br
-.RI "\fIcookie \fP"
-.ti -1c
-.RI "std::string \fBm_name\fP"
-.br
-.RI "\fIname \fP"
-.ti -1c
-.RI "\fBInotifyWatch\fP * \fBm_pWatch\fP"
-.br
-.RI "\fIsource watch \fP"
-.in -1c
-.SH "Detailed Description"
-.PP
-inotify event class
-
-It holds all information about inotify event and provides access to its particular values.
-.PP
-This class is not (and is not intended to be) thread-safe and therefore it must not be used concurrently in multiple threads.
-.SH "Constructor & Destructor Documentation"
-.PP
-.SS "InotifyEvent::InotifyEvent ()\fC [inline]\fP"
-.PP
-Constructor.
-.PP
-Creates a plain event.
-.SS "InotifyEvent::InotifyEvent (const struct inotify_event * pEvt, \fBInotifyWatch\fP * pWatch)\fC [inline]\fP"
-.PP
-Constructor.
-.PP
-Creates an event based on inotify event data. For NULL pointers it works the same way as \fBInotifyEvent()\fP.
-.PP
-\fBParameters:\fP
-.RS 4
-\fIpEvt\fP event data
-.br
-\fIpWatch\fP inotify watch
-.RE
-.PP
-
-.SS "InotifyEvent::~InotifyEvent ()\fC [inline]\fP"
-.PP
-Destructor.
-.PP
-.SH "Member Function Documentation"
-.PP
-.SS "void InotifyEvent::DumpTypes (std::string & rStr) const"
-.PP
-Fills the string with all types contained in the event mask.
-.PP
-\fBParameters:\fP
-.RS 4
-\fIrStr\fP dumped event types
-.RE
-.PP
-
-.SS "void InotifyEvent::DumpTypes (uint32_t uValue, std::string & rStr)\fC [static]\fP"
-.PP
-Fills the string with all types contained in an event mask value.
-.PP
-\fBParameters:\fP
-.RS 4
-\fIuValue\fP event mask value
-.br
-\fIrStr\fP dumped event types
-.RE
-.PP
-
-.SS "uint32_t InotifyEvent::GetCookie () const\fC [inline]\fP"
-.PP
-Returns the event cookie.
-.PP
-\fBReturns:\fP
-.RS 4
-event cookie
-.RE
-.PP
-
-.SS "int32_t InotifyEvent::GetDescriptor () const"
-.PP
-Returns the event watch descriptor.
-.PP
-\fBReturns:\fP
-.RS 4
-watch descriptor
-.RE
-.PP
-\fBSee also:\fP
-.RS 4
-\fBInotifyWatch::GetDescriptor()\fP
-.RE
-.PP
-
-.SS "uint32_t InotifyEvent::GetLength () const\fC [inline]\fP"
-.PP
-Returns the event name length.
-.PP
-\fBReturns:\fP
-.RS 4
-event name length
-.RE
-.PP
-
-.SS "uint32_t InotifyEvent::GetMask () const\fC [inline]\fP"
-.PP
-Returns the event mask.
-.PP
-\fBReturns:\fP
-.RS 4
-event mask
-.RE
-.PP
-\fBSee also:\fP
-.RS 4
-\fBInotifyWatch::GetMask()\fP
-.RE
-.PP
-
-.SS "uint32_t InotifyEvent::GetMaskByName (const std::string & rName)\fC [static]\fP"
-.PP
-Finds the appropriate mask for a name.
-.PP
-\fBParameters:\fP
-.RS 4
-\fIrName\fP mask name
-.RE
-.PP
-\fBReturns:\fP
-.RS 4
-mask for name; 0 on failure
-.RE
-.PP
-
-.SS "void InotifyEvent::GetName (std::string & rName) const\fC [inline]\fP"
-.PP
-Extracts the event name.
-.PP
-\fBParameters:\fP
-.RS 4
-\fIrName\fP event name
-.RE
-.PP
-
-.SS "const std::string& InotifyEvent::GetName () const\fC [inline]\fP"
-.PP
-Returns the event name.
-.PP
-\fBReturns:\fP
-.RS 4
-event name
-.RE
-.PP
-
-.SS "\fBInotifyWatch\fP* InotifyEvent::GetWatch ()\fC [inline]\fP"
-.PP
-Returns the source watch.
-.PP
-\fBReturns:\fP
-.RS 4
-source watch
-.RE
-.PP
-
-.SS "bool InotifyEvent::IsType (uint32_t uType) const\fC [inline]\fP"
-.PP
-Checks for the event type.
-.PP
-\fBParameters:\fP
-.RS 4
-\fIuType\fP type which is checked for
-.RE
-.PP
-\fBReturns:\fP
-.RS 4
-true = event mask contains the given type, false = otherwise
-.RE
-.PP
-
-.SS "static bool InotifyEvent::IsType (uint32_t uValue, uint32_t uType)\fC [inline, static]\fP"
-.PP
-Checks a value for the event type.
-.PP
-\fBParameters:\fP
-.RS 4
-\fIuValue\fP checked value
-.br
-\fIuType\fP type which is checked for
-.RE
-.PP
-\fBReturns:\fP
-.RS 4
-true = the value contains the given type, false = otherwise
-.RE
-.PP
-
-.SH "Member Data Documentation"
-.PP
-.SS "std::string \fBInotifyEvent::m_name\fP\fC [private]\fP"
-.PP
-name
-.PP
-.SS "\fBInotifyWatch\fP* \fBInotifyEvent::m_pWatch\fP\fC [private]\fP"
-.PP
-source watch
-.PP
-.SS "uint32_t \fBInotifyEvent::m_uCookie\fP\fC [private]\fP"
-.PP
-cookie
-.PP
-.SS "uint32_t \fBInotifyEvent::m_uMask\fP\fC [private]\fP"
-.PP
-mask
-.PP
-
-
-.SH "Author"
-.PP
-Generated automatically by Doxygen for inotify-cxx from the source code.
diff --git a/shared/inotify/doc/man/man3/InotifyException.3 b/shared/inotify/doc/man/man3/InotifyException.3
deleted file mode 100644
index 57bc1bec..00000000
--- a/shared/inotify/doc/man/man3/InotifyException.3
+++ /dev/null
@@ -1,124 +0,0 @@
-.TH "InotifyException" 3 "9 Dec 2009" "Version 0.7.3" "inotify-cxx" \" -*- nroff -*-
-.ad l
-.nh
-.SH NAME
-InotifyException \- Class for inotify exceptions.
-
-.PP
-.SH SYNOPSIS
-.br
-.PP
-\fC#include <inotify-cxx.h>\fP
-.PP
-.SS "Public Member Functions"
-
-.in +1c
-.ti -1c
-.RI "\fBInotifyException\fP (const std::string &rMsg='', int iErr=0, void *pSrc=NULL)"
-.br
-.RI "\fIConstructor. \fP"
-.ti -1c
-.RI "const std::string & \fBGetMessage\fP () const "
-.br
-.RI "\fIReturns the exception message. \fP"
-.ti -1c
-.RI "int \fBGetErrorNumber\fP () const "
-.br
-.RI "\fIReturns the exception error number. \fP"
-.ti -1c
-.RI "void * \fBGetSource\fP () const "
-.br
-.RI "\fIReturns the exception source. \fP"
-.in -1c
-.SS "Protected Attributes"
-
-.in +1c
-.ti -1c
-.RI "std::string \fBm_msg\fP"
-.br
-.RI "\fImessage \fP"
-.ti -1c
-.RI "int \fBm_err\fP"
-.br
-.RI "\fIerror number \fP"
-.ti -1c
-.RI "void * \fBm_pSrc\fP"
-.br
-.RI "\fIsource \fP"
-.in -1c
-.SH "Detailed Description"
-.PP
-Class for inotify exceptions.
-
-This class allows to acquire information about exceptional events. It makes easier to log or display error messages and to identify problematic code locations.
-.PP
-Although this class is basically thread-safe it is not intended to be shared between threads.
-.SH "Constructor & Destructor Documentation"
-.PP
-.SS "InotifyException::InotifyException (const std::string & rMsg = \fC''\fP, int iErr = \fC0\fP, void * pSrc = \fCNULL\fP)\fC [inline]\fP"
-.PP
-Constructor.
-.PP
-\fBParameters:\fP
-.RS 4
-\fIrMsg\fP message
-.br
-\fIiErr\fP error number (see errno.h)
-.br
-\fIpSrc\fP source
-.RE
-.PP
-
-.SH "Member Function Documentation"
-.PP
-.SS "int InotifyException::GetErrorNumber () const\fC [inline]\fP"
-.PP
-Returns the exception error number.
-.PP
-If not applicable this value is 0 (zero).
-.PP
-\fBReturns:\fP
-.RS 4
-error number (standardized; see errno.h)
-.RE
-.PP
-
-.SS "const std::string& InotifyException::GetMessage () const\fC [inline]\fP"
-.PP
-Returns the exception message.
-.PP
-\fBReturns:\fP
-.RS 4
-message
-.RE
-.PP
-
-.SS "void* InotifyException::GetSource () const\fC [inline]\fP"
-.PP
-Returns the exception source.
-.PP
-\fBReturns:\fP
-.RS 4
-source
-.RE
-.PP
-
-.SH "Member Data Documentation"
-.PP
-.SS "int \fBInotifyException::m_err\fP\fC [protected]\fP"
-.PP
-error number
-.PP
-.SS "std::string \fBInotifyException::m_msg\fP\fC [protected]\fP"
-.PP
-message
-.PP
-.SS "void* \fBInotifyException::m_pSrc\fP\fC [mutable, protected]\fP"
-.PP
-source
-.PP
-
-
-.SH "Author"
-.PP
-Generated automatically by Doxygen for inotify-cxx from the source code.
diff --git a/shared/inotify/doc/man/man3/InotifyWatch.3 b/shared/inotify/doc/man/man3/InotifyWatch.3
deleted file mode 100644
index cac74012..00000000
--- a/shared/inotify/doc/man/man3/InotifyWatch.3
+++ /dev/null
@@ -1,265 +0,0 @@
-.TH "InotifyWatch" 3 "9 Dec 2009" "Version 0.7.3" "inotify-cxx" \" -*- nroff -*-
-.ad l
-.nh
-.SH NAME
-InotifyWatch \- inotify watch class
-
-.PP
-.SH SYNOPSIS
-.br
-.PP
-\fC#include <inotify-cxx.h>\fP
-.PP
-.SS "Public Member Functions"
-
-.in +1c
-.ti -1c
-.RI "\fBInotifyWatch\fP (const std::string &rPath, int32_t uMask, bool fEnabled=true)"
-.br
-.RI "\fIConstructor. \fP"
-.ti -1c
-.RI "\fB~InotifyWatch\fP ()"
-.br
-.RI "\fIDestructor. \fP"
-.ti -1c
-.RI "int32_t \fBGetDescriptor\fP () const "
-.br
-.RI "\fIReturns the watch descriptor. \fP"
-.ti -1c
-.RI "const std::string & \fBGetPath\fP () const "
-.br
-.RI "\fIReturns the watched file path. \fP"
-.ti -1c
-.RI "uint32_t \fBGetMask\fP () const "
-.br
-.RI "\fIReturns the watch event mask. \fP"
-.ti -1c
-.RI "void \fBSetMask\fP (uint32_t uMask) throw (InotifyException)"
-.br
-.RI "\fISets the watch event mask. \fP"
-.ti -1c
-.RI "\fBInotify\fP * \fBGetInotify\fP ()"
-.br
-.RI "\fIReturns the appropriate inotify class instance. \fP"
-.ti -1c
-.RI "void \fBSetEnabled\fP (bool fEnabled) throw (InotifyException)"
-.br
-.RI "\fIEnables/disables the watch. \fP"
-.ti -1c
-.RI "bool \fBIsEnabled\fP () const "
-.br
-.RI "\fIChecks whether the watch is enabled. \fP"
-.ti -1c
-.RI "bool \fBIsRecursive\fP () const "
-.br
-.RI "\fIChecks whether the watch is recursive. \fP"
-.in -1c
-.SS "Private Member Functions"
-
-.in +1c
-.ti -1c
-.RI "IN_LOCK_DECL void \fB__Disable\fP ()"
-.br
-.RI "\fIDisables the watch (due to removing by the kernel). \fP"
-.in -1c
-.SS "Private Attributes"
-
-.in +1c
-.ti -1c
-.RI "std::string \fBm_path\fP"
-.br
-.RI "\fIwatched file path \fP"
-.ti -1c
-.RI "uint32_t \fBm_uMask\fP"
-.br
-.RI "\fIevent mask \fP"
-.ti -1c
-.RI "int32_t \fBm_wd\fP"
-.br
-.RI "\fIwatch descriptor \fP"
-.ti -1c
-.RI "\fBInotify\fP * \fBm_pInotify\fP"
-.br
-.RI "\fIinotify object \fP"
-.ti -1c
-.RI "bool \fBm_fEnabled\fP"
-.br
-.RI "\fIevents enabled yes/no \fP"
-.in -1c
-.SS "Friends"
-
-.in +1c
-.ti -1c
-.RI "class \fBInotify\fP"
-.br
-.in -1c
-.SH "Detailed Description"
-.PP
-inotify watch class
-
-It holds information about the inotify watch on a particular inode.
-.PP
-If the INOTIFY_THREAD_SAFE is defined this class is thread-safe.
-.SH "Constructor & Destructor Documentation"
-.PP
-.SS "InotifyWatch::InotifyWatch (const std::string & rPath, int32_t uMask, bool fEnabled = \fCtrue\fP)\fC [inline]\fP"
-.PP
-Constructor.
-.PP
-Creates an inotify watch. Because this watch is inactive it has an invalid descriptor (-1).
-.PP
-\fBParameters:\fP
-.RS 4
-\fIrPath\fP watched file path
-.br
-\fIuMask\fP mask for events
-.br
-\fIfEnabled\fP events enabled yes/no
-.RE
-.PP
-
-.SS "InotifyWatch::~InotifyWatch ()\fC [inline]\fP"
-.PP
-Destructor.
-.PP
-.SH "Member Function Documentation"
-.PP
-.SS "void InotifyWatch::__Disable ()\fC [private]\fP"
-.PP
-Disables the watch (due to removing by the kernel).
-.PP
-This method must be called after receiving an event. It ensures the watch object is consistent with the kernel data.
-.SS "int32_t InotifyWatch::GetDescriptor () const\fC [inline]\fP"
-.PP
-Returns the watch descriptor.
-.PP
-\fBReturns:\fP
-.RS 4
-watch descriptor; -1 for inactive watch
-.RE
-.PP
-
-.SS "\fBInotify\fP* InotifyWatch::GetInotify ()\fC [inline]\fP"
-.PP
-Returns the appropriate inotify class instance.
-.PP
-\fBReturns:\fP
-.RS 4
-inotify instance
-.RE
-.PP
-
-.SS "uint32_t InotifyWatch::GetMask () const\fC [inline]\fP"
-.PP
-Returns the watch event mask.
-.PP
-\fBReturns:\fP
-.RS 4
-event mask
-.RE
-.PP
-
-.SS "const std::string& InotifyWatch::GetPath () const\fC [inline]\fP"
-.PP
-Returns the watched file path.
-.PP
-\fBReturns:\fP
-.RS 4
-file path
-.RE
-.PP
-
-.SS "bool InotifyWatch::IsEnabled () const\fC [inline]\fP"
-.PP
-Checks whether the watch is enabled.
-.PP
-\fBReturns:\fP
-.RS 4
-true = enables, false = disabled
-.RE
-.PP
-
-.SS "bool InotifyWatch::IsRecursive () const\fC [inline]\fP"
-.PP
-Checks whether the watch is recursive.
-.PP
-A recursive watch monitors a directory itself and all its subdirectories. This watch is a logical object which may have many underlying kernel watches.
-.PP
-\fBReturns:\fP
-.RS 4
-currently always false (recursive watches not yet supported)
-.RE
-.PP
-\fBAttention:\fP
-.RS 4
-Recursive watches are currently NOT supported. They are planned for future versions.
-.RE
-.PP
-
-.SS "void InotifyWatch::SetEnabled (bool fEnabled) throw (\fBInotifyException\fP)"
-.PP
-Enables/disables the watch.
-.PP
-If the watch is active (added to an instance of \fBInotify\fP) this method may fail due to unsuccessful re-setting the watch in the kernel.
-.PP
-Re-setting the current state has no effect.
-.PP
-\fBParameters:\fP
-.RS 4
-\fIfEnabled\fP set enabled yes/no
-.RE
-.PP
-\fBExceptions:\fP
-.RS 4
-\fI\fBInotifyException\fP\fP thrown if enabling/disabling fails
-.RE
-.PP
-
-.SS "void InotifyWatch::SetMask (uint32_t uMask) throw (\fBInotifyException\fP)"
-.PP
-Sets the watch event mask.
-.PP
-If the watch is active (added to an instance of \fBInotify\fP) this method may fail due to unsuccessful re-setting the watch in the kernel.
-.PP
-\fBParameters:\fP
-.RS 4
-\fIuMask\fP event mask
-.RE
-.PP
-\fBExceptions:\fP
-.RS 4
-\fI\fBInotifyException\fP\fP thrown if changing fails
-.RE
-.PP
-
-.SH "Friends And Related Function Documentation"
-.PP
-.SS "friend class \fBInotify\fP\fC [friend]\fP"
-.PP
-.SH "Member Data Documentation"
-.PP
-.SS "bool \fBInotifyWatch::m_fEnabled\fP\fC [private]\fP"
-.PP
-events enabled yes/no
-.PP
-.SS "std::string \fBInotifyWatch::m_path\fP\fC [private]\fP"
-.PP
-watched file path
-.PP
-.SS "\fBInotify\fP* \fBInotifyWatch::m_pInotify\fP\fC [private]\fP"
-.PP
-inotify object
-.PP
-.SS "uint32_t \fBInotifyWatch::m_uMask\fP\fC [private]\fP"
-.PP
-event mask
-.PP
-.SS "int32_t \fBInotifyWatch::m_wd\fP\fC [private]\fP"
-.PP
-watch descriptor
-.PP
-
-
-.SH "Author"
-.PP
-Generated automatically by Doxygen for inotify-cxx from the source code.
diff --git a/shared/inotify/doc/man/man3/inotify-cxx.cpp.3 b/shared/inotify/doc/man/man3/inotify-cxx.cpp.3
deleted file mode 100644
index aed8e808..00000000
--- a/shared/inotify/doc/man/man3/inotify-cxx.cpp.3
+++ /dev/null
@@ -1,80 +0,0 @@
-.TH "inotify-cxx.cpp" 3 "9 Dec 2009" "Version 0.7.3" "inotify-cxx" \" -*- nroff -*-
-.ad l
-.nh
-.SH NAME
-inotify-cxx.cpp \- inotify C++ interface implementation
-
-.PP
-.SH SYNOPSIS
-.br
-.PP
-\fC#include <errno.h>\fP
-.br
-\fC#include <unistd.h>\fP
-.br
-\fC#include <fcntl.h>\fP
-.br
-\fC#include <fstream>\fP
-.br
-\fC#include <sys/syscall.h>\fP
-.br
-\fC#include <sys/inotify-syscalls.h>\fP
-.br
-\fC#include 'inotify-cxx.h'\fP
-.br
-
-.SS "Defines"
-
-.in +1c
-.ti -1c
-.RI "#define \fBPROCFS_INOTIFY_BASE\fP '/proc/sys/fs/inotify/'"
-.br
-.RI "\fIprocfs inotify base path \fP"
-.ti -1c
-.RI "#define \fBDUMP_SEP\fP"
-.br
-.RI "\fIdump separator (between particular entries) \fP"
-.in -1c
-.SH "Detailed Description"
-.PP
-inotify C++ interface implementation
-
-inotify C++ interface
-.PP
-Copyright (C) 2006, 2007, 2009 Lukas Jelinek <lukas@aiken.cz>
-.PP
-This program is free software; you can redistribute it and/or modify it under the terms of one of the following licenses:
-.PP
-.PD 0
-.IP "\(bu" 2
-1. X11-style license (see LICENSE-X11)
-.IP "\(bu" 2
-2. GNU Lesser General Public License, version 2.1 (see LICENSE-LGPL)
-.IP "\(bu" 2
-3. GNU General Public License, version 2 (see LICENSE-GPL)
-.PP
-If you want to help with choosing the best license for you, please visit http://www.gnu.org/licenses/license-list.html.
-.PP
-Credits: Mike Frysinger (cleanup of includes)
-.SH "Define Documentation"
-.PP
-.SS "#define DUMP_SEP"
-.PP
-\fBValue:\fP
-.PP
-.nf
-({ \
- if (!rStr.empty()) { \
- rStr.append(','); \
- } \
- })
-.fi
-dump separator (between particular entries)
-.PP
-.SS "#define PROCFS_INOTIFY_BASE '/proc/sys/fs/inotify/'"
-.PP
-procfs inotify base path
-.PP
-.SH "Author"
-.PP
-Generated automatically by Doxygen for inotify-cxx from the source code.
diff --git a/shared/inotify/doc/man/man3/inotify-cxx.h.3 b/shared/inotify/doc/man/man3/inotify-cxx.h.3
deleted file mode 100644
index 8c729b37..00000000
--- a/shared/inotify/doc/man/man3/inotify-cxx.h.3
+++ /dev/null
@@ -1,198 +0,0 @@
-.TH "inotify-cxx.h" 3 "9 Dec 2009" "Version 0.7.3" "inotify-cxx" \" -*- nroff -*-
-.ad l
-.nh
-.SH NAME
-inotify-cxx.h \- inotify C++ interface header
-
-.PP
-.SH SYNOPSIS
-.br
-.PP
-\fC#include <stdint.h>\fP
-.br
-\fC#include <string>\fP
-.br
-\fC#include <deque>\fP
-.br
-\fC#include <map>\fP
-.br
-\fC#include <sys/inotify.h>\fP
-.br
-
-.SS "Classes"
-
-.in +1c
-.ti -1c
-.RI "class \fBInotifyException\fP"
-.br
-.RI "\fIClass for inotify exceptions. \fP"
-.ti -1c
-.RI "class \fBInotifyEvent\fP"
-.br
-.RI "\fIinotify event class \fP"
-.ti -1c
-.RI "class \fBInotifyWatch\fP"
-.br
-.RI "\fIinotify watch class \fP"
-.ti -1c
-.RI "class \fBInotify\fP"
-.br
-.RI "\fIinotify class \fP"
-.in -1c
-.SS "Defines"
-
-.in +1c
-.ti -1c
-.RI "#define \fBINOTIFY_EVENT_SIZE\fP (sizeof(struct inotify_event))"
-.br
-.RI "\fIEvent struct size. \fP"
-.ti -1c
-.RI "#define \fBINOTIFY_BUFLEN\fP (1024 * (INOTIFY_EVENT_SIZE + 16))"
-.br
-.RI "\fIEvent buffer length. \fP"
-.ti -1c
-.RI "#define \fBIN_EXC_MSG\fP(msg) (std::string(__PRETTY_FUNCTION__) + ': ' + msg)"
-.br
-.RI "\fIHelper macro for creating exception messages. \fP"
-.ti -1c
-.RI "#define \fBIN_LOCK_DECL\fP"
-.br
-.RI "\fIinotify-cxx thread safety \fP"
-.ti -1c
-.RI "#define \fBIN_LOCK_INIT\fP"
-.br
-.ti -1c
-.RI "#define \fBIN_LOCK_DONE\fP"
-.br
-.ti -1c
-.RI "#define \fBIN_READ_BEGIN\fP"
-.br
-.ti -1c
-.RI "#define \fBIN_READ_END\fP"
-.br
-.ti -1c
-.RI "#define \fBIN_READ_END_NOTHROW\fP"
-.br
-.ti -1c
-.RI "#define \fBIN_WRITE_BEGIN\fP"
-.br
-.ti -1c
-.RI "#define \fBIN_WRITE_END\fP"
-.br
-.ti -1c
-.RI "#define \fBIN_WRITE_END_NOTHROW\fP"
-.br
-.in -1c
-.SS "Typedefs"
-
-.in +1c
-.ti -1c
-.RI "typedef std::map< int32_t, \fBInotifyWatch\fP * > \fBIN_WATCH_MAP\fP"
-.br
-.RI "\fIMapping from watch descriptors to watch objects. \fP"
-.ti -1c
-.RI "typedef std::map< std::string, \fBInotifyWatch\fP * > \fBIN_WP_MAP\fP"
-.br
-.RI "\fIMapping from paths to watch objects. \fP"
-.in -1c
-.SS "Enumerations"
-
-.in +1c
-.ti -1c
-.RI "enum \fBInotifyCapability_t\fP { \fBIN_MAX_EVENTS\fP = 0, \fBIN_MAX_INSTANCES\fP = 1, \fBIN_MAX_WATCHES\fP = 2 }"
-.br
-.RI "\fIinotify capability/limit identifiers \fP"
-.in -1c
-.SH "Detailed Description"
-.PP
-inotify C++ interface header
-
-inotify C++ interface
-.PP
-Copyright (C) 2006, 2007, 2009 Lukas Jelinek, <lukas@aiken.cz>
-.PP
-This program is free software; you can redistribute it and/or modify it under the terms of one of the following licenses:
-.PP
-.PD 0
-.IP "\(bu" 2
-1. X11-style license (see LICENSE-X11)
-.IP "\(bu" 2
-2. GNU Lesser General Public License, version 2.1 (see LICENSE-LGPL)
-.IP "\(bu" 2
-3. GNU General Public License, version 2 (see LICENSE-GPL)
-.PP
-If you want to help with choosing the best license for you, please visit http://www.gnu.org/licenses/license-list.html.
-.PP
-Credits: Mike Frysinger (cleanup of includes)
-.SH "Define Documentation"
-.PP
-.SS "#define IN_EXC_MSG(msg) (std::string(__PRETTY_FUNCTION__) + ': ' + msg)"
-.PP
-Helper macro for creating exception messages.
-.PP
-It prepends the message by the function name.
-.SS "#define IN_LOCK_DECL"
-.PP
-inotify-cxx thread safety
-.PP
-If this symbol is defined you can use this interface safely threaded applications. Remember that it slightly degrades performance.
-.PP
-Even if INOTIFY_THREAD_SAFE is defined some classes stay unsafe. If you must use them (must you?) in more than one thread concurrently you need to implement explicite locking.
-.PP
-You need not to define INOTIFY_THREAD_SAFE in that cases where the application is multithreaded but all the inotify infrastructure will be managed only in one thread. This is the recommended way.
-.PP
-Locking may fail (it is very rare but not impossible). In this case an exception is thrown. But if unlocking fails in case of an error it does nothing (this failure is ignored).
-.SS "#define IN_LOCK_DONE"
-.PP
-.SS "#define IN_LOCK_INIT"
-.PP
-.SS "#define IN_READ_BEGIN"
-.PP
-.SS "#define IN_READ_END"
-.PP
-.SS "#define IN_READ_END_NOTHROW"
-.PP
-.SS "#define IN_WRITE_BEGIN"
-.PP
-.SS "#define IN_WRITE_END"
-.PP
-.SS "#define IN_WRITE_END_NOTHROW"
-.PP
-.SS "#define INOTIFY_BUFLEN (1024 * (INOTIFY_EVENT_SIZE + 16))"
-.PP
-Event buffer length.
-.PP
-.SS "#define INOTIFY_EVENT_SIZE (sizeof(struct inotify_event))"
-.PP
-Event struct size.
-.PP
-.SH "Typedef Documentation"
-.PP
-.SS "typedef std::map<int32_t, \fBInotifyWatch\fP*> \fBIN_WATCH_MAP\fP"
-.PP
-Mapping from watch descriptors to watch objects.
-.PP
-.SS "typedef std::map<std::string, \fBInotifyWatch\fP*> \fBIN_WP_MAP\fP"
-.PP
-Mapping from paths to watch objects.
-.PP
-.SH "Enumeration Type Documentation"
-.PP
-.SS "enum \fBInotifyCapability_t\fP"
-.PP
-inotify capability/limit identifiers
-.PP
-\fBEnumerator: \fP
-.in +1c
-.TP
-\fB\fIIN_MAX_EVENTS \fP\fP
-max. events in the kernel queue
-.TP
-\fB\fIIN_MAX_INSTANCES \fP\fP
-max. inotify file descriptors per process
-.TP
-\fB\fIIN_MAX_WATCHES \fP\fP
-max. watches per file descriptor
-.SH "Author"
-.PP
-Generated automatically by Doxygen for inotify-cxx from the source code.
diff --git a/shared/inotify/inotify-cxx.cpp b/shared/inotify/inotify-cxx.cpp
deleted file mode 100644
index 5a460ec7..00000000
--- a/shared/inotify/inotify-cxx.cpp
+++ /dev/null
@@ -1,709 +0,0 @@
-
-/// inotify C++ interface implementation
-/**
- * \file inotify-cxx.cpp
- *
- * inotify C++ interface
- *
- * Copyright (C) 2006, 2007, 2009 Lukas Jelinek <lukas@aiken.cz>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of one of the following licenses:
- *
- * \li 1. X11-style license (see LICENSE-X11)
- * \li 2. GNU Lesser General Public License, version 2.1 (see LICENSE-LGPL)
- * \li 3. GNU General Public License, version 2 (see LICENSE-GPL)
- *
- * If you want to help with choosing the best license for you,
- * please visit http://www.gnu.org/licenses/license-list.html.
- *
- * Credits:
- * Mike Frysinger (cleanup of includes)
- *
- */
-
-
-#include <errno.h>
-#include <unistd.h>
-#include <fcntl.h>
-#include <fstream>
-
-#include <sys/syscall.h>
-
-// Use this if syscalls not defined
-#ifndef __NR_inotify_init
-#include <sys/inotify-syscalls.h>
-#endif // __NR_inotify_init
-
-#include "inotify-cxx.h"
-
-/// procfs inotify base path
-#define PROCFS_INOTIFY_BASE "/proc/sys/fs/inotify/"
-
-/// dump separator (between particular entries)
-#define DUMP_SEP \
- ({ \
- if (!rStr.empty()) { \
- rStr.append(","); \
- } \
- })
-
-
-
-int32_t InotifyEvent::GetDescriptor() const
-{
- return m_pWatch != NULL // if watch exists
- ? m_pWatch->GetDescriptor() // return its descriptor
- : -1; // else return -1
-}
-
-uint32_t InotifyEvent::GetMaskByName(const std::string& rName)
-{
- if (rName == "IN_ACCESS")
- return IN_ACCESS;
- else if (rName == "IN_MODIFY")
- return IN_MODIFY;
- else if (rName == "IN_ATTRIB")
- return IN_ATTRIB;
- else if (rName == "IN_CLOSE_WRITE")
- return IN_CLOSE_WRITE;
- else if (rName == "IN_CLOSE_NOWRITE")
- return IN_CLOSE_NOWRITE;
- else if (rName == "IN_OPEN")
- return IN_OPEN;
- else if (rName == "IN_MOVED_FROM")
- return IN_MOVED_FROM;
- else if (rName == "IN_MOVED_TO")
- return IN_MOVED_TO;
- else if (rName == "IN_CREATE")
- return IN_CREATE;
- else if (rName == "IN_DELETE")
- return IN_DELETE;
- else if (rName == "IN_DELETE_SELF")
- return IN_DELETE_SELF;
- else if (rName == "IN_UNMOUNT")
- return IN_UNMOUNT;
- else if (rName == "IN_Q_OVERFLOW")
- return IN_Q_OVERFLOW;
- else if (rName == "IN_IGNORED")
- return IN_IGNORED;
- else if (rName == "IN_CLOSE")
- return IN_CLOSE;
- else if (rName == "IN_MOVE")
- return IN_MOVE;
- else if (rName == "IN_ISDIR")
- return IN_ISDIR;
- else if (rName == "IN_ONESHOT")
- return IN_ONESHOT;
- else if (rName == "IN_ALL_EVENTS")
- return IN_ALL_EVENTS;
-
-#ifdef IN_DONT_FOLLOW
- else if (rName == "IN_DONT_FOLLOW")
- return IN_DONT_FOLLOW;
-#endif // IN_DONT_FOLLOW
-
-#ifdef IN_ONLYDIR
- else if (rName == "IN_ONLYDIR")
- return IN_ONLYDIR;
-#endif // IN_ONLYDIR
-
-#ifdef IN_MOVE_SELF
- else if (rName == "IN_MOVE_SELF")
- return IN_MOVE_SELF;
-#endif // IN_MOVE_SELF
-
- return (uint32_t) 0;
-}
-
-void InotifyEvent::DumpTypes(uint32_t uValue, std::string& rStr)
-{
- rStr = "";
-
- if (IsType(uValue, IN_ALL_EVENTS))
- {
- rStr.append("IN_ALL_EVENTS");
- }
- else
- {
- if (IsType(uValue, IN_ACCESS))
- {
- DUMP_SEP;
- rStr.append("IN_ACCESS");
- }
- if (IsType(uValue, IN_MODIFY))
- {
- DUMP_SEP;
- rStr.append("IN_MODIFY");
- }
- if (IsType(uValue, IN_ATTRIB))
- {
- DUMP_SEP;
- rStr.append("IN_ATTRIB");
- }
- if (IsType(uValue, IN_CREATE))
- {
- DUMP_SEP;
- rStr.append("IN_CREATE");
- }
- if (IsType(uValue, IN_DELETE))
- {
- DUMP_SEP;
- rStr.append("IN_DELETE");
- }
- if (IsType(uValue, IN_DELETE_SELF))
- {
- DUMP_SEP;
- rStr.append("IN_DELETE_SELF");
- }
- if (IsType(uValue, IN_OPEN))
- {
- DUMP_SEP;
- rStr.append("IN_OPEN");
- }
- if (IsType(uValue, IN_CLOSE))
- {
- DUMP_SEP;
- rStr.append("IN_CLOSE");
- }
-
-#ifdef IN_MOVE_SELF
- if (IsType(uValue, IN_MOVE_SELF))
- {
- DUMP_SEP;
- rStr.append("IN_MOVE_SELF");
- }
-#endif // IN_MOVE_SELF
-
- else
- {
- if (IsType(uValue, IN_CLOSE_WRITE))
- {
- DUMP_SEP;
- rStr.append("IN_CLOSE_WRITE");
- }
- if (IsType(uValue, IN_CLOSE_NOWRITE))
- {
- DUMP_SEP;
- rStr.append("IN_CLOSE_NOWRITE");
- }
- }
- if (IsType(uValue, IN_MOVE))
- {
- DUMP_SEP;
- rStr.append("IN_MOVE");
- }
- else
- {
- if (IsType(uValue, IN_MOVED_FROM))
- {
- DUMP_SEP;
- rStr.append("IN_MOVED_FROM");
- }
- if (IsType(uValue, IN_MOVED_TO))
- {
- DUMP_SEP;
- rStr.append("IN_MOVED_TO");
- }
- }
- }
- if (IsType(uValue, IN_UNMOUNT))
- {
- DUMP_SEP;
- rStr.append("IN_UNMOUNT");
- }
- if (IsType(uValue, IN_Q_OVERFLOW))
- {
- DUMP_SEP;
- rStr.append("IN_Q_OVERFLOW");
- }
- if (IsType(uValue, IN_IGNORED))
- {
- DUMP_SEP;
- rStr.append("IN_IGNORED");
- }
- if (IsType(uValue, IN_ISDIR))
- {
- DUMP_SEP;
- rStr.append("IN_ISDIR");
- }
- if (IsType(uValue, IN_ONESHOT))
- {
- DUMP_SEP;
- rStr.append("IN_ONESHOT");
- }
-
-#ifdef IN_DONT_FOLLOW
- if (IsType(uValue, IN_DONT_FOLLOW))
- {
- DUMP_SEP;
- rStr.append("IN_DONT_FOLLOW");
- }
-#endif // IN_DONT_FOLLOW
-
-#ifdef IN_ONLYDIR
- if (IsType(uValue, IN_ONLYDIR))
- {
- DUMP_SEP;
- rStr.append("IN_ONLYDIR");
- }
-#endif // IN_ONLYDIR
-}
-
-void InotifyEvent::DumpTypes(std::string& rStr) const
-{
- DumpTypes(m_uMask, rStr);
-}
-
-
-void InotifyWatch::SetMask(uint32_t uMask) throw (InotifyException)
-{
- IN_WRITE_BEGIN
-
- if (m_wd != -1)
- {
- int wd = inotify_add_watch(m_pInotify->GetDescriptor(), m_path.c_str(), uMask);
- if (wd != m_wd)
- {
- IN_WRITE_END_NOTHROW
- throw InotifyException(IN_EXC_MSG("changing mask failed"), wd == -1 ? errno : EINVAL, this);
- }
- }
-
- m_uMask = uMask;
-
- IN_WRITE_END
-}
-
-void InotifyWatch::SetEnabled(bool fEnabled) throw (InotifyException)
-{
- IN_WRITE_BEGIN
-
- if (fEnabled == m_fEnabled)
- {
- IN_WRITE_END_NOTHROW
- return;
- }
-
- if (m_pInotify != NULL)
- {
- if (fEnabled)
- {
- m_wd = inotify_add_watch(m_pInotify->GetDescriptor(), m_path.c_str(), m_uMask);
- if (m_wd == -1)
- {
- IN_WRITE_END_NOTHROW
- throw InotifyException(IN_EXC_MSG("enabling watch failed"), errno, this);
- }
- m_pInotify->m_watches.insert(IN_WATCH_MAP::value_type(m_wd, this));
- }
- else
- {
- if (inotify_rm_watch(m_pInotify->GetDescriptor(), m_wd) != 0)
- {
- IN_WRITE_END_NOTHROW
- throw InotifyException(IN_EXC_MSG("disabling watch failed"), errno, this);
- }
- m_pInotify->m_watches.erase(m_wd);
- m_wd = -1;
- }
- }
-
- m_fEnabled = fEnabled;
-
- IN_WRITE_END
-}
-
-void InotifyWatch::__Disable()
-{
- IN_WRITE_BEGIN
-
- if (!m_fEnabled)
- {
- IN_WRITE_END_NOTHROW
- throw InotifyException(IN_EXC_MSG("event cannot occur on disabled watch"), EINVAL, this);
- }
-
- if (m_pInotify != NULL)
- {
- m_pInotify->m_watches.erase(m_wd);
- m_wd = -1;
- }
-
- m_fEnabled = false;
-
- IN_WRITE_END
-}
-
-
-Inotify::Inotify() throw (InotifyException)
-{
- IN_LOCK_INIT
-
- m_fd = inotify_init();
- if (m_fd == -1)
- {
- IN_LOCK_DONE
- throw InotifyException(IN_EXC_MSG("inotify init failed"), errno, NULL);
- }
-}
-
-Inotify::~Inotify()
-{
- Close();
-
- IN_LOCK_DONE
-}
-
-void Inotify::Close()
-{
- IN_WRITE_BEGIN
-
- if (m_fd != -1)
- {
- RemoveAll();
- close(m_fd);
- m_fd = -1;
- }
-
- IN_WRITE_END
-}
-
-void Inotify::Add(InotifyWatch* pWatch) throw (InotifyException)
-{
- IN_WRITE_BEGIN
-
- // invalid descriptor - this case shouldn't occur - go away
- if (m_fd == -1)
- {
- IN_WRITE_END_NOTHROW
- throw InotifyException(IN_EXC_MSG("invalid file descriptor"), EBUSY, this);
- }
-
- // this path already watched - go away
- if (FindWatch(pWatch->GetPath()) != NULL)
- {
- IN_WRITE_END_NOTHROW
- throw InotifyException(IN_EXC_MSG("path already watched"), EBUSY, this);
- }
-
- // for enabled watch
- if (pWatch->IsEnabled())
- {
-
- // try to add watch to kernel
- int wd = inotify_add_watch(m_fd, pWatch->GetPath().c_str(), pWatch->GetMask());
-
- // adding failed - go away
- if (wd == -1)
- {
- IN_WRITE_END_NOTHROW
- throw InotifyException(IN_EXC_MSG("adding watch failed"), errno, this);
- }
-
- // this path already watched (but defined another way)
- InotifyWatch* pW = FindWatch(wd);
- if (pW != NULL)
- {
-
- // try to recover old watch because it may be modified - then go away
- if (inotify_add_watch(m_fd, pW->GetPath().c_str(), pW->GetMask()) < 0)
- {
- IN_WRITE_END_NOTHROW
- throw InotifyException(IN_EXC_MSG("watch collision detected and recovery failed"), errno, this);
- }
- else
- {
- // recovery failed - go away
- IN_WRITE_END_NOTHROW
- throw InotifyException(IN_EXC_MSG("path already watched (but defined another way)"), EBUSY, this);
- }
- }
-
- pWatch->m_wd = wd;
- m_watches.insert(IN_WATCH_MAP::value_type(pWatch->m_wd, pWatch));
- }
-
- m_paths.insert(IN_WP_MAP::value_type(pWatch->m_path, pWatch));
- pWatch->m_pInotify = this;
-
- IN_WRITE_END
-}
-
-void Inotify::Remove(InotifyWatch* pWatch) throw (InotifyException)
-{
- IN_WRITE_BEGIN
-
- // invalid descriptor - this case shouldn't occur - go away
- if (m_fd == -1)
- {
- IN_WRITE_END_NOTHROW
- throw InotifyException(IN_EXC_MSG("invalid file descriptor"), EBUSY, this);
- }
-
- // for enabled watch
- if (pWatch->m_wd != -1)
- {
-
- // removing watch failed - go away
- if (inotify_rm_watch(m_fd, pWatch->m_wd) == -1)
- {
- IN_WRITE_END_NOTHROW
- throw InotifyException(IN_EXC_MSG("removing watch failed"), errno, this);
- }
- m_watches.erase(pWatch->m_wd);
- pWatch->m_wd = -1;
- }
-
- m_paths.erase(pWatch->m_path);
- pWatch->m_pInotify = NULL;
-
- IN_WRITE_END
-}
-
-void Inotify::RemoveAll()
-{
- IN_WRITE_BEGIN
-
- IN_WP_MAP::iterator it = m_paths.begin();
- while (it != m_paths.end())
- {
- InotifyWatch* pW = (*it).second;
- if (pW->m_wd != -1)
- {
- inotify_rm_watch(m_fd, pW->m_wd);
- pW->m_wd = -1;
- }
- pW->m_pInotify = NULL;
- it++;
- }
-
- m_watches.clear();
- m_paths.clear();
-
- IN_WRITE_END
-}
-
-void Inotify::WaitForEvents(bool fNoIntr) throw (InotifyException)
-{
- ssize_t len = 0;
-
- do
- {
- len = read(m_fd, m_buf, INOTIFY_BUFLEN);
- }
- while (fNoIntr && len == -1 && errno == EINTR);
-
- if (len == -1 && !(errno == EWOULDBLOCK || errno == EINTR))
- throw InotifyException(IN_EXC_MSG("reading events failed"), errno, this);
-
- if (len == -1)
- return;
-
- IN_WRITE_BEGIN
-
- ssize_t i = 0;
- while (i < len)
- {
- struct inotify_event* pEvt = (struct inotify_event*) &m_buf[i];
- InotifyWatch* pW = FindWatch(pEvt->wd);
- if (pW != NULL)
- {
- InotifyEvent evt(pEvt, pW);
- if ( InotifyEvent::IsType(pW->GetMask(), IN_ONESHOT)
- || InotifyEvent::IsType(evt.GetMask(), IN_IGNORED))
- pW->__Disable();
- m_events.push_back(evt);
- }
- i += INOTIFY_EVENT_SIZE + (ssize_t) pEvt->len;
- }
-
- IN_WRITE_END
-}
-
-bool Inotify::GetEvent(InotifyEvent* pEvt) throw (InotifyException)
-{
- if (pEvt == NULL)
- throw InotifyException(IN_EXC_MSG("null pointer to event"), EINVAL, this);
-
- IN_WRITE_BEGIN
-
- bool b = !m_events.empty();
- if (b)
- {
- *pEvt = m_events.front();
- m_events.pop_front();
- }
-
- IN_WRITE_END
-
- return b;
-}
-
-bool Inotify::PeekEvent(InotifyEvent* pEvt) throw (InotifyException)
-{
- if (pEvt == NULL)
- throw InotifyException(IN_EXC_MSG("null pointer to event"), EINVAL, this);
-
- IN_READ_BEGIN
-
- bool b = !m_events.empty();
- if (b)
- {
- *pEvt = m_events.front();
- }
-
- IN_READ_END
-
- return b;
-}
-
-InotifyWatch* Inotify::FindWatch(int iDescriptor)
-{
- IN_READ_BEGIN
-
- IN_WATCH_MAP::iterator it = m_watches.find(iDescriptor);
- InotifyWatch* pW = it == m_watches.end() ? NULL : (*it).second;
-
- IN_READ_END
-
- return pW;
-}
-
-InotifyWatch* Inotify::FindWatch(const std::string& rPath)
-{
- IN_READ_BEGIN
-
- IN_WP_MAP::iterator it = m_paths.find(rPath);
- InotifyWatch* pW = it == m_paths.end() ? NULL : (*it).second;
-
- IN_READ_END
-
- return pW;
-}
-
-void Inotify::SetNonBlock(bool fNonBlock) throw (InotifyException)
-{
- IN_WRITE_BEGIN
-
- if (m_fd == -1)
- {
- IN_WRITE_END_NOTHROW
- throw InotifyException(IN_EXC_MSG("invalid file descriptor"), EBUSY, this);
- }
-
- int res = fcntl(m_fd, F_GETFL);
- if (res == -1)
- {
- IN_WRITE_END_NOTHROW
- throw InotifyException(IN_EXC_MSG("cannot get inotify flags"), errno, this);
- }
-
- if (fNonBlock)
- {
- res |= O_NONBLOCK;
- }
- else
- {
- res &= ~O_NONBLOCK;
- }
-
- if (fcntl(m_fd, F_SETFL, res) == -1)
- {
- IN_WRITE_END_NOTHROW
- throw InotifyException(IN_EXC_MSG("cannot set inotify flags"), errno, this);
- }
-
- IN_WRITE_END
-}
-
-void Inotify::SetCloseOnExec(bool fClOnEx) throw (InotifyException)
-{
- IN_WRITE_BEGIN
-
- if (m_fd == -1)
- {
- IN_WRITE_END_NOTHROW
- throw InotifyException(IN_EXC_MSG("invalid file descriptor"), EBUSY, this);
- }
-
- int res = fcntl(m_fd, F_GETFD);
- if (res == -1)
- {
- IN_WRITE_END_NOTHROW
- throw InotifyException(IN_EXC_MSG("cannot get inotify flags"), errno, this);
- }
-
- if (fClOnEx)
- {
- res |= FD_CLOEXEC;
- }
- else
- {
- res &= ~FD_CLOEXEC;
- }
-
- if (fcntl(m_fd, F_SETFD, res) == -1)
- {
- IN_WRITE_END_NOTHROW
- throw InotifyException(IN_EXC_MSG("cannot set inotify flags"), errno, this);
- }
-
- IN_WRITE_END
-}
-
-uint32_t Inotify::GetCapability(InotifyCapability_t cap) throw (InotifyException)
-{
- FILE* f = fopen(GetCapabilityPath(cap).c_str(), "r");
- if (f == NULL)
- throw InotifyException(IN_EXC_MSG("cannot get capability"), errno, NULL);
-
- unsigned int val = 0;
- if (fscanf(f, "%u", &val) != 1)
- {
- fclose(f);
- throw InotifyException(IN_EXC_MSG("cannot get capability"), EIO, NULL);
- }
-
- fclose(f);
-
- return (uint32_t) val;
-}
-
-void Inotify::SetCapability(InotifyCapability_t cap, uint32_t val) throw (InotifyException)
-{
- FILE* f = fopen(GetCapabilityPath(cap).c_str(), "w");
- if (f == NULL)
- throw InotifyException(IN_EXC_MSG("cannot set capability"), errno, NULL);
-
- if (fprintf(f, "%u", (unsigned int) val) <= 0)
- {
- fclose(f);
- throw InotifyException(IN_EXC_MSG("cannot set capability"), EIO, NULL);
- }
-
- fclose(f);
-}
-
-std::string Inotify::GetCapabilityPath(InotifyCapability_t cap) throw (InotifyException)
-{
- std::string path(PROCFS_INOTIFY_BASE);
-
- switch (cap)
- {
- case IN_MAX_EVENTS:
- path.append("max_queued_events");
- break;
- case IN_MAX_INSTANCES:
- path.append("max_user_instances");
- break;
- case IN_MAX_WATCHES:
- path.append("max_user_watches");
- break;
- default:
- throw InotifyException(IN_EXC_MSG("unknown capability type"), EINVAL, NULL);
- }
-
- return path;
-}
-
diff --git a/shared/inotify/inotify-cxx.h b/shared/inotify/inotify-cxx.h
deleted file mode 100644
index 2fb00fc8..00000000
--- a/shared/inotify/inotify-cxx.h
+++ /dev/null
@@ -1,890 +0,0 @@
-
-/// inotify C++ interface header
-/**
- * \file inotify-cxx.h
- *
- * inotify C++ interface
- *
- * Copyright (C) 2006, 2007, 2009 Lukas Jelinek, <lukas@aiken.cz>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of one of the following licenses:
- *
- * \li 1. X11-style license (see LICENSE-X11)
- * \li 2. GNU Lesser General Public License, version 2.1 (see LICENSE-LGPL)
- * \li 3. GNU General Public License, version 2 (see LICENSE-GPL)
- *
- * If you want to help with choosing the best license for you,
- * please visit http://www.gnu.org/licenses/license-list.html.
- *
- * Credits:
- * Mike Frysinger (cleanup of includes)
- *
- */
-
-
-
-
-
-#ifndef _INOTIFYCXX_H_
-#define _INOTIFYCXX_H_
-
-#include <stdint.h>
-#include <string>
-#include <deque>
-#include <map>
-
-// Please ensure that the following header file takes the right place
-#include <sys/inotify.h>
-
-
-/// Event struct size
-#define INOTIFY_EVENT_SIZE (sizeof(struct inotify_event))
-
-/// Event buffer length
-#define INOTIFY_BUFLEN (1024 * (INOTIFY_EVENT_SIZE + 16))
-
-/// Helper macro for creating exception messages.
-/**
- * It prepends the message by the function name.
- */
-#define IN_EXC_MSG(msg) (std::string(__PRETTY_FUNCTION__) + ": " + msg)
-
-/// inotify capability/limit identifiers
-typedef enum
-{
- IN_MAX_EVENTS = 0, ///< max. events in the kernel queue
- IN_MAX_INSTANCES = 1, ///< max. inotify file descriptors per process
- IN_MAX_WATCHES = 2 ///< max. watches per file descriptor
-} InotifyCapability_t;
-
-/// inotify-cxx thread safety
-/**
- * If this symbol is defined you can use this interface safely
- * threaded applications. Remember that it slightly degrades
- * performance.
- *
- * Even if INOTIFY_THREAD_SAFE is defined some classes stay
- * unsafe. If you must use them (must you?) in more than one
- * thread concurrently you need to implement explicite locking.
- *
- * You need not to define INOTIFY_THREAD_SAFE in that cases
- * where the application is multithreaded but all the inotify
- * infrastructure will be managed only in one thread. This is
- * the recommended way.
- *
- * Locking may fail (it is very rare but not impossible). In this
- * case an exception is thrown. But if unlocking fails in case
- * of an error it does nothing (this failure is ignored).
- */
-#ifdef INOTIFY_THREAD_SAFE
-
-#include <pthread.h>
-
-#define IN_LOCK_DECL mutable pthread_rwlock_t __m_lock;
-
-#define IN_LOCK_INIT \
- { \
- pthread_rwlockattr_t attr; \
- int res = 0; \
- if ((res = pthread_rwlockattr_init(&attr)) != 0) \
- throw InotifyException(IN_EXC_MSG("cannot initialize lock attributes"), res, this); \
- if ((res = pthread_rwlockattr_setkind_np(&attr, PTHREAD_RWLOCK_PREFER_WRITER_NP)) != 0) \
- throw InotifyException(IN_EXC_MSG("cannot set lock kind"), res, this); \
- if ((res = pthread_rwlock_init(&__m_lock, &attr)) != 0) \
- throw InotifyException(IN_EXC_MSG("cannot initialize lock"), res, this); \
- pthread_rwlockattr_destroy(&attr); \
- }
-
-#define IN_LOCK_DONE pthread_rwlock_destroy(&__m_lock);
-
-#define IN_READ_BEGIN \
- { \
- int res = pthread_rwlock_rdlock(&__m_lock); \
- if (res != 0) \
- throw InotifyException(IN_EXC_MSG("locking for reading failed"), res, (void*) this); \
- }
-
-#define IN_READ_END \
- { \
- int res = pthread_rwlock_unlock(&__m_lock); \
- if (res != 0) \
- throw InotifyException(IN_EXC_MSG("unlocking failed"), res, (void*) this); \
- }
-
-#define IN_READ_END_NOTHROW pthread_rwlock_unlock(&__m_lock);
-
-#define IN_WRITE_BEGIN \
- { \
- int res = pthread_rwlock_wrlock(&__m_lock); \
- if (res != 0) \
- throw InotifyException(IN_EXC_MSG("locking for writing failed"), res, (void*) this); \
- }
-
-#define IN_WRITE_END IN_READ_END
-#define IN_WRITE_END_NOTHROW IN_READ_END_NOTHROW
-
-#else // INOTIFY_THREAD_SAFE
-
-#define IN_LOCK_DECL
-#define IN_LOCK_INIT
-#define IN_LOCK_DONE
-#define IN_READ_BEGIN
-#define IN_READ_END
-#define IN_READ_END_NOTHROW
-#define IN_WRITE_BEGIN
-#define IN_WRITE_END
-#define IN_WRITE_END_NOTHROW
-
-#endif // INOTIFY_THREAD_SAFE
-
-
-
-
-// forward declaration
-class InotifyWatch;
-class Inotify;
-
-
-/// Class for inotify exceptions
-/**
- * This class allows to acquire information about exceptional
- * events. It makes easier to log or display error messages
- * and to identify problematic code locations.
- *
- * Although this class is basically thread-safe it is not intended
- * to be shared between threads.
- */
-class InotifyException
-{
-public:
- /// Constructor
- /**
- * \param[in] rMsg message
- * \param[in] iErr error number (see errno.h)
- * \param[in] pSrc source
- */
- InotifyException(const std::string& rMsg = "", int iErr = 0, void* pSrc = NULL)
- : m_msg(rMsg),
- m_err(iErr)
- {
- m_pSrc = pSrc;
- }
-
- /// Returns the exception message.
- /**
- * \return message
- */
- inline const std::string& GetMessage() const
- {
- return m_msg;
- }
-
- /// Returns the exception error number.
- /**
- * If not applicable this value is 0 (zero).
- *
- * \return error number (standardized; see errno.h)
- */
- inline int GetErrorNumber() const
- {
- return m_err;
- }
-
- /// Returns the exception source.
- /**
- * \return source
- */
- inline void* GetSource() const
- {
- return m_pSrc;
- }
-
-protected:
- std::string m_msg; ///< message
- int m_err; ///< error number
- mutable void* m_pSrc; ///< source
-};
-
-
-/// inotify event class
-/**
- * It holds all information about inotify event and provides
- * access to its particular values.
- *
- * This class is not (and is not intended to be) thread-safe
- * and therefore it must not be used concurrently in multiple
- * threads.
- */
-class InotifyEvent
-{
-public:
- /// Constructor.
- /**
- * Creates a plain event.
- */
- InotifyEvent()
- : m_uMask(0),
- m_uCookie(0)
- {
- m_pWatch = NULL;
- }
-
- /// Constructor.
- /**
- * Creates an event based on inotify event data.
- * For NULL pointers it works the same way as InotifyEvent().
- *
- * \param[in] pEvt event data
- * \param[in] pWatch inotify watch
- */
- InotifyEvent(const struct inotify_event* pEvt, InotifyWatch* pWatch)
- : m_uMask(0),
- m_uCookie(0)
- {
- if (pEvt != NULL)
- {
- m_uMask = (uint32_t) pEvt->mask;
- m_uCookie = (uint32_t) pEvt->cookie;
- if (pEvt->name != NULL)
- {
- m_name = pEvt->len > 0
- ? pEvt->name
- : "";
- }
- m_pWatch = pWatch;
- }
- else
- {
- m_pWatch = NULL;
- }
- }
-
- /// Destructor.
- ~InotifyEvent() {}
-
- /// Returns the event watch descriptor.
- /**
- * \return watch descriptor
- *
- * \sa InotifyWatch::GetDescriptor()
- */
- int32_t GetDescriptor() const;
-
- /// Returns the event mask.
- /**
- * \return event mask
- *
- * \sa InotifyWatch::GetMask()
- */
- inline uint32_t GetMask() const
- {
- return m_uMask;
- }
-
- /// Checks a value for the event type.
- /**
- * \param[in] uValue checked value
- * \param[in] uType type which is checked for
- * \return true = the value contains the given type, false = otherwise
- */
- inline static bool IsType(uint32_t uValue, uint32_t uType)
- {
- return ((uValue & uType) != 0) && ((~uValue & uType) == 0);
- }
-
- /// Checks for the event type.
- /**
- * \param[in] uType type which is checked for
- * \return true = event mask contains the given type, false = otherwise
- */
- inline bool IsType(uint32_t uType) const
- {
- return IsType(m_uMask, uType);
- }
-
- /// Returns the event cookie.
- /**
- * \return event cookie
- */
- inline uint32_t GetCookie() const
- {
- return m_uCookie;
- }
-
- /// Returns the event name length.
- /**
- * \return event name length
- */
- inline uint32_t GetLength() const
- {
- return (uint32_t) m_name.length();
- }
-
- /// Returns the event name.
- /**
- * \return event name
- */
- inline const std::string& GetName() const
- {
- return m_name;
- }
-
- /// Extracts the event name.
- /**
- * \param[out] rName event name
- */
- inline void GetName(std::string& rName) const
- {
- rName = GetName();
- }
-
- /// Returns the source watch.
- /**
- * \return source watch
- */
- inline InotifyWatch* GetWatch()
- {
- return m_pWatch;
- }
-
- /// Finds the appropriate mask for a name.
- /**
- * \param[in] rName mask name
- * \return mask for name; 0 on failure
- */
- static uint32_t GetMaskByName(const std::string& rName);
-
- /// Fills the string with all types contained in an event mask value.
- /**
- * \param[in] uValue event mask value
- * \param[out] rStr dumped event types
- */
- static void DumpTypes(uint32_t uValue, std::string& rStr);
-
- /// Fills the string with all types contained in the event mask.
- /**
- * \param[out] rStr dumped event types
- */
- void DumpTypes(std::string& rStr) const;
-
-private:
- uint32_t m_uMask; ///< mask
- uint32_t m_uCookie; ///< cookie
- std::string m_name; ///< name
- InotifyWatch* m_pWatch; ///< source watch
-};
-
-
-
-/// inotify watch class
-/**
- * It holds information about the inotify watch on a particular
- * inode.
- *
- * If the INOTIFY_THREAD_SAFE is defined this class is thread-safe.
- */
-class InotifyWatch
-{
-public:
- /// Constructor.
- /**
- * Creates an inotify watch. Because this watch is
- * inactive it has an invalid descriptor (-1).
- *
- * \param[in] rPath watched file path
- * \param[in] uMask mask for events
- * \param[in] fEnabled events enabled yes/no
- */
- InotifyWatch(const std::string& rPath, int32_t uMask, bool fEnabled = true)
- : m_path(rPath),
- m_uMask(uMask),
- m_wd((int32_t) -1),
- m_fEnabled(fEnabled)
- {
- IN_LOCK_INIT
- }
-
- /// Destructor.
- ~InotifyWatch()
- {
- IN_LOCK_DONE
- }
-
- /// Returns the watch descriptor.
- /**
- * \return watch descriptor; -1 for inactive watch
- */
- inline int32_t GetDescriptor() const
- {
- return m_wd;
- }
-
- /// Returns the watched file path.
- /**
- * \return file path
- */
- inline const std::string& GetPath() const
- {
- return m_path;
- }
-
- /// Returns the watch event mask.
- /**
- * \return event mask
- */
- inline uint32_t GetMask() const
- {
- return (uint32_t) m_uMask;
- }
-
- /// Sets the watch event mask.
- /**
- * If the watch is active (added to an instance of Inotify)
- * this method may fail due to unsuccessful re-setting
- * the watch in the kernel.
- *
- * \param[in] uMask event mask
- *
- * \throw InotifyException thrown if changing fails
- */
- void SetMask(uint32_t uMask) throw (InotifyException);
-
- /// Returns the appropriate inotify class instance.
- /**
- * \return inotify instance
- */
- inline Inotify* GetInotify()
- {
- return m_pInotify;
- }
-
- /// Enables/disables the watch.
- /**
- * If the watch is active (added to an instance of Inotify)
- * this method may fail due to unsuccessful re-setting
- * the watch in the kernel.
- *
- * Re-setting the current state has no effect.
- *
- * \param[in] fEnabled set enabled yes/no
- *
- * \throw InotifyException thrown if enabling/disabling fails
- */
- void SetEnabled(bool fEnabled) throw (InotifyException);
-
- /// Checks whether the watch is enabled.
- /**
- * \return true = enables, false = disabled
- */
- inline bool IsEnabled() const
- {
- return m_fEnabled;
- }
-
- /// Checks whether the watch is recursive.
- /**
- * A recursive watch monitors a directory itself and all
- * its subdirectories. This watch is a logical object
- * which may have many underlying kernel watches.
- *
- * \return currently always false (recursive watches not yet supported)
- * \attention Recursive watches are currently NOT supported.
- * They are planned for future versions.
- */
- inline bool IsRecursive() const
- {
- return false;
- }
-
-private:
- friend class Inotify;
-
- std::string m_path; ///< watched file path
- uint32_t m_uMask; ///< event mask
- int32_t m_wd; ///< watch descriptor
- Inotify* m_pInotify; ///< inotify object
- bool m_fEnabled; ///< events enabled yes/no
-
- IN_LOCK_DECL
-
- /// Disables the watch (due to removing by the kernel).
- /**
- * This method must be called after receiving an event.
- * It ensures the watch object is consistent with the kernel
- * data.
- */
- void __Disable();
-};
-
-
-/// Mapping from watch descriptors to watch objects.
-typedef std::map<int32_t, InotifyWatch*> IN_WATCH_MAP;
-
-/// Mapping from paths to watch objects.
-typedef std::map<std::string, InotifyWatch*> IN_WP_MAP;
-
-
-/// inotify class
-/**
- * It holds information about the inotify device descriptor
- * and manages the event queue.
- *
- * If the INOTIFY_THREAD_SAFE is defined this class is thread-safe.
- */
-class Inotify
-{
-public:
- /// Constructor.
- /**
- * Creates and initializes an instance of inotify communication
- * object (opens the inotify device).
- *
- * \throw InotifyException thrown if inotify isn't available
- */
- Inotify() throw (InotifyException);
-
- /// Destructor.
- /**
- * Calls Close() due to clean-up.
- */
- ~Inotify();
-
- /// Removes all watches and closes the inotify device.
- void Close();
-
- /// Adds a new watch.
- /**
- * \param[in] pWatch inotify watch
- *
- * \throw InotifyException thrown if adding failed
- */
- void Add(InotifyWatch* pWatch) throw (InotifyException);
-
- /// Adds a new watch.
- /**
- * \param[in] rWatch inotify watch
- *
- * \throw InotifyException thrown if adding failed
- */
- inline void Add(InotifyWatch& rWatch) throw (InotifyException)
- {
- Add(&rWatch);
- }
-
- /// Removes a watch.
- /**
- * If the given watch is not present it does nothing.
- *
- * \param[in] pWatch inotify watch
- *
- * \throw InotifyException thrown if removing failed
- */
- void Remove(InotifyWatch* pWatch) throw (InotifyException);
-
- /// Removes a watch.
- /**
- * If the given watch is not present it does nothing.
- *
- * \param[in] rWatch inotify watch
- *
- * \throw InotifyException thrown if removing failed
- */
- inline void Remove(InotifyWatch& rWatch) throw (InotifyException)
- {
- Remove(&rWatch);
- }
-
- /// Removes all watches.
- void RemoveAll();
-
- /// Returns the count of watches.
- /**
- * This is the total count of all watches (regardless whether
- * enabled or not).
- *
- * \return count of watches
- *
- * \sa GetEnabledCount()
- */
- inline size_t GetWatchCount() const
- {
- IN_READ_BEGIN
- size_t n = (size_t) m_paths.size();
- IN_READ_END
- return n;
- }
-
- /// Returns the count of enabled watches.
- /**
- * \return count of enabled watches
- *
- * \sa GetWatchCount()
- */
- inline size_t GetEnabledCount() const
- {
- IN_READ_BEGIN
- size_t n = (size_t) m_watches.size();
- IN_READ_END
- return n;
- }
-
- /// Waits for inotify events.
- /**
- * It waits until one or more events occur. When called
- * in nonblocking mode it only retrieves occurred events
- * to the internal queue and exits.
- *
- * \param[in] fNoIntr if true it re-calls the system call after a handled signal
- *
- * \throw InotifyException thrown if reading events failed
- *
- * \sa SetNonBlock()
- */
- void WaitForEvents(bool fNoIntr = false) throw (InotifyException);
-
- /// Returns the count of received and queued events.
- /**
- * This number is related to the events in the queue inside
- * this object, not to the events pending in the kernel.
- *
- * \return count of events
- */
- inline size_t GetEventCount()
- {
- IN_READ_BEGIN
- size_t n = (size_t) m_events.size();
- IN_READ_END
- return n;
- }
-
- /// Extracts a queued inotify event.
- /**
- * The extracted event is removed from the queue.
- * If the pointer is NULL it does nothing.
- *
- * \param[in,out] pEvt event object
- *
- * \throw InotifyException thrown if the provided pointer is NULL
- */
- bool GetEvent(InotifyEvent* pEvt) throw (InotifyException);
-
- /// Extracts a queued inotify event.
- /**
- * The extracted event is removed from the queue.
- *
- * \param[in,out] rEvt event object
- *
- * \throw InotifyException thrown only in very anomalous cases
- */
- bool GetEvent(InotifyEvent& rEvt) throw (InotifyException)
- {
- return GetEvent(&rEvt);
- }
-
- /// Extracts a queued inotify event (without removing).
- /**
- * The extracted event stays in the queue.
- * If the pointer is NULL it does nothing.
- *
- * \param[in,out] pEvt event object
- *
- * \throw InotifyException thrown if the provided pointer is NULL
- */
- bool PeekEvent(InotifyEvent* pEvt) throw (InotifyException);
-
- /// Extracts a queued inotify event (without removing).
- /**
- * The extracted event stays in the queue.
- *
- * \param[in,out] rEvt event object
- *
- * \throw InotifyException thrown only in very anomalous cases
- */
- bool PeekEvent(InotifyEvent& rEvt) throw (InotifyException)
- {
- return PeekEvent(&rEvt);
- }
-
- /// Searches for a watch by a watch descriptor.
- /**
- * It tries to find a watch by the given descriptor.
- *
- * \param[in] iDescriptor watch descriptor
- * \return pointer to a watch; NULL if no such watch exists
- */
- InotifyWatch* FindWatch(int iDescriptor);
-
- /// Searches for a watch by a filesystem path.
- /**
- * It tries to find a watch by the given filesystem path.
- *
- * \param[in] rPath filesystem path
- * \return pointer to a watch; NULL if no such watch exists
- *
- * \attention The path must be exactly identical to the one
- * used for the searched watch. Be careful about
- * absolute/relative and case-insensitive paths.
- */
- InotifyWatch* FindWatch(const std::string& rPath);
-
- /// Returns the file descriptor.
- /**
- * The descriptor can be used in standard low-level file
- * functions (poll(), select(), fcntl() etc.).
- *
- * \return valid file descriptor or -1 for inactive object
- *
- * \sa SetNonBlock()
- */
- inline int GetDescriptor() const
- {
- return m_fd;
- }
-
- /// Enables/disables non-blocking mode.
- /**
- * Use this mode if you want to monitor the descriptor
- * (acquired thru GetDescriptor()) in functions such as
- * poll(), select() etc.
- *
- * Non-blocking mode is disabled by default.
- *
- * \param[in] fNonBlock enable/disable non-blocking mode
- *
- * \throw InotifyException thrown if setting mode failed
- *
- * \sa GetDescriptor(), SetCloseOnExec()
- */
- void SetNonBlock(bool fNonBlock) throw (InotifyException);
-
- /// Enables/disables closing on exec.
- /**
- * Enable this if you want to close the descriptor when
- * executing another program. Otherwise, the descriptor
- * will be inherited.
- *
- * Closing on exec is disabled by default.
- *
- * \param[in] fClOnEx enable/disable closing on exec
- *
- * \throw InotifyException thrown if setting failed
- *
- * \sa GetDescriptor(), SetNonBlock()
- */
- void SetCloseOnExec(bool fClOnEx) throw (InotifyException);
-
- /// Acquires a particular inotify capability/limit.
- /**
- * \param[in] cap capability/limit identifier
- * \return capability/limit value
- * \throw InotifyException thrown if the given value cannot be acquired
- */
- static uint32_t GetCapability(InotifyCapability_t cap) throw (InotifyException);
-
- /// Modifies a particular inotify capability/limit.
- /**
- * \param[in] cap capability/limit identifier
- * \param[in] val new capability/limit value
- * \throw InotifyException thrown if the given value cannot be set
- * \attention Using this function requires root privileges.
- * Beware of setting extensive values - it may seriously
- * affect system performance and/or stability.
- */
- static void SetCapability(InotifyCapability_t cap, uint32_t val) throw (InotifyException);
-
- /// Returns the maximum number of events in the kernel queue.
- /**
- * \return maximum number of events in the kernel queue
- * \throw InotifyException thrown if the given value cannot be acquired
- */
- inline static uint32_t GetMaxEvents() throw (InotifyException)
- {
- return GetCapability(IN_MAX_EVENTS);
- }
-
- /// Sets the maximum number of events in the kernel queue.
- /**
- * \param[in] val new value
- * \throw InotifyException thrown if the given value cannot be set
- * \attention Using this function requires root privileges.
- * Beware of setting extensive values - the greater value
- * is set here the more physical memory may be used for the inotify
- * infrastructure.
- */
- inline static void SetMaxEvents(uint32_t val) throw (InotifyException)
- {
- SetCapability(IN_MAX_EVENTS, val);
- }
-
- /// Returns the maximum number of inotify instances per process.
- /**
- * It means the maximum number of open inotify file descriptors
- * per running process.
- *
- * \return maximum number of inotify instances
- * \throw InotifyException thrown if the given value cannot be acquired
- */
- inline static uint32_t GetMaxInstances() throw (InotifyException)
- {
- return GetCapability(IN_MAX_INSTANCES);
- }
-
- /// Sets the maximum number of inotify instances per process.
- /**
- * \param[in] val new value
- * \throw InotifyException thrown if the given value cannot be set
- * \attention Using this function requires root privileges.
- * Beware of setting extensive values - the greater value
- * is set here the more physical memory may be used for the inotify
- * infrastructure.
- */
- inline static void SetMaxInstances(uint32_t val) throw (InotifyException)
- {
- SetCapability(IN_MAX_INSTANCES, val);
- }
-
- /// Returns the maximum number of inotify watches per instance.
- /**
- * It means the maximum number of inotify watches per inotify
- * file descriptor.
- *
- * \return maximum number of inotify watches
- * \throw InotifyException thrown if the given value cannot be acquired
- */
- inline static uint32_t GetMaxWatches() throw (InotifyException)
- {
- return GetCapability(IN_MAX_WATCHES);
- }
-
- /// Sets the maximum number of inotify watches per instance.
- /**
- * \param[in] val new value
- * \throw InotifyException thrown if the given value cannot be set
- * \attention Using this function requires root privileges.
- * Beware of setting extensive values - the greater value
- * is set here the more physical memory may be used for the inotify
- * infrastructure.
- */
- inline static void SetMaxWatches(uint32_t val) throw (InotifyException)
- {
- SetCapability(IN_MAX_WATCHES, val);
- }
-
-private:
- int m_fd; ///< file descriptor
- IN_WATCH_MAP m_watches; ///< watches (by descriptors)
- IN_WP_MAP m_paths; ///< watches (by paths)
- unsigned char m_buf[INOTIFY_BUFLEN]; ///< buffer for events
- std::deque<InotifyEvent> m_events; ///< event queue
-
- IN_LOCK_DECL
-
- friend class InotifyWatch;
-
- static std::string GetCapabilityPath(InotifyCapability_t cap) throw (InotifyException);
-};
-
-
-#endif //_INOTIFYCXX_H_
-
diff --git a/shared/last_error.cpp b/shared/last_error.cpp
index 8109b669..ea8345bc 100644
--- a/shared/last_error.cpp
+++ b/shared/last_error.cpp
@@ -5,7 +5,7 @@
// **************************************************************************
//
#include "last_error.h"
-#include "string_tools.h"
+#include "string_utf8.h"
#include "i18n.h"
#ifdef FFS_WIN
@@ -16,17 +16,18 @@
#include <cerrno>
#endif
+using namespace zen;
#ifdef FFS_WIN
-wxString zen::getLastErrorFormatted(unsigned long lastError) //try to get additional Windows error information
+std::wstring zen::getLastErrorFormatted(unsigned long lastError) //try to get additional Windows error information
{
//determine error code if none was specified
if (lastError == 0)
lastError = ::GetLastError();
- wxString output = _("Windows Error Code %x:");
- output.Replace(wxT("%x"), zen::toString<wxString>(lastError));
+ std::wstring output = _("Windows Error Code %x:");
+ replace(output, L"%x", toString<std::wstring>(lastError));
LPWSTR buffer = NULL;
if (::FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM |
@@ -36,7 +37,7 @@ wxString zen::getLastErrorFormatted(unsigned long lastError) //try to get additi
{
if (buffer) //just to be sure
{
- output += wxT(" ");
+ output += L" ";
output += buffer;
::LocalFree(buffer);
}
@@ -46,16 +47,17 @@ wxString zen::getLastErrorFormatted(unsigned long lastError) //try to get additi
}
#elif defined FFS_LINUX
-wxString zen::getLastErrorFormatted(int lastError) //try to get additional Linux error information
+std::wstring zen::getLastErrorFormatted(int lastError) //try to get additional Linux error information
{
//determine error code if none was specified
if (lastError == 0)
lastError = errno; //don't use "::", errno is a macro!
- wxString output = _("Linux Error Code %x:");
- output.Replace(wxT("%x"), zen::toString<wxString>(lastError));
+ std::wstring output = _("Linux Error Code %x:");
+ replace(output, L"%x", toString<std::wstring>(lastError));
- output += wxT(" ") + wxString::FromUTF8(::strerror(lastError));
+ output += L" ";
+ output += utf8CvrtTo<std::wstring>(::strerror(lastError));
errno = lastError; //restore errno
return output;
diff --git a/shared/last_error.h b/shared/last_error.h
index 9db41222..b617ebf5 100644
--- a/shared/last_error.h
+++ b/shared/last_error.h
@@ -7,16 +7,16 @@
#ifndef SYSTEMFUNCTIONS_H_INCLUDED
#define SYSTEMFUNCTIONS_H_INCLUDED
-#include <wx/string.h>
+#include <string>
namespace zen
{
//evaluate GetLastError()/errno and assemble specific error message
#ifdef FFS_WIN
-wxString getLastErrorFormatted(unsigned long lastError = 0);
+std::wstring getLastErrorFormatted(unsigned long lastError = 0);
#elif defined FFS_LINUX
-wxString getLastErrorFormatted(int lastError = 0);
+std::wstring getLastErrorFormatted(int lastError = 0);
#endif
}
diff --git a/shared/localization.cpp b/shared/localization.cpp
index 36773fc3..919009d6 100644
--- a/shared/localization.cpp
+++ b/shared/localization.cpp
@@ -12,14 +12,14 @@
#include <wx/ffile.h>
#include <wx/intl.h>
#include <wx/msgdlg.h>
-#include "system_constants.h"
#include "parse_plural.h"
#include "parse_lng.h"
#include "util.h"
#include "string_tools.h"
#include "file_traverser.h"
-#include "../shared/standard_paths.h"
-#include "../shared/string_conv.h"
+#include "standard_paths.h"
+#include "string_conv.h"
+#include "zenXml/zenxml_io.h"
#include "i18n.h"
using namespace zen;
@@ -28,7 +28,7 @@ using namespace zen;
namespace
{
//global objects
-wxString THOUSANDS_SEPARATOR = wxT(",");
+std::wstring THOUSANDS_SEPARATOR = L",";
class FFSLocale : public TranslationHandler
@@ -38,9 +38,9 @@ public:
wxLanguage langId() const { return langId_; }
- virtual wxString thousandsSeparator() { return THOUSANDS_SEPARATOR; };
+ virtual std::wstring thousandsSeparator() { return THOUSANDS_SEPARATOR; };
- virtual wxString translate(const wxString& text)
+ virtual std::wstring translate(const std::wstring& text)
{
//look for translation in buffer table
const Translation::const_iterator iter = transMapping.find(text);
@@ -50,7 +50,7 @@ public:
return text; //fallback
}
- virtual wxString translate(const wxString& singular, const wxString& plural, int n)
+ virtual std::wstring translate(const std::wstring& singular, const std::wstring& plural, int n)
{
TranslationPlural::const_iterator iter = transMappingPl.find(std::make_pair(singular, plural));
if (iter != transMappingPl.end())
@@ -64,8 +64,8 @@ public:
}
private:
- typedef std::map<wxString, wxString> Translation;
- typedef std::map<std::pair<wxString, wxString>, std::vector<wxString> > TranslationPlural;
+ typedef std::map<std::wstring, std::wstring> Translation;
+ typedef std::map<std::pair<std::wstring, std::wstring>, std::vector<std::wstring> > TranslationPlural;
Translation transMapping; //map original text |-> translation
TranslationPlural transMappingPl;
@@ -75,34 +75,17 @@ private:
-std::string getFileStream(const wxString& filename) //return empty string on error throw()
+FFSLocale::FFSLocale(const wxString& filename, wxLanguage languageId) : langId_(languageId) //throw (lngfile::ParsingError, PluralForm::ParsingError)
{
std::string inputStream;
-
- //workaround to get a FILE* from a unicode filename in a portable way
- wxFFile langFile(filename, wxT("rb"));
- if (langFile.IsOpened())
+ try
{
- FILE* fpInput = langFile.fp();
-
- std::vector<char> buffer(50 * 1024);
- size_t bytesRead = 0;
- do
- {
- bytesRead = ::fread(&buffer[0], 1, buffer.size(), fpInput);
- inputStream.append(&buffer[0], bytesRead);
- }
- while (bytesRead == buffer.size());
+ inputStream = loadStream(filename);; //throw XmlFileError
}
- return inputStream;
-}
-
-
-FFSLocale::FFSLocale(const wxString& filename, wxLanguage languageId) : langId_(languageId) //throw (lngfile::ParsingError, PluralForm::ParsingError)
-{
- const std::string inputStream = getFileStream(filename);
- if (inputStream.empty())
+ catch (...)
+ {
throw lngfile::ParsingError(0, 0);
+ }
lngfile::TransHeader header;
lngfile::TranslationMap transInput;
@@ -111,21 +94,21 @@ FFSLocale::FFSLocale(const wxString& filename, wxLanguage languageId) : langId_(
for (lngfile::TranslationMap::const_iterator i = transInput.begin(); i != transInput.end(); ++i)
{
- const wxString original = wxString::FromUTF8(i->first.c_str());
- const wxString translation = wxString::FromUTF8(i->second.c_str());
+ const std::wstring original = utf8CvrtTo<std::wstring>(i->first);
+ const std::wstring translation = utf8CvrtTo<std::wstring>(i->second);
assert(!translation.empty());
transMapping.insert(std::make_pair(original , translation));
}
for (lngfile::TranslationPluralMap::const_iterator i = transPluralInput.begin(); i != transPluralInput.end(); ++i)
{
- const wxString singular = wxString::FromUTF8(i->first.first.c_str());
- const wxString plural = wxString::FromUTF8(i->first.second.c_str());
+ const std::wstring singular = utf8CvrtTo<std::wstring>(i->first.first);
+ const std::wstring plural = utf8CvrtTo<std::wstring>(i->first.second);
const lngfile::PluralForms& plForms = i->second;
- std::vector<wxString> plFormsWide;
+ std::vector<std::wstring> plFormsWide;
for (lngfile::PluralForms::const_iterator j = plForms.begin(); j != plForms.end(); ++j)
- plFormsWide.push_back(wxString::FromUTF8(j->c_str()));
+ plFormsWide.push_back(utf8CvrtTo<std::wstring>(*j));
assert(!plFormsWide.empty());
@@ -144,13 +127,13 @@ public:
virtual void onFile(const Zchar* shortName, const Zstring& fullName, const FileInfo& details)
{
- if (Zstring(shortName).EndsWith(Zstr(".lng")))
+ if (endsWith(fullName, Zstr(".lng")))
lngFiles_.push_back(fullName);
}
virtual void onSymlink(const Zchar* shortName, const Zstring& fullName, const SymlinkInfo& details) {}
virtual ReturnValDir onDir(const Zchar* shortName, const Zstring& fullName) { return Loki::Int2Type<ReturnValDir::TRAVERSING_DIR_IGNORE>(); }
- virtual void onError(const wxString& errorText) {} //errors are not really critical in this context
+ virtual HandleError onError(const std::wstring& errorText) { return TRAV_ERROR_IGNORE; } //errors are not really critical in this context
private:
std::vector<Zstring>& lngFiles_;
@@ -197,32 +180,35 @@ ExistingTranslations::ExistingTranslations()
std::vector<Zstring> lngFiles;
FindLngfiles traverseCallback(lngFiles);
- traverseFolder(wxToZ(zen::getResourceDir() + wxT("Languages")), //throw();
+ traverseFolder(toZ(zen::getResourceDir() + wxT("Languages")), //throw();
false, //don't follow symlinks
traverseCallback);
- for (std::vector<Zstring>::const_iterator i = lngFiles.begin(); i != lngFiles.end(); ++i)
+ for (auto i = lngFiles.begin(); i != lngFiles.end(); ++i)
{
- const std::string stream = getFileStream(zToWx(*i));
- if (!stream.empty())
+ try
+ {
+ std::string stream = loadStream(*i);; //throw XmlFileError
try
{
lngfile::TransHeader lngHeader;
lngfile::parseHeader(stream, lngHeader); //throw ParsingError
- const wxLanguageInfo* locInfo = wxLocale::FindLanguageInfo(wxString::FromUTF8(lngHeader.localeName.c_str()));
+ const wxLanguageInfo* locInfo = wxLocale::FindLanguageInfo(utf8CvrtTo<wxString>(lngHeader.localeName));
if (locInfo)
{
ExistingTranslations::Entry newEntry;
newEntry.languageID = locInfo->Language;
- newEntry.languageName = wxString::FromUTF8(lngHeader.languageName.c_str());
- newEntry.languageFile = zToWx(*i);
- newEntry.translatorName = wxString::FromUTF8(lngHeader.translatorName.c_str());
- newEntry.languageFlag = wxString::FromUTF8(lngHeader.flagFile.c_str());
+ newEntry.languageName = utf8CvrtTo<wxString>(lngHeader.languageName);
+ newEntry.languageFile = toWx(*i);
+ newEntry.translatorName = utf8CvrtTo<wxString>(lngHeader.translatorName);
+ newEntry.languageFlag = utf8CvrtTo<wxString>(lngHeader.flagFile);
locMapping.push_back(newEntry);
}
}
catch (lngfile::ParsingError&) {}
+ }
+ catch (...) {}
}
std::sort(locMapping.begin(), locMapping.end(), LessTranslation());
@@ -375,7 +361,7 @@ public:
const lconv* localInfo = ::localeconv();
//actually these two parameters are language dependent, but we take system setting to handle all kinds of language derivations
- THOUSANDS_SEPARATOR = wxString::FromUTF8(localInfo->thousands_sep);
+ THOUSANDS_SEPARATOR = utf8CvrtTo<wxString>(localInfo->thousands_sep);
// why not working?
// THOUSANDS_SEPARATOR = std::use_facet<std::numpunct<wchar_t> >(std::locale("")).thousands_sep();
diff --git a/shared/notify_removal.cpp b/shared/notify_removal.cpp
new file mode 100644
index 00000000..819604ad
--- /dev/null
+++ b/shared/notify_removal.cpp
@@ -0,0 +1,238 @@
+// **************************************************************************
+// * This file is part of the FreeFileSync project. It is distributed under *
+// * GNU General Public License: http://www.gnu.org/licenses/gpl.html *
+// * Copyright (C) 2008-2011 ZenJu (zhnmju123 AT gmx.de) *
+// **************************************************************************
+//
+#include "notify_removal.h"
+#include <set>
+#include "last_error.h"
+#include "Loki/ScopeGuard.h"
+#include <algorithm>
+#include <boost/bind.hpp>
+#include <dbt.h>
+
+using namespace zen;
+
+
+/*
+//convert bitmask into "real" drive-letter
+Zstring getDriveFromMask(ULONG unitmask)
+{
+ for (int i = 0; i < 26; ++i)
+ {
+ if (unitmask & 0x1)
+ return Zstring() + static_cast<DefaultChar>(DefaultChar('A') + i) + DefaultStr(":\\");
+ unitmask >>= 1;
+ }
+ return Zstring();
+}
+*/
+
+namespace
+{
+bool messageProviderConstructed = false;
+}
+
+
+class MessageProvider //administrates a single dummy window to receive messages
+{
+public:
+ static MessageProvider& instance() //throw (FileError)
+ {
+ static MessageProvider inst;
+ messageProviderConstructed = true;
+ return inst;
+ }
+
+ class Listener
+ {
+ public:
+ virtual ~Listener() {}
+ virtual void onMessage(UINT message, WPARAM wParam, LPARAM lParam) = 0; //throw()!
+ };
+ void registerListener(Listener& l) { listener.insert(&l); }
+ void unregisterListener(Listener& l) { listener.erase(&l); } //don't unregister objects with static lifetime
+
+ HWND getWnd() const { return windowHandle; } //get handle in order to register additional notifications
+
+private:
+ MessageProvider();
+ ~MessageProvider();
+ MessageProvider(const MessageProvider&);
+ MessageProvider& operator=(const MessageProvider&);
+
+ static const wchar_t WINDOW_NAME[];
+
+ friend LRESULT CALLBACK topWndProc(HWND, UINT, WPARAM, LPARAM);
+ void processMessage(UINT message, WPARAM wParam, LPARAM lParam);
+
+ const HINSTANCE process;
+ HWND windowHandle;
+
+ std::set<Listener*> listener;
+};
+
+
+const wchar_t MessageProvider::WINDOW_NAME[] = L"E6AD5EB1-527B-4EEF-AC75-27883B233380"; //random name
+
+
+LRESULT CALLBACK topWndProc(
+ HWND hwnd, //handle to window
+ UINT uMsg, //message identifier
+ WPARAM wParam, //first message parameter
+ LPARAM lParam) //second message parameter
+{
+ if (messageProviderConstructed) //attention: this callback is triggered in the middle of singleton construction! It is a bad idea to to call back at this time!
+ try
+ {
+ MessageProvider::instance().processMessage(uMsg, wParam, lParam); //not supposed to throw
+ }
+ catch (...) {}
+
+ return ::DefWindowProc(hwnd, uMsg, wParam, lParam);
+}
+
+
+MessageProvider::MessageProvider() :
+ process(::GetModuleHandle(NULL)), //get program's module handle
+ windowHandle(NULL)
+{
+ if (process == NULL)
+ throw zen::FileError(std::wstring(L"Could not start monitoring window notifications:") + "\n\n" + getLastErrorFormatted() + " (GetModuleHandle)");
+
+ //register the main window class
+ WNDCLASS wc = {};
+ wc.lpfnWndProc = topWndProc;
+ wc.hInstance = process;
+ wc.lpszClassName = WINDOW_NAME;
+
+ if (::RegisterClass(&wc) == 0)
+ throw zen::FileError(std::wstring(L"Could not start monitoring window notifications:") + "\n\n" + getLastErrorFormatted() + " (RegisterClass)");
+
+ Loki::ScopeGuard guardClass = Loki::MakeGuard(::UnregisterClass, WINDOW_NAME, process);
+
+ //create dummy-window
+ windowHandle = ::CreateWindow(
+ WINDOW_NAME, //LPCTSTR lpClassName OR ATOM in low-order word!
+ NULL, //LPCTSTR lpWindowName,
+ 0, //DWORD dwStyle,
+ 0, //int x,
+ 0, //int y,
+ 0, //int nWidth,
+ 0, //int nHeight,
+ 0, //note: we need a toplevel window to receive device arrival events, not a message-window (HWND_MESSAGE)!
+ NULL, //HMENU hMenu,
+ process, //HINSTANCE hInstance,
+ NULL); //LPVOID lpParam
+ if (windowHandle == NULL)
+ throw zen::FileError(std::wstring(L"Could not start monitoring window notifications:") + "\n\n" + getLastErrorFormatted() + " (CreateWindow)");
+
+ guardClass.Dismiss();
+}
+
+
+MessageProvider::~MessageProvider()
+{
+ //clean-up in reverse order
+ ::DestroyWindow(windowHandle);
+ ::UnregisterClass(WINDOW_NAME, //LPCTSTR lpClassName OR ATOM in low-order word!
+ process); //HINSTANCE hInstance
+}
+
+
+void MessageProvider::processMessage(UINT message, WPARAM wParam, LPARAM lParam)
+{
+ std::for_each(listener.begin(), listener.end(), boost::bind(&Listener::onMessage, _1, message, wParam, lParam));
+}
+//####################################################################################################
+
+
+class NotifyRequestDeviceRemoval::Pimpl : private MessageProvider::Listener
+{
+public:
+ Pimpl(NotifyRequestDeviceRemoval& parent, HANDLE hDir) : //throw (FileError)
+ parent_(parent)
+ {
+ MessageProvider::instance().registerListener(*this); //throw (FileError)
+
+ //register handles to receive notifications
+ DEV_BROADCAST_HANDLE filter = {};
+ filter.dbch_size = sizeof(filter);
+ filter.dbch_devicetype = DBT_DEVTYP_HANDLE;
+ filter.dbch_handle = hDir;
+
+ hNotification = ::RegisterDeviceNotification(
+ MessageProvider::instance().getWnd(), //__in HANDLE hRecipient,
+ &filter, //__in LPVOID NotificationFilter,
+ DEVICE_NOTIFY_WINDOW_HANDLE); //__in DWORD Flags
+ if (hNotification == NULL)
+ {
+ const DWORD lastError = ::GetLastError();
+ if (lastError != ERROR_CALL_NOT_IMPLEMENTED && //fail on SAMBA share: this shouldn't be a showstopper!
+ lastError != ERROR_SERVICE_SPECIFIC_ERROR && //neither should be fail for "Pogoplug" mapped network drives
+ lastError != ERROR_INVALID_DATA) //this seems to happen for a NetDrive-mapped FTP server
+ throw zen::FileError(std::wstring(L"Could not register device removal notifications:") + "\n\n" + getLastErrorFormatted(lastError));
+ }
+ }
+
+ ~Pimpl()
+ {
+ ::UnregisterDeviceNotification(hNotification);
+ MessageProvider::instance().unregisterListener(*this);
+ }
+
+private:
+ Pimpl(Pimpl&);
+ Pimpl& operator=(Pimpl&);
+
+ virtual void onMessage(UINT message, WPARAM wParam, LPARAM lParam) //throw()!
+ {
+ //DBT_DEVICEQUERYREMOVE example: http://msdn.microsoft.com/en-us/library/aa363427(v=VS.85).aspx
+ if (message == WM_DEVICECHANGE)
+ {
+ if ( wParam == DBT_DEVICEQUERYREMOVE ||
+ wParam == DBT_DEVICEQUERYREMOVEFAILED ||
+ wParam == DBT_DEVICEREMOVECOMPLETE)
+ {
+ PDEV_BROADCAST_HDR header = reinterpret_cast<PDEV_BROADCAST_HDR>(lParam);
+ if (header->dbch_devicetype == DBT_DEVTYP_HANDLE)
+ {
+ PDEV_BROADCAST_HANDLE body = reinterpret_cast<PDEV_BROADCAST_HANDLE>(lParam);
+
+#ifdef __MINGW32__
+ const HDEVNOTIFY requestNotification = reinterpret_cast<HDEVNOTIFY>(body->dbch_hdevnotify);
+#else
+ const HDEVNOTIFY requestNotification = body->dbch_hdevnotify;
+#endif
+ if (requestNotification == hNotification) //is it for the notification we registered?
+ switch (wParam)
+ {
+ case DBT_DEVICEQUERYREMOVE:
+ parent_.onRequestRemoval(body->dbch_handle);
+ break;
+ case DBT_DEVICEQUERYREMOVEFAILED:
+ parent_.onRemovalFinished(body->dbch_handle, false);
+ break;
+ case DBT_DEVICEREMOVECOMPLETE:
+ parent_.onRemovalFinished(body->dbch_handle, true);
+ break;
+ }
+ }
+ }
+ }
+ }
+
+ NotifyRequestDeviceRemoval& parent_;
+ HDEVNOTIFY hNotification;
+};
+//####################################################################################################
+
+
+NotifyRequestDeviceRemoval::NotifyRequestDeviceRemoval(HANDLE hDir)
+{
+ pimpl.reset(new Pimpl(*this, hDir));
+}
+
+
+NotifyRequestDeviceRemoval::~NotifyRequestDeviceRemoval() {} //make sure ~auto_ptr() works with complete type
diff --git a/shared/notify_removal.h b/shared/notify_removal.h
new file mode 100644
index 00000000..abdf460b
--- /dev/null
+++ b/shared/notify_removal.h
@@ -0,0 +1,40 @@
+// **************************************************************************
+// * This file is part of the FreeFileSync project. It is distributed under *
+// * GNU General Public License: http://www.gnu.org/licenses/gpl.html *
+// * Copyright (C) 2008-2011 ZenJu (zhnmju123 AT gmx.de) *
+// **************************************************************************
+//
+#ifndef NOTIFY_H_INCLUDED
+#define NOTIFY_H_INCLUDED
+
+#ifndef FFS_WIN
+#error use in windows build only
+#endif
+
+#include <wx/msw/wrapwin.h> //includes "windows.h"
+#include "file_error.h"
+#include <vector>
+#include <memory>
+
+//handle (user-) request for device removal via template method pattern
+//evaluate directly after processing window messages
+class NotifyRequestDeviceRemoval
+{
+public:
+ NotifyRequestDeviceRemoval(HANDLE hDir); //throw FileError
+ virtual ~NotifyRequestDeviceRemoval();
+
+private:
+ virtual void onRequestRemoval(HANDLE hnd) = 0; //throw()!
+ //NOTE: onRemovalFinished is NOT guaranteed to execute after onRequestRemoval()! but most likely will
+ virtual void onRemovalFinished(HANDLE hnd, bool successful) = 0; //throw()!
+
+ NotifyRequestDeviceRemoval(NotifyRequestDeviceRemoval&); //no copying
+ void operator=(NotifyRequestDeviceRemoval&); //
+
+ class Pimpl;
+ std::unique_ptr<Pimpl> pimpl;
+};
+
+
+#endif // NOTIFY_H_INCLUDED
diff --git a/shared/pch.h b/shared/pch.h
index cd6b73cb..06d6b417 100644
--- a/shared/pch.h
+++ b/shared/pch.h
@@ -106,7 +106,6 @@
#include <stdexcept>
//Boost
-#include <memory>
#include <boost/scoped_array.hpp>
#endif //FFS_PRECOMPILED_HEADER
diff --git a/shared/privilege.cpp b/shared/privilege.cpp
index c854ad4e..eaeac866 100644
--- a/shared/privilege.cpp
+++ b/shared/privilege.cpp
@@ -19,10 +19,8 @@ bool Privileges::privilegeIsActive(LPCTSTR privilege) //throw (FileError)
if (!::OpenProcessToken(::GetCurrentProcess(), //__in HANDLE ProcessHandle,
TOKEN_QUERY, //__in DWORD DesiredAccess,
&hToken)) //__out PHANDLE TokenHandle
- {
- const wxString errorMessage = wxString(_("Error setting privilege:")) + wxT(" \"") + privilege + wxT("\"");
- throw FileError(errorMessage + wxT("\n\n") + zen::getLastErrorFormatted());
- }
+ throw FileError(_("Error setting privilege:") + " \"" + privilege + "\"" + "\n\n" + getLastErrorFormatted());
+
Loki::ScopeGuard dummy = Loki::MakeGuard(::CloseHandle, hToken);
(void)dummy; //silence warning "unused variable"
@@ -32,10 +30,7 @@ bool Privileges::privilegeIsActive(LPCTSTR privilege) //throw (FileError)
NULL, //__in_opt LPCTSTR lpSystemName,
privilege, //__in LPCTSTR lpName,
&luid )) //__out PLUID lpLuid
- {
- const wxString errorMessage = wxString(_("Error setting privilege:")) + wxT(" \"") + privilege + wxT("\"");
- throw FileError(errorMessage + wxT("\n\n") + zen::getLastErrorFormatted());
- }
+ throw FileError(_("Error setting privilege:") + " \"" + privilege + "\"" + "\n\n" + getLastErrorFormatted());
PRIVILEGE_SET priv = {};
priv.PrivilegeCount = 1;
@@ -48,10 +43,7 @@ bool Privileges::privilegeIsActive(LPCTSTR privilege) //throw (FileError)
hToken, //__in HANDLE ClientToken,
&priv, //__inout PPRIVILEGE_SET RequiredPrivileges,
&alreadyGranted)) //__out LPBOOL pfResult
- {
- const wxString errorMessage = wxString(_("Error setting privilege:")) + wxT(" \"") + privilege + wxT("\"");
- throw FileError(errorMessage + wxT("\n\n") + zen::getLastErrorFormatted());
- }
+ throw FileError(_("Error setting privilege:") + " \"" + privilege + "\"" + "\n\n" + getLastErrorFormatted());
return alreadyGranted == TRUE;
}
@@ -63,10 +55,8 @@ void Privileges::setPrivilege(LPCTSTR privilege, bool enable) //throw (FileError
if (!::OpenProcessToken(::GetCurrentProcess(), //__in HANDLE ProcessHandle,
TOKEN_ADJUST_PRIVILEGES, //__in DWORD DesiredAccess,
&hToken)) //__out PHANDLE TokenHandle
- {
- const wxString errorMessage = wxString(_("Error setting privilege:")) + wxT(" \"") + privilege + wxT("\"");
- throw FileError(errorMessage + wxT("\n\n") + zen::getLastErrorFormatted());
- }
+ throw FileError(_("Error setting privilege:") + " \"" + privilege + "\"" + "\n\n" + getLastErrorFormatted());
+
Loki::ScopeGuard dummy = Loki::MakeGuard(::CloseHandle, hToken);
(void)dummy; //silence warning "unused variable"
@@ -75,10 +65,7 @@ void Privileges::setPrivilege(LPCTSTR privilege, bool enable) //throw (FileError
NULL, //__in_opt LPCTSTR lpSystemName,
privilege, //__in LPCTSTR lpName,
&luid )) //__out PLUID lpLuid
- {
- const wxString errorMessage = wxString(_("Error setting privilege:")) + wxT(" \"") + privilege + wxT("\"");
- throw FileError(errorMessage + wxT("\n\n") + zen::getLastErrorFormatted());
- }
+ throw FileError(_("Error setting privilege:") + " \"" + privilege + "\"" + "\n\n" + getLastErrorFormatted());
TOKEN_PRIVILEGES tp = {};
tp.PrivilegeCount = 1;
@@ -92,14 +79,8 @@ void Privileges::setPrivilege(LPCTSTR privilege, bool enable) //throw (FileError
0, //__in DWORD BufferLength,
NULL, //__out_opt PTOKEN_PRIVILEGES PreviousState,
NULL)) //__out_opt PDWORD ReturnLength
- {
- const wxString errorMessage = wxString(_("Error setting privilege:")) + wxT(" \"") + privilege + wxT("\"");
- throw FileError(errorMessage + wxT("\n\n") + zen::getLastErrorFormatted());
- }
+ throw FileError(_("Error setting privilege:") + " \"" + privilege + "\"" + "\n\n" + getLastErrorFormatted());
if (::GetLastError() == ERROR_NOT_ALL_ASSIGNED) //check although previous function returned with success!
- {
- const wxString errorMessage = wxString(_("Error setting privilege:")) + wxT(" \"") + privilege + wxT("\"");
- throw FileError(errorMessage + wxT("\n\n") + zen::getLastErrorFormatted());
- }
+ throw FileError(_("Error setting privilege:") + " \"" + privilege + "\"" + "\n\n" + getLastErrorFormatted());
}
diff --git a/shared/privilege.h b/shared/privilege.h
index 3085c8c8..6ac99e6f 100644
--- a/shared/privilege.h
+++ b/shared/privilege.h
@@ -45,8 +45,8 @@ private:
catch(...) {}
}
- static bool privilegeIsActive(LPCTSTR privilege); //throw (FileError)
- static void setPrivilege(LPCTSTR privilege, bool enable); //throw (FileError)
+ static bool privilegeIsActive(LPCTSTR privilege); //throw FileError
+ static void setPrivilege(LPCTSTR privilege, bool enable); //throw FileError
typedef std::map<Zstring, bool> PrivBuffType; //bool: enabled by this application
diff --git a/shared/recycler.cpp b/shared/recycler.cpp
index 32de3f33..cc216d4f 100644
--- a/shared/recycler.cpp
+++ b/shared/recycler.cpp
@@ -8,7 +8,6 @@
#include <stdexcept>
#include <iterator>
#include "i18n.h"
-#include "string_conv.h"
#ifdef FFS_WIN
#include "dll_loader.h"
@@ -26,26 +25,26 @@
#include <giomm/file.h>
#endif
+using namespace zen;
+
namespace
{
#ifdef FFS_WIN
-const std::wstring& getRecyclerDllName()
+inline
+std::wstring getRecyclerDllName()
{
- static const std::wstring filename(
- util::is64BitBuild ?
- L"FileOperation_x64.dll":
- L"FileOperation_Win32.dll");
-
assert_static(util::is32BitBuild || util::is64BitBuild);
- return filename;
+ return util::is64BitBuild ?
+ L"FileOperation_x64.dll":
+ L"FileOperation_Win32.dll";
}
bool vistaOrLater()
{
- OSVERSIONINFO osvi;
+ OSVERSIONINFO osvi = {};
ZeroMemory(&osvi, sizeof(OSVERSIONINFO));
osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
@@ -90,15 +89,15 @@ void moveToWindowsRecycler(const std::vector<Zstring>& filesToDelete) //throw (
static MoveToRecycleBinFct moveToRecycler = NULL;
if (!moveToRecycler)
- moveToRecycler = util::getDllFun<MoveToRecycleBinFct>(getRecyclerDllName().c_str(), moveToRecycleBinFctName);
+ moveToRecycler = util::getDllFun<MoveToRecycleBinFct>(getRecyclerDllName(), moveToRecycleBinFctName);
static GetLastErrorFct getLastError = NULL;
if (!getLastError)
- getLastError = util::getDllFun<GetLastErrorFct>(getRecyclerDllName().c_str(), getLastErrorFctName);
+ getLastError = util::getDllFun<GetLastErrorFct>(getRecyclerDllName(), getLastErrorFctName);
if (moveToRecycler == NULL || getLastError == NULL)
- throw FileError(wxString(_("Error moving to Recycle Bin:")) + wxT("\n\"") + fileNames[0] + wxT("\"") + //report first file only... better than nothing
- wxT("\n\n") + wxString(_("Could not load a required DLL:")) + wxT(" \"") + getRecyclerDllName().c_str() + wxT("\""));
+ throw FileError(_("Error moving to Recycle Bin:") + "\n\"" + fileNames[0] + "\"" + //report first file only... better than nothing
+ "\n\n" + _("Could not load a required DLL:") + " \"" + getRecyclerDllName() + "\"");
//#warning moving long file paths to recycler does not work! clarify!
// std::vector<Zstring> temp;
@@ -110,8 +109,8 @@ void moveToWindowsRecycler(const std::vector<Zstring>& filesToDelete) //throw (
{
wchar_t errorMessage[2000];
getLastError(errorMessage, 2000);
- throw FileError(wxString(_("Error moving to Recycle Bin:")) + wxT("\n\"") + fileNames[0] + wxT("\"") + //report first file only... better than nothing
- wxT("\n\n") + wxT("(") + errorMessage + wxT(")"));
+ throw FileError(_("Error moving to Recycle Bin:") + "\n\"" + fileNames[0] + "\"" + //report first file only... better than nothing
+ "\n\n" + "(" + errorMessage + ")");
}
}
else //regular recycle bin usage: available since XP
@@ -136,9 +135,9 @@ void moveToWindowsRecycler(const std::vector<Zstring>& filesToDelete) //throw (
fileOp.hNameMappings = NULL;
fileOp.lpszProgressTitle = NULL;
- if (SHFileOperation(&fileOp) != 0 || fileOp.fAnyOperationsAborted)
+ if (::SHFileOperation(&fileOp) != 0 || fileOp.fAnyOperationsAborted)
{
- throw FileError(wxString(_("Error moving to Recycle Bin:")) + wxT("\n\"") + filenameDoubleNull.c_str() + wxT("\"")); //report first file only... better than nothing
+ throw FileError(_("Error moving to Recycle Bin:") + "\n\"" + filenameDoubleNull.c_str() + "\""); //report first file only... better than nothing
}
}
}
@@ -167,34 +166,45 @@ bool zen::moveToRecycleBin(const Zstring& fileToDelete) //throw (FileError)
if (::lstat(fileToDelete.c_str(), &fileInfo) != 0)
return false; //neither file nor any other object with that name existing: no error situation, manual deletion relies on it!
-
Glib::RefPtr<Gio::File> fileObj = Gio::File::create_for_path(fileToDelete.c_str()); //never fails
-
try
{
if (!fileObj->trash())
- throw FileError(wxString(_("Error moving to Recycle Bin:")) + wxT("\n\"") + zToWx(fileToDelete) + wxT("\"") +
- wxT("\n\n") + wxT("(") + wxT("unknown error") + wxT(")"));
+ throw FileError(_("Error moving to Recycle Bin:") + "\n\"" + fileToDelete + "\"" +
+ "\n\n" + "(unknown error)");
}
catch (const Glib::Error& errorObj)
{
//assemble error message
- const wxString errorMessage = wxString(wxT("Glib Error Code ")) + wxString::Format(wxT("%i"), errorObj.code()) + wxT(", ") +
- wxString::FromUTF8(g_quark_to_string(errorObj.domain())) + wxT(": ") + wxString::FromUTF8(errorObj.what().c_str());
+ const std::wstring errorMessage = L"Glib Error Code " + toString<std::wstring>(errorObj.code()) + ", " +
+ g_quark_to_string(errorObj.domain()) + ": " + errorObj.what();
- throw FileError(wxString(_("Error moving to Recycle Bin:")) + wxT("\n\"") + zToWx(fileToDelete) + wxT("\"") +
- wxT("\n\n") + wxT("(") + errorMessage + wxT(")"));
+ throw FileError(_("Error moving to Recycle Bin:") + "\n\"" + fileToDelete + "\"" +
+ "\n\n" + "(" + errorMessage + ")");
}
#endif
return true;
}
-bool zen::recycleBinExists()
-{
#ifdef FFS_WIN
- return true;
-#elif defined FFS_LINUX
- return true;
-#endif
+zen::StatusRecycler zen::recycleBinExists(const Zstring& pathName)
+{
+ std::vector<wchar_t> buffer(MAX_PATH + 1);
+ if (::GetVolumePathName(applyLongPathPrefix(pathName).c_str(), //__in LPCTSTR lpszFileName,
+ &buffer[0], //__out LPTSTR lpszVolumePathName,
+ static_cast<DWORD>(buffer.size()))) //__in DWORD cchBufferLength
+ {
+ Zstring rootPath =&buffer[0];
+ if (!rootPath.EndsWith(FILE_NAME_SEPARATOR)) //a trailing backslash is required
+ rootPath += FILE_NAME_SEPARATOR;
+
+ SHQUERYRBINFO recInfo = {};
+ recInfo.cbSize = sizeof(recInfo);
+ HRESULT rv = ::SHQueryRecycleBin(rootPath.c_str(), //__in_opt LPCTSTR pszRootPath,
+ &recInfo); //__inout LPSHQUERYRBINFO pSHQueryRBInfo
+ return rv == S_OK ? STATUS_REC_EXISTS : STATUS_REC_MISSING;
+ }
+ return STATUS_REC_UNKNOWN;
}
+#endif
diff --git a/shared/recycler.h b/shared/recycler.h
index 85df6f41..da6e3123 100644
--- a/shared/recycler.h
+++ b/shared/recycler.h
@@ -30,10 +30,20 @@ Linker flag:
`pkg-config --libs gtkmm-2.4`
*/
-bool recycleBinExists(); //test existence of Recycle Bin API on current system
-
//move a file or folder to Recycle Bin
bool moveToRecycleBin(const Zstring& fileToDelete); //return "true" if file/dir was actually deleted; throw (FileError)
+
+
+#ifdef FFS_WIN
+enum StatusRecycler
+{
+ STATUS_REC_EXISTS,
+ STATUS_REC_MISSING,
+ STATUS_REC_UNKNOWN
+};
+
+StatusRecycler recycleBinExists(const Zstring& pathName); //test existence of Recycle Bin API for certain path
+#endif
}
#endif // RECYCLER_H_INCLUDED
diff --git a/shared/resolve_path.cpp b/shared/resolve_path.cpp
index 95c84e1a..19dc0011 100644
--- a/shared/resolve_path.cpp
+++ b/shared/resolve_path.cpp
@@ -2,7 +2,6 @@
#include <wx/utils.h>
#include <wx/datetime.h>
#include "string_conv.h"
-#include "system_constants.h"
#include "loki/ScopeGuard.h"
#ifdef FFS_WIN
@@ -17,7 +16,6 @@
#endif
using namespace zen;
-using namespace common;
namespace
@@ -73,29 +71,22 @@ bool replaceMacro(wxString& macro) //macro without %-characters, return true if
return true;
}
- if (macro.CmpNoCase(wxT("weekday")) == 0)
+ auto processPhrase = [&](const wchar_t* phrase, const wchar_t* format) -> bool
{
- macro = wxDateTime::Now().Format(wxT("%A"));
+ if (macro.CmpNoCase(phrase) != 0)
+ return false;
+ macro = wxDateTime::Now().Format(format);
return true;
- }
-
- if (macro.CmpNoCase(wxT("month")) == 0)
- {
- macro = wxDateTime::Now().Format(wxT("%B"));
- return true;
- }
-
- if (macro.CmpNoCase(wxT("week")) == 0)
- {
- macro = wxDateTime::Now().Format(wxT("%U"));
- return true;
- }
+ };
- if (macro.CmpNoCase(wxT("year")) == 0)
- {
- macro = wxDateTime::Now().Format(wxT("%Y"));
- return true;
- }
+ if (processPhrase(L"weekday", L"%A")) return true;
+ if (processPhrase(L"day" , L"%d")) return true;
+ if (processPhrase(L"month" , L"%B")) return true;
+ if (processPhrase(L"week" , L"%U")) return true;
+ if (processPhrase(L"year" , L"%Y")) return true;
+ if (processPhrase(L"hour" , L"%H")) return true;
+ if (processPhrase(L"min" , L"%M")) return true;
+ if (processPhrase(L"sec" , L"%S")) return true;
//try to apply environment variables
wxString envValue;
@@ -163,7 +154,7 @@ public:
devices_.insert(std::make_pair(shortName, fullName));
return Loki::Int2Type<ReturnValDir::TRAVERSING_DIR_IGNORE>(); //DON'T traverse into subdirs
}
- virtual void onError(const wxString& errorText) {}
+ virtual HandleError onError(const std::wstring& errorText) { return TRAV_ERROR_IGNORE; }
private:
DeviceList& devices_;
@@ -285,10 +276,10 @@ Zstring zen::getFormattedDirectoryName(const Zstring& dirname)
//Formatting is needed since functions expect the directory to end with '\' to be able to split the relative names.
//note: don't combine directory formatting with wxFileName, as it doesn't respect //?/ - prefix!
- wxString dirnameTmp = zToWx(dirname);
+ wxString dirnameTmp = toWx(dirname);
expandMacros(dirnameTmp);
- Zstring output = wxToZ(dirnameTmp);
+ Zstring output = toZ(dirnameTmp);
expandVolumeName(output);
diff --git a/shared/serialize.cpp b/shared/serialize.cpp
index 634b830b..c2da1202 100644
--- a/shared/serialize.cpp
+++ b/shared/serialize.cpp
@@ -12,8 +12,7 @@ using namespace zen;
void ReadInputStream::throwReadError() const //throw (FileError)
{
- throw zen::FileError(wxString(_("Error reading from synchronization database:")) + wxT(" \n") +
- wxT("\"") + errorObjName_ + wxT("\""));
+ throw zen::FileError(_("Error reading from synchronization database:") + " \n" + "\"" + errorObjName_.c_str() + "\"");
}
@@ -35,8 +34,7 @@ ReadInputStream::CharArray ReadInputStream::readArrayC() const
//--------------------------------------------------------------------------------------------------------
void WriteOutputStream::throwWriteError() const //throw (FileError)
{
- throw zen::FileError(wxString(_("Error writing to synchronization database:")) + wxT(" \n") +
- wxT("\"") + errorObjName_ + wxT("\""));
+ throw zen::FileError(_("Error writing to synchronization database:") + " \n" + "\"" + errorObjName_.c_str() + "\"");
}
diff --git a/shared/shadow.cpp b/shared/shadow.cpp
index 5827badd..948050b6 100644
--- a/shared/shadow.cpp
+++ b/shared/shadow.cpp
@@ -6,30 +6,27 @@
//
#include "shadow.h"
#include <wx/msw/wrapwin.h> //includes "windows.h"
-#include "system_constants.h"
#include "i18n.h"
#include "dll_loader.h"
#include <stdexcept>
#include "assert_static.h"
#include "build_info.h"
#include "ShadowCopy\shadow.h"
-#include "string_conv.h"
#include "Loki/ScopeGuard.h"
using shadow::ShadowCopy;
-using shadow::WaitingForShadow;
-using zen::FileError;
+using namespace zen;
namespace
{
bool newerThanXP()
{
- OSVERSIONINFO osvi;
+ OSVERSIONINFO osvi = {};
ZeroMemory(&osvi, sizeof(OSVERSIONINFO));
osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
- if (GetVersionEx(&osvi))
+ if (::GetVersionEx(&osvi))
return osvi.dwMajorVersion > 5 ||
(osvi.dwMajorVersion == 5 && osvi.dwMinorVersion > 1) ;
//XP has majorVersion == 5, minorVersion == 1
@@ -60,7 +57,8 @@ bool runningWOW64() //test if process is running under WOW64 (reference http://m
}
-const std::wstring& getShadowDllName()
+inline
+std::wstring getShadowDllName()
{
/*
distinguish a bunch of VSS builds: we use XP and Server 2003 implementations...
@@ -69,24 +67,17 @@ const std::wstring& getShadowDllName()
assert_static(util::is32BitBuild || util::is64BitBuild);
- static const std::wstring filename(
- newerThanXP() ?
- (util::is64BitBuild ?
- L"Shadow_Server2003_x64.dll" :
- L"Shadow_Server2003_Win32.dll") :
+ return newerThanXP() ?
+ (util::is64BitBuild ?
+ L"Shadow_Server2003_x64.dll" :
+ L"Shadow_Server2003_Win32.dll") :
- (util::is64BitBuild ?
- L"Shadow_XP_x64.dll" :
- L"Shadow_XP_Win32.dll"));
-
-
- return filename;
+ (util::is64BitBuild ?
+ L"Shadow_XP_x64.dll" :
+ L"Shadow_XP_Win32.dll");
}
}
-
-//#############################################################################################################
-ShadowCopy::ShadowCopy(WaitingForShadow* callback) : callback_(callback) {}
//#############################################################################################################
@@ -107,14 +98,14 @@ public:
//check if shadow copy dll was loaded correctly
if (createShadowCopy == NULL ||
releaseShadowCopy == NULL)
- throw FileError(wxString(_("Error starting Volume Shadow Copy Service!")) + wxT("\n") +
- _("Could not load a required DLL:") + wxT(" \"") + getShadowDllName().c_str() + wxT("\""));
+ throw FileError(_("Error starting Volume Shadow Copy Service!") + "\n" +
+ _("Could not load a required DLL:") + " \"" + getShadowDllName() + "\"");
//VSS does not support running under WOW64 except for Windows XP and Windows Server 2003
//(Reference: http://msdn.microsoft.com/en-us/library/aa384627(VS.85).aspx)
static const bool wow64Active = runningWOW64();
if (wow64Active)
- throw FileError(wxString(_("Error starting Volume Shadow Copy Service!")) + wxT("\n") +
+ throw FileError(_("Error starting Volume Shadow Copy Service!") + "\n" +
_("Making shadow copies on WOW64 is not supported. Please use FreeFileSync 64-bit version."));
//---------------------------------------------------------------------------------------------------------
@@ -129,10 +120,10 @@ public:
&backupHandle,
errorMessage,
1000))
- throw FileError(wxString(_("Error starting Volume Shadow Copy Service!")) + wxT("\n") +
- wxT("(") + errorMessage + wxT(" Volume: \"") + volumeNameFormatted.c_str() + wxT("\")"));
+ throw FileError(_("Error starting Volume Shadow Copy Service!") + "\n" +
+ "(" + errorMessage + " Volume: \"" + volumeNameFormatted + "\")");
- shadowVol = Zstring(shadowVolName) + common::FILE_NAME_SEPARATOR; //shadowVolName NEVER has a trailing backslash
+ shadowVol = Zstring(shadowVolName) + FILE_NAME_SEPARATOR; //shadowVolName NEVER has a trailing backslash
}
~ShadowVolume()
@@ -172,19 +163,19 @@ Zstring ShadowCopy::makeShadowCopy(const Zstring& inputFile)
if (!::GetVolumePathName(inputFile.c_str(), //__in LPCTSTR lpszFileName,
volumeNameRaw, //__out LPTSTR lpszVolumePathName,
1000)) //__in DWORD cchBufferLength
- throw FileError(wxString(_("Could not determine volume name for file:")) + wxT("\n\"") + zToWx(inputFile) + wxT("\""));
+ throw FileError(_("Could not determine volume name for file:") + "\n\"" + inputFile + "\"");
Zstring volumeNameFormatted = volumeNameRaw;
- if (!volumeNameFormatted.EndsWith(common::FILE_NAME_SEPARATOR))
- volumeNameFormatted += common::FILE_NAME_SEPARATOR;
+ if (!volumeNameFormatted.EndsWith(FILE_NAME_SEPARATOR))
+ volumeNameFormatted += FILE_NAME_SEPARATOR;
//input file is always absolute! directory formatting takes care of this! Therefore volume name can always be found.
const size_t pos = inputFile.find(volumeNameFormatted); //inputFile needs NOT to begin with volumeNameFormatted: consider for example \\?\ prefix!
if (pos == Zstring::npos)
{
- wxString msg = _("Volume name %x not part of filename %y!");
- msg.Replace(wxT("%x"), wxString(wxT("\"")) + zToWx(volumeNameFormatted) + wxT("\""), false);
- msg.Replace(wxT("%y"), wxString(wxT("\"")) + zToWx(inputFile) + wxT("\""), false);
+ std::wstring msg = _("Volume name %x not part of filename %y!");
+ replace(msg, L"%x", std::wstring(L"\"") + volumeNameFormatted + "\"", false);
+ replace(msg, L"%y", std::wstring(L"\"") + inputFile + "\"", false);
throw FileError(msg);
}
diff --git a/shared/shadow.h b/shared/shadow.h
index 05748fd7..edea4377 100644
--- a/shared/shadow.h
+++ b/shared/shadow.h
@@ -19,18 +19,10 @@ use in windows build only!
namespace shadow
{
-struct WaitingForShadow
-{
- virtual ~WaitingForShadow() {}
- virtual void requestUiRefresh() = 0; //allowed to throw exceptions
- virtual void reportInfo(const Zstring& text) = 0;
-};
-
-
class ShadowCopy //buffer access to Windows Volume Shadow Copy Service
{
public:
- ShadowCopy(WaitingForShadow* callback);
+ ShadowCopy() {}
Zstring makeShadowCopy(const Zstring& inputFile); //throw(FileError); returns filename on shadow copy
@@ -38,8 +30,6 @@ private:
ShadowCopy(const ShadowCopy&);
ShadowCopy& operator=(const ShadowCopy&);
- WaitingForShadow* callback_;
-
class ShadowVolume;
typedef std::map<Zstring, std::shared_ptr<ShadowVolume>, LessFilename> VolNameShadowMap;
VolNameShadowMap shadowVol;
diff --git a/shared/standard_paths.cpp b/shared/standard_paths.cpp
index 44deafff..928dedcc 100644
--- a/shared/standard_paths.cpp
+++ b/shared/standard_paths.cpp
@@ -6,7 +6,6 @@
//
#include "standard_paths.h"
#include <wx/stdpaths.h>
-#include "system_constants.h"
#include "string_conv.h"
using namespace zen;
@@ -16,14 +15,14 @@ namespace
{
const wxString& getBinaryDir() //directory containing executable WITH path separator at end
{
- static wxString instance = zToWx(wxToZ(wxStandardPaths::Get().GetExecutablePath()).BeforeLast(common::FILE_NAME_SEPARATOR) + common::FILE_NAME_SEPARATOR);
+ static wxString instance = beforeLast(wxStandardPaths::Get().GetExecutablePath(), FILE_NAME_SEPARATOR) + toWx(Zstring(FILE_NAME_SEPARATOR));
return instance;
}
#ifdef FFS_WIN
wxString getInstallDir() //root install directory WITH path separator at end
{
- return getBinaryDir().BeforeLast(common::FILE_NAME_SEPARATOR).BeforeLast(common::FILE_NAME_SEPARATOR) + common::FILE_NAME_SEPARATOR;
+ return getBinaryDir().BeforeLast(FILE_NAME_SEPARATOR).BeforeLast(FILE_NAME_SEPARATOR) + FILE_NAME_SEPARATOR;
}
#endif
}
@@ -51,8 +50,8 @@ wxString zen::getResourceDir()
{
wxString resourceDir = wxStandardPathsBase::Get().GetResourcesDir();
- if (!resourceDir.EndsWith(zToWx(common::FILE_NAME_SEPARATOR)))
- resourceDir += zToWx(common::FILE_NAME_SEPARATOR);
+ if (!endsWith(resourceDir, FILE_NAME_SEPARATOR))
+ resourceDir += FILE_NAME_SEPARATOR;
return resourceDir;
}
@@ -66,7 +65,7 @@ wxString zen::getConfigDir()
#ifdef FFS_WIN
return getInstallDir();
#elif defined FFS_LINUX
- //wxString(wxT(".")) + zToWx(common::FILE_NAME_SEPARATOR) -> don't use current working directory
+ //wxString(wxT(".")) + zToWx(FILE_NAME_SEPARATOR) -> don't use current working directory
//avoid surprises with GlobalSettings.xml being newly created in each working directory
return getBinaryDir();
#endif
@@ -77,8 +76,8 @@ wxString zen::getConfigDir()
if (!wxDirExists(userDirectory))
::wxMkdir(userDirectory); //only top directory needs to be created: no recursion necessary
- if (!userDirectory.EndsWith(zToWx(common::FILE_NAME_SEPARATOR)))
- userDirectory += zToWx(common::FILE_NAME_SEPARATOR);
+ if (!endsWith(userDirectory, FILE_NAME_SEPARATOR))
+ userDirectory += FILE_NAME_SEPARATOR;
return userDirectory;
}
diff --git a/shared/string_conv.h b/shared/string_conv.h
index cdfdbbfa..477dda8c 100644
--- a/shared/string_conv.h
+++ b/shared/string_conv.h
@@ -13,105 +13,13 @@
namespace zen
{
-//conversion from Zstring to wxString
-wxString zToWx(const Zstring& str);
-wxString zToWx(const Zchar* str);
-wxString zToWx(Zchar ch);
-//conversion from wxString to Zstring
-Zstring wxToZ(const wxString& str);
-Zstring wxToZ(const wxChar* str);
-Zstring wxToZ(wxChar ch);
+inline wxString operator+(const wxString& lhs, const char* rhs) { return wxString(lhs) += utf8CvrtTo<wxString>(rhs); }
+inline wxString operator+(const wxString& lhs, const Zstring& rhs) { return wxString(lhs) += utf8CvrtTo<wxString>(rhs); }
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-//---------------Inline Implementation---------------------------------------------------
-inline
-wxString zToWx(const Zstring& str)
-{
-#ifdef FFS_WIN
- return cvrtString<wxString>(str);
-#elif defined FFS_LINUX
- return utf8ToWide<wxString>(str);
-#endif
-}
-
-
-inline
-wxString zToWx(const Zchar* str)
-{
-#ifdef FFS_WIN
- return cvrtString<wxString>(str);
-#elif defined FFS_LINUX
- return utf8ToWide<wxString>(str);
-#endif
-}
-
-
-inline
-wxString zToWx(Zchar ch)
-{
-#ifdef FFS_WIN
- return cvrtString<wxString>(ch);
-#elif defined FFS_LINUX
- return utf8ToWide<wxString>(ch);
-#endif
-}
-
-//-----------------------------------------------------------------
-inline
-Zstring wxToZ(const wxString& str)
-{
-#ifdef FFS_WIN
- return cvrtString<Zstring>(str);
-#elif defined FFS_LINUX
- return wideToUtf8<Zstring>(str);
-#endif
-}
-
-
-inline
-Zstring wxToZ(const wxChar* str)
-{
-#ifdef FFS_WIN
- return cvrtString<Zstring>(str);
-#elif defined FFS_LINUX
- return wideToUtf8<Zstring>(str);
-#endif
-}
-
-
-inline
-Zstring wxToZ(wxChar ch)
-{
-#ifdef FFS_WIN
- return cvrtString<Zstring>(ch);
-#elif defined FFS_LINUX
- return wideToUtf8<Zstring>(ch);
-#endif
-}
+//conversion between Zstring and wxString
+inline wxString toWx(const Zstring& str) { return utf8CvrtTo<wxString>(str); }
+inline Zstring toZ(const wxString& str) { return utf8CvrtTo<Zstring>(str); }
}
#endif // STRINGCONV_H_INCLUDED
diff --git a/shared/string_utf8.h b/shared/string_utf8.h
index f6f12d8f..26f4c3f2 100644
--- a/shared/string_utf8.h
+++ b/shared/string_utf8.h
@@ -15,20 +15,22 @@
namespace zen
{
-//Example: std::string tmp = toUtf8<std::string>(L"abc");
+//convert any(!) "string-like" object into target string by applying a UTF8 conversion (only if necessary!)
+template <class TargetString, class SourceString> TargetString utf8CvrtTo(const SourceString& str);
+
+//convert wide to utf8 string; example: std::string tmp = toUtf8<std::string>(L"abc");
template <class CharString, class WideString>
CharString wideToUtf8(const WideString& str);
-//Example: std::wstring tmp = utf8To<std::wstring>("abc");
+//convert utf8 string to wide; example: std::wstring tmp = utf8To<std::wstring>("abc");
template <class WideString, class CharString>
WideString utf8ToWide(const CharString& str);
const char BYTE_ORDER_MARK_UTF8[] = "\xEF\xBB\xBF";
-//convert any(!) "string-like" object into a UTF8 encoded std::string
-template <class String> std::string toStdString(const String& str);
-//convert a UTF8 encoded std::string to any(!) string-class
-template <class String> String stdStringTo(const std::string& str);
+
+
+
@@ -190,7 +192,7 @@ Function utf8ToCodePoint(CharIterator first, CharIterator last, Function f) //f
};
CodePoint cp = static_cast<Char8>(*first);
- switch (getUtf8Len(cp))
+ switch (getUtf8Len(static_cast<Char8>(cp)))
{
case 1:
break;
@@ -238,13 +240,13 @@ template <class String>
class AppendStringIterator: public std::iterator<std::output_iterator_tag, void, void, void, void>
{
public:
- explicit AppendStringIterator (String& x) : str(x) {}
- AppendStringIterator& operator= (typename String::value_type value) { str += value; return *this; }
+ explicit AppendStringIterator (String& x) : str(&x) {}
+ AppendStringIterator& operator= (typename String::value_type value) { *str += value; return *this; }
AppendStringIterator& operator* () { return *this; }
AppendStringIterator& operator++ () { return *this; }
AppendStringIterator operator++ (int) { return *this; }
private:
- String& str;
+ String* str;
};
@@ -310,24 +312,24 @@ CharString wideToUtf8(const WideString& str)
//-------------------------------------------------------------------------------------------
-template <class String> inline
-std::string toStdString(const String& str, wchar_t) { return wideToUtf8<std::string>(str); } //convert wide character string to UTF8
+template <class TargetString, class SourceString> inline
+TargetString utf8CvrtTo(const SourceString& str, char, wchar_t) { return utf8ToWide<TargetString>(str); }
-template <class String> inline
-std::string toStdString(const String& str, char) { return cvrtString<std::string>(str); } //directly process string without UTF8 conversion
+template <class TargetString, class SourceString> inline
+TargetString utf8CvrtTo(const SourceString& str, wchar_t, char) { return wideToUtf8<TargetString>(str); }
-template <class String> inline
-std::string toStdString(const String& str) { return toStdString(str, typename StringTraits<String>::CharType()); }
-//-------------------------------------------------------------------------------------------
-
-template <class String> inline
-String stdStringTo(const std::string& str, wchar_t) { return utf8ToWide<String>(str); } //convert UTF8 to wide character string
+template <class TargetString, class SourceString> inline
+TargetString utf8CvrtTo(const SourceString& str, char, char) { return cvrtString<TargetString>(str); }
-template <class String> inline
-String stdStringTo(const std::string& str, char) { return cvrtString<String>(str); } //directly process string without UTF8 conversion
+template <class TargetString, class SourceString> inline
+TargetString utf8CvrtTo(const SourceString& str, wchar_t, wchar_t) { return cvrtString<TargetString>(str); }
-template <class String> inline
-String stdStringTo(const std::string& str) { return stdStringTo<String>(str, typename StringTraits<String>::CharType()); }
+template <class TargetString, class SourceString> inline
+TargetString utf8CvrtTo(const SourceString& str)
+{
+ return utf8CvrtTo<TargetString>(str, typename StringTraits<SourceString>::CharType(),
+ typename StringTraits<TargetString>::CharType());
+}
}
#endif //STRING_UTF8_HEADER_01832479146991573473545
diff --git a/shared/symlink_target.h b/shared/symlink_target.h
index 0e98b951..e3a75f81 100644
--- a/shared/symlink_target.h
+++ b/shared/symlink_target.h
@@ -9,7 +9,6 @@
#include "loki/ScopeGuard.h"
#include "last_error.h"
-#include "string_conv.h"
#include "file_error.h"
#include "i18n.h"
@@ -63,19 +62,18 @@ namespace
//retrieve raw target data of symlink or junction
Zstring getSymlinkRawTargetString(const Zstring& linkPath) //throw (FileError)
{
- using zen::zToWx;
- using zen::FileError;
+ using namespace zen;
#ifdef FFS_WIN
//FSCTL_GET_REPARSE_POINT: http://msdn.microsoft.com/en-us/library/aa364571(VS.85).aspx
try //reading certain symlinks requires admin rights! This shall not cause an error in user mode!
{
//allow access to certain symbolic links/junctions
- zen::Privileges::getInstance().ensureActive(SE_BACKUP_NAME); //throw (FileError)
+ Privileges::getInstance().ensureActive(SE_BACKUP_NAME); //throw (FileError)
}
catch (...) {}
- const HANDLE hLink = ::CreateFile(zen::applyLongPathPrefix(linkPath).c_str(),
+ const HANDLE hLink = ::CreateFile(applyLongPathPrefix(linkPath).c_str(),
GENERIC_READ,
FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
NULL,
@@ -83,10 +81,8 @@ Zstring getSymlinkRawTargetString(const Zstring& linkPath) //throw (FileError)
FILE_FLAG_BACKUP_SEMANTICS | FILE_FLAG_OPEN_REPARSE_POINT,
NULL);
if (hLink == INVALID_HANDLE_VALUE)
- {
- wxString errorMessage = wxString(_("Error resolving symbolic link:")) + wxT("\n\"") + zen::zToWx(linkPath) + wxT("\"");
- throw FileError(errorMessage + wxT("\n\n") + zen::getLastErrorFormatted());
- }
+ throw FileError(_("Error resolving symbolic link:") + "\n\"" + linkPath + "\"" + "\n\n" + getLastErrorFormatted());
+
Loki::ScopeGuard dummy = Loki::MakeGuard(::CloseHandle, hLink);
(void)dummy; //silence warning "unused variable"
@@ -102,10 +98,7 @@ Zstring getSymlinkRawTargetString(const Zstring& linkPath) //throw (FileError)
static_cast<DWORD>(buffer.size()), //__in DWORD nOutBufferSize,
&bytesReturned, //__out_opt LPDWORD lpBytesReturned,
NULL)) //__inout_opt LPOVERLAPPED lpOverlapped
- {
- wxString errorMessage = wxString(_("Error resolving symbolic link:")) + wxT("\n\"") + zen::zToWx(linkPath) + wxT("\"");
- throw FileError(errorMessage + wxT("\n\n") + zen::getLastErrorFormatted());
- }
+ throw FileError(_("Error resolving symbolic link:") + "\n\"" + linkPath + "\"" + "\n\n" + getLastErrorFormatted());
REPARSE_DATA_BUFFER& reparseData = *reinterpret_cast<REPARSE_DATA_BUFFER*>(&buffer[0]); //REPARSE_DATA_BUFFER needs to be artificially enlarged!
@@ -121,10 +114,7 @@ Zstring getSymlinkRawTargetString(const Zstring& linkPath) //throw (FileError)
reparseData.MountPointReparseBuffer.SubstituteNameLength / sizeof(WCHAR));
}
else
- {
- wxString errorMessage = wxString(_("Error resolving symbolic link:")) + wxT("\n\"") + zen::zToWx(linkPath) + wxT("\"");
- throw FileError(errorMessage + wxT("\n\n") + wxT("Not a symbolic link or junction!"));
- }
+ throw FileError(_("Error resolving symbolic link:") + "\n\"" + linkPath + "\"" + "\n\n" + "Not a symbolic link or junction!");
//absolute symlinks and junctions technically start with \??\ while relative ones do not
if (output.StartsWith(Zstr("\\??\\")))
@@ -139,8 +129,9 @@ Zstring getSymlinkRawTargetString(const Zstring& linkPath) //throw (FileError)
const int bytesWritten = ::readlink(linkPath.c_str(), buffer, BUFFER_SIZE);
if (bytesWritten < 0 || bytesWritten >= BUFFER_SIZE)
{
- wxString errorMessage = wxString(_("Error resolving symbolic link:")) + wxT("\n\"") + zToWx(linkPath) + wxT("\"");
- if (bytesWritten < 0) errorMessage += wxString(wxT("\n\n")) + zen::getLastErrorFormatted();
+ std::wstring errorMessage = _("Error resolving symbolic link:") + "\n\"" + linkPath + "\"";
+ if (bytesWritten < 0)
+ errorMessage += L"\n\n" + getLastErrorFormatted();
throw FileError(errorMessage);
}
buffer[bytesWritten] = 0; //set null-terminating char
diff --git a/shared/system_constants.h b/shared/system_constants.h
deleted file mode 100644
index 9c0cd4a4..00000000
--- a/shared/system_constants.h
+++ /dev/null
@@ -1,29 +0,0 @@
-// **************************************************************************
-// * This file is part of the FreeFileSync project. It is distributed under *
-// * GNU General Public License: http://www.gnu.org/licenses/gpl.html *
-// * Copyright (C) 2008-2011 ZenJu (zhnmju123 AT gmx.de) *
-// **************************************************************************
-//
-#ifndef SYSTEMCONSTANTS_H_INCLUDED
-#define SYSTEMCONSTANTS_H_INCLUDED
-
-#include "zstring.h"
-#include <wx/string.h>
-
-namespace common
-{
-//------------------------------------------------
-// GLOBALS
-//------------------------------------------------
-#ifdef FFS_WIN
-const Zchar FILE_NAME_SEPARATOR = '\\'; //
-const wxChar LINE_BREAK[] = wxT("\r\n"); //internal linkage
-#elif defined FFS_LINUX
-const Zchar FILE_NAME_SEPARATOR = '/';
-const wxChar LINE_BREAK[] = wxT("\n");
-#endif
-
-const char BYTE_ORDER_MARK_UTF8[] = "\xEF\xBB\xBF";
-}
-
-#endif // SYSTEMCONSTANTS_H_INCLUDED
diff --git a/shared/taskbar.cpp b/shared/taskbar.cpp
index 5767f8c9..969f4bb0 100644
--- a/shared/taskbar.cpp
+++ b/shared/taskbar.cpp
@@ -33,16 +33,13 @@ bool windows7TaskbarAvailable()
}
-const std::wstring& getTaskBarDllName()
+std::wstring getTaskBarDllName()
{
assert_static(util::is32BitBuild || util::is64BitBuild);
- static const std::wstring filename(
- util::is64BitBuild ?
- L"Taskbar7_x64.dll" :
- L"Taskbar7_Win32.dll");
-
- return filename;
+ return util::is64BitBuild ?
+ L"Taskbar7_x64.dll" :
+ L"Taskbar7_Win32.dll";
}
}
//########################################################################################################
@@ -108,7 +105,7 @@ private:
TaskbarProgress::TaskbarProgress(const wxTopLevelWindow& window) : pimpl_(new Pimpl(window)) {}
-TaskbarProgress::~TaskbarProgress() {} //std::auto_ptr ...
+TaskbarProgress::~TaskbarProgress() {} //std::unique_ptr ...
void TaskbarProgress::setStatus(Status status)
{
diff --git a/shared/taskbar.h b/shared/taskbar.h
index b41734b3..90a76d13 100644
--- a/shared/taskbar.h
+++ b/shared/taskbar.h
@@ -40,7 +40,7 @@ public:
private:
class Pimpl;
- std::auto_ptr<Pimpl> pimpl_;
+ std::unique_ptr<Pimpl> pimpl_;
};
}
diff --git a/shared/util.cpp b/shared/util.cpp
index 6f066959..faa4074c 100644
--- a/shared/util.cpp
+++ b/shared/util.cpp
@@ -5,42 +5,32 @@
// **************************************************************************
//
#include "util.h"
-#include <wx/scrolwin.h>
-#include <wx/textctrl.h>
-#include <wx/combobox.h>
-#include <wx/filepicker.h>
+#include "zstring.h"
#include "i18n.h"
-#include "file_handling.h"
-#include "string_conv.h"
#include "last_error.h"
-#include "check_exist.h"
-#include "assert_static.h"
-#include "system_constants.h"
#include "global_func.h"
-
#ifdef FFS_WIN
#include <wx/msw/wrapwin.h> //includes "windows.h"
#endif
+
wxString zen::extractJobName(const wxString& configFilename)
{
- using namespace common;
-
const wxString shortName = configFilename.AfterLast(FILE_NAME_SEPARATOR); //returns the whole string if seperator not found
const wxString jobName = shortName.BeforeLast(wxChar('.')); //returns empty string if seperator not found
return jobName.IsEmpty() ? shortName : jobName;
}
-wxString zen::formatFilesizeToShortString(zen::UInt64 size)
+wxString zen::formatFilesizeToShortString(UInt64 size)
{
- if (to<zen::Int64>(size) < 0) return _("Error");
+ if (to<Int64>(size) < 0) return _("Error");
if (size <= 999U)
{
wxString output = _P("1 Byte", "%x Bytes", to<int>(size));
- output.Replace(wxT("%x"), zen::toStringSep(size)); //no decimal places in case of bytes
+ output.Replace(wxT("%x"), toStringSep(size)); //no decimal places in case of bytes
return output;
}
else
diff --git a/shared/util.h b/shared/util.h
index 2aa48af9..25762ce7 100644
--- a/shared/util.h
+++ b/shared/util.h
@@ -8,12 +8,7 @@
#define UTIL_H_INCLUDED
#include <wx/string.h>
-#include <wx/textctrl.h>
-#include <wx/filepicker.h>
-#include <wx/combobox.h>
#include <wx/scrolwin.h>
-#include <wx/choice.h>
-#include "zstring.h"
#include "string_tools.h"
#include "int64.h"
@@ -21,15 +16,15 @@ namespace zen
{
wxString extractJobName(const wxString& configFilename);
-wxString formatFilesizeToShortString(zen::UInt64 filesize);
-wxString formatPercentage(zen::Int64 dividend, zen::Int64 divisor);
+wxString formatFilesizeToShortString(UInt64 filesize);
+wxString formatPercentage(Int64 dividend, Int64 divisor);
template <class NumberType>
wxString toStringSep(NumberType number); //convert number to wxString including thousands separator
void scrollToBottom(wxScrolledWindow* scrWindow);
-wxString utcTimeToLocalString(zen::Int64 utcTime); //throw std::runtime_error
+wxString utcTimeToLocalString(Int64 utcTime); //throw std::runtime_error
}
@@ -68,8 +63,7 @@ wxString includeNumberSeparator(const wxString& number);
namespace zen
{
-template <class NumberType>
-inline
+template <class NumberType> inline
wxString toStringSep(NumberType number)
{
return ffs_Impl::includeNumberSeparator(zen::toString<wxString>(number));
diff --git a/shared/xml_base.cpp b/shared/xml_base.cpp
index 3b786fe8..cd9f58a6 100644
--- a/shared/xml_base.cpp
+++ b/shared/xml_base.cpp
@@ -9,7 +9,6 @@
#include <string_conv.h>
#include <file_io.h>
#include <i18n.h>
-#include <system_constants.h>
using namespace zen;
@@ -19,14 +18,14 @@ void xmlAccess::loadXmlDocument(const wxString& filename, XmlDoc& doc) //throw F
std::string stream;
try
{
- const zen::UInt64 fs = zen::getFilesize(wxToZ(filename)); //throw (FileError)
+ const zen::UInt64 fs = zen::getFilesize(toZ(filename)); //throw (FileError)
{
//quick test whether input is an XML: avoid loading large binary files up front!
//doesn't correctly handle BOM! (but no issue yet...)
const std::string xmlBegin = "<?xml version=";
std::vector<char> buffer(xmlBegin.size());
- FileInput inputFile(wxToZ(filename)); //throw (FileError);
+ FileInput inputFile(toZ(filename)); //throw (FileError);
const size_t bytesRead = inputFile.read(&buffer[0], buffer.size()); //throw (FileError)
if (bytesRead < xmlBegin.size() || !std::equal(buffer.begin(), buffer.end(), xmlBegin.begin()))
throw FfsXmlError(wxString(_("Error parsing configuration file:")) + wxT("\n\"") + filename + wxT("\""));
@@ -34,7 +33,7 @@ void xmlAccess::loadXmlDocument(const wxString& filename, XmlDoc& doc) //throw F
stream.resize(to<size_t>(fs));
- FileInput inputFile(wxToZ(filename)); //throw (FileError);
+ FileInput inputFile(toZ(filename)); //throw (FileError);
const size_t bytesRead = inputFile.read(&stream[0], stream.size()); //throw (FileError)
if (bytesRead < to<size_t>(fs))
{
@@ -77,7 +76,7 @@ void xmlAccess::saveXmlDocument(const zen::XmlDoc& doc, const wxString& filename
bool saveNecessary = true;
try
{
- if (zen::getFilesize(wxToZ(filename)) == stream.size()) //throw FileError
+ if (zen::getFilesize(toZ(filename)) == stream.size()) //throw FileError
try
{
if (zen::loadStream(filename) == stream) //throw XmlFileError
@@ -90,7 +89,7 @@ void xmlAccess::saveXmlDocument(const zen::XmlDoc& doc, const wxString& filename
if (saveNecessary)
try
{
- FileOutput outputFile(wxToZ(filename), FileOutput::ACC_OVERWRITE); //throw (FileError)
+ FileOutput outputFile(toZ(filename), FileOutput::ACC_OVERWRITE); //throw (FileError)
outputFile.write(stream.c_str(), stream.length()); //
}
catch (const FileError& error) //more detailed error messages than with wxWidgets
diff --git a/shared/zstring.h b/shared/zstring.h
index 66f961fa..841fb8a2 100644
--- a/shared/zstring.h
+++ b/shared/zstring.h
@@ -110,10 +110,12 @@ void MakeUpper(Zbase<wchar_t, SP, AP>& str);
#ifdef FFS_WIN //Windows stores filenames in wide character format
typedef wchar_t Zchar;
#define Zstr(x) L ## x
+const Zchar FILE_NAME_SEPARATOR = L'\\';
#elif defined FFS_LINUX //Linux uses UTF-8
typedef char Zchar;
#define Zstr(x) x
+const Zchar FILE_NAME_SEPARATOR = '/';
#else
#error define platform you are in: FFS_WIN or FFS_LINUX
@@ -146,6 +148,7 @@ typedef Zbase<Zchar, StorageRefCount, AllocatorFreeStoreChecked> Zstring; //for
+
//################################# inline implementation ########################################
#if defined(FFS_WIN) || defined(FFS_LINUX)
namespace z_impl
bgstack15