void WatchWin32::watch(const std::string &dir, uint32_t filters, const Callback &callback){ auto fnd = watchers.find(dir); if (fnd != watchers.end() && fnd->second.filter != filters){ fnd->second.filter = filters; fnd->second.callback = callback; register_watch(fnd->second); return; } HANDLE handle = CreateFile(dir.c_str(), FILE_LIST_DIRECTORY, FILE_SHARE_DELETE | FILE_SHARE_READ | FILE_SHARE_WRITE, nullptr, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS | FILE_FLAG_OVERLAPPED, nullptr); if (handle == INVALID_HANDLE_VALUE){ std::cerr << "lfw Error: failed to create handle for " << dir << ": " << get_error_msg(GetLastError()) << std::endl; return; } auto it = watchers.emplace(std::make_pair(dir, WatchData{handle, dir, filters, callback})); register_watch(it.first->second); }
void CALLBACK watch_callback(DWORD err, DWORD num_bytes, LPOVERLAPPED overlapped){ SetEvent(overlapped->hEvent); if (err == ERROR_SUCCESS){ WatchData *watch = reinterpret_cast<WatchData*>(overlapped); emit_events(*watch); //Re-register to listen again register_watch(*watch); ResetEvent(overlapped->hEvent); } //If we're being cancelled it's not an error else if (err != ERROR_OPERATION_ABORTED){ std::cerr << "lfw Error: watch callback error: " << get_error_msg(err) << std::endl; } }
void parse_and_register_watches(char** watches) { while(*++watches) { register_watch(*watches); } }