]> git.mxchange.org Git - simgear.git/blobdiff - simgear/hla/RTI13Federate.cxx
Fix missing include in simgear/misc/strutils_test.cxx
[simgear.git] / simgear / hla / RTI13Federate.cxx
index 154a3b3363618bafd0793bae2ebfe4af9df3d93e..9ceb828332938cfdb4b77f56f651a779f615ef5b 100644 (file)
@@ -1563,29 +1563,80 @@ RTI13Federate::queryLITS(SGTimeStamp& timeStamp)
     return true;
 }
 
-bool
+RTI13Federate::ProcessMessageResult
 RTI13Federate::processMessage()
 {
-    bool result = _ambassador->tick();
+    ProcessMessageResult result = _tick();
     _federateAmbassador->processQueues();
     return result;
 }
 
-bool
+RTI13Federate::ProcessMessageResult
 RTI13Federate::processMessages(const double& minimum, const double& maximum)
 {
-    bool result = _ambassador->tick(minimum, 0);
+    ProcessMessageResult result = _tick(minimum, 0);
     _federateAmbassador->processQueues();
-    if (!result)
-        return false;
+    if (result != ProcessMessagePending)
+        return result;
     SGTimeStamp timeStamp = SGTimeStamp::now() + SGTimeStamp::fromSec(maximum);
     do {
-        result = _ambassador->tick(0, 0);
+        result = _tick(0, 0);
         _federateAmbassador->processQueues();
-    } while (result && SGTimeStamp::now() <= timeStamp);
+    } while (result == ProcessMessagePending && SGTimeStamp::now() <= timeStamp);
     return result;
 }
 
+RTI13Federate::ProcessMessageResult
+RTI13Federate::_tick()
+{
+    if (!_ambassador.valid()) {
+        SG_LOG(SG_NETWORK, SG_WARN, "RTI: Ambassador is zero while calling _tick().");
+        return ProcessMessageFatal;
+    }
+
+    try {
+        if (_ambassador->tick())
+            return ProcessMessagePending;
+        return ProcessMessageLast;
+    } catch (RTI::SpecifiedSaveLabelDoesNotExist& e) {
+        SG_LOG(SG_NETWORK, SG_WARN, "RTI: Specified save label does not exist: " << e._name << " " << e._reason);
+        return ProcessMessageFatal;
+    } catch (RTI::ConcurrentAccessAttempted& e) {
+        SG_LOG(SG_NETWORK, SG_WARN, "RTI: Concurrent access attempted: " << e._name << " " << e._reason);
+        return ProcessMessageFatal;
+    } catch (RTI::RTIinternalError& e) {
+        SG_LOG(SG_NETWORK, SG_WARN, "RTI: Internal error: " << e._name << " " << e._reason);
+        return ProcessMessageFatal;
+    }
+    return ProcessMessageFatal;
+}
+
+RTI13Federate::ProcessMessageResult
+RTI13Federate::_tick(const double& minimum, const double& maximum)
+{
+    if (!_ambassador.valid()) {
+        SG_LOG(SG_NETWORK, SG_WARN, "RTI: Ambassador is zero while calling _tick().");
+        return ProcessMessageFatal;
+    }
+
+    try {
+        if (_ambassador->tick(minimum, maximum))
+            return ProcessMessagePending;
+        return ProcessMessageLast;
+    } catch (RTI::SpecifiedSaveLabelDoesNotExist& e) {
+        SG_LOG(SG_NETWORK, SG_WARN, "RTI: Specified save label does not exist: " << e._name << " " << e._reason);
+        return ProcessMessageFatal;
+    } catch (RTI::ConcurrentAccessAttempted& e) {
+        SG_LOG(SG_NETWORK, SG_WARN, "RTI: Concurrent access attempted: " << e._name << " " << e._reason);
+        return ProcessMessageFatal;
+    } catch (RTI::RTIinternalError& e) {
+        SG_LOG(SG_NETWORK, SG_WARN, "RTI: Internal error: " << e._name << " " << e._reason);
+        return ProcessMessageFatal;
+    }
+    return ProcessMessageFatal;
+}
+
+
 RTI13ObjectClass*
 RTI13Federate::createObjectClass(const std::string& objectClassName, HLAObjectClass* hlaObjectClass)
 {