29 #include "../ArmarXManager.h"
30 #include "../Component.h"
31 #include "../logging/Logging.h"
32 #include "../system/ArmarXDataPath.h"
33 #include "../system/ImportExport.h"
34 #include "../system/cmake/CMakePackageFinder.h"
43 #include <Ice/Application.h>
44 #include <Ice/BuiltinSequences.h>
45 #include <Ice/PropertiesF.h>
46 #include <IceUtil/Handle.h>
55 struct InitializationData;
58 #define xstr(s) stringify(s)
59 #define stringify(s) #s
74 class ManagedIceObjectRegistryInterface;
194 public Ice::Application,
212 std::unique_lock lock(instanceMutex);
216 throw LocalException(
"Application instance already created");
236 #ifdef ARMARX_VERSION
237 return xstr(ARMARX_VERSION);
246 int run(
int argc,
char* argv[])
override;
254 void setName(
const std::string& name);
261 std::string getName()
const;
268 void interruptCallback(
int signal)
override;
270 void registerDataPathsFromDependencies(std::string dependencies);
277 std::vector<std::string> getDefaultPackageNames();
279 static std::string GetArmarXConfigDefaultPath(
bool envVarExpanded =
true);
280 static Ice::StringSeq GetDefaultsPaths();
282 static const std::string& GetProjectName();
283 static const Ice::StringSeq& GetProjectDependencies();
291 void updateIceProperties(
const Ice::PropertyDict& properties)
override;
293 void icePropertiesUpdated(
const std::set<std::string>& changedProperties)
override;
297 bool getForbidThreadCreation()
const;
298 void setForbidThreadCreation(
bool value);
299 void enableLibLoading(
bool enable =
true);
301 void storeCommandLineArguments(
int argc,
char* argv[]);
302 const std::vector<std::string>& getCommandLineArguments()
const;
339 int doMain(
int argc,
char* argv[],
const Ice::InitializationData& initData,
Ice::Int i)
override;
341 void loadDefaultConfig(
int argc,
char* argv[],
const Ice::InitializationData& initData);
343 void loadDependentProjectDatapaths();
352 virtual std::string getDomainName();
376 static void HandlerInterrupt(
int sig);
383 static void HandlerFault(
int sig);
387 void loadLibrariesFromProperties();
397 static std::mutex instanceMutex;
402 std::string applicationName;
411 std::shared_ptr<std::thread> shutdownThread;
413 static std::string ProjectName;
414 static Ice::StringSeq ProjectDependendencies;
417 bool forbidThreadCreation =
false;
418 bool libLoadingEnabled =
false;
420 std::vector<std::string> commandLineArguments;
435 template<
class ComponentT,
class AppT>
445 registry->addObject(Component::create<ComponentT>(properties,
"",
appConfigDomain));
482 template<
class ComponentT,
class AppT = armarx::Application>
483 int runSimpleComponentApp(
int argc,
char* argv[], std::string appName,
const std::string& configName =
"",
const std::string& configDomain =
"ArmarX",
bool enableLibLoading =
false)
485 armarx::ApplicationPtr app = AppT::template createInstance<internal::SimpleSingleComponentApp<ComponentT, AppT> >();
488 sApp->appConfigDomain = configDomain;
489 sApp->appConfigName = configName;
490 app->enableLibLoading(enableLibLoading);
491 app->setName(appName);
492 app->storeCommandLineArguments(argc, argv);
493 return app->main(argc, argv);
503 components(components) {}
506 std::vector<ComponentPtr> components;
514 registry->addObject(comp);
519 template<
class ComponentType>
525 template<
class ComponentType,
class... ComponentTypes >
526 std::vector<ComponentPtr>
createComponents(ComponentType comp, ComponentTypes... components)
528 std::vector<ComponentPtr> result {comp};
530 result.insert(result.end(), tempResult.begin(), tempResult.end());
534 template<
class... ComponentTypes >
537 std::vector<ComponentPtr> result;
539 result.insert(result.end(), tempResult.begin(), tempResult.end());
559 template<
class... ComponentTypes >
560 std::tuple<armarx::ApplicationPtr, std::vector<ComponentPtr> >
runMultipleComponentsApp(
int argc,
char* argv[], std::string appName,
const std::string& configDomain =
"ArmarX")
563 std::vector<ComponentPtr> comps =
createComponentsUtil(Component::create<ComponentTypes>(props,
"", configDomain)...);
566 app->setName(appName);
567 return std::make_tuple(app, comps);