00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011 #ifndef incPERSIST_XML_PARSEOBJ
00012 #define incPERSIST_XML_PARSEOBJ
00013
00014
00015 #include <string>
00016 #include <stack>
00017 #include <vector>
00018 #include <map>
00019 #include "parse.hpp"
00020 #include "parseobj_opts.h"
00021 #include "boost/filesystem/path.hpp"
00022
00023 namespace ph {
00024 namespace common {
00025 class object_base;
00026 class persistable_object_context;
00027 class importable_object_base;
00028 };
00029 namespace persist {
00030 namespace xml {
00031
00032 class PERSIST_DECL parseobj : public parse
00033
00034
00035
00036 {
00037 public:
00038 parseobj(parseobj *outer,
00039 std::istream *stream,
00040 const boost::filesystem::path &streampath,
00041 ph::common::persistable_object_context *context,
00042 std::ostream *console,
00043 const boost::filesystem::path &rootpath,
00044 bool silent,
00045 unsigned int debug=PARSEOBJ_NO_DEBUG);
00046
00047 ph::common::object_base *obj() { return _obj; };
00048
00049
00050 void add_params(const std::map<std::string, std::string> ¶ms);
00051
00052
00053 void set_root_outer(ph::common::object_base *outer)
00054 { _rootouter = outer; }
00055
00056 private:
00057 parseobj *_outer;
00058 std::istream *_stream;
00059 boost::filesystem::path _streampath;
00060 ph::common::persistable_object_context *_context;
00061
00062 boost::filesystem::path _rootpath;
00063 ph::common::object_base *_obj;
00064 ph::common::object_base *_root;
00065 ph::common::object_base *_rootouter;
00066 std::string _cdata;
00067 std::string _comment;
00068 bool _abort;
00069 bool _inmember;
00070 int _anonymousobjnum;
00071 unsigned int _debug;
00072 std::stack<ph::common::object_base *> _stack;
00073
00074
00075 parseobj *_import;
00076 std::istream *_importstream;
00077 boost::filesystem::path _importstreampath;
00078 std::string _rootname;
00079 std::map<std::string, std::string> _params;
00080 ph::common::importable_object_base *_delayed_obj;
00081
00082
00083 bool _fragment;
00084
00085 ph::common::object_base *create_object(ph::common::object_base *top,
00086 const xmlstring &type, const xmlstring &name);
00087 xmlstring dosubs(const xmlstring &s);
00088 xmlstring getdecodedattrval(const std::vector<xmlstring> &atts, int index);
00089 xmlstring getdecodedexpectedattr(const std::vector<xmlstring> &atts,
00090 const xmlstring &token);
00091 xmlstring getdecodedattr(const std::vector<xmlstring> &atts, const xmlstring &token);
00092 void add_param(const std::string &name, const std::string &val);
00093 static void add_param_1(std::map<std::string, std::string> *params,
00094 const std::string &name, const std::string &val);
00095 bool find_param(const std::string &name, std::string *value);
00096 bool test_outerable(ph::common::object_base *obj);
00097 bool test_persistable(ph::common::object_base *obj);
00098 bool test_composition(ph::common::object_base *obj);
00099
00100
00101 virtual void startelement_handler(const xmlstring &name,
00102 const std::vector<xmlstring> &atts);
00103 virtual void endelement_handler(const xmlstring &name);
00104 virtual void cdata_handler(const xmlstring &s, int len);
00105 virtual void comment_handler(const xmlstring &s);
00106 virtual void finish_handler();
00107
00108
00109 void obj_out(const std::string &msg, ph::common::object_base *obj);
00110 void element_out(const std::string &msg, const xmlstring &element);
00111 };
00112
00113 };
00114 };
00115 };
00116
00117 #endif // incPERSIST_XML_PARSEOBJ