]> git.mxchange.org Git - simgear.git/blob - simgear/hla/HLAObjectClass.hxx
hla: Initially request update for subscribed unowned attributes.
[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     HLAObjectClass(const HLAObjectClass&);
99     HLAObjectClass& operator=(const HLAObjectClass&);
100
101     // The internal entry points from the RTILObjectClass callback functions
102     void discoverInstance(RTIObjectInstance* objectInstance, const RTIData& tag);
103     void removeInstance(HLAObjectInstance& objectInstance, const RTIData& tag);
104     void registerInstance(HLAObjectInstance& objectInstance);
105     void deleteInstance(HLAObjectInstance& objectInstance);
106
107     void discoverInstanceCallback(HLAObjectInstance& objectInstance, const RTIData& tag) const;
108     void removeInstanceCallback(HLAObjectInstance& objectInstance, const RTIData& tag) const;
109     void registerInstanceCallback(HLAObjectInstance& objectInstance) const;
110     void deleteInstanceCallback(HLAObjectInstance& objectInstance) const;
111
112     void startRegistrationCallback();
113     void stopRegistrationCallback();
114     friend class HLAObjectInstance;
115     friend class RTIObjectClass;
116
117     // The object class name
118     std::string _name;
119
120     // The underlying rti dispatcher class
121     SGSharedPtr<RTIObjectClass> _rtiObjectClass;
122
123     // Callback classes
124     SGSharedPtr<InstanceCallback> _instanceCallback;
125     SGSharedPtr<RegistrationCallback> _registrationCallback;
126
127     // The set of active objects
128     typedef std::set<SGSharedPtr<HLAObjectInstance> > ObjectInstanceSet;
129     ObjectInstanceSet _objectInstanceSet;
130 };
131
132 } // namespace simgear
133
134 #endif