1 // Copyright (C) 2009 - 2010 Mathias Froehlich - Mathias.Froehlich@web.de
3 // This library is free software; you can redistribute it and/or
4 // modify it under the terms of the GNU Library General Public
5 // License as published by the Free Software Foundation; either
6 // version 2 of the License, or (at your option) any later version.
8 // This library is distributed in the hope that it will be useful,
9 // but WITHOUT ANY WARRANTY; without even the implied warranty of
10 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11 // Library General Public License for more details.
13 // You should have received a copy of the GNU General Public License
14 // along with this program; if not, write to the Free Software
15 // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
18 #ifndef HLAObjectClass_hxx
19 #define HLAObjectClass_hxx
25 #include "HLADataType.hxx"
26 #include "HLAObjectInstance.hxx"
33 class HLAObjectClass : public SGWeakReferenced {
35 HLAObjectClass(const std::string& name, HLAFederate& federate);
36 virtual ~HLAObjectClass();
38 const std::string& getName() const
41 unsigned getNumAttributes() const;
42 unsigned getAttributeIndex(const std::string& name) const;
43 std::string getAttributeName(unsigned index) const;
45 const HLADataType* getAttributeDataType(unsigned index) const;
46 void setAttributeDataType(unsigned index, const HLADataType*);
48 HLAUpdateType getAttributeUpdateType(unsigned index) const;
49 void setAttributeUpdateType(unsigned index, HLAUpdateType updateType);
51 HLADataElement::IndexPathPair getIndexPathPair(const HLADataElement::AttributePathPair&) const;
52 HLADataElement::IndexPathPair getIndexPathPair(const std::string& path) const;
54 bool subscribe(const std::set<unsigned>& indexSet, bool active);
57 bool publish(const std::set<unsigned>& indexSet);
60 // Object instance creation and destruction
61 class InstanceCallback : public SGReferenced {
63 virtual ~InstanceCallback();
65 virtual void discoverInstance(const HLAObjectClass& objectClass, HLAObjectInstance& objectInstance, const RTIData& tag);
66 virtual void removeInstance(const HLAObjectClass& objectClass, HLAObjectInstance& objectInstance, const RTIData& tag);
68 virtual void registerInstance(const HLAObjectClass& objectClass, HLAObjectInstance& objectInstance);
69 virtual void deleteInstance(const HLAObjectClass& objectClass, HLAObjectInstance& objectInstance);
72 void setInstanceCallback(const SGSharedPtr<InstanceCallback>& instanceCallback)
73 { _instanceCallback = instanceCallback; }
74 const SGSharedPtr<InstanceCallback>& getInstanceCallback() const
75 { return _instanceCallback; }
77 // Handles startRegistrationForObjectClass and stopRegistrationForObjectClass events
78 class RegistrationCallback : public SGReferenced {
80 virtual ~RegistrationCallback();
81 virtual void startRegistration(HLAObjectClass& objectClass) = 0;
82 virtual void stopRegistration(HLAObjectClass& objectClass) = 0;
85 void setRegistrationCallback(const SGSharedPtr<RegistrationCallback>& registrationCallback)
86 { _registrationCallback = registrationCallback; }
87 const SGSharedPtr<RegistrationCallback>& getRegistrationCallback() const
88 { return _registrationCallback; }
90 // Is called by the default registration callback if installed
91 void startRegistration() const;
92 void stopRegistration() const;
95 virtual HLAObjectInstance* createObjectInstance(RTIObjectInstance* rtiObjectInstance);
98 // The internal entry points from the RTILObjectClass callback functions
99 void discoverInstance(RTIObjectInstance* objectInstance, const RTIData& tag);
100 void removeInstance(HLAObjectInstance& objectInstance, const RTIData& tag);
101 void registerInstance(HLAObjectInstance& objectInstance);
102 void deleteInstance(HLAObjectInstance& objectInstance);
104 void discoverInstanceCallback(HLAObjectInstance& objectInstance, const RTIData& tag) const;
105 void removeInstanceCallback(HLAObjectInstance& objectInstance, const RTIData& tag) const;
106 void registerInstanceCallback(HLAObjectInstance& objectInstance) const;
107 void deleteInstanceCallback(HLAObjectInstance& objectInstance) const;
109 void startRegistrationCallback();
110 void stopRegistrationCallback();
111 friend class HLAObjectInstance;
112 friend class RTIObjectClass;
114 // The object class name
117 // The underlying rti dispatcher class
118 SGSharedPtr<RTIObjectClass> _rtiObjectClass;
121 SGSharedPtr<InstanceCallback> _instanceCallback;
122 SGSharedPtr<RegistrationCallback> _registrationCallback;
124 // The set of active objects
125 typedef std::set<SGSharedPtr<HLAObjectInstance> > ObjectInstanceSet;
126 ObjectInstanceSet _objectInstanceSet;
129 } // namespace simgear