Brief description of class still missing. More...
#include <CoreApplication.h>
Public Member Functions | |
const char * | applicationName () const |
virtual void | close () |
CoreApplication (int &argc, char **argv, ApplicationHelp *(*help)(), bool reportBugs=true) | |
void | initInternalDebugger () |
void | showHelp (int &i, int argc, char **argv, ApplicationHelp *(*help)()) |
int | terminalCols () const |
int | terminalRows () const |
virtual | ~CoreApplication () |
Static Public Member Functions | |
static std::string | authors () |
static std::string | backTrace () |
static std::string | backTraceBug () |
static bool | checkOptionArg (int &i, int argc, char **argv, bool mandatory=true) |
static void | exit (int exitCode) |
static std::string | getStdin () |
static CoreApplication * | instance () |
static void | osSignal (int sigNum) |
static std::string | version () |
static std::string | version (const char *item) |
Protected Member Functions | |
void | setHelp (ApplicationHelp *h) |
Brief description of class still missing.
Full description of class still missing
GpCoreTools::CoreApplication::CoreApplication | ( | int & | argc, |
char ** | argv, | ||
ApplicationHelp *(*)() | help, | ||
bool | reportBugs = true |
||
) |
Description of constructor still missing
References checkOptionArg(), exit(), help(), GpCoreTools::PThread::init(), initInternalDebugger(), GpCoreTools::Log::setVerbosity(), showHelp(), version(), and GpCoreTools::Log::write().
{ PThread::init(); _applicationName=argv[0]; int index=_applicationName.find_last_of("/"); if(index>-1) { _applicationName=_applicationName.substr(index+1, _applicationName.length()-index); } srand(time(NULL)); // init random generator if(!_self) { _self=this; } else { Log::write(0, "error: only one instance of ApplicationCore is allowed."); abort(); } // Size of terminal _terminalCols=0; _terminalRows=0; // Check arguments int i, j=1; for(i=1; i<argc; i++) { const char * arg=argv[i]; if(help && (strcmp(arg, "--help")==0 || strcmp(arg, "-help")==0 || strcmp(arg, "-h")==0)) { showHelp(i, argc, argv, help); ::exit(0); } else if(strcmp(arg, "--verbosity")==0 || strcmp(arg, "-verbosity")==0 || strcmp(arg, "-v")==0) { checkOptionArg(i, argc, argv, true); Log::setVerbosity(atoi(argv[i])); } else if(strcmp(arg, "--nobugreport")==0 || strcmp(arg, "-nobugreport")==0) { reportBugs=false; } else if(strcmp(arg, "--version")==0 || strcmp(arg, "-version")==0) { printf("Versions:\n%s", version().data()); ::exit(0); } else if(strcmp(arg, "--app-version")==0 || strcmp(arg, "-app-version")==0) { printf("%s %s\n", _applicationName.data(), version(_applicationName.data()).data()); ::exit(0); } else { argv[j++]=argv[i]; } } if(j<argc) { argv[j]=0; argc=j; } _reportBugs=reportBugs; initInternalDebugger(); }
GpCoreTools::CoreApplication::~CoreApplication | ( | ) | [virtual] |
Description of destructor still missing
{ }
const char* GpCoreTools::CoreApplication::applicationName | ( | ) | const [inline] |
Referenced by authors(), GpCoreTools::DaemonApplication::close(), main(), and GpCoreTools::DaemonApplication::parentInterrupted().
{return _applicationName.data();}
std::string GpCoreTools::CoreApplication::authors | ( | ) | [static] |
Returns the copyright message
References applicationName(), instance(), and GpCoreTools::PackageInfo::list().
Referenced by GpCoreTools::ApplicationHelp::exec().
{ for(std::list<PackageInfo>::iterator it=PackageInfo::list()->begin();it!=PackageInfo::list()->end(); it++ ) { if(it->package()==CoreApplication::instance()->applicationName()) { return it->authors(); } } return ""; }
static std::string GpCoreTools::CoreApplication::backTrace | ( | ) | [static] |
static std::string GpCoreTools::CoreApplication::backTraceBug | ( | ) | [static] |
bool GpCoreTools::CoreApplication::checkOptionArg | ( | int & | i, |
int | argc, | ||
char ** | argv, | ||
bool | mandatory = true |
||
) | [static] |
Check if option argument at i is available. If not and if mandatory is true, the application exits with error code 2. Else, it returns true if an argument is available.
This function can be used even without a CoreApplication running.
References exit(), UNUSED, and GpCoreTools::Log::write().
Referenced by CoreApplication(), GpCoreTools::DaemonApplication::DaemonApplication(), and showHelp().
{ i++; if(i<argc) { if(argv[i][0]=='-' ) { char * ptr=0; float f=strtod(argv[i], &ptr); UNUSED(f); if(ptr>argv[i]) return true; } else return true; } if(mandatory) { Log::write(0, "error: option %s requires an argument, see -help for details.\n", argv[i-1]); CoreApplication::exit(2); } return false; }
virtual void GpCoreTools::CoreApplication::close | ( | ) | [inline, virtual] |
Reimplemented in GpCoreTools::DaemonApplication, GpsDaemonApplication, and CubeDaemonApplication.
Referenced by exit().
{}
void GpCoreTools::CoreApplication::exit | ( | int | exitCode | ) | [static] |
References close(), instance(), and GpCoreTools::Leds::timer().
Referenced by checkOptionArg(), CoreApplication(), GpCoreTools::DaemonApplication::DaemonApplication(), GpCoreTools::DaemonApplication::fork(), osSignal(), GpCoreTools::DaemonApplication::parentInterrupted(), GpsDaemonApplication::parentProcessWait(), GpCoreTools::TcpServerStream::TcpServerStream(), GpCoreTools::UdpServerStream::UdpServerStream(), and GpCoreTools::UnixServerStream::UnixServerStream().
{ if(exitCode!=0) { // If led support on alix board, fast blinking of first led to indicate problems Leds::timer(0, 100, 100); } instance()->close(); ::exit(exitCode); }
std::string GpCoreTools::CoreApplication::getStdin | ( | ) | [static] |
References GpCoreTools::File::readLine(), and str.
{ std::string str; int n=256; char * buf=new char[n]; while(true) { if(File::readLine(buf, n, stdin)) { if(strcmp(buf,"END\n")==0) break; str+=buf; } } delete [] buf; return str; }
In case of fork, recall this function in the child.
References osSignal().
Referenced by CoreApplication(), and GpCoreTools::DaemonApplication::fork().
static CoreApplication* GpCoreTools::CoreApplication::instance | ( | ) | [inline, static] |
Referenced by authors(), GpCoreTools::ApplicationHelp::exec(), exit(), GpCoreTools::Log::Log(), GpCoreTools::DaemonApplication::parentInterrupted(), and GpCoreTools::ApplicationHelp::print().
{return _self;}
void GpCoreTools::CoreApplication::osSignal | ( | int | sig | ) | [static] |
In case an exception occurs during normal execution
References GpCoreTools::Trace::backTrace(), exit(), GpCoreTools::PThread::lockThreads(), GpCoreTools::PThread::stacks(), GpCoreTools::PThread::unlockThreads(), GpCoreTools::Log::write(), and GpCoreTools::Log::writeNoStamp().
Referenced by initInternalDebugger().
{ static pthread_mutex_t lock; if(pthread_mutex_trylock(&lock)!=0) { signal(sig, SIG_DFL); sleep(10000); fprintf(stderr, "EXCEPTION occured while processing exceptions.\n"); fprintf(stderr, "No backtrace information can be provided\n"); fprintf(stderr, "Eventually kill remaining instances:\n"); fprintf(stderr, " ps\n" ); fprintf(stderr, " pkill <application name>\n" ); exit(2); } Log::write(0, "received SEGV or ABRT signal\n"); #ifdef TRACE_ENABLED PThread::lockThreads(); std::list< std::vector<const TraceStamp *> * > sList=PThread::stacks(); std::list< std::vector<const TraceStamp *> * >::iterator it; for(it=sList.begin(); it!=sList.end(); it++) { Log::writeNoStamp(0, "---- thread\n"); Log::writeNoStamp(0, Trace::backTrace(*it).data()); } PThread::unlockThreads(); #endif signal (SIGABRT, 0); abort(); }
void GpCoreTools::CoreApplication::setHelp | ( | ApplicationHelp * | h | ) | [protected] |
References GpCoreTools::ApplicationHelp::addGroup(), GpCoreTools::ApplicationHelp::addOption(), GpCoreTools::compareStrings(), GpCoreTools::ApplicationHelp::sections(), and str.
Referenced by showHelp().
{ h->addGroup("Generic", "generic"); std::list<const char *> sections=h->sections(); sections.sort(compareStrings); std::string str="Show help about options. SECTION may be empty or: all, html"; for(std::list<const char *>::iterator it=sections.begin();it!=sections.end();it++) { str+= ", "; str+=*it; } h->addOption("-help <SECTION>", str.data()); h->addOption("-verbosity <LEVEL>", "Select level of output message (default=0)."); h->addOption("-version", "Show version information"); h->addOption("-app-version", "Show short version information"); h->addOption("-nobugreport", "Do not generate bug report in case of error"); }
void GpCoreTools::CoreApplication::showHelp | ( | int & | i, |
int | argc, | ||
char ** | argv, | ||
ApplicationHelp *(*)() | help | ||
) |
References checkOptionArg(), GpCoreTools::ApplicationHelp::exec(), help(), and setHelp().
Referenced by CoreApplication().
{ ApplicationHelp * h=help(); setHelp(h); if(checkOptionArg(i, argc, argv, false)) { h->exec(argv[i]); } else { h->exec(); } delete h; }
int GpCoreTools::CoreApplication::terminalCols | ( | ) | const |
{ if(_terminalCols==0) { terminalSize(); } return _terminalCols; }
int GpCoreTools::CoreApplication::terminalRows | ( | ) | const |
{ if(_terminalRows==0) { terminalSize(); } return _terminalRows; }
std::string GpCoreTools::CoreApplication::version | ( | ) | [static] |
Returns a complete description of all versions
References GpCoreTools::PackageInfo::list(), and str.
Referenced by CoreApplication().
{ char buf[256]; std::string str; for(std::list<PackageInfo>::iterator it=PackageInfo::list()->begin();it!=PackageInfo::list()->end(); it++ ) { sprintf(buf, " %-20s%s", +it->package().data(), it->version().data()); str+=buf; if(it->distribution().empty()) { str+="\n"; } else { str+=" from "; str+=it->distribution(); str+="\n"; } str+=" (built on "; str+=it->versionTime(); str+=")\n"; } return str; }
std::string GpCoreTools::CoreApplication::version | ( | const char * | item | ) | [static] |
Returns the version of item
References GpCoreTools::PackageInfo::list().
{ for(std::list<PackageInfo>::iterator it=PackageInfo::list()->begin();it!=PackageInfo::list()->end(); it++ ) { if(it->package()==item) { return it->version(); } } return ""; }