/////////////////////////////////////////////////////////////////////////////
// Name: eviacamapp.cpp
// Purpose:
// Author: Cesar Mauri Loba (cesar at crea-si dot com)
// Modified by:
// Created: 09/01/2008 21:40:06
// Copyright: (C) 2008-11 Cesar Mauri Loba - CREA Software Systems
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program 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 General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see .
/////////////////////////////////////////////////////////////////////////////
// For compilers that support precompilation, includes "wx/wx.h".
#include "wx/wxprec.h"
#ifdef __BORLANDC__
#pragma hdrstop
#endif
#ifndef WX_PRECOMP
#include "wx/wx.h"
#endif
////@begin includes
////@end includes
#include
#include
#include
#include
#include
#include
#include
#include "eviacamapp.h"
#include "paths.h"
#include "viacamcontroller.h"
#include "simplelog.h"
////@begin XPM images
////@end XPM images
#if !wxUSE_THREADS
#error "This program requires thread support."
#endif // wxUSE_THREADS
/*!
* Application instance implementation
*/
/*
////@begin implement app
IMPLEMENT_APP( EViacamApp )
////@end implement app
*/
// Under X11 it's necessary enable threading support (for XTestFakeRelativeMotionEvent call)
#if defined(__WXGTK__) || defined(__WXMOTIF__) || defined(__WXX11__)
IMPLEMENT_APP_NO_MAIN(EViacamApp)
#include
#ifndef NDEBUG
#include
#endif
int main(int argc, char *argv[]) {
//printf( "XInitThreads - calling\n" );
#ifndef NDEBUG
//mtrace();
#endif
if ( XInitThreads() == 0 ) {
fprintf( stderr, "%s: Unable to initialize multithreaded X11 code (XInitThreads failed).\n", argv[0] );
exit( EXIT_FAILURE );
}
return wxEntry(argc, argv);
}
#else
IMPLEMENT_APP(EViacamApp)
#endif
/*!
* EViacamApp type definition
*/
IMPLEMENT_CLASS( EViacamApp, wxApp )
/*!
* EViacamApp event table definition
*/
BEGIN_EVENT_TABLE( EViacamApp, wxApp )
////@begin EViacamApp event table entries
////@end EViacamApp event table entries
EVT_QUERY_END_SESSION(EViacamApp::OnEndSession)
END_EVENT_TABLE()
/*!
* Constructor for EViacamApp
*/
EViacamApp::EViacamApp()
{
Init();
}
/*!
* Member initialisation
*/
void EViacamApp::Init()
{
m_pController= NULL;
////@begin EViacamApp member initialisation
////@end EViacamApp member initialisation
}
/*!
* Initialisation for EViacamApp
*/
bool EViacamApp::OnInit()
{
// These functions are useful to pin down memory leaks on WIN32
//_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
//_CrtSetBreakAlloc(489103);
// Call default behaviour
if (!wxApp::OnInit()) return false;
/* ////@begin EViacamApp initialisation */
// Remove the comment markers above and below this block
// to make permanent changes to the code.
#if wxUSE_XPM
wxImage::AddHandler(new wxXPMHandler);
#endif
#if wxUSE_LIBPNG
wxImage::AddHandler(new wxPNGHandler);
#endif
#if wxUSE_LIBJPEG
wxImage::AddHandler(new wxJPEGHandler);
#endif
#if wxUSE_GIF
wxImage::AddHandler(new wxGIFHandler);
#endif
/* ////@end EViacamApp initialisation */
// Set up globals (TODO: remove paths.cpp)
eviacam::SetDataDir(wxStandardPaths::Get().GetDataDir());
// Initialize sockets support
// Note: (Workaround for implementation limitation for wxWidgets up to 2.5.x)
// If you want to use sockets or derived classes such as wxFTP in a secondary
// thread, call wxSocketBase::Initialize() (undocumented) from the main thread
// before creating any sockets - in wxApp::OnInit for example.
// See http://wiki.wxwidgets.org/wiki.pl?WxSocket or
// http://www.litwindow.com/knowhow/knowhow.html for more details.
wxSocketBase::Initialize();
// Initialize resources
wxXmlResource::Get()->InitAllHandlers();
wxXmlResource::Get()->LoadAllFiles(eviacam::GetDataDir() + wxT("/resources"));
// Start main controller
m_pController= new CViacamController();
if (!m_pController->Initialize()) {
OnExit();
return false;
}
else
return true;
}
static const wxCmdLineEntryDesc g_cmdLineDesc [] =
{
{ wxCMD_LINE_SWITCH, wxT_2("h"), wxT_2("help"), wxT_2("displays help on the command line parameters."),
wxCMD_LINE_VAL_NONE, wxCMD_LINE_OPTION_HELP },
{ wxCMD_LINE_SWITCH, wxT_2("d"), wxT_2("debug"), wxT_2("debug mode. Print debug messages to the console."),
wxCMD_LINE_VAL_NONE, wxCMD_LINE_PARAM_OPTIONAL },
{ wxCMD_LINE_OPTION, wxT_2("c"), wxT_2("custom-config"), wxT_2("Use custom configuration file."),
wxCMD_LINE_VAL_STRING, wxCMD_LINE_PARAM_OPTIONAL },
{ wxCMD_LINE_NONE }
};
void EViacamApp::OnInitCmdLine(wxCmdLineParser& parser)
{
parser.SetDesc (g_cmdLineDesc);
// must refuse '/' as parameter starter or cannot use "/path" style paths
parser.SetSwitchChars (wxT("-"));
}
bool EViacamApp::OnCmdLineParsed(wxCmdLineParser& parser)
{
bool debug_mode= parser.Found(wxT("d"));
#ifndef NDEBUG
debug_mode = true;
#endif
if (debug_mode) {
// Set log priority level
slog_set_priority (SLOG_PRIO_DEBUG);
#if defined(WIN32)
AllocConsole();
freopen("CONOUT$", "wb", stdout);
freopen("CONOUT$", "wb", stderr);
slog_write (SLOG_PRIO_INFO, "debug mode enabled");
#endif
}
wxString custom_config_path;
bool custom_config= parser.Found(wxT("c"), &custom_config_path);
if (custom_config) {
wxFileConfig* customFileConfig = new wxFileConfig(wxEmptyString, wxEmptyString,
custom_config_path, custom_config_path,
wxCONFIG_USE_LOCAL_FILE);
wxConfigBase::Set(customFileConfig);
}
return true;
}
/*!
* Cleanup for EViacamApp
*/
int EViacamApp::OnExit()
{
m_pController->Finalize();
delete m_pController;
m_pController= NULL;
wxSocketBase::Shutdown();
////@begin EViacamApp cleanup
return wxApp::OnExit();
////@end EViacamApp cleanup
}
//
// This handler terminates eViacam gracefully when the OS session is closed
//
void EViacamApp::OnEndSession( wxCloseEvent& event )
{
if (m_pController) m_pController->Finalize();
event.Skip(false);
}