]> git.mxchange.org Git - simgear.git/blob - simgear/hla/HLAObjectClass.hxx
Make tsync part of libSimGearCore when building shared libraries
[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 #include "HLATypes.hxx"
28
29 namespace simgear {
30
31 class RTIObjectClass;
32 class HLAFederate;
33
34 class HLAObjectClass : public SGWeakReferenced {
35 public:
36     HLAObjectClass(const std::string& name, HLAFederate& federate);
37     virtual ~HLAObjectClass();
38
39     const std::string& getName() const
40     { return _name; }
41
42     unsigned getNumAttributes() const;
43     unsigned getAttributeIndex(const std::string& name) const;
44     std::string getAttributeName(unsigned index) const;
45
46     const HLADataType* getAttributeDataType(unsigned index) const;
47     void setAttributeDataType(unsigned index, const HLADataType*);
48
49     HLAUpdateType getAttributeUpdateType(unsigned index) const;
50     void setAttributeUpdateType(unsigned index, HLAUpdateType updateType);
51
52     HLADataElement::IndexPathPair getIndexPathPair(const HLADataElement::StringPathPair&) const;
53     HLADataElement::IndexPathPair getIndexPathPair(const std::string& path) const;
54
55     bool subscribe(const std::set<unsigned>& indexSet, bool active);
56     bool unsubscribe();
57
58     bool publish(const std::set<unsigned>& indexSet);
59     bool unpublish();
60
61     // Object instance creation and destruction
62     class InstanceCallback : public SGReferenced {
63     public:
64         virtual ~InstanceCallback();
65
66         virtual void discoverInstance(const HLAObjectClass& objectClass, HLAObjectInstance& objectInstance, const RTIData& tag);
67         virtual void removeInstance(const HLAObjectClass& objectClass, HLAObjectInstance& objectInstance, const RTIData& tag);
68
69         virtual void registerInstance(const HLAObjectClass& objectClass, HLAObjectInstance& objectInstance);
70         virtual void deleteInstance(const HLAObjectClass& objectClass, HLAObjectInstance& objectInstance);
71     };
72
73     void setInstanceCallback(const SGSharedPtr<InstanceCallback>& instanceCallback)
74     { _instanceCallback = instanceCallback; }
75     const SGSharedPtr<InstanceCallback>& getInstanceCallback() const
76     { return _instanceCallback; }
77
78     // Handles startRegistrationForObjectClass and stopRegistrationForObjectClass events
79     class RegistrationCallback : public SGReferenced {
80     public:
81         virtual ~RegistrationCallback();
82         virtual void startRegistration(HLAObjectClass& objectClass) = 0;
83         virtual void stopRegistration(HLAObjectClass& objectClass) = 0;
84     };
85
86     void setRegistrationCallback(const SGSharedPtr<RegistrationCallback>& registrationCallback)
87     { _registrationCallback = registrationCallback; }
88     const SGSharedPtr<RegistrationCallback>& getRegistrationCallback() const
89     { return _registrationCallback; }
90
91     // Is called by the default registration callback if installed
92     void startRegistration() const;
93     void stopRegistration() const;
94
95 protected:
96     virtual HLAObjectInstance* createObjectInstance(RTIObjectInstance* rtiObjectInstance);
97
98 private:
99     HLAObjectClass(const HLAObjectClass&);
100     HLAObjectClass& operator=(const HLAObjectClass&);
101
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);
107
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;
112
113     void startRegistrationCallback();
114     void stopRegistrationCallback();
115     friend class HLAObjectInstance;
116     friend class RTIObjectClass;
117
118     // The object class name
119     std::string _name;
120
121     // The underlying rti dispatcher class
122     SGSharedPtr<RTIObjectClass> _rtiObjectClass;
123
124     // Callback classes
125     SGSharedPtr<InstanceCallback> _instanceCallback;
126     SGSharedPtr<RegistrationCallback> _registrationCallback;
127
128     // The set of active objects
129     typedef std::set<SGSharedPtr<HLAObjectInstance> > ObjectInstanceSet;
130     ObjectInstanceSet _objectInstanceSet;
131 };
132
133 } // namespace simgear
134
135 #endif