X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FNetwork%2Fgeneric.cxx;h=dca36308739490aa765cb33c9a828e73fd7fb840;hb=a1031b052dd40ca3a4ea68dcd7f572b7d9e4bb24;hp=21f048c65ff20dd0088e04f8a912e51a983b932f;hpb=39a7caae15c01007b6dc636f21336e823c621f73;p=flightgear.git diff --git a/src/Network/generic.cxx b/src/Network/generic.cxx index 21f048c65..dca363087 100644 --- a/src/Network/generic.cxx +++ b/src/Network/generic.cxx @@ -340,7 +340,7 @@ bool FGGeneric::parse_message_binary(int length) { } bool FGGeneric::parse_message_ascii(int length) { - char *p2, *p1 = buf; + char *p1 = buf; int i = -1; int chunks = _in_message.size(); int line_separator_size = line_separator.size(); @@ -354,11 +354,17 @@ bool FGGeneric::parse_message_ascii(int length) { buf[length - line_separator_size] = 0; } + size_t varsep_len = var_separator.length(); while ((++i < chunks) && p1) { - p2 = strstr(p1, var_separator.c_str()); - if (p2) { - *p2 = 0; - p2 += var_separator.length(); + char* p2 = NULL; + + if (varsep_len > 0) + { + p2 = strstr(p1, var_separator.c_str()); + if (p2) { + *p2 = 0; + p2 += varsep_len; + } } switch (_in_message[i].type) { @@ -390,7 +396,7 @@ bool FGGeneric::parse_message_ascii(int length) { return true; } -bool FGGeneric::parse_message(int length) { +bool FGGeneric::parse_message_len(int length) { if (binary_mode) { return parse_message_binary(length); } else { @@ -448,7 +454,7 @@ bool FGGeneric::process() { if (!binary_mode) { length = io->readline( buf, FG_MAX_MSG_SIZE ); if ( length > 0 ) { - parse_message( length ); + parse_message_len( length ); } else { SG_LOG( SG_IO, SG_ALERT, "Error reading data." ); return false; @@ -456,7 +462,7 @@ bool FGGeneric::process() { } else { length = io->read( buf, binary_record_length ); if ( length == binary_record_length ) { - parse_message( length ); + parse_message_len( length ); } else { SG_LOG( SG_IO, SG_ALERT, "Generic protocol: Received binary " @@ -468,12 +474,12 @@ bool FGGeneric::process() { } else { if (!binary_mode) { while ((length = io->readline( buf, FG_MAX_MSG_SIZE )) > 0 ) { - parse_message( length ); + parse_message_len( length ); } } else { while ((length = io->read( buf, binary_record_length )) == binary_record_length ) { - parse_message( length ); + parse_message_len( length ); } if ( length > 0 ) { @@ -542,13 +548,21 @@ FGGeneric::reinit() SGPropertyNode *output = root.getNode("generic/output"); if (output) { _out_message.clear(); - read_config(output, _out_message); + if (!read_config(output, _out_message)) + { + // bad configuration + return; + } } } else if (direction == "in") { SGPropertyNode *input = root.getNode("generic/input"); if (input) { _in_message.clear(); - read_config(input, _in_message); + if (!read_config(input, _in_message)) + { + // bad configuration + return; + } if (!binary_mode && (line_separator.size() == 0 || *line_separator.rbegin() != '\n')) { @@ -563,7 +577,7 @@ FGGeneric::reinit() } -void +bool FGGeneric::read_config(SGPropertyNode *root, vector<_serial_prot> &msg) { binary_mode = root->getBoolValue("binary_mode"); @@ -663,6 +677,7 @@ FGGeneric::read_config(SGPropertyNode *root, vector<_serial_prot> &msg) int record_length = 0; // Only used for binary protocols. vector chunks = root->getChildren("chunk"); + for (unsigned int i = 0; i < chunks.size(); i++) { _serial_prot chunk; @@ -705,7 +720,19 @@ FGGeneric::read_config(SGPropertyNode *root, vector<_serial_prot> &msg) } - if( binary_mode ) { + if( !binary_mode ) + { + if ((chunks.size() > 1)&&(var_sep_string.length() == 0)) + { + // ASCII protocols really need a separator when there is more than one chunk per line + SG_LOG(SG_IO, SG_ALERT, + "generic protocol: Invalid configuration. " + "'var_separator' must not be empty for protocols which have more than one chunk per line."); + return false; + } + } + else + { if (binary_record_length == -1) { binary_record_length = record_length; } else if (binary_record_length < record_length) { @@ -715,6 +742,8 @@ FGGeneric::read_config(SGPropertyNode *root, vector<_serial_prot> &msg) binary_record_length = record_length; } } + + return true; } void FGGeneric::updateValue(FGGeneric::_serial_prot& prot, bool val)