Merge branch 'HitNotDB'
This commit is contained in:
138
DataTreeCore.cpp
138
DataTreeCore.cpp
@@ -33,9 +33,8 @@ CDataMember::CDataMember( CDataMember * pParent, const char * pName, const int p
|
||||
if (pParent) {
|
||||
// Clear/reset parent if not object
|
||||
Parent = pParent;
|
||||
if ((Parent->Type != jtNull) && (Parent->Type != jtObject) && (Parent->Type != jtArray)) {
|
||||
if ((Parent->Type != jtNull) && (Parent->Type != jtObject) && (Parent->Type != jtArray))
|
||||
Parent->Clear();
|
||||
}
|
||||
|
||||
// Insert into Parent & Peer lists
|
||||
Parent->Len++;
|
||||
@@ -76,10 +75,10 @@ CDataMember::~CDataMember()
|
||||
}
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
CDataMember * CDataMember::CreateChild( const char * Name, const int Len )
|
||||
CDataMember * CDataMember::CreateChild( const char * pName, const int pLen )
|
||||
{
|
||||
CDataMember * Member;
|
||||
Member = new CDataMember( this, Name, Len );
|
||||
Member = new CDataMember( this, pName, pLen );
|
||||
return Member;
|
||||
}
|
||||
//---------------------------------------------------------------------------
|
||||
@@ -91,9 +90,8 @@ bool CDataMember::Clear()
|
||||
free( Value );
|
||||
|
||||
// Clear children
|
||||
while (FirstChild) {
|
||||
while (FirstChild)
|
||||
delete FirstChild;
|
||||
}
|
||||
|
||||
// Reset value
|
||||
Type = jtNull;
|
||||
@@ -129,31 +127,26 @@ CDataMember * CDataMember::GetChild( const char * Path, bool Create )
|
||||
int Count;
|
||||
|
||||
// Validate
|
||||
if (!Path || !*Path) {
|
||||
if (!Path || !*Path)
|
||||
return this;
|
||||
}
|
||||
|
||||
// Set init references
|
||||
Child = NULL;
|
||||
Member = this;
|
||||
Child = NULL;
|
||||
Member = this;
|
||||
|
||||
// Split path
|
||||
Pos = (char*)Path;
|
||||
while (Member && *Pos)
|
||||
{
|
||||
while (Member && *Pos) {
|
||||
// Reset Child reference
|
||||
Child = NULL;
|
||||
|
||||
// Find delimiter
|
||||
if (*Pos == '[')
|
||||
{
|
||||
if (*Pos == '[') {
|
||||
// Validate
|
||||
if (Create && (Member->Type == jtNull)) {
|
||||
if (Create && (Member->Type == jtNull))
|
||||
Member->Type = jtArray; // Convert to array
|
||||
}
|
||||
if (Member->Type != jtArray) {
|
||||
if (Member->Type != jtArray)
|
||||
break; // Can't convert something else to an array
|
||||
}
|
||||
|
||||
// Set Index start
|
||||
Pos++;
|
||||
@@ -174,9 +167,8 @@ CDataMember * CDataMember::GetChild( const char * Path, bool Create )
|
||||
|
||||
// find end of list
|
||||
Child = &(Member->FirstChild);
|
||||
while (*Child) {
|
||||
while (*Child)
|
||||
Child = &((*Child)->NextPeer);
|
||||
}
|
||||
}
|
||||
else {
|
||||
// Get requested index
|
||||
@@ -195,25 +187,21 @@ CDataMember * CDataMember::GetChild( const char * Path, bool Create )
|
||||
|
||||
// Create element if needed
|
||||
if (!*Child && Create) {
|
||||
if ((Index == -1) || (Index == Count)) {
|
||||
if ((Index == -1) || (Index == Count))
|
||||
*Child = new CDataMember( Member, NULL );
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
else {
|
||||
// Skip separator
|
||||
if (*Pos == '/') {
|
||||
Pos++;
|
||||
}
|
||||
|
||||
// Validate
|
||||
if (Create && (Member->Type == jtNull)) {
|
||||
if (Create && (Member->Type == jtNull))
|
||||
Member->Type = jtObject; // Convert to object
|
||||
}
|
||||
if (Member->Type != jtObject) {
|
||||
if (Member->Type != jtObject)
|
||||
break; // Can't convert something else to an object
|
||||
}
|
||||
|
||||
// Get key value
|
||||
Key = Pos;
|
||||
@@ -225,12 +213,11 @@ CDataMember * CDataMember::GetChild( const char * Path, bool Create )
|
||||
|
||||
// Find next parent
|
||||
Child = &(Member->FirstChild);
|
||||
while (*Child && (((*Child)->NameLen != KeyLen) || strncasecmp( (*Child)->Name, Key, KeyLen ))) {
|
||||
while (*Child && (((*Child)->NameLen != KeyLen) || strncasecmp( (*Child)->Name, Key, KeyLen )))
|
||||
Child = &((*Child)->NextPeer);
|
||||
}
|
||||
if (!*Child && Create) {
|
||||
|
||||
if (!*Child && Create)
|
||||
*Child = new CDataMember( Member, Key, KeyLen );
|
||||
}
|
||||
}
|
||||
|
||||
// Next level
|
||||
@@ -248,12 +235,10 @@ CDataMember * CDataMember::GetChFirstChild( const char * Path, bool Create )
|
||||
Member = (!Path || !*Path)? this : GetChild( Path, Create );
|
||||
|
||||
// Check if valid type
|
||||
if (!Member || ((Member->Type != jtObject) && (Member->Type != jtNull))) {
|
||||
if (!Member || ((Member->Type != jtObject) && (Member->Type != jtNull)))
|
||||
return NULL;
|
||||
}
|
||||
else if (Create && (Member->Type == jtNull)) {
|
||||
else if (Create && (Member->Type == jtNull))
|
||||
Member->SetObject(); // Set newly created member to object
|
||||
}
|
||||
|
||||
return Member->FirstChild;
|
||||
}
|
||||
@@ -269,12 +254,10 @@ CDataMember * CDataMember::GetChElement( const char * Path, const int Index, boo
|
||||
Member = (!Path || !*Path)? this : GetChild( Path, Create );
|
||||
|
||||
// Check if valid type
|
||||
if (!Member || ((Member->Type != jtArray) && (Member->Type != jtNull))) {
|
||||
if (!Member || ((Member->Type != jtArray) && (Member->Type != jtNull)))
|
||||
return NULL;
|
||||
}
|
||||
else if (Create && (Member->Type == jtNull)) {
|
||||
else if (Create && (Member->Type == jtNull))
|
||||
Member->SetArray(); // Set newly created member to array
|
||||
}
|
||||
|
||||
// Find element at position
|
||||
Count = 0;
|
||||
@@ -314,8 +297,7 @@ bool CDataMember::SetValuePtr( EJsonDataType pType, const char * pValue, int pL
|
||||
Clear();
|
||||
Type = pType;
|
||||
|
||||
if ((pType == jtString) || (pType == jtFloat) || (pType == jtInt) || (pType == jtBool))
|
||||
{
|
||||
if ((pType == jtString) || (pType == jtFloat) || (pType == jtInt) || (pType == jtBool)) {
|
||||
Len = (pLen == -1)? strlen(pValue) : pLen;
|
||||
Value = (char*)pValue;
|
||||
}
|
||||
@@ -330,8 +312,7 @@ bool CDataMember::SetValue( EJsonDataType pType, const char * pValue, int pLen
|
||||
Type = pType;
|
||||
|
||||
// Set new primitive value
|
||||
if ((pType == jtString) || (pType == jtFloat) || (pType == jtInt) || (pType == jtBool))
|
||||
{
|
||||
if ((pType == jtString) || (pType == jtFloat) || (pType == jtInt) || (pType == jtBool)) {
|
||||
Len = (pLen == -1)? strlen(pValue) : pLen;
|
||||
Value = strndup( pValue, Len );
|
||||
}
|
||||
@@ -344,9 +325,8 @@ bool CDataMember::SetChObject( const char * Path )
|
||||
CDataMember * Member;
|
||||
|
||||
// Validate
|
||||
if (!(Member = GetChild( Path, true ))) {
|
||||
if (!(Member = GetChild( Path, true )))
|
||||
return false;
|
||||
}
|
||||
|
||||
// Set as Object
|
||||
Member->SetValue( jtObject, NULL );
|
||||
@@ -359,9 +339,8 @@ bool CDataMember::SetChArray( const char * Path )
|
||||
CDataMember * Member;
|
||||
|
||||
// Validate
|
||||
if (!(Member = GetChild( Path, true ))) {
|
||||
if (!(Member = GetChild( Path, true )))
|
||||
return false;
|
||||
}
|
||||
|
||||
// Set as Object
|
||||
Member->SetValue( jtArray, NULL );
|
||||
@@ -369,71 +348,65 @@ bool CDataMember::SetChArray( const char * Path )
|
||||
}
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
bool CDataMember::SetChStr( const char * Path, const char * Value, const int Len )
|
||||
bool CDataMember::SetChStr( const char * Path, const char * pValue, const int pLen )
|
||||
{
|
||||
CDataMember * Member;
|
||||
|
||||
// Validate
|
||||
if (!(Member = GetChild( Path, true ))) {
|
||||
if (!(Member = GetChild( Path, true )))
|
||||
return false;
|
||||
}
|
||||
|
||||
// Create Value
|
||||
if (!Value) {
|
||||
if (!pValue)
|
||||
Member->SetValue( jtString, "", 0 );
|
||||
}
|
||||
else {
|
||||
Member->SetValue( jtString, Value, Len );
|
||||
}
|
||||
else
|
||||
Member->SetValue( jtString, pValue, pLen );
|
||||
return true;
|
||||
}
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
bool CDataMember::SetChInt( const char * Path, const long Value, const char * Mask )
|
||||
bool CDataMember::SetChInt( const char * Path, const long pValue, const char * Mask )
|
||||
{
|
||||
CDataMember * Member;
|
||||
char ValueStr[20];
|
||||
|
||||
// Validate
|
||||
if (!(Member = GetChild( Path, true ))) {
|
||||
if (!(Member = GetChild( Path, true )))
|
||||
return false;
|
||||
}
|
||||
|
||||
// Create Value
|
||||
sprintf( ValueStr, ((Mask)? Mask : "%ld"), Value );
|
||||
sprintf( ValueStr, ((Mask)? Mask : "%ld"), pValue );
|
||||
Member->SetValue( jtInt, ValueStr );
|
||||
return true;
|
||||
}
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
bool CDataMember::SetChFloat( const char * Path, const double Value, const char * Mask )
|
||||
bool CDataMember::SetChFloat( const char * Path, const double pValue, const char * Mask )
|
||||
{
|
||||
CDataMember * Member;
|
||||
char ValueStr[20];
|
||||
|
||||
// Validate
|
||||
if (!(Member = GetChild( Path, true ))) {
|
||||
if (!(Member = GetChild( Path, true )))
|
||||
return false;
|
||||
}
|
||||
|
||||
// Create Value
|
||||
sprintf( ValueStr, ((Mask)? Mask : "%lf"), Value );
|
||||
sprintf( ValueStr, ((Mask)? Mask : "%lf"), pValue );
|
||||
Member->SetValue( jtFloat, ValueStr );
|
||||
return true;
|
||||
}
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
bool CDataMember::SetChBool( const char * Path, const bool Value )
|
||||
bool CDataMember::SetChBool( const char * Path, const bool pValue )
|
||||
{
|
||||
CDataMember * Member;
|
||||
|
||||
// Validate
|
||||
if (!(Member = GetChild( Path, true ))) {
|
||||
if (!(Member = GetChild( Path, true )))
|
||||
return false;
|
||||
}
|
||||
|
||||
// Create Value
|
||||
Member->SetValue( jtBool, ((Value == 0)? "0" : "1") );
|
||||
Member->SetValue( jtBool, ((pValue == 0)? "0" : "1") );
|
||||
return true;
|
||||
}
|
||||
//---------------------------------------------------------------------------
|
||||
@@ -443,9 +416,8 @@ bool CDataMember::SetChNull( const char * Path )
|
||||
CDataMember * Member;
|
||||
|
||||
// Validate
|
||||
if (!(Member = GetChild( Path, true ))) {
|
||||
if (!(Member = GetChild( Path, true )))
|
||||
return false;
|
||||
}
|
||||
|
||||
// Create Value
|
||||
Member->SetValue( jtNull, NULL );
|
||||
@@ -458,10 +430,10 @@ const char * CDataMember::GetChName( const char * Path )
|
||||
CDataMember * Member;
|
||||
|
||||
// Validate
|
||||
if (!(Member = GetChild( Path, false ))) {
|
||||
if (!(Member = GetChild( Path, false )))
|
||||
return NULL;
|
||||
}
|
||||
return Member->Name;
|
||||
else
|
||||
return Member->Name;
|
||||
}
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
@@ -470,10 +442,10 @@ EJsonDataType CDataMember::GetChType( const char * Path )
|
||||
CDataMember * Member;
|
||||
|
||||
// Validate
|
||||
if (!(Member = GetChild( Path, false ))) {
|
||||
if (!(Member = GetChild( Path, false )))
|
||||
return jtNull;
|
||||
}
|
||||
return Member->Type;
|
||||
else
|
||||
return Member->Type;
|
||||
}
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
@@ -482,12 +454,10 @@ const int CDataMember::GetChLen( const char * Path )
|
||||
CDataMember * Member;
|
||||
|
||||
// Validate
|
||||
if ((Member = GetChild( Path, false ))) {
|
||||
if ((Member = GetChild( Path, false )))
|
||||
return Member->Len;
|
||||
}
|
||||
else {
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
@@ -510,23 +480,23 @@ const char * CDataMember::GetChStr( const char * Path, const char * Default, boo
|
||||
}
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
const char * CDataMember::GetChStr( const char * Path, int &Len, const char * Default, bool Create )
|
||||
const char * CDataMember::GetChStr( const char * Path, int &pLen, const char * Default, bool Create )
|
||||
{
|
||||
CDataMember * Member;
|
||||
|
||||
// Validate
|
||||
if ((Member = GetChild( Path, Create )) &&
|
||||
((Member->Type == jtString) || (Member->Type == jtFloat) || (Member->Type == jtInt) || (Member->Type == jtBool)) ) {
|
||||
Len = Member->Len;
|
||||
pLen = Member->Len;
|
||||
return Member->Value;
|
||||
}
|
||||
else if (Member && Create && (Member->Type == jtNull)) {
|
||||
Member->SetStr( Default );
|
||||
Len = Member->Len;
|
||||
pLen = Member->Len;
|
||||
return Member->Value;
|
||||
}
|
||||
else {
|
||||
Len = 0;
|
||||
pLen = (Default? strlen(Default) : 0);
|
||||
return Default;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user