Example #1
0
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);
}
Example #2
0
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;
	}
}
Example #3
0
void parse_and_register_watches(char** watches) {
  while(*++watches) {
    register_watch(*watches);
  }
}