My Project
basic_dir_monitor.hpp
1 //
2 // Copyright (c) 2008, 2009 Boris Schaeling <boris@highscore.de>
3 //
4 // Distributed under the Boost Software License, Version 1.0. (See accompanying
5 // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
6 //
7 #pragma once
8 
9 #include <boost/asio.hpp>
10 #include <boost/filesystem.hpp>
11 #include <string>
12 
13 namespace boost {
14 namespace asio {
15 
17 {
19  {
20  null = 0,
21  added = 1,
22  removed = 2,
23  modified = 3,
24  renamed_old_name = 4,
25  renamed_new_name = 5,
30  };
31 
33  : type(null) { }
34 
35  dir_monitor_event(const boost::filesystem::path &p, event_type t)
36  : path(p), type(t) { }
37 
38  const char* type_cstr() const
39  {
40  switch(type) {
41  case boost::asio::dir_monitor_event::added: return "ADDED";
42  case boost::asio::dir_monitor_event::removed: return "REMOVED";
43  case boost::asio::dir_monitor_event::modified: return "MODIFIED";
44  case boost::asio::dir_monitor_event::renamed_old_name: return "RENAMED (OLD NAME)";
45  case boost::asio::dir_monitor_event::renamed_new_name: return "RENAMED (NEW NAME)";
46  case boost::asio::dir_monitor_event::recursive_rescan: return "RESCAN DIR";
47  default: return "UNKNOWN";
48  }
49  }
50 
51  boost::filesystem::path path;
52  event_type type;
53 };
54 
55 inline std::ostream& operator << (std::ostream& os, dir_monitor_event const& ev)
56 {
57  os << "dir_monitor_event " << ev.type_cstr() << " " << ev.path;
58  return os;
59 }
60 
61 template <typename Service>
63  : public boost::asio::basic_io_object<Service>
64 {
65 public:
66  explicit basic_dir_monitor(boost::asio::io_service &io_service)
67  : boost::asio::basic_io_object<Service>(io_service)
68  {
69  }
70 
71  void add_directory(const std::string &dirname)
72  {
73  this->get_service().add_directory(this->get_implementation(), dirname);
74  }
75 
76  void remove_directory(const std::string &dirname)
77  {
78  this->get_service().remove_directory(this->get_implementation(), dirname);
79  }
80 
81  dir_monitor_event monitor()
82  {
83  boost::system::error_code ec;
84  dir_monitor_event ev = this->get_service().monitor(this->get_implementation(), ec);
85  boost::asio::detail::throw_error(ec);
86  return ev;
87  }
88 
89  dir_monitor_event monitor(boost::system::error_code &ec)
90  {
91  return this->get_service().monitor(this->get_implementation(), ec);
92  }
93 
94  template <typename Handler>
95  void async_monitor(Handler handler)
96  {
97  this->get_service().async_monitor(this->get_implementation(), handler);
98  }
99 };
100 
101 }
102 }
103 
Definition: basic_dir_monitor.hpp:16
Definition: basic_dir_monitor.hpp:13
event_type
Definition: basic_dir_monitor.hpp:18
In some cases a recursive scan of directory under dirname is required.
Definition: basic_dir_monitor.hpp:29
Definition: basic_dir_monitor.hpp:62