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"
27 #include "HLATypes.hxx"
34 class HLAObjectClass : public SGWeakReferenced {
36 HLAObjectClass(const std::string& name, HLAFederate& federate);
37 virtual ~HLAObjectClass();
39 const std::string& getName() const
42 unsigned getNumAttributes() const;
43 unsigned getAttributeIndex(const std::string& name) const;
44 std::string getAttributeName(unsigned index) const;
46 const HLADataType* getAttributeDataType(unsigned index) const;
47 void setAttributeDataType(unsigned index, const HLADataType*);
49 HLAUpdateType getAttributeUpdateType(unsigned index) const;
50 void setAttributeUpdateType(unsigned index, HLAUpdateType updateType);
52 HLADataElement::IndexPathPair getIndexPathPair(const HLADataElement::StringPathPair&) const;
53 HLADataElement::IndexPathPair getIndexPathPair(const std::string& path) const;
55 bool subscribe(const std::set<unsigned>& indexSet, bool active);
58 bool publish(const std::set<unsigned>& indexSet);
61 // Object instance creation and destruction
62 class InstanceCallback : public SGReferenced {
64 virtual ~InstanceCallback();
66 virtual void discoverInstance(const HLAObjectClass& objectClass, HLAObjectInstance& objectInstance, const RTIData& tag);
67 virtual void removeInstance(const HLAObjectClass& objectClass, HLAObjectInstance& objectInstance, const RTIData& tag);
69 virtual void registerInstance(const HLAObjectClass& objectClass, HLAObjectInstance& objectInstance);
70 virtual void deleteInstance(const HLAObjectClass& objectClass, HLAObjectInstance& objectInstance);
73 void setInstanceCallback(const SGSharedPtr<InstanceCallback>& instanceCallback)
74 { _instanceCallback = instanceCallback; }
75 const SGSharedPtr<InstanceCallback>& getInstanceCallback() const
76 { return _instanceCallback; }
78 // Handles startRegistrationForObjectClass and stopRegistrationForObjectClass events
79 class RegistrationCallback : public SGReferenced {
81 virtual ~RegistrationCallback();
82 virtual void startRegistration(HLAObjectClass& objectClass) = 0;
83 virtual void stopRegistration(HLAObjectClass& objectClass) = 0;
86 void setRegistrationCallback(const SGSharedPtr<RegistrationCallback>& registrationCallback)
87 { _registrationCallback = registrationCallback; }
88 const SGSharedPtr<RegistrationCallback>& getRegistrationCallback() const
89 { return _registrationCallback; }
91 // Is called by the default registration callback if installed
92 void startRegistration() const;
93 void stopRegistration() const;
96 virtual HLAObjectInstance* createObjectInstance(RTIObjectInstance* rtiObjectInstance);
99 HLAObjectClass(const HLAObjectClass&);
100 HLAObjectClass& operator=(const HLAObjectClass&);
102 // The internal entry points from the RTILObjectClass callback functions
103 void discoverInstance(RTIObjectInstance* objectInstance, const RTIData& tag);
104 void removeInstance(HLAObjectInstance& objectInstance, const RTIData& tag);
105 void registerInstance(HLAObjectInstance& objectInstance);
106 void deleteInstance(HLAObjectInstance& objectInstance);
108 void discoverInstanceCallback(HLAObjectInstance& objectInstance, const RTIData& tag) const;
109 void removeInstanceCallback(HLAObjectInstance& objectInstance, const RTIData& tag) const;
110 void registerInstanceCallback(HLAObjectInstance& objectInstance) const;
111 void deleteInstanceCallback(HLAObjectInstance& objectInstance) const;
113 void startRegistrationCallback();
114 void stopRegistrationCallback();
115 friend class HLAObjectInstance;
116 friend class RTIObjectClass;
118 // The object class name
121 // The underlying rti dispatcher class
122 SGSharedPtr<RTIObjectClass> _rtiObjectClass;
125 SGSharedPtr<InstanceCallback> _instanceCallback;
126 SGSharedPtr<RegistrationCallback> _registrationCallback;
128 // The set of active objects
129 typedef std::set<SGSharedPtr<HLAObjectInstance> > ObjectInstanceSet;
130 ObjectInstanceSet _objectInstanceSet;
133 } // namespace simgear