From: mfranz Date: Sun, 29 Jul 2007 13:58:58 +0000 (+0000) Subject: generic/output: X-Git-Url: https://git.mxchange.org/?a=commitdiff_plain;h=306b818490721a20eb98210633990d33c588cc55;p=flightgear.git generic/output: - support optional and which are written right after opening and before closing respectively. This can be used for a header line or an XML header. - unescape , , , , so that \t, \n, \r, \f, \v, \xnn, \nnn can be used directly (\a and \b are ignored; use \\ for the backslash) The long names ("carriagereturn") are still supported for , but one can just use \r, or \r\n too. - don't abort when a chunk doesn't have a . This is useful for adding constant chunks which consist only of a , such as XML tags. --- diff --git a/src/Network/generic.cxx b/src/Network/generic.cxx index 60c99ee58..f74c954fe 100644 --- a/src/Network/generic.cxx +++ b/src/Network/generic.cxx @@ -37,6 +37,7 @@ #include
#include
+#include
#include "generic.hxx" @@ -236,6 +237,13 @@ bool FGGeneric::open() { set_enabled( true ); + if ( get_direction() == SG_IO_OUT && ! preamble.empty() ) { + if ( ! io->write( preamble.c_str(), preamble.size() ) ) { + SG_LOG( SG_IO, SG_WARN, "Error writing preamble." ); + return false; + } + } + return true; } @@ -267,6 +275,13 @@ bool FGGeneric::process() { bool FGGeneric::close() { SGIOChannel *io = get_io_channel(); + if ( get_direction() == SG_IO_OUT && ! postamble.empty() ) { + if ( ! io->write( postamble.c_str(), postamble.size() ) ) { + SG_LOG( SG_IO, SG_ALERT, "Error writing postamble." ); + return false; + } + } + set_enabled( false ); if ( ! io->close() ) { @@ -280,10 +295,7 @@ bool FGGeneric::close() { void FGGeneric::read_config(SGPropertyNode *root, vector<_serial_prot> &msg) { - if (root->hasValue("binary_mode")) - binary_mode = root->getBoolValue("binary_mode"); - else - binary_mode = false; + binary_mode = root->getBoolValue("binary_mode"); if (!binary_mode) { /* These variables specified in the $FG_ROOT/data/Protocol/xxx.xml @@ -293,8 +305,10 @@ FGGeneric::read_config(SGPropertyNode *root, vector<_serial_prot> &msg) * line_sep_string = the string/charachter to place at the end of each * lot of variables */ - var_sep_string = root->getStringValue("var_separator"); - line_sep_string = root->getStringValue("line_separator"); + preamble = fgUnescape(root->getStringValue("preamble")); + postamble = fgUnescape(root->getStringValue("postamble")); + var_sep_string = fgUnescape(root->getStringValue("var_separator")); + line_sep_string = fgUnescape(root->getStringValue("line_separator")); if ( var_sep_string == "newline" ) var_separator = '\n'; @@ -347,12 +361,12 @@ FGGeneric::read_config(SGPropertyNode *root, vector<_serial_prot> &msg) _serial_prot chunk; - // chunk.name = chunks[i]->getStringValue("name"); - chunk.format = chunks[i]->getStringValue("format", "%d"); + // chunk.name = chunks[i]->getStringValue("name"); + chunk.format = fgUnescape(chunks[i]->getStringValue("format", "%d")); chunk.offset = chunks[i]->getDoubleValue("offset"); chunk.factor = chunks[i]->getDoubleValue("factor", 1.0); - string node = chunks[i]->getStringValue("node"); + string node = chunks[i]->getStringValue("node", "/null"); chunk.prop = fgGetNode(node.c_str(), true); string type = chunks[i]->getStringValue("type"); diff --git a/src/Network/generic.hxx b/src/Network/generic.hxx index d0acb1e98..ed5d1c368 100644 --- a/src/Network/generic.hxx +++ b/src/Network/generic.hxx @@ -71,6 +71,8 @@ private: int length; char buf[ FG_MAX_MSG_SIZE ]; + string preamble; + string postamble; string var_separator; string line_separator; string var_sep_string;