From b4073a166a7c8c555b5d003519677f5de049fb42 Mon Sep 17 00:00:00 2001 From: Charl Wentzel Date: Fri, 27 May 2016 13:32:54 +0200 Subject: [PATCH] Major Update: - Updated all Logged messages, standardised DebugLevel: - dlNone - Show startup and stop - dlLow - Show creation/destruction of Function Blocks and Local IO - dlMedium - Show connection events, eg. open/close - dlHigh - Show data flow events -LogCore: - LogMessage and ShowOutput uses va_list only run printf if DebugLevel correct - Remove global LogStr[] variable - SelectableCore: - Implemented Auto-management of handles auto open on startup/fail/close - Changed simple Open/Close/Read/Write methods to inline - Do not set Select Write trigger for server socket - Memory leak, setting address twice on RemoteClient - Bug fix, only send handle out data if DebugLevel = dlHigh - Bug fix, do not Read/ProcessBuffer if no InputBuffer --- FunctionCore.cpp | 29 +++---- LogCore.cpp | 33 +++++--- LogCore.h | 4 +- SelectCore.cpp | 19 ++--- SelectableCore.cpp | 183 +++++++++++++++++---------------------------- SelectableCore.h | 18 +++-- SignalCore.cpp | 24 ++---- 7 files changed, 127 insertions(+), 183 deletions(-) diff --git a/FunctionCore.cpp b/FunctionCore.cpp index 404532f..60db605 100644 --- a/FunctionCore.cpp +++ b/FunctionCore.cpp @@ -18,7 +18,6 @@ //--------------------------------------------------------------------------- extern char ProcessName[]; -extern char LogStr[]; // Access to global temporary log messages string //--------------------------------------------------------------------------- @@ -38,8 +37,7 @@ CFunctionCore::CFunctionCore( const char * FunctionName ) FirstIO = NULL; // Report status - sprintf( LogStr, "Function '%s' - Created", FunctionName ); - LogMessage( ProcessName, dlLow, LogStr ); + LogMessage( dlLow, "%s: Function '%s' - Created", ProcessName, FunctionName ); } //--------------------------------------------------------------------------- @@ -84,8 +82,7 @@ CFunctionCore::~CFunctionCore() } // Report status - sprintf( LogStr, "Function '%s' - Destroyed", Name ); - LogMessage( ProcessName, dlLow, LogStr ); + LogMessage( dlLow, "%s: Function '%s' - Destroyed", ProcessName, Name ); // Destroy Name if (Name) { @@ -121,8 +118,7 @@ TLocalIO * CFunctionCore::AddLocalIO( const char * IOName ) strcpy( (*LocalIO)->Name, IOName ); // Log Event - sprintf( LogStr, "Local IO '%s' - Created", IOName ); - LogMessage( Name, dlMedium, LogStr ); + LogMessage( dlLow, "%s: Local IO '%s' - Created", Name, IOName ); } return *LocalIO; @@ -159,8 +155,7 @@ bool CFunctionCore::AddInput( const char * IOName, CFunctionCore * OutFunction, strcpy( (*LinkedIO)->IOName, OutputName ); // Log Event - sprintf( LogStr, "Input Linked - '%s'/'%s' <-- '%s'/'%s'", Name, IOName, OutFunction->GetName(), OutputName ); - LogMessage( Name, dlMedium, LogStr ); + LogMessage( dlLow, "%s: Input Linked - '%s'/'%s' <-- '%s'/'%s'", Name, Name, IOName, OutFunction->GetName(), OutputName ); } return true; @@ -196,8 +191,7 @@ bool CFunctionCore::AddOutput( const char * IOName, CFunctionCore * InFunction, strcpy( (*LinkedIO)->IOName, InputName ); // Log Event - sprintf( LogStr, "Output Linked - '%s'/'%s' --> '%s'/'%s'", Name, IOName, InFunction->GetName(), InputName ); - LogMessage( Name, dlMedium, LogStr ); + LogMessage( dlLow, "%s: Output Linked - '%s'/'%s' --> '%s'/'%s'", Name, Name, IOName, InFunction->GetName(), InputName ); } return true; @@ -221,15 +215,12 @@ int CFunctionCore::Input( const char * IOName, const char * Data, int MaxLen ) if (!(LocalIO = GetLocalIO( IOName ))) { // Log event - sprintf( LogStr, "%s: Local IO '%s' - Input rejected, Local IO not found", Name, IOName ); - LogMessage( Name, dlMedium, LogStr ); - + LogMessage( dlHigh, "%s: Local IO '%s' - Input rejected, Local IO not found", Name, IOName ); return 0; } // Log event - sprintf( LogStr, "%s: Local IO '%s' - IN:", Name, IOName ); - ShowOutput( LogStr, dlMedium, OUT_NORMAL, Data, MaxLen ); + ShowOutput( dlHigh, OUT_NORMAL, Data, MaxLen, "%s: Local IO '%s' - IN:", Name, IOName ); // Return processed bytes return MaxLen; @@ -251,14 +242,12 @@ int CFunctionCore::Output( const char * IOName, const char * Data, int Len ) if (!(LocalIO = GetLocalIO( IOName ))) { // Log Event - sprintf( LogStr, "%s: Local IO '%s' - Output rejected, Local IO not found", Name, IOName ); - LogMessage( Name, dlMedium, LogStr ); + LogMessage( dlHigh, "%s: Local IO '%s' - Output rejected, Local IO not found", Name, IOName ); return 0; } // Log event - sprintf( LogStr, "%s: Local IO '%s' - OUT:", Name, IOName ); - ShowOutput( LogStr, dlMedium, OUT_NORMAL, Data, Len ); + ShowOutput( dlHigh, OUT_NORMAL, Data, Len, "%s: Local IO '%s' - OUT:", Name, IOName ); // Return processed bytes return Len; diff --git a/LogCore.cpp b/LogCore.cpp index a4dd2c6..751beac 100644 --- a/LogCore.cpp +++ b/LogCore.cpp @@ -13,6 +13,7 @@ #include #include #include +#include //--------------------------------------------------------------------------- @@ -22,10 +23,12 @@ char LogStr[1000]; // Temporary var to create log messages, //--------------------------------------------------------------------------- -bool LogMessage( const char * Heading, EDebugLevel Level, const char *Message ) +bool LogMessage( EDebugLevel Level, const char * Format, ... ) { + va_list ArgPtr; + // Validate values - if (!Message) + if (!Format || !*Format) return false; // Check debug level @@ -34,20 +37,20 @@ bool LogMessage( const char * Heading, EDebugLevel Level, const char *Message ) } // Show normal output - if (!Heading) { - printf( "%s\n", Message ); - } - else { - printf( "%s: %s\n", Heading, Message ); - } + va_start( ArgPtr, Format ); + vprintf( Format, ArgPtr ); + printf( "\r\n" ); + va_end( ArgPtr ); return true; } //--------------------------------------------------------------------------- -bool ShowOutput( const char * Heading, EDebugLevel Level, const short Show, const char * Buffer, int Len ) +bool ShowOutput( EDebugLevel Level, const short Show, const char * Buffer, int Len, const char * Format, ... ) { + va_list ArgPtr; + // Validate values - if (!Buffer) + if (!Buffer || !(Show & (OUT_HEX | OUT_NORMAL))) return false; if (Len == -1) Len = strlen( Buffer ); @@ -57,9 +60,16 @@ bool ShowOutput( const char * Heading, EDebugLevel Level, const short Show, cons return true; } + // Show Lead + if (Format && *Format) { + va_start( ArgPtr, Format ); + vprintf( Format, ArgPtr ); + va_end( ArgPtr ); + } + printf( "[%d] ", Len ); + // Show Hex output if (Show & OUT_HEX) { - printf( "%s [%d]: ", Heading, Len ); for (int i=0; iFD = -1; // Log event - sprintf( LogStr, "Handle '%s' - Created", HandleName ); - LogMessage( Name, dlMedium, LogStr ); + LogMessage( dlMedium, "%s: Handle '%s' - Created", Name, HandleName ); } // Create Matching IO point - if (CreateIO) { + if (CreateLocalIO) { (*Handle)->LocalIO = AddLocalIO( HandleName ); } + // Set other params + (*Handle)->Auto = AutoManage; + return *Handle; } //--------------------------------------------------------------------------- @@ -125,8 +126,7 @@ bool CSelectableCore::RemoveHandle( THandle * Handle ) } // Log event - sprintf( LogStr, "Handle '%s' - Removed", Handle->Name ); - LogMessage( Name, dlMedium, LogStr ); + LogMessage( dlMedium, "%s: Handle '%s' - Removed", Name, Handle->Name ); // Destroy Child handle DestroyHandle( Handle ); @@ -184,9 +184,7 @@ bool CSelectableCore::SetPortHandle( THandle * Handle, const char * FileName ) strcpy( Handle->FileName, FileName ); // Log event - sprintf( LogStr, "Handle '%s' - Set as Port [%s]", Handle->Name, FileName ); - LogMessage( Name, dlMedium, LogStr ); - + LogMessage( dlMedium, "%s: Handle '%s' - Set as Port [%s]", Name, Handle->Name, FileName ); return true; } //--------------------------------------------------------------------------- @@ -213,9 +211,7 @@ bool CSelectableCore::SetSocketHandle( THandle * Handle, EConnectType Type, con Handle->PortNo = PortNo; // Log event - sprintf( LogStr, "Handle '%s' - Set as %s [%s:%d]", Handle->Name, ConnectTypeName[Type], Address, PortNo ); - LogMessage( Name, dlMedium, LogStr ); - + LogMessage( dlMedium, "%s: Handle '%s' - Set as %s [%s:%d]", Name, Handle->Name, ConnectTypeName[Type], Address, PortNo ); return true; } //--------------------------------------------------------------------------- @@ -242,9 +238,7 @@ bool CSelectableCore::ClearHandle( THandle * Handle ) Handle->Type = ctNone; // Log event - sprintf( LogStr, "Handle '%s' - Set as None", Handle->Name ); - LogMessage( Name, dlMedium, LogStr ); - + LogMessage( dlMedium, "%s: Handle '%s' - Set as None", Name, Handle->Name ); return true; } //--------------------------------------------------------------------------- @@ -302,8 +296,7 @@ int CSelectableCore::OpenPort( THandle * Handle ) if (access( Handle->FileName, F_OK ) != 0) { // Log event - sprintf( LogStr, "Handle '%s' - Port not found [%s]", Handle->Name, Handle->FileName ); - LogMessage( Name, dlMedium, LogStr ); + LogMessage( dlMedium, "%s: Handle '%s' - Port not found [%s]", Name, Handle->Name, Handle->FileName ); return -1; } @@ -312,14 +305,12 @@ int CSelectableCore::OpenPort( THandle * Handle ) if (Handle->FD == -1) { // Log event - sprintf( LogStr, "Handle '%s' - Could not open Port [%s]", Handle->Name, Handle->FileName ); - LogMessage( Name, dlMedium, LogStr ); + LogMessage( dlMedium, "%s: Handle '%s' - Could not open Port [%s]", Name, Handle->Name, Handle->FileName ); return -1; } // Log Event - sprintf( LogStr, "Handle '%s' - Port opened [%s]", Handle->Name, Handle->FileName ); - LogMessage( Name, dlMedium, LogStr ); + LogMessage( dlMedium, "%s: Handle '%s' - Port opened [%s]", Name, Handle->Name, Handle->FileName ); // Add to Select Lists if (Select) { @@ -364,8 +355,7 @@ int CSelectableCore::OpenServerSocket( THandle * Handle ) if ((Handle->FD = socket(AF_INET, SOCK_STREAM, 0)) < 0) { // Log Event - sprintf( LogStr, "Handle '%s' - Failed to create Server socket [%s:%d] (%s)", Handle->Name, Handle->Address, Handle->PortNo, strerror(errno) ); - LogMessage( Name, dlMedium, LogStr ); + LogMessage( dlMedium, "%s: Handle '%s' - Failed to create Server socket [%s:%d] (%s)", Name, Handle->Name, Handle->Address, Handle->PortNo, strerror(errno) ); // Set state Handle->State = csFailed; @@ -377,8 +367,7 @@ int CSelectableCore::OpenServerSocket( THandle * Handle ) (setsockopt( Handle->FD, SOL_SOCKET, SO_REUSEADDR, &Reuse_opt, sizeof(Reuse_opt)) == -1)) { // Log Event - sprintf( LogStr, "Handle '%s' - Could not set socket options [%s:%d] (%s)", Handle->Name, Handle->Address, Handle->PortNo, strerror(errno) ); - LogMessage( Name, dlMedium, LogStr ); + LogMessage( dlMedium, "%s: Handle '%s' - Could not set socket options [%s:%d] (%s)", Name, Handle->Name, Handle->Address, Handle->PortNo, strerror(errno) ); // Set state Handle->State = csFailed; @@ -393,8 +382,7 @@ int CSelectableCore::OpenServerSocket( THandle * Handle ) (setsockopt( Handle->FD, SOL_TCP, TCP_KEEPINTVL, &TCPint_opt, sizeof(TCPint_opt)) == -1) )) { // Log Event - sprintf( LogStr, "Handle '%s' - Could not set KeepAlive options [%s:%d] (%s)", Handle->Name, Handle->Address, Handle->PortNo, strerror(errno) ); - LogMessage( Name, dlMedium, LogStr ); + LogMessage( dlMedium, "%s: Handle '%s' - Could not set KeepAlive options [%s:%d] (%s)", Name, Handle->Name, Handle->Address, Handle->PortNo, strerror(errno) ); // Set state Handle->State = csFailed; @@ -409,8 +397,7 @@ int CSelectableCore::OpenServerSocket( THandle * Handle ) if (bind( Handle->FD, (struct sockaddr *)&address, addr_len ) < 0) { // Log Event - sprintf( LogStr, "Handle '%s' - Failed to bind Server socket [%s:%d] (%s)", Handle->Name, Handle->Address, Handle->PortNo, strerror(errno) ); - LogMessage( Name, dlMedium, LogStr ); + LogMessage( dlMedium, "%s: Handle '%s' - Failed to bind Server socket [%s:%d] (%s)", Name, Handle->Name, Handle->Address, Handle->PortNo, strerror(errno) ); // Set state close( Handle->FD ); @@ -423,8 +410,7 @@ int CSelectableCore::OpenServerSocket( THandle * Handle ) if (listen( Handle->FD, 5 ) < 0) { // Log Event - sprintf( LogStr, "Handle '%s' - Failed to listen on Server socket [%s:%d] (%s)", Handle->Name, Handle->Address, Handle->PortNo, strerror(errno) ); - LogMessage( Name, dlMedium, LogStr ); + LogMessage( dlMedium, "%s: Handle '%s' - Failed to listen on Server socket [%s:%d] (%s)", Name, Handle->Name, Handle->Address, Handle->PortNo, strerror(errno) ); // Set state close( Handle->FD ); @@ -434,12 +420,11 @@ int CSelectableCore::OpenServerSocket( THandle * Handle ) }; // Log Event - sprintf( LogStr, "Handle '%s' - Server binded and listening [%s:%d]", Handle->Name, Handle->Address, Handle->PortNo ); - LogMessage( Name, dlMedium, LogStr ); + LogMessage( dlMedium, "%s: Handle '%s' - Server binded and listening [%s:%d]", Name, Handle->Name, Handle->Address, Handle->PortNo ); // Add to Select Lists if (Select) { - Select->Add( Handle->FD, true, true, this ); + Select->Add( Handle->FD, true, false, this ); } // Set state @@ -470,13 +455,11 @@ int CSelectableCore::OpenRemoteClientSocket( THandle * Handle ) addr_len = sizeof( address ); if ((ClientFD = accept( Handle->FD, (struct sockaddr *)&address, &addr_len)) == -1) { - if ((errno == EAGAIN) || (errno == EWOULDBLOCK)) - sprintf( LogStr, "Handle '%s' - Server failed to accept blocking connection (%s)", Handle->Name, strerror(errno) ); - else - sprintf( LogStr, "Handle '%s' - Server failed to accept connection (%s)", Handle->Name, strerror(errno) ); - // Log Event - LogMessage( Name, dlMedium, LogStr ); + if ((errno == EAGAIN) || (errno == EWOULDBLOCK)) + LogMessage( dlMedium, "%s: Handle '%s' - Server failed to accept blocking connection (%s)", Name, Handle->Name, strerror(errno) ); + else + LogMessage( dlMedium, "%s: Handle '%s' - Server failed to accept connection (%s)", Name, Handle->Name, strerror(errno) ); return -1; } @@ -495,7 +478,7 @@ int CSelectableCore::OpenRemoteClientSocket( THandle * Handle ) // Create Remote Client Handle sprintf( ClientName, "%s-%d", Handle->Name, ClientFD ); - *RemoteClient = CreateHandle( ClientName ); + *RemoteClient = CreateHandle( ClientName, false, false ); SetSocketHandle( *RemoteClient, ctRemoteClient, ClientAddress, 0, Handle->KeepAlive ); // Copy Parent Buffer setup @@ -508,12 +491,8 @@ int CSelectableCore::OpenRemoteClientSocket( THandle * Handle ) (*RemoteClient)->Parent = Handle; (*RemoteClient)->State = csWaitingtoOpen; - (*RemoteClient)->Address = (char*)malloc( strlen(ClientAddress)+1 ); - strcpy( (*RemoteClient)->Address, ClientAddress ); - // Log Event - sprintf( LogStr, "Handle '%s' - Server accepted Remote Client connection [%s]", Handle->Name, ClientAddress ); - LogMessage( Name, dlMedium, LogStr ); + LogMessage( dlMedium, "%s: Handle '%s' - Server accepted Remote Client connection [%s]", Name, Handle->Name, ClientAddress ); // Add to Select Lists if (Select) { @@ -533,8 +512,7 @@ int CSelectableCore::OpenRemoteClientSocket( THandle * Handle ) else if (Handle->State == csWaitingtoOpen) { // Log Event - sprintf( LogStr, "Handle '%s' - Remote Client connection open [%s]", Handle->Name, Handle->Address ); - LogMessage( Name, dlMedium, LogStr ); + LogMessage( dlMedium, "%s: Handle '%s' - Remote Client connection open [%s]", Name, Handle->Name, Handle->Address ); // Update state Handle->State = csOpen; @@ -568,8 +546,7 @@ int CSelectableCore::OpenClientSocket( THandle * Handle ) if ((Handle->FD = socket( AF_INET, SOCK_STREAM, 0 )) < 0) { // Log Event - sprintf( LogStr, "Handle '%s' - Failed to create Client socket [%s:%d] (%s)", Handle->Name, Handle->Address, Handle->PortNo, strerror(errno) ); - LogMessage( Name, dlMedium, LogStr ); + LogMessage( dlMedium, "%s: Handle '%s' - Failed to create Client socket [%s:%d] (%s)", Name, Handle->Name, Handle->Address, Handle->PortNo, strerror(errno) ); // Set Status Handle->State = csFailed; @@ -588,8 +565,7 @@ int CSelectableCore::OpenClientSocket( THandle * Handle ) (setsockopt( Handle->FD, SOL_TCP, TCP_KEEPINTVL, &TCPint_opt, sizeof(TCPint_opt)) == -1) )) { // Log Event - sprintf( LogStr, "Handle %s - Could not set KeepAlive options [%s:%d] (%s)", Handle->Name, Handle->Address, Handle->PortNo, strerror(errno) ); - LogMessage( Name, dlMedium, LogStr ); + LogMessage( dlMedium, "%s: Handle %s - Could not set KeepAlive options [%s:%d] (%s)", Name, Handle->Name, Handle->Address, Handle->PortNo, strerror(errno) ); // Set State close( Handle->FD ); @@ -607,8 +583,7 @@ int CSelectableCore::OpenClientSocket( THandle * Handle ) if (!connect( Handle->FD, (struct sockaddr *)&address, addr_len )) { - sprintf( LogStr, "Handle %s - Client connected [%s:%d]", Handle->Name, Handle->Address, Handle->PortNo ); - LogMessage( Name, dlMedium, LogStr ); + LogMessage( dlMedium, "%s: Handle %s - Client connected [%s:%d]", Name, Handle->Name, Handle->Address, Handle->PortNo ); // Add to Select Lists if (Select) { @@ -622,8 +597,7 @@ int CSelectableCore::OpenClientSocket( THandle * Handle ) else if ((errno == EAGAIN) || (errno == EWOULDBLOCK) || (errno == EINPROGRESS) || (errno == EALREADY)) { // Log Event - sprintf( LogStr, "Handle '%s' - Client waiting to connect [%s:%d] (%s)", Handle->Name, Handle->Address, Handle->PortNo, strerror(errno) ); - LogMessage( Name, dlMedium, LogStr ); + LogMessage( dlMedium, "%s: Handle '%s' - Client waiting to connect [%s:%d] (%s)", Name, Handle->Name, Handle->Address, Handle->PortNo, strerror(errno) ); // Add to Select Lists if (Select) { @@ -637,8 +611,7 @@ int CSelectableCore::OpenClientSocket( THandle * Handle ) else { // Log Event - sprintf( LogStr, "Handle '%s' - Client could not connect [%s:%d] (%s)", Handle->Name, Handle->Address, Handle->PortNo, strerror(errno) ); - LogMessage( Name, dlMedium, LogStr ); + LogMessage( dlMedium, "%s: Handle '%s' - Client could not connect [%s:%d] (%s)", Name, Handle->Name, Handle->Address, Handle->PortNo, strerror(errno) ); // Remove from Select List if (Select) { @@ -654,14 +627,13 @@ int CSelectableCore::OpenClientSocket( THandle * Handle ) } //--------------------------------------------------------------------------- -int CSelectableCore::Open( const char * HandleName ) +int CSelectableCore::Open( THandle * Handle ) { - int FD = -1; - THandle * Handle = NULL; + int FD = -1; // Validate - if (!HandleName || !(Handle = GetHandle( HandleName ))) { - return false; + if (!Handle) { + return -1; } // Open correctly @@ -724,27 +696,26 @@ bool CSelectableCore::Close( THandle * Handle, bool CloseChildren ) { case ctPort: // Log Event - sprintf( LogStr, "Handle '%s' - Port %s [%s]", Handle->Name, ((Fail)? "failed" : "closed"), Handle->FileName ); + LogMessage( dlMedium, "%s: Handle '%s' - Port %s [%s]", Name, Handle->Name, ((Fail)? "failed" : "closed"), Handle->FileName ); break; case ctServer: - sprintf( LogStr, "Handle '%s' - Server %s [%s:%d]", Handle->Name, ((Fail)? "failed" : "closed"), Handle->Address, Handle->PortNo ); + LogMessage( dlMedium, "%s: Handle '%s' - Server %s [%s:%d]", Name, Handle->Name, ((Fail)? "failed" : "closed"), Handle->Address, Handle->PortNo ); break; case ctRemoteClient: - sprintf( LogStr, "Handle '%s' - Remote Client connection %s [%s]", Handle->Name, ((Fail)? "failed" : "closed"), Handle->Address ); + LogMessage( dlMedium, "%s: Handle '%s' - Remote Client connection %s [%s]", Name, Handle->Name, ((Fail)? "failed" : "closed"), Handle->Address ); break; case ctClient: - sprintf( LogStr, "Handle '%s' - Client connection %s [%s:%d]", Handle->Name, ((Fail)? "failed" : "closed"), Handle->Address, Handle->PortNo ); + LogMessage( dlMedium, "%s: Handle '%s' - Client connection %s [%s:%d]", Name, Handle->Name, ((Fail)? "failed" : "closed"), Handle->Address, Handle->PortNo ); break; case ctNone: default: - sprintf( LogStr, "Handle '%s' - %s, invalid Handle type", Handle->Name, ((Fail)? "failed" : "closed") ); + LogMessage( dlMedium, "%s: Handle '%s' - %s, invalid Handle type", Name, Handle->Name, ((Fail)? "failed" : "closed") ); break; }; - LogMessage( Name, dlMedium, LogStr ); // Remove from Select List if (!Fail && Select) { @@ -770,10 +741,7 @@ bool CSelectableCore::Read( THandle * Handle ) } // Log Read Event - if (DebugLevel >= dlMedium) { - sprintf( LogStr, "Handle '%s' - Read Event", Handle->Name ); - LogMessage( Name, dlMedium, LogStr ); - } + LogMessage( dlHigh, "%s: Handle '%s' - Read Event", Name, Handle->Name ); // Check for closing/opening event on Socket if (Handle->Type == ctServer) @@ -824,7 +792,7 @@ bool CSelectableCore::Read( THandle * Handle ) } // Read File directly into buffer - if (!(BytesRead = Handle->InBuffer->ReadFromFD( Handle->FD ))) { + if (!Handle->InBuffer || !(BytesRead = Handle->InBuffer->ReadFromFD( Handle->FD ))) { return false; } @@ -850,10 +818,7 @@ bool CSelectableCore::Write( THandle * Handle ) } // Log Read Event - if (DebugLevel >= dlMedium) { - sprintf( LogStr, "Handle '%s' - Write Event", Handle->Name ); - LogMessage( Name, dlMedium, LogStr ); - } + LogMessage( dlHigh, "%s: Handle '%s' - Write Event", Name, Handle->Name ); if (Handle->State == csWaitingtoOpen) { @@ -879,9 +844,8 @@ bool CSelectableCore::Write( THandle * Handle ) { if (DebugLevel >= dlHigh) { // Show event - Len = Handle->InBuffer->Peek( &Data ); - sprintf( LogStr, "%s: Handle '%s' - OUT:", Name, Handle->Name ); - ShowOutput( LogStr, dlHigh, OUT_NORMAL, Data, Len ); + Len = Handle->OutBuffer->Peek( &Data ); + ShowOutput( dlHigh, OUT_NORMAL, Data, Len, "%s: Handle '%s' - OUT:", Name, Handle->Name ); } // Update Buffer @@ -920,7 +884,7 @@ bool CSelectableCore::ProcessBuffer( THandle * Handle, bool Force ) char HeadStr[50]; // Check if buffered data - if (!Handle || !Handle->InBuffer->Len()) { + if (!Handle || !Handle->InBuffer || !Handle->InBuffer->Len()) { return false; } @@ -928,11 +892,8 @@ bool CSelectableCore::ProcessBuffer( THandle * Handle, bool Force ) if (Force) { // Show Packet - if (DebugLevel >= dlHigh) { - Len = Handle->InBuffer->Peek( &Data ); - sprintf( HeadStr, "%s: Handle '%s' - IN-F:", Name, Handle->Name ); - ShowOutput( HeadStr, dlHigh, OUT_NORMAL, Data, Len ); - } + Len = Handle->InBuffer->Peek( &Data ); + ShowOutput( dlHigh, OUT_NORMAL, Data, Len, "%s: Handle '%s' - IN-F:", Name, Handle->Name ); // Write buffer to Outputs if (Handle->Type == ctRemoteClient) { @@ -961,11 +922,9 @@ bool CSelectableCore::ProcessBuffer( THandle * Handle, bool Force ) // Search for end of packet marker while (Handle->InBuffer->FindStr( Handle->InMarker, Handle->InMarkerLen, Pos )) { - if (DebugLevel >= dlHigh) { - // Show Packet - Len = Handle->InBuffer->Peek( &Data, 0, Pos+1 ); - ShowOutput( HeadStr, dlHigh, OUT_NORMAL, Data, Len ); - } + // Show Packet + Len = Handle->InBuffer->Peek( &Data, 0, Pos+1 ); + ShowOutput( dlHigh, OUT_NORMAL, Data, Len, "%s: Handle '%s' - IN-M:", Name, Handle->Name ); // Write buffer to Outputs if (Handle->Type == ctRemoteClient) { @@ -1035,6 +994,7 @@ int CSelectableCore::WriteToFD( int FD, const char * Data, int Len ) { // Read from file descriptor BytesWritten = write( FD, Data, DataRemain ); + //write( FD, "\n", 1 ); if (BytesWritten <= 0) break; @@ -1065,15 +1025,12 @@ int CSelectableCore::Input( const char * IOName, const char * Data, int Len ) if (!(Handle = GetHandle( IOName ))) { // Log event - sprintf( LogStr, "%s: Local IO '%s' - Input rejected, Input not found", Name, IOName ); - LogMessage( Name, dlMedium, LogStr ); - + LogMessage( dlHigh, "%s: Local IO '%s' - Input rejected, Input not found", Name, IOName ); return 0; } // Log event - sprintf( LogStr, "%s: LocalIO '%s' - IN:", Name, IOName ); - ShowOutput( LogStr, dlMedium, OUT_NORMAL, Data, Len ); + ShowOutput( dlHigh, OUT_NORMAL, Data, Len, "%s: LocalIO '%s' - IN:", Name, IOName ); if (Handle->Type == ctServer) { @@ -1097,11 +1054,8 @@ int CSelectableCore::Input( const char * IOName, const char * Data, int Len ) } else { - if (DebugLevel >= dlHigh) { - // Show event - sprintf( LogStr, "%s: Handle '%s' - OUT:", Name, Handle->Name ); - ShowOutput( LogStr, dlHigh, OUT_NORMAL, Data, Len ); - } + // Show event + ShowOutput( dlHigh, OUT_NORMAL, Data, Len, "%s: Handle '%s' - OUT:", Name, ChildHandle->Name ); // Write directly to handle BytesWritten = WriteToFD( ChildHandle->FD, Data, Len ); @@ -1129,11 +1083,8 @@ int CSelectableCore::Input( const char * IOName, const char * Data, int Len ) } else { - if (DebugLevel >= dlHigh) { - // Show event - sprintf( LogStr, "%s: Handle '%s' - OUT:", Name, Handle->Name ); - ShowOutput( LogStr, dlHigh, OUT_NORMAL, Data, Len ); - } + // Show event + ShowOutput( dlHigh, OUT_NORMAL, Data, Len, "%s: Handle '%s' - OUT:", Name, Handle->Name ); // Write directly to handle BytesWritten = WriteToFD( Handle->FD, Data, Len ); @@ -1149,10 +1100,18 @@ bool CSelectableCore::Process() THandle * Handle = NULL; long Duration = 0; - // Check all Input buffers + // Check all handles Handle = FirstHandle; while (Handle) { + // Auto manage handles + if (Handle->Auto && ((Handle->State == csNone) || (Handle->State == csFailed) || (Handle->State == csClosed))) + { + // Reopen handle + Open( Handle ); + } + + // Check Input buffers if (Handle->InBuffer && (Handle->InBuffer->Len() > 0)) { // Check duration since last PortIn @@ -1307,15 +1266,13 @@ bool CSelectableCore::SerialConfig( THandle * Handle, int Baud, short DataBits, if (tcsetattr( Handle->FD, TCSANOW, &newtio ) != 0) { // Log event - sprintf( LogStr, "Handle '%s' - Port not configured", Handle->Name ); - LogMessage( Name, dlMedium, LogStr ); + LogMessage( dlMedium, "%s: Handle '%s' - Port not configured", Name, Handle->Name ); return false; } // Port configured // Log event - sprintf( LogStr, "Handle '%s' - Port configured", Handle->Name ); - LogMessage( Name, dlMedium, LogStr ); + LogMessage( dlMedium, "%s: Handle '%s' - Port configured", Name, Handle->Name ); return true; } //--------------------------------------------------------------------------- diff --git a/SelectableCore.h b/SelectableCore.h index d7867eb..7f63dec 100644 --- a/SelectableCore.h +++ b/SelectableCore.h @@ -77,6 +77,7 @@ struct SHandle { int FD; EConnectState State; + bool Auto; // Buffers CBuffer * InBuffer; @@ -168,6 +169,7 @@ protected: virtual int OpenClientSocket( THandle * Handle ); // Mutual Operations + virtual int Open( THandle * Handle ); virtual bool Close( THandle * Handle, bool CloseChildren = false ); virtual bool Read( THandle * Handle ); virtual bool Write( THandle * Handle ); @@ -202,7 +204,7 @@ public: } // Configuration - THandle * CreateHandle( const char * HandleName, bool CreateIO = false ); + THandle * CreateHandle( const char * HandleName, bool CreateIO, bool AutoManage ); bool SetBuffers( THandle * Handle, int InBufSize, int OutBufSize, int InTimeout, const char * InMarker, int InMarkerLen ); bool SerialConfig( THandle * Handle, int Baud, short DataBits, short StopBits, short Parity, short FlowCtrl, int Wait ); @@ -212,16 +214,16 @@ public: bool ClearHandle( THandle * Handle ); // FD operations - virtual int Open( const char * HandleName ); + inline virtual int Open( const char * HandleName ) { return (Open( GetHandle( HandleName ))); }; - virtual bool Close( const char * HandleName, bool CloseChildren = false ) { return (Close( GetHandle( HandleName ), CloseChildren )); }; - virtual bool Close( int FD, bool CloseChildren = false ) { return (Close( GetHandle( FD ), CloseChildren )); }; + inline virtual bool Close( const char * HandleName, bool CloseChildren = false ) { return (Close( GetHandle( HandleName ), CloseChildren )); }; + inline virtual bool Close( int FD, bool CloseChildren = false ) { return (Close( GetHandle( FD ), CloseChildren )); }; - virtual bool Read( const char * HandleName ) { return (Read( GetHandle( HandleName ))); }; - virtual bool Read( int FD ) { return (Read( GetHandle( FD ))); }; + inline virtual bool Read( const char * HandleName ) { return (Read( GetHandle( HandleName ))); }; + inline virtual bool Read( int FD ) { return (Read( GetHandle( FD ))); }; - virtual bool Write( const char * HandleName ) { return (Write( GetHandle( HandleName ))); }; - virtual bool Write( int FD ) { return (Write( GetHandle( FD ))); }; + inline virtual bool Write( const char * HandleName ) { return (Write( GetHandle( HandleName ))); }; + inline virtual bool Write( int FD ) { return (Write( GetHandle( FD ))); }; // Function Interface virtual int Input( const char *IOName, const char * Buffer, int BufLen = -1 ); diff --git a/SignalCore.cpp b/SignalCore.cpp index 0b5090d..1e65581 100644 --- a/SignalCore.cpp +++ b/SignalCore.cpp @@ -66,7 +66,6 @@ void ConfigureSignalHandlers() void SignalTerminate( int sig ) { char SigName[10]; - char LogMsg[200]; // Determine signal name switch (sig) @@ -88,21 +87,16 @@ void SignalTerminate( int sig ) std::cerr << "\r\n" << ProcessName << ": ***********************************\n"; // Create Log Entry - sprintf( LogMsg, " ** %s signal received [%d] **", SigName, TermCount ); - LogMessage( ProcessName, dlNone, LogMsg );//, ltDefault, -1 ); - + LogMessage( dlNone, "%s: ** %s signal received [%d] **", ProcessName, SigName, TermCount ); if (TermCount < MaxTermCount) - { - std::cerr << ProcessName << ": ** Terminating normally... **\n"; - std::cerr << ProcessName << ": ***********************************\n\n"; - } + LogMessage( dlNone, "%s: ** Terminating normally... **", ProcessName ); else - { - std::cerr << ProcessName << ": ** Terminating immediately! **\n"; - std::cerr << ProcessName << ": ***********************************\n\n"; + LogMessage( dlNone, "%s: ** Terminating immediately! **", ProcessName ); + std::cerr << ProcessName << ": ***********************************\n\n"; + + if (TermCount >= MaxTermCount) exit( sig ); - } return; }//--------------------------------------------------------------------------- @@ -111,7 +105,6 @@ void SignalTerminate( int sig ) void SignalAbort( int sig ) { char SigName[10]; - char LogMsg[200]; // Determine Signal name switch (sig) @@ -128,10 +121,9 @@ void SignalAbort( int sig ) std::cerr << "\n" << ProcessName << ": ********************************\n"; // Create Log Entry - but don't post - sprintf( LogMsg, " ** %s signal received **", SigName ); - LogMessage( ProcessName, dlNone, LogMsg );//, ltDefault, -1 ); + LogMessage( dlNone, "%s: ** %s signal received **", ProcessName, SigName ); + LogMessage( dlNone, "%s: ** Terminating immediately! **", ProcessName ); - std::cerr << ProcessName << ": ** Terminating immediately! **\n"; std::cerr << ProcessName << ": ********************************\n\n"; // Terminate with signal