Important update:

- DataTreeCore:
  - Renamed Get/SetMemXxx() methods to Get/SetChXxx()
  - Renamed GetMember() to GetChild()
  - Updated: JSONparse, ApplicationCore, FunctionCore, SelectableCore,
             and WatchdogCore
  - Remove unused PrevChild & Last vars in GetChild (GetMember)
- JSONparseCore:
  - Use return values from write() and PrintXxx() methods to report fail
- SelectableCore:
  - Fix possible uninitialised FlowCtrl & Parity value
- DateTimeCore:
  - Fix possible memory overrun in temp buffer
- EventBufferCore:
  - Fix possible uninitialised value error in AddEvent
This commit is contained in:
Charl Wentzel
2018-11-20 11:27:09 +02:00
parent 278198171d
commit 6263c0f508
9 changed files with 248 additions and 213 deletions

View File

@@ -152,7 +152,7 @@ bool CApplication::LoadConfigData()
// Get debug level
pLogLevel = dlNone;
TempStr = (char*)ConfigMember->GetMemStr( "Log/Level", "Medium", true );
TempStr = (char*)ConfigMember->GetChStr( "Log/Level", "Medium", true );
if (TempStr)
{
if (!strcasecmp( TempStr, "Low" ))
@@ -165,7 +165,7 @@ bool CApplication::LoadConfigData()
// Set debug output
pLogOutput = 0;
if ((TempMember = ConfigMember->GetMember( "Log/Output", true )))
if ((TempMember = ConfigMember->GetChild( "Log/Output", true )))
{
TempMember = TempMember->GetFirstChild();
while (TempMember)
@@ -193,7 +193,7 @@ bool CApplication::LoadConfigData()
SetLogParam( pLogLevel, pLogOutput );
// Load Address List
if ((AddressFile = (char*)ConfigMember->GetMemStr( "AddressList/Path", NULL )))
if ((AddressFile = (char*)ConfigMember->GetChStr( "AddressList/Path", NULL )))
{
if (JSONparser->ReadFromFile( "address", AddressFile )) {
if (Log) Log->Message( dlLow, dlLow, "%s: Address file loaded (%s)", ProcessName, AddressFile );
@@ -204,10 +204,10 @@ bool CApplication::LoadConfigData()
}
// Configure Selector
if ((TempMember = ConfigMember->GetMember( "Selector" )))
if ((TempMember = ConfigMember->GetChild( "Selector" )))
{
// Create Selector
Selector = new CSelect( (int)TempMember->GetMemInt( "Wait", 5, true ), LogLevel );
Selector = new CSelect( (int)TempMember->GetChInt( "Wait", 5, true ), LogLevel );
}
return true;
}
@@ -235,7 +235,7 @@ bool CApplication::Init()
bool CApplication::InitConfig( const char * pConfigPath )
{
// Check if Datatree exists
if (!DataTree || !(ConfigMember = DataTree->GetMember( pConfigPath ))) {
if (!DataTree || !(ConfigMember = DataTree->GetChild( pConfigPath ))) {
return false;
}
@@ -254,7 +254,7 @@ bool CApplication::InitFunctions( const char * pConfigPath )
char * Type;
// Check of path exists
if (!DataTree || !(FunctionConfigMember = DataTree->GetMember( pConfigPath )))
if (!DataTree || !(FunctionConfigMember = DataTree->GetChild( pConfigPath )))
return false;
// Process each Channel
@@ -262,7 +262,7 @@ bool CApplication::InitFunctions( const char * pConfigPath )
while (TempMember)
{
// Get function parameters
Type = (char*)TempMember->GetMemStr( "Type", "Custom", true );
Type = (char*)TempMember->GetChStr( "Type", "Custom", true );
// Get or create function
if (!strcasecmp( Type, "WatchdogClient" )) {
@@ -297,7 +297,7 @@ bool CApplication::InitFunctionLinks( const char * pConfigPath )
CDataMember * TempMember;
// Check of path exists
if (!DataTree || !(LinkConfigMember = DataTree->GetMember( pConfigPath )))
if (!DataTree || !(LinkConfigMember = DataTree->GetChild( pConfigPath )))
return false;
// Process each Channel
@@ -305,7 +305,7 @@ bool CApplication::InitFunctionLinks( const char * pConfigPath )
while (FunctionItem)
{
// Build links for function
if ((TempMember = LinkConfigMember->GetMember( FunctionItem->Function->GetName() )))
if ((TempMember = LinkConfigMember->GetChild( FunctionItem->Function->GetName() )))
FunctionItem->Function->InitChannelLinks( TempMember );
// Next

View File

@@ -148,18 +148,16 @@ bool CDataMember::Clear()
}
//---------------------------------------------------------------------------
CDataMember * CDataMember::GetMember( const char * Path, bool Create )
CDataMember * CDataMember::GetChild( const char * Path, bool Create )
{
CDataMember * Member;
CDataMember ** Child;
CDataMember * PrevChild;
char * Pos;
char * EndPos;
char * Key;
unsigned short KeyLen;
int Index;
int Count;
bool Last = false;
// Validate
if (!Path || !*Path) {
@@ -197,11 +195,7 @@ CDataMember * CDataMember::GetMember( const char * Path, bool Create )
Pos++;
if (!*Pos)
break;
// Check if last
Pos++;
if (!*Pos)
Last = true;
if (Pos == Key+1) {
// Empty bracket only allowed for create
@@ -210,10 +204,8 @@ CDataMember * CDataMember::GetMember( const char * Path, bool Create )
Index = -1;
// find end of list
PrevChild = NULL;
Child = &(Member->FirstChild);
while (*Child) {
PrevChild = *Child;
Child = &((*Child)->NextPeer);
}
}
@@ -224,11 +216,9 @@ CDataMember * CDataMember::GetMember( const char * Path, bool Create )
break;
// Find element at requested index
PrevChild = NULL;
Child = &(Member->FirstChild);
Count = 0;
while (*Child && (Count < Index)) {
PrevChild = *Child;
Child = &((*Child)->NextPeer);
Count++;
}
@@ -264,16 +254,9 @@ CDataMember * CDataMember::GetMember( const char * Path, bool Create )
Pos++;
}
// More elements?
if (!*Pos) {
Last = true;
}
// Find next parent
PrevChild = NULL;
Child = &(Member->FirstChild);
while (*Child && (((*Child)->NameLen != KeyLen) || strncasecmp( (*Child)->Name, Key, KeyLen ))) {
PrevChild = *Child;
Child = &((*Child)->NextPeer);
}
if (!*Child && Create) {
@@ -288,12 +271,12 @@ CDataMember * CDataMember::GetMember( const char * Path, bool Create )
}
//---------------------------------------------------------------------------
CDataMember * CDataMember::GetMemFirstChild( const char * Path )
CDataMember * CDataMember::GetChFirstChild( const char * Path )
{
CDataMember * Member = NULL;
// Find member
Member = (!Path || !*Path)? this : GetMember( Path, false );
Member = (!Path || !*Path)? this : GetChild( Path, false );
// Check if valid type
if (!Member || ((Member->Type != jtObject) && (Member->Type != jtNull))) {
@@ -304,14 +287,14 @@ CDataMember * CDataMember::GetMemFirstChild( const char * Path )
}
//---------------------------------------------------------------------------
CDataMember * CDataMember::GetMemElement( const char * Path, const int Index )
CDataMember * CDataMember::GetChElement( const char * Path, const int Index )
{
CDataMember * Member = NULL;
CDataMember * Child = NULL;
int Count;
// Find Member
Member = (!Path || !*Path)? this : GetMember( Path, false );
Member = (!Path || !*Path)? this : GetChild( Path, false );
// Check if valid type
if (!Member || ((Member->Type != jtArray) && (Member->Type != jtNull))) {
@@ -340,7 +323,7 @@ bool CDataMember::Delete( const char * Path )
Clear();
return true;
}
else if ((Member = GetMember( Path, false ))) {
else if ((Member = GetChild( Path, false ))) {
// If valid path, destroy member
delete Member;
return true;
@@ -381,12 +364,12 @@ bool CDataMember::SetValue( EDataType pType, const char * pValue, int pLen )
}
//---------------------------------------------------------------------------
bool CDataMember::SetMemObject( const char * Path )
bool CDataMember::SetChObject( const char * Path )
{
CDataMember * Member;
// Validate
if (!(Member = GetMember( Path, true ))) {
if (!(Member = GetChild( Path, true ))) {
return false;
}
@@ -396,12 +379,12 @@ bool CDataMember::SetMemObject( const char * Path )
}
//---------------------------------------------------------------------------
bool CDataMember::SetMemArray( const char * Path )
bool CDataMember::SetChArray( const char * Path )
{
CDataMember * Member;
// Validate
if (!(Member = GetMember( Path, true ))) {
if (!(Member = GetChild( Path, true ))) {
return false;
}
@@ -411,12 +394,12 @@ bool CDataMember::SetMemArray( const char * Path )
}
//---------------------------------------------------------------------------
bool CDataMember::SetMemStr( const char * Path, const char * Value, const int Len )
bool CDataMember::SetChStr( const char * Path, const char * Value, const int Len )
{
CDataMember * Member;
// Validate
if (!(Member = GetMember( Path, true ))) {
if (!(Member = GetChild( Path, true ))) {
return false;
}
@@ -431,13 +414,13 @@ bool CDataMember::SetMemStr( const char * Path, const char * Value, const int L
}
//---------------------------------------------------------------------------
bool CDataMember::SetMemInt( const char * Path, const long Value, const char * Mask )
bool CDataMember::SetChInt( const char * Path, const long Value, const char * Mask )
{
CDataMember * Member;
char ValueStr[20];
// Validate
if (!(Member = GetMember( Path, true ))) {
if (!(Member = GetChild( Path, true ))) {
return false;
}
@@ -448,13 +431,13 @@ bool CDataMember::SetMemInt( const char * Path, const long Value, const char *
}
//---------------------------------------------------------------------------
bool CDataMember::SetMemFloat( const char * Path, const double Value, const char * Mask )
bool CDataMember::SetChFloat( const char * Path, const double Value, const char * Mask )
{
CDataMember * Member;
char ValueStr[20];
// Validate
if (!(Member = GetMember( Path, true ))) {
if (!(Member = GetChild( Path, true ))) {
return false;
}
@@ -465,12 +448,12 @@ bool CDataMember::SetMemFloat( const char * Path, const double Value, const cha
}
//---------------------------------------------------------------------------
bool CDataMember::SetMemBool( const char * Path, const bool Value )
bool CDataMember::SetChBool( const char * Path, const bool Value )
{
CDataMember * Member;
// Validate
if (!(Member = GetMember( Path, true ))) {
if (!(Member = GetChild( Path, true ))) {
return false;
}
@@ -480,12 +463,12 @@ bool CDataMember::SetMemBool( const char * Path, const bool Value )
}
//---------------------------------------------------------------------------
bool CDataMember::SetMemNull( const char * Path )
bool CDataMember::SetChNull( const char * Path )
{
CDataMember * Member;
// Validate
if (!(Member = GetMember( Path, true ))) {
if (!(Member = GetChild( Path, true ))) {
return false;
}
@@ -500,7 +483,7 @@ const char * CDataMember::GetName( const char * Path )
CDataMember * Member;
// Validate
if (!(Member = GetMember( Path, false ))) {
if (!(Member = GetChild( Path, false ))) {
return NULL;
}
return Member->Name;
@@ -512,7 +495,7 @@ EDataType CDataMember::GetType( const char * Path )
CDataMember * Member;
// Validate
if (!(Member = GetMember( Path, false ))) {
if (!(Member = GetChild( Path, false ))) {
return jtNull;
}
return Member->Type;
@@ -524,7 +507,7 @@ const int CDataMember::GetLen( const char * Path )
CDataMember * Member;
// Validate
if ((Member = GetMember( Path, false ))) {
if ((Member = GetChild( Path, false ))) {
return Member->Len;
}
else {
@@ -533,12 +516,12 @@ const int CDataMember::GetLen( const char * Path )
}
//---------------------------------------------------------------------------
const char * CDataMember::GetMemStr( const char * Path, const char * Default, bool Create )
const char * CDataMember::GetChStr( const char * Path, const char * Default, bool Create )
{
CDataMember * Member;
// Validate
if ((Member = GetMember( Path, Create )) &&
if ((Member = GetChild( Path, Create )) &&
((Member->Type == jtString) || (Member->Type == jtFloat) || (Member->Type == jtInt) || (Member->Type == jtBool)) ) {
return Member->Value;
}
@@ -552,12 +535,12 @@ const char * CDataMember::GetMemStr( const char * Path, const char * Default, bo
}
//---------------------------------------------------------------------------
const char * CDataMember::GetMemStr( const char * Path, int &Len, const char * Default, bool Create )
const char * CDataMember::GetChStr( const char * Path, int &Len, const char * Default, bool Create )
{
CDataMember * Member;
// Validate
if ((Member = GetMember( Path, Create )) &&
if ((Member = GetChild( Path, Create )) &&
((Member->Type == jtString) || (Member->Type == jtFloat) || (Member->Type == jtInt) || (Member->Type == jtBool)) ) {
Len = Member->Len;
return Member->Value;
@@ -574,12 +557,12 @@ const char * CDataMember::GetMemStr( const char * Path, int &Len, const char * D
}
//---------------------------------------------------------------------------
const long CDataMember::GetMemInt( const char * Path, long Default, bool Create, const char * Mask )
const long CDataMember::GetChInt( const char * Path, long Default, bool Create, const char * Mask )
{
CDataMember * Member;
// Validate
if ((Member = GetMember( Path, Create )) &&
if ((Member = GetChild( Path, Create )) &&
((Member->Type == jtString) || (Member->Type == jtFloat) || (Member->Type == jtInt) || (Member->Type == jtBool)) ) {
return strtol( Member->Value, NULL, 10 );
}
@@ -595,12 +578,12 @@ const long CDataMember::GetMemInt( const char * Path, long Default, bool Create
}
//---------------------------------------------------------------------------
const double CDataMember::GetMemFloat( const char * Path, double Default, bool Create, const char * Mask )
const double CDataMember::GetChFloat( const char * Path, double Default, bool Create, const char * Mask )
{
CDataMember * Member;
// Validate
if ((Member = GetMember( Path, Create )) &&
if ((Member = GetChild( Path, Create )) &&
((Member->Type == jtString) || (Member->Type == jtFloat) || (Member->Type == jtInt) || (Member->Type == jtBool)) ) {
return strtod( Member->Value, NULL );
}
@@ -616,12 +599,12 @@ const double CDataMember::GetMemFloat( const char * Path, double Default, bool
}
//---------------------------------------------------------------------------
const bool CDataMember::GetMemBool( const char * Path, bool Default, bool Create )
const bool CDataMember::GetChBool( const char * Path, bool Default, bool Create )
{
CDataMember * Member;
// Validate
if ((Member = GetMember( Path, Create ))) {
if ((Member = GetChild( Path, Create ))) {
if (Member->Type == jtString) {
return ((!*Member->Value)? false : true);
}

View File

@@ -66,46 +66,46 @@ public:
const int GetLen() { return Len; };
const int GetLen( const char * Path );
CDataMember * GetMember( const char * Path, bool Create = false );
CDataMember * GetMemFirstChild( const char * Path );
CDataMember * GetMemElement( const char * Path, const int Index );
CDataMember * GetChild( const char * Path, bool Create = false );
CDataMember * GetChFirstChild( const char * Path );
CDataMember * GetChElement( const char * Path, const int Index );
inline CDataMember * GetFirstChild() { return FirstChild; };
inline CDataMember * GetElement( const int Index ) { return GetMemElement( NULL, Index ); };
inline CDataMember * GetElement( const int Index ) { return GetChElement( NULL, Index ); };
inline CDataMember * GetParent() { return Parent; };
inline CDataMember * GetPrevPeer() { return PrevPeer; };
inline CDataMember * GetNextPeer() { return NextPeer; };
const char * GetMemStr( const char * Path, const char * Default = NULL, bool Create = false );
const char * GetMemStr( const char * Path, int &Len, const char * Default = NULL, bool Create = false );
const bool GetMemBool( const char * Path, bool Default = false, bool Create = false );
const long GetMemInt( const char * Path, long Default = 0, bool Create = false, const char * Mask = NULL );
const double GetMemFloat( const char * Path, double Default = 0.0, bool Create = false, const char * Mask = NULL );
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 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 double GetChFloat( const char * Path, double Default = 0.0, bool Create = false, const char * Mask = NULL );
inline const char * GetStr( const char * Default = NULL, bool Create = false ) { return GetMemStr( NULL, Default, Create ); };
inline const char * GetStr( int &Len, const char * Default = NULL, bool Create = false ) { return GetMemStr( NULL, Len, Default, Create ); };
inline const bool GetBool( bool Default = false, bool Create = false ) { return GetMemBool( NULL, Default, Create ); };
inline const long GetInt( long Default = 0, bool Create = false, const char * Mask = NULL ) { return GetMemInt( NULL, Default, Create, Mask ); };
inline const double GetFloat( double Default = 0.0, bool Create = false, const char * Mask = NULL ) { return GetMemFloat( NULL, Default, Create, Mask ); };
inline const char * GetStr( const char * Default = NULL, bool Create = false ) { return GetChStr( NULL, Default, Create ); };
inline const char * GetStr( int &Len, const char * Default = NULL, bool Create = false ) { return GetChStr( NULL, Len, Default, Create ); };
inline const bool GetBool( bool Default = false, bool Create = false ) { return GetChBool( NULL, Default, Create ); };
inline const long GetInt( long Default = 0, bool Create = false, const char * Mask = NULL ) { return GetChInt( NULL, Default, Create, Mask ); };
inline const double GetFloat( double Default = 0.0, bool Create = false, const char * Mask = NULL ) { return GetChFloat( NULL, Default, Create, Mask ); };
bool SetMemBool( const char * Path, const bool Value );
bool SetMemInt( const char * Path, const long Value, const char * Mask = NULL );
bool SetMemFloat( const char * Path, const double Value, const char * Mask = NULL );
bool SetMemStr( const char * Path, const char * Value = NULL, const int Len = -1 ); // Use Len param if Value contains NULL values
bool SetChBool( const char * Path, const bool Value );
bool SetChInt( const char * Path, const long Value, const char * Mask = NULL );
bool SetChFloat( const char * Path, const double Value, const char * Mask = NULL );
bool SetChStr( const char * Path, const char * Value = NULL, const int Len = -1 ); // Use Len param if Value contains NULL values
inline bool SetBool( const bool Value ) { return SetMemBool( NULL, Value ); };
inline bool SetInt( const long Value, const char * Mask = NULL ) { return SetMemInt( NULL, Value, Mask ); };
inline bool SetFloat( const double Value, const char * Mask = NULL ) { return SetMemFloat( NULL, Value, Mask ); };
inline bool SetStr( const char * Value = NULL, const int Len = -1 ) { return SetMemStr( NULL, Value, Len ); };
inline bool SetBool( const bool Value ) { return SetChBool( NULL, Value ); };
inline bool SetInt( const long Value, const char * Mask = NULL ) { return SetChInt( NULL, Value, Mask ); };
inline bool SetFloat( const double Value, const char * Mask = NULL ) { return SetChFloat( NULL, Value, Mask ); };
inline bool SetStr( const char * Value = NULL, const int Len = -1 ) { return SetChStr( NULL, Value, Len ); };
bool SetMemNull( const char * Path );
bool SetMemObject( const char * Path );
bool SetMemArray( const char * Path );
bool SetChNull( const char * Path );
bool SetChObject( const char * Path );
bool SetChArray( const char * Path );
inline bool SetNull() { return SetMemNull( NULL ); };
inline bool SetObject() { return SetMemObject( NULL ); };
inline bool SetArray() { return SetMemArray( NULL ); };
inline bool SetNull() { return SetChNull( NULL ); };
inline bool SetObject() { return SetChObject( NULL ); };
inline bool SetArray() { return SetChArray( NULL ); };
bool Clear();
bool Delete( const char * Path );

View File

@@ -16,7 +16,7 @@
//---------------------------------------------------------------------------
// Variable used to temp values with
static char ReturnStr[20];
static char ReturnStr[30];
//---------------------------------------------------------------------------

View File

@@ -342,7 +342,7 @@ bool CEventBuffer::ClearCurrentEvent()
bool CEventBuffer::AddEvent( TEventEntry * Event, unsigned int EventNo )
{
bool result;
bool result = true;
TEventEntry * EventCopy = NULL;
// Validate Event

View File

@@ -120,7 +120,7 @@ bool CFunctionCore::LoadConfigData()
// Get debug level
pLogLevel = dlNone;
TempStr = (char*)ConfigMember->GetMemStr( "Log/Level", "Medium", true );
TempStr = (char*)ConfigMember->GetChStr( "Log/Level", "Medium", true );
if (TempStr)
{
if (!strcasecmp( TempStr, "Low" ))
@@ -133,7 +133,7 @@ bool CFunctionCore::LoadConfigData()
// Set debug output
pLogOutput = 0;
if ((TempMember = ConfigMember->GetMember( "Log/Output", true )))
if ((TempMember = ConfigMember->GetChild( "Log/Output", true )))
{
TempMember = TempMember->GetFirstChild();
while (TempMember)
@@ -163,13 +163,13 @@ bool CFunctionCore::LoadConfigData()
SetLogParam( pLogLevel, pLogOutput );
// Load Channels
TempMember = ConfigMember->GetMemFirstChild( "Channels" );
TempMember = ConfigMember->GetChFirstChild( "Channels" );
while (TempMember)
{
if (TempMember->GetName()) {
AddChannel( TempMember->GetName(),
TempMember->GetMemBool( "InputEnabled", true, true ),
TempMember->GetMemBool( "OutputEnabled", false, true ));
TempMember->GetChBool( "InputEnabled", true, true ),
TempMember->GetChBool( "OutputEnabled", false, true ));
}
// Next
@@ -197,9 +197,9 @@ bool CFunctionCore::LoadChannelLinkData()
{
// Get Parameters
LinkOutputChannel( Channel->Name,
FunctionMember->GetMemStr( "Function" ),
FunctionMember->GetMemStr( "Channel" ),
FunctionMember->GetMemBool( "Bidirectional" ) );
FunctionMember->GetChStr( "Function" ),
FunctionMember->GetChStr( "Channel" ),
FunctionMember->GetChBool( "Bidirectional" ) );
// Next
FunctionMember = FunctionMember->GetNextPeer();
}
@@ -224,7 +224,7 @@ bool CFunctionCore::Init()
bool CFunctionCore::InitConfig( const char * pConfigPath )
{
// Validate
if (!DataTree || !(ConfigMember = DataTree->GetMember( pConfigPath, true )))
if (!DataTree || !(ConfigMember = DataTree->GetChild( pConfigPath, true )))
return false;
// Load configuration
@@ -252,7 +252,7 @@ bool CFunctionCore::InitConfig( CDataMember * pBaseMember )
bool CFunctionCore::InitChannelLinks( const char * pLinkConfigPath )
{
// Validate
if (!DataTree || !(LinkConfigMember = DataTree->GetMember( pLinkConfigPath, true )))
if (!DataTree || !(LinkConfigMember = DataTree->GetChild( pLinkConfigPath, true )))
return false;
// Load configuration

View File

@@ -136,15 +136,19 @@ bool CJSONparse::WriteToHandle( const char * BasePath, const int Handle, const i
OutputHandle = Handle;
// Get Root object
if (!(Member = DataTree->GetMember( BasePath ))) {
if (!(Member = DataTree->GetChild( BasePath ))) {
Error = true;
sprintf( ErrorText, "Invalid root object path" );
OutputHandle = -1;
return false;
}
// Print to file
PrintObject( Member, Indent );
write( OutputHandle, "\n", 1 );
if (!PrintObject( Member, Indent ) ||
(write( OutputHandle, "\n", 1 ) < 0)) {
OutputHandle = -1;
return false;
}
OutputHandle = -1;
return true;
@@ -287,7 +291,7 @@ bool CJSONparse::ReadFromBuffer( const char * BasePath )
Error = false;
// Get/Create Root object
if (!(BaseMember = DataTree->GetMember( BasePath, true ))) {
if (!(BaseMember = DataTree->GetChild( BasePath, true ))) {
Error = true;
sprintf( ErrorText, "Invalid root object path" );
return false;
@@ -568,7 +572,7 @@ bool CJSONparse::ParseObject( CDataMember * Object )
}
// Check if Member exists
Member = Object->GetMember( MemberName, true );
Member = Object->GetChild( MemberName, true );
// Check for delimiter
SkipWhiteSpace();
@@ -753,8 +757,11 @@ bool CJSONparse::ParsePrimitive( CDataMember * Member )
bool CJSONparse::PrintString( char * String, int Len )
{
int BytesWritten;
// Start quote
write( OutputHandle, "\"", 1 );
if (write( OutputHandle, "\"", 1 ) < 0)
return false;
// Content
BufPos = String;
@@ -766,7 +773,8 @@ bool CJSONparse::PrintString( char * String, int Len )
BufPos++;
// Print Portion
write( OutputHandle, Mark, (BufPos-Mark) );
if (write( OutputHandle, Mark, (BufPos-Mark) ) < 0)
return false;
// Handle special chars
if (BufPos-String >= Len) {
@@ -774,24 +782,27 @@ bool CJSONparse::PrintString( char * String, int Len )
}
else {
switch (*BufPos) {
case '\b': write( OutputHandle, "\\b", 2 ); break;
case '\f': write( OutputHandle, "\\f", 2 ); break;
case '\n': write( OutputHandle, "\\n", 2 ); break;
case '\r': write( OutputHandle, "\\r", 2 ); break;
case '\t': write( OutputHandle, "\\t", 2 ); break;
case '/': write( OutputHandle, "\\/", 2 ); break;
case '\\': write( OutputHandle, "\\\\", 2 ); break;
case '"': write( OutputHandle, "\\\"", 2 ); break;
case '\b': BytesWritten = write( OutputHandle, "\\b", 2 ); break;
case '\f': BytesWritten = write( OutputHandle, "\\f", 2 ); break;
case '\n': BytesWritten = write( OutputHandle, "\\n", 2 ); break;
case '\r': BytesWritten = write( OutputHandle, "\\r", 2 ); break;
case '\t': BytesWritten = write( OutputHandle, "\\t", 2 ); break;
case '/': BytesWritten = write( OutputHandle, "\\/", 2 ); break;
case '\\': BytesWritten = write( OutputHandle, "\\\\", 2 ); break;
case '"': BytesWritten = write( OutputHandle, "\\\"", 2 ); break;
default:
dprintf( OutputHandle, "\\u%04X", (unsigned char)*BufPos );
BytesWritten = dprintf( OutputHandle, "\\u%04X", (unsigned char)*BufPos );
break;
}
if (BytesWritten < 0)
return false;
BufPos++;
}
}
// End Quote
write( OutputHandle, "\"", 1 );
if (write( OutputHandle, "\"", 1 ) < 0)
return false;
return true;
}
@@ -805,7 +816,8 @@ bool CJSONparse::PrintObject( CDataMember * Object, const int Indent )
int Count = 0;
// Opening brace
write( OutputHandle, "{", 1 );
if (write( OutputHandle, "{", 1 ) < 0)
return false;
// Extend spacer
if (Indent) {
@@ -821,17 +833,22 @@ bool CJSONparse::PrintObject( CDataMember * Object, const int Indent )
if (Indent) {
if (First) {
First = false;
write( OutputHandle, "\n", 1 );
if (write( OutputHandle, "\n", 1 ) < 0)
return false;
}
write( OutputHandle, Spacer, SpacerLen );
if (write( OutputHandle, Spacer, SpacerLen ) < 0)
return false;
}
// Print key name
PrintString( Member->Name, strlen(Member->Name) );
if (!PrintString( Member->Name, strlen(Member->Name) ))
return false;
if (Indent) {
write( OutputHandle," : ", 3 );
if (write( OutputHandle," : ", 3 ) < 0)
return false;
} else {
write( OutputHandle, ":", 1 );
if (write( OutputHandle, ":", 1 ) < 0)
return false;
}
// Print value
@@ -839,37 +856,50 @@ bool CJSONparse::PrintObject( CDataMember * Object, const int Indent )
switch (Member->Type)
{
case jtNull :
write( OutputHandle, "null", 4 );
if (write( OutputHandle, "null", 4 ) < 0)
return false;
break;
case jtBool :
if (!strcmp( Member->Value, "0" ))
write( OutputHandle, "false", 5 );
else
write( OutputHandle, "true", 4 );
if (!strcmp( Member->Value, "0" )) {
if (write( OutputHandle, "false", 5 ) < 0)
return false;
}
else {
if (write( OutputHandle, "true", 4 ) < 0)
return false;
}
break;
case jtInt :
case jtFloat :
write( OutputHandle, Member->Value, Member->Len );
if (write( OutputHandle, Member->Value, Member->Len ) < 0)
return false;
break;
case jtString :
PrintString( Member->Value, Member->Len );
if (!PrintString( Member->Value, Member->Len ))
return false;
break;
case jtArray :
PrintArray( Member, Indent );
if (!PrintArray( Member, Indent ))
return false;
break;
case jtObject :
PrintObject( Member, Indent );
if (!PrintObject( Member, Indent ))
return false;
break;
}
if (!Last)
write( OutputHandle, ",", 1 );
if (Indent)
write( OutputHandle, "\n", 1 );
if (!Last) {
if (write( OutputHandle, ",", 1 ) < 0)
return false;
}
if (Indent) {
if (write( OutputHandle, "\n", 1 ) < 0)
return false;
}
}
// Shorten spacer
@@ -879,9 +909,12 @@ bool CJSONparse::PrintObject( CDataMember * Object, const int Indent )
}
// Closing brace
if (Indent)
write( OutputHandle, Spacer, SpacerLen );
write( OutputHandle, "}", 1 );
if (Indent) {
if (write( OutputHandle, Spacer, SpacerLen ) < 0)
return false;
}
if (write( OutputHandle, "}", 1 ))
return false;
return true;
}
//---------------------------------------------------------------------------
@@ -894,7 +927,8 @@ bool CJSONparse::PrintArray( CDataMember * Array, const int Indent )
int Count = 0;
// Opening brace
write( OutputHandle, "[", 1 );
if (write( OutputHandle, "[", 1 ) < 0)
return false;
// Extend spacer
if (Indent) {
@@ -910,42 +944,53 @@ bool CJSONparse::PrintArray( CDataMember * Array, const int Indent )
if (Indent) {
if (First) {
First = false;
write( OutputHandle, "\n", 1 );
if (write( OutputHandle, "\n", 1 ) < 0)
return false;
}
write( OutputHandle, Spacer, SpacerLen );
if (write( OutputHandle, Spacer, SpacerLen ) < 0)
return false;
}
Last = (++Count >= Array->Len);
switch (Member->Type)
{
case jtNull :
write( OutputHandle, "null", 4 );
if (write( OutputHandle, "null", 4 ) < 0)
return false;
break;
case jtBool :
case jtInt :
case jtFloat :
write( OutputHandle, Member->Value, Member->Len );
if (write( OutputHandle, Member->Value, Member->Len ) < 0)
return false;
break;
case jtString :
write( OutputHandle, "\"", 1 );
write( OutputHandle, Member->Value, Member->Len );
write( OutputHandle, "\"", 1 );
if ((write( OutputHandle, "\"", 1 ) < 0) ||
(write( OutputHandle, Member->Value, Member->Len ) < 0) ||
(write( OutputHandle, "\"", 1 ) < 0))
return false;
break;
case jtArray :
PrintArray( Member, Indent );
if (!PrintArray( Member, Indent ))
return false;
break;
case jtObject :
PrintObject( Member, Indent );
if (!PrintObject( Member, Indent ))
return false;
break;
}
if (!Last)
write( OutputHandle, ",", 1 );
if (Indent)
write( OutputHandle, "\n", 1 );
if (!Last) {
if (write( OutputHandle, ",", 1 ) < 0)
return false;
}
if (Indent) {
if (write( OutputHandle, "\n", 1 ) < 0)
return false;
}
}
// Shorten spacer
@@ -955,9 +1000,12 @@ bool CJSONparse::PrintArray( CDataMember * Array, const int Indent )
}
// Closing brace
if (Indent)
write( OutputHandle, Spacer, SpacerLen );
write( OutputHandle, "]", 1 );
if (Indent) {
if (write( OutputHandle, Spacer, SpacerLen ) < 0)
return false;
}
if (write( OutputHandle, "]", 1 ) < 0)
return false;
return true;
}
//---------------------------------------------------------------------------

View File

@@ -84,7 +84,7 @@ bool CSelectableCore::LoadConfigData()
CFunctionCore::LoadConfigData();
// Load Handles
if ((TempMember = ConfigMember->GetMember( "Handles", false ))) {
if ((TempMember = ConfigMember->GetChild( "Handles", false ))) {
TempMember = TempMember->GetFirstChild();
}
while (TempMember)
@@ -95,24 +95,24 @@ bool CSelectableCore::LoadConfigData()
// Create Handle and channel link
Handle = CreateHandle( TempMember->GetName(), false );
Handle->Channel = GetChannel( TempMember->GetMemStr( "Channel" ) );
Handle->Channel = GetChannel( TempMember->GetChStr( "Channel" ) );
Type = (char*)TempMember->GetMemStr( "Type", "TCPclient", true );
Type = (char*)TempMember->GetChStr( "Type", "TCPclient", true );
if (!strcasecmp( Type, "Serial" ))
{
if ((Name = (char*)TempMember->GetMemStr( "Port/Name", NULL ))) {
if ((Name = (char*)TempMember->GetChStr( "Port/Name", NULL ))) {
sprintf( Path, "Address/%s/Address", Name );
Address = (char*)DataTree->GetMemStr( Path, NULL, true ); // Get address list value
Address = (char*)DataTree->GetChStr( Path, NULL, true ); // Get address list value
}
else {
Address = (char*)TempMember->GetMemStr( "Port/Address", NULL, true ); // Get default value
Address = (char*)TempMember->GetChStr( "Port/Address", NULL, true ); // Get default value
}
SetSerialHandle( Handle, Address );
// Update configuration if specified
if ((SerialConfig = TempMember->GetMember( "Port/SerialConfig", false )))
if ((SerialConfig = TempMember->GetChild( "Port/SerialConfig", false )))
{
ParityText = (char*)SerialConfig->GetMemStr( "Parity", "none", true );
ParityText = (char*)SerialConfig->GetChStr( "Parity", "none", true );
if (!strcasecmp( ParityText, "none" ))
Parity = NO_PARITY;
else if (!strcasecmp( ParityText, "odd" ))
@@ -121,132 +121,136 @@ bool CSelectableCore::LoadConfigData()
Parity = EVEN_PARITY;
else if (!strcasecmp( ParityText, "mark" ))
Parity = MARK_PARITY;
else
Parity = NO_PARITY;
FlowCtrlText = (char*)SerialConfig->GetMemStr( "FlowCtrl", "none", true );
FlowCtrlText = (char*)SerialConfig->GetChStr( "FlowCtrl", "none", true );
if (!strcasecmp( FlowCtrlText, "none" ))
FlowCtrl = NO_FLOWCTRL;
else if (!strcasecmp( FlowCtrlText, "hardware" ))
FlowCtrl = HW_FLOWCTRL;
else if (!strcasecmp( FlowCtrlText, "software" ))
FlowCtrl = SW_FLOWCTRL;
else
FlowCtrl = NO_FLOWCTRL;
Handle->SerialConfig = true;
SetSerialHandleConfig( Handle, SerialConfig->GetMemInt( "BaudRate", 19200, true ),
SerialConfig->GetMemInt( "DataBits", 8, true ),
Parity, SerialConfig->GetMemInt( "StopBits", 1, true ),
FlowCtrl, SerialConfig->GetMemInt( "DataWait", 0, true ));
SetSerialHandleConfig( Handle, SerialConfig->GetChInt( "BaudRate", 19200, true ),
SerialConfig->GetChInt( "DataBits", 8, true ),
Parity, SerialConfig->GetChInt( "StopBits", 1, true ),
FlowCtrl, SerialConfig->GetChInt( "DataWait", 0, true ));
}
}
else if (!strcasecmp( Type, "LinePrinter" ))
{
if ((Name = (char*)TempMember->GetMemStr( "Port/Name", NULL ))) {
if ((Name = (char*)TempMember->GetChStr( "Port/Name", NULL ))) {
sprintf( Path, "Address/%s/Address", Name );
Address = (char*)DataTree->GetMemStr( Path, NULL, true ); // Get address list value
Address = (char*)DataTree->GetChStr( Path, NULL, true ); // Get address list value
}
else {
Address = (char*)TempMember->GetMemStr( "Port/Address", NULL, true ); // Get default value
Address = (char*)TempMember->GetChStr( "Port/Address", NULL, true ); // Get default value
}
SetLinePrinterHandle( Handle, Address );
}
else if (!strcasecmp( Type, "UNIXserver" ))
{
if ((Name = (char*)TempMember->GetMemStr( "Socket/Name", NULL ))) {
if ((Name = (char*)TempMember->GetChStr( "Socket/Name", NULL ))) {
sprintf( Path, "Address/%s/Address", Name );
Address = (char*)DataTree->GetMemStr( Path, NULL, true ); // Get AddressList Address value
Address = (char*)DataTree->GetChStr( Path, NULL, true ); // Get AddressList Address value
}
else {
Address = (char*)TempMember->GetMemStr( "Socket/Address", NULL, true ); // Get default Address value
Address = (char*)TempMember->GetChStr( "Socket/Address", NULL, true ); // Get default Address value
}
SetUnixHandle( Handle, ctUNIXserver, Address );
}
else if (!strcasecmp( Type, "UNIXclient" ))
{
if ((Name = (char*)TempMember->GetMemStr( "Socket/Name", NULL ))) {
if ((Name = (char*)TempMember->GetChStr( "Socket/Name", NULL ))) {
sprintf( Path, "Address/%s/Address", Name );
Address = (char*)DataTree->GetMemStr( Path, NULL, true ); // Get AddressList Address value
Address = (char*)DataTree->GetChStr( Path, NULL, true ); // Get AddressList Address value
}
else {
Address = (char*)TempMember->GetMemStr( "Socket/Address", NULL, true ); // Get default Address value
Address = (char*)TempMember->GetChStr( "Socket/Address", NULL, true ); // Get default Address value
}
SetUnixHandle( Handle, ctUNIXclient, Address );
}
else if (!strcasecmp( Type, "UDPserver" ))
{
if ((Name = (char*)TempMember->GetMemStr( "Socket/Name", NULL ))) {
if ((Name = (char*)TempMember->GetChStr( "Socket/Name", NULL ))) {
sprintf( Path, "Address/%s/Address", Name );
Address = (char*)DataTree->GetMemStr( Path, NULL, true ); // Get AddressList Address value
Address = (char*)DataTree->GetChStr( Path, NULL, true ); // Get AddressList Address value
sprintf( Path, "Address/%s/Port", Name );
Port = (char*)DataTree->GetMemStr( Path, "0", true ); // Get AddressList Port value
Port = (char*)DataTree->GetChStr( Path, "0", true ); // Get AddressList Port value
}
else {
Address = (char*)TempMember->GetMemStr( "Socket/Address", NULL, true ); // Get default Address value
Port = (char*)TempMember->GetMemStr( "Socket/Port", "0", true ); // Get default Port value
Address = (char*)TempMember->GetChStr( "Socket/Address", NULL, true ); // Get default Address value
Port = (char*)TempMember->GetChStr( "Socket/Port", "0", true ); // Get default Port value
}
Delay = TempMember->GetMemInt( "Socket/ResolveDelay", 0, true );
Delay = TempMember->GetChInt( "Socket/ResolveDelay", 0, true );
SetSocketHandle( Handle, ctUDPserver, Address, strlcase(Port), Delay );
}
else if (!strcasecmp( Type, "UDPclient" ))
{
if ((Name = (char*)TempMember->GetMemStr( "Socket/Name", NULL ))) {
if ((Name = (char*)TempMember->GetChStr( "Socket/Name", NULL ))) {
sprintf( Path, "Address/%s/Address", Name );
Address = (char*)DataTree->GetMemStr( Path, NULL, true ); // Get AddressList Address value
Address = (char*)DataTree->GetChStr( Path, NULL, true ); // Get AddressList Address value
sprintf( Path, "Address/%s/Port", Name );
Port = (char*)DataTree->GetMemStr( Path, "0", true ); // Get AddressList Port value
Port = (char*)DataTree->GetChStr( Path, "0", true ); // Get AddressList Port value
}
else {
Address = (char*)TempMember->GetMemStr( "Socket/Address", NULL, true ); // Get default Address value
Port = (char*)TempMember->GetMemStr( "Socket/Port", "0", true ); // Get default Port value
Address = (char*)TempMember->GetChStr( "Socket/Address", NULL, true ); // Get default Address value
Port = (char*)TempMember->GetChStr( "Socket/Port", "0", true ); // Get default Port value
}
Delay = TempMember->GetMemInt( "Socket/ResolveDelay", 0, true );
Delay = TempMember->GetChInt( "Socket/ResolveDelay", 0, true );
SetSocketHandle( Handle, ctUDPclient, Address, strlcase(Port), Delay );
}
else if (!strcasecmp( Type, "TCPserver" ))
{
if ((Name = (char*)TempMember->GetMemStr( "Socket/Name", NULL ))) {
if ((Name = (char*)TempMember->GetChStr( "Socket/Name", NULL ))) {
sprintf( Path, "Address/%s/Address", Name );
Address = (char*)DataTree->GetMemStr( Path, NULL, true ); // Get AddressList Address value
Address = (char*)DataTree->GetChStr( Path, NULL, true ); // Get AddressList Address value
sprintf( Path, "Address/%s/Port", Name );
Port = (char*)DataTree->GetMemStr( Path, "0", true ); // Get AddressList Port value
Port = (char*)DataTree->GetChStr( Path, "0", true ); // Get AddressList Port value
}
else {
Address = (char*)TempMember->GetMemStr( "Socket/Address", NULL, true ); // Get default Address value
Port = (char*)TempMember->GetMemStr( "Socket/Port", "0", true ); // Get default Port value
Address = (char*)TempMember->GetChStr( "Socket/Address", NULL, true ); // Get default Address value
Port = (char*)TempMember->GetChStr( "Socket/Port", "0", true ); // Get default Port value
}
Delay = TempMember->GetMemInt( "Socket/ResolveDelay", 0, true );
Delay = TempMember->GetChInt( "Socket/ResolveDelay", 0, true );
SetSocketHandle( Handle, ctTCPserver, Address, strlcase(Port), Delay );
}
else if (!strcasecmp( Type, "TCPclient" ))
{
if ((Name = (char*)TempMember->GetMemStr( "Socket/Name", NULL ))) {
if ((Name = (char*)TempMember->GetChStr( "Socket/Name", NULL ))) {
sprintf( Path, "Address/%s/Address", Name );
Address = (char*)DataTree->GetMemStr( Path, NULL, true ); // Get AddressList Address value
Address = (char*)DataTree->GetChStr( Path, NULL, true ); // Get AddressList Address value
sprintf( Path, "Address/%s/Port", Name );
Port = (char*)DataTree->GetMemStr( Path, "0", true ); // Get AddressList Port value
Port = (char*)DataTree->GetChStr( Path, "0", true ); // Get AddressList Port value
}
else {
Address = (char*)TempMember->GetMemStr( "Socket/Address", NULL, true ); // Get default Address value
Port = (char*)TempMember->GetMemStr( "Socket/Port", "0", true ); // Get default Port value
Address = (char*)TempMember->GetChStr( "Socket/Address", NULL, true ); // Get default Address value
Port = (char*)TempMember->GetChStr( "Socket/Port", "0", true ); // Get default Port value
}
Delay = TempMember->GetMemInt( "Socket/ResolveDelay", 0, true );
Delay = TempMember->GetChInt( "Socket/ResolveDelay", 0, true );
SetSocketHandle( Handle, ctTCPclient, Address, strlcase(Port), Delay );
}
else if (!strcasecmp( Type, "ForkPipe" )) {
Address = (char*)TempMember->GetMemStr( "Fork/ExecPath", NULL, true ); // Get default value
Address = (char*)TempMember->GetChStr( "Fork/ExecPath", NULL, true ); // Get default value
SetForkPipeHandle( Handle, Address );
}
// Set Auto Mange
SetAutoManage( Handle, TempMember->GetMemBool( "AutoManage/Enabled", true, true ),
TempMember->GetMemBool( "AutoManage/Persistent", false, true ),
TempMember->GetMemInt( "AutoManage/ReopenDelay", 2000, true ),
TempMember->GetMemInt( "AutoManage/CloseTimeout", 2000, true ));
SetAutoManage( Handle, TempMember->GetChBool( "AutoManage/Enabled", true, true ),
TempMember->GetChBool( "AutoManage/Persistent", false, true ),
TempMember->GetChInt( "AutoManage/ReopenDelay", 2000, true ),
TempMember->GetChInt( "AutoManage/CloseTimeout", 2000, true ));
// Input buffer
SetInBuffer( Handle, TempMember->GetMemInt( "InputBuffer/Size", 0 ),
TempMember->GetMemInt( "InputBuffer/Timeout", 250 ),
TempMember->GetMemStr( "InputBuffer/Marker", "" ),
TempMember->GetMemInt( "InputBuffer/MarkerLen", 0 ) );
SetOutBuffer( Handle, TempMember->GetMemInt( "OutputBuffer/Size", 0 ) );
SetInBuffer( Handle, TempMember->GetChInt( "InputBuffer/Size", 0 ),
TempMember->GetChInt( "InputBuffer/Timeout", 250 ),
TempMember->GetChStr( "InputBuffer/Marker", "" ),
TempMember->GetChInt( "InputBuffer/MarkerLen", 0 ) );
SetOutBuffer( Handle, TempMember->GetChInt( "OutputBuffer/Size", 0 ) );
// Next
TempMember = TempMember->GetNextPeer();

View File

@@ -50,7 +50,7 @@ bool CWatchdogCore::LoadConfigData()
CSelectableCore::LoadConfigData();
// Set specific parameters
SetInterval( ConfigMember->GetMemInt( "Parameters/PingInterval", 500, true ));
SetInterval( ConfigMember->GetChInt( "Parameters/PingInterval", 500, true ));
return true;
}