Advertisement
Guest User

Simple log collector using libuv ( don't work )

a guest
Jan 20th, 2018
213
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.93 KB | None | 0 0
  1. #include <string>
  2. #include <cstdio>
  3. #include <unordered_map>
  4. #include <boost/coroutine2/all.hpp>
  5. #include "uvw.hpp"
  6.  
  7. using namespace std::literals;
  8.  
  9. const auto path = "/Users/Carter/test"s;
  10.  
  11. template<typename EventType, typename EmitterType>
  12. EventType awaitEvent(std::shared_ptr<uvw::Loop>& loop, std::shared_ptr<EmitterType>& emitter) {
  13.     using coro_t = boost::coroutines2::coroutine<EventType>;
  14.    
  15.     typename coro_t::pull_type source([&](typename coro_t::push_type& sink) {
  16.         typename EmitterType::template Connection<EventType> ok;
  17.         auto err = emitter->template once<uvw::ErrorEvent>([&](uvw::ErrorEvent &error, auto&) {
  18.             emitter->template erase(ok);
  19.             throw error;
  20.         });
  21.         ok = emitter->template once<EventType>([&](EventType& event, auto&) {
  22.             emitter->template erase(err);
  23.             sink(std::move(event));
  24.         });
  25.         loop->run<uvw::Loop::Mode::ONCE>();
  26.     });
  27.     auto result = std::move(source().get());
  28.     source();
  29.     return result;
  30. }
  31.  
  32. int main() {
  33.     using namespace uvw;
  34.    
  35.     auto loop = Loop::getDefault();
  36.     auto fsEventHandle = loop->resource<FsEventHandle>();
  37.     std::unordered_map<std::string, size_t> progresses;
  38.    
  39.     fsEventHandle->on<FsEventEvent>([&](FsEventEvent& event, FsEventHandle& handle) {
  40.         const char *str;
  41.         switch (event.flags) {
  42.             case (int)FsEventHandle::Watch::RENAME:
  43.                 str = "RENAME";
  44.                 break;
  45.                
  46.             case (int)FsEventHandle::Watch::CHANGE:
  47.                 str = "CHANGE";
  48.                 break;
  49.                
  50.             case (int)FsEventHandle::Watch::RENAME | (int)FsEventHandle::Watch::CHANGE:
  51.                 str = "RENAME | CHANGE";
  52.                 break;
  53.                
  54.             default:
  55.                 str = "";
  56.                 break;
  57.         }
  58.         std::printf("[Detect changes] %s: %s\n", event.filename, str);
  59.        
  60.         auto fileReq = loop->resource<FileReq>();
  61.        
  62.         fileReq->open(path + "/" + event.filename, Flags<FileReq::FileOpen>(FileReq::FileOpen::RDONLY), S_IRUSR);
  63.        
  64.         awaitEvent<FsEvent<FsReq::Type::OPEN>>(loop, fileReq);
  65.        
  66.         fileReq->stat();
  67.         const auto fileSize = awaitEvent<FsEvent<FsReq::Type::STAT>>(loop, fileReq).stat.st_size;
  68.        
  69.         const auto progress = progresses.emplace(event.filename, 0).first->second;
  70.        
  71.         fileReq->read(progress, static_cast<unsigned int>(fileSize - progress));
  72.         const auto readEvent = awaitEvent<FsEvent<FsReq::Type::READ>>(loop, fileReq);
  73.         const auto fileContent = std::string(readEvent.data.get(), readEvent.size);
  74.         std::printf("[Content appended] %s: %s", event.filename, fileContent.c_str());
  75.        
  76.         fileReq->close();
  77.         awaitEvent<FsEvent<FsReq::Type::CLOSE>>(loop, fileReq);
  78.     });
  79.    
  80.     fsEventHandle->start(path);
  81.     loop->run();
  82. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement