Compare commits
384 Commits
2.2.0-rc1
...
version/2.
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
b20a49b018 | ||
|
|
5a6b760847 | ||
|
|
7e2dc443ec | ||
|
|
21f2e1f250 | ||
|
|
cee8c5b5c7 | ||
|
|
7ee2633164 | ||
|
|
6c31a721b8 | ||
|
|
8fc97ea1ce | ||
|
|
423eba3733 | ||
|
|
49a23fdc2e | ||
|
|
fddac2443d | ||
|
|
182037ad67 | ||
|
|
5923956045 | ||
|
|
a89b9f6158 | ||
|
|
d7931a28ce | ||
|
|
cc47d33b32 | ||
|
|
68625e48b9 | ||
|
|
3496d64a52 | ||
|
|
f97ced2240 | ||
|
|
3d44f1c825 | ||
|
|
306c58e7ed | ||
|
|
82588b0daf | ||
|
|
aef8f13290 | ||
|
|
4ae7c90d49 | ||
|
|
cc2234bf54 | ||
|
|
368d280da2 | ||
|
|
4faf727f1b | ||
|
|
f28e472f59 | ||
|
|
69c5d5c86e | ||
|
|
f9332b813e | ||
|
|
052ce499c9 | ||
|
|
54db2e0ab1 | ||
|
|
b261836f71 | ||
|
|
a0290954d6 | ||
|
|
112eb04079 | ||
|
|
057cbe7cc3 | ||
|
|
945a9e0ac2 | ||
|
|
a92ea7f822 | ||
|
|
b57b223a59 | ||
|
|
f377c75dbd | ||
|
|
8d3de8dee5 | ||
|
|
cfdf992600 | ||
|
|
fd8c677b87 | ||
|
|
ff2eb6d2d3 | ||
|
|
97fcf48caa | ||
|
|
e17b3a753e | ||
|
|
865b0a3e56 | ||
|
|
0d1ddc5f44 | ||
|
|
6780a0c8d4 | ||
|
|
fee652d54a | ||
|
|
42b7c48671 | ||
|
|
75afee59c3 | ||
|
|
ae3f718fe3 | ||
|
|
4b02335637 | ||
|
|
7a52c2fa71 | ||
|
|
ec5d067d28 | ||
|
|
3c9fec78fa | ||
|
|
0a08ee836c | ||
|
|
5f804cb0eb | ||
|
|
a0fd942048 | ||
|
|
dad1577fe3 | ||
|
|
338f2311d4 | ||
|
|
27a1c0288b | ||
|
|
dd45be518f | ||
|
|
a9c058ba9d | ||
|
|
3e07423778 | ||
|
|
63ccb3df4c | ||
|
|
906ef85d90 | ||
|
|
895edf4f17 | ||
|
|
ff1c035d42 | ||
|
|
f61fe80f60 | ||
|
|
dfbdcc1bf0 | ||
|
|
b09636f5ca | ||
|
|
8727e609f0 | ||
|
|
40fc2907a1 | ||
|
|
81fd5535fc | ||
|
|
ad079b8ed4 | ||
|
|
a543560f7d | ||
|
|
bb2cc6ef2d | ||
|
|
977f23f0e7 | ||
|
|
24c047c94e | ||
|
|
22b4aa4d8b | ||
|
|
110753e92c | ||
|
|
be70656745 | ||
|
|
d36e13e8ed | ||
|
|
2e9896a9ab | ||
|
|
ee06ec0c40 | ||
|
|
aa0e3e3c9f | ||
|
|
3477e1a4f5 | ||
|
|
a4b788980c | ||
|
|
519a843340 | ||
|
|
269299d913 | ||
|
|
cc4b16b50d | ||
|
|
d10bcc8a53 | ||
|
|
92db9682e0 | ||
|
|
cd773e4764 | ||
|
|
f14ffd5b1d | ||
|
|
e34f597fe2 | ||
|
|
95ddc04a73 | ||
|
|
c6d5cbd52c | ||
|
|
75b695664a | ||
|
|
59ecf48b72 | ||
|
|
2fb13c76f5 | ||
|
|
7438aea869 | ||
|
|
83772c87ac | ||
|
|
6250f675db | ||
|
|
a31639682b | ||
|
|
576979c562 | ||
|
|
c53989adb8 | ||
|
|
a1bb62f43c | ||
|
|
5eec2e7889 | ||
|
|
f4bb236c04 | ||
|
|
c82df0590d | ||
|
|
43e13f0cf2 | ||
|
|
63a8209a83 | ||
|
|
7984f055e2 | ||
|
|
3104898c7c | ||
|
|
8cb716fe8e | ||
|
|
9cdf5ab9a1 | ||
|
|
bcf7ed501d | ||
|
|
09b0dd2b2d | ||
|
|
04a47dfb8d | ||
|
|
bc9b3f6ff1 | ||
|
|
086a30e61a | ||
|
|
cd8e7a1030 | ||
|
|
8e92c5d985 | ||
|
|
5708ec5a89 | ||
|
|
f665431132 | ||
|
|
9e27511ef9 | ||
|
|
344f876b0a | ||
|
|
10217a3b19 | ||
|
|
778cc4c435 | ||
|
|
bd999ca090 | ||
|
|
4d9980b0e6 | ||
|
|
a459b8fdbb | ||
|
|
c925c02e69 | ||
|
|
4566bece90 | ||
|
|
403b7c14aa | ||
|
|
b3e07077fa | ||
|
|
f7cee2ed56 | ||
|
|
b7173100c8 | ||
|
|
cb496379bc | ||
|
|
c37b9c95e6 | ||
|
|
919e01f26e | ||
|
|
cad21935d6 | ||
|
|
d290fdfc5f | ||
|
|
c77161e2b0 | ||
|
|
d2dfb81a09 | ||
|
|
4acf7ce840 | ||
|
|
2f6b84a2cc | ||
|
|
2c00a4ac35 | ||
|
|
c27ca18674 | ||
|
|
7c7f3d4fcd | ||
|
|
8fba4b0cbe | ||
|
|
b0015ab6e8 | ||
|
|
3a210d6fa6 | ||
|
|
b5a4a55370 | ||
|
|
35a449c7d0 | ||
|
|
1305e16425 | ||
|
|
08003ceba9 | ||
|
|
059db643bc | ||
|
|
39731debdc | ||
|
|
9ef56cbc48 | ||
|
|
becea84955 | ||
|
|
ceac7b46fc | ||
|
|
594095a363 | ||
|
|
3397066343 | ||
|
|
d1d8c68bf1 | ||
|
|
d37bf8a4ae | ||
|
|
e4e31be7d4 | ||
|
|
5ede8c12ba | ||
|
|
db509f4075 | ||
|
|
85e58b4a49 | ||
|
|
64b6a4ebf2 | ||
|
|
a0c48de39d | ||
|
|
d9a281c493 | ||
|
|
eb52f38c47 | ||
|
|
c1f51d5be7 | ||
|
|
08cb2039c5 | ||
|
|
6485ea4051 | ||
|
|
aa9e91f926 | ||
|
|
70ac6614e8 | ||
|
|
64ce231705 | ||
|
|
7a98f89e1b | ||
|
|
264e336a49 | ||
|
|
595328963a | ||
|
|
d951a55be0 | ||
|
|
7ffc84fb86 | ||
|
|
5871b54172 | ||
|
|
92976b7735 | ||
|
|
2e13c1fa4b | ||
|
|
b5134f15b4 | ||
|
|
bcb320b537 | ||
|
|
1475964145 | ||
|
|
1802ccf374 | ||
|
|
3849de1931 | ||
|
|
1a46974cb9 | ||
|
|
25918b8b76 | ||
|
|
20bd0737a2 | ||
|
|
31fdfbaf38 | ||
|
|
8428cae1c8 | ||
|
|
65ae34169d | ||
|
|
ecff995e7c | ||
|
|
40dc9ff95e | ||
|
|
24a421c83e | ||
|
|
b204b3c8eb | ||
|
|
34738bb20a | ||
|
|
1b1068248d | ||
|
|
9f684978cf | ||
|
|
747717e2ee | ||
|
|
ed7f2df04e | ||
|
|
b159a72ce9 | ||
|
|
29faf13afd | ||
|
|
427d6c3316 | ||
|
|
eafea28266 | ||
|
|
1cb9a79fd4 | ||
|
|
959791ffde | ||
|
|
a5775cdb94 | ||
|
|
05272d1070 | ||
|
|
b5d2cfdbea | ||
|
|
e716f82670 | ||
|
|
dc5af66748 | ||
|
|
40e177a02e | ||
|
|
36a8243f73 | ||
|
|
d90647e9ba | ||
|
|
c7152af191 | ||
|
|
2f9ba31b0a | ||
|
|
ef48baafcc | ||
|
|
1227bd4898 | ||
|
|
09e610b900 | ||
|
|
b317520543 | ||
|
|
25c3881782 | ||
|
|
27e8916843 | ||
|
|
fa27207351 | ||
|
|
3753d50992 | ||
|
|
b7654c181d | ||
|
|
50e226a146 | ||
|
|
991f28906e | ||
|
|
f18a9493b3 | ||
|
|
bca9a787f6 | ||
|
|
9699d76dcb | ||
|
|
5f07efa12a | ||
|
|
a175033e3b | ||
|
|
878b504f8e | ||
|
|
669ab640da | ||
|
|
2f381c22e3 | ||
|
|
ee06c12374 | ||
|
|
225c2803ac | ||
|
|
1e0bd6717e | ||
|
|
33c84965ad | ||
|
|
a668e47fa1 | ||
|
|
c95d76266a | ||
|
|
902948e3c6 | ||
|
|
2805a2d0cc | ||
|
|
410c5ae919 | ||
|
|
7525fd5e3e | ||
|
|
55208d7d1f | ||
|
|
88e2cdd283 | ||
|
|
6ac69b604e | ||
|
|
76ba747706 | ||
|
|
469c0242d4 | ||
|
|
115531e944 | ||
|
|
6edfacbf4e | ||
|
|
a2249becba | ||
|
|
b53c53d9d8 | ||
|
|
13736219ff | ||
|
|
3ac5ff0cac | ||
|
|
19119cc4ae | ||
|
|
38ac7b41ad | ||
|
|
b47d1ad5fd | ||
|
|
45f642c4e4 | ||
|
|
04dc28cb33 | ||
|
|
f7e9d79322 | ||
|
|
5c6076d72d | ||
|
|
ee1901225b | ||
|
|
b61ba449fb | ||
|
|
d53e2fa8c1 | ||
|
|
20ac2dcd04 | ||
|
|
ac7db26f17 | ||
|
|
4a65a23706 | ||
|
|
425d83c497 | ||
|
|
a7d338a58e | ||
|
|
6a612972e2 | ||
|
|
f06f25532c | ||
|
|
116c487384 | ||
|
|
5f70abb16d | ||
|
|
c17110f6e7 | ||
|
|
69cbc2feb5 | ||
|
|
feb0b83365 | ||
|
|
03796f2337 | ||
|
|
d4f5a35e87 | ||
|
|
da707f3e40 | ||
|
|
59a6fd1ed8 | ||
|
|
8c8d9e5cc4 | ||
|
|
d36170879c | ||
|
|
204e483c08 | ||
|
|
f582eb5310 | ||
|
|
6f9a14d6c4 | ||
|
|
76fcad0a0b | ||
|
|
cc06799838 | ||
|
|
8a26c382a2 | ||
|
|
22198d8bd2 | ||
|
|
d534dcadfb | ||
|
|
708ae35068 | ||
|
|
50cea4f64e | ||
|
|
c782a32076 | ||
|
|
edc877442f | ||
|
|
a1fe0f6305 | ||
|
|
cb5aee9fa4 | ||
|
|
9b18b14f11 | ||
|
|
0fd7bb8d3f | ||
|
|
c836018ac7 | ||
|
|
ba678eabdc | ||
|
|
9442d3d0f3 | ||
|
|
9f0313dd0b | ||
|
|
3d109f9c4c | ||
|
|
f8a337fb9f | ||
|
|
3c0966279c | ||
|
|
c033979130 | ||
|
|
c828961327 | ||
|
|
83a95a0488 | ||
|
|
f3c131ffaf | ||
|
|
b06e38699a | ||
|
|
3a07e2fe21 | ||
|
|
ca668f8a37 | ||
|
|
5181aecc7b | ||
|
|
0e92cfbd0d | ||
|
|
60c7507a33 | ||
|
|
c7c3fae5c2 | ||
|
|
4acbb2a312 | ||
|
|
4e6159aa07 | ||
|
|
6a1d05646c | ||
|
|
2e05043f43 | ||
|
|
1b8216e911 | ||
|
|
a2121b86df | ||
|
|
1cd17e9edd | ||
|
|
5229f5a13c | ||
|
|
4ff014d275 | ||
|
|
83243f471a | ||
|
|
3c0c51a946 | ||
|
|
08ad449774 | ||
|
|
eae1b99036 | ||
|
|
44f27b23d0 | ||
|
|
92c83bc280 | ||
|
|
10bbd435b7 | ||
|
|
2ef8672a6b | ||
|
|
a22dd264cd | ||
|
|
baf5116841 | ||
|
|
e55017bbfc | ||
|
|
19636bda4e | ||
|
|
83124e0c05 | ||
|
|
a079870bca | ||
|
|
ce71b8c1cf | ||
|
|
7b0c25f91e | ||
|
|
feab25d0be | ||
|
|
956b4406d0 | ||
|
|
3a0fbae4d9 | ||
|
|
f106dc2a29 | ||
|
|
252a539e69 | ||
|
|
df6badfdd5 | ||
|
|
7479ae521c | ||
|
|
416fb94ae8 | ||
|
|
3a620fe55d | ||
|
|
5208750cdb | ||
|
|
c684f8f043 | ||
|
|
73084863b7 | ||
|
|
503310cdb8 | ||
|
|
bda8d34c2b | ||
|
|
2ee87483f9 | ||
|
|
9e04bf1ece | ||
|
|
29c8c9f989 | ||
|
|
1035e714ff | ||
|
|
57fa022c9f | ||
|
|
76c3f7bc8f | ||
|
|
6d2646239e | ||
|
|
c955e61ba7 | ||
|
|
c31a5279af | ||
|
|
840780dc4a | ||
|
|
02b3c37b9f | ||
|
|
d14fe813a9 | ||
|
|
44ff23b227 | ||
|
|
257459abc6 | ||
|
|
e988dc0e42 | ||
|
|
7d544dee47 |
23
.gitignore
vendored
23
.gitignore
vendored
@@ -1,17 +1,16 @@
|
||||
Makefile
|
||||
Makefile.in
|
||||
.deps
|
||||
autom4te.cache
|
||||
config.guess
|
||||
config.log
|
||||
config.status
|
||||
config.sub
|
||||
configure
|
||||
depcomp
|
||||
install-sh
|
||||
missing
|
||||
aclocal.m4
|
||||
INSTALL
|
||||
SimGear.spec
|
||||
*.o
|
||||
lib*.a
|
||||
.*.swp
|
||||
cmake_install.cmake
|
||||
CMakeFiles
|
||||
CMakeCache.txt
|
||||
CPackConfig.cmake
|
||||
CPackSourceConfig.cmake
|
||||
cmake_uninstall.cmake
|
||||
CTestTestfile.cmake
|
||||
install_manifest.txt
|
||||
build
|
||||
Build
|
||||
|
||||
189
CMakeLists.txt
189
CMakeLists.txt
@@ -1,34 +1,111 @@
|
||||
cmake_minimum_required (VERSION 2.6)
|
||||
cmake_minimum_required (VERSION 2.6.4)
|
||||
include (CheckFunctionExists)
|
||||
include (CheckIncludeFile)
|
||||
include (CheckCXXSourceCompiles)
|
||||
include (CPack)
|
||||
|
||||
|
||||
project(SimGear)
|
||||
|
||||
set(SIMGEAR_VERSION "2.2.0")
|
||||
# read 'version' file into a variable (stripping any newlines or spaces)
|
||||
file(READ version versionFile)
|
||||
string(STRIP ${versionFile} SIMGEAR_VERSION)
|
||||
|
||||
# use simgear version also as the SO version (if building SOs)
|
||||
SET(SIMGEAR_SOVERSION ${SIMGEAR_VERSION})
|
||||
|
||||
#packaging
|
||||
SET(CPACK_RESOURCE_FILE_LICENSE "${PROJECT_SOURCE_DIR}/COPYING")
|
||||
SET(CPACK_RESOURCE_FILE_README "${PROJECT_SOURCE_DIR}/README")
|
||||
SET(CPACK_PACKAGE_DESCRIPTION_SUMMARY "Simulation support libraries for FlightGear and related projects")
|
||||
SET(CPACK_PACKAGE_VENDOR "The FlightGear project")
|
||||
SET(CPACK_GENERATOR "TBZ2")
|
||||
SET(CPACK_INSTALL_CMAKE_PROJECTS ${CMAKE_CURRENT_BINARY_DIR};SimGear;ALL;/)
|
||||
|
||||
|
||||
# split version string into components, note CMAKE_MATCH_0 is the entire regexp match
|
||||
string(REGEX MATCH "([0-9]+)\\.([0-9]+)\\.([0-9]+)" CPACK_PACKAGE_VERSION ${SIMGEAR_VERSION} )
|
||||
set(CPACK_PACKAGE_VERSION_MAJOR ${CMAKE_MATCH_1})
|
||||
set(CPACK_PACKAGE_VERSION_MINOR ${CMAKE_MATCH_2})
|
||||
set(CPACK_PACKAGE_VERSION_PATCH ${CMAKE_MATCH_3})
|
||||
|
||||
message(STATUS "version is ${CPACK_PACKAGE_VERSION_MAJOR} dot ${CPACK_PACKAGE_VERSION_MINOR} dot ${CPACK_PACKAGE_VERSION_PATCH}")
|
||||
|
||||
set(CPACK_SOURCE_GENERATOR TBZ2)
|
||||
set(CPACK_SOURCE_PACKAGE_FILE_NAME "simgear-${SIMGEAR_VERSION}" CACHE INTERNAL "tarball basename")
|
||||
set(CPACK_SOURCE_IGNORE_FILES
|
||||
"^${PROJECT_SOURCE_DIR}/.git;\\\\.gitignore;Makefile.am;~$;${CPACK_SOURCE_IGNORE_FILES}")
|
||||
|
||||
message(STATUS "ignoring: ${CPACK_SOURCE_IGNORE_FILES}")
|
||||
|
||||
include (CPack)
|
||||
|
||||
# We have some custom .cmake scripts not in the official distribution.
|
||||
set(CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/CMakeModules;${CMAKE_MODULE_PATH}")
|
||||
|
||||
option(SIMGEAR_SHARED "Set to ON to build SimGear as a shared library/framework" OFF)
|
||||
option(SIMGEAR_HEADLESS "Set to ON to build SimGear with GUI/graphics support" OFF)
|
||||
option(JPEG_FACTORY "Enable JPEG-factory support" OFF)
|
||||
set(MSVC_3RDPARTY_DIR NOT_FOUND CACHE PATH "Location where the third-party dependencies are extracted")
|
||||
# Change the default build type to something fast
|
||||
if(NOT CMAKE_BUILD_TYPE)
|
||||
set(CMAKE_BUILD_TYPE Release CACHE STRING
|
||||
"Choose the type of build, options are: None Debug Release RelWithDebInfo MinSizeRel."
|
||||
FORCE)
|
||||
endif(NOT CMAKE_BUILD_TYPE)
|
||||
|
||||
if (MSVC_3RDPARTY_DIR)
|
||||
message(STATUS "3rdparty files located in ${MSVC_3RDPARTY_DIR}")
|
||||
set (CMAKE_LIBRARY_PATH ${MSVC_3RDPARTY_DIR}/3rdParty/lib ${MSVC_3RDPARTY_DIR}/install/msvc90/OpenScenegraph/lib )
|
||||
set (CMAKE_INCLUDE_PATH ${MSVC_3RDPARTY_DIR}/3rdParty/include ${MSVC_3RDPARTY_DIR}/install/msvc90/OpenScenegraph/include)
|
||||
set (BOOST_ROOT ${MSVC_3RDPARTY_DIR}/boost_1_44_0)
|
||||
set (OPENAL_INCLUDE_DIR ${MSVC_3RDPARTY_DIR}/3rdParty/include)
|
||||
set (ALUT_INCLUDE_DIR ${MSVC_3RDPARTY_DIR}/3rdParty/include)
|
||||
set (OPENAL_LIBRARY_DIR ${MSVC_3RDPARTY_DIR}/3rdParty/lib)
|
||||
endif (MSVC_3RDPARTY_DIR)
|
||||
# Determine name of library installation directory, i.e. "lib" vs "lib64", which
|
||||
# differs between all Debian-based vs all other Linux distros.
|
||||
# See cmake bug #11964, http://cmake.org/gitweb?p=cmake.git;a=commit;h=126c993d
|
||||
# GNUInstallDirs requires CMake >= 2.8.5, use own file for older cmake
|
||||
if(${CMAKE_VERSION} VERSION_GREATER 2.8.4)
|
||||
include(GNUInstallDirs)
|
||||
else(${CMAKE_VERSION} VERSION_GREATER 2.8.4)
|
||||
include(OldGNUInstallDirs)
|
||||
endif(${CMAKE_VERSION} VERSION_GREATER 2.8.4)
|
||||
message(STATUS "Library installation directory: ${CMAKE_INSTALL_LIBDIR}")
|
||||
|
||||
option(SIMGEAR_SHARED "Set to ON to build SimGear as a shared library/framework" OFF)
|
||||
option(SIMGEAR_HEADLESS "Set to ON to build SimGear without GUI/graphics support" OFF)
|
||||
option(JPEG_FACTORY "Enable JPEG-factory support" OFF)
|
||||
option(ENABLE_LIBSVN "Set to ON to build SimGear with libsvnclient support" ON)
|
||||
option(ENABLE_RTI "Set to ON to build SimGear with RTI support" OFF)
|
||||
option(ENABLE_TESTS "Set to OFF to disable building SimGear's test applications" ON)
|
||||
|
||||
if (MSVC)
|
||||
GET_FILENAME_COMPONENT(PARENT_DIR ${PROJECT_SOURCE_DIR} PATH)
|
||||
if (CMAKE_CL_64)
|
||||
SET(TEST_3RDPARTY_DIR "${PARENT_DIR}/3rdparty.x64")
|
||||
else (CMAKE_CL_64)
|
||||
SET(TEST_3RDPARTY_DIR "${PARENT_DIR}/3rdparty")
|
||||
endif (CMAKE_CL_64)
|
||||
if (EXISTS ${TEST_3RDPARTY_DIR})
|
||||
set(MSVC_3RDPARTY_ROOT ${PARENT_DIR} CACHE PATH "Location where the third-party dependencies are extracted")
|
||||
else (EXISTS ${TEST_3RDPARTY_DIR})
|
||||
set(MSVC_3RDPARTY_ROOT NOT_FOUND CACHE PATH "Location where the third-party dependencies are extracted")
|
||||
endif (EXISTS ${TEST_3RDPARTY_DIR})
|
||||
else (MSVC)
|
||||
set(MSVC_3RDPARTY_ROOT NOT_FOUND CACHE PATH "Location where the third-party dependencies are extracted")
|
||||
endif (MSVC)
|
||||
|
||||
if (MSVC AND MSVC_3RDPARTY_ROOT)
|
||||
message(STATUS "3rdparty files located in ${MSVC_3RDPARTY_ROOT}")
|
||||
set( OSG_MSVC "msvc" )
|
||||
if (${MSVC_VERSION} EQUAL 1600)
|
||||
set( OSG_MSVC ${OSG_MSVC}100 )
|
||||
else (${MSVC_VERSION} EQUAL 1600)
|
||||
set( OSG_MSVC ${OSG_MSVC}90 )
|
||||
endif (${MSVC_VERSION} EQUAL 1600)
|
||||
if (CMAKE_CL_64)
|
||||
set( OSG_MSVC ${OSG_MSVC}-64 )
|
||||
set( MSVC_3RDPARTY_DIR 3rdParty.x64 )
|
||||
else (CMAKE_CL_64)
|
||||
set( MSVC_3RDPARTY_DIR 3rdParty )
|
||||
endif (CMAKE_CL_64)
|
||||
|
||||
set (CMAKE_LIBRARY_PATH ${MSVC_3RDPARTY_ROOT}/${MSVC_3RDPARTY_DIR}/lib ${MSVC_3RDPARTY_ROOT}/install/${OSG_MSVC}/OpenScenegraph/lib )
|
||||
set (CMAKE_INCLUDE_PATH ${MSVC_3RDPARTY_ROOT}/${MSVC_3RDPARTY_DIR}/include ${MSVC_3RDPARTY_ROOT}/install/${OSG_MSVC}/OpenScenegraph/include)
|
||||
set (BOOST_ROOT ${MSVC_3RDPARTY_ROOT}/boost_1_44_0)
|
||||
message(STATUS "BOOST_ROOT is ${BOOST_ROOT}")
|
||||
set (OPENAL_INCLUDE_DIR ${MSVC_3RDPARTY_ROOT}/${MSVC_3RDPARTY_DIR}/include)
|
||||
set (ALUT_INCLUDE_DIR ${MSVC_3RDPARTY_ROOT}/${MSVC_3RDPARTY_DIR}/include)
|
||||
set (OPENAL_LIBRARY_DIR ${MSVC_3RDPARTY_ROOT}/${MSVC_3RDPARTY_DIR}/lib)
|
||||
endif (MSVC AND MSVC_3RDPARTY_ROOT)
|
||||
|
||||
find_package(Boost REQUIRED)
|
||||
set (BOOST_CXX_FLAGS "-DBOOST_MULTI_INDEX_DISABLE_SERIALIZATION -DBOOST_BIMAP_DISABLE_SERIALIZATION")
|
||||
@@ -36,36 +113,78 @@ set (BOOST_CXX_FLAGS "-DBOOST_MULTI_INDEX_DISABLE_SERIALIZATION -DBOOST_BIMAP_DI
|
||||
find_package(ZLIB REQUIRED)
|
||||
find_package(Threads REQUIRED)
|
||||
|
||||
if (${SIMGEAR_HEADLESS})
|
||||
message(STATUS "headlesss mode")
|
||||
if(SIMGEAR_HEADLESS)
|
||||
message(STATUS "headless mode")
|
||||
set(NO_OPENSCENEGRAPH_INTERFACE 1)
|
||||
else()
|
||||
find_package(OpenGL REQUIRED)
|
||||
find_package(OpenAL REQUIRED)
|
||||
find_package(ALUT REQUIRED)
|
||||
find_package(OpenSceneGraph 2.8.2 REQUIRED osgText osgSim osgDB osgParticle osgUtil)
|
||||
endif()
|
||||
find_package(OpenSceneGraph 3.0.0 REQUIRED osgText osgSim osgDB osgParticle osgUtil)
|
||||
endif(SIMGEAR_HEADLESS)
|
||||
|
||||
if(JPEG_FACTORY)
|
||||
message(STATUS "JPEG-factory enabled")
|
||||
find_package(JPEG REQUIRED)
|
||||
include_directories(${JPEG_INCLUDE_DIR})
|
||||
endif()
|
||||
endif(JPEG_FACTORY)
|
||||
|
||||
if(ENABLE_LIBSVN)
|
||||
find_package(SvnClient)
|
||||
|
||||
if(LIBSVN_FOUND)
|
||||
message(STATUS "libsvn found, enabling in SimGear")
|
||||
set(HAVE_SVN_CLIENT_H 1)
|
||||
set(HAVE_LIBSVN_CLIENT_1 1)
|
||||
else()
|
||||
message(STATUS "Missing libsvn, unable to enable SVN in SimGear")
|
||||
endif(LIBSVN_FOUND)
|
||||
endif(ENABLE_LIBSVN)
|
||||
|
||||
check_include_file(sys/time.h HAVE_SYS_TIME_H)
|
||||
check_include_file(sys/timeb.h HAVE_SYS_TIMEB_H)
|
||||
check_include_file(unistd.h HAVE_UNISTD_H)
|
||||
check_include_file(windows.h HAVE_WINDOWS_H)
|
||||
|
||||
if(ENABLE_RTI)
|
||||
# See if we have any rti library variant installed
|
||||
find_package(RTI)
|
||||
endif(ENABLE_RTI)
|
||||
|
||||
check_function_exists(gettimeofday HAVE_GETTIMEOFDAY)
|
||||
check_function_exists(ftime HAVE_FTIME)
|
||||
check_function_exists(timegm HAVE_TIMEGM)
|
||||
check_function_exists(rint HAVE_RINT)
|
||||
check_function_exists(mkdtemp HAVE_MKDTEMP)
|
||||
|
||||
SET(CMAKE_DEBUG_POSTFIX "d" CACHE STRING "add a postfix, usually d on windows")
|
||||
if(HAVE_UNISTD_H)
|
||||
set(CMAKE_REQUIRED_INCLUDES ${CMAKE_INCLUDE_PATH})
|
||||
check_cxx_source_compiles(
|
||||
"#include <unistd.h>
|
||||
#if !defined(_POSIX_TIMERS) || (0 >= _POSIX_TIMERS)
|
||||
#error clock_gettime is not supported
|
||||
#endif
|
||||
|
||||
int main() { return 0; }
|
||||
"
|
||||
HAVE_CLOCK_GETTIME)
|
||||
endif(HAVE_UNISTD_H)
|
||||
|
||||
set(RT_LIBRARY "")
|
||||
if(HAVE_CLOCK_GETTIME)
|
||||
check_function_exists(clock_gettime CLOCK_GETTIME_IN_LIBC)
|
||||
if(NOT CLOCK_GETTIME_IN_LIBC)
|
||||
check_library_exists(rt clock_gettime "" HAVE_RT)
|
||||
if(HAVE_RT)
|
||||
set(RT_LIBRARY rt)
|
||||
endif(HAVE_RT)
|
||||
endif(NOT CLOCK_GETTIME_IN_LIBC)
|
||||
endif(HAVE_CLOCK_GETTIME)
|
||||
|
||||
SET(CMAKE_DEBUG_POSTFIX "d" CACHE STRING "add a postfix, usually 'd' on windows")
|
||||
SET(CMAKE_RELEASE_POSTFIX "" CACHE STRING "add a postfix, usually empty on windows")
|
||||
SET(CMAKE_RELWITHDEBINFO_POSTFIX "rd" CACHE STRING "add a postfix, usually empty on windows")
|
||||
SET(CMAKE_MINSIZEREL_POSTFIX "s" CACHE STRING "add a postfix, usually empty on windows")
|
||||
SET(CMAKE_RELWITHDEBINFO_POSTFIX "" CACHE STRING "add a postfix, usually empty on windows")
|
||||
SET(CMAKE_MINSIZEREL_POSTFIX "" CACHE STRING "add a postfix, usually empty on windows")
|
||||
|
||||
# isnan might not be real symbol, so can't check using function_exists
|
||||
check_cxx_source_compiles(
|
||||
@@ -75,6 +194,13 @@ check_cxx_source_compiles(
|
||||
|
||||
if(CMAKE_COMPILER_IS_GNUCXX)
|
||||
set(WARNING_FLAGS -Wall)
|
||||
|
||||
# certain GCC versions don't provide the atomic builds, and hence
|
||||
# require is to provide them in SGAtomic.cxx
|
||||
set(CMAKE_REQUIRED_INCLUDES ${CMAKE_INCLUDE_PATH})
|
||||
check_cxx_source_compiles(
|
||||
"int main() { unsigned mValue; return __sync_add_and_fetch(&mValue, 1); }"
|
||||
GCC_ATOMIC_BUILTINS_FOUND)
|
||||
endif(CMAKE_COMPILER_IS_GNUCXX)
|
||||
|
||||
if(WIN32)
|
||||
@@ -85,11 +211,14 @@ if(WIN32)
|
||||
# SET(WARNING_FLAGS "${WARNING_FLAGS} /wd${warning}")
|
||||
# endforeach(warning)
|
||||
|
||||
set(MSVC_FLAGS "-DWIN32 -DNOMINMAX -D_USE_MATH_DEFINES -D_CRT_SECURE_NO_WARNINGS -D__CRT_NONSTDC_NO_WARNINGS")
|
||||
set(MSVC_FLAGS "-DWIN32 -DNOMINMAX -D_USE_MATH_DEFINES -D_CRT_SECURE_NO_WARNINGS -D__CRT_NONSTDC_NO_WARNINGS /wd4996")
|
||||
endif(MSVC)
|
||||
|
||||
# assumed on Windows
|
||||
set(HAVE_GETLOCALTIME 1)
|
||||
|
||||
set( WINSOCK_LIBRARY "ws2_32.lib" )
|
||||
set( RT_LIBRARY "winmm" )
|
||||
endif(WIN32)
|
||||
|
||||
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${WARNING_FLAGS} ${MSVC_FLAGS}")
|
||||
@@ -111,7 +240,14 @@ configure_file (
|
||||
"${PROJECT_SOURCE_DIR}/simgear/simgear_config_cmake.h.in"
|
||||
"${PROJECT_BINARY_DIR}/simgear/simgear_config.h"
|
||||
)
|
||||
|
||||
|
||||
if(ENABLE_TESTS)
|
||||
# enable CTest / make test target
|
||||
|
||||
include (Dart)
|
||||
enable_testing()
|
||||
endif(ENABLE_TESTS)
|
||||
|
||||
install (FILES ${PROJECT_BINARY_DIR}/simgear/simgear_config.h DESTINATION include/simgear/)
|
||||
add_subdirectory(simgear)
|
||||
|
||||
@@ -125,4 +261,3 @@ CONFIGURE_FILE(
|
||||
ADD_CUSTOM_TARGET(uninstall
|
||||
"${CMAKE_COMMAND}" -P "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake")
|
||||
|
||||
|
||||
|
||||
76
CMakeModules/FindSvnClient.cmake
Normal file
76
CMakeModules/FindSvnClient.cmake
Normal file
@@ -0,0 +1,76 @@
|
||||
# Find Subversion client libraries, and dependencies
|
||||
# including APR (Apache Portable Runtime)
|
||||
|
||||
include (CheckFunctionExists)
|
||||
include (CheckIncludeFile)
|
||||
include (CheckLibraryExists)
|
||||
|
||||
macro(find_static_component comp libs)
|
||||
# account for alternative Windows svn distribution naming
|
||||
if(MSVC)
|
||||
set(compLib "lib${comp}")
|
||||
else(MSVC)
|
||||
set(compLib "${comp}")
|
||||
endif(MSVC)
|
||||
|
||||
string(TOUPPER "${comp}" compLibBase)
|
||||
set( compLibName ${compLibBase}_LIBRARY )
|
||||
|
||||
FIND_LIBRARY(${compLibName}
|
||||
NAMES ${compLib}
|
||||
HINTS $ENV{PLIBDIR}
|
||||
PATH_SUFFIXES lib64 lib libs64 libs libs/Win32 libs/Win64
|
||||
PATHS
|
||||
/usr/local
|
||||
/usr
|
||||
/opt
|
||||
)
|
||||
|
||||
list(APPEND ${libs} ${${compLibName}})
|
||||
endmacro()
|
||||
|
||||
find_program(HAVE_APR_CONFIG apr-1-config)
|
||||
if(HAVE_APR_CONFIG)
|
||||
|
||||
execute_process(COMMAND apr-1-config --cppflags --includes
|
||||
OUTPUT_VARIABLE APR_CFLAGS
|
||||
OUTPUT_STRIP_TRAILING_WHITESPACE)
|
||||
|
||||
execute_process(COMMAND apr-1-config --link-ld
|
||||
OUTPUT_VARIABLE RAW_APR_LIBS
|
||||
OUTPUT_STRIP_TRAILING_WHITESPACE)
|
||||
|
||||
# clean up some vars, or other CMake pieces complain
|
||||
string(STRIP "${RAW_APR_LIBS}" APR_LIBS)
|
||||
|
||||
else(HAVE_APR_CONFIG)
|
||||
message(STATUS "apr-1-config not found, implement manual search for APR")
|
||||
endif(HAVE_APR_CONFIG)
|
||||
|
||||
if(HAVE_APR_CONFIG OR MSVC)
|
||||
find_path(LIBSVN_INCLUDE_DIR svn_client.h
|
||||
HINTS
|
||||
$ENV{LIBSVN_DIR}
|
||||
PATH_SUFFIXES include/subversion-1
|
||||
PATHS
|
||||
/usr/local
|
||||
/usr
|
||||
/opt
|
||||
)
|
||||
|
||||
set(LIBSVN_LIBRARIES "")
|
||||
if (MSVC)
|
||||
find_static_component("apr-1" LIBSVN_LIBRARIES)
|
||||
else (MSVC)
|
||||
list(APPEND LIBSVN_LIBRARIES ${APR_LIBS})
|
||||
endif (MSVC)
|
||||
find_static_component("svn_client-1" LIBSVN_LIBRARIES)
|
||||
find_static_component("svn_subr-1" LIBSVN_LIBRARIES)
|
||||
find_static_component("svn_ra-1" LIBSVN_LIBRARIES)
|
||||
|
||||
include(FindPackageHandleStandardArgs)
|
||||
FIND_PACKAGE_HANDLE_STANDARD_ARGS(LIBSVN DEFAULT_MSG LIBSVN_LIBRARIES LIBSVN_INCLUDE_DIR)
|
||||
if(NOT LIBSVN_FOUND)
|
||||
set(LIBSVN_LIBRARIES "")
|
||||
endif(NOT LIBSVN_FOUND)
|
||||
endif(HAVE_APR_CONFIG OR MSVC)
|
||||
182
CMakeModules/OldGNUInstallDirs.cmake
Normal file
182
CMakeModules/OldGNUInstallDirs.cmake
Normal file
@@ -0,0 +1,182 @@
|
||||
# - Define GNU standard installation directories
|
||||
# Provides install directory variables as defined for GNU software:
|
||||
# http://www.gnu.org/prep/standards/html_node/Directory-Variables.html
|
||||
# Inclusion of this module defines the following variables:
|
||||
# CMAKE_INSTALL_<dir> - destination for files of a given type
|
||||
# CMAKE_INSTALL_FULL_<dir> - corresponding absolute path
|
||||
# where <dir> is one of:
|
||||
# BINDIR - user executables (bin)
|
||||
# SBINDIR - system admin executables (sbin)
|
||||
# LIBEXECDIR - program executables (libexec)
|
||||
# SYSCONFDIR - read-only single-machine data (etc)
|
||||
# SHAREDSTATEDIR - modifiable architecture-independent data (com)
|
||||
# LOCALSTATEDIR - modifiable single-machine data (var)
|
||||
# LIBDIR - object code libraries (lib or lib64)
|
||||
# INCLUDEDIR - C header files (include)
|
||||
# OLDINCLUDEDIR - C header files for non-gcc (/usr/include)
|
||||
# DATAROOTDIR - read-only architecture-independent data root (share)
|
||||
# DATADIR - read-only architecture-independent data (DATAROOTDIR)
|
||||
# INFODIR - info documentation (DATAROOTDIR/info)
|
||||
# LOCALEDIR - locale-dependent data (DATAROOTDIR/locale)
|
||||
# MANDIR - man documentation (DATAROOTDIR/man)
|
||||
# DOCDIR - documentation root (DATAROOTDIR/doc/PROJECT_NAME)
|
||||
# Each CMAKE_INSTALL_<dir> value may be passed to the DESTINATION options of
|
||||
# install() commands for the corresponding file type. If the includer does
|
||||
# not define a value the above-shown default will be used and the value will
|
||||
# appear in the cache for editing by the user.
|
||||
# Each CMAKE_INSTALL_FULL_<dir> value contains an absolute path constructed
|
||||
# from the corresponding destination by prepending (if necessary) the value
|
||||
# of CMAKE_INSTALL_PREFIX.
|
||||
|
||||
#=============================================================================
|
||||
# Copyright 2011 Nikita Krupen'ko <krnekit@gmail.com>
|
||||
# Copyright 2011 Kitware, Inc.
|
||||
#
|
||||
# Distributed under the OSI-approved BSD License (the "License");
|
||||
# see accompanying file Copyright.txt for details.
|
||||
#
|
||||
# This software is distributed WITHOUT ANY WARRANTY; without even the
|
||||
# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
# See the License for more information.
|
||||
#=============================================================================
|
||||
# (To distribute this file outside of CMake, substitute the full
|
||||
# License text for the above reference.)
|
||||
|
||||
# Installation directories
|
||||
#
|
||||
if(NOT DEFINED CMAKE_INSTALL_BINDIR)
|
||||
set(CMAKE_INSTALL_BINDIR "bin" CACHE PATH "user executables (bin)")
|
||||
endif()
|
||||
|
||||
if(NOT DEFINED CMAKE_INSTALL_SBINDIR)
|
||||
set(CMAKE_INSTALL_SBINDIR "sbin" CACHE PATH "system admin executables (sbin)")
|
||||
endif()
|
||||
|
||||
if(NOT DEFINED CMAKE_INSTALL_LIBEXECDIR)
|
||||
set(CMAKE_INSTALL_LIBEXECDIR "libexec" CACHE PATH "program executables (libexec)")
|
||||
endif()
|
||||
|
||||
if(NOT DEFINED CMAKE_INSTALL_SYSCONFDIR)
|
||||
set(CMAKE_INSTALL_SYSCONFDIR "etc" CACHE PATH "read-only single-machine data (etc)")
|
||||
endif()
|
||||
|
||||
if(NOT DEFINED CMAKE_INSTALL_SHAREDSTATEDIR)
|
||||
set(CMAKE_INSTALL_SHAREDSTATEDIR "com" CACHE PATH "modifiable architecture-independent data (com)")
|
||||
endif()
|
||||
|
||||
if(NOT DEFINED CMAKE_INSTALL_LOCALSTATEDIR)
|
||||
set(CMAKE_INSTALL_LOCALSTATEDIR "var" CACHE PATH "modifiable single-machine data (var)")
|
||||
endif()
|
||||
|
||||
if(NOT DEFINED CMAKE_INSTALL_LIBDIR)
|
||||
set(_LIBDIR_DEFAULT "lib")
|
||||
# Override this default 'lib' with 'lib64' iff:
|
||||
# - we are on Linux system but NOT cross-compiling
|
||||
# - we are NOT on debian
|
||||
# - we are on a 64 bits system
|
||||
# reason is: amd64 ABI: http://www.x86-64.org/documentation/abi.pdf
|
||||
# Note that the future of multi-arch handling may be even
|
||||
# more complicated than that: http://wiki.debian.org/Multiarch
|
||||
if(CMAKE_SYSTEM_NAME MATCHES "Linux"
|
||||
AND NOT CMAKE_CROSSCOMPILING
|
||||
AND NOT EXISTS "/etc/debian_version")
|
||||
if(NOT DEFINED CMAKE_SIZEOF_VOID_P)
|
||||
message(AUTHOR_WARNING
|
||||
"Unable to determine default CMAKE_INSTALL_LIBDIR directory because no target architecture is known. "
|
||||
"Please enable at least one language before including GNUInstallDirs.")
|
||||
else()
|
||||
if("${CMAKE_SIZEOF_VOID_P}" EQUAL "8")
|
||||
set(_LIBDIR_DEFAULT "lib64")
|
||||
endif()
|
||||
endif()
|
||||
endif()
|
||||
set(CMAKE_INSTALL_LIBDIR "${_LIBDIR_DEFAULT}" CACHE PATH "object code libraries (${_LIBDIR_DEFAULT})")
|
||||
endif()
|
||||
|
||||
if(NOT DEFINED CMAKE_INSTALL_INCLUDEDIR)
|
||||
set(CMAKE_INSTALL_INCLUDEDIR "include" CACHE PATH "C header files (include)")
|
||||
endif()
|
||||
|
||||
if(NOT DEFINED CMAKE_INSTALL_OLDINCLUDEDIR)
|
||||
set(CMAKE_INSTALL_OLDINCLUDEDIR "/usr/include" CACHE PATH "C header files for non-gcc (/usr/include)")
|
||||
endif()
|
||||
|
||||
if(NOT DEFINED CMAKE_INSTALL_DATAROOTDIR)
|
||||
set(CMAKE_INSTALL_DATAROOTDIR "share" CACHE PATH "read-only architecture-independent data root (share)")
|
||||
endif()
|
||||
|
||||
#-----------------------------------------------------------------------------
|
||||
# Values whose defaults are relative to DATAROOTDIR. Store empty values in
|
||||
# the cache and store the defaults in local variables if the cache values are
|
||||
# not set explicitly. This auto-updates the defaults as DATAROOTDIR changes.
|
||||
|
||||
if(NOT CMAKE_INSTALL_DATADIR)
|
||||
set(CMAKE_INSTALL_DATADIR "" CACHE PATH "read-only architecture-independent data (DATAROOTDIR)")
|
||||
set(CMAKE_INSTALL_DATADIR "${CMAKE_INSTALL_DATAROOTDIR}")
|
||||
endif()
|
||||
|
||||
if(NOT CMAKE_INSTALL_INFODIR)
|
||||
set(CMAKE_INSTALL_INFODIR "" CACHE PATH "info documentation (DATAROOTDIR/info)")
|
||||
set(CMAKE_INSTALL_INFODIR "${CMAKE_INSTALL_DATAROOTDIR}/info")
|
||||
endif()
|
||||
|
||||
if(NOT CMAKE_INSTALL_LOCALEDIR)
|
||||
set(CMAKE_INSTALL_LOCALEDIR "" CACHE PATH "locale-dependent data (DATAROOTDIR/locale)")
|
||||
set(CMAKE_INSTALL_LOCALEDIR "${CMAKE_INSTALL_DATAROOTDIR}/locale")
|
||||
endif()
|
||||
|
||||
if(NOT CMAKE_INSTALL_MANDIR)
|
||||
set(CMAKE_INSTALL_MANDIR "" CACHE PATH "man documentation (DATAROOTDIR/man)")
|
||||
set(CMAKE_INSTALL_MANDIR "${CMAKE_INSTALL_DATAROOTDIR}/man")
|
||||
endif()
|
||||
|
||||
if(NOT CMAKE_INSTALL_DOCDIR)
|
||||
set(CMAKE_INSTALL_DOCDIR "" CACHE PATH "documentation root (DATAROOTDIR/doc/PROJECT_NAME)")
|
||||
set(CMAKE_INSTALL_DOCDIR "${CMAKE_INSTALL_DATAROOTDIR}/doc/${PROJECT_NAME}")
|
||||
endif()
|
||||
|
||||
#-----------------------------------------------------------------------------
|
||||
|
||||
mark_as_advanced(
|
||||
CMAKE_INSTALL_BINDIR
|
||||
CMAKE_INSTALL_SBINDIR
|
||||
CMAKE_INSTALL_LIBEXECDIR
|
||||
CMAKE_INSTALL_SYSCONFDIR
|
||||
CMAKE_INSTALL_SHAREDSTATEDIR
|
||||
CMAKE_INSTALL_LOCALSTATEDIR
|
||||
CMAKE_INSTALL_LIBDIR
|
||||
CMAKE_INSTALL_INCLUDEDIR
|
||||
CMAKE_INSTALL_OLDINCLUDEDIR
|
||||
CMAKE_INSTALL_DATAROOTDIR
|
||||
CMAKE_INSTALL_DATADIR
|
||||
CMAKE_INSTALL_INFODIR
|
||||
CMAKE_INSTALL_LOCALEDIR
|
||||
CMAKE_INSTALL_MANDIR
|
||||
CMAKE_INSTALL_DOCDIR
|
||||
)
|
||||
|
||||
# Result directories
|
||||
#
|
||||
foreach(dir
|
||||
BINDIR
|
||||
SBINDIR
|
||||
LIBEXECDIR
|
||||
SYSCONFDIR
|
||||
SHAREDSTATEDIR
|
||||
LOCALSTATEDIR
|
||||
LIBDIR
|
||||
INCLUDEDIR
|
||||
OLDINCLUDEDIR
|
||||
DATAROOTDIR
|
||||
DATADIR
|
||||
INFODIR
|
||||
LOCALEDIR
|
||||
MANDIR
|
||||
DOCDIR
|
||||
)
|
||||
if(NOT IS_ABSOLUTE ${CMAKE_INSTALL_${dir}})
|
||||
set(CMAKE_INSTALL_FULL_${dir} "${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_${dir}}")
|
||||
else()
|
||||
set(CMAKE_INSTALL_FULL_${dir} "${CMAKE_INSTALL_${dir}}")
|
||||
endif()
|
||||
endforeach()
|
||||
@@ -1,10 +1,10 @@
|
||||
|
||||
macro(simgear_component name includePath sources headers)
|
||||
|
||||
macro(simgear_component_common name includePath sourcesList sources headers)
|
||||
if (SIMGEAR_SHARED)
|
||||
|
||||
foreach(s ${sources})
|
||||
set_property(GLOBAL
|
||||
APPEND PROPERTY ALL_SOURCES "${CMAKE_CURRENT_SOURCE_DIR}/${s}")
|
||||
APPEND PROPERTY ${sourcesList} "${CMAKE_CURRENT_SOURCE_DIR}/${s}")
|
||||
endforeach()
|
||||
|
||||
foreach(h ${headers})
|
||||
@@ -14,10 +14,18 @@ macro(simgear_component name includePath sources headers)
|
||||
|
||||
else()
|
||||
set(libName "sg${name}")
|
||||
add_library(${libName} STATIC ${sources} )
|
||||
add_library(${libName} STATIC ${sources} ${headers})
|
||||
|
||||
install (TARGETS ${libName} ARCHIVE DESTINATION lib${LIB_SUFFIX})
|
||||
install (FILES ${headers} DESTINATION include/simgear/${includePath})
|
||||
install (TARGETS ${libName} ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR})
|
||||
endif()
|
||||
|
||||
install (FILES ${headers} DESTINATION include/simgear/${includePath})
|
||||
endmacro()
|
||||
|
||||
function(simgear_component name includePath sources headers)
|
||||
simgear_component_common(${name} ${includePath} CORE_SOURCES "${sources}" "${headers}")
|
||||
endfunction()
|
||||
|
||||
function(simgear_scene_component name includePath sources headers)
|
||||
simgear_component_common(${name} ${includePath} SCENE_SOURCES "${sources}" "${headers}")
|
||||
endfunction()
|
||||
|
||||
18
Makefile.am
18
Makefile.am
@@ -1,18 +0,0 @@
|
||||
EXTRA_DIST = \
|
||||
acinclude.m4 \
|
||||
autogen.sh \
|
||||
DoxygenMain.cxx \
|
||||
README.zlib \
|
||||
README.plib \
|
||||
README.OpenAL \
|
||||
README.OSG \
|
||||
projects
|
||||
|
||||
SUBDIRS = simgear
|
||||
|
||||
#
|
||||
# Rule to build RPM distribution package
|
||||
#
|
||||
rpm: dist
|
||||
rpm -ta $(PACKAGE)-$(VERSION).tar.gz
|
||||
|
||||
@@ -1,10 +1,9 @@
|
||||
[This file is mirrored in both the FlightGear and SimGear packages.]
|
||||
|
||||
You *must* have OpenSceneGraph (OSG) installed to build this version of
|
||||
You *must* have OpenSceneGraph (OSG) installed to build this version of
|
||||
FlightGear.
|
||||
|
||||
Notice that FlightGear 1.9.0 requires at least version 2.7.8. Using earlier
|
||||
versions of OSG will yield serious rendering bugs.
|
||||
Notice that FlightGear 2.6.0 requires at least version 3.0.0.
|
||||
|
||||
You can get the latest version of OSG from:
|
||||
|
||||
@@ -22,6 +21,6 @@ ccmake .
|
||||
[ While running ccmake: press 'c' to configure, press 'c' once more, and
|
||||
then press 'g' to generate and exit ]
|
||||
|
||||
make
|
||||
make
|
||||
sudo make install
|
||||
|
||||
|
||||
706
acinclude.m4
706
acinclude.m4
@@ -1,706 +0,0 @@
|
||||
dnl
|
||||
dnl originally from ncftp 2.3.0
|
||||
dnl added wi_EXTRA_PDIR and wi_ANSI_C
|
||||
dnl $Id$
|
||||
dnl
|
||||
AC_DEFUN([wi_EXTRA_IDIR], [
|
||||
incdir="$1"
|
||||
if test -r $incdir ; then
|
||||
already=""
|
||||
for CPPflag in $CPPFLAGS ; do
|
||||
if test "_$CPPflag" = "_-I${incdir}" ; then
|
||||
already=yes
|
||||
break
|
||||
fi
|
||||
done
|
||||
if test -n "$already" ; then
|
||||
echo " + already had -I$incdir" 1>&AS_MESSAGE_LOG_FD
|
||||
else
|
||||
if test "$CPPFLAGS" = "" ; then
|
||||
CPPFLAGS="-I$incdir"
|
||||
else
|
||||
CPPFLAGS="$CPPFLAGS -I$incdir"
|
||||
fi
|
||||
echo " + added -I$incdir" 1>&AS_MESSAGE_LOG_FD
|
||||
fi
|
||||
else
|
||||
echo " + IDIR is not accessible: '$myincdir'" 1>&AS_MESSAGE_LOG_FD
|
||||
fi
|
||||
])
|
||||
dnl
|
||||
dnl
|
||||
dnl
|
||||
dnl
|
||||
AC_DEFUN([wi_EXTRA_LDIR], [
|
||||
mylibdir="$1"
|
||||
if test -r $mylibdir ; then
|
||||
already=""
|
||||
for LDflag in $LDFLAGS ; do
|
||||
if test "_$LDflag" = "_-L${mylibdir}" ; then
|
||||
already=yes
|
||||
break
|
||||
fi
|
||||
done
|
||||
if test -n "$already" ; then
|
||||
echo " + already had -L$mylibdir" 1>&AS_MESSAGE_LOG_FD
|
||||
else
|
||||
if test "$LDFLAGS" = "" ; then
|
||||
LDFLAGS="-L$mylibdir"
|
||||
else
|
||||
LDFLAGS="$LDFLAGS -L$mylibdir"
|
||||
fi
|
||||
echo " + added -L$mylibdir" 1>&AS_MESSAGE_LOG_FD
|
||||
fi
|
||||
else
|
||||
echo " + LDIR is not accessible: '$mylibdir'" 1>&AS_MESSAGE_LOG_FD
|
||||
fi
|
||||
])
|
||||
dnl
|
||||
dnl __FP__
|
||||
dnl
|
||||
dnl
|
||||
AC_DEFUN([wi_EXTRA_PDIR], [
|
||||
progdir="$1"
|
||||
if test -r $progdir ; then
|
||||
case ":$PATH:" in
|
||||
*:${progdir}:*)
|
||||
echo " + already had $progdir in \$PATH" 1>&AS_MESSAGE_LOG_FD
|
||||
;;
|
||||
*)
|
||||
if test "$PATH" = "" ; then
|
||||
PATH="$progdir"
|
||||
else
|
||||
PATH="$PATH:$progdir"
|
||||
fi
|
||||
echo " + appended $progdir to \$PATH" 1>&AS_MESSAGE_LOG_FD
|
||||
;;
|
||||
esac
|
||||
else
|
||||
echo " + PDIR is not accessible: '$progdir'" 1>&AS_MESSAGE_LOG_FD
|
||||
fi
|
||||
])
|
||||
dnl
|
||||
dnl
|
||||
dnl If you want to also look for include and lib subdirectories in the
|
||||
dnl $HOME tree, you supply "yes" as the first argument to this macro.
|
||||
dnl
|
||||
dnl If you want to look for subdirectories in include/lib directories,
|
||||
dnl you pass the names in argument 3, otherwise pass a dash.
|
||||
dnl
|
||||
AC_DEFUN([wi_EXTRA_DIRS], [echo "checking for extra include and lib directories..." 1>&6
|
||||
ifelse([$1], yes, [dnl
|
||||
b1=`cd .. ; pwd`
|
||||
b2=`cd ../.. ; pwd`
|
||||
exdirs="$HOME $j $b1 $b2 $prefix $2"
|
||||
],[dnl
|
||||
exdirs="$prefix $2"
|
||||
])
|
||||
subexdirs="$3"
|
||||
if test "$subexdirs" = "" ; then
|
||||
subexdirs="-"
|
||||
fi
|
||||
for subexdir in $subexdirs ; do
|
||||
if test "$subexdir" = "-" ; then
|
||||
subexdir=""
|
||||
else
|
||||
subexdir="/$subexdir"
|
||||
fi
|
||||
for exdir in $exdirs ; do
|
||||
if test "$exdir" != "/usr" || test "$subexdir" != ""; then
|
||||
incdir="${exdir}/include${subexdir}"
|
||||
wi_EXTRA_IDIR($incdir)
|
||||
|
||||
dnl On 64-bit machines, if lib64/ exists and is not identical to lib/
|
||||
dnl then it should be listed here, listed ahead of lib/.
|
||||
mylibdir64="${exdir}/lib64${subexdir}"
|
||||
mylibdir32="${exdir}/lib${subexdir}"
|
||||
|
||||
if test "x86_64" = $(uname -m) \
|
||||
-a ! ${mylibdir64} -ef ${mylibdir32} ; then
|
||||
wi_EXTRA_LDIR($mylibdir64)
|
||||
fi
|
||||
|
||||
wi_EXTRA_LDIR($mylibdir32)
|
||||
|
||||
progdir="${exdir}/bin${subexdir}"
|
||||
wi_EXTRA_PDIR($progdir)
|
||||
fi
|
||||
done
|
||||
done
|
||||
])
|
||||
dnl
|
||||
dnl
|
||||
dnl
|
||||
AC_DEFUN([wi_HPUX_CFLAGS],
|
||||
[AC_MSG_CHECKING(if HP-UX ansi C compiler flags are needed)
|
||||
AC_REQUIRE([AC_PROG_CC])
|
||||
os=`uname -s | tr '[A-Z]' '[a-z]'`
|
||||
ac_cv_hpux_flags=no
|
||||
if test "$os" = hp-ux ; then
|
||||
if test "$ac_cv_prog_gcc" = yes ; then
|
||||
if test "$CFLAGS" != "" ; then
|
||||
# Shouldn't be in there.
|
||||
CFLAGS=`echo "$CFLAGS" | sed 's/-Aa//g'`
|
||||
fi
|
||||
else
|
||||
# If you're not using gcc, then you better have a cc/c89
|
||||
# that is usable. If you have the barebones compiler, it
|
||||
# won't work. The good compiler uses -Aa for the ANSI
|
||||
# compatible stuff.
|
||||
x=`echo $CFLAGS | grep 'Aa' 2>/dev/null`
|
||||
if test "$x" = "" ; then
|
||||
CFLAGS="$CFLAGS -Aa"
|
||||
fi
|
||||
ac_cv_hpux_flags=yes
|
||||
fi
|
||||
# Also add _HPUX_SOURCE to get the extended namespace.
|
||||
x=`echo $CFLAGS | grep '_HPUX_SOURCE' 2>/dev/null`
|
||||
if test "$x" = "" ; then
|
||||
CFLAGS="$CFLAGS -D_HPUX_SOURCE"
|
||||
fi
|
||||
fi
|
||||
AC_MSG_RESULT($ac_cv_hpux_flags)
|
||||
])
|
||||
dnl
|
||||
dnl
|
||||
dnl
|
||||
AC_DEFUN([wi_CFLAGS], [AC_REQUIRE([AC_PROG_CC])
|
||||
wi_HPUX_CFLAGS
|
||||
if test "$CFLAGS" = "" ; then
|
||||
CFLAGS="-O"
|
||||
elif test "$ac_cv_prog_gcc" = "yes" ; then
|
||||
case "$CFLAGS" in
|
||||
*"-g -O"*)
|
||||
#echo "using -g as default gcc CFLAGS" 1>&6
|
||||
CFLAGS=`echo $CFLAGS | sed 's/-g\ -O/-O/'`
|
||||
;;
|
||||
*"-O -g"*)
|
||||
# Leave the -g, but remove all -O options.
|
||||
#echo "using -g as default gcc CFLAGS" 1>&6
|
||||
CFLAGS=`echo $CFLAGS | sed 's/-O\ -g/-O/'`
|
||||
;;
|
||||
esac
|
||||
fi
|
||||
])
|
||||
dnl
|
||||
dnl
|
||||
dnl
|
||||
AC_DEFUN([wi_PROTOTYPES], [
|
||||
AC_MSG_CHECKING(if the compiler supports function prototypes)
|
||||
AC_TRY_COMPILE(,[extern void exit(int status);],[wi_cv_prototypes=yes
|
||||
AC_DEFINE(PROTOTYPES)],wi_cv_prototypes=no)
|
||||
AC_MSG_RESULT($wi_cv_prototypes)
|
||||
])
|
||||
dnl
|
||||
dnl
|
||||
dnl
|
||||
AC_DEFUN([wi_ANSI_C], [
|
||||
AC_MSG_CHECKING(ANSI-style function definitions)
|
||||
AC_TRY_COMPILE(,[int blubb(int x) { return 0; }],[wi_cv_ansi_funcs=yes
|
||||
AC_DEFINE(ANSI_FUNCS)],wi_cv_ansi_funcs=no)
|
||||
AC_MSG_RESULT($wi_cv_ansi_funcs)
|
||||
])
|
||||
dnl
|
||||
dnl
|
||||
dnl
|
||||
AC_DEFUN([wi_HEADER_SYS_SELECT_H], [
|
||||
# See if <sys/select.h> is includable after <sys/time.h>
|
||||
if test "$ac_cv_header_sys_time_h" = no ; then
|
||||
AC_CHECK_HEADERS(sys/time.h sys/select.h)
|
||||
else
|
||||
AC_CHECK_HEADERS(sys/select.h)
|
||||
fi
|
||||
if test "$ac_cv_header_sys_select_h" = yes ; then
|
||||
AC_MSG_CHECKING([if <sys/select.h> is compatible with <sys/time.h>])
|
||||
selecth=yes
|
||||
if test "$ac_cv_header_sys_time_h" = yes ; then
|
||||
AC_TRY_COMPILE([#include <sys/time.h>
|
||||
#include <sys/select.h>],[
|
||||
fd_set a;
|
||||
struct timeval tmval;
|
||||
|
||||
tmval.tv_sec = 0;],selecth=yes,selecth=no)
|
||||
|
||||
if test "$selecth" = yes ; then
|
||||
AC_DEFINE(CAN_USE_SYS_SELECT_H)
|
||||
fi
|
||||
fi
|
||||
AC_MSG_RESULT($selecth)
|
||||
fi
|
||||
])
|
||||
dnl
|
||||
dnl
|
||||
dnl
|
||||
AC_DEFUN([wi_LIB_RESOLV], [
|
||||
# See if we could access two well-known sites without help of any special
|
||||
# libraries, like resolv.
|
||||
|
||||
AC_TRY_RUN([
|
||||
#include <sys/types.h>
|
||||
#include <sys/socket.h>
|
||||
#include <netinet/in.h>
|
||||
#include <netdb.h>
|
||||
|
||||
main()
|
||||
{
|
||||
struct hostent *hp1, *hp2;
|
||||
int result;
|
||||
|
||||
hp1 = gethostbyname("gatekeeper.dec.com");
|
||||
hp2 = gethostbyname("ftp.ncsa.uiuc.edu");
|
||||
result = ((hp1 != (struct hostent *) 0) && (hp2 != (struct hostent *) 0));
|
||||
exit(! result);
|
||||
}],look_for_resolv=no,look_for_resolv=yes,look_for_resolv=yes)
|
||||
|
||||
AC_MSG_CHECKING([if we need to look for -lresolv])
|
||||
AC_MSG_RESULT($look_for_resolv)
|
||||
if test "$look_for_resolv" = yes ; then
|
||||
AC_CHECK_LIB(resolv,main)
|
||||
else
|
||||
ac_cv_lib_resolv=no
|
||||
fi
|
||||
])
|
||||
dnl
|
||||
dnl
|
||||
dnl
|
||||
|
||||
AC_DEFUN([wi_LIB_NSL], [
|
||||
AC_MSG_CHECKING(if we can use -lnsl)
|
||||
ac_save_LIBS="$LIBS";
|
||||
LIBS="$LIBS -lnsl";
|
||||
AC_CACHE_VAL(r_cv_use_libnsl, [
|
||||
AC_TRY_RUN(
|
||||
main() { if (getpwuid(getuid())) exit(0); exit(-1); },
|
||||
nc_cv_use_libnsl=yes, nc_cv_use_libnsl=no, nc_cv_use_libnsl=no)
|
||||
])
|
||||
if test "$nc_cv_use_libnsl" = "no"; then LIBS="$ac_save_LIBS"; fi
|
||||
AC_MSG_RESULT($nc_cv_use_libnsl)
|
||||
])dnl
|
||||
|
||||
dnl
|
||||
dnl
|
||||
dnl
|
||||
|
||||
AC_DEFUN([nc_PATH_PROG_ZCAT], [
|
||||
AC_PATH_PROG(GZCAT,gzcat)
|
||||
AC_PATH_PROG(ZCAT,zcat)
|
||||
if test "x$GZCAT" = x ; then
|
||||
if test "x$ZCAT" != x ; then
|
||||
# See if zcat is really gzcat. gzcat has a --version option, regular
|
||||
# zcat does not.
|
||||
AC_MSG_CHECKING(if zcat is really gzcat in disguise)
|
||||
if $ZCAT --version 2> /dev/null ; then
|
||||
AC_DEFINE_UNQUOTED(GZCAT, "$ZCAT")
|
||||
AC_MSG_RESULT(yes)
|
||||
else
|
||||
AC_MSG_RESULT(no)
|
||||
fi
|
||||
fi
|
||||
else
|
||||
AC_DEFINE_UNQUOTED(GZCAT, "$GZCAT")
|
||||
fi
|
||||
|
||||
if test "x$ZCAT" != x ; then
|
||||
AC_DEFINE_UNQUOTED(ZCAT, "$ZCAT")
|
||||
fi
|
||||
])
|
||||
dnl
|
||||
dnl
|
||||
dnl
|
||||
AC_DEFUN([wi_SYSV_EXTRA_DIRS], [
|
||||
# Use System V because their curses extensions are required. This must
|
||||
# be done early so we use the -I and -L in the library checks also.
|
||||
# This is mostly a Solaris/SunOS hack. Note that doing this will also
|
||||
# use all of the other System V libraries and headers.
|
||||
|
||||
AC_MSG_CHECKING(for alternative System V libraries)
|
||||
if test -f /usr/5include/curses.h ; then
|
||||
CPPFLAGS="$CPPFLAGS -I/usr/5include"
|
||||
LDFLAGS="$LDFLAGS -L/usr/5lib"
|
||||
AC_MSG_RESULT(yes)
|
||||
else
|
||||
AC_MSG_RESULT(no)
|
||||
fi
|
||||
])
|
||||
dnl
|
||||
dnl
|
||||
dnl
|
||||
AC_DEFUN([wi_DEFINE_UNAME], [
|
||||
# Get first 127 chars of all uname information. Some folks have
|
||||
# way too much stuff there, so grab only the first 127.
|
||||
unam=`uname -a 2>/dev/null | cut -c1-127`
|
||||
if test "$unam" != "" ; then
|
||||
AC_DEFINE_UNQUOTED(UNAME, "$unam")
|
||||
fi
|
||||
])
|
||||
dnl
|
||||
dnl
|
||||
dnl
|
||||
AC_DEFUN([wi_READLINE_WITH_NCURSES], [
|
||||
# Readline and Ncurses could both define "backspace".
|
||||
# Warn about this if we have both things in our definitions list.
|
||||
|
||||
if test "$ac_cv_lib_readline" = yes && test "$ac_cv_lib_ncurses" = yes ; then
|
||||
|
||||
AC_MSG_CHECKING(if readline and ncurses will link together)
|
||||
j="$LIBS"
|
||||
LIBS="-lreadline -lncurses"
|
||||
AC_TRY_LINK(,[
|
||||
readline("prompt");
|
||||
endwin();
|
||||
],k=yes,k=no)
|
||||
if test "$k" = no ; then
|
||||
AC_MSG_RESULT(no)
|
||||
# Remove '-lreadline' from LIBS.
|
||||
LIBS=`echo $j | sed s/-lreadline//g`
|
||||
ac_cv_lib_readline=no
|
||||
AC_WARN([The versions of GNU readline and ncurses you have installed on this system
|
||||
can't be used together, because they use the same symbol, backspace. If
|
||||
possible, recompile one of the libraries with -Dbackspace=back_space, then
|
||||
re-run configure.])
|
||||
|
||||
else
|
||||
AC_MSG_RESULT(yes)
|
||||
LIBS="$j"
|
||||
fi
|
||||
|
||||
fi
|
||||
])
|
||||
dnl
|
||||
dnl
|
||||
dnl
|
||||
|
||||
dnl AC_EXT_DAYLIGHT
|
||||
dnl Check for an external variable daylight. Stolen from w3c-libwww.
|
||||
AC_DEFUN([AC_EXT_DAYLIGHT],
|
||||
[ AC_MSG_CHECKING(int daylight variable)
|
||||
AC_TRY_COMPILE([#include <time.h>], [return daylight;],
|
||||
have_daylight=yes,
|
||||
have_daylight=no)
|
||||
AC_MSG_RESULT($have_daylight)
|
||||
])dnl
|
||||
|
||||
dnl AC_EXT_TIMEZONE
|
||||
dnl Check for an external variable timezone. Stolen from tcl-8.0.
|
||||
AC_DEFUN([AC_EXT_TIMEZONE],
|
||||
[
|
||||
#
|
||||
# Its important to include time.h in this check, as some systems (like convex)
|
||||
# have timezone functions, etc.
|
||||
#
|
||||
have_timezone=no
|
||||
AC_MSG_CHECKING([long timezone variable])
|
||||
AC_TRY_COMPILE([#include <time.h>],
|
||||
[extern long timezone;
|
||||
timezone += 1;
|
||||
exit (0);],
|
||||
[have_timezone=yes
|
||||
AC_MSG_RESULT(yes)],
|
||||
AC_MSG_RESULT(no))
|
||||
|
||||
#
|
||||
# On some systems (eg IRIX 6.2), timezone is a time_t and not a long.
|
||||
#
|
||||
if test "$have_timezone" = no; then
|
||||
AC_MSG_CHECKING([time_t timezone variable])
|
||||
AC_TRY_COMPILE([#include <time.h>],
|
||||
[extern time_t timezone;
|
||||
timezone += 1;
|
||||
exit (0);],
|
||||
[have_timezone=yes
|
||||
AC_MSG_RESULT(yes)],
|
||||
AC_MSG_RESULT(no))
|
||||
fi
|
||||
])dnl
|
||||
|
||||
## AC_BZ_SET_COMPILER: Addition by Theodore Papadopoulo
|
||||
## Patch by Jim McKelvey: change sed -e 's/ /@/g' to sed -e 's/ /@/'
|
||||
AC_DEFUN([AC_SG_SET_COMPILER],
|
||||
[cxxwith=`echo $1 | sed -e 's/ /@/'`
|
||||
case "$cxxwith" in
|
||||
*:*@*) # Full initialization syntax
|
||||
CXX=`echo "$cxxwith" | sed -n -e 's/.*:\(.*\)@.*/\1/p'`
|
||||
CXXFLAGS=`echo "$cxxwith" | sed -n -e 's/.*:.*@\(.*\)/\1/p'`
|
||||
;;
|
||||
*:*) # Simple initialization syntax
|
||||
CXX=`echo "$cxxwith" | sed -n -e 's/.*:\(.*\)/\1/p'`
|
||||
CXXFLAGS=$3
|
||||
;;
|
||||
*) # Default values
|
||||
CXX=$2
|
||||
CXXFLAGS=$3
|
||||
CC="$2 --c"
|
||||
## CFLAGS=
|
||||
;;
|
||||
esac])
|
||||
|
||||
pushdef([AC_PROG_INSTALL],
|
||||
[
|
||||
dnl our own version, testing for a -p flag
|
||||
popdef([AC_PROG_INSTALL])
|
||||
dnl as AC_PROG_INSTALL works as it works we first have
|
||||
dnl to save if the user didn't specify INSTALL, as the
|
||||
dnl autoconf one overwrites INSTALL and we have no chance to find
|
||||
dnl out afterwards
|
||||
AC_PROG_INSTALL
|
||||
|
||||
# OK, user hasn't given any INSTALL, autoconf found one for us
|
||||
# now we test, if it supports the -p flag
|
||||
AC_MSG_CHECKING(for -p flag to install)
|
||||
rm -f confinst.$$.* > /dev/null 2>&1
|
||||
echo "Testtest" > confinst.$$.orig
|
||||
ac_res=no
|
||||
if ${INSTALL} -p confinst.$$.orig confinst.$$.new > /dev/null 2>&1 ; then
|
||||
if test -f confinst.$$.new ; then
|
||||
# OK, -p seems to do no harm to install
|
||||
INSTALL="${INSTALL} -p"
|
||||
ac_res=yes
|
||||
fi
|
||||
fi
|
||||
rm -f confinst.$$.*
|
||||
AC_MSG_RESULT($ac_res)
|
||||
dnl the following tries to resolve some signs and wonders coming up
|
||||
dnl with different autoconf/automake versions
|
||||
dnl e.g.:
|
||||
dnl *automake 1.4 install-strip sets A_M_INSTALL_PROGRAM_FLAGS to -s
|
||||
dnl and has INSTALL_PROGRAM = @INSTALL_PROGRAM@ $(A_M_INSTALL_PROGRAM_FLAGS)
|
||||
dnl it header-vars.am, so there the actual INSTALL_PROGRAM gets the -s
|
||||
dnl *automake 1.4a (and above) use INSTALL_STRIP_FLAG and only has
|
||||
dnl INSTALL_PROGRAM = @INSTALL_PROGRAM@ there, but changes the
|
||||
dnl install-@DIR@PROGRAMS targets to explicitly use that flag
|
||||
dnl *autoconf 2.13 is dumb, and thinks it can use INSTALL_PROGRAM as
|
||||
dnl INSTALL_SCRIPT, which breaks with automake <= 1.4
|
||||
dnl *autoconf >2.13 (since 10.Apr 1999) has not that failure
|
||||
dnl to clean up that mess we:
|
||||
dnl +set INSTALL_PROGRAM to use INSTALL_STRIP_FLAG
|
||||
dnl which cleans KDE's program with automake > 1.4;
|
||||
dnl +set INSTALL_SCRIPT to only use INSTALL, to clean up autoconf's problems
|
||||
dnl with automake<=1.4
|
||||
dnl note that dues to this sometimes two '-s' flags are used
|
||||
INSTALL_PROGRAM='${INSTALL} $(INSTALL_STRIP_FLAG)'
|
||||
INSTALL_SCRIPT='${INSTALL}'
|
||||
])dnl
|
||||
|
||||
# ===========================================================================
|
||||
# http://autoconf-archive.cryp.to/ax_boost_base.html
|
||||
# ===========================================================================
|
||||
#
|
||||
# SYNOPSIS
|
||||
#
|
||||
# AX_BOOST_BASE([MINIMUM-VERSION])
|
||||
#
|
||||
# DESCRIPTION
|
||||
#
|
||||
# Test for the Boost C++ libraries of a particular version (or newer)
|
||||
#
|
||||
# If no path to the installed boost library is given the macro searchs
|
||||
# under /usr, /usr/local, /opt and /opt/local and evaluates the
|
||||
# $BOOST_ROOT environment variable. Further documentation is available at
|
||||
# <http://randspringer.de/boost/index.html>.
|
||||
#
|
||||
# This macro calls:
|
||||
#
|
||||
# AC_SUBST(BOOST_CPPFLAGS) / AC_SUBST(BOOST_LDFLAGS)
|
||||
#
|
||||
# And sets:
|
||||
#
|
||||
# HAVE_BOOST
|
||||
#
|
||||
# LAST MODIFICATION
|
||||
#
|
||||
# 2008-04-12
|
||||
#
|
||||
# COPYLEFT
|
||||
#
|
||||
# Copyright (c) 2008 Thomas Porschberg <thomas@randspringer.de>
|
||||
#
|
||||
# Copying and distribution of this file, with or without modification, are
|
||||
# permitted in any medium without royalty provided the copyright notice
|
||||
# and this notice are preserved.
|
||||
|
||||
AC_DEFUN([AX_BOOST_BASE],
|
||||
[
|
||||
AC_ARG_WITH([boost],
|
||||
AS_HELP_STRING([--with-boost@<:@=DIR@:>@], [use boost (default is yes) - it is possible to specify the root directory for boost (optional)]),
|
||||
[
|
||||
if test "$withval" = "no"; then
|
||||
want_boost="no"
|
||||
elif test "$withval" = "yes"; then
|
||||
want_boost="yes"
|
||||
ac_boost_path=""
|
||||
else
|
||||
want_boost="yes"
|
||||
ac_boost_path="$withval"
|
||||
fi
|
||||
],
|
||||
[want_boost="yes"])
|
||||
|
||||
|
||||
AC_ARG_WITH([boost-libdir],
|
||||
AS_HELP_STRING([--with-boost-libdir=LIB_DIR],
|
||||
[Force given directory for boost libraries. Note that this will overwrite library path detection, so use this parameter only if default library detection fails and you know exactly where your boost libraries are located.]),
|
||||
[
|
||||
if test -d $withval
|
||||
then
|
||||
ac_boost_lib_path="$withval"
|
||||
else
|
||||
AC_MSG_ERROR(--with-boost-libdir expected directory name)
|
||||
fi
|
||||
],
|
||||
[ac_boost_lib_path=""]
|
||||
)
|
||||
|
||||
if test "x$want_boost" = "xyes"; then
|
||||
boost_lib_version_req=ifelse([$1], ,1.20.0,$1)
|
||||
boost_lib_version_req_shorten=`expr $boost_lib_version_req : '\([[0-9]]*\.[[0-9]]*\)'`
|
||||
boost_lib_version_req_major=`expr $boost_lib_version_req : '\([[0-9]]*\)'`
|
||||
boost_lib_version_req_minor=`expr $boost_lib_version_req : '[[0-9]]*\.\([[0-9]]*\)'`
|
||||
boost_lib_version_req_sub_minor=`expr $boost_lib_version_req : '[[0-9]]*\.[[0-9]]*\.\([[0-9]]*\)'`
|
||||
if test "x$boost_lib_version_req_sub_minor" = "x" ; then
|
||||
boost_lib_version_req_sub_minor="0"
|
||||
fi
|
||||
WANT_BOOST_VERSION=`expr $boost_lib_version_req_major \* 100000 \+ $boost_lib_version_req_minor \* 100 \+ $boost_lib_version_req_sub_minor`
|
||||
AC_MSG_CHECKING(for boostlib >= $boost_lib_version_req)
|
||||
succeeded=no
|
||||
|
||||
dnl first we check the system location for boost libraries
|
||||
dnl this location ist chosen if boost libraries are installed with the --layout=system option
|
||||
dnl or if you install boost with RPM
|
||||
if test "$ac_boost_path" != ""; then
|
||||
BOOST_LDFLAGS="-L$ac_boost_path/lib"
|
||||
BOOST_CPPFLAGS="-I$ac_boost_path/include"
|
||||
else
|
||||
for ac_boost_path_tmp in /usr /usr/local /opt /opt/local ; do
|
||||
if test -d "$ac_boost_path_tmp/include/boost" && test -r "$ac_boost_path_tmp/include/boost"; then
|
||||
BOOST_LDFLAGS="-L$ac_boost_path_tmp/lib"
|
||||
BOOST_CPPFLAGS="-I$ac_boost_path_tmp/include"
|
||||
break;
|
||||
fi
|
||||
done
|
||||
fi
|
||||
|
||||
dnl overwrite ld flags if we have required special directory with
|
||||
dnl --with-boost-libdir parameter
|
||||
if test "$ac_boost_lib_path" != ""; then
|
||||
BOOST_LDFLAGS="-L$ac_boost_lib_path"
|
||||
fi
|
||||
|
||||
CPPFLAGS_SAVED="$CPPFLAGS"
|
||||
CPPFLAGS="$CPPFLAGS $BOOST_CPPFLAGS"
|
||||
export CPPFLAGS
|
||||
|
||||
LDFLAGS_SAVED="$LDFLAGS"
|
||||
LDFLAGS="$LDFLAGS $BOOST_LDFLAGS"
|
||||
export LDFLAGS
|
||||
|
||||
AC_LANG_PUSH(C++)
|
||||
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
|
||||
@%:@include <boost/version.hpp>
|
||||
]], [[
|
||||
#if BOOST_VERSION >= $WANT_BOOST_VERSION
|
||||
// Everything is okay
|
||||
#else
|
||||
# error Boost version is too old
|
||||
#endif
|
||||
]])],[
|
||||
AC_MSG_RESULT(yes)
|
||||
succeeded=yes
|
||||
found_system=yes
|
||||
],[
|
||||
])
|
||||
AC_LANG_POP([C++])
|
||||
|
||||
|
||||
|
||||
dnl if we found no boost with system layout we search for boost libraries
|
||||
dnl built and installed without the --layout=system option or for a staged(not installed) version
|
||||
if test "x$succeeded" != "xyes"; then
|
||||
_version=0
|
||||
if test "$ac_boost_path" != ""; then
|
||||
if test -d "$ac_boost_path" && test -r "$ac_boost_path"; then
|
||||
for i in `ls -d $ac_boost_path/include/boost-* 2>/dev/null`; do
|
||||
_version_tmp=`echo $i | sed "s#$ac_boost_path##" | sed 's/\/include\/boost-//' | sed 's/_/./'`
|
||||
V_CHECK=`expr $_version_tmp \> $_version`
|
||||
if test "$V_CHECK" = "1" ; then
|
||||
_version=$_version_tmp
|
||||
fi
|
||||
VERSION_UNDERSCORE=`echo $_version | sed 's/\./_/'`
|
||||
BOOST_CPPFLAGS="-I$ac_boost_path/include/boost-$VERSION_UNDERSCORE"
|
||||
done
|
||||
fi
|
||||
else
|
||||
for ac_boost_path in /usr /usr/local /opt /opt/local ; do
|
||||
if test -d "$ac_boost_path" && test -r "$ac_boost_path"; then
|
||||
for i in `ls -d $ac_boost_path/include/boost-* 2>/dev/null`; do
|
||||
_version_tmp=`echo $i | sed "s#$ac_boost_path##" | sed 's/\/include\/boost-//' | sed 's/_/./'`
|
||||
V_CHECK=`expr $_version_tmp \> $_version`
|
||||
if test "$V_CHECK" = "1" ; then
|
||||
_version=$_version_tmp
|
||||
best_path=$ac_boost_path
|
||||
fi
|
||||
done
|
||||
fi
|
||||
done
|
||||
|
||||
VERSION_UNDERSCORE=`echo $_version | sed 's/\./_/'`
|
||||
BOOST_CPPFLAGS="-I$best_path/include/boost-$VERSION_UNDERSCORE"
|
||||
if test "$ac_boost_lib_path" = ""
|
||||
then
|
||||
BOOST_LDFLAGS="-L$best_path/lib"
|
||||
fi
|
||||
|
||||
if test "x$BOOST_ROOT" != "x"; then
|
||||
if test -d "$BOOST_ROOT" && test -r "$BOOST_ROOT" && test -d "$BOOST_ROOT/stage/lib" && test -r "$BOOST_ROOT/stage/lib"; then
|
||||
version_dir=`expr //$BOOST_ROOT : '.*/\(.*\)'`
|
||||
stage_version=`echo $version_dir | sed 's/boost_//' | sed 's/_/./g'`
|
||||
stage_version_shorten=`expr $stage_version : '\([[0-9]]*\.[[0-9]]*\)'`
|
||||
V_CHECK=`expr $stage_version_shorten \>\= $_version`
|
||||
if test "$V_CHECK" = "1" -a "$ac_boost_lib_path" = "" ; then
|
||||
AC_MSG_NOTICE(We will use a staged boost library from $BOOST_ROOT)
|
||||
BOOST_CPPFLAGS="-I$BOOST_ROOT"
|
||||
BOOST_LDFLAGS="-L$BOOST_ROOT/stage/lib"
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
|
||||
CPPFLAGS="$CPPFLAGS $BOOST_CPPFLAGS"
|
||||
export CPPFLAGS
|
||||
LDFLAGS="$LDFLAGS $BOOST_LDFLAGS"
|
||||
export LDFLAGS
|
||||
|
||||
AC_LANG_PUSH(C++)
|
||||
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
|
||||
@%:@include <boost/version.hpp>
|
||||
]], [[
|
||||
#if BOOST_VERSION >= $WANT_BOOST_VERSION
|
||||
// Everything is okay
|
||||
#else
|
||||
# error Boost version is too old
|
||||
#endif
|
||||
]])],[
|
||||
AC_MSG_RESULT(yes)
|
||||
succeeded=yes
|
||||
found_system=yes
|
||||
],[
|
||||
])
|
||||
AC_LANG_POP([C++])
|
||||
fi
|
||||
|
||||
if test "$succeeded" != "yes" ; then
|
||||
if test "$_version" = "0" ; then
|
||||
AC_MSG_ERROR([[We could not detect the boost libraries (version $boost_lib_version_req_shorten or higher). If you have a staged boost library (still not installed) please specify \$BOOST_ROOT in your environment and do not give a PATH to --with-boost option. If you are sure you have boost installed, then check your version number looking in <boost/version.hpp>. See http://randspringer.de/boost for more documentation.]])
|
||||
else
|
||||
AC_MSG_ERROR([Your boost libraries seems to old (version $_version).])
|
||||
fi
|
||||
else
|
||||
AC_SUBST(BOOST_CPPFLAGS)
|
||||
AC_SUBST(BOOST_LDFLAGS)
|
||||
AC_DEFINE(HAVE_BOOST,,[define if the Boost library is available])
|
||||
fi
|
||||
|
||||
CPPFLAGS="$CPPFLAGS_SAVED"
|
||||
LDFLAGS="$LDFLAGS_SAVED"
|
||||
fi
|
||||
|
||||
])
|
||||
38
am2dsp.cfg
38
am2dsp.cfg
@@ -1,38 +0,0 @@
|
||||
type = StaticLibrary,Multithreaded,
|
||||
exclude_dir = threads
|
||||
|
||||
include_path = .
|
||||
include_path = ..
|
||||
include_path = .\SimGear
|
||||
include_path = ..\zlib-1.2.3
|
||||
include_path = "..\OpenAL 1.0 Software Development Kit\include"
|
||||
|
||||
define = _USE_MATH_DEFINES
|
||||
define = _CRT_SECURE_NO_DEPRECATE
|
||||
define = HAVE_CONFIG_H
|
||||
|
||||
# Rule to create simgear_config.h
|
||||
add_source_file = SOURCE=.\simgear\simgear_config.h.vc5\
|
||||
\
|
||||
!IF "$(CFG)" == "SimGear - Win32 Release"\
|
||||
\
|
||||
# Begin Custom Build - Creating config.h\
|
||||
InputPath=.\simgear\simgear_config.h.vc5\
|
||||
\
|
||||
".\simgear\simgear_config.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"\
|
||||
copy .\simgear\simgear_config.h.vc5 .\simgear\simgear_config.h\
|
||||
\
|
||||
# End Custom Build\
|
||||
\
|
||||
!ELSEIF "$(CFG)" == "SimGear - Win32 Debug"\
|
||||
\
|
||||
# Begin Custom Build - Creating config.h\
|
||||
InputPath=.\simgear\simgear_config.h.vc5\
|
||||
\
|
||||
".\simgear\simgear_config.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"\
|
||||
copy .\simgear\simgear_config.h.vc5 .\simgear\simgear_config.h\
|
||||
\
|
||||
# End Custom Build\
|
||||
\
|
||||
!ENDIF\
|
||||
|
||||
52
autogen.sh
52
autogen.sh
@@ -1,52 +0,0 @@
|
||||
#!/bin/sh
|
||||
|
||||
OSTYPE=`uname -s`
|
||||
MACHINE=`uname -m`
|
||||
AUTO_MAKE_VERSION=`automake --version | head -1 | awk '{print $4}' | sed -e 's/\.\([0-9]*\).*/\1/'`
|
||||
if test $AUTO_MAKE_VERSION -lt 15; then
|
||||
echo ""
|
||||
echo "You need to upgrade to automake version 1.5 or greater."
|
||||
echo "Most distributions have packages available to install or you can"
|
||||
echo "find the source for the most recent version at"
|
||||
echo "ftp://ftp.gnu.org/gnu/automake"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "Host info: $OSTYPE $MACHINE"
|
||||
echo -n " automake: `automake --version | head -1 | awk '{print $4}'`"
|
||||
echo " ($AUTO_MAKE_VERSION)"
|
||||
echo ""
|
||||
|
||||
echo "Running aclocal"
|
||||
aclocal
|
||||
|
||||
echo "Running autoheader"
|
||||
autoheader
|
||||
if [ ! -e simgear/simgear_config.h.in ]; then
|
||||
echo "ERROR: autoheader didn't create simgear/simgear_config.h.in!"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "Running automake --add-missing"
|
||||
automake --add-missing
|
||||
|
||||
echo "Running autoconf"
|
||||
autoconf
|
||||
|
||||
if [ ! -e configure ]; then
|
||||
echo "ERROR: configure was not created!"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo ""
|
||||
echo "======================================"
|
||||
|
||||
if [ -f config.cache ]; then
|
||||
echo "config.cache exists. Removing the config.cache file will force"
|
||||
echo "the ./configure script to rerun all it's tests rather than using"
|
||||
echo "the previously cached values."
|
||||
echo ""
|
||||
fi
|
||||
|
||||
echo "Now you are ready to run './configure'"
|
||||
echo "======================================"
|
||||
603
configure.ac
603
configure.ac
@@ -1,603 +0,0 @@
|
||||
dnl Process this file with autoget.sh to produce a working configure
|
||||
dnl script.
|
||||
|
||||
AC_INIT
|
||||
AC_CONFIG_SRCDIR([simgear/bucket/newbucket.cxx])
|
||||
|
||||
dnl Require at least automake 2.52
|
||||
AC_PREREQ(2.52)
|
||||
|
||||
dnl Initialize the automake stuff
|
||||
AM_INIT_AUTOMAKE(SimGear, 2.2.0)
|
||||
|
||||
dnl Specify KAI C++ compiler and flags.
|
||||
dnl Borrowed with slight modification from blitz distribution.
|
||||
AC_ARG_WITH(cxx,
|
||||
[ --with-cxx=COMPILER[:name-flags] set options for COMPILER (KCC)],
|
||||
[case "$withval" in
|
||||
KCC*) # KAI C++ http://www.kai.com/
|
||||
echo "Configuring for KAI C++"
|
||||
AC_SG_SET_COMPILER($withval,"KCC","--restrict --strict_warnings")
|
||||
CXX_OPTIMIZE_FLAGS=="+K3 -O3"
|
||||
CXX_DEBUG_FLAGS="-g +K0"
|
||||
;;
|
||||
esac
|
||||
])
|
||||
|
||||
AC_ARG_ENABLE(headless,
|
||||
AS_HELP_STRING([--enable-headless],[Enable only packages for headless build]))
|
||||
|
||||
AC_MSG_CHECKING([for headless mode])
|
||||
AC_MSG_RESULT([$enable_headless])
|
||||
|
||||
AM_CONDITIONAL(WANT_HEADLESS,[test "x$enable_headless" = "xyes"])
|
||||
|
||||
AC_MSG_CHECKING([CXX])
|
||||
AC_MSG_RESULT([$CXX])
|
||||
AC_MSG_CHECKING([CC])
|
||||
AC_MSG_RESULT([$CC])
|
||||
|
||||
dnl Checks for programs.
|
||||
AC_PROG_MAKE_SET
|
||||
AC_PROG_CC
|
||||
AC_PROG_CPP
|
||||
AC_PROG_CXX
|
||||
AC_PROG_CXXCPP
|
||||
AC_PROG_RANLIB
|
||||
AC_PROG_INSTALL
|
||||
AC_PROG_LN_S
|
||||
AX_BOOST_BASE([1.37.0])
|
||||
|
||||
if test "x$BOOST_CPPFLAGS" != "x-I/usr/include" ; then
|
||||
CPPFLAGS="$CPPFLAGS $BOOST_CPPFLAGS"
|
||||
fi
|
||||
|
||||
dnl set the $host variable based on local machine/os
|
||||
AC_CANONICAL_HOST
|
||||
|
||||
dnl Used on the Irix platform
|
||||
case "${host}" in
|
||||
*-*-irix*)
|
||||
if test "x$CXX" = "xCC" -o "x$CXX" = "xccache CC"; then
|
||||
AR="$CXX -ar"
|
||||
ARFLAGS="-o"
|
||||
CXXFLAGS="$CXXFLAGS -I$(top_srcdir)/simgear/compatibility/MIPSpro740"
|
||||
compatibility_DIR="compatibility"
|
||||
MIPSpro_DIRS="MIPSpro740"
|
||||
AC_MSG_CHECKING([for MIPSpro compiler version 7.4 or newer])
|
||||
AC_TRY_RUN([
|
||||
int main() {
|
||||
if ( _COMPILER_VERSION < 740 ) {
|
||||
return -1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
], AC_MSG_RESULT(yes),
|
||||
[ AC_MSG_RESULT(no)
|
||||
CXXFLAGS="$CXXFLAGS -I$(top_srcdir)/simgear/compatibility/MIPSpro721"
|
||||
MIPSpro_DIRS="$(MIPSpro_DIRS) MIPSpro721"
|
||||
AC_MSG_WARN([Using our own subset of the STL headers])
|
||||
], AC_MSG_RESULT(yes))
|
||||
AC_SUBST(MIPSpro_DIRS)
|
||||
fi
|
||||
;;
|
||||
*)
|
||||
AR="ar"
|
||||
ARFLAGS="cru"
|
||||
compatibility_DIR=
|
||||
;;
|
||||
esac
|
||||
AC_SUBST(AR)
|
||||
AC_SUBST(ARFLAGS)
|
||||
AC_SUBST(compatibility_DIR)
|
||||
|
||||
# Show all compiler warnings by default
|
||||
CXXFLAGS="$CXXFLAGS -Wall"
|
||||
CFLAGS="$CFLAGS -Wall"
|
||||
|
||||
if echo $includedir | egrep "simgear$" > /dev/null; then
|
||||
echo "includedir is" $includedir "libdir is" $libdir
|
||||
else
|
||||
includedir="${includedir}/simgear"
|
||||
echo "includedir changed to" $includedir "libdir is" $libdir
|
||||
fi
|
||||
|
||||
dnl set logging; default value of with_logging=yes
|
||||
AC_ARG_WITH(logging, [ --with-logging Include logging output (default)])
|
||||
if test "x$with_logging" = "xno" ; then
|
||||
AC_DEFINE([FG_NDEBUG], 1, [Define for no logging output])
|
||||
fi
|
||||
|
||||
# Specify if we want to build with Norman's jpeg image server support.
|
||||
# This requires libjpeg to be installed and available.
|
||||
# Default to with_jpeg_server=no
|
||||
JPEGLIB=''
|
||||
AC_ARG_WITH(jpeg_factory, [ --with-jpeg-factory Include Norman's jpeg image factory support code])
|
||||
if test "x$with_jpeg_factory" = "xyes" ; then
|
||||
echo "Building with Norman's jpeg image factory support"
|
||||
AC_CHECK_LIB(jpeg, jpeg_start_compress)
|
||||
if test "x$ac_cv_lib_jpeg_jpeg_start_compress" != "xyes" ; then
|
||||
echo
|
||||
echo "In order to build the jpeg factory code you need libjpeg installed."
|
||||
echo "otherwise please configure with the --with-jpeg-sever=no option"
|
||||
echo
|
||||
echo "libjpeg is available at :"
|
||||
echo " ftp://ftp.uu.net in the directory graphics/jpeg"
|
||||
exit 1
|
||||
fi
|
||||
else
|
||||
echo "Building without Norman's jpeg image server support"
|
||||
fi
|
||||
AM_CONDITIONAL(ENABLE_JPEG_SERVER, test "x$with_jpeg_factory" = "xyes")
|
||||
|
||||
# specify the osg location
|
||||
AC_ARG_WITH(osg, [ --with-osg=PREFIX Specify the prefix path to osg])
|
||||
|
||||
if test "x$with_osg" != "x" ; then
|
||||
echo "osg prefix is $with_osg"
|
||||
EXTRA_DIRS="${EXTRA_DIRS} $with_osg"
|
||||
fi
|
||||
|
||||
AC_ARG_WITH(osg_framework, [ --with-osg-framework=PREFIX Specify the prefix path to OSG.framework ])
|
||||
|
||||
if test "x$with_osg_framework" != "x"; then
|
||||
echo "osg framework prefix is $with_osg_framework"
|
||||
CPPFLAGS = "$CPPFLAGS -F$with-osg-framework"
|
||||
export DYLD_FRAMEWORK_PATH="$DYLD_FRAMEWORK_PATH:$with_osg_framework"
|
||||
fi
|
||||
|
||||
dnl specifying ALUT.framework (for user provided ALUT.framework)
|
||||
AC_ARG_WITH(alut_framework, [ --with-alut-framework=PREFIX Specify the prefix path to ALUT.framework ])
|
||||
|
||||
if test "x$with_alut_framework" != "x"; then
|
||||
echo "ALUT framework prefix is $with_alut_framework"
|
||||
fi
|
||||
|
||||
dnl Determine an extra directories to add to include/lib search paths
|
||||
case "${host}" in
|
||||
*-apple-darwin* | *-*-cygwin* | *-*-mingw32*)
|
||||
echo no EXTRA_DIRS for $host
|
||||
;;
|
||||
|
||||
*)
|
||||
if test -d /usr/X11R6 ; then
|
||||
EXTRA_DIR1="/usr/X11R6"
|
||||
fi
|
||||
if test -d /opt/X11R6 ; then
|
||||
EXTRA_DIR2="/opt/X11R6"
|
||||
fi
|
||||
EXTRA_DIRS="${EXTRA_DIRS} $EXTRA_DIR1 $EXTRA_DIR2"
|
||||
;;
|
||||
|
||||
esac
|
||||
wi_EXTRA_DIRS(no, ${EXTRA_DIRS})
|
||||
|
||||
|
||||
dnl Using AM_CONDITIONAL is a step out of the protected little
|
||||
dnl automake fold so it is potentially dangerous. But, we are
|
||||
dnl beginning to run into cases where the standard checks are not
|
||||
dnl enough. AM_CONDITIONALS are then referenced to conditionally
|
||||
dnl build a Makefile.in from a Makefile.am which lets us define custom
|
||||
dnl includes, compile alternative source files, etc.
|
||||
|
||||
dnl X11 might be installed on Mac OS X or cygwin/mingwin, we don't want
|
||||
dnl to use it if it is.
|
||||
case "${host}" in
|
||||
*-apple-darwin* | *-*-cygwin* | *-*-mingw32*)
|
||||
echo no fancy X11 check
|
||||
;;
|
||||
|
||||
*)
|
||||
AC_PATH_XTRA
|
||||
;;
|
||||
|
||||
esac
|
||||
|
||||
dnl Checks for libraries.
|
||||
|
||||
dnl Thread related checks
|
||||
AC_CHECK_HEADER(pthread.h)
|
||||
AC_SEARCH_LIBS(pthread_exit, [pthread c_r])
|
||||
if test "x$ac_cv_header_pthread_h" = "xyes"; then
|
||||
CXXFLAGS="$CXXFLAGS -D_REENTRANT"
|
||||
CFLAGS="$CFLAGS -D_REENTRANT"
|
||||
|
||||
if test "x$ac_cv_search_pthread_exit" = "x-lc_r"; then
|
||||
CXXFLAGS="-pthread $CXXFLAGS"
|
||||
CFLAGS="-pthread $CFLAGS"
|
||||
fi
|
||||
fi
|
||||
|
||||
AM_CONDITIONAL(HAVE_THREADS, test "x$ac_cv_header_pthread_h" = "xyes")
|
||||
|
||||
thread_LIBS="$LIBS"
|
||||
LIBS=""
|
||||
|
||||
dnl search for network related libraries
|
||||
AC_SEARCH_LIBS(inet_addr, xnet)
|
||||
AC_SEARCH_LIBS(socket, socket)
|
||||
|
||||
network_LIBS="$LIBS"
|
||||
LIBS=""
|
||||
|
||||
dnl check for some default libraries
|
||||
AC_SEARCH_LIBS(cos, m)
|
||||
AC_SEARCH_LIBS(clock_gettime, rt)
|
||||
|
||||
base_LIBS="$LIBS"
|
||||
|
||||
dnl check for OpenGL related libraries
|
||||
case "${host}" in
|
||||
*-*-cygwin* | *-*-mingw32*)
|
||||
dnl CygWin under Windoze.
|
||||
|
||||
echo Win32 specific hacks...
|
||||
AC_DEFINE([WIN32], 1, [Define for Win32 platforms])
|
||||
AC_DEFINE([NOMINMAX], 1, [Define for Win32 platforms])
|
||||
|
||||
LIBS="$LIBS -lglu32 -lopengl32"
|
||||
LIBS="$LIBS -luser32 -lgdi32 -lwinmm"
|
||||
|
||||
dnl add -lwsock32 for mingwin
|
||||
case "${host}" in
|
||||
*-*-mingw32*)
|
||||
base_LIBS="$base_LIBS -lws2_32"
|
||||
;;
|
||||
esac
|
||||
|
||||
echo "Will link apps with $LIBS"
|
||||
;;
|
||||
|
||||
*-apple-darwin*)
|
||||
dnl Mac OS X
|
||||
|
||||
LIBS="$LIBS -framework OpenGL -framework Carbon -lobjc"
|
||||
;;
|
||||
|
||||
*)
|
||||
dnl X-Windows based machines
|
||||
|
||||
AC_SEARCH_LIBS(XCreateWindow, X11)
|
||||
AC_SEARCH_LIBS(XShmCreateImage, Xext)
|
||||
AC_SEARCH_LIBS(XGetExtensionVersion, Xi)
|
||||
AC_SEARCH_LIBS(IceOpenConnection, ICE)
|
||||
AC_SEARCH_LIBS(SmcOpenConnection, SM)
|
||||
AC_SEARCH_LIBS(XtMalloc, Xt)
|
||||
AC_SEARCH_LIBS(XmuLookupStandardColormap, Xmu)
|
||||
|
||||
AC_SEARCH_LIBS(glNewList, [ GL GLcore MesaGL ])
|
||||
if test "x$ac_cv_search_glNewList" = "x-lGLcore"; then
|
||||
dnl if GLcore found, then also check for GL
|
||||
AC_SEARCH_LIBS(glXCreateContext, GL)
|
||||
fi
|
||||
|
||||
dnl if using mesa, check for xmesa.h
|
||||
if test "x$ac_cv_search_glNewList" = "x-lMesaGL"; then
|
||||
AC_CHECK_HEADER(GL/fxmesa.h)
|
||||
if test "x$ac_cv_header_GL_fxmesa_h" = "xyes"; then
|
||||
AC_DEFINE([XMESA], 1, [Define for fxmesa])
|
||||
AC_DEFINE([FX], 1, [Define for fxmesa])
|
||||
fi
|
||||
fi
|
||||
|
||||
AC_SEARCH_LIBS(gluLookAt, [ GLU MesaGLU ])
|
||||
;;
|
||||
|
||||
esac
|
||||
|
||||
opengl_LIBS="$LIBS"
|
||||
LIBS="$base_LIBS"
|
||||
|
||||
dnl check for OpenAL libraries
|
||||
OPENAL_OK="no"
|
||||
ALUT_OK="no"
|
||||
case "${host}" in
|
||||
*-*-cygwin* | *-*-mingw32*)
|
||||
dnl CygWin under Windoze.
|
||||
INCLUDES="$INCLUDES -I/usr/local/include/"
|
||||
LIBS="$LIBS -L/usr/local/lib"
|
||||
AC_SEARCH_LIBS(alGenBuffers, [ openal32 openal 'openal -ldsound -lwinmm' ] )
|
||||
AC_SEARCH_LIBS(alutInit, [ openal32 ALut alut ] )
|
||||
LIBS="$LIBS -lwinmm -ldsound -ldxguid -lole32"
|
||||
openal_LIBS="$LIBS"
|
||||
OPENAL_OK="$ac_cv_search_alGenBuffers"
|
||||
ALUT_OK="$ac_cv_search_alutInit"
|
||||
;;
|
||||
|
||||
*-apple-darwin*)
|
||||
dnl Mac OS X
|
||||
|
||||
LIBS="$LIBS -framework IOKit -framework OpenAL -framework ALUT"
|
||||
openal_LIBS="$LIBS"
|
||||
|
||||
if test "x$with_openal_lib" != "x"; then
|
||||
echo "libopenal is not supported on Mac OS platform."
|
||||
openal_LIBS=""
|
||||
fi
|
||||
|
||||
AC_CHECK_HEADERS([OpenAL/al.h],[OPENAL_OK="yes"])
|
||||
# Looking for alut.h
|
||||
AC_CHECK_HEADERS([ALUT/alut.h],[ALUT_OK="yes"])
|
||||
|
||||
dnl Thank you Christian Bauer from SheepSaver
|
||||
dnl Modified by Tatsuhiro Nishioka for accepting a given framework path
|
||||
dnl AC_CHECK_FRAMEWORK($1=NAME, $2=INCLUDES, $3=FRAMEWORK_PATH, $4=ACTION_IF_TRUE) ; $3 is optional
|
||||
AC_DEFUN([AC_CHECK_FRAMEWORK], [
|
||||
AS_VAR_PUSHDEF([ac_Framework], [ac_cv_framework_$1])dnl
|
||||
AC_CACHE_CHECK([whether compiler supports framework $1],
|
||||
ac_Framework, [
|
||||
saved_LIBS="$LIBS"
|
||||
FRAMEWORKS="$FRAMEWORKS -framework $1"
|
||||
if test "$3" = ""; then
|
||||
FRAMEWORKS="$FRAMEWORKS $ADD2LD"
|
||||
elif test "`echo $FRAMEWORKS | grep -- -F$3`" = ""; then
|
||||
FRAMEWORKS="$FRAMEWORKS -F$3"
|
||||
CXXFLAGS="$CXXFLAGS -F$3"
|
||||
CPPFLAGS="$CPPFLAGS -F$3"
|
||||
CCFLAGS="$CCFLAGS -F$3"
|
||||
dnl This is needed for AC_TRY_LINK when a framework path is specified
|
||||
export DYLD_FRAMEWORK_PATH="${DYLD_FRAMEWORK_PATH}:$3"
|
||||
fi
|
||||
AC_TRY_LINK(
|
||||
[$2], [],
|
||||
[AS_VAR_SET(ac_Framework, yes)], [AS_VAR_SET(ac_Framework, no); LIBS="$saved_LIBS"]
|
||||
)
|
||||
])
|
||||
AS_IF([test AS_VAR_GET(ac_Framework) = yes],
|
||||
[AC_DEFINE(AS_TR_CPP(HAVE_FRAMEWORK_$1), 1, [Define if framework $1 is available.])]
|
||||
)
|
||||
AS_IF([test AS_VAR_GET(ac_Framework) = yes], $4)
|
||||
|
||||
AS_VAR_POPDEF([ac_Framework])dnl
|
||||
])
|
||||
|
||||
dnl Check for ALUT.framework when --with-alut-framework is specified
|
||||
if test "x$with_alut_framework" != "x"; then
|
||||
AC_CHECK_FRAMEWORK(ALUT, [#include <ALUT/alut.h>], $with_alut_framework, [ALUT_OK="yes"])
|
||||
fi
|
||||
|
||||
;;
|
||||
|
||||
*)
|
||||
dnl default unix style machines
|
||||
|
||||
save_LIBS=$LIBS
|
||||
LIBS="$LIBS $thread_LIBS"
|
||||
AC_SEARCH_LIBS(alGenBuffers, openal)
|
||||
AC_SEARCH_LIBS(alutInit, [ alut openal ] )
|
||||
OPENAL_OK="$ac_cv_search_alGenBuffers"
|
||||
ALUT_OK="$ac_cv_search_alutInit"
|
||||
openal_LIBS="$LIBS"
|
||||
LIBS=$save_LIBS
|
||||
;;
|
||||
|
||||
esac
|
||||
|
||||
if test "$OPENAL_OK" == "no" -a "x$enable_headless" != "xyes"; then
|
||||
echo
|
||||
echo "You *must* have the openal library installed on your system to build"
|
||||
echo "SimGear!"
|
||||
echo
|
||||
echo "Please see README.OpenAL for more details."
|
||||
echo
|
||||
echo "configure aborted."
|
||||
exit
|
||||
fi
|
||||
|
||||
if test "$ALUT_OK" == "no" -a "x$enable_headless" != "xyes"; then
|
||||
echo
|
||||
echo "You *must* have the alut library installed on your system to build"
|
||||
echo "SimGear!"
|
||||
echo
|
||||
echo "Please see README.OpenAL for more details."
|
||||
echo
|
||||
echo "configure aborted."
|
||||
exit
|
||||
fi
|
||||
|
||||
|
||||
|
||||
LIBS="$base_LIBS"
|
||||
|
||||
AC_SUBST(base_LIBS)
|
||||
AC_SUBST(openal_LIBS)
|
||||
AC_SUBST(opengl_LIBS)
|
||||
AC_SUBST(thread_LIBS)
|
||||
AC_SUBST(network_LIBS)
|
||||
|
||||
dnl Check for MS Windows environment
|
||||
AC_CHECK_HEADER(windows.h)
|
||||
AM_CONDITIONAL(EXTGL_NEEDED, test "x$ac_cv_header_windows_h" = "xyes")
|
||||
|
||||
# The following are C++ items that need to be tested for with the c++
|
||||
# compiler
|
||||
|
||||
CXXCPP="g++ -E"
|
||||
AC_LANG_PUSH(C++)
|
||||
|
||||
# OpenSceneGraph
|
||||
case "${host}" in
|
||||
*-apple-darwin*)
|
||||
if test "x$with_osg_framework" != "x"; then
|
||||
# AC_CHECK_FRAMEWORK(osgViewer, [#include <osgViewer/Version>], $with_osg_framework)
|
||||
# AC_CHECK_FRAMEWORK(osgGA, [#include <osgGA/Version>], $with_osg_framework)
|
||||
# AC_CHECK_FRAMEWORK(osgText, [#include <osgText/Version>], $with_osg_framework)
|
||||
# AC_CHECK_FRAMEWORK(osgFX, [#include <osgFX/AnisotropicLighting>], $with_osg_framework)
|
||||
# AC_CHECK_FRAMEWORK(osgUtil, [#include <osgUtil/Version>], $with_osg_framework)
|
||||
# AC_CHECK_FRAMEWORK(osgDB, [#include <osgDB/Version>], $with_osg_framework)
|
||||
# AC_CHECK_FRAMEWORK(osgSim, [#include <osgSim/Version>], $with_osg_framework)
|
||||
# AC_CHECK_FRAMEWORK(osgParticle, [#include <osgParticle/Version>], $with_osg_framework)
|
||||
AC_CHECK_FRAMEWORK(osg, [#include <osg/Version>], $with_osg_framework)
|
||||
# osg_FRAMEWORKS="$FRAMEWORKS"
|
||||
# FRAMEWORKS=""
|
||||
# AC_SUBST(osg_FRAMEWORKS)
|
||||
AC_CHECK_FRAMEWORK(OpenThreads, [#include <OpenThreads/Version>], $with_osg_framework)
|
||||
openthreads_FRAMEWORK="$FRAMEWORKS"
|
||||
FRAMEWORKS=""
|
||||
AC_SUBST(openthreads_FRAMEWORK)
|
||||
else
|
||||
dnl
|
||||
dnl This is needed when osg dynamic libs are specified
|
||||
dnl instead of OSG frameworks on Mac OS X
|
||||
dnl
|
||||
AC_CHECK_LIB(OpenThreads,OpenThreadsGetVersion)
|
||||
fi
|
||||
;;
|
||||
*)
|
||||
if test "x$enable_osgdebug" = "xyes"; then
|
||||
AC_CHECK_LIB(OpenThreadsd,OpenThreadsGetVersion)
|
||||
else
|
||||
AC_CHECK_LIB(OpenThreads,OpenThreadsGetVersion)
|
||||
fi
|
||||
;;
|
||||
esac
|
||||
|
||||
AM_CONDITIONAL(HAVE_FRAMEWORK_OSG, test "x$ac_cv_framework_osg" != "x")
|
||||
|
||||
AC_CHECK_HEADER(osg/Version)
|
||||
|
||||
if test "x$ac_cv_header_osg_Version" != "xyes" -o "x$ac_cv_lib_OpenThreads_OpenThreadsGetVersion" != "xyes"; then
|
||||
if test "x$ac_cv_framework_osg" != "xyes"; then
|
||||
echo
|
||||
echo "You *must* have the OpenThreads library installed on your system"
|
||||
echo "to build this version of SimGear!"
|
||||
echo " Maybe you need to specify --with-osg=DIR."
|
||||
echo " Maybe you need to specify some LDFLAGS to help the linker."
|
||||
echo
|
||||
echo " LIBS: '$LIBS'"
|
||||
echo " LDFLAGS: '$LDFLAGS'"
|
||||
echo " CPPFLAGS: '$CPPFLAGS'"
|
||||
echo
|
||||
echo "Please see README.OSG for more details."
|
||||
echo
|
||||
echo "configure aborted."
|
||||
exit
|
||||
fi
|
||||
fi
|
||||
|
||||
AC_CHECK_HEADER(boost/version.hpp)
|
||||
if test "x$ac_cv_header_boost_version_hpp" != "xyes"; then
|
||||
echo
|
||||
echo "You *must* have the Boost library installed on your system"
|
||||
echo "to build this version of SimGear!"
|
||||
echo
|
||||
echo " LIBS: '$LIBS'"
|
||||
echo " LDFLAGS: '$LDFLAGS'"
|
||||
echo " CPPFLAGS: '$CPPFLAGS'"
|
||||
echo
|
||||
echo "configure aborted."
|
||||
exit
|
||||
fi
|
||||
|
||||
AC_LANG_POP
|
||||
|
||||
dnl Check for system installed zlib
|
||||
AC_CHECK_HEADER(zlib.h)
|
||||
if test "x$ac_cv_header_zlib_h" != "xyes"; then
|
||||
echo
|
||||
echo "zlib library not found."
|
||||
echo
|
||||
echo "If your OS does not provide an installable package for zlib"
|
||||
echo "you will have to compile and install it first yourself. A copy"
|
||||
echo "of zlib-1.1.4.tar.gz is included with SimGear. You will"
|
||||
echo "have to untar this source code, and follow its included instructions"
|
||||
echo "to compile and install on your system."
|
||||
echo
|
||||
echo "configure aborted."
|
||||
echo
|
||||
fi
|
||||
|
||||
dnl Checks for header files.
|
||||
AC_HEADER_STDC
|
||||
AC_CHECK_HEADERS( \
|
||||
fcntl.h getopt.h malloc.h memory.h stdint.h stdlib.h sys/param.h \
|
||||
sys/stat.h sys/time.h sys/timeb.h unistd.h values.h )
|
||||
|
||||
if test "x$ac_cv_header_stdint_h" = "xyes"; then
|
||||
AC_DEFINE([HAVE_STDINT_H], 1, [Define if stdint.h exists])
|
||||
fi
|
||||
|
||||
dnl Checks for typedefs, structures, and compiler characteristics.
|
||||
AC_C_CONST
|
||||
AC_TYPE_SIZE_T
|
||||
AC_TYPE_MODE_T
|
||||
AC_HEADER_TIME
|
||||
AC_STRUCT_TM
|
||||
|
||||
dnl Checks for library functions.
|
||||
old_LIBS=$LIBS
|
||||
LIBS="$base_LIBS $network_LIBS $opengl_LIBS"
|
||||
AC_TYPE_SIGNAL
|
||||
AC_FUNC_VPRINTF
|
||||
AC_CHECK_FUNCS( [ \
|
||||
ftime gettimeofday timegm memcpy bcopy mktime strstr rand \
|
||||
random drand48 setitimer getitimer signal GetLocalTime rint getrusage ] )
|
||||
LIBS=$old_LIBS
|
||||
|
||||
AM_CONFIG_HEADER(simgear/simgear_config.h)
|
||||
|
||||
AC_CONFIG_FILES([ \
|
||||
Makefile \
|
||||
SimGear.spec \
|
||||
simgear/Makefile \
|
||||
simgear/version.h \
|
||||
simgear/compatibility/Makefile \
|
||||
simgear/compatibility/MIPSpro721/Makefile \
|
||||
simgear/compatibility/MIPSpro740/Makefile \
|
||||
simgear/bucket/Makefile \
|
||||
simgear/debug/Makefile \
|
||||
simgear/ephemeris/Makefile \
|
||||
simgear/io/Makefile \
|
||||
simgear/magvar/Makefile \
|
||||
simgear/math/Makefile \
|
||||
simgear/environment/Makefile \
|
||||
simgear/misc/Makefile \
|
||||
simgear/nasal/Makefile \
|
||||
simgear/props/Makefile \
|
||||
simgear/route/Makefile \
|
||||
simgear/scene/Makefile \
|
||||
simgear/scene/bvh/Makefile \
|
||||
simgear/scene/material/Makefile \
|
||||
simgear/scene/model/Makefile \
|
||||
simgear/scene/sky/Makefile \
|
||||
simgear/scene/tgdb/Makefile \
|
||||
simgear/scene/util/Makefile \
|
||||
simgear/screen/Makefile \
|
||||
simgear/serial/Makefile \
|
||||
simgear/sound/Makefile \
|
||||
simgear/structure/Makefile \
|
||||
simgear/threads/Makefile \
|
||||
simgear/timing/Makefile \
|
||||
simgear/xml/Makefile \
|
||||
])
|
||||
AC_OUTPUT
|
||||
|
||||
|
||||
echo ""
|
||||
echo "Configure Summary"
|
||||
echo "================="
|
||||
|
||||
echo "Prefix: $prefix"
|
||||
|
||||
if test "x$with_logging" != "x"; then
|
||||
echo "Debug messages: $with_logging"
|
||||
else
|
||||
echo "Debug messages: yes"
|
||||
fi
|
||||
|
||||
echo -n "Automake version: "
|
||||
automake --version | head -1
|
||||
|
||||
if test "x$with_jpeg_factory" = "xyes"; then
|
||||
echo "With JPEG Factory support"
|
||||
else
|
||||
echo "Without JPEG Factory support"
|
||||
fi
|
||||
|
||||
if test "x$ac_cv_header_pthread_h" = "xyes"; then
|
||||
echo "Threads: pthread lib found."
|
||||
else
|
||||
echo "Threads: no threads (pthread lib not found.)"
|
||||
fi
|
||||
|
||||
5
projects/VC100/.gitignore
vendored
5
projects/VC100/.gitignore
vendored
@@ -1,5 +0,0 @@
|
||||
Win32
|
||||
x64
|
||||
*.user
|
||||
*.sdf
|
||||
*.suo
|
||||
2
projects/VC100/README
Normal file
2
projects/VC100/README
Normal file
@@ -0,0 +1,2 @@
|
||||
The handmade VS2010 project files have been replaced by the Cmake build system.
|
||||
Please use Cmake to build FlightGear with Visual Studio 2010.
|
||||
@@ -1,37 +0,0 @@
|
||||
|
||||
Microsoft Visual Studio Solution File, Format Version 11.00
|
||||
# Visual Studio 2010
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "SimGear-install", "SimGear-install.vcxproj", "{1781C058-4D52-43AB-9028-EA0A7730057D}"
|
||||
ProjectSection(ProjectDependencies) = postProject
|
||||
{22540CD3-D3CA-4C86-A773-80AEEE3ACDED} = {22540CD3-D3CA-4C86-A773-80AEEE3ACDED}
|
||||
EndProjectSection
|
||||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "SimGear", "SimGear.vcxproj", "{22540CD3-D3CA-4C86-A773-80AEEE3ACDED}"
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
Debug|Win32 = Debug|Win32
|
||||
Debug|x64 = Debug|x64
|
||||
Release|Win32 = Release|Win32
|
||||
Release|x64 = Release|x64
|
||||
EndGlobalSection
|
||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||
{1781C058-4D52-43AB-9028-EA0A7730057D}.Debug|Win32.ActiveCfg = Debug|Win32
|
||||
{1781C058-4D52-43AB-9028-EA0A7730057D}.Debug|Win32.Build.0 = Debug|Win32
|
||||
{1781C058-4D52-43AB-9028-EA0A7730057D}.Debug|x64.ActiveCfg = Debug|Win32
|
||||
{1781C058-4D52-43AB-9028-EA0A7730057D}.Release|Win32.ActiveCfg = Release|Win32
|
||||
{1781C058-4D52-43AB-9028-EA0A7730057D}.Release|Win32.Build.0 = Release|Win32
|
||||
{1781C058-4D52-43AB-9028-EA0A7730057D}.Release|x64.ActiveCfg = Release|Win32
|
||||
{22540CD3-D3CA-4C86-A773-80AEEE3ACDED}.Debug|Win32.ActiveCfg = Debug|Win32
|
||||
{22540CD3-D3CA-4C86-A773-80AEEE3ACDED}.Debug|Win32.Build.0 = Debug|Win32
|
||||
{22540CD3-D3CA-4C86-A773-80AEEE3ACDED}.Debug|x64.ActiveCfg = Debug|x64
|
||||
{22540CD3-D3CA-4C86-A773-80AEEE3ACDED}.Debug|x64.Build.0 = Debug|x64
|
||||
{22540CD3-D3CA-4C86-A773-80AEEE3ACDED}.Release|Win32.ActiveCfg = Release|Win32
|
||||
{22540CD3-D3CA-4C86-A773-80AEEE3ACDED}.Release|Win32.Build.0 = Release|Win32
|
||||
{22540CD3-D3CA-4C86-A773-80AEEE3ACDED}.Release|x64.ActiveCfg = Release|x64
|
||||
{22540CD3-D3CA-4C86-A773-80AEEE3ACDED}.Release|x64.Build.0 = Release|x64
|
||||
EndGlobalSection
|
||||
GlobalSection(SolutionProperties) = preSolution
|
||||
HideSolutionNode = FALSE
|
||||
EndGlobalSection
|
||||
EndGlobal
|
||||
@@ -1,67 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<ItemGroup Label="ProjectConfigurations">
|
||||
<ProjectConfiguration Include="Debug|Win32">
|
||||
<Configuration>Debug</Configuration>
|
||||
<Platform>Win32</Platform>
|
||||
</ProjectConfiguration>
|
||||
<ProjectConfiguration Include="Release|Win32">
|
||||
<Configuration>Release</Configuration>
|
||||
<Platform>Win32</Platform>
|
||||
</ProjectConfiguration>
|
||||
</ItemGroup>
|
||||
<PropertyGroup Label="Globals">
|
||||
<ProjectGuid>{1781C058-4D52-43AB-9028-EA0A7730057D}</ProjectGuid>
|
||||
<RootNamespace>SimGearinstall</RootNamespace>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
|
||||
<ConfigurationType>Application</ConfigurationType>
|
||||
<UseDebugLibraries>true</UseDebugLibraries>
|
||||
<CharacterSet>MultiByte</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
|
||||
<ConfigurationType>Application</ConfigurationType>
|
||||
<UseDebugLibraries>false</UseDebugLibraries>
|
||||
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||
<CharacterSet>MultiByte</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
||||
<ImportGroup Label="ExtensionSettings">
|
||||
</ImportGroup>
|
||||
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
</ImportGroup>
|
||||
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
</ImportGroup>
|
||||
<PropertyGroup Label="UserMacros" />
|
||||
<PropertyGroup />
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||
<ClCompile>
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<Optimization>Disabled</Optimization>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||
<ClCompile>
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<Optimization>MaxSpeed</Optimization>
|
||||
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||
<OptimizeReferences>true</OptimizeReferences>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemGroup>
|
||||
</ItemGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
||||
<ImportGroup Label="ExtensionTargets">
|
||||
</ImportGroup>
|
||||
</Project>
|
||||
@@ -1,17 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<ItemGroup>
|
||||
<Filter Include="Fichiers sources">
|
||||
<UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
|
||||
<Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
|
||||
</Filter>
|
||||
<Filter Include="Fichiers d%27en-tête">
|
||||
<UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
|
||||
<Extensions>h;hpp;hxx;hm;inl;inc;xsd</Extensions>
|
||||
</Filter>
|
||||
<Filter Include="Fichiers de ressources">
|
||||
<UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
|
||||
<Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
|
||||
</Filter>
|
||||
</ItemGroup>
|
||||
</Project>
|
||||
@@ -1,607 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<ItemGroup Label="ProjectConfigurations">
|
||||
<ProjectConfiguration Include="Debug|Win32">
|
||||
<Configuration>Debug</Configuration>
|
||||
<Platform>Win32</Platform>
|
||||
</ProjectConfiguration>
|
||||
<ProjectConfiguration Include="Debug|x64">
|
||||
<Configuration>Debug</Configuration>
|
||||
<Platform>x64</Platform>
|
||||
</ProjectConfiguration>
|
||||
<ProjectConfiguration Include="Release|Win32">
|
||||
<Configuration>Release</Configuration>
|
||||
<Platform>Win32</Platform>
|
||||
</ProjectConfiguration>
|
||||
<ProjectConfiguration Include="Release|x64">
|
||||
<Configuration>Release</Configuration>
|
||||
<Platform>x64</Platform>
|
||||
</ProjectConfiguration>
|
||||
</ItemGroup>
|
||||
<PropertyGroup Label="Globals">
|
||||
<ProjectGuid>{22540CD3-D3CA-4C86-A773-80AEEE3ACDED}</ProjectGuid>
|
||||
<RootNamespace>SimGear</RootNamespace>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
|
||||
<ConfigurationType>StaticLibrary</ConfigurationType>
|
||||
<UseOfMfc>false</UseOfMfc>
|
||||
<CharacterSet>MultiByte</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
|
||||
<ConfigurationType>StaticLibrary</ConfigurationType>
|
||||
<UseOfMfc>false</UseOfMfc>
|
||||
<CharacterSet>MultiByte</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
|
||||
<ConfigurationType>StaticLibrary</ConfigurationType>
|
||||
<UseOfMfc>false</UseOfMfc>
|
||||
<CharacterSet>MultiByte</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
|
||||
<ConfigurationType>StaticLibrary</ConfigurationType>
|
||||
<UseOfMfc>false</UseOfMfc>
|
||||
<CharacterSet>MultiByte</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
||||
<ImportGroup Label="ExtensionSettings">
|
||||
</ImportGroup>
|
||||
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
<Import Project="$(VCTargetsPath)Microsoft.CPP.UpgradeFromVC71.props" />
|
||||
</ImportGroup>
|
||||
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
<Import Project="$(VCTargetsPath)Microsoft.CPP.UpgradeFromVC71.props" />
|
||||
</ImportGroup>
|
||||
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
<Import Project="$(VCTargetsPath)Microsoft.CPP.UpgradeFromVC71.props" />
|
||||
</ImportGroup>
|
||||
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
<Import Project="$(VCTargetsPath)Microsoft.CPP.UpgradeFromVC71.props" />
|
||||
</ImportGroup>
|
||||
<PropertyGroup Label="UserMacros" />
|
||||
<PropertyGroup>
|
||||
<_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>
|
||||
<OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(Platform)\$(Configuration)\</OutDir>
|
||||
<IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(Platform)\$(Configuration)\</IntDir>
|
||||
<OutDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(Platform)\$(Configuration)\</OutDir>
|
||||
<IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(Platform)\$(Configuration)\</IntDir>
|
||||
<OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(Platform)\$(Configuration)\</OutDir>
|
||||
<IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(Platform)\$(Configuration)\</IntDir>
|
||||
<OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(Platform)\$(Configuration)\</OutDir>
|
||||
<IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(Platform)\$(Configuration)\</IntDir>
|
||||
<CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
|
||||
<CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />
|
||||
<CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />
|
||||
<CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">AllRules.ruleset</CodeAnalysisRuleSet>
|
||||
<CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />
|
||||
<CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />
|
||||
<CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
|
||||
<CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />
|
||||
<CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />
|
||||
<CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|x64'">AllRules.ruleset</CodeAnalysisRuleSet>
|
||||
<CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />
|
||||
<CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />
|
||||
</PropertyGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||
<ClCompile>
|
||||
<InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>
|
||||
<AdditionalIncludeDirectories>..\..;..\..\simgear;..\..\..;..\..\..\install\msvc100\OpenSceneGraph\include;..\..\..\3rdparty\include;..\..\..\boost_1_44_0;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<PreprocessorDefinitions>HAVE_CONFIG_H;NDEBUG;WIN32;_USE_MATH_DEFINES;_CRT_SECURE_NO_WARNINGS;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<StringPooling>true</StringPooling>
|
||||
<RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
|
||||
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||
<RuntimeTypeInfo>true</RuntimeTypeInfo>
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<SuppressStartupBanner>true</SuppressStartupBanner>
|
||||
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
|
||||
<CompileAs>Default</CompileAs>
|
||||
</ClCompile>
|
||||
<ResourceCompile>
|
||||
<PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<Culture>0x0409</Culture>
|
||||
</ResourceCompile>
|
||||
<Lib>
|
||||
<SuppressStartupBanner>true</SuppressStartupBanner>
|
||||
</Lib>
|
||||
<ProjectReference />
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||
<Midl>
|
||||
<TargetEnvironment>X64</TargetEnvironment>
|
||||
</Midl>
|
||||
<ClCompile>
|
||||
<InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
|
||||
<AdditionalIncludeDirectories>..\..;..\..\simgear;..\..\..;..\..\..\install\msvc100-64\OpenSceneGraph\include;..\..\..\3rdparty.x64\include;..\..\..\boost_1_44_0;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<PreprocessorDefinitions>HAVE_CONFIG_H;NDEBUG;WIN32;_USE_MATH_DEFINES;_CRT_SECURE_NO_WARNINGS;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<StringPooling>true</StringPooling>
|
||||
<RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
|
||||
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||
<RuntimeTypeInfo>true</RuntimeTypeInfo>
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<SuppressStartupBanner>true</SuppressStartupBanner>
|
||||
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
|
||||
<CompileAs>Default</CompileAs>
|
||||
</ClCompile>
|
||||
<ResourceCompile>
|
||||
<PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<Culture>0x0409</Culture>
|
||||
</ResourceCompile>
|
||||
<Lib>
|
||||
<SuppressStartupBanner>true</SuppressStartupBanner>
|
||||
</Lib>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||
<ClCompile>
|
||||
<Optimization>Disabled</Optimization>
|
||||
<AdditionalIncludeDirectories>..\..;..\..\simgear;..\..\..;..\..\..\install\msvc100\OpenSceneGraph\include;..\..\..\3rdparty\include;..\..\..\boost_1_44_0;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<PreprocessorDefinitions>HAVE_CONFIG_H;_DEBUG;WIN32;_USE_MATH_DEFINES;_CRT_SECURE_NO_WARNINGS;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
|
||||
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
|
||||
<RuntimeTypeInfo>true</RuntimeTypeInfo>
|
||||
<BrowseInformation>true</BrowseInformation>
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<SuppressStartupBanner>true</SuppressStartupBanner>
|
||||
<DebugInformationFormat>EditAndContinue</DebugInformationFormat>
|
||||
<CompileAs>Default</CompileAs>
|
||||
</ClCompile>
|
||||
<ResourceCompile>
|
||||
<PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<Culture>0x0409</Culture>
|
||||
</ResourceCompile>
|
||||
<Lib>
|
||||
<SuppressStartupBanner>true</SuppressStartupBanner>
|
||||
</Lib>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||
<Midl>
|
||||
<TargetEnvironment>X64</TargetEnvironment>
|
||||
</Midl>
|
||||
<ClCompile>
|
||||
<Optimization>Disabled</Optimization>
|
||||
<AdditionalIncludeDirectories>..\..;..\..\simgear;..\..\..;..\..\..\install\msvc100-64\OpenSceneGraph\include;..\..\..\3rdparty.x64\include;..\..\..\boost_1_44_0;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<PreprocessorDefinitions>HAVE_CONFIG_H;_DEBUG;WIN32;_USE_MATH_DEFINES;_CRT_SECURE_NO_WARNINGS;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
|
||||
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
|
||||
<RuntimeTypeInfo>true</RuntimeTypeInfo>
|
||||
<BrowseInformation>true</BrowseInformation>
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<SuppressStartupBanner>true</SuppressStartupBanner>
|
||||
<DebugInformationFormat>EditAndContinue</DebugInformationFormat>
|
||||
<CompileAs>Default</CompileAs>
|
||||
</ClCompile>
|
||||
<ResourceCompile>
|
||||
<PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<Culture>0x0409</Culture>
|
||||
</ResourceCompile>
|
||||
<Lib>
|
||||
<SuppressStartupBanner>true</SuppressStartupBanner>
|
||||
</Lib>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemGroup>
|
||||
<ClCompile Include="..\..\simgear\bucket\newbucket.cxx" />
|
||||
<ClCompile Include="..\..\simgear\debug\logstream.cxx" />
|
||||
<ClCompile Include="..\..\simgear\ephemeris\celestialBody.cxx" />
|
||||
<ClCompile Include="..\..\simgear\ephemeris\ephemeris.cxx" />
|
||||
<ClCompile Include="..\..\simgear\ephemeris\jupiter.cxx" />
|
||||
<ClCompile Include="..\..\simgear\ephemeris\mars.cxx" />
|
||||
<ClCompile Include="..\..\simgear\ephemeris\mercury.cxx" />
|
||||
<ClCompile Include="..\..\simgear\ephemeris\moonpos.cxx" />
|
||||
<ClCompile Include="..\..\simgear\ephemeris\neptune.cxx" />
|
||||
<ClCompile Include="..\..\simgear\ephemeris\saturn.cxx" />
|
||||
<ClCompile Include="..\..\simgear\ephemeris\star.cxx" />
|
||||
<ClCompile Include="..\..\simgear\ephemeris\stardata.cxx" />
|
||||
<ClCompile Include="..\..\simgear\ephemeris\uranus.cxx" />
|
||||
<ClCompile Include="..\..\simgear\ephemeris\venus.cxx" />
|
||||
<ClCompile Include="..\..\simgear\io\iochannel.cxx" />
|
||||
<ClCompile Include="..\..\simgear\io\lowlevel.cxx" />
|
||||
<ClCompile Include="..\..\simgear\io\raw_socket.cxx" />
|
||||
<ClCompile Include="..\..\simgear\io\sg_binobj.cxx" />
|
||||
<ClCompile Include="..\..\simgear\io\sg_file.cxx" />
|
||||
<ClCompile Include="..\..\simgear\io\sg_netBuffer.cxx" />
|
||||
<ClCompile Include="..\..\simgear\io\sg_netChannel.cxx" />
|
||||
<ClCompile Include="..\..\simgear\io\sg_netChat.cxx" />
|
||||
<ClCompile Include="..\..\simgear\io\sg_serial.cxx" />
|
||||
<ClCompile Include="..\..\simgear\io\sg_socket.cxx" />
|
||||
<ClCompile Include="..\..\simgear\io\sg_socket_udp.cxx" />
|
||||
<ClCompile Include="..\..\simgear\magvar\coremag.cxx" />
|
||||
<ClCompile Include="..\..\simgear\magvar\magvar.cxx" />
|
||||
<ClCompile Include="..\..\simgear\math\interpolater.cxx" />
|
||||
<ClCompile Include="..\..\simgear\math\leastsqs.cxx" />
|
||||
<ClCompile Include="..\..\simgear\math\project.cxx" />
|
||||
<ClCompile Include="..\..\simgear\math\sg_random.c" />
|
||||
<ClCompile Include="..\..\simgear\math\SGGeod.cxx" />
|
||||
<ClCompile Include="..\..\simgear\math\SGGeodesy.cxx" />
|
||||
<ClCompile Include="..\..\simgear\misc\interpolator.cxx" />
|
||||
<ClCompile Include="..\..\simgear\misc\PathOptions.cxx" />
|
||||
<ClCompile Include="..\..\simgear\misc\sg_dir.cxx" />
|
||||
<ClCompile Include="..\..\simgear\misc\sg_path.cxx" />
|
||||
<ClCompile Include="..\..\simgear\misc\sgstream.cxx" />
|
||||
<ClCompile Include="..\..\simgear\misc\sg_sleep.cxx" />
|
||||
<ClCompile Include="..\..\simgear\misc\strutils.cxx" />
|
||||
<ClCompile Include="..\..\simgear\misc\tabbed_values.cxx" />
|
||||
<ClCompile Include="..\..\simgear\misc\texcoord.cxx" />
|
||||
<ClCompile Include="..\..\simgear\misc\zfstream.cxx" />
|
||||
<ClCompile Include="..\..\simgear\misc\ResourceManager.cxx" />
|
||||
<ClCompile Include="..\..\simgear\props\propertyObject.cxx" />
|
||||
<ClCompile Include="..\..\simgear\route\route.cxx" />
|
||||
<ClCompile Include="..\..\simgear\route\waypoint.cxx" />
|
||||
<ClCompile Include="..\..\simgear\scene\material\mipmap.cxx" />
|
||||
<ClCompile Include="..\..\simgear\scene\model\ConditionNode.cxx" />
|
||||
<ClCompile Include="..\..\simgear\screen\extensions.cxx" />
|
||||
<ClCompile Include="..\..\simgear\screen\jpgfactory.cxx" />
|
||||
<ClCompile Include="..\..\simgear\screen\screen-dump.cxx" />
|
||||
<ClCompile Include="..\..\simgear\screen\tr.cxx" />
|
||||
<ClCompile Include="..\..\simgear\serial\serial.cxx" />
|
||||
<ClCompile Include="..\..\simgear\scene\sky\cloud.cxx" />
|
||||
<ClCompile Include="..\..\simgear\scene\sky\cloudfield.cxx" />
|
||||
<ClCompile Include="..\..\simgear\scene\sky\CloudShaderGeometry.cxx" />
|
||||
<ClCompile Include="..\..\simgear\scene\sky\dome.cxx" />
|
||||
<ClCompile Include="..\..\simgear\scene\sky\moon.cxx" />
|
||||
<ClCompile Include="..\..\simgear\scene\sky\newcloud.cxx" />
|
||||
<ClCompile Include="..\..\simgear\scene\sky\oursun.cxx" />
|
||||
<ClCompile Include="..\..\simgear\scene\sky\sky.cxx" />
|
||||
<ClCompile Include="..\..\simgear\scene\sky\sphere.cxx" />
|
||||
<ClCompile Include="..\..\simgear\scene\sky\stars.cxx" />
|
||||
<ClCompile Include="..\..\simgear\timing\lowleveltime.cxx" />
|
||||
<ClCompile Include="..\..\simgear\timing\sg_time.cxx" />
|
||||
<ClCompile Include="..\..\simgear\timing\timestamp.cxx" />
|
||||
<ClCompile Include="..\..\simgear\timing\timezone.cxx" />
|
||||
<ClCompile Include="..\..\simgear\xml\easyxml.cxx" />
|
||||
<ClCompile Include="..\..\simgear\xml\hashtable.c" />
|
||||
<ClCompile Include="..\..\simgear\xml\xmlparse.c" />
|
||||
<ClCompile Include="..\..\simgear\xml\xmlrole.c" />
|
||||
<ClCompile Include="..\..\simgear\xml\xmltok.c" />
|
||||
<ClCompile Include="..\..\simgear\props\AtomicChangeListener.cxx" />
|
||||
<ClCompile Include="..\..\simgear\props\condition.cxx" />
|
||||
<ClCompile Include="..\..\simgear\props\props.cxx" />
|
||||
<ClCompile Include="..\..\simgear\props\props_io.cxx" />
|
||||
<ClCompile Include="..\..\simgear\scene\model\animation.cxx" />
|
||||
<ClCompile Include="..\..\simgear\scene\model\CheckSceneryVisitor.cxx" />
|
||||
<ClCompile Include="..\..\simgear\scene\model\model.cxx" />
|
||||
<ClCompile Include="..\..\simgear\scene\model\modellib.cxx" />
|
||||
<ClCompile Include="..\..\simgear\scene\model\ModelRegistry.cxx" />
|
||||
<ClCompile Include="..\..\simgear\scene\model\particles.cxx" />
|
||||
<ClCompile Include="..\..\simgear\scene\model\persparam.cxx" />
|
||||
<ClCompile Include="..\..\simgear\scene\model\placement.cxx" />
|
||||
<ClCompile Include="..\..\simgear\scene\model\SGClipGroup.cxx" />
|
||||
<ClCompile Include="..\..\simgear\scene\model\SGInteractionAnimation.cxx" />
|
||||
<ClCompile Include="..\..\simgear\scene\model\SGMaterialAnimation.cxx" />
|
||||
<ClCompile Include="..\..\simgear\scene\model\SGOffsetTransform.cxx" />
|
||||
<ClCompile Include="..\..\simgear\scene\model\SGPagedLOD.cxx" />
|
||||
<ClCompile Include="..\..\simgear\scene\model\SGReaderWriterXML.cxx" />
|
||||
<ClCompile Include="..\..\simgear\scene\model\SGRotateTransform.cxx" />
|
||||
<ClCompile Include="..\..\simgear\scene\model\SGScaleTransform.cxx" />
|
||||
<ClCompile Include="..\..\simgear\scene\model\SGText.cxx" />
|
||||
<ClCompile Include="..\..\simgear\scene\model\SGTranslateTransform.cxx" />
|
||||
<ClCompile Include="..\..\simgear\scene\model\shadanim.cxx" />
|
||||
<ClCompile Include="..\..\simgear\sound\sample_group.cxx" />
|
||||
<ClCompile Include="..\..\simgear\sound\sample_openal.cxx" />
|
||||
<ClCompile Include="..\..\simgear\sound\soundmgr_openal.cxx" />
|
||||
<ClCompile Include="..\..\simgear\sound\xmlsound.cxx" />
|
||||
<ClCompile Include="..\..\simgear\scene\material\Effect.cxx" />
|
||||
<ClCompile Include="..\..\simgear\scene\material\EffectBuilder.cxx" />
|
||||
<ClCompile Include="..\..\simgear\scene\material\EffectCullVisitor.cxx" />
|
||||
<ClCompile Include="..\..\simgear\scene\material\EffectGeode.cxx" />
|
||||
<ClCompile Include="..\..\simgear\scene\material\GLPredicate.cxx" />
|
||||
<ClCompile Include="..\..\simgear\scene\material\makeEffect.cxx" />
|
||||
<ClCompile Include="..\..\simgear\scene\material\mat.cxx" />
|
||||
<ClCompile Include="..\..\simgear\scene\material\matlib.cxx" />
|
||||
<ClCompile Include="..\..\simgear\scene\material\matmodel.cxx" />
|
||||
<ClCompile Include="..\..\simgear\scene\material\Noise.cxx" />
|
||||
<ClCompile Include="..\..\simgear\scene\material\Pass.cxx" />
|
||||
<ClCompile Include="..\..\simgear\scene\material\Technique.cxx" />
|
||||
<ClCompile Include="..\..\simgear\scene\material\TextureBuilder.cxx" />
|
||||
<ClCompile Include="..\..\simgear\scene\tgdb\apt_signs.cxx" />
|
||||
<ClCompile Include="..\..\simgear\scene\tgdb\GroundLightManager.cxx" />
|
||||
<ClCompile Include="..\..\simgear\scene\tgdb\obj.cxx" />
|
||||
<ClCompile Include="..\..\simgear\scene\tgdb\pt_lights.cxx" />
|
||||
<ClCompile Include="..\..\simgear\scene\tgdb\ReaderWriterSTG.cxx" />
|
||||
<ClCompile Include="..\..\simgear\scene\tgdb\SGOceanTile.cxx" />
|
||||
<ClCompile Include="..\..\simgear\scene\tgdb\SGReaderWriterBTG.cxx" />
|
||||
<ClCompile Include="..\..\simgear\scene\tgdb\SGVasiDrawable.cxx" />
|
||||
<ClCompile Include="..\..\simgear\scene\tgdb\ShaderGeometry.cxx" />
|
||||
<ClCompile Include="..\..\simgear\scene\tgdb\TileCache.cxx" />
|
||||
<ClCompile Include="..\..\simgear\scene\tgdb\TileEntry.cxx" />
|
||||
<ClCompile Include="..\..\simgear\scene\tgdb\TreeBin.cxx" />
|
||||
<ClCompile Include="..\..\simgear\scene\tgdb\userdata.cxx" />
|
||||
<ClCompile Include="..\..\simgear\structure\commands.cxx" />
|
||||
<ClCompile Include="..\..\simgear\structure\event_mgr.cxx" />
|
||||
<ClCompile Include="..\..\simgear\structure\exception.cxx">
|
||||
<ObjectFileName Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(IntDir)%(Filename)1.obj</ObjectFileName>
|
||||
<ObjectFileName Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(IntDir)%(Filename)1.obj</ObjectFileName>
|
||||
<ObjectFileName Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(IntDir)%(Filename)1.obj</ObjectFileName>
|
||||
<ObjectFileName Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(IntDir)%(Filename)1.obj</ObjectFileName>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\simgear\structure\SGBinding.cxx" />
|
||||
<ClCompile Include="..\..\simgear\structure\SGExpression.cxx" />
|
||||
<ClCompile Include="..\..\simgear\structure\SGSmplhist.cxx" />
|
||||
<ClCompile Include="..\..\simgear\structure\SGSmplstat.cxx" />
|
||||
<ClCompile Include="..\..\simgear\structure\subsystem_mgr.cxx" />
|
||||
<ClCompile Include="..\..\simgear\nasal\bitslib.c" />
|
||||
<ClCompile Include="..\..\simgear\nasal\code.c" />
|
||||
<ClCompile Include="..\..\simgear\nasal\codegen.c" />
|
||||
<ClCompile Include="..\..\simgear\nasal\gc.c" />
|
||||
<ClCompile Include="..\..\simgear\nasal\hash.c" />
|
||||
<ClCompile Include="..\..\simgear\nasal\iolib.c" />
|
||||
<ClCompile Include="..\..\simgear\nasal\lex.c" />
|
||||
<ClCompile Include="..\..\simgear\nasal\lib.c" />
|
||||
<ClCompile Include="..\..\simgear\nasal\mathlib.c" />
|
||||
<ClCompile Include="..\..\simgear\nasal\misc.c" />
|
||||
<ClCompile Include="..\..\simgear\nasal\parse.c" />
|
||||
<ClCompile Include="..\..\simgear\nasal\string.c">
|
||||
<Optimization Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">MinSpace</Optimization>
|
||||
<InlineFunctionExpansion Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">OnlyExplicitInline</InlineFunctionExpansion>
|
||||
<Optimization Condition="'$(Configuration)|$(Platform)'=='Release|x64'">MinSpace</Optimization>
|
||||
<InlineFunctionExpansion Condition="'$(Configuration)|$(Platform)'=='Release|x64'">OnlyExplicitInline</InlineFunctionExpansion>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\simgear\nasal\thread-win32.c" />
|
||||
<ClCompile Include="..\..\simgear\nasal\threadlib.c" />
|
||||
<ClCompile Include="..\..\simgear\nasal\utf8lib.c" />
|
||||
<ClCompile Include="..\..\simgear\nasal\vector.c">
|
||||
<ObjectFileName Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(IntDir)%(Filename)1.obj</ObjectFileName>
|
||||
<ObjectFileName Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(IntDir)%(Filename)1.obj</ObjectFileName>
|
||||
<ObjectFileName Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(IntDir)%(Filename)1.obj</ObjectFileName>
|
||||
<ObjectFileName Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(IntDir)%(Filename)1.obj</ObjectFileName>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\simgear\environment\metar.cxx" />
|
||||
<ClCompile Include="..\..\simgear\environment\precipitation.cxx" />
|
||||
<ClCompile Include="..\..\simgear\environment\visual_enviro.cxx" />
|
||||
<ClCompile Include="..\..\simgear\scene\util\CopyOp.cxx" />
|
||||
<ClCompile Include="..\..\simgear\scene\util\NodeAndDrawableVisitor.cxx" />
|
||||
<ClCompile Include="..\..\simgear\scene\util\PrimitiveUtils.cxx" />
|
||||
<ClCompile Include="..\..\simgear\scene\util\QuadTreeBuilder.cxx" />
|
||||
<ClCompile Include="..\..\simgear\scene\util\SGEnlargeBoundingBox.cxx" />
|
||||
<ClCompile Include="..\..\simgear\scene\util\SGSceneFeatures.cxx" />
|
||||
<ClCompile Include="..\..\simgear\scene\util\SGSceneUserData.cxx" />
|
||||
<ClCompile Include="..\..\simgear\scene\util\SGStateAttributeVisitor.cxx" />
|
||||
<ClCompile Include="..\..\simgear\scene\util\SGTextureStateAttributeVisitor.cxx" />
|
||||
<ClCompile Include="..\..\simgear\scene\util\SplicingVisitor.cxx" />
|
||||
<ClCompile Include="..\..\simgear\scene\util\StateAttributeFactory.cxx" />
|
||||
<ClCompile Include="..\..\simgear\scene\util\UpdateOnceCallback.cxx" />
|
||||
<ClCompile Include="..\..\simgear\scene\bvh\BVHGroup.cxx" />
|
||||
<ClCompile Include="..\..\simgear\scene\bvh\BVHLineGeometry.cxx" />
|
||||
<ClCompile Include="..\..\simgear\scene\bvh\BVHLineSegmentVisitor.cxx" />
|
||||
<ClCompile Include="..\..\simgear\scene\bvh\BVHMotionTransform.cxx" />
|
||||
<ClCompile Include="..\..\simgear\scene\bvh\BVHNode.cxx" />
|
||||
<ClCompile Include="..\..\simgear\scene\bvh\BVHStaticBinary.cxx" />
|
||||
<ClCompile Include="..\..\simgear\scene\bvh\BVHStaticGeometry.cxx" />
|
||||
<ClCompile Include="..\..\simgear\scene\bvh\BVHStaticLeaf.cxx" />
|
||||
<ClCompile Include="..\..\simgear\scene\bvh\BVHStaticNode.cxx" />
|
||||
<ClCompile Include="..\..\simgear\scene\bvh\BVHStaticTriangle.cxx" />
|
||||
<ClCompile Include="..\..\simgear\scene\bvh\BVHSubTreeCollector.cxx" />
|
||||
<ClCompile Include="..\..\simgear\scene\bvh\BVHTransform.cxx" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClInclude Include="..\..\simgear\bucket\newbucket.hxx" />
|
||||
<ClInclude Include="..\..\simgear\debug\debug_types.h" />
|
||||
<ClInclude Include="..\..\simgear\debug\logstream.hxx" />
|
||||
<ClInclude Include="..\..\simgear\ephemeris\celestialBody.hxx" />
|
||||
<ClInclude Include="..\..\simgear\ephemeris\ephemeris.hxx" />
|
||||
<ClInclude Include="..\..\simgear\ephemeris\jupiter.hxx" />
|
||||
<ClInclude Include="..\..\simgear\ephemeris\mars.hxx" />
|
||||
<ClInclude Include="..\..\simgear\ephemeris\mercury.hxx" />
|
||||
<ClInclude Include="..\..\simgear\ephemeris\moonpos.hxx" />
|
||||
<ClInclude Include="..\..\simgear\ephemeris\neptune.hxx" />
|
||||
<ClInclude Include="..\..\simgear\ephemeris\pluto.hxx" />
|
||||
<ClInclude Include="..\..\simgear\ephemeris\saturn.hxx" />
|
||||
<ClInclude Include="..\..\simgear\ephemeris\star.hxx" />
|
||||
<ClInclude Include="..\..\simgear\ephemeris\stardata.hxx" />
|
||||
<ClInclude Include="..\..\simgear\ephemeris\uranus.hxx" />
|
||||
<ClInclude Include="..\..\simgear\ephemeris\venus.hxx" />
|
||||
<ClInclude Include="..\..\simgear\io\iochannel.hxx" />
|
||||
<ClInclude Include="..\..\simgear\io\lowlevel.hxx" />
|
||||
<ClInclude Include="..\..\simgear\io\raw_socket.hxx" />
|
||||
<ClInclude Include="..\..\simgear\io\sg_binobj.hxx" />
|
||||
<ClInclude Include="..\..\simgear\io\sg_file.hxx" />
|
||||
<ClInclude Include="..\..\simgear\io\sg_netBuffer.hxx" />
|
||||
<ClInclude Include="..\..\simgear\io\sg_netChannel.hxx" />
|
||||
<ClInclude Include="..\..\simgear\io\sg_netChat.hxx" />
|
||||
<ClInclude Include="..\..\simgear\io\sg_serial.hxx" />
|
||||
<ClInclude Include="..\..\simgear\io\sg_socket.hxx" />
|
||||
<ClInclude Include="..\..\simgear\io\sg_socket_udp.hxx" />
|
||||
<ClInclude Include="..\..\simgear\magvar\coremag.hxx" />
|
||||
<ClInclude Include="..\..\simgear\magvar\magvar.hxx" />
|
||||
<ClInclude Include="..\..\simgear\math\beziercurve.hxx" />
|
||||
<ClInclude Include="..\..\simgear\math\interpolater.hxx" />
|
||||
<ClInclude Include="..\..\simgear\math\leastsqs.hxx" />
|
||||
<ClInclude Include="..\..\simgear\math\linintp2.h" />
|
||||
<ClInclude Include="..\..\simgear\math\localconsts.hxx" />
|
||||
<ClInclude Include="..\..\simgear\math\point3d.hxx" />
|
||||
<ClInclude Include="..\..\simgear\math\polar3d.hxx" />
|
||||
<ClInclude Include="..\..\simgear\math\project.hxx" />
|
||||
<ClInclude Include="..\..\simgear\math\sg_geodesy.hxx" />
|
||||
<ClInclude Include="..\..\simgear\math\sg_random.h" />
|
||||
<ClInclude Include="..\..\simgear\math\sg_types.hxx" />
|
||||
<ClInclude Include="..\..\simgear\math\SGGeodesy.hxx" />
|
||||
<ClInclude Include="..\..\simgear\math\sphrintp.h" />
|
||||
<ClInclude Include="..\..\simgear\misc\interpolator.hxx" />
|
||||
<ClInclude Include="..\..\simgear\misc\PathOptions.hxx" />
|
||||
<ClInclude Include="..\..\simgear\misc\sg_dir.hxx" />
|
||||
<ClInclude Include="..\..\simgear\misc\sg_path.hxx" />
|
||||
<ClInclude Include="..\..\simgear\misc\sgstream.hxx" />
|
||||
<ClInclude Include="..\..\simgear\misc\sg_sleep.hxx" />
|
||||
<ClInclude Include="..\..\simgear\misc\stopwatch.hxx" />
|
||||
<ClInclude Include="..\..\simgear\misc\strutils.hxx" />
|
||||
<ClInclude Include="..\..\simgear\misc\tabbed_values.hxx" />
|
||||
<ClInclude Include="..\..\simgear\misc\texcoord.hxx" />
|
||||
<ClInclude Include="..\..\simgear\misc\zfstream.hxx" />
|
||||
<ClInclude Include="..\..\simgear\misc\ResourceManager.hxx" />
|
||||
<ClInclude Include="..\..\simgear\props\propertyObject.hxx" />
|
||||
<ClInclude Include="..\..\simgear\route\route.hxx" />
|
||||
<ClInclude Include="..\..\simgear\route\waypoint.hxx" />
|
||||
<ClInclude Include="..\..\simgear\scene\material\mipmap.hxx" />
|
||||
<ClInclude Include="..\..\simgear\scene\model\ConditionNode.hxx" />
|
||||
<ClInclude Include="..\..\simgear\screen\colors.hxx" />
|
||||
<ClInclude Include="..\..\simgear\screen\extensions.hxx" />
|
||||
<ClInclude Include="..\..\simgear\screen\jpgfactory.hxx" />
|
||||
<ClInclude Include="..\..\simgear\screen\screen-dump.hxx" />
|
||||
<ClInclude Include="..\..\simgear\screen\tr.h" />
|
||||
<ClInclude Include="..\..\simgear\screen\win32-printer.h" />
|
||||
<ClInclude Include="..\..\simgear\serial\serial.hxx" />
|
||||
<ClInclude Include="..\..\simgear\scene\sky\cloud.hxx" />
|
||||
<ClInclude Include="..\..\simgear\scene\sky\cloudfield.hxx" />
|
||||
<ClInclude Include="..\..\simgear\scene\sky\CloudShaderGeometry.hxx" />
|
||||
<ClInclude Include="..\..\simgear\scene\sky\dome.hxx" />
|
||||
<ClInclude Include="..\..\simgear\scene\sky\moon.hxx" />
|
||||
<ClInclude Include="..\..\simgear\scene\sky\newcloud.hxx" />
|
||||
<ClInclude Include="..\..\simgear\scene\sky\oursun.hxx" />
|
||||
<ClInclude Include="..\..\simgear\scene\sky\sky.hxx" />
|
||||
<ClInclude Include="..\..\simgear\scene\sky\sphere.hxx" />
|
||||
<ClInclude Include="..\..\simgear\scene\sky\stars.hxx" />
|
||||
<ClInclude Include="..\..\simgear\timing\lowleveltime.h" />
|
||||
<ClInclude Include="..\..\simgear\timing\sg_time.hxx" />
|
||||
<ClInclude Include="..\..\simgear\timing\timestamp.hxx" />
|
||||
<ClInclude Include="..\..\simgear\timing\timezone.h" />
|
||||
<ClInclude Include="..\..\simgear\xml\asciitab.h" />
|
||||
<ClInclude Include="..\..\simgear\xml\easyxml.hxx" />
|
||||
<ClInclude Include="..\..\simgear\xml\hashtable.h" />
|
||||
<ClInclude Include="..\..\simgear\xml\iasciitab.h" />
|
||||
<ClInclude Include="..\..\simgear\xml\latin1tab.h" />
|
||||
<ClInclude Include="..\..\simgear\xml\nametab.h" />
|
||||
<ClInclude Include="..\..\simgear\xml\utf8tab.h" />
|
||||
<ClInclude Include="..\..\simgear\xml\xmldef.h" />
|
||||
<ClInclude Include="..\..\simgear\xml\xmlparse.h" />
|
||||
<ClInclude Include="..\..\simgear\xml\xmlrole.h" />
|
||||
<ClInclude Include="..\..\simgear\xml\xmltok.h" />
|
||||
<ClInclude Include="..\..\simgear\xml\xmltok_impl.h" />
|
||||
<ClInclude Include="..\..\simgear\props\AtomicChangeListener.hxx" />
|
||||
<ClInclude Include="..\..\simgear\props\condition.hxx" />
|
||||
<ClInclude Include="..\..\simgear\props\ExtendedPropertyAdapter.hxx" />
|
||||
<ClInclude Include="..\..\simgear\props\props.hxx" />
|
||||
<ClInclude Include="..\..\simgear\props\props_io.hxx" />
|
||||
<ClInclude Include="..\..\simgear\scene\model\animation.hxx" />
|
||||
<ClInclude Include="..\..\simgear\scene\model\CheckSceneryVisitor.hxx" />
|
||||
<ClInclude Include="..\..\simgear\scene\model\model.hxx" />
|
||||
<ClInclude Include="..\..\simgear\scene\model\modellib.hxx" />
|
||||
<ClInclude Include="..\..\simgear\scene\model\ModelRegistry.hxx" />
|
||||
<ClInclude Include="..\..\simgear\scene\model\particles.hxx" />
|
||||
<ClInclude Include="..\..\simgear\scene\model\persparam.hxx" />
|
||||
<ClInclude Include="..\..\simgear\scene\model\placement.hxx" />
|
||||
<ClInclude Include="..\..\simgear\scene\model\SGClipGroup.hxx" />
|
||||
<ClInclude Include="..\..\simgear\scene\model\SGInteractionAnimation.hxx" />
|
||||
<ClInclude Include="..\..\simgear\scene\model\SGMaterialAnimation.hxx" />
|
||||
<ClInclude Include="..\..\simgear\scene\model\SGOffsetTransform.hxx" />
|
||||
<ClInclude Include="..\..\simgear\scene\model\SGPagedLOD.hxx" />
|
||||
<ClInclude Include="..\..\simgear\scene\model\SGReaderWriterXML.hxx" />
|
||||
<ClInclude Include="..\..\simgear\scene\model\SGReaderWriterXMLOptions.hxx" />
|
||||
<ClInclude Include="..\..\simgear\scene\model\SGRotateTransform.hxx" />
|
||||
<ClInclude Include="..\..\simgear\scene\model\SGScaleTransform.hxx" />
|
||||
<ClInclude Include="..\..\simgear\scene\model\SGText.hxx" />
|
||||
<ClInclude Include="..\..\simgear\scene\model\SGTranslateTransform.hxx" />
|
||||
<ClInclude Include="..\..\simgear\sound\sample_group.hxx" />
|
||||
<ClInclude Include="..\..\simgear\sound\sample_openal.hxx" />
|
||||
<ClInclude Include="..\..\simgear\sound\soundmgr_openal.hxx" />
|
||||
<ClInclude Include="..\..\simgear\sound\xmlsound.hxx" />
|
||||
<ClInclude Include="..\..\simgear\scene\material\Effect.hxx" />
|
||||
<ClInclude Include="..\..\simgear\scene\material\EffectBuilder.hxx" />
|
||||
<ClInclude Include="..\..\simgear\scene\material\EffectCullVisitor.hxx" />
|
||||
<ClInclude Include="..\..\simgear\scene\material\EffectGeode.hxx" />
|
||||
<ClInclude Include="..\..\simgear\scene\material\GLPredicate.hxx" />
|
||||
<ClInclude Include="..\..\simgear\scene\material\mat.hxx" />
|
||||
<ClInclude Include="..\..\simgear\scene\material\matlib.hxx" />
|
||||
<ClInclude Include="..\..\simgear\scene\material\matmodel.hxx" />
|
||||
<ClInclude Include="..\..\simgear\scene\material\Noise.hxx" />
|
||||
<ClInclude Include="..\..\simgear\scene\material\Pass.hxx" />
|
||||
<ClInclude Include="..\..\simgear\scene\material\Technique.hxx" />
|
||||
<ClInclude Include="..\..\simgear\scene\material\TextureBuilder.hxx" />
|
||||
<ClInclude Include="..\..\simgear\scene\tgdb\apt_signs.hxx" />
|
||||
<ClInclude Include="..\..\simgear\scene\tgdb\GroundLightManager.hxx" />
|
||||
<ClInclude Include="..\..\simgear\scene\tgdb\obj.hxx" />
|
||||
<ClInclude Include="..\..\simgear\scene\tgdb\pt_lights.hxx" />
|
||||
<ClInclude Include="..\..\simgear\scene\tgdb\SGModelBin.hxx" />
|
||||
<ClInclude Include="..\..\simgear\scene\tgdb\SGOceanTile.hxx" />
|
||||
<ClInclude Include="..\..\simgear\scene\tgdb\SGReaderWriterBTG.hxx" />
|
||||
<ClInclude Include="..\..\simgear\scene\tgdb\SGReaderWriterBTGOptions.hxx" />
|
||||
<ClInclude Include="..\..\simgear\scene\tgdb\SGVasiDrawable.hxx" />
|
||||
<ClInclude Include="..\..\simgear\scene\tgdb\ShaderGeometry.hxx" />
|
||||
<ClInclude Include="..\..\simgear\scene\tgdb\TileCache.hxx" />
|
||||
<ClInclude Include="..\..\simgear\scene\tgdb\TileEntry.hxx" />
|
||||
<ClInclude Include="..\..\simgear\scene\tgdb\TreeBin.hxx" />
|
||||
<ClInclude Include="..\..\simgear\scene\tgdb\userdata.hxx" />
|
||||
<ClInclude Include="..\..\simgear\threads\SGGuard.hxx" />
|
||||
<ClInclude Include="..\..\simgear\threads\SGQueue.hxx" />
|
||||
<ClInclude Include="..\..\simgear\structure\callback.hxx" />
|
||||
<ClInclude Include="..\..\simgear\structure\commands.hxx" />
|
||||
<ClInclude Include="..\..\simgear\structure\event_mgr.hxx" />
|
||||
<ClInclude Include="..\..\simgear\structure\exception.hxx" />
|
||||
<ClInclude Include="..\..\simgear\structure\OSGVersion.hxx" />
|
||||
<ClInclude Include="..\..\simgear\structure\SGBinding.hxx" />
|
||||
<ClInclude Include="..\..\simgear\structure\SGExpression.hxx" />
|
||||
<ClInclude Include="..\..\simgear\structure\SGReferenced.hxx" />
|
||||
<ClInclude Include="..\..\simgear\structure\SGSharedPtr.hxx" />
|
||||
<ClInclude Include="..\..\simgear\structure\SGSmplhist.hxx" />
|
||||
<ClInclude Include="..\..\simgear\structure\SGSmplstat.hxx" />
|
||||
<ClInclude Include="..\..\simgear\structure\subsystem_mgr.hxx" />
|
||||
<ClInclude Include="..\..\simgear\nasal\code.h" />
|
||||
<ClInclude Include="..\..\simgear\nasal\data.h" />
|
||||
<ClInclude Include="..\..\simgear\nasal\iolib.h" />
|
||||
<ClInclude Include="..\..\simgear\nasal\nasal.h" />
|
||||
<ClInclude Include="..\..\simgear\nasal\parse.h" />
|
||||
<ClInclude Include="..\..\simgear\environment\metar.hxx" />
|
||||
<ClInclude Include="..\..\simgear\environment\precipitation.hxx" />
|
||||
<ClInclude Include="..\..\simgear\environment\visual_enviro.hxx" />
|
||||
<ClInclude Include="..\..\simgear\scene\util\CopyOp.hxx" />
|
||||
<ClInclude Include="..\..\simgear\scene\util\NodeAndDrawableVisitor.hxx" />
|
||||
<ClInclude Include="..\..\simgear\scene\util\PrimitiveUtils.hxx" />
|
||||
<ClInclude Include="..\..\simgear\scene\util\QuadTreeBuilder.hxx" />
|
||||
<ClInclude Include="..\..\simgear\scene\util\RenderConstants.hxx" />
|
||||
<ClInclude Include="..\..\simgear\scene\util\SGDebugDrawCallback.hxx" />
|
||||
<ClInclude Include="..\..\simgear\scene\util\SGEnlargeBoundingBox.hxx" />
|
||||
<ClInclude Include="..\..\simgear\scene\util\SGNodeMasks.hxx" />
|
||||
<ClInclude Include="..\..\simgear\scene\util\SGSceneFeatures.hxx" />
|
||||
<ClInclude Include="..\..\simgear\scene\util\SGSceneUserData.hxx" />
|
||||
<ClInclude Include="..\..\simgear\scene\util\SGStateAttributeVisitor.hxx" />
|
||||
<ClInclude Include="..\..\simgear\scene\util\SGTextureStateAttributeVisitor.hxx" />
|
||||
<ClInclude Include="..\..\simgear\scene\util\SGUpdateVisitor.hxx" />
|
||||
<ClInclude Include="..\..\simgear\scene\util\SplicingVisitor.hxx" />
|
||||
<ClInclude Include="..\..\simgear\scene\util\StateAttributeFactory.hxx" />
|
||||
<ClInclude Include="..\..\simgear\scene\util\UpdateOnceCallback.hxx" />
|
||||
<ClInclude Include="..\..\simgear\scene\bvh\BVHBoundingBoxVisitor.hxx" />
|
||||
<ClInclude Include="..\..\simgear\scene\bvh\BVHDebugCollectVisitor.hxx" />
|
||||
<ClInclude Include="..\..\simgear\scene\bvh\BVHGroup.hxx" />
|
||||
<ClInclude Include="..\..\simgear\scene\bvh\BVHLineGeometry.hxx" />
|
||||
<ClInclude Include="..\..\simgear\scene\bvh\BVHLineSegmentVisitor.hxx" />
|
||||
<ClInclude Include="..\..\simgear\scene\bvh\BVHMotionTransform.hxx" />
|
||||
<ClInclude Include="..\..\simgear\scene\bvh\BVHNode.hxx" />
|
||||
<ClInclude Include="..\..\simgear\scene\bvh\BVHStaticBinary.hxx" />
|
||||
<ClInclude Include="..\..\simgear\scene\bvh\BVHStaticData.hxx" />
|
||||
<ClInclude Include="..\..\simgear\scene\bvh\BVHStaticGeometry.hxx" />
|
||||
<ClInclude Include="..\..\simgear\scene\bvh\BVHStaticGeometryBuilder.hxx" />
|
||||
<ClInclude Include="..\..\simgear\scene\bvh\BVHStaticLeaf.hxx" />
|
||||
<ClInclude Include="..\..\simgear\scene\bvh\BVHStaticNode.hxx" />
|
||||
<ClInclude Include="..\..\simgear\scene\bvh\BVHStaticTriangle.hxx" />
|
||||
<ClInclude Include="..\..\simgear\scene\bvh\BVHSubTreeCollector.hxx" />
|
||||
<ClInclude Include="..\..\simgear\scene\bvh\BVHTransform.hxx" />
|
||||
<ClInclude Include="..\..\simgear\scene\bvh\BVHVisitor.hxx" />
|
||||
<ClInclude Include="..\..\simgear\compiler.h" />
|
||||
<ClInclude Include="..\..\simgear\version.h" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<None Include="..\..\simgear\math\linintp2.inl" />
|
||||
<CustomBuild Include="..\..\simgear\simgear_config.h-msvc90">
|
||||
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Generation of simgear_config.h</Message>
|
||||
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">copy %(FullPath) %(RootDir)%(Directory)\%(Filename).h
|
||||
</Command>
|
||||
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\simgear\simgear_config.h;%(Outputs)</Outputs>
|
||||
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Generation of simgear_config.h</Message>
|
||||
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">copy %(FullPath) %(RootDir)%(Directory)\%(Filename).h
|
||||
</Command>
|
||||
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">..\..\simgear\simgear_config.h;%(Outputs)</Outputs>
|
||||
<Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Generation of simgear_config.h</Message>
|
||||
<Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">copy %(FullPath) %(RootDir)%(Directory)\%(Filename).h
|
||||
</Command>
|
||||
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\simgear\simgear_config.h;%(Outputs)</Outputs>
|
||||
<Message Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Generation of simgear_config.h</Message>
|
||||
<Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">copy %(FullPath) %(RootDir)%(Directory)\%(Filename).h
|
||||
</Command>
|
||||
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\..\simgear\simgear_config.h;%(Outputs)</Outputs>
|
||||
</CustomBuild>
|
||||
</ItemGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
||||
<ImportGroup Label="ExtensionTargets">
|
||||
</ImportGroup>
|
||||
</Project>
|
||||
File diff suppressed because it is too large
Load Diff
@@ -439,6 +439,22 @@
|
||||
<Filter
|
||||
Name="Lib_sgio"
|
||||
>
|
||||
<File
|
||||
RelativePath="..\..\simgear\io\HTTPClient.cxx"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\simgear\io\HTTPClient.hxx"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\simgear\io\HTTPRequest.cxx"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\simgear\io\HTTPRequest.hxx"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\simgear\io\iochannel.cxx"
|
||||
>
|
||||
@@ -583,14 +599,6 @@
|
||||
RelativePath="..\..\simgear\math\localconsts.hxx"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\simgear\math\project.cxx"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\simgear\math\project.hxx"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\simgear\math\sg_geodesy.hxx"
|
||||
>
|
||||
@@ -635,14 +643,6 @@
|
||||
RelativePath="..\..\simgear\misc\interpolator.hxx"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\simgear\misc\PathOptions.cxx"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\simgear\misc\PathOptions.hxx"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\simgear\misc\ResourceManager.cxx"
|
||||
>
|
||||
@@ -667,14 +667,6 @@
|
||||
RelativePath="..\..\simgear\misc\sg_path.hxx"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\simgear\misc\sg_sleep.cxx"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\simgear\misc\sg_sleep.hxx"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\simgear\misc\sgstream.cxx"
|
||||
>
|
||||
@@ -1031,6 +1023,10 @@
|
||||
RelativePath="..\..\simgear\props\props_io.hxx"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\simgear\props\tiedpropertylist.hxx"
|
||||
>
|
||||
</File>
|
||||
</Filter>
|
||||
<Filter
|
||||
Name="Lib_sgmodel"
|
||||
@@ -1139,14 +1135,6 @@
|
||||
RelativePath="..\..\simgear\scene\model\SGOffsetTransform.hxx"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\simgear\scene\model\SGPagedLOD.cxx"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\simgear\scene\model\SGPagedLOD.hxx"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\simgear\scene\model\SGReaderWriterXML.cxx"
|
||||
>
|
||||
@@ -1155,10 +1143,6 @@
|
||||
RelativePath="..\..\simgear\scene\model\SGReaderWriterXML.hxx"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\simgear\scene\model\SGReaderWriterXMLOptions.hxx"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\simgear\scene\model\SGRotateTransform.cxx"
|
||||
>
|
||||
@@ -1355,6 +1339,10 @@
|
||||
RelativePath="..\..\simgear\scene\tgdb\apt_signs.hxx"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\simgear\scene\tgdb\BucketBox.hxx"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\simgear\scene\tgdb\GroundLightManager.cxx"
|
||||
>
|
||||
@@ -1379,6 +1367,14 @@
|
||||
RelativePath="..\..\simgear\scene\tgdb\pt_lights.hxx"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\simgear\scene\tgdb\ReaderWriterSPT.cxx"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\simgear\scene\tgdb\ReaderWriterSPT.hxx"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\simgear\scene\tgdb\ReaderWriterSTG.cxx"
|
||||
>
|
||||
@@ -1403,10 +1399,6 @@
|
||||
RelativePath="..\..\simgear\scene\tgdb\SGReaderWriterBTG.hxx"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\simgear\scene\tgdb\SGReaderWriterBTGOptions.hxx"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\simgear\scene\tgdb\SGVasiDrawable.cxx"
|
||||
>
|
||||
@@ -1456,6 +1448,18 @@
|
||||
>
|
||||
</File>
|
||||
</Filter>
|
||||
<Filter
|
||||
Name="Lib_sgtsync"
|
||||
>
|
||||
<File
|
||||
RelativePath="..\..\simgear\scene\tsync\terrasync.cxx"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\simgear\scene\tsync\terrasync.hxx"
|
||||
>
|
||||
</File>
|
||||
</Filter>
|
||||
<Filter
|
||||
Name="Lib_sgthread"
|
||||
>
|
||||
@@ -1467,6 +1471,14 @@
|
||||
RelativePath="..\..\simgear\threads\SGQueue.hxx"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\simgear\threads\SGThread.cxx"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\simgear\threads\SGThread.hxx"
|
||||
>
|
||||
</File>
|
||||
</Filter>
|
||||
<Filter
|
||||
Name="Lib_sgstructure"
|
||||
@@ -1535,6 +1547,14 @@
|
||||
RelativePath="..\..\simgear\structure\OSGVersion.hxx"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\simgear\structure\SGAtomic.cxx"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\simgear\structure\SGAtomic.hxx"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\simgear\structure\SGBinding.cxx"
|
||||
>
|
||||
@@ -1551,6 +1571,14 @@
|
||||
RelativePath="..\..\simgear\structure\SGExpression.hxx"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\simgear\structure\SGPerfMon.cxx"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\simgear\structure\SGPerfMon.hxx"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\simgear\structure\SGReferenced.hxx"
|
||||
>
|
||||
@@ -1575,6 +1603,10 @@
|
||||
RelativePath="..\..\simgear\structure\SGSmplstat.hxx"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\simgear\structure\Singleton.hxx"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\simgear\structure\subsystem_mgr.cxx"
|
||||
>
|
||||
@@ -1741,14 +1773,6 @@
|
||||
RelativePath="..\..\simgear\environment\precipitation.hxx"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\simgear\environment\visual_enviro.cxx"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\simgear\environment\visual_enviro.hxx"
|
||||
>
|
||||
</File>
|
||||
</Filter>
|
||||
<Filter
|
||||
Name="Lib_sgutil"
|
||||
@@ -1769,6 +1793,14 @@
|
||||
RelativePath="..\..\simgear\scene\util\NodeAndDrawableVisitor.hxx"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\simgear\scene\util\PathOptions.cxx"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\simgear\scene\util\PathOptions.hxx"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\simgear\scene\util\PrimitiveUtils.cxx"
|
||||
>
|
||||
@@ -1777,6 +1809,14 @@
|
||||
RelativePath="..\..\simgear\scene\util\PrimitiveUtils.hxx"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\simgear\scene\util\project.cxx"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\simgear\scene\util\project.hxx"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\simgear\scene\util\QuadTreeBuilder.cxx"
|
||||
>
|
||||
|
||||
1
simgear/.gitignore
vendored
1
simgear/.gitignore
vendored
@@ -1,4 +1,3 @@
|
||||
simgear_config.h
|
||||
simgear_config.h.*
|
||||
stamp-h1
|
||||
version.h
|
||||
|
||||
@@ -23,35 +23,75 @@ foreach( mylibfolder
|
||||
|
||||
endforeach( mylibfolder )
|
||||
|
||||
if (NOT SIMGEAR_HEADLESS)
|
||||
if(NOT SIMGEAR_HEADLESS)
|
||||
add_subdirectory(environment)
|
||||
add_subdirectory(screen)
|
||||
add_subdirectory(scene)
|
||||
add_subdirectory(sound)
|
||||
endif()
|
||||
endif(NOT SIMGEAR_HEADLESS)
|
||||
|
||||
|
||||
if(ENABLE_RTI)
|
||||
add_subdirectory(hla)
|
||||
endif(ENABLE_RTI)
|
||||
|
||||
|
||||
set(HEADERS compiler.h constants.h sg_inlines.h ${PROJECT_BINARY_DIR}/simgear/version.h)
|
||||
install (FILES ${HEADERS} DESTINATION include/simgear/)
|
||||
|
||||
if(SIMGEAR_SHARED)
|
||||
message(STATUS "building shared library")
|
||||
get_property(allSources GLOBAL PROPERTY ALL_SOURCES)
|
||||
get_property(coreSources GLOBAL PROPERTY CORE_SOURCES)
|
||||
get_property(sceneSources GLOBAL PROPERTY SCENE_SOURCES)
|
||||
get_property(publicHeaders GLOBAL PROPERTY PUBLIC_HEADERS)
|
||||
|
||||
add_library(SimGear SHARED ${allSources})
|
||||
set_property(TARGET SimGear PROPERTY FRAMEWORK 1)
|
||||
message(STATUS "public header: ${publicHeaders}")
|
||||
set_property(TARGET SimGear PROPERTY PUBLIC_HEADER "${publicHeaders}")
|
||||
set_property(TARGET SimGear PROPERTY LINKER_LANGUAGE CXX)
|
||||
|
||||
target_link_libraries(SimGear ${ZLIB_LIBRARY}
|
||||
${OPENSCENEGRAPH_LIBRARIES}
|
||||
${OPENAL_LIBRARY} ${ALUT_LIBRARY}
|
||||
${OPENGL_LIBRARY})
|
||||
|
||||
install(TARGETS SimGear LIBRARY DESTINATION lib${LIB_SUFFIX}
|
||||
PUBLIC_HEADER DESTINATION include/simgear)
|
||||
add_library(SimGearCore SHARED ${coreSources})
|
||||
set_property(TARGET SimGearCore PROPERTY COMPILE_FLAGS "-DNO_OPENSCENEGRAPH_INTERFACE=1")
|
||||
|
||||
# set_property(TARGET SimGearCore PROPERTY FRAMEWORK 1)
|
||||
# message(STATUS "public header: ${publicHeaders}")
|
||||
# set_property(TARGET SimGearCore PROPERTY PUBLIC_HEADER "${publicHeaders}")
|
||||
set_property(TARGET SimGearCore PROPERTY LINKER_LANGUAGE CXX)
|
||||
|
||||
set_property(TARGET SimGearCore PROPERTY VERSION ${SIMGEAR_VERSION})
|
||||
set_property(TARGET SimGearCore PROPERTY SOVERSION ${SIMGEAR_SOVERSION})
|
||||
|
||||
target_link_libraries(SimGearCore ${ZLIB_LIBRARY} ${RT_LIBRARY})
|
||||
install(TARGETS SimGearCore LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR})
|
||||
|
||||
if(NOT SIMGEAR_HEADLESS)
|
||||
if(LIBSVN_FOUND)
|
||||
add_definitions(${APR_CFLAGS})
|
||||
|
||||
IF(APPLE)
|
||||
set_property(SOURCE scene/tsync/terrasync.cxx PROPERTY COMPILE_FLAGS "-iwithsysroot ${LIBSVN_INCLUDE_DIR}")
|
||||
ELSE()
|
||||
include_directories(${LIBSVN_INCLUDE_DIR})
|
||||
ENDIF(APPLE)
|
||||
endif(LIBSVN_FOUND)
|
||||
|
||||
list(APPEND sceneSources scene/util/SGCoreOSGDependant.cxx)
|
||||
|
||||
add_library(SimGearScene SHARED ${sceneSources})
|
||||
# set_property(TARGET SimGearScene PROPERTY FRAMEWORK 1)
|
||||
# set_property(TARGET SimGearScene PROPERTY PUBLIC_HEADER "${publicHeaders}")
|
||||
set_property(TARGET SimGearScene PROPERTY LINKER_LANGUAGE CXX)
|
||||
set_property(TARGET SimGearScene PROPERTY VERSION ${SIMGEAR_VERSION})
|
||||
set_property(TARGET SimGearScene PROPERTY SOVERSION ${SIMGEAR_SOVERSION})
|
||||
|
||||
target_link_libraries(SimGearScene
|
||||
SimGearCore
|
||||
${ZLIB_LIBRARY}
|
||||
${OPENSCENEGRAPH_LIBRARIES}
|
||||
${OPENAL_LIBRARY} ${ALUT_LIBRARY}
|
||||
${OPENGL_LIBRARY})
|
||||
|
||||
if(LIBSVN_FOUND)
|
||||
target_link_libraries(SimGearScene ${LIBSVN_LIBRARIES})
|
||||
endif(LIBSVN_FOUND)
|
||||
|
||||
install(TARGETS SimGearScene LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR})
|
||||
endif()
|
||||
|
||||
endif(SIMGEAR_SHARED)
|
||||
|
||||
|
||||
@@ -1,43 +0,0 @@
|
||||
EXTRA_DIST = simgear_config.h.vc5 simgear_config.h-msvc71 version.h.in
|
||||
|
||||
include_HEADERS = \
|
||||
compiler.h constants.h sg_inlines.h version.h
|
||||
|
||||
if WANT_HEADLESS
|
||||
SG_EXTRA_DIRS =
|
||||
METAR_DIRS =
|
||||
else
|
||||
SG_EXTRA_DIRS = scene sound screen
|
||||
METAR_DIRS = environment
|
||||
endif
|
||||
|
||||
if HAVE_THREADS
|
||||
SGTHREAD_DIR = threads
|
||||
else
|
||||
SGTHREAD_DIR =
|
||||
endif
|
||||
|
||||
SUBDIRS_ALWAYS = \
|
||||
xml \
|
||||
debug \
|
||||
misc \
|
||||
structure \
|
||||
bucket \
|
||||
ephemeris \
|
||||
io \
|
||||
magvar \
|
||||
math \
|
||||
nasal \
|
||||
props \
|
||||
route \
|
||||
serial \
|
||||
timing
|
||||
|
||||
SUBDIRS = $(SUBDIRS_ALWAYS) \
|
||||
$(compatibility_DIR) \
|
||||
$(METAR_DIRS) \
|
||||
$(SG_EXTRA_DIRS) \
|
||||
$(SGTHREAD_DIR)
|
||||
|
||||
DIST_SUBDIRS = $(SUBDIRS_ALWAYS) compatibility scene sound screen environment threads
|
||||
|
||||
@@ -1,17 +0,0 @@
|
||||
includedir = @includedir@/bucket
|
||||
|
||||
lib_LIBRARIES = libsgbucket.a
|
||||
|
||||
include_HEADERS = newbucket.hxx
|
||||
|
||||
libsgbucket_a_SOURCES = newbucket.cxx
|
||||
|
||||
# noinst_PROGRAMS = testbucket
|
||||
|
||||
# testbucket_SOURCES = testbucket.cxx
|
||||
|
||||
# testbucket_LDADD = \
|
||||
# libsgbucket.a \
|
||||
# $(top_builddir)/misc/libsgmisc.a
|
||||
|
||||
INCLUDES = -I$(top_srcdir)
|
||||
@@ -1,14 +0,0 @@
|
||||
includedir = @includedir@/compatibility/
|
||||
|
||||
include_HEADERS = \
|
||||
iostream \
|
||||
strstream \
|
||||
sstream \
|
||||
istream \
|
||||
fstream \
|
||||
iterator \
|
||||
iomanip \
|
||||
new \
|
||||
streambuf \
|
||||
\
|
||||
irix_string
|
||||
@@ -1,22 +0,0 @@
|
||||
includedir = @includedir@/compatibility
|
||||
|
||||
EXTRA_DIST = README
|
||||
|
||||
include_HEADERS = \
|
||||
cfloat \
|
||||
csetjmp \
|
||||
cstdio \
|
||||
cwchar \
|
||||
cassert \
|
||||
climits \
|
||||
csignal \
|
||||
cstdlib \
|
||||
cwctype \
|
||||
cctype \
|
||||
clocale \
|
||||
cstdarg \
|
||||
cstring \
|
||||
cerrno \
|
||||
cmath \
|
||||
cstddef \
|
||||
ctime
|
||||
@@ -1,3 +0,0 @@
|
||||
SUBDIRS = $(MIPSpro_DIRS)
|
||||
|
||||
DIST_SUBDIRS = MIPSpro721 MIPSpro740
|
||||
@@ -1,11 +0,0 @@
|
||||
includedir = @includedir@/debug
|
||||
|
||||
EXTRA_DIST = logtest.cxx
|
||||
|
||||
lib_LIBRARIES = libsgdebug.a
|
||||
|
||||
include_HEADERS = debug_types.h logstream.hxx
|
||||
|
||||
libsgdebug_a_SOURCES = logstream.cxx
|
||||
|
||||
INCLUDES = -I$(top_srcdir)
|
||||
@@ -1,35 +1,38 @@
|
||||
/** \file debug_types.h
|
||||
* Define the various logging classes and prioritiess
|
||||
* Define the various logging classes and priorities
|
||||
*/
|
||||
|
||||
/**
|
||||
* Define the possible classes/categories of logging messages
|
||||
*/
|
||||
typedef enum {
|
||||
SG_NONE = 0x00000000,
|
||||
SG_NONE = 0x00000000,
|
||||
|
||||
SG_TERRAIN = 0x00000001,
|
||||
SG_ASTRO = 0x00000002,
|
||||
SG_FLIGHT = 0x00000004,
|
||||
SG_INPUT = 0x00000008,
|
||||
SG_GL = 0x00000010,
|
||||
SG_VIEW = 0x00000020,
|
||||
SG_COCKPIT = 0x00000040,
|
||||
SG_GENERAL = 0x00000080,
|
||||
SG_MATH = 0x00000100,
|
||||
SG_EVENT = 0x00000200,
|
||||
SG_AIRCRAFT = 0x00000400,
|
||||
SG_AUTOPILOT = 0x00000800,
|
||||
SG_IO = 0x00001000,
|
||||
SG_CLIPPER = 0x00002000,
|
||||
SG_NETWORK = 0x00004000,
|
||||
SG_ATC = 0x00008000,
|
||||
SG_NASAL = 0x00010000,
|
||||
SG_INSTR = 0x00020000,
|
||||
SG_SYSTEMS = 0x00040000,
|
||||
SG_UNDEFD = 0x00080000, // For range checking
|
||||
SG_TERRAIN = 0x00000001,
|
||||
SG_ASTRO = 0x00000002,
|
||||
SG_FLIGHT = 0x00000004,
|
||||
SG_INPUT = 0x00000008,
|
||||
SG_GL = 0x00000010,
|
||||
SG_VIEW = 0x00000020,
|
||||
SG_COCKPIT = 0x00000040,
|
||||
SG_GENERAL = 0x00000080,
|
||||
SG_MATH = 0x00000100,
|
||||
SG_EVENT = 0x00000200,
|
||||
SG_AIRCRAFT = 0x00000400,
|
||||
SG_AUTOPILOT = 0x00000800,
|
||||
SG_IO = 0x00001000,
|
||||
SG_CLIPPER = 0x00002000,
|
||||
SG_NETWORK = 0x00004000,
|
||||
SG_ATC = 0x00008000,
|
||||
SG_NASAL = 0x00010000,
|
||||
SG_INSTR = 0x00020000,
|
||||
SG_SYSTEMS = 0x00040000,
|
||||
SG_AI = 0x00080000,
|
||||
SG_ENVIRONMENT = 0x00100000,
|
||||
SG_SOUND = 0x00200000,
|
||||
SG_UNDEFD = 0x00400000, // For range checking
|
||||
|
||||
SG_ALL = 0xFFFFFFFF
|
||||
SG_ALL = 0xFFFFFFFF
|
||||
} sgDebugClass;
|
||||
|
||||
|
||||
|
||||
@@ -1,7 +1,23 @@
|
||||
|
||||
include (SimGearComponent)
|
||||
|
||||
set(HEADERS metar.hxx visual_enviro.hxx precipitation.hxx)
|
||||
set(SOURCES metar.cxx visual_enviro.cxx precipitation.cxx)
|
||||
set(HEADERS metar.hxx precipitation.hxx)
|
||||
set(SOURCES metar.cxx precipitation.cxx)
|
||||
|
||||
simgear_component(environment environment "${SOURCES}" "${HEADERS}")
|
||||
simgear_scene_component(environment environment "${SOURCES}" "${HEADERS}")
|
||||
|
||||
if(ENABLE_TESTS)
|
||||
add_executable(test_metar test_metar.cxx)
|
||||
|
||||
if (SIMGEAR_SHARED)
|
||||
target_link_libraries(test_metar SimGearScene)
|
||||
else()
|
||||
target_link_libraries(test_metar
|
||||
sgenvironment sgstructure sgmisc sgdebug
|
||||
${CMAKE_THREAD_LIBS_INIT}
|
||||
${ZLIB_LIBRARY}
|
||||
${RT_LIBRARY})
|
||||
endif()
|
||||
|
||||
add_test(metar ${EXECUTABLE_OUTPUT_PATH}/test_metar)
|
||||
endif(ENABLE_TESTS)
|
||||
|
||||
@@ -1,9 +0,0 @@
|
||||
includedir = @includedir@/environment
|
||||
|
||||
lib_LIBRARIES = libsgenvironment.a
|
||||
|
||||
include_HEADERS = metar.hxx visual_enviro.hxx precipitation.hxx
|
||||
|
||||
libsgenvironment_a_SOURCES = metar.cxx visual_enviro.cxx precipitation.cxx
|
||||
|
||||
INCLUDES = -I$(top_srcdir)
|
||||
@@ -32,7 +32,6 @@
|
||||
#include <time.h>
|
||||
#include <cstring>
|
||||
|
||||
#include <simgear/io/sg_socket.hxx>
|
||||
#include <simgear/debug/logstream.hxx>
|
||||
#include <simgear/structure/exception.hxx>
|
||||
|
||||
@@ -40,32 +39,28 @@
|
||||
|
||||
#define NaN SGMetarNaN
|
||||
|
||||
using std::string;
|
||||
using std::map;
|
||||
using std::vector;
|
||||
|
||||
/**
|
||||
* The constructor takes a Metar string, or a four-letter ICAO code. In the
|
||||
* latter case the metar string is downloaded from
|
||||
* http://weather.noaa.gov/pub/data/observations/metar/stations/.
|
||||
* The constructor takes a Metar string
|
||||
* The constructor throws sg_io_exceptions on failure. The "METAR"
|
||||
* keyword has no effect (apart from incrementing the group counter
|
||||
* @a grpcount) and can be left away. A keyword "SPECI" is
|
||||
* likewise accepted.
|
||||
*
|
||||
* @param m ICAO station id or metar string
|
||||
* @param proxy proxy host (optional; default: "")
|
||||
* @param port proxy port (optional; default: "80")
|
||||
* @param auth proxy authorization information (optional; default: "")
|
||||
*
|
||||
* @par Examples:
|
||||
* @code
|
||||
* SGMetar *m = new SGMetar("METAR KSFO 061656Z 19004KT 9SM SCT100 OVC200 08/03 A3013");
|
||||
* double t = m->getTemperature_F();
|
||||
* delete m;
|
||||
*
|
||||
* SGMetar n("KSFO", "proxy.provider.foo", "3128", "proxy-password");
|
||||
* double d = n.getDewpoint_C();
|
||||
|
||||
* @endcode
|
||||
*/
|
||||
SGMetar::SGMetar(const string& m, const string& proxy, const string& port,
|
||||
const string& auth, const time_t time) :
|
||||
SGMetar::SGMetar(const string& m) :
|
||||
_grpcount(0),
|
||||
_x_proxy(false),
|
||||
_year(-1),
|
||||
@@ -87,16 +82,10 @@ SGMetar::SGMetar(const string& m, const string& proxy, const string& port,
|
||||
_snow(false),
|
||||
_cavok(false)
|
||||
{
|
||||
if (m.length() == 4 && isalnum(m[0]) && isalnum(m[1]) && isalnum(m[2]) && isalnum(m[3])) {
|
||||
for (int i = 0; i < 4; i++)
|
||||
_icao[i] = toupper(m[i]);
|
||||
_icao[4] = '\0';
|
||||
_data = loadData(_icao, proxy, port, auth, time);
|
||||
} else {
|
||||
_data = new char[m.length() + 2]; // make room for " \0"
|
||||
strcpy(_data, m.c_str());
|
||||
_url = _data;
|
||||
}
|
||||
_data = new char[m.length() + 2]; // make room for " \0"
|
||||
strcpy(_data, m.c_str());
|
||||
_url = _data;
|
||||
|
||||
normalizeData();
|
||||
|
||||
_m = _data;
|
||||
@@ -169,85 +158,6 @@ void SGMetar::useCurrentDate()
|
||||
_month = now.tm_mon + 1;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* If called with "KSFO" loads data from
|
||||
* @code
|
||||
* http://weather.noaa.gov/pub/data/observations/metar/stations/KSFO.TXT.
|
||||
* @endcode
|
||||
* Throws sg_io_exception on failure. Gives up after waiting longer than 10 seconds.
|
||||
*
|
||||
* @param id four-letter ICAO Metar station code, e.g. "KSFO".
|
||||
* @param proxy proxy host (optional; default: "")
|
||||
* @param port proxy port (optional; default: "80")
|
||||
* @param auth proxy authorization information (optional; default: "")
|
||||
* @return pointer to Metar data string, allocated by new char[].
|
||||
* @see rfc2068.txt for proxy spec ("Proxy-Authorization")
|
||||
*/
|
||||
char *SGMetar::loadData(const char *id, const string& proxy, const string& port,
|
||||
const string& auth, time_t time)
|
||||
{
|
||||
const int buflen = 512;
|
||||
char buf[2 * buflen];
|
||||
|
||||
string metar_server = "weather.noaa.gov";
|
||||
string host = proxy.empty() ? metar_server : proxy;
|
||||
string path = "/pub/data/observations/metar/stations/";
|
||||
|
||||
path += string(id) + ".TXT";
|
||||
_url = "http://" + metar_server + path;
|
||||
|
||||
SGSocket *sock = new SGSocket(host, port.empty() ? "80" : port, "tcp");
|
||||
sock->set_timeout(10000);
|
||||
if (!sock->open(SG_IO_OUT)) {
|
||||
delete sock;
|
||||
throw sg_io_exception("cannot connect to ", sg_location(host));
|
||||
}
|
||||
|
||||
string get = "GET ";
|
||||
if (!proxy.empty())
|
||||
get += "http://" + metar_server;
|
||||
|
||||
sprintf(buf, "%ld", time);
|
||||
get += path + " HTTP/1.0\015\012X-Time: " + buf + "\015\012";
|
||||
get += "Host: " + metar_server + "\015\012";
|
||||
|
||||
if (!auth.empty())
|
||||
get += "Proxy-Authorization: " + auth + "\015\012";
|
||||
|
||||
get += "\015\012";
|
||||
sock->writestring(get.c_str());
|
||||
|
||||
int i;
|
||||
|
||||
// skip HTTP header
|
||||
while ((i = sock->readline(buf, buflen))) {
|
||||
if (i <= 2 && isspace(buf[0]) && (!buf[1] || isspace(buf[1])))
|
||||
break;
|
||||
if (!strncmp(buf, "X-MetarProxy: ", 13))
|
||||
_x_proxy = true;
|
||||
}
|
||||
if (i) {
|
||||
i = sock->readline(buf, buflen);
|
||||
if (i)
|
||||
sock->readline(&buf[i], buflen);
|
||||
}
|
||||
|
||||
sock->close();
|
||||
delete sock;
|
||||
|
||||
char *b = buf;
|
||||
scanBoundary(&b);
|
||||
if (*b == '<')
|
||||
throw sg_io_exception("no metar data available from ",
|
||||
sg_location(_url));
|
||||
|
||||
char *metar = new char[strlen(b) + 2]; // make room for " \0"
|
||||
strcpy(metar, b);
|
||||
return metar;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Replace any number of subsequent spaces by just one space, and add
|
||||
* a trailing space. This makes scanning for things like "ALL RWY" easier.
|
||||
@@ -596,7 +506,7 @@ bool SGMetar::scanRwyVisRange()
|
||||
r._max_visibility._distance = to;
|
||||
|
||||
if (*m == '/') // this is not in the spec!
|
||||
*m++;
|
||||
m++;
|
||||
if (*m == 'D')
|
||||
m++, r._min_visibility._tendency = SGMetarVisibility::DECREASING;
|
||||
else if (*m == 'N')
|
||||
|
||||
@@ -29,18 +29,12 @@
|
||||
|
||||
#include <simgear/constants.h>
|
||||
|
||||
using std::vector;
|
||||
using std::map;
|
||||
using std::string;
|
||||
|
||||
const double SGMetarNaN = -1E20;
|
||||
#define NaN SGMetarNaN
|
||||
|
||||
struct Token {
|
||||
const char *id;
|
||||
const char *text;
|
||||
};
|
||||
|
||||
const double SGMetarNaN = -1E20;
|
||||
|
||||
class SGMetar;
|
||||
|
||||
@@ -48,7 +42,7 @@ class SGMetarVisibility {
|
||||
friend class SGMetar;
|
||||
public:
|
||||
SGMetarVisibility() :
|
||||
_distance(NaN),
|
||||
_distance(SGMetarNaN),
|
||||
_direction(-1),
|
||||
_modifier(EQUALS),
|
||||
_tendency(NONE) {}
|
||||
@@ -70,8 +64,8 @@ public:
|
||||
void set(double dist, int dir = -1, int mod = -1, int tend = -1);
|
||||
|
||||
inline double getVisibility_m() const { return _distance; }
|
||||
inline double getVisibility_ft() const { return _distance == NaN ? NaN : _distance * SG_METER_TO_FEET; }
|
||||
inline double getVisibility_sm() const { return _distance == NaN ? NaN : _distance * SG_METER_TO_SM; }
|
||||
inline double getVisibility_ft() const { return _distance == SGMetarNaN ? SGMetarNaN : _distance * SG_METER_TO_FEET; }
|
||||
inline double getVisibility_sm() const { return _distance == SGMetarNaN ? SGMetarNaN : _distance * SG_METER_TO_SM; }
|
||||
inline int getDirection() const { return _direction; }
|
||||
inline int getModifier() const { return _modifier; }
|
||||
inline int getTendency() const { return _tendency; }
|
||||
@@ -93,8 +87,8 @@ public:
|
||||
_deposit_string(0),
|
||||
_extent(-1),
|
||||
_extent_string(0),
|
||||
_depth(NaN),
|
||||
_friction(NaN),
|
||||
_depth(SGMetarNaN),
|
||||
_friction(SGMetarNaN),
|
||||
_friction_string(0),
|
||||
_comment(0),
|
||||
_wind_shear(false) {}
|
||||
@@ -107,7 +101,7 @@ public:
|
||||
inline double getFriction() const { return _friction; }
|
||||
inline const char *getFrictionString() const { return _friction_string; }
|
||||
inline const char *getComment() const { return _comment; }
|
||||
inline const bool getWindShear() const { return _wind_shear; }
|
||||
inline bool getWindShear() const { return _wind_shear; }
|
||||
inline const SGMetarVisibility& getMinVisibility() const { return _min_visibility; }
|
||||
inline const SGMetarVisibility& getMaxVisibility() const { return _max_visibility; }
|
||||
|
||||
@@ -146,14 +140,14 @@ public:
|
||||
static const char * COVERAGE_BROKEN_STRING;
|
||||
static const char * COVERAGE_OVERCAST_STRING;
|
||||
|
||||
SGMetarCloud() : _coverage(COVERAGE_NIL), _altitude(NaN), _type(0), _type_long(0) {}
|
||||
SGMetarCloud() : _coverage(COVERAGE_NIL), _altitude(SGMetarNaN), _type(0), _type_long(0) {}
|
||||
|
||||
void set(double alt, Coverage cov = COVERAGE_NIL );
|
||||
|
||||
inline Coverage getCoverage() const { return _coverage; }
|
||||
static Coverage getCoverage( const std::string & coverage );
|
||||
inline double getAltitude_m() const { return _altitude; }
|
||||
inline double getAltitude_ft() const { return _altitude == NaN ? NaN : _altitude * SG_METER_TO_FEET; }
|
||||
inline double getAltitude_ft() const { return _altitude == SGMetarNaN ? SGMetarNaN : _altitude * SG_METER_TO_FEET; }
|
||||
inline const char *getTypeString() const { return _type; }
|
||||
inline const char *getTypeLongString() const { return _type_long; }
|
||||
|
||||
@@ -167,8 +161,7 @@ protected:
|
||||
|
||||
class SGMetar {
|
||||
public:
|
||||
SGMetar(const string& m, const string& proxy = "", const string& port = "",
|
||||
const string &auth = "", const time_t time = 0);
|
||||
SGMetar(const std::string& m);
|
||||
~SGMetar();
|
||||
|
||||
enum ReportType {
|
||||
@@ -189,13 +182,13 @@ public:
|
||||
Weather() { intensity = NIL; vincinity = false; }
|
||||
Intensity intensity;
|
||||
bool vincinity;
|
||||
vector<string> descriptions;
|
||||
vector<string> phenomena;
|
||||
std::vector<std::string> descriptions;
|
||||
std::vector<std::string> phenomena;
|
||||
};
|
||||
|
||||
inline const char *getData() const { return _data; }
|
||||
inline const char *getUnusedData() const { return _m; }
|
||||
inline const bool getProxy() const { return _x_proxy; }
|
||||
inline bool getProxy() const { return _x_proxy; }
|
||||
inline const char *getId() const { return _icao; }
|
||||
inline int getYear() const { return _year; }
|
||||
inline int getMonth() const { return _month; }
|
||||
@@ -206,14 +199,14 @@ public:
|
||||
|
||||
inline int getWindDir() const { return _wind_dir; }
|
||||
inline double getWindSpeed_mps() const { return _wind_speed; }
|
||||
inline double getWindSpeed_kmh() const { return _wind_speed == NaN ? NaN : _wind_speed * SG_MPS_TO_KMH; }
|
||||
inline double getWindSpeed_kt() const { return _wind_speed == NaN ? NaN : _wind_speed * SG_MPS_TO_KT; }
|
||||
inline double getWindSpeed_mph() const { return _wind_speed == NaN ? NaN : _wind_speed * SG_MPS_TO_MPH; }
|
||||
inline double getWindSpeed_kmh() const { return _wind_speed == SGMetarNaN ? SGMetarNaN : _wind_speed * SG_MPS_TO_KMH; }
|
||||
inline double getWindSpeed_kt() const { return _wind_speed == SGMetarNaN ? SGMetarNaN : _wind_speed * SG_MPS_TO_KT; }
|
||||
inline double getWindSpeed_mph() const { return _wind_speed == SGMetarNaN ? SGMetarNaN : _wind_speed * SG_MPS_TO_MPH; }
|
||||
|
||||
inline double getGustSpeed_mps() const { return _gust_speed; }
|
||||
inline double getGustSpeed_kmh() const { return _gust_speed == NaN ? NaN : _gust_speed * SG_MPS_TO_KMH; }
|
||||
inline double getGustSpeed_kt() const { return _gust_speed == NaN ? NaN : _gust_speed * SG_MPS_TO_KT; }
|
||||
inline double getGustSpeed_mph() const { return _gust_speed == NaN ? NaN : _gust_speed * SG_MPS_TO_MPH; }
|
||||
inline double getGustSpeed_kmh() const { return _gust_speed == SGMetarNaN ? SGMetarNaN : _gust_speed * SG_MPS_TO_KMH; }
|
||||
inline double getGustSpeed_kt() const { return _gust_speed == SGMetarNaN ? SGMetarNaN : _gust_speed * SG_MPS_TO_KT; }
|
||||
inline double getGustSpeed_mph() const { return _gust_speed == SGMetarNaN ? SGMetarNaN : _gust_speed * SG_MPS_TO_MPH; }
|
||||
|
||||
inline int getWindRangeFrom() const { return _wind_range_from; }
|
||||
inline int getWindRangeTo() const { return _wind_range_to; }
|
||||
@@ -224,11 +217,11 @@ public:
|
||||
inline const SGMetarVisibility *getDirVisibility() const { return _dir_visibility; }
|
||||
|
||||
inline double getTemperature_C() const { return _temp; }
|
||||
inline double getTemperature_F() const { return _temp == NaN ? NaN : 1.8 * _temp + 32; }
|
||||
inline double getTemperature_F() const { return _temp == SGMetarNaN ? SGMetarNaN : 1.8 * _temp + 32; }
|
||||
inline double getDewpoint_C() const { return _dewp; }
|
||||
inline double getDewpoint_F() const { return _dewp == NaN ? NaN : 1.8 * _dewp + 32; }
|
||||
inline double getPressure_hPa() const { return _pressure == NaN ? NaN : _pressure / 100; }
|
||||
inline double getPressure_inHg() const { return _pressure == NaN ? NaN : _pressure * SG_PA_TO_INHG; }
|
||||
inline double getDewpoint_F() const { return _dewp == SGMetarNaN ? SGMetarNaN : 1.8 * _dewp + 32; }
|
||||
inline double getPressure_hPa() const { return _pressure == SGMetarNaN ? SGMetarNaN : _pressure / 100; }
|
||||
inline double getPressure_inHg() const { return _pressure == SGMetarNaN ? SGMetarNaN : _pressure * SG_PA_TO_INHG; }
|
||||
|
||||
inline int getRain() const { return _rain; }
|
||||
inline int getHail() const { return _hail; }
|
||||
@@ -237,13 +230,13 @@ public:
|
||||
|
||||
double getRelHumidity() const;
|
||||
|
||||
inline const vector<SGMetarCloud>& getClouds() const { return _clouds; }
|
||||
inline const map<string, SGMetarRunway>& getRunways() const { return _runways; }
|
||||
inline const vector<string>& getWeather() const { return _weather; }
|
||||
inline const vector<struct Weather> getWeather2() const { return _weather2; }
|
||||
inline const std::vector<SGMetarCloud>& getClouds() const { return _clouds; }
|
||||
inline const std::map<std::string, SGMetarRunway>& getRunways() const { return _runways; }
|
||||
inline const std::vector<std::string>& getWeather() const { return _weather; }
|
||||
inline const std::vector<struct Weather> getWeather2() const { return _weather2; }
|
||||
|
||||
protected:
|
||||
string _url;
|
||||
std::string _url;
|
||||
int _grpcount;
|
||||
bool _x_proxy;
|
||||
char *_data;
|
||||
@@ -267,15 +260,15 @@ protected:
|
||||
int _hail;
|
||||
int _snow;
|
||||
bool _cavok;
|
||||
vector<struct Weather> _weather2;
|
||||
std::vector<struct Weather> _weather2;
|
||||
|
||||
SGMetarVisibility _min_visibility;
|
||||
SGMetarVisibility _max_visibility;
|
||||
SGMetarVisibility _vert_visibility;
|
||||
SGMetarVisibility _dir_visibility[8];
|
||||
vector<SGMetarCloud> _clouds;
|
||||
map<string, SGMetarRunway> _runways;
|
||||
vector<string> _weather;
|
||||
std::vector<SGMetarCloud> _clouds;
|
||||
std::map<std::string, SGMetarRunway> _runways;
|
||||
std::vector<std::string> _weather;
|
||||
|
||||
bool scanPreambleDate();
|
||||
bool scanPreambleTime();
|
||||
@@ -303,10 +296,7 @@ protected:
|
||||
int scanNumber(char **str, int *num, int min, int max = 0);
|
||||
bool scanBoundary(char **str);
|
||||
const struct Token *scanToken(char **str, const struct Token *list);
|
||||
char *loadData(const char *id, const string& proxy, const string& port,
|
||||
const string &auth, time_t time);
|
||||
void normalizeData();
|
||||
};
|
||||
|
||||
#undef NaN
|
||||
#endif // _METAR_HXX
|
||||
|
||||
@@ -25,7 +25,7 @@
|
||||
*/
|
||||
|
||||
#include "precipitation.hxx"
|
||||
#include "visual_enviro.hxx"
|
||||
//#include "visual_enviro.hxx"
|
||||
|
||||
#include <simgear/constants.h>
|
||||
#include <osg/ClipNode>
|
||||
@@ -36,11 +36,20 @@
|
||||
* Build a new OSG object from osgParticle.
|
||||
*/
|
||||
SGPrecipitation::SGPrecipitation() :
|
||||
_freeze(false), _snow_intensity(0.0), _rain_intensity(0.0), _clip_distance(5.0)
|
||||
_freeze(false), _enabled(true), _snow_intensity(0.0), _rain_intensity(0.0), _clip_distance(5.0)
|
||||
{
|
||||
_precipitationEffect = new osgParticle::PrecipitationEffect;
|
||||
}
|
||||
|
||||
void SGPrecipitation::setEnabled( bool value )
|
||||
{
|
||||
_enabled = value;
|
||||
}
|
||||
|
||||
bool SGPrecipitation::getEnabled() const
|
||||
{
|
||||
return _enabled;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Build and add the object "precipitationEffect"
|
||||
@@ -161,8 +170,7 @@ bool SGPrecipitation::update(void)
|
||||
this->_snow_intensity = this->_rain_intensity;
|
||||
}
|
||||
|
||||
bool enabled = sgEnviro.get_precipitation_enable_state();
|
||||
if (enabled && this->_snow_intensity > 0) {
|
||||
if (_enabled && this->_snow_intensity > 0) {
|
||||
_precipitationEffect->setWind(_wind_vec);
|
||||
_precipitationEffect->setParticleSpeed( -0.75f - 0.25f*_snow_intensity);
|
||||
|
||||
@@ -174,7 +182,7 @@ bool SGPrecipitation::update(void)
|
||||
_precipitationEffect->setFarTransition(100.0f - 60.0f*sqrtf(_snow_intensity));
|
||||
|
||||
_precipitationEffect->setParticleColor(osg::Vec4(0.85, 0.85, 0.85, 1.0) - osg::Vec4(0.1, 0.1, 0.1, 1.0) * _snow_intensity);
|
||||
} else if (enabled && this->_rain_intensity > 0) {
|
||||
} else if (_enabled && this->_rain_intensity > 0) {
|
||||
_precipitationEffect->setWind(_wind_vec);
|
||||
_precipitationEffect->setParticleSpeed( -2.0f + -5.0f*_rain_intensity);
|
||||
|
||||
|
||||
@@ -36,6 +36,7 @@ class SGPrecipitation : public osg::Referenced
|
||||
{
|
||||
private:
|
||||
bool _freeze;
|
||||
bool _enabled;
|
||||
|
||||
float _snow_intensity;
|
||||
float _rain_intensity;
|
||||
@@ -56,6 +57,9 @@ public:
|
||||
void setFreezing(bool);
|
||||
void setRainIntensity(float);
|
||||
void setSnowIntensity(float);
|
||||
|
||||
void setEnabled( bool );
|
||||
bool getEnabled() const;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
76
simgear/environment/test_metar.cxx
Normal file
76
simgear/environment/test_metar.cxx
Normal file
@@ -0,0 +1,76 @@
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
# include <simgear_config.h>
|
||||
#endif
|
||||
|
||||
#include <simgear/compiler.h>
|
||||
|
||||
#include <iostream>
|
||||
#include <cstdlib>
|
||||
#include <cstdio>
|
||||
|
||||
#ifdef _MSC_VER
|
||||
# define random rand
|
||||
#endif
|
||||
|
||||
#include <simgear/misc/sg_dir.hxx>
|
||||
#include <simgear/structure/exception.hxx>
|
||||
|
||||
#include "metar.hxx"
|
||||
|
||||
using std::cout;
|
||||
using std::cerr;
|
||||
using std::endl;
|
||||
using std::string;
|
||||
|
||||
#define COMPARE(a, b) \
|
||||
if ((a) != (b)) { \
|
||||
cerr << "failed:" << #a << " != " << #b << endl; \
|
||||
cerr << "\tgot:" << a << endl; \
|
||||
exit(1); \
|
||||
}
|
||||
|
||||
#define FUZZY_COMPARE(a, b, epsilon) \
|
||||
if (fabs(a - b) > epsilon) { \
|
||||
cerr << "failed:" << #a << " != " << #b << endl; \
|
||||
cerr << "\tgot:" << a << endl; \
|
||||
cerr << "\tepsilon:" << epsilon << endl; \
|
||||
}
|
||||
|
||||
#define VERIFY(a) \
|
||||
if (!(a)) { \
|
||||
cerr << "failed:" << #a << endl; \
|
||||
exit(1); \
|
||||
}
|
||||
|
||||
const double TEST_EPSILON = 1e-9;
|
||||
|
||||
void test_basic()
|
||||
{
|
||||
SGMetar m1("2011/10/20 11:25 EHAM 201125Z 27012KT 240V300 9999 VCSH FEW025CB SCT048 10/05 Q1025 TEMPO VRB03KT");
|
||||
COMPARE(m1.getYear(), 2011);
|
||||
COMPARE(m1.getMonth(), 10);
|
||||
COMPARE(m1.getDay(), 20);
|
||||
COMPARE(m1.getHour(), 11);
|
||||
COMPARE(m1.getMinute(), 25);
|
||||
COMPARE(m1.getReportType(), -1); // should default to NIL?
|
||||
|
||||
COMPARE(m1.getWindDir(), 270);
|
||||
FUZZY_COMPARE(m1.getWindSpeed_kt(), 12, TEST_EPSILON);
|
||||
|
||||
FUZZY_COMPARE(m1.getTemperature_C(), 10, TEST_EPSILON);
|
||||
FUZZY_COMPARE(m1.getDewpoint_C(), 5, TEST_EPSILON);
|
||||
FUZZY_COMPARE(m1.getPressure_hPa(), 1025, TEST_EPSILON);
|
||||
}
|
||||
|
||||
int main(int argc, char* argv[])
|
||||
{
|
||||
try {
|
||||
test_basic();
|
||||
} catch (sg_exception& e) {
|
||||
cerr << "got exception:" << e.getMessage() << endl;
|
||||
return -1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -187,12 +187,12 @@ SGEnviro::SGEnviro() :
|
||||
}
|
||||
|
||||
SGEnviro::~SGEnviro(void) {
|
||||
if (sampleGroup) delete sampleGroup;
|
||||
// if (sampleGroup) delete sampleGroup;
|
||||
|
||||
// OSGFIXME
|
||||
return;
|
||||
list_of_lightning::iterator iLightning;
|
||||
for( iLightning = lightnings.begin() ; iLightning != lightnings.end() ; iLightning++ ) {
|
||||
for( iLightning = lightnings.begin() ; iLightning != lightnings.end() ; ++iLightning ) {
|
||||
delete (*iLightning);
|
||||
}
|
||||
lightnings.clear();
|
||||
|
||||
@@ -32,4 +32,4 @@ set(SOURCES
|
||||
venus.cxx
|
||||
)
|
||||
|
||||
simgear_component(ephemeris ephemeris "${SOURCES}" "${HEADERS}")
|
||||
simgear_component(ephem ephemeris "${SOURCES}" "${HEADERS}")
|
||||
|
||||
@@ -1,34 +0,0 @@
|
||||
includedir = @includedir@/ephemeris
|
||||
|
||||
lib_LIBRARIES = libsgephem.a
|
||||
|
||||
include_HEADERS = \
|
||||
celestialBody.hxx \
|
||||
ephemeris.hxx \
|
||||
jupiter.hxx \
|
||||
mars.hxx \
|
||||
mercury.hxx \
|
||||
moonpos.hxx \
|
||||
neptune.hxx \
|
||||
saturn.hxx \
|
||||
star.hxx \
|
||||
stardata.hxx \
|
||||
uranus.hxx \
|
||||
venus.hxx
|
||||
|
||||
libsgephem_a_SOURCES = \
|
||||
celestialBody.cxx \
|
||||
ephemeris.cxx \
|
||||
jupiter.cxx \
|
||||
mars.cxx \
|
||||
mercury.cxx \
|
||||
moonpos.cxx \
|
||||
neptune.cxx \
|
||||
pluto.hxx \
|
||||
saturn.cxx \
|
||||
star.cxx \
|
||||
stardata.cxx \
|
||||
uranus.cxx \
|
||||
venus.cxx
|
||||
|
||||
INCLUDES = -I$(top_srcdir)
|
||||
67
simgear/hla/CMakeLists.txt
Normal file
67
simgear/hla/CMakeLists.txt
Normal file
@@ -0,0 +1,67 @@
|
||||
include (SimGearComponent)
|
||||
|
||||
set(HLA_HEADERS
|
||||
RTIData.hxx
|
||||
HLAArrayDataElement.hxx
|
||||
HLAArrayDataType.hxx
|
||||
HLABasicDataElement.hxx
|
||||
HLABasicDataType.hxx
|
||||
HLADataElement.hxx
|
||||
HLADataElementVisitor.hxx
|
||||
HLADataType.hxx
|
||||
HLADataTypeVisitor.hxx
|
||||
HLAEnumeratedDataElement.hxx
|
||||
HLAEnumeratedDataType.hxx
|
||||
HLAFixedRecordDataElement.hxx
|
||||
HLAFixedRecordDataType.hxx
|
||||
HLAFederate.hxx
|
||||
HLAInteractionClass.hxx
|
||||
HLALocation.hxx
|
||||
HLAObjectClass.hxx
|
||||
HLAObjectInstance.hxx
|
||||
HLAOMTXmlVisitor.hxx
|
||||
HLAPropertyDataElement.hxx
|
||||
HLARawDataElement.hxx
|
||||
HLAVariantDataElement.hxx
|
||||
HLAVariantDataType.hxx
|
||||
)
|
||||
|
||||
set(HLA_SOURCES
|
||||
HLAArrayDataElement.cxx
|
||||
HLAArrayDataType.cxx
|
||||
HLABasicDataElement.cxx
|
||||
HLABasicDataType.cxx
|
||||
HLADataElement.cxx
|
||||
HLADataType.cxx
|
||||
HLADataTypeVisitor.cxx
|
||||
HLAEnumeratedDataElement.cxx
|
||||
HLAEnumeratedDataType.cxx
|
||||
HLAFederate.cxx
|
||||
HLAFixedRecordDataElement.cxx
|
||||
HLAFixedRecordDataType.cxx
|
||||
HLAObjectClass.cxx
|
||||
HLAObjectInstance.cxx
|
||||
HLAOMTXmlVisitor.cxx
|
||||
HLAPropertyDataElement.cxx
|
||||
HLARawDataElement.cxx
|
||||
HLAVariantDataElement.cxx
|
||||
HLAVariantDataType.cxx
|
||||
)
|
||||
simgear_component(hla hla "${HLA_SOURCES}" "${HLA_HEADERS}")
|
||||
|
||||
if(RTI_FOUND)
|
||||
set(RTI13_SOURCES
|
||||
RTI13ObjectClass.cxx
|
||||
RTI13ObjectInstance.cxx
|
||||
RTI13Federate.cxx
|
||||
)
|
||||
simgear_component(rti13 hla "${RTI13_SOURCES}" "")
|
||||
set_property(TARGET sgrti13 APPEND PROPERTY COMPILE_FLAGS "-I${RTI_INCLUDE_DIR}")
|
||||
endif()
|
||||
|
||||
set(RTI_SOURCES
|
||||
RTIObjectClass.cxx
|
||||
RTIObjectInstance.cxx
|
||||
RTIFederate.cxx
|
||||
)
|
||||
simgear_component(rti hla "${RTI_SOURCES}" "")
|
||||
327
simgear/hla/HLAArrayDataElement.cxx
Normal file
327
simgear/hla/HLAArrayDataElement.cxx
Normal file
@@ -0,0 +1,327 @@
|
||||
// Copyright (C) 2009 - 2010 Mathias Froehlich - Mathias.Froehlich@web.de
|
||||
//
|
||||
// This library is free software; you can redistribute it and/or
|
||||
// modify it under the terms of the GNU Library General Public
|
||||
// License as published by the Free Software Foundation; either
|
||||
// version 2 of the License, or (at your option) any later version.
|
||||
//
|
||||
// This library is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
// Library General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program; if not, write to the Free Software
|
||||
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
//
|
||||
|
||||
#include "HLAArrayDataElement.hxx"
|
||||
|
||||
#include <simgear/debug/logstream.hxx>
|
||||
|
||||
#include "HLADataElementVisitor.hxx"
|
||||
|
||||
namespace simgear {
|
||||
|
||||
HLAAbstractArrayDataElement::HLAAbstractArrayDataElement(const HLAArrayDataType* dataType) :
|
||||
_dataType(dataType)
|
||||
{
|
||||
}
|
||||
|
||||
HLAAbstractArrayDataElement::~HLAAbstractArrayDataElement()
|
||||
{
|
||||
}
|
||||
|
||||
void
|
||||
HLAAbstractArrayDataElement::accept(HLADataElementVisitor& visitor)
|
||||
{
|
||||
visitor.apply(*this);
|
||||
}
|
||||
|
||||
void
|
||||
HLAAbstractArrayDataElement::accept(HLAConstDataElementVisitor& visitor) const
|
||||
{
|
||||
visitor.apply(*this);
|
||||
}
|
||||
|
||||
bool
|
||||
HLAAbstractArrayDataElement::decode(HLADecodeStream& stream)
|
||||
{
|
||||
if (!_dataType.valid())
|
||||
return false;
|
||||
return _dataType->decode(stream, *this);
|
||||
}
|
||||
|
||||
bool
|
||||
HLAAbstractArrayDataElement::encode(HLAEncodeStream& stream) const
|
||||
{
|
||||
if (!_dataType.valid())
|
||||
return false;
|
||||
return _dataType->encode(stream, *this);
|
||||
}
|
||||
|
||||
const HLAArrayDataType*
|
||||
HLAAbstractArrayDataElement::getDataType() const
|
||||
{
|
||||
return _dataType.get();
|
||||
}
|
||||
|
||||
bool
|
||||
HLAAbstractArrayDataElement::setDataType(const HLADataType* dataType)
|
||||
{
|
||||
const HLAArrayDataType* arrayDataType = dynamic_cast<const HLAArrayDataType*>(dataType);
|
||||
if (!arrayDataType) {
|
||||
SG_LOG(SG_NETWORK, SG_WARN, "HLAArrayDataType: unable to set data type!");
|
||||
return false;
|
||||
}
|
||||
_dataType = arrayDataType;
|
||||
return true;
|
||||
}
|
||||
|
||||
const HLADataType*
|
||||
HLAAbstractArrayDataElement::getElementDataType() const
|
||||
{
|
||||
if (!_dataType.valid())
|
||||
return 0;
|
||||
return _dataType->getElementDataType();
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////
|
||||
|
||||
HLAArrayDataElement::DataElementFactory::~DataElementFactory()
|
||||
{
|
||||
}
|
||||
|
||||
HLAArrayDataElement::HLAArrayDataElement(const HLAArrayDataType* dataType) :
|
||||
HLAAbstractArrayDataElement(dataType)
|
||||
{
|
||||
}
|
||||
|
||||
HLAArrayDataElement::~HLAArrayDataElement()
|
||||
{
|
||||
}
|
||||
|
||||
bool
|
||||
HLAArrayDataElement::setNumElements(unsigned size)
|
||||
{
|
||||
unsigned oldSize = _elementVector.size();
|
||||
if (size == oldSize)
|
||||
return true;
|
||||
_elementVector.resize(size);
|
||||
for (unsigned i = oldSize; i < size; ++i)
|
||||
_elementVector[i] = newElement(i);
|
||||
return true;
|
||||
}
|
||||
|
||||
bool
|
||||
HLAArrayDataElement::decodeElement(HLADecodeStream& stream, unsigned i)
|
||||
{
|
||||
HLADataElement* dataElement = getElement(i);
|
||||
if (!dataElement)
|
||||
return false;
|
||||
return dataElement->decode(stream);
|
||||
}
|
||||
|
||||
unsigned
|
||||
HLAArrayDataElement::getNumElements() const
|
||||
{
|
||||
return _elementVector.size();
|
||||
}
|
||||
|
||||
bool
|
||||
HLAArrayDataElement::encodeElement(HLAEncodeStream& stream, unsigned i) const
|
||||
{
|
||||
const HLADataElement* dataElement = getElement(i);
|
||||
if (!dataElement)
|
||||
return false;
|
||||
return dataElement->encode(stream);
|
||||
}
|
||||
|
||||
const HLADataElement*
|
||||
HLAArrayDataElement::getElement(unsigned index) const
|
||||
{
|
||||
if (_elementVector.size() <= index)
|
||||
return 0;
|
||||
return _elementVector[index].get();
|
||||
}
|
||||
|
||||
HLADataElement*
|
||||
HLAArrayDataElement::getElement(unsigned index)
|
||||
{
|
||||
if (_elementVector.size() <= index)
|
||||
return 0;
|
||||
return _elementVector[index].get();
|
||||
}
|
||||
|
||||
HLADataElement*
|
||||
HLAArrayDataElement::getOrCreateElement(unsigned index)
|
||||
{
|
||||
if (_elementVector.size() <= index)
|
||||
if (!setNumElements(index + 1))
|
||||
return 0;
|
||||
return _elementVector[index].get();
|
||||
}
|
||||
|
||||
void
|
||||
HLAArrayDataElement::setElement(unsigned index, HLADataElement* value)
|
||||
{
|
||||
unsigned oldSize = _elementVector.size();
|
||||
if (oldSize <= index) {
|
||||
_elementVector.resize(index + 1);
|
||||
for (unsigned j = oldSize; j < index; ++j)
|
||||
_elementVector[j] = newElement(j);
|
||||
}
|
||||
_elementVector[index] = value;
|
||||
}
|
||||
|
||||
void
|
||||
HLAArrayDataElement::setDataElementFactory(HLAArrayDataElement::DataElementFactory* dataElementFactory)
|
||||
{
|
||||
_dataElementFactory = dataElementFactory;
|
||||
}
|
||||
|
||||
HLAArrayDataElement::DataElementFactory*
|
||||
HLAArrayDataElement::getDataElementFactory()
|
||||
{
|
||||
return _dataElementFactory.get();
|
||||
}
|
||||
|
||||
HLADataElement*
|
||||
HLAArrayDataElement::newElement(unsigned index)
|
||||
{
|
||||
if (!_dataElementFactory.valid())
|
||||
return 0;
|
||||
return _dataElementFactory->createElement(*this, index);
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////
|
||||
|
||||
HLAVariantArrayDataElement::HLAVariantArrayDataElement() :
|
||||
HLAAbstractArrayDataElement(0)
|
||||
{
|
||||
}
|
||||
|
||||
HLAVariantArrayDataElement::~HLAVariantArrayDataElement()
|
||||
{
|
||||
}
|
||||
|
||||
bool
|
||||
HLAVariantArrayDataElement::setDataType(const HLADataType* dataType)
|
||||
{
|
||||
const HLAArrayDataType* arrayDataType = dataType->toArrayDataType();
|
||||
if (!arrayDataType) {
|
||||
SG_LOG(SG_NETWORK, SG_WARN, "HLAVariantArrayDataType: unable to set data type, dataType is not an array data type!");
|
||||
return false;
|
||||
}
|
||||
const HLAVariantDataType* variantDataType = arrayDataType->getElementDataType()->toVariantDataType();
|
||||
if (!variantDataType) {
|
||||
SG_LOG(SG_NETWORK, SG_WARN, "HLAVariantArrayDataType: unable to set data type: arrayDataTypes element data type is no a variant data type!");
|
||||
return false;
|
||||
}
|
||||
_dataType = arrayDataType;
|
||||
return true;
|
||||
}
|
||||
|
||||
bool
|
||||
HLAVariantArrayDataElement::setNumElements(unsigned size)
|
||||
{
|
||||
unsigned oldSize = _elementVector.size();
|
||||
if (size == oldSize)
|
||||
return true;
|
||||
_elementVector.resize(size);
|
||||
for (unsigned i = oldSize; i < size; ++i)
|
||||
_elementVector[i] = newElement();
|
||||
return true;
|
||||
}
|
||||
|
||||
bool
|
||||
HLAVariantArrayDataElement::decodeElement(HLADecodeStream& stream, unsigned i)
|
||||
{
|
||||
HLAVariantDataElement* dataElement = getElement(i);
|
||||
if (!dataElement)
|
||||
return false;
|
||||
return dataElement->decode(stream);
|
||||
}
|
||||
|
||||
unsigned
|
||||
HLAVariantArrayDataElement::getNumElements() const
|
||||
{
|
||||
return _elementVector.size();
|
||||
}
|
||||
|
||||
bool
|
||||
HLAVariantArrayDataElement::encodeElement(HLAEncodeStream& stream, unsigned i) const
|
||||
{
|
||||
const HLADataElement* dataElement = getElement(i);
|
||||
if (!dataElement)
|
||||
return false;
|
||||
return dataElement->encode(stream);
|
||||
}
|
||||
|
||||
const HLAVariantDataElement*
|
||||
HLAVariantArrayDataElement::getElement(unsigned index) const
|
||||
{
|
||||
if (_elementVector.size() <= index)
|
||||
return 0;
|
||||
return _elementVector[index].get();
|
||||
}
|
||||
|
||||
HLAVariantDataElement*
|
||||
HLAVariantArrayDataElement::getElement(unsigned index)
|
||||
{
|
||||
if (_elementVector.size() <= index)
|
||||
return 0;
|
||||
return _elementVector[index].get();
|
||||
}
|
||||
|
||||
HLAVariantDataElement*
|
||||
HLAVariantArrayDataElement::getOrCreateElement(unsigned index)
|
||||
{
|
||||
if (_elementVector.size() <= index)
|
||||
if (!setNumElements(index + 1))
|
||||
return 0;
|
||||
return _elementVector[index].get();
|
||||
}
|
||||
|
||||
void
|
||||
HLAVariantArrayDataElement::setElement(unsigned index, HLAVariantDataElement* value)
|
||||
{
|
||||
unsigned oldSize = _elementVector.size();
|
||||
if (oldSize <= index) {
|
||||
_elementVector.resize(index + 1);
|
||||
for (unsigned j = oldSize; j < index; ++j)
|
||||
_elementVector[j] = newElement();
|
||||
}
|
||||
_elementVector[index] = value;
|
||||
}
|
||||
|
||||
void
|
||||
HLAVariantArrayDataElement::setAlternativeDataElementFactory(HLAVariantArrayDataElement::AlternativeDataElementFactory* alternativeDataElementFactory)
|
||||
{
|
||||
_alternativeDataElementFactory = alternativeDataElementFactory;
|
||||
}
|
||||
|
||||
HLAVariantArrayDataElement::AlternativeDataElementFactory*
|
||||
HLAVariantArrayDataElement::getAlternativeDataElementFactory()
|
||||
{
|
||||
return _alternativeDataElementFactory.get();
|
||||
}
|
||||
|
||||
HLAVariantDataElement*
|
||||
HLAVariantArrayDataElement::newElement()
|
||||
{
|
||||
const HLAArrayDataType* arrayDataType = getDataType();
|
||||
if (!arrayDataType)
|
||||
return 0;
|
||||
const HLADataType* elementDataType = arrayDataType->getElementDataType();
|
||||
if (!elementDataType)
|
||||
return 0;
|
||||
const HLAVariantDataType* variantDataType = elementDataType->toVariantDataType();
|
||||
if (!variantDataType)
|
||||
return 0;
|
||||
HLAVariantDataElement* variantDataElement = new HLAVariantDataElement(variantDataType);
|
||||
variantDataElement->setDataElementFactory(_alternativeDataElementFactory.get());
|
||||
return variantDataElement;
|
||||
}
|
||||
|
||||
}
|
||||
532
simgear/hla/HLAArrayDataElement.hxx
Normal file
532
simgear/hla/HLAArrayDataElement.hxx
Normal file
@@ -0,0 +1,532 @@
|
||||
// Copyright (C) 2009 - 2010 Mathias Froehlich - Mathias.Froehlich@web.de
|
||||
//
|
||||
// This library is free software; you can redistribute it and/or
|
||||
// modify it under the terms of the GNU Library General Public
|
||||
// License as published by the Free Software Foundation; either
|
||||
// version 2 of the License, or (at your option) any later version.
|
||||
//
|
||||
// This library is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
// Library General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program; if not, write to the Free Software
|
||||
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
//
|
||||
|
||||
#ifndef HLAArrayDataElement_hxx
|
||||
#define HLAArrayDataElement_hxx
|
||||
|
||||
#include <string>
|
||||
#include <vector>
|
||||
#include <simgear/math/SGMath.hxx>
|
||||
#include "HLAArrayDataType.hxx"
|
||||
#include "HLADataElement.hxx"
|
||||
#include "HLAVariantDataElement.hxx"
|
||||
#include "HLADataTypeVisitor.hxx"
|
||||
|
||||
namespace simgear {
|
||||
|
||||
class HLAAbstractArrayDataElement : public HLADataElement {
|
||||
public:
|
||||
HLAAbstractArrayDataElement(const HLAArrayDataType* dataType);
|
||||
virtual ~HLAAbstractArrayDataElement();
|
||||
|
||||
virtual void accept(HLADataElementVisitor& visitor);
|
||||
virtual void accept(HLAConstDataElementVisitor& visitor) const;
|
||||
|
||||
virtual bool decode(HLADecodeStream& stream);
|
||||
virtual bool encode(HLAEncodeStream& stream) const;
|
||||
|
||||
virtual const HLAArrayDataType* getDataType() const;
|
||||
virtual bool setDataType(const HLADataType* dataType);
|
||||
|
||||
const HLADataType* getElementDataType() const;
|
||||
|
||||
virtual bool setNumElements(unsigned count) = 0;
|
||||
virtual bool decodeElement(HLADecodeStream& stream, unsigned i) = 0;
|
||||
|
||||
virtual unsigned getNumElements() const = 0;
|
||||
virtual bool encodeElement(HLAEncodeStream& stream, unsigned i) const = 0;
|
||||
|
||||
protected:
|
||||
SGSharedPtr<const HLAArrayDataType> _dataType;
|
||||
};
|
||||
|
||||
class HLAArrayDataElement : public HLAAbstractArrayDataElement {
|
||||
public:
|
||||
HLAArrayDataElement(const HLAArrayDataType* dataType = 0);
|
||||
virtual ~HLAArrayDataElement();
|
||||
|
||||
virtual bool setNumElements(unsigned size);
|
||||
virtual bool decodeElement(HLADecodeStream& stream, unsigned i);
|
||||
virtual unsigned getNumElements() const;
|
||||
virtual bool encodeElement(HLAEncodeStream& stream, unsigned i) const;
|
||||
|
||||
const HLADataElement* getElement(unsigned index) const;
|
||||
HLADataElement* getElement(unsigned index);
|
||||
HLADataElement* getOrCreateElement(unsigned index);
|
||||
void setElement(unsigned i, HLADataElement* value);
|
||||
|
||||
class DataElementFactory : public SGReferenced {
|
||||
public:
|
||||
virtual ~DataElementFactory();
|
||||
virtual HLADataElement* createElement(const HLAArrayDataElement&, unsigned) = 0;
|
||||
};
|
||||
|
||||
void setDataElementFactory(DataElementFactory* dataElementFactory);
|
||||
DataElementFactory* getDataElementFactory();
|
||||
|
||||
private:
|
||||
HLADataElement* newElement(unsigned index);
|
||||
|
||||
typedef std::vector<SGSharedPtr<HLADataElement> > ElementVector;
|
||||
ElementVector _elementVector;
|
||||
|
||||
SGSharedPtr<DataElementFactory> _dataElementFactory;
|
||||
};
|
||||
|
||||
// Holds an array of variants.
|
||||
// Factors out common code for that use case.
|
||||
class HLAVariantArrayDataElement : public HLAAbstractArrayDataElement {
|
||||
public:
|
||||
HLAVariantArrayDataElement();
|
||||
virtual ~HLAVariantArrayDataElement();
|
||||
|
||||
// Overwrite this from the abstract class, need some more checks here
|
||||
virtual bool setDataType(const HLADataType* dataType);
|
||||
|
||||
virtual bool setNumElements(unsigned size);
|
||||
virtual bool decodeElement(HLADecodeStream& stream, unsigned i);
|
||||
virtual unsigned getNumElements() const;
|
||||
virtual bool encodeElement(HLAEncodeStream& stream, unsigned i) const;
|
||||
|
||||
const HLAVariantDataElement* getElement(unsigned index) const;
|
||||
HLAVariantDataElement* getElement(unsigned index);
|
||||
HLAVariantDataElement* getOrCreateElement(unsigned index);
|
||||
void setElement(unsigned index, HLAVariantDataElement* value);
|
||||
|
||||
typedef HLAVariantDataElement::DataElementFactory AlternativeDataElementFactory;
|
||||
|
||||
void setAlternativeDataElementFactory(AlternativeDataElementFactory* alternativeDataElementFactory);
|
||||
AlternativeDataElementFactory* getAlternativeDataElementFactory();
|
||||
|
||||
private:
|
||||
HLAVariantDataElement* newElement();
|
||||
|
||||
typedef std::vector<SGSharedPtr<HLAVariantDataElement> > ElementVector;
|
||||
ElementVector _elementVector;
|
||||
|
||||
SGSharedPtr<AlternativeDataElementFactory> _alternativeDataElementFactory;
|
||||
};
|
||||
|
||||
class HLAStringDataElement : public HLAAbstractArrayDataElement {
|
||||
public:
|
||||
HLAStringDataElement(const HLAArrayDataType* dataType = 0) :
|
||||
HLAAbstractArrayDataElement(dataType)
|
||||
{}
|
||||
HLAStringDataElement(const HLAArrayDataType* dataType, const std::string& value) :
|
||||
HLAAbstractArrayDataElement(dataType),
|
||||
_value(value)
|
||||
{}
|
||||
const std::string& getValue() const
|
||||
{ return _value; }
|
||||
void setValue(const std::string& value)
|
||||
{ _value = value; }
|
||||
|
||||
virtual bool setNumElements(unsigned count)
|
||||
{
|
||||
_value.resize(count);
|
||||
return true;
|
||||
}
|
||||
virtual bool decodeElement(HLADecodeStream& stream, unsigned i)
|
||||
{
|
||||
HLATemplateDecodeVisitor<std::string::value_type> visitor(stream);
|
||||
getElementDataType()->accept(visitor);
|
||||
_value[i] = visitor.getValue();
|
||||
return true;
|
||||
}
|
||||
|
||||
virtual unsigned getNumElements() const
|
||||
{
|
||||
return _value.size();
|
||||
}
|
||||
virtual bool encodeElement(HLAEncodeStream& stream, unsigned i) const
|
||||
{
|
||||
HLATemplateEncodeVisitor<std::string::value_type> visitor(stream, _value[i]);
|
||||
getElementDataType()->accept(visitor);
|
||||
return true;
|
||||
}
|
||||
|
||||
private:
|
||||
std::string _value;
|
||||
};
|
||||
|
||||
class HLAStringData {
|
||||
public:
|
||||
HLAStringData() :
|
||||
_value(new HLAStringDataElement(0))
|
||||
{ }
|
||||
HLAStringData(const std::string& value) :
|
||||
_value(new HLAStringDataElement(0))
|
||||
{ _value->setValue(value); }
|
||||
|
||||
operator const std::string&() const
|
||||
{ return _value->getValue(); }
|
||||
HLAStringData& operator=(const std::string& value)
|
||||
{ _value->setValue(value); return *this; }
|
||||
|
||||
const std::string& getValue() const
|
||||
{ return _value->getValue(); }
|
||||
void setValue(const std::string& value)
|
||||
{ _value->setValue(value); }
|
||||
|
||||
const HLAStringDataElement* getDataElement() const
|
||||
{ return _value.get(); }
|
||||
HLAStringDataElement* getDataElement()
|
||||
{ return _value.get(); }
|
||||
|
||||
const HLAArrayDataType* getDataType() const
|
||||
{ return _value->getDataType(); }
|
||||
void setDataType(const HLAArrayDataType* dataType)
|
||||
{ _value->setDataType(dataType); }
|
||||
|
||||
private:
|
||||
SGSharedPtr<HLAStringDataElement> _value;
|
||||
};
|
||||
|
||||
template<typename T>
|
||||
class HLAVec2DataElement : public HLAAbstractArrayDataElement {
|
||||
public:
|
||||
HLAVec2DataElement(const HLAArrayDataType* dataType = 0) :
|
||||
HLAAbstractArrayDataElement(dataType),
|
||||
_value(SGVec2<T>::zeros())
|
||||
{}
|
||||
HLAVec2DataElement(const HLAArrayDataType* dataType, const SGVec2<T>& value) :
|
||||
HLAAbstractArrayDataElement(dataType),
|
||||
_value(value)
|
||||
{}
|
||||
const SGVec2<T>& getValue() const
|
||||
{ return _value; }
|
||||
void setValue(const SGVec2<T>& value)
|
||||
{ _value = value; }
|
||||
|
||||
virtual bool setNumElements(unsigned count)
|
||||
{
|
||||
for (unsigned i = 2; i < count; ++i)
|
||||
_value[i] = 0;
|
||||
return true;
|
||||
}
|
||||
virtual bool decodeElement(HLADecodeStream& stream, unsigned i)
|
||||
{
|
||||
if (i < 2) {
|
||||
HLATemplateDecodeVisitor<typename SGVec2<T>::value_type> visitor(stream);
|
||||
getElementDataType()->accept(visitor);
|
||||
_value[i] = visitor.getValue();
|
||||
} else {
|
||||
HLADataTypeDecodeVisitor visitor(stream);
|
||||
getElementDataType()->accept(visitor);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
virtual unsigned getNumElements() const
|
||||
{
|
||||
return 2;
|
||||
}
|
||||
virtual bool encodeElement(HLAEncodeStream& stream, unsigned i) const
|
||||
{
|
||||
if (i < 2) {
|
||||
HLATemplateEncodeVisitor<typename SGVec2<T>::value_type> visitor(stream, _value[i]);
|
||||
getElementDataType()->accept(visitor);
|
||||
} else {
|
||||
HLADataTypeEncodeVisitor visitor(stream);
|
||||
getElementDataType()->accept(visitor);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
private:
|
||||
SGVec2<T> _value;
|
||||
};
|
||||
|
||||
template<typename T>
|
||||
class HLAVec2Data {
|
||||
public:
|
||||
HLAVec2Data() :
|
||||
_value(new HLAVec2DataElement<T>(0))
|
||||
{ }
|
||||
HLAVec2Data(const SGVec2<T>& value) :
|
||||
_value(new HLAVec2DataElement<T>(0, value))
|
||||
{ }
|
||||
|
||||
operator const SGVec2<T>&() const
|
||||
{ return _value->getValue(); }
|
||||
HLAVec2Data& operator=(const SGVec2<T>& value)
|
||||
{ _value->setValue(value); return *this; }
|
||||
|
||||
const SGVec2<T>& getValue() const
|
||||
{ return _value->getValue(); }
|
||||
void setValue(const SGVec2<T>& value)
|
||||
{ _value->setValue(value); }
|
||||
|
||||
const HLAVec2DataElement<T>* getDataElement() const
|
||||
{ return _value.get(); }
|
||||
HLAVec2DataElement<T>* getDataElement()
|
||||
{ return _value.get(); }
|
||||
|
||||
const HLAArrayDataType* getDataType() const
|
||||
{ return _value->getDataType(); }
|
||||
void setDataType(const HLAArrayDataType* dataType)
|
||||
{ _value->setDataType(dataType); }
|
||||
|
||||
private:
|
||||
SGSharedPtr<HLAVec2DataElement<T> > _value;
|
||||
};
|
||||
|
||||
typedef HLAVec2Data<float> HLAVec2fData;
|
||||
typedef HLAVec2Data<double> HLAVec2dData;
|
||||
|
||||
template<typename T>
|
||||
class HLAVec3DataElement : public HLAAbstractArrayDataElement {
|
||||
public:
|
||||
HLAVec3DataElement(const HLAArrayDataType* dataType = 0) :
|
||||
HLAAbstractArrayDataElement(dataType),
|
||||
_value(SGVec3<T>::zeros())
|
||||
{}
|
||||
HLAVec3DataElement(const HLAArrayDataType* dataType, const SGVec3<T>& value) :
|
||||
HLAAbstractArrayDataElement(dataType),
|
||||
_value(value)
|
||||
{}
|
||||
const SGVec3<T>& getValue() const
|
||||
{ return _value; }
|
||||
void setValue(const SGVec3<T>& value)
|
||||
{ _value = value; }
|
||||
|
||||
virtual bool setNumElements(unsigned count)
|
||||
{
|
||||
for (unsigned i = 3; i < count; ++i)
|
||||
_value[i] = 0;
|
||||
return true;
|
||||
}
|
||||
virtual bool decodeElement(HLADecodeStream& stream, unsigned i)
|
||||
{
|
||||
if (i < 3) {
|
||||
HLATemplateDecodeVisitor<typename SGVec3<T>::value_type> visitor(stream);
|
||||
getElementDataType()->accept(visitor);
|
||||
_value[i] = visitor.getValue();
|
||||
} else {
|
||||
HLADataTypeDecodeVisitor visitor(stream);
|
||||
getElementDataType()->accept(visitor);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
virtual unsigned getNumElements() const
|
||||
{
|
||||
return 3;
|
||||
}
|
||||
virtual bool encodeElement(HLAEncodeStream& stream, unsigned i) const
|
||||
{
|
||||
if (i < 3) {
|
||||
HLATemplateEncodeVisitor<typename SGVec3<T>::value_type> visitor(stream, _value[i]);
|
||||
getElementDataType()->accept(visitor);
|
||||
} else {
|
||||
HLADataTypeEncodeVisitor visitor(stream);
|
||||
getElementDataType()->accept(visitor);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
private:
|
||||
SGVec3<T> _value;
|
||||
};
|
||||
|
||||
template<typename T>
|
||||
class HLAVec3Data {
|
||||
public:
|
||||
HLAVec3Data() :
|
||||
_value(new HLAVec3DataElement<T>(0))
|
||||
{ }
|
||||
HLAVec3Data(const SGVec3<T>& value) :
|
||||
_value(new HLAVec3DataElement<T>(0, value))
|
||||
{ }
|
||||
|
||||
operator const SGVec3<T>&() const
|
||||
{ return _value->getValue(); }
|
||||
HLAVec3Data& operator=(const SGVec3<T>& value)
|
||||
{ _value->setValue(value); return *this; }
|
||||
|
||||
const SGVec3<T>& getValue() const
|
||||
{ return _value->getValue(); }
|
||||
void setValue(const SGVec3<T>& value)
|
||||
{ _value->setValue(value); }
|
||||
|
||||
const HLAVec3DataElement<T>* getDataElement() const
|
||||
{ return _value.get(); }
|
||||
HLAVec3DataElement<T>* getDataElement()
|
||||
{ return _value.get(); }
|
||||
|
||||
const HLAArrayDataType* getDataType() const
|
||||
{ return _value->getDataType(); }
|
||||
void setDataType(const HLAArrayDataType* dataType)
|
||||
{ _value->setDataType(dataType); }
|
||||
|
||||
private:
|
||||
SGSharedPtr<HLAVec3DataElement<T> > _value;
|
||||
};
|
||||
|
||||
typedef HLAVec3Data<float> HLAVec3fData;
|
||||
typedef HLAVec3Data<double> HLAVec3dData;
|
||||
|
||||
template<typename T>
|
||||
class HLAVec4DataElement : public HLAAbstractArrayDataElement {
|
||||
public:
|
||||
HLAVec4DataElement(const HLAArrayDataType* dataType = 0) :
|
||||
HLAAbstractArrayDataElement(dataType),
|
||||
_value(SGVec4<T>::zeros())
|
||||
{}
|
||||
HLAVec4DataElement(const HLAArrayDataType* dataType, const SGVec4<T>& value) :
|
||||
HLAAbstractArrayDataElement(dataType),
|
||||
_value(value)
|
||||
{}
|
||||
const SGVec4<T>& getValue() const
|
||||
{ return _value; }
|
||||
void setValue(const SGVec4<T>& value)
|
||||
{ _value = value; }
|
||||
|
||||
virtual bool setNumElements(unsigned count)
|
||||
{
|
||||
for (unsigned i = 4; i < count; ++i)
|
||||
_value[i] = 0;
|
||||
return true;
|
||||
}
|
||||
virtual bool decodeElement(HLADecodeStream& stream, unsigned i)
|
||||
{
|
||||
if (i < 4) {
|
||||
HLATemplateDecodeVisitor<typename SGVec4<T>::value_type> visitor(stream);
|
||||
getElementDataType()->accept(visitor);
|
||||
_value[i] = visitor.getValue();
|
||||
} else {
|
||||
HLADataTypeDecodeVisitor visitor(stream);
|
||||
getElementDataType()->accept(visitor);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
virtual unsigned getNumElements() const
|
||||
{
|
||||
return 4;
|
||||
}
|
||||
virtual bool encodeElement(HLAEncodeStream& stream, unsigned i) const
|
||||
{
|
||||
if (i < 4) {
|
||||
HLATemplateEncodeVisitor<typename SGVec4<T>::value_type> visitor(stream, _value[i]);
|
||||
getElementDataType()->accept(visitor);
|
||||
} else {
|
||||
HLADataTypeEncodeVisitor visitor(stream);
|
||||
getElementDataType()->accept(visitor);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
private:
|
||||
SGVec4<T> _value;
|
||||
};
|
||||
|
||||
template<typename T>
|
||||
class HLAVec4Data {
|
||||
public:
|
||||
HLAVec4Data() :
|
||||
_value(new HLAVec4DataElement<T>(0))
|
||||
{ }
|
||||
HLAVec4Data(const SGVec4<T>& value) :
|
||||
_value(new HLAVec4DataElement<T>(0, value))
|
||||
{ }
|
||||
|
||||
operator const SGVec4<T>&() const
|
||||
{ return _value->getValue(); }
|
||||
HLAVec4Data& operator=(const SGVec4<T>& value)
|
||||
{ _value->setValue(value); return *this; }
|
||||
|
||||
const SGVec4<T>& getValue() const
|
||||
{ return _value->getValue(); }
|
||||
void setValue(const SGVec4<T>& value)
|
||||
{ _value->setValue(value); }
|
||||
|
||||
const HLAVec4DataElement<T>* getDataElement() const
|
||||
{ return _value.get(); }
|
||||
HLAVec4DataElement<T>* getDataElement()
|
||||
{ return _value.get(); }
|
||||
|
||||
const HLAArrayDataType* getDataType() const
|
||||
{ return _value->getDataType(); }
|
||||
void setDataType(const HLAArrayDataType* dataType)
|
||||
{ _value->setDataType(dataType); }
|
||||
|
||||
private:
|
||||
SGSharedPtr<HLAVec4DataElement<T> > _value;
|
||||
};
|
||||
|
||||
typedef HLAVec4Data<float> HLAVec4fData;
|
||||
typedef HLAVec4Data<double> HLAVec4dData;
|
||||
|
||||
template<typename T>
|
||||
class HLAQuatDataElement : public HLAAbstractArrayDataElement {
|
||||
public:
|
||||
HLAQuatDataElement(const HLAArrayDataType* dataType = 0) :
|
||||
HLAAbstractArrayDataElement(dataType),
|
||||
_value(SGQuat<T>::zeros())
|
||||
{}
|
||||
HLAQuatDataElement(const HLAArrayDataType* dataType, const SGQuat<T>& value) :
|
||||
HLAAbstractArrayDataElement(dataType),
|
||||
_value(value)
|
||||
{}
|
||||
const SGQuat<T>& getValue() const
|
||||
{ return _value; }
|
||||
void setValue(const SGQuat<T>& value)
|
||||
{ _value = value; }
|
||||
|
||||
virtual bool setNumElements(unsigned count)
|
||||
{
|
||||
for (unsigned i = 4; i < count; ++i)
|
||||
_value[i] = 0;
|
||||
return true;
|
||||
}
|
||||
virtual bool decodeElement(HLADecodeStream& stream, unsigned i)
|
||||
{
|
||||
if (i < 4) {
|
||||
HLATemplateDecodeVisitor<typename SGQuat<T>::value_type> visitor(stream);
|
||||
getElementDataType()->accept(visitor);
|
||||
_value[i] = visitor.getValue();
|
||||
} else {
|
||||
HLADataTypeDecodeVisitor visitor(stream);
|
||||
getElementDataType()->accept(visitor);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
virtual unsigned getNumElements() const
|
||||
{
|
||||
return 4;
|
||||
}
|
||||
virtual bool encodeElement(HLAEncodeStream& stream, unsigned i) const
|
||||
{
|
||||
if (i < 4) {
|
||||
HLATemplateEncodeVisitor<typename SGQuat<T>::value_type> visitor(stream, _value[i]);
|
||||
getElementDataType()->accept(visitor);
|
||||
} else {
|
||||
HLADataTypeEncodeVisitor visitor(stream);
|
||||
getElementDataType()->accept(visitor);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
private:
|
||||
SGQuat<T> _value;
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
#endif
|
||||
172
simgear/hla/HLAArrayDataType.cxx
Normal file
172
simgear/hla/HLAArrayDataType.cxx
Normal file
@@ -0,0 +1,172 @@
|
||||
// Copyright (C) 2009 - 2011 Mathias Froehlich - Mathias.Froehlich@web.de
|
||||
//
|
||||
// This library is free software; you can redistribute it and/or
|
||||
// modify it under the terms of the GNU Library General Public
|
||||
// License as published by the Free Software Foundation; either
|
||||
// version 2 of the License, or (at your option) any later version.
|
||||
//
|
||||
// This library is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
// Library General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program; if not, write to the Free Software
|
||||
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
//
|
||||
|
||||
#include "HLAArrayDataType.hxx"
|
||||
|
||||
#include "HLAArrayDataElement.hxx"
|
||||
|
||||
namespace simgear {
|
||||
|
||||
HLAArrayDataType::HLAArrayDataType(const std::string& name) :
|
||||
HLADataType(name),
|
||||
_isOpaque(false),
|
||||
_isString(false)
|
||||
{
|
||||
}
|
||||
|
||||
HLAArrayDataType::~HLAArrayDataType()
|
||||
{
|
||||
}
|
||||
|
||||
void
|
||||
HLAArrayDataType::accept(HLADataTypeVisitor& visitor) const
|
||||
{
|
||||
visitor.apply(*this);
|
||||
}
|
||||
|
||||
const HLAArrayDataType*
|
||||
HLAArrayDataType::toArrayDataType() const
|
||||
{
|
||||
return this;
|
||||
}
|
||||
|
||||
void
|
||||
HLAArrayDataType::setElementDataType(const HLADataType* elementDataType)
|
||||
{
|
||||
// FIXME this only works if we do not reset the alignment to something smaller
|
||||
if (getAlignment() < elementDataType->getAlignment())
|
||||
setAlignment(elementDataType->getAlignment());
|
||||
_elementDataType = elementDataType;
|
||||
}
|
||||
|
||||
void
|
||||
HLAArrayDataType::setIsOpaque(bool isOpaque)
|
||||
{
|
||||
_isOpaque = isOpaque;
|
||||
}
|
||||
|
||||
void
|
||||
HLAArrayDataType::setIsString(bool isString)
|
||||
{
|
||||
_isString = isString;
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
HLAFixedArrayDataType::HLAFixedArrayDataType(const std::string& name) :
|
||||
HLAArrayDataType(name)
|
||||
{
|
||||
}
|
||||
|
||||
HLAFixedArrayDataType::~HLAFixedArrayDataType()
|
||||
{
|
||||
}
|
||||
|
||||
void
|
||||
HLAFixedArrayDataType::accept(HLADataTypeVisitor& visitor) const
|
||||
{
|
||||
visitor.apply(*this);
|
||||
}
|
||||
|
||||
bool
|
||||
HLAFixedArrayDataType::decode(HLADecodeStream& stream, HLAAbstractArrayDataElement& value) const
|
||||
{
|
||||
stream.alignOffsetForSize(getAlignment());
|
||||
unsigned numElements = getNumElements();
|
||||
if (!value.setNumElements(numElements))
|
||||
return false;
|
||||
for (unsigned i = 0; i < numElements; ++i)
|
||||
if (!value.decodeElement(stream, i))
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
bool
|
||||
HLAFixedArrayDataType::encode(HLAEncodeStream& stream, const HLAAbstractArrayDataElement& value) const
|
||||
{
|
||||
stream.alignOffsetForSize(getAlignment());
|
||||
unsigned numElementsType = getNumElements();
|
||||
unsigned numElementsValue = value.getNumElements();
|
||||
unsigned numElements = SGMisc<unsigned>::min(numElementsType, numElementsValue);
|
||||
unsigned i = 0;
|
||||
for (; i < numElements; ++i)
|
||||
if (!value.encodeElement(stream, i))
|
||||
return false;
|
||||
for (; i < numElementsType; ++i) {
|
||||
HLADataTypeEncodeVisitor visitor(stream);
|
||||
getElementDataType()->accept(visitor);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
HLAVariableArrayDataType::HLAVariableArrayDataType(const std::string& name) :
|
||||
HLAArrayDataType(name)
|
||||
{
|
||||
setSizeDataType(new HLAUInt32BEDataType);
|
||||
}
|
||||
|
||||
HLAVariableArrayDataType::~HLAVariableArrayDataType()
|
||||
{
|
||||
}
|
||||
|
||||
void
|
||||
HLAVariableArrayDataType::accept(HLADataTypeVisitor& visitor) const
|
||||
{
|
||||
visitor.apply(*this);
|
||||
}
|
||||
|
||||
bool
|
||||
HLAVariableArrayDataType::decode(HLADecodeStream& stream, HLAAbstractArrayDataElement& value) const
|
||||
{
|
||||
stream.alignOffsetForSize(getAlignment());
|
||||
HLATemplateDecodeVisitor<unsigned> numElementsVisitor(stream);
|
||||
getSizeDataType()->accept(numElementsVisitor);
|
||||
unsigned numElements = numElementsVisitor.getValue();
|
||||
if (!value.setNumElements(numElements))
|
||||
return false;
|
||||
for (unsigned i = 0; i < numElements; ++i)
|
||||
if (!value.decodeElement(stream, i))
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
bool
|
||||
HLAVariableArrayDataType::encode(HLAEncodeStream& stream, const HLAAbstractArrayDataElement& value) const
|
||||
{
|
||||
stream.alignOffsetForSize(getAlignment());
|
||||
unsigned numElements = value.getNumElements();
|
||||
HLATemplateEncodeVisitor<unsigned> numElementsVisitor(stream, numElements);
|
||||
getSizeDataType()->accept(numElementsVisitor);
|
||||
for (unsigned i = 0; i < numElements; ++i)
|
||||
if (!value.encodeElement(stream, i))
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
void
|
||||
HLAVariableArrayDataType::setSizeDataType(const HLADataType* sizeDataType)
|
||||
{
|
||||
// FIXME this only works if we do not reset the alignment to something smaller
|
||||
if (getAlignment() < sizeDataType->getAlignment())
|
||||
setAlignment(sizeDataType->getAlignment());
|
||||
_sizeDataType = sizeDataType;
|
||||
// setAlignment(SGMisc<unsigned>::max(_sizeDataType->getAlignment(), _elementDataType->getAlignment());
|
||||
}
|
||||
|
||||
} // namespace simgear
|
||||
98
simgear/hla/HLAArrayDataType.hxx
Normal file
98
simgear/hla/HLAArrayDataType.hxx
Normal file
@@ -0,0 +1,98 @@
|
||||
// Copyright (C) 2009 - 2011 Mathias Froehlich - Mathias.Froehlich@web.de
|
||||
//
|
||||
// This library is free software; you can redistribute it and/or
|
||||
// modify it under the terms of the GNU Library General Public
|
||||
// License as published by the Free Software Foundation; either
|
||||
// version 2 of the License, or (at your option) any later version.
|
||||
//
|
||||
// This library is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
// Library General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program; if not, write to the Free Software
|
||||
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
//
|
||||
|
||||
#ifndef HLAArrayDataType_hxx
|
||||
#define HLAArrayDataType_hxx
|
||||
|
||||
#include <string>
|
||||
#include <simgear/structure/SGSharedPtr.hxx>
|
||||
#include "HLADataType.hxx"
|
||||
|
||||
namespace simgear {
|
||||
|
||||
class HLAAbstractArrayDataElement;
|
||||
|
||||
class HLAArrayDataType : public HLADataType {
|
||||
public:
|
||||
HLAArrayDataType(const std::string& name = "HLAArrayDataType");
|
||||
virtual ~HLAArrayDataType();
|
||||
|
||||
virtual void accept(HLADataTypeVisitor& visitor) const;
|
||||
|
||||
virtual const HLAArrayDataType* toArrayDataType() const;
|
||||
|
||||
virtual bool decode(HLADecodeStream& stream, HLAAbstractArrayDataElement& value) const = 0;
|
||||
virtual bool encode(HLAEncodeStream& stream, const HLAAbstractArrayDataElement& value) const = 0;
|
||||
|
||||
void setElementDataType(const HLADataType* elementDataType);
|
||||
const HLADataType* getElementDataType() const
|
||||
{ return _elementDataType.get(); }
|
||||
|
||||
void setIsOpaque(bool isOpaque);
|
||||
bool getIsOpaque() const
|
||||
{ return _isOpaque; }
|
||||
|
||||
void setIsString(bool isString);
|
||||
bool getIsString() const
|
||||
{ return _isString; }
|
||||
|
||||
private:
|
||||
SGSharedPtr<const HLADataType> _elementDataType;
|
||||
bool _isOpaque;
|
||||
bool _isString;
|
||||
};
|
||||
|
||||
class HLAFixedArrayDataType : public HLAArrayDataType {
|
||||
public:
|
||||
HLAFixedArrayDataType(const std::string& name = "HLAFixedArrayDataType");
|
||||
virtual ~HLAFixedArrayDataType();
|
||||
|
||||
virtual void accept(HLADataTypeVisitor& visitor) const;
|
||||
|
||||
virtual bool decode(HLADecodeStream& stream, HLAAbstractArrayDataElement& value) const;
|
||||
virtual bool encode(HLAEncodeStream& stream, const HLAAbstractArrayDataElement& value) const;
|
||||
|
||||
void setNumElements(unsigned numElements)
|
||||
{ _numElements = numElements; }
|
||||
unsigned getNumElements() const
|
||||
{ return _numElements; }
|
||||
|
||||
private:
|
||||
unsigned _numElements;
|
||||
};
|
||||
|
||||
class HLAVariableArrayDataType : public HLAArrayDataType {
|
||||
public:
|
||||
HLAVariableArrayDataType(const std::string& name = "HLAVariableArrayDataType");
|
||||
virtual ~HLAVariableArrayDataType();
|
||||
|
||||
virtual void accept(HLADataTypeVisitor& visitor) const;
|
||||
|
||||
virtual bool decode(HLADecodeStream& stream, HLAAbstractArrayDataElement& value) const;
|
||||
virtual bool encode(HLAEncodeStream& stream, const HLAAbstractArrayDataElement& value) const;
|
||||
|
||||
void setSizeDataType(const HLADataType* sizeDataType);
|
||||
const HLADataType* getSizeDataType() const
|
||||
{ return _sizeDataType.get(); }
|
||||
|
||||
private:
|
||||
SGSharedPtr<const HLADataType> _sizeDataType;
|
||||
};
|
||||
|
||||
} // namespace simgear
|
||||
|
||||
#endif
|
||||
145
simgear/hla/HLABasicDataElement.cxx
Normal file
145
simgear/hla/HLABasicDataElement.cxx
Normal file
@@ -0,0 +1,145 @@
|
||||
// Copyright (C) 2009 - 2010 Mathias Froehlich - Mathias.Froehlich@web.de
|
||||
//
|
||||
// This library is free software; you can redistribute it and/or
|
||||
// modify it under the terms of the GNU Library General Public
|
||||
// License as published by the Free Software Foundation; either
|
||||
// version 2 of the License, or (at your option) any later version.
|
||||
//
|
||||
// This library is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
// Library General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program; if not, write to the Free Software
|
||||
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
//
|
||||
|
||||
#include "HLABasicDataElement.hxx"
|
||||
|
||||
#include "HLADataElementVisitor.hxx"
|
||||
#include "HLADataTypeVisitor.hxx"
|
||||
|
||||
namespace simgear {
|
||||
|
||||
HLABasicDataElement::HLABasicDataElement(const HLABasicDataType* dataType) :
|
||||
_dataType(dataType)
|
||||
{
|
||||
}
|
||||
|
||||
HLABasicDataElement::~HLABasicDataElement()
|
||||
{
|
||||
}
|
||||
|
||||
void
|
||||
HLABasicDataElement::accept(HLADataElementVisitor& visitor)
|
||||
{
|
||||
visitor.apply(*this);
|
||||
}
|
||||
|
||||
void
|
||||
HLABasicDataElement::accept(HLAConstDataElementVisitor& visitor) const
|
||||
{
|
||||
visitor.apply(*this);
|
||||
}
|
||||
|
||||
const HLABasicDataType*
|
||||
HLABasicDataElement::getDataType() const
|
||||
{
|
||||
return _dataType.get();
|
||||
}
|
||||
|
||||
bool
|
||||
HLABasicDataElement::setDataType(const HLADataType* dataType)
|
||||
{
|
||||
const HLABasicDataType* scalarDataType = dynamic_cast<const HLABasicDataType*>(dataType);
|
||||
if (!scalarDataType) {
|
||||
SG_LOG(SG_NETWORK, SG_WARN, "HLABasicDataType: unable to set data type!");
|
||||
return false;
|
||||
}
|
||||
setDataType(scalarDataType);
|
||||
return true;
|
||||
}
|
||||
|
||||
void
|
||||
HLABasicDataElement::setDataType(const HLABasicDataType* dataType)
|
||||
{
|
||||
_dataType = dataType;
|
||||
}
|
||||
|
||||
#define IMPLEMENT_TYPED_HLA_BASIC_DATA_ELEMENT(type, ctype) \
|
||||
HLAAbstract##type##DataElement::HLAAbstract##type##DataElement(const HLABasicDataType* dataType) :\
|
||||
HLABasicDataElement(dataType) \
|
||||
{ \
|
||||
} \
|
||||
\
|
||||
HLAAbstract##type##DataElement::~HLAAbstract##type##DataElement() \
|
||||
{ \
|
||||
} \
|
||||
\
|
||||
bool \
|
||||
HLAAbstract##type##DataElement::encode(HLAEncodeStream& stream) const \
|
||||
{ \
|
||||
if (!_dataType.valid()) \
|
||||
return false; \
|
||||
HLATemplateEncodeVisitor<ctype> visitor(stream, getValue()); \
|
||||
_dataType->accept(visitor); \
|
||||
return true; \
|
||||
} \
|
||||
\
|
||||
bool \
|
||||
HLAAbstract##type##DataElement::decode(HLADecodeStream& stream) \
|
||||
{ \
|
||||
if (!_dataType.valid()) \
|
||||
return false; \
|
||||
HLATemplateDecodeVisitor<ctype> visitor(stream); \
|
||||
_dataType->accept(visitor); \
|
||||
setValue(visitor.getValue()); \
|
||||
return true; \
|
||||
} \
|
||||
\
|
||||
HLA##type##DataElement::HLA##type##DataElement(const HLABasicDataType* dataType) : \
|
||||
HLAAbstract##type##DataElement(dataType), \
|
||||
_value(0) \
|
||||
{ \
|
||||
} \
|
||||
\
|
||||
HLA##type##DataElement::HLA##type##DataElement(const HLABasicDataType* dataType, \
|
||||
const ctype& value) : \
|
||||
HLAAbstract##type##DataElement(dataType), \
|
||||
_value(value) \
|
||||
{ \
|
||||
} \
|
||||
\
|
||||
HLA##type##DataElement::~HLA##type##DataElement() \
|
||||
{ \
|
||||
} \
|
||||
\
|
||||
ctype \
|
||||
HLA##type##DataElement::getValue() const \
|
||||
{ \
|
||||
return _value; \
|
||||
} \
|
||||
\
|
||||
void \
|
||||
HLA##type##DataElement::setValue(ctype value) \
|
||||
{ \
|
||||
_value = value; \
|
||||
}
|
||||
|
||||
IMPLEMENT_TYPED_HLA_BASIC_DATA_ELEMENT(Char, char);
|
||||
IMPLEMENT_TYPED_HLA_BASIC_DATA_ELEMENT(WChar, wchar_t);
|
||||
IMPLEMENT_TYPED_HLA_BASIC_DATA_ELEMENT(SChar, signed char);
|
||||
IMPLEMENT_TYPED_HLA_BASIC_DATA_ELEMENT(UChar, unsigned char);
|
||||
IMPLEMENT_TYPED_HLA_BASIC_DATA_ELEMENT(Short, short);
|
||||
IMPLEMENT_TYPED_HLA_BASIC_DATA_ELEMENT(UShort, unsigned short);
|
||||
IMPLEMENT_TYPED_HLA_BASIC_DATA_ELEMENT(Int, int);
|
||||
IMPLEMENT_TYPED_HLA_BASIC_DATA_ELEMENT(UInt, unsigned int);
|
||||
IMPLEMENT_TYPED_HLA_BASIC_DATA_ELEMENT(Long, long);
|
||||
IMPLEMENT_TYPED_HLA_BASIC_DATA_ELEMENT(ULong, unsigned long);
|
||||
IMPLEMENT_TYPED_HLA_BASIC_DATA_ELEMENT(Float, float);
|
||||
IMPLEMENT_TYPED_HLA_BASIC_DATA_ELEMENT(Double, double);
|
||||
|
||||
#undef IMPLEMENT_TYPED_HLA_BASIC_DATA_ELEMENT
|
||||
|
||||
}
|
||||
115
simgear/hla/HLABasicDataElement.hxx
Normal file
115
simgear/hla/HLABasicDataElement.hxx
Normal file
@@ -0,0 +1,115 @@
|
||||
// Copyright (C) 2009 - 2010 Mathias Froehlich - Mathias.Froehlich@web.de
|
||||
//
|
||||
// This library is free software; you can redistribute it and/or
|
||||
// modify it under the terms of the GNU Library General Public
|
||||
// License as published by the Free Software Foundation; either
|
||||
// version 2 of the License, or (at your option) any later version.
|
||||
//
|
||||
// This library is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
// Library General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program; if not, write to the Free Software
|
||||
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
//
|
||||
|
||||
#ifndef HLABasicDataElement_hxx
|
||||
#define HLABasicDataElement_hxx
|
||||
|
||||
#include "HLABasicDataType.hxx"
|
||||
#include "HLADataElement.hxx"
|
||||
|
||||
namespace simgear {
|
||||
|
||||
class HLABasicDataElement : public HLADataElement {
|
||||
public:
|
||||
HLABasicDataElement(const HLABasicDataType* dataType);
|
||||
virtual ~HLABasicDataElement();
|
||||
|
||||
virtual void accept(HLADataElementVisitor& visitor);
|
||||
virtual void accept(HLAConstDataElementVisitor& visitor) const;
|
||||
|
||||
virtual bool encode(HLAEncodeStream& stream) const = 0;
|
||||
virtual bool decode(HLADecodeStream& stream) = 0;
|
||||
|
||||
virtual const HLABasicDataType* getDataType() const;
|
||||
virtual bool setDataType(const HLADataType* dataType);
|
||||
void setDataType(const HLABasicDataType* dataType);
|
||||
|
||||
protected:
|
||||
SGSharedPtr<const HLABasicDataType> _dataType;
|
||||
};
|
||||
|
||||
#define TYPED_HLA_BASIC_DATA_ELEMENT(type, ctype) \
|
||||
class HLAAbstract##type##DataElement : public HLABasicDataElement { \
|
||||
public: \
|
||||
HLAAbstract##type##DataElement(const HLABasicDataType* dataType = 0); \
|
||||
virtual ~HLAAbstract##type##DataElement(); \
|
||||
\
|
||||
virtual bool encode(HLAEncodeStream& stream) const; \
|
||||
virtual bool decode(HLADecodeStream& stream); \
|
||||
\
|
||||
virtual ctype getValue() const = 0; \
|
||||
virtual void setValue(ctype) = 0; \
|
||||
}; \
|
||||
class HLA##type##DataElement : public HLAAbstract##type##DataElement { \
|
||||
public: \
|
||||
HLA##type##DataElement(const HLABasicDataType* dataType = 0); \
|
||||
HLA##type##DataElement(const HLABasicDataType* dataType, \
|
||||
const ctype& value); \
|
||||
virtual ~HLA##type##DataElement(); \
|
||||
virtual ctype getValue() const; \
|
||||
virtual void setValue(ctype value); \
|
||||
private: \
|
||||
ctype _value; \
|
||||
}; \
|
||||
class HLA##type##Data { \
|
||||
public: \
|
||||
HLA##type##Data() : \
|
||||
_value(new HLA##type##DataElement(0)) \
|
||||
{ } \
|
||||
HLA##type##Data(const ctype& value) : \
|
||||
_value(new HLA##type##DataElement(0, value)) \
|
||||
{ } \
|
||||
operator ctype() const \
|
||||
{ return _value->getValue(); } \
|
||||
HLA##type##Data& operator=(const ctype& value) \
|
||||
{ _value->setValue(value); return *this; } \
|
||||
ctype getValue() const \
|
||||
{ return _value->getValue(); } \
|
||||
void setValue(const ctype& value) \
|
||||
{ _value->setValue(value); } \
|
||||
const HLA##type##DataElement* getDataElement() const \
|
||||
{ return _value.get(); } \
|
||||
HLA##type##DataElement* getDataElement() \
|
||||
{ return _value.get(); } \
|
||||
const HLABasicDataType* getDataType() const \
|
||||
{ return _value->getDataType(); } \
|
||||
void setDataType(const HLABasicDataType* dataType) \
|
||||
{ _value->setDataType(dataType); } \
|
||||
\
|
||||
private: \
|
||||
SGSharedPtr<HLA##type##DataElement> _value; \
|
||||
};
|
||||
|
||||
|
||||
TYPED_HLA_BASIC_DATA_ELEMENT(Char, char);
|
||||
TYPED_HLA_BASIC_DATA_ELEMENT(WChar, wchar_t);
|
||||
TYPED_HLA_BASIC_DATA_ELEMENT(SChar, signed char);
|
||||
TYPED_HLA_BASIC_DATA_ELEMENT(UChar, unsigned char);
|
||||
TYPED_HLA_BASIC_DATA_ELEMENT(Short, short);
|
||||
TYPED_HLA_BASIC_DATA_ELEMENT(UShort, unsigned short);
|
||||
TYPED_HLA_BASIC_DATA_ELEMENT(Int, int);
|
||||
TYPED_HLA_BASIC_DATA_ELEMENT(UInt, unsigned int);
|
||||
TYPED_HLA_BASIC_DATA_ELEMENT(Long, long);
|
||||
TYPED_HLA_BASIC_DATA_ELEMENT(ULong, unsigned long);
|
||||
TYPED_HLA_BASIC_DATA_ELEMENT(Float, float);
|
||||
TYPED_HLA_BASIC_DATA_ELEMENT(Double, double);
|
||||
|
||||
#undef TYPED_HLA_BASIC_DATA_ELEMENT
|
||||
|
||||
}
|
||||
|
||||
#endif
|
||||
170
simgear/hla/HLABasicDataType.cxx
Normal file
170
simgear/hla/HLABasicDataType.cxx
Normal file
@@ -0,0 +1,170 @@
|
||||
// Copyright (C) 2009 - 2010 Mathias Froehlich - Mathias.Froehlich@web.de
|
||||
//
|
||||
// This library is free software; you can redistribute it and/or
|
||||
// modify it under the terms of the GNU Library General Public
|
||||
// License as published by the Free Software Foundation; either
|
||||
// version 2 of the License, or (at your option) any later version.
|
||||
//
|
||||
// This library is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
// Library General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program; if not, write to the Free Software
|
||||
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
//
|
||||
|
||||
#include "HLABasicDataType.hxx"
|
||||
|
||||
#include "HLADataType.hxx"
|
||||
#include "HLADataTypeVisitor.hxx"
|
||||
|
||||
namespace simgear {
|
||||
|
||||
HLABasicDataType::HLABasicDataType(const std::string& name) :
|
||||
HLADataType(name)
|
||||
{
|
||||
}
|
||||
|
||||
HLABasicDataType::~HLABasicDataType()
|
||||
{
|
||||
}
|
||||
|
||||
void
|
||||
HLABasicDataType::accept(HLADataTypeVisitor& visitor) const
|
||||
{
|
||||
visitor.apply(*this);
|
||||
}
|
||||
|
||||
const HLABasicDataType*
|
||||
HLABasicDataType::toBasicDataType() const
|
||||
{
|
||||
return this;
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
HLAInt8DataType::HLAInt8DataType(const std::string& name) :
|
||||
HLABasicDataType(name)
|
||||
{
|
||||
setAlignment(sizeof(int8_t));
|
||||
}
|
||||
|
||||
HLAInt8DataType::~HLAInt8DataType()
|
||||
{
|
||||
}
|
||||
|
||||
void
|
||||
HLAInt8DataType::accept(HLADataTypeVisitor& visitor) const
|
||||
{
|
||||
visitor.apply(*this);
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
HLAUInt8DataType::HLAUInt8DataType(const std::string& name) :
|
||||
HLABasicDataType(name)
|
||||
{
|
||||
setAlignment(sizeof(uint8_t));
|
||||
}
|
||||
|
||||
HLAUInt8DataType::~HLAUInt8DataType()
|
||||
{
|
||||
}
|
||||
|
||||
void
|
||||
HLAUInt8DataType::accept(HLADataTypeVisitor& visitor) const
|
||||
{
|
||||
visitor.apply(*this);
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#define BASIC_DATATYPE_IMPLEMENTATION(type, name) \
|
||||
HLA##name##DataType::HLA##name##DataType(const std::string& name) : \
|
||||
HLABasicDataType(name) \
|
||||
{ \
|
||||
setAlignment(sizeof(type)); \
|
||||
} \
|
||||
\
|
||||
HLA##name##DataType::~HLA##name##DataType() \
|
||||
{ \
|
||||
} \
|
||||
\
|
||||
void \
|
||||
HLA##name##DataType::accept(HLADataTypeVisitor& visitor) const \
|
||||
{ \
|
||||
visitor.apply(*this); \
|
||||
} \
|
||||
\
|
||||
\
|
||||
\
|
||||
HLA##name##LEDataType::HLA##name##LEDataType(const std::string& name) : \
|
||||
HLA##name##DataType(name) \
|
||||
{ \
|
||||
} \
|
||||
\
|
||||
HLA##name##LEDataType::~HLA##name##LEDataType() \
|
||||
{ \
|
||||
} \
|
||||
\
|
||||
bool \
|
||||
HLA##name##LEDataType::decode(HLADecodeStream& stream, \
|
||||
type& value) const \
|
||||
{ \
|
||||
if (!stream.alignOffsetForSize(getAlignment())) \
|
||||
return false; \
|
||||
return stream.decode##name##LE(value); \
|
||||
} \
|
||||
\
|
||||
bool \
|
||||
HLA##name##LEDataType::encode(HLAEncodeStream& stream, \
|
||||
const type& value) const \
|
||||
{ \
|
||||
if (!stream.alignOffsetForSize(getAlignment())) \
|
||||
return false; \
|
||||
return stream.encode##name##LE(value); \
|
||||
} \
|
||||
\
|
||||
\
|
||||
\
|
||||
HLA##name##BEDataType::HLA##name##BEDataType(const std::string& name) : \
|
||||
HLA##name##DataType(name) \
|
||||
{ \
|
||||
} \
|
||||
\
|
||||
HLA##name##BEDataType::~HLA##name##BEDataType() \
|
||||
{ \
|
||||
} \
|
||||
\
|
||||
bool \
|
||||
HLA##name##BEDataType::decode(HLADecodeStream& stream, \
|
||||
type& value) const \
|
||||
{ \
|
||||
if (!stream.alignOffsetForSize(getAlignment())) \
|
||||
return false; \
|
||||
return stream.decode##name##BE(value); \
|
||||
} \
|
||||
\
|
||||
bool \
|
||||
HLA##name##BEDataType::encode(HLAEncodeStream& stream, \
|
||||
const type& value) const \
|
||||
{ \
|
||||
if (!stream.alignOffsetForSize(getAlignment())) \
|
||||
return false; \
|
||||
return stream.encode##name##BE(value); \
|
||||
}
|
||||
|
||||
BASIC_DATATYPE_IMPLEMENTATION(int16_t, Int16)
|
||||
BASIC_DATATYPE_IMPLEMENTATION(uint16_t, UInt16)
|
||||
BASIC_DATATYPE_IMPLEMENTATION(int32_t, Int32)
|
||||
BASIC_DATATYPE_IMPLEMENTATION(uint32_t, UInt32)
|
||||
BASIC_DATATYPE_IMPLEMENTATION(int64_t, Int64)
|
||||
BASIC_DATATYPE_IMPLEMENTATION(uint64_t, UInt64)
|
||||
BASIC_DATATYPE_IMPLEMENTATION(float, Float32)
|
||||
BASIC_DATATYPE_IMPLEMENTATION(double, Float64)
|
||||
|
||||
#undef BASIC_DATATYPE_IMPLEMENTATION
|
||||
|
||||
} // namespace simgear
|
||||
155
simgear/hla/HLABasicDataType.hxx
Normal file
155
simgear/hla/HLABasicDataType.hxx
Normal file
@@ -0,0 +1,155 @@
|
||||
// Copyright (C) 2009 - 2010 Mathias Froehlich - Mathias.Froehlich@web.de
|
||||
//
|
||||
// This library is free software; you can redistribute it and/or
|
||||
// modify it under the terms of the GNU Library General Public
|
||||
// License as published by the Free Software Foundation; either
|
||||
// version 2 of the License, or (at your option) any later version.
|
||||
//
|
||||
// This library is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
// Library General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program; if not, write to the Free Software
|
||||
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
//
|
||||
|
||||
#ifndef HLABasicDataType_hxx
|
||||
#define HLABasicDataType_hxx
|
||||
|
||||
#include <string>
|
||||
#include "HLADataType.hxx"
|
||||
|
||||
namespace simgear {
|
||||
|
||||
class HLABasicDataType : public HLADataType {
|
||||
public:
|
||||
virtual ~HLABasicDataType();
|
||||
virtual void accept(HLADataTypeVisitor& visitor) const;
|
||||
|
||||
virtual const HLABasicDataType* toBasicDataType() const;
|
||||
|
||||
protected:
|
||||
HLABasicDataType(const std::string& name);
|
||||
};
|
||||
|
||||
class HLAInt8DataType : public HLABasicDataType {
|
||||
public:
|
||||
HLAInt8DataType(const std::string& name = "HLAInt8DataType");
|
||||
virtual ~HLAInt8DataType();
|
||||
|
||||
virtual void accept(HLADataTypeVisitor& visitor) const;
|
||||
|
||||
bool skip(HLADecodeStream& stream) const
|
||||
{
|
||||
if (!stream.alignOffsetForSize(getAlignment()))
|
||||
return false;
|
||||
return stream.skip(1);
|
||||
}
|
||||
bool skip(HLAEncodeStream& stream) const
|
||||
{
|
||||
if (!stream.alignOffsetForSize(getAlignment()))
|
||||
return false;
|
||||
return stream.skip(1);
|
||||
}
|
||||
bool decode(HLADecodeStream& stream, int8_t& value) const
|
||||
{
|
||||
if (!stream.alignOffsetForSize(getAlignment()))
|
||||
return false;
|
||||
return stream.decodeInt8(value);
|
||||
}
|
||||
bool encode(HLAEncodeStream& stream, const int8_t& value) const
|
||||
{
|
||||
if (!stream.alignOffsetForSize(getAlignment()))
|
||||
return false;
|
||||
return stream.encodeInt8(value);
|
||||
}
|
||||
};
|
||||
|
||||
class HLAUInt8DataType : public HLABasicDataType {
|
||||
public:
|
||||
HLAUInt8DataType(const std::string& name = "HLAUInt8DataType");
|
||||
virtual ~HLAUInt8DataType();
|
||||
|
||||
virtual void accept(HLADataTypeVisitor& visitor) const;
|
||||
|
||||
bool skip(HLADecodeStream& stream) const
|
||||
{
|
||||
if (!stream.alignOffsetForSize(getAlignment()))
|
||||
return false;
|
||||
return stream.skip(1);
|
||||
}
|
||||
bool skip(HLAEncodeStream& stream) const
|
||||
{
|
||||
if (!stream.alignOffsetForSize(getAlignment()))
|
||||
return false;
|
||||
return stream.skip(1);
|
||||
}
|
||||
bool decode(HLADecodeStream& stream, uint8_t& value) const
|
||||
{
|
||||
if (!stream.alignOffsetForSize(getAlignment()))
|
||||
return false;
|
||||
return stream.decodeUInt8(value);
|
||||
}
|
||||
bool encode(HLAEncodeStream& stream, const uint8_t& value) const
|
||||
{
|
||||
if (!stream.alignOffsetForSize(getAlignment()))
|
||||
return false;
|
||||
return stream.encodeUInt8(value);
|
||||
}
|
||||
};
|
||||
|
||||
#define BASIC_DATATYPE_IMPLEMENTATION(type, name) \
|
||||
class HLA##name##DataType : public HLABasicDataType { \
|
||||
public: \
|
||||
virtual ~HLA##name##DataType(); \
|
||||
\
|
||||
virtual void accept(HLADataTypeVisitor& visitor) const; \
|
||||
\
|
||||
bool skip(HLADecodeStream& stream) const \
|
||||
{ \
|
||||
if (!stream.alignOffsetForSize(getAlignment())) \
|
||||
return false; \
|
||||
return stream.skip(sizeof(type)); \
|
||||
} \
|
||||
bool skip(HLAEncodeStream& stream) const \
|
||||
{ \
|
||||
if (!stream.alignOffsetForSize(getAlignment())) \
|
||||
return false; \
|
||||
return stream.skip(sizeof(type)); \
|
||||
} \
|
||||
virtual bool decode(HLADecodeStream& stream, type& value) const = 0; \
|
||||
virtual bool encode(HLAEncodeStream& stream, const type& value) const = 0;\
|
||||
protected: \
|
||||
HLA##name##DataType(const std::string& name); \
|
||||
}; \
|
||||
class HLA##name##LEDataType : public HLA##name##DataType { \
|
||||
public: \
|
||||
HLA##name##LEDataType(const std::string& name = "HLA" #name "LEDataType");\
|
||||
virtual ~HLA##name##LEDataType(); \
|
||||
virtual bool decode(HLADecodeStream& stream, type& value) const; \
|
||||
virtual bool encode(HLAEncodeStream& stream, const type& value) const; \
|
||||
}; \
|
||||
class HLA##name##BEDataType : public HLA##name##DataType { \
|
||||
public: \
|
||||
HLA##name##BEDataType(const std::string& name = "HLA" #name "BEDataType");\
|
||||
virtual ~HLA##name##BEDataType(); \
|
||||
virtual bool decode(HLADecodeStream& stream, type& value) const; \
|
||||
virtual bool encode(HLAEncodeStream& stream, const type& value) const; \
|
||||
};
|
||||
|
||||
BASIC_DATATYPE_IMPLEMENTATION(int16_t, Int16)
|
||||
BASIC_DATATYPE_IMPLEMENTATION(uint16_t, UInt16)
|
||||
BASIC_DATATYPE_IMPLEMENTATION(int32_t, Int32)
|
||||
BASIC_DATATYPE_IMPLEMENTATION(uint32_t, UInt32)
|
||||
BASIC_DATATYPE_IMPLEMENTATION(int64_t, Int64)
|
||||
BASIC_DATATYPE_IMPLEMENTATION(uint64_t, UInt64)
|
||||
BASIC_DATATYPE_IMPLEMENTATION(float, Float32)
|
||||
BASIC_DATATYPE_IMPLEMENTATION(double, Float64)
|
||||
|
||||
#undef BASIC_DATATYPE_IMPLEMENTATION
|
||||
|
||||
} // namespace simgear
|
||||
|
||||
#endif
|
||||
201
simgear/hla/HLADataElement.cxx
Normal file
201
simgear/hla/HLADataElement.cxx
Normal file
@@ -0,0 +1,201 @@
|
||||
// Copyright (C) 2009 - 2010 Mathias Froehlich - Mathias.Froehlich@web.de
|
||||
//
|
||||
// This library is free software; you can redistribute it and/or
|
||||
// modify it under the terms of the GNU Library General Public
|
||||
// License as published by the Free Software Foundation; either
|
||||
// version 2 of the License, or (at your option) any later version.
|
||||
//
|
||||
// This library is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
// Library General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program; if not, write to the Free Software
|
||||
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
//
|
||||
|
||||
#include "HLADataElement.hxx"
|
||||
|
||||
#include <simgear/debug/logstream.hxx>
|
||||
|
||||
#include "HLADataElementVisitor.hxx"
|
||||
|
||||
namespace simgear {
|
||||
|
||||
HLADataElement::PathElement::Data::~Data()
|
||||
{
|
||||
}
|
||||
|
||||
const HLADataElement::PathElement::FieldData*
|
||||
HLADataElement::PathElement::Data::toFieldData() const
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
const HLADataElement::PathElement::IndexData*
|
||||
HLADataElement::PathElement::Data::toIndexData() const
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
HLADataElement::PathElement::FieldData::FieldData(const std::string& name) :
|
||||
_name(name)
|
||||
{
|
||||
}
|
||||
|
||||
HLADataElement::PathElement::FieldData::~FieldData()
|
||||
{
|
||||
}
|
||||
|
||||
const HLADataElement::PathElement::FieldData*
|
||||
HLADataElement::PathElement::FieldData::toFieldData() const
|
||||
{
|
||||
return this;
|
||||
}
|
||||
|
||||
bool
|
||||
HLADataElement::PathElement::FieldData::less(const Data* data) const
|
||||
{
|
||||
const FieldData* fieldData = data->toFieldData();
|
||||
// IndexData is allways smaller than FieldData
|
||||
if (!fieldData)
|
||||
return false;
|
||||
return _name < fieldData->_name;
|
||||
}
|
||||
|
||||
bool
|
||||
HLADataElement::PathElement::FieldData::equal(const Data* data) const
|
||||
{
|
||||
const FieldData* fieldData = data->toFieldData();
|
||||
// IndexData is allways smaller than FieldData
|
||||
if (!fieldData)
|
||||
return false;
|
||||
return _name == fieldData->_name;
|
||||
}
|
||||
|
||||
void
|
||||
HLADataElement::PathElement::FieldData::append(std::string& s) const
|
||||
{
|
||||
s.append(1, std::string::value_type('.'));
|
||||
s.append(_name);
|
||||
}
|
||||
|
||||
HLADataElement::PathElement::IndexData::IndexData(unsigned index) :
|
||||
_index(index)
|
||||
{
|
||||
}
|
||||
|
||||
HLADataElement::PathElement::IndexData::~IndexData()
|
||||
{
|
||||
}
|
||||
|
||||
const HLADataElement::PathElement::IndexData*
|
||||
HLADataElement::PathElement::IndexData::toIndexData() const
|
||||
{
|
||||
return this;
|
||||
}
|
||||
|
||||
bool
|
||||
HLADataElement::PathElement::IndexData::less(const Data* data) const
|
||||
{
|
||||
const IndexData* indexData = data->toIndexData();
|
||||
// IndexData is allways smaller than FieldData
|
||||
if (!indexData)
|
||||
return true;
|
||||
return _index < indexData->_index;
|
||||
}
|
||||
|
||||
bool
|
||||
HLADataElement::PathElement::IndexData::equal(const Data* data) const
|
||||
{
|
||||
const IndexData* indexData = data->toIndexData();
|
||||
// IndexData is allways smaller than FieldData
|
||||
if (!indexData)
|
||||
return false;
|
||||
return _index == indexData->_index;
|
||||
}
|
||||
|
||||
void
|
||||
HLADataElement::PathElement::IndexData::append(std::string& s) const
|
||||
{
|
||||
s.append(1, std::string::value_type('['));
|
||||
unsigned value = _index;
|
||||
do {
|
||||
s.append(1, std::string::value_type('0' + value % 10));
|
||||
} while (value /= 10);
|
||||
s.append(1, std::string::value_type(']'));
|
||||
}
|
||||
|
||||
HLADataElement::~HLADataElement()
|
||||
{
|
||||
}
|
||||
|
||||
void
|
||||
HLADataElement::accept(HLADataElementVisitor& visitor)
|
||||
{
|
||||
visitor.apply(*this);
|
||||
}
|
||||
|
||||
void
|
||||
HLADataElement::accept(HLAConstDataElementVisitor& visitor) const
|
||||
{
|
||||
visitor.apply(*this);
|
||||
}
|
||||
|
||||
std::string
|
||||
HLADataElement::toString(const Path& path)
|
||||
{
|
||||
std::string s;
|
||||
for (Path::const_iterator i = path.begin(); i != path.end(); ++i)
|
||||
i->append(s);
|
||||
return s;
|
||||
}
|
||||
|
||||
HLADataElement::AttributePathPair
|
||||
HLADataElement::toAttributePathPair(const std::string& s)
|
||||
{
|
||||
Path path;
|
||||
// Skip the initial attribute name if given
|
||||
std::string::size_type i = s.find_first_of("[.");
|
||||
std::string attribute = s.substr(0, i);
|
||||
while (i < s.size()) {
|
||||
if (s[i] == '[') {
|
||||
++i;
|
||||
unsigned index = 0;
|
||||
while (i < s.size()) {
|
||||
if (s[i] == ']')
|
||||
break;
|
||||
unsigned v = s[i] - '0';
|
||||
// Error, no number
|
||||
if (10 <= v) {
|
||||
SG_LOG(SG_NETWORK, SG_WARN, "HLADataElement: invalid character in array subscript for \""
|
||||
<< s << "\" at \"" << attribute << toString(path) << "\"!");
|
||||
return AttributePathPair();
|
||||
}
|
||||
index *= 10;
|
||||
index += v;
|
||||
++i;
|
||||
}
|
||||
path.push_back(index);
|
||||
++i;
|
||||
continue;
|
||||
}
|
||||
if (s[i] == '.') {
|
||||
// Error, . cannot be last
|
||||
if (s.size() <= ++i) {
|
||||
SG_LOG(SG_NETWORK, SG_WARN, "HLADataElement: invalid terminating '.' for \""
|
||||
<< s << "\"!");
|
||||
return AttributePathPair();
|
||||
}
|
||||
std::string::size_type e = s.find_first_of("[.", i);
|
||||
path.push_back(s.substr(i, e - i));
|
||||
i = e;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
return AttributePathPair(attribute, path);
|
||||
}
|
||||
|
||||
}
|
||||
223
simgear/hla/HLADataElement.hxx
Normal file
223
simgear/hla/HLADataElement.hxx
Normal file
@@ -0,0 +1,223 @@
|
||||
// Copyright (C) 2009 - 2011 Mathias Froehlich - Mathias.Froehlich@web.de
|
||||
//
|
||||
// This library is free software; you can redistribute it and/or
|
||||
// modify it under the terms of the GNU Library General Public
|
||||
// License as published by the Free Software Foundation; either
|
||||
// version 2 of the License, or (at your option) any later version.
|
||||
//
|
||||
// This library is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
// Library General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program; if not, write to the Free Software
|
||||
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
//
|
||||
|
||||
#ifndef HLADataElement_hxx
|
||||
#define HLADataElement_hxx
|
||||
|
||||
#include <list>
|
||||
#include <map>
|
||||
#include <simgear/structure/SGReferenced.hxx>
|
||||
#include <simgear/structure/SGSharedPtr.hxx>
|
||||
#include <simgear/timing/timestamp.hxx>
|
||||
#include "RTIData.hxx"
|
||||
#include "HLADataType.hxx"
|
||||
|
||||
class SGTimeStamp;
|
||||
|
||||
namespace simgear {
|
||||
|
||||
class HLADataElementVisitor;
|
||||
class HLAConstDataElementVisitor;
|
||||
|
||||
class HLADataElement : public SGReferenced {
|
||||
public:
|
||||
virtual ~HLADataElement();
|
||||
|
||||
virtual void accept(HLADataElementVisitor& visitor) = 0;
|
||||
virtual void accept(HLAConstDataElementVisitor& visitor) const = 0;
|
||||
|
||||
virtual bool encode(HLAEncodeStream& stream) const = 0;
|
||||
virtual bool decode(HLADecodeStream& stream) = 0;
|
||||
|
||||
virtual const HLADataType* getDataType() const = 0;
|
||||
virtual bool setDataType(const HLADataType* dataType) = 0;
|
||||
|
||||
// Container for the timestamp the originating attribute was last updated for
|
||||
// class TimeStamp : public SGReferenced {
|
||||
// public:
|
||||
// const SGTimeStamp& getTimeStamp() const
|
||||
// { return _timeStamp; }
|
||||
// void setTimeStamp(const SGTimeStamp& timeStamp)
|
||||
// { _timeStamp = timeStamp; }
|
||||
// private:
|
||||
// SGTimeStamp _timeStamp;
|
||||
// };
|
||||
|
||||
// const TimeStamp* getTimeStamp() const
|
||||
// { return _timeStamp.get(); }
|
||||
// void setTimeStamp(const TimeStamp* timeStamp)
|
||||
// { _timeStamp = timeStamp; }
|
||||
|
||||
// struct ChangeCount : public SGReferenced {
|
||||
// ChangeCount() : _value(0) {}
|
||||
// unsigned _value;
|
||||
// };
|
||||
// SGSharedPtr<ChangeCount> _changeCount;
|
||||
// unsigned getChangeCount() const
|
||||
// {
|
||||
// // If we don't have return allways the same
|
||||
// if (!_changeCount.valid())
|
||||
// return 0;
|
||||
// return _changeCount->_value;
|
||||
// }
|
||||
|
||||
/// HLADataElements could be identified by path
|
||||
/// These paths are composed of structure field names and array indices in the
|
||||
/// order they appear while walking to the data element.
|
||||
/// So provide here some tool functions to access these elements
|
||||
/// Note that these functions are relatively expensive in execution time.
|
||||
/// So only use them once at object creation time and store direct references to the values
|
||||
|
||||
class PathElement {
|
||||
public:
|
||||
PathElement(unsigned index) : _data(new IndexData(index)) {}
|
||||
PathElement(const std::string& name) : _data(new FieldData(name)) {}
|
||||
|
||||
bool isFieldValue() const
|
||||
{ return _data->toFieldData(); }
|
||||
bool isIndexValue() const
|
||||
{ return _data->toIndexData(); }
|
||||
|
||||
unsigned getIndexValue() const
|
||||
{
|
||||
const IndexData* indexData = _data->toIndexData();
|
||||
if (!indexData)
|
||||
return ~unsigned(0);
|
||||
return indexData->_index;
|
||||
}
|
||||
|
||||
std::string getFieldValue() const
|
||||
{
|
||||
const FieldData* fieldData = _data->toFieldData();
|
||||
if (!fieldData)
|
||||
return std::string();
|
||||
return fieldData->_name;
|
||||
}
|
||||
|
||||
// Want to be able to use that in std::map and std::set
|
||||
bool operator<(const PathElement& pathElement) const
|
||||
{ return _data->less(pathElement._data.get()); }
|
||||
bool operator==(const PathElement& pathElement) const
|
||||
{ return _data->equal(pathElement._data.get()); }
|
||||
|
||||
void append(std::string& s) const
|
||||
{ _data->append(s); }
|
||||
|
||||
private:
|
||||
struct FieldData;
|
||||
struct IndexData;
|
||||
struct Data : public SGReferenced {
|
||||
virtual ~Data();
|
||||
virtual const FieldData* toFieldData() const;
|
||||
virtual const IndexData* toIndexData() const;
|
||||
virtual bool less(const Data*) const = 0;
|
||||
virtual bool equal(const Data*) const = 0;
|
||||
virtual void append(std::string&) const = 0;
|
||||
};
|
||||
struct FieldData : public Data {
|
||||
FieldData(const std::string& name);
|
||||
virtual ~FieldData();
|
||||
virtual const FieldData* toFieldData() const;
|
||||
virtual bool less(const Data* data) const;
|
||||
virtual bool equal(const Data* data) const;
|
||||
virtual void append(std::string& s) const;
|
||||
std::string _name;
|
||||
};
|
||||
struct IndexData : public Data {
|
||||
IndexData(unsigned index);
|
||||
virtual ~IndexData();
|
||||
virtual const IndexData* toIndexData() const;
|
||||
virtual bool less(const Data* data) const;
|
||||
virtual bool equal(const Data* data) const;
|
||||
virtual void append(std::string& s) const;
|
||||
unsigned _index;
|
||||
};
|
||||
|
||||
SGSharedPtr<Data> _data;
|
||||
};
|
||||
typedef std::list<PathElement> Path;
|
||||
typedef std::pair<std::string, Path> AttributePathPair;
|
||||
typedef std::pair<unsigned, Path> IndexPathPair;
|
||||
|
||||
static std::string toString(const Path& path);
|
||||
static std::string toString(const AttributePathPair& path)
|
||||
{ return path.first + toString(path.second); }
|
||||
static AttributePathPair toAttributePathPair(const std::string& s);
|
||||
static Path toPath(const std::string& s)
|
||||
{ return toAttributePathPair(s).second; }
|
||||
|
||||
private:
|
||||
// SGSharedPtr<const TimeStamp> _timeStamp;
|
||||
};
|
||||
|
||||
class HLADataElementProvider {
|
||||
public:
|
||||
class AbstractProvider : public SGReferenced {
|
||||
public:
|
||||
virtual ~AbstractProvider() { }
|
||||
virtual HLADataElement* getDataElement(const HLADataElement::Path& path) = 0;
|
||||
// virtual HLADataElement* getDataElement(const HLADataElement::Path& path, const HLADataType* dataType)
|
||||
// {
|
||||
// SGSharedPtr<HLADataElement> dataElement = getDataElement(path);
|
||||
// if (!dataElement.valid())
|
||||
// return 0;
|
||||
// if (!dataElement->setDataType(dataType))
|
||||
// return 0;
|
||||
// return dataElement.release();
|
||||
// }
|
||||
};
|
||||
|
||||
HLADataElementProvider()
|
||||
{ }
|
||||
HLADataElementProvider(HLADataElement* dataElement) :
|
||||
_provider(new ConcreteProvider(dataElement))
|
||||
{ }
|
||||
HLADataElementProvider(const SGSharedPtr<HLADataElement>& dataElement) :
|
||||
_provider(new ConcreteProvider(dataElement))
|
||||
{ }
|
||||
HLADataElementProvider(AbstractProvider* provider) :
|
||||
_provider(provider)
|
||||
{ }
|
||||
|
||||
HLADataElement* getDataElement(const HLADataElement::Path& path) const
|
||||
{
|
||||
if (!_provider.valid())
|
||||
return 0;
|
||||
return _provider->getDataElement(path);
|
||||
}
|
||||
|
||||
private:
|
||||
class ConcreteProvider : public AbstractProvider {
|
||||
public:
|
||||
ConcreteProvider(const SGSharedPtr<HLADataElement>& dataElement) :
|
||||
_dataElement(dataElement)
|
||||
{ }
|
||||
virtual HLADataElement* getDataElement(const HLADataElement::Path&)
|
||||
{ return _dataElement.get(); }
|
||||
private:
|
||||
SGSharedPtr<HLADataElement> _dataElement;
|
||||
};
|
||||
|
||||
SGSharedPtr<AbstractProvider> _provider;
|
||||
};
|
||||
|
||||
typedef std::map<HLADataElement::Path, HLADataElementProvider> HLAPathElementMap;
|
||||
typedef std::map<unsigned, HLAPathElementMap> HLAAttributePathElementMap;
|
||||
|
||||
}
|
||||
|
||||
#endif
|
||||
57
simgear/hla/HLADataElementVisitor.hxx
Normal file
57
simgear/hla/HLADataElementVisitor.hxx
Normal file
@@ -0,0 +1,57 @@
|
||||
// Copyright (C) 2009 - 2011 Mathias Froehlich - Mathias.Froehlich@web.de
|
||||
//
|
||||
// This library is free software; you can redistribute it and/or
|
||||
// modify it under the terms of the GNU Library General Public
|
||||
// License as published by the Free Software Foundation; either
|
||||
// version 2 of the License, or (at your option) any later version.
|
||||
//
|
||||
// This library is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
// Library General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program; if not, write to the Free Software
|
||||
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
//
|
||||
|
||||
#ifndef HLADataElementVisitor_hxx
|
||||
#define HLADataElementVisitor_hxx
|
||||
|
||||
namespace simgear {
|
||||
|
||||
class HLABasicDataElement;
|
||||
class HLAAbstractEnumeratedDataElement;
|
||||
class HLAAbstractFixedRecordDataElement;
|
||||
class HLAAbstractArrayDataElement;
|
||||
class HLAAbstractVariantDataElement;
|
||||
|
||||
class HLADataElementVisitor {
|
||||
public:
|
||||
virtual ~HLADataElementVisitor() {}
|
||||
|
||||
virtual void apply(HLADataElement&);
|
||||
|
||||
virtual void apply(HLABasicDataElement&);
|
||||
virtual void apply(HLAAbstractEnumeratedDataElement&);
|
||||
virtual void apply(HLAAbstractArrayDataElement&);
|
||||
virtual void apply(HLAAbstractFixedRecordDataElement&);
|
||||
virtual void apply(HLAAbstractVariantDataElement&);
|
||||
};
|
||||
|
||||
class HLAConstDataElementVisitor {
|
||||
public:
|
||||
virtual ~HLAConstDataElementVisitor() {}
|
||||
|
||||
virtual void apply(const HLADataElement&);
|
||||
|
||||
virtual void apply(const HLABasicDataElement&);
|
||||
virtual void apply(const HLAAbstractEnumeratedDataElement&);
|
||||
virtual void apply(const HLAAbstractArrayDataElement&);
|
||||
virtual void apply(const HLAAbstractFixedRecordDataElement&);
|
||||
virtual void apply(const HLAAbstractVariantDataElement&);
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
#endif
|
||||
104
simgear/hla/HLADataType.cxx
Normal file
104
simgear/hla/HLADataType.cxx
Normal file
@@ -0,0 +1,104 @@
|
||||
// Copyright (C) 2009 - 2010 Mathias Froehlich - Mathias.Froehlich@web.de
|
||||
//
|
||||
// This library is free software; you can redistribute it and/or
|
||||
// modify it under the terms of the GNU Library General Public
|
||||
// License as published by the Free Software Foundation; either
|
||||
// version 2 of the License, or (at your option) any later version.
|
||||
//
|
||||
// This library is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
// Library General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program; if not, write to the Free Software
|
||||
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
//
|
||||
|
||||
#include "HLADataType.hxx"
|
||||
|
||||
#include "HLADataElement.hxx"
|
||||
#include "HLADataTypeVisitor.hxx"
|
||||
|
||||
namespace simgear {
|
||||
|
||||
HLADataType::HLADataType(const std::string& name, unsigned alignment) :
|
||||
_name(name),
|
||||
_alignment(1)
|
||||
{
|
||||
setAlignment(alignment);
|
||||
}
|
||||
|
||||
HLADataType::~HLADataType()
|
||||
{
|
||||
}
|
||||
|
||||
void
|
||||
HLADataType::accept(HLADataTypeVisitor& visitor) const
|
||||
{
|
||||
visitor.apply(*this);
|
||||
}
|
||||
|
||||
const HLADataTypeReference*
|
||||
HLADataType::toDataTypeReference() const
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
const HLABasicDataType*
|
||||
HLADataType::toBasicDataType() const
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
const HLAArrayDataType*
|
||||
HLADataType::toArrayDataType() const
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
const HLAEnumeratedDataType*
|
||||
HLADataType::toEnumeratedDataType() const
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
const HLAFixedRecordDataType*
|
||||
HLADataType::toFixedRecordDataType() const
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
const HLAVariantDataType*
|
||||
HLADataType::toVariantDataType() const
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
void
|
||||
HLADataType::setAlignment(unsigned alignment)
|
||||
{
|
||||
/// FIXME: more checks
|
||||
if (alignment == 0)
|
||||
_alignment = 1;
|
||||
else
|
||||
_alignment = alignment;
|
||||
}
|
||||
|
||||
HLADataTypeReference::~HLADataTypeReference()
|
||||
{
|
||||
}
|
||||
|
||||
void
|
||||
HLADataTypeReference::accept(HLADataTypeVisitor& visitor) const
|
||||
{
|
||||
visitor.apply(*this);
|
||||
}
|
||||
|
||||
const HLADataTypeReference*
|
||||
HLADataTypeReference::toDataTypeReference() const
|
||||
{
|
||||
return this;
|
||||
}
|
||||
|
||||
}
|
||||
99
simgear/hla/HLADataType.hxx
Normal file
99
simgear/hla/HLADataType.hxx
Normal file
@@ -0,0 +1,99 @@
|
||||
// Copyright (C) 2009 - 2010 Mathias Froehlich - Mathias.Froehlich@web.de
|
||||
//
|
||||
// This library is free software; you can redistribute it and/or
|
||||
// modify it under the terms of the GNU Library General Public
|
||||
// License as published by the Free Software Foundation; either
|
||||
// version 2 of the License, or (at your option) any later version.
|
||||
//
|
||||
// This library is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
// Library General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program; if not, write to the Free Software
|
||||
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
//
|
||||
|
||||
#ifndef HLADataType_hxx
|
||||
#define HLADataType_hxx
|
||||
|
||||
#include <string>
|
||||
#include <simgear/structure/SGWeakPtr.hxx>
|
||||
#include <simgear/structure/SGWeakReferenced.hxx>
|
||||
#include "RTIData.hxx"
|
||||
|
||||
namespace simgear {
|
||||
|
||||
class HLADataTypeVisitor;
|
||||
|
||||
class HLADataTypeReference;
|
||||
class HLABasicDataType;
|
||||
class HLAArrayDataType;
|
||||
class HLAEnumeratedDataType;
|
||||
class HLAFixedRecordDataType;
|
||||
class HLAVariantDataType;
|
||||
|
||||
enum HLAUpdateType {
|
||||
HLAStaticUpdate,
|
||||
HLAPeriodicUpdate,
|
||||
HLAConditionalUpdate,
|
||||
HLAUndefinedUpdate
|
||||
};
|
||||
|
||||
class HLADataType : public SGWeakReferenced {
|
||||
public:
|
||||
virtual ~HLADataType();
|
||||
|
||||
const std::string& getName() const
|
||||
{ return _name; }
|
||||
|
||||
const std::string& getSemantics() const
|
||||
{ return _semantics; }
|
||||
void setSemantics(const std::string& semantics)
|
||||
{ _semantics = semantics; }
|
||||
|
||||
unsigned getAlignment() const
|
||||
{ return _alignment; }
|
||||
|
||||
virtual void accept(HLADataTypeVisitor& visitor) const;
|
||||
|
||||
virtual const HLADataTypeReference* toDataTypeReference() const;
|
||||
virtual const HLABasicDataType* toBasicDataType() const;
|
||||
virtual const HLAArrayDataType* toArrayDataType() const;
|
||||
virtual const HLAEnumeratedDataType* toEnumeratedDataType() const;
|
||||
virtual const HLAFixedRecordDataType* toFixedRecordDataType() const;
|
||||
virtual const HLAVariantDataType* toVariantDataType() const;
|
||||
|
||||
protected:
|
||||
HLADataType(const std::string& name, unsigned alignment = 1);
|
||||
void setAlignment(unsigned alignment);
|
||||
|
||||
private:
|
||||
std::string _name;
|
||||
std::string _semantics;
|
||||
unsigned _alignment;
|
||||
};
|
||||
|
||||
// Weak reference to a data type. Used to implement self referencing data types
|
||||
class HLADataTypeReference : public HLADataType {
|
||||
public:
|
||||
HLADataTypeReference(const SGSharedPtr<HLADataType>& dataType) :
|
||||
HLADataType(dataType->getName(), dataType->getAlignment()),
|
||||
_dataType(dataType)
|
||||
{ }
|
||||
virtual ~HLADataTypeReference();
|
||||
|
||||
SGSharedPtr<const HLADataType> getDataType() const
|
||||
{ return _dataType.lock(); }
|
||||
|
||||
virtual void accept(HLADataTypeVisitor& visitor) const;
|
||||
virtual const HLADataTypeReference* toDataTypeReference() const;
|
||||
|
||||
private:
|
||||
SGWeakPtr<const HLADataType> _dataType;
|
||||
};
|
||||
|
||||
} // namespace simgear
|
||||
|
||||
#endif
|
||||
188
simgear/hla/HLADataTypeVisitor.cxx
Normal file
188
simgear/hla/HLADataTypeVisitor.cxx
Normal file
@@ -0,0 +1,188 @@
|
||||
// Copyright (C) 2009 - 2010 Mathias Froehlich - Mathias.Froehlich@web.de
|
||||
//
|
||||
// This library is free software; you can redistribute it and/or
|
||||
// modify it under the terms of the GNU Library General Public
|
||||
// License as published by the Free Software Foundation; either
|
||||
// version 2 of the License, or (at your option) any later version.
|
||||
//
|
||||
// This library is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
// Library General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program; if not, write to the Free Software
|
||||
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
//
|
||||
|
||||
#include "HLADataTypeVisitor.hxx"
|
||||
|
||||
#include "HLAArrayDataElement.hxx"
|
||||
#include "HLABasicDataElement.hxx"
|
||||
#include "HLADataTypeVisitor.hxx"
|
||||
#include "HLAEnumeratedDataElement.hxx"
|
||||
#include "HLAFixedRecordDataElement.hxx"
|
||||
#include "HLAVariantDataElement.hxx"
|
||||
|
||||
namespace simgear {
|
||||
|
||||
HLADataElementFactoryVisitor::~HLADataElementFactoryVisitor()
|
||||
{
|
||||
}
|
||||
|
||||
void
|
||||
HLADataElementFactoryVisitor::apply(const HLADataType& dataType)
|
||||
{
|
||||
SG_LOG(SG_NETWORK, SG_ALERT, "HLA: Can not find a suitable data element for data type \""
|
||||
<< dataType.getName() << "\"");
|
||||
}
|
||||
|
||||
void
|
||||
HLADataElementFactoryVisitor::apply(const HLAInt8DataType& dataType)
|
||||
{
|
||||
_dataElement = new HLASCharDataElement(&dataType);
|
||||
}
|
||||
|
||||
void
|
||||
HLADataElementFactoryVisitor::apply(const HLAUInt8DataType& dataType)
|
||||
{
|
||||
_dataElement = new HLAUCharDataElement(&dataType);
|
||||
}
|
||||
|
||||
void
|
||||
HLADataElementFactoryVisitor::apply(const HLAInt16DataType& dataType)
|
||||
{
|
||||
_dataElement = new HLAShortDataElement(&dataType);
|
||||
}
|
||||
|
||||
void
|
||||
HLADataElementFactoryVisitor::apply(const HLAUInt16DataType& dataType)
|
||||
{
|
||||
_dataElement = new HLAUShortDataElement(&dataType);
|
||||
}
|
||||
|
||||
void
|
||||
HLADataElementFactoryVisitor::apply(const HLAInt32DataType& dataType)
|
||||
{
|
||||
_dataElement = new HLAIntDataElement(&dataType);
|
||||
}
|
||||
|
||||
void
|
||||
HLADataElementFactoryVisitor::apply(const HLAUInt32DataType& dataType)
|
||||
{
|
||||
_dataElement = new HLAUIntDataElement(&dataType);
|
||||
}
|
||||
|
||||
void
|
||||
HLADataElementFactoryVisitor::apply(const HLAInt64DataType& dataType)
|
||||
{
|
||||
_dataElement = new HLALongDataElement(&dataType);
|
||||
}
|
||||
|
||||
void
|
||||
HLADataElementFactoryVisitor::apply(const HLAUInt64DataType& dataType)
|
||||
{
|
||||
_dataElement = new HLAULongDataElement(&dataType);
|
||||
}
|
||||
|
||||
void
|
||||
HLADataElementFactoryVisitor::apply(const HLAFloat32DataType& dataType)
|
||||
{
|
||||
_dataElement = new HLAFloatDataElement(&dataType);
|
||||
}
|
||||
|
||||
void
|
||||
HLADataElementFactoryVisitor::apply(const HLAFloat64DataType& dataType)
|
||||
{
|
||||
_dataElement = new HLADoubleDataElement(&dataType);
|
||||
}
|
||||
|
||||
class HLADataElementFactoryVisitor::ArrayDataElementFactory : public HLAArrayDataElement::DataElementFactory {
|
||||
public:
|
||||
virtual HLADataElement* createElement(const HLAArrayDataElement& element, unsigned index)
|
||||
{
|
||||
const HLADataType* dataType = element.getElementDataType();
|
||||
if (!dataType)
|
||||
return 0;
|
||||
|
||||
HLADataElementFactoryVisitor visitor;
|
||||
dataType->accept(visitor);
|
||||
return visitor.getDataElement();
|
||||
}
|
||||
};
|
||||
|
||||
void
|
||||
HLADataElementFactoryVisitor::apply(const HLAFixedArrayDataType& dataType)
|
||||
{
|
||||
if (dataType.getIsString()) {
|
||||
_dataElement = new HLAStringDataElement(&dataType);
|
||||
} else {
|
||||
SGSharedPtr<HLAArrayDataElement> arrayDataElement;
|
||||
arrayDataElement = new HLAArrayDataElement(&dataType);
|
||||
arrayDataElement->setDataElementFactory(new ArrayDataElementFactory);
|
||||
arrayDataElement->setNumElements(dataType.getNumElements());
|
||||
_dataElement = arrayDataElement;
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
HLADataElementFactoryVisitor::apply(const HLAVariableArrayDataType& dataType)
|
||||
{
|
||||
if (dataType.getIsString()) {
|
||||
_dataElement = new HLAStringDataElement(&dataType);
|
||||
} else {
|
||||
SGSharedPtr<HLAArrayDataElement> arrayDataElement;
|
||||
arrayDataElement = new HLAArrayDataElement(&dataType);
|
||||
arrayDataElement->setDataElementFactory(new ArrayDataElementFactory);
|
||||
_dataElement = arrayDataElement;
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
HLADataElementFactoryVisitor::apply(const HLAEnumeratedDataType& dataType)
|
||||
{
|
||||
_dataElement = new HLAEnumeratedDataElement(&dataType);
|
||||
}
|
||||
|
||||
void
|
||||
HLADataElementFactoryVisitor::apply(const HLAFixedRecordDataType& dataType)
|
||||
{
|
||||
SGSharedPtr<HLAFixedRecordDataElement> recordDataElement;
|
||||
recordDataElement = new HLAFixedRecordDataElement(&dataType);
|
||||
|
||||
unsigned numFields = dataType.getNumFields();
|
||||
for (unsigned i = 0; i < numFields; ++i) {
|
||||
HLADataElementFactoryVisitor visitor;
|
||||
dataType.getFieldDataType(i)->accept(visitor);
|
||||
recordDataElement->setField(i, visitor._dataElement.get());
|
||||
}
|
||||
|
||||
_dataElement = recordDataElement;
|
||||
}
|
||||
|
||||
class HLADataElementFactoryVisitor::VariantDataElementFactory : public HLAVariantDataElement::DataElementFactory {
|
||||
public:
|
||||
virtual HLADataElement* createElement(const HLAVariantDataElement& element, unsigned index)
|
||||
{
|
||||
const HLAVariantDataType* dataType = element.getDataType();
|
||||
if (!dataType)
|
||||
return 0;
|
||||
const HLADataType* alternativeDataType = element.getAlternativeDataType();
|
||||
if (!alternativeDataType)
|
||||
return 0;
|
||||
HLADataElementFactoryVisitor visitor;
|
||||
alternativeDataType->accept(visitor);
|
||||
return visitor.getDataElement();
|
||||
}
|
||||
};
|
||||
|
||||
void
|
||||
HLADataElementFactoryVisitor::apply(const HLAVariantDataType& dataType)
|
||||
{
|
||||
SGSharedPtr<HLAVariantDataElement> variantDataElement;
|
||||
variantDataElement = new HLAVariantDataElement(&dataType);
|
||||
variantDataElement->setDataElementFactory(new VariantDataElementFactory);
|
||||
_dataElement = variantDataElement;
|
||||
}
|
||||
|
||||
} // namespace simgear
|
||||
671
simgear/hla/HLADataTypeVisitor.hxx
Normal file
671
simgear/hla/HLADataTypeVisitor.hxx
Normal file
@@ -0,0 +1,671 @@
|
||||
// Copyright (C) 2009 - 2010 Mathias Froehlich - Mathias.Froehlich@web.de
|
||||
//
|
||||
// This library is free software; you can redistribute it and/or
|
||||
// modify it under the terms of the GNU Library General Public
|
||||
// License as published by the Free Software Foundation; either
|
||||
// version 2 of the License, or (at your option) any later version.
|
||||
//
|
||||
// This library is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
// Library General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program; if not, write to the Free Software
|
||||
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
//
|
||||
|
||||
#ifndef HLADataTypeVisitor_hxx
|
||||
#define HLADataTypeVisitor_hxx
|
||||
|
||||
#include <cassert>
|
||||
#include <string>
|
||||
#include <simgear/debug/logstream.hxx>
|
||||
#include <simgear/math/SGMath.hxx>
|
||||
#include "HLAArrayDataType.hxx"
|
||||
#include "HLABasicDataType.hxx"
|
||||
#include "HLADataElement.hxx"
|
||||
#include "HLAEnumeratedDataType.hxx"
|
||||
#include "HLAFixedRecordDataType.hxx"
|
||||
#include "HLAVariantDataType.hxx"
|
||||
|
||||
namespace simgear {
|
||||
|
||||
class HLADataTypeVisitor {
|
||||
public:
|
||||
virtual ~HLADataTypeVisitor() {}
|
||||
|
||||
virtual void apply(const HLADataType& dataType)
|
||||
{ }
|
||||
|
||||
virtual void apply(const HLADataTypeReference& dataType)
|
||||
{
|
||||
SGSharedPtr<const HLADataType> dataTypeReference = dataType.getDataType();
|
||||
if (!dataTypeReference.valid()) {
|
||||
SG_LOG(SG_NETWORK, SG_WARN, "HLADataTypeReference weak reference vanished!");
|
||||
return;
|
||||
}
|
||||
dataTypeReference->accept(*this);
|
||||
}
|
||||
|
||||
virtual void apply(const HLABasicDataType& dataType)
|
||||
{ apply(static_cast<const HLADataType&>(dataType)); }
|
||||
virtual void apply(const HLAInt8DataType& dataType)
|
||||
{ apply(static_cast<const HLABasicDataType&>(dataType)); }
|
||||
virtual void apply(const HLAUInt8DataType& dataType)
|
||||
{ apply(static_cast<const HLABasicDataType&>(dataType)); }
|
||||
virtual void apply(const HLAInt16DataType& dataType)
|
||||
{ apply(static_cast<const HLABasicDataType&>(dataType)); }
|
||||
virtual void apply(const HLAUInt16DataType& dataType)
|
||||
{ apply(static_cast<const HLABasicDataType&>(dataType)); }
|
||||
virtual void apply(const HLAInt32DataType& dataType)
|
||||
{ apply(static_cast<const HLABasicDataType&>(dataType)); }
|
||||
virtual void apply(const HLAUInt32DataType& dataType)
|
||||
{ apply(static_cast<const HLABasicDataType&>(dataType)); }
|
||||
virtual void apply(const HLAInt64DataType& dataType)
|
||||
{ apply(static_cast<const HLABasicDataType&>(dataType)); }
|
||||
virtual void apply(const HLAUInt64DataType& dataType)
|
||||
{ apply(static_cast<const HLABasicDataType&>(dataType)); }
|
||||
virtual void apply(const HLAFloat32DataType& dataType)
|
||||
{ apply(static_cast<const HLABasicDataType&>(dataType)); }
|
||||
virtual void apply(const HLAFloat64DataType& dataType)
|
||||
{ apply(static_cast<const HLABasicDataType&>(dataType)); }
|
||||
|
||||
virtual void apply(const HLAArrayDataType& dataType)
|
||||
{ apply(static_cast<const HLADataType&>(dataType)); }
|
||||
virtual void apply(const HLAFixedArrayDataType& dataType)
|
||||
{ apply(static_cast<const HLAArrayDataType&>(dataType)); }
|
||||
virtual void apply(const HLAVariableArrayDataType& dataType)
|
||||
{ apply(static_cast<const HLAArrayDataType&>(dataType)); }
|
||||
|
||||
virtual void apply(const HLAEnumeratedDataType& dataType)
|
||||
{ apply(static_cast<const HLADataType&>(dataType)); }
|
||||
|
||||
virtual void apply(const HLAFixedRecordDataType& dataType)
|
||||
{ apply(static_cast<const HLADataType&>(dataType)); }
|
||||
|
||||
virtual void apply(const HLAVariantDataType& dataType)
|
||||
{ apply(static_cast<const HLADataType&>(dataType)); }
|
||||
};
|
||||
|
||||
/// Walks the datatype tree and checks if it is completely defined
|
||||
class HLADataTypeCheckVisitor : public HLADataTypeVisitor {
|
||||
public:
|
||||
HLADataTypeCheckVisitor() : _valid(true) {}
|
||||
|
||||
bool valid() const { return _valid; }
|
||||
|
||||
virtual void apply(const HLAInt8DataType& dataType) { }
|
||||
virtual void apply(const HLAUInt8DataType& dataType) { }
|
||||
virtual void apply(const HLAInt16DataType& dataType) { }
|
||||
virtual void apply(const HLAUInt16DataType& dataType) { }
|
||||
virtual void apply(const HLAInt32DataType& dataType) { }
|
||||
virtual void apply(const HLAUInt32DataType& dataType) { }
|
||||
virtual void apply(const HLAInt64DataType& dataType) { }
|
||||
virtual void apply(const HLAUInt64DataType& dataType) { }
|
||||
virtual void apply(const HLAFloat32DataType& dataType) { }
|
||||
virtual void apply(const HLAFloat64DataType& dataType) { }
|
||||
|
||||
virtual void apply(const HLAFixedArrayDataType& dataType)
|
||||
{
|
||||
if (!dataType.getElementDataType())
|
||||
_valid = false;
|
||||
else
|
||||
dataType.getElementDataType()->accept(*this);
|
||||
}
|
||||
virtual void apply(const HLAVariableArrayDataType& dataType)
|
||||
{
|
||||
if (!dataType.getElementDataType())
|
||||
_valid = false;
|
||||
else
|
||||
dataType.getElementDataType()->accept(*this);
|
||||
|
||||
if (!dataType.getSizeDataType())
|
||||
_valid = false;
|
||||
else
|
||||
dataType.getSizeDataType()->accept(*this);
|
||||
}
|
||||
|
||||
virtual void apply(const HLAEnumeratedDataType& dataType)
|
||||
{
|
||||
if (!dataType.getRepresentation())
|
||||
_valid = false;
|
||||
else
|
||||
dataType.getRepresentation()->accept(*this);
|
||||
}
|
||||
|
||||
virtual void apply(const HLAFixedRecordDataType& dataType)
|
||||
{
|
||||
unsigned numFields = dataType.getNumFields();
|
||||
for (unsigned i = 0; i < numFields; ++i) {
|
||||
if (!dataType.getFieldDataType(i))
|
||||
_valid = false;
|
||||
else
|
||||
dataType.getFieldDataType(i)->accept(*this);
|
||||
}
|
||||
}
|
||||
|
||||
virtual void apply(const HLAVariantDataType& dataType)
|
||||
{ assert(0); }
|
||||
|
||||
protected:
|
||||
bool _valid;
|
||||
};
|
||||
|
||||
class HLADataTypeDecodeVisitor : public HLADataTypeVisitor {
|
||||
public:
|
||||
HLADataTypeDecodeVisitor(HLADecodeStream& stream) : _stream(stream) {}
|
||||
virtual ~HLADataTypeDecodeVisitor() {}
|
||||
|
||||
virtual void apply(const HLAInt8DataType& dataType) { dataType.skip(_stream); }
|
||||
virtual void apply(const HLAUInt8DataType& dataType) { dataType.skip(_stream); }
|
||||
virtual void apply(const HLAInt16DataType& dataType) { dataType.skip(_stream); }
|
||||
virtual void apply(const HLAUInt16DataType& dataType) { dataType.skip(_stream); }
|
||||
virtual void apply(const HLAInt32DataType& dataType) { dataType.skip(_stream); }
|
||||
virtual void apply(const HLAUInt32DataType& dataType) { dataType.skip(_stream); }
|
||||
virtual void apply(const HLAInt64DataType& dataType) { dataType.skip(_stream); }
|
||||
virtual void apply(const HLAUInt64DataType& dataType) { dataType.skip(_stream); }
|
||||
virtual void apply(const HLAFloat32DataType& dataType) { dataType.skip(_stream); }
|
||||
virtual void apply(const HLAFloat64DataType& dataType) { dataType.skip(_stream); }
|
||||
|
||||
virtual void apply(const HLAFixedArrayDataType& dataType)
|
||||
{
|
||||
unsigned numElements = dataType.getNumElements();
|
||||
for (unsigned i = 0; i < numElements; ++i)
|
||||
dataType.getElementDataType()->accept(*this);
|
||||
}
|
||||
virtual void apply(const HLAVariableArrayDataType& dataType);
|
||||
|
||||
virtual void apply(const HLAEnumeratedDataType& dataType)
|
||||
{
|
||||
dataType.getRepresentation()->accept(*this);
|
||||
}
|
||||
|
||||
virtual void apply(const HLAFixedRecordDataType& dataType)
|
||||
{
|
||||
unsigned numFields = dataType.getNumFields();
|
||||
for (unsigned i = 0; i < numFields; ++i)
|
||||
dataType.getFieldDataType(i)->accept(*this);
|
||||
}
|
||||
|
||||
virtual void apply(const HLAVariantDataType& dataType) { assert(0); }
|
||||
|
||||
protected:
|
||||
HLADecodeStream& _stream;
|
||||
};
|
||||
|
||||
class HLADataTypeEncodeVisitor : public HLADataTypeVisitor {
|
||||
public:
|
||||
HLADataTypeEncodeVisitor(HLAEncodeStream& stream) : _stream(stream) {}
|
||||
virtual ~HLADataTypeEncodeVisitor() {}
|
||||
|
||||
virtual void apply(const HLAInt8DataType& dataType) { dataType.skip(_stream); }
|
||||
virtual void apply(const HLAUInt8DataType& dataType) { dataType.skip(_stream); }
|
||||
virtual void apply(const HLAInt16DataType& dataType) { dataType.skip(_stream); }
|
||||
virtual void apply(const HLAUInt16DataType& dataType) { dataType.skip(_stream); }
|
||||
virtual void apply(const HLAInt32DataType& dataType) { dataType.skip(_stream); }
|
||||
virtual void apply(const HLAUInt32DataType& dataType) { dataType.skip(_stream); }
|
||||
virtual void apply(const HLAInt64DataType& dataType) { dataType.skip(_stream); }
|
||||
virtual void apply(const HLAUInt64DataType& dataType) { dataType.skip(_stream); }
|
||||
virtual void apply(const HLAFloat32DataType& dataType) { dataType.skip(_stream); }
|
||||
virtual void apply(const HLAFloat64DataType& dataType) { dataType.skip(_stream); }
|
||||
|
||||
virtual void apply(const HLAFixedArrayDataType& dataType)
|
||||
{
|
||||
/// FIXME, might vanish in this sense ...
|
||||
// dataType.encode(_stream, *this);
|
||||
unsigned numElements = dataType.getNumElements();
|
||||
for (unsigned i = 0; i < numElements; ++i)
|
||||
dataType.getElementDataType()->accept(*this);
|
||||
}
|
||||
virtual void apply(const HLAVariableArrayDataType& dataType);
|
||||
|
||||
virtual void apply(const HLAEnumeratedDataType& dataType)
|
||||
{
|
||||
dataType.getRepresentation()->accept(*this);
|
||||
}
|
||||
|
||||
virtual void apply(const HLAFixedRecordDataType& dataType)
|
||||
{
|
||||
unsigned numFields = dataType.getNumFields();
|
||||
for (unsigned i = 0; i < numFields; ++i)
|
||||
dataType.getFieldDataType(i)->accept(*this);
|
||||
}
|
||||
|
||||
virtual void apply(const HLAVariantDataType& dataType) { assert(0); }
|
||||
|
||||
protected:
|
||||
HLAEncodeStream& _stream;
|
||||
};
|
||||
|
||||
/// Begin implementation of some get/set visitors
|
||||
|
||||
class HLAScalarDecodeVisitor : public HLADataTypeDecodeVisitor {
|
||||
public:
|
||||
HLAScalarDecodeVisitor(HLADecodeStream& stream) :
|
||||
HLADataTypeDecodeVisitor(stream)
|
||||
{}
|
||||
|
||||
virtual void apply(const HLAFixedArrayDataType& dataType)
|
||||
{
|
||||
SG_LOG(SG_NETWORK, SG_WARN, "Unexpected HLADataType while decodeing scalar value");
|
||||
HLADataTypeDecodeVisitor::apply(dataType);
|
||||
}
|
||||
virtual void apply(const HLAVariableArrayDataType& dataType)
|
||||
{
|
||||
SG_LOG(SG_NETWORK, SG_WARN, "Unexpected HLADataType while decodeing scalar value");
|
||||
HLADataTypeDecodeVisitor::apply(dataType);
|
||||
}
|
||||
|
||||
virtual void apply(const HLAEnumeratedDataType& dataType)
|
||||
{
|
||||
SG_LOG(SG_NETWORK, SG_WARN, "Unexpected HLADataType while decodeing scalar value");
|
||||
HLADataTypeDecodeVisitor::apply(dataType);
|
||||
}
|
||||
|
||||
virtual void apply(const HLAFixedRecordDataType& dataType)
|
||||
{
|
||||
SG_LOG(SG_NETWORK, SG_WARN, "Unexpected HLADataType while decodeing scalar value");
|
||||
HLADataTypeDecodeVisitor::apply(dataType);
|
||||
}
|
||||
|
||||
virtual void apply(const HLAVariantDataType& dataType)
|
||||
{
|
||||
SG_LOG(SG_NETWORK, SG_WARN, "Unexpected HLADataType while decodeing scalar value");
|
||||
HLADataTypeDecodeVisitor::apply(dataType);
|
||||
}
|
||||
};
|
||||
|
||||
class HLAScalarEncodeVisitor : public HLADataTypeEncodeVisitor {
|
||||
public:
|
||||
HLAScalarEncodeVisitor(HLAEncodeStream& stream) :
|
||||
HLADataTypeEncodeVisitor(stream)
|
||||
{}
|
||||
|
||||
virtual void apply(const HLAFixedArrayDataType& dataType)
|
||||
{
|
||||
SG_LOG(SG_NETWORK, SG_WARN, "Unexpected HLADataType while writing scalar value");
|
||||
HLADataTypeEncodeVisitor::apply(dataType);
|
||||
}
|
||||
virtual void apply(const HLAVariableArrayDataType& dataType)
|
||||
{
|
||||
SG_LOG(SG_NETWORK, SG_WARN, "Unexpected HLADataType while writing scalar value");
|
||||
HLADataTypeEncodeVisitor::apply(dataType);
|
||||
}
|
||||
|
||||
virtual void apply(const HLAEnumeratedDataType& dataType)
|
||||
{
|
||||
SG_LOG(SG_NETWORK, SG_WARN, "Unexpected HLADataType while writing scalar value");
|
||||
HLADataTypeEncodeVisitor::apply(dataType);
|
||||
}
|
||||
|
||||
virtual void apply(const HLAFixedRecordDataType& dataType)
|
||||
{
|
||||
SG_LOG(SG_NETWORK, SG_WARN, "Unexpected HLADataType while writing scalar value");
|
||||
HLADataTypeEncodeVisitor::apply(dataType);
|
||||
}
|
||||
|
||||
virtual void apply(const HLAVariantDataType& dataType)
|
||||
{
|
||||
SG_LOG(SG_NETWORK, SG_WARN, "Unexpected HLADataType while writing scalar value");
|
||||
HLADataTypeEncodeVisitor::apply(dataType);
|
||||
}
|
||||
};
|
||||
|
||||
class HLAFixedRecordDecodeVisitor : public HLADataTypeDecodeVisitor {
|
||||
public:
|
||||
HLAFixedRecordDecodeVisitor(HLADecodeStream& stream) :
|
||||
HLADataTypeDecodeVisitor(stream)
|
||||
{ }
|
||||
|
||||
virtual void apply(const HLAInt8DataType& dataType)
|
||||
{
|
||||
SG_LOG(SG_NETWORK, SG_WARN, "Unexpected HLADataType while decodeing a fixed record value");
|
||||
HLADataTypeDecodeVisitor::apply(dataType);
|
||||
}
|
||||
virtual void apply(const HLAUInt8DataType& dataType)
|
||||
{
|
||||
SG_LOG(SG_NETWORK, SG_WARN, "Unexpected HLADataType while decodeing a fixed record value");
|
||||
HLADataTypeDecodeVisitor::apply(dataType);
|
||||
}
|
||||
virtual void apply(const HLAInt16DataType& dataType)
|
||||
{
|
||||
SG_LOG(SG_NETWORK, SG_WARN, "Unexpected HLADataType while decodeing a fixed record value");
|
||||
HLADataTypeDecodeVisitor::apply(dataType);
|
||||
}
|
||||
virtual void apply(const HLAUInt16DataType& dataType)
|
||||
{
|
||||
SG_LOG(SG_NETWORK, SG_WARN, "Unexpected HLADataType while decodeing a fixed record value");
|
||||
HLADataTypeDecodeVisitor::apply(dataType);
|
||||
}
|
||||
virtual void apply(const HLAInt32DataType& dataType)
|
||||
{
|
||||
SG_LOG(SG_NETWORK, SG_WARN, "Unexpected HLADataType while decodeing a fixed record value");
|
||||
HLADataTypeDecodeVisitor::apply(dataType);
|
||||
}
|
||||
virtual void apply(const HLAUInt32DataType& dataType)
|
||||
{
|
||||
SG_LOG(SG_NETWORK, SG_WARN, "Unexpected HLADataType while decodeing a fixed record value");
|
||||
HLADataTypeDecodeVisitor::apply(dataType);
|
||||
}
|
||||
virtual void apply(const HLAInt64DataType& dataType)
|
||||
{
|
||||
SG_LOG(SG_NETWORK, SG_WARN, "Unexpected HLADataType while decodeing a fixed record value");
|
||||
HLADataTypeDecodeVisitor::apply(dataType);
|
||||
}
|
||||
virtual void apply(const HLAUInt64DataType& dataType)
|
||||
{
|
||||
SG_LOG(SG_NETWORK, SG_WARN, "Unexpected HLADataType while decodeing a fixed record value");
|
||||
HLADataTypeDecodeVisitor::apply(dataType);
|
||||
}
|
||||
virtual void apply(const HLAFloat32DataType& dataType)
|
||||
{
|
||||
SG_LOG(SG_NETWORK, SG_WARN, "Unexpected HLADataType while decodeing a fixed record value");
|
||||
HLADataTypeDecodeVisitor::apply(dataType);
|
||||
}
|
||||
virtual void apply(const HLAFloat64DataType& dataType)
|
||||
{
|
||||
SG_LOG(SG_NETWORK, SG_WARN, "Unexpected HLADataType while decodeing a fixed record value");
|
||||
HLADataTypeDecodeVisitor::apply(dataType);
|
||||
}
|
||||
|
||||
virtual void apply(const HLAFixedArrayDataType& dataType)
|
||||
{
|
||||
SG_LOG(SG_NETWORK, SG_WARN, "Unexpected HLADataType while decodeing a fixed record value");
|
||||
HLADataTypeDecodeVisitor::apply(dataType);
|
||||
}
|
||||
virtual void apply(const HLAVariableArrayDataType& dataType)
|
||||
{
|
||||
SG_LOG(SG_NETWORK, SG_WARN, "Unexpected HLADataType while decodeing a fixed record value");
|
||||
HLADataTypeDecodeVisitor::apply(dataType);
|
||||
}
|
||||
|
||||
virtual void apply(const HLAEnumeratedDataType& dataType)
|
||||
{
|
||||
SG_LOG(SG_NETWORK, SG_WARN, "Unexpected HLADataType while decodeing a fixed record value");
|
||||
HLADataTypeDecodeVisitor::apply(dataType);
|
||||
}
|
||||
|
||||
virtual void apply(const HLAVariantDataType& dataType)
|
||||
{
|
||||
SG_LOG(SG_NETWORK, SG_WARN, "Unexpected HLADataType while decodeing a fixed record value");
|
||||
HLADataTypeDecodeVisitor::apply(dataType);
|
||||
}
|
||||
};
|
||||
|
||||
class HLAFixedRecordEncodeVisitor : public HLADataTypeEncodeVisitor {
|
||||
public:
|
||||
HLAFixedRecordEncodeVisitor(HLAEncodeStream& stream) :
|
||||
HLADataTypeEncodeVisitor(stream)
|
||||
{ }
|
||||
|
||||
virtual void apply(const HLAInt8DataType& dataType)
|
||||
{
|
||||
SG_LOG(SG_NETWORK, SG_WARN, "Unexpected HLADataType while writing a fixed record value");
|
||||
HLADataTypeEncodeVisitor::apply(dataType);
|
||||
}
|
||||
virtual void apply(const HLAUInt8DataType& dataType)
|
||||
{
|
||||
SG_LOG(SG_NETWORK, SG_WARN, "Unexpected HLADataType while writing a fixed record value");
|
||||
HLADataTypeEncodeVisitor::apply(dataType);
|
||||
}
|
||||
virtual void apply(const HLAInt16DataType& dataType)
|
||||
{
|
||||
SG_LOG(SG_NETWORK, SG_WARN, "Unexpected HLADataType while writing a fixed record value");
|
||||
HLADataTypeEncodeVisitor::apply(dataType);
|
||||
}
|
||||
virtual void apply(const HLAUInt16DataType& dataType)
|
||||
{
|
||||
SG_LOG(SG_NETWORK, SG_WARN, "Unexpected HLADataType while writing a fixed record value");
|
||||
HLADataTypeEncodeVisitor::apply(dataType);
|
||||
}
|
||||
virtual void apply(const HLAInt32DataType& dataType)
|
||||
{
|
||||
SG_LOG(SG_NETWORK, SG_WARN, "Unexpected HLADataType while writing a fixed record value");
|
||||
HLADataTypeEncodeVisitor::apply(dataType);
|
||||
}
|
||||
virtual void apply(const HLAUInt32DataType& dataType)
|
||||
{
|
||||
SG_LOG(SG_NETWORK, SG_WARN, "Unexpected HLADataType while writing a fixed record value");
|
||||
HLADataTypeEncodeVisitor::apply(dataType);
|
||||
}
|
||||
virtual void apply(const HLAInt64DataType& dataType)
|
||||
{
|
||||
SG_LOG(SG_NETWORK, SG_WARN, "Unexpected HLADataType while writing a fixed record value");
|
||||
HLADataTypeEncodeVisitor::apply(dataType);
|
||||
}
|
||||
virtual void apply(const HLAUInt64DataType& dataType)
|
||||
{
|
||||
SG_LOG(SG_NETWORK, SG_WARN, "Unexpected HLADataType while writing a fixed record value");
|
||||
HLADataTypeEncodeVisitor::apply(dataType);
|
||||
}
|
||||
virtual void apply(const HLAFloat32DataType& dataType)
|
||||
{
|
||||
SG_LOG(SG_NETWORK, SG_WARN, "Unexpected HLADataType while writing a fixed record value");
|
||||
HLADataTypeEncodeVisitor::apply(dataType);
|
||||
}
|
||||
virtual void apply(const HLAFloat64DataType& dataType)
|
||||
{
|
||||
SG_LOG(SG_NETWORK, SG_WARN, "Unexpected HLADataType while writing a fixed record value");
|
||||
HLADataTypeEncodeVisitor::apply(dataType);
|
||||
}
|
||||
|
||||
virtual void apply(const HLAFixedArrayDataType& dataType)
|
||||
{
|
||||
SG_LOG(SG_NETWORK, SG_WARN, "Unexpected HLADataType while writing a fixed record value");
|
||||
HLADataTypeEncodeVisitor::apply(dataType);
|
||||
}
|
||||
virtual void apply(const HLAVariableArrayDataType& dataType)
|
||||
{
|
||||
SG_LOG(SG_NETWORK, SG_WARN, "Unexpected HLADataType while writing a fixed record value");
|
||||
HLADataTypeEncodeVisitor::apply(dataType);
|
||||
}
|
||||
|
||||
virtual void apply(const HLAEnumeratedDataType& dataType)
|
||||
{
|
||||
SG_LOG(SG_NETWORK, SG_WARN, "Unexpected HLADataType while writing a fixed record value");
|
||||
HLADataTypeEncodeVisitor::apply(dataType);
|
||||
}
|
||||
|
||||
virtual void apply(const HLAVariantDataType& dataType)
|
||||
{
|
||||
SG_LOG(SG_NETWORK, SG_WARN, "Unexpected HLADataType while writing a fixed record value");
|
||||
HLADataTypeEncodeVisitor::apply(dataType);
|
||||
}
|
||||
};
|
||||
|
||||
template<typename T>
|
||||
class HLATemplateDecodeVisitor : public HLAScalarDecodeVisitor {
|
||||
public:
|
||||
typedef T value_type;
|
||||
|
||||
HLATemplateDecodeVisitor(HLADecodeStream& stream, const value_type& value = value_type()) :
|
||||
HLAScalarDecodeVisitor(stream),
|
||||
_value(value)
|
||||
{}
|
||||
|
||||
void setValue(const value_type& value)
|
||||
{ _value = value; }
|
||||
const value_type& getValue() const
|
||||
{ return _value; }
|
||||
|
||||
virtual void apply(const HLAInt8DataType& dataType)
|
||||
{
|
||||
int8_t value = 0;
|
||||
dataType.decode(_stream, value);
|
||||
_value = value_type(value);
|
||||
}
|
||||
virtual void apply(const HLAUInt8DataType& dataType)
|
||||
{
|
||||
uint8_t value = 0;
|
||||
dataType.decode(_stream, value);
|
||||
_value = value_type(value);
|
||||
}
|
||||
virtual void apply(const HLAInt16DataType& dataType)
|
||||
{
|
||||
int16_t value = 0;
|
||||
dataType.decode(_stream, value);
|
||||
_value = value_type(value);
|
||||
}
|
||||
virtual void apply(const HLAUInt16DataType& dataType)
|
||||
{
|
||||
uint16_t value = 0;
|
||||
dataType.decode(_stream, value);
|
||||
_value = value_type(value);
|
||||
}
|
||||
virtual void apply(const HLAInt32DataType& dataType)
|
||||
{
|
||||
int32_t value = 0;
|
||||
dataType.decode(_stream, value);
|
||||
_value = value_type(value);
|
||||
}
|
||||
virtual void apply(const HLAUInt32DataType& dataType)
|
||||
{
|
||||
uint32_t value = 0;
|
||||
dataType.decode(_stream, value);
|
||||
_value = value_type(value);
|
||||
}
|
||||
virtual void apply(const HLAInt64DataType& dataType)
|
||||
{
|
||||
int64_t value = 0;
|
||||
dataType.decode(_stream, value);
|
||||
_value = value_type(value);
|
||||
}
|
||||
virtual void apply(const HLAUInt64DataType& dataType)
|
||||
{
|
||||
uint64_t value = 0;
|
||||
dataType.decode(_stream, value);
|
||||
_value = value_type(value);
|
||||
}
|
||||
virtual void apply(const HLAFloat32DataType& dataType)
|
||||
{
|
||||
float value = 0;
|
||||
dataType.decode(_stream, value);
|
||||
_value = value_type(value);
|
||||
}
|
||||
virtual void apply(const HLAFloat64DataType& dataType)
|
||||
{
|
||||
double value = 0;
|
||||
dataType.decode(_stream, value);
|
||||
_value = value_type(value);
|
||||
}
|
||||
|
||||
private:
|
||||
value_type _value;
|
||||
};
|
||||
|
||||
template<typename T>
|
||||
class HLATemplateEncodeVisitor : public HLAScalarEncodeVisitor {
|
||||
public:
|
||||
typedef T value_type;
|
||||
|
||||
HLATemplateEncodeVisitor(HLAEncodeStream& stream, const value_type& value = value_type()) :
|
||||
HLAScalarEncodeVisitor(stream),
|
||||
_value(value)
|
||||
{}
|
||||
|
||||
void setValue(const value_type& value)
|
||||
{ _value = value; }
|
||||
const value_type& getValue() const
|
||||
{ return _value; }
|
||||
|
||||
virtual void apply(const HLAInt8DataType& dataType)
|
||||
{
|
||||
dataType.encode(_stream, _value);
|
||||
}
|
||||
virtual void apply(const HLAUInt8DataType& dataType)
|
||||
{
|
||||
dataType.encode(_stream, _value);
|
||||
}
|
||||
virtual void apply(const HLAInt16DataType& dataType)
|
||||
{
|
||||
dataType.encode(_stream, _value);
|
||||
}
|
||||
virtual void apply(const HLAUInt16DataType& dataType)
|
||||
{
|
||||
dataType.encode(_stream, _value);
|
||||
}
|
||||
virtual void apply(const HLAInt32DataType& dataType)
|
||||
{
|
||||
dataType.encode(_stream, _value);
|
||||
}
|
||||
virtual void apply(const HLAUInt32DataType& dataType)
|
||||
{
|
||||
dataType.encode(_stream, _value);
|
||||
}
|
||||
virtual void apply(const HLAInt64DataType& dataType)
|
||||
{
|
||||
dataType.encode(_stream, _value);
|
||||
}
|
||||
virtual void apply(const HLAUInt64DataType& dataType)
|
||||
{
|
||||
dataType.encode(_stream, _value);
|
||||
}
|
||||
virtual void apply(const HLAFloat32DataType& dataType)
|
||||
{
|
||||
dataType.encode(_stream, _value);
|
||||
}
|
||||
virtual void apply(const HLAFloat64DataType& dataType)
|
||||
{
|
||||
dataType.encode(_stream, _value);
|
||||
}
|
||||
|
||||
private:
|
||||
value_type _value;
|
||||
};
|
||||
|
||||
inline void HLADataTypeDecodeVisitor::apply(const HLAVariableArrayDataType& dataType)
|
||||
{
|
||||
HLATemplateDecodeVisitor<unsigned> numElementsVisitor(_stream);
|
||||
dataType.getSizeDataType()->accept(numElementsVisitor);
|
||||
unsigned numElements = numElementsVisitor.getValue();
|
||||
for (unsigned i = 0; i < numElements; ++i)
|
||||
dataType.getElementDataType()->accept(*this);
|
||||
}
|
||||
|
||||
inline void HLADataTypeEncodeVisitor::apply(const HLAVariableArrayDataType& dataType)
|
||||
{
|
||||
HLATemplateEncodeVisitor<unsigned> numElementsVisitor(_stream, 0);
|
||||
dataType.getSizeDataType()->accept(numElementsVisitor);
|
||||
}
|
||||
|
||||
/// Generate standard data elements according to the traversed type
|
||||
class HLADataElementFactoryVisitor : public HLADataTypeVisitor {
|
||||
public:
|
||||
virtual ~HLADataElementFactoryVisitor();
|
||||
|
||||
virtual void apply(const HLADataType& dataType);
|
||||
|
||||
virtual void apply(const HLAInt8DataType& dataType);
|
||||
virtual void apply(const HLAUInt8DataType& dataType);
|
||||
virtual void apply(const HLAInt16DataType& dataType);
|
||||
virtual void apply(const HLAUInt16DataType& dataType);
|
||||
virtual void apply(const HLAInt32DataType& dataType);
|
||||
virtual void apply(const HLAUInt32DataType& dataType);
|
||||
virtual void apply(const HLAInt64DataType& dataType);
|
||||
virtual void apply(const HLAUInt64DataType& dataType);
|
||||
virtual void apply(const HLAFloat32DataType& dataType);
|
||||
virtual void apply(const HLAFloat64DataType& dataType);
|
||||
|
||||
virtual void apply(const HLAFixedArrayDataType& dataType);
|
||||
virtual void apply(const HLAVariableArrayDataType& dataType);
|
||||
|
||||
virtual void apply(const HLAEnumeratedDataType& dataType);
|
||||
|
||||
virtual void apply(const HLAFixedRecordDataType& dataType);
|
||||
|
||||
virtual void apply(const HLAVariantDataType& dataType);
|
||||
|
||||
HLADataElement* getDataElement()
|
||||
{ return _dataElement.release(); }
|
||||
|
||||
protected:
|
||||
class ArrayDataElementFactory;
|
||||
class VariantDataElementFactory;
|
||||
|
||||
SGSharedPtr<HLADataElement> _dataElement;
|
||||
};
|
||||
|
||||
} // namespace simgear
|
||||
|
||||
#endif
|
||||
142
simgear/hla/HLAEnumeratedDataElement.cxx
Normal file
142
simgear/hla/HLAEnumeratedDataElement.cxx
Normal file
@@ -0,0 +1,142 @@
|
||||
// Copyright (C) 2009 - 2010 Mathias Froehlich - Mathias.Froehlich@web.de
|
||||
//
|
||||
// This library is free software; you can redistribute it and/or
|
||||
// modify it under the terms of the GNU Library General Public
|
||||
// License as published by the Free Software Foundation; either
|
||||
// version 2 of the License, or (at your option) any later version.
|
||||
//
|
||||
// This library is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
// Library General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program; if not, write to the Free Software
|
||||
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
//
|
||||
|
||||
#include "HLAEnumeratedDataElement.hxx"
|
||||
|
||||
#include <simgear/debug/logstream.hxx>
|
||||
|
||||
#include "HLADataElementVisitor.hxx"
|
||||
|
||||
namespace simgear {
|
||||
|
||||
HLAAbstractEnumeratedDataElement::HLAAbstractEnumeratedDataElement(const HLAEnumeratedDataType* dataType) :
|
||||
_dataType(dataType)
|
||||
{
|
||||
}
|
||||
|
||||
HLAAbstractEnumeratedDataElement::~HLAAbstractEnumeratedDataElement()
|
||||
{
|
||||
}
|
||||
|
||||
void
|
||||
HLAAbstractEnumeratedDataElement::accept(HLADataElementVisitor& visitor)
|
||||
{
|
||||
visitor.apply(*this);
|
||||
}
|
||||
|
||||
void
|
||||
HLAAbstractEnumeratedDataElement::accept(HLAConstDataElementVisitor& visitor) const
|
||||
{
|
||||
visitor.apply(*this);
|
||||
}
|
||||
|
||||
bool
|
||||
HLAAbstractEnumeratedDataElement::decode(HLADecodeStream& stream)
|
||||
{
|
||||
if (!_dataType.valid())
|
||||
return false;
|
||||
unsigned index;
|
||||
if (!_dataType->decode(stream, index))
|
||||
return false;
|
||||
setEnumeratorIndex(index);
|
||||
return true;
|
||||
}
|
||||
|
||||
bool
|
||||
HLAAbstractEnumeratedDataElement::encode(HLAEncodeStream& stream) const
|
||||
{
|
||||
if (!_dataType.valid())
|
||||
return false;
|
||||
return _dataType->encode(stream, getEnumeratorIndex());
|
||||
}
|
||||
|
||||
const HLAEnumeratedDataType*
|
||||
HLAAbstractEnumeratedDataElement::getDataType() const
|
||||
{
|
||||
return _dataType.get();
|
||||
}
|
||||
|
||||
bool
|
||||
HLAAbstractEnumeratedDataElement::setDataType(const HLADataType* dataType)
|
||||
{
|
||||
const HLAEnumeratedDataType* enumeratedDataType = dataType->toEnumeratedDataType();
|
||||
if (!enumeratedDataType) {
|
||||
SG_LOG(SG_NETWORK, SG_WARN, "HLAEnumeratedDataType: unable to set data type!");
|
||||
return false;
|
||||
}
|
||||
setDataType(enumeratedDataType);
|
||||
return true;
|
||||
}
|
||||
|
||||
void
|
||||
HLAAbstractEnumeratedDataElement::setDataType(const HLAEnumeratedDataType* dataType)
|
||||
{
|
||||
_dataType = dataType;
|
||||
}
|
||||
|
||||
const HLABasicDataType*
|
||||
HLAAbstractEnumeratedDataElement::getRepresentationDataType() const
|
||||
{
|
||||
if (!_dataType.valid())
|
||||
return 0;
|
||||
return _dataType->getRepresentation();
|
||||
}
|
||||
|
||||
std::string
|
||||
HLAAbstractEnumeratedDataElement::getStringRepresentation() const
|
||||
{
|
||||
if (!_dataType.valid())
|
||||
return std::string();
|
||||
return _dataType->getString(getEnumeratorIndex());
|
||||
}
|
||||
|
||||
bool
|
||||
HLAAbstractEnumeratedDataElement::setStringRepresentation(const std::string& name)
|
||||
{
|
||||
if (!_dataType.valid())
|
||||
return false;
|
||||
unsigned index = _dataType->getIndex(name);
|
||||
if (_dataType->getNumEnumerators() <= index)
|
||||
return false;
|
||||
setEnumeratorIndex(index);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
HLAEnumeratedDataElement::HLAEnumeratedDataElement(const HLAEnumeratedDataType* dataType) :
|
||||
HLAAbstractEnumeratedDataElement(dataType),
|
||||
_enumeratorIndex(~unsigned(0))
|
||||
{
|
||||
}
|
||||
|
||||
HLAEnumeratedDataElement::~HLAEnumeratedDataElement()
|
||||
{
|
||||
}
|
||||
|
||||
unsigned
|
||||
HLAEnumeratedDataElement::getEnumeratorIndex() const
|
||||
{
|
||||
return _enumeratorIndex;
|
||||
}
|
||||
|
||||
void
|
||||
HLAEnumeratedDataElement::setEnumeratorIndex(unsigned index)
|
||||
{
|
||||
_enumeratorIndex = index;
|
||||
}
|
||||
|
||||
}
|
||||
67
simgear/hla/HLAEnumeratedDataElement.hxx
Normal file
67
simgear/hla/HLAEnumeratedDataElement.hxx
Normal file
@@ -0,0 +1,67 @@
|
||||
// Copyright (C) 2009 - 2010 Mathias Froehlich - Mathias.Froehlich@web.de
|
||||
//
|
||||
// This library is free software; you can redistribute it and/or
|
||||
// modify it under the terms of the GNU Library General Public
|
||||
// License as published by the Free Software Foundation; either
|
||||
// version 2 of the License, or (at your option) any later version.
|
||||
//
|
||||
// This library is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
// Library General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program; if not, write to the Free Software
|
||||
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
//
|
||||
|
||||
#ifndef HLAEnumeratedDataElement_hxx
|
||||
#define HLAEnumeratedDataElement_hxx
|
||||
|
||||
#include "HLADataElement.hxx"
|
||||
#include "HLAEnumeratedDataType.hxx"
|
||||
|
||||
namespace simgear {
|
||||
|
||||
class HLAAbstractEnumeratedDataElement : public HLADataElement {
|
||||
public:
|
||||
HLAAbstractEnumeratedDataElement(const HLAEnumeratedDataType* dataType);
|
||||
virtual ~HLAAbstractEnumeratedDataElement();
|
||||
|
||||
virtual void accept(HLADataElementVisitor& visitor);
|
||||
virtual void accept(HLAConstDataElementVisitor& visitor) const;
|
||||
|
||||
virtual bool decode(HLADecodeStream& stream);
|
||||
virtual bool encode(HLAEncodeStream& stream) const;
|
||||
|
||||
virtual const HLAEnumeratedDataType* getDataType() const;
|
||||
virtual bool setDataType(const HLADataType* dataType);
|
||||
void setDataType(const HLAEnumeratedDataType* dataType);
|
||||
|
||||
const HLABasicDataType* getRepresentationDataType() const;
|
||||
|
||||
std::string getStringRepresentation() const;
|
||||
bool setStringRepresentation(const std::string& name);
|
||||
|
||||
virtual unsigned getEnumeratorIndex() const = 0;
|
||||
virtual void setEnumeratorIndex(unsigned index) = 0;
|
||||
|
||||
private:
|
||||
SGSharedPtr<const HLAEnumeratedDataType> _dataType;
|
||||
};
|
||||
|
||||
class HLAEnumeratedDataElement : public HLAAbstractEnumeratedDataElement {
|
||||
public:
|
||||
HLAEnumeratedDataElement(const HLAEnumeratedDataType* dataType);
|
||||
virtual ~HLAEnumeratedDataElement();
|
||||
|
||||
virtual unsigned getEnumeratorIndex() const;
|
||||
virtual void setEnumeratorIndex(unsigned index);
|
||||
|
||||
private:
|
||||
unsigned _enumeratorIndex;
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
#endif
|
||||
180
simgear/hla/HLAEnumeratedDataType.cxx
Normal file
180
simgear/hla/HLAEnumeratedDataType.cxx
Normal file
@@ -0,0 +1,180 @@
|
||||
// Copyright (C) 2009 - 2010 Mathias Froehlich - Mathias.Froehlich@web.de
|
||||
//
|
||||
// This library is free software; you can redistribute it and/or
|
||||
// modify it under the terms of the GNU Library General Public
|
||||
// License as published by the Free Software Foundation; either
|
||||
// version 2 of the License, or (at your option) any later version.
|
||||
//
|
||||
// This library is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
// Library General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program; if not, write to the Free Software
|
||||
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
//
|
||||
|
||||
#include "HLAEnumeratedDataType.hxx"
|
||||
|
||||
#include <map>
|
||||
#include <sstream>
|
||||
#include <vector>
|
||||
#include "HLAEnumeratedDataType.hxx"
|
||||
#include "HLADataTypeVisitor.hxx"
|
||||
|
||||
namespace simgear {
|
||||
|
||||
template<typename DataType, typename T>
|
||||
class HLAEnumeratedDataType::Map : public HLAEnumeratedDataType::AbstractMap {
|
||||
public:
|
||||
typedef typename std::pair<std::string,T> RepresentationPair;
|
||||
typedef typename std::map<T, unsigned> RepresentationIndexMap;
|
||||
typedef typename std::vector<RepresentationPair> IndexRepresentationMap;
|
||||
typedef typename std::map<std::string, unsigned> StringIndexMap;
|
||||
|
||||
Map(const DataType* dataType) :
|
||||
_dataType(dataType)
|
||||
{ }
|
||||
virtual bool encode(HLAEncodeStream& stream, unsigned index) const
|
||||
{
|
||||
T value = _otherRepresentation;
|
||||
if (index < _indexRepresentationMap.size())
|
||||
value = _indexRepresentationMap[index].second;
|
||||
if (!_dataType->encode(stream, value))
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
virtual bool decode(HLADecodeStream& stream, unsigned& index) const
|
||||
{
|
||||
T value;
|
||||
if (!_dataType->decode(stream, value))
|
||||
return false;
|
||||
typename RepresentationIndexMap::const_iterator i;
|
||||
i = _representationIndexMap.find(value);
|
||||
if (i == _representationIndexMap.end())
|
||||
index = _indexRepresentationMap.size();
|
||||
else
|
||||
index = i->second;
|
||||
return true;
|
||||
}
|
||||
virtual const HLABasicDataType* getDataType() const
|
||||
{ return _dataType.get(); }
|
||||
|
||||
virtual bool add(const std::string& name, const std::string& number)
|
||||
{
|
||||
std::stringstream ss(number);
|
||||
T value;
|
||||
ss >> value;
|
||||
if (ss.fail())
|
||||
return false;
|
||||
if (_representationIndexMap.find(value) != _representationIndexMap.end())
|
||||
return false;
|
||||
if (_stringIndexMap.find(name) != _stringIndexMap.end())
|
||||
return false;
|
||||
_stringIndexMap[name] = _indexRepresentationMap.size();
|
||||
_representationIndexMap[value] = _indexRepresentationMap.size();
|
||||
_indexRepresentationMap.push_back(RepresentationPair(name, value));
|
||||
return true;
|
||||
}
|
||||
virtual std::string getString(unsigned index) const
|
||||
{
|
||||
if (_indexRepresentationMap.size() <= index)
|
||||
return std::string();
|
||||
return _indexRepresentationMap[index].first;
|
||||
}
|
||||
virtual unsigned getIndex(const std::string& name) const
|
||||
{
|
||||
typename StringIndexMap::const_iterator i = _stringIndexMap.find(name);
|
||||
if (i == _stringIndexMap.end())
|
||||
return ~unsigned(0);
|
||||
return i->second;
|
||||
}
|
||||
virtual unsigned getNumEnumerators() const
|
||||
{ return _indexRepresentationMap.size(); }
|
||||
|
||||
private:
|
||||
IndexRepresentationMap _indexRepresentationMap;
|
||||
StringIndexMap _stringIndexMap;
|
||||
RepresentationIndexMap _representationIndexMap;
|
||||
|
||||
T _otherRepresentation;
|
||||
SGSharedPtr<const DataType> _dataType;
|
||||
};
|
||||
|
||||
class HLAEnumeratedDataType::RepresentationVisitor : public HLADataTypeVisitor {
|
||||
public:
|
||||
virtual void apply(const HLAInt8DataType& dataType)
|
||||
{ _map = new Map<HLAInt8DataType, int8_t>(&dataType); }
|
||||
virtual void apply(const HLAUInt8DataType& dataType)
|
||||
{ _map = new Map<HLAUInt8DataType, uint8_t>(&dataType); }
|
||||
virtual void apply(const HLAInt16DataType& dataType)
|
||||
{ _map = new Map<HLAInt16DataType, int16_t>(&dataType); }
|
||||
virtual void apply(const HLAUInt16DataType& dataType)
|
||||
{ _map = new Map<HLAUInt16DataType, uint16_t>(&dataType); }
|
||||
virtual void apply(const HLAInt32DataType& dataType)
|
||||
{ _map = new Map<HLAInt32DataType, int32_t>(&dataType); }
|
||||
virtual void apply(const HLAUInt32DataType& dataType)
|
||||
{ _map = new Map<HLAUInt32DataType, uint32_t>(&dataType); }
|
||||
virtual void apply(const HLAInt64DataType& dataType)
|
||||
{ _map = new Map<HLAInt64DataType, int64_t>(&dataType); }
|
||||
virtual void apply(const HLAUInt64DataType& dataType)
|
||||
{ _map = new Map<HLAUInt64DataType, uint64_t>(&dataType); }
|
||||
|
||||
SGSharedPtr<AbstractMap> _map;
|
||||
};
|
||||
|
||||
HLAEnumeratedDataType::HLAEnumeratedDataType(const std::string& name) :
|
||||
HLADataType(name)
|
||||
{
|
||||
}
|
||||
|
||||
HLAEnumeratedDataType::~HLAEnumeratedDataType()
|
||||
{
|
||||
}
|
||||
|
||||
void
|
||||
HLAEnumeratedDataType::accept(HLADataTypeVisitor& visitor) const
|
||||
{
|
||||
visitor.apply(*this);
|
||||
}
|
||||
|
||||
const HLAEnumeratedDataType*
|
||||
HLAEnumeratedDataType::toEnumeratedDataType() const
|
||||
{
|
||||
return this;
|
||||
}
|
||||
|
||||
bool
|
||||
HLAEnumeratedDataType::decode(HLADecodeStream& stream, unsigned& index) const
|
||||
{
|
||||
if (!_map.valid())
|
||||
return false;
|
||||
|
||||
if (!_map->decode(stream, index))
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
bool
|
||||
HLAEnumeratedDataType::encode(HLAEncodeStream& stream, unsigned index) const
|
||||
{
|
||||
if (!_map.valid())
|
||||
return false;
|
||||
|
||||
return _map->encode(stream, index);
|
||||
}
|
||||
|
||||
void
|
||||
HLAEnumeratedDataType::setRepresentation(HLABasicDataType* representation)
|
||||
{
|
||||
if (!representation)
|
||||
return;
|
||||
|
||||
RepresentationVisitor representationVisitor;
|
||||
representation->accept(representationVisitor);
|
||||
_map.swap(representationVisitor._map);
|
||||
}
|
||||
|
||||
} // namespace simgear
|
||||
|
||||
95
simgear/hla/HLAEnumeratedDataType.hxx
Normal file
95
simgear/hla/HLAEnumeratedDataType.hxx
Normal file
@@ -0,0 +1,95 @@
|
||||
// Copyright (C) 2009 - 2010 Mathias Froehlich - Mathias.Froehlich@web.de
|
||||
//
|
||||
// This library is free software; you can redistribute it and/or
|
||||
// modify it under the terms of the GNU Library General Public
|
||||
// License as published by the Free Software Foundation; either
|
||||
// version 2 of the License, or (at your option) any later version.
|
||||
//
|
||||
// This library is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
// Library General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program; if not, write to the Free Software
|
||||
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
//
|
||||
|
||||
#ifndef HLAEnumeratedDataType_hxx
|
||||
#define HLAEnumeratedDataType_hxx
|
||||
|
||||
#include <string>
|
||||
#include <simgear/structure/SGSharedPtr.hxx>
|
||||
#include "HLADataType.hxx"
|
||||
|
||||
namespace simgear {
|
||||
|
||||
class HLAEnumeratedDataType : public HLADataType {
|
||||
public:
|
||||
HLAEnumeratedDataType(const std::string& name = "HLAEnumeratedDataType");
|
||||
virtual ~HLAEnumeratedDataType();
|
||||
|
||||
virtual void accept(HLADataTypeVisitor& visitor) const;
|
||||
|
||||
virtual const HLAEnumeratedDataType* toEnumeratedDataType() const;
|
||||
|
||||
virtual bool decode(HLADecodeStream& stream, unsigned& index) const;
|
||||
virtual bool encode(HLAEncodeStream& stream, unsigned index) const;
|
||||
|
||||
std::string getString(unsigned index) const
|
||||
{
|
||||
if (!_map.valid())
|
||||
return std::string();
|
||||
return _map->getString(index);
|
||||
}
|
||||
unsigned getIndex(const std::string& name) const
|
||||
{
|
||||
if (!_map.valid())
|
||||
return ~unsigned(0);
|
||||
return _map->getIndex(name);
|
||||
}
|
||||
unsigned getNumEnumerators() const
|
||||
{
|
||||
if (!_map.valid())
|
||||
return 0;
|
||||
return _map->getNumEnumerators();
|
||||
}
|
||||
|
||||
bool addEnumerator(const std::string& name, const std::string& number)
|
||||
{
|
||||
if (!_map.valid())
|
||||
return false;
|
||||
return _map->add(name, number);
|
||||
}
|
||||
|
||||
void setRepresentation(HLABasicDataType* representation);
|
||||
const HLABasicDataType* getRepresentation() const
|
||||
{
|
||||
if (!_map.valid())
|
||||
return 0;
|
||||
return _map->getDataType();
|
||||
}
|
||||
|
||||
private:
|
||||
class AbstractMap : public SGReferenced {
|
||||
public:
|
||||
virtual ~AbstractMap() {}
|
||||
virtual bool encode(HLAEncodeStream& stream, unsigned index) const = 0;
|
||||
virtual bool decode(HLADecodeStream& stream, unsigned& index) const = 0;
|
||||
virtual const HLABasicDataType* getDataType() const = 0;
|
||||
virtual bool add(const std::string& name, const std::string& number) = 0;
|
||||
virtual std::string getString(unsigned index) const = 0;
|
||||
virtual unsigned getIndex(const std::string& name) const = 0;
|
||||
virtual unsigned getNumEnumerators() const = 0;
|
||||
};
|
||||
|
||||
template<typename DataType, typename T>
|
||||
class Map;
|
||||
class RepresentationVisitor;
|
||||
|
||||
SGSharedPtr<AbstractMap> _map;
|
||||
};
|
||||
|
||||
} // namespace simgear
|
||||
|
||||
#endif
|
||||
1012
simgear/hla/HLAFederate.cxx
Normal file
1012
simgear/hla/HLAFederate.cxx
Normal file
File diff suppressed because it is too large
Load Diff
262
simgear/hla/HLAFederate.hxx
Normal file
262
simgear/hla/HLAFederate.hxx
Normal file
@@ -0,0 +1,262 @@
|
||||
// Copyright (C) 2009 - 2011 Mathias Froehlich - Mathias.Froehlich@web.de
|
||||
//
|
||||
// This library is free software; you can redistribute it and/or
|
||||
// modify it under the terms of the GNU Library General Public
|
||||
// License as published by the Free Software Foundation; either
|
||||
// version 2 of the License, or (at your option) any later version.
|
||||
//
|
||||
// This library is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
// Library General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program; if not, write to the Free Software
|
||||
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
//
|
||||
|
||||
#ifndef HLAFederate_hxx
|
||||
#define HLAFederate_hxx
|
||||
|
||||
#include <map>
|
||||
|
||||
#include "HLAObjectInstance.hxx"
|
||||
#include "HLAObjectClass.hxx"
|
||||
#include "HLAInteractionClass.hxx"
|
||||
|
||||
class SGTimeStamp;
|
||||
|
||||
namespace simgear {
|
||||
|
||||
class RTIFederate;
|
||||
|
||||
class HLAFederate : public SGWeakReferenced {
|
||||
public:
|
||||
HLAFederate();
|
||||
virtual ~HLAFederate();
|
||||
|
||||
enum Version {
|
||||
RTI13,
|
||||
RTI1516,
|
||||
RTI1516E
|
||||
};
|
||||
|
||||
/// The rti version backend to connect
|
||||
Version getVersion() const;
|
||||
bool setVersion(HLAFederate::Version version);
|
||||
|
||||
/// The rti backends connect arguments, depends on the version
|
||||
const std::list<std::string>& getConnectArguments() const;
|
||||
bool setConnectArguments(const std::list<std::string>& connectArguments);
|
||||
|
||||
/// If true try to create on join and try to destroy on resign
|
||||
bool getCreateFederationExecution() const;
|
||||
bool setCreateFederationExecution(bool createFederationExecution);
|
||||
|
||||
/// The federation execution name to use on create, join and destroy
|
||||
const std::string& getFederationExecutionName() const;
|
||||
bool setFederationExecutionName(const std::string& federationExecutionName);
|
||||
|
||||
/// The federation object model name to use on create and possibly join
|
||||
const std::string& getFederationObjectModel() const;
|
||||
bool setFederationObjectModel(const std::string& federationObjectModel);
|
||||
|
||||
/// The federate type used on join
|
||||
const std::string& getFederateType() const;
|
||||
bool setFederateType(const std::string& federateType);
|
||||
|
||||
/// The federate name possibly used on join
|
||||
const std::string& getFederateName() const;
|
||||
bool setFederateName(const std::string& federateName);
|
||||
|
||||
/// connect to an rti
|
||||
bool connect(Version version, const std::list<std::string>& stringList);
|
||||
bool connect();
|
||||
bool disconnect();
|
||||
|
||||
/// Create a federation execution
|
||||
/// Semantically this methods should be static,
|
||||
/// but the nonstatic case could reuse the connection to the server
|
||||
bool createFederationExecution(const std::string& federation, const std::string& objectModel);
|
||||
bool destroyFederationExecution(const std::string& federation);
|
||||
bool createFederationExecution();
|
||||
bool destroyFederationExecution();
|
||||
|
||||
/// Join with federateType the federation execution
|
||||
bool join(const std::string& federateType, const std::string& federation);
|
||||
bool join();
|
||||
bool resign();
|
||||
|
||||
/// Try to create and join the federation execution.
|
||||
bool createJoinFederationExecution();
|
||||
bool resignDestroyFederationExecution();
|
||||
|
||||
|
||||
/// Time management
|
||||
|
||||
/// If set to true, time constrained mode is entered on init
|
||||
bool getTimeConstrained() const;
|
||||
bool setTimeConstrained(bool timeConstrained);
|
||||
|
||||
/// If set to true, time advance is constrained by the local system clock
|
||||
bool getTimeConstrainedByLocalClock() const;
|
||||
bool setTimeConstrainedByLocalClock(bool timeConstrainedByLocalClock);
|
||||
|
||||
/// If set to true, time regulation mode is entered on init
|
||||
bool getTimeRegulating() const;
|
||||
bool setTimeRegulating(bool timeRegulating);
|
||||
|
||||
/// If set to a non zero value, this federate leads the federations
|
||||
/// locical time advance by this amount of time.
|
||||
const SGTimeStamp& getLeadTime() const;
|
||||
bool setLeadTime(const SGTimeStamp& leadTime);
|
||||
|
||||
/// The time increment for use in the default update method.
|
||||
const SGTimeStamp& getTimeIncrement() const;
|
||||
bool setTimeIncrement(const SGTimeStamp& timeIncrement);
|
||||
|
||||
/// Actually enable time constrained mode.
|
||||
/// This method blocks until time constrained mode is enabled.
|
||||
bool enableTimeConstrained();
|
||||
/// Actually disable time constrained mode.
|
||||
bool disableTimeConstrained();
|
||||
|
||||
/// Actually enable time constrained by local clock mode.
|
||||
bool enableTimeConstrainedByLocalClock();
|
||||
|
||||
/// Actually enable time regulation mode.
|
||||
/// This method blocks until time regulation mode is enabled.
|
||||
bool enableTimeRegulation(const SGTimeStamp& lookahead);
|
||||
bool enableTimeRegulation();
|
||||
/// Actually disable time regulation mode.
|
||||
bool disableTimeRegulation();
|
||||
/// Actually modify the lookahead time.
|
||||
bool modifyLookahead(const SGTimeStamp& lookahead);
|
||||
|
||||
/// Advance the logical time by the given time increment.
|
||||
/// Depending on the time constrained mode, this might
|
||||
/// block until the time advance is granted.
|
||||
bool timeAdvanceBy(const SGTimeStamp& timeIncrement);
|
||||
/// Advance the logical time to the given time.
|
||||
/// Depending on the time constrained mode, this might
|
||||
/// block until the time advance is granted.
|
||||
bool timeAdvance(const SGTimeStamp& timeStamp);
|
||||
/// Advance the logical time as far as time advances are available.
|
||||
/// This call should not block and advance the logical time
|
||||
/// as far as currently possible.
|
||||
bool timeAdvanceAvailable();
|
||||
|
||||
/// Get the current federates time
|
||||
bool queryFederateTime(SGTimeStamp& timeStamp);
|
||||
/// Get the current federates lookahead
|
||||
bool queryLookahead(SGTimeStamp& timeStamp);
|
||||
|
||||
/// Process one messsage
|
||||
bool processMessage();
|
||||
/// Process one message but do not wait longer than the relative timeout.
|
||||
bool processMessage(const SGTimeStamp& timeout);
|
||||
/// Process messages until the federate can proceed with the
|
||||
/// next simulation step. That is flush all pending messages and
|
||||
/// depending on the time constrained mode process messages until
|
||||
/// a pending time advance is granted.
|
||||
bool processMessages();
|
||||
|
||||
/// Legacy tick call
|
||||
bool tick(const double& minimum, const double& maximum);
|
||||
|
||||
class ObjectModelFactory {
|
||||
public:
|
||||
virtual ~ObjectModelFactory()
|
||||
{ }
|
||||
|
||||
virtual HLAObjectClass* createObjectClass(const std::string& name, HLAFederate& federate)
|
||||
{ return new HLAObjectClass(name, federate); }
|
||||
virtual bool subscribeObjectClass(const std::string& objectClassName, const std::string& sharing)
|
||||
{ return sharing.find("Subscribe") != std::string::npos; }
|
||||
virtual bool publishObjectClass(const std::string& objectClassName, const std::string& sharing)
|
||||
{ return sharing.find("Publish") != std::string::npos; }
|
||||
virtual bool subscribeAttribute(const std::string& objectClassName, const std::string& attributeName, const std::string& sharing)
|
||||
{ return sharing.find("Subscribe") != std::string::npos; }
|
||||
virtual bool publishAttribute(const std::string& objectClassName, const std::string& attributeName, const std::string& sharing)
|
||||
{ return sharing.find("Publish") != std::string::npos; }
|
||||
|
||||
};
|
||||
|
||||
/// Read an omt xml file
|
||||
bool readObjectModelTemplate(const std::string& objectModel,
|
||||
ObjectModelFactory& objectModelFactory);
|
||||
|
||||
/// Get the object class of a given name
|
||||
HLAObjectClass* getObjectClass(const std::string& name);
|
||||
const HLAObjectClass* getObjectClass(const std::string& name) const;
|
||||
|
||||
/// Get the interaction class of a given name
|
||||
HLAInteractionClass* getInteractionClass(const std::string& name);
|
||||
const HLAInteractionClass* getInteractionClass(const std::string& name) const;
|
||||
|
||||
/// Tells the main exec loop to continue or not.
|
||||
void setDone(bool done);
|
||||
bool getDone() const;
|
||||
|
||||
virtual bool readObjectModel();
|
||||
|
||||
virtual bool subscribe();
|
||||
virtual bool publish();
|
||||
|
||||
virtual bool init();
|
||||
virtual bool update();
|
||||
virtual bool shutdown();
|
||||
|
||||
virtual bool exec();
|
||||
|
||||
private:
|
||||
HLAFederate(const HLAFederate&);
|
||||
HLAFederate& operator=(const HLAFederate&);
|
||||
|
||||
/// The underlying interface to the rti implementation
|
||||
SGSharedPtr<RTIFederate> _rtiFederate;
|
||||
|
||||
/// Parameters required to connect to an rti
|
||||
Version _version;
|
||||
std::list<std::string> _connectArguments;
|
||||
|
||||
/// Parameters for the federation execution
|
||||
std::string _federationExecutionName;
|
||||
std::string _federationObjectModel;
|
||||
bool _createFederationExecution;
|
||||
|
||||
/// Parameters for the federate
|
||||
std::string _federateType;
|
||||
std::string _federateName;
|
||||
|
||||
/// Time management related parameters
|
||||
/// If true, the federate is expected to enter time constrained mode
|
||||
bool _timeConstrained;
|
||||
/// If true, the federate is expected to enter time regulating mode
|
||||
bool _timeRegulating;
|
||||
/// The amount of time this federate leads the others.
|
||||
SGTimeStamp _leadTime;
|
||||
/// The regular time increment we do on calling update()
|
||||
SGTimeStamp _timeIncrement;
|
||||
/// The reference system time at initialization time.
|
||||
/// Is used to implement being time constrained on the
|
||||
/// local system time.
|
||||
bool _timeConstrainedByLocalClock;
|
||||
SGTimeStamp _localClockOffset;
|
||||
|
||||
/// If true the exec method returns.
|
||||
bool _done;
|
||||
|
||||
typedef std::map<std::string, SGSharedPtr<HLAObjectClass> > ObjectClassMap;
|
||||
ObjectClassMap _objectClassMap;
|
||||
|
||||
typedef std::map<std::string, SGSharedPtr<HLAInteractionClass> > InteractionClassMap;
|
||||
InteractionClassMap _interactionClassMap;
|
||||
|
||||
friend class HLAInteractionClass;
|
||||
friend class HLAObjectClass;
|
||||
};
|
||||
|
||||
} // namespace simgear
|
||||
|
||||
#endif
|
||||
193
simgear/hla/HLAFixedRecordDataElement.cxx
Normal file
193
simgear/hla/HLAFixedRecordDataElement.cxx
Normal file
@@ -0,0 +1,193 @@
|
||||
// Copyright (C) 2009 - 2010 Mathias Froehlich - Mathias.Froehlich@web.de
|
||||
//
|
||||
// This library is free software; you can redistribute it and/or
|
||||
// modify it under the terms of the GNU Library General Public
|
||||
// License as published by the Free Software Foundation; either
|
||||
// version 2 of the License, or (at your option) any later version.
|
||||
//
|
||||
// This library is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
// Library General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program; if not, write to the Free Software
|
||||
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
//
|
||||
|
||||
#include "HLAFixedRecordDataElement.hxx"
|
||||
|
||||
#include <string>
|
||||
#include <vector>
|
||||
#include <simgear/debug/logstream.hxx>
|
||||
|
||||
#include "HLADataElementVisitor.hxx"
|
||||
#include "HLADataTypeVisitor.hxx"
|
||||
|
||||
namespace simgear {
|
||||
|
||||
HLAAbstractFixedRecordDataElement::HLAAbstractFixedRecordDataElement(const HLAFixedRecordDataType* dataType) :
|
||||
_dataType(dataType)
|
||||
{
|
||||
}
|
||||
|
||||
HLAAbstractFixedRecordDataElement::~HLAAbstractFixedRecordDataElement()
|
||||
{
|
||||
}
|
||||
|
||||
void
|
||||
HLAAbstractFixedRecordDataElement::accept(HLADataElementVisitor& visitor)
|
||||
{
|
||||
visitor.apply(*this);
|
||||
}
|
||||
|
||||
void
|
||||
HLAAbstractFixedRecordDataElement::accept(HLAConstDataElementVisitor& visitor) const
|
||||
{
|
||||
visitor.apply(*this);
|
||||
}
|
||||
|
||||
bool
|
||||
HLAAbstractFixedRecordDataElement::decode(HLADecodeStream& stream)
|
||||
{
|
||||
if (!_dataType.valid())
|
||||
return false;
|
||||
return _dataType->decode(stream, *this);
|
||||
}
|
||||
|
||||
bool
|
||||
HLAAbstractFixedRecordDataElement::encode(HLAEncodeStream& stream) const
|
||||
{
|
||||
if (!_dataType.valid())
|
||||
return false;
|
||||
return _dataType->encode(stream, *this);
|
||||
}
|
||||
|
||||
const HLAFixedRecordDataType*
|
||||
HLAAbstractFixedRecordDataElement::getDataType() const
|
||||
{
|
||||
return _dataType.get();
|
||||
}
|
||||
|
||||
bool
|
||||
HLAAbstractFixedRecordDataElement::setDataType(const HLADataType* dataType)
|
||||
{
|
||||
const HLAFixedRecordDataType* fixedRecordDataType = dataType->toFixedRecordDataType();
|
||||
if (!fixedRecordDataType) {
|
||||
SG_LOG(SG_NETWORK, SG_WARN, "HLAFixedRecordDataType: unable to set data type!");
|
||||
return false;
|
||||
}
|
||||
setDataType(fixedRecordDataType);
|
||||
return true;
|
||||
}
|
||||
|
||||
void
|
||||
HLAAbstractFixedRecordDataElement::setDataType(const HLAFixedRecordDataType* dataType)
|
||||
{
|
||||
_dataType = dataType;
|
||||
}
|
||||
|
||||
unsigned
|
||||
HLAAbstractFixedRecordDataElement::getNumFields() const
|
||||
{
|
||||
return _dataType->getNumFields();
|
||||
}
|
||||
|
||||
unsigned
|
||||
HLAAbstractFixedRecordDataElement::getFieldNumber(const std::string& name) const
|
||||
{
|
||||
return _dataType->getFieldNumber(name);
|
||||
}
|
||||
|
||||
const HLADataType*
|
||||
HLAAbstractFixedRecordDataElement::getFieldDataType(unsigned i) const
|
||||
{
|
||||
return _dataType->getFieldDataType(i);
|
||||
}
|
||||
|
||||
const HLADataType*
|
||||
HLAAbstractFixedRecordDataElement::getFieldDataType(const std::string& name) const
|
||||
{
|
||||
return getFieldDataType(getFieldNumber(name));
|
||||
}
|
||||
|
||||
|
||||
HLAFixedRecordDataElement::HLAFixedRecordDataElement(const HLAFixedRecordDataType* dataType) :
|
||||
HLAAbstractFixedRecordDataElement(dataType)
|
||||
{
|
||||
_fieldVector.resize(getNumFields());
|
||||
}
|
||||
|
||||
HLAFixedRecordDataElement::~HLAFixedRecordDataElement()
|
||||
{
|
||||
}
|
||||
|
||||
bool
|
||||
HLAFixedRecordDataElement::decodeField(HLADecodeStream& stream, unsigned i)
|
||||
{
|
||||
HLADataElement* dataElement = getField(i);
|
||||
if (dataElement) {
|
||||
return dataElement->decode(stream);
|
||||
} else {
|
||||
HLADataTypeDecodeVisitor visitor(stream);
|
||||
getDataType()->getFieldDataType(i)->accept(visitor);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
bool
|
||||
HLAFixedRecordDataElement::encodeField(HLAEncodeStream& stream, unsigned i) const
|
||||
{
|
||||
const HLADataElement* dataElement = getField(i);
|
||||
if (dataElement) {
|
||||
return dataElement->encode(stream);
|
||||
} else {
|
||||
HLADataTypeEncodeVisitor visitor(stream);
|
||||
getDataType()->getFieldDataType(i)->accept(visitor);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
HLADataElement*
|
||||
HLAFixedRecordDataElement::getField(const std::string& name)
|
||||
{
|
||||
return getField(getFieldNumber(name));
|
||||
}
|
||||
|
||||
const HLADataElement*
|
||||
HLAFixedRecordDataElement::getField(const std::string& name) const
|
||||
{
|
||||
return getField(getFieldNumber(name));
|
||||
}
|
||||
|
||||
HLADataElement*
|
||||
HLAFixedRecordDataElement::getField(unsigned i)
|
||||
{
|
||||
if (_fieldVector.size() <= i)
|
||||
return 0;
|
||||
return _fieldVector[i].get();
|
||||
}
|
||||
|
||||
const HLADataElement*
|
||||
HLAFixedRecordDataElement::getField(unsigned i) const
|
||||
{
|
||||
if (_fieldVector.size() <= i)
|
||||
return 0;
|
||||
return _fieldVector[i].get();
|
||||
}
|
||||
|
||||
void
|
||||
HLAFixedRecordDataElement::setField(unsigned index, HLADataElement* value)
|
||||
{
|
||||
if (getNumFields() <= index)
|
||||
return;
|
||||
_fieldVector[index] = value;
|
||||
}
|
||||
|
||||
void
|
||||
HLAFixedRecordDataElement::setField(const std::string& name, HLADataElement* value)
|
||||
{
|
||||
setField(getFieldNumber(name), value);
|
||||
}
|
||||
|
||||
}
|
||||
80
simgear/hla/HLAFixedRecordDataElement.hxx
Normal file
80
simgear/hla/HLAFixedRecordDataElement.hxx
Normal file
@@ -0,0 +1,80 @@
|
||||
// Copyright (C) 2009 - 2010 Mathias Froehlich - Mathias.Froehlich@web.de
|
||||
//
|
||||
// This library is free software; you can redistribute it and/or
|
||||
// modify it under the terms of the GNU Library General Public
|
||||
// License as published by the Free Software Foundation; either
|
||||
// version 2 of the License, or (at your option) any later version.
|
||||
//
|
||||
// This library is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
// Library General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program; if not, write to the Free Software
|
||||
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
//
|
||||
|
||||
#ifndef HLAFixedRecordDataElement_hxx
|
||||
#define HLAFixedRecordDataElement_hxx
|
||||
|
||||
#include <string>
|
||||
#include <vector>
|
||||
#include "HLADataElement.hxx"
|
||||
#include "HLAFixedRecordDataType.hxx"
|
||||
|
||||
namespace simgear {
|
||||
|
||||
class HLAAbstractFixedRecordDataElement : public HLADataElement {
|
||||
public:
|
||||
HLAAbstractFixedRecordDataElement(const HLAFixedRecordDataType* dataType);
|
||||
virtual ~HLAAbstractFixedRecordDataElement();
|
||||
|
||||
virtual void accept(HLADataElementVisitor& visitor);
|
||||
virtual void accept(HLAConstDataElementVisitor& visitor) const;
|
||||
|
||||
virtual bool decode(HLADecodeStream& stream);
|
||||
virtual bool encode(HLAEncodeStream& stream) const;
|
||||
|
||||
virtual const HLAFixedRecordDataType* getDataType() const;
|
||||
virtual bool setDataType(const HLADataType* dataType);
|
||||
void setDataType(const HLAFixedRecordDataType* dataType);
|
||||
|
||||
unsigned getNumFields() const;
|
||||
unsigned getFieldNumber(const std::string& name) const;
|
||||
|
||||
const HLADataType* getFieldDataType(unsigned i) const;
|
||||
const HLADataType* getFieldDataType(const std::string& name) const;
|
||||
|
||||
virtual bool decodeField(HLADecodeStream& stream, unsigned i) = 0;
|
||||
virtual bool encodeField(HLAEncodeStream& stream, unsigned i) const = 0;
|
||||
|
||||
private:
|
||||
SGSharedPtr<const HLAFixedRecordDataType> _dataType;
|
||||
};
|
||||
|
||||
class HLAFixedRecordDataElement : public HLAAbstractFixedRecordDataElement {
|
||||
public:
|
||||
HLAFixedRecordDataElement(const HLAFixedRecordDataType* dataType);
|
||||
virtual ~HLAFixedRecordDataElement();
|
||||
|
||||
virtual bool decodeField(HLADecodeStream& stream, unsigned i);
|
||||
virtual bool encodeField(HLAEncodeStream& stream, unsigned i) const;
|
||||
|
||||
HLADataElement* getField(const std::string& name);
|
||||
const HLADataElement* getField(const std::string& name) const;
|
||||
|
||||
HLADataElement* getField(unsigned i);
|
||||
const HLADataElement* getField(unsigned i) const;
|
||||
|
||||
void setField(unsigned index, HLADataElement* value);
|
||||
void setField(const std::string& name, HLADataElement* value);
|
||||
|
||||
private:
|
||||
typedef std::vector<SGSharedPtr<HLADataElement> > FieldVector;
|
||||
FieldVector _fieldVector;
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
#endif
|
||||
77
simgear/hla/HLAFixedRecordDataType.cxx
Normal file
77
simgear/hla/HLAFixedRecordDataType.cxx
Normal file
@@ -0,0 +1,77 @@
|
||||
// Copyright (C) 2009 - 2010 Mathias Froehlich - Mathias.Froehlich@web.de
|
||||
//
|
||||
// This library is free software; you can redistribute it and/or
|
||||
// modify it under the terms of the GNU Library General Public
|
||||
// License as published by the Free Software Foundation; either
|
||||
// version 2 of the License, or (at your option) any later version.
|
||||
//
|
||||
// This library is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
// Library General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program; if not, write to the Free Software
|
||||
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
//
|
||||
|
||||
#include "HLAFixedRecordDataType.hxx"
|
||||
|
||||
#include "HLADataTypeVisitor.hxx"
|
||||
#include "HLAFixedRecordDataElement.hxx"
|
||||
|
||||
namespace simgear {
|
||||
|
||||
HLAFixedRecordDataType::HLAFixedRecordDataType(const std::string& name) :
|
||||
HLADataType(name)
|
||||
{
|
||||
}
|
||||
|
||||
HLAFixedRecordDataType::~HLAFixedRecordDataType()
|
||||
{
|
||||
}
|
||||
|
||||
void
|
||||
HLAFixedRecordDataType::accept(HLADataTypeVisitor& visitor) const
|
||||
{
|
||||
visitor.apply(*this);
|
||||
}
|
||||
|
||||
const HLAFixedRecordDataType*
|
||||
HLAFixedRecordDataType::toFixedRecordDataType() const
|
||||
{
|
||||
return this;
|
||||
}
|
||||
|
||||
bool
|
||||
HLAFixedRecordDataType::decode(HLADecodeStream& stream, HLAAbstractFixedRecordDataElement& value) const
|
||||
{
|
||||
stream.alignOffsetForSize(getAlignment());
|
||||
unsigned numFields = getNumFields();
|
||||
for (unsigned i = 0; i < numFields; ++i)
|
||||
if (!value.decodeField(stream, i))
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
bool
|
||||
HLAFixedRecordDataType::encode(HLAEncodeStream& stream, const HLAAbstractFixedRecordDataElement& value) const
|
||||
{
|
||||
stream.alignOffsetForSize(getAlignment());
|
||||
unsigned numFields = getNumFields();
|
||||
for (unsigned i = 0; i < numFields; ++i)
|
||||
if (!value.encodeField(stream, i))
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
void
|
||||
HLAFixedRecordDataType::addField(const std::string& name, const HLADataType* dataType)
|
||||
{
|
||||
// FIXME this only works if we do not reset the alignment to something smaller
|
||||
if (getAlignment() < dataType->getAlignment())
|
||||
setAlignment(dataType->getAlignment());
|
||||
_fieldList.push_back(Field(name, dataType));
|
||||
}
|
||||
|
||||
} // namespace simgear
|
||||
91
simgear/hla/HLAFixedRecordDataType.hxx
Normal file
91
simgear/hla/HLAFixedRecordDataType.hxx
Normal file
@@ -0,0 +1,91 @@
|
||||
// Copyright (C) 2009 - 2010 Mathias Froehlich - Mathias.Froehlich@web.de
|
||||
//
|
||||
// This library is free software; you can redistribute it and/or
|
||||
// modify it under the terms of the GNU Library General Public
|
||||
// License as published by the Free Software Foundation; either
|
||||
// version 2 of the License, or (at your option) any later version.
|
||||
//
|
||||
// This library is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
// Library General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program; if not, write to the Free Software
|
||||
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
//
|
||||
|
||||
#ifndef HLAFixedRecordDataType_hxx
|
||||
#define HLAFixedRecordDataType_hxx
|
||||
|
||||
#include <string>
|
||||
#include <vector>
|
||||
#include <simgear/structure/SGSharedPtr.hxx>
|
||||
#include "HLADataType.hxx"
|
||||
|
||||
namespace simgear {
|
||||
|
||||
class HLAAbstractFixedRecordDataElement;
|
||||
|
||||
class HLAFixedRecordDataType : public HLADataType {
|
||||
public:
|
||||
HLAFixedRecordDataType(const std::string& name = "HLAFixedRecordDataType");
|
||||
virtual ~HLAFixedRecordDataType();
|
||||
|
||||
virtual void accept(HLADataTypeVisitor& visitor) const;
|
||||
|
||||
virtual const HLAFixedRecordDataType* toFixedRecordDataType() const;
|
||||
|
||||
virtual bool decode(HLADecodeStream& stream, HLAAbstractFixedRecordDataElement& value) const;
|
||||
virtual bool encode(HLAEncodeStream& stream, const HLAAbstractFixedRecordDataElement& value) const;
|
||||
|
||||
unsigned getNumFields() const
|
||||
{ return _fieldList.size(); }
|
||||
|
||||
std::string getFieldName(unsigned i) const
|
||||
{
|
||||
if (_fieldList.size() <= i)
|
||||
return std::string();
|
||||
return _fieldList[i].getName();
|
||||
}
|
||||
const HLADataType* getFieldDataType(unsigned i) const
|
||||
{
|
||||
if (_fieldList.size() <= i)
|
||||
return 0;
|
||||
return _fieldList[i].getDataType();
|
||||
}
|
||||
|
||||
unsigned getFieldNumber(const std::string& name) const
|
||||
{
|
||||
for (unsigned i = 0; i < _fieldList.size(); ++i) {
|
||||
if (_fieldList[i].getName() != name)
|
||||
continue;
|
||||
return i;
|
||||
}
|
||||
return ~0u;
|
||||
}
|
||||
|
||||
void addField(const std::string& name, const HLADataType* dataType);
|
||||
|
||||
private:
|
||||
struct Field {
|
||||
Field(const std::string& name, const HLADataType* dataType) :
|
||||
_name(name), _dataType(dataType) {}
|
||||
const std::string& getName() const
|
||||
{ return _name; }
|
||||
|
||||
const HLADataType* getDataType() const
|
||||
{ return _dataType.get(); }
|
||||
|
||||
private:
|
||||
std::string _name;
|
||||
SGSharedPtr<const HLADataType> _dataType;
|
||||
};
|
||||
|
||||
typedef std::vector<Field> FieldList;
|
||||
FieldList _fieldList;
|
||||
};
|
||||
|
||||
} // namespace simgear
|
||||
|
||||
#endif
|
||||
@@ -1,7 +1,4 @@
|
||||
|
||||
// Written by James Turner, started July 2010.
|
||||
//
|
||||
// Copyright (C) 2010 Curtis L. Olson - http://www.flightgear.org/~curt
|
||||
// Copyright (C) 2009 - 2010 Mathias Froehlich - Mathias.Froehlich@web.de
|
||||
//
|
||||
// This library is free software; you can redistribute it and/or
|
||||
// modify it under the terms of the GNU Library General Public
|
||||
@@ -17,44 +14,23 @@
|
||||
// along with this program; if not, write to the Free Software
|
||||
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
//
|
||||
// $Id$
|
||||
|
||||
#include <simgear/misc/sg_sleep.hxx>
|
||||
#ifndef HLAInteractionClass_hxx
|
||||
#define HLAInteractionClass_hxx
|
||||
|
||||
#ifdef SG_WINDOWS
|
||||
# include <windows.h>
|
||||
#else
|
||||
# include <unistd.h>
|
||||
#endif
|
||||
namespace simgear {
|
||||
|
||||
namespace simgear
|
||||
{
|
||||
class RTIInteractionClass;
|
||||
|
||||
#ifdef SG_WINDOWS
|
||||
class HLAInteractionClass : public SGWeakReferenced {
|
||||
public:
|
||||
virtual ~HLAInteractionClass() {}
|
||||
|
||||
void sleepForSeconds(int seconds)
|
||||
{
|
||||
Sleep(1000 * seconds);
|
||||
}
|
||||
private:
|
||||
HLAInteractionClass(const HLAInteractionClass&);
|
||||
HLAInteractionClass& operator=(const HLAInteractionClass&);
|
||||
};
|
||||
|
||||
void sleepForMSec(int msec)
|
||||
{
|
||||
Sleep(msec);
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
void sleepForSeconds(int seconds)
|
||||
{
|
||||
::sleep(seconds);
|
||||
}
|
||||
|
||||
void sleepForMSec(int msec)
|
||||
{
|
||||
::usleep(msec * 1000);
|
||||
}
|
||||
} // namespace simgear
|
||||
|
||||
#endif
|
||||
|
||||
} // of namespace simhear
|
||||
|
||||
549
simgear/hla/HLALocation.hxx
Normal file
549
simgear/hla/HLALocation.hxx
Normal file
@@ -0,0 +1,549 @@
|
||||
// Copyright (C) 2009 - 2010 Mathias Froehlich - Mathias.Froehlich@web.de
|
||||
//
|
||||
// This library is free software; you can redistribute it and/or
|
||||
// modify it under the terms of the GNU Library General Public
|
||||
// License as published by the Free Software Foundation; either
|
||||
// version 2 of the License, or (at your option) any later version.
|
||||
//
|
||||
// This library is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
// Library General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program; if not, write to the Free Software
|
||||
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
//
|
||||
|
||||
#ifndef HLALocation_hxx
|
||||
#define HLALocation_hxx
|
||||
|
||||
#include "HLABasicDataElement.hxx"
|
||||
|
||||
namespace simgear {
|
||||
|
||||
class HLAAbstractLocation : public SGReferenced {
|
||||
public:
|
||||
virtual ~HLAAbstractLocation() {}
|
||||
|
||||
virtual SGVec3d getCartPosition() const = 0;
|
||||
virtual void setCartPosition(const SGVec3d&) = 0;
|
||||
|
||||
virtual SGQuatd getCartOrientation() const = 0;
|
||||
virtual void setCartOrientation(const SGQuatd&) = 0;
|
||||
|
||||
virtual SGVec3d getAngularBodyVelocity() const = 0;
|
||||
virtual void setAngularBodyVelocity(const SGVec3d& angular) = 0;
|
||||
|
||||
virtual SGVec3d getLinearBodyVelocity() const = 0;
|
||||
virtual void setLinearBodyVelocity(const SGVec3d& linear) = 0;
|
||||
};
|
||||
|
||||
class HLACartesianLocation : public HLAAbstractLocation {
|
||||
public:
|
||||
HLACartesianLocation() :
|
||||
_position(SGVec3d::zeros()),
|
||||
_imag(SGVec3d::zeros()),
|
||||
_angularVelocity(SGVec3d::zeros()),
|
||||
_linearVelocity(SGVec3d::zeros())
|
||||
{ }
|
||||
|
||||
virtual SGVec3d getCartPosition() const
|
||||
{ return _position; }
|
||||
virtual void setCartPosition(const SGVec3d& position)
|
||||
{ _position = position; }
|
||||
|
||||
virtual SGQuatd getCartOrientation() const
|
||||
{ return SGQuatd::fromPositiveRealImag(_imag); }
|
||||
virtual void setCartOrientation(const SGQuatd& orientation)
|
||||
{ _imag = orientation.getPositiveRealImag(); }
|
||||
|
||||
virtual SGVec3d getAngularBodyVelocity() const
|
||||
{ return _angularVelocity; }
|
||||
virtual void setAngularBodyVelocity(const SGVec3d& angularVelocity)
|
||||
{ _angularVelocity = angularVelocity; }
|
||||
|
||||
virtual SGVec3d getLinearBodyVelocity() const
|
||||
{ return _linearVelocity; }
|
||||
virtual void setLinearBodyVelocity(const SGVec3d& linearVelocity)
|
||||
{ _linearVelocity = linearVelocity; }
|
||||
|
||||
HLADataElementProvider getPositionDataElement(unsigned i)
|
||||
{
|
||||
if (3 <= i)
|
||||
return HLADataElementProvider();
|
||||
return new PositionDataElement(this, i);
|
||||
}
|
||||
HLADataElementProvider getOrientationDataElement(unsigned i)
|
||||
{
|
||||
if (3 <= i)
|
||||
return HLADataElementProvider();
|
||||
return new OrientationDataElement(this, i);
|
||||
}
|
||||
|
||||
HLADataElementProvider getAngularVelocityDataElement(unsigned i)
|
||||
{
|
||||
if (3 <= i)
|
||||
return HLADataElementProvider();
|
||||
return new AngularVelocityDataElement(this, i);
|
||||
}
|
||||
HLADataElementProvider getLinearVelocityDataElement(unsigned i)
|
||||
{
|
||||
if (3 <= i)
|
||||
return HLADataElementProvider();
|
||||
return new LinearVelocityDataElement(this, i);
|
||||
}
|
||||
|
||||
private:
|
||||
class PositionDataElement : public HLAAbstractDoubleDataElement {
|
||||
public:
|
||||
PositionDataElement(HLACartesianLocation* data, unsigned index) :
|
||||
_data(data), _index(index)
|
||||
{ }
|
||||
virtual double getValue() const
|
||||
{ return _data->_position[_index]; }
|
||||
virtual void setValue(double value)
|
||||
{ _data->_position[_index] = value; }
|
||||
|
||||
private:
|
||||
SGSharedPtr<HLACartesianLocation> _data;
|
||||
unsigned _index;
|
||||
};
|
||||
|
||||
class OrientationDataElement : public HLAAbstractDoubleDataElement {
|
||||
public:
|
||||
OrientationDataElement(HLACartesianLocation* data, unsigned index) :
|
||||
_data(data), _index(index)
|
||||
{ }
|
||||
virtual double getValue() const
|
||||
{ return _data->_imag[_index]; }
|
||||
virtual void setValue(double value)
|
||||
{ _data->_imag[_index] = value; }
|
||||
|
||||
private:
|
||||
SGSharedPtr<HLACartesianLocation> _data;
|
||||
unsigned _index;
|
||||
};
|
||||
|
||||
class AngularVelocityDataElement : public HLAAbstractDoubleDataElement {
|
||||
public:
|
||||
AngularVelocityDataElement(HLACartesianLocation* data, unsigned index) :
|
||||
_data(data), _index(index)
|
||||
{ }
|
||||
virtual double getValue() const
|
||||
{ return _data->_angularVelocity[_index]; }
|
||||
virtual void setValue(double value)
|
||||
{ _data->_angularVelocity[_index] = value; }
|
||||
|
||||
private:
|
||||
SGSharedPtr<HLACartesianLocation> _data;
|
||||
unsigned _index;
|
||||
};
|
||||
|
||||
class LinearVelocityDataElement : public HLAAbstractDoubleDataElement {
|
||||
public:
|
||||
LinearVelocityDataElement(HLACartesianLocation* data, unsigned index) :
|
||||
_data(data), _index(index)
|
||||
{ }
|
||||
virtual double getValue() const
|
||||
{ return _data->_linearVelocity[_index]; }
|
||||
virtual void setValue(double value)
|
||||
{ _data->_linearVelocity[_index] = value; }
|
||||
|
||||
private:
|
||||
SGSharedPtr<HLACartesianLocation> _data;
|
||||
unsigned _index;
|
||||
};
|
||||
|
||||
SGVec3d _position;
|
||||
SGVec3d _imag;
|
||||
|
||||
SGVec3d _angularVelocity;
|
||||
SGVec3d _linearVelocity;
|
||||
};
|
||||
|
||||
class HLALocationFactory : public SGReferenced {
|
||||
public:
|
||||
virtual ~HLALocationFactory() {}
|
||||
virtual HLAAbstractLocation* createLocation(HLAAttributePathElementMap&) const = 0;
|
||||
};
|
||||
|
||||
class HLACartesianLocationFactory : public HLALocationFactory {
|
||||
public:
|
||||
virtual HLAAbstractLocation* createLocation(HLAAttributePathElementMap& attributePathElementMap) const
|
||||
{
|
||||
HLACartesianLocation* location = new HLACartesianLocation;
|
||||
for (unsigned i = 0; i < 3; ++i) {
|
||||
const HLADataElement::IndexPathPair& indexPathPair = _positonIndexPathPair[i];
|
||||
attributePathElementMap[indexPathPair.first][indexPathPair.second] = location->getPositionDataElement(i);
|
||||
}
|
||||
for (unsigned i = 0; i < 3; ++i) {
|
||||
const HLADataElement::IndexPathPair& indexPathPair = _orientationIndexPathPair[i];
|
||||
attributePathElementMap[indexPathPair.first][indexPathPair.second] = location->getOrientationDataElement(i);
|
||||
}
|
||||
for (unsigned i = 0; i < 3; ++i) {
|
||||
const HLADataElement::IndexPathPair& indexPathPair = _angularVelocityIndexPathPair[i];
|
||||
attributePathElementMap[indexPathPair.first][indexPathPair.second] = location->getAngularVelocityDataElement(i);
|
||||
}
|
||||
for (unsigned i = 0; i < 3; ++i) {
|
||||
const HLADataElement::IndexPathPair& indexPathPair = _linearVelocityIndexPathPair[i];
|
||||
attributePathElementMap[indexPathPair.first][indexPathPair.second] = location->getLinearVelocityDataElement(i);
|
||||
}
|
||||
return location;
|
||||
}
|
||||
|
||||
void setPositionIndexPathPair(unsigned index, const HLADataElement::IndexPathPair& indexPathPair)
|
||||
{
|
||||
if (3 <= index)
|
||||
return;
|
||||
_positonIndexPathPair[index] = indexPathPair;
|
||||
}
|
||||
void setOrientationIndexPathPair(unsigned index, const HLADataElement::IndexPathPair& indexPathPair)
|
||||
{
|
||||
if (3 <= index)
|
||||
return;
|
||||
_orientationIndexPathPair[index] = indexPathPair;
|
||||
}
|
||||
|
||||
void setAngularVelocityIndexPathPair(unsigned index, const HLADataElement::IndexPathPair& indexPathPair)
|
||||
{
|
||||
if (3 <= index)
|
||||
return;
|
||||
_angularVelocityIndexPathPair[index] = indexPathPair;
|
||||
}
|
||||
void setLinearVelocityIndexPathPair(unsigned index, const HLADataElement::IndexPathPair& indexPathPair)
|
||||
{
|
||||
if (3 <= index)
|
||||
return;
|
||||
_linearVelocityIndexPathPair[index] = indexPathPair;
|
||||
}
|
||||
|
||||
private:
|
||||
HLADataElement::IndexPathPair _positonIndexPathPair[3];
|
||||
HLADataElement::IndexPathPair _orientationIndexPathPair[3];
|
||||
|
||||
HLADataElement::IndexPathPair _angularVelocityIndexPathPair[3];
|
||||
HLADataElement::IndexPathPair _linearVelocityIndexPathPair[3];
|
||||
};
|
||||
|
||||
class HLAGeodeticLocation : public HLAAbstractLocation {
|
||||
public:
|
||||
HLAGeodeticLocation() :
|
||||
_dirty(true),
|
||||
_cartPosition(SGVec3d::zeros()),
|
||||
_cartOrientation(SGQuatd::unit()),
|
||||
_cartBodyVelocity(SGVec3d::zeros()),
|
||||
_geodPosition(),
|
||||
_geodEulerRad(SGVec3d::zeros()),
|
||||
_groundTrackRad(0),
|
||||
_groundSpeedMPerSec(0),
|
||||
_verticalSpeedMPerSec(0)
|
||||
{
|
||||
updateCartesianFromGeodetic();
|
||||
}
|
||||
|
||||
virtual SGVec3d getCartPosition() const
|
||||
{ updateCartesianFromGeodetic(); return _cartPosition; }
|
||||
virtual void setCartPosition(const SGVec3d& position)
|
||||
{ _cartPosition = position; _dirty = true; }
|
||||
|
||||
virtual SGQuatd getCartOrientation() const
|
||||
{ updateCartesianFromGeodetic(); return _cartOrientation; }
|
||||
virtual void setCartOrientation(const SGQuatd& orientation)
|
||||
{ _cartOrientation = orientation; _dirty = true; }
|
||||
|
||||
virtual SGVec3d getAngularBodyVelocity() const
|
||||
{ return SGVec3d::zeros(); }
|
||||
virtual void setAngularBodyVelocity(const SGVec3d& angular)
|
||||
{ }
|
||||
|
||||
virtual SGVec3d getLinearBodyVelocity() const
|
||||
{ updateCartesianFromGeodetic(); return _cartBodyVelocity; }
|
||||
virtual void setLinearBodyVelocity(const SGVec3d& linear)
|
||||
{ _cartBodyVelocity = linear; _dirty = true; }
|
||||
|
||||
void setLatitudeDeg(double value)
|
||||
{ _geodPosition.setLatitudeDeg(value); _dirty = true; }
|
||||
double getLatitudeDeg() const
|
||||
{ updateGeodeticFromCartesian(); return _geodPosition.getLatitudeDeg(); }
|
||||
void setLatitudeRad(double value)
|
||||
{ _geodPosition.setLatitudeRad(value); _dirty = true; }
|
||||
double getLatitudeRad() const
|
||||
{ updateGeodeticFromCartesian(); return _geodPosition.getLatitudeRad(); }
|
||||
void setLongitudeDeg(double value)
|
||||
{ _geodPosition.setLongitudeDeg(value); _dirty = true; }
|
||||
double getLongitudeDeg() const
|
||||
{ updateGeodeticFromCartesian(); return _geodPosition.getLongitudeDeg(); }
|
||||
void setLongitudeRad(double value)
|
||||
{ _geodPosition.setLongitudeRad(value); _dirty = true; }
|
||||
double getLongitudeRad() const
|
||||
{ updateGeodeticFromCartesian(); return _geodPosition.getLongitudeRad(); }
|
||||
void setElevationFt(double value)
|
||||
{ _geodPosition.setElevationFt(value); _dirty = true; }
|
||||
double getElevationFt() const
|
||||
{ updateGeodeticFromCartesian(); return _geodPosition.getElevationFt(); }
|
||||
void setElevationM(double value)
|
||||
{ _geodPosition.setElevationM(value); _dirty = true; }
|
||||
double getElevationM() const
|
||||
{ updateGeodeticFromCartesian(); return _geodPosition.getElevationM(); }
|
||||
|
||||
void setHeadingRad(double value)
|
||||
{ _geodEulerRad[2] = value; _dirty = true; }
|
||||
double getHeadingRad() const
|
||||
{ updateGeodeticFromCartesian(); return _geodEulerRad[2]; }
|
||||
void setHeadingDeg(double value)
|
||||
{ setHeadingRad(SGMiscd::deg2rad(value)); }
|
||||
double getHeadingDeg() const
|
||||
{ return SGMiscd::rad2deg(getHeadingRad()); }
|
||||
void setPitchRad(double value)
|
||||
{ _geodEulerRad[1] = value; _dirty = true; }
|
||||
double getPitchRad() const
|
||||
{ updateGeodeticFromCartesian(); return _geodEulerRad[1]; }
|
||||
void setPitchDeg(double value)
|
||||
{ setPitchRad(SGMiscd::deg2rad(value)); }
|
||||
double getPitchDeg() const
|
||||
{ return SGMiscd::rad2deg(getPitchRad()); }
|
||||
void setRollRad(double value)
|
||||
{ _geodEulerRad[0] = value; _dirty = true; }
|
||||
double getRollRad() const
|
||||
{ updateGeodeticFromCartesian(); return _geodEulerRad[0]; }
|
||||
void setRollDeg(double value)
|
||||
{ setRollRad(SGMiscd::deg2rad(value)); }
|
||||
double getRollDeg() const
|
||||
{ return SGMiscd::rad2deg(getRollRad()); }
|
||||
|
||||
void setGroundTrackRad(double value)
|
||||
{ _groundTrackRad = value; _dirty = true; }
|
||||
double getGroundTrackRad() const
|
||||
{ updateGeodeticFromCartesian(); return _groundTrackRad; }
|
||||
void setGroundTrackDeg(double value)
|
||||
{ setGroundTrackRad(SGMiscd::deg2rad(value)); }
|
||||
double getGroundTrackDeg() const
|
||||
{ return SGMiscd::rad2deg(getGroundTrackRad()); }
|
||||
|
||||
|
||||
void setGroundSpeedMPerSec(double value)
|
||||
{ _groundSpeedMPerSec = value; _dirty = true; }
|
||||
double getGroundSpeedMPerSec() const
|
||||
{ updateGeodeticFromCartesian(); return _groundSpeedMPerSec; }
|
||||
void setGroundSpeedFtPerSec(double value)
|
||||
{ setGroundSpeedMPerSec(SG_FEET_TO_METER*value); }
|
||||
double getGroundSpeedFtPerSec() const
|
||||
{ return SG_METER_TO_FEET*getGroundSpeedMPerSec(); }
|
||||
void setGroundSpeedKnots(double value)
|
||||
{ setGroundSpeedMPerSec(SG_KT_TO_MPS*value); }
|
||||
double getGroundSpeedKnots() const
|
||||
{ return SG_MPS_TO_KT*getGroundSpeedMPerSec(); }
|
||||
|
||||
void setVerticalSpeedMPerSec(double value)
|
||||
{ _verticalSpeedMPerSec = value; _dirty = true; }
|
||||
double getVerticalSpeedMPerSec() const
|
||||
{ updateGeodeticFromCartesian(); return _verticalSpeedMPerSec; }
|
||||
void setVerticalSpeedFtPerSec(double value)
|
||||
{ setVerticalSpeedMPerSec(SG_FEET_TO_METER*value); }
|
||||
double getVerticalSpeedFtPerSec() const
|
||||
{ return SG_METER_TO_FEET*getVerticalSpeedMPerSec(); }
|
||||
void setVerticalSpeedFtPerMin(double value)
|
||||
{ setVerticalSpeedFtPerSec(value/60); }
|
||||
double getVerticalSpeedFtPerMin() const
|
||||
{ return 60*getVerticalSpeedFtPerSec(); }
|
||||
|
||||
#define DATA_ELEMENT(name) \
|
||||
HLADataElementProvider get## name ## DataElement() \
|
||||
{ return new DataElement<&HLAGeodeticLocation::get## name, &HLAGeodeticLocation::set ## name>(this); }
|
||||
|
||||
DATA_ELEMENT(LatitudeDeg)
|
||||
DATA_ELEMENT(LatitudeRad)
|
||||
DATA_ELEMENT(LongitudeDeg)
|
||||
DATA_ELEMENT(LongitudeRad)
|
||||
DATA_ELEMENT(ElevationFt)
|
||||
DATA_ELEMENT(ElevationM)
|
||||
DATA_ELEMENT(HeadingDeg)
|
||||
DATA_ELEMENT(HeadingRad)
|
||||
DATA_ELEMENT(PitchDeg)
|
||||
DATA_ELEMENT(PitchRad)
|
||||
DATA_ELEMENT(RollDeg)
|
||||
DATA_ELEMENT(RollRad)
|
||||
|
||||
DATA_ELEMENT(GroundTrackDeg)
|
||||
DATA_ELEMENT(GroundTrackRad)
|
||||
DATA_ELEMENT(GroundSpeedMPerSec)
|
||||
DATA_ELEMENT(GroundSpeedFtPerSec)
|
||||
DATA_ELEMENT(GroundSpeedKnots)
|
||||
DATA_ELEMENT(VerticalSpeedMPerSec)
|
||||
DATA_ELEMENT(VerticalSpeedFtPerSec)
|
||||
DATA_ELEMENT(VerticalSpeedFtPerMin)
|
||||
|
||||
#undef DATA_ELEMENT
|
||||
|
||||
private:
|
||||
template<double (HLAGeodeticLocation::*getter)() const,
|
||||
void (HLAGeodeticLocation::*setter)(double)>
|
||||
class DataElement : public HLAAbstractDoubleDataElement {
|
||||
public:
|
||||
DataElement(HLAGeodeticLocation* data) :
|
||||
_data(data)
|
||||
{ }
|
||||
virtual double getValue() const
|
||||
{ return (_data->*getter)(); }
|
||||
virtual void setValue(double value)
|
||||
{ (_data->*setter)(value); }
|
||||
|
||||
private:
|
||||
SGSharedPtr<HLAGeodeticLocation> _data;
|
||||
};
|
||||
|
||||
void updateGeodeticFromCartesian() const
|
||||
{
|
||||
if (!_dirty)
|
||||
return;
|
||||
_geodPosition = SGGeod::fromCart(_cartPosition);
|
||||
SGQuatd geodOrientation = inverse(SGQuatd::fromLonLat(_geodPosition))*_cartOrientation;
|
||||
geodOrientation.getEulerRad(_geodEulerRad[2], _geodEulerRad[1], _geodEulerRad[0]);
|
||||
SGVec3d nedVel = geodOrientation.backTransform(_cartBodyVelocity);
|
||||
if (SGLimitsd::min() < SGMiscd::max(fabs(nedVel[0]), fabs(nedVel[1])))
|
||||
_groundTrackRad = atan2(nedVel[1], nedVel[0]);
|
||||
else
|
||||
_groundTrackRad = 0;
|
||||
_groundSpeedMPerSec = sqrt(nedVel[0]*nedVel[0] + nedVel[1]*nedVel[1]);
|
||||
_verticalSpeedMPerSec = -nedVel[2];
|
||||
_dirty = false;
|
||||
}
|
||||
void updateCartesianFromGeodetic() const
|
||||
{
|
||||
if (!_dirty)
|
||||
return;
|
||||
_cartPosition = SGVec3d::fromGeod(_geodPosition);
|
||||
SGQuatd geodOrientation = SGQuatd::fromEulerRad(_geodEulerRad[2], _geodEulerRad[1], _geodEulerRad[0]);
|
||||
_cartOrientation = SGQuatd::fromLonLat(_geodPosition)*geodOrientation;
|
||||
SGVec3d nedVel(cos(_groundTrackRad)*_groundSpeedMPerSec,
|
||||
sin(_groundTrackRad)*_groundSpeedMPerSec,
|
||||
-_verticalSpeedMPerSec);
|
||||
_cartBodyVelocity = geodOrientation.transform(nedVel);
|
||||
_dirty = false;
|
||||
}
|
||||
|
||||
mutable bool _dirty;
|
||||
|
||||
// the cartesian values
|
||||
mutable SGVec3d _cartPosition;
|
||||
mutable SGQuatd _cartOrientation;
|
||||
mutable SGVec3d _cartBodyVelocity;
|
||||
|
||||
// The geodetic values
|
||||
mutable SGGeod _geodPosition;
|
||||
mutable SGVec3d _geodEulerRad;
|
||||
mutable double _groundTrackRad;
|
||||
mutable double _groundSpeedMPerSec;
|
||||
mutable double _verticalSpeedMPerSec;
|
||||
};
|
||||
|
||||
class HLAGeodeticLocationFactory : public HLALocationFactory {
|
||||
public:
|
||||
enum Semantic {
|
||||
LatitudeDeg,
|
||||
LatitudeRad,
|
||||
LongitudeDeg,
|
||||
LongitudeRad,
|
||||
ElevationM,
|
||||
ElevationFt,
|
||||
HeadingDeg,
|
||||
HeadingRad,
|
||||
PitchDeg,
|
||||
PitchRad,
|
||||
RollDeg,
|
||||
RollRad,
|
||||
GroundTrackDeg,
|
||||
GroundTrackRad,
|
||||
GroundSpeedKnots,
|
||||
GroundSpeedFtPerSec,
|
||||
GroundSpeedMPerSec,
|
||||
VerticalSpeedFtPerSec,
|
||||
VerticalSpeedFtPerMin,
|
||||
VerticalSpeedMPerSec
|
||||
};
|
||||
|
||||
virtual HLAGeodeticLocation* createLocation(HLAAttributePathElementMap& attributePathElementMap) const
|
||||
{
|
||||
HLAGeodeticLocation* location = new HLAGeodeticLocation;
|
||||
|
||||
for (IndexPathPairSemanticMap::const_iterator i = _indexPathPairSemanticMap.begin();
|
||||
i != _indexPathPairSemanticMap.end(); ++i) {
|
||||
switch (i->second) {
|
||||
case LatitudeDeg:
|
||||
attributePathElementMap[i->first.first][i->first.second] = location->getLatitudeDegDataElement();
|
||||
break;
|
||||
case LatitudeRad:
|
||||
attributePathElementMap[i->first.first][i->first.second] = location->getLatitudeRadDataElement();
|
||||
break;
|
||||
case LongitudeDeg:
|
||||
attributePathElementMap[i->first.first][i->first.second] = location->getLongitudeDegDataElement();
|
||||
break;
|
||||
case LongitudeRad:
|
||||
attributePathElementMap[i->first.first][i->first.second] = location->getLongitudeRadDataElement();
|
||||
break;
|
||||
case ElevationM:
|
||||
attributePathElementMap[i->first.first][i->first.second] = location->getElevationMDataElement();
|
||||
break;
|
||||
case ElevationFt:
|
||||
attributePathElementMap[i->first.first][i->first.second] = location->getElevationFtDataElement();
|
||||
break;
|
||||
case HeadingDeg:
|
||||
attributePathElementMap[i->first.first][i->first.second] = location->getHeadingDegDataElement();
|
||||
break;
|
||||
case HeadingRad:
|
||||
attributePathElementMap[i->first.first][i->first.second] = location->getHeadingRadDataElement();
|
||||
break;
|
||||
case PitchDeg:
|
||||
attributePathElementMap[i->first.first][i->first.second] = location->getPitchDegDataElement();
|
||||
break;
|
||||
case PitchRad:
|
||||
attributePathElementMap[i->first.first][i->first.second] = location->getPitchRadDataElement();
|
||||
break;
|
||||
case RollDeg:
|
||||
attributePathElementMap[i->first.first][i->first.second] = location->getRollDegDataElement();
|
||||
break;
|
||||
case RollRad:
|
||||
attributePathElementMap[i->first.first][i->first.second] = location->getRollRadDataElement();
|
||||
break;
|
||||
case GroundTrackDeg:
|
||||
attributePathElementMap[i->first.first][i->first.second] = location->getGroundTrackDegDataElement();
|
||||
break;
|
||||
case GroundTrackRad:
|
||||
attributePathElementMap[i->first.first][i->first.second] = location->getGroundTrackRadDataElement();
|
||||
break;
|
||||
case GroundSpeedKnots:
|
||||
attributePathElementMap[i->first.first][i->first.second] = location->getGroundSpeedKnotsDataElement();
|
||||
break;
|
||||
case GroundSpeedFtPerSec:
|
||||
attributePathElementMap[i->first.first][i->first.second] = location->getGroundSpeedFtPerSecDataElement();
|
||||
break;
|
||||
case GroundSpeedMPerSec:
|
||||
attributePathElementMap[i->first.first][i->first.second] = location->getGroundSpeedMPerSecDataElement();
|
||||
break;
|
||||
case VerticalSpeedFtPerSec:
|
||||
attributePathElementMap[i->first.first][i->first.second] = location->getVerticalSpeedFtPerSecDataElement();
|
||||
break;
|
||||
case VerticalSpeedFtPerMin:
|
||||
attributePathElementMap[i->first.first][i->first.second] = location->getVerticalSpeedFtPerMinDataElement();
|
||||
break;
|
||||
case VerticalSpeedMPerSec:
|
||||
attributePathElementMap[i->first.first][i->first.second] = location->getVerticalSpeedMPerSecDataElement();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return location;
|
||||
}
|
||||
|
||||
void setIndexPathPair(Semantic semantic, const HLADataElement::IndexPathPair& indexPathPair)
|
||||
{ _indexPathPairSemanticMap[indexPathPair] = semantic; }
|
||||
|
||||
private:
|
||||
typedef std::map<HLADataElement::IndexPathPair, Semantic> IndexPathPairSemanticMap;
|
||||
IndexPathPairSemanticMap _indexPathPairSemanticMap;
|
||||
};
|
||||
|
||||
} // namespace simgear
|
||||
|
||||
#endif
|
||||
874
simgear/hla/HLAOMTXmlVisitor.cxx
Normal file
874
simgear/hla/HLAOMTXmlVisitor.cxx
Normal file
@@ -0,0 +1,874 @@
|
||||
// Copyright (C) 2009 - 2011 Mathias Froehlich - Mathias.Froehlich@web.de
|
||||
//
|
||||
// This library is free software; you can redistribute it and/or
|
||||
// modify it under the terms of the GNU Library General Public
|
||||
// License as published by the Free Software Foundation; either
|
||||
// version 2 of the License, or (at your option) any later version.
|
||||
//
|
||||
// This library is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
// Library General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program; if not, write to the Free Software
|
||||
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
//
|
||||
|
||||
#include "HLAOMTXmlVisitor.hxx"
|
||||
|
||||
#include <map>
|
||||
#include <string>
|
||||
#include <sstream>
|
||||
|
||||
#include <simgear/structure/exception.hxx>
|
||||
#include <simgear/xml/easyxml.hxx>
|
||||
#include "HLAArrayDataType.hxx"
|
||||
#include "HLABasicDataType.hxx"
|
||||
#include "HLADataTypeVisitor.hxx"
|
||||
#include "HLAEnumeratedDataType.hxx"
|
||||
#include "HLAFixedRecordDataType.hxx"
|
||||
#include "HLAVariantDataType.hxx"
|
||||
|
||||
namespace simgear {
|
||||
|
||||
HLAOMTXmlVisitor::ObjectClass::ObjectClass(const std::string& name, const std::string& sharing) :
|
||||
_name(name),
|
||||
_sharing(sharing)
|
||||
{
|
||||
}
|
||||
|
||||
HLAOMTXmlVisitor::ObjectClass::~ObjectClass()
|
||||
{
|
||||
}
|
||||
|
||||
const std::string&
|
||||
HLAOMTXmlVisitor::ObjectClass::getName() const
|
||||
{
|
||||
return _name;
|
||||
}
|
||||
|
||||
const std::string&
|
||||
HLAOMTXmlVisitor::ObjectClass::getSharing() const
|
||||
{
|
||||
return _sharing;
|
||||
}
|
||||
|
||||
unsigned
|
||||
HLAOMTXmlVisitor::ObjectClass::getNumAttributes() const
|
||||
{
|
||||
return _attributes.size();
|
||||
}
|
||||
|
||||
const HLAOMTXmlVisitor::Attribute*
|
||||
HLAOMTXmlVisitor::ObjectClass::getAttribute(unsigned index) const
|
||||
{
|
||||
if (_attributes.size() <= index)
|
||||
return 0;
|
||||
return _attributes[index];
|
||||
}
|
||||
|
||||
const HLAOMTXmlVisitor::Attribute*
|
||||
HLAOMTXmlVisitor::ObjectClass::getAttribute(const std::string& name) const
|
||||
{
|
||||
for (AttributeList::const_iterator i = _attributes.begin(); i != _attributes.end(); ++i) {
|
||||
if ((*i)->_name != name)
|
||||
continue;
|
||||
return i->get();
|
||||
}
|
||||
SG_LOG(SG_IO, SG_ALERT, "Could not find class attribute \"" << name << "\".");
|
||||
return 0;
|
||||
}
|
||||
|
||||
const HLAOMTXmlVisitor::ObjectClass*
|
||||
HLAOMTXmlVisitor::ObjectClass::getParentObjectClass() const
|
||||
{
|
||||
return _parentObjectClass.get();
|
||||
}
|
||||
|
||||
HLAOMTXmlVisitor::InteractionClass::InteractionClass(const std::string& name) :
|
||||
_name(name)
|
||||
{
|
||||
}
|
||||
|
||||
HLAOMTXmlVisitor::InteractionClass::~InteractionClass()
|
||||
{
|
||||
}
|
||||
|
||||
const std::string&
|
||||
HLAOMTXmlVisitor::InteractionClass::getName() const
|
||||
{
|
||||
return _name;
|
||||
}
|
||||
|
||||
const std::string&
|
||||
HLAOMTXmlVisitor::InteractionClass::getDimensions() const
|
||||
{
|
||||
return _dimensions;
|
||||
}
|
||||
|
||||
const std::string&
|
||||
HLAOMTXmlVisitor::InteractionClass::getTransportation() const
|
||||
{
|
||||
return _transportation;
|
||||
}
|
||||
|
||||
const std::string&
|
||||
HLAOMTXmlVisitor::InteractionClass::getOrder() const
|
||||
{
|
||||
return _order;
|
||||
}
|
||||
|
||||
unsigned
|
||||
HLAOMTXmlVisitor::InteractionClass::getNumParameters() const
|
||||
{
|
||||
return _parameters.size();
|
||||
}
|
||||
|
||||
const HLAOMTXmlVisitor::Parameter*
|
||||
HLAOMTXmlVisitor::InteractionClass::getParameter(unsigned index) const
|
||||
{
|
||||
if (_parameters.size() <= index)
|
||||
return 0;
|
||||
return _parameters[index];
|
||||
}
|
||||
|
||||
const HLAOMTXmlVisitor::Parameter*
|
||||
HLAOMTXmlVisitor::InteractionClass::getParameter(const std::string& name) const
|
||||
{
|
||||
for (ParameterList::const_iterator i = _parameters.begin(); i != _parameters.end(); ++i) {
|
||||
if ((*i)->_name != name)
|
||||
continue;
|
||||
return i->get();
|
||||
}
|
||||
SG_LOG(SG_IO, SG_ALERT, "Could not find parameter \"" << name << "\".");
|
||||
return 0;
|
||||
}
|
||||
|
||||
const HLAOMTXmlVisitor::InteractionClass*
|
||||
HLAOMTXmlVisitor::InteractionClass::getParentInteractionClass() const
|
||||
{
|
||||
return _parentInteractionClass.get();
|
||||
}
|
||||
|
||||
HLAOMTXmlVisitor::HLAOMTXmlVisitor()
|
||||
{
|
||||
}
|
||||
|
||||
HLAOMTXmlVisitor::~HLAOMTXmlVisitor()
|
||||
{
|
||||
}
|
||||
|
||||
unsigned
|
||||
HLAOMTXmlVisitor::getNumObjectClasses() const
|
||||
{
|
||||
return _objectClassList.size();
|
||||
}
|
||||
|
||||
const HLAOMTXmlVisitor::ObjectClass*
|
||||
HLAOMTXmlVisitor::getObjectClass(unsigned i) const
|
||||
{
|
||||
if (_objectClassList.size() <= i)
|
||||
return 0;
|
||||
return _objectClassList[i];
|
||||
}
|
||||
|
||||
const HLAOMTXmlVisitor::ObjectClass*
|
||||
HLAOMTXmlVisitor::getObjectClass(const std::string& name) const
|
||||
{
|
||||
for (ObjectClassList::const_iterator i = _objectClassList.begin(); i != _objectClassList.end(); ++i) {
|
||||
if ((*i)->_name != name)
|
||||
continue;
|
||||
return i->get();
|
||||
}
|
||||
SG_LOG(SG_IO, SG_ALERT, "Could not resolve ObjectClass \"" << name << "\".");
|
||||
return 0;
|
||||
}
|
||||
|
||||
const HLAOMTXmlVisitor::Attribute*
|
||||
HLAOMTXmlVisitor::getAttribute(const std::string& objectClassName, const std::string& attributeName) const
|
||||
{
|
||||
const ObjectClass* objectClass = getObjectClass(objectClassName);
|
||||
if (!objectClass)
|
||||
return 0;
|
||||
return objectClass->getAttribute(attributeName);
|
||||
}
|
||||
|
||||
HLADataType*
|
||||
HLAOMTXmlVisitor::getAttributeDataType(const std::string& objectClassName, const std::string& attributeName) const
|
||||
{
|
||||
const Attribute* attribute = getAttribute(objectClassName, attributeName);
|
||||
if (!attribute)
|
||||
return 0;
|
||||
return getDataType(attribute->_dataType);
|
||||
}
|
||||
|
||||
unsigned
|
||||
HLAOMTXmlVisitor::getNumInteractionClasses() const
|
||||
{
|
||||
return _interactionClassList.size();
|
||||
}
|
||||
|
||||
const HLAOMTXmlVisitor::InteractionClass*
|
||||
HLAOMTXmlVisitor::getInteractionClass(unsigned i) const
|
||||
{
|
||||
if (_interactionClassList.size() <= i)
|
||||
return 0;
|
||||
return _interactionClassList[i];
|
||||
}
|
||||
|
||||
const HLAOMTXmlVisitor::InteractionClass*
|
||||
HLAOMTXmlVisitor::getInteractionClass(const std::string& name) const
|
||||
{
|
||||
for (InteractionClassList::const_iterator i = _interactionClassList.begin(); i != _interactionClassList.end(); ++i) {
|
||||
if ((*i)->_name != name)
|
||||
continue;
|
||||
return i->get();
|
||||
}
|
||||
SG_LOG(SG_IO, SG_ALERT, "Could not resolve InteractionClass \"" << name << "\".");
|
||||
return 0;
|
||||
}
|
||||
|
||||
const HLAOMTXmlVisitor::Parameter*
|
||||
HLAOMTXmlVisitor::getParameter(const std::string& interactionClassName, const std::string& parameterName) const
|
||||
{
|
||||
const InteractionClass* interactionClass = getInteractionClass(interactionClassName);
|
||||
if (!interactionClass)
|
||||
return 0;
|
||||
return interactionClass->getParameter(parameterName);
|
||||
}
|
||||
|
||||
HLADataType*
|
||||
HLAOMTXmlVisitor::getParameterDataType(const std::string& interactionClassName, const std::string& parameterName) const
|
||||
{
|
||||
const Parameter* parameter = getParameter(interactionClassName, parameterName);
|
||||
if (!parameter)
|
||||
return 0;
|
||||
return getDataType(parameter->_dataType);
|
||||
}
|
||||
|
||||
HLADataType*
|
||||
HLAOMTXmlVisitor::getDataType(const std::string& dataTypeName) const
|
||||
{
|
||||
SGSharedPtr<HLADataType> dataType;
|
||||
{
|
||||
// Playing dirty things with reference counts
|
||||
StringDataTypeMap dataTypeMap;
|
||||
dataType = getDataType(dataTypeName, dataTypeMap);
|
||||
}
|
||||
return dataType.release();
|
||||
}
|
||||
|
||||
SGSharedPtr<HLADataType>
|
||||
HLAOMTXmlVisitor::getDataType(const std::string& dataTypeName, HLAOMTXmlVisitor::StringDataTypeMap& dataTypeMap) const
|
||||
{
|
||||
StringDataTypeMap::const_iterator i = dataTypeMap.find(dataTypeName);
|
||||
if (i != dataTypeMap.end())
|
||||
return new HLADataTypeReference(i->second);
|
||||
|
||||
SGSharedPtr<HLADataType> dataType;
|
||||
dataType = getBasicDataType(dataTypeName);
|
||||
if (dataType.valid())
|
||||
return dataType;
|
||||
|
||||
dataType = getSimpleDataType(dataTypeName);
|
||||
if (dataType.valid())
|
||||
return dataType;
|
||||
|
||||
dataType = getEnumeratedDataType(dataTypeName);
|
||||
if (dataType.valid())
|
||||
return dataType;
|
||||
|
||||
dataType = getArrayDataType(dataTypeName, dataTypeMap);
|
||||
if (dataType.valid())
|
||||
return dataType;
|
||||
|
||||
dataType = getFixedRecordDataType(dataTypeName, dataTypeMap);
|
||||
if (dataType.valid())
|
||||
return dataType;
|
||||
|
||||
dataType = getVariantDataType(dataTypeName, dataTypeMap);
|
||||
if (dataType.valid())
|
||||
return dataType;
|
||||
|
||||
SG_LOG(SG_IO, SG_WARN, "Could not resolve dataType \"" << dataTypeName << "\".");
|
||||
return 0;
|
||||
}
|
||||
|
||||
SGSharedPtr<HLABasicDataType>
|
||||
HLAOMTXmlVisitor::getBasicDataType(const std::string& dataTypeName) const
|
||||
{
|
||||
BasicDataMap::const_iterator i = _basicDataMap.find(dataTypeName);
|
||||
if (i == _basicDataMap.end())
|
||||
return 0;
|
||||
if (i->second._size == "8") {
|
||||
return new HLAUInt8DataType(dataTypeName);
|
||||
} else if (i->second._size == "16") {
|
||||
if (i->first.find("Unsigned") != std::string::npos) {
|
||||
if (i->second._endian == "Little") {
|
||||
return new HLAUInt16LEDataType(dataTypeName);
|
||||
} else {
|
||||
return new HLAUInt16BEDataType(dataTypeName);
|
||||
}
|
||||
} else if (i->first.find("octetPair") != std::string::npos) {
|
||||
if (i->second._endian == "Little") {
|
||||
return new HLAUInt16LEDataType(dataTypeName);
|
||||
} else {
|
||||
return new HLAUInt16BEDataType(dataTypeName);
|
||||
}
|
||||
} else {
|
||||
if (i->second._endian == "Little") {
|
||||
return new HLAInt16LEDataType(dataTypeName);
|
||||
} else {
|
||||
return new HLAInt16BEDataType(dataTypeName);
|
||||
}
|
||||
}
|
||||
} else if (i->second._size == "32") {
|
||||
if (i->first.find("Unsigned") != std::string::npos) {
|
||||
if (i->second._endian == "Little") {
|
||||
return new HLAUInt32LEDataType(dataTypeName);
|
||||
} else {
|
||||
return new HLAUInt32BEDataType(dataTypeName);
|
||||
}
|
||||
} else if (i->first.find("float") != std::string::npos) {
|
||||
if (i->second._endian == "Little") {
|
||||
return new HLAFloat32LEDataType(dataTypeName);
|
||||
} else {
|
||||
return new HLAFloat32BEDataType(dataTypeName);
|
||||
}
|
||||
} else {
|
||||
if (i->second._endian == "Little") {
|
||||
return new HLAInt32LEDataType(dataTypeName);
|
||||
} else {
|
||||
return new HLAInt32BEDataType(dataTypeName);
|
||||
}
|
||||
}
|
||||
} else if (i->second._size == "64") {
|
||||
if (i->first.find("Unsigned") != std::string::npos) {
|
||||
if (i->second._endian == "Little") {
|
||||
return new HLAUInt64LEDataType(dataTypeName);
|
||||
} else {
|
||||
return new HLAUInt64BEDataType(dataTypeName);
|
||||
}
|
||||
} else if (i->first.find("float") != std::string::npos) {
|
||||
if (i->second._endian == "Little") {
|
||||
return new HLAFloat64LEDataType(dataTypeName);
|
||||
} else {
|
||||
return new HLAFloat64BEDataType(dataTypeName);
|
||||
}
|
||||
} else {
|
||||
if (i->second._endian == "Little") {
|
||||
return new HLAInt64LEDataType(dataTypeName);
|
||||
} else {
|
||||
return new HLAInt64BEDataType(dataTypeName);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
SGSharedPtr<HLADataType>
|
||||
HLAOMTXmlVisitor::getSimpleDataType(const std::string& dataTypeName) const
|
||||
{
|
||||
SimpleDataMap::const_iterator i = _simpleDataMap.find(dataTypeName);
|
||||
if (i == _simpleDataMap.end())
|
||||
return 0;
|
||||
return getDataType(i->second._representation);
|
||||
}
|
||||
|
||||
SGSharedPtr<HLAEnumeratedDataType>
|
||||
HLAOMTXmlVisitor::getEnumeratedDataType(const std::string& dataTypeName) const
|
||||
{
|
||||
EnumeratedDataMap::const_iterator i = _enumeratedDataMap.find(dataTypeName);
|
||||
if (i == _enumeratedDataMap.end())
|
||||
return 0;
|
||||
|
||||
SGSharedPtr<HLAEnumeratedDataType> enumeratedDataType = new HLAEnumeratedDataType(dataTypeName);
|
||||
enumeratedDataType->setRepresentation(getBasicDataType(i->second._representation));
|
||||
|
||||
for (EnumeratorList::const_iterator j = i->second._enumeratorList.begin();
|
||||
j != i->second._enumeratorList.end(); ++j) {
|
||||
if (!enumeratedDataType->addEnumerator(j->_name, j->_values)) {
|
||||
SG_LOG(SG_IO, SG_ALERT, "Could not add enumerator \"" << j->_name
|
||||
<< "\" to find enumerated data type \"" << dataTypeName << "\".");
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
return enumeratedDataType;
|
||||
}
|
||||
|
||||
SGSharedPtr<HLADataType>
|
||||
HLAOMTXmlVisitor::getArrayDataType(const std::string& dataTypeName, HLAOMTXmlVisitor::StringDataTypeMap& dataTypeMap) const
|
||||
{
|
||||
ArrayDataMap::const_iterator i = _arrayDataMap.find(dataTypeName);
|
||||
if (i == _arrayDataMap.end())
|
||||
return 0;
|
||||
SGSharedPtr<HLAArrayDataType> arrayDataType;
|
||||
if (i->second._encoding == "HLAvariableArray") {
|
||||
arrayDataType = new HLAVariableArrayDataType(dataTypeName);
|
||||
} else if (i->second._encoding == "HLAfixedArray") {
|
||||
std::stringstream ss(i->second._cardinality);
|
||||
unsigned cardinality;
|
||||
ss >> cardinality;
|
||||
if (ss.fail()) {
|
||||
SG_LOG(SG_IO, SG_ALERT, "Could not interpret cardinality \""
|
||||
<< i->second._cardinality << "\" for dataType \""
|
||||
<< dataTypeName << "\".");
|
||||
return 0;
|
||||
}
|
||||
SGSharedPtr<HLAFixedArrayDataType> dataType = new HLAFixedArrayDataType(dataTypeName);
|
||||
dataType->setNumElements(cardinality);
|
||||
arrayDataType = dataType;
|
||||
} else {
|
||||
SG_LOG(SG_IO, SG_ALERT, "Can not interpret encoding \""
|
||||
<< i->second._encoding << "\" for dataType \""
|
||||
<< dataTypeName << "\".");
|
||||
return 0;
|
||||
}
|
||||
|
||||
dataTypeMap[dataTypeName] = arrayDataType;
|
||||
SGSharedPtr<HLADataType> elementDataType = getDataType(i->second._dataType, dataTypeMap);
|
||||
if (!elementDataType.valid()) {
|
||||
SG_LOG(SG_IO, SG_ALERT, "Could not interpret dataType \""
|
||||
<< i->second._dataType << "\" for array data type \""
|
||||
<< dataTypeName << "\".");
|
||||
dataTypeMap.erase(dataTypeName);
|
||||
return 0;
|
||||
}
|
||||
arrayDataType->setElementDataType(elementDataType.get());
|
||||
|
||||
// Check if this should be a string data type
|
||||
if (elementDataType->toBasicDataType()) {
|
||||
if (dataTypeName == "HLAopaqueData") {
|
||||
arrayDataType->setIsOpaque(true);
|
||||
} else if (dataTypeName.find("String") != std::string::npos || dataTypeName.find("string") != std::string::npos) {
|
||||
arrayDataType->setIsString(true);
|
||||
}
|
||||
}
|
||||
|
||||
return arrayDataType;
|
||||
}
|
||||
|
||||
SGSharedPtr<HLAFixedRecordDataType>
|
||||
HLAOMTXmlVisitor::getFixedRecordDataType(const std::string& dataTypeName, HLAOMTXmlVisitor::StringDataTypeMap& dataTypeMap) const
|
||||
{
|
||||
FixedRecordDataMap::const_iterator i = _fixedRecordDataMap.find(dataTypeName);
|
||||
if (i == _fixedRecordDataMap.end())
|
||||
return 0;
|
||||
|
||||
SGSharedPtr<HLAFixedRecordDataType> dataType = new HLAFixedRecordDataType(dataTypeName);
|
||||
dataTypeMap[dataTypeName] = dataType;
|
||||
for (FieldList::size_type j = 0; j < i->second._fieldList.size(); ++j) {
|
||||
SGSharedPtr<HLADataType> fieldDataType = getDataType(i->second._fieldList[j]._dataType, dataTypeMap);
|
||||
if (!fieldDataType.valid()) {
|
||||
SG_LOG(SG_IO, SG_ALERT, "Could not get data type \"" << i->second._fieldList[j]._dataType
|
||||
<< "\" for field " << j << "of fixed record data type \"" << dataTypeName << "\".");
|
||||
dataTypeMap.erase(dataTypeName);
|
||||
return 0;
|
||||
}
|
||||
dataType->addField(i->second._fieldList[j]._name, fieldDataType.get());
|
||||
}
|
||||
return dataType;
|
||||
}
|
||||
|
||||
SGSharedPtr<HLAVariantDataType>
|
||||
HLAOMTXmlVisitor::getVariantDataType(const std::string& dataTypeName, HLAOMTXmlVisitor::StringDataTypeMap& dataTypeMap) const
|
||||
{
|
||||
VariantRecordDataMap::const_iterator i = _variantRecordDataMap.find(dataTypeName);
|
||||
if (i == _variantRecordDataMap.end())
|
||||
return 0;
|
||||
SGSharedPtr<HLAVariantDataType> dataType = new HLAVariantDataType(dataTypeName);
|
||||
dataTypeMap[dataTypeName] = dataType;
|
||||
|
||||
SGSharedPtr<HLAEnumeratedDataType> enumeratedDataType = getEnumeratedDataType(i->second._dataType);
|
||||
if (!enumeratedDataType.valid()) {
|
||||
SG_LOG(SG_IO, SG_ALERT, "Could not find enumerted data type \"" << i->second._dataType
|
||||
<< "\" for variant data type \"" << dataTypeName << "\".");
|
||||
return 0;
|
||||
}
|
||||
dataType->setEnumeratedDataType(enumeratedDataType);
|
||||
|
||||
for (AlternativeList::const_iterator j = i->second._alternativeList.begin();
|
||||
j != i->second._alternativeList.end(); ++j) {
|
||||
SGSharedPtr<HLADataType> alternativeDataType = getDataType(j->_dataType, dataTypeMap);
|
||||
if (!alternativeDataType.valid()) {
|
||||
SG_LOG(SG_IO, SG_ALERT, "Could not resolve alternative dataType \"" << j->_dataType
|
||||
<< "\" for alternative \"" << j->_name << "\".");
|
||||
dataTypeMap.erase(dataTypeName);
|
||||
return 0;
|
||||
}
|
||||
if (!dataType->addAlternative(j->_name, j->_enumerator, alternativeDataType.get(), j->_semantics)) {
|
||||
SG_LOG(SG_IO, SG_ALERT, "Could not add alternative \"" << j->_name << "\".");
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
return dataType;
|
||||
}
|
||||
|
||||
HLAOMTXmlVisitor::Mode
|
||||
HLAOMTXmlVisitor::getCurrentMode()
|
||||
{
|
||||
if (_modeStack.empty())
|
||||
return UnknownMode;
|
||||
return _modeStack.back();
|
||||
}
|
||||
|
||||
void
|
||||
HLAOMTXmlVisitor::pushMode(HLAOMTXmlVisitor::Mode mode)
|
||||
{
|
||||
_modeStack.push_back(mode);
|
||||
}
|
||||
|
||||
void
|
||||
HLAOMTXmlVisitor::popMode()
|
||||
{
|
||||
_modeStack.pop_back();
|
||||
}
|
||||
|
||||
void
|
||||
HLAOMTXmlVisitor::startXML()
|
||||
{
|
||||
_modeStack.clear();
|
||||
}
|
||||
|
||||
void
|
||||
HLAOMTXmlVisitor::endXML()
|
||||
{
|
||||
if (!_modeStack.empty())
|
||||
throw sg_exception("Internal parse error!");
|
||||
|
||||
// propagate parent attributes to the derived classes
|
||||
for (ObjectClassList::const_iterator i = _objectClassList.begin(); i != _objectClassList.end(); ++i) {
|
||||
SGSharedPtr<const ObjectClass> objectClass = (*i)->_parentObjectClass;
|
||||
while (objectClass) {
|
||||
for (AttributeList::const_reverse_iterator j = objectClass->_attributes.rbegin();
|
||||
j != objectClass->_attributes.rend(); ++j) {
|
||||
(*i)->_attributes.insert((*i)->_attributes.begin(), *j);
|
||||
}
|
||||
objectClass = objectClass->_parentObjectClass;
|
||||
}
|
||||
}
|
||||
|
||||
// propagate parent parameter to the derived interactions
|
||||
for (InteractionClassList::const_iterator i = _interactionClassList.begin(); i != _interactionClassList.end(); ++i) {
|
||||
SGSharedPtr<const InteractionClass> interactionClass = (*i)->_parentInteractionClass;
|
||||
while (interactionClass) {
|
||||
for (ParameterList::const_reverse_iterator j = interactionClass->_parameters.rbegin();
|
||||
j != interactionClass->_parameters.rend(); ++j) {
|
||||
(*i)->_parameters.insert((*i)->_parameters.begin(), *j);
|
||||
}
|
||||
interactionClass = interactionClass->_parentInteractionClass;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
HLAOMTXmlVisitor::startElement(const char* name, const XMLAttributes& atts)
|
||||
{
|
||||
if (strcmp(name, "attribute") == 0) {
|
||||
if (getCurrentMode() != ObjectClassMode)
|
||||
throw sg_exception("attribute tag outside objectClass!");
|
||||
pushMode(AttributeMode);
|
||||
|
||||
if (_objectClassList.empty())
|
||||
throw sg_exception("attribute tag outside of an objectClass");
|
||||
|
||||
std::string name = getAttribute("name", atts);
|
||||
if (name.empty())
|
||||
throw sg_exception("attribute tag without name attribute");
|
||||
|
||||
SGSharedPtr<Attribute> attribute = new Attribute(name);
|
||||
|
||||
attribute->_dataType = getAttribute("dataType", atts);
|
||||
attribute->_updateType = getAttribute("updateType", atts);
|
||||
attribute->_updateCondition = getAttribute("updateCondition", atts);
|
||||
attribute->_ownership = getAttribute("ownership", atts);
|
||||
attribute->_sharing = getAttribute("sharing", atts);
|
||||
attribute->_dimensions = getAttribute("dimensions", atts);
|
||||
attribute->_transportation = getAttribute("transportation", atts);
|
||||
attribute->_order = getAttribute("order", atts);
|
||||
|
||||
_objectClassStack.back()->_attributes.push_back(attribute);
|
||||
|
||||
} else if (strcmp(name, "objectClass") == 0) {
|
||||
if (getCurrentMode() != ObjectsMode && getCurrentMode() != ObjectClassMode)
|
||||
throw sg_exception("objectClass tag outside objectClass or objects!");
|
||||
pushMode(ObjectClassMode);
|
||||
|
||||
std::string name = getAttribute("name", atts);
|
||||
if (name.empty())
|
||||
throw sg_exception("objectClass tag without name attribute");
|
||||
|
||||
std::string sharing = getAttribute("sharing", atts);
|
||||
|
||||
// The new ObjectClass
|
||||
ObjectClass* objectClass = new ObjectClass(name, sharing);
|
||||
|
||||
// Inherit all previous attributes
|
||||
if (!_objectClassStack.empty())
|
||||
objectClass->_parentObjectClass = _objectClassStack.back();
|
||||
|
||||
_objectClassStack.push_back(objectClass);
|
||||
_objectClassList.push_back(objectClass);
|
||||
|
||||
} else if (strcmp(name, "objects") == 0) {
|
||||
if (getCurrentMode() != ObjectModelMode)
|
||||
throw sg_exception("objects tag outside objectModel!");
|
||||
pushMode(ObjectsMode);
|
||||
|
||||
} else if (strcmp(name, "parameter") == 0) {
|
||||
if (getCurrentMode() != InteractionClassMode)
|
||||
throw sg_exception("parameter tag outside interactionClass!");
|
||||
pushMode(ParameterMode);
|
||||
|
||||
if (_interactionClassList.empty())
|
||||
throw sg_exception("parameter tag outside of an interactionClass");
|
||||
|
||||
std::string name = getAttribute("name", atts);
|
||||
if (name.empty())
|
||||
throw sg_exception("parameter tag without name parameter");
|
||||
|
||||
SGSharedPtr<Parameter> parameter = new Parameter(name);
|
||||
parameter->_dataType = getAttribute("dataType", atts);
|
||||
|
||||
_interactionClassStack.back()->_parameters.push_back(parameter);
|
||||
|
||||
} else if (strcmp(name, "interactionClass") == 0) {
|
||||
if (getCurrentMode() != InteractionsMode && getCurrentMode() != InteractionClassMode)
|
||||
throw sg_exception("interactionClass tag outside interactions or interactionClass!");
|
||||
pushMode(InteractionClassMode);
|
||||
|
||||
std::string name = getAttribute("name", atts);
|
||||
if (name.empty())
|
||||
throw sg_exception("interactionClass tag without name attribute");
|
||||
|
||||
// The new ObjectClass
|
||||
InteractionClass* interactionClass = new InteractionClass(name);
|
||||
interactionClass->_dimensions = getAttribute("dimensions", atts);
|
||||
interactionClass->_transportation = getAttribute("transportation", atts);
|
||||
interactionClass->_order = getAttribute("order", atts);
|
||||
|
||||
// Inherit all previous attributes
|
||||
if (!_interactionClassStack.empty())
|
||||
interactionClass->_parentInteractionClass = _interactionClassStack.back();
|
||||
|
||||
_interactionClassStack.push_back(interactionClass);
|
||||
_interactionClassList.push_back(interactionClass);
|
||||
|
||||
} else if (strcmp(name, "interactions") == 0) {
|
||||
if (getCurrentMode() != ObjectModelMode)
|
||||
throw sg_exception("interactions tag outside objectModel!");
|
||||
pushMode(InteractionsMode);
|
||||
|
||||
} else if (strcmp(name, "basicData") == 0) {
|
||||
if (getCurrentMode() != BasicDataRepresentationsMode)
|
||||
throw sg_exception("basicData tag outside basicDataRepresentations!");
|
||||
pushMode(BasicDataMode);
|
||||
|
||||
std::string name = getAttribute("name", atts);
|
||||
if (name.empty())
|
||||
throw sg_exception("basicData tag without name attribute");
|
||||
|
||||
_basicDataMap[name]._size = getAttribute("size", atts);
|
||||
_basicDataMap[name]._endian = getAttribute("endian", atts);
|
||||
|
||||
} else if (strcmp(name, "basicDataRepresentations") == 0) {
|
||||
if (getCurrentMode() != DataTypesMode)
|
||||
throw sg_exception("basicDataRepresentations tag outside dataTypes!");
|
||||
pushMode(BasicDataRepresentationsMode);
|
||||
|
||||
} else if (strcmp(name, "simpleData") == 0) {
|
||||
if (getCurrentMode() != SimpleDataTypesMode)
|
||||
throw sg_exception("simpleData tag outside simpleDataTypes!");
|
||||
pushMode(SimpleDataMode);
|
||||
|
||||
std::string name = getAttribute("name", atts);
|
||||
if (name.empty())
|
||||
throw sg_exception("simpleData tag without name attribute");
|
||||
|
||||
_simpleDataMap[name]._representation = getAttribute("representation", atts);
|
||||
_simpleDataMap[name]._units = getAttribute("units", atts);
|
||||
_simpleDataMap[name]._resolution = getAttribute("resolution", atts);
|
||||
_simpleDataMap[name]._accuracy = getAttribute("accuracy", atts);
|
||||
|
||||
} else if (strcmp(name, "simpleDataTypes") == 0) {
|
||||
if (getCurrentMode() != DataTypesMode)
|
||||
throw sg_exception("simpleDataTypes tag outside dataTypes!");
|
||||
pushMode(SimpleDataTypesMode);
|
||||
|
||||
} else if (strcmp(name, "enumerator") == 0) {
|
||||
if (getCurrentMode() != EnumeratedDataMode)
|
||||
throw sg_exception("enumerator tag outside enumeratedData!");
|
||||
pushMode(EnumeratorMode);
|
||||
|
||||
std::string name = getAttribute("name", atts);
|
||||
if (name.empty())
|
||||
throw sg_exception("enumerator tag without name attribute");
|
||||
|
||||
Enumerator enumerator;
|
||||
enumerator._name = name;
|
||||
enumerator._values = getAttribute("values", atts);
|
||||
_enumeratedDataMap[_enumeratedDataName]._enumeratorList.push_back(enumerator);
|
||||
|
||||
} else if (strcmp(name, "enumeratedData") == 0) {
|
||||
if (getCurrentMode() != EnumeratedDataTypesMode)
|
||||
throw sg_exception("enumeratedData tag outside enumeratedDataTypes!");
|
||||
pushMode(EnumeratedDataMode);
|
||||
|
||||
std::string name = getAttribute("name", atts);
|
||||
if (name.empty())
|
||||
throw sg_exception("enumeratedData tag without name attribute");
|
||||
|
||||
_enumeratedDataName = name;
|
||||
_enumeratedDataMap[_enumeratedDataName]._representation = getAttribute("representation", atts);
|
||||
|
||||
} else if (strcmp(name, "enumeratedDataTypes") == 0) {
|
||||
if (getCurrentMode() != DataTypesMode)
|
||||
throw sg_exception("enumeratedDataTypes tag outside dataTypes!");
|
||||
pushMode(EnumeratedDataTypesMode);
|
||||
|
||||
Enumerator enumerator;
|
||||
enumerator._name = getAttribute("name", atts);
|
||||
enumerator._values = getAttribute("values", atts);
|
||||
_enumeratedDataMap[_enumeratedDataName]._enumeratorList.push_back(enumerator);
|
||||
|
||||
} else if (strcmp(name, "arrayData") == 0) {
|
||||
if (getCurrentMode() != ArrayDataTypesMode)
|
||||
throw sg_exception("arrayData tag outside arrayDataTypes!");
|
||||
pushMode(ArrayDataMode);
|
||||
|
||||
std::string name = getAttribute("name", atts);
|
||||
if (name.empty())
|
||||
throw sg_exception("arrayData tag without name attribute");
|
||||
|
||||
_arrayDataMap[name]._dataType = getAttribute("dataType", atts);
|
||||
_arrayDataMap[name]._cardinality = getAttribute("cardinality", atts);
|
||||
_arrayDataMap[name]._encoding = getAttribute("encoding", atts);
|
||||
|
||||
} else if (strcmp(name, "arrayDataTypes") == 0) {
|
||||
if (getCurrentMode() != DataTypesMode)
|
||||
throw sg_exception("arrayDataTypes tag outside dataTypes!");
|
||||
pushMode(ArrayDataTypesMode);
|
||||
|
||||
} else if (strcmp(name, "field") == 0) {
|
||||
if (getCurrentMode() != FixedRecordDataMode)
|
||||
throw sg_exception("field tag outside fixedRecordData!");
|
||||
pushMode(FieldMode);
|
||||
|
||||
std::string name = getAttribute("name", atts);
|
||||
if (name.empty())
|
||||
throw sg_exception("field tag without name attribute");
|
||||
|
||||
Field field;
|
||||
field._name = name;
|
||||
field._dataType = getAttribute("dataType", atts);
|
||||
_fixedRecordDataMap[_fixedRecordDataName]._fieldList.push_back(field);
|
||||
|
||||
} else if (strcmp(name, "fixedRecordData") == 0) {
|
||||
if (getCurrentMode() != FixedRecordDataTypesMode)
|
||||
throw sg_exception("fixedRecordData tag outside fixedRecordDataTypes!");
|
||||
pushMode(FixedRecordDataMode);
|
||||
|
||||
std::string name = getAttribute("name", atts);
|
||||
if (name.empty())
|
||||
throw sg_exception("fixedRecordData tag without name attribute");
|
||||
|
||||
_fixedRecordDataName = name;
|
||||
_fixedRecordDataMap[name]._encoding = getAttribute("encoding", atts);
|
||||
|
||||
} else if (strcmp(name, "fixedRecordDataTypes") == 0) {
|
||||
if (getCurrentMode() != DataTypesMode)
|
||||
throw sg_exception("fixedRecordDataTypes tag outside dataTypes!");
|
||||
pushMode(FixedRecordDataTypesMode);
|
||||
|
||||
} else if (strcmp(name, "alternative") == 0) {
|
||||
|
||||
if (getCurrentMode() != VariantRecordDataMode)
|
||||
throw sg_exception("alternative tag outside variantRecordData!");
|
||||
pushMode(AlternativeDataMode);
|
||||
|
||||
std::string name = getAttribute("name", atts);
|
||||
if (name.empty())
|
||||
throw sg_exception("alternative tag without name attribute");
|
||||
|
||||
Alternative alternative;
|
||||
alternative._name = name;
|
||||
alternative._dataType = getAttribute("dataType", atts);
|
||||
alternative._semantics = getAttribute("semantics", atts);
|
||||
alternative._enumerator = getAttribute("enumerator", atts);
|
||||
_variantRecordDataMap[_variantRecordDataName]._alternativeList.push_back(alternative);
|
||||
|
||||
} else if (strcmp(name, "variantRecordData") == 0) {
|
||||
if (getCurrentMode() != VariantRecordDataTypesMode)
|
||||
throw sg_exception("variantRecordData tag outside variantRecordDataTypes!");
|
||||
pushMode(VariantRecordDataMode);
|
||||
|
||||
std::string name = getAttribute("name", atts);
|
||||
if (name.empty())
|
||||
throw sg_exception("fixedRecordData tag without name attribute");
|
||||
|
||||
_variantRecordDataName = name;
|
||||
_variantRecordDataMap[name]._encoding = getAttribute("encoding", atts);
|
||||
_variantRecordDataMap[name]._dataType = getAttribute("dataType", atts);
|
||||
_variantRecordDataMap[name]._semantics = getAttribute("semantics", atts);
|
||||
_variantRecordDataMap[name]._discriminant = getAttribute("discriminant", atts);
|
||||
|
||||
} else if (strcmp(name, "variantRecordDataTypes") == 0) {
|
||||
if (getCurrentMode() != DataTypesMode)
|
||||
throw sg_exception("variantRecordDataTypes tag outside dataTypes!");
|
||||
pushMode(VariantRecordDataTypesMode);
|
||||
|
||||
} else if (strcmp(name, "dataTypes") == 0) {
|
||||
if (getCurrentMode() != ObjectModelMode)
|
||||
throw sg_exception("dataTypes tag outside objectModel!");
|
||||
pushMode(DataTypesMode);
|
||||
|
||||
} else if (strcmp(name, "objectModel") == 0) {
|
||||
if (!_modeStack.empty())
|
||||
throw sg_exception("objectModel tag not at top level!");
|
||||
pushMode(ObjectModelMode);
|
||||
|
||||
} else {
|
||||
_modeStack.push_back(UnknownMode);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
HLAOMTXmlVisitor::endElement(const char* name)
|
||||
{
|
||||
if (strcmp(name, "objectClass") == 0) {
|
||||
_objectClassStack.pop_back();
|
||||
} else if (strcmp(name, "interactionClass") == 0) {
|
||||
_interactionClassStack.pop_back();
|
||||
} else if (strcmp(name, "enumeratedData") == 0) {
|
||||
_enumeratedDataName.clear();
|
||||
} else if (strcmp(name, "fixedRecordData") == 0) {
|
||||
_fixedRecordDataName.clear();
|
||||
} else if (strcmp(name, "variantRecordData") == 0) {
|
||||
_variantRecordDataName.clear();
|
||||
}
|
||||
|
||||
_modeStack.pop_back();
|
||||
}
|
||||
|
||||
std::string
|
||||
HLAOMTXmlVisitor::getAttribute(const char* name, const XMLAttributes& atts)
|
||||
{
|
||||
int index = atts.findAttribute(name);
|
||||
if (index < 0 || atts.size() <= index)
|
||||
return std::string();
|
||||
return std::string(atts.getValue(index));
|
||||
}
|
||||
|
||||
std::string
|
||||
HLAOMTXmlVisitor::getAttribute(const std::string& name, const XMLAttributes& atts)
|
||||
{
|
||||
int index = atts.findAttribute(name.c_str());
|
||||
if (index < 0 || atts.size() <= index)
|
||||
return std::string();
|
||||
return std::string(atts.getValue(index));
|
||||
}
|
||||
|
||||
} // namespace simgear
|
||||
293
simgear/hla/HLAOMTXmlVisitor.hxx
Normal file
293
simgear/hla/HLAOMTXmlVisitor.hxx
Normal file
@@ -0,0 +1,293 @@
|
||||
// Copyright (C) 2009 - 2010 Mathias Froehlich - Mathias.Froehlich@web.de
|
||||
//
|
||||
// This library is free software; you can redistribute it and/or
|
||||
// modify it under the terms of the GNU Library General Public
|
||||
// License as published by the Free Software Foundation; either
|
||||
// version 2 of the License, or (at your option) any later version.
|
||||
//
|
||||
// This library is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
// Library General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program; if not, write to the Free Software
|
||||
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
//
|
||||
|
||||
#ifndef HLAOMTXmlVisitor_hxx
|
||||
#define HLAOMTXmlVisitor_hxx
|
||||
|
||||
#include <map>
|
||||
#include <string>
|
||||
|
||||
#include <simgear/structure/exception.hxx>
|
||||
#include <simgear/structure/SGSharedPtr.hxx>
|
||||
#include <simgear/xml/easyxml.hxx>
|
||||
#include "HLADataType.hxx"
|
||||
|
||||
namespace simgear {
|
||||
|
||||
class HLAOMTXmlVisitor : public XMLVisitor {
|
||||
public:
|
||||
/// structures representing the federate object model data
|
||||
struct Attribute : public SGReferenced {
|
||||
Attribute(const std::string& name) :
|
||||
_name(name)
|
||||
{ }
|
||||
const std::string& getName() const
|
||||
{ return _name; }
|
||||
const std::string& getDimensions() const
|
||||
{ return _dimensions; }
|
||||
const std::string& getTransportation() const
|
||||
{ return _transportation; }
|
||||
const std::string& getOrder() const
|
||||
{ return _order; }
|
||||
|
||||
std::string _name;
|
||||
std::string _dataType;
|
||||
std::string _updateType;
|
||||
std::string _updateCondition;
|
||||
std::string _ownership;
|
||||
std::string _sharing;
|
||||
std::string _dimensions;
|
||||
std::string _transportation;
|
||||
std::string _order;
|
||||
friend class HLAOMTXmlVisitor;
|
||||
};
|
||||
typedef std::vector<SGSharedPtr<Attribute> > AttributeList;
|
||||
|
||||
struct ObjectClass : public SGReferenced {
|
||||
ObjectClass(const std::string& name, const std::string& sharing);
|
||||
~ObjectClass();
|
||||
|
||||
const std::string& getName() const;
|
||||
const std::string& getSharing() const;
|
||||
|
||||
unsigned getNumAttributes() const;
|
||||
const Attribute* getAttribute(unsigned index) const;
|
||||
const Attribute* getAttribute(const std::string& name) const;
|
||||
|
||||
const ObjectClass* getParentObjectClass() const;
|
||||
|
||||
private:
|
||||
friend class HLAOMTXmlVisitor;
|
||||
std::string _name;
|
||||
std::string _sharing;
|
||||
AttributeList _attributes;
|
||||
SGSharedPtr<ObjectClass> _parentObjectClass;
|
||||
};
|
||||
typedef std::vector<SGSharedPtr<ObjectClass> > ObjectClassList;
|
||||
|
||||
struct Parameter : public SGReferenced {
|
||||
Parameter(const std::string& name) :
|
||||
_name(name)
|
||||
{ }
|
||||
const std::string& getName() const
|
||||
{ return _name; }
|
||||
const std::string& getDataType() const
|
||||
{ return _dataType; }
|
||||
|
||||
private:
|
||||
std::string _name;
|
||||
std::string _dataType;
|
||||
friend class HLAOMTXmlVisitor;
|
||||
};
|
||||
typedef std::vector<SGSharedPtr<Parameter> > ParameterList;
|
||||
|
||||
struct InteractionClass : public SGReferenced {
|
||||
InteractionClass(const std::string& name);
|
||||
~InteractionClass();
|
||||
|
||||
const std::string& getName() const;
|
||||
const std::string& getDimensions() const;
|
||||
const std::string& getTransportation() const;
|
||||
const std::string& getOrder() const;
|
||||
|
||||
unsigned getNumParameters() const;
|
||||
const Parameter* getParameter(unsigned index) const;
|
||||
const Parameter* getParameter(const std::string& name) const;
|
||||
|
||||
const InteractionClass* getParentInteractionClass() const;
|
||||
|
||||
private:
|
||||
friend class HLAOMTXmlVisitor;
|
||||
std::string _name;
|
||||
std::string _dimensions;
|
||||
std::string _transportation;
|
||||
std::string _order;
|
||||
ParameterList _parameters;
|
||||
SGSharedPtr<InteractionClass> _parentInteractionClass;
|
||||
};
|
||||
typedef std::vector<SGSharedPtr<InteractionClass> > InteractionClassList;
|
||||
|
||||
HLAOMTXmlVisitor();
|
||||
~HLAOMTXmlVisitor();
|
||||
|
||||
unsigned getNumObjectClasses() const;
|
||||
const ObjectClass* getObjectClass(unsigned i) const;
|
||||
const ObjectClass* getObjectClass(const std::string& name) const;
|
||||
|
||||
/// Return the data type from the fom data
|
||||
const Attribute* getAttribute(const std::string& objectClassName, const std::string& attributeName) const;
|
||||
/// Return the data type from the fom data
|
||||
HLADataType* getAttributeDataType(const std::string& objectClassName, const std::string& attributeName) const;
|
||||
|
||||
unsigned getNumInteractionClasses() const;
|
||||
const InteractionClass* getInteractionClass(unsigned i) const;
|
||||
const InteractionClass* getInteractionClass(const std::string& name) const;
|
||||
|
||||
/// Return the data type from the fom data
|
||||
const Parameter* getParameter(const std::string& interactionClassName, const std::string& parameterName) const;
|
||||
|
||||
/// Return the data type from the fom data
|
||||
HLADataType* getParameterDataType(const std::string& interactionClassName, const std::string& parameterName) const;
|
||||
|
||||
HLADataType* getDataType(const std::string& dataTypeName) const;
|
||||
|
||||
private:
|
||||
typedef std::map<std::string, SGSharedPtr<HLADataType> > StringDataTypeMap;
|
||||
SGSharedPtr<HLADataType> getDataType(const std::string& dataTypeName, StringDataTypeMap& dataTypeMap) const;
|
||||
SGSharedPtr<HLABasicDataType> getBasicDataType(const std::string& dataTypeName) const;
|
||||
SGSharedPtr<HLADataType> getSimpleDataType(const std::string& dataTypeName) const;
|
||||
SGSharedPtr<HLAEnumeratedDataType> getEnumeratedDataType(const std::string& dataTypeName) const;
|
||||
SGSharedPtr<HLADataType> getArrayDataType(const std::string& dataTypeName, StringDataTypeMap& dataTypeMap) const;
|
||||
SGSharedPtr<HLAFixedRecordDataType> getFixedRecordDataType(const std::string& dataTypeName, StringDataTypeMap& dataTypeMap) const;
|
||||
SGSharedPtr<HLAVariantDataType> getVariantDataType(const std::string& dataTypeName, StringDataTypeMap& dataTypeMap) const;
|
||||
|
||||
enum Mode {
|
||||
UnknownMode,
|
||||
|
||||
ObjectModelMode,
|
||||
|
||||
ObjectsMode,
|
||||
ObjectClassMode,
|
||||
AttributeMode,
|
||||
|
||||
InteractionsMode,
|
||||
InteractionClassMode,
|
||||
ParameterMode,
|
||||
|
||||
DataTypesMode,
|
||||
BasicDataRepresentationsMode,
|
||||
BasicDataMode,
|
||||
SimpleDataTypesMode,
|
||||
SimpleDataMode,
|
||||
EnumeratedDataTypesMode,
|
||||
EnumeratedDataMode,
|
||||
EnumeratorMode,
|
||||
ArrayDataTypesMode,
|
||||
ArrayDataMode,
|
||||
FixedRecordDataTypesMode,
|
||||
FixedRecordDataMode,
|
||||
FieldMode,
|
||||
VariantRecordDataTypesMode,
|
||||
VariantRecordDataMode,
|
||||
AlternativeDataMode
|
||||
};
|
||||
|
||||
Mode getCurrentMode();
|
||||
void pushMode(Mode mode);
|
||||
void popMode();
|
||||
|
||||
virtual void startXML();
|
||||
virtual void endXML ();
|
||||
virtual void startElement(const char* name, const XMLAttributes& atts);
|
||||
virtual void endElement(const char* name);
|
||||
|
||||
std::string getAttribute(const char* name, const XMLAttributes& atts);
|
||||
std::string getAttribute(const std::string& name, const XMLAttributes& atts);
|
||||
|
||||
struct BasicData {
|
||||
// std::string _name;
|
||||
std::string _size;
|
||||
std::string _endian;
|
||||
};
|
||||
typedef std::map<std::string, BasicData> BasicDataMap;
|
||||
|
||||
struct SimpleData {
|
||||
// std::string _name;
|
||||
std::string _representation;
|
||||
std::string _units;
|
||||
std::string _resolution;
|
||||
std::string _accuracy;
|
||||
};
|
||||
typedef std::map<std::string, SimpleData> SimpleDataMap;
|
||||
|
||||
struct Enumerator {
|
||||
std::string _name;
|
||||
std::string _values;
|
||||
};
|
||||
typedef std::vector<Enumerator> EnumeratorList;
|
||||
|
||||
struct EnumeratedData {
|
||||
// std::string _name;
|
||||
std::string _representation;
|
||||
EnumeratorList _enumeratorList;
|
||||
};
|
||||
typedef std::map<std::string, EnumeratedData> EnumeratedDataMap;
|
||||
|
||||
struct ArrayData {
|
||||
// std::string _name;
|
||||
std::string _dataType;
|
||||
std::string _cardinality;
|
||||
std::string _encoding;
|
||||
};
|
||||
typedef std::map<std::string, ArrayData> ArrayDataMap;
|
||||
|
||||
struct Field {
|
||||
std::string _name;
|
||||
std::string _dataType;
|
||||
};
|
||||
typedef std::vector<Field> FieldList;
|
||||
|
||||
struct FixedRecordData {
|
||||
// std::string _name;
|
||||
std::string _encoding;
|
||||
FieldList _fieldList;
|
||||
};
|
||||
typedef std::map<std::string, FixedRecordData> FixedRecordDataMap;
|
||||
|
||||
struct Alternative {
|
||||
std::string _name;
|
||||
std::string _dataType;
|
||||
std::string _semantics;
|
||||
std::string _enumerator;
|
||||
};
|
||||
typedef std::vector<Alternative> AlternativeList;
|
||||
|
||||
struct VariantRecordData {
|
||||
// std::string _name;
|
||||
std::string _encoding;
|
||||
std::string _dataType;
|
||||
std::string _discriminant;
|
||||
std::string _semantics;
|
||||
AlternativeList _alternativeList;
|
||||
};
|
||||
typedef std::map<std::string, VariantRecordData> VariantRecordDataMap;
|
||||
|
||||
std::vector<Mode> _modeStack;
|
||||
|
||||
/// The total list of object classes
|
||||
ObjectClassList _objectClassList;
|
||||
ObjectClassList _objectClassStack;
|
||||
|
||||
/// The total list of interaction classes
|
||||
InteractionClassList _interactionClassList;
|
||||
InteractionClassList _interactionClassStack;
|
||||
|
||||
/// DataType definitions
|
||||
BasicDataMap _basicDataMap;
|
||||
SimpleDataMap _simpleDataMap;
|
||||
std::string _enumeratedDataName;
|
||||
EnumeratedDataMap _enumeratedDataMap;
|
||||
ArrayDataMap _arrayDataMap;
|
||||
std::string _fixedRecordDataName;
|
||||
FixedRecordDataMap _fixedRecordDataMap;
|
||||
std::string _variantRecordDataName;
|
||||
VariantRecordDataMap _variantRecordDataMap;
|
||||
};
|
||||
|
||||
} // namespace simgear
|
||||
|
||||
#endif
|
||||
302
simgear/hla/HLAObjectClass.cxx
Normal file
302
simgear/hla/HLAObjectClass.cxx
Normal file
@@ -0,0 +1,302 @@
|
||||
// Copyright (C) 2009 - 2010 Mathias Froehlich - Mathias.Froehlich@web.de
|
||||
//
|
||||
// This library is free software; you can redistribute it and/or
|
||||
// modify it under the terms of the GNU Library General Public
|
||||
// License as published by the Free Software Foundation; either
|
||||
// version 2 of the License, or (at your option) any later version.
|
||||
//
|
||||
// This library is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
// Library General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program; if not, write to the Free Software
|
||||
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
//
|
||||
|
||||
#include "HLAObjectClass.hxx"
|
||||
|
||||
#include "RTIFederate.hxx"
|
||||
#include "RTIObjectClass.hxx"
|
||||
#include "RTIObjectInstance.hxx"
|
||||
#include "HLADataType.hxx"
|
||||
#include "HLAFederate.hxx"
|
||||
#include "HLAObjectInstance.hxx"
|
||||
|
||||
namespace simgear {
|
||||
|
||||
HLAObjectClass::InstanceCallback::~InstanceCallback()
|
||||
{
|
||||
}
|
||||
|
||||
void
|
||||
HLAObjectClass::InstanceCallback::discoverInstance(const HLAObjectClass&, HLAObjectInstance& objectInstance, const RTIData& tag)
|
||||
{
|
||||
}
|
||||
|
||||
void
|
||||
HLAObjectClass::InstanceCallback::removeInstance(const HLAObjectClass&, HLAObjectInstance& objectInstance, const RTIData& tag)
|
||||
{
|
||||
}
|
||||
|
||||
void
|
||||
HLAObjectClass::InstanceCallback::registerInstance(const HLAObjectClass&, HLAObjectInstance& objectInstance)
|
||||
{
|
||||
}
|
||||
|
||||
void
|
||||
HLAObjectClass::InstanceCallback::deleteInstance(const HLAObjectClass&, HLAObjectInstance& objectInstance)
|
||||
{
|
||||
}
|
||||
|
||||
HLAObjectClass::RegistrationCallback::~RegistrationCallback()
|
||||
{
|
||||
}
|
||||
|
||||
HLAObjectClass::HLAObjectClass(const std::string& name, HLAFederate& federate) :
|
||||
_name(name)
|
||||
{
|
||||
_rtiObjectClass = federate._rtiFederate->createObjectClass(name, this);
|
||||
if (!_rtiObjectClass.valid())
|
||||
SG_LOG(SG_NETWORK, SG_WARN, "HLAObjectClass::HLAObjectClass(): No RTIObjectClass found for \"" << name << "\"!");
|
||||
}
|
||||
|
||||
HLAObjectClass::~HLAObjectClass()
|
||||
{
|
||||
}
|
||||
|
||||
unsigned
|
||||
HLAObjectClass::getNumAttributes() const
|
||||
{
|
||||
if (!_rtiObjectClass.valid()) {
|
||||
SG_LOG(SG_NETWORK, SG_WARN, "HLAObjectClass::getAttributeIndex(): No RTIObject class for object class \"" << getName() << "\"!");
|
||||
return 0;
|
||||
}
|
||||
return _rtiObjectClass->getNumAttributes();
|
||||
}
|
||||
|
||||
unsigned
|
||||
HLAObjectClass::getAttributeIndex(const std::string& name) const
|
||||
{
|
||||
if (!_rtiObjectClass.valid()) {
|
||||
SG_LOG(SG_NETWORK, SG_WARN, "HLAObjectClass::getAttributeIndex(): No RTIObject class for object class \"" << getName() << "\"!");
|
||||
return ~0u;
|
||||
}
|
||||
return _rtiObjectClass->getOrCreateAttributeIndex(name);
|
||||
}
|
||||
|
||||
std::string
|
||||
HLAObjectClass::getAttributeName(unsigned index) const
|
||||
{
|
||||
if (!_rtiObjectClass.valid()) {
|
||||
SG_LOG(SG_NETWORK, SG_WARN, "HLAObjectClass::getAttributeIndex(): No RTIObject class for object class \"" << getName() << "\"!");
|
||||
return 0;
|
||||
}
|
||||
return _rtiObjectClass->getAttributeName(index);
|
||||
}
|
||||
|
||||
const HLADataType*
|
||||
HLAObjectClass::getAttributeDataType(unsigned index) const
|
||||
{
|
||||
if (!_rtiObjectClass.valid()) {
|
||||
SG_LOG(SG_NETWORK, SG_WARN, "HLAObjectClass::getAttributeDataType(): No RTIObject class for object class \"" << getName() << "\"!");
|
||||
return 0;
|
||||
}
|
||||
return _rtiObjectClass->getAttributeDataType(index);
|
||||
}
|
||||
|
||||
void
|
||||
HLAObjectClass::setAttributeDataType(unsigned index, const HLADataType* dataType)
|
||||
{
|
||||
if (!_rtiObjectClass.valid()) {
|
||||
SG_LOG(SG_NETWORK, SG_WARN, "HLAObjectClass::setAttributeDataType(): No RTIObject class for object class \"" << getName() << "\"!");
|
||||
return;
|
||||
}
|
||||
_rtiObjectClass->setAttributeDataType(index, dataType);
|
||||
}
|
||||
|
||||
HLAUpdateType
|
||||
HLAObjectClass::getAttributeUpdateType(unsigned index) const
|
||||
{
|
||||
if (!_rtiObjectClass.valid()) {
|
||||
SG_LOG(SG_NETWORK, SG_WARN, "HLAObjectClass::getAttributeUpdateType(): No RTIObject class for object class \"" << getName() << "\"!");
|
||||
return HLAUndefinedUpdate;
|
||||
}
|
||||
return _rtiObjectClass->getAttributeUpdateType(index);
|
||||
}
|
||||
|
||||
void
|
||||
HLAObjectClass::setAttributeUpdateType(unsigned index, HLAUpdateType updateType)
|
||||
{
|
||||
if (!_rtiObjectClass.valid()) {
|
||||
SG_LOG(SG_NETWORK, SG_WARN, "HLAObjectClass::setAttributeUpdateType(): "
|
||||
"No RTIObject class for object class \"" << getName() << "\"!");
|
||||
return;
|
||||
}
|
||||
_rtiObjectClass->setAttributeUpdateType(index, updateType);
|
||||
}
|
||||
|
||||
HLADataElement::IndexPathPair
|
||||
HLAObjectClass::getIndexPathPair(const HLADataElement::AttributePathPair& attributePathPair) const
|
||||
{
|
||||
unsigned index = getAttributeIndex(attributePathPair.first);
|
||||
if (getNumAttributes() <= index) {
|
||||
SG_LOG(SG_NETWORK, SG_ALERT, "HLAObjectClass::getIndexPathPair(\""
|
||||
<< HLADataElement::toString(attributePathPair)
|
||||
<< "\"): Could not resolve attribute \"" << attributePathPair.first
|
||||
<< "\" for object class \"" << getName() << "\"!");
|
||||
}
|
||||
return HLADataElement::IndexPathPair(index, attributePathPair.second);
|
||||
}
|
||||
|
||||
HLADataElement::IndexPathPair
|
||||
HLAObjectClass::getIndexPathPair(const std::string& path) const
|
||||
{
|
||||
return getIndexPathPair(HLADataElement::toAttributePathPair(path));
|
||||
}
|
||||
|
||||
bool
|
||||
HLAObjectClass::subscribe(const std::set<unsigned>& indexSet, bool active)
|
||||
{
|
||||
if (!_rtiObjectClass.valid()) {
|
||||
SG_LOG(SG_NETWORK, SG_WARN, "HLAObjectClass::subscribe(): No RTIObject class for object class \"" << getName() << "\"!");
|
||||
return false;
|
||||
}
|
||||
return _rtiObjectClass->subscribe(indexSet, active);
|
||||
}
|
||||
|
||||
bool
|
||||
HLAObjectClass::unsubscribe()
|
||||
{
|
||||
if (!_rtiObjectClass.valid()) {
|
||||
SG_LOG(SG_NETWORK, SG_WARN, "HLAObjectClass::unsubscribe(): No RTIObject class for object class \"" << getName() << "\"!");
|
||||
return false;
|
||||
}
|
||||
return _rtiObjectClass->unsubscribe();
|
||||
}
|
||||
|
||||
bool
|
||||
HLAObjectClass::publish(const std::set<unsigned>& indexSet)
|
||||
{
|
||||
if (!_rtiObjectClass.valid()) {
|
||||
SG_LOG(SG_NETWORK, SG_WARN, "HLAObjectClass::publish(): No RTIObject class for object class \"" << getName() << "\"!");
|
||||
return false;
|
||||
}
|
||||
return _rtiObjectClass->publish(indexSet);
|
||||
}
|
||||
|
||||
bool
|
||||
HLAObjectClass::unpublish()
|
||||
{
|
||||
if (!_rtiObjectClass.valid()) {
|
||||
SG_LOG(SG_NETWORK, SG_WARN, "HLAObjectClass::unpublish(): No RTIObject class for object class \"" << getName() << "\"!");
|
||||
return false;
|
||||
}
|
||||
return _rtiObjectClass->unpublish();
|
||||
}
|
||||
|
||||
void
|
||||
HLAObjectClass::startRegistration() const
|
||||
{
|
||||
}
|
||||
|
||||
void
|
||||
HLAObjectClass::stopRegistration() const
|
||||
{
|
||||
}
|
||||
|
||||
HLAObjectInstance*
|
||||
HLAObjectClass::createObjectInstance(RTIObjectInstance* rtiObjectInstance)
|
||||
{
|
||||
return new HLAObjectInstance(this, rtiObjectInstance);
|
||||
}
|
||||
|
||||
void
|
||||
HLAObjectClass::discoverInstance(RTIObjectInstance* objectInstance, const RTIData& tag)
|
||||
{
|
||||
SGSharedPtr<HLAObjectInstance> hlaObjectInstance = createObjectInstance(objectInstance);
|
||||
if (hlaObjectInstance.valid()) {
|
||||
SG_LOG(SG_NETWORK, SG_INFO, "RTI: create new object instance for discovered \""
|
||||
<< hlaObjectInstance->getName() << "\" object");
|
||||
_objectInstanceSet.insert(hlaObjectInstance);
|
||||
discoverInstanceCallback(*hlaObjectInstance, tag);
|
||||
} else {
|
||||
SG_LOG(SG_NETWORK, SG_INFO, "RTI: local delete of \"" << objectInstance->getName() << "\"");
|
||||
objectInstance->localDeleteObjectInstance();
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
HLAObjectClass::removeInstance(HLAObjectInstance& hlaObjectInstance, const RTIData& tag)
|
||||
{
|
||||
SG_LOG(SG_NETWORK, SG_INFO, "RTI: remove object instance \"" << hlaObjectInstance.getName() << "\"");
|
||||
removeInstanceCallback(hlaObjectInstance, tag);
|
||||
_objectInstanceSet.erase(&hlaObjectInstance);
|
||||
}
|
||||
|
||||
void
|
||||
HLAObjectClass::registerInstance(HLAObjectInstance& objectInstance)
|
||||
{
|
||||
_objectInstanceSet.insert(&objectInstance);
|
||||
registerInstanceCallback(objectInstance);
|
||||
}
|
||||
|
||||
void
|
||||
HLAObjectClass::deleteInstance(HLAObjectInstance& objectInstance)
|
||||
{
|
||||
deleteInstanceCallback(objectInstance);
|
||||
_objectInstanceSet.erase(&objectInstance);
|
||||
}
|
||||
|
||||
void
|
||||
HLAObjectClass::discoverInstanceCallback(HLAObjectInstance& objectInstance, const RTIData& tag) const
|
||||
{
|
||||
if (!_instanceCallback.valid())
|
||||
return;
|
||||
_instanceCallback->discoverInstance(*this, objectInstance, tag);
|
||||
}
|
||||
|
||||
void
|
||||
HLAObjectClass::removeInstanceCallback(HLAObjectInstance& objectInstance, const RTIData& tag) const
|
||||
{
|
||||
if (!_instanceCallback.valid())
|
||||
return;
|
||||
_instanceCallback->removeInstance(*this, objectInstance, tag);
|
||||
}
|
||||
|
||||
void
|
||||
HLAObjectClass::registerInstanceCallback(HLAObjectInstance& objectInstance) const
|
||||
{
|
||||
if (!_instanceCallback.valid())
|
||||
return;
|
||||
_instanceCallback->registerInstance(*this, objectInstance);
|
||||
}
|
||||
|
||||
void
|
||||
HLAObjectClass::deleteInstanceCallback(HLAObjectInstance& objectInstance) const
|
||||
{
|
||||
if (!_instanceCallback.valid())
|
||||
return;
|
||||
_instanceCallback->deleteInstance(*this, objectInstance);
|
||||
}
|
||||
|
||||
void
|
||||
HLAObjectClass::startRegistrationCallback()
|
||||
{
|
||||
if (_registrationCallback.valid())
|
||||
_registrationCallback->startRegistration(*this);
|
||||
else
|
||||
startRegistration();
|
||||
}
|
||||
|
||||
void
|
||||
HLAObjectClass::stopRegistrationCallback()
|
||||
{
|
||||
if (_registrationCallback.valid())
|
||||
_registrationCallback->stopRegistration(*this);
|
||||
else
|
||||
stopRegistration();
|
||||
}
|
||||
|
||||
} // namespace simgear
|
||||
134
simgear/hla/HLAObjectClass.hxx
Normal file
134
simgear/hla/HLAObjectClass.hxx
Normal file
@@ -0,0 +1,134 @@
|
||||
// Copyright (C) 2009 - 2010 Mathias Froehlich - Mathias.Froehlich@web.de
|
||||
//
|
||||
// This library is free software; you can redistribute it and/or
|
||||
// modify it under the terms of the GNU Library General Public
|
||||
// License as published by the Free Software Foundation; either
|
||||
// version 2 of the License, or (at your option) any later version.
|
||||
//
|
||||
// This library is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
// Library General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program; if not, write to the Free Software
|
||||
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
//
|
||||
|
||||
#ifndef HLAObjectClass_hxx
|
||||
#define HLAObjectClass_hxx
|
||||
|
||||
#include <set>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
#include "HLADataType.hxx"
|
||||
#include "HLAObjectInstance.hxx"
|
||||
|
||||
namespace simgear {
|
||||
|
||||
class RTIObjectClass;
|
||||
class HLAFederate;
|
||||
|
||||
class HLAObjectClass : public SGWeakReferenced {
|
||||
public:
|
||||
HLAObjectClass(const std::string& name, HLAFederate& federate);
|
||||
virtual ~HLAObjectClass();
|
||||
|
||||
const std::string& getName() const
|
||||
{ return _name; }
|
||||
|
||||
unsigned getNumAttributes() const;
|
||||
unsigned getAttributeIndex(const std::string& name) const;
|
||||
std::string getAttributeName(unsigned index) const;
|
||||
|
||||
const HLADataType* getAttributeDataType(unsigned index) const;
|
||||
void setAttributeDataType(unsigned index, const HLADataType*);
|
||||
|
||||
HLAUpdateType getAttributeUpdateType(unsigned index) const;
|
||||
void setAttributeUpdateType(unsigned index, HLAUpdateType updateType);
|
||||
|
||||
HLADataElement::IndexPathPair getIndexPathPair(const HLADataElement::AttributePathPair&) const;
|
||||
HLADataElement::IndexPathPair getIndexPathPair(const std::string& path) const;
|
||||
|
||||
bool subscribe(const std::set<unsigned>& indexSet, bool active);
|
||||
bool unsubscribe();
|
||||
|
||||
bool publish(const std::set<unsigned>& indexSet);
|
||||
bool unpublish();
|
||||
|
||||
// Object instance creation and destruction
|
||||
class InstanceCallback : public SGReferenced {
|
||||
public:
|
||||
virtual ~InstanceCallback();
|
||||
|
||||
virtual void discoverInstance(const HLAObjectClass& objectClass, HLAObjectInstance& objectInstance, const RTIData& tag);
|
||||
virtual void removeInstance(const HLAObjectClass& objectClass, HLAObjectInstance& objectInstance, const RTIData& tag);
|
||||
|
||||
virtual void registerInstance(const HLAObjectClass& objectClass, HLAObjectInstance& objectInstance);
|
||||
virtual void deleteInstance(const HLAObjectClass& objectClass, HLAObjectInstance& objectInstance);
|
||||
};
|
||||
|
||||
void setInstanceCallback(const SGSharedPtr<InstanceCallback>& instanceCallback)
|
||||
{ _instanceCallback = instanceCallback; }
|
||||
const SGSharedPtr<InstanceCallback>& getInstanceCallback() const
|
||||
{ return _instanceCallback; }
|
||||
|
||||
// Handles startRegistrationForObjectClass and stopRegistrationForObjectClass events
|
||||
class RegistrationCallback : public SGReferenced {
|
||||
public:
|
||||
virtual ~RegistrationCallback();
|
||||
virtual void startRegistration(HLAObjectClass& objectClass) = 0;
|
||||
virtual void stopRegistration(HLAObjectClass& objectClass) = 0;
|
||||
};
|
||||
|
||||
void setRegistrationCallback(const SGSharedPtr<RegistrationCallback>& registrationCallback)
|
||||
{ _registrationCallback = registrationCallback; }
|
||||
const SGSharedPtr<RegistrationCallback>& getRegistrationCallback() const
|
||||
{ return _registrationCallback; }
|
||||
|
||||
// Is called by the default registration callback if installed
|
||||
void startRegistration() const;
|
||||
void stopRegistration() const;
|
||||
|
||||
protected:
|
||||
virtual HLAObjectInstance* createObjectInstance(RTIObjectInstance* rtiObjectInstance);
|
||||
|
||||
private:
|
||||
HLAObjectClass(const HLAObjectClass&);
|
||||
HLAObjectClass& operator=(const HLAObjectClass&);
|
||||
|
||||
// The internal entry points from the RTILObjectClass callback functions
|
||||
void discoverInstance(RTIObjectInstance* objectInstance, const RTIData& tag);
|
||||
void removeInstance(HLAObjectInstance& objectInstance, const RTIData& tag);
|
||||
void registerInstance(HLAObjectInstance& objectInstance);
|
||||
void deleteInstance(HLAObjectInstance& objectInstance);
|
||||
|
||||
void discoverInstanceCallback(HLAObjectInstance& objectInstance, const RTIData& tag) const;
|
||||
void removeInstanceCallback(HLAObjectInstance& objectInstance, const RTIData& tag) const;
|
||||
void registerInstanceCallback(HLAObjectInstance& objectInstance) const;
|
||||
void deleteInstanceCallback(HLAObjectInstance& objectInstance) const;
|
||||
|
||||
void startRegistrationCallback();
|
||||
void stopRegistrationCallback();
|
||||
friend class HLAObjectInstance;
|
||||
friend class RTIObjectClass;
|
||||
|
||||
// The object class name
|
||||
std::string _name;
|
||||
|
||||
// The underlying rti dispatcher class
|
||||
SGSharedPtr<RTIObjectClass> _rtiObjectClass;
|
||||
|
||||
// Callback classes
|
||||
SGSharedPtr<InstanceCallback> _instanceCallback;
|
||||
SGSharedPtr<RegistrationCallback> _registrationCallback;
|
||||
|
||||
// The set of active objects
|
||||
typedef std::set<SGSharedPtr<HLAObjectInstance> > ObjectInstanceSet;
|
||||
ObjectInstanceSet _objectInstanceSet;
|
||||
};
|
||||
|
||||
} // namespace simgear
|
||||
|
||||
#endif
|
||||
500
simgear/hla/HLAObjectInstance.cxx
Normal file
500
simgear/hla/HLAObjectInstance.cxx
Normal file
@@ -0,0 +1,500 @@
|
||||
// Copyright (C) 2009 - 2010 Mathias Froehlich - Mathias.Froehlich@web.de
|
||||
//
|
||||
// This library is free software; you can redistribute it and/or
|
||||
// modify it under the terms of the GNU Library General Public
|
||||
// License as published by the Free Software Foundation; either
|
||||
// version 2 of the License, or (at your option) any later version.
|
||||
//
|
||||
// This library is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
// Library General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program; if not, write to the Free Software
|
||||
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
//
|
||||
|
||||
#include "HLAObjectInstance.hxx"
|
||||
|
||||
#include <algorithm>
|
||||
#include "HLAArrayDataElement.hxx"
|
||||
#include "HLABasicDataElement.hxx"
|
||||
#include "HLADataElement.hxx"
|
||||
#include "HLAEnumeratedDataElement.hxx"
|
||||
#include "HLAFixedRecordDataElement.hxx"
|
||||
#include "HLAObjectClass.hxx"
|
||||
#include "HLAVariantDataElement.hxx"
|
||||
#include "RTIObjectClass.hxx"
|
||||
#include "RTIObjectInstance.hxx"
|
||||
|
||||
namespace simgear {
|
||||
|
||||
HLAObjectInstance::HLAObjectInstance(HLAObjectClass* objectClass) :
|
||||
_objectClass(objectClass)
|
||||
{
|
||||
}
|
||||
|
||||
HLAObjectInstance::HLAObjectInstance(HLAObjectClass* objectClass, RTIObjectInstance* rtiObjectInstance) :
|
||||
_objectClass(objectClass),
|
||||
_rtiObjectInstance(rtiObjectInstance)
|
||||
{
|
||||
_rtiObjectInstance->_hlaObjectInstance = this;
|
||||
_name = _rtiObjectInstance->getName();
|
||||
}
|
||||
|
||||
HLAObjectInstance::~HLAObjectInstance()
|
||||
{
|
||||
}
|
||||
|
||||
SGSharedPtr<HLAObjectClass>
|
||||
HLAObjectInstance::getObjectClass() const
|
||||
{
|
||||
return _objectClass.lock();
|
||||
}
|
||||
|
||||
unsigned
|
||||
HLAObjectInstance::getNumAttributes() const
|
||||
{
|
||||
if (!_rtiObjectInstance.valid()) {
|
||||
SG_LOG(SG_IO, SG_ALERT, "Trying to get number of attributes for inactive object!");
|
||||
return 0;
|
||||
}
|
||||
return _rtiObjectInstance->getNumAttributes();
|
||||
}
|
||||
|
||||
unsigned
|
||||
HLAObjectInstance::getAttributeIndex(const std::string& name) const
|
||||
{
|
||||
if (!_rtiObjectInstance.valid()) {
|
||||
SG_LOG(SG_IO, SG_ALERT, "Trying to get attribute index for inactive object!");
|
||||
return 0;
|
||||
}
|
||||
return _rtiObjectInstance->getAttributeIndex(name);
|
||||
}
|
||||
|
||||
std::string
|
||||
HLAObjectInstance::getAttributeName(unsigned index) const
|
||||
{
|
||||
if (!_rtiObjectInstance.valid()) {
|
||||
SG_LOG(SG_IO, SG_ALERT, "Trying to get attribute name for inactive object!");
|
||||
return std::string();
|
||||
}
|
||||
return _rtiObjectInstance->getAttributeName(index);
|
||||
}
|
||||
|
||||
const HLADataType*
|
||||
HLAObjectInstance::getAttributeDataType(unsigned index) const
|
||||
{
|
||||
if (!_rtiObjectInstance.valid()) {
|
||||
SG_LOG(SG_IO, SG_ALERT, "Trying to get attribute index for inactive object!");
|
||||
return 0;
|
||||
}
|
||||
return _rtiObjectInstance->getAttributeDataType(index);
|
||||
}
|
||||
|
||||
void
|
||||
HLAObjectInstance::setAttributeDataElement(unsigned index, SGSharedPtr<HLADataElement> dataElement)
|
||||
{
|
||||
if (!_rtiObjectInstance.valid()) {
|
||||
SG_LOG(SG_IO, SG_ALERT, "Trying to set data element for inactive object!");
|
||||
return;
|
||||
}
|
||||
_rtiObjectInstance->setDataElement(index, dataElement);
|
||||
}
|
||||
|
||||
HLADataElement*
|
||||
HLAObjectInstance::getAttributeDataElement(unsigned index)
|
||||
{
|
||||
if (!_rtiObjectInstance.valid()) {
|
||||
SG_LOG(SG_IO, SG_ALERT, "Trying to set data element for inactive object!");
|
||||
return 0;
|
||||
}
|
||||
return _rtiObjectInstance->getDataElement(index);
|
||||
}
|
||||
|
||||
const HLADataElement*
|
||||
HLAObjectInstance::getAttributeDataElement(unsigned index) const
|
||||
{
|
||||
if (!_rtiObjectInstance.valid()) {
|
||||
SG_LOG(SG_IO, SG_ALERT, "Trying to set data element for inactive object!");
|
||||
return 0;
|
||||
}
|
||||
return _rtiObjectInstance->getDataElement(index);
|
||||
}
|
||||
|
||||
class HLAObjectInstance::DataElementFactoryVisitor : public HLADataElementFactoryVisitor {
|
||||
public:
|
||||
DataElementFactoryVisitor(const HLAPathElementMap& pathElementMap) :
|
||||
_pathElementMap(pathElementMap)
|
||||
{ }
|
||||
DataElementFactoryVisitor(const HLADataElement::Path& path, const HLAPathElementMap& pathElementMap) :
|
||||
_pathElementMap(pathElementMap),
|
||||
_path(path)
|
||||
{ }
|
||||
virtual ~DataElementFactoryVisitor() {}
|
||||
|
||||
virtual void apply(const HLADataType& dataType)
|
||||
{
|
||||
_dataElement = createDataElement(_path, dataType);
|
||||
if (_dataElement.valid())
|
||||
return;
|
||||
|
||||
SG_LOG(SG_NETWORK, SG_ALERT, "HLA: Can not find a suitable data element for data type \""
|
||||
<< dataType.getName() << "\"");
|
||||
}
|
||||
|
||||
virtual void apply(const HLAInt8DataType& dataType)
|
||||
{
|
||||
_dataElement = createDataElement(_path, dataType);
|
||||
if (_dataElement.valid())
|
||||
return;
|
||||
|
||||
HLADataElementFactoryVisitor::apply(dataType);
|
||||
}
|
||||
virtual void apply(const HLAUInt8DataType& dataType)
|
||||
{
|
||||
_dataElement = createDataElement(_path, dataType);
|
||||
if (_dataElement.valid())
|
||||
return;
|
||||
|
||||
HLADataElementFactoryVisitor::apply(dataType);
|
||||
}
|
||||
virtual void apply(const HLAInt16DataType& dataType)
|
||||
{
|
||||
_dataElement = createDataElement(_path, dataType);
|
||||
if (_dataElement.valid())
|
||||
return;
|
||||
|
||||
HLADataElementFactoryVisitor::apply(dataType);
|
||||
}
|
||||
virtual void apply(const HLAUInt16DataType& dataType)
|
||||
{
|
||||
_dataElement = createDataElement(_path, dataType);
|
||||
if (_dataElement.valid())
|
||||
return;
|
||||
|
||||
HLADataElementFactoryVisitor::apply(dataType);
|
||||
}
|
||||
virtual void apply(const HLAInt32DataType& dataType)
|
||||
{
|
||||
_dataElement = createDataElement(_path, dataType);
|
||||
if (_dataElement.valid())
|
||||
return;
|
||||
|
||||
HLADataElementFactoryVisitor::apply(dataType);
|
||||
}
|
||||
virtual void apply(const HLAUInt32DataType& dataType)
|
||||
{
|
||||
_dataElement = createDataElement(_path, dataType);
|
||||
if (_dataElement.valid())
|
||||
return;
|
||||
|
||||
HLADataElementFactoryVisitor::apply(dataType);
|
||||
}
|
||||
virtual void apply(const HLAInt64DataType& dataType)
|
||||
{
|
||||
_dataElement = createDataElement(_path, dataType);
|
||||
if (_dataElement.valid())
|
||||
return;
|
||||
|
||||
HLADataElementFactoryVisitor::apply(dataType);
|
||||
}
|
||||
virtual void apply(const HLAUInt64DataType& dataType)
|
||||
{
|
||||
_dataElement = createDataElement(_path, dataType);
|
||||
if (_dataElement.valid())
|
||||
return;
|
||||
|
||||
HLADataElementFactoryVisitor::apply(dataType);
|
||||
}
|
||||
virtual void apply(const HLAFloat32DataType& dataType)
|
||||
{
|
||||
_dataElement = createDataElement(_path, dataType);
|
||||
if (_dataElement.valid())
|
||||
return;
|
||||
|
||||
HLADataElementFactoryVisitor::apply(dataType);
|
||||
}
|
||||
virtual void apply(const HLAFloat64DataType& dataType)
|
||||
{
|
||||
_dataElement = createDataElement(_path, dataType);
|
||||
if (_dataElement.valid())
|
||||
return;
|
||||
|
||||
HLADataElementFactoryVisitor::apply(dataType);
|
||||
}
|
||||
|
||||
class ArrayDataElementFactory : public HLAArrayDataElement::DataElementFactory {
|
||||
public:
|
||||
ArrayDataElementFactory(const HLADataElement::Path& path, const HLAPathElementMap& pathElementMap) :
|
||||
_path(path)
|
||||
{
|
||||
for (HLAPathElementMap::const_iterator i = pathElementMap.lower_bound(path);
|
||||
i != pathElementMap.end(); ++i) {
|
||||
if (i->first.begin() != std::search(i->first.begin(), i->first.end(),
|
||||
path.begin(), path.end()))
|
||||
break;
|
||||
_pathElementMap.insert(*i);
|
||||
}
|
||||
}
|
||||
virtual HLADataElement* createElement(const HLAArrayDataElement& element, unsigned index)
|
||||
{
|
||||
const HLADataType* dataType = element.getElementDataType();
|
||||
if (!dataType)
|
||||
return 0;
|
||||
HLADataElement::Path path = _path;
|
||||
path.push_back(HLADataElement::PathElement(index));
|
||||
DataElementFactoryVisitor visitor(path, _pathElementMap);
|
||||
dataType->accept(visitor);
|
||||
return visitor._dataElement.release();
|
||||
}
|
||||
private:
|
||||
HLADataElement::Path _path;
|
||||
HLAPathElementMap _pathElementMap;
|
||||
};
|
||||
|
||||
virtual void apply(const HLAFixedArrayDataType& dataType)
|
||||
{
|
||||
_dataElement = createDataElement(_path, dataType);
|
||||
if (_dataElement.valid())
|
||||
return;
|
||||
|
||||
SGSharedPtr<HLAArrayDataElement> arrayDataElement;
|
||||
arrayDataElement = new HLAArrayDataElement(&dataType);
|
||||
arrayDataElement->setDataElementFactory(new ArrayDataElementFactory(_path, _pathElementMap));
|
||||
arrayDataElement->setNumElements(dataType.getNumElements());
|
||||
|
||||
_dataElement = arrayDataElement;
|
||||
}
|
||||
|
||||
virtual void apply(const HLAVariableArrayDataType& dataType)
|
||||
{
|
||||
_dataElement = createDataElement(_path, dataType);
|
||||
if (_dataElement.valid())
|
||||
return;
|
||||
|
||||
SGSharedPtr<HLAArrayDataElement> arrayDataElement;
|
||||
arrayDataElement = new HLAArrayDataElement(&dataType);
|
||||
arrayDataElement->setDataElementFactory(new ArrayDataElementFactory(_path, _pathElementMap));
|
||||
|
||||
_dataElement = arrayDataElement;
|
||||
}
|
||||
|
||||
virtual void apply(const HLAEnumeratedDataType& dataType)
|
||||
{
|
||||
_dataElement = createDataElement(_path, dataType);
|
||||
if (_dataElement.valid())
|
||||
return;
|
||||
|
||||
HLADataElementFactoryVisitor::apply(dataType);
|
||||
}
|
||||
|
||||
virtual void apply(const HLAFixedRecordDataType& dataType)
|
||||
{
|
||||
_dataElement = createDataElement(_path, dataType);
|
||||
if (_dataElement.valid())
|
||||
return;
|
||||
|
||||
SGSharedPtr<HLAFixedRecordDataElement> recordDataElement;
|
||||
recordDataElement = new HLAFixedRecordDataElement(&dataType);
|
||||
|
||||
unsigned numFields = dataType.getNumFields();
|
||||
for (unsigned i = 0; i < numFields; ++i) {
|
||||
|
||||
_path.push_back(HLADataElement::PathElement(dataType.getFieldName(i)));
|
||||
|
||||
dataType.getFieldDataType(i)->accept(*this);
|
||||
recordDataElement->setField(i, _dataElement.release());
|
||||
|
||||
_path.pop_back();
|
||||
}
|
||||
_dataElement = recordDataElement;
|
||||
}
|
||||
|
||||
class VariantDataElementFactory : public HLAVariantDataElement::DataElementFactory {
|
||||
public:
|
||||
VariantDataElementFactory(const HLADataElement::Path& path, const HLAPathElementMap& pathElementMap) :
|
||||
_path(path)
|
||||
{
|
||||
for (HLAPathElementMap::const_iterator i = pathElementMap.lower_bound(path);
|
||||
i != pathElementMap.end(); ++i) {
|
||||
if (i->first.begin() != std::search(i->first.begin(), i->first.end(),
|
||||
path.begin(), path.end()))
|
||||
break;
|
||||
_pathElementMap.insert(*i);
|
||||
}
|
||||
}
|
||||
virtual HLADataElement* createElement(const HLAVariantDataElement& element, unsigned index)
|
||||
{
|
||||
const HLAVariantDataType* dataType = element.getDataType();
|
||||
if (!dataType)
|
||||
return 0;
|
||||
const HLADataType* alternativeDataType = element.getAlternativeDataType();
|
||||
if (!alternativeDataType)
|
||||
return 0;
|
||||
HLADataElement::Path path = _path;
|
||||
path.push_back(HLADataElement::PathElement(dataType->getAlternativeName(index)));
|
||||
DataElementFactoryVisitor visitor(path, _pathElementMap);
|
||||
alternativeDataType->accept(visitor);
|
||||
return visitor._dataElement.release();
|
||||
}
|
||||
private:
|
||||
HLADataElement::Path _path;
|
||||
HLAPathElementMap _pathElementMap;
|
||||
};
|
||||
|
||||
virtual void apply(const HLAVariantDataType& dataType)
|
||||
{
|
||||
_dataElement = createDataElement(_path, dataType);
|
||||
if (_dataElement.valid())
|
||||
return;
|
||||
|
||||
SGSharedPtr<HLAVariantDataElement> variantDataElement;
|
||||
variantDataElement = new HLAVariantDataElement(&dataType);
|
||||
variantDataElement->setDataElementFactory(new VariantDataElementFactory(_path, _pathElementMap));
|
||||
|
||||
_dataElement = variantDataElement;
|
||||
}
|
||||
|
||||
private:
|
||||
SGSharedPtr<HLADataElement> createDataElement(const HLADataElement::Path& path, const HLADataType& dataType)
|
||||
{
|
||||
HLAPathElementMap::const_iterator i = _pathElementMap.find(path);
|
||||
if (i == _pathElementMap.end()) {
|
||||
SG_LOG(SG_IO, SG_WARN, "No dataElement provided for \""
|
||||
<< HLADataElement::toString(path) << "\".");
|
||||
|
||||
return 0;
|
||||
}
|
||||
SGSharedPtr<HLADataElement> dataElement = i->second.getDataElement(path);
|
||||
if (!dataElement->setDataType(&dataType)) {
|
||||
SG_LOG(SG_IO, SG_ALERT, "Cannot set data type for data element at \""
|
||||
<< HLADataElement::toString(path) << "\"!");
|
||||
return 0;
|
||||
}
|
||||
SG_LOG(SG_IO, SG_DEBUG, "Using provided dataElement for \""
|
||||
<< HLADataElement::toString(path) << "\".");
|
||||
return dataElement;
|
||||
}
|
||||
|
||||
const HLAPathElementMap& _pathElementMap;
|
||||
HLADataElement::Path _path;
|
||||
};
|
||||
|
||||
void
|
||||
HLAObjectInstance::setAttribute(unsigned index, const HLAPathElementMap& pathElementMap)
|
||||
{
|
||||
const HLADataType* dataType = getAttributeDataType(index);
|
||||
if (!dataType) {
|
||||
SG_LOG(SG_IO, SG_ALERT, "Cannot get attribute data type for setting attribute at index "
|
||||
<< index << "!");
|
||||
return;
|
||||
}
|
||||
|
||||
SG_LOG(SG_IO, SG_DEBUG, "Setting DataElement for attribute \""
|
||||
<< getAttributeName(index) << "\".");
|
||||
|
||||
DataElementFactoryVisitor visitor(pathElementMap);
|
||||
dataType->accept(visitor);
|
||||
setAttributeDataElement(index, visitor.getDataElement());
|
||||
}
|
||||
|
||||
void
|
||||
HLAObjectInstance::setAttributes(const HLAAttributePathElementMap& attributePathElementMap)
|
||||
{
|
||||
for (HLAAttributePathElementMap::const_iterator i = attributePathElementMap.begin();
|
||||
i != attributePathElementMap.end(); ++i) {
|
||||
setAttribute(i->first, i->second);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
HLAObjectInstance::registerInstance()
|
||||
{
|
||||
if (_rtiObjectInstance.valid()) {
|
||||
SG_LOG(SG_IO, SG_ALERT, "Trying to register object " << getName() << " already known to the RTI!");
|
||||
return;
|
||||
}
|
||||
SGSharedPtr<HLAObjectClass> objectClass = _objectClass.lock();
|
||||
if (!objectClass.valid()) {
|
||||
SG_LOG(SG_IO, SG_ALERT, "Could not register object with unknown object class!");
|
||||
return;
|
||||
}
|
||||
// This error must have been flagged before
|
||||
if (!objectClass->_rtiObjectClass.valid())
|
||||
return;
|
||||
_rtiObjectInstance = objectClass->_rtiObjectClass->registerObjectInstance(this);
|
||||
if (!_rtiObjectInstance.valid()) {
|
||||
SG_LOG(SG_IO, SG_ALERT, "Could not register object at the RTI!");
|
||||
return;
|
||||
}
|
||||
_name = _rtiObjectInstance->getName();
|
||||
objectClass->registerInstance(*this);
|
||||
}
|
||||
|
||||
void
|
||||
HLAObjectInstance::deleteInstance(const RTIData& tag)
|
||||
{
|
||||
if (!_rtiObjectInstance.valid()) {
|
||||
SG_LOG(SG_IO, SG_ALERT, "Trying to delete inactive object!");
|
||||
return;
|
||||
}
|
||||
SGSharedPtr<HLAObjectClass> objectClass = _objectClass.lock();
|
||||
if (!objectClass.valid())
|
||||
return;
|
||||
objectClass->deleteInstance(*this);
|
||||
_rtiObjectInstance->deleteObjectInstance(tag);
|
||||
}
|
||||
|
||||
void
|
||||
HLAObjectInstance::updateAttributeValues(const RTIData& tag)
|
||||
{
|
||||
if (!_rtiObjectInstance.valid()) {
|
||||
SG_LOG(SG_IO, SG_INFO, "Not updating inactive object!");
|
||||
return;
|
||||
}
|
||||
if (_attributeCallback.valid())
|
||||
_attributeCallback->updateAttributeValues(*this, tag);
|
||||
_rtiObjectInstance->updateAttributeValues(tag);
|
||||
}
|
||||
|
||||
void
|
||||
HLAObjectInstance::updateAttributeValues(const SGTimeStamp& timeStamp, const RTIData& tag)
|
||||
{
|
||||
if (!_rtiObjectInstance.valid()) {
|
||||
SG_LOG(SG_IO, SG_INFO, "Not updating inactive object!");
|
||||
return;
|
||||
}
|
||||
if (_attributeCallback.valid())
|
||||
_attributeCallback->updateAttributeValues(*this, tag);
|
||||
_rtiObjectInstance->updateAttributeValues(timeStamp, tag);
|
||||
}
|
||||
|
||||
void
|
||||
HLAObjectInstance::removeInstance(const RTIData& tag)
|
||||
{
|
||||
SGSharedPtr<HLAObjectClass> objectClass = _objectClass.lock();
|
||||
if (!objectClass.valid())
|
||||
return;
|
||||
objectClass->removeInstanceCallback(*this, tag);
|
||||
}
|
||||
|
||||
void
|
||||
HLAObjectInstance::reflectAttributeValues(const RTIIndexDataPairList& dataPairList, const RTIData& tag)
|
||||
{
|
||||
if (!_attributeCallback.valid())
|
||||
return;
|
||||
_attributeCallback->reflectAttributeValues(*this, dataPairList, tag);
|
||||
}
|
||||
|
||||
void
|
||||
HLAObjectInstance::reflectAttributeValues(const RTIIndexDataPairList& dataPairList,
|
||||
const SGTimeStamp& timeStamp, const RTIData& tag)
|
||||
{
|
||||
if (!_attributeCallback.valid())
|
||||
return;
|
||||
_attributeCallback->reflectAttributeValues(*this, dataPairList, timeStamp, tag);
|
||||
}
|
||||
|
||||
} // namespace simgear
|
||||
101
simgear/hla/HLAObjectInstance.hxx
Normal file
101
simgear/hla/HLAObjectInstance.hxx
Normal file
@@ -0,0 +1,101 @@
|
||||
// Copyright (C) 2009 - 2010 Mathias Froehlich - Mathias.Froehlich@web.de
|
||||
//
|
||||
// This library is free software; you can redistribute it and/or
|
||||
// modify it under the terms of the GNU Library General Public
|
||||
// License as published by the Free Software Foundation; either
|
||||
// version 2 of the License, or (at your option) any later version.
|
||||
//
|
||||
// This library is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
// Library General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program; if not, write to the Free Software
|
||||
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
//
|
||||
|
||||
#ifndef HLAObjectInstance_hxx
|
||||
#define HLAObjectInstance_hxx
|
||||
|
||||
#include <simgear/structure/SGWeakPtr.hxx>
|
||||
|
||||
#include "HLADataElement.hxx"
|
||||
|
||||
class SGTimeStamp;
|
||||
|
||||
namespace simgear {
|
||||
|
||||
class RTIObjectInstance;
|
||||
class HLAObjectClass;
|
||||
|
||||
class HLAObjectInstance : public SGWeakReferenced {
|
||||
public:
|
||||
HLAObjectInstance(HLAObjectClass* objectClass);
|
||||
HLAObjectInstance(HLAObjectClass* objectClass, RTIObjectInstance* rtiObjectInstance);
|
||||
virtual ~HLAObjectInstance();
|
||||
|
||||
const std::string& getName() const
|
||||
{ return _name; }
|
||||
|
||||
SGSharedPtr<HLAObjectClass> getObjectClass() const;
|
||||
|
||||
unsigned getNumAttributes() const;
|
||||
unsigned getAttributeIndex(const std::string& name) const;
|
||||
std::string getAttributeName(unsigned index) const;
|
||||
|
||||
const HLADataType* getAttributeDataType(unsigned index) const;
|
||||
|
||||
void setAttributeDataElement(unsigned index, SGSharedPtr<HLADataElement> dataElement);
|
||||
HLADataElement* getAttributeDataElement(unsigned index);
|
||||
const HLADataElement* getAttributeDataElement(unsigned index) const;
|
||||
void setAttribute(unsigned index, const HLAPathElementMap& pathElementMap);
|
||||
void setAttributes(const HLAAttributePathElementMap& attributePathElementMap);
|
||||
|
||||
void registerInstance();
|
||||
void deleteInstance(const RTIData& tag);
|
||||
|
||||
class AttributeCallback : public SGReferenced {
|
||||
public:
|
||||
virtual ~AttributeCallback() {}
|
||||
// Notification about reflect and whatever TBD
|
||||
// Hmm, don't know yet how this should look like
|
||||
virtual void updateAttributeValues(HLAObjectInstance& objectInstance, const RTIData& tag)
|
||||
{ }
|
||||
|
||||
virtual void reflectAttributeValues(HLAObjectInstance& objectInstance,
|
||||
const RTIIndexDataPairList& dataPairList, const RTIData& tag)
|
||||
{ }
|
||||
virtual void reflectAttributeValues(HLAObjectInstance& objectInstance, const RTIIndexDataPairList& dataPairList,
|
||||
const SGTimeStamp& timeStamp, const RTIData& tag)
|
||||
{ reflectAttributeValues(objectInstance, dataPairList, tag); }
|
||||
};
|
||||
|
||||
void setAttributeCallback(const SGSharedPtr<AttributeCallback>& attributeCallback)
|
||||
{ _attributeCallback = attributeCallback; }
|
||||
const SGSharedPtr<AttributeCallback>& getAttributeCallback() const
|
||||
{ return _attributeCallback; }
|
||||
|
||||
// Push the current values into the RTI
|
||||
void updateAttributeValues(const RTIData& tag);
|
||||
void updateAttributeValues(const SGTimeStamp& timeStamp, const RTIData& tag);
|
||||
|
||||
private:
|
||||
void removeInstance(const RTIData& tag);
|
||||
void reflectAttributeValues(const RTIIndexDataPairList& dataPairList, const RTIData& tag);
|
||||
void reflectAttributeValues(const RTIIndexDataPairList& dataPairList, const SGTimeStamp& timeStamp, const RTIData& tag);
|
||||
friend class RTIObjectInstance;
|
||||
friend class HLAObjectClass;
|
||||
|
||||
class DataElementFactoryVisitor;
|
||||
|
||||
std::string _name;
|
||||
|
||||
SGWeakPtr<HLAObjectClass> _objectClass;
|
||||
SGSharedPtr<RTIObjectInstance> _rtiObjectInstance;
|
||||
SGSharedPtr<AttributeCallback> _attributeCallback;
|
||||
};
|
||||
|
||||
} // namespace simgear
|
||||
|
||||
#endif
|
||||
562
simgear/hla/HLAPropertyDataElement.cxx
Normal file
562
simgear/hla/HLAPropertyDataElement.cxx
Normal file
@@ -0,0 +1,562 @@
|
||||
// Copyright (C) 2009 - 2011 Mathias Froehlich - Mathias.Froehlich@web.de
|
||||
//
|
||||
// This library is free software; you can redistribute it and/or
|
||||
// modify it under the terms of the GNU Library General Public
|
||||
// License as published by the Free Software Foundation; either
|
||||
// version 2 of the License, or (at your option) any later version.
|
||||
//
|
||||
// This library is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
// Library General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program; if not, write to the Free Software
|
||||
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
//
|
||||
|
||||
#include "HLAPropertyDataElement.hxx"
|
||||
|
||||
#include "HLAArrayDataElement.hxx"
|
||||
#include "HLABasicDataElement.hxx"
|
||||
#include "HLADataElementVisitor.hxx"
|
||||
#include "HLADataTypeVisitor.hxx"
|
||||
#include "HLAFixedRecordDataElement.hxx"
|
||||
#include "HLAVariantDataElement.hxx"
|
||||
|
||||
namespace simgear {
|
||||
|
||||
class HLAPropertyDataElement::ScalarDecodeVisitor : public HLADataTypeDecodeVisitor {
|
||||
public:
|
||||
ScalarDecodeVisitor(HLADecodeStream& stream, SGPropertyNode& propertyNode) :
|
||||
HLADataTypeDecodeVisitor(stream),
|
||||
_propertyNode(propertyNode)
|
||||
{ }
|
||||
virtual ~ScalarDecodeVisitor()
|
||||
{ }
|
||||
|
||||
virtual void apply(const HLAInt8DataType& dataType)
|
||||
{
|
||||
int8_t value = 0;
|
||||
dataType.decode(_stream, value);
|
||||
_propertyNode.setIntValue(value);
|
||||
}
|
||||
virtual void apply(const HLAUInt8DataType& dataType)
|
||||
{
|
||||
uint8_t value = 0;
|
||||
dataType.decode(_stream, value);
|
||||
_propertyNode.setIntValue(value);
|
||||
}
|
||||
virtual void apply(const HLAInt16DataType& dataType)
|
||||
{
|
||||
int16_t value = 0;
|
||||
dataType.decode(_stream, value);
|
||||
_propertyNode.setIntValue(value);
|
||||
}
|
||||
virtual void apply(const HLAUInt16DataType& dataType)
|
||||
{
|
||||
uint16_t value = 0;
|
||||
dataType.decode(_stream, value);
|
||||
_propertyNode.setIntValue(value);
|
||||
}
|
||||
virtual void apply(const HLAInt32DataType& dataType)
|
||||
{
|
||||
int32_t value = 0;
|
||||
dataType.decode(_stream, value);
|
||||
_propertyNode.setIntValue(value);
|
||||
}
|
||||
virtual void apply(const HLAUInt32DataType& dataType)
|
||||
{
|
||||
uint32_t value = 0;
|
||||
dataType.decode(_stream, value);
|
||||
_propertyNode.setIntValue(value);
|
||||
}
|
||||
virtual void apply(const HLAInt64DataType& dataType)
|
||||
{
|
||||
int64_t value = 0;
|
||||
dataType.decode(_stream, value);
|
||||
_propertyNode.setLongValue(value);
|
||||
}
|
||||
virtual void apply(const HLAUInt64DataType& dataType)
|
||||
{
|
||||
uint64_t value = 0;
|
||||
dataType.decode(_stream, value);
|
||||
_propertyNode.setLongValue(value);
|
||||
}
|
||||
virtual void apply(const HLAFloat32DataType& dataType)
|
||||
{
|
||||
float value = 0;
|
||||
dataType.decode(_stream, value);
|
||||
_propertyNode.setFloatValue(value);
|
||||
}
|
||||
virtual void apply(const HLAFloat64DataType& dataType)
|
||||
{
|
||||
double value = 0;
|
||||
dataType.decode(_stream, value);
|
||||
_propertyNode.setDoubleValue(value);
|
||||
}
|
||||
|
||||
protected:
|
||||
SGPropertyNode& _propertyNode;
|
||||
};
|
||||
|
||||
class HLAPropertyDataElement::ScalarEncodeVisitor : public HLADataTypeEncodeVisitor {
|
||||
public:
|
||||
ScalarEncodeVisitor(HLAEncodeStream& stream, const SGPropertyNode& propertyNode) :
|
||||
HLADataTypeEncodeVisitor(stream),
|
||||
_propertyNode(propertyNode)
|
||||
{ }
|
||||
virtual ~ScalarEncodeVisitor()
|
||||
{ }
|
||||
|
||||
virtual void apply(const HLAInt8DataType& dataType)
|
||||
{
|
||||
dataType.encode(_stream, _propertyNode.getIntValue());
|
||||
}
|
||||
virtual void apply(const HLAUInt8DataType& dataType)
|
||||
{
|
||||
dataType.encode(_stream, _propertyNode.getIntValue());
|
||||
}
|
||||
virtual void apply(const HLAInt16DataType& dataType)
|
||||
{
|
||||
dataType.encode(_stream, _propertyNode.getIntValue());
|
||||
}
|
||||
virtual void apply(const HLAUInt16DataType& dataType)
|
||||
{
|
||||
dataType.encode(_stream, _propertyNode.getIntValue());
|
||||
}
|
||||
virtual void apply(const HLAInt32DataType& dataType)
|
||||
{
|
||||
dataType.encode(_stream, _propertyNode.getIntValue());
|
||||
}
|
||||
virtual void apply(const HLAUInt32DataType& dataType)
|
||||
{
|
||||
dataType.encode(_stream, _propertyNode.getIntValue());
|
||||
}
|
||||
virtual void apply(const HLAInt64DataType& dataType)
|
||||
{
|
||||
dataType.encode(_stream, _propertyNode.getLongValue());
|
||||
}
|
||||
virtual void apply(const HLAUInt64DataType& dataType)
|
||||
{
|
||||
dataType.encode(_stream, _propertyNode.getLongValue());
|
||||
}
|
||||
virtual void apply(const HLAFloat32DataType& dataType)
|
||||
{
|
||||
dataType.encode(_stream, _propertyNode.getFloatValue());
|
||||
}
|
||||
virtual void apply(const HLAFloat64DataType& dataType)
|
||||
{
|
||||
dataType.encode(_stream, _propertyNode.getDoubleValue());
|
||||
}
|
||||
|
||||
protected:
|
||||
const SGPropertyNode& _propertyNode;
|
||||
};
|
||||
|
||||
class HLAPropertyDataElement::ScalarDataElement : public HLABasicDataElement {
|
||||
public:
|
||||
ScalarDataElement(const HLABasicDataType* dataType, SGPropertyNode* propertyNode);
|
||||
virtual ~ScalarDataElement();
|
||||
|
||||
virtual bool encode(HLAEncodeStream& stream) const;
|
||||
virtual bool decode(HLADecodeStream& stream);
|
||||
|
||||
private:
|
||||
SGSharedPtr<SGPropertyNode> _propertyNode;
|
||||
};
|
||||
|
||||
HLAPropertyDataElement::ScalarDataElement::ScalarDataElement(const HLABasicDataType* dataType, SGPropertyNode* propertyNode) :
|
||||
HLABasicDataElement(dataType),
|
||||
_propertyNode(propertyNode)
|
||||
{
|
||||
}
|
||||
|
||||
HLAPropertyDataElement::ScalarDataElement::~ScalarDataElement()
|
||||
{
|
||||
}
|
||||
|
||||
bool
|
||||
HLAPropertyDataElement::ScalarDataElement::encode(HLAEncodeStream& stream) const
|
||||
{
|
||||
ScalarEncodeVisitor visitor(stream, *_propertyNode);
|
||||
_dataType->accept(visitor);
|
||||
return true;
|
||||
}
|
||||
|
||||
bool
|
||||
HLAPropertyDataElement::ScalarDataElement::decode(HLADecodeStream& stream)
|
||||
{
|
||||
ScalarDecodeVisitor visitor(stream, *_propertyNode);
|
||||
_dataType->accept(visitor);
|
||||
return true;
|
||||
}
|
||||
|
||||
class HLAPropertyDataElement::StringDataElement : public HLAStringDataElement {
|
||||
public:
|
||||
StringDataElement(const HLAArrayDataType* dataType, SGPropertyNode* propertyNode);
|
||||
virtual ~StringDataElement();
|
||||
|
||||
virtual bool decodeElement(HLADecodeStream& stream, unsigned i);
|
||||
|
||||
class Listener : public SGPropertyChangeListener {
|
||||
public:
|
||||
Listener(StringDataElement* stringDataElement);
|
||||
virtual ~Listener();
|
||||
virtual void valueChanged (SGPropertyNode * node);
|
||||
private:
|
||||
StringDataElement* _stringDataElement;
|
||||
};
|
||||
|
||||
private:
|
||||
SGSharedPtr<SGPropertyNode> _propertyNode;
|
||||
Listener* _listener;
|
||||
};
|
||||
|
||||
HLAPropertyDataElement::StringDataElement::Listener::Listener(StringDataElement* stringDataElement) :
|
||||
_stringDataElement(stringDataElement)
|
||||
{
|
||||
}
|
||||
|
||||
HLAPropertyDataElement::StringDataElement::Listener::~Listener()
|
||||
{
|
||||
}
|
||||
|
||||
void
|
||||
HLAPropertyDataElement::StringDataElement::Listener::valueChanged (SGPropertyNode * node)
|
||||
{
|
||||
_stringDataElement->setValue(node->getStringValue());
|
||||
}
|
||||
|
||||
HLAPropertyDataElement::StringDataElement::StringDataElement(const HLAArrayDataType* dataType, SGPropertyNode* propertyNode) :
|
||||
HLAStringDataElement(dataType),
|
||||
_propertyNode(propertyNode),
|
||||
_listener(new Listener(this))
|
||||
{
|
||||
_propertyNode->addChangeListener(_listener, true);
|
||||
}
|
||||
|
||||
HLAPropertyDataElement::StringDataElement::~StringDataElement()
|
||||
{
|
||||
_propertyNode->removeChangeListener(_listener);
|
||||
delete _listener;
|
||||
_listener = 0;
|
||||
}
|
||||
|
||||
bool
|
||||
HLAPropertyDataElement::StringDataElement::decodeElement(HLADecodeStream& stream, unsigned i)
|
||||
{
|
||||
if (!HLAStringDataElement::decodeElement(stream, i))
|
||||
return false;
|
||||
if (i + 1 == getValue().size())
|
||||
_propertyNode->setStringValue(getValue());
|
||||
return true;
|
||||
}
|
||||
|
||||
class HLAPropertyDataElement::DataElementFactoryVisitor : public HLADataTypeVisitor {
|
||||
public:
|
||||
DataElementFactoryVisitor(SGPropertyNode* propertyNode) :
|
||||
_propertyNode(propertyNode)
|
||||
{ }
|
||||
virtual ~DataElementFactoryVisitor()
|
||||
{ }
|
||||
|
||||
virtual void apply(const HLADataType& dataType)
|
||||
{
|
||||
SG_LOG(SG_NETWORK, SG_ALERT, "HLA: Can not find a suitable data element for data type \""
|
||||
<< dataType.getName() << "\"");
|
||||
}
|
||||
|
||||
virtual void apply(const HLAInt8DataType& dataType)
|
||||
{
|
||||
_dataElement = new ScalarDataElement(&dataType, _propertyNode.get());
|
||||
}
|
||||
virtual void apply(const HLAUInt8DataType& dataType)
|
||||
{
|
||||
_dataElement = new ScalarDataElement(&dataType, _propertyNode.get());
|
||||
}
|
||||
virtual void apply(const HLAInt16DataType& dataType)
|
||||
{
|
||||
_dataElement = new ScalarDataElement(&dataType, _propertyNode.get());
|
||||
}
|
||||
virtual void apply(const HLAUInt16DataType& dataType)
|
||||
{
|
||||
_dataElement = new ScalarDataElement(&dataType, _propertyNode.get());
|
||||
}
|
||||
virtual void apply(const HLAInt32DataType& dataType)
|
||||
{
|
||||
_dataElement = new ScalarDataElement(&dataType, _propertyNode.get());
|
||||
}
|
||||
virtual void apply(const HLAUInt32DataType& dataType)
|
||||
{
|
||||
_dataElement = new ScalarDataElement(&dataType, _propertyNode.get());
|
||||
}
|
||||
virtual void apply(const HLAInt64DataType& dataType)
|
||||
{
|
||||
_dataElement = new ScalarDataElement(&dataType, _propertyNode.get());
|
||||
}
|
||||
virtual void apply(const HLAUInt64DataType& dataType)
|
||||
{
|
||||
_dataElement = new ScalarDataElement(&dataType, _propertyNode.get());
|
||||
}
|
||||
virtual void apply(const HLAFloat32DataType& dataType)
|
||||
{
|
||||
_dataElement = new ScalarDataElement(&dataType, _propertyNode.get());
|
||||
}
|
||||
virtual void apply(const HLAFloat64DataType& dataType)
|
||||
{
|
||||
_dataElement = new ScalarDataElement(&dataType, _propertyNode.get());
|
||||
}
|
||||
|
||||
class ArrayDataElementFactory : public HLAArrayDataElement::DataElementFactory {
|
||||
public:
|
||||
ArrayDataElementFactory(SGPropertyNode* propertyNode) :
|
||||
_propertyNode(propertyNode)
|
||||
{ }
|
||||
virtual HLADataElement* createElement(const HLAArrayDataElement& element, unsigned index)
|
||||
{
|
||||
const HLADataType* dataType = element.getElementDataType();
|
||||
if (!dataType)
|
||||
return 0;
|
||||
|
||||
SGPropertyNode* parent = _propertyNode->getParent();
|
||||
DataElementFactoryVisitor visitor(parent->getChild(_propertyNode->getNameString(), index, true));
|
||||
dataType->accept(visitor);
|
||||
return visitor.getDataElement();
|
||||
}
|
||||
private:
|
||||
SGSharedPtr<SGPropertyNode> _propertyNode;
|
||||
};
|
||||
|
||||
virtual void apply(const HLAFixedArrayDataType& dataType)
|
||||
{
|
||||
if (dataType.getIsString()) {
|
||||
_dataElement = new StringDataElement(&dataType, _propertyNode.get());
|
||||
} else {
|
||||
SGSharedPtr<HLAArrayDataElement> arrayDataElement;
|
||||
arrayDataElement = new HLAArrayDataElement(&dataType);
|
||||
arrayDataElement->setDataElementFactory(new ArrayDataElementFactory(_propertyNode.get()));
|
||||
arrayDataElement->setNumElements(dataType.getNumElements());
|
||||
_dataElement = arrayDataElement;
|
||||
}
|
||||
}
|
||||
|
||||
virtual void apply(const HLAVariableArrayDataType& dataType)
|
||||
{
|
||||
if (dataType.getIsString()) {
|
||||
_dataElement = new StringDataElement(&dataType, _propertyNode.get());
|
||||
} else {
|
||||
SGSharedPtr<HLAArrayDataElement> arrayDataElement;
|
||||
arrayDataElement = new HLAArrayDataElement(&dataType);
|
||||
arrayDataElement->setDataElementFactory(new ArrayDataElementFactory(_propertyNode.get()));
|
||||
_dataElement = arrayDataElement;
|
||||
}
|
||||
}
|
||||
|
||||
virtual void apply(const HLAEnumeratedDataType& dataType)
|
||||
{
|
||||
_dataElement = new ScalarDataElement(dataType.getRepresentation(), _propertyNode.get());
|
||||
}
|
||||
|
||||
virtual void apply(const HLAFixedRecordDataType& dataType)
|
||||
{
|
||||
SGSharedPtr<HLAFixedRecordDataElement> recordDataElement;
|
||||
recordDataElement = new HLAFixedRecordDataElement(&dataType);
|
||||
|
||||
unsigned numFields = dataType.getNumFields();
|
||||
for (unsigned i = 0; i < numFields; ++i) {
|
||||
DataElementFactoryVisitor visitor(_propertyNode->getChild(dataType.getFieldName(i), 0, true));
|
||||
dataType.getFieldDataType(i)->accept(visitor);
|
||||
recordDataElement->setField(i, visitor._dataElement.get());
|
||||
}
|
||||
|
||||
_dataElement = recordDataElement;
|
||||
}
|
||||
|
||||
class VariantDataElementFactory : public HLAVariantDataElement::DataElementFactory {
|
||||
public:
|
||||
VariantDataElementFactory(SGPropertyNode* propertyNode) :
|
||||
_propertyNode(propertyNode)
|
||||
{ }
|
||||
virtual HLADataElement* createElement(const HLAVariantDataElement& element, unsigned index)
|
||||
{
|
||||
const HLAVariantDataType* dataType = element.getDataType();
|
||||
if (!dataType)
|
||||
return 0;
|
||||
const HLADataType* alternativeDataType = element.getAlternativeDataType();
|
||||
if (!alternativeDataType)
|
||||
return 0;
|
||||
DataElementFactoryVisitor visitor(_propertyNode->getChild(dataType->getAlternativeName(index), 0, true));
|
||||
alternativeDataType->accept(visitor);
|
||||
return visitor.getDataElement();
|
||||
}
|
||||
private:
|
||||
SGSharedPtr<SGPropertyNode> _propertyNode;
|
||||
};
|
||||
|
||||
virtual void apply(const HLAVariantDataType& dataType)
|
||||
{
|
||||
SGSharedPtr<HLAVariantDataElement> variantDataElement;
|
||||
variantDataElement = new HLAVariantDataElement(&dataType);
|
||||
variantDataElement->setDataElementFactory(new VariantDataElementFactory(_propertyNode.get()));
|
||||
_dataElement = variantDataElement;
|
||||
}
|
||||
|
||||
HLADataElement* getDataElement()
|
||||
{ return _dataElement.release(); }
|
||||
|
||||
private:
|
||||
SGSharedPtr<SGPropertyNode> _propertyNode;
|
||||
SGSharedPtr<HLADataElement> _dataElement;
|
||||
};
|
||||
|
||||
HLAPropertyDataElement::HLAPropertyDataElement()
|
||||
{
|
||||
}
|
||||
|
||||
HLAPropertyDataElement::HLAPropertyDataElement(SGPropertyNode* propertyNode)
|
||||
{
|
||||
setPropertyNode(propertyNode);
|
||||
}
|
||||
|
||||
HLAPropertyDataElement::HLAPropertyDataElement(const HLADataType* dataType, SGPropertyNode* propertyNode) :
|
||||
_dataType(dataType)
|
||||
{
|
||||
setPropertyNode(propertyNode);
|
||||
}
|
||||
|
||||
HLAPropertyDataElement::HLAPropertyDataElement(const HLADataType* dataType) :
|
||||
_dataType(dataType)
|
||||
{
|
||||
}
|
||||
|
||||
HLAPropertyDataElement::~HLAPropertyDataElement()
|
||||
{
|
||||
}
|
||||
|
||||
void
|
||||
HLAPropertyDataElement::accept(HLADataElementVisitor& visitor)
|
||||
{
|
||||
if (_dataElement.valid()) {
|
||||
visitor.apply(*_dataElement);
|
||||
} else {
|
||||
// We cant do anything if the data type is not valid
|
||||
if (_dataType.valid()) {
|
||||
HLADataElementFactoryVisitor factoryVisitor;
|
||||
_dataType->accept(factoryVisitor);
|
||||
_dataElement = factoryVisitor.getDataElement();
|
||||
if (_dataElement.valid()) {
|
||||
visitor.apply(*_dataElement);
|
||||
} else {
|
||||
HLADataElement::accept(visitor);
|
||||
}
|
||||
} else {
|
||||
HLADataElement::accept(visitor);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
HLAPropertyDataElement::accept(HLAConstDataElementVisitor& visitor) const
|
||||
{
|
||||
if (_dataElement.valid()) {
|
||||
visitor.apply(*_dataElement);
|
||||
} else {
|
||||
HLADataElement::accept(visitor);
|
||||
}
|
||||
}
|
||||
|
||||
bool
|
||||
HLAPropertyDataElement::encode(HLAEncodeStream& stream) const
|
||||
{
|
||||
if (_dataElement.valid()) {
|
||||
return _dataElement->encode(stream);
|
||||
} else {
|
||||
if (!_dataType.valid())
|
||||
return false;
|
||||
HLADataTypeEncodeVisitor visitor(stream);
|
||||
_dataType->accept(visitor);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
bool
|
||||
HLAPropertyDataElement::decode(HLADecodeStream& stream)
|
||||
{
|
||||
if (_dataElement.valid()) {
|
||||
return _dataElement->decode(stream);
|
||||
} else if (!_dataType.valid()) {
|
||||
// We cant do anything if the data type is not valid
|
||||
return false;
|
||||
} else {
|
||||
HLADataElementFactoryVisitor visitor;
|
||||
_dataType->accept(visitor);
|
||||
_dataElement = visitor.getDataElement();
|
||||
if (_dataElement.valid()) {
|
||||
return _dataElement->decode(stream);
|
||||
} else {
|
||||
HLADataTypeDecodeVisitor visitor(stream);
|
||||
_dataType->accept(visitor);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
const HLADataType*
|
||||
HLAPropertyDataElement::getDataType() const
|
||||
{
|
||||
return _dataType.get();
|
||||
}
|
||||
|
||||
bool
|
||||
HLAPropertyDataElement::setDataType(const HLADataType* dataType)
|
||||
{
|
||||
_dataType = dataType;
|
||||
if (_dataType.valid() && _propertyNode.valid())
|
||||
_dataElement = createDataElement(_dataType, _propertyNode);
|
||||
return true;
|
||||
}
|
||||
|
||||
void
|
||||
HLAPropertyDataElement::setPropertyNode(SGPropertyNode* propertyNode)
|
||||
{
|
||||
_propertyNode = propertyNode;
|
||||
if (_dataType.valid() && _propertyNode.valid())
|
||||
_dataElement = createDataElement(_dataType, _propertyNode);
|
||||
}
|
||||
|
||||
SGPropertyNode*
|
||||
HLAPropertyDataElement::getPropertyNode()
|
||||
{
|
||||
return _propertyNode.get();
|
||||
}
|
||||
|
||||
const SGPropertyNode*
|
||||
HLAPropertyDataElement::getPropertyNode() const
|
||||
{
|
||||
return _propertyNode.get();
|
||||
}
|
||||
|
||||
HLADataElement*
|
||||
HLAPropertyDataElement::createDataElement(const SGSharedPtr<const HLADataType>& dataType,
|
||||
const SGSharedPtr<SGPropertyNode>& propertyNode)
|
||||
{
|
||||
DataElementFactoryVisitor visitor(propertyNode);
|
||||
dataType->accept(visitor);
|
||||
SGSharedPtr<HLADataElement> dataElement = visitor.getDataElement();
|
||||
|
||||
// Copy over the content of the previous data element if there is any.
|
||||
if (_dataElement.valid()) {
|
||||
// FIXME is encode/decode the right tool here??
|
||||
RTIData data;
|
||||
HLAEncodeStream encodeStream(data);
|
||||
if (_dataElement->encode(encodeStream)) {
|
||||
HLADecodeStream decodeStream(data);
|
||||
dataElement->decode(decodeStream);
|
||||
}
|
||||
}
|
||||
|
||||
return dataElement.release();
|
||||
}
|
||||
|
||||
} // namespace simgear
|
||||
66
simgear/hla/HLAPropertyDataElement.hxx
Normal file
66
simgear/hla/HLAPropertyDataElement.hxx
Normal file
@@ -0,0 +1,66 @@
|
||||
// Copyright (C) 2009 - 2011 Mathias Froehlich - Mathias.Froehlich@web.de
|
||||
//
|
||||
// This library is free software; you can redistribute it and/or
|
||||
// modify it under the terms of the GNU Library General Public
|
||||
// License as published by the Free Software Foundation; either
|
||||
// version 2 of the License, or (at your option) any later version.
|
||||
//
|
||||
// This library is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
// Library General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program; if not, write to the Free Software
|
||||
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
//
|
||||
|
||||
#ifndef HLAPropertyDataElement_hxx
|
||||
#define HLAPropertyDataElement_hxx
|
||||
|
||||
#include <simgear/props/props.hxx>
|
||||
#include "HLADataElement.hxx"
|
||||
|
||||
namespace simgear {
|
||||
|
||||
class HLAPropertyDataElement : public HLADataElement {
|
||||
public:
|
||||
HLAPropertyDataElement();
|
||||
HLAPropertyDataElement(SGPropertyNode* propertyNode);
|
||||
HLAPropertyDataElement(const HLADataType* dataType, SGPropertyNode* propertyNode);
|
||||
HLAPropertyDataElement(const HLADataType* dataType);
|
||||
virtual ~HLAPropertyDataElement();
|
||||
|
||||
virtual void accept(HLADataElementVisitor& visitor);
|
||||
virtual void accept(HLAConstDataElementVisitor& visitor) const;
|
||||
|
||||
virtual bool encode(HLAEncodeStream& stream) const;
|
||||
virtual bool decode(HLADecodeStream& stream);
|
||||
|
||||
virtual const HLADataType* getDataType() const;
|
||||
virtual bool setDataType(const HLADataType* dataType);
|
||||
|
||||
void setPropertyNode(SGPropertyNode* propertyNode);
|
||||
SGPropertyNode* getPropertyNode();
|
||||
const SGPropertyNode* getPropertyNode() const;
|
||||
|
||||
private:
|
||||
HLADataElement*
|
||||
createDataElement(const SGSharedPtr<const HLADataType>& dataType, const SGSharedPtr<SGPropertyNode>& propertyNode);
|
||||
|
||||
class ScalarDecodeVisitor;
|
||||
class ScalarEncodeVisitor;
|
||||
class ScalarDataElement;
|
||||
class StringDecodeVisitor;
|
||||
class StringEncodeVisitor;
|
||||
class StringDataElement;
|
||||
class DataElementFactoryVisitor;
|
||||
|
||||
SGSharedPtr<const HLADataType> _dataType;
|
||||
SGSharedPtr<HLADataElement> _dataElement;
|
||||
SGSharedPtr<SGPropertyNode> _propertyNode;
|
||||
};
|
||||
|
||||
} // namespace simgear
|
||||
|
||||
#endif
|
||||
60
simgear/hla/HLARawDataElement.cxx
Normal file
60
simgear/hla/HLARawDataElement.cxx
Normal file
@@ -0,0 +1,60 @@
|
||||
// Copyright (C) 2009 - 2010 Mathias Froehlich - Mathias.Froehlich@web.de
|
||||
//
|
||||
// This library is free software; you can redistribute it and/or
|
||||
// modify it under the terms of the GNU Library General Public
|
||||
// License as published by the Free Software Foundation; either
|
||||
// version 2 of the License, or (at your option) any later version.
|
||||
//
|
||||
// This library is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
// Library General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program; if not, write to the Free Software
|
||||
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
//
|
||||
|
||||
#include "HLARawDataElement.hxx"
|
||||
|
||||
namespace simgear {
|
||||
|
||||
HLARawDataElement::HLARawDataElement(const HLADataType* dataType) :
|
||||
_dataType(dataType)
|
||||
{
|
||||
}
|
||||
|
||||
HLARawDataElement::~HLARawDataElement()
|
||||
{
|
||||
}
|
||||
|
||||
bool
|
||||
HLARawDataElement::encode(HLAEncodeStream& stream) const
|
||||
{
|
||||
stream.setData(_rtiData);
|
||||
stream.skip(_rtiData.size());
|
||||
return true;
|
||||
}
|
||||
|
||||
bool
|
||||
HLARawDataElement::decode(HLADecodeStream& stream)
|
||||
{
|
||||
_rtiData = stream.getData();
|
||||
stream.skip(_rtiData.size());
|
||||
return true;
|
||||
}
|
||||
|
||||
const HLADataType*
|
||||
HLARawDataElement::getDataType() const
|
||||
{
|
||||
return _dataType.get();
|
||||
}
|
||||
|
||||
bool
|
||||
HLARawDataElement::setDataType(const HLADataType* dataType)
|
||||
{
|
||||
_dataType = dataType;
|
||||
return true;
|
||||
}
|
||||
|
||||
}
|
||||
52
simgear/hla/HLARawDataElement.hxx
Normal file
52
simgear/hla/HLARawDataElement.hxx
Normal file
@@ -0,0 +1,52 @@
|
||||
// Copyright (C) 2009 - 2010 Mathias Froehlich - Mathias.Froehlich@web.de
|
||||
//
|
||||
// This library is free software; you can redistribute it and/or
|
||||
// modify it under the terms of the GNU Library General Public
|
||||
// License as published by the Free Software Foundation; either
|
||||
// version 2 of the License, or (at your option) any later version.
|
||||
//
|
||||
// This library is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
// Library General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program; if not, write to the Free Software
|
||||
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
//
|
||||
|
||||
#ifndef HLARawDataElement_hxx
|
||||
#define HLARawDataElement_hxx
|
||||
|
||||
#include "RTIData.hxx"
|
||||
#include "HLADataElement.hxx"
|
||||
#include "HLADataType.hxx"
|
||||
|
||||
namespace simgear {
|
||||
|
||||
class HLARawDataElement : public HLADataElement {
|
||||
public:
|
||||
HLARawDataElement(const HLADataType* dataType);
|
||||
virtual ~HLARawDataElement();
|
||||
|
||||
virtual bool encode(HLAEncodeStream& stream) const;
|
||||
virtual bool decode(HLADecodeStream& stream);
|
||||
|
||||
virtual const HLADataType* getDataType() const;
|
||||
virtual bool setDataType(const HLADataType* dataType);
|
||||
|
||||
const RTIData& getData() const
|
||||
{ return _rtiData; }
|
||||
RTIData& getData()
|
||||
{ return _rtiData; }
|
||||
void setData(const RTIData& rtiData)
|
||||
{ _rtiData = rtiData; }
|
||||
|
||||
protected:
|
||||
SGSharedPtr<const HLADataType> _dataType;
|
||||
RTIData _rtiData;
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
#endif
|
||||
169
simgear/hla/HLAVariantDataElement.cxx
Normal file
169
simgear/hla/HLAVariantDataElement.cxx
Normal file
@@ -0,0 +1,169 @@
|
||||
// Copyright (C) 2009 - 2010 Mathias Froehlich - Mathias.Froehlich@web.de
|
||||
//
|
||||
// This library is free software; you can redistribute it and/or
|
||||
// modify it under the terms of the GNU Library General Public
|
||||
// License as published by the Free Software Foundation; either
|
||||
// version 2 of the License, or (at your option) any later version.
|
||||
//
|
||||
// This library is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
// Library General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program; if not, write to the Free Software
|
||||
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
//
|
||||
|
||||
#include "HLAVariantDataElement.hxx"
|
||||
|
||||
#include <simgear/debug/logstream.hxx>
|
||||
|
||||
#include "HLADataElementVisitor.hxx"
|
||||
|
||||
namespace simgear {
|
||||
|
||||
HLAAbstractVariantDataElement::HLAAbstractVariantDataElement(const HLAVariantDataType* dataType) :
|
||||
_dataType(dataType)
|
||||
{
|
||||
}
|
||||
|
||||
HLAAbstractVariantDataElement::~HLAAbstractVariantDataElement()
|
||||
{
|
||||
}
|
||||
|
||||
void
|
||||
HLAAbstractVariantDataElement::accept(HLADataElementVisitor& visitor)
|
||||
{
|
||||
visitor.apply(*this);
|
||||
}
|
||||
|
||||
void
|
||||
HLAAbstractVariantDataElement::accept(HLAConstDataElementVisitor& visitor) const
|
||||
{
|
||||
visitor.apply(*this);
|
||||
}
|
||||
|
||||
bool
|
||||
HLAAbstractVariantDataElement::decode(HLADecodeStream& stream)
|
||||
{
|
||||
if (!_dataType.valid())
|
||||
return false;
|
||||
return _dataType->decode(stream, *this);
|
||||
}
|
||||
|
||||
bool
|
||||
HLAAbstractVariantDataElement::encode(HLAEncodeStream& stream) const
|
||||
{
|
||||
if (!_dataType.valid())
|
||||
return false;
|
||||
return _dataType->encode(stream, *this);
|
||||
}
|
||||
|
||||
const HLAVariantDataType*
|
||||
HLAAbstractVariantDataElement::getDataType() const
|
||||
{
|
||||
return _dataType.get();
|
||||
}
|
||||
|
||||
bool
|
||||
HLAAbstractVariantDataElement::setDataType(const HLADataType* dataType)
|
||||
{
|
||||
const HLAVariantDataType* variantDataType = dataType->toVariantDataType();
|
||||
if (!variantDataType) {
|
||||
SG_LOG(SG_NETWORK, SG_WARN, "HLAVariantDataType: unable to set data type!");
|
||||
return false;
|
||||
}
|
||||
setDataType(variantDataType);
|
||||
return true;
|
||||
}
|
||||
|
||||
void
|
||||
HLAAbstractVariantDataElement::setDataType(const HLAVariantDataType* dataType)
|
||||
{
|
||||
_dataType = dataType;
|
||||
}
|
||||
|
||||
std::string
|
||||
HLAAbstractVariantDataElement::getAlternativeName() const
|
||||
{
|
||||
if (!_dataType.valid())
|
||||
return std::string();
|
||||
return _dataType->getAlternativeName(getAlternativeIndex());
|
||||
}
|
||||
|
||||
const HLADataType*
|
||||
HLAAbstractVariantDataElement::getAlternativeDataType() const
|
||||
{
|
||||
if (!_dataType.valid())
|
||||
return 0;
|
||||
return _dataType->getAlternativeDataType(getAlternativeIndex());
|
||||
}
|
||||
|
||||
|
||||
HLAVariantDataElement::DataElementFactory::~DataElementFactory()
|
||||
{
|
||||
}
|
||||
|
||||
HLAVariantDataElement::HLAVariantDataElement(const HLAVariantDataType* dataType) :
|
||||
HLAAbstractVariantDataElement(dataType),
|
||||
_alternativeIndex(~0u)
|
||||
{
|
||||
}
|
||||
|
||||
HLAVariantDataElement::~HLAVariantDataElement()
|
||||
{
|
||||
}
|
||||
|
||||
bool
|
||||
HLAVariantDataElement::setAlternativeIndex(unsigned index)
|
||||
{
|
||||
if (_alternativeIndex == index)
|
||||
return true;
|
||||
SGSharedPtr<HLADataElement> dataElement = newElement(index);
|
||||
if (!dataElement.valid())
|
||||
return false;
|
||||
_dataElement.swap(dataElement);
|
||||
_alternativeIndex = index;
|
||||
return true;
|
||||
}
|
||||
|
||||
bool
|
||||
HLAVariantDataElement::decodeAlternative(HLADecodeStream& stream)
|
||||
{
|
||||
return _dataElement->decode(stream);
|
||||
}
|
||||
|
||||
unsigned
|
||||
HLAVariantDataElement::getAlternativeIndex() const
|
||||
{
|
||||
return _alternativeIndex;
|
||||
}
|
||||
|
||||
bool
|
||||
HLAVariantDataElement::encodeAlternative(HLAEncodeStream& stream) const
|
||||
{
|
||||
return _dataElement->encode(stream);
|
||||
}
|
||||
|
||||
void
|
||||
HLAVariantDataElement::setDataElementFactory(HLAVariantDataElement::DataElementFactory* dataElementFactory)
|
||||
{
|
||||
_dataElementFactory = dataElementFactory;
|
||||
}
|
||||
|
||||
HLAVariantDataElement::DataElementFactory*
|
||||
HLAVariantDataElement::getDataElementFactory()
|
||||
{
|
||||
return _dataElementFactory;
|
||||
}
|
||||
|
||||
HLADataElement*
|
||||
HLAVariantDataElement::newElement(unsigned index)
|
||||
{
|
||||
if (!_dataElementFactory.valid())
|
||||
return 0;
|
||||
return _dataElementFactory->createElement(*this, index);
|
||||
}
|
||||
|
||||
}
|
||||
85
simgear/hla/HLAVariantDataElement.hxx
Normal file
85
simgear/hla/HLAVariantDataElement.hxx
Normal file
@@ -0,0 +1,85 @@
|
||||
// Copyright (C) 2009 - 2010 Mathias Froehlich - Mathias.Froehlich@web.de
|
||||
//
|
||||
// This library is free software; you can redistribute it and/or
|
||||
// modify it under the terms of the GNU Library General Public
|
||||
// License as published by the Free Software Foundation; either
|
||||
// version 2 of the License, or (at your option) any later version.
|
||||
//
|
||||
// This library is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
// Library General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program; if not, write to the Free Software
|
||||
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
//
|
||||
|
||||
#ifndef HLAVariantDataElement_hxx
|
||||
#define HLAVariantDataElement_hxx
|
||||
|
||||
#include <string>
|
||||
#include <simgear/structure/SGSharedPtr.hxx>
|
||||
#include "HLADataElement.hxx"
|
||||
#include "HLAVariantDataType.hxx"
|
||||
|
||||
namespace simgear {
|
||||
|
||||
class HLAAbstractVariantDataElement : public HLADataElement {
|
||||
public:
|
||||
HLAAbstractVariantDataElement(const HLAVariantDataType* dataType);
|
||||
virtual ~HLAAbstractVariantDataElement();
|
||||
|
||||
virtual void accept(HLADataElementVisitor& visitor);
|
||||
virtual void accept(HLAConstDataElementVisitor& visitor) const;
|
||||
|
||||
virtual bool decode(HLADecodeStream& stream);
|
||||
virtual bool encode(HLAEncodeStream& stream) const;
|
||||
|
||||
virtual const HLAVariantDataType* getDataType() const;
|
||||
virtual bool setDataType(const HLADataType* dataType);
|
||||
void setDataType(const HLAVariantDataType* dataType);
|
||||
|
||||
std::string getAlternativeName() const;
|
||||
const HLADataType* getAlternativeDataType() const;
|
||||
|
||||
virtual bool setAlternativeIndex(unsigned index) = 0;
|
||||
virtual bool decodeAlternative(HLADecodeStream& stream) = 0;
|
||||
virtual unsigned getAlternativeIndex() const = 0;
|
||||
virtual bool encodeAlternative(HLAEncodeStream& stream) const = 0;
|
||||
|
||||
private:
|
||||
SGSharedPtr<const HLAVariantDataType> _dataType;
|
||||
};
|
||||
|
||||
class HLAVariantDataElement : public HLAAbstractVariantDataElement {
|
||||
public:
|
||||
HLAVariantDataElement(const HLAVariantDataType* dataType);
|
||||
virtual ~HLAVariantDataElement();
|
||||
|
||||
virtual bool setAlternativeIndex(unsigned index);
|
||||
virtual bool decodeAlternative(HLADecodeStream& stream);
|
||||
virtual unsigned getAlternativeIndex() const;
|
||||
virtual bool encodeAlternative(HLAEncodeStream& stream) const;
|
||||
|
||||
class DataElementFactory : public SGReferenced {
|
||||
public:
|
||||
virtual ~DataElementFactory();
|
||||
virtual HLADataElement* createElement(const HLAVariantDataElement&, unsigned) = 0;
|
||||
};
|
||||
|
||||
void setDataElementFactory(DataElementFactory* dataElementFactory);
|
||||
DataElementFactory* getDataElementFactory();
|
||||
|
||||
private:
|
||||
HLADataElement* newElement(unsigned index);
|
||||
|
||||
SGSharedPtr<HLADataElement> _dataElement;
|
||||
unsigned _alternativeIndex;
|
||||
|
||||
SGSharedPtr<DataElementFactory> _dataElementFactory;
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
#endif
|
||||
101
simgear/hla/HLAVariantDataType.cxx
Normal file
101
simgear/hla/HLAVariantDataType.cxx
Normal file
@@ -0,0 +1,101 @@
|
||||
// Copyright (C) 2009 - 2010 Mathias Froehlich - Mathias.Froehlich@web.de
|
||||
//
|
||||
// This library is free software; you can redistribute it and/or
|
||||
// modify it under the terms of the GNU Library General Public
|
||||
// License as published by the Free Software Foundation; either
|
||||
// version 2 of the License, or (at your option) any later version.
|
||||
//
|
||||
// This library is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
// Library General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program; if not, write to the Free Software
|
||||
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
//
|
||||
|
||||
#include "HLAVariantDataType.hxx"
|
||||
|
||||
#include "HLADataTypeVisitor.hxx"
|
||||
#include "HLAVariantDataElement.hxx"
|
||||
|
||||
namespace simgear {
|
||||
|
||||
HLAVariantDataType::HLAVariantDataType(const std::string& name) :
|
||||
HLADataType(name)
|
||||
{
|
||||
}
|
||||
|
||||
HLAVariantDataType::~HLAVariantDataType()
|
||||
{
|
||||
}
|
||||
|
||||
void
|
||||
HLAVariantDataType::accept(HLADataTypeVisitor& visitor) const
|
||||
{
|
||||
visitor.apply(*this);
|
||||
}
|
||||
|
||||
const HLAVariantDataType*
|
||||
HLAVariantDataType::toVariantDataType() const
|
||||
{
|
||||
return this;
|
||||
}
|
||||
|
||||
bool
|
||||
HLAVariantDataType::decode(HLADecodeStream& stream, HLAAbstractVariantDataElement& value) const
|
||||
{
|
||||
if (!stream.alignOffsetForSize(getAlignment()))
|
||||
return false;
|
||||
if (!_enumeratedDataType.valid())
|
||||
return false;
|
||||
unsigned index = ~0u;
|
||||
if (!_enumeratedDataType->decode(stream, index))
|
||||
return false;
|
||||
if (!value.setAlternativeIndex(index))
|
||||
return false;
|
||||
if (!value.decodeAlternative(stream))
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
bool
|
||||
HLAVariantDataType::encode(HLAEncodeStream& stream, const HLAAbstractVariantDataElement& value) const
|
||||
{
|
||||
if (!stream.alignOffsetForSize(getAlignment()))
|
||||
return false;
|
||||
if (!_enumeratedDataType.valid())
|
||||
return false;
|
||||
unsigned index = value.getAlternativeIndex();
|
||||
if (!_enumeratedDataType->encode(stream, index))
|
||||
return false;
|
||||
if (!value.encodeAlternative(stream))
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
void
|
||||
HLAVariantDataType::setEnumeratedDataType(HLAEnumeratedDataType* dataType)
|
||||
{
|
||||
_enumeratedDataType = dataType;
|
||||
}
|
||||
|
||||
bool
|
||||
HLAVariantDataType::addAlternative(const std::string& name, const std::string& enumerator,
|
||||
const HLADataType* dataType, const std::string& semantics)
|
||||
{
|
||||
if (!_enumeratedDataType.valid())
|
||||
return false;
|
||||
unsigned index = _enumeratedDataType->getIndex(enumerator);
|
||||
if (_enumeratedDataType->getNumEnumerators() <= index)
|
||||
return false;
|
||||
_alternativeList.resize(_enumeratedDataType->getNumEnumerators());
|
||||
_alternativeList[index]._name = name;
|
||||
_alternativeList[index]._dataType = dataType;
|
||||
_alternativeList[index]._semantics = semantics;
|
||||
setAlignment(SGMisc<unsigned>::max(getAlignment(), dataType->getAlignment()));
|
||||
return true;
|
||||
}
|
||||
|
||||
} // namespace simgear
|
||||
102
simgear/hla/HLAVariantDataType.hxx
Normal file
102
simgear/hla/HLAVariantDataType.hxx
Normal file
@@ -0,0 +1,102 @@
|
||||
// Copyright (C) 2009 - 2010 Mathias Froehlich - Mathias.Froehlich@web.de
|
||||
//
|
||||
// This library is free software; you can redistribute it and/or
|
||||
// modify it under the terms of the GNU Library General Public
|
||||
// License as published by the Free Software Foundation; either
|
||||
// version 2 of the License, or (at your option) any later version.
|
||||
//
|
||||
// This library is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
// Library General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program; if not, write to the Free Software
|
||||
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
//
|
||||
|
||||
#ifndef HLAVariantDataType_hxx
|
||||
#define HLAVariantDataType_hxx
|
||||
|
||||
#include <string>
|
||||
#include <vector>
|
||||
#include "simgear/structure/SGSharedPtr.hxx"
|
||||
#include "HLADataType.hxx"
|
||||
#include "HLAEnumeratedDataType.hxx"
|
||||
|
||||
namespace simgear {
|
||||
|
||||
class HLAAbstractVariantDataElement;
|
||||
|
||||
class HLAVariantDataType : public HLADataType {
|
||||
public:
|
||||
HLAVariantDataType(const std::string& name = "HLAVariantDataType");
|
||||
virtual ~HLAVariantDataType();
|
||||
|
||||
virtual void accept(HLADataTypeVisitor& visitor) const;
|
||||
|
||||
virtual const HLAVariantDataType* toVariantDataType() const;
|
||||
|
||||
virtual bool decode(HLADecodeStream& stream, HLAAbstractVariantDataElement& value) const;
|
||||
virtual bool encode(HLAEncodeStream& stream, const HLAAbstractVariantDataElement& value) const;
|
||||
|
||||
const HLAEnumeratedDataType* getEnumeratedDataType() const
|
||||
{ return _enumeratedDataType.get(); }
|
||||
void setEnumeratedDataType(HLAEnumeratedDataType* dataType);
|
||||
|
||||
bool addAlternative(const std::string& name, const std::string& enumerator,
|
||||
const HLADataType* dataType, const std::string& semantics);
|
||||
|
||||
unsigned getNumAlternatives() const
|
||||
{ return _alternativeList.size(); }
|
||||
|
||||
unsigned getAlternativeIndex(const std::string& enumerator) const
|
||||
{
|
||||
if (!_enumeratedDataType.valid())
|
||||
return ~unsigned(0);
|
||||
return _enumeratedDataType->getIndex(enumerator);
|
||||
}
|
||||
|
||||
const HLADataType* getAlternativeDataType(unsigned index) const
|
||||
{
|
||||
if (_alternativeList.size() <= index)
|
||||
return 0;
|
||||
return _alternativeList[index]._dataType.get();
|
||||
}
|
||||
const HLADataType* getAlternativeDataType(const std::string& enumerator) const
|
||||
{ return getAlternativeDataType(getAlternativeIndex(enumerator)); }
|
||||
|
||||
std::string getAlternativeName(unsigned index) const
|
||||
{
|
||||
if (_alternativeList.size() <= index)
|
||||
return std::string();
|
||||
return _alternativeList[index]._name;
|
||||
}
|
||||
std::string getAlternativeName(const std::string& enumerator) const
|
||||
{ return getAlternativeName(getAlternativeIndex(enumerator)); }
|
||||
|
||||
std::string getAlternativeSemantics(unsigned index) const
|
||||
{
|
||||
if (_alternativeList.size() <= index)
|
||||
return std::string();
|
||||
return _alternativeList[index]._semantics;
|
||||
}
|
||||
std::string getAlternativeSemantics(const std::string& enumerator) const
|
||||
{ return getAlternativeSemantics(getAlternativeIndex(enumerator)); }
|
||||
|
||||
private:
|
||||
SGSharedPtr<HLAEnumeratedDataType> _enumeratedDataType;
|
||||
|
||||
struct Alternative {
|
||||
std::string _name;
|
||||
SGSharedPtr<const HLADataType> _dataType;
|
||||
std::string _semantics;
|
||||
};
|
||||
|
||||
typedef std::vector<Alternative> AlternativeList;
|
||||
AlternativeList _alternativeList;
|
||||
};
|
||||
|
||||
} // namespace simgear
|
||||
|
||||
#endif
|
||||
487
simgear/hla/RTI13Ambassador.hxx
Normal file
487
simgear/hla/RTI13Ambassador.hxx
Normal file
@@ -0,0 +1,487 @@
|
||||
// Copyright (C) 2009 - 2010 Mathias Froehlich - Mathias.Froehlich@web.de
|
||||
//
|
||||
// This library is free software; you can redistribute it and/or
|
||||
// modify it under the terms of the GNU Library General Public
|
||||
// License as published by the Free Software Foundation; either
|
||||
// version 2 of the License, or (at your option) any later version.
|
||||
//
|
||||
// This library is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
// Library General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program; if not, write to the Free Software
|
||||
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
//
|
||||
|
||||
#ifndef RTI13Ambassador_hxx
|
||||
#define RTI13Ambassador_hxx
|
||||
|
||||
#include <cstdlib>
|
||||
#include <list>
|
||||
#include <memory>
|
||||
#include <vector>
|
||||
#include <map>
|
||||
#include <set>
|
||||
|
||||
#ifndef RTI_USES_STD_FSTREAM
|
||||
#define RTI_USES_STD_FSTREAM
|
||||
#endif
|
||||
|
||||
#include <RTI.hh>
|
||||
#include <fedtime.hh>
|
||||
|
||||
#include <simgear/debug/logstream.hxx>
|
||||
#include <simgear/structure/SGWeakReferenced.hxx>
|
||||
#include <simgear/structure/SGSharedPtr.hxx>
|
||||
#include <simgear/structure/SGWeakPtr.hxx>
|
||||
#include <simgear/timing/timestamp.hxx>
|
||||
|
||||
#include "RTIObjectClass.hxx"
|
||||
#include "RTIData.hxx"
|
||||
#include "RTI13Federate.hxx"
|
||||
#include "RTI13ObjectInstance.hxx"
|
||||
|
||||
namespace simgear {
|
||||
|
||||
class RTI13Federate;
|
||||
|
||||
class RTI13Ambassador : public SGReferenced {
|
||||
public:
|
||||
~RTI13Ambassador()
|
||||
{ }
|
||||
|
||||
void createFederationExecution(const std::string& name, const std::string& objectModel)
|
||||
{ _rtiAmbassador.createFederationExecution(name.c_str(), objectModel.c_str()); }
|
||||
void destroyFederationExecution(const std::string& name)
|
||||
{ _rtiAmbassador.destroyFederationExecution(name.c_str()); }
|
||||
|
||||
RTI::FederateHandle joinFederationExecution(const std::string& federate, const std::string& federation, RTI::FederateAmbassador* federateAmbassador)
|
||||
{ return _rtiAmbassador.joinFederationExecution(federate.c_str(), federation.c_str(), federateAmbassador); }
|
||||
void resignFederationExecution()
|
||||
{ _rtiAmbassador.resignFederationExecution(RTI::DELETE_OBJECTS_AND_RELEASE_ATTRIBUTES); }
|
||||
|
||||
void registerFederationSynchronizationPoint(const std::string& label, const RTIData& tag)
|
||||
{ _rtiAmbassador.registerFederationSynchronizationPoint(label.c_str(), tag.data()); }
|
||||
void synchronizationPointAchieved(const std::string& label)
|
||||
{ _rtiAmbassador.synchronizationPointAchieved(label.c_str()); }
|
||||
|
||||
void publishObjectClass(const RTI::ObjectClassHandle& handle, const RTI::AttributeHandleSet& attributeHandleSet)
|
||||
{ _rtiAmbassador.publishObjectClass(handle, attributeHandleSet); }
|
||||
void unpublishObjectClass(const RTI::ObjectClassHandle& handle)
|
||||
{ _rtiAmbassador.unpublishObjectClass(handle); }
|
||||
void subscribeObjectClassAttributes(const RTI::ObjectClassHandle& handle, const RTI::AttributeHandleSet& attributeHandleSet, bool active)
|
||||
{ _rtiAmbassador.subscribeObjectClassAttributes(handle, attributeHandleSet, active ? RTI::RTI_TRUE : RTI::RTI_FALSE); }
|
||||
void unsubscribeObjectClass(const RTI::ObjectClassHandle& handle)
|
||||
{ _rtiAmbassador.unsubscribeObjectClass(handle); }
|
||||
|
||||
RTI::ObjectHandle registerObjectInstance(const RTI::ObjectClassHandle& handle)
|
||||
{ return _rtiAmbassador.registerObjectInstance(handle); }
|
||||
void updateAttributeValues(const RTI::ObjectHandle& objectHandle, const RTI::AttributeHandleValuePairSet& attributeValues,
|
||||
const SGTimeStamp& timeStamp, const RTIData& tag)
|
||||
{ _rtiAmbassador.updateAttributeValues(objectHandle, attributeValues, toFedTime(timeStamp), tag.data()); }
|
||||
void updateAttributeValues(const RTI::ObjectHandle& objectHandle, const RTI::AttributeHandleValuePairSet& attributeValues, const RTIData& tag)
|
||||
{ _rtiAmbassador.updateAttributeValues(objectHandle, attributeValues, tag.data()); }
|
||||
|
||||
// RTI::EventRetractionHandle sendInteraction(RTI::InteractionClassHandle interactionClassHandle, const RTI::ParameterHandleValuePairSet& parameters, const RTI::FedTime& fedTime, const RTIData& tag)
|
||||
// { return _rtiAmbassador.sendInteraction(interactionClassHandle, parameters, fedTime, tag.data()); }
|
||||
// void sendInteraction(RTI::InteractionClassHandle interactionClassHandle, const RTI::ParameterHandleValuePairSet& parameters, const RTIData& tag)
|
||||
// { _rtiAmbassador.sendInteraction(interactionClassHandle, parameters, tag.data()); }
|
||||
|
||||
void deleteObjectInstance(const RTI::ObjectHandle& objectHandle, const SGTimeStamp& timeStamp, const RTIData& tag)
|
||||
{ /* RTI::EventRetractionHandle h = */ _rtiAmbassador.deleteObjectInstance(objectHandle, toFedTime(timeStamp), tag.data()); }
|
||||
void deleteObjectInstance(const RTI::ObjectHandle& objectHandle, const RTIData& tag)
|
||||
{ _rtiAmbassador.deleteObjectInstance(objectHandle, tag.data()); }
|
||||
void localDeleteObjectInstance(const RTI::ObjectHandle& objectHandle)
|
||||
{ _rtiAmbassador.localDeleteObjectInstance(objectHandle); }
|
||||
|
||||
void requestObjectAttributeValueUpdate(const RTI::ObjectHandle& handle, const RTI::AttributeHandleSet& attributeHandleSet)
|
||||
{ _rtiAmbassador.requestObjectAttributeValueUpdate(handle, attributeHandleSet); }
|
||||
void requestClassAttributeValueUpdate(const RTI::ObjectClassHandle& handle, const RTI::AttributeHandleSet& attributeHandleSet)
|
||||
{ _rtiAmbassador.requestClassAttributeValueUpdate(handle, attributeHandleSet); }
|
||||
|
||||
// Ownership Management -------------------
|
||||
|
||||
// bool unconditionalAttributeOwnershipDivestiture(const RTIHandle& objectHandle, const RTIHandleSet& attributeHandles)
|
||||
// {
|
||||
// try {
|
||||
// std::auto_ptr<RTI::AttributeHandleSet> attributeHandleSet(RTI::AttributeHandleSetFactory::create(attributeHandles.size()));
|
||||
// for (RTIHandleSet::const_iterator i = attributeHandles.begin(); i != attributeHandles.end(); ++i)
|
||||
// attributeHandleSet->add(*i);
|
||||
// _rtiAmbassador.unconditionalAttributeOwnershipDivestiture(objectHandle, *attributeHandleSet);
|
||||
// return true;
|
||||
// } catch (RTI::ObjectNotKnown& e) {
|
||||
// } catch (RTI::AttributeNotDefined& e) {
|
||||
// } catch (RTI::AttributeNotOwned& e) {
|
||||
// } catch (RTI::FederateNotExecutionMember& e) {
|
||||
// } catch (RTI::ConcurrentAccessAttempted& e) {
|
||||
// } catch (RTI::SaveInProgress& e) {
|
||||
// } catch (RTI::RestoreInProgress& e) {
|
||||
// } catch (RTI::RTIinternalError& e) {
|
||||
// }
|
||||
// return false;
|
||||
// }
|
||||
// bool negotiatedAttributeOwnershipDivestiture(const RTIHandle& objectHandle, const RTIHandleSet& attributeHandles, const RTIData& tag)
|
||||
// {
|
||||
// try {
|
||||
// std::auto_ptr<RTI::AttributeHandleSet> attributeHandleSet(RTI::AttributeHandleSetFactory::create(attributeHandles.size()));
|
||||
// for (RTIHandleSet::const_iterator i = attributeHandles.begin(); i != attributeHandles.end(); ++i)
|
||||
// attributeHandleSet->add(*i);
|
||||
// _rtiAmbassador.negotiatedAttributeOwnershipDivestiture(objectHandle, *attributeHandleSet, tag.data());
|
||||
// return true;
|
||||
// } catch (RTI::ObjectNotKnown& e) {
|
||||
// } catch (RTI::AttributeNotDefined& e) {
|
||||
// } catch (RTI::AttributeNotOwned& e) {
|
||||
// } catch (RTI::AttributeAlreadyBeingDivested& e) {
|
||||
// } catch (RTI::FederateNotExecutionMember& e) {
|
||||
// } catch (RTI::ConcurrentAccessAttempted& e) {
|
||||
// } catch (RTI::SaveInProgress& e) {
|
||||
// } catch (RTI::RestoreInProgress& e) {
|
||||
// } catch (RTI::RTIinternalError& e) {
|
||||
// }
|
||||
// return false;
|
||||
// }
|
||||
// bool attributeOwnershipAcquisition(const RTIHandle& objectHandle, const RTIHandleSet& attributeHandles, const RTIData& tag)
|
||||
// {
|
||||
// try {
|
||||
// std::auto_ptr<RTI::AttributeHandleSet> attributeHandleSet(RTI::AttributeHandleSetFactory::create(attributeHandles.size()));
|
||||
// for (RTIHandleSet::const_iterator i = attributeHandles.begin(); i != attributeHandles.end(); ++i)
|
||||
// attributeHandleSet->add(*i);
|
||||
// _rtiAmbassador.attributeOwnershipAcquisition(objectHandle, *attributeHandleSet, tag.data());
|
||||
// return true;
|
||||
// } catch (RTI::ObjectNotKnown& e) {
|
||||
// } catch (RTI::ObjectClassNotPublished& e) {
|
||||
// } catch (RTI::AttributeNotDefined& e) {
|
||||
// } catch (RTI::AttributeNotPublished& e) {
|
||||
// } catch (RTI::FederateOwnsAttributes& e) {
|
||||
// } catch (RTI::FederateNotExecutionMember& e) {
|
||||
// } catch (RTI::ConcurrentAccessAttempted& e) {
|
||||
// } catch (RTI::SaveInProgress& e) {
|
||||
// } catch (RTI::RestoreInProgress& e) {
|
||||
// } catch (RTI::RTIinternalError& e) {
|
||||
// }
|
||||
// return false;
|
||||
// }
|
||||
// bool attributeOwnershipAcquisitionIfAvailable(const RTIHandle& objectHandle, const RTIHandleSet& attributeHandles)
|
||||
// {
|
||||
// try {
|
||||
// std::auto_ptr<RTI::AttributeHandleSet> attributeHandleSet(RTI::AttributeHandleSetFactory::create(attributeHandles.size()));
|
||||
// for (RTIHandleSet::const_iterator i = attributeHandles.begin(); i != attributeHandles.end(); ++i)
|
||||
// attributeHandleSet->add(*i);
|
||||
// _rtiAmbassador.attributeOwnershipAcquisitionIfAvailable(objectHandle, *attributeHandleSet);
|
||||
// return true;
|
||||
// } catch (RTI::ObjectNotKnown& e) {
|
||||
// } catch (RTI::ObjectClassNotPublished& e) {
|
||||
// } catch (RTI::AttributeNotDefined& e) {
|
||||
// } catch (RTI::AttributeNotPublished& e) {
|
||||
// } catch (RTI::FederateOwnsAttributes& e) {
|
||||
// } catch (RTI::AttributeAlreadyBeingAcquired& e) {
|
||||
// } catch (RTI::FederateNotExecutionMember& e) {
|
||||
// } catch (RTI::ConcurrentAccessAttempted& e) {
|
||||
// } catch (RTI::SaveInProgress& e) {
|
||||
// } catch (RTI::RestoreInProgress& e) {
|
||||
// } catch (RTI::RTIinternalError& e) {
|
||||
// }
|
||||
// return false;
|
||||
// }
|
||||
// RTIHandleSet attributeOwnershipReleaseResponse(const RTIHandle& objectHandle, const RTIHandleSet& attributeHandles)
|
||||
// {
|
||||
// try {
|
||||
// std::auto_ptr<RTI::AttributeHandleSet> attributeHandleSet(RTI::AttributeHandleSetFactory::create(attributeHandles.size()));
|
||||
// for (RTIHandleSet::const_iterator i = attributeHandles.begin(); i != attributeHandles.end(); ++i)
|
||||
// attributeHandleSet->add(*i);
|
||||
// attributeHandleSet.reset(_rtiAmbassador.attributeOwnershipReleaseResponse(objectHandle, *attributeHandleSet));
|
||||
// RTIHandleSet handleSet;
|
||||
// RTI::ULong numAttribs = attributeHandleSet->size();
|
||||
// for (RTI::ULong i = 0; i < numAttribs; ++i)
|
||||
// handleSet.insert(attributeHandleSet->getHandle(i));
|
||||
// return handleSet;
|
||||
// } catch (RTI::ObjectNotKnown& e) {
|
||||
// } catch (RTI::AttributeNotDefined& e) {
|
||||
// } catch (RTI::AttributeNotOwned& e) {
|
||||
// } catch (RTI::FederateWasNotAskedToReleaseAttribute& e) {
|
||||
// } catch (RTI::FederateNotExecutionMember& e) {
|
||||
// } catch (RTI::ConcurrentAccessAttempted& e) {
|
||||
// } catch (RTI::SaveInProgress& e) {
|
||||
// } catch (RTI::RestoreInProgress& e) {
|
||||
// } catch (RTI::RTIinternalError& e) {
|
||||
// }
|
||||
// return RTIHandleSet();
|
||||
// }
|
||||
// bool cancelNegotiatedAttributeOwnershipDivestiture(const RTIHandle& objectHandle, const RTIHandleSet& attributeHandles)
|
||||
// {
|
||||
// try {
|
||||
// std::auto_ptr<RTI::AttributeHandleSet> attributeHandleSet(RTI::AttributeHandleSetFactory::create(attributeHandles.size()));
|
||||
// for (RTIHandleSet::const_iterator i = attributeHandles.begin(); i != attributeHandles.end(); ++i)
|
||||
// attributeHandleSet->add(*i);
|
||||
// _rtiAmbassador.cancelNegotiatedAttributeOwnershipDivestiture(objectHandle, *attributeHandleSet);
|
||||
// return true;
|
||||
// } catch (RTI::ObjectNotKnown& e) {
|
||||
// } catch (RTI::AttributeNotDefined& e) {
|
||||
// } catch (RTI::AttributeNotOwned& e) {
|
||||
// } catch (RTI::AttributeDivestitureWasNotRequested& e) {
|
||||
// } catch (RTI::FederateNotExecutionMember& e) {
|
||||
// } catch (RTI::ConcurrentAccessAttempted& e) {
|
||||
// } catch (RTI::SaveInProgress& e) {
|
||||
// } catch (RTI::RestoreInProgress& e) {
|
||||
// } catch (RTI::RTIinternalError& e) {
|
||||
// }
|
||||
// return false;
|
||||
// }
|
||||
// bool cancelAttributeOwnershipAcquisition(const RTIHandle& objectHandle, const RTIHandleSet& attributeHandles)
|
||||
// {
|
||||
// try {
|
||||
// std::auto_ptr<RTI::AttributeHandleSet> attributeHandleSet(RTI::AttributeHandleSetFactory::create(attributeHandles.size()));
|
||||
// for (RTIHandleSet::const_iterator i = attributeHandles.begin(); i != attributeHandles.end(); ++i)
|
||||
// attributeHandleSet->add(*i);
|
||||
// _rtiAmbassador.cancelAttributeOwnershipAcquisition(objectHandle, *attributeHandleSet);
|
||||
// return true;
|
||||
// } catch (RTI::ObjectNotKnown& e) {
|
||||
// } catch (RTI::AttributeNotDefined& e) {
|
||||
// } catch (RTI::AttributeAlreadyOwned& e) {
|
||||
// } catch (RTI::AttributeAcquisitionWasNotRequested& e) {
|
||||
// } catch (RTI::FederateNotExecutionMember& e) {
|
||||
// } catch (RTI::ConcurrentAccessAttempted& e) {
|
||||
// } catch (RTI::SaveInProgress& e) {
|
||||
// } catch (RTI::RestoreInProgress& e) {
|
||||
// } catch (RTI::RTIinternalError& e) {
|
||||
// }
|
||||
// return false;
|
||||
// }
|
||||
// bool queryAttributeOwnership(const RTIHandle& objectHandle, const RTIHandle& attributeHandle)
|
||||
// {
|
||||
// try {
|
||||
// _rtiAmbassador.queryAttributeOwnership(objectHandle, attributeHandle);
|
||||
// return true;
|
||||
// } catch (RTI::ObjectNotKnown& e) {
|
||||
// } catch (RTI::AttributeNotDefined& e) {
|
||||
// } catch (RTI::FederateNotExecutionMember& e) {
|
||||
// } catch (RTI::ConcurrentAccessAttempted& e) {
|
||||
// } catch (RTI::SaveInProgress& e) {
|
||||
// } catch (RTI::RestoreInProgress& e) {
|
||||
// } catch (RTI::RTIinternalError& e) {
|
||||
// }
|
||||
// return false;
|
||||
// }
|
||||
// bool isAttributeOwnedByFederate(const RTIHandle& objectHandle, const RTIHandle& attributeHandle)
|
||||
// {
|
||||
// try {
|
||||
// return _rtiAmbassador.isAttributeOwnedByFederate(objectHandle, attributeHandle);
|
||||
// } catch (RTI::ObjectNotKnown& e) {
|
||||
// } catch (RTI::AttributeNotDefined& e) {
|
||||
// } catch (RTI::FederateNotExecutionMember& e) {
|
||||
// } catch (RTI::ConcurrentAccessAttempted& e) {
|
||||
// } catch (RTI::SaveInProgress& e) {
|
||||
// } catch (RTI::RestoreInProgress& e) {
|
||||
// } catch (RTI::RTIinternalError& e) {
|
||||
// }
|
||||
// return false;
|
||||
// }
|
||||
|
||||
/// Time Management
|
||||
|
||||
void enableTimeRegulation(const SGTimeStamp& lookahead)
|
||||
{
|
||||
RTIfedTime federateTime;
|
||||
federateTime.setZero();
|
||||
_rtiAmbassador.enableTimeRegulation(federateTime, toFedTime(lookahead));
|
||||
}
|
||||
void disableTimeRegulation()
|
||||
{ _rtiAmbassador.disableTimeRegulation();}
|
||||
|
||||
void enableTimeConstrained()
|
||||
{ _rtiAmbassador.enableTimeConstrained(); }
|
||||
void disableTimeConstrained()
|
||||
{ _rtiAmbassador.disableTimeConstrained(); }
|
||||
|
||||
void timeAdvanceRequest(const SGTimeStamp& time)
|
||||
{ _rtiAmbassador.timeAdvanceRequest(toFedTime(time)); }
|
||||
void timeAdvanceRequestAvailable(const SGTimeStamp& time)
|
||||
{ _rtiAmbassador.timeAdvanceRequestAvailable(toFedTime(time)); }
|
||||
void flushQueueRequest(const SGTimeStamp& time)
|
||||
{ _rtiAmbassador.flushQueueRequest(toFedTime(time)); }
|
||||
|
||||
bool queryGALT(SGTimeStamp& timeStamp)
|
||||
{
|
||||
RTIfedTime fedTime;
|
||||
fedTime.setPositiveInfinity();
|
||||
_rtiAmbassador.queryLBTS(fedTime);
|
||||
if (fedTime.isPositiveInfinity())
|
||||
return false;
|
||||
timeStamp = toTimeStamp(fedTime);
|
||||
return true;
|
||||
}
|
||||
bool queryLITS(SGTimeStamp& timeStamp)
|
||||
{
|
||||
RTIfedTime fedTime;
|
||||
fedTime.setPositiveInfinity();
|
||||
_rtiAmbassador.queryMinNextEventTime(fedTime);
|
||||
if (fedTime.isPositiveInfinity())
|
||||
return false;
|
||||
timeStamp = toTimeStamp(fedTime);
|
||||
return true;
|
||||
}
|
||||
void queryFederateTime(SGTimeStamp& timeStamp)
|
||||
{
|
||||
RTIfedTime fedTime;
|
||||
_rtiAmbassador.queryFederateTime(fedTime);
|
||||
timeStamp = toTimeStamp(fedTime);
|
||||
}
|
||||
void modifyLookahead(const SGTimeStamp& timeStamp)
|
||||
{ _rtiAmbassador.modifyLookahead(toFedTime(timeStamp)); }
|
||||
void queryLookahead(SGTimeStamp& timeStamp)
|
||||
{
|
||||
RTIfedTime fedTime;
|
||||
_rtiAmbassador.queryLookahead(fedTime);
|
||||
timeStamp = toTimeStamp(fedTime);
|
||||
}
|
||||
|
||||
RTI::ObjectClassHandle getObjectClassHandle(const std::string& name)
|
||||
{ return _rtiAmbassador.getObjectClassHandle(name.c_str()); }
|
||||
std::string getObjectClassName(const RTI::ObjectClassHandle& handle)
|
||||
{ return rtiToStdString(_rtiAmbassador.getObjectClassName(handle)); }
|
||||
|
||||
RTI::AttributeHandle getAttributeHandle(const std::string& attributeName, const RTI::ObjectClassHandle& objectClassHandle)
|
||||
{ return _rtiAmbassador.getAttributeHandle(attributeName.c_str(), objectClassHandle); }
|
||||
std::string getAttributeName(const RTI::AttributeHandle& attributeHandle, const RTI::ObjectClassHandle& objectClassHandle)
|
||||
{ return rtiToStdString(_rtiAmbassador.getAttributeName(attributeHandle, objectClassHandle)); }
|
||||
|
||||
// RTIHandle getInteractionClassHandle(const std::string& name)
|
||||
// {
|
||||
// try {
|
||||
// return _rtiAmbassador.getInteractionClassHandle(name.c_str());
|
||||
// } catch (RTI::NameNotFound& e) {
|
||||
// } catch (RTI::FederateNotExecutionMember& e) {
|
||||
// } catch (RTI::ConcurrentAccessAttempted& e) {
|
||||
// } catch (RTI::RTIinternalError& e) {
|
||||
// }
|
||||
// return RTIHandle(-1);
|
||||
// }
|
||||
// std::string getInteractionClassName(const RTIHandle& handle)
|
||||
// {
|
||||
// std::string name;
|
||||
// try {
|
||||
// rtiToStdString(name, _rtiAmbassador.getInteractionClassName(handle));
|
||||
// } catch (RTI::InteractionClassNotDefined& e) {
|
||||
// } catch (RTI::FederateNotExecutionMember& e) {
|
||||
// } catch (RTI::ConcurrentAccessAttempted& e) {
|
||||
// } catch (RTI::RTIinternalError& e) {
|
||||
// }
|
||||
// return name;
|
||||
// }
|
||||
|
||||
// RTIHandle getParameterHandle(const std::string& parameterName, const RTIHandle& interactionClassHandle)
|
||||
// {
|
||||
// try {
|
||||
// return _rtiAmbassador.getParameterHandle(parameterName.c_str(), interactionClassHandle);
|
||||
// } catch (RTI::InteractionClassNotDefined& e) {
|
||||
// } catch (RTI::NameNotFound& e) {
|
||||
// } catch (RTI::FederateNotExecutionMember& e) {
|
||||
// } catch (RTI::ConcurrentAccessAttempted& e) {
|
||||
// } catch (RTI::RTIinternalError& e) {
|
||||
// }
|
||||
// return RTIHandle(-1);
|
||||
// }
|
||||
// std::string getParameterName(const RTIHandle& parameterHandle, const RTIHandle& interactionClassHandle)
|
||||
// {
|
||||
// std::string parameterName;
|
||||
// try {
|
||||
// rtiToStdString(parameterName, _rtiAmbassador.getParameterName(parameterHandle, interactionClassHandle));
|
||||
// } catch (RTI::InteractionClassNotDefined& e) {
|
||||
// } catch (RTI::InteractionParameterNotDefined& e) {
|
||||
// } catch (RTI::FederateNotExecutionMember& e) {
|
||||
// } catch (RTI::ConcurrentAccessAttempted& e) {
|
||||
// } catch (RTI::RTIinternalError& e) {
|
||||
// }
|
||||
// return parameterName;
|
||||
// }
|
||||
|
||||
RTI::ObjectHandle getObjectInstanceHandle(const std::string& name)
|
||||
{ return _rtiAmbassador.getObjectInstanceHandle(name.c_str()); }
|
||||
std::string getObjectInstanceName(const RTI::ObjectHandle& objectHandle)
|
||||
{ return rtiToStdString(_rtiAmbassador.getObjectInstanceName(objectHandle)); }
|
||||
|
||||
// RTIHandle getRoutingSpaceHandle(const std::string& routingSpaceName)
|
||||
// {
|
||||
// try {
|
||||
// return _rtiAmbassador.getRoutingSpaceHandle(routingSpaceName.c_str());
|
||||
// } catch (RTI::NameNotFound& e) {
|
||||
// } catch (RTI::FederateNotExecutionMember& e) {
|
||||
// } catch (RTI::ConcurrentAccessAttempted& e) {
|
||||
// } catch (RTI::RTIinternalError& e) {
|
||||
// }
|
||||
// return RTIHandle(-1);
|
||||
// }
|
||||
// std::string getRoutingSpaceName(const RTIHandle& routingSpaceHandle)
|
||||
// {
|
||||
// std::string routingSpaceName;
|
||||
// try {
|
||||
// rtiToStdString(routingSpaceName, _rtiAmbassador.wgetRoutingSpaceName(routingSpaceHandle));
|
||||
// } catch (RTI::SpaceNotDefined& e) {
|
||||
// } catch (RTI::FederateNotExecutionMember& e) {
|
||||
// } catch (RTI::ConcurrentAccessAttempted& e) {
|
||||
// } catch (RTI::RTIinternalError& e) {
|
||||
// }
|
||||
// return routingSpaceName;
|
||||
// }
|
||||
|
||||
void enableClassRelevanceAdvisorySwitch()
|
||||
{ _rtiAmbassador.enableClassRelevanceAdvisorySwitch(); }
|
||||
void disableClassRelevanceAdvisorySwitch()
|
||||
{ _rtiAmbassador.disableClassRelevanceAdvisorySwitch(); }
|
||||
|
||||
void enableAttributeRelevanceAdvisorySwitch()
|
||||
{ _rtiAmbassador.enableAttributeRelevanceAdvisorySwitch(); }
|
||||
void disableAttributeRelevanceAdvisorySwitch()
|
||||
{ _rtiAmbassador.disableAttributeRelevanceAdvisorySwitch(); }
|
||||
|
||||
void enableAttributeScopeAdvisorySwitch()
|
||||
{ _rtiAmbassador.enableAttributeScopeAdvisorySwitch(); }
|
||||
void disableAttributeScopeAdvisorySwitch()
|
||||
{ _rtiAmbassador.disableAttributeScopeAdvisorySwitch(); }
|
||||
|
||||
void enableInteractionRelevanceAdvisorySwitch()
|
||||
{ _rtiAmbassador.enableInteractionRelevanceAdvisorySwitch(); }
|
||||
void disableInteractionRelevanceAdvisorySwitch()
|
||||
{ _rtiAmbassador.disableInteractionRelevanceAdvisorySwitch(); }
|
||||
|
||||
|
||||
bool tick()
|
||||
{ return _rtiAmbassador.tick(); }
|
||||
bool tick(double minimum, double maximum)
|
||||
{ return _rtiAmbassador.tick(minimum, maximum); }
|
||||
|
||||
|
||||
static SGTimeStamp toTimeStamp(const RTI::FedTime& fedTime)
|
||||
{
|
||||
RTIfedTime referenceTime(fedTime);
|
||||
return SGTimeStamp::fromSec(referenceTime.getTime() + 0.5e-9);
|
||||
}
|
||||
|
||||
static RTIfedTime toFedTime(const SGTimeStamp& timeStamp)
|
||||
{
|
||||
RTIfedTime referenceTime;
|
||||
referenceTime.setZero();
|
||||
referenceTime += timeStamp.toSecs();
|
||||
return referenceTime;
|
||||
}
|
||||
|
||||
static std::string rtiToStdString(char* n)
|
||||
{
|
||||
if (!n)
|
||||
return std::string();
|
||||
std::string s;
|
||||
s.assign(n);
|
||||
delete[] n;
|
||||
return s;
|
||||
}
|
||||
|
||||
// The connection class
|
||||
RTI::RTIambassador _rtiAmbassador;
|
||||
SGWeakPtr<RTI13Federate> _federate;
|
||||
};
|
||||
|
||||
} // namespace simgear
|
||||
|
||||
#endif
|
||||
1638
simgear/hla/RTI13Federate.cxx
Normal file
1638
simgear/hla/RTI13Federate.cxx
Normal file
File diff suppressed because it is too large
Load Diff
103
simgear/hla/RTI13Federate.hxx
Normal file
103
simgear/hla/RTI13Federate.hxx
Normal file
@@ -0,0 +1,103 @@
|
||||
// Copyright (C) 2009 - 2011 Mathias Froehlich - Mathias.Froehlich@web.de
|
||||
//
|
||||
// This library is free software; you can redistribute it and/or
|
||||
// modify it under the terms of the GNU Library General Public
|
||||
// License as published by the Free Software Foundation; either
|
||||
// version 2 of the License, or (at your option) any later version.
|
||||
//
|
||||
// This library is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
// Library General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program; if not, write to the Free Software
|
||||
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
//
|
||||
|
||||
#ifndef RTI13Federate_hxx
|
||||
#define RTI13Federate_hxx
|
||||
|
||||
#ifndef RTI_USES_STD_FSTREAM
|
||||
#define RTI_USES_STD_FSTREAM
|
||||
#endif
|
||||
|
||||
#include <RTI.hh>
|
||||
|
||||
#include "RTIFederate.hxx"
|
||||
#include "RTI13ObjectClass.hxx"
|
||||
#include "RTI13ObjectInstance.hxx"
|
||||
|
||||
namespace simgear {
|
||||
|
||||
class RTI13Ambassador;
|
||||
|
||||
class RTI13Federate : public RTIFederate {
|
||||
public:
|
||||
RTI13Federate(const std::list<std::string>& stringList);
|
||||
virtual ~RTI13Federate();
|
||||
|
||||
/// Create a federation execution
|
||||
/// Semantically this methods should be static,
|
||||
virtual FederationManagementResult createFederationExecution(const std::string& federation, const std::string& objectModel);
|
||||
virtual FederationManagementResult destroyFederationExecution(const std::string& federation);
|
||||
|
||||
/// Join with federateName the federation execution federation
|
||||
virtual FederationManagementResult join(const std::string& federateType, const std::string& federation);
|
||||
virtual bool resign();
|
||||
virtual bool getJoined() const;
|
||||
|
||||
/// Synchronization Point handling
|
||||
virtual bool registerFederationSynchronizationPoint(const std::string& label, const RTIData& tag);
|
||||
virtual bool getFederationSynchronizationPointAnnounced(const std::string& label);
|
||||
virtual bool synchronizationPointAchieved(const std::string& label);
|
||||
virtual bool getFederationSynchronized(const std::string& label);
|
||||
|
||||
/// Time management
|
||||
virtual bool enableTimeConstrained();
|
||||
virtual bool disableTimeConstrained();
|
||||
virtual bool getTimeConstrainedEnabled();
|
||||
|
||||
virtual bool enableTimeRegulation(const SGTimeStamp& lookahead);
|
||||
virtual bool disableTimeRegulation();
|
||||
virtual bool modifyLookahead(const SGTimeStamp& timeStamp);
|
||||
virtual bool getTimeRegulationEnabled();
|
||||
|
||||
virtual bool timeAdvanceRequest(const SGTimeStamp& timeStamp);
|
||||
virtual bool timeAdvanceRequestAvailable(const SGTimeStamp& timeStamp);
|
||||
virtual bool flushQueueRequest(const SGTimeStamp& timeStamp);
|
||||
virtual bool getTimeAdvancePending();
|
||||
|
||||
virtual bool queryFederateTime(SGTimeStamp& timeStamp);
|
||||
virtual bool queryLookahead(SGTimeStamp& timeStamp);
|
||||
virtual bool queryGALT(SGTimeStamp& timeStamp);
|
||||
virtual bool queryLITS(SGTimeStamp& timeStamp);
|
||||
|
||||
/// Process messages
|
||||
virtual bool processMessage();
|
||||
virtual bool processMessages(const double& minimum, const double& maximum);
|
||||
|
||||
virtual RTI13ObjectClass* createObjectClass(const std::string& name, HLAObjectClass* hlaObjectClass);
|
||||
|
||||
virtual RTI13ObjectInstance* getObjectInstance(const std::string& name);
|
||||
void insertObjectInstance(RTI13ObjectInstance* objectInstance);
|
||||
|
||||
private:
|
||||
RTI13Federate(const RTI13Federate&);
|
||||
RTI13Federate& operator=(const RTI13Federate&);
|
||||
|
||||
/// The federate handle
|
||||
RTI::FederateHandle _federateHandle;
|
||||
bool _joined;
|
||||
|
||||
/// RTI connection
|
||||
SGSharedPtr<RTI13Ambassador> _ambassador;
|
||||
|
||||
/// Callbacks from the rti are handled here.
|
||||
struct FederateAmbassador;
|
||||
FederateAmbassador* _federateAmbassador;
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
#endif
|
||||
406
simgear/hla/RTI13ObjectClass.cxx
Normal file
406
simgear/hla/RTI13ObjectClass.cxx
Normal file
@@ -0,0 +1,406 @@
|
||||
// Copyright (C) 2009 - 2010 Mathias Froehlich - Mathias.Froehlich@web.de
|
||||
//
|
||||
// This library is free software; you can redistribute it and/or
|
||||
// modify it under the terms of the GNU Library General Public
|
||||
// License as published by the Free Software Foundation; either
|
||||
// version 2 of the License, or (at your option) any later version.
|
||||
//
|
||||
// This library is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
// Library General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program; if not, write to the Free Software
|
||||
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
//
|
||||
|
||||
#include "RTI13ObjectClass.hxx"
|
||||
#include "RTI13Ambassador.hxx"
|
||||
|
||||
namespace simgear {
|
||||
|
||||
RTI13ObjectClass::RTI13ObjectClass(HLAObjectClass* hlaObjectClass, RTI::ObjectClassHandle& handle, RTI13Ambassador* ambassador) :
|
||||
RTIObjectClass(hlaObjectClass),
|
||||
_handle(handle),
|
||||
_ambassador(ambassador)
|
||||
{
|
||||
if (0 != getOrCreateAttributeIndex("privilegeToDelete") &&
|
||||
0 != getOrCreateAttributeIndex("HLAprivilegeToDeleteObject"))
|
||||
SG_LOG(SG_NETWORK, SG_WARN, "RTI13ObjectClass: Cannot find object root attribute.");
|
||||
}
|
||||
|
||||
RTI13ObjectClass::~RTI13ObjectClass()
|
||||
{
|
||||
}
|
||||
|
||||
std::string
|
||||
RTI13ObjectClass::getName() const
|
||||
{
|
||||
if (!_ambassador.valid()) {
|
||||
SG_LOG(SG_NETWORK, SG_WARN, "Error: Ambassador is zero.");
|
||||
return std::string();
|
||||
}
|
||||
return _ambassador->getObjectClassName(_handle);
|
||||
}
|
||||
|
||||
unsigned
|
||||
RTI13ObjectClass::getNumAttributes() const
|
||||
{
|
||||
return _attributeHandleVector.size();
|
||||
}
|
||||
|
||||
unsigned
|
||||
RTI13ObjectClass::getAttributeIndex(const std::string& name) const
|
||||
{
|
||||
if (!_ambassador.valid()) {
|
||||
SG_LOG(SG_NETWORK, SG_WARN, "Error: Ambassador is zero.");
|
||||
return ~0u;
|
||||
}
|
||||
|
||||
try {
|
||||
RTI::AttributeHandle attributeHandle = _ambassador->getAttributeHandle(name, _handle);
|
||||
|
||||
AttributeHandleIndexMap::const_iterator i = _attributeHandleIndexMap.find(attributeHandle);
|
||||
if (i != _attributeHandleIndexMap.end())
|
||||
return i->second;
|
||||
|
||||
return ~0u;
|
||||
|
||||
} catch (RTI::ObjectClassNotDefined& e) {
|
||||
SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not get object class attribute: " << e._name << " " << e._reason);
|
||||
return ~0u;
|
||||
} catch (RTI::NameNotFound& e) {
|
||||
SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not get object class attribute: " << e._name << " " << e._reason);
|
||||
return ~0u;
|
||||
} catch (RTI::FederateNotExecutionMember& e) {
|
||||
SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not get object class attribute: " << e._name << " " << e._reason);
|
||||
return ~0u;
|
||||
} catch (RTI::ConcurrentAccessAttempted& e) {
|
||||
SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not get object class attribute: " << e._name << " " << e._reason);
|
||||
return ~0u;
|
||||
} catch (RTI::RTIinternalError& e) {
|
||||
SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not get object class attribute: " << e._name << " " << e._reason);
|
||||
return ~0u;
|
||||
} catch (...) {
|
||||
SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not get object class attribute.");
|
||||
return ~0u;
|
||||
}
|
||||
}
|
||||
|
||||
unsigned
|
||||
RTI13ObjectClass::getOrCreateAttributeIndex(const std::string& name)
|
||||
{
|
||||
if (!_ambassador.valid()) {
|
||||
SG_LOG(SG_NETWORK, SG_WARN, "Error: Ambassador is zero.");
|
||||
return ~0u;
|
||||
}
|
||||
|
||||
try {
|
||||
RTI::AttributeHandle attributeHandle = _ambassador->getAttributeHandle(name, _handle);
|
||||
|
||||
AttributeHandleIndexMap::const_iterator i = _attributeHandleIndexMap.find(attributeHandle);
|
||||
if (i != _attributeHandleIndexMap.end())
|
||||
return i->second;
|
||||
|
||||
unsigned index = _attributeHandleVector.size();
|
||||
_attributeHandleIndexMap[attributeHandle] = index;
|
||||
_attributeHandleVector.push_back(attributeHandle);
|
||||
_attributeDataVector.push_back(name);
|
||||
|
||||
return index;
|
||||
|
||||
} catch (RTI::ObjectClassNotDefined& e) {
|
||||
SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not get object class attribute: " << e._name << " " << e._reason);
|
||||
return ~0u;
|
||||
} catch (RTI::NameNotFound& e) {
|
||||
SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not get object class attribute: " << e._name << " " << e._reason);
|
||||
return ~0u;
|
||||
} catch (RTI::FederateNotExecutionMember& e) {
|
||||
SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not get object class attribute: " << e._name << " " << e._reason);
|
||||
return ~0u;
|
||||
} catch (RTI::ConcurrentAccessAttempted& e) {
|
||||
SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not get object class attribute: " << e._name << " " << e._reason);
|
||||
return ~0u;
|
||||
} catch (RTI::RTIinternalError& e) {
|
||||
SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not get object class attribute: " << e._name << " " << e._reason);
|
||||
return ~0u;
|
||||
} catch (...) {
|
||||
SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not get object class attribute.");
|
||||
return ~0u;
|
||||
}
|
||||
}
|
||||
|
||||
// std::string
|
||||
// RTI13ObjectClass::getAttributeName(unsigned index) const
|
||||
// {
|
||||
// SGSharedPtr<RTI13Ambassador> ambassador = _ambassador.lock();
|
||||
// if (!ambassador.valid()) {
|
||||
// SG_LOG(SG_NETWORK, SG_WARN, "Error: Ambassador is zero.");
|
||||
// return std::string();
|
||||
// }
|
||||
|
||||
// try {
|
||||
// return ambassador->getAttributeName(getAttributeHandle(index), _handle);
|
||||
// } catch (RTI::ObjectClassNotDefined& e) {
|
||||
// SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not get object class attribute name: " << e._name << " " << e._reason);
|
||||
// return std::string();
|
||||
// } catch (RTI::AttributeNotDefined& e) {
|
||||
// SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not get object class attribute name: " << e._name << " " << e._reason);
|
||||
// return std::string();
|
||||
// } catch (RTI::FederateNotExecutionMember& e) {
|
||||
// SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not get object class attribute name: " << e._name << " " << e._reason);
|
||||
// return std::string();
|
||||
// } catch (RTI::ConcurrentAccessAttempted& e) {
|
||||
// SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not get object class attribute name: " << e._name << " " << e._reason);
|
||||
// return std::string();
|
||||
// } catch (RTI::RTIinternalError& e) {
|
||||
// SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not get object class attribute name: " << e._name << " " << e._reason);
|
||||
// return std::string();
|
||||
// } catch (...) {
|
||||
// SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not get object class attribute name.");
|
||||
// return std::string();
|
||||
// }
|
||||
// }
|
||||
|
||||
bool
|
||||
RTI13ObjectClass::publish(const std::set<unsigned>& indexSet)
|
||||
{
|
||||
if (!_ambassador.valid()) {
|
||||
SG_LOG(SG_NETWORK, SG_WARN, "Error: Ambassador is zero.");
|
||||
return false;
|
||||
}
|
||||
|
||||
try {
|
||||
std::auto_ptr<RTI::AttributeHandleSet> attributeHandleSet(RTI::AttributeHandleSetFactory::create(indexSet.size()));
|
||||
for (std::set<unsigned>::const_iterator i = indexSet.begin(); i != indexSet.end(); ++i) {
|
||||
if (_attributeHandleVector.size() <= *i) {
|
||||
SG_LOG(SG_NETWORK, SG_WARN, "RTI13ObjectClass::publish(): Invalid attribute index!");
|
||||
continue;
|
||||
}
|
||||
attributeHandleSet->add(_attributeHandleVector[*i]);
|
||||
}
|
||||
|
||||
_ambassador->publishObjectClass(_handle, *attributeHandleSet);
|
||||
|
||||
for (unsigned i = 0; i < getNumAttributes(); ++i) {
|
||||
_attributeDataVector[i]._published = true;
|
||||
}
|
||||
|
||||
return true;
|
||||
} catch (RTI::ObjectClassNotDefined& e) {
|
||||
SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not publish object class: " << e._name << " " << e._reason);
|
||||
return false;
|
||||
} catch (RTI::AttributeNotDefined& e) {
|
||||
SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not publish object class: " << e._name << " " << e._reason);
|
||||
return false;
|
||||
} catch (RTI::OwnershipAcquisitionPending& e) {
|
||||
SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not publish object class: " << e._name << " " << e._reason);
|
||||
return false;
|
||||
} catch (RTI::FederateNotExecutionMember& e) {
|
||||
SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not publish object class: " << e._name << " " << e._reason);
|
||||
return false;
|
||||
} catch (RTI::ConcurrentAccessAttempted& e) {
|
||||
SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not publish object class: " << e._name << " " << e._reason);
|
||||
return false;
|
||||
} catch (RTI::SaveInProgress& e) {
|
||||
SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not publish object class: " << e._name << " " << e._reason);
|
||||
return false;
|
||||
} catch (RTI::RestoreInProgress& e) {
|
||||
SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not publish object class: " << e._name << " " << e._reason);
|
||||
return false;
|
||||
} catch (RTI::RTIinternalError& e) {
|
||||
SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not publish object class: " << e._name << " " << e._reason);
|
||||
return false;
|
||||
} catch (...) {
|
||||
SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not publish object class.");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
bool
|
||||
RTI13ObjectClass::unpublish()
|
||||
{
|
||||
if (!_ambassador.valid()) {
|
||||
SG_LOG(SG_NETWORK, SG_WARN, "Error: Ambassador is zero.");
|
||||
return false;
|
||||
}
|
||||
|
||||
try {
|
||||
_ambassador->unpublishObjectClass(_handle);
|
||||
|
||||
for (unsigned i = 0; i < getNumAttributes(); ++i) {
|
||||
_attributeDataVector[i]._published = false;
|
||||
}
|
||||
|
||||
return true;
|
||||
} catch (RTI::ObjectClassNotDefined& e) {
|
||||
SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not unpublish object class: " << e._name << " " << e._reason);
|
||||
return false;
|
||||
} catch (RTI::ObjectClassNotPublished& e) {
|
||||
SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not unpublish object class: " << e._name << " " << e._reason);
|
||||
return false;
|
||||
} catch (RTI::OwnershipAcquisitionPending& e) {
|
||||
SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not unpublish object class: " << e._name << " " << e._reason);
|
||||
return false;
|
||||
} catch (RTI::FederateNotExecutionMember& e) {
|
||||
SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not unpublish object class: " << e._name << " " << e._reason);
|
||||
return false;
|
||||
} catch (RTI::ConcurrentAccessAttempted& e) {
|
||||
SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not unpublish object class: " << e._name << " " << e._reason);
|
||||
return false;
|
||||
} catch (RTI::SaveInProgress& e) {
|
||||
SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not unpublish object class: " << e._name << " " << e._reason);
|
||||
return false;
|
||||
} catch (RTI::RestoreInProgress& e) {
|
||||
SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not unpublish object class: " << e._name << " " << e._reason);
|
||||
return false;
|
||||
} catch (RTI::RTIinternalError& e) {
|
||||
SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not unpublish object class: " << e._name << " " << e._reason);
|
||||
return false;
|
||||
} catch (...) {
|
||||
SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not unpublish object class.");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
bool
|
||||
RTI13ObjectClass::subscribe(const std::set<unsigned>& indexSet, bool active)
|
||||
{
|
||||
if (!_ambassador.valid()) {
|
||||
SG_LOG(SG_NETWORK, SG_WARN, "Error: Ambassador is zero.");
|
||||
return false;
|
||||
}
|
||||
|
||||
try {
|
||||
std::auto_ptr<RTI::AttributeHandleSet> attributeHandleSet(RTI::AttributeHandleSetFactory::create(indexSet.size()));
|
||||
for (std::set<unsigned>::const_iterator i = indexSet.begin();
|
||||
i != indexSet.end(); ++i) {
|
||||
if (_attributeHandleVector.size() <= *i) {
|
||||
SG_LOG(SG_NETWORK, SG_WARN, "RTI13ObjectClass::subscribe(): Invalid attribute index!");
|
||||
continue;
|
||||
}
|
||||
attributeHandleSet->add(_attributeHandleVector[*i]);
|
||||
}
|
||||
|
||||
_ambassador->subscribeObjectClassAttributes(_handle, *attributeHandleSet, active);
|
||||
|
||||
for (unsigned i = 0; i < getNumAttributes(); ++i) {
|
||||
_attributeDataVector[i]._subscribed = true;
|
||||
}
|
||||
|
||||
return true;
|
||||
} catch (RTI::ObjectClassNotDefined& e) {
|
||||
SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not subscribe object class: " << e._name << " " << e._reason);
|
||||
return false;
|
||||
} catch (RTI::AttributeNotDefined& e) {
|
||||
SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not subscribe object class: " << e._name << " " << e._reason);
|
||||
return false;
|
||||
} catch (RTI::FederateNotExecutionMember& e) {
|
||||
SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not subscribe object class: " << e._name << " " << e._reason);
|
||||
return false;
|
||||
} catch (RTI::ConcurrentAccessAttempted& e) {
|
||||
SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not subscribe object class: " << e._name << " " << e._reason);
|
||||
return false;
|
||||
} catch (RTI::SaveInProgress& e) {
|
||||
SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not subscribe object class: " << e._name << " " << e._reason);
|
||||
return false;
|
||||
} catch (RTI::RestoreInProgress& e) {
|
||||
SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not subscribe object class: " << e._name << " " << e._reason);
|
||||
return false;
|
||||
} catch (RTI::RTIinternalError& e) {
|
||||
SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not subscribe object class: " << e._name << " " << e._reason);
|
||||
return false;
|
||||
} catch (...) {
|
||||
SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not subscribe object class.");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
bool
|
||||
RTI13ObjectClass::unsubscribe()
|
||||
{
|
||||
if (!_ambassador.valid()) {
|
||||
SG_LOG(SG_NETWORK, SG_WARN, "Error: Ambassador is zero.");
|
||||
return 0;
|
||||
}
|
||||
|
||||
try {
|
||||
_ambassador->unsubscribeObjectClass(_handle);
|
||||
|
||||
for (unsigned i = 0; i < getNumAttributes(); ++i) {
|
||||
_attributeDataVector[i]._subscribed = false;
|
||||
}
|
||||
|
||||
return true;
|
||||
} catch (RTI::ObjectClassNotDefined& e) {
|
||||
SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not unsubscribe object class: " << e._name << " " << e._reason);
|
||||
return false;
|
||||
} catch (RTI::ObjectClassNotSubscribed& e) {
|
||||
SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not unsubscribe object class: " << e._name << " " << e._reason);
|
||||
return false;
|
||||
} catch (RTI::FederateNotExecutionMember& e) {
|
||||
SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not unsubscribe object class: " << e._name << " " << e._reason);
|
||||
return false;
|
||||
} catch (RTI::ConcurrentAccessAttempted& e) {
|
||||
SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not unsubscribe object class: " << e._name << " " << e._reason);
|
||||
return false;
|
||||
} catch (RTI::SaveInProgress& e) {
|
||||
SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not unsubscribe object class: " << e._name << " " << e._reason);
|
||||
return false;
|
||||
} catch (RTI::RestoreInProgress& e) {
|
||||
SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not unsubscribe object class: " << e._name << " " << e._reason);
|
||||
return false;
|
||||
} catch (RTI::RTIinternalError& e) {
|
||||
SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not unsubscribe object class: " << e._name << " " << e._reason);
|
||||
return false;
|
||||
} catch (...) {
|
||||
SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not unsubscribe object class.");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
RTIObjectInstance*
|
||||
RTI13ObjectClass::registerObjectInstance(HLAObjectInstance* hlaObjectInstance)
|
||||
{
|
||||
if (!_ambassador.valid()) {
|
||||
SG_LOG(SG_NETWORK, SG_WARN, "Error: Ambassador is zero.");
|
||||
return 0;
|
||||
}
|
||||
|
||||
SGSharedPtr<RTI13Federate> federate = _ambassador->_federate.lock();
|
||||
if (!federate.valid()) {
|
||||
SG_LOG(SG_NETWORK, SG_WARN, "Error: Federate is zero.");
|
||||
return 0;
|
||||
}
|
||||
|
||||
try {
|
||||
RTI::ObjectHandle objectHandle = _ambassador->registerObjectInstance(getHandle());
|
||||
RTI13ObjectInstance* objectInstance = new RTI13ObjectInstance(objectHandle, hlaObjectInstance, this, _ambassador.get(), true);
|
||||
federate->insertObjectInstance(objectInstance);
|
||||
return objectInstance;
|
||||
} catch (RTI::ObjectClassNotDefined& e) {
|
||||
SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not register object instance: " << e._name << " " << e._reason);
|
||||
return 0;
|
||||
} catch (RTI::ObjectClassNotPublished& e) {
|
||||
SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not register object instance: " << e._name << " " << e._reason);
|
||||
return 0;
|
||||
} catch (RTI::FederateNotExecutionMember& e) {
|
||||
SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not register object instance: " << e._name << " " << e._reason);
|
||||
return 0;
|
||||
} catch (RTI::ConcurrentAccessAttempted& e) {
|
||||
SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not register object instance: " << e._name << " " << e._reason);
|
||||
return 0;
|
||||
} catch (RTI::SaveInProgress& e) {
|
||||
SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not register object instance: " << e._name << " " << e._reason);
|
||||
return 0;
|
||||
} catch (RTI::RestoreInProgress& e) {
|
||||
SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not register object instance: " << e._name << " " << e._reason);
|
||||
return 0;
|
||||
} catch (RTI::RTIinternalError& e) {
|
||||
SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not register object instance: " << e._name << " " << e._reason);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
87
simgear/hla/RTI13ObjectClass.hxx
Normal file
87
simgear/hla/RTI13ObjectClass.hxx
Normal file
@@ -0,0 +1,87 @@
|
||||
// Copyright (C) 2009 - 2010 Mathias Froehlich - Mathias.Froehlich@web.de
|
||||
//
|
||||
// This library is free software; you can redistribute it and/or
|
||||
// modify it under the terms of the GNU Library General Public
|
||||
// License as published by the Free Software Foundation; either
|
||||
// version 2 of the License, or (at your option) any later version.
|
||||
//
|
||||
// This library is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
// Library General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program; if not, write to the Free Software
|
||||
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
//
|
||||
|
||||
#ifndef RTI13ObjectClass_hxx
|
||||
#define RTI13ObjectClass_hxx
|
||||
|
||||
#include <map>
|
||||
|
||||
#ifndef RTI_USES_STD_FSTREAM
|
||||
#define RTI_USES_STD_FSTREAM
|
||||
#endif
|
||||
|
||||
#include <RTI.hh>
|
||||
|
||||
#include <simgear/structure/SGWeakPtr.hxx>
|
||||
|
||||
#include "RTIObjectClass.hxx"
|
||||
|
||||
namespace simgear {
|
||||
|
||||
class RTI13Ambassador;
|
||||
class RTIObjectInstance;
|
||||
|
||||
class RTI13ObjectClass : public RTIObjectClass {
|
||||
public:
|
||||
RTI13ObjectClass(HLAObjectClass* hlaObjectClass, RTI::ObjectClassHandle& handle, RTI13Ambassador* ambassador);
|
||||
virtual ~RTI13ObjectClass();
|
||||
|
||||
const RTI::ObjectClassHandle& getHandle() const
|
||||
{ return _handle; }
|
||||
|
||||
virtual std::string getName() const;
|
||||
|
||||
virtual unsigned getNumAttributes() const;
|
||||
virtual unsigned getAttributeIndex(const std::string& name) const;
|
||||
virtual unsigned getOrCreateAttributeIndex(const std::string& name);
|
||||
|
||||
unsigned getAttributeIndex(const RTI::AttributeHandle& handle) const
|
||||
{
|
||||
AttributeHandleIndexMap::const_iterator i = _attributeHandleIndexMap.find(handle);
|
||||
if (i == _attributeHandleIndexMap.end())
|
||||
return ~0u;
|
||||
return i->second;
|
||||
}
|
||||
RTI::AttributeHandle getAttributeHandle(unsigned index) const
|
||||
{
|
||||
if (_attributeHandleVector.size() <= index)
|
||||
return -1;
|
||||
return _attributeHandleVector[index];
|
||||
}
|
||||
|
||||
virtual bool publish(const std::set<unsigned>& indexSet);
|
||||
virtual bool unpublish();
|
||||
|
||||
virtual bool subscribe(const std::set<unsigned>& indexSet, bool);
|
||||
virtual bool unsubscribe();
|
||||
|
||||
virtual RTIObjectInstance* registerObjectInstance(HLAObjectInstance* hlaObjectInstance);
|
||||
|
||||
private:
|
||||
RTI::ObjectClassHandle _handle;
|
||||
SGSharedPtr<RTI13Ambassador> _ambassador;
|
||||
|
||||
typedef std::map<RTI::AttributeHandle, unsigned> AttributeHandleIndexMap;
|
||||
AttributeHandleIndexMap _attributeHandleIndexMap;
|
||||
|
||||
typedef std::vector<RTI::AttributeHandle> AttributeHandleVector;
|
||||
AttributeHandleVector _attributeHandleVector;
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
#endif
|
||||
496
simgear/hla/RTI13ObjectInstance.cxx
Normal file
496
simgear/hla/RTI13ObjectInstance.cxx
Normal file
@@ -0,0 +1,496 @@
|
||||
// Copyright (C) 2009 - 2010 Mathias Froehlich - Mathias.Froehlich@web.de
|
||||
//
|
||||
// This library is free software; you can redistribute it and/or
|
||||
// modify it under the terms of the GNU Library General Public
|
||||
// License as published by the Free Software Foundation; either
|
||||
// version 2 of the License, or (at your option) any later version.
|
||||
//
|
||||
// This library is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
// Library General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program; if not, write to the Free Software
|
||||
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
//
|
||||
|
||||
#include "RTIObjectInstance.hxx"
|
||||
#include "RTI13Ambassador.hxx"
|
||||
|
||||
namespace simgear {
|
||||
|
||||
RTI13ObjectInstance::RTI13ObjectInstance(const RTI::ObjectHandle& handle, HLAObjectInstance* hlaObjectInstance,
|
||||
const RTI13ObjectClass* objectClass, RTI13Ambassador* ambassador, bool owned) :
|
||||
RTIObjectInstance(hlaObjectInstance),
|
||||
_handle(handle),
|
||||
_objectClass(objectClass),
|
||||
_ambassador(ambassador),
|
||||
_attributeValuePairSet(RTI::AttributeSetFactory::create(objectClass->getNumAttributes()))
|
||||
{
|
||||
updateAttributesFromClass(owned);
|
||||
}
|
||||
|
||||
RTI13ObjectInstance::~RTI13ObjectInstance()
|
||||
{
|
||||
}
|
||||
|
||||
const RTIObjectClass*
|
||||
RTI13ObjectInstance::getObjectClass() const
|
||||
{
|
||||
return _objectClass.get();
|
||||
}
|
||||
|
||||
const RTI13ObjectClass*
|
||||
RTI13ObjectInstance::get13ObjectClass() const
|
||||
{
|
||||
return _objectClass.get();
|
||||
}
|
||||
|
||||
std::string
|
||||
RTI13ObjectInstance::getName() const
|
||||
{
|
||||
if (!_ambassador.valid()) {
|
||||
SG_LOG(SG_NETWORK, SG_WARN, "Error: Ambassador is zero.");
|
||||
return std::string();
|
||||
}
|
||||
|
||||
try {
|
||||
return _ambassador->getObjectInstanceName(_handle);
|
||||
} catch (RTI::ObjectNotKnown& e) {
|
||||
SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not get object name: " << e._name << " " << e._reason);
|
||||
return std::string();
|
||||
} catch (RTI::FederateNotExecutionMember& e) {
|
||||
SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not get object name: " << e._name << " " << e._reason);
|
||||
return std::string();
|
||||
} catch (RTI::ConcurrentAccessAttempted& e) {
|
||||
SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not get object name: " << e._name << " " << e._reason);
|
||||
return std::string();
|
||||
} catch (RTI::RTIinternalError& e) {
|
||||
SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not get object name: " << e._name << " " << e._reason);
|
||||
return std::string();
|
||||
} catch (...) {
|
||||
SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not get object name.");
|
||||
return std::string();
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
RTI13ObjectInstance::deleteObjectInstance(const RTIData& tag)
|
||||
{
|
||||
if (!_ambassador.valid()) {
|
||||
SG_LOG(SG_NETWORK, SG_WARN, "Error: Ambassador is zero.");
|
||||
return;
|
||||
}
|
||||
|
||||
SGSharedPtr<RTI13Federate> federate = _ambassador->_federate.lock();
|
||||
if (!federate.valid()) {
|
||||
SG_LOG(SG_NETWORK, SG_WARN, "Error: Federate is zero.");
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
_ambassador->deleteObjectInstance(_handle, tag);
|
||||
} catch (RTI::ObjectNotKnown& e) {
|
||||
SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not delete object instance: " << e._name << " " << e._reason);
|
||||
} catch (RTI::DeletePrivilegeNotHeld& e) {
|
||||
SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not delete object instance: " << e._name << " " << e._reason);
|
||||
} catch (RTI::FederateNotExecutionMember& e) {
|
||||
SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not delete object instance: " << e._name << " " << e._reason);
|
||||
} catch (RTI::ConcurrentAccessAttempted& e) {
|
||||
SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not delete object instance: " << e._name << " " << e._reason);
|
||||
} catch (RTI::SaveInProgress& e) {
|
||||
SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not delete object instance: " << e._name << " " << e._reason);
|
||||
} catch (RTI::RestoreInProgress& e) {
|
||||
SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not delete object instance: " << e._name << " " << e._reason);
|
||||
} catch (RTI::RTIinternalError& e) {
|
||||
SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not delete object instance: " << e._name << " " << e._reason);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
RTI13ObjectInstance::deleteObjectInstance(const SGTimeStamp& timeStamp, const RTIData& tag)
|
||||
{
|
||||
if (!_ambassador.valid()) {
|
||||
SG_LOG(SG_NETWORK, SG_WARN, "Error: Ambassador is zero.");
|
||||
return;
|
||||
}
|
||||
|
||||
SGSharedPtr<RTI13Federate> federate = _ambassador->_federate.lock();
|
||||
if (!federate.valid()) {
|
||||
SG_LOG(SG_NETWORK, SG_WARN, "Error: Federate is zero.");
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
_ambassador->deleteObjectInstance(_handle, timeStamp, tag);
|
||||
} catch (RTI::ObjectNotKnown& e) {
|
||||
SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not delete object instance: " << e._name << " " << e._reason);
|
||||
} catch (RTI::DeletePrivilegeNotHeld& e) {
|
||||
SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not delete object instance: " << e._name << " " << e._reason);
|
||||
} catch (RTI::InvalidFederationTime& e) {
|
||||
SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not delete object instance: " << e._name << " " << e._reason);
|
||||
} catch (RTI::FederateNotExecutionMember& e) {
|
||||
SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not delete object instance: " << e._name << " " << e._reason);
|
||||
} catch (RTI::ConcurrentAccessAttempted& e) {
|
||||
SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not delete object instance: " << e._name << " " << e._reason);
|
||||
} catch (RTI::SaveInProgress& e) {
|
||||
SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not delete object instance: " << e._name << " " << e._reason);
|
||||
} catch (RTI::RestoreInProgress& e) {
|
||||
SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not delete object instance: " << e._name << " " << e._reason);
|
||||
} catch (RTI::RTIinternalError& e) {
|
||||
SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not delete object instance: " << e._name << " " << e._reason);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
RTI13ObjectInstance::localDeleteObjectInstance()
|
||||
{
|
||||
if (!_ambassador.valid()) {
|
||||
SG_LOG(SG_NETWORK, SG_WARN, "Error: Ambassador is zero.");
|
||||
return;
|
||||
}
|
||||
|
||||
SGSharedPtr<RTI13Federate> federate = _ambassador->_federate.lock();
|
||||
if (!federate.valid()) {
|
||||
SG_LOG(SG_NETWORK, SG_WARN, "Error: Federate is zero.");
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
_ambassador->localDeleteObjectInstance(_handle);
|
||||
} catch (RTI::ObjectNotKnown& e) {
|
||||
SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not delete object instance: " << e._name << " " << e._reason);
|
||||
} catch (RTI::FederateOwnsAttributes& e) {
|
||||
SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not delete object instance: " << e._name << " " << e._reason);
|
||||
} catch (RTI::FederateNotExecutionMember& e) {
|
||||
SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not delete object instance: " << e._name << " " << e._reason);
|
||||
} catch (RTI::ConcurrentAccessAttempted& e) {
|
||||
SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not delete object instance: " << e._name << " " << e._reason);
|
||||
} catch (RTI::SaveInProgress& e) {
|
||||
SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not delete object instance: " << e._name << " " << e._reason);
|
||||
} catch (RTI::RestoreInProgress& e) {
|
||||
SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not delete object instance: " << e._name << " " << e._reason);
|
||||
} catch (RTI::RTIinternalError& e) {
|
||||
SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not delete object instance: " << e._name << " " << e._reason);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
RTI13ObjectInstance::reflectAttributeValues(RTI13AttributeHandleDataPairList& attributeHandleDataPairList, const RTIData& tag)
|
||||
{
|
||||
// Retrieve an empty update struct from the memory pool
|
||||
RTIIndexDataPairList indexDataPairList;
|
||||
for (RTI13AttributeHandleDataPairList::iterator i = attributeHandleDataPairList.begin();
|
||||
i != attributeHandleDataPairList.end(); ++i) {
|
||||
unsigned index = getAttributeIndex(i->first);
|
||||
// Get a RTIData from the data pool
|
||||
getDataFromPool(indexDataPairList);
|
||||
indexDataPairList.back().first = index;
|
||||
indexDataPairList.back().second.swap(i->second);
|
||||
}
|
||||
|
||||
RTIObjectInstance::reflectAttributeValues(indexDataPairList, tag);
|
||||
|
||||
RTIIndexDataPairList::iterator j = indexDataPairList.begin();
|
||||
for (RTI13AttributeHandleDataPairList::iterator i = attributeHandleDataPairList.begin();
|
||||
i != attributeHandleDataPairList.end(); ++i, ++j) {
|
||||
i->second.swap(j->second);
|
||||
}
|
||||
|
||||
// Return the update data back to the pool
|
||||
putDataToPool(indexDataPairList);
|
||||
}
|
||||
|
||||
void
|
||||
RTI13ObjectInstance::reflectAttributeValues(RTI13AttributeHandleDataPairList& attributeHandleDataPairList,
|
||||
const SGTimeStamp& timeStamp, const RTIData& tag)
|
||||
{
|
||||
// Retrieve an empty update struct from the memory pool
|
||||
RTIIndexDataPairList indexDataPairList;
|
||||
for (RTI13AttributeHandleDataPairList::iterator i = attributeHandleDataPairList.begin();
|
||||
i != attributeHandleDataPairList.end(); ++i) {
|
||||
unsigned index = getAttributeIndex(i->first);
|
||||
// Get a RTIData from the data pool
|
||||
getDataFromPool(indexDataPairList);
|
||||
indexDataPairList.back().first = index;
|
||||
indexDataPairList.back().second.swap(i->second);
|
||||
}
|
||||
|
||||
RTIObjectInstance::reflectAttributeValues(indexDataPairList, timeStamp, tag);
|
||||
|
||||
RTIIndexDataPairList::iterator j = indexDataPairList.begin();
|
||||
for (RTI13AttributeHandleDataPairList::iterator i = attributeHandleDataPairList.begin();
|
||||
i != attributeHandleDataPairList.end(); ++i, ++j) {
|
||||
i->second.swap(j->second);
|
||||
}
|
||||
|
||||
// Return the update data back to the pool
|
||||
putDataToPool(indexDataPairList);
|
||||
}
|
||||
|
||||
void
|
||||
RTI13ObjectInstance::requestObjectAttributeValueUpdate()
|
||||
{
|
||||
if (!_ambassador.valid()) {
|
||||
SG_LOG(SG_NETWORK, SG_WARN, "Error: Ambassador is zero.");
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
unsigned numAttributes = getNumAttributes();
|
||||
std::auto_ptr<RTI::AttributeHandleSet> attributeHandleSet(RTI::AttributeHandleSetFactory::create(numAttributes));
|
||||
for (unsigned i = 0; i < numAttributes; ++i) {
|
||||
if (!getRequestAttributeUpdate(i))
|
||||
continue;
|
||||
attributeHandleSet->add(getAttributeHandle(i));
|
||||
}
|
||||
if (!attributeHandleSet->size())
|
||||
return;
|
||||
|
||||
_ambassador->requestObjectAttributeValueUpdate(_handle, *attributeHandleSet);
|
||||
|
||||
for (unsigned i = 0; i < numAttributes; ++i)
|
||||
setRequestAttributeUpdate(i, false);
|
||||
|
||||
return;
|
||||
} catch (RTI::ObjectNotKnown& e) {
|
||||
SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not request attribute update for object instance: " << e._name << " " << e._reason);
|
||||
return;
|
||||
} catch (RTI::AttributeNotDefined& e) {
|
||||
SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not request attribute update for object instance: " << e._name << " " << e._reason);
|
||||
return;
|
||||
} catch (RTI::FederateNotExecutionMember& e) {
|
||||
SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not request attribute update for object instance: " << e._name << " " << e._reason);
|
||||
return;
|
||||
} catch (RTI::ConcurrentAccessAttempted& e) {
|
||||
SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not request attribute update for object instance: " << e._name << " " << e._reason);
|
||||
return;
|
||||
} catch (RTI::SaveInProgress& e) {
|
||||
SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not request attribute update for object instance: " << e._name << " " << e._reason);
|
||||
return;
|
||||
} catch (RTI::RestoreInProgress& e) {
|
||||
SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not request attribute update for object instance: " << e._name << " " << e._reason);
|
||||
return;
|
||||
} catch (RTI::RTIinternalError& e) {
|
||||
SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not request attribute update for object instance: " << e._name << " " << e._reason);
|
||||
return;
|
||||
} catch (...) {
|
||||
SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not request attribute update for object instance.");
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
RTI13ObjectInstance::provideAttributeValueUpdate(const std::vector<RTI::AttributeHandle>& attributeHandleSet)
|
||||
{
|
||||
// Called from the ambassador. Just marks some instance attributes dirty so that they are sent with the next update
|
||||
size_t numAttribs = attributeHandleSet.size();
|
||||
for (RTI::ULong i = 0; i < numAttribs; ++i) {
|
||||
unsigned index = getAttributeIndex(attributeHandleSet[i]);
|
||||
setAttributeForceUpdate(index);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
RTI13ObjectInstance::updateAttributeValues(const RTIData& tag)
|
||||
{
|
||||
if (!_ambassador.valid()) {
|
||||
SG_LOG(SG_NETWORK, SG_WARN, "Error: Ambassador is zero.");
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
// That means clear()
|
||||
_attributeValuePairSet->empty();
|
||||
|
||||
unsigned numAttributes = getNumAttributes();
|
||||
for (unsigned i = 0; i < numAttributes; ++i) {
|
||||
if (!getAttributeEffectiveUpdateEnabled(i))
|
||||
continue;
|
||||
const HLADataElement* dataElement = getDataElement(i);
|
||||
if (!dataElement)
|
||||
continue;
|
||||
// FIXME cache somewhere
|
||||
RTIData data;
|
||||
HLAEncodeStream stream(data);
|
||||
dataElement->encode(stream);
|
||||
_attributeValuePairSet->add(getAttributeHandle(i), data.data(), data.size());
|
||||
}
|
||||
|
||||
if (!_attributeValuePairSet->size())
|
||||
return;
|
||||
|
||||
_ambassador->updateAttributeValues(_handle, *_attributeValuePairSet, tag);
|
||||
|
||||
for (unsigned i = 0; i < numAttributes; ++i) {
|
||||
setAttributeUpdated(i);
|
||||
}
|
||||
|
||||
} catch (RTI::ObjectNotKnown& e) {
|
||||
SG_LOG(SG_NETWORK, SG_WARN, "RTI: could not update attribute values object instance: " << e._name << " " << e._reason);
|
||||
} catch (RTI::AttributeNotDefined& e) {
|
||||
SG_LOG(SG_NETWORK, SG_WARN, "RTI: could not update attribute values object instance: " << e._name << " " << e._reason);
|
||||
} catch (RTI::AttributeNotOwned& e) {
|
||||
SG_LOG(SG_NETWORK, SG_WARN, "RTI: could not update attribute values object instance: " << e._name << " " << e._reason);
|
||||
} catch (RTI::FederateNotExecutionMember& e) {
|
||||
SG_LOG(SG_NETWORK, SG_WARN, "RTI: could not update attribute values object instance: " << e._name << " " << e._reason);
|
||||
} catch (RTI::ConcurrentAccessAttempted& e) {
|
||||
SG_LOG(SG_NETWORK, SG_WARN, "RTI: could not update attribute values object instance: " << e._name << " " << e._reason);
|
||||
} catch (RTI::SaveInProgress& e) {
|
||||
SG_LOG(SG_NETWORK, SG_WARN, "RTI: could not update attribute values object instance: " << e._name << " " << e._reason);
|
||||
} catch (RTI::RestoreInProgress& e) {
|
||||
SG_LOG(SG_NETWORK, SG_WARN, "RTI: could not update attribute values object instance: " << e._name << " " << e._reason);
|
||||
} catch (RTI::RTIinternalError& e) {
|
||||
SG_LOG(SG_NETWORK, SG_WARN, "RTI: could not update attribute values object instance: " << e._name << " " << e._reason);
|
||||
}
|
||||
|
||||
// That means clear()
|
||||
_attributeValuePairSet->empty();
|
||||
}
|
||||
|
||||
void
|
||||
RTI13ObjectInstance::updateAttributeValues(const SGTimeStamp& timeStamp, const RTIData& tag)
|
||||
{
|
||||
if (!_ambassador.valid()) {
|
||||
SG_LOG(SG_NETWORK, SG_WARN, "Error: Ambassador is zero.");
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
// That means clear()
|
||||
_attributeValuePairSet->empty();
|
||||
|
||||
unsigned numAttributes = getNumAttributes();
|
||||
for (unsigned i = 0; i < numAttributes; ++i) {
|
||||
if (!getAttributeEffectiveUpdateEnabled(i))
|
||||
continue;
|
||||
const HLADataElement* dataElement = getDataElement(i);
|
||||
if (!dataElement)
|
||||
continue;
|
||||
// FIXME cache somewhere
|
||||
RTIData data;
|
||||
HLAEncodeStream stream(data);
|
||||
dataElement->encode(stream);
|
||||
_attributeValuePairSet->add(getAttributeHandle(i), data.data(), data.size());
|
||||
}
|
||||
|
||||
if (!_attributeValuePairSet->size())
|
||||
return;
|
||||
|
||||
_ambassador->updateAttributeValues(_handle, *_attributeValuePairSet, timeStamp, tag);
|
||||
|
||||
for (unsigned i = 0; i < numAttributes; ++i) {
|
||||
setAttributeUpdated(i);
|
||||
}
|
||||
|
||||
} catch (RTI::ObjectNotKnown& e) {
|
||||
SG_LOG(SG_NETWORK, SG_WARN, "RTI: could not update attribute values object instance: " << e._name << " " << e._reason);
|
||||
} catch (RTI::AttributeNotDefined& e) {
|
||||
SG_LOG(SG_NETWORK, SG_WARN, "RTI: could not update attribute values object instance: " << e._name << " " << e._reason);
|
||||
} catch (RTI::AttributeNotOwned& e) {
|
||||
SG_LOG(SG_NETWORK, SG_WARN, "RTI: could not update attribute values object instance: " << e._name << " " << e._reason);
|
||||
} catch (RTI::InvalidFederationTime& e) {
|
||||
SG_LOG(SG_NETWORK, SG_WARN, "RTI: could not update attribute values object instance: " << e._name << " " << e._reason);
|
||||
} catch (RTI::FederateNotExecutionMember& e) {
|
||||
SG_LOG(SG_NETWORK, SG_WARN, "RTI: could not update attribute values object instance: " << e._name << " " << e._reason);
|
||||
} catch (RTI::ConcurrentAccessAttempted& e) {
|
||||
SG_LOG(SG_NETWORK, SG_WARN, "RTI: could not update attribute values object instance: " << e._name << " " << e._reason);
|
||||
} catch (RTI::SaveInProgress& e) {
|
||||
SG_LOG(SG_NETWORK, SG_WARN, "RTI: could not update attribute values object instance: " << e._name << " " << e._reason);
|
||||
} catch (RTI::RestoreInProgress& e) {
|
||||
SG_LOG(SG_NETWORK, SG_WARN, "RTI: could not update attribute values object instance: " << e._name << " " << e._reason);
|
||||
} catch (RTI::RTIinternalError& e) {
|
||||
SG_LOG(SG_NETWORK, SG_WARN, "RTI: could not update attribute values object instance: " << e._name << " " << e._reason);
|
||||
}
|
||||
|
||||
// That means clear()
|
||||
_attributeValuePairSet->empty();
|
||||
}
|
||||
|
||||
void
|
||||
RTI13ObjectInstance::attributesInScope(const std::vector<RTI::AttributeHandle>& attributeHandleSet)
|
||||
{
|
||||
size_t numAttribs = attributeHandleSet.size();
|
||||
for (RTI::ULong i = 0; i < numAttribs; ++i) {
|
||||
RTI::AttributeHandle attributeHandle = attributeHandleSet[i];
|
||||
setAttributeInScope(getAttributeIndex(attributeHandle), true);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
RTI13ObjectInstance::attributesOutOfScope(const std::vector<RTI::AttributeHandle>& attributeHandleSet)
|
||||
{
|
||||
size_t numAttribs = attributeHandleSet.size();
|
||||
for (RTI::ULong i = 0; i < numAttribs; ++i) {
|
||||
RTI::AttributeHandle attributeHandle = attributeHandleSet[i];
|
||||
setAttributeInScope(getAttributeIndex(attributeHandle), false);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
RTI13ObjectInstance::turnUpdatesOnForObjectInstance(const std::vector<RTI::AttributeHandle>& attributeHandleSet)
|
||||
{
|
||||
size_t numAttribs = attributeHandleSet.size();
|
||||
for (RTI::ULong i = 0; i < numAttribs; ++i) {
|
||||
RTI::AttributeHandle attributeHandle = attributeHandleSet[i];
|
||||
setAttributeUpdateEnabled(getAttributeIndex(attributeHandle), true);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
RTI13ObjectInstance::turnUpdatesOffForObjectInstance(const std::vector<RTI::AttributeHandle>& attributeHandleSet)
|
||||
{
|
||||
size_t numAttribs = attributeHandleSet.size();
|
||||
for (RTI::ULong i = 0; i < numAttribs; ++i) {
|
||||
RTI::AttributeHandle attributeHandle = attributeHandleSet[i];
|
||||
setAttributeUpdateEnabled(getAttributeIndex(attributeHandle), false);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
RTI13ObjectInstance::requestAttributeOwnershipAssumption(const std::vector<RTI::AttributeHandle>& attributes, const RTIData& tag)
|
||||
{
|
||||
}
|
||||
|
||||
void
|
||||
RTI13ObjectInstance::attributeOwnershipDivestitureNotification(const std::vector<RTI::AttributeHandle>& attributes)
|
||||
{
|
||||
}
|
||||
|
||||
void
|
||||
RTI13ObjectInstance::attributeOwnershipAcquisitionNotification(const std::vector<RTI::AttributeHandle>& attributes)
|
||||
{
|
||||
}
|
||||
|
||||
void
|
||||
RTI13ObjectInstance::attributeOwnershipUnavailable(const std::vector<RTI::AttributeHandle>& attributes)
|
||||
{
|
||||
}
|
||||
|
||||
void
|
||||
RTI13ObjectInstance::requestAttributeOwnershipRelease(const std::vector<RTI::AttributeHandle>& attributes, const RTIData& tag)
|
||||
{
|
||||
}
|
||||
|
||||
void
|
||||
RTI13ObjectInstance::confirmAttributeOwnershipAcquisitionCancellation(const std::vector<RTI::AttributeHandle>& attributes)
|
||||
{
|
||||
}
|
||||
|
||||
void
|
||||
RTI13ObjectInstance::informAttributeOwnership(RTI::AttributeHandle attributeHandle, RTI::FederateHandle federateHandle)
|
||||
{
|
||||
}
|
||||
|
||||
void
|
||||
RTI13ObjectInstance::attributeIsNotOwned(RTI::AttributeHandle attributeHandle)
|
||||
{
|
||||
}
|
||||
|
||||
void
|
||||
RTI13ObjectInstance::attributeOwnedByRTI(RTI::AttributeHandle attributeHandle)
|
||||
{
|
||||
}
|
||||
|
||||
}
|
||||
107
simgear/hla/RTI13ObjectInstance.hxx
Normal file
107
simgear/hla/RTI13ObjectInstance.hxx
Normal file
@@ -0,0 +1,107 @@
|
||||
// Copyright (C) 2009 - 2010 Mathias Froehlich - Mathias.Froehlich@web.de
|
||||
//
|
||||
// This library is free software; you can redistribute it and/or
|
||||
// modify it under the terms of the GNU Library General Public
|
||||
// License as published by the Free Software Foundation; either
|
||||
// version 2 of the License, or (at your option) any later version.
|
||||
//
|
||||
// This library is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
// Library General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program; if not, write to the Free Software
|
||||
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
//
|
||||
|
||||
#ifndef RTI13ObjectInstance_hxx
|
||||
#define RTI13ObjectInstance_hxx
|
||||
|
||||
#include <map>
|
||||
#include <memory>
|
||||
|
||||
#ifndef RTI_USES_STD_FSTREAM
|
||||
#define RTI_USES_STD_FSTREAM
|
||||
#endif
|
||||
|
||||
#include <RTI.hh>
|
||||
|
||||
#include <simgear/structure/SGWeakPtr.hxx>
|
||||
|
||||
#include "RTIObjectInstance.hxx"
|
||||
#include "RTI13ObjectClass.hxx"
|
||||
|
||||
namespace simgear {
|
||||
|
||||
class RTI13Ambassador;
|
||||
class RTI13ObjectClass;
|
||||
|
||||
typedef std::pair<RTI::AttributeHandle, RTIData> RTI13AttributeHandleDataPair;
|
||||
typedef std::list<RTI13AttributeHandleDataPair> RTI13AttributeHandleDataPairList;
|
||||
|
||||
class RTI13ObjectInstance : public RTIObjectInstance {
|
||||
public:
|
||||
RTI13ObjectInstance(const RTI::ObjectHandle& handle, HLAObjectInstance* hlaObjectInstance, const RTI13ObjectClass* objectClass, RTI13Ambassador* ambassador, bool owned);
|
||||
virtual ~RTI13ObjectInstance();
|
||||
|
||||
const RTI::ObjectHandle& getHandle() const
|
||||
{ return _handle; }
|
||||
void setHandle(const RTI::ObjectHandle& handle)
|
||||
{ _handle = handle; }
|
||||
|
||||
virtual const RTIObjectClass* getObjectClass() const;
|
||||
const RTI13ObjectClass* get13ObjectClass() const;
|
||||
|
||||
unsigned getNumAttributes() const
|
||||
{ return get13ObjectClass()->getNumAttributes(); }
|
||||
unsigned getAttributeIndex(const std::string& name) const
|
||||
{ return get13ObjectClass()->getAttributeIndex(name); }
|
||||
unsigned getAttributeIndex(const RTI::AttributeHandle& handle) const
|
||||
{ return get13ObjectClass()->getAttributeIndex(handle); }
|
||||
RTI::AttributeHandle getAttributeHandle(unsigned index) const
|
||||
{ return get13ObjectClass()->getAttributeHandle(index); }
|
||||
|
||||
virtual std::string getName() const;
|
||||
|
||||
virtual void deleteObjectInstance(const RTIData& tag);
|
||||
virtual void deleteObjectInstance(const SGTimeStamp& timeStamp, const RTIData& tag);
|
||||
virtual void localDeleteObjectInstance();
|
||||
|
||||
void reflectAttributeValues(RTI13AttributeHandleDataPairList& attributeHandleDataPairList, const RTIData& tag);
|
||||
void reflectAttributeValues(RTI13AttributeHandleDataPairList& attributeHandleDataPairList, const SGTimeStamp& timeStamp, const RTIData& tag);
|
||||
virtual void requestObjectAttributeValueUpdate();
|
||||
void provideAttributeValueUpdate(const std::vector<RTI::AttributeHandle>& attributes);
|
||||
|
||||
virtual void updateAttributeValues(const RTIData& tag);
|
||||
virtual void updateAttributeValues(const SGTimeStamp& timeStamp, const RTIData& tag);
|
||||
|
||||
void attributesInScope(const std::vector<RTI::AttributeHandle>& attributes);
|
||||
void attributesOutOfScope(const std::vector<RTI::AttributeHandle>& attributes);
|
||||
|
||||
void turnUpdatesOnForObjectInstance(const std::vector<RTI::AttributeHandle>& attributes);
|
||||
void turnUpdatesOffForObjectInstance(const std::vector<RTI::AttributeHandle>& attributes);
|
||||
|
||||
// Not yet sure what to do here. But the dispatch functions are already there
|
||||
void requestAttributeOwnershipAssumption(const std::vector<RTI::AttributeHandle>& attributes, const RTIData& tag);
|
||||
void attributeOwnershipDivestitureNotification(const std::vector<RTI::AttributeHandle>& attributes);
|
||||
void attributeOwnershipAcquisitionNotification(const std::vector<RTI::AttributeHandle>& attributes);
|
||||
void attributeOwnershipUnavailable(const std::vector<RTI::AttributeHandle>& attributes);
|
||||
void requestAttributeOwnershipRelease(const std::vector<RTI::AttributeHandle>& attributes, const RTIData& tag);
|
||||
void confirmAttributeOwnershipAcquisitionCancellation(const std::vector<RTI::AttributeHandle>& attributes);
|
||||
void informAttributeOwnership(RTI::AttributeHandle attributeHandle, RTI::FederateHandle federateHandle);
|
||||
void attributeIsNotOwned(RTI::AttributeHandle attributeHandle);
|
||||
void attributeOwnedByRTI(RTI::AttributeHandle attributeHandle);
|
||||
|
||||
private:
|
||||
RTI::ObjectHandle _handle;
|
||||
SGSharedPtr<const RTI13ObjectClass> _objectClass;
|
||||
SGSharedPtr<RTI13Ambassador> _ambassador;
|
||||
|
||||
// cached storage for updates
|
||||
std::auto_ptr<RTI::AttributeHandleValuePairSet> _attributeValuePairSet;
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
#endif
|
||||
580
simgear/hla/RTIData.hxx
Normal file
580
simgear/hla/RTIData.hxx
Normal file
@@ -0,0 +1,580 @@
|
||||
// Copyright (C) 2009 - 2010 Mathias Froehlich - Mathias.Froehlich@web.de
|
||||
//
|
||||
// This library is free software; you can redistribute it and/or
|
||||
// modify it under the terms of the GNU Library General Public
|
||||
// License as published by the Free Software Foundation; either
|
||||
// version 2 of the License, or (at your option) any later version.
|
||||
//
|
||||
// This library is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
// Library General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program; if not, write to the Free Software
|
||||
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
//
|
||||
|
||||
#ifndef RTIData_hxx
|
||||
#define RTIData_hxx
|
||||
|
||||
#include <cstring>
|
||||
#include <list>
|
||||
#include <simgear/misc/stdint.hxx>
|
||||
|
||||
namespace simgear {
|
||||
|
||||
/// Sigh, this is std::vector<char>, except that
|
||||
/// you could feed that with external pointers without copying ...
|
||||
/// Note on alignment: the c++ standard garantees (5.3.4.10) that
|
||||
/// new (unsigned) char returns sufficiently aligned memory
|
||||
/// for all relevant cases
|
||||
class RTIData {
|
||||
public:
|
||||
RTIData() :
|
||||
_data(0),
|
||||
_size(0),
|
||||
_capacity(0)
|
||||
{ }
|
||||
RTIData(unsigned size) :
|
||||
_data(0),
|
||||
_size(0),
|
||||
_capacity(0)
|
||||
{ resize(size); }
|
||||
RTIData(char* data, unsigned size) :
|
||||
_data(data),
|
||||
_size(size),
|
||||
_capacity(0)
|
||||
{ }
|
||||
RTIData(const char* data, unsigned size) :
|
||||
_data(0),
|
||||
_size(0),
|
||||
_capacity(0)
|
||||
{ setData(data, size); }
|
||||
RTIData(const char* data) :
|
||||
_data(0),
|
||||
_size(0),
|
||||
_capacity(0)
|
||||
{ setData(data); }
|
||||
RTIData(const RTIData& data) :
|
||||
_data(0),
|
||||
_size(0),
|
||||
_capacity(0)
|
||||
{
|
||||
unsigned size = data.size();
|
||||
if (size) {
|
||||
resize(size);
|
||||
memcpy(_data, data.data(), size);
|
||||
}
|
||||
}
|
||||
~RTIData()
|
||||
{
|
||||
if (_capacity)
|
||||
delete [] _data;
|
||||
_data = 0;
|
||||
}
|
||||
|
||||
const char* data() const
|
||||
{ return _data; }
|
||||
char* data()
|
||||
{ return _data; }
|
||||
|
||||
unsigned size() const
|
||||
{ return _size; }
|
||||
|
||||
bool empty() const
|
||||
{ return _size == 0; }
|
||||
|
||||
void clear()
|
||||
{
|
||||
if (_capacity == 0) {
|
||||
_data = 0;
|
||||
_size = 0;
|
||||
} else
|
||||
resize(0);
|
||||
}
|
||||
|
||||
void resize(unsigned size)
|
||||
{
|
||||
if (size == _size)
|
||||
return;
|
||||
if (_capacity < size) {
|
||||
unsigned capacity = 2*_capacity;
|
||||
if (size < capacity)
|
||||
ensureCapacity(capacity);
|
||||
else
|
||||
ensureCapacity(size);
|
||||
}
|
||||
_size = size;
|
||||
}
|
||||
|
||||
void reserve(unsigned capacity)
|
||||
{
|
||||
if (capacity <= _capacity)
|
||||
return;
|
||||
ensureCapacity(capacity);
|
||||
}
|
||||
|
||||
void swap(RTIData& data)
|
||||
{
|
||||
std::swap(_data, data._data);
|
||||
std::swap(_size, data._size);
|
||||
std::swap(_capacity, data._capacity);
|
||||
}
|
||||
|
||||
void setData(char* data, unsigned size)
|
||||
{
|
||||
if (_capacity)
|
||||
delete [] _data;
|
||||
_data = data;
|
||||
_size = size;
|
||||
_capacity = 0;
|
||||
}
|
||||
void setData(const char* data, unsigned size)
|
||||
{
|
||||
resize(size);
|
||||
if (!size)
|
||||
return;
|
||||
memcpy(_data, data, size);
|
||||
}
|
||||
void setData(const char* data)
|
||||
{
|
||||
if (!data) {
|
||||
setData("", 1);
|
||||
} else {
|
||||
size_t size = strlen(data) + 1;
|
||||
setData(data, size);
|
||||
}
|
||||
}
|
||||
|
||||
RTIData& operator=(const RTIData& data)
|
||||
{
|
||||
unsigned size = data.size();
|
||||
if (size) {
|
||||
resize(size);
|
||||
memcpy(_data, data.data(), size);
|
||||
}
|
||||
return *this;
|
||||
}
|
||||
|
||||
void getData8(char data[1], unsigned offset = 0) const
|
||||
{
|
||||
data[0] = _data[offset];
|
||||
}
|
||||
|
||||
void setData8(const char data[1], unsigned offset = 0)
|
||||
{
|
||||
_data[offset] = data[0];
|
||||
}
|
||||
|
||||
void getData16LE(char data[2], unsigned offset = 0) const
|
||||
{
|
||||
if (hostIsLittleEndian()) {
|
||||
data[0] = _data[offset];
|
||||
data[1] = _data[offset+1];
|
||||
} else {
|
||||
data[1] = _data[offset];
|
||||
data[0] = _data[offset+1];
|
||||
}
|
||||
}
|
||||
void setData16LE(const char data[2], unsigned offset = 0)
|
||||
{
|
||||
if (hostIsLittleEndian()) {
|
||||
_data[offset] = data[0];
|
||||
_data[offset+1] = data[1];
|
||||
} else {
|
||||
_data[offset] = data[1];
|
||||
_data[offset+1] = data[0];
|
||||
}
|
||||
}
|
||||
|
||||
void getData16BE(char data[2], unsigned offset = 0) const
|
||||
{
|
||||
if (hostIsLittleEndian()) {
|
||||
data[1] = _data[offset];
|
||||
data[0] = _data[offset+1];
|
||||
} else {
|
||||
data[0] = _data[offset];
|
||||
data[1] = _data[offset+1];
|
||||
}
|
||||
}
|
||||
void setData16BE(const char data[2], unsigned offset = 0)
|
||||
{
|
||||
if (hostIsLittleEndian()) {
|
||||
_data[offset] = data[1];
|
||||
_data[offset+1] = data[0];
|
||||
} else {
|
||||
_data[offset] = data[0];
|
||||
_data[offset+1] = data[1];
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void getData32LE(char data[4], unsigned offset = 0) const
|
||||
{
|
||||
if (hostIsLittleEndian()) {
|
||||
data[0] = _data[offset];
|
||||
data[1] = _data[offset+1];
|
||||
data[2] = _data[offset+2];
|
||||
data[3] = _data[offset+3];
|
||||
} else {
|
||||
data[3] = _data[offset];
|
||||
data[2] = _data[offset+1];
|
||||
data[1] = _data[offset+2];
|
||||
data[0] = _data[offset+3];
|
||||
}
|
||||
}
|
||||
void setData32LE(const char data[4], unsigned offset = 0)
|
||||
{
|
||||
if (hostIsLittleEndian()) {
|
||||
_data[offset] = data[0];
|
||||
_data[offset+1] = data[1];
|
||||
_data[offset+2] = data[2];
|
||||
_data[offset+3] = data[3];
|
||||
} else {
|
||||
_data[offset] = data[3];
|
||||
_data[offset+1] = data[2];
|
||||
_data[offset+2] = data[1];
|
||||
_data[offset+3] = data[0];
|
||||
}
|
||||
}
|
||||
|
||||
void getData32BE(char data[4], unsigned offset = 0) const
|
||||
{
|
||||
if (hostIsLittleEndian()) {
|
||||
data[3] = _data[offset];
|
||||
data[2] = _data[offset+1];
|
||||
data[1] = _data[offset+2];
|
||||
data[0] = _data[offset+3];
|
||||
} else {
|
||||
data[0] = _data[offset];
|
||||
data[1] = _data[offset+1];
|
||||
data[2] = _data[offset+2];
|
||||
data[3] = _data[offset+3];
|
||||
}
|
||||
}
|
||||
void setData32BE(const char data[4], unsigned offset = 0)
|
||||
{
|
||||
if (hostIsLittleEndian()) {
|
||||
_data[offset] = data[3];
|
||||
_data[offset+1] = data[2];
|
||||
_data[offset+2] = data[1];
|
||||
_data[offset+3] = data[0];
|
||||
} else {
|
||||
_data[offset] = data[0];
|
||||
_data[offset+1] = data[1];
|
||||
_data[offset+2] = data[2];
|
||||
_data[offset+3] = data[3];
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void getData64LE(char data[8], unsigned offset = 0) const
|
||||
{
|
||||
if (hostIsLittleEndian()) {
|
||||
data[0] = _data[offset];
|
||||
data[1] = _data[offset+1];
|
||||
data[2] = _data[offset+2];
|
||||
data[3] = _data[offset+3];
|
||||
data[4] = _data[offset+4];
|
||||
data[5] = _data[offset+5];
|
||||
data[6] = _data[offset+6];
|
||||
data[7] = _data[offset+7];
|
||||
} else {
|
||||
data[7] = _data[offset];
|
||||
data[6] = _data[offset+1];
|
||||
data[5] = _data[offset+2];
|
||||
data[4] = _data[offset+3];
|
||||
data[3] = _data[offset+4];
|
||||
data[2] = _data[offset+5];
|
||||
data[1] = _data[offset+6];
|
||||
data[0] = _data[offset+7];
|
||||
}
|
||||
}
|
||||
void setData64LE(const char data[8], unsigned offset = 0)
|
||||
{
|
||||
if (hostIsLittleEndian()) {
|
||||
_data[offset] = data[0];
|
||||
_data[offset+1] = data[1];
|
||||
_data[offset+2] = data[2];
|
||||
_data[offset+3] = data[3];
|
||||
_data[offset+4] = data[4];
|
||||
_data[offset+5] = data[5];
|
||||
_data[offset+6] = data[6];
|
||||
_data[offset+7] = data[7];
|
||||
} else {
|
||||
_data[offset] = data[7];
|
||||
_data[offset+1] = data[6];
|
||||
_data[offset+2] = data[5];
|
||||
_data[offset+3] = data[4];
|
||||
_data[offset+4] = data[3];
|
||||
_data[offset+5] = data[2];
|
||||
_data[offset+6] = data[1];
|
||||
_data[offset+7] = data[0];
|
||||
}
|
||||
}
|
||||
|
||||
void getData64BE(char data[8], unsigned offset = 0) const
|
||||
{
|
||||
if (hostIsLittleEndian()) {
|
||||
data[7] = _data[offset];
|
||||
data[6] = _data[offset+1];
|
||||
data[5] = _data[offset+2];
|
||||
data[4] = _data[offset+3];
|
||||
data[3] = _data[offset+4];
|
||||
data[2] = _data[offset+5];
|
||||
data[1] = _data[offset+6];
|
||||
data[0] = _data[offset+7];
|
||||
} else {
|
||||
data[0] = _data[offset];
|
||||
data[1] = _data[offset+1];
|
||||
data[2] = _data[offset+2];
|
||||
data[3] = _data[offset+3];
|
||||
data[4] = _data[offset+4];
|
||||
data[5] = _data[offset+5];
|
||||
data[6] = _data[offset+6];
|
||||
data[7] = _data[offset+7];
|
||||
}
|
||||
}
|
||||
void setData64BE(const char data[8], unsigned offset = 0)
|
||||
{
|
||||
if (hostIsLittleEndian()) {
|
||||
_data[offset] = data[7];
|
||||
_data[offset+1] = data[6];
|
||||
_data[offset+2] = data[5];
|
||||
_data[offset+3] = data[4];
|
||||
_data[offset+4] = data[3];
|
||||
_data[offset+5] = data[2];
|
||||
_data[offset+6] = data[1];
|
||||
_data[offset+7] = data[0];
|
||||
} else {
|
||||
_data[offset] = data[0];
|
||||
_data[offset+1] = data[1];
|
||||
_data[offset+2] = data[2];
|
||||
_data[offset+3] = data[3];
|
||||
_data[offset+4] = data[4];
|
||||
_data[offset+5] = data[5];
|
||||
_data[offset+6] = data[6];
|
||||
_data[offset+7] = data[7];
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
#define TYPED_GETSET_IMPLEMENTATION(type, base, suffix) \
|
||||
type get##base##suffix(unsigned offset = 0) const \
|
||||
{ \
|
||||
union { \
|
||||
type t; \
|
||||
char u8[sizeof(type)]; \
|
||||
} u; \
|
||||
getData##suffix(u.u8, offset); \
|
||||
return u.t; \
|
||||
} \
|
||||
void set##base##suffix(type value, unsigned offset = 0) \
|
||||
{ \
|
||||
union { \
|
||||
type t; \
|
||||
char u8[sizeof(type)]; \
|
||||
} u; \
|
||||
u.t = value; \
|
||||
setData##suffix(u.u8, offset); \
|
||||
}
|
||||
|
||||
TYPED_GETSET_IMPLEMENTATION(uint8_t, UInt, 8)
|
||||
TYPED_GETSET_IMPLEMENTATION(int8_t, Int, 8)
|
||||
TYPED_GETSET_IMPLEMENTATION(uint16_t, UInt, 16LE)
|
||||
TYPED_GETSET_IMPLEMENTATION(uint16_t, UInt, 16BE)
|
||||
TYPED_GETSET_IMPLEMENTATION(int16_t, Int, 16LE)
|
||||
TYPED_GETSET_IMPLEMENTATION(int16_t, Int, 16BE)
|
||||
TYPED_GETSET_IMPLEMENTATION(uint32_t, UInt, 32LE)
|
||||
TYPED_GETSET_IMPLEMENTATION(uint32_t, UInt, 32BE)
|
||||
TYPED_GETSET_IMPLEMENTATION(int32_t, Int, 32LE)
|
||||
TYPED_GETSET_IMPLEMENTATION(int32_t, Int, 32BE)
|
||||
TYPED_GETSET_IMPLEMENTATION(uint64_t, UInt, 64LE)
|
||||
TYPED_GETSET_IMPLEMENTATION(uint64_t, UInt, 64BE)
|
||||
TYPED_GETSET_IMPLEMENTATION(int64_t, Int, 64LE)
|
||||
TYPED_GETSET_IMPLEMENTATION(int64_t, Int, 64BE)
|
||||
|
||||
TYPED_GETSET_IMPLEMENTATION(float, Float, 32LE)
|
||||
TYPED_GETSET_IMPLEMENTATION(float, Float, 32BE)
|
||||
TYPED_GETSET_IMPLEMENTATION(double, Float, 64LE)
|
||||
TYPED_GETSET_IMPLEMENTATION(double, Float, 64BE)
|
||||
|
||||
#undef TYPED_GETSET_IMPLEMENTATION
|
||||
|
||||
private:
|
||||
static inline bool hostIsLittleEndian()
|
||||
{
|
||||
union {
|
||||
uint16_t u16;
|
||||
uint8_t u8[2];
|
||||
} u;
|
||||
u.u16 = 1;
|
||||
return u.u8[0] == 1;
|
||||
}
|
||||
|
||||
void ensureCapacity(unsigned capacity)
|
||||
{
|
||||
if (capacity < 32)
|
||||
capacity = 32;
|
||||
char* data = new char[capacity];
|
||||
if (_size)
|
||||
memcpy(data, _data, _size);
|
||||
if (_capacity)
|
||||
delete [] _data;
|
||||
_data = data;
|
||||
_capacity = capacity;
|
||||
}
|
||||
|
||||
char* _data;
|
||||
unsigned _size;
|
||||
unsigned _capacity;
|
||||
};
|
||||
|
||||
// A single attribute/parameter update blob
|
||||
typedef std::pair<unsigned, RTIData> RTIIndexDataPair;
|
||||
|
||||
// A complete set of updates we received in one reflect/receive call
|
||||
typedef std::list<RTIIndexDataPair> RTIIndexDataPairList;
|
||||
|
||||
/// Gets an own header at some time
|
||||
|
||||
class RTIBasicDataStream {
|
||||
public:
|
||||
RTIBasicDataStream() : _offset(0) {}
|
||||
|
||||
/// Get aligned offset that aligns to a multiple of size
|
||||
static inline unsigned getAlignedOffset(unsigned offset, unsigned size)
|
||||
{
|
||||
return ((offset + size - 1)/size) * size;
|
||||
}
|
||||
|
||||
protected:
|
||||
unsigned _offset;
|
||||
};
|
||||
|
||||
class HLADecodeStream : public RTIBasicDataStream {
|
||||
public:
|
||||
HLADecodeStream(const RTIData& value) :
|
||||
_value(value)
|
||||
{ }
|
||||
|
||||
bool alignOffsetForSize(unsigned size)
|
||||
{
|
||||
_offset = getAlignedOffset(_offset, size);
|
||||
return _offset <= _value.size();
|
||||
}
|
||||
|
||||
bool skip(unsigned size)
|
||||
{
|
||||
_offset += size;
|
||||
return _offset <= _value.size();
|
||||
}
|
||||
|
||||
bool eof() const
|
||||
{ return _value.size() <= _offset; }
|
||||
|
||||
const RTIData& getData() const
|
||||
{ return _value; }
|
||||
|
||||
#define TYPED_READ_IMPLEMENTATION(type, base, suffix) \
|
||||
bool decode##base##suffix(type& value) \
|
||||
{ \
|
||||
if (_value.size() < _offset + sizeof(type)) \
|
||||
return false; \
|
||||
value = _value.get##base##suffix(_offset); \
|
||||
_offset += sizeof(type); \
|
||||
return true; \
|
||||
}
|
||||
|
||||
TYPED_READ_IMPLEMENTATION(uint8_t, UInt, 8)
|
||||
TYPED_READ_IMPLEMENTATION(int8_t, Int, 8)
|
||||
TYPED_READ_IMPLEMENTATION(uint16_t, UInt, 16LE)
|
||||
TYPED_READ_IMPLEMENTATION(uint16_t, UInt, 16BE)
|
||||
TYPED_READ_IMPLEMENTATION(int16_t, Int, 16LE)
|
||||
TYPED_READ_IMPLEMENTATION(int16_t, Int, 16BE)
|
||||
TYPED_READ_IMPLEMENTATION(uint32_t, UInt, 32LE)
|
||||
TYPED_READ_IMPLEMENTATION(uint32_t, UInt, 32BE)
|
||||
TYPED_READ_IMPLEMENTATION(int32_t, Int, 32LE)
|
||||
TYPED_READ_IMPLEMENTATION(int32_t, Int, 32BE)
|
||||
TYPED_READ_IMPLEMENTATION(uint64_t, UInt, 64LE)
|
||||
TYPED_READ_IMPLEMENTATION(uint64_t, UInt, 64BE)
|
||||
TYPED_READ_IMPLEMENTATION(int64_t, Int, 64LE)
|
||||
TYPED_READ_IMPLEMENTATION(int64_t, Int, 64BE)
|
||||
|
||||
TYPED_READ_IMPLEMENTATION(float, Float, 32LE)
|
||||
TYPED_READ_IMPLEMENTATION(float, Float, 32BE)
|
||||
TYPED_READ_IMPLEMENTATION(double, Float, 64LE)
|
||||
TYPED_READ_IMPLEMENTATION(double, Float, 64BE)
|
||||
|
||||
#undef TYPED_READ_IMPLEMENTATION
|
||||
|
||||
private:
|
||||
const RTIData& _value;
|
||||
};
|
||||
|
||||
class HLAEncodeStream : public RTIBasicDataStream {
|
||||
public:
|
||||
HLAEncodeStream(RTIData& value) :
|
||||
_value(value)
|
||||
{ }
|
||||
|
||||
bool alignOffsetForSize(unsigned size)
|
||||
{
|
||||
_offset = getAlignedOffset(_offset, size);
|
||||
_value.resize(_offset);
|
||||
return true;
|
||||
}
|
||||
|
||||
bool skip(unsigned size)
|
||||
{
|
||||
_offset += size;
|
||||
_value.resize(_offset);
|
||||
return true;
|
||||
}
|
||||
|
||||
bool eof() const
|
||||
{ return _value.size() <= _offset; }
|
||||
|
||||
void setData(const RTIData& data)
|
||||
{ _value = data; }
|
||||
|
||||
#define TYPED_WRITE_IMPLEMENTATION(type, base, suffix) \
|
||||
bool encode##base##suffix(type value) \
|
||||
{ \
|
||||
unsigned nextOffset = _offset + sizeof(type); \
|
||||
_value.resize(nextOffset); \
|
||||
_value.set##base##suffix(value, _offset); \
|
||||
_offset = nextOffset; \
|
||||
return true; \
|
||||
}
|
||||
|
||||
TYPED_WRITE_IMPLEMENTATION(uint8_t, UInt, 8)
|
||||
TYPED_WRITE_IMPLEMENTATION(int8_t, Int, 8)
|
||||
TYPED_WRITE_IMPLEMENTATION(uint16_t, UInt, 16LE)
|
||||
TYPED_WRITE_IMPLEMENTATION(uint16_t, UInt, 16BE)
|
||||
TYPED_WRITE_IMPLEMENTATION(int16_t, Int, 16LE)
|
||||
TYPED_WRITE_IMPLEMENTATION(int16_t, Int, 16BE)
|
||||
TYPED_WRITE_IMPLEMENTATION(uint32_t, UInt, 32LE)
|
||||
TYPED_WRITE_IMPLEMENTATION(uint32_t, UInt, 32BE)
|
||||
TYPED_WRITE_IMPLEMENTATION(int32_t, Int, 32LE)
|
||||
TYPED_WRITE_IMPLEMENTATION(int32_t, Int, 32BE)
|
||||
TYPED_WRITE_IMPLEMENTATION(uint64_t, UInt, 64LE)
|
||||
TYPED_WRITE_IMPLEMENTATION(uint64_t, UInt, 64BE)
|
||||
TYPED_WRITE_IMPLEMENTATION(int64_t, Int, 64LE)
|
||||
TYPED_WRITE_IMPLEMENTATION(int64_t, Int, 64BE)
|
||||
|
||||
TYPED_WRITE_IMPLEMENTATION(float, Float, 32LE)
|
||||
TYPED_WRITE_IMPLEMENTATION(float, Float, 32BE)
|
||||
TYPED_WRITE_IMPLEMENTATION(double, Float, 64LE)
|
||||
TYPED_WRITE_IMPLEMENTATION(double, Float, 64BE)
|
||||
|
||||
#undef TYPED_WRITE_IMPLEMENTATION
|
||||
|
||||
private:
|
||||
RTIData& _value;
|
||||
};
|
||||
|
||||
} // namespace simgear
|
||||
|
||||
#endif
|
||||
@@ -1,7 +1,4 @@
|
||||
|
||||
// Written by James Turner, started July 2010.
|
||||
//
|
||||
// Copyright (C) 2010 Curtis L. Olson - http://www.flightgear.org/~curt
|
||||
// Copyright (C) 2009 - 2010 Mathias Froehlich - Mathias.Froehlich@web.de
|
||||
//
|
||||
// This library is free software; you can redistribute it and/or
|
||||
// modify it under the terms of the GNU Library General Public
|
||||
@@ -17,25 +14,17 @@
|
||||
// along with this program; if not, write to the Free Software
|
||||
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
//
|
||||
// $Id$
|
||||
|
||||
#include "RTIFederate.hxx"
|
||||
|
||||
#ifndef _SG_SLEEP_HXX
|
||||
#define _SG_SLEEP_HXX
|
||||
namespace simgear {
|
||||
|
||||
|
||||
#include <simgear/compiler.h>
|
||||
|
||||
|
||||
namespace simgear
|
||||
RTIFederate::RTIFederate()
|
||||
{
|
||||
}
|
||||
|
||||
void sleepForSeconds(int seconds);
|
||||
|
||||
void sleepForMSec(int msec);
|
||||
|
||||
} // of namespace simgear
|
||||
|
||||
#endif // _SG_SLEEP_HXX
|
||||
|
||||
RTIFederate::~RTIFederate()
|
||||
{
|
||||
}
|
||||
|
||||
}
|
||||
93
simgear/hla/RTIFederate.hxx
Normal file
93
simgear/hla/RTIFederate.hxx
Normal file
@@ -0,0 +1,93 @@
|
||||
// Copyright (C) 2009 - 2011 Mathias Froehlich - Mathias.Froehlich@web.de
|
||||
//
|
||||
// This library is free software; you can redistribute it and/or
|
||||
// modify it under the terms of the GNU Library General Public
|
||||
// License as published by the Free Software Foundation; either
|
||||
// version 2 of the License, or (at your option) any later version.
|
||||
//
|
||||
// This library is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
// Library General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program; if not, write to the Free Software
|
||||
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
//
|
||||
|
||||
#ifndef RTIFederate_hxx
|
||||
#define RTIFederate_hxx
|
||||
|
||||
#include <string>
|
||||
#include "simgear/structure/SGWeakReferenced.hxx"
|
||||
#include "RTIObjectClass.hxx"
|
||||
#include "RTIObjectInstance.hxx"
|
||||
|
||||
class SGTimeStamp;
|
||||
|
||||
namespace simgear {
|
||||
|
||||
class RTIFederate : public SGWeakReferenced {
|
||||
public:
|
||||
RTIFederate();
|
||||
virtual ~RTIFederate();
|
||||
|
||||
/// Create a federation execution
|
||||
/// Semantically this methods should be static,
|
||||
enum FederationManagementResult {
|
||||
FederationManagementSuccess,
|
||||
FederationManagementFail,
|
||||
FederationManagementFatal
|
||||
};
|
||||
|
||||
virtual FederationManagementResult createFederationExecution(const std::string& federation, const std::string& objectModel) = 0;
|
||||
virtual FederationManagementResult destroyFederationExecution(const std::string& federation) = 0;
|
||||
|
||||
/// Join with federateName the federation execution federation
|
||||
virtual FederationManagementResult join(const std::string& federateType, const std::string& federation) = 0;
|
||||
virtual bool resign() = 0;
|
||||
virtual bool getJoined() const = 0;
|
||||
|
||||
/// Synchronization Point handling
|
||||
virtual bool registerFederationSynchronizationPoint(const std::string& label, const RTIData& tag) = 0;
|
||||
virtual bool getFederationSynchronizationPointAnnounced(const std::string& label) = 0;
|
||||
virtual bool synchronizationPointAchieved(const std::string& label) = 0;
|
||||
virtual bool getFederationSynchronized(const std::string& label) = 0;
|
||||
|
||||
/// Time management
|
||||
virtual bool enableTimeConstrained() = 0;
|
||||
virtual bool disableTimeConstrained() = 0;
|
||||
virtual bool getTimeConstrainedEnabled() = 0;
|
||||
|
||||
virtual bool enableTimeRegulation(const SGTimeStamp& lookahead) = 0;
|
||||
virtual bool disableTimeRegulation() = 0;
|
||||
virtual bool modifyLookahead(const SGTimeStamp& timeStamp) = 0;
|
||||
virtual bool getTimeRegulationEnabled() = 0;
|
||||
|
||||
virtual bool timeAdvanceRequest(const SGTimeStamp& fedTime) = 0;
|
||||
virtual bool timeAdvanceRequestAvailable(const SGTimeStamp& timeStamp) = 0;
|
||||
virtual bool flushQueueRequest(const SGTimeStamp& timeStamp) = 0;
|
||||
virtual bool getTimeAdvancePending() = 0;
|
||||
|
||||
virtual bool queryFederateTime(SGTimeStamp& timeStamp) = 0;
|
||||
virtual bool queryLookahead(SGTimeStamp& timeStamp) = 0;
|
||||
virtual bool queryGALT(SGTimeStamp& timeStamp) = 0;
|
||||
virtual bool queryLITS(SGTimeStamp& timeStamp) = 0;
|
||||
|
||||
/// Process messages
|
||||
virtual bool processMessage() = 0;
|
||||
virtual bool processMessages(const double& minimum, const double& maximum) = 0;
|
||||
|
||||
virtual RTIObjectClass* createObjectClass(const std::string& name, HLAObjectClass* hlaObjectClass) = 0;
|
||||
// virtual RTIInteractionClass* createInteractionClass(const std::string& name) = 0;
|
||||
|
||||
virtual RTIObjectInstance* getObjectInstance(const std::string& name) = 0;
|
||||
|
||||
private:
|
||||
RTIFederate(const RTIFederate&);
|
||||
RTIFederate& operator=(const RTIFederate&);
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
#endif
|
||||
63
simgear/hla/RTIInteractionClass.hxx
Normal file
63
simgear/hla/RTIInteractionClass.hxx
Normal file
@@ -0,0 +1,63 @@
|
||||
// Copyright (C) 2009 - 2010 Mathias Froehlich - Mathias.Froehlich@web.de
|
||||
//
|
||||
// This library is free software; you can redistribute it and/or
|
||||
// modify it under the terms of the GNU Library General Public
|
||||
// License as published by the Free Software Foundation; either
|
||||
// version 2 of the License, or (at your option) any later version.
|
||||
//
|
||||
// This library is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
// Library General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program; if not, write to the Free Software
|
||||
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
//
|
||||
|
||||
#ifndef RTIInteractionClass_hxx
|
||||
#define RTIInteractionClass_hxx
|
||||
|
||||
#include <set>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
#include "simgear/structure/SGReferenced.hxx"
|
||||
#include "simgear/structure/SGSharedPtr.hxx"
|
||||
#include "simgear/structure/SGReferenced.hxx"
|
||||
#include "RTIData.hxx"
|
||||
|
||||
namespace simgear {
|
||||
|
||||
class RTIInteractionClass : public SGReferenced {
|
||||
public:
|
||||
RTIInteractionClass(const std::string& name);
|
||||
virtual ~RTIInteractionClass();
|
||||
|
||||
const std::string& getName() const
|
||||
{ return _name; }
|
||||
|
||||
virtual unsigned getNumParameters() const = 0;
|
||||
virtual unsigned getParameterIndex(const std::string& name) const = 0;
|
||||
virtual unsigned getOrCreateParameterIndex(const std::string& name) = 0;
|
||||
|
||||
virtual bool publish(const std::set<unsigned>& indexSet) = 0;
|
||||
virtual bool unpublish() = 0;
|
||||
|
||||
virtual bool subscribe(const std::set<unsigned>& indexSet, bool) = 0;
|
||||
virtual bool unsubscribe() = 0;
|
||||
|
||||
virtual void send(const RTIData& tag) = 0;
|
||||
virtual void send(const SGTimeStamp& timeStamp, const RTIData& tag) = 0;
|
||||
|
||||
class ReceiveCallback : public SGReferenced {
|
||||
public:
|
||||
virtual ~ReceiveCallback() {}
|
||||
};
|
||||
|
||||
private:
|
||||
std::string _name;
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
#endif
|
||||
67
simgear/hla/RTIObjectClass.cxx
Normal file
67
simgear/hla/RTIObjectClass.cxx
Normal file
@@ -0,0 +1,67 @@
|
||||
// Copyright (C) 2009 - 2010 Mathias Froehlich - Mathias.Froehlich@web.de
|
||||
//
|
||||
// This library is free software; you can redistribute it and/or
|
||||
// modify it under the terms of the GNU Library General Public
|
||||
// License as published by the Free Software Foundation; either
|
||||
// version 2 of the License, or (at your option) any later version.
|
||||
//
|
||||
// This library is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
// Library General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program; if not, write to the Free Software
|
||||
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
//
|
||||
|
||||
#include "RTIObjectClass.hxx"
|
||||
|
||||
#include "RTIObjectInstance.hxx"
|
||||
|
||||
namespace simgear {
|
||||
|
||||
RTIObjectClass::RTIObjectClass(HLAObjectClass* hlaObjectClass) :
|
||||
_hlaObjectClass(hlaObjectClass)
|
||||
{
|
||||
}
|
||||
|
||||
RTIObjectClass::~RTIObjectClass()
|
||||
{
|
||||
}
|
||||
|
||||
void
|
||||
RTIObjectClass::discoverInstance(RTIObjectInstance* objectInstance, const RTIData& tag) const
|
||||
{
|
||||
SGSharedPtr<HLAObjectClass> hlaObjectClass = _hlaObjectClass.lock();
|
||||
if (!hlaObjectClass.valid()) {
|
||||
SG_LOG(SG_NETWORK, SG_WARN, "RTI: Invalid hla object class pointer in RTIObjectClass::discoverInstance().");
|
||||
return;
|
||||
}
|
||||
hlaObjectClass->discoverInstance(objectInstance, tag);
|
||||
objectInstance->requestObjectAttributeValueUpdate();
|
||||
}
|
||||
|
||||
void
|
||||
RTIObjectClass::startRegistration() const
|
||||
{
|
||||
SGSharedPtr<HLAObjectClass> hlaObjectClass = _hlaObjectClass.lock();
|
||||
if (!hlaObjectClass.valid()) {
|
||||
SG_LOG(SG_NETWORK, SG_WARN, "RTI: Invalid hla object class pointer in RTIObjectClass::startRegstration().");
|
||||
return;
|
||||
}
|
||||
hlaObjectClass->startRegistrationCallback();
|
||||
}
|
||||
|
||||
void
|
||||
RTIObjectClass::stopRegistration() const
|
||||
{
|
||||
SGSharedPtr<HLAObjectClass> hlaObjectClass = _hlaObjectClass.lock();
|
||||
if (!hlaObjectClass.valid()) {
|
||||
SG_LOG(SG_NETWORK, SG_WARN, "RTI: Invalid hla object class pointer in RTIObjectClass::stopRegistration().");
|
||||
return;
|
||||
}
|
||||
hlaObjectClass->stopRegistrationCallback();
|
||||
}
|
||||
|
||||
}
|
||||
122
simgear/hla/RTIObjectClass.hxx
Normal file
122
simgear/hla/RTIObjectClass.hxx
Normal file
@@ -0,0 +1,122 @@
|
||||
// Copyright (C) 2009 - 2010 Mathias Froehlich - Mathias.Froehlich@web.de
|
||||
//
|
||||
// This library is free software; you can redistribute it and/or
|
||||
// modify it under the terms of the GNU Library General Public
|
||||
// License as published by the Free Software Foundation; either
|
||||
// version 2 of the License, or (at your option) any later version.
|
||||
//
|
||||
// This library is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
// Library General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program; if not, write to the Free Software
|
||||
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
//
|
||||
|
||||
#ifndef RTIObjectClass_hxx
|
||||
#define RTIObjectClass_hxx
|
||||
|
||||
#include <string>
|
||||
#include <vector>
|
||||
#include "simgear/structure/SGReferenced.hxx"
|
||||
#include "simgear/structure/SGSharedPtr.hxx"
|
||||
#include "simgear/structure/SGWeakPtr.hxx"
|
||||
#include "RTIData.hxx"
|
||||
#include "HLAObjectClass.hxx"
|
||||
|
||||
namespace simgear {
|
||||
|
||||
class RTIObjectInstance;
|
||||
class HLAObjectClass;
|
||||
|
||||
class RTIObjectClass : public SGReferenced {
|
||||
public:
|
||||
RTIObjectClass(HLAObjectClass* hlaObjectClass);
|
||||
virtual ~RTIObjectClass();
|
||||
|
||||
virtual std::string getName() const = 0;
|
||||
|
||||
virtual unsigned getNumAttributes() const = 0;
|
||||
virtual unsigned getAttributeIndex(const std::string& name) const = 0;
|
||||
virtual unsigned getOrCreateAttributeIndex(const std::string& name) = 0;
|
||||
|
||||
virtual bool publish(const std::set<unsigned>& indexSet) = 0;
|
||||
virtual bool unpublish() = 0;
|
||||
|
||||
virtual bool subscribe(const std::set<unsigned>& indexSet, bool) = 0;
|
||||
virtual bool unsubscribe() = 0;
|
||||
|
||||
// Factory to create an object instance that can be used in this current federate
|
||||
virtual RTIObjectInstance* registerObjectInstance(HLAObjectInstance*) = 0;
|
||||
|
||||
void discoverInstance(RTIObjectInstance* objectInstance, const RTIData& tag) const;
|
||||
|
||||
void startRegistration() const;
|
||||
void stopRegistration() const;
|
||||
|
||||
void setAttributeDataType(unsigned index, SGSharedPtr<const HLADataType> dataType)
|
||||
{
|
||||
if (_attributeDataVector.size() <= index)
|
||||
return;
|
||||
_attributeDataVector[index]._dataType = dataType;
|
||||
}
|
||||
const HLADataType* getAttributeDataType(unsigned index) const
|
||||
{
|
||||
if (_attributeDataVector.size() <= index)
|
||||
return 0;
|
||||
return _attributeDataVector[index]._dataType.get();
|
||||
}
|
||||
|
||||
HLAUpdateType getAttributeUpdateType(unsigned index) const
|
||||
{
|
||||
if (_attributeDataVector.size() <= index)
|
||||
return HLAUndefinedUpdate;
|
||||
return _attributeDataVector[index]._updateType;
|
||||
}
|
||||
void setAttributeUpdateType(unsigned index, HLAUpdateType updateType)
|
||||
{
|
||||
if (_attributeDataVector.size() <= index)
|
||||
return;
|
||||
_attributeDataVector[index]._updateType = updateType;
|
||||
}
|
||||
|
||||
bool getAttributeSubscribed(unsigned index) const
|
||||
{
|
||||
if (_attributeDataVector.size() <= index)
|
||||
return false;
|
||||
return _attributeDataVector[index]._subscribed;
|
||||
}
|
||||
bool getAttributePublished(unsigned index) const
|
||||
{
|
||||
if (_attributeDataVector.size() <= index)
|
||||
return false;
|
||||
return _attributeDataVector[index]._published;
|
||||
}
|
||||
std::string getAttributeName(unsigned index) const
|
||||
{
|
||||
if (_attributeDataVector.size() <= index)
|
||||
return std::string();
|
||||
return _attributeDataVector[index]._name;
|
||||
}
|
||||
|
||||
protected:
|
||||
struct AttributeData {
|
||||
AttributeData(const std::string& name) : _name(name), _subscribed(false), _published(false), _updateType(HLAUndefinedUpdate) {}
|
||||
std::string _name;
|
||||
SGSharedPtr<const HLADataType> _dataType;
|
||||
bool _subscribed;
|
||||
bool _published;
|
||||
HLAUpdateType _updateType;
|
||||
};
|
||||
typedef std::vector<AttributeData> AttributeDataVector;
|
||||
AttributeDataVector _attributeDataVector;
|
||||
|
||||
private:
|
||||
SGWeakPtr<HLAObjectClass> _hlaObjectClass;
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
#endif
|
||||
90
simgear/hla/RTIObjectInstance.cxx
Normal file
90
simgear/hla/RTIObjectInstance.cxx
Normal file
@@ -0,0 +1,90 @@
|
||||
// Copyright (C) 2009 - 2010 Mathias Froehlich - Mathias.Froehlich@web.de
|
||||
//
|
||||
// This library is free software; you can redistribute it and/or
|
||||
// modify it under the terms of the GNU Library General Public
|
||||
// License as published by the Free Software Foundation; either
|
||||
// version 2 of the License, or (at your option) any later version.
|
||||
//
|
||||
// This library is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
// Library General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program; if not, write to the Free Software
|
||||
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
//
|
||||
|
||||
#include "RTIObjectInstance.hxx"
|
||||
#include "RTIObjectClass.hxx"
|
||||
#include "HLAObjectInstance.hxx"
|
||||
|
||||
namespace simgear {
|
||||
|
||||
RTIObjectInstance::RTIObjectInstance(HLAObjectInstance* hlaObjectInstance) :
|
||||
_hlaObjectInstance(hlaObjectInstance),
|
||||
_pendingAttributeUpdateRequest(false)
|
||||
{
|
||||
}
|
||||
|
||||
RTIObjectInstance::~RTIObjectInstance()
|
||||
{
|
||||
}
|
||||
|
||||
unsigned
|
||||
RTIObjectInstance::getNumAttributes() const
|
||||
{
|
||||
return getObjectClass()->getNumAttributes();
|
||||
}
|
||||
|
||||
unsigned
|
||||
RTIObjectInstance::getAttributeIndex(const std::string& name) const
|
||||
{
|
||||
return getObjectClass()->getAttributeIndex(name);
|
||||
}
|
||||
|
||||
std::string
|
||||
RTIObjectInstance::getAttributeName(unsigned index) const
|
||||
{
|
||||
return getObjectClass()->getAttributeName(index);
|
||||
}
|
||||
|
||||
void
|
||||
RTIObjectInstance::removeInstance(const RTIData& tag)
|
||||
{
|
||||
SGSharedPtr<HLAObjectInstance> hlaObjectInstance = _hlaObjectInstance.lock();
|
||||
if (!hlaObjectInstance.valid())
|
||||
return;
|
||||
hlaObjectInstance->removeInstance(tag);
|
||||
}
|
||||
|
||||
void
|
||||
RTIObjectInstance::reflectAttributeValues(const RTIIndexDataPairList& dataPairList, const RTIData& tag)
|
||||
{
|
||||
for (RTIIndexDataPairList::const_iterator i = dataPairList.begin();
|
||||
i != dataPairList.end(); ++i) {
|
||||
reflectAttributeValue(i->first, i->second);
|
||||
}
|
||||
|
||||
SGSharedPtr<HLAObjectInstance> hlaObjectInstance = _hlaObjectInstance.lock();
|
||||
if (!hlaObjectInstance.valid())
|
||||
return;
|
||||
hlaObjectInstance->reflectAttributeValues(dataPairList, tag);
|
||||
}
|
||||
|
||||
void
|
||||
RTIObjectInstance::reflectAttributeValues(const RTIIndexDataPairList& dataPairList,
|
||||
const SGTimeStamp& timeStamp, const RTIData& tag)
|
||||
{
|
||||
for (RTIIndexDataPairList::const_iterator i = dataPairList.begin();
|
||||
i != dataPairList.end(); ++i) {
|
||||
reflectAttributeValue(i->first, i->second);
|
||||
}
|
||||
|
||||
SGSharedPtr<HLAObjectInstance> hlaObjectInstance = _hlaObjectInstance.lock();
|
||||
if (!hlaObjectInstance.valid())
|
||||
return;
|
||||
hlaObjectInstance->reflectAttributeValues(dataPairList, timeStamp, tag);
|
||||
}
|
||||
|
||||
}
|
||||
287
simgear/hla/RTIObjectInstance.hxx
Normal file
287
simgear/hla/RTIObjectInstance.hxx
Normal file
@@ -0,0 +1,287 @@
|
||||
// Copyright (C) 2009 - 2010 Mathias Froehlich - Mathias.Froehlich@web.de
|
||||
//
|
||||
// This library is free software; you can redistribute it and/or
|
||||
// modify it under the terms of the GNU Library General Public
|
||||
// License as published by the Free Software Foundation; either
|
||||
// version 2 of the License, or (at your option) any later version.
|
||||
//
|
||||
// This library is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
// Library General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program; if not, write to the Free Software
|
||||
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
//
|
||||
|
||||
#ifndef RTIObjectInstance_hxx
|
||||
#define RTIObjectInstance_hxx
|
||||
|
||||
#include <list>
|
||||
#include <map>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
#include "simgear/debug/logstream.hxx"
|
||||
#include "simgear/structure/SGReferenced.hxx"
|
||||
#include "simgear/structure/SGWeakPtr.hxx"
|
||||
#include "simgear/timing/timestamp.hxx"
|
||||
#include "RTIData.hxx"
|
||||
#include "RTIObjectClass.hxx"
|
||||
#include "HLADataElement.hxx"
|
||||
|
||||
class SGTimeStamp;
|
||||
|
||||
namespace simgear {
|
||||
|
||||
class RTIObjectClass;
|
||||
class HLAObjectInstance;
|
||||
|
||||
class RTIObjectInstance : public SGReferenced {
|
||||
public:
|
||||
RTIObjectInstance(HLAObjectInstance* hlaObjectInstance);
|
||||
virtual ~RTIObjectInstance();
|
||||
|
||||
virtual const RTIObjectClass* getObjectClass() const = 0;
|
||||
|
||||
virtual std::string getName() const = 0;
|
||||
|
||||
unsigned getNumAttributes() const;
|
||||
unsigned getAttributeIndex(const std::string& name) const;
|
||||
std::string getAttributeName(unsigned index) const;
|
||||
|
||||
virtual void deleteObjectInstance(const RTIData& tag) = 0;
|
||||
virtual void deleteObjectInstance(const SGTimeStamp& timeStamp, const RTIData& tag) = 0;
|
||||
virtual void localDeleteObjectInstance() = 0;
|
||||
|
||||
virtual void requestObjectAttributeValueUpdate() = 0;
|
||||
|
||||
virtual void updateAttributeValues(const RTIData& tag) = 0;
|
||||
virtual void updateAttributeValues(const SGTimeStamp& timeStamp, const RTIData& tag) = 0;
|
||||
|
||||
void removeInstance(const RTIData& tag);
|
||||
void reflectAttributeValues(const RTIIndexDataPairList& dataPairList, const RTIData& tag);
|
||||
void reflectAttributeValues(const RTIIndexDataPairList& dataPairList, const SGTimeStamp& timeStamp, const RTIData& tag);
|
||||
void reflectAttributeValue(unsigned i, const RTIData& data)
|
||||
{
|
||||
if (_attributeData.size() <= i)
|
||||
return;
|
||||
HLADataElement* dataElement = _attributeData[i]._dataElement.get();
|
||||
if (!dataElement)
|
||||
return;
|
||||
HLADecodeStream stream(data);
|
||||
dataElement->decode(stream);
|
||||
}
|
||||
|
||||
const HLADataType* getAttributeDataType(unsigned i) const
|
||||
{
|
||||
return getObjectClass()->getAttributeDataType(i);
|
||||
}
|
||||
HLAUpdateType getAttributeUpdateType(unsigned i) const
|
||||
{
|
||||
return getObjectClass()->getAttributeUpdateType(i);
|
||||
}
|
||||
bool getAttributeSubscribed(unsigned i) const
|
||||
{
|
||||
return getObjectClass()->getAttributeSubscribed(i);
|
||||
}
|
||||
bool getAttributePublished(unsigned i) const
|
||||
{
|
||||
return getObjectClass()->getAttributePublished(i);
|
||||
}
|
||||
|
||||
HLADataElement* getDataElement(unsigned i)
|
||||
{
|
||||
if (_attributeData.size() <= i)
|
||||
return 0;
|
||||
return _attributeData[i]._dataElement.get();
|
||||
}
|
||||
const HLADataElement* getDataElement(unsigned i) const
|
||||
{
|
||||
if (_attributeData.size() <= i)
|
||||
return 0;
|
||||
return _attributeData[i]._dataElement.get();
|
||||
}
|
||||
void setDataElement(unsigned i, HLADataElement* dataElement)
|
||||
{
|
||||
if (_attributeData.size() <= i)
|
||||
return;
|
||||
_attributeData[i]._dataElement = dataElement;
|
||||
}
|
||||
|
||||
void updateAttributesFromClass(bool owned)
|
||||
{
|
||||
// FIXME: rethink that!!!
|
||||
unsigned numAttributes = getNumAttributes();
|
||||
unsigned i = 0;
|
||||
for (; i < _attributeData.size(); ++i) {
|
||||
if (getAttributePublished(i)) {
|
||||
} else {
|
||||
_attributeData[i].setUpdateEnabled(false);
|
||||
_attributeData[i].setOwned(false);
|
||||
if (getAttributeSubscribed(i))
|
||||
_attributeData[i].setRequestUpdate(true);
|
||||
}
|
||||
}
|
||||
_attributeData.resize(numAttributes);
|
||||
for (; i < numAttributes; ++i) {
|
||||
if (getAttributePublished(i)) {
|
||||
_attributeData[i].setUpdateEnabled(true);
|
||||
_attributeData[i].setOwned(owned);
|
||||
if (!owned && getAttributeSubscribed(i))
|
||||
_attributeData[i].setRequestUpdate(true);
|
||||
} else {
|
||||
_attributeData[i].setUpdateEnabled(false);
|
||||
_attributeData[i].setOwned(false);
|
||||
if (getAttributeSubscribed(i))
|
||||
_attributeData[i].setRequestUpdate(true);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void setAttributeForceUpdate(unsigned i)
|
||||
{
|
||||
if (_attributeData.size() <= i)
|
||||
return;
|
||||
_attributeData[i].setForceUpdate(true);
|
||||
}
|
||||
void setAttributeInScope(unsigned i, bool inScope)
|
||||
{
|
||||
if (_attributeData.size() <= i)
|
||||
return;
|
||||
_attributeData[i].setInScope(inScope);
|
||||
}
|
||||
void setAttributeUpdateEnabled(unsigned i, bool enabled)
|
||||
{
|
||||
if (_attributeData.size() <= i)
|
||||
return;
|
||||
_attributeData[i].setUpdateEnabled(enabled);
|
||||
}
|
||||
void setAttributeUpdated(unsigned i)
|
||||
{
|
||||
if (_attributeData.size() <= i)
|
||||
return;
|
||||
_attributeData[i].setForceUpdate(false);
|
||||
}
|
||||
bool getAttributeEffectiveUpdateEnabled(unsigned i)
|
||||
{
|
||||
if (_attributeData.size() <= i)
|
||||
return false;
|
||||
if (!getAttributePublished(i))
|
||||
return false;
|
||||
if (!_attributeData[i]._updateEnabled)
|
||||
return false;
|
||||
if (!_attributeData[i]._inScope)
|
||||
return false;
|
||||
if (_attributeData[i]._forceUpdate)
|
||||
return true;
|
||||
switch (getAttributeUpdateType(i)) {
|
||||
case HLAPeriodicUpdate:
|
||||
return true;
|
||||
case HLAConditionalUpdate:
|
||||
return true; // FIXME
|
||||
case HLAStaticUpdate:
|
||||
return false;
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
}
|
||||
void setRequestAttributeUpdate(bool request)
|
||||
{
|
||||
for (unsigned i = 0; i < getNumAttributes(); ++i) {
|
||||
if (getAttributeUpdateType(i) == HLAPeriodicUpdate)
|
||||
continue;
|
||||
setRequestAttributeUpdate(i, request);
|
||||
}
|
||||
}
|
||||
void setRequestAttributeUpdate(unsigned i, bool request)
|
||||
{
|
||||
if (_attributeData.size() <= i)
|
||||
return;
|
||||
_attributeData[i].setRequestUpdate(request);
|
||||
if (request) {
|
||||
if (!_pendingAttributeUpdateRequest) {
|
||||
_pendingAttributeUpdateRequest = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
bool getRequestAttributeUpdate(unsigned i) const
|
||||
{
|
||||
if (_attributeData.size() <= i)
|
||||
return false;
|
||||
return _attributeData[i]._requestUpdate;
|
||||
}
|
||||
|
||||
void flushPendingRequests()
|
||||
{
|
||||
if (_pendingAttributeUpdateRequest) {
|
||||
requestObjectAttributeValueUpdate();
|
||||
_pendingAttributeUpdateRequest = false;
|
||||
}
|
||||
}
|
||||
|
||||
protected:
|
||||
// The backward reference to the user visible object
|
||||
SGWeakPtr<HLAObjectInstance> _hlaObjectInstance;
|
||||
|
||||
// Is true if we should emit a requestattr
|
||||
bool _pendingAttributeUpdateRequest;
|
||||
|
||||
// Pool of update list entries
|
||||
RTIIndexDataPairList _indexDataPairList;
|
||||
|
||||
// This adds raw storage for attribute index i to the end of the dataPairList.
|
||||
void getDataFromPool(RTIIndexDataPairList& dataPairList)
|
||||
{
|
||||
// Nothing left in the pool - so allocate something
|
||||
if (_indexDataPairList.empty()) {
|
||||
dataPairList.push_back(RTIIndexDataPairList::value_type());
|
||||
return;
|
||||
}
|
||||
|
||||
// Take one from the pool
|
||||
dataPairList.splice(dataPairList.end(), _indexDataPairList, _indexDataPairList.begin());
|
||||
}
|
||||
|
||||
void putDataToPool(RTIIndexDataPairList& dataPairList)
|
||||
{
|
||||
_indexDataPairList.splice(_indexDataPairList.begin(), dataPairList);
|
||||
}
|
||||
|
||||
struct AttributeData {
|
||||
AttributeData() : _owned(false), _inScope(true), _updateEnabled(true), _forceUpdate(false), _requestUpdate(false)
|
||||
{ }
|
||||
|
||||
// The hla level data element with tha actual local program
|
||||
// accessible data.
|
||||
SGSharedPtr<HLADataElement> _dataElement;
|
||||
// SGSharedPtr<HLADataElement::TimeStamp> _timeStamp;
|
||||
|
||||
// Pool of already allocated raw data used for reflection of updates
|
||||
RTIIndexDataPairList _indexDataPairList;
|
||||
|
||||
void setOwned(bool owned)
|
||||
{ _owned = owned; }
|
||||
void setInScope(bool inScope)
|
||||
{ _inScope = inScope; }
|
||||
void setUpdateEnabled(bool updateEnabled)
|
||||
{ _updateEnabled = updateEnabled; }
|
||||
void setForceUpdate(bool forceUpdate)
|
||||
{ _forceUpdate = forceUpdate; }
|
||||
void setRequestUpdate(bool requestUpdate)
|
||||
{ _requestUpdate = requestUpdate; }
|
||||
|
||||
bool _owned;
|
||||
bool _inScope;
|
||||
bool _updateEnabled;
|
||||
bool _forceUpdate;
|
||||
bool _requestUpdate;
|
||||
};
|
||||
std::vector<AttributeData> _attributeData;
|
||||
|
||||
friend class HLAObjectInstance;
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
#endif
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
include (SimGearComponent)
|
||||
|
||||
set(HEADERS
|
||||
set(HEADERS
|
||||
iochannel.hxx
|
||||
lowlevel.hxx
|
||||
raw_socket.hxx
|
||||
@@ -14,9 +14,11 @@ set(HEADERS
|
||||
sg_serial.hxx
|
||||
sg_socket.hxx
|
||||
sg_socket_udp.hxx
|
||||
HTTPClient.hxx
|
||||
HTTPRequest.hxx
|
||||
)
|
||||
|
||||
set(SOURCES
|
||||
set(SOURCES
|
||||
iochannel.cxx
|
||||
lowlevel.cxx
|
||||
raw_socket.cxx
|
||||
@@ -28,6 +30,41 @@ set(SOURCES
|
||||
sg_serial.cxx
|
||||
sg_socket.cxx
|
||||
sg_socket_udp.cxx
|
||||
HTTPClient.cxx
|
||||
HTTPRequest.cxx
|
||||
)
|
||||
|
||||
simgear_component(io io "${SOURCES}" "${HEADERS}")
|
||||
simgear_component(io io "${SOURCES}" "${HEADERS}")
|
||||
|
||||
if(ENABLE_TESTS)
|
||||
|
||||
if (SIMGEAR_SHARED)
|
||||
set(TEST_LIBS SimGearCore)
|
||||
else()
|
||||
set(TEST_LIBS
|
||||
sgio sgbucket sgstructure sgthreads sgtiming sgmisc sgdebug
|
||||
${CMAKE_THREAD_LIBS_INIT}
|
||||
${WINSOCK_LIBRARY}
|
||||
${ZLIB_LIBRARY}
|
||||
${RT_LIBRARY})
|
||||
endif()
|
||||
|
||||
add_executable(test_sock socktest.cxx)
|
||||
target_link_libraries(test_sock ${TEST_LIBS})
|
||||
|
||||
add_executable(test_http test_HTTP.cxx)
|
||||
target_link_libraries(test_http ${TEST_LIBS})
|
||||
|
||||
add_test(http ${EXECUTABLE_OUTPUT_PATH}/test_http)
|
||||
|
||||
add_executable(httpget httpget.cxx)
|
||||
target_link_libraries(httpget ${TEST_LIBS})
|
||||
|
||||
add_executable(decode_binobj decode_binobj.cxx)
|
||||
target_link_libraries(decode_binobj ${TEST_LIBS})
|
||||
|
||||
add_executable(test_binobj test_binobj.cxx)
|
||||
target_link_libraries(test_binobj ${TEST_LIBS})
|
||||
|
||||
add_test(binobj ${EXECUTABLE_OUTPUT_PATH}/test_binobj)
|
||||
endif(ENABLE_TESTS)
|
||||
|
||||
450
simgear/io/HTTPClient.cxx
Normal file
450
simgear/io/HTTPClient.cxx
Normal file
@@ -0,0 +1,450 @@
|
||||
#include "HTTPClient.hxx"
|
||||
|
||||
#include <sstream>
|
||||
#include <cassert>
|
||||
#include <list>
|
||||
|
||||
#include <boost/foreach.hpp>
|
||||
#include <boost/algorithm/string/case_conv.hpp>
|
||||
|
||||
#include <simgear/io/sg_netChat.hxx>
|
||||
#include <simgear/misc/strutils.hxx>
|
||||
#include <simgear/compiler.h>
|
||||
#include <simgear/debug/logstream.hxx>
|
||||
#include <simgear/timing/timestamp.hxx>
|
||||
|
||||
#if defined( HAVE_VERSION_H ) && HAVE_VERSION_H
|
||||
#include "version.h"
|
||||
#else
|
||||
# if !defined(SIMGEAR_VERSION)
|
||||
# define SIMGEAR_VERSION "simgear-development"
|
||||
# endif
|
||||
#endif
|
||||
|
||||
using std::string;
|
||||
using std::stringstream;
|
||||
using std::vector;
|
||||
|
||||
//#include <iostream>
|
||||
//using namespace std;
|
||||
|
||||
namespace simgear
|
||||
{
|
||||
|
||||
namespace HTTP
|
||||
{
|
||||
|
||||
extern const int DEFAULT_HTTP_PORT = 80;
|
||||
|
||||
class Connection : public NetChat
|
||||
{
|
||||
public:
|
||||
Connection(Client* pr) :
|
||||
client(pr),
|
||||
state(STATE_CLOSED),
|
||||
port(DEFAULT_HTTP_PORT)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
void setServer(const string& h, short p)
|
||||
{
|
||||
host = h;
|
||||
port = p;
|
||||
}
|
||||
|
||||
// socket-level errors
|
||||
virtual void handleError(int error)
|
||||
{
|
||||
NetChat::handleError(error);
|
||||
if (activeRequest) {
|
||||
SG_LOG(SG_IO, SG_INFO, "HTTP socket error");
|
||||
activeRequest->setFailure(error, "socket error");
|
||||
activeRequest = NULL;
|
||||
}
|
||||
|
||||
state = STATE_SOCKET_ERROR;
|
||||
}
|
||||
|
||||
virtual void handleClose()
|
||||
{
|
||||
NetChat::handleClose();
|
||||
|
||||
if ((state == STATE_GETTING_BODY) && activeRequest) {
|
||||
// force state here, so responseComplete can avoid closing the
|
||||
// socket again
|
||||
state = STATE_CLOSED;
|
||||
responseComplete();
|
||||
} else {
|
||||
state = STATE_CLOSED;
|
||||
}
|
||||
}
|
||||
|
||||
void queueRequest(const Request_ptr& r)
|
||||
{
|
||||
if (!activeRequest) {
|
||||
startRequest(r);
|
||||
} else {
|
||||
queuedRequests.push_back(r);
|
||||
}
|
||||
}
|
||||
|
||||
void startRequest(const Request_ptr& r)
|
||||
{
|
||||
if (state == STATE_CLOSED) {
|
||||
if (!connectToHost()) {
|
||||
return;
|
||||
}
|
||||
|
||||
state = STATE_IDLE;
|
||||
}
|
||||
|
||||
activeRequest = r;
|
||||
state = STATE_SENT_REQUEST;
|
||||
bodyTransferSize = -1;
|
||||
chunkedTransfer = false;
|
||||
setTerminator("\r\n");
|
||||
|
||||
stringstream headerData;
|
||||
string path = r->path();
|
||||
if (!client->proxyHost().empty()) {
|
||||
path = r->url();
|
||||
}
|
||||
|
||||
headerData << r->method() << " " << path << " HTTP/1.1\r\n";
|
||||
headerData << "Host: " << r->hostAndPort() << "\r\n";
|
||||
headerData << "User-Agent:" << client->userAgent() << "\r\n";
|
||||
if (!client->proxyAuth().empty()) {
|
||||
headerData << "Proxy-Authorization: " << client->proxyAuth() << "\r\n";
|
||||
}
|
||||
|
||||
BOOST_FOREACH(string h, r->requestHeaders()) {
|
||||
headerData << h << ": " << r->header(h) << "\r\n";
|
||||
}
|
||||
|
||||
headerData << "\r\n"; // final CRLF to terminate the headers
|
||||
|
||||
// TODO - add request body support for PUT, etc operations
|
||||
|
||||
bool ok = push(headerData.str().c_str());
|
||||
if (!ok) {
|
||||
SG_LOG(SG_IO, SG_WARN, "HTTP writing to socket failed");
|
||||
state = STATE_SOCKET_ERROR;
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
virtual void collectIncomingData(const char* s, int n)
|
||||
{
|
||||
if ((state == STATE_GETTING_BODY) || (state == STATE_GETTING_CHUNKED_BYTES)) {
|
||||
activeRequest->processBodyBytes(s, n);
|
||||
} else {
|
||||
buffer += string(s, n);
|
||||
}
|
||||
}
|
||||
|
||||
virtual void foundTerminator(void)
|
||||
{
|
||||
switch (state) {
|
||||
case STATE_SENT_REQUEST:
|
||||
activeRequest->responseStart(buffer);
|
||||
state = STATE_GETTING_HEADERS;
|
||||
buffer.clear();
|
||||
break;
|
||||
|
||||
case STATE_GETTING_HEADERS:
|
||||
processHeader();
|
||||
buffer.clear();
|
||||
break;
|
||||
|
||||
case STATE_GETTING_BODY:
|
||||
responseComplete();
|
||||
break;
|
||||
|
||||
case STATE_GETTING_CHUNKED:
|
||||
processChunkHeader();
|
||||
break;
|
||||
|
||||
case STATE_GETTING_CHUNKED_BYTES:
|
||||
setTerminator("\r\n");
|
||||
state = STATE_GETTING_CHUNKED;
|
||||
break;
|
||||
|
||||
|
||||
case STATE_GETTING_TRAILER:
|
||||
processTrailer();
|
||||
buffer.clear();
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
bool hasIdleTimeout() const
|
||||
{
|
||||
if (state != STATE_IDLE) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return idleTime.elapsedMSec() > 1000 * 10; // ten seconds
|
||||
}
|
||||
|
||||
bool hasError() const
|
||||
{
|
||||
return (state == STATE_SOCKET_ERROR);
|
||||
}
|
||||
|
||||
bool shouldStartNext() const
|
||||
{
|
||||
return !activeRequest && !queuedRequests.empty() &&
|
||||
((state == STATE_CLOSED) || (state == STATE_IDLE));
|
||||
}
|
||||
|
||||
void startNext()
|
||||
{
|
||||
Request_ptr next = queuedRequests.front();
|
||||
queuedRequests.pop_front();
|
||||
startRequest(next);
|
||||
}
|
||||
private:
|
||||
bool connectToHost()
|
||||
{
|
||||
SG_LOG(SG_IO, SG_INFO, "HTTP connecting to " << host << ":" << port);
|
||||
|
||||
if (!open()) {
|
||||
SG_LOG(SG_ALL, SG_WARN, "HTTP::Connection: connectToHost: open() failed");
|
||||
return false;
|
||||
}
|
||||
|
||||
if (connect(host.c_str(), port) != 0) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
void processHeader()
|
||||
{
|
||||
string h = strutils::simplify(buffer);
|
||||
if (h.empty()) { // blank line terminates headers
|
||||
headersComplete();
|
||||
|
||||
if (chunkedTransfer) {
|
||||
state = STATE_GETTING_CHUNKED;
|
||||
} else {
|
||||
setByteCount(bodyTransferSize); // may be -1, that's fine
|
||||
state = STATE_GETTING_BODY;
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
int colonPos = buffer.find(':');
|
||||
if (colonPos < 0) {
|
||||
SG_LOG(SG_IO, SG_WARN, "malformed HTTP response header:" << h);
|
||||
return;
|
||||
}
|
||||
|
||||
string key = strutils::simplify(buffer.substr(0, colonPos));
|
||||
string lkey = boost::to_lower_copy(key);
|
||||
string value = strutils::strip(buffer.substr(colonPos + 1));
|
||||
|
||||
// only consider these if getting headers (as opposed to trailers
|
||||
// of a chunked transfer)
|
||||
if (state == STATE_GETTING_HEADERS) {
|
||||
if (lkey == "content-length") {
|
||||
int sz = strutils::to_int(value);
|
||||
if (bodyTransferSize <= 0) {
|
||||
bodyTransferSize = sz;
|
||||
}
|
||||
activeRequest->setResponseLength(sz);
|
||||
} else if (lkey == "transfer-length") {
|
||||
bodyTransferSize = strutils::to_int(value);
|
||||
} else if (lkey == "transfer-encoding") {
|
||||
processTransferEncoding(value);
|
||||
}
|
||||
}
|
||||
|
||||
activeRequest->responseHeader(lkey, value);
|
||||
}
|
||||
|
||||
void processTransferEncoding(const string& te)
|
||||
{
|
||||
if (te == "chunked") {
|
||||
chunkedTransfer = true;
|
||||
} else {
|
||||
SG_LOG(SG_IO, SG_WARN, "unsupported transfer encoding:" << te);
|
||||
// failure
|
||||
}
|
||||
}
|
||||
|
||||
void processChunkHeader()
|
||||
{
|
||||
if (buffer.empty()) {
|
||||
// blank line after chunk data
|
||||
return;
|
||||
}
|
||||
|
||||
int chunkSize = 0;
|
||||
int semiPos = buffer.find(';');
|
||||
if (semiPos >= 0) {
|
||||
// extensions ignored for the moment
|
||||
chunkSize = strutils::to_int(buffer.substr(0, semiPos), 16);
|
||||
} else {
|
||||
chunkSize = strutils::to_int(buffer, 16);
|
||||
}
|
||||
|
||||
buffer.clear();
|
||||
if (chunkSize == 0) { // trailer start
|
||||
state = STATE_GETTING_TRAILER;
|
||||
return;
|
||||
}
|
||||
|
||||
state = STATE_GETTING_CHUNKED_BYTES;
|
||||
setByteCount(chunkSize);
|
||||
}
|
||||
|
||||
void processTrailer()
|
||||
{
|
||||
if (buffer.empty()) {
|
||||
// end of trailers
|
||||
responseComplete();
|
||||
return;
|
||||
}
|
||||
|
||||
// process as a normal header
|
||||
processHeader();
|
||||
}
|
||||
|
||||
void headersComplete()
|
||||
{
|
||||
activeRequest->responseHeadersComplete();
|
||||
}
|
||||
|
||||
void responseComplete()
|
||||
{
|
||||
activeRequest->responseComplete();
|
||||
client->requestFinished(this);
|
||||
//cout << "response complete: " << activeRequest->url() << endl;
|
||||
|
||||
bool doClose = activeRequest->closeAfterComplete();
|
||||
activeRequest = NULL;
|
||||
if (state == STATE_GETTING_BODY) {
|
||||
state = STATE_IDLE;
|
||||
if (doClose) {
|
||||
// this will bring us into handleClose() above, which updates
|
||||
// state to STATE_CLOSED
|
||||
close();
|
||||
}
|
||||
}
|
||||
|
||||
setTerminator("\r\n");
|
||||
|
||||
// if we have more requests, and we're idle, can start the next
|
||||
// request immediately. Note we cannot do this if we're in STATE_CLOSED,
|
||||
// since NetChannel::close cleans up state after calling handleClose;
|
||||
// instead we pick up waiting requests in update()
|
||||
if (!queuedRequests.empty() && (state == STATE_IDLE)) {
|
||||
startNext();
|
||||
} else {
|
||||
idleTime.stamp();
|
||||
}
|
||||
}
|
||||
|
||||
enum ConnectionState {
|
||||
STATE_IDLE = 0,
|
||||
STATE_SENT_REQUEST,
|
||||
STATE_GETTING_HEADERS,
|
||||
STATE_GETTING_BODY,
|
||||
STATE_GETTING_CHUNKED,
|
||||
STATE_GETTING_CHUNKED_BYTES,
|
||||
STATE_GETTING_TRAILER,
|
||||
STATE_SOCKET_ERROR,
|
||||
STATE_CLOSED ///< connection should be closed now
|
||||
};
|
||||
|
||||
Client* client;
|
||||
Request_ptr activeRequest;
|
||||
ConnectionState state;
|
||||
string host;
|
||||
short port;
|
||||
std::string buffer;
|
||||
int bodyTransferSize;
|
||||
SGTimeStamp idleTime;
|
||||
bool chunkedTransfer;
|
||||
|
||||
std::list<Request_ptr> queuedRequests;
|
||||
};
|
||||
|
||||
Client::Client()
|
||||
{
|
||||
setUserAgent("SimGear-" SG_STRINGIZE(SIMGEAR_VERSION));
|
||||
}
|
||||
|
||||
void Client::update()
|
||||
{
|
||||
NetChannel::poll();
|
||||
|
||||
ConnectionDict::iterator it = _connections.begin();
|
||||
for (; it != _connections.end(); ) {
|
||||
if (it->second->hasIdleTimeout() || it->second->hasError()) {
|
||||
// connection has been idle for a while, clean it up
|
||||
// (or has an error condition, again clean it up)
|
||||
SG_LOG(SG_IO, SG_INFO, "cleaning up " << it->second);
|
||||
ConnectionDict::iterator del = it++;
|
||||
delete del->second;
|
||||
_connections.erase(del);
|
||||
} else {
|
||||
if (it->second->shouldStartNext()) {
|
||||
it->second->startNext();
|
||||
}
|
||||
|
||||
++it;
|
||||
}
|
||||
} // of connecion iteration
|
||||
}
|
||||
|
||||
void Client::makeRequest(const Request_ptr& r)
|
||||
{
|
||||
string host = r->host();
|
||||
int port = r->port();
|
||||
if (!_proxy.empty()) {
|
||||
host = _proxy;
|
||||
port = _proxyPort;
|
||||
}
|
||||
|
||||
stringstream ss;
|
||||
ss << host << "-" << port;
|
||||
string connectionId = ss.str();
|
||||
|
||||
if (_connections.find(connectionId) == _connections.end()) {
|
||||
Connection* con = new Connection(this);
|
||||
con->setServer(host, port);
|
||||
_connections[connectionId] = con;
|
||||
}
|
||||
|
||||
_connections[connectionId]->queueRequest(r);
|
||||
}
|
||||
|
||||
void Client::requestFinished(Connection* con)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
void Client::setUserAgent(const string& ua)
|
||||
{
|
||||
_userAgent = ua;
|
||||
}
|
||||
|
||||
void Client::setProxy(const string& proxy, int port, const string& auth)
|
||||
{
|
||||
_proxy = proxy;
|
||||
_proxyPort = port;
|
||||
_proxyAuth = auth;
|
||||
}
|
||||
|
||||
} // of namespace HTTP
|
||||
|
||||
} // of namespace simgear
|
||||
56
simgear/io/HTTPClient.hxx
Normal file
56
simgear/io/HTTPClient.hxx
Normal file
@@ -0,0 +1,56 @@
|
||||
#ifndef SG_HTTP_CLIENT_HXX
|
||||
#define SG_HTTP_CLIENT_HXX
|
||||
|
||||
#include <map>
|
||||
|
||||
#include <simgear/io/HTTPRequest.hxx>
|
||||
|
||||
namespace simgear
|
||||
{
|
||||
|
||||
namespace HTTP
|
||||
{
|
||||
|
||||
class Connection;
|
||||
|
||||
class Client
|
||||
{
|
||||
public:
|
||||
Client();
|
||||
|
||||
void update();
|
||||
|
||||
void makeRequest(const Request_ptr& r);
|
||||
|
||||
void setUserAgent(const std::string& ua);
|
||||
void setProxy(const std::string& proxy, int port, const std::string& auth = "");
|
||||
|
||||
const std::string& userAgent() const
|
||||
{ return _userAgent; }
|
||||
|
||||
const std::string& proxyHost() const
|
||||
{ return _proxy; }
|
||||
|
||||
const std::string& proxyAuth() const
|
||||
{ return _proxyAuth; }
|
||||
private:
|
||||
void requestFinished(Connection* con);
|
||||
|
||||
friend class Connection;
|
||||
friend class Request;
|
||||
|
||||
std::string _userAgent;
|
||||
std::string _proxy;
|
||||
int _proxyPort;
|
||||
std::string _proxyAuth;
|
||||
|
||||
// connections by host
|
||||
typedef std::map<std::string, Connection*> ConnectionDict;
|
||||
ConnectionDict _connections;
|
||||
};
|
||||
|
||||
} // of namespace HTTP
|
||||
|
||||
} // of namespace simgear
|
||||
|
||||
#endif // of SG_HTTP_CLIENT_HXX
|
||||
210
simgear/io/HTTPRequest.cxx
Normal file
210
simgear/io/HTTPRequest.cxx
Normal file
@@ -0,0 +1,210 @@
|
||||
#include "HTTPRequest.hxx"
|
||||
|
||||
#include <simgear/misc/strutils.hxx>
|
||||
#include <simgear/compiler.h>
|
||||
#include <simgear/debug/logstream.hxx>
|
||||
|
||||
using std::string;
|
||||
using std::map;
|
||||
|
||||
namespace simgear
|
||||
{
|
||||
|
||||
namespace HTTP
|
||||
{
|
||||
|
||||
extern const int DEFAULT_HTTP_PORT;
|
||||
|
||||
Request::Request(const string& url, const string method) :
|
||||
_method(method),
|
||||
_url(url),
|
||||
_responseVersion(HTTP_VERSION_UNKNOWN),
|
||||
_responseStatus(0),
|
||||
_responseLength(0),
|
||||
_receivedBodyBytes(0),
|
||||
_willClose(false)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
Request::~Request()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
void Request::setUrl(const string& url)
|
||||
{
|
||||
_url = url;
|
||||
}
|
||||
|
||||
string_list Request::requestHeaders() const
|
||||
{
|
||||
string_list r;
|
||||
return r;
|
||||
}
|
||||
|
||||
string Request::header(const std::string& name) const
|
||||
{
|
||||
return string();
|
||||
}
|
||||
|
||||
void Request::responseStart(const string& r)
|
||||
{
|
||||
const int maxSplit = 2; // HTTP/1.1 nnn reason-string
|
||||
string_list parts = strutils::split(r, NULL, maxSplit);
|
||||
if (parts.size() != 3) {
|
||||
SG_LOG(SG_IO, SG_WARN, "HTTP::Request: malformed response start:" << r);
|
||||
setFailure(400, "malformed HTTP response header");
|
||||
return;
|
||||
}
|
||||
|
||||
_responseVersion = decodeVersion(parts[0]);
|
||||
_responseStatus = strutils::to_int(parts[1]);
|
||||
_responseReason = parts[2];
|
||||
}
|
||||
|
||||
void Request::responseHeader(const string& key, const string& value)
|
||||
{
|
||||
if (key == "connection") {
|
||||
_willClose = (value.find("close") != string::npos);
|
||||
}
|
||||
|
||||
_responseHeaders[key] = value;
|
||||
}
|
||||
|
||||
void Request::responseHeadersComplete()
|
||||
{
|
||||
// no op
|
||||
}
|
||||
|
||||
void Request::processBodyBytes(const char* s, int n)
|
||||
{
|
||||
_receivedBodyBytes += n;
|
||||
gotBodyData(s, n);
|
||||
}
|
||||
|
||||
void Request::gotBodyData(const char* s, int n)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
void Request::responseComplete()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
string Request::scheme() const
|
||||
{
|
||||
int firstColon = url().find(":");
|
||||
if (firstColon > 0) {
|
||||
return url().substr(0, firstColon);
|
||||
}
|
||||
|
||||
return ""; // couldn't parse scheme
|
||||
}
|
||||
|
||||
string Request::path() const
|
||||
{
|
||||
string u(url());
|
||||
int schemeEnd = u.find("://");
|
||||
if (schemeEnd < 0) {
|
||||
return ""; // couldn't parse scheme
|
||||
}
|
||||
|
||||
int hostEnd = u.find('/', schemeEnd + 3);
|
||||
if (hostEnd < 0) {
|
||||
return ""; // couldn't parse host
|
||||
}
|
||||
|
||||
int query = u.find('?', hostEnd + 1);
|
||||
if (query < 0) {
|
||||
// all remainder of URL is path
|
||||
return u.substr(hostEnd);
|
||||
}
|
||||
|
||||
return u.substr(hostEnd, query - hostEnd);
|
||||
}
|
||||
|
||||
string Request::host() const
|
||||
{
|
||||
string hp(hostAndPort());
|
||||
int colonPos = hp.find(':');
|
||||
if (colonPos >= 0) {
|
||||
return hp.substr(0, colonPos); // trim off the colon and port
|
||||
} else {
|
||||
return hp; // no port specifier
|
||||
}
|
||||
}
|
||||
|
||||
unsigned short Request::port() const
|
||||
{
|
||||
string hp(hostAndPort());
|
||||
int colonPos = hp.find(':');
|
||||
if (colonPos >= 0) {
|
||||
return (unsigned short) strutils::to_int(hp.substr(colonPos + 1));
|
||||
} else {
|
||||
return DEFAULT_HTTP_PORT;
|
||||
}
|
||||
}
|
||||
|
||||
string Request::hostAndPort() const
|
||||
{
|
||||
string u(url());
|
||||
int schemeEnd = u.find("://");
|
||||
if (schemeEnd < 0) {
|
||||
return ""; // couldn't parse scheme
|
||||
}
|
||||
|
||||
int hostEnd = u.find('/', schemeEnd + 3);
|
||||
if (hostEnd < 0) { // all remainder of URL is host
|
||||
return u.substr(schemeEnd + 3);
|
||||
}
|
||||
|
||||
return u.substr(schemeEnd + 3, hostEnd - (schemeEnd + 3));
|
||||
}
|
||||
|
||||
void Request::setResponseLength(unsigned int l)
|
||||
{
|
||||
_responseLength = l;
|
||||
}
|
||||
|
||||
unsigned int Request::responseLength() const
|
||||
{
|
||||
// if the server didn't supply a content length, use the number
|
||||
// of bytes we actually received (so far)
|
||||
if ((_responseLength == 0) && (_receivedBodyBytes > 0)) {
|
||||
return _receivedBodyBytes;
|
||||
}
|
||||
|
||||
return _responseLength;
|
||||
}
|
||||
|
||||
void Request::setFailure(int code, const std::string& reason)
|
||||
{
|
||||
_responseStatus = code;
|
||||
_responseReason = reason;
|
||||
failed();
|
||||
}
|
||||
|
||||
void Request::failed()
|
||||
{
|
||||
// no-op in base class
|
||||
}
|
||||
|
||||
Request::HTTPVersion Request::decodeVersion(const string& v)
|
||||
{
|
||||
if (v == "HTTP/1.1") return HTTP_1_1;
|
||||
if (v == "HTTP/1.0") return HTTP_1_0;
|
||||
if (strutils::starts_with(v, "HTTP/0.")) return HTTP_0_x;
|
||||
return HTTP_VERSION_UNKNOWN;
|
||||
}
|
||||
|
||||
bool Request::closeAfterComplete() const
|
||||
{
|
||||
// for non HTTP/1.1 connections, assume server closes
|
||||
return _willClose || (_responseVersion != HTTP_1_1);
|
||||
}
|
||||
|
||||
} // of namespace HTTP
|
||||
|
||||
} // of namespace simgear
|
||||
103
simgear/io/HTTPRequest.hxx
Normal file
103
simgear/io/HTTPRequest.hxx
Normal file
@@ -0,0 +1,103 @@
|
||||
#ifndef SG_HTTP_REQUEST_HXX
|
||||
#define SG_HTTP_REQUEST_HXX
|
||||
|
||||
#include <map>
|
||||
|
||||
#include <simgear/structure/SGReferenced.hxx>
|
||||
#include <simgear/structure/SGSharedPtr.hxx>
|
||||
#include <simgear/math/sg_types.hxx>
|
||||
|
||||
namespace simgear
|
||||
{
|
||||
|
||||
namespace HTTP
|
||||
{
|
||||
|
||||
class Request : public SGReferenced
|
||||
{
|
||||
public:
|
||||
virtual ~Request();
|
||||
|
||||
virtual void setUrl(const std::string& url);
|
||||
|
||||
virtual std::string method() const
|
||||
{ return _method; }
|
||||
virtual std::string url() const
|
||||
{ return _url; }
|
||||
|
||||
virtual std::string scheme() const;
|
||||
virtual std::string path() const;
|
||||
virtual std::string host() const;
|
||||
virtual std::string hostAndPort() const;
|
||||
virtual unsigned short port() const;
|
||||
|
||||
virtual string_list requestHeaders() const;
|
||||
virtual std::string header(const std::string& name) const;
|
||||
|
||||
virtual int responseCode() const
|
||||
{ return _responseStatus; }
|
||||
|
||||
virtual std::string responseReason() const
|
||||
{ return _responseReason; }
|
||||
|
||||
void setResponseLength(unsigned int l);
|
||||
virtual unsigned int responseLength() const;
|
||||
|
||||
/**
|
||||
* running total of body bytes received so far. Can be used
|
||||
* to generate a completion percentage, if the response length is
|
||||
* known.
|
||||
*/
|
||||
unsigned int responseBytesReceived() const
|
||||
{ return _receivedBodyBytes; }
|
||||
|
||||
enum HTTPVersion {
|
||||
HTTP_VERSION_UNKNOWN = 0,
|
||||
HTTP_0_x, // 0.9 or similar
|
||||
HTTP_1_0,
|
||||
HTTP_1_1
|
||||
};
|
||||
|
||||
HTTPVersion responseVersion() const
|
||||
{ return _responseVersion; }
|
||||
|
||||
static HTTPVersion decodeVersion(const std::string& v);
|
||||
|
||||
bool closeAfterComplete() const;
|
||||
protected:
|
||||
Request(const std::string& url, const std::string method = "GET");
|
||||
|
||||
virtual void responseStart(const std::string& r);
|
||||
virtual void responseHeader(const std::string& key, const std::string& value);
|
||||
virtual void responseHeadersComplete();
|
||||
virtual void responseComplete();
|
||||
virtual void failed();
|
||||
virtual void gotBodyData(const char* s, int n);
|
||||
private:
|
||||
friend class Client;
|
||||
friend class Connection;
|
||||
|
||||
void processBodyBytes(const char* s, int n);
|
||||
void setFailure(int code, const std::string& reason);
|
||||
|
||||
std::string _method;
|
||||
std::string _url;
|
||||
HTTPVersion _responseVersion;
|
||||
int _responseStatus;
|
||||
std::string _responseReason;
|
||||
unsigned int _responseLength;
|
||||
unsigned int _receivedBodyBytes;
|
||||
bool _willClose;
|
||||
|
||||
typedef std::map<std::string, std::string> HeaderDict;
|
||||
HeaderDict _responseHeaders;
|
||||
};
|
||||
|
||||
typedef SGSharedPtr<Request> Request_ptr;
|
||||
|
||||
} // of namespace HTTP
|
||||
|
||||
} // of namespace simgear
|
||||
|
||||
#endif // of SG_HTTP_REQUEST_HXX
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user