00001
00002
00003 #ifndef UINODE_REPOSITORY_H
00004 #define UINODE_REPOSITORY_H
00005
00006 #include <vector>
00007 #include <string>
00008 #include <map>
00009 #include <set>
00010 #include <libxml/tree.h>
00011
00012 namespace FD {
00013
00014 class UINetwork;
00015
00016 class ItemInfo {
00017 public:
00018 std::string name;
00019 std::string type;
00020 std::string value;
00021 std::string description;
00022
00023 ItemInfo() : type("any"), value(""), description("No description available") {}
00024 };
00025
00026 class NodeInfo {
00027 public:
00028 enum NodeKind {builtin, subnet, external};
00029 std::vector<ItemInfo *> inputs;
00030 std::vector<ItemInfo *> outputs;
00031 std::vector<ItemInfo *> params;
00032 std::string category;
00033 std::string description;
00034 std::string sourceFile;
00035 std::string requireList;
00036 NodeKind kind;
00037 public:
00038 NodeInfo() : category("Unknown"), description("No description available") {}
00039 ~NodeInfo() {for (unsigned int i=0;i<inputs.size();i++) delete inputs[i];
00040 for (unsigned int i=0;i<outputs.size();i++) delete outputs[i];
00041 for (unsigned int i=0;i<params.size();i++) delete params[i];}
00042 private:
00043 NodeInfo(const NodeInfo&) {}
00044
00045 };
00046
00047 class UINodeRepository {
00048 public:
00049 typedef std::map<std::string, NodeInfo *>::iterator iterator;
00050
00051 private:
00052 std::map<std::string, NodeInfo *> info;
00053
00054 static UINodeRepository &GlobalRepository();
00055
00057 static std::map<std::string, std::set<std::string> > &ModuleDepend();
00058
00060 static std::map<std::string, std::set<std::string> > &FileDepend();
00061
00063 static std::map<std::string, std::set<std::string> > &HeaderDepend();
00064
00065 static void LoadAllInfoRecursive(const std::string &path);
00066 static void LoadNodeDefInfo(const std::string &path, const std::string &name);
00067 static void LoadExtDocInfo(const std::string &path, const std::string &name);
00068
00069 public:
00070
00071 UINodeRepository() {}
00072
00073 UINodeRepository(const UINodeRepository &);
00074
00075 ~UINodeRepository();
00076
00077 iterator begin() {return info.begin();}
00078 iterator end() {return info.end();}
00079
00080 NodeInfo *findNode(const std::string &name);
00081
00082 void loadDocInfo(xmlDocPtr doc, const std::string &basename);
00083
00084 void loadAllSubnetInfo(xmlNodePtr net);
00085
00086 void loadNetInfo(xmlNodePtr net);
00087
00088 void updateNetInfo(UINetwork *net);
00089
00090 void clean();
00091
00092 static iterator Begin() {return GlobalRepository().info.begin();}
00093
00094 static iterator End() {return GlobalRepository().info.end();}
00095
00096 static void Scan();
00097
00098 static NodeInfo *Find(const std::string &name);
00099
00100 static std::set<std::string> &FindFileFromModule(const std::string &name);
00101
00102 static std::set<std::string> &FindModuleFromFile(const std::string &name);
00103
00104 static std::set<std::string> &FindHeaderFromFile(const std::string &name);
00105
00106 static std::vector<std::string> Available();
00107
00108 static void ProcessDependencies(std::set<std::string> &initial_files, bool toplevel=true);
00109 };
00110 }
00111
00112 #endif