/*! \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;
}
Beispiel #2
0
/*! \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;
}