00001 #ifndef FIDOCUMENT_H
00002 #define FIDOCUMENT_H
00003
00004 #include "FITypeDesc.h"
00005 #include <Base/BaseUtility.h>
00006 #include <set>
00007 #include <map>
00008 #include <algorithm>
00009
00010 namespace Spr {;
00011
00012
00013 typedef std::string FIString;
00014
00015 extern FIString zeroLengthString;
00016
00017 struct FIStringLess{
00018 bool operator() (const FIString& s1, const FIString& s2) const { return s1.compare(s2) < 0;}
00019 };
00020
00021 inline std::ostream& operator << (std::ostream& os, FIString s){
00022 os << s.c_str();
00023 return os;
00024 }
00025
00026
00027 class FIDocNodePos{
00028 public:
00029 virtual ~FIDocNodePos(){}
00030 };
00031
00032
00033
00034
00035
00036
00037
00038 class SPR_DLL FIDocNodeBase:public UTRefCount{
00039 public:
00040 friend class FISaveScene;
00041
00042 virtual ~FIDocNodeBase(){}
00043
00044
00045
00046 virtual UTString GetName()=0;
00047
00048 virtual void SetName(UTString s)=0;
00049
00050 virtual UTString GetType()=0;
00051
00052 virtual void SetType(UTString t){}
00053
00054 virtual FITypeDesc* GetTypeDesc()=0;
00055
00056 virtual bool IsReference() = 0;
00057
00058
00059
00060
00061
00062 virtual FIDocNodeBase* GetParent()=0;
00063
00064 virtual int NChildren() const =0;
00065
00066 virtual FIDocNodeBase* GetChild(int i){ return Child(i); }
00067
00068 virtual const FIDocNodeBase* GetChild(int i) const { return ((FIDocNodeBase*)this)->Child(i); }
00069
00070 virtual void AddChild(FIDocNodeBase* n){ n->SetParent(this); }
00071
00072 virtual void SetParent(FIDocNodeBase*)=0;
00073
00074 virtual void ClearChildren()=0;
00075
00076 virtual FIDocNodeBase* FindChild(UTString type)=0;
00077
00078
00079
00080 virtual void SetDataImp(const void* data, size_t sz);
00081
00082 virtual void GetDataImp(void* data, int sz, FIString id);
00083 virtual void GetDataImp(void* data, int sz){ GetDataImp(data, sz,""); }
00084
00085 template <class T> void SetData(const T& t){ SetDataImp(&t, sizeof(t)); }
00086
00087 template <class T> void GetData(T& t){ GetDataImp(&t, sizeof(t), ""); }
00088 template <class T> void GetData(T& t, UTString id){ GetDataImp(&t, sizeof(t), id); }
00089
00090 protected:
00091 virtual FIDocNodePos* ReadContextImp(FIString id)=0;
00092 public:
00093 FIDocNodePos* ReadContext(){ return ReadContextImp(""); }
00094 FIDocNodePos* ReadContext(FIString id){ return ReadContextImp(id); }
00095
00096 protected:
00097 virtual FIDocNodePos* WriteContextImp(FIString id){ return ReadContext(id); }
00098 public:
00099 FIDocNodePos* WriteContext(FIString id){ return WriteContextImp(id); }
00100 FIDocNodePos* WriteContext(){ return WriteContextImp(""); }
00101
00102 virtual void ReleaseContext(FIDocNodePos* c){ delete c; }
00103
00104 virtual bool Read(FIDocNodePos* ctx, char* ptr, int sz)=0;
00105
00106 virtual void Write(FIDocNodePos* ctx, const char* ptr, int sz, FIString fn, FIString type)=0;
00107
00108 virtual void EnterGroup(FIString fn){}
00109
00110 virtual void ExitGroup(){}
00111
00112
00113 virtual void Print(std::ostream& os, int indent=0) const;
00114
00115 virtual void PrintChildren(std::ostream& os, int indent=0) const;
00116 protected:
00117
00118 virtual FIDocNodeBase* Child(int i) = 0;
00119 };
00120
00121
00122 class SPR_DLL FIDocNodes:public UTStack< UTRef<FIDocNodeBase> >{
00123 public:
00124 virtual void Print(std::ostream& os, int indent=0) const;
00125 };
00126
00127
00128 class SPR_DLL FIDocNode:public FIDocNodeBase, public UTTreeNode<FIDocNode>{
00129 UTString name;
00130 UTRef<FITypeDesc> typeDesc;
00131 bool bReference;
00132 std::vector<char> data;
00133 public:
00134 typedef UTTreeNode<FIDocNode> Tree;
00135
00136 FIDocNode(): bReference(false){}
00137
00138 ~FIDocNode(){}
00139
00140 void SetType(FITypeDesc* t);
00141 void SetType(FIString s){ FIDocNodeBase::SetType(s); }
00142
00143
00144
00145 virtual UTString GetName(){ return name; }
00146
00147 virtual void SetName(UTString s){ name = s; }
00148
00149 virtual UTString GetType();
00150
00151 virtual FITypeDesc* GetTypeDesc(){ return typeDesc; }
00152
00153 virtual bool IsReference(){ return bReference; }
00154
00155
00156
00157
00158
00159 virtual FIDocNodeBase* GetParent(){ return Tree::GetParent(); }
00160
00161 virtual int NChildren() const { return (int)Tree::Children().size(); }
00162
00163 virtual void SetParent(FIDocNodeBase* n){ Tree::SetParent((FIDocNode*)n); }
00164
00165 virtual void ClearChildren(){ Tree::ClearChildren(); }
00166
00167 virtual FIDocNodeBase* FindChild(UTString type);
00168
00169
00170
00171 virtual FIDocNodePos* ReadContextImp(FIString id);
00172
00173 virtual bool Read(FIDocNodePos* ctx, char* ptr, int sz);
00174
00175 virtual void Write(FIDocNodePos* ctxBase, const char* ptr, int sz, FIString fn, FIString type);
00176
00177 protected:
00178
00179 virtual FIDocNodeBase* Child(int i){ return Tree::Children()[i]; }
00180 };
00181
00182
00183 class SPR_DLL FIFileDoc:public UTRefCount{
00184 protected:
00185
00186 UTString fileName;
00187
00188 FIDocNodes docs;
00189 public:
00190
00191 virtual bool Load(UTString filename)=0;
00192
00193 virtual bool Save(UTString filename, FIDocNodeBase* doc)=0;
00194
00195 virtual FIDocNodes& GetRoots(){ return docs; }
00196
00197 UTString GetFileName(){ return fileName; }
00198 };
00199
00200 }
00201 #endif