]> git.mxchange.org Git - simgear.git/blobdiff - simgear/hla/HLAFederate.cxx
hla: Introduce backend factory infrastructure.
[simgear.git] / simgear / hla / HLAFederate.cxx
index 003fd23ad2224fcac568318cdddf5155914d2a63..4a9d93d4626ccce9c3489b538aceba91fbc908e2 100644 (file)
@@ -1,4 +1,4 @@
-// Copyright (C) 2009 - 2011  Mathias Froehlich - Mathias.Froehlich@web.de
+// Copyright (C) 2009 - 2012  Mathias Froehlich - Mathias.Froehlich@web.de
 //
 // This library is free software; you can redistribute it and/or
 // modify it under the terms of the GNU Library General Public
 
 #include "HLAFederate.hxx"
 
-#include "RTI13Federate.hxx"
+#include "simgear/debug/logstream.hxx"
+
 #include "RTIFederate.hxx"
+#include "RTIFederateFactoryRegistry.hxx"
+#include "RTI13FederateFactory.hxx"
 #include "RTIInteractionClass.hxx"
 #include "RTIObjectClass.hxx"
 #include "HLADataElement.hxx"
@@ -35,6 +38,8 @@ HLAFederate::HLAFederate() :
     _timeConstrainedByLocalClock(false),
     _done(false)
 {
+    // For now instantiate the current only available factory here explicitly
+    RTI13FederateFactory::instance();
 }
 
 HLAFederate::~HLAFederate()
@@ -159,28 +164,9 @@ HLAFederate::setFederateName(const std::string& federateName)
 bool
 HLAFederate::connect(Version version, const std::list<std::string>& stringList)
 {
-    if (_rtiFederate.valid()) {
-        SG_LOG(SG_NETWORK, SG_WARN, "HLA: Trying to connect to already connected federate!");
-        return false;
-    }
-    switch (version) {
-    case RTI13:
-        _rtiFederate = new RTI13Federate(stringList);
-        _version = version;
-        _connectArguments = stringList;
-        break;
-    case RTI1516:
-        SG_LOG(SG_IO, SG_ALERT, "HLA version RTI1516 not yet(!?) supported.");
-        // _rtiFederate = new RTI1516Federate(stringList);
-        break;
-    case RTI1516E:
-        SG_LOG(SG_IO, SG_ALERT, "HLA version RTI1516E not yet(!?) supported.");
-        // _rtiFederate = new RTI1516eFederate(stringList);
-        break;
-    default:
-        SG_LOG(SG_NETWORK, SG_WARN, "HLA: Unknown rti version in connect!");
-    }
-    return _rtiFederate.valid();
+    _version = version;
+    _connectArguments = stringList;
+    return connect();
 }
 
 bool
@@ -190,17 +176,22 @@ HLAFederate::connect()
         SG_LOG(SG_NETWORK, SG_WARN, "HLA: Trying to connect to already connected federate!");
         return false;
     }
+
+    SGSharedPtr<RTIFederateFactoryRegistry> registry = RTIFederateFactoryRegistry::instance();
+    if (!registry) {
+        SG_LOG(SG_NETWORK, SG_ALERT, "HLA: RTIFederateFactoryRegistry is no longer available!");
+        return false;
+    }
+
     switch (_version) {
     case RTI13:
-        _rtiFederate = new RTI13Federate(_connectArguments);
+        _rtiFederate = registry->create("RTI13", _connectArguments);
         break;
     case RTI1516:
-        SG_LOG(SG_IO, SG_ALERT, "HLA version RTI1516 not yet(!?) supported.");
-        // _rtiFederate = new RTI1516Federate(_connectArguments);
+        _rtiFederate = registry->create("RTI1516", _connectArguments);
         break;
     case RTI1516E:
-        SG_LOG(SG_IO, SG_ALERT, "HLA version RTI1516E not yet(!?) supported.");
-        // _rtiFederate = new RTI1516eFederate(_connectArguments);
+        _rtiFederate = registry->create("RTI1516E", _connectArguments);
         break;
     default:
         SG_LOG(SG_NETWORK, SG_WARN, "HLA: Unknown rti version in connect!");
@@ -729,7 +720,7 @@ HLAFederate::processMessages()
     }
     
     // Now flush just what is left
-    while (!_rtiFederate->processMessages(0, 0));
+    while (_rtiFederate->processMessages(0, 0));
 
     return true;
 }
@@ -831,6 +822,27 @@ HLAFederate::readObjectModelTemplate(const std::string& objectModel,
     return true;
 }
 
+bool
+HLAFederate::readRTI13ObjectModelTemplate(const std::string& objectModel)
+{
+    SG_LOG(SG_IO, SG_ALERT, "HLA version RTI13 not yet(!?) supported.");
+    return false;
+}
+
+bool
+HLAFederate::readRTI1516ObjectModelTemplate(const std::string& objectModel)
+{
+    ObjectModelFactory objectModelFactory;
+    return readObjectModelTemplate(objectModel, objectModelFactory);
+}
+
+bool
+HLAFederate::readRTI1516EObjectModelTemplate(const std::string& objectModel)
+{
+    SG_LOG(SG_IO, SG_ALERT, "HLA version RTI1516E not yet(!?) supported.");
+    return false;
+}
+
 HLAObjectClass*
 HLAFederate::getObjectClass(const std::string& name)
 {
@@ -849,6 +861,12 @@ HLAFederate::getObjectClass(const std::string& name) const
     return i->second.get();
 }
 
+HLAObjectClass*
+HLAFederate::createObjectClass(const std::string& name)
+{
+    return new HLAObjectClass(name, *this);
+}
+
 HLAInteractionClass*
 HLAFederate::getInteractionClass(const std::string& name)
 {
@@ -884,6 +902,14 @@ HLAFederate::readObjectModel()
 {
     /// Currently empty, but is called at the right time so that
     /// the object model is present when it is needed
+    // switch (getVersion()) {
+    // case RTI13:
+    //     return readRTI13ObjectModelTemplate(getFederationObjectModel());
+    // case RTI1516:
+    //     return readRTI1516ObjectModelTemplate(getFederationObjectModel());
+    // case RTI1516E:
+    //     return readRTI1516EObjectModelTemplate(getFederationObjectModel());
+    // }
     return true;
 }