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