COVISE Core
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros
regClass.h
Go to the documentation of this file.
1 /* This file is part of COVISE.
2 
3  You can use it under the terms of the GNU Lesser General Public License
4  version 2.1 or later, see lgpl-2.1.txt.
5 
6  * License: LGPL 2+ */
7 
8 #ifndef REGCLASS_H
9 #define REGCLASS_H
10 
11 #include <net/tokenbuffer.h>
12 #include <net/message_types.h>
13 #include <map>
14 #include <set>
15 #include <memory>
16 #include <util/coExport.h>
17 #include <fstream>
18 
19 class coCharBuffer;
20 namespace covise
21 {
22 class VRBClient;
23 }
24 
25 namespace vrb
26 {
27 class clientRegClass;
28 class clientRegVar;
29 class serverRegVar;
30 class serverRegClass;
31 class regClassObserver;
32 class regVarObserver;
33 class VrbClientRegistry;
34 class SessionID;
35 
36 template<class variableType>
37 class regClass
38 {
39 public:
40  typedef std::map<const std::string, std::shared_ptr<variableType>> VariableMap;
42  : name(n)
43  , classID(ID)
44  , isDel(false)
45  {
46  }
48  int getID()
49  {
50  return (classID);
51  }
52  void setID(int id)
53  {
54  classID = id;
55  }
57  {
58  return (name);
59  }
61  void append(variableType * var)
62  {
63  myVariables[var->getName()].reset(var);
64  }
66  variableType *getVar(const std::string &n)
67  {
68  auto it = myVariables.find(n);
69  if (it == myVariables.end())
70  {
71  return (NULL);
72  }
73  return it->second.get();
74  }
76  void deleteVar(const std::string &n)
77  {
78  myVariables.erase(n);
79  }
82  {
83  typename VariableMap::iterator it = myVariables.begin();
84  while (it != myVariables.end())
85  {
86  if (it->second->isStatic())
87  {
88  it = myVariables.erase(it);
89  }
90  else
91  {
92  ++it;
93  }
94  }
95  }
96  bool isDeleted()
97  {
98  return isDel;
99  }
100  void setDeleted(bool isdeleted = true)
101  {
102  isDel = isdeleted;
103  for (const auto var : myVariables)
104  {
105  var.second->setDeleted(isdeleted);
106  }
107  }
109  void writeClass(std::ofstream &file) {
110  file << name;
111  file << "\n";
112  file << "{";
113  file << "\n";
114  for (const auto var : myVariables)
115  {
116  var.second->writeVar(file);
117  file << "\n";
118  }
119  file << "}";
120 
121  }
123  void readVar(std::ifstream &file)
124  {
125 
126  while (true)
127  {
128  std::string varName = "invalid";
129  int valueSize = -1;
130  file >> varName;
131  if (varName == "}")
132  {
133  return;
134  }
135  varName.pop_back();
136  file >> valueSize;
137  char *value = new char[valueSize];
138  file.read(value, valueSize);
139  covise::TokenBuffer tb(value, valueSize);
140  myVariables[varName] = createVar(varName, std::move(tb));
141  delete[] value; //createVar did copy the tokenbuffer
142  }
143 
144  };
145  virtual std::shared_ptr<variableType> createVar(const std::string &name, covise::TokenBuffer &&value) = 0;
147  {
148  };
149 protected:
151  int classID = -1;
152  bool isDel;
154 };
155 
156 template<class classType>
157 class regVar
158 {
159 protected:
162  classType *myClass;
163  bool staticVar;
164  bool isDel;
165 
166 public:
167 
168  regVar(classType *c, const std::string &n, covise::TokenBuffer &v, bool s = 1)
169  {
170  myClass = c;
171  name = n;
172  staticVar = s;
173  setValue(v);
174  isDel = false;
175  }
177  {
178  value.delete_data();
179  }
182  {
183  value.rewind();
184  return (value);
185  };
187  classType *getClass()
188  {
189  return (myClass);
190  };
192  inline void setValue(const covise::TokenBuffer &v)
193  {
194  value.copy(v);
195  }
197  int isStatic()
198  {
199  return (staticVar);
200  };
203  {
204  return (name);
205  };
206 
207  bool isDeleted()
208  {
209  return isDel;
210  }
211  void setDeleted(bool isdeleted = true)
212  {
213  isDel = isdeleted;
214  }
215  void writeVar(std::ofstream &file)
216  {
217  file << " " << name << "; ";
218  int length = value.get_length();
219  file << length;
220  file.write(value.get_data(), value.get_length());
221  }
222 };
223 
224 
225 class VRBEXPORT clientRegClass : public regClass<clientRegVar>
226 {
227 private:
228  regClassObserver *_observer = nullptr; //local observer class
231 public:
233  clientRegClass(const std::string &n, int ID, VrbClientRegistry *reg);
235  {
236  return _observer;
237  }
240  {
241  _observer = ob;
242  }
244  {
245  return lastEditor;
246  }
247  void setLastEditor(int lastEditor);
248  void notifyLocalObserver();
249  void resubscribe(const SessionID &sessionID);
250  void subscribe(regClassObserver *obs, const SessionID &sessionID);
251  VariableMap &getAllVariables();
252  std::shared_ptr<clientRegVar> createVar(const std::string &name, covise::TokenBuffer &&value) override;
253 };
254 class VRBEXPORT clientRegVar : public regVar<clientRegClass>
255 {
256 private:
259 public:
260  using regVar::regVar;
263  {
264  return _observer;
265  }
266  void notifyLocalObserver();
267  void subscribe(regVarObserver *ob, const SessionID &sessionID);
268 
269  //void attach(regVarObserver *ob)
270  //{
271  // _observer = ob;
272  //}
274  {
275  return lastEditor;
276  }
277  void setLastEditor(int lastEditor)
278  {
279  this->lastEditor = lastEditor;
280  }
281 };
282 
283 
284 
285 
287 {
288 public:
289  virtual void update(clientRegClass *theChangedClass) = 0;
290 };
292 {
293 public:
294  virtual void update(clientRegVar *theChangedVar) = 0;
295 };
296 }
297 #endif
VariableMap myVariables
Definition: regClass.h:153
Definition: regClass.h:254
bool staticVar
Definition: regClass.h:163
int isStatic()
returns true if this Var is static
Definition: regClass.h:197
int lastEditor
Definition: regClass.h:258
void writeVar(std::ofstream &file)
Definition: regClass.h:215
void attach(regClassObserver *ob)
attach a observer to the regClass
Definition: regClass.h:239
std::string name
Definition: regClass.h:148
GLsizei const GLchar *const * string
Definition: khronos-glext.h:6750
void writeClass(std::ofstream &file)
write the classname and all variables in a .vrbreg file
Definition: regClass.h:109
~regClass()
Definition: regClass.h:146
void setID(int id)
Definition: regClass.h:52
GLenum GLuint GLenum GLsizei length
Definition: khronos-glext.h:6279
#define ID(x)
Definition: coObjID.cpp:18
int classID
Definition: regClass.h:151
const std::string & getName()
returns the Name
Definition: regClass.h:202
std::string name
Definition: regClass.h:161
Definition: regClass.h:225
Definition: SessionID.h:19
void setDeleted(bool isdeleted=true)
Definition: regClass.h:211
Definition: regClass.h:157
regVar(classType *c, const std::string &n, covise::TokenBuffer &v, bool s=1)
Definition: regClass.h:168
virtual std::shared_ptr< variableType > createVar(const std::string &name, covise::TokenBuffer &&value)=0
GLuint const GLchar * name
Definition: khronos-glext.h:6722
const GLubyte * c
Definition: khronos-glext.h:9864
Definition: regClass.h:286
const std::string & getName()
Definition: regClass.h:56
bool isDeleted()
Definition: regClass.h:207
covise::TokenBuffer & getValue()
returns the value
Definition: regClass.h:181
int getLastEditor()
Definition: regClass.h:273
void setDeleted(bool isdeleted=true)
Definition: regClass.h:100
void deleteAllNonStaticVars()
remove some Variables
Definition: regClass.h:81
int getID()
get Class ID
Definition: regClass.h:48
Definition: VrbClientRegistry.h:24
classType * myClass
Definition: regClass.h:162
bool isDel
Definition: regClass.h:164
void setLastEditor(int lastEditor)
Definition: regClass.h:277
bool isDeleted()
Definition: regClass.h:96
covise_msg_type
Definition: message_types.h:64
Definition: regClass.h:37
void deleteVar(const std::string &n)
remove a Variable
Definition: regClass.h:76
#define VRBEXPORT
Definition: coExport.h:81
void rewind()
Definition: tokenbuffer.cpp:893
GLsizei const GLfloat * value
Definition: khronos-glext.h:6760
regClassObserver * getLocalObserver()
Definition: regClass.h:234
classType * getClass()
returns the class of this variable
Definition: regClass.h:187
regVarObserver * getLocalObserver()
returns the clent side observer
Definition: regClass.h:262
GLdouble s
Definition: khronos-glext.h:6441
bool isDel
Definition: regClass.h:152
variableType * getVar(const std::string &n)
getVariableEntry, returns NULL if not found
Definition: regClass.h:66
regVarObserver * _observer
Definition: regClass.h:257
std::map< const std::string, std::shared_ptr< variableType > > VariableMap
Definition: regClass.h:40
int lastEditor
Definition: regClass.h:229
void append(variableType *var)
creates a a regvar entry in the map
Definition: regClass.h:61
GLdouble n
Definition: khronos-glext.h:8447
~regVar()
Definition: regClass.h:176
void setValue(const covise::TokenBuffer &v)
set value
Definition: regClass.h:192
void readVar(std::ifstream &file)
reads the name and value out of stream, return false if class has no variable
Definition: regClass.h:123
GLenum GLuint id
Definition: khronos-glext.h:6279
covise::TokenBuffer value
Definition: regClass.h:160
GLenum type
Definition: khronos-glext.h:6279
#define NULL
Definition: covise_list.h:22
int getLastEditor()
Definition: regClass.h:243
Definition: regClass.h:291
const GLdouble * v
Definition: khronos-glext.h:6442
VrbClientRegistry * registry
Definition: regClass.h:230
Definition: tokenbuffer.h:74