summaryrefslogtreecommitdiff
path: root/server/src/macrolist.cc
diff options
context:
space:
mode:
Diffstat (limited to 'server/src/macrolist.cc')
-rw-r--r--server/src/macrolist.cc147
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!