VR-Forces Developer's Guide
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
readerWriter.h
Go to the documentation of this file.
1 /*******************************************************************************
2 ** Copyright (c) 2013 MAK Technologies, Inc.
3 ** All rights reserved.
4 *******************************************************************************/
5 
8 
9 #pragma once
10 
12 #include "stdio.h"
13 #include <mtl/mtl.h>
14 #include <vlutil/vlString.h>
18 #include <vlutil/vlMachineTypes.h>
20 #include <mtl/environment.h>
21 #include <vlutil/vlFilename.h>
22 #include <list>
23 #include <vlutil/vlSmartPointers.h>
24 #include <vlutil/vlTime.h>
25 
26 #include <ostream>
27 
31 
32 typedef DT_DLL_readerWriter DtBoost::shared_ptr<DtEnvironment> DtEnvironmentSP;
33 
34 // \brief The base class for all objects that are part of the ReaderWriter system
35 // in VR-Forces.
36 // ReaderWriter classes and the ReaderWriter system provide a mechanism for
37 // serializing objects to a text file that us human readable and editable,
38 // and reading that data back into a C++ structure.
39 // The data is written to the file in an "mtl" format, which is a list-like
40 // format, using key-value pairs.
41 // \par
42 // ReaderWriter objects can be nested within other ReaderWriter objects to
43 // create a hierarchy. Each ReaderWriter object reads and writes its immediate
44 // children, and relies on those children to read and write their own contents.
45 // The ordering of the values within a single block of reader writer data is not
46 // relevant, since it is treated as a key-value pair set.
47 // \par
48 // Each DtReaderWriter subclass that contains ReaderWriter children creates
49 // those children in its constructor, and gives them both types and names (keys)
50 // at that time. When a class is read from file, each key encountered in the file
51 // is looked up in the reading class, and the stream is passed to that child for
52 // reading. Writing work in a similar way in reverse.
53 // \par
54 // Not all children items of a DtReaderWriter need to exist in the file that is
55 // being read. If a particular key is not present in the file being read, then
56 // the default value (assigned in the constructor) for that value is used, and
57 // that member has it valueSpecified() flag set to false.
58 // \par Aliases
59 // It is possible to create aliases for a particular key so that multiple keys
60 // will cause data to be read into the same data member. This is useful when
61 // newer versions of code are reading older files, and some members have changed
62 // names, but need to be able to read the old files. See the addAlias() and
63 // hasAlias() methods.
64 // \par Variable Bindings
65 // The ReaderWriter system also supports a concept called variable bindings.
66 // This allows substitutions to be made as a file is read by a reader writer class.
67 // The class DtRwVariableBindings holds a set of bindings between string variable names and
68 // DtReaderWriter instances which will be used in place of those variables when
69 // encountered in the reading of a file. The \a $ character is used as a special
70 // variable designation character for this purpose. The types of the DtReaderWriter
71 // objects are explicitly indicated in the DtRwVariableBindings, and must match
72 // the type of DtReaderWriter object being read when the variable is encountered
73 // for the substitution to be successful.
74 // \par
75 // The DtRwVariableBindings class itself is also a DtReaderWriter subclass, and
76 // as such can also be placed in the file structures. Each DtReaderWriter block
77 // in a file may contain a special "variable-bindings" section at the start, which
78 // specifies any variables that will be substituted, and what they will be substituted
79 // with for all of its members, as well as all its child members.
80 // \par
81 // As a special case, variables appearing within DtRwString members will be
82 // substituted if there is a string type variable defined with the specified name.
83 // \par Examples
84 // - \link convertparamdb convertParamDb \endlink
86 {
87 public:
88 
89  typedef std::vector<DtSymbolString> aliasContainer;
90  typedef std::vector<DtSymbolString>::iterator aliasIter;
91  typedef std::vector<DtSymbolString>::const_iterator aliasConstIter;
92  typedef std::vector<DtFilename> SearchPaths;
93 
96 
101  parentRegistry = NULL, bool readonly = false);
103  parentRegistry = NULL, bool readonly = false);
104 
106  DtReaderWriter(const DtString& name, const DtReaderWriter& orig,
107  DtReaderWriterRegistry* parentRegistry = NULL);
108  DtReaderWriter(const DtSymbolString& name, const DtReaderWriter& orig,
109  DtReaderWriterRegistry* parentRegistry = NULL);
110 
112  explicit DtReaderWriter(const DtReaderWriter&,
113  DtReaderWriterRegistry* parentRegistry = NULL);
114 
116  const DtReaderWriter& operator=(const DtReaderWriter& orig);
117 
119  bool operator==(const DtReaderWriter&) const;
120 
121  bool operator!=(const DtReaderWriter& rhs) { return !(*this == rhs); };
122 
124  virtual ~DtReaderWriter();
125 
133  virtual void putSelf(std::string& fp, int indentLevel = 0,
134  bool writeUnspecified = false, const DtFilename& path =
135  DtFilename::nullFilename());
136 
138  virtual void postPutSelf();
139 
141  virtual void prePutSelf();
142 
148  virtual void getSelf(DtlObjPtr args,
149  const DtReaderWriter::SearchPaths& searchPaths = SearchPaths(),
150  const DtVariableBindingsList& variableBindings = nullVariableReference());
151 
153  virtual void postGetSelf();
154 
156  virtual void preGetSelf();
157 
160  virtual void writeSelf(std::string& fp, int indentLevel = 0,
161  bool writeUnspecified = false,
162  const DtFilename& path = DtFilename::nullFilename());
163 
165 
166  virtual void putData(std::string& fp, int indentLevel = 0);
167  virtual DtlObjPtr getData(DtlObjPtr args, const SearchPaths& searchPaths,
168  const DtVariableBindingsList& variableBindings);
170 
172  virtual DtSymbolString name() const;
173 
174  static void putIndent(std::string& fp, int indentLevel);
175 
176  // \return An empty DtVariableBindingList, which can be passed
177  // to getSelf() methods if there are no variables to bind.
178  static const DtVariableBindingsList& nullVariableReference();
179 
195 
196  virtual void setValueSpecified(bool specified, bool recurse = false);
197  virtual bool valueSpecified() const;
199 
201  virtual void addAlias(const DtSymbolString& alias);
202  virtual void addAlias(const DtString& alias);
203 
205  virtual bool hasAlias(const DtSymbolString& alias);
206 
208  virtual const aliasContainer& aliases() const;
209 
211  virtual void setReadonly(bool flag);
212 
214  inline bool isReadonly() const
215  {
216  return myReadOnlyFlag;
217  }
218 
221  virtual void reset();
222 
225 
226  virtual bool isVariableReference() const;
229  virtual void setIsVariableReference(bool value);
230 
233  virtual void clearAllVariableReferenceFlags();
234 
236 
240  virtual int alignment() const;
241 
246 
247  virtual DtSymbolString variableName() const;
248  virtual void setVariableName(const DtSymbolString variableName);
250 
255  virtual const DtReaderWriter* defaultRWValue() const;
256  virtual DtReaderWriter* defaultRWValue();
257 
260  virtual void setDefaultRWValue(DtReaderWriter*);
261 
265  virtual bool checkAndSetDefaultRWValue(DtlObjPtr args,
266  const DtReaderWriter::SearchPaths& searchPaths = SearchPaths(),
267  const DtVariableBindingsList& variableBindings = nullVariableReference());
269 
272  virtual DtString toXml() const;
273 
276  virtual DtRwVariableBindings* generateVariableBindings() const;
277 
279  static DtReaderWriter* createFromXmlFile(const DtFilename&, bool createAsProperty = false);
280 
282  static DtReaderWriter* createFromXml(const DtString&, bool createAsProperty = false);
283 
285  static DtReaderWriter* createFromEnvironment(DtEnvironmentSP, bool createAsProperty = false);
286 
288  virtual bool toXml(const DtFilename&) const;
289 
291  virtual bool fromXml(const DtString&);
292 
294  virtual bool fromXmlFile(const DtFilename&);
295  virtual void putSelf(DtEnvironmentSP, DtEnvValueSP parent) const;
296 
300  static DtString getAttribute(DtEnvironmentSP env, const DtString& name, DtEnvValueSP root);
301 
303  virtual void putData(DtEnvironmentSP, DtEnvValueSP value) const;
304 
306  virtual void putVariableReference(DtEnvironmentSP, DtEnvValueSP value) const;
307 
308  virtual void getSelf(const DtEnvironmentSP, const DtEnvValueSP root,
309  const SearchPaths& searchPaths = SearchPaths(),
310  const DtVariableBindingsList& bindings = DtVariableBindingsList());
311 
313  virtual void getData(const DtEnvironmentSP, const DtEnvValueSP,
314  const SearchPaths& searchPaths = SearchPaths(),
315  const DtVariableBindingsList& bindings = DtVariableBindingsList());
316 
318  virtual void unrecognizedItem(const DtEnvironmentSP env, const DtEnvValueSP root,
319  const SearchPaths& searchPaths, const DtVariableBindingsList& varBindings);
320 
322  virtual void getVariableReference(DtEnvironmentSP, DtEnvValueSP value);
323 
325 
330  virtual bool variableIsBound() const;
334  virtual void unbindVariable();
335 
336  static void setPostGetSelfCallback(DtGetSelfCallbackFcn fcn, void* usrData);
337  static void setPrePutSelfCallback(DtPutSelfCallbackFcn fcn, void* usrData);
338 
339  static void setPutIndent(bool);
340  static bool putIndent();
341 
343 
344  const DtReaderWriterRegistry& registry() const;
345  DtReaderWriterRegistry& registry();
347 
356  virtual void setName(const DtString&);
357 
361  virtual const char* readerWriterType() const;
362 
364  static const char* theXmlType();
365 
366  virtual const char* xmlType() const
367  {
368  return theXmlType();
369  }
370 
373  virtual DtString prettyPrint() const;
374 
375  std::string debugText() const;
376 
386  virtual void bindVariables(DtVariableBindingsList variableBindings);
387 
388  typedef std::pair<DtSymbolString, DtString> DtVariableNameType;
392  virtual std::list<DtVariableNameType> unboundVariables() const;
393 
398  static const DtFilename& appPath();
399 
400  bool invalid() const;
401 
403  virtual bool hasChild(const DtReaderWriter* p) const;
404 
405  typedef DtReaderWriterFactory* (*DtReaderWriterFactoryCreatorFcn)();
406 
408  static void setFactoryCreatorFunction(DtReaderWriterFactoryCreatorFcn fcn);
409 
410  static void createReaderWriterFactory();
411  static void cleanupFactory();
412 
413  // \return A pointer to the static DtReaderWriterFactory. This factory
414  // can create instances of DtReaderWriter subclasses that have been
415  // registered with it.
416  static DtReaderWriterFactory* factory();
417 
420  virtual bool hasVariableReference() const;
421 
425  virtual void bindLocalVariables(const DtVariableBindingsList& variableBindings);
426 
430  virtual DtPropertyInterface* property();
431  virtual const DtPropertyInterface* property() const;
433 
436  virtual void recordUpdateTime() const;
437 
440  virtual bool changedSinceLastChecked();
441 
444  virtual bool peekChangedSinceLastChecked() const;
445 
446  static void setOutputStream(DtOutputStream* stream);
447  static DtOutputStream& outputStream();
448 
449 protected:
453  virtual void bindToRwAsVariable(const DtReaderWriter* rw);
454 
455 protected:
456 
465 
467 
470 
472 
476 
477  static bool theCreatorFcnSet;
479  static DtReaderWriterFactoryCreatorFcn theFactoryCreatorFcn;
480  static bool thePutIndent;
481 
483  bool myInvalid;
484 
488 
489  static DtOutputStream* theOutputStream;
490 };
491 
493 {
494  return myRegistry;
495 }
496 
498 {
499  return myRegistry;
500 }
501 
502 inline bool DtReaderWriter::invalid() const
503 {
504  return myInvalid;
505 }
506 
507 inline std::string& operator<<(std::string& a, const std::string& b) { a += b; return a; }
508 inline std::string& operator<<(std::string& a, const char* b) { a += b; return a; }
509 inline std::string& operator<<(std::string& a, char b) { a += b; return a; }
510 DT_DLL_readerWriter std::string& operator<<(std::string&, int);
511 DT_DLL_readerWriter std::string& operator<<(std::string&, unsigned int);
512 DT_DLL_readerWriter std::string& operator<<(std::string&, double);
513 DT_DLL_readerWriter std::string& operator<<(std::string&, float);
bool invalid() const
Definition: readerWriter.h:502
class DtGetSelfCallbackInfo:
Definition: getSelfCallbackInfo.h:25
std::vector< DtSymbolString > aliasContainer
Definition: readerWriter.h:89
bool myVariableIsBound
Definition: readerWriter.h:464
#define DT_DLL_readerWriter
This file is used to determine how to build Disable inconsistent dll linkage warning Visual Studio 6...
Definition: readerWriterDefines.h:34
std::vector< DtSymbolString >::iterator aliasIter
Definition: readerWriter.h:90
This class allows one to collect and compare strings using an index number instead of having to do st...
Definition: symbolString.h:27
DtReaderWriter * myDefaultValue
Definition: readerWriter.h:466
void(* DtPutSelfCallbackFcn)(DtReaderWriter *obj, std::string &fp, void *userData)
Definition: putSelfCallbackInfo.h:16
bool myInvalid
Set to true if there is a problem reading this item.
Definition: readerWriter.h:483
bool myReadOnlyFlag
Definition: readerWriter.h:461
DT_DLL_readerWriter DtBoost::shared_ptr< DtEnvironment > DtEnvironmentSP
Definition: readerWriter.h:30
DT_DLL_terrainCS bool operator==(const DtDegMinSec &lhs, const DtDegMinSec &rhs)
Definition: readerWriter.h:85
static DtReaderWriterFactoryCreatorFcn theFactoryCreatorFcn
Definition: readerWriter.h:479
DtReaderWriterRegistry * myParentRegistry
Definition: readerWriter.h:459
DT_DLL_features std::ostream & operator<<(std::ostream &, const DtFeatureTransform &)
std::ostream output.
static const DtVariableBindingsList theEmptyVariableBindingsList
Definition: readerWriter.h:475
Definition: readerWriterRegistry.h:39
bool myValueSpecified
Definition: readerWriter.h:460
std::pair< DtSymbolString, DtString > DtVariableNameType
Definition: readerWriter.h:388
DtSymbolString myVariableName
Definition: readerWriter.h:463
Interface class used to define minimal interface for a property. The DtPropertyInterface class provid...
Definition: propertyInterface.h:48
ReaderWriter object that maintains a list of reader-writer variable bindings. It keeps a list of name...
Definition: rwVariableBindings.h:27
static DtReaderWriterFactory * theFactory
Definition: readerWriter.h:478
const DtSymbolString myName
Definition: readerWriter.h:457
static DtGetSelfCallbackInfo thePostGetSelfCallback
Definition: readerWriter.h:473
class DtPutSelfCallbackInfo:
Definition: putSelfCallbackInfo.h:26
virtual const char * xmlType() const
Definition: readerWriter.h:366
const DtReaderWriterRegistry & registry() const
Collection of child DtReaderWriter nodes owned by this object.
Definition: readerWriter.h:492
std::list< const DtRwVariableBindings * > DtVariableBindingsList
Definition: readerWriterRegistry.h:29
std::vector< DtSymbolString >::const_iterator aliasConstIter
Definition: readerWriter.h:91
bool isReadonly() const
Definition: readerWriter.h:214
bool myIsVariableReference
Definition: readerWriter.h:462
static bool theCreatorFcnSet
Definition: readerWriter.h:477
static DtOutputStream * theOutputStream
Definition: readerWriter.h:489
std::vector< DtFilename > SearchPaths
Definition: readerWriter.h:92
aliasContainer myAliases
Container for the aliases which represent alternative names for the object.
Definition: readerWriter.h:469
voidpf stream
Definition: ioapi.h:39
static DtPutSelfCallbackInfo thePrePutSelfCallback
Definition: readerWriter.h:474
void(* DtGetSelfCallbackFcn)(DtReaderWriter *obj, DtlObjPtr args, void *userData)
Definition: getSelfCallbackInfo.h:15
Factory for creating ReaderWriter objects dynamically based on a type string. This factory also handl...
Definition: readerWriterFactory.h:34
bool operator!=(const DtReaderWriter &rhs)
Definition: readerWriter.h:121
static bool thePutIndent
Definition: readerWriter.h:480
static DtString theUnspecifiedValue
Definition: readerWriter.h:471
DtReaderWriterRegistry myRegistry
Definition: readerWriter.h:458
bool myChangedFlag
Set to true when value changes Set to false when value checked with changedSinceLastChecked.
Definition: readerWriter.h:487

Document ID: Generated on Wed Mar 27 22:49:11 EDT 2024 from SVN revision 264633
Copyright © 2005-2024 MAK Technologies. All Rights Reserved (www.mak.com)