]> git.mxchange.org Git - simgear.git/blob - simgear/hla/HLAObjectClass.hxx
Merge remote branch 'origin/releases/2.2.0' into next
[simgear.git] / simgear / hla / HLAObjectClass.hxx
1 // Copyright (C) 2009 - 2010  Mathias Froehlich - Mathias.Froehlich@web.de
2 //
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.
7 //
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.
12 //
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.
16 //
17
18 #ifndef HLAObjectClass_hxx
19 #define HLAObjectClass_hxx
20
21 #include <set>
22 #include <string>
23 #include <vector>
24
25 #include "HLADataType.hxx"
26 #include "HLAObjectInstance.hxx"
27
28 namespace simgear {
29
30 class RTIObjectClass;
31 class HLAFederate;
32
33 class HLAObjectClass : public SGWeakReferenced {
34 public:
35     HLAObjectClass(const std::string& name, HLAFederate& federate);
36     virtual ~HLAObjectClass();
37
38     const std::string& getName() const
39     { return _name; }
40
41     unsigned getNumAttributes() const;
42     unsigned getAttributeIndex(const std::string& name) const;
43     std::string getAttributeName(unsigned index) const;
44
45     const HLADataType* getAttributeDataType(unsigned index) const;
46     void setAttributeDataType(unsigned index, const HLADataType*);
47
48     HLAUpdateType getAttributeUpdateType(unsigned index) const;
49     void setAttributeUpdateType(unsigned index, HLAUpdateType updateType);
50
51     HLADataElement::IndexPathPair getIndexPathPair(const HLADataElement::AttributePathPair&) const;
52     HLADataElement::IndexPathPair getIndexPathPair(const std::string& path) const;
53
54     bool subscribe(const std::set<unsigned>& indexSet, bool active);
55     bool unsubscribe();
56
57     bool publish(const std::set<unsigned>& indexSet);
58     bool unpublish();
59
60     // Object instance creation and destruction
61     class InstanceCallback : public SGReferenced {
62     public:
63         virtual ~InstanceCallback();
64
65         virtual void discoverInstance(const HLAObjectClass& objectClass, HLAObjectInstance& objectInstance, const RTIData& tag);
66         virtual void removeInstance(const HLAObjectClass& objectClass, HLAObjectInstance& objectInstance, const RTIData& tag);
67
68         virtual void registerInstance(const HLAObjectClass& objectClass, HLAObjectInstance& objectInstance);
69         virtual void deleteInstance(const HLAObjectClass& objectClass, HLAObjectInstance& objectInstance);
70     };
71
72     void setInstanceCallback(const SGSharedPtr<InstanceCallback>& instanceCallback)
73     { _instanceCallback = instanceCallback; }
74     const SGSharedPtr<InstanceCallback>& getInstanceCallback() const
75     { return _instanceCallback; }
76
77     // Handles startRegistrationForObjectClass and stopRegistrationForObjectClass events
78     class RegistrationCallback : public SGReferenced {
79     public:
80         virtual ~RegistrationCallback();
81         virtual void startRegistration(HLAObjectClass& objectClass) = 0;
82         virtual void stopRegistration(HLAObjectClass& objectClass) = 0;
83     };
84
85     void setRegistrationCallback(const SGSharedPtr<RegistrationCallback>& registrationCallback)
86     { _registrationCallback = registrationCallback; }
87     const SGSharedPtr<RegistrationCallback>& getRegistrationCallback() const
88     { return _registrationCallback; }
89
90     // Is called by the default registration callback if installed
91     void startRegistration() const;
92     void stopRegistration() const;
93
94 protected:
95     virtual HLAObjectInstance* createObjectInstance(RTIObjectInstance* rtiObjectInstance);
96
97 private:
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);
103
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;
108
109     void startRegistrationCallback();
110     void stopRegistrationCallback();
111     friend class HLAObjectInstance;
112     friend class RTIObjectClass;
113
114     // The object class name
115     std::string _name;
116
117     // The underlying rti dispatcher class
118     SGSharedPtr<RTIObjectClass> _rtiObjectClass;
119
120     // Callback classes
121     SGSharedPtr<InstanceCallback> _instanceCallback;
122     SGSharedPtr<RegistrationCallback> _registrationCallback;
123
124     // The set of active objects
125     typedef std::set<SGSharedPtr<HLAObjectInstance> > ObjectInstanceSet;
126     ObjectInstanceSet _objectInstanceSet;
127 };
128
129 } // namespace simgear
130
131 #endif