Files
redAcore/DataTreeCore.h
Charl Wentzel 434377f122 Major Update:
- Implement new ApplicationCore:
  - Manage Tools: Log, DataTree, JSONparser & Selector
  - Load configuration, Manage FunctionBlocks
- FunctionCore & dirived classes, SignalCore:
  - affects: SelectableCore, DeviceCore, FileCore, WatchdogCore
  - Do not pass Log()
  - Define and pass Type
  - Update/reduce included headers
  - Use ProcessName and Application global vars
  - Get Log, DataTree from Application
  - Use virtual Init() function to set must have Channels/Handles
- DataTreeCore:
  - Bug fix: Check if child members exist and destroy in SetValuePtr()
  - Add method GetFirstChild with BaseMember & Path
  - Bug fix: do not use RootMember if no Parent in GetChildxxx() methods
- SignalCore, SelectCore:
  - Use Application->Log()
- FunctionCore:
  - Add itself to Application (function list)
  - Add parameter: LinkConfigMember, Type
  - Use virtual LoadConfigData() to configure from DataTree
  - Rename methods: LoadConfig() -> InitConfig(),
      InitLogging() -> SetLogParam(), SetDebugLevel() -> SetLogLevel()
  - Add method: GetType(), LoadChannelLinkData(), InitChannelLinks()
  - Modify LinkIn/OutputChannel() to use name for InFunction, not pointer
- SelectableCore & Dirived classes:
  - Affects DeviceCore & WatchdogClient
  - Rename parameter: Select -> Selector, BaseMember -> ConfigMember
  - Get Selector from Application->Selector
  - Change Handles JSON structure from Array to Key:Value pairs
  - Bug fix: check if Selector exist during Input()
  - Bug fix: do not set PortNo if not exist
2017-07-16 20:29:01 +02:00

98 lines
3.8 KiB
C++

/*
* DataTreeCore.h
*
* Created on: 5 Mar 2017
* Author: wentzelc
*/
#ifndef REDACORE_DATATREECORE_H_
#define REDACORE_DATATREECORE_H_
// redA Libraries
#include <BufferCore.h>
// Standard C/C++ Libraries
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <stdio.h>
//---------------------------------------------------------------------------
typedef enum { jtNull = 0, jtBool = 1, jtInt = 2, jtFloat = 3, jtString = 4, jtArray = 5, jtObject = 6 } EDataType;
//---------------------------------------------------------------------------
// Structure prototypes
typedef struct SDataMember TDataMember;
// One Config Members
struct SDataMember
{
char * Name;
unsigned short NameLen;
EDataType Type;
TDataMember * FirstChild;
char * Value;
unsigned short Len;
TDataMember * Next;
};
//---------------------------------------------------------------------------
class CDataTree
{
private:
TDataMember * RootMember;
// Manage Members
TDataMember * CreateMember( const char * Name, const int Len = -1 );
bool AddMember( TDataMember * Parent, TDataMember * Member );
bool DestroyMember( TDataMember ** Member );
bool DestroyValue( TDataMember * Member );
// Find Member
TDataMember * GetRootMember() { return RootMember; };
TDataMember ** GetMemberPtr( TDataMember * BaseMember, const char * Path, bool Create, TDataMember ** Parent = NULL );
// Set Member value
bool SetValue( TDataMember * Member, EDataType Type, const char * Value = NULL, int Len = -1 );
bool SetValuePtr( TDataMember * Member, EDataType Type, char * Value, int Len );
public:
CDataTree();
~CDataTree();
EDataType GetType( TDataMember * BaseMember, const char * Path );
TDataMember * GetMember( TDataMember * BaseMember, const char * Path, bool Create = false );
TDataMember * GetIndexChild( TDataMember * Parent, const int Index );
TDataMember * GetFirstChild( TDataMember * Parent, const char * Path, bool Create = false );
inline TDataMember * GetFirstChild( TDataMember * Parent ) { return ((Parent)? Parent->FirstChild : NULL); };
inline TDataMember * GetNextChild( TDataMember * PrevChild ) { return ((PrevChild)? PrevChild->Next : NULL); };
const char * GetStr( TDataMember * BaseMember, const char * Path, const char * Default = NULL, bool Create = false );
const char * GetStr( TDataMember * BaseMember, const char * Path, int &Len, const char * Default = NULL, bool Create = false );
const long GetInt( TDataMember * BaseMember, const char * Path, long Default = 0, bool Create = false, const char * Mask = NULL );
const double GetFloat( TDataMember * BaseMember, const char * Path, double Default = 0.0, bool Create = false, const char * Mask = NULL );
const bool GetBool( TDataMember * BaseMember, const char * Path, bool Default = false, bool Create = false );
bool SetObject( TDataMember * BaseMember, const char * Path );
bool SetArray( TDataMember * BaseMember, const char * Path );
bool SetStr( TDataMember * BaseMember, const char * Path, const char * Value = NULL, const int Len = -1 ); // Use Len param if Value contains NULL values
bool SetInt( TDataMember * BaseMember, const char * Path, const long Value, const char * Mask = NULL );
bool SetFloat( TDataMember * BaseMember, const char * Path, const double Value, const char * Mask = NULL );
bool SetBool( TDataMember * BaseMember, const char * Path, const bool Value );
bool SetNull( TDataMember * BaseMember, const char * Path );
bool Delete( TDataMember * BaseMember, const char * Path );
bool DeleteAll();
friend class CJSONparse;
};
#endif /* REDACORE_DATATREECORE_H_ */