bool PathHandler::_HasFile(const node_ref& nodeRef) const { FileEntry setEntry; setEntry.ref.device = nodeRef.device; setEntry.node = nodeRef.node; // name does not need to be set, since it's not used for comparing FileSet::const_iterator iterator = fFiles.find(setEntry); return iterator != fFiles.end(); }
status_t PathHandler::_RemoveFile(const node_ref& nodeRef) { TRACE(" REMOVE FILE %ld:%Ld\n", nodeRef.device, nodeRef.node); FileEntry setEntry; setEntry.ref.device = nodeRef.device; setEntry.node = nodeRef.node; // name does not need to be set, since it's not used for comparing FileSet::iterator iterator = fFiles.find(setEntry); if (iterator == fFiles.end()) return B_ENTRY_NOT_FOUND; watch_node(&nodeRef, B_STOP_WATCHING, this); fFiles.erase(iterator); return B_OK; }
void PathHandler::_NotifyTarget(BMessage* message, const node_ref& nodeRef) const { BMessage update(*message); update.what = B_PATH_MONITOR; TRACE("_NotifyTarget(): node ref %ld.%Ld\n", nodeRef.device, nodeRef.node); WatchedDirectory directory; directory.node = nodeRef; DirectorySet::const_iterator iterator = fDirectories.find(directory); if (iterator != fDirectories.end()) { if (_WatchFilesOnly()) { // stat or attr notification for a directory return; } BDirectory nodeDirectory(&nodeRef); BEntry entry; if (nodeDirectory.GetEntry(&entry) == B_OK) { BPath path(&entry); update.AddString("path", path.Path()); } } else { if (_WatchFoldersOnly()) { // this is bound to be a notification for a file return; } FileEntry setEntry; setEntry.ref.device = nodeRef.device; setEntry.node = nodeRef.node; // name does not need to be set, since it's not used for comparing FileSet::const_iterator i = fFiles.find(setEntry); if (i != fFiles.end()) { BPath path(&(i->ref)); update.AddString("path", path.Path()); } } // This is in case the target is interested in figuring out which // BPathMonitor::StartWatching() call the message is resulting from. update.AddString("watched_path", fPath.Path()); fTarget.SendMessage(&update); }