diff --git a/configure.ac b/configure.ac index 59fa9a659..9add3a028 100644 --- a/configure.ac +++ b/configure.ac @@ -597,7 +597,27 @@ if test "x$ac_cv_header_zlib_h" != "xyes"; then echo fi - +dnl Check for Subversion library support +save_LIBS=$LIBS +save_CPPFLAGS=$CPPFLAGS +LIBS="" +CPPFLAGS="-I/usr/include/subversion-1 -I/usr/include/apr-1.0" +AC_CHECK_LIB(svn_client-1, svn_client_checkout3) +AC_CHECK_HEADERS([svn_client.h]) +if test "x$ac_cv_header_svn_client_h" != "xyes"; then + echo "TerraSync will shell out for command line subversion" + svn_LIBS="" + svn_CPPFLAGS="" +else + echo "TerraSync will use integrated subversion library" + AC_SEARCH_LIBS(svn_client_checkout, svn_client-1) + svn_LIBS=$LIBS + svn_CPPFLAGS=$CPPFLAGS + AC_SUBST(svn_LIBS) + AC_SUBST(svn_CPPFLAGS) +fi +LIBS=$save_LIBS +CPPFLAGS=$save_CPPFLAGS dnl Checks for header files. AC_HEADER_STDC diff --git a/projects/VC7.1/terrasync.vcproj b/projects/VC7.1/terrasync.vcproj index 4e02f0828..2f7e7e120 100755 --- a/projects/VC7.1/terrasync.vcproj +++ b/projects/VC7.1/terrasync.vcproj @@ -19,8 +19,8 @@ getStartTime(); if (! fp->isActive(now)) { - throw FP_Inactive(); + return false; } } else { // no flight plan, update target heading, speed, and altitude @@ -789,6 +790,7 @@ void FGAIAircraft::updatePrimaryTargetValues() { AccelTo( props->getDoubleValue("controls/flight/target-spd" ) ); } + return true; } void FGAIAircraft::updatePosition() { diff --git a/src/AIModel/AIAircraft.hxx b/src/AIModel/AIAircraft.hxx index 9722e3556..85fca1040 100644 --- a/src/AIModel/AIAircraft.hxx +++ b/src/AIModel/AIAircraft.hxx @@ -117,7 +117,7 @@ private: void controlHeading(FGAIFlightPlan::waypoint* curr); void controlSpeed(FGAIFlightPlan::waypoint* curr, FGAIFlightPlan::waypoint* next); - void updatePrimaryTargetValues(); + bool updatePrimaryTargetValues(); void updateSecondaryTargetValues(); void updatePosition(); void updateHeading(); diff --git a/src/Model/modelmgr.cxx b/src/Model/modelmgr.cxx index 2b547cf02..41eaa6cd2 100644 --- a/src/Model/modelmgr.cxx +++ b/src/Model/modelmgr.cxx @@ -156,23 +156,23 @@ struct UpdateFunctor : public std::unary_function SGModelPlacement* model = instance->model; double lon, lat, elev, roll, pitch, heading; - try { - // Optionally set position from properties - if (instance->lon_deg_node != 0) - lon = testNan(instance->lon_deg_node->getDoubleValue()); - if (instance->lat_deg_node != 0) - lat = testNan(instance->lat_deg_node->getDoubleValue()); - if (instance->elev_ft_node != 0) - elev = testNan(instance->elev_ft_node->getDoubleValue()); + // Optionally set position from properties + if (instance->lon_deg_node != 0) + lon =instance->lon_deg_node->getDoubleValue(); + if (instance->lat_deg_node != 0) + lat = instance->lat_deg_node->getDoubleValue(); + if (instance->elev_ft_node != 0) + elev = instance->elev_ft_node->getDoubleValue(); - // Optionally set orientation from properties - if (instance->roll_deg_node != 0) - roll = testNan(instance->roll_deg_node->getDoubleValue()); - if (instance->pitch_deg_node != 0) - pitch = testNan(instance->pitch_deg_node->getDoubleValue()); - if (instance->heading_deg_node != 0) - heading = testNan(instance->heading_deg_node->getDoubleValue()); - } catch (const sg_range_exception& e) { + // Optionally set orientation from properties + if (instance->roll_deg_node != 0) + roll = instance->roll_deg_node->getDoubleValue(); + if (instance->pitch_deg_node != 0) + pitch = instance->pitch_deg_node->getDoubleValue(); + if (instance->heading_deg_node != 0) + heading = instance->heading_deg_node->getDoubleValue(); + if ( osg::isNaN(lon) || osg::isNaN(lat) || osg::isNaN(elev) || + osg::isNaN(roll) || osg::isNaN(pitch) || osg::isNaN(heading) ) { const char *path = instance->node->getStringValue("path", "unknown"); SG_LOG(SG_GENERAL, SG_INFO, "Instance of model " << path diff --git a/utils/TerraSync/Makefile.am b/utils/TerraSync/Makefile.am index e4de6c3ab..aebd95960 100644 --- a/utils/TerraSync/Makefile.am +++ b/utils/TerraSync/Makefile.am @@ -4,4 +4,6 @@ bin_PROGRAMS = terrasync terrasync_SOURCES = terrasync.cxx -terrasync_LDADD = -lplibnet -lplibul -lsgmisc -lsgdebug $(network_LIBS) +AM_CPPFLAGS = $(svn_CPPFLAGS) + +terrasync_LDADD = -lplibnet -lplibul -lsgmisc -lsgdebug $(network_LIBS) $(svn_LIBS) diff --git a/utils/TerraSync/terrasync.cxx b/utils/TerraSync/terrasync.cxx index 1786be923..1545aa7b8 100644 --- a/utils/TerraSync/terrasync.cxx +++ b/utils/TerraSync/terrasync.cxx @@ -43,29 +43,338 @@ #include #include +#ifdef HAVE_SVN_CLIENT_H +# ifdef HAVE_LIBSVN_CLIENT_1 +# include +# include +# include +# include +# else +# undef HAVE_SVN_CLIENT_H +# endif +#endif + using std::string; using std::cout; using std::endl; +const char* source_base = NULL; const char* svn_base = "http://terrascenery.googlecode.com/svn/trunk/data/Scenery"; const char* rsync_base = "scenery.flightgear.org::Scenery"; -const char* source_base = NULL; const char* dest_base = "terrasyncdir"; -bool use_svn = false; - -const char* svn_cmd = "svn checkout"; const char* rsync_cmd = "rsync --verbose --archive --delete --perms --owner --group"; +#ifdef HAVE_SVN_CLIENT_H +bool use_svn = true; +#else +bool use_svn = false; +const char* svn_cmd = "svn checkout"; +#endif // display usage static void usage( const string& prog ) { cout << "Usage: " << endl << prog << " -p " - << "[ -R ] [ -s ] -d " << endl + << "-R [ -s ] -d " << endl << prog << " -p " - << " -S [ -s ] -d " << endl; +<<<<<<< terrasync.cxx + << "-S [ -s ] -d " << endl; +#ifdef HAVE_SVN_CLIENT_H + cout << " (defaults to the built in subversion)" << endl; +#else + cout << " (defaults to rsync, using external commands)" << endl; +#endif +} + +#ifdef HAVE_SVN_CLIENT_H + +// Things we need for doing subversion checkout - often +apr_pool_t *mysvn_pool = NULL; +svn_client_ctx_t *mysvn_ctx = NULL; +svn_opt_revision_t *mysvn_rev = NULL; + +static const svn_version_checklist_t mysvn_checklist[] = { + { "svn_subr", svn_subr_version }, + { "svn_client", svn_client_version }, + { "svn_wc", svn_wc_version }, + { "svn_ra", svn_ra_version }, + { "svn_delta", svn_delta_version }, + { "svn_diff", svn_diff_version }, + { NULL, NULL } +}; + +// Configure our subversion session +int mysvn_setup(void) { + // Are we already prepared? + if (mysvn_pool) return EXIT_SUCCESS; + // No, so initialize svn internals generally + if (svn_cmdline_init("terrasync", stderr) != EXIT_SUCCESS) + return EXIT_FAILURE; + apr_pool_t *pool; + apr_pool_create(&pool, NULL); + svn_error_t *err = NULL; + SVN_VERSION_DEFINE(mysvn_version); + err = svn_ver_check_list(&mysvn_version, mysvn_checklist); + if (err) + return svn_cmdline_handle_exit_error(err, pool, "terrasync: "); + err = svn_ra_initialize(pool); + if (err) + return svn_cmdline_handle_exit_error(err, pool, "terrasync: "); + char *config_dir = NULL; + err = svn_config_ensure(config_dir, pool); + if (err) + return svn_cmdline_handle_exit_error(err, pool, "terrasync: "); + err = svn_client_create_context(&mysvn_ctx, pool); + if (err) + return svn_cmdline_handle_exit_error(err, pool, "terrasync: "); + err = svn_config_get_config(&(mysvn_ctx->config), + config_dir, pool); + if (err) + return svn_cmdline_handle_exit_error(err, pool, "terrasync: "); + svn_config_t *cfg; + cfg = ( svn_config_t*) apr_hash_get( + mysvn_ctx->config, + SVN_CONFIG_CATEGORY_CONFIG, + APR_HASH_KEY_STRING); + if (err) + return svn_cmdline_handle_exit_error(err, pool, "terrasync: "); + svn_auth_baton_t *ab; + err = svn_cmdline_setup_auth_baton(&ab, + TRUE, NULL, NULL, config_dir, TRUE, cfg, + mysvn_ctx->cancel_func, mysvn_ctx->cancel_baton, pool); + if (err) + return svn_cmdline_handle_exit_error(err, pool, "terrasync: "); + mysvn_ctx->auth_baton = ab; + mysvn_ctx->conflict_func = NULL; + mysvn_ctx->conflict_baton = NULL; + mysvn_rev = (svn_opt_revision_t*) apr_palloc(pool, + sizeof(svn_opt_revision_t)); + if (!mysvn_rev) + return EXIT_FAILURE; + mysvn_rev->kind = svn_opt_revision_head; + // Success if we got this far + mysvn_pool = pool; + return EXIT_SUCCESS; +} + +#endif + +// sync one directory tree +void sync_tree(char* dir) { + int rc; + char command[512]; + SGPath path( dest_base ); + + path.append( dir ); + rc = path.create_dir( 0755 ); + if (rc) { + cout << "Return code = " << rc << endl; + exit(1); + } + + if (use_svn) { +#ifdef HAVE_SVN_CLIENT_H + cout << dir << " ... "; + cout.flush(); + char dest_base_dir[512]; + snprintf( command, 512, + "%s/%s", source_base, dir); + snprintf( dest_base_dir, 512, + "%s/%s", dest_base, dir); + svn_error_t *err = NULL; + if (mysvn_setup() != EXIT_SUCCESS) + exit(1); + apr_pool_t *subpool = svn_pool_create(mysvn_pool); + err = svn_client_checkout(NULL, + command, + dest_base_dir, + mysvn_rev, + 1, + mysvn_ctx, + subpool); + if (err) { + // Report errors from the checkout attempt + cout << "failed: " << endl + << err->message << endl; + svn_error_clear(err); + return; + } else { + cout << "done" << endl; + } + svn_pool_destroy(subpool); + return; +#else + + snprintf( command, 512, + "%s %s/%s %s/%s", svn_cmd, + source_base, dir, + dest_base, dir ); +#endif + } else { + snprintf( command, 512, + "%s %s/%s/ %s/%s/", rsync_cmd, + source_base, dir, + dest_base, dir ); + } + cout << command << endl; + rc = system( command ); + if (rc) { + cout << "Return code = " << rc << endl; + if (rc == 5120) exit(1); + } +======= + << "-S [ -s ] -d " << endl; +#ifdef HAVE_SVN_CLIENT_H + cout << " (defaults to the built in subversion)" << endl; +#else + cout << " (defaults to rsync, using external commands)" << endl; +#endif +} + +#ifdef HAVE_SVN_CLIENT_H + +// Things we need for doing subversion checkout - often +apr_pool_t *mysvn_pool = NULL; +svn_client_ctx_t *mysvn_ctx = NULL; +svn_opt_revision_t *mysvn_rev = NULL; + +static const svn_version_checklist_t mysvn_checklist[] = { + { "svn_subr", svn_subr_version }, + { "svn_client", svn_client_version }, + { "svn_wc", svn_wc_version }, + { "svn_ra", svn_ra_version }, + { "svn_delta", svn_delta_version }, + { "svn_diff", svn_diff_version }, + { NULL, NULL } +}; + +// Configure our subversion session +int mysvn_setup(void) { + // Are we already prepared? + if (mysvn_pool) return EXIT_SUCCESS; + // No, so initialize svn internals generally +#ifdef _MSC_VER + if (svn_cmdline_init("terrasync", 0) != EXIT_SUCCESS) + return EXIT_FAILURE; +#else + if (svn_cmdline_init("terrasync", stderr) != EXIT_SUCCESS) + return EXIT_FAILURE; +#endif + apr_pool_t *pool; + apr_pool_create(&pool, NULL); + svn_error_t *err = NULL; + SVN_VERSION_DEFINE(mysvn_version); + err = svn_ver_check_list(&mysvn_version, mysvn_checklist); + if (err) + return svn_cmdline_handle_exit_error(err, pool, "terrasync: "); + err = svn_ra_initialize(pool); + if (err) + return svn_cmdline_handle_exit_error(err, pool, "terrasync: "); + char *config_dir = NULL; + err = svn_config_ensure(config_dir, pool); + if (err) + return svn_cmdline_handle_exit_error(err, pool, "terrasync: "); + err = svn_client_create_context(&mysvn_ctx, pool); + if (err) + return svn_cmdline_handle_exit_error(err, pool, "terrasync: "); + err = svn_config_get_config(&(mysvn_ctx->config), + config_dir, pool); + if (err) + return svn_cmdline_handle_exit_error(err, pool, "terrasync: "); + svn_config_t *cfg; + cfg = ( svn_config_t*) apr_hash_get( + mysvn_ctx->config, + SVN_CONFIG_CATEGORY_CONFIG, + APR_HASH_KEY_STRING); + if (err) + return svn_cmdline_handle_exit_error(err, pool, "terrasync: "); + svn_auth_baton_t *ab; + err = svn_cmdline_setup_auth_baton(&ab, + TRUE, NULL, NULL, config_dir, TRUE, cfg, + mysvn_ctx->cancel_func, mysvn_ctx->cancel_baton, pool); + if (err) + return svn_cmdline_handle_exit_error(err, pool, "terrasync: "); + mysvn_ctx->auth_baton = ab; + mysvn_ctx->conflict_func = NULL; + mysvn_ctx->conflict_baton = NULL; + mysvn_rev = (svn_opt_revision_t*) apr_palloc(pool, + sizeof(svn_opt_revision_t)); + if (!mysvn_rev) + return EXIT_FAILURE; + mysvn_rev->kind = svn_opt_revision_head; + // Success if we got this far + mysvn_pool = pool; + return EXIT_SUCCESS; +} + +#endif + +// sync one directory tree +void sync_tree(char* dir) { + int rc; + char command[512]; + SGPath path( dest_base ); + + path.append( dir ); + rc = path.create_dir( 0755 ); + if (rc) { + cout << "Return code = " << rc << endl; + exit(1); + } + + if (use_svn) { +#ifdef HAVE_SVN_CLIENT_H + cout << dir << " ... "; + cout.flush(); + char dest_base_dir[512]; + snprintf( command, 512, + "%s/%s", source_base, dir); + snprintf( dest_base_dir, 512, + "%s/%s", dest_base, dir); + svn_error_t *err = NULL; + if (mysvn_setup() != EXIT_SUCCESS) + exit(1); + apr_pool_t *subpool = svn_pool_create(mysvn_pool); + err = svn_client_checkout(NULL, + command, + dest_base_dir, + mysvn_rev, + 1, + mysvn_ctx, + subpool); + if (err) { + // Report errors from the checkout attempt + cout << "failed: " << endl + << err->message << endl; + svn_error_clear(err); + return; + } else { + cout << "done" << endl; + } + svn_pool_destroy(subpool); + return; +#else + + snprintf( command, 512, + "%s %s/%s %s/%s", svn_cmd, + source_base, dir, + dest_base, dir ); +#endif + } else { + snprintf( command, 512, + "%s %s/%s/ %s/%s/", rsync_cmd, + source_base, dir, + dest_base, dir ); + } + cout << command << endl; + rc = system( command ); + if (rc) { + cout << "Return code = " << rc << endl; + if (rc == 5120) exit(1); + } +>>>>>>> 1.15 } @@ -123,39 +432,6 @@ static void parse_message( const string &msg, int *lat, int *lon ) { *lon = nowhere; *lat = nowhere; } - -} - -// sync one directory tree -void sync_tree(char* dir) { - int rc; - char command[512]; - SGPath path( dest_base ); - - path.append( dir ); - rc = path.create_dir( 0755 ); - if (rc) { - cout << "Return code = " << rc << endl; - exit(1); - } - - if (use_svn) { - snprintf( command, 512, - "%s %s/%s %s/%s", svn_cmd, - source_base, dir, - dest_base, dir ); - } else { - snprintf( command, 512, - "%s %s/%s/ %s/%s/", rsync_cmd, - source_base, dir, - dest_base, dir ); - } - cout << command << endl; - rc = system( command ); - if (rc) { - cout << "Return code = " << rc << endl; - if (rc == 5120) exit(1); - } } @@ -235,6 +511,7 @@ static void sync_areas( int lat, int lon, int lat_dir, int lon_dir ) { int main( int argc, char **argv ) { int port = 5501; char host[256] = ""; // accept messages from anyone + bool testing = false; // parse arguments int i = 1; @@ -253,8 +530,7 @@ int main( int argc, char **argv ) { } else if ( (string)argv[i] == "-S" ) { use_svn = true; } else if ( (string)argv[i] == "-T" ) { - sync_areas( 37, -123, 0, 0 ); - exit(0); + testing = true; } else { usage( argv[0] ); exit(-1); @@ -269,6 +545,12 @@ int main( int argc, char **argv ) { else source_base = rsync_base; } + + // We just want one grid square, no FGFS communications + if (testing) { + sync_areas( 37, -123, 0, 0 ); + exit(0); + } // Must call this before any other net stuff netInit( &argc,argv ); @@ -354,3 +636,4 @@ int main( int argc, char **argv ) { return 0; } +