diff options
Diffstat (limited to 'server/src/macrolist.cc')
-rw-r--r-- | server/src/macrolist.cc | 147 |
1 files changed, 4 insertions, 143 deletions
diff --git a/server/src/macrolist.cc b/server/src/macrolist.cc index 89abfe8..86584d4 100644 --- a/server/src/macrolist.cc +++ b/server/src/macrolist.cc @@ -27,118 +27,16 @@ */ #include "macrolist.h" -#include <sys/types.h> -#include <dirent.h> - -#include "debug.h" #include "macroheaderparser.h" -#include <sys/types.h> -#include <sys/stat.h> -#include <unistd.h> - -static inline bool isdir(std::string name) -{ - struct stat s; - stat(name.c_str(), &s); - return S_ISDIR(s.st_mode); -} - -static inline bool isfile(std::string name) -{ - struct stat s; - stat(name.c_str(), &s); - return S_ISREG(s.st_mode); -} +#include "debug.h" -static std::vector<std::string> listdir(std::string path) +MacroList::MacroList(std::string path) + : EntityList("macro") { - std::vector<std::string> files; - - DIR* dir = opendir(path.c_str()); - if(!dir) { - PRACRO_ERR(dump, "Could not open directory: %s\n", path.c_str()); - return files; - } - - struct dirent *d; - while((d = readdir(dir)) != 0) { - if(std::string(d->d_name) == "." || std::string(d->d_name) == "..") continue; - - PRACRO_DEBUG(macrolist, "d_name: %s - d_type: %d\n", d->d_name, d->d_type); - - if(isdir(path + "/" + d->d_name)) { - std::vector<std::string> sub = listdir(path + "/" + d->d_name); - files.insert(files.end(), sub.begin(), sub.end()); - continue; - } - - if(isfile(path + "/" + d->d_name)) { - std::string name = d->d_name; - if(name.length() >= 4 && name.substr(name.length() - 4) == ".xml") - files.push_back(path + "/" + name); - } - } - closedir(dir); - - return files; + rescan(path); } -MacroList::MacroList(std::string macropath) -{ - MutexAutolock lock(mutex); - - inotify.addDirectory(macropath, WATCH_DEEP_FOLLOW, - IN_CLOSE_WRITE | - IN_MOVED_FROM | IN_MOVED_TO | IN_MOVE_SELF | - IN_DELETE | IN_DELETE_SELF); - - this->macropath = macropath; - std::vector<std::string> macros = listdir(macropath); - std::vector<std::string>::iterator i = macros.begin(); - while(i != macros.end()) { - addFile(*i); - i++; - } - - { - iterator i = begin(); - while(i != end()) { - MacroListItem::iterator j = i->second.begin(); - while(j != i->second.end()) { - PRACRO_DEBUG(macrolist, "%s - v%s file: %s\n", - i->first.c_str(), - ((std::string)j->first).c_str(), - j->second.c_str()); - j++; - } - i++; - } - } -} - -bool MacroList::removeFile(std::string file) -{ - // Check if the file is already in the tree. - iterator i = begin(); - while(i != end()) { - MacroListItem::iterator j = i->second.begin(); - while(j != i->second.end()) { - if(file == j->second) { - PRACRO_DEBUG(macrolist, "Removing file: %s\n", file.c_str()); - i->second.erase(j->first); - /* - if(i->second.size() == 0) erase(i->first); - */ - return true; - } - j++; - } - i++; - } - - return false; -} void MacroList::addFile(std::string file) { @@ -153,43 +51,6 @@ void MacroList::addFile(std::string file) } } -void MacroList::updateFile(std::string file) -{ - removeFile(file); - addFile(file); -} - -void MacroList::updateList() -{ - while(inotify.hasEvents()) { - INotify::Event event = inotify.getNextEvent(); - if(event.isCloseWriteEvent()) updateFile(event.name()+"/"+event.file()); - if(event.isMovedFromEvent()) removeFile(event.name()+"/"+event.file()); - if(event.isMovedToEvent()) updateFile(event.name()+"/"+event.file()); - if(event.isDeleteEvent()) removeFile(event.name()+"/"+event.file()); - - if(event.isMoveSelfEvent()) {/* TODO: what to do here? */} - if(event.isDeleteSelfEvent()) {/* TODO: what to do here? */} - } -} - -std::string MacroList::getLatestVersion(std::string macro) throw(Exception) -{ - MutexAutolock lock(mutex); - - updateList(); - - if(find(macro) == end()) throw Exception("Macro ["+macro+"] does not exist"); - MacroListItem mli = (*this)[macro]; - if(mli.size() == 0) throw Exception("Macro ["+macro+"] does not exist"); - PRACRO_DEBUG(macrolist, "Search for %s - found %s v%s\n", - macro.c_str(), - mli.begin()->second.c_str(), - ((std::string)mli.begin()->first).c_str()); - - return mli.begin()->second; -} - #ifdef TEST_MACROLIST #define MACRODIR "/home" // We assume this directory exists and does not contain any xml files! |