/*! \brief filter windows events * * Process PBT_APM* events */ bool PowerAwareApplication::winEventFilter(MSG * msg, long * result) { if(msg->message == WM_POWERBROADCAST) { /* PBT_APMSUSPEND System is suspending operation. - only since windows 2000: PBT_APMQUERYSUSPEND Request for permission to suspend PBT_APMQUERYSUSPENDFAILED Suspension request denied. PBT_APMPOWERSTATUSCHANGE Power status has changed. (switch battery/AC or battery under threshold) */ /* if(msg->wParam == PBT_APMQUERYSUSPEND) { standBy(); *result = TRUE; // BROADCAST_QUERY_DENY would block & deny/abort the Suspend Operation return true; } */ powerEvent(QString("pbt-%1").arg(msg->wParam)); if(msg->wParam == PBT_APMSUSPEND) { setProperty("stopper", "standby"); emit standBy(); *result = TRUE; return true; } /* PBT_APMRESUMEAUTOMATIC Operation is resuming automatically from a low-power state. This message is sent every time the system resumes. PBT_APMRESUMESUSPEND Operation is resuming from a low-power state. This message is sent after PBT_APMRESUMEAUTOMATIC if the resume is triggered by user input, such as pressing a key. */ if(msg->wParam == PBT_APMRESUMESUSPEND) { emit resume(); *result = TRUE; return true; } } return false; }
/*! \fn main * * \brief program entry point * * Set some static Qt parameters for using QSettings, * instantiate a MainWidget window and a BaseEngine object. * * \sa MainWidget, BaseEngine */ int main(int argc, char ** argv) { QString locale = QLocale::system().name(); // QApplication::setStyle(new XiVOCTIStyle()); QCoreApplication::setOrganizationName("XIVO"); QCoreApplication::setOrganizationDomain("xivo.fr"); QCoreApplication::setApplicationName("XIVO_Client"); PowerAwareApplication app(argc, argv); if(app.isRunning()) { qDebug() << "application is already running"; // do not create a new application, just activate the currently running one QString msg; if(argc > 1) { // send message if there is an argument. // see http://people.w3.org/~dom/archives/2005/09/integrating-a-new-uris-scheme-handler-to-gnome-and-firefox/ // to learn how to handle "tel:0123456" uri scheme msg.append(argv[1]); bool sentmsg = app.sendMessage(msg); qDebug() << "sent message" << msg << sentmsg; } return 0; } QSettings *settings = new QSettings(QSettings::IniFormat, QSettings::UserScope, QCoreApplication::organizationName(), QCoreApplication::applicationName()); qDebug() << "style" << app.style() << settings->fileName(); QString profile = "default-user"; if(argc > 1) { QString arg1(argv[1]); if((!arg1.startsWith("tel:", Qt::CaseInsensitive)) && (!arg1.startsWith("callto:", Qt::CaseInsensitive))) { profile = arg1; } } settings->setValue("profile/lastused", profile); QString qsskind = settings->value("display/qss", "none").toString(); QFile qssFile(QString(":/common/%1.qss").arg(qsskind)); if(qssFile.open(QIODevice::ReadOnly)) { app.setStyleSheet(qssFile.readAll()); } app.setWindowIcon(QIcon(":/images/xivo-login.png")); QString forcelocale = settings->value("engine-" + profile + "/forcelocale", "").toString(); if(forcelocale.length()) locale = forcelocale; QTranslator *translator; QStringList translationFiles = \ (QStringList() << ":/xivoclient_%1" << ":/baselib/baselib_%1" << QLibraryInfo::location(QLibraryInfo::TranslationsPath) + "/qt_%1" ); int i; for(i=0;i<translationFiles.size();++i) { translator = new QTranslator; translator->load(translationFiles.at(i).arg(locale)); app.installTranslator(translator); } QString info_osname; QString info_endianness = QSysInfo::ByteOrder ? "LE" : "BE"; #if defined(Q_WS_X11) info_osname = QString("X11-%1-%2").arg(info_endianness).arg(app.applicationPid()); #elif defined(Q_WS_WIN) info_osname = QString("WIN-%1-0x%2-%3").arg(info_endianness).arg(QSysInfo::WindowsVersion, 2, 16, QChar('0')).arg(app.applicationPid()); #elif defined(Q_WS_MAC) info_osname = QString("MAC-%1-0x%2-%3").arg(info_endianness).arg(QSysInfo::MacintoshVersion, 2, 16, QChar('0')).arg(app.applicationPid()); #else info_osname = QString("unknown-%1-%2").arg(info_endianness).arg(app.applicationPid()); #endif qDebug() << "main() osname=" << info_osname << "locale=" << locale; BaseEngine *engine = new BaseEngine(settings, info_osname); MainWidget window; app.setActivationWindow(&window); app.setQuitOnLastWindowClosed(false); app.setProperty("stopper", "lastwindow"); QObject::connect(&app, SIGNAL(standBy()), engine, SLOT(stop())); QObject::connect(&app, SIGNAL(resume()), engine, SLOT(start())); QObject::connect(&app, SIGNAL(powerEvent(const QString &)), engine, SLOT(powerEvent(const QString &))); QObject::connect(&app, SIGNAL(messageReceived(const QString &)), engine, SLOT(handleOtherInstanceMessage(const QString &))); return app.exec(); }
// argc has to be a reference, or QCoreApplication will segfault ExecObjects init_xivoclient(int & argc, char **argv) { ExecObjects ret; QCoreApplication::setOrganizationName("XIVO"); QCoreApplication::setOrganizationDomain("xivo.fr"); QCoreApplication::setApplicationName("XIVO_Client"); PowerAwareApplication *app = new PowerAwareApplication(argc, argv); FileOpenEventHandler* fileOpenHandler = new FileOpenEventHandler(app, app); app->installEventFilter(fileOpenHandler); QSettings * settings = new QSettings(QSettings::IniFormat, QSettings::UserScope, QCoreApplication::organizationName(), QCoreApplication::applicationName()); qDebug() << "Reading configuration file" << settings->fileName(); QString profile = "default-user"; QString msg = ""; for (int i = 1; i < argc; i ++) { QString arg_str(argv[i]); if (arg_str.length() == 0 || arg_str.contains(str_socket_arg_prefix)) { continue; } if(! PhoneNumber::isURI(arg_str)) { profile = arg_str; } else { msg = PhoneNumber::extract(arg_str); } } qDebug() << "Selected profile: " << profile; if (! msg.isEmpty()) { // send message if there is an argument. // see http://people.w3.org/~dom/archives/2005/09/integrating-a-new-uris-scheme-handler-to-gnome-and-firefox/ // to learn how to handle "tel:0123456" uri scheme app->sendMessage(msg); // warning : this sends the message only to the first instance, if ever there are >1 instances running } app->setWindowIcon(QIcon(":/images/xivo-login.png")); QString info_osname; QString info_endianness = QSysInfo::ByteOrder ? "LE" : "BE"; #if defined(Q_WS_X11) info_osname = QString("X11-%1-%2") .arg(info_endianness) .arg(app->applicationPid()); #elif defined(Q_WS_WIN) info_osname = QString("WIN-%1-0x%2-%3") .arg(info_endianness) .arg(QSysInfo::WindowsVersion, 2, 16, QChar('0')) .arg(app->applicationPid()); #elif defined(Q_WS_MAC) info_osname = QString("MAC-%1-0x%2-%3") .arg(info_endianness) .arg(QSysInfo::MacintoshVersion, 2, 16, QChar('0')) .arg(app->applicationPid()); #else info_osname = QString("unknown-%1-%2") .arg(info_endianness) .arg(app->applicationPid()); #endif bool shallbeunique = settings->value("display/unique").toBool(); if (shallbeunique && app->isRunning()) { qDebug() << Q_FUNC_INFO << "unique mode : application is already running : exiting"; // do not create a new application, just activate the currently running one ret.initOK = false; return ret; } settings->setValue("profile/lastused", profile); b_engine = new BaseEngine(settings, info_osname); QString qsskind = b_engine->getConfig("qss").toString(); QFile qssFile(QString(":/%1.qss").arg(qsskind)); if(qssFile.open(QIODevice::ReadOnly)) { app->setStyleSheet(qssFile.readAll()); } assembler = new Assembler(); if (! assembler) { qDebug() << Q_FUNC_INFO << "Failed to instantiate the Assembler"; return ret; } MainWindow *main_window = assembler->mainWindow(); main_window->initialize(); bool activate_on_tel = b_engine->getConfig("activate_on_tel").toBool(); app->setActivationWindow(main_window, activate_on_tel); fileOpenHandler->setActivationWindow(activate_on_tel); app->setQuitOnLastWindowClosed(false); app->setProperty("stopper", "lastwindow"); QObject::connect(app, SIGNAL(standBy()), b_engine, SLOT(stop())); QObject::connect(app, SIGNAL(resume()), b_engine, SLOT(start())); QObject::connect(app, SIGNAL(powerEvent(const QString &)), b_engine, SLOT(powerEvent(const QString &))); QObject::connect(app, SIGNAL(messageReceived(const QString &)), b_engine, SLOT(handleOtherInstanceMessage(const QString &))); QObject::connect(fileOpenHandler, SIGNAL(dialNumber(QString)), b_engine, SLOT(handleOtherInstanceMessage(const QString &))); ret.app = app; ret.win = main_window; ret.baseengine = b_engine; ret.initOK = true; #ifdef FUNCTESTS QString socket = "/tmp/xc-default.sock"; for (int i = 1; i < argc; i ++) { QString arg_str(argv[i]); if (arg_str.contains(str_socket_arg_prefix)) { socket = arg_str.replace(str_socket_arg_prefix, ""); } } qDebug() << "Selected RC socket: " << socket; ret.rc = new RemoteControl(ret, socket); #endif return ret; }