00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #ifndef __CEL_PL_PERSIST__
00022 #define __CEL_PL_PERSIST__
00023
00024 #include "cstypes.h"
00025 #include "csutil/scf.h"
00026 #include "csutil/util.h"
00027 #include "csutil/array.h"
00028
00029 #include "physicallayer/datatype.h"
00030
00031 struct iCelPropertyClass;
00032 struct iCelEntity;
00033 struct iFile;
00034 struct celData;
00035
00057 enum celPersistenceType
00058 {
00059 CEL_PERSIST_TYPE_UNDEF = 0,
00060 CEL_PERSIST_TYPE_RECORD,
00061 CEL_PERSIST_TYPE_RECORD_FIRST_PASS,
00062 CEL_PERSIST_TYPE_SERVER_CONTROL,
00063 CEL_PERSIST_TYPE_CLIENT_CONTROL,
00064 CEL_PERSIST_TYPE_SERVER_FORCING
00065 };
00066
00080 enum celPersistenceResult
00081 {
00082 CEL_PERSIST_RESULT_UNDEF = 0,
00083 CEL_PERSIST_RESULT_OK,
00084 CEL_PERSIST_RESULT_CHEAT_SUSPICIOUS,
00085 CEL_PERSIST_RESULT_CHEAT_CLEAR,
00086 CEL_PERSIST_RESULT_ERROR,
00087 CEL_PERSIST_RESULT_UNKNOWN_PC
00088 };
00089
00093 struct iCelDataBuffer : public virtual iBase
00094 {
00095 SCF_INTERFACE (iCelDataBuffer, 0, 0, 2);
00096
00102 virtual long GetSerialNumber () const = 0;
00103
00107 virtual size_t GetDataCount () const = 0;
00108
00112 virtual void Reset () = 0;
00113
00117 virtual celData* GetData () = 0;
00118
00122 virtual celData* GetData (size_t idx) = 0;
00123
00127 virtual celData* AddData () = 0;
00128
00130 virtual void Add (bool v) { AddData ()->Set (v); }
00131 virtual void Add (int8 v) { AddData ()->Set (v); }
00132 virtual void Add (int16 v) { AddData ()->Set (v); }
00133 virtual void Add (int32 v) { AddData ()->Set (v); }
00134 virtual void Add (uint8 v) { AddData ()->Set (v); }
00135 virtual void Add (uint16 v) { AddData ()->Set (v); }
00136 virtual void Add (uint32 v) { AddData ()->Set (v); }
00137 virtual void Add (float v) { AddData ()->Set (v); }
00138 virtual void Add (const csVector2& v) { AddData ()->Set (v); }
00139 virtual void Add (const csVector3& v) { AddData ()->Set (v); }
00140 virtual void Add (const csColor& v) { AddData ()->Set (v); }
00141 virtual void Add (const char* v) { AddData ()->Set (v); }
00142 virtual void Add (iCelPropertyClass* v) { AddData ()->Set (v); }
00143 virtual void Add (iCelEntity* v) { AddData ()->Set (v); }
00144 virtual void AddAction (const char* v) { AddData ()->SetAction (v); }
00145 virtual void AddIBase (iBase* v) { AddData ()->SetIBase (v); }
00146
00148 virtual bool GetBool ()
00149 {
00150 celData* cd = GetData ();
00151 return (cd && cd->type == CEL_DATA_BOOL) ? cd->value.bo : false;
00152 }
00153 virtual int8 GetInt8 ()
00154 {
00155 celData* cd = GetData ();
00156 return (cd && cd->type == CEL_DATA_BYTE) ? cd->value.b : 0;
00157 }
00158 virtual uint8 GetUInt8 ()
00159 {
00160 celData* cd = GetData ();
00161 return (cd && cd->type == CEL_DATA_UBYTE) ? cd->value.ub : 0;
00162 }
00163 virtual int16 GetInt16 ()
00164 {
00165 celData* cd = GetData ();
00166 return (cd && cd->type == CEL_DATA_WORD) ? cd->value.w : 0;
00167 }
00168 virtual uint16 GetUInt16 ()
00169 {
00170 celData* cd = GetData ();
00171 return (cd && cd->type == CEL_DATA_UWORD) ? cd->value.uw : 0;
00172 }
00173 virtual int32 GetInt32 ()
00174 {
00175 celData* cd = GetData ();
00176 return (cd && cd->type == CEL_DATA_LONG) ? cd->value.l : 0;
00177 }
00178 virtual uint32 GetUInt32 ()
00179 {
00180 celData* cd = GetData ();
00181 return (cd && cd->type == CEL_DATA_ULONG) ? cd->value.ul : 0;
00182 }
00183 virtual float GetFloat ()
00184 {
00185 celData* cd = GetData ();
00186 return (cd && cd->type == CEL_DATA_FLOAT) ? cd->value.f : 0.0f;
00187 }
00188 virtual iString* GetString ()
00189 {
00190 celData* cd = GetData ();
00191 return (cd && cd->type == CEL_DATA_STRING) ? cd->value.s : (iString*)0;
00192 }
00193 virtual void GetVector2 (csVector2& v)
00194 {
00195 celData* cd = GetData ();
00196 if (cd && cd->type == CEL_DATA_VECTOR2)
00197 { v.x = cd->value.v.x; v.y = cd->value.v.y; }
00198 else v.x = v.y = 0;
00199 }
00200 virtual void GetVector3 (csVector3& v)
00201 {
00202 celData* cd = GetData ();
00203 if (cd && cd->type == CEL_DATA_VECTOR3)
00204 { v.x = cd->value.v.x; v.y = cd->value.v.y; v.z = cd->value.v.z; }
00205 else v.x = v.y = v.z = 0;
00206 }
00207 virtual void GetColor (csColor& v)
00208 {
00209 celData* cd = GetData ();
00210 if (cd && cd->type == CEL_DATA_COLOR)
00211 {
00212 v.red = cd->value.col.red;
00213 v.green = cd->value.col.green;
00214 v.blue = cd->value.col.blue;
00215 }
00216 else v.red = v.green= v.blue = 0;
00217 }
00218 virtual iCelPropertyClass* GetPC ()
00219 {
00220 celData* cd = GetData ();
00221 return (cd && cd->type == CEL_DATA_PCLASS)
00222 ? cd->value.pc
00223 : (iCelPropertyClass*)0;
00224 }
00225 virtual iCelEntity* GetEntity ()
00226 {
00227 celData* cd = GetData ();
00228 return (cd && cd->type == CEL_DATA_ENTITY)
00229 ? cd->value.ent
00230 : (iCelEntity*)0;
00231 }
00232 virtual iBase* GetIBase ()
00233 {
00234 celData* cd = GetData ();
00235 return (cd && cd->type == CEL_DATA_IBASE) ? cd->value.ibase : (iBase*)0;
00236 }
00237 virtual csString GetDebugInfo ()
00238 {
00239 if (GetDataCount () == 0) return "Data buffer: empty\n";
00240
00241 csString txt = "Data buffer:\n";
00242 size_t i = 0, count = GetDataCount ();
00243 for ( ; i < count; i++)
00244 txt.AppendFmt("\t%s\n", GetData (i)->GetDebugInfo ().GetData ());
00245
00246 return txt;
00247 }
00248 };
00249
00256 struct iCelPersistentDataList : public virtual iBase
00257 {
00258 SCF_INTERFACE (iCelPersistentDataList, 0, 0, 1);
00259
00263 virtual size_t GetCount () const = 0;
00264
00274 virtual bool GetPersistentData (size_t idx, csRef<iCelDataBuffer>& databuf,
00275 csString& pc_name, csString& pc_tag) const = 0;
00276
00286 virtual void AddPersistentData (csRef<iCelDataBuffer>& databuf,
00287 csString& pc_name, csString& pc_tag) = 0;
00288 };
00289
00297 struct iCelLocalEntitySet : public virtual iBase
00298 {
00299 SCF_INTERFACE (iCelLocalEntitySet, 0, 0, 1);
00300
00302 virtual size_t GetEntityCount () const = 0;
00303
00305 virtual iCelEntity* GetEntity (size_t idx) const = 0;
00306
00308 virtual void AddEntity (iCelEntity* entity) = 0;
00309
00311 virtual bool IsLocal (iCelEntity* entity) = 0;
00313 virtual bool IsLocal (iCelPropertyClass* pc) = 0;
00314
00320 virtual csPtr<iCelDataBuffer> SaveExternalEntity (iCelEntity* entity) = 0;
00321
00327 virtual iCelEntity* FindExternalEntity (iCelDataBuffer* databuf) = 0;
00328
00334 virtual csPtr<iCelDataBuffer> SaveExternalPC (iCelPropertyClass* pc) = 0;
00335
00341 virtual iCelPropertyClass* FindExternalPC (iCelDataBuffer* databuf) = 0;
00342 };
00343
00348 struct iCelPersistence : public virtual iBase
00349 {
00350 SCF_INTERFACE (iCelPersistence, 0, 1, 1);
00351
00361 virtual bool Load (iCelLocalEntitySet* set, const char* name) = 0;
00362
00371 virtual bool Save (iCelLocalEntitySet* set, const char* name) = 0;
00372
00380 virtual bool Load (iCelLocalEntitySet* set, iFile* file) = 0;
00381
00388 virtual bool Save (iCelLocalEntitySet* set, iFile* file) = 0;
00389 };
00390
00391 #endif // __CEL_PL_PERSIST__