From 6263c0f508b877855861d0db2b95d66fc89c3911 Mon Sep 17 00:00:00 2001 From: Charl Wentzel Date: Tue, 20 Nov 2018 11:27:09 +0200 Subject: [PATCH] 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 --- ApplicationCore.cpp | 20 +++--- DataTreeCore.cpp | 83 +++++++++-------------- DataTreeCore.h | 56 ++++++++-------- DateTimeCore.cpp | 2 +- EventBufferCore.cpp | 2 +- FunctionCore.cpp | 20 +++--- JSONparseCore.cpp | 160 ++++++++++++++++++++++++++++---------------- SelectableCore.cpp | 116 ++++++++++++++++---------------- WatchdogCore.cpp | 2 +- 9 files changed, 248 insertions(+), 213 deletions(-) diff --git a/ApplicationCore.cpp b/ApplicationCore.cpp index 76495e0..5c5542c 100644 --- a/ApplicationCore.cpp +++ b/ApplicationCore.cpp @@ -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 diff --git a/DataTreeCore.cpp b/DataTreeCore.cpp index 15746d2..d275921 100644 --- a/DataTreeCore.cpp +++ b/DataTreeCore.cpp @@ -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); } diff --git a/DataTreeCore.h b/DataTreeCore.h index 4017b56..7f68c4f 100644 --- a/DataTreeCore.h +++ b/DataTreeCore.h @@ -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 ); diff --git a/DateTimeCore.cpp b/DateTimeCore.cpp index 29932f6..f49df29 100644 --- a/DateTimeCore.cpp +++ b/DateTimeCore.cpp @@ -16,7 +16,7 @@ //--------------------------------------------------------------------------- // Variable used to temp values with -static char ReturnStr[20]; +static char ReturnStr[30]; //--------------------------------------------------------------------------- diff --git a/EventBufferCore.cpp b/EventBufferCore.cpp index 8f437dd..ab1ad1b 100644 --- a/EventBufferCore.cpp +++ b/EventBufferCore.cpp @@ -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 diff --git a/FunctionCore.cpp b/FunctionCore.cpp index db1d8d2..a8269e5 100644 --- a/FunctionCore.cpp +++ b/FunctionCore.cpp @@ -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 diff --git a/JSONparseCore.cpp b/JSONparseCore.cpp index cc30c44..ce93c29 100644 --- a/JSONparseCore.cpp +++ b/JSONparseCore.cpp @@ -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; } //--------------------------------------------------------------------------- diff --git a/SelectableCore.cpp b/SelectableCore.cpp index 7868a3c..c80eec5 100644 --- a/SelectableCore.cpp +++ b/SelectableCore.cpp @@ -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(); diff --git a/WatchdogCore.cpp b/WatchdogCore.cpp index e0e3827..79638e2 100644 --- a/WatchdogCore.cpp +++ b/WatchdogCore.cpp @@ -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; }