Merge branch 'master' of /home/development/source/core/redAcore into InterAfrica
This commit is contained in:
186
DataTreeCore.cpp
186
DataTreeCore.cpp
@@ -17,71 +17,34 @@
|
|||||||
CDataMember::CDataMember( const char * pName, const int pLen )
|
CDataMember::CDataMember( const char * pName, const int pLen )
|
||||||
{
|
{
|
||||||
if (pName) {
|
if (pName) {
|
||||||
Name = strdup( pName );
|
|
||||||
NameLen = (pLen == -1)? strlen( pName ) : pLen ;
|
NameLen = (pLen == -1)? strlen( pName ) : pLen ;
|
||||||
|
Name = strndup( pName, NameLen );
|
||||||
}
|
}
|
||||||
else {
|
|
||||||
Name = NULL;
|
|
||||||
NameLen = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
Type = jtNull;
|
|
||||||
Value = NULL;
|
|
||||||
Len = 0;
|
|
||||||
|
|
||||||
FirstChild = NULL;
|
|
||||||
LastChild = NULL;
|
|
||||||
|
|
||||||
Parent = NULL;
|
|
||||||
PrevPeer = NULL;
|
|
||||||
NextPeer = NULL;
|
|
||||||
}
|
}
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
|
|
||||||
CDataMember::CDataMember( CDataMember * pParent, const char * pName, const int pLen )
|
CDataMember::CDataMember( CDataMember * pParent, const char * pName, const int pLen )
|
||||||
{
|
{
|
||||||
if (pName) {
|
if (pName) {
|
||||||
Name = strdup( pName );
|
|
||||||
NameLen = (pLen == -1)? strlen( pName ) : pLen ;
|
NameLen = (pLen == -1)? strlen( pName ) : pLen ;
|
||||||
}
|
Name = strndup( pName, NameLen );
|
||||||
else {
|
|
||||||
Name = NULL;
|
|
||||||
NameLen = 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Type = jtNull;
|
if (pParent) {
|
||||||
Value = NULL;
|
|
||||||
Len = 0;
|
|
||||||
|
|
||||||
FirstChild = NULL;
|
|
||||||
LastChild = NULL;
|
|
||||||
|
|
||||||
if (!pParent) {
|
|
||||||
Parent = NULL;
|
|
||||||
PrevPeer = NULL;
|
|
||||||
NextPeer = NULL;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
// Clear/reset parent if not object
|
// Clear/reset parent if not object
|
||||||
Parent = pParent;
|
Parent = pParent;
|
||||||
if ((Parent->Type != jtNull) && (Parent->Type != jtObject) && (Parent->Type != jtArray)) {
|
if ((Parent->Type != jtNull) && (Parent->Type != jtObject) && (Parent->Type != jtArray))
|
||||||
Parent->Clear();
|
Parent->Clear();
|
||||||
}
|
|
||||||
|
|
||||||
// Insert into Parent & Peer lists
|
// Insert into Parent & Peer lists
|
||||||
Parent->Len++;
|
Parent->Len++;
|
||||||
if (!Parent->FirstChild) {
|
if (!Parent->FirstChild) {
|
||||||
PrevPeer = NULL;
|
|
||||||
NextPeer = NULL;
|
|
||||||
|
|
||||||
Parent->FirstChild = this;
|
Parent->FirstChild = this;
|
||||||
Parent->LastChild = this;
|
Parent->LastChild = this;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
PrevPeer = Parent->LastChild;
|
PrevPeer = Parent->LastChild;
|
||||||
Parent->LastChild->NextPeer = this;
|
Parent->LastChild->NextPeer = this;
|
||||||
NextPeer = NULL;
|
|
||||||
|
|
||||||
Parent->LastChild = this;
|
Parent->LastChild = this;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -93,19 +56,15 @@ CDataMember::~CDataMember()
|
|||||||
// Remove from parent
|
// Remove from parent
|
||||||
if (Parent) {
|
if (Parent) {
|
||||||
Parent->Len--;
|
Parent->Len--;
|
||||||
if (this == Parent->LastChild) {
|
if (this == Parent->LastChild)
|
||||||
Parent->LastChild = PrevPeer;
|
Parent->LastChild = PrevPeer;
|
||||||
}
|
if (this == Parent->FirstChild)
|
||||||
if (this == Parent->FirstChild) {
|
|
||||||
Parent->FirstChild = NextPeer;
|
Parent->FirstChild = NextPeer;
|
||||||
}
|
}
|
||||||
}
|
if (PrevPeer)
|
||||||
if (PrevPeer) {
|
|
||||||
PrevPeer->NextPeer = NextPeer;
|
PrevPeer->NextPeer = NextPeer;
|
||||||
}
|
if (NextPeer)
|
||||||
if (NextPeer) {
|
|
||||||
NextPeer->PrevPeer = PrevPeer;
|
NextPeer->PrevPeer = PrevPeer;
|
||||||
}
|
|
||||||
|
|
||||||
// Destroy value/children
|
// Destroy value/children
|
||||||
Clear();
|
Clear();
|
||||||
@@ -116,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;
|
CDataMember * Member;
|
||||||
Member = new CDataMember( this, Name, Len );
|
Member = new CDataMember( this, pName, pLen );
|
||||||
return Member;
|
return Member;
|
||||||
}
|
}
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
@@ -131,9 +90,8 @@ bool CDataMember::Clear()
|
|||||||
free( Value );
|
free( Value );
|
||||||
|
|
||||||
// Clear children
|
// Clear children
|
||||||
while (FirstChild) {
|
while (FirstChild)
|
||||||
delete FirstChild;
|
delete FirstChild;
|
||||||
}
|
|
||||||
|
|
||||||
// Reset value
|
// Reset value
|
||||||
Type = jtNull;
|
Type = jtNull;
|
||||||
@@ -169,9 +127,8 @@ CDataMember * CDataMember::GetChild( const char * Path, bool Create )
|
|||||||
int Count;
|
int Count;
|
||||||
|
|
||||||
// Validate
|
// Validate
|
||||||
if (!Path || !*Path) {
|
if (!Path || !*Path)
|
||||||
return this;
|
return this;
|
||||||
}
|
|
||||||
|
|
||||||
// Set init references
|
// Set init references
|
||||||
Child = NULL;
|
Child = NULL;
|
||||||
@@ -179,21 +136,17 @@ CDataMember * CDataMember::GetChild( const char * Path, bool Create )
|
|||||||
|
|
||||||
// Split path
|
// Split path
|
||||||
Pos = (char*)Path;
|
Pos = (char*)Path;
|
||||||
while (Member && *Pos)
|
while (Member && *Pos) {
|
||||||
{
|
|
||||||
// Reset Child reference
|
// Reset Child reference
|
||||||
Child = NULL;
|
Child = NULL;
|
||||||
|
|
||||||
// Find delimiter
|
// Find delimiter
|
||||||
if (*Pos == '[')
|
if (*Pos == '[') {
|
||||||
{
|
|
||||||
// Validate
|
// Validate
|
||||||
if (Create && (Member->Type == jtNull)) {
|
if (Create && (Member->Type == jtNull))
|
||||||
Member->Type = jtArray; // Convert to array
|
Member->Type = jtArray; // Convert to array
|
||||||
}
|
if (Member->Type != jtArray)
|
||||||
if (Member->Type != jtArray) {
|
|
||||||
break; // Can't convert something else to an array
|
break; // Can't convert something else to an array
|
||||||
}
|
|
||||||
|
|
||||||
// Set Index start
|
// Set Index start
|
||||||
Pos++;
|
Pos++;
|
||||||
@@ -214,10 +167,9 @@ CDataMember * CDataMember::GetChild( const char * Path, bool Create )
|
|||||||
|
|
||||||
// find end of list
|
// find end of list
|
||||||
Child = &(Member->FirstChild);
|
Child = &(Member->FirstChild);
|
||||||
while (*Child) {
|
while (*Child)
|
||||||
Child = &((*Child)->NextPeer);
|
Child = &((*Child)->NextPeer);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
else {
|
else {
|
||||||
// Get requested index
|
// Get requested index
|
||||||
Index = (int)strtoul( Key, &EndPos, 10 );
|
Index = (int)strtoul( Key, &EndPos, 10 );
|
||||||
@@ -235,25 +187,21 @@ CDataMember * CDataMember::GetChild( const char * Path, bool Create )
|
|||||||
|
|
||||||
// Create element if needed
|
// Create element if needed
|
||||||
if (!*Child && Create) {
|
if (!*Child && Create) {
|
||||||
if ((Index == -1) || (Index == Count)) {
|
if ((Index == -1) || (Index == Count))
|
||||||
*Child = new CDataMember( Member, NULL );
|
*Child = new CDataMember( Member, NULL );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
else {
|
||||||
else
|
|
||||||
{
|
|
||||||
// Skip separator
|
// Skip separator
|
||||||
if (*Pos == '/') {
|
if (*Pos == '/') {
|
||||||
Pos++;
|
Pos++;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Validate
|
// Validate
|
||||||
if (Create && (Member->Type == jtNull)) {
|
if (Create && (Member->Type == jtNull))
|
||||||
Member->Type = jtObject; // Convert to object
|
Member->Type = jtObject; // Convert to object
|
||||||
}
|
if (Member->Type != jtObject)
|
||||||
if (Member->Type != jtObject) {
|
|
||||||
break; // Can't convert something else to an object
|
break; // Can't convert something else to an object
|
||||||
}
|
|
||||||
|
|
||||||
// Get key value
|
// Get key value
|
||||||
Key = Pos;
|
Key = Pos;
|
||||||
@@ -265,13 +213,12 @@ CDataMember * CDataMember::GetChild( const char * Path, bool Create )
|
|||||||
|
|
||||||
// Find next parent
|
// Find next parent
|
||||||
Child = &(Member->FirstChild);
|
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);
|
Child = &((*Child)->NextPeer);
|
||||||
}
|
|
||||||
if (!*Child && Create) {
|
if (!*Child && Create)
|
||||||
*Child = new CDataMember( Member, Key, KeyLen );
|
*Child = new CDataMember( Member, Key, KeyLen );
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
// Next level
|
// Next level
|
||||||
Member = *Child;
|
Member = *Child;
|
||||||
@@ -288,12 +235,10 @@ CDataMember * CDataMember::GetChFirstChild( const char * Path, bool Create )
|
|||||||
Member = (!Path || !*Path)? this : GetChild( Path, Create );
|
Member = (!Path || !*Path)? this : GetChild( Path, Create );
|
||||||
|
|
||||||
// Check if valid type
|
// Check if valid type
|
||||||
if (!Member || ((Member->Type != jtObject) && (Member->Type != jtNull))) {
|
if (!Member || ((Member->Type != jtObject) && (Member->Type != jtNull)))
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
else if (Create && (Member->Type == jtNull))
|
||||||
else if (Create && (Member->Type == jtNull)) {
|
|
||||||
Member->SetObject(); // Set newly created member to object
|
Member->SetObject(); // Set newly created member to object
|
||||||
}
|
|
||||||
|
|
||||||
return Member->FirstChild;
|
return Member->FirstChild;
|
||||||
}
|
}
|
||||||
@@ -309,12 +254,10 @@ CDataMember * CDataMember::GetChElement( const char * Path, const int Index, boo
|
|||||||
Member = (!Path || !*Path)? this : GetChild( Path, Create );
|
Member = (!Path || !*Path)? this : GetChild( Path, Create );
|
||||||
|
|
||||||
// Check if valid type
|
// Check if valid type
|
||||||
if (!Member || ((Member->Type != jtArray) && (Member->Type != jtNull))) {
|
if (!Member || ((Member->Type != jtArray) && (Member->Type != jtNull)))
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
else if (Create && (Member->Type == jtNull))
|
||||||
else if (Create && (Member->Type == jtNull)) {
|
|
||||||
Member->SetArray(); // Set newly created member to array
|
Member->SetArray(); // Set newly created member to array
|
||||||
}
|
|
||||||
|
|
||||||
// Find element at position
|
// Find element at position
|
||||||
Count = 0;
|
Count = 0;
|
||||||
@@ -354,8 +297,7 @@ bool CDataMember::SetValuePtr( EJsonDataType pType, const char * pValue, int pL
|
|||||||
Clear();
|
Clear();
|
||||||
Type = pType;
|
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;
|
Len = (pLen == -1)? strlen(pValue) : pLen;
|
||||||
Value = (char*)pValue;
|
Value = (char*)pValue;
|
||||||
}
|
}
|
||||||
@@ -370,10 +312,9 @@ bool CDataMember::SetValue( EJsonDataType pType, const char * pValue, int pLen
|
|||||||
Type = pType;
|
Type = pType;
|
||||||
|
|
||||||
// Set new primitive value
|
// Set new primitive value
|
||||||
if ((pType == jtString) || (pType == jtFloat) || (pType == jtInt) || (pType == jtBool))
|
if ((pType == jtString) || (pType == jtFloat) || (pType == jtInt) || (pType == jtBool)) {
|
||||||
{
|
|
||||||
Value = strdup( pValue );
|
|
||||||
Len = (pLen == -1)? strlen(pValue) : pLen;
|
Len = (pLen == -1)? strlen(pValue) : pLen;
|
||||||
|
Value = strndup( pValue, Len );
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -384,9 +325,8 @@ bool CDataMember::SetChObject( const char * Path )
|
|||||||
CDataMember * Member;
|
CDataMember * Member;
|
||||||
|
|
||||||
// Validate
|
// Validate
|
||||||
if (!(Member = GetChild( Path, true ))) {
|
if (!(Member = GetChild( Path, true )))
|
||||||
return false;
|
return false;
|
||||||
}
|
|
||||||
|
|
||||||
// Set as Object
|
// Set as Object
|
||||||
Member->SetValue( jtObject, NULL );
|
Member->SetValue( jtObject, NULL );
|
||||||
@@ -399,9 +339,8 @@ bool CDataMember::SetChArray( const char * Path )
|
|||||||
CDataMember * Member;
|
CDataMember * Member;
|
||||||
|
|
||||||
// Validate
|
// Validate
|
||||||
if (!(Member = GetChild( Path, true ))) {
|
if (!(Member = GetChild( Path, true )))
|
||||||
return false;
|
return false;
|
||||||
}
|
|
||||||
|
|
||||||
// Set as Object
|
// Set as Object
|
||||||
Member->SetValue( jtArray, NULL );
|
Member->SetValue( jtArray, NULL );
|
||||||
@@ -409,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;
|
CDataMember * Member;
|
||||||
|
|
||||||
// Validate
|
// Validate
|
||||||
if (!(Member = GetChild( Path, true ))) {
|
if (!(Member = GetChild( Path, true )))
|
||||||
return false;
|
return false;
|
||||||
}
|
|
||||||
|
|
||||||
// Create Value
|
// Create Value
|
||||||
if (!Value) {
|
if (!pValue)
|
||||||
Member->SetValue( jtString, "", 0 );
|
Member->SetValue( jtString, "", 0 );
|
||||||
}
|
else
|
||||||
else {
|
Member->SetValue( jtString, pValue, pLen );
|
||||||
Member->SetValue( jtString, Value, Len );
|
|
||||||
}
|
|
||||||
return true;
|
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;
|
CDataMember * Member;
|
||||||
char ValueStr[20];
|
char ValueStr[20];
|
||||||
|
|
||||||
// Validate
|
// Validate
|
||||||
if (!(Member = GetChild( Path, true ))) {
|
if (!(Member = GetChild( Path, true )))
|
||||||
return false;
|
return false;
|
||||||
}
|
|
||||||
|
|
||||||
// Create Value
|
// Create Value
|
||||||
sprintf( ValueStr, ((Mask)? Mask : "%ld"), Value );
|
sprintf( ValueStr, ((Mask)? Mask : "%ld"), pValue );
|
||||||
Member->SetValue( jtInt, ValueStr );
|
Member->SetValue( jtInt, ValueStr );
|
||||||
return true;
|
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;
|
CDataMember * Member;
|
||||||
char ValueStr[20];
|
char ValueStr[20];
|
||||||
|
|
||||||
// Validate
|
// Validate
|
||||||
if (!(Member = GetChild( Path, true ))) {
|
if (!(Member = GetChild( Path, true )))
|
||||||
return false;
|
return false;
|
||||||
}
|
|
||||||
|
|
||||||
// Create Value
|
// Create Value
|
||||||
sprintf( ValueStr, ((Mask)? Mask : "%lf"), Value );
|
sprintf( ValueStr, ((Mask)? Mask : "%lf"), pValue );
|
||||||
Member->SetValue( jtFloat, ValueStr );
|
Member->SetValue( jtFloat, ValueStr );
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
|
|
||||||
bool CDataMember::SetChBool( const char * Path, const bool Value )
|
bool CDataMember::SetChBool( const char * Path, const bool pValue )
|
||||||
{
|
{
|
||||||
CDataMember * Member;
|
CDataMember * Member;
|
||||||
|
|
||||||
// Validate
|
// Validate
|
||||||
if (!(Member = GetChild( Path, true ))) {
|
if (!(Member = GetChild( Path, true )))
|
||||||
return false;
|
return false;
|
||||||
}
|
|
||||||
|
|
||||||
// Create Value
|
// Create Value
|
||||||
Member->SetValue( jtBool, ((Value == 0)? "0" : "1") );
|
Member->SetValue( jtBool, ((pValue == 0)? "0" : "1") );
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
@@ -483,9 +416,8 @@ bool CDataMember::SetChNull( const char * Path )
|
|||||||
CDataMember * Member;
|
CDataMember * Member;
|
||||||
|
|
||||||
// Validate
|
// Validate
|
||||||
if (!(Member = GetChild( Path, true ))) {
|
if (!(Member = GetChild( Path, true )))
|
||||||
return false;
|
return false;
|
||||||
}
|
|
||||||
|
|
||||||
// Create Value
|
// Create Value
|
||||||
Member->SetValue( jtNull, NULL );
|
Member->SetValue( jtNull, NULL );
|
||||||
@@ -498,9 +430,9 @@ const char * CDataMember::GetChName( const char * Path )
|
|||||||
CDataMember * Member;
|
CDataMember * Member;
|
||||||
|
|
||||||
// Validate
|
// Validate
|
||||||
if (!(Member = GetChild( Path, false ))) {
|
if (!(Member = GetChild( Path, false )))
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
else
|
||||||
return Member->Name;
|
return Member->Name;
|
||||||
}
|
}
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
@@ -510,9 +442,9 @@ EJsonDataType CDataMember::GetChType( const char * Path )
|
|||||||
CDataMember * Member;
|
CDataMember * Member;
|
||||||
|
|
||||||
// Validate
|
// Validate
|
||||||
if (!(Member = GetChild( Path, false ))) {
|
if (!(Member = GetChild( Path, false )))
|
||||||
return jtNull;
|
return jtNull;
|
||||||
}
|
else
|
||||||
return Member->Type;
|
return Member->Type;
|
||||||
}
|
}
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
@@ -522,12 +454,10 @@ const int CDataMember::GetChLen( const char * Path )
|
|||||||
CDataMember * Member;
|
CDataMember * Member;
|
||||||
|
|
||||||
// Validate
|
// Validate
|
||||||
if ((Member = GetChild( Path, false ))) {
|
if ((Member = GetChild( Path, false )))
|
||||||
return Member->Len;
|
return Member->Len;
|
||||||
}
|
else
|
||||||
else {
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
|
|
||||||
@@ -550,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;
|
CDataMember * Member;
|
||||||
|
|
||||||
// Validate
|
// Validate
|
||||||
if ((Member = GetChild( Path, Create )) &&
|
if ((Member = GetChild( Path, Create )) &&
|
||||||
((Member->Type == jtString) || (Member->Type == jtFloat) || (Member->Type == jtInt) || (Member->Type == jtBool)) ) {
|
((Member->Type == jtString) || (Member->Type == jtFloat) || (Member->Type == jtInt) || (Member->Type == jtBool)) ) {
|
||||||
Len = Member->Len;
|
pLen = Member->Len;
|
||||||
return Member->Value;
|
return Member->Value;
|
||||||
}
|
}
|
||||||
else if (Member && Create && (Member->Type == jtNull)) {
|
else if (Member && Create && (Member->Type == jtNull)) {
|
||||||
Member->SetStr( Default );
|
Member->SetStr( Default );
|
||||||
Len = Member->Len;
|
pLen = Member->Len;
|
||||||
return Member->Value;
|
return Member->Value;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
Len = 0;
|
pLen = (Default? strlen(Default) : 0);
|
||||||
return Default;
|
return Default;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -23,25 +23,25 @@ typedef enum { jtNull = 0, jtBool = 1, jtInt = 2, jtFloat = 3, jtString = 4, jtA
|
|||||||
// One Config Members
|
// One Config Members
|
||||||
class CDataMember
|
class CDataMember
|
||||||
{
|
{
|
||||||
char * Name;
|
char * Name = NULL;
|
||||||
unsigned short NameLen;
|
unsigned short NameLen = 0;
|
||||||
EJsonDataType Type;
|
EJsonDataType Type = jtNull;
|
||||||
|
|
||||||
char * Value;
|
char * Value = NULL;
|
||||||
unsigned short Len;
|
unsigned short Len = 0;
|
||||||
|
|
||||||
CDataMember * FirstChild;
|
CDataMember * FirstChild = NULL;
|
||||||
CDataMember * LastChild;
|
CDataMember * LastChild = NULL;
|
||||||
|
|
||||||
CDataMember * Parent;
|
CDataMember * Parent = NULL;
|
||||||
CDataMember * PrevPeer;
|
CDataMember * PrevPeer = NULL;
|
||||||
CDataMember * NextPeer;
|
CDataMember * NextPeer = NULL;
|
||||||
|
|
||||||
// Manage Members
|
// Manage Members
|
||||||
CDataMember * CreateChild( const char * Name, const int Len = -1 );
|
CDataMember * CreateChild( const char * pName, const int pLen = -1 );
|
||||||
|
|
||||||
// Set Member value
|
// Set Member value
|
||||||
bool SetValue( EJsonDataType Type, const char * Value = NULL, int Len = -1 );
|
bool SetValue( EJsonDataType pType, const char * pValue = NULL, int pLen = -1 );
|
||||||
bool SetValuePtr( EJsonDataType pType, const char * pValue, int pLen = -1 );
|
bool SetValuePtr( EJsonDataType pType, const char * pValue, int pLen = -1 );
|
||||||
|
|
||||||
public:
|
public:
|
||||||
@@ -50,16 +50,15 @@ public:
|
|||||||
~CDataMember();
|
~CDataMember();
|
||||||
|
|
||||||
const char * GetName() { return Name; };
|
const char * GetName() { return Name; };
|
||||||
|
EJsonDataType GetType() { return Type; };
|
||||||
const int GetLen() { return Len; };
|
const int GetLen() { return Len; };
|
||||||
|
|
||||||
const char * GetChName( const char * Path );
|
const char * GetChName( const char * Path );
|
||||||
|
EJsonDataType GetChType( const char * Path );
|
||||||
const int GetChLen( const char * Path );
|
const int GetChLen( const char * Path );
|
||||||
|
|
||||||
/* Check Type */
|
/* Check Type */
|
||||||
|
|
||||||
EJsonDataType GetType() { return Type; };
|
|
||||||
EJsonDataType GetChType( const char * Path );
|
|
||||||
|
|
||||||
inline bool isNull() { return (Type == jtNull); };
|
inline bool isNull() { return (Type == jtNull); };
|
||||||
inline bool isBool() { return (Type == jtBool); };
|
inline bool isBool() { return (Type == jtBool); };
|
||||||
inline bool isInt() { return (Type == jtInt); };
|
inline bool isInt() { return (Type == jtInt); };
|
||||||
@@ -84,13 +83,13 @@ public:
|
|||||||
/* Read Values */
|
/* Read Values */
|
||||||
|
|
||||||
inline const char * GetStr( const char * Default = NULL ) { return GetChStr( NULL, Default, false ); };
|
inline const char * GetStr( const char * Default = NULL ) { return GetChStr( NULL, Default, false ); };
|
||||||
inline const char * GetStr( int &Len, const char * Default = NULL ) { return GetChStr( NULL, Len, Default, false ); };
|
inline const char * GetStr( int &pLen, const char * Default = NULL ) { return GetChStr( NULL, pLen, Default, false ); };
|
||||||
inline const bool GetBool( bool Default = false ) { return GetChBool( NULL, Default, false ); };
|
inline const bool GetBool( bool Default = false ) { return GetChBool( NULL, Default, false ); };
|
||||||
inline const long GetInt( long Default = 0, const char * Mask = NULL ) { return GetChInt( NULL, Default, false, Mask ); };
|
inline const long GetInt( long Default = 0, const char * Mask = NULL ) { return GetChInt( NULL, Default, false, Mask ); };
|
||||||
inline const double GetFloat( double Default = 0.0, const char * Mask = NULL ) { return GetChFloat( NULL, Default, false, Mask ); };
|
inline const double GetFloat( double Default = 0.0, const char * Mask = NULL ) { return GetChFloat( NULL, Default, false, Mask ); };
|
||||||
|
|
||||||
const char * GetChStr( const char * Path, const char * Default = NULL, bool Create = false );
|
const char * GetChStr( const char * Path, const char * Default = NULL, bool Create = false );
|
||||||
const char * GetChStr( const char * Path, int &Len, const char * Default = NULL, bool Create = false );
|
const char * GetChStr( const char * Path, int &pLen, const char * Default = NULL, bool Create = false );
|
||||||
const bool GetChBool( const char * Path, bool Default = false, bool Create = false );
|
const bool GetChBool( const char * Path, bool Default = false, bool Create = false );
|
||||||
const long GetChInt( const char * Path, long Default = 0, bool Create = false, const char * Mask = NULL );
|
const long GetChInt( const char * Path, long Default = 0, bool Create = false, const char * Mask = NULL );
|
||||||
const double GetChFloat( const char * Path, double Default = 0.0, bool Create = false, const char * Mask = NULL );
|
const double GetChFloat( const char * Path, double Default = 0.0, bool Create = false, const char * Mask = NULL );
|
||||||
@@ -101,19 +100,19 @@ public:
|
|||||||
inline bool SetObject() { return SetChObject( NULL ); };
|
inline bool SetObject() { return SetChObject( NULL ); };
|
||||||
inline bool SetArray() { return SetChArray( NULL ); };
|
inline bool SetArray() { return SetChArray( NULL ); };
|
||||||
|
|
||||||
inline bool SetBool( const bool Value ) { return SetChBool( NULL, Value ); };
|
inline bool SetBool( const bool pValue ) { return SetChBool( NULL, pValue ); };
|
||||||
inline bool SetInt( const long Value, const char * Mask = NULL ) { return SetChInt( NULL, Value, Mask ); };
|
inline bool SetInt( const long pValue, const char * Mask = NULL ) { return SetChInt( NULL, pValue, Mask ); };
|
||||||
inline bool SetFloat( const double Value, const char * Mask = NULL ) { return SetChFloat( NULL, Value, Mask ); };
|
inline bool SetFloat( const double pValue, const char * Mask = NULL ) { return SetChFloat( NULL, pValue, Mask ); };
|
||||||
inline bool SetStr( const char * Value = NULL, const int Len = -1 ) { return SetChStr( NULL, Value, Len ); };
|
inline bool SetStr( const char * pValue = NULL, const int pLen = -1 ) { return SetChStr( NULL, pValue, pLen ); };
|
||||||
|
|
||||||
bool SetChStr( const char * Path, const char * Value = NULL, const int Len = -1 ); // Use Len param if Value contains NULL values
|
bool SetChStr( const char * Path, const char * pValue = NULL, const int pLen = -1 ); // Use Len param if Value contains NULL values
|
||||||
bool SetChObject( const char * Path );
|
bool SetChObject( const char * Path );
|
||||||
bool SetChArray( const char * Path );
|
bool SetChArray( const char * Path );
|
||||||
|
|
||||||
bool SetChNull( const char * Path );
|
bool SetChNull( const char * Path );
|
||||||
bool SetChBool( const char * Path, const bool Value );
|
bool SetChBool( const char * Path, const bool pValue );
|
||||||
bool SetChInt( const char * Path, const long Value, const char * Mask = NULL );
|
bool SetChInt( const char * Path, const long pValue, const char * Mask = NULL );
|
||||||
bool SetChFloat( const char * Path, const double Value, const char * Mask = NULL );
|
bool SetChFloat( const char * Path, const double pValue, const char * Mask = NULL );
|
||||||
|
|
||||||
/* Clear / Remove values */
|
/* Clear / Remove values */
|
||||||
|
|
||||||
|
|||||||
@@ -223,7 +223,7 @@ char const * GetDateTimeStr( const char * DateSeparator, const char * TimeSepar
|
|||||||
// Build String
|
// Build String
|
||||||
sprintf( ReturnStr, "%04d%s%02d%s%02d%s%02d%s%02d%s%02d",
|
sprintf( ReturnStr, "%04d%s%02d%s%02d%s%02d%s%02d%s%02d",
|
||||||
Year, ((DateSeparator)? DateSeparator : ""), Month, ((DateSeparator)? DateSeparator : ""), Day,
|
Year, ((DateSeparator)? DateSeparator : ""), Month, ((DateSeparator)? DateSeparator : ""), Day,
|
||||||
Separator,
|
((Separator)? Separator : ""),
|
||||||
Hours, ((TimeSeparator)? TimeSeparator : ""), Minutes, ((TimeSeparator)? TimeSeparator : ""), Seconds );
|
Hours, ((TimeSeparator)? TimeSeparator : ""), Minutes, ((TimeSeparator)? TimeSeparator : ""), Seconds );
|
||||||
|
|
||||||
return (ReturnStr);
|
return (ReturnStr);
|
||||||
@@ -310,6 +310,7 @@ bool ReadDateTime( const char * DateTimeStr, bool LocalTime, time_t &EpochTime )
|
|||||||
NewTime.tm_year -= 1900;
|
NewTime.tm_year -= 1900;
|
||||||
NewTime.tm_mon -= 1;
|
NewTime.tm_mon -= 1;
|
||||||
NewTime.tm_zone = "UTC";
|
NewTime.tm_zone = "UTC";
|
||||||
|
NewTime.tm_isdst = -1;
|
||||||
|
|
||||||
// Convert to Epoch Time
|
// Convert to Epoch Time
|
||||||
EpochTime = mktime( &NewTime ) + ((LocalTime)? 0 : NewTime.tm_gmtoff);
|
EpochTime = mktime( &NewTime ) + ((LocalTime)? 0 : NewTime.tm_gmtoff);
|
||||||
@@ -423,7 +424,7 @@ char const * BuildDateTimeStr( unsigned char Day, unsigned char Month, unsigned
|
|||||||
// Build String
|
// Build String
|
||||||
sprintf( ReturnStr, "%04d%s%02d%s%02d%s%02d%s%02d%s%02d",
|
sprintf( ReturnStr, "%04d%s%02d%s%02d%s%02d%s%02d%s%02d",
|
||||||
Year, ((DateSeparator)? DateSeparator : ""), Month, ((DateSeparator)? DateSeparator : ""), Day,
|
Year, ((DateSeparator)? DateSeparator : ""), Month, ((DateSeparator)? DateSeparator : ""), Day,
|
||||||
Separator,
|
((Separator)? Separator : ""),
|
||||||
Hours, ((TimeSeparator)? TimeSeparator : ""), Minutes, ((TimeSeparator)? TimeSeparator : ""), Seconds );
|
Hours, ((TimeSeparator)? TimeSeparator : ""), Minutes, ((TimeSeparator)? TimeSeparator : ""), Seconds );
|
||||||
|
|
||||||
return (ReturnStr);
|
return (ReturnStr);
|
||||||
|
|||||||
@@ -31,9 +31,8 @@ CJSONparse::CJSONparse( CDataMember * pDataTree )
|
|||||||
CJSONparse::~CJSONparse()
|
CJSONparse::~CJSONparse()
|
||||||
{
|
{
|
||||||
// Destroy buffer
|
// Destroy buffer
|
||||||
if (Buffer) {
|
if (Buffer)
|
||||||
delete Buffer;
|
delete Buffer;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
|
|
||||||
@@ -118,10 +117,9 @@ bool CJSONparse::WriteToFile( const char * BasePath, const char * Path, const ch
|
|||||||
if (Path && *Path) {
|
if (Path && *Path) {
|
||||||
strcpy( FilePath, Path );
|
strcpy( FilePath, Path );
|
||||||
PathLen = strlen( FilePath );
|
PathLen = strlen( FilePath );
|
||||||
if (FilePath[PathLen] != '/') {
|
if (FilePath[PathLen] != '/')
|
||||||
FilePath[PathLen++] = '/';
|
FilePath[PathLen++] = '/';
|
||||||
}
|
}
|
||||||
}
|
|
||||||
strcpy( &FilePath[PathLen], FileName );
|
strcpy( &FilePath[PathLen], FileName );
|
||||||
|
|
||||||
// Read file
|
// Read file
|
||||||
@@ -215,10 +213,9 @@ bool CJSONparse::ReadFromFile( const char * BasePath, const char * Path, const c
|
|||||||
if (Path && *Path) {
|
if (Path && *Path) {
|
||||||
strcpy( FilePath, Path );
|
strcpy( FilePath, Path );
|
||||||
PathLen = strlen( FilePath );
|
PathLen = strlen( FilePath );
|
||||||
if (FilePath[PathLen] != '/') {
|
if (FilePath[PathLen] != '/')
|
||||||
FilePath[PathLen++] = '/';
|
FilePath[PathLen++] = '/';
|
||||||
}
|
}
|
||||||
}
|
|
||||||
strcpy( &FilePath[PathLen], FileName );
|
strcpy( &FilePath[PathLen], FileName );
|
||||||
|
|
||||||
// Read file
|
// Read file
|
||||||
@@ -357,9 +354,8 @@ bool CJSONparse::ReadFromBuffer( const char * BasePath )
|
|||||||
CharNo += BufPos-Mark;
|
CharNo += BufPos-Mark;
|
||||||
sprintf( ErrorText, "First entry in file must be an Object or Array on line %d:%d", LineNo, CharNo );
|
sprintf( ErrorText, "First entry in file must be an Object or Array on line %d:%d", LineNo, CharNo );
|
||||||
}
|
}
|
||||||
if (Error) {
|
if (Error)
|
||||||
return false;
|
return false;
|
||||||
}
|
|
||||||
|
|
||||||
// Ensure remainder of file is empty
|
// Ensure remainder of file is empty
|
||||||
SkipWhiteSpace();
|
SkipWhiteSpace();
|
||||||
@@ -428,8 +424,7 @@ void CJSONparse::FreeBuffer()
|
|||||||
|
|
||||||
void CJSONparse::SkipWhiteSpace()
|
void CJSONparse::SkipWhiteSpace()
|
||||||
{
|
{
|
||||||
while (true)
|
while (true) {
|
||||||
{
|
|
||||||
// Append buffer if required
|
// Append buffer if required
|
||||||
if (!*BufPos && RefillBuffer)
|
if (!*BufPos && RefillBuffer)
|
||||||
FillBuffer();
|
FillBuffer();
|
||||||
@@ -458,9 +453,8 @@ bool CJSONparse::ParseString( char ** Value, int &Len )
|
|||||||
char HexVal[5] = "";
|
char HexVal[5] = "";
|
||||||
|
|
||||||
// Check for opening quote
|
// Check for opening quote
|
||||||
if (*BufPos != '"') {
|
if (*BufPos != '"')
|
||||||
return false;
|
return false;
|
||||||
}
|
|
||||||
|
|
||||||
// Clear values
|
// Clear values
|
||||||
*Value = NULL;
|
*Value = NULL;
|
||||||
@@ -470,12 +464,12 @@ bool CJSONparse::ParseString( char ** Value, int &Len )
|
|||||||
BufPos++;
|
BufPos++;
|
||||||
|
|
||||||
// Check for closing quote
|
// Check for closing quote
|
||||||
while (true)
|
while (true) {
|
||||||
{
|
|
||||||
// Check for special characters
|
// Check for special characters
|
||||||
if ((EndMark = strpbrk( BufPos, "\"\\\n\t\b\f\n\r" ))) { /*"\"/\\\n\t\b\f\n\r" (forward slash included)*/
|
if ((EndMark = strpbrk( BufPos, "\"\\\n\t\b\f\n\r" ))) { /*"\"/\\\n\t\b\f\n\r" (forward slash included)*/
|
||||||
BufPos = EndMark;
|
BufPos = EndMark;
|
||||||
} else if (RefillBuffer) {
|
}
|
||||||
|
else if (RefillBuffer) {
|
||||||
FillBuffer();
|
FillBuffer();
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@@ -492,10 +486,9 @@ bool CJSONparse::ParseString( char ** Value, int &Len )
|
|||||||
}
|
}
|
||||||
else if (*BufPos == '\\') {
|
else if (*BufPos == '\\') {
|
||||||
if (!*(BufPos+1) && RefillBuffer) {
|
if (!*(BufPos+1) && RefillBuffer) {
|
||||||
if (FillBuffer()) {
|
if (FillBuffer())
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
if (*(BufPos+1) == 'u') {
|
if (*(BufPos+1) == 'u') {
|
||||||
for (EndMark = BufPos+2; EndMark < BufPos+6; EndMark++) {
|
for (EndMark = BufPos+2; EndMark < BufPos+6; EndMark++) {
|
||||||
if (!*EndMark && RefillBuffer) {
|
if (!*EndMark && RefillBuffer) {
|
||||||
@@ -538,8 +531,7 @@ bool CJSONparse::ParseString( char ** Value, int &Len )
|
|||||||
|
|
||||||
// Convert value
|
// Convert value
|
||||||
BufPos = Mark+1;
|
BufPos = Mark+1;
|
||||||
while ((EndMark = strpbrk( BufPos, "\"\\" )))
|
while ((EndMark = strpbrk( BufPos, "\"\\" ))) {
|
||||||
{
|
|
||||||
// Copy portion
|
// Copy portion
|
||||||
memcpy( ValuePos, BufPos, (EndMark-BufPos) );
|
memcpy( ValuePos, BufPos, (EndMark-BufPos) );
|
||||||
ValuePos += (EndMark-BufPos);
|
ValuePos += (EndMark-BufPos);
|
||||||
@@ -586,16 +578,14 @@ bool CJSONparse::ParseObject( CDataMember * Object )
|
|||||||
int Len = 0;
|
int Len = 0;
|
||||||
|
|
||||||
// Check for start of Object
|
// Check for start of Object
|
||||||
if (*BufPos != '{') {
|
if (*BufPos != '{')
|
||||||
return false;
|
return false;
|
||||||
}
|
|
||||||
BufPos++;
|
BufPos++;
|
||||||
|
|
||||||
// Set Type
|
// Set Type
|
||||||
Object->SetValue( jtObject );
|
Object->SetValue( jtObject );
|
||||||
|
|
||||||
while (true)
|
while (true) {
|
||||||
{
|
|
||||||
// Evaluate key name
|
// Evaluate key name
|
||||||
SkipWhiteSpace();
|
SkipWhiteSpace();
|
||||||
if (*BufPos == '}') {
|
if (*BufPos == '}') {
|
||||||
@@ -666,21 +656,18 @@ bool CJSONparse::ParseArray( CDataMember * Array )
|
|||||||
CDataMember ** Member;
|
CDataMember ** Member;
|
||||||
|
|
||||||
// Check for start of Object
|
// Check for start of Object
|
||||||
if (*BufPos != '[') {
|
if (*BufPos != '[')
|
||||||
return false;
|
return false;
|
||||||
}
|
|
||||||
BufPos++;
|
BufPos++;
|
||||||
|
|
||||||
// Set Type
|
// Set Type
|
||||||
Array->SetValue( jtArray );
|
Array->SetValue( jtArray );
|
||||||
Member = &(Array->FirstChild);
|
Member = &(Array->FirstChild);
|
||||||
while (true)
|
while (true) {
|
||||||
{
|
|
||||||
// Look for Member Name
|
// Look for Member Name
|
||||||
SkipWhiteSpace();
|
SkipWhiteSpace();
|
||||||
if (*BufPos == ']') {
|
if (*BufPos == ']')
|
||||||
break;
|
break;
|
||||||
}
|
|
||||||
|
|
||||||
// Add new element
|
// Add new element
|
||||||
*Member = new CDataMember( Array );
|
*Member = new CDataMember( Array );
|
||||||
@@ -724,9 +711,8 @@ bool CJSONparse::ParseString( CDataMember * Member )
|
|||||||
int Len = 0;
|
int Len = 0;
|
||||||
|
|
||||||
// Try to parse
|
// Try to parse
|
||||||
if (!ParseString( &Value, Len )) {
|
if (!ParseString( &Value, Len ))
|
||||||
return false;
|
return false;
|
||||||
}
|
|
||||||
|
|
||||||
// Set string
|
// Set string
|
||||||
Member->SetValuePtr( jtString, Value, Len );
|
Member->SetValuePtr( jtString, Value, Len );
|
||||||
@@ -737,7 +723,6 @@ bool CJSONparse::ParseString( CDataMember * Member )
|
|||||||
|
|
||||||
bool CJSONparse::ParsePrimitive( CDataMember * Member )
|
bool CJSONparse::ParsePrimitive( CDataMember * Member )
|
||||||
{
|
{
|
||||||
char * Value = NULL;
|
|
||||||
int Len = 0;
|
int Len = 0;
|
||||||
char * EndMark;
|
char * EndMark;
|
||||||
|
|
||||||
@@ -772,19 +757,13 @@ bool CJSONparse::ParsePrimitive( CDataMember * Member )
|
|||||||
// Try conversion to int
|
// Try conversion to int
|
||||||
strtol( Mark, &EndMark, 10 );
|
strtol( Mark, &EndMark, 10 );
|
||||||
if (EndMark == BufPos) {
|
if (EndMark == BufPos) {
|
||||||
Value = (char*)malloc( Len+1 );
|
Member->SetValue( jtInt, Mark, Len );
|
||||||
memcpy( Value, Mark, Len );
|
|
||||||
Value[Len] = 0;
|
|
||||||
Member->SetValuePtr( jtInt, Value, Len );
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
// Try conversion to float
|
// Try conversion to float
|
||||||
strtod( Mark, &EndMark );
|
strtod( Mark, &EndMark );
|
||||||
if (EndMark == BufPos) {
|
if (EndMark == BufPos) {
|
||||||
Value = (char*)malloc( Len+1 );
|
Member->SetValue( jtFloat, Mark, Len );
|
||||||
memcpy( Value, Mark, Len );
|
|
||||||
Value[Len] = 0;
|
|
||||||
Member->SetValuePtr( jtFloat, Value, Len );
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
Error = true;
|
Error = true;
|
||||||
@@ -810,8 +789,7 @@ bool CJSONparse::PrintString( char * String, int Len )
|
|||||||
|
|
||||||
// Content
|
// Content
|
||||||
BufPos = String;
|
BufPos = String;
|
||||||
while (true)
|
while (true) {
|
||||||
{
|
|
||||||
// Scan for special chars
|
// Scan for special chars
|
||||||
Mark = BufPos;
|
Mark = BufPos;
|
||||||
while ((*BufPos >= 32) && (*BufPos <= 126) && (*BufPos != '\\') && /*(*BufPos != '/') &&*/ (*BufPos != '"'))
|
while ((*BufPos >= 32) && (*BufPos <= 126) && (*BufPos != '\\') && /*(*BufPos != '/') &&*/ (*BufPos != '"'))
|
||||||
@@ -880,8 +858,7 @@ bool CJSONparse::PrintObject( CDataMember * Object, const int Indent )
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Save parameters
|
// Save parameters
|
||||||
for (Member = Object->FirstChild; Member != NULL; (Member = Member->NextPeer))
|
for (Member = Object->FirstChild; Member != NULL; (Member = Member->NextPeer)) {
|
||||||
{
|
|
||||||
// Whitespace around first bracket
|
// Whitespace around first bracket
|
||||||
if (Indent) {
|
if (Indent) {
|
||||||
if (First) {
|
if (First) {
|
||||||
@@ -894,20 +871,21 @@ bool CJSONparse::PrintObject( CDataMember * Object, const int Indent )
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Print key name
|
// Print key name
|
||||||
if (!PrintString( Member->Name, strlen(Member->Name) ))
|
if (!PrintString( Member->Name, strlen(Member->Name) )) {
|
||||||
return false;
|
return false;
|
||||||
if (Indent) {
|
}
|
||||||
|
else if (Indent) {
|
||||||
if (Print( this, " : ", 3 ) < 0)
|
if (Print( this, " : ", 3 ) < 0)
|
||||||
return false;
|
return false;
|
||||||
} else {
|
}
|
||||||
|
else {
|
||||||
if (Print( this, ":", 1 ) < 0)
|
if (Print( this, ":", 1 ) < 0)
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Print value
|
// Print value
|
||||||
Last = (++Count >= Object->Len);
|
Last = (++Count >= Object->Len);
|
||||||
switch (Member->Type)
|
switch (Member->Type) {
|
||||||
{
|
|
||||||
case jtNull :
|
case jtNull :
|
||||||
if (Print( this, "null", 4 ) < 0)
|
if (Print( this, "null", 4 ) < 0)
|
||||||
return false;
|
return false;
|
||||||
@@ -968,6 +946,7 @@ bool CJSONparse::PrintObject( CDataMember * Object, const int Indent )
|
|||||||
}
|
}
|
||||||
if (Print( this, "}", 1 ) < 0)
|
if (Print( this, "}", 1 ) < 0)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
@@ -998,8 +977,7 @@ bool CJSONparse::PrintArray( CDataMember * Array, const int Indent )
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Save parameters
|
// Save parameters
|
||||||
for (Member = Array->FirstChild; Member != NULL; (Member = Member->NextPeer))
|
for (Member = Array->FirstChild; Member != NULL; (Member = Member->NextPeer)) {
|
||||||
{
|
|
||||||
// Whitespace around brace
|
// Whitespace around brace
|
||||||
if (Indent) {
|
if (Indent) {
|
||||||
if (First) {
|
if (First) {
|
||||||
@@ -1012,8 +990,7 @@ bool CJSONparse::PrintArray( CDataMember * Array, const int Indent )
|
|||||||
}
|
}
|
||||||
|
|
||||||
Last = (++Count >= Array->Len);
|
Last = (++Count >= Array->Len);
|
||||||
switch (Member->Type)
|
switch (Member->Type) {
|
||||||
{
|
|
||||||
case jtNull :
|
case jtNull :
|
||||||
if (Print( this, "null", 4 ) < 0)
|
if (Print( this, "null", 4 ) < 0)
|
||||||
return false;
|
return false;
|
||||||
|
|||||||
@@ -54,7 +54,7 @@ CSelect::~CSelect()
|
|||||||
while (FirstHandle)
|
while (FirstHandle)
|
||||||
{
|
{
|
||||||
NextHandle = FirstHandle->Next;
|
NextHandle = FirstHandle->Next;
|
||||||
free( FirstHandle );
|
delete FirstHandle;
|
||||||
FirstHandle = NextHandle;
|
FirstHandle = NextHandle;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -95,8 +95,7 @@ void CSelect::Add( int FD, bool Read, bool Write, THandle * Handle, CSelectableB
|
|||||||
}
|
}
|
||||||
if (!*SelectHandle) {
|
if (!*SelectHandle) {
|
||||||
// Create if not exist
|
// Create if not exist
|
||||||
*SelectHandle = (TSelectHandle*)malloc( sizeof(TSelectHandle) );
|
*SelectHandle = new TSelectHandle;
|
||||||
memset( *SelectHandle, 0, sizeof(TSelectHandle) );
|
|
||||||
|
|
||||||
// Set Parameters
|
// Set Parameters
|
||||||
(*SelectHandle)->FD = FD;
|
(*SelectHandle)->FD = FD;
|
||||||
@@ -229,7 +228,7 @@ bool CSelect::Test()
|
|||||||
*HandlePtr = (*HandlePtr)->Next;
|
*HandlePtr = (*HandlePtr)->Next;
|
||||||
|
|
||||||
// Destroy and go to next
|
// Destroy and go to next
|
||||||
free( Handle );
|
delete Handle;
|
||||||
Handle = *HandlePtr;
|
Handle = *HandlePtr;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|||||||
12
TimingCore.h
12
TimingCore.h
@@ -63,6 +63,18 @@ inline long SecondsPassed( timeval StartTime ) {
|
|||||||
};
|
};
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
|
|
||||||
|
// Milli-seconds difference between two times
|
||||||
|
inline long TimeDiff( timeval StartTime, timeval EndTime ) {
|
||||||
|
long Duration;
|
||||||
|
|
||||||
|
Duration = (EndTime.tv_sec - StartTime.tv_sec) * (time_t)1000 +
|
||||||
|
(EndTime.tv_usec - StartTime.tv_usec) / (time_t)1000;
|
||||||
|
if (Duration < 0)
|
||||||
|
Duration = LONG_MAX;
|
||||||
|
return Duration;
|
||||||
|
};
|
||||||
|
//---------------------------------------------------------------------------
|
||||||
|
|
||||||
// Time remaining from Start time to given time out
|
// Time remaining from Start time to given time out
|
||||||
inline long TimeLeft( timeval StartTime, long MilliSeconds ) {
|
inline long TimeLeft( timeval StartTime, long MilliSeconds ) {
|
||||||
return (MilliSeconds - TimePassed(StartTime));
|
return (MilliSeconds - TimePassed(StartTime));
|
||||||
|
|||||||
Reference in New Issue
Block a user