void processFileRemoved(tree<FileInfo>::iterator parentIt, const FileChangeEvent& fileChange, bool recursive, tree<FileInfo>* pTree, std::vector<FileChangeEvent>* pFileChanges) { // search for a child with this path tree<FileInfo>::sibling_iterator remIt = findFile(pTree->begin(parentIt), pTree->end(parentIt), fileChange.fileInfo()); // only generate actions if the item was found in the tree if (remIt != pTree->end(parentIt)) { // if this is folder then we need to generate recursive // remove events, otherwise can just add single event if (recursive && shouldTraverse(*remIt)) { tree<FileInfo> subTree(remIt); std::for_each(subTree.begin(), subTree.end(), boost::bind(addEvent, FileChangeEvent::FileRemoved, _1, pFileChanges)); } else { // use the previous FileInfo for the event payload (since the // passed FileInfo might not have a correct value for isDirectory // since we couldn't read it from the filesystem) pFileChanges->push_back(FileChangeEvent(FileChangeEvent::FileRemoved, *remIt)); } // remove it from the tree pTree->erase(remIt); } }
void collectFileChangeEvents(PreviousIterator prevBegin, PreviousIterator prevEnd, CurrentIterator currBegin, CurrentIterator currEnd, const boost::function<bool(const FileInfo&)>& filter, std::vector<FileChangeEvent>* pEvents) { // sort the ranges std::vector<FileInfo> prev; std::copy(prevBegin, prevEnd, std::back_inserter(prev)); std::sort(prev.begin(), prev.end(), fileInfoPathLessThan); std::vector<FileInfo> curr; std::copy(currBegin, currEnd, std::back_inserter(curr)); std::sort(curr.begin(), curr.end(), fileInfoPathLessThan); // initalize the iterators std::vector<FileInfo>::iterator prevIt = prev.begin(); std::vector<FileInfo>::iterator currIt = curr.begin(); FileInfo noFile; while (prevIt != prev.end() || currIt != curr.end()) { const FileInfo& prevFile = prevIt != prev.end() ? *prevIt : noFile; const FileInfo& currFile = currIt != curr.end() ? *currIt : noFile; int comp; if (prevFile.empty()) comp = 1; else if (currFile.empty()) comp = -1; else comp = fileInfoPathCompare(prevFile, currFile); if (comp == 0) { if (currFile.lastWriteTime() != prevFile.lastWriteTime()) { if (!filter || filter(currFile)) { pEvents->push_back(FileChangeEvent(FileChangeEvent::FileModified, currFile)); } } prevIt++; currIt++; } else if (comp < 0) { if (!filter || filter(prevFile)) { pEvents->push_back(FileChangeEvent(FileChangeEvent::FileRemoved, prevFile)); } prevIt++; } else // comp > 1 { if (!filter || filter(currFile)) { pEvents->push_back(FileChangeEvent(FileChangeEvent::FileAdded, currFile)); } currIt++; } } }