VR-Forces 4.5 Class Documentation
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
luaObjectSerializer.h
Go to the documentation of this file.
1 /*******************************************************************************
2 ** Copyright (c) 2013 MAK Technologies, Inc.
3 ** All rights reserved.
4 *******************************************************************************/
5 #pragma once
6 
7 #include <vrfLua/vrfLuaDefines.h>
8 
9 #include <vlutil/vlString.h>
10 #include <map>
11 #include <set>
12 #include <vrfLua/luaUtils.h>
14 #include <vrfcore/simManager.h>
15 
16 struct lua_State;
17 
18 typedef DtAsciiSerializable* (*DtSerializableCreatorFunc)();
19 typedef luabind::object (*DtDeserializerFunc)(lua_State* state, const DtString& typeName, const DtString& serializedString);
20 typedef bool (*DtSerializerFunc)(const luabind::object&, DtString& serializedString);
21 
23 {
24 protected:
27  DtLuaObjectSerializer& operator=(const DtLuaObjectSerializer& other);
28 
29 public:
30  virtual ~DtLuaObjectSerializer();
31 
33  static DtLuaObjectSerializer* instance();
34 
37  virtual DtAsciiSerializable* createInstance(const DtString& typeName, const DtString& serializedString);
38 
39  virtual void registerCreatorFunc(const DtString& typeName, DtSerializableCreatorFunc func);
40 
42  virtual void registerDeserializerFunc(const DtString& typeName, DtDeserializerFunc func);
43 
45  virtual void registerSerializerFunc(const DtString& typeName, DtSerializerFunc func);
46 
49  virtual bool serializeObject(const luabind::object& lobj, std::string& buffer, std::vector<luabind::object> stackParameters);
50 
54  virtual const char* deserializeObject(lua_State* state, const char* buffer, luabind::object& lobj);
55 
56  virtual bool doesSerializerExist(const DtString& type);
57 
58  virtual DtSimManager& simManager();
59 
60  static DtLuaObjectSerializer* create(DtSimManager* simManager);
61  static void setFactory( DtLuaObjectSerializer* factory );
62 
64  virtual bool saveLuaScriptGlobals(lua_State* state, std::string &buffer);
65 
67  virtual bool saveLuaScriptTable(lua_State* state, const std::string& key, const luabind::object& lobj, std::string &buffer);
68 
70  virtual bool loadLuaScriptGlobals(lua_State* state, const DtString& buffer);
71 
72  typedef DtTemplatedException<300> DtStateParseException;
73 
75  virtual void addKeyToIgnore(const std::string&);
76 
78  virtual void removeKeyToIgnore(const std::string&);
79 
80 protected:
82  virtual const char* parseBufferToTableKeyVals(lua_State* state, luabind::object& table, const char* buffer);
83 
86  virtual void parseTableKeyValsToBuffer(const luabind::object&, std::string& buffer,
87  std::vector<luabind::object> stackParameters);
88 
89  virtual bool needsEscaping(const DtString& buffer) const;
90  virtual void applyStandardEscapes(DtString& buffer);
91  virtual bool needsUnescaping(DtString& buffer) const;
92  virtual void unapplyStandardEscapes(DtString& buffer);
93  virtual bool isKeyToIgnore(const DtString& keyName);
94  virtual bool IsALoadedPackage(lua_State * L, const char * tableName);
95 
98  virtual const char* nextToken(char separator, const char* buf, DtString& tok);
99 
100  std::map<DtString, DtSerializableCreatorFunc> myCreators;
101  std::map<DtString, DtSerializerFunc> mySerializers;
102  std::map<DtString, DtDeserializerFunc> myDeserializers;
105 
107  std::set<std::string> myKeysToIgnore;
108 };
109 
110 namespace vrfLua
111 {
118  template<typename T>
119  bool DtAsciiSerializeLua(const luabind::object& lobj, DtString& serializedString)
120  {
121  if (lobj)
122  {
123  T* obj = luaTypeCastNoThrow<T>(lobj);
124 
125  if (obj)
126  {
127  serializedString += obj->serialize();
128  return true;
129  }
130  }
131  return false;
132  }
133 
134  template<typename T, typename Parent>
135  bool DtAsciiSerializeLua(const luabind::object& lobj, DtString& serializedString)
136  {
137  if (lobj)
138  {
139  Parent* pobj = luaTypeCastNoThrow<Parent>(lobj);
140  T* obj = dynamic_cast<T*>(pobj);
141 
142  if (obj)
143  {
144  serializedString += obj->serialize();
145  return true;
146  }
147  }
148  return false;
149  }
150 
157  template<typename T>
158  luabind::object DtAsciiDeserializeLua(lua_State* state, const DtString& typeName, const DtString& serializedString)
159  {
161  if (deserializer)
162  {
163  DtAsciiSerializable* obj = deserializer->createInstance(typeName, serializedString);
164  if (obj && (obj->objectType() == typeName))
165  {
166  obj->deserialize(serializedString);
167  luabind::object lobj(state, *(dynamic_cast<T*>(obj)));
168 
169  delete obj;
170 
171  return lobj;
172  }
173 
174  delete obj;
175  }
176 
177  return luabind::object();
178  }
179 
180  template<typename T>
182  lua_State* state, const DtString& typeName, const DtString& serializedString)
183  {
185  if (deserializer)
186  {
187  boost::shared_ptr<T> obj(static_cast<T*>(deserializer->createInstance(typeName, serializedString)));
188  if (obj.get() && obj->objectType() == typeName)
189  {
190  obj->deserialize(serializedString);
191  return luabind::object(state, obj);
192  }
193  }
194 
195  return luabind::object();
196  }
197 }
198 

Document ID: Generated on Thu Mar 23 18:54:12 EDT 2017 from SVN revision 174804
Copyright © 2005-2017 VT MÄK. All Rights Reserved (www.mak.com)