NetBurner 3.1
config_obj.h
Go to the documentation of this file.
1 /*NB_REVISION*/
2 
3 /*NB_COPYRIGHT*/
4 
12 #ifndef CONFIG_OBJ_H
13 #define CONFIG_OBJ_H
14 
15 #include <buffers.h>
16 #include <nbstring.h>
17 #include <string.h>
18 #include <utils.h>
19 
20 void ShowTree();
21 
22 enum ConfigTestResult
23 {
24  eUnchanged,
25  eOk,
26  eBad
27 };
28 
29 /* Flag Values */
30 const uint32_t fConfigValueLeaf = 0x01;
31 const uint32_t fConfigReadOnly = 0x02;
32 const uint32_t fConfigModified = 0x04;
33 const uint32_t fConfigHidden = 0x08;
34 const uint32_t fConfigNoSave = 0x10;
35 const uint32_t fConfigNoObscure = 0x20;
36 const uint32_t fConfigNeedReboot = 0x40;
37 
38 /* Config Mask Values */
39 const uint32_t PermitFlashFromStorage = (0x80000000);
40 
41 class config_leaf;
42 class config_obj;
43 class ParsedJsonDataSet;
44 class RootParseStateInfo;
45 
46 typedef void(LeafCallBack)(config_leaf *p, void *pextra);
47 
53 {
54  protected:
55  config_leaf *FindChild(const char *&cp);
56  void RootParse(RootParseStateInfo &rpsi);
57 
58  public:
59  void FdPrintTree(int fd, config_leaf *pl, int n, bool pretty, uint32_t inhibit_mask = fConfigHidden, bool bRawValue = false);
60  void FdPrintSchema(int fd, config_leaf *pl, int n, bool pretty, uint32_t inhibit_mask = fConfigHidden);
61  void SchemaOptions(int fd, int indent, bool pretty);
62  void ForEachLeaf(LeafCallBack *pc, void *pextra, bool siblings = false);
63  bool ParseBuffer(fifo_buffer_storage &rxbuf, uint32_t permissions, const char *where);
64  bool ParseFlash(uint8_t *pdata, int len, uint32_t permissions);
65  config_obj *FindParrent() { return pParrent; };
66 
67  static config_leaf *FindConfigLeaf(const unsigned char *name);
68 
69  const char *pName;
70  const char *pDescription;
71  config_leaf *pNextSibling;
72  config_obj *pParrent;
73  config_leaf *pChildren;
74  config_leaf *pGList;
75  static config_leaf *pRootList;
76 
77  uint32_t m_Flags;
78  void DoSchemaLine(int fd, const char *name, const char *value, int indent, bool pretty, bool quoted = true);
79 
80  public:
81  bool NameMatch(const char *cp);
82  virtual const char *GetSortNameValue() { return pName; };
83  virtual void GetDescriptionValue(NBString &s) { s = pDescription; };
84  virtual void GetNameValue(NBString &s) { s = pName; };
85  virtual void GetTextValue(NBString &s) { s = pName; };
86  virtual void GetRawValue(NBString &s) { return GetTextValue(s); };
87  virtual void GetTypeValue(NBString &s) { s = "Unknown"; };
88  virtual void ExtendedSchema(int fd, int indent, bool pretty){};
89  virtual ConfigTestResult TestNewValue(ParsedJsonDataSet &pjs) { return eOk; };
90  // This is named so error messages make sense to user
91  // Old name was GetExtent
92  virtual int Missing_ConfigEndMarker(void *&startp) = 0;
93 
94  void ClearModified();
95 
96  bool MatchId(ParsedJsonDataSet &pjs);
97 
98  virtual void CommitTestedValue(uint32_t permission_mask){};
99 
100  config_leaf()
101  {
102  pNextSibling = NULL;
103  pChildren = NULL;
104  m_Flags = 0;
105  pParrent = NULL;
106  pGList = pRootList;
107  pRootList = this;
108  }
109  static void DiagShow();
110  static void FixTree();
111  void FindUnknownParrent();
112 
113  void ShowOne();
114 
115  int compare(config_leaf *pl)
116  {
117  if (pl == NULL) return -1;
118  return strcmp(GetSortNameValue(), pl->GetSortNameValue());
119  };
120 
121  void GetFullName(NBString &s);
122  void RenderToFd(int fd, bool pretty = false, uint32_t mask = fConfigHidden, bool bRawValue = false);
123  void RenderSchemaToFd(int fd, bool pretty = false, uint32_t mask = fConfigHidden);
124  int GetFlags() { return m_Flags; }
125  void SetFlag(uint32_t flag) { m_Flags |= flag; };
126  void ClrFlag(uint32_t flag) { m_Flags &= (~flag); };
127 };
128 
134 class config_obj : public config_leaf
135 {
136  protected:
137  config_obj() {}
138  config_obj *pMasterObjectLink;
139  static config_obj *pObjList;
140 
141  public:
142  void InstallUnderMe(config_leaf &l)
143  {
144  l.pParrent = this;
145  if ((pChildren == NULL) || (l.compare(pChildren) < 0))
146  {
147  l.pNextSibling = pChildren;
148  pChildren = &l;
149  }
150  else
151  { // we already have children.
152  config_leaf *pll = pChildren;
153  config_leaf *pl = pChildren;
154 
155  while ((pl) && (l.compare(pl) >= 0))
156  {
157  pll = pl;
158  pl = pl->pNextSibling;
159  }
160  if (pl)
161  {
162  l.pNextSibling = pl;
163  pll->pNextSibling = &l;
164  }
165  else
166  {
167  l.pNextSibling = pl;
168  pll->pNextSibling = &l;
169  }
170  }
171  }
172 
173  config_obj(config_obj &owner, const char *name, const char *desc)
174  {
175  pName = name;
176  pDescription = desc;
177  pChildren = NULL;
178  pMasterObjectLink = pObjList;
179  pObjList = this;
180  pParrent = &owner;
181  }
182 
183  config_obj(const char *name, const char *desc)
184  {
185  pName = name;
186  pDescription = desc;
187  pChildren = NULL;
188  pParrent = NULL;
189  pMasterObjectLink = pObjList;
190  pObjList = this;
191  }
192 
193  bool DoIContain(config_leaf *pl);
194  virtual ConfigTestResult TestNewValue(ParsedJsonDataSet &pjs);
195  virtual void CommitTestedValue(uint32_t permission_mask);
196  // This is named so error messages make sense to user
197  // Old name was GetExtent
198  virtual int Missing_ConfigEndMarker(void *&startp)
199  {
200  startp = this;
201  return sizeof(*this);
202  };
203  virtual void GetTextValue(NBString &s);
204  virtual void GetTypeValue(NBString &s) { s = "object"; };
205 
206  friend class config_leaf;
207 };
208 
209 class root_obj : public config_obj
210 {
211  public:
212  root_obj()
213  {
214  pName = "Config";
215  pDescription = "Root of config tree";
216  }
217  // This is named so error messages make sense to user
218  // Old name was GetExtent
219  virtual int Missing_ConfigEndMarker(void *&startp)
220  {
221  startp = this;
222  return sizeof(*this);
223  };
224 };
225 
226 extern root_obj root;
227 
228 class config_value : public config_leaf
229 {
230  public:
231  virtual void GetTextValue(NBString &s) = 0;
232 
233  protected:
234  config_value(config_obj &owner, const char *name, const char *desc)
235  {
236  pName = name;
237  pDescription = desc;
238  owner.InstallUnderMe(*this);
239  pChildren = NULL;
240  m_Flags |= fConfigValueLeaf;
241  }
242 
243  config_value(const char *name, const char *desc)
244  {
245  pName = name;
246  pDescription = desc;
247  pParrent = NULL;
248  pChildren = NULL;
249  m_Flags |= fConfigValueLeaf;
250  }
251 };
252 
253 class config_int : public config_value
254 {
255  protected:
256  int val;
257  int pend_val;
258 
259  public:
260  virtual void GetTextValue(NBString &s) { s.sprintf("%d", val); };
261 
262  config_int(config_obj &owner, int def_val, const char *name, const char *desc = NULL) : config_value(owner, name, desc)
263  {
264  val = def_val;
265  pend_val = val;
266  }
267 
268  config_int(int def_val, const char *name, const char *desc = NULL) : config_value(name, desc)
269  {
270  val = def_val;
271  pend_val = val;
272  }
273 
274  virtual ConfigTestResult TestNewValue(ParsedJsonDataSet &pjs);
275 
276  virtual void CommitTestedValue(uint32_t permission_mask) { val = pend_val; }
277 
278  // Assignemt operators
279  operator int() const { return val; };
280  config_int &operator=(const int i)
281  {
282  pend_val = val = i;
283  return *this;
284  };
285  config_int &operator=(const config_int &ci)
286  {
287  pend_val = val = ci.val;
288  return *this;
289  };
290  // This is named so error messages make sense to user
291  // Old name was GetExtent
292  virtual int Missing_ConfigEndMarker(void *&startp)
293  {
294  startp = this;
295  return sizeof(*this);
296  };
297  virtual void GetTypeValue(NBString &s) { s = "integer"; };
298 };
299 
300 class config_double : public config_value
301 {
302  double val;
303  double pend_val;
304 
305  public:
306  virtual void GetTextValue(NBString &s) { s.sprintf("%g", val); };
307 
308  config_double(config_obj &owner, double def_val, const char *name, const char *desc = NULL) : config_value(owner, name, desc)
309  {
310  val = def_val;
311  pend_val = val;
312  }
313 
314  config_double(double def_val, const char *name, const char *desc = NULL) : config_value(name, desc)
315  {
316  val = def_val;
317  pend_val = val;
318  }
319 
320  virtual ConfigTestResult TestNewValue(ParsedJsonDataSet &pjs);
321 
322  virtual void CommitTestedValue(uint32_t permission_mask) { val = pend_val; }
323 
324  // Assignemt operators
325  operator int() const { return val; };
326  operator float() const { return val; };
327  operator double() const { return val; };
328  config_double &operator=(const double d)
329  {
330  pend_val = val = d;
331  return *this;
332  };
333  config_double &operator=(const config_double &ci)
334  {
335  pend_val = val = ci.val;
336  return *this;
337  };
338  // This is named so error messages make sense to user
339  // Old name was GetExtent
340  virtual int Missing_ConfigEndMarker(void *&startp)
341  {
342  startp = this;
343  return sizeof(*this);
344  };
345  virtual void GetTypeValue(NBString &s) { s = "float"; };
346 };
347 
348 class config_report : public config_value
349 {
350  protected:
351  const char *m_value;
352 
353  public:
354  config_report(config_obj &owner, const char *value, const char *name, const char *desc = NULL) : config_value(owner, name, desc)
355  {
356  m_Flags = fConfigReadOnly | fConfigNoSave;
357  m_value = value;
358  }
359  config_report(const char *value, const char *name, const char *desc = NULL) : config_value(name, desc)
360  {
361  m_Flags = fConfigReadOnly | fConfigNoSave;
362  m_value = value;
363  }
364 
365  virtual void GetTextValue(NBString &s);
366  virtual ConfigTestResult TestNewValue(ParsedJsonDataSet &pjs);
367  virtual void CommitTestedValue(uint32_t permission_mask);
368  // This is named so error messages make sense to user
369  // Old name was GetExtent
370  virtual int Missing_ConfigEndMarker(void *&startp)
371  {
372  startp = this;
373  return sizeof(*this);
374  };
375  virtual void GetTypeValue(NBString &s) { s = "string"; };
376 
377  const char *c_str() { return m_value; };
378 };
379 
380 class config_bool : public config_value
381 {
382  protected:
383  bool val;
384  bool pend_val;
385 
386  public:
387  virtual void GetTextValue(NBString &s)
388  {
389  if (val)
390  s.sprintf("true");
391  else
392  s.sprintf("false");
393  };
394 
395  config_bool(config_obj &owner, bool def_val, const char *name, const char *desc = NULL) : config_value(owner, name, desc)
396  {
397  val = def_val;
398  pend_val = val;
399  }
400 
401  config_bool(bool def_val, const char *name, const char *desc = NULL) : config_value(name, desc)
402  {
403  val = def_val;
404  pend_val = val;
405  }
406 
407  virtual ConfigTestResult TestNewValue(ParsedJsonDataSet &pjs);
408 
409  virtual void CommitTestedValue(uint32_t permission_mask) { val = pend_val; }
410 
411  // Assignemt operators
412  operator bool() const { return val; };
413  config_bool &operator=(const bool v)
414  {
415  pend_val = val = v;
416  return *this;
417  };
418  config_bool &operator=(const config_bool &cb)
419  {
420  pend_val = val = cb.val;
421  return *this;
422  };
423  config_bool &operator=(const int i)
424  {
425  pend_val = val = (i != 0);
426  return *this;
427  };
428  // This is named so error messages make sense to user
429  // Old name was GetExtent
430  virtual int Missing_ConfigEndMarker(void *&startp)
431  {
432  startp = this;
433  return sizeof(*this);
434  };
435  virtual void GetTypeValue(NBString &s) { s = "boolean"; };
436 };
437 
438 class config_string : public config_value
439 {
440  protected:
441  NBString val;
442  NBString pend_val;
443  NBString enum_list;
444 
445  public:
446  virtual void GetTextValue(NBString &s)
447  {
448  s = "\"";
449  s += val;
450  s += "\"";
451  };
452 
453  config_string(config_obj &owner, NBString def_val, const char *name, const char *desc = NULL) : config_value(owner, name, desc)
454  {
455  val = def_val;
456  pend_val = val;
457  }
458 
459  config_string(NBString def_val, const char *name, const char *desc = NULL) : config_value(name, desc)
460  {
461  pName = name;
462  val = def_val;
463  pend_val = val;
464  }
465 
466  config_string(config_obj &owner, const char *def_val, const char *name, const char *desc = NULL) : config_value(owner, name, desc)
467  {
468  val = def_val;
469  pend_val = val;
470  }
471 
472  config_string(const char *def_val, const char *name, const char *desc = NULL) : config_value(name, desc)
473  {
474  val = def_val;
475  pend_val = val;
476  }
477 
478  virtual ConfigTestResult TestNewValue(ParsedJsonDataSet &pjs);
479 
480  virtual void CommitTestedValue(uint32_t permission_mask) { val = pend_val; }
481 
482  void SetEnumList(NBString s) { enum_list = s; };
483 
484  operator NBString() const { return val; };
485  config_string &operator=(const char *p)
486  {
487  pend_val = val = p;
488  return *this;
489  };
490  config_string &operator=(const NBString &s)
491  {
492  pend_val = val = s;
493  return *this;
494  };
495  config_string &operator=(const config_string &ci)
496  {
497  pend_val = val = ci.val;
498  return *this;
499  };
500  // This is named so error messages make sense to user
501  // Old name was GetExtent
502  virtual int Missing_ConfigEndMarker(void *&startp)
503  {
504  startp = this;
505  return sizeof(*this);
506  };
507 
508  inline const char *c_str() const { return val.c_str(); };
509  inline size_t length() const { return val.length(); };
510  inline const char &operator[](size_t pos) const { return val[pos]; };
511  virtual void GetTypeValue(NBString &s) { s = "string"; };
512  virtual void ExtendedSchema(int fd, int indent, bool pretty);
513 
514  friend class config_pass;
515  friend class config_chooser;
516 };
517 
518 class config_pass : public config_string
519 {
520  public:
521  config_pass(config_obj &owner, NBString def_val, const char *name, const char *desc = NULL)
522  : config_string(owner, def_val, name, desc){};
523  config_pass(NBString def_val, const char *name, const char *desc = NULL) : config_string(def_val, name, desc){};
524  config_pass(config_obj &owner, const char *def_val, const char *name, const char *desc = NULL)
525  : config_string(owner, def_val, name, desc){};
526  config_pass(const char *def_val, const char *name, const char *desc = NULL) : config_string(def_val, name, desc){};
527 
528  virtual void GetTextValue(NBString &s);
529  virtual void GetRawValue(NBString &s);
530  virtual void CommitTestedValue(uint32_t permission_mask);
531  virtual void ExtendedSchema(int fd, int indent, bool pretty)
532  {
533  config_string::ExtendedSchema(fd, indent, pretty);
534  DoSchemaLine(fd, "format", "password", indent, pretty);
535  };
536 
537  operator NBString() const { return val; };
538  config_pass &operator=(const char *p)
539  {
540  pend_val = val = p;
541  return *this;
542  };
543  config_pass &operator=(const NBString &s)
544  {
545  pend_val = val = s;
546  return *this;
547  };
548  config_pass &operator=(const config_string &ci)
549  {
550  pend_val = val = ci.val;
551  return *this;
552  };
553  config_pass &operator=(const config_pass &ci)
554  {
555  pend_val = val = ci.val;
556  return *this;
557  };
558 };
559 
560 class config_IPADDR4 : public config_value
561 {
562  IPADDR4 val;
563  IPADDR4 pend_val;
564 
565  public:
566  virtual void GetTextValue(NBString &s) { s.siprintf("\"%hI\"", val); };
567 
568  config_IPADDR4(config_obj &owner, IPADDR4 def_val, const char *name, const char *desc = NULL) : config_value(owner, name, desc)
569  {
570  val = def_val;
571  pend_val = val;
572  }
573 
574  config_IPADDR4(IPADDR4 def_val, const char *name, const char *desc = NULL) : config_value(name, desc)
575  {
576  val = def_val;
577  pend_val = val;
578  }
579 
580  config_IPADDR4(config_obj &owner, const char *def_val, const char *name, const char *desc = NULL) : config_value(owner, name, desc)
581  {
582  IPADDR4 i4;
583  i4.SetFromAscii(def_val);
584  val = i4;
585  pend_val = val;
586  }
587 
588  config_IPADDR4(const char *def_val, const char *name, const char *desc = NULL) : config_value(name, desc)
589  {
590  IPADDR4 i4;
591  i4.SetFromAscii(def_val);
592  val = i4;
593  pend_val = val;
594  }
595 
596  virtual ConfigTestResult TestNewValue(ParsedJsonDataSet &pjs);
597 
598  virtual void CommitTestedValue(uint32_t permission_mask) { val = pend_val; }
599 
600  operator IPADDR4() const { return val; };
601  config_IPADDR4 &operator=(const IPADDR4 &i4)
602  {
603  pend_val = val = i4;
604  return *this;
605  };
606  config_IPADDR4 &operator=(const config_IPADDR4 &ci)
607  {
608  pend_val = val = ci.val;
609  return *this;
610  };
611  // This is named so error messages make sense to user
612  // Old name was GetExtent
613  virtual int Missing_ConfigEndMarker(void *&startp)
614  {
615  startp = this;
616  return sizeof(*this);
617  };
618  virtual void GetTypeValue(NBString &s) { s = "string"; };
619  virtual void ExtendedSchema(int fd, int indent, bool pretty) { DoSchemaLine(fd, "format", "ipv4", indent, pretty); };
620 };
621 
622 #ifdef IPV6
623 class config_IPADDR6 : public config_value
624 {
625  IPADDR6 val;
626  IPADDR6 pend_val;
627 
628  public:
629  virtual void GetTextValue(NBString &s) { s.siprintf("\"%I\"", val); };
630 
631  config_IPADDR6(config_obj &owner, IPADDR6 def_val, const char *name, const char *desc = NULL) : config_value(owner, name, desc)
632  {
633  val = def_val;
634  pend_val = val;
635  }
636 
637  config_IPADDR6(IPADDR6 def_val, const char *name, const char *desc = NULL) : config_value(name, desc)
638  {
639  val = def_val;
640  pend_val = val;
641  }
642 
643  config_IPADDR6(config_obj &owner, const char *def_val, const char *name, const char *desc = NULL) : config_value(owner, name, desc)
644  {
645  IPADDR6 i6;
646  i6.SetFromAscii(def_val);
647  val = i6;
648  pend_val = val;
649  }
650 
651  config_IPADDR6(const char *def_val, const char *name, const char *desc = NULL) : config_value(name, desc)
652  {
653  IPADDR6 i6;
654  i6.SetFromAscii(def_val);
655  val = i6;
656  pend_val = val;
657  }
658 
659  virtual ConfigTestResult TestNewValue(ParsedJsonDataSet &pjs);
660 
661  virtual void CommitTestedValue(uint32_t permission_mask) { val = pend_val; }
662 
663  operator IPADDR6() const { return val; };
664  config_IPADDR6 &operator=(const IPADDR6 &i4)
665  {
666  pend_val = val = i4;
667  return *this;
668  };
669  config_IPADDR6 &operator=(const config_IPADDR6 &ci)
670  {
671  pend_val = val = ci.val;
672  return *this;
673  };
674  // This is named so error messages make sense to user
675  // Old name was GetExtent
676  virtual int Missing_ConfigEndMarker(void *&startp)
677  {
678  startp = this;
679  return sizeof(*this);
680  };
681  virtual void GetTypeValue(NBString &s) { s = "string"; };
682  virtual void ExtendedSchema(int fd, int indent, bool pretty) { DoSchemaLine(fd, "format", "ipv6", indent, pretty); };
683 };
684 #endif
685 
686 class config_MACADR : public config_value
687 {
688  MACADR val;
689  MACADR pend_val;
690 
691  public:
692  virtual void GetTextValue(NBString &s)
693  {
694  s.siprintf("\"%02X:%02X:%02X:%02X:%02X:%02X\"", val.phywadr[0] >> 8, val.phywadr[0] & 0xFF, val.phywadr[1] >> 8,
695  val.phywadr[1] & 0xFF, val.phywadr[2] >> 8, val.phywadr[2] & 0xFF);
696  };
697 
698  config_MACADR(config_obj &owner, MACADR def_val, const char *name, const char *desc = NULL) : config_value(owner, name, desc)
699  {
700  val = def_val;
701  pend_val = val;
702  }
703 
704  config_MACADR(MACADR def_val, const char *name, const char *desc = NULL) : config_value(name, desc)
705  {
706  val = def_val;
707  pend_val = val;
708  }
709 
710  config_MACADR(config_obj &owner, const char *def_val, const char *name, const char *desc = NULL) : config_value(owner, name, desc)
711  {
712  MACADR ma;
713  ma = AsciiToMac(def_val);
714 
715  val = ma;
716  pend_val = val;
717  }
718 
719  config_MACADR(const char *def_val, const char *name, const char *desc = NULL) : config_value(name, desc)
720  {
721  MACADR ma;
722  ma = AsciiToMac(def_val);
723  val = ma;
724  pend_val = val;
725  }
726 
727  operator MACADR() const { return val; };
728  config_MACADR &operator=(const config_MACADR &ci)
729  {
730  pend_val = val = ci.val;
731  return *this;
732  };
733  config_MACADR &operator=(const MACADR &ci)
734  {
735  pend_val = val = ci;
736  return *this;
737  };
738  // This is named so error messages make sense to user
739  // Old name was GetExtent
740  virtual int Missing_ConfigEndMarker(void *&startp)
741  {
742  startp = this;
743  return sizeof(*this);
744  };
745 
746  virtual ConfigTestResult TestNewValue(ParsedJsonDataSet &pjs);
747 
748  virtual void CommitTestedValue(uint32_t permission_mask) { val = pend_val; }
749  virtual void GetTypeValue(NBString &s) { s = "string"; };
750 };
751 
752 // This is named so error messages make sense to user
753 // Old name was GetExtent
754 #define ConfigEndMarker \
755  virtual int Missing_ConfigEndMarker(void *&startp) \
756  { \
757  startp = this; \
758  return sizeof(*this); \
759  };
760 
761 class config_chooser : public config_obj
762 {
763  config_string value{"", "Value"};
764  config_string choices{"", "Choices"};
765  ConfigEndMarker;
766 
767  virtual ConfigTestResult TestNewValue(ParsedJsonDataSet &pjs);
768 
769  public:
770  config_chooser(config_obj &owner, const char *name, const char *in_value, const char *in_choices, const char *desc = NULL)
771  : config_obj(owner, name, desc)
772  {
773  value = in_value;
774  choices = in_choices;
775  choices.m_Flags |= fConfigReadOnly;
776  value.SetEnumList(choices);
777  };
778 
779  config_chooser(const char *name, const char *in_value, const char *in_choices, const char *desc = NULL) : config_obj(name, desc)
780  {
781  value = in_value;
782  choices = in_choices;
783  choices.m_Flags |= fConfigReadOnly;
784  value.SetEnumList(choices);
785  };
786 
787  // Returns the current choice from the list
788  bool IsSelected(const char *choice) { return (choice == value); };
789  bool IsSelected(const NBString &s) { return (s == value); };
790  const config_string& GetChoices() { return choices; }
791 
792  operator NBString() const { return (NBString)value; };
793  config_chooser &operator=(const char *p)
794  {
795  value = p;
796  return *this;
797  };
798  config_chooser &operator=(const NBString &s)
799  {
800  value = s;
801  return *this;
802  };
803  config_chooser &operator=(const config_chooser &ci)
804  {
805  value = ci.value;
806  return *this;
807  };
808  virtual void GetTypeValue(NBString &s) { s = "object"; };
809 };
810 
811 class reboot_obj : public config_bool
812 {
813  virtual const char *GetSortNameValue() { return "ZZZc"; };
814 
815  public:
816  reboot_obj() : config_bool(root, false, "Reboot", "Cause system reboot on save"){};
817  void clear()
818  {
819  val = false;
820  pend_val = false;
821  };
822  // This is named so error messages make sense to user
823  // Old name was GetExtent
824  virtual int Missing_ConfigEndMarker(void *&startp)
825  {
826  startp = this;
827  return sizeof(*this);
828  };
829 };
830 
831 class version_obj : public config_int
832 {
833  bool bNeverSet;
834  virtual const char *GetSortNameValue() { return "ZZZb"; };
835 
836  public:
837  version_obj() : config_int(root, 0, "Version", "Version serial number") { bNeverSet = true; };
838 
839  virtual ConfigTestResult TestNewValue(ParsedJsonDataSet &pjs);
840  void inc()
841  {
842  val++;
843  pend_val = val;
844  };
845  // This is named so error messages make sense to user
846  // Old name was GetExtent
847  virtual int Missing_ConfigEndMarker(void *&startp)
848  {
849  startp = this;
850  return sizeof(*this);
851  };
852 };
853 
854 class empty_config_obj : public config_obj
855 {
856  ConfigEndMarker;
857 
858  public:
859  empty_config_obj(const char *name, const char *desc = NULL) : config_obj(name, desc){};
860  empty_config_obj(config_obj &owner, const char *name, const char *desc = NULL) : config_obj(owner, name, desc){};
861 };
862 
863 extern const char *AppName;
864 extern const char PlatformName[];
865 
866 class SysRecord : public config_obj
867 {
868  public:
869  config_report system_platform{PlatformName, "Platform", "Hardware Platform"};
870  config_report system_app{AppName, "Application", "Application name"};
871  ConfigEndMarker;
872 
873  SysRecord(const char *name, const char *desc = NULL) : config_obj(name, desc){};
874  SysRecord(config_obj &owner, const char *name, const char *desc = NULL) : config_obj(owner, name, desc){};
875 };
876 
877 extern SysRecord sys;
878 extern empty_config_obj netif;
879 extern empty_config_obj appdata;
880 
881 extern reboot_obj rebooter;
882 extern version_obj config_cur_version;
883 
884 extern const int plat_def_baud;
885 extern const int plat_def_com;
886 extern const int plat_def_delay;
887 extern const int plat_def_quiet;
888 
889 // Force any changes to be saved to flash
890 void SaveConfigToStorage();
891 
892 class MonitorRecord : public config_obj
893 {
894  public:
895  config_int Baud{plat_def_baud, "BootBaud"};
896  config_int Uart{plat_def_com, "BootUart"};
897  config_int BootDelay{plat_def_delay, "BootDelay"};
898  config_bool Quiet{plat_def_quiet, "BootQuiet"};
899  config_chooser sercfg_action{"SerialConfig", "DuringBoot", "DuringBoot, AlwaysEnabled, PauseAfterBoot, Disabled"};
900  config_string abortbootcmd{"A", "Abort"};
901  config_pass system_user{"", "User"};
902  config_pass system_pass{"", "Password"};
903  ConfigEndMarker;
904  MonitorRecord(const char *name) : config_obj(name, "Boot monitor record")
905  {
906  sercfg_action.SetFlag(fConfigNeedReboot);
907  Baud.SetFlag(fConfigNeedReboot);
908  Uart.SetFlag(fConfigNeedReboot);
909  };
910  MonitorRecord(config_obj &owner, const char *name) : config_obj(owner, name, "Boot Monitor Record")
911  {
912  sercfg_action.SetFlag(fConfigNeedReboot);
913  Baud.SetFlag(fConfigNeedReboot);
914  Uart.SetFlag(fConfigNeedReboot);
915  };
916 };
917 
918 extern MonitorRecord monitor_config;
919 #endif
Definition: config_obj.h:52
Used to hold and manipulate IPv4 and IPv6 addresses in dual stack mode.
Definition: ipv6_addr.h:28
Definition: config_obj.h:134
const char * AppName
Definition: defappname.cpp:5
#define NULL
Definition: nm_bsp.h:76
NetBurner Buffers API.
void SetFromAscii(const char *cp, bool bembed_v4addreses=true)
Set the IP address value of an IPADDR6 object.
Definition: ipv6_addr.cpp:186