00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 #ifndef _BASE_SIMPLEXMLSERIALIZER_
00026 #define _BASE_SIMPLEXMLSERIALIZER_
00027
00028 #include <base/base>
00029 #include <base/array>
00030 #include <base/Serializer>
00031
00032
00033 namespace base {
00034
00035
00036 class SimpleXMLSerializer : public Serializer
00037 {
00038 public:
00039 SimpleXMLSerializer(SerializerType type, ref<VFile> archive);
00040 SimpleXMLSerializer(SerializerType type, std::ios& stream);
00041 virtual ~SimpleXMLSerializer();
00042
00043 virtual String className() const { return String("SimpleXMLSerializer"); }
00044
00045 virtual bool followReferences(bool follow);
00046 virtual void flush();
00047
00048 virtual Serializer& hint(Int h);
00049
00050 protected:
00051 SimpleXMLSerializer(const SimpleXMLSerializer& a)
00052 : Serializer(a), istream(a.istream), ostream(a.ostream), indent(indent) {}
00053
00054 virtual Serializer& serialize(char& c, const String& memberName);
00055 virtual Serializer& serialize(Byte& b, const String& memberName);
00056 virtual Serializer& serialize(bool& b, const String& memberName);
00057 virtual Serializer& serialize(SInt& i, const String& memberName);
00058 virtual Serializer& serialize(Int& i, const String& memberName);
00059 virtual Serializer& serialize(LInt& i, const String& memberName);
00060 virtual Serializer& serialize(String& s, const String& memberName);
00061 virtual Serializer& serialize(Real& r, const String& memberName);
00062
00063 virtual TypeModifier preSerializeObject(String& typeName, TypeModifier typeModifier, const String& memberName, bool forceTypeSerialization = false);
00064 virtual void postSerializeObject(const String& memberName);
00065
00066 virtual void serializeComment(const String& comment);
00067
00068
00069 struct TagData {
00070 String name;
00071 array<String> attributeNames;
00072 array<String> attributeValues;
00073
00074 String attribute(const String& name)
00075 {
00076 for(Int i=0; i<attributeNames.size(); i++)
00077 if (attributeNames[i] == name)
00078 return attributeValues[i];
00079 return "";
00080 }
00081 };
00082
00083 bool serializeHeader(const String& target);
00084
00085 char nextChar()
00086 {
00087 char c;
00088 try {
00089 (*istream) >> c;
00090 } catch (std::exception& e) {
00091 abort(e.what());
00092 }
00093 return c;
00094 }
00095
00096 char nextNWSChar()
00097 {
00098 char c;
00099 try {
00100 do {
00101 (*istream) >> c;
00102 } while ((c==' ') || (c=='\n') || (c=='\011'));
00103 } catch (std::exception& e) {
00104 abort(e.what());
00105 }
00106 return c;
00107 }
00108
00109 bool readStartTag(TagData& tag);
00110 bool readEndTag(const String& tagName);
00111
00112 std::istream* istream;
00113 std::ostream* ostream;
00114 Int indent;
00115 };
00116
00117 }
00118
00119 #endif