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;
39 const uint32_t PermitFlashFromStorage = (0x80000000);
43 class ParsedJsonDataSet;
44 class RootParseStateInfo;
46 typedef void(LeafCallBack)(
config_leaf *p,
void *pextra);
56 void RootParse(RootParseStateInfo &rpsi);
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; };
67 static config_leaf *FindConfigLeaf(
const unsigned char *name);
70 const char *pDescription;
78 void DoSchemaLine(
int fd,
const char *name,
const char *value,
int indent,
bool pretty,
bool quoted =
true);
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; };
92 virtual int Missing_ConfigEndMarker(
void *&startp) = 0;
96 bool MatchId(ParsedJsonDataSet &pjs);
98 virtual void CommitTestedValue(uint32_t permission_mask){};
109 static void DiagShow();
110 static void FixTree();
111 void FindUnknownParrent();
117 if (pl ==
NULL)
return -1;
118 return strcmp(GetSortNameValue(), pl->GetSortNameValue());
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); };
145 if ((pChildren ==
NULL) || (l.compare(pChildren) < 0))
147 l.pNextSibling = pChildren;
155 while ((pl) && (l.compare(pl) >= 0))
158 pl = pl->pNextSibling;
163 pll->pNextSibling = &l;
168 pll->pNextSibling = &l;
178 pMasterObjectLink = pObjList;
183 config_obj(
const char *name,
const char *desc)
189 pMasterObjectLink = pObjList;
194 virtual ConfigTestResult TestNewValue(ParsedJsonDataSet &pjs);
195 virtual void CommitTestedValue(uint32_t permission_mask);
198 virtual int Missing_ConfigEndMarker(
void *&startp)
201 return sizeof(*this);
203 virtual void GetTextValue(NBString &s);
204 virtual void GetTypeValue(NBString &s) { s =
"object"; };
215 pDescription =
"Root of config tree";
219 virtual int Missing_ConfigEndMarker(
void *&startp)
222 return sizeof(*this);
226 extern root_obj root;
231 virtual void GetTextValue(NBString &s) = 0;
234 config_value(
config_obj &owner,
const char *name,
const char *desc)
238 owner.InstallUnderMe(*
this);
240 m_Flags |= fConfigValueLeaf;
243 config_value(
const char *name,
const char *desc)
249 m_Flags |= fConfigValueLeaf;
253 class config_int :
public config_value
260 virtual void GetTextValue(NBString &s) { s.sprintf(
"%d", val); };
262 config_int(
config_obj &owner,
int def_val,
const char *name,
const char *desc =
NULL) : config_value(owner, name, desc)
268 config_int(
int def_val,
const char *name,
const char *desc =
NULL) : config_value(name, desc)
274 virtual ConfigTestResult TestNewValue(ParsedJsonDataSet &pjs);
276 virtual void CommitTestedValue(uint32_t permission_mask) { val = pend_val; }
279 operator int()
const {
return val; };
280 config_int &operator=(
const int i)
285 config_int &operator=(
const config_int &ci)
287 pend_val = val = ci.val;
292 virtual int Missing_ConfigEndMarker(
void *&startp)
295 return sizeof(*this);
297 virtual void GetTypeValue(NBString &s) { s =
"integer"; };
300 class config_double :
public config_value
306 virtual void GetTextValue(NBString &s) { s.sprintf(
"%g", val); };
308 config_double(
config_obj &owner,
double def_val,
const char *name,
const char *desc =
NULL) : config_value(owner, name, desc)
314 config_double(
double def_val,
const char *name,
const char *desc =
NULL) : config_value(name, desc)
320 virtual ConfigTestResult TestNewValue(ParsedJsonDataSet &pjs);
322 virtual void CommitTestedValue(uint32_t permission_mask) { val = pend_val; }
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)
333 config_double &operator=(
const config_double &ci)
335 pend_val = val = ci.val;
340 virtual int Missing_ConfigEndMarker(
void *&startp)
343 return sizeof(*this);
345 virtual void GetTypeValue(NBString &s) { s =
"float"; };
348 class config_report :
public config_value
354 config_report(
config_obj &owner,
const char *value,
const char *name,
const char *desc =
NULL) : config_value(owner, name, desc)
356 m_Flags = fConfigReadOnly | fConfigNoSave;
359 config_report(
const char *value,
const char *name,
const char *desc =
NULL) : config_value(name, desc)
361 m_Flags = fConfigReadOnly | fConfigNoSave;
365 virtual void GetTextValue(NBString &s);
366 virtual ConfigTestResult TestNewValue(ParsedJsonDataSet &pjs);
367 virtual void CommitTestedValue(uint32_t permission_mask);
370 virtual int Missing_ConfigEndMarker(
void *&startp)
373 return sizeof(*this);
375 virtual void GetTypeValue(NBString &s) { s =
"string"; };
377 const char *c_str() {
return m_value; };
380 class config_bool :
public config_value
387 virtual void GetTextValue(NBString &s)
395 config_bool(
config_obj &owner,
bool def_val,
const char *name,
const char *desc =
NULL) : config_value(owner, name, desc)
401 config_bool(
bool def_val,
const char *name,
const char *desc =
NULL) : config_value(name, desc)
407 virtual ConfigTestResult TestNewValue(ParsedJsonDataSet &pjs);
409 virtual void CommitTestedValue(uint32_t permission_mask) { val = pend_val; }
412 operator bool()
const {
return val; };
413 config_bool &operator=(
const bool v)
418 config_bool &operator=(
const config_bool &cb)
420 pend_val = val = cb.val;
423 config_bool &operator=(
const int i)
425 pend_val = val = (i != 0);
430 virtual int Missing_ConfigEndMarker(
void *&startp)
433 return sizeof(*this);
435 virtual void GetTypeValue(NBString &s) { s =
"boolean"; };
438 class config_string :
public config_value
446 virtual void GetTextValue(NBString &s)
453 config_string(
config_obj &owner, NBString def_val,
const char *name,
const char *desc =
NULL) : config_value(owner, name, desc)
459 config_string(NBString def_val,
const char *name,
const char *desc =
NULL) : config_value(name, desc)
466 config_string(
config_obj &owner,
const char *def_val,
const char *name,
const char *desc =
NULL) : config_value(owner, name, desc)
472 config_string(
const char *def_val,
const char *name,
const char *desc =
NULL) : config_value(name, desc)
478 virtual ConfigTestResult TestNewValue(ParsedJsonDataSet &pjs);
480 virtual void CommitTestedValue(uint32_t permission_mask) { val = pend_val; }
482 void SetEnumList(NBString s) { enum_list = s; };
484 operator NBString()
const {
return val; };
485 config_string &operator=(
const char *p)
490 config_string &operator=(
const NBString &s)
495 config_string &operator=(
const config_string &ci)
497 pend_val = val = ci.val;
502 virtual int Missing_ConfigEndMarker(
void *&startp)
505 return sizeof(*this);
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);
514 friend class config_pass;
515 friend class config_chooser;
518 class config_pass :
public config_string
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){};
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)
533 config_string::ExtendedSchema(fd, indent, pretty);
534 DoSchemaLine(fd,
"format",
"password", indent, pretty);
537 operator NBString()
const {
return val; };
538 config_pass &operator=(
const char *p)
543 config_pass &operator=(
const NBString &s)
548 config_pass &operator=(
const config_string &ci)
550 pend_val = val = ci.val;
553 config_pass &operator=(
const config_pass &ci)
555 pend_val = val = ci.val;
560 class config_IPADDR4 :
public config_value
566 virtual void GetTextValue(NBString &s) { s.siprintf(
"\"%hI\"", val); };
568 config_IPADDR4(
config_obj &owner, IPADDR4 def_val,
const char *name,
const char *desc =
NULL) : config_value(owner, name, desc)
574 config_IPADDR4(IPADDR4 def_val,
const char *name,
const char *desc =
NULL) : config_value(name, desc)
580 config_IPADDR4(
config_obj &owner,
const char *def_val,
const char *name,
const char *desc =
NULL) : config_value(owner, name, desc)
583 i4.SetFromAscii(def_val);
588 config_IPADDR4(
const char *def_val,
const char *name,
const char *desc =
NULL) : config_value(name, desc)
591 i4.SetFromAscii(def_val);
596 virtual ConfigTestResult TestNewValue(ParsedJsonDataSet &pjs);
598 virtual void CommitTestedValue(uint32_t permission_mask) { val = pend_val; }
600 operator IPADDR4()
const {
return val; };
601 config_IPADDR4 &operator=(
const IPADDR4 &i4)
606 config_IPADDR4 &operator=(
const config_IPADDR4 &ci)
608 pend_val = val = ci.val;
613 virtual int Missing_ConfigEndMarker(
void *&startp)
616 return sizeof(*this);
618 virtual void GetTypeValue(NBString &s) { s =
"string"; };
619 virtual void ExtendedSchema(
int fd,
int indent,
bool pretty) { DoSchemaLine(fd,
"format",
"ipv4", indent, pretty); };
623 class config_IPADDR6 :
public config_value
629 virtual void GetTextValue(NBString &s) { s.siprintf(
"\"%I\"", val); };
631 config_IPADDR6(
config_obj &owner,
IPADDR6 def_val,
const char *name,
const char *desc =
NULL) : config_value(owner, name, desc)
637 config_IPADDR6(
IPADDR6 def_val,
const char *name,
const char *desc =
NULL) : config_value(name, desc)
643 config_IPADDR6(
config_obj &owner,
const char *def_val,
const char *name,
const char *desc =
NULL) : config_value(owner, name, desc)
651 config_IPADDR6(
const char *def_val,
const char *name,
const char *desc =
NULL) : config_value(name, desc)
659 virtual ConfigTestResult TestNewValue(ParsedJsonDataSet &pjs);
661 virtual void CommitTestedValue(uint32_t permission_mask) { val = pend_val; }
663 operator IPADDR6()
const {
return val; };
664 config_IPADDR6 &operator=(
const IPADDR6 &i4)
669 config_IPADDR6 &operator=(
const config_IPADDR6 &ci)
671 pend_val = val = ci.val;
676 virtual int Missing_ConfigEndMarker(
void *&startp)
679 return sizeof(*this);
681 virtual void GetTypeValue(NBString &s) { s =
"string"; };
682 virtual void ExtendedSchema(
int fd,
int indent,
bool pretty) { DoSchemaLine(fd,
"format",
"ipv6", indent, pretty); };
686 class config_MACADR :
public config_value
692 virtual void GetTextValue(NBString &s)
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);
698 config_MACADR(
config_obj &owner, MACADR def_val,
const char *name,
const char *desc =
NULL) : config_value(owner, name, desc)
704 config_MACADR(MACADR def_val,
const char *name,
const char *desc =
NULL) : config_value(name, desc)
710 config_MACADR(
config_obj &owner,
const char *def_val,
const char *name,
const char *desc =
NULL) : config_value(owner, name, desc)
713 ma = AsciiToMac(def_val);
719 config_MACADR(
const char *def_val,
const char *name,
const char *desc =
NULL) : config_value(name, desc)
722 ma = AsciiToMac(def_val);
727 operator MACADR()
const {
return val; };
728 config_MACADR &operator=(
const config_MACADR &ci)
730 pend_val = val = ci.val;
733 config_MACADR &operator=(
const MACADR &ci)
740 virtual int Missing_ConfigEndMarker(
void *&startp)
743 return sizeof(*this);
746 virtual ConfigTestResult TestNewValue(ParsedJsonDataSet &pjs);
748 virtual void CommitTestedValue(uint32_t permission_mask) { val = pend_val; }
749 virtual void GetTypeValue(NBString &s) { s =
"string"; };
754 #define ConfigEndMarker \ 755 virtual int Missing_ConfigEndMarker(void *&startp) \ 758 return sizeof(*this); \ 763 config_string value{
"",
"Value"};
764 config_string choices{
"",
"Choices"};
767 virtual ConfigTestResult TestNewValue(ParsedJsonDataSet &pjs);
770 config_chooser(
config_obj &owner,
const char *name,
const char *in_value,
const char *in_choices,
const char *desc =
NULL)
774 choices = in_choices;
775 choices.m_Flags |= fConfigReadOnly;
776 value.SetEnumList(choices);
779 config_chooser(
const char *name,
const char *in_value,
const char *in_choices,
const char *desc =
NULL) :
config_obj(name, desc)
782 choices = in_choices;
783 choices.m_Flags |= fConfigReadOnly;
784 value.SetEnumList(choices);
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; }
792 operator NBString()
const {
return (NBString)value; };
793 config_chooser &operator=(
const char *p)
798 config_chooser &operator=(
const NBString &s)
803 config_chooser &operator=(
const config_chooser &ci)
808 virtual void GetTypeValue(NBString &s) { s =
"object"; };
811 class reboot_obj :
public config_bool
813 virtual const char *GetSortNameValue() {
return "ZZZc"; };
816 reboot_obj() : config_bool(root, false,
"Reboot",
"Cause system reboot on save"){};
824 virtual int Missing_ConfigEndMarker(
void *&startp)
827 return sizeof(*this);
831 class version_obj :
public config_int
834 virtual const char *GetSortNameValue() {
return "ZZZb"; };
837 version_obj() : config_int(root, 0,
"Version",
"Version serial number") { bNeverSet =
true; };
839 virtual ConfigTestResult TestNewValue(ParsedJsonDataSet &pjs);
847 virtual int Missing_ConfigEndMarker(
void *&startp)
850 return sizeof(*this);
859 empty_config_obj(
const char *name,
const char *desc =
NULL) :
config_obj(name, desc){};
864 extern const char PlatformName[];
869 config_report system_platform{PlatformName,
"Platform",
"Hardware Platform"};
870 config_report system_app{
AppName,
"Application",
"Application name"};
873 SysRecord(
const char *name,
const char *desc =
NULL) :
config_obj(name, desc){};
877 extern SysRecord sys;
878 extern empty_config_obj netif;
879 extern empty_config_obj appdata;
881 extern reboot_obj rebooter;
882 extern version_obj config_cur_version;
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;
890 void SaveConfigToStorage();
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"};
904 MonitorRecord(
const char *name) :
config_obj(name,
"Boot monitor record")
906 sercfg_action.SetFlag(fConfigNeedReboot);
907 Baud.SetFlag(fConfigNeedReboot);
908 Uart.SetFlag(fConfigNeedReboot);
910 MonitorRecord(
config_obj &owner,
const char *name) :
config_obj(owner, name,
"Boot Monitor Record")
912 sercfg_action.SetFlag(fConfigNeedReboot);
913 Baud.SetFlag(fConfigNeedReboot);
914 Uart.SetFlag(fConfigNeedReboot);
918 extern MonitorRecord monitor_config;
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
void SetFromAscii(const char *cp, bool bembed_v4addreses=true)
Set the IP address value of an IPADDR6 object.
Definition: ipv6_addr.cpp:186