mirror of https://github.com/cutefishos/appmotor
[mapplauncherd] Remove Qt boosters and related tests
These have been split to a separate repository and package.pull/1/head
parent
6fd7197814
commit
adef09cd6f
@ -1,5 +0,0 @@
|
|||||||
# Tell qmake to use pkg-config to get correct compiler and linker
|
|
||||||
# flags to make an application usable with applauncherd.
|
|
||||||
|
|
||||||
CONFIG += link_pkgconfig
|
|
||||||
PKGCONFIG += qdeclarative-boostable
|
|
||||||
@ -1,5 +0,0 @@
|
|||||||
# Tell qmake to use pkg-config to get correct compiler and linker
|
|
||||||
# flags to make an application usable with applauncherd.
|
|
||||||
|
|
||||||
CONFIG += link_pkgconfig
|
|
||||||
PKGCONFIG += qt-boostable
|
|
||||||
@ -1,6 +0,0 @@
|
|||||||
Name: qdeclarative-boostable
|
|
||||||
Description: make application boostable by applauncherd
|
|
||||||
Version: 0.2.0
|
|
||||||
Libs: -pie -rdynamic -lmdeclarativecache
|
|
||||||
Cflags: -fPIC -fvisibility=hidden -fvisibility-inlines-hidden -I/usr/include/applauncherd
|
|
||||||
|
|
||||||
@ -1,5 +0,0 @@
|
|||||||
Name: qt-boostable
|
|
||||||
Description: make application boostable by applauncherd
|
|
||||||
Version: 0.2.0
|
|
||||||
Libs: -pie -rdynamic
|
|
||||||
Cflags: -fPIC -fvisibility=hidden -fvisibility-inlines-hidden
|
|
||||||
@ -1,42 +0,0 @@
|
|||||||
include(FindX11)
|
|
||||||
|
|
||||||
# Find Qt4
|
|
||||||
find_package(Qt4 4.6.0 REQUIRED)
|
|
||||||
include(${QT_USE_FILE})
|
|
||||||
if (${QTVERSION} VERSION_LESS 4.6.0)
|
|
||||||
message(FATAL_ERROR "You need Qt4.6, found ${QTVERSION}.")
|
|
||||||
endif (${QTVERSION} VERSION_LESS 4.6.0)
|
|
||||||
|
|
||||||
set(LAUNCHER "${CMAKE_HOME_DIRECTORY}/src/launcherlib")
|
|
||||||
|
|
||||||
include_directories(${CMAKE_CURRENT_SOURCE_DIR} ${LAUNCHER} "${CMAKE_HOME_DIRECTORY}/src/common")
|
|
||||||
|
|
||||||
# Set sources
|
|
||||||
set(PLUGINSRC qdeclarativebooster.cpp pluginfactory.cpp)
|
|
||||||
|
|
||||||
set(LIBSRC mdeclarativecache.cpp mdeclarativecache.h mdeclarativecache_p.h eventhandler.cpp eventhandler.h)
|
|
||||||
set(MOC_HDRS eventhandler.h)
|
|
||||||
qt4_wrap_cpp(MOC_SRC ${MOC_HDRS})
|
|
||||||
|
|
||||||
# Set executables
|
|
||||||
add_library(mdeclarativecache SHARED ${LIBSRC} ${MOC_SRC})
|
|
||||||
set_target_properties(mdeclarativecache PROPERTIES
|
|
||||||
VERSION 0.1 SOVERSION 0)
|
|
||||||
if ($ENV{HARMATTAN})
|
|
||||||
set_target_properties(mdeclarativecache PROPERTIES COMPILE_FLAGS -DHAVE_PATH_REINIT)
|
|
||||||
endif ($ENV{HARMATTAN})
|
|
||||||
target_link_libraries(mdeclarativecache ${LIBDL} ${QT_QTCORE_LIBRARY} ${QT_QTDECLARATIVE_LIBRARY} ${QT_QTGUI_LIBRARY} ${X11_LIBRARIES} "-L../launcherlib -lapplauncherd")
|
|
||||||
add_dependencies(mdeclarativecache applauncherd)
|
|
||||||
|
|
||||||
add_library(qdeclarativebooster MODULE ${PLUGINSRC})
|
|
||||||
set_target_properties(qdeclarativebooster PROPERTIES
|
|
||||||
COMPILE_FLAGS -fvisibility=hidden)
|
|
||||||
target_link_libraries(qdeclarativebooster ${LIBDL} "-L. -lmdeclarativecache -L../launcherlib -lapplauncherd")
|
|
||||||
add_dependencies(qdeclarativebooster applauncherd mdeclarativecache)
|
|
||||||
|
|
||||||
# Add install rule
|
|
||||||
install(TARGETS qdeclarativebooster DESTINATION /usr/lib/applauncherd/)
|
|
||||||
install(TARGETS mdeclarativecache DESTINATION /usr/lib)
|
|
||||||
install(FILES mdeclarativecache.h MDeclarativeCache eventhandler.h DESTINATION /usr/include/applauncherd
|
|
||||||
PERMISSIONS OWNER_READ GROUP_READ WORLD_READ)
|
|
||||||
|
|
||||||
@ -1,2 +0,0 @@
|
|||||||
#include "mdeclarativecache.h"
|
|
||||||
|
|
||||||
@ -1,256 +0,0 @@
|
|||||||
This File
|
|
||||||
=========
|
|
||||||
|
|
||||||
This document describes how to use to speed up QML application startup
|
|
||||||
in Harmattan/MeeGo using the applauncherd daemon and the qdeclarative booster.
|
|
||||||
|
|
||||||
For a more general description of the launcher concept and technical
|
|
||||||
details, see the README file in the meegotouch-applauncherd source
|
|
||||||
tree.
|
|
||||||
|
|
||||||
1. COMPILING YOUR APPLICATION TO BE LAUNCHABLE
|
|
||||||
|
|
||||||
Binaries intended to be run with applauncherd should be compiled with -fPIC option
|
|
||||||
to produce position independent code. In order to produce a position independent
|
|
||||||
executable, -pie option and -rdynamic options can be used in linking. This allows
|
|
||||||
the result to be executed both traditionally and with the launcher.
|
|
||||||
|
|
||||||
To improve linking and loading times of shared object libraries it is
|
|
||||||
encouraged to hide any unnecessary symbols from the resulting binary by using
|
|
||||||
-fvisibility=hidden and -fvisibility-inlines-hidden flags as well.
|
|
||||||
|
|
||||||
|
|
||||||
1.1 Build configuration
|
|
||||||
|
|
||||||
These instructions describe how to build your application so that it
|
|
||||||
can be launched using applauncherd. Only Debian packaging is considered,
|
|
||||||
you have to creatively apply the instructions if you are doing RPM packaging.
|
|
||||||
|
|
||||||
Using QMake
|
|
||||||
-----------
|
|
||||||
|
|
||||||
If you are using QMake, making your application boostable is just a
|
|
||||||
matter of adding a suitable configuration option.
|
|
||||||
|
|
||||||
For Qt Declarative (QML) applications, the configuration option is
|
|
||||||
provided by the applauncherd-dev package. If you are building a
|
|
||||||
Debian package, you have to add a build dependency to
|
|
||||||
applauncherd-dev. The configuration option is:
|
|
||||||
|
|
||||||
CONFIG += qdeclarative-boostable
|
|
||||||
|
|
||||||
If you want to use pkg-config directly for some reason (like getting
|
|
||||||
error messages), you can add explicit pkg-config calls in the appropriate
|
|
||||||
flags:
|
|
||||||
|
|
||||||
QMAKE_CXXFLAGS += `pkg-config --cflags qdeclarative-boostable`
|
|
||||||
QMAKE_LFLAGS += `pkg-config --libs qdeclarative-boostable`
|
|
||||||
|
|
||||||
You can also manually set the options in your .pro file like this:
|
|
||||||
|
|
||||||
QMAKE_CXXFLAGS += -fPIC -fvisibility=hidden -fvisibility-inlines-hidden
|
|
||||||
QMAKE_LFLAGS += -pie -rdynamic
|
|
||||||
|
|
||||||
Note that you have to update the flags manually if there are any changes in
|
|
||||||
the required flags.
|
|
||||||
|
|
||||||
Using CMake
|
|
||||||
---------------------------
|
|
||||||
|
|
||||||
You can utilize pkg-config in CMake by including FindPkgConfig in CMakeLists.txt:
|
|
||||||
|
|
||||||
include(FindPkgConfig)
|
|
||||||
|
|
||||||
To get Debian packages built correctly, make the package
|
|
||||||
build-depend on applauncherd-dev. To obtain the compiler and linker
|
|
||||||
flags, add the following lines in CMakeLists.txt:
|
|
||||||
|
|
||||||
pkg_check_modules(QDECLARATIVE_BOOSTABLE REQUIRED qdeclarative-boostable)
|
|
||||||
add_definitions(${QDECLARATIVE_BOOSTABLE_CFLAGS})
|
|
||||||
link_libraries(${QDECLARATIVE_BOOSTABLE_LDFLAGS})
|
|
||||||
|
|
||||||
If you do not want to use pkg-config for some reason, you can manually add the
|
|
||||||
compiler and linker flags like this:
|
|
||||||
|
|
||||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC -fvisibility=hidden
|
|
||||||
-fvisibility-inlines-hidden")
|
|
||||||
set(CMAKE_EXE_LINKER_FLAGS "-pie -rdynamic")
|
|
||||||
|
|
||||||
Again, this requires you to update the flags if something changes.
|
|
||||||
|
|
||||||
Automatic settings with pkg-config (any build system)
|
|
||||||
-----------------------------------------------------
|
|
||||||
|
|
||||||
To get Debian packages built correctly, make the package
|
|
||||||
build-depend on applauncherd-dev. The correct flags can be
|
|
||||||
automatically obtained with:
|
|
||||||
|
|
||||||
pkg-config --cflags qdeclarative-boostable
|
|
||||||
pkg-config --libs qdeclarative-boostable
|
|
||||||
|
|
||||||
1.3 Changes to the code
|
|
||||||
|
|
||||||
With -fvisibility=hidden you must make sure that the symbol for main() is
|
|
||||||
exported, because otherwise the launcher is not able to find the entry point
|
|
||||||
for your application. This can be done like this:
|
|
||||||
|
|
||||||
#include <QtCore/QtGlobal>
|
|
||||||
|
|
||||||
Q_DECL_EXPORT int main(int argc, char **argv)
|
|
||||||
{
|
|
||||||
...
|
|
||||||
}
|
|
||||||
|
|
||||||
The application cannot directly instantiate QApplication and
|
|
||||||
QDeclarativeView. Instead of writing e.g.
|
|
||||||
|
|
||||||
QApplication app;
|
|
||||||
QDeclarativeView view;
|
|
||||||
|
|
||||||
you need to pick up instances of QApplication and QDeclarativeView from a cache:
|
|
||||||
|
|
||||||
QApplication *app = MDeclarativeCache::qApplication(argc, argv);
|
|
||||||
QDeclarativeView *window = MDeclarativeCache::qDeclarativeView();
|
|
||||||
|
|
||||||
The ownership of the instances is currently transferred from the cache to the
|
|
||||||
application code, but this is subject to change if there is a need to align
|
|
||||||
the API with Symbian.
|
|
||||||
|
|
||||||
If you plan to use QCoreApplication::applicationDirPath() or
|
|
||||||
QCoreApplication::applicationFilePath(), please see KNOWN ISSUES below.
|
|
||||||
|
|
||||||
2. LAUNCHING YOUR APPLICATION USING INVOKER
|
|
||||||
|
|
||||||
The application to be launched must be "invoked" using the invoker binary. The
|
|
||||||
invoker then sends the application data, essentially arguments and environment
|
|
||||||
variables, to the launcher daemon via a socket connection. The launched
|
|
||||||
application will see its real binary name in its argv[0].
|
|
||||||
|
|
||||||
2.1 Launch from the command-line
|
|
||||||
|
|
||||||
Use --type=d for Qt Declarative applications:
|
|
||||||
|
|
||||||
/usr/bin/invoker --type=d <application_name>
|
|
||||||
|
|
||||||
2.2 D-Bus launch
|
|
||||||
|
|
||||||
If you are using D-Bus to launch your application, it can be done
|
|
||||||
straightly in the .service-file and without any wrapper scripts slowing
|
|
||||||
things down:
|
|
||||||
|
|
||||||
[D-BUS Service]
|
|
||||||
Name=com.nokia.<application_name>
|
|
||||||
Exec=/usr/bin/invoker --type=d /usr/bin/<application_name>
|
|
||||||
|
|
||||||
By default, invoker waits for the application to terminate and exits with
|
|
||||||
the same exit code. Unix signals are also forwarded.
|
|
||||||
|
|
||||||
Note 1: If --no-wait and --delay is used, it is important to add enough delay to
|
|
||||||
invoker so that it won't exit before the launched application gets its
|
|
||||||
(possible) D-Bus service registered. Otherwise D-Bus daemon may think that the
|
|
||||||
application just died.
|
|
||||||
|
|
||||||
Note 2: There is a slight difference in the application start-up time if you use a
|
|
||||||
wrapper script instead of the actual binary in Exec-field of .desktop and .service files.
|
|
||||||
Therefore, it is recommended that you always use the actual invoker call with the
|
|
||||||
binary name as presented above.
|
|
||||||
|
|
||||||
Note 3: When .desktop file contains the X-Maemo-Service field, the application
|
|
||||||
is started by default through D-Bus. This might cause some delay for
|
|
||||||
application start-up time. Therefore it is recommended to use the single
|
|
||||||
instance launch functionality (see below) instead of a X-Maemo-Service if
|
|
||||||
possible
|
|
||||||
|
|
||||||
See invoker --help for all possible command-line parameters.
|
|
||||||
|
|
||||||
2.3 Single instance launch
|
|
||||||
|
|
||||||
Usually user wants the application to be run as a single instance. This means,
|
|
||||||
that if the launched application is already running, the existing application
|
|
||||||
window is activated and no new application processes are started.
|
|
||||||
|
|
||||||
This can be achieved by adding --single-instance to the invoker command:
|
|
||||||
|
|
||||||
[D-BUS Service]
|
|
||||||
Name=com.nokia.<application_name>
|
|
||||||
Exec=/usr/bin/invoker --single-instance --type=d /usr/bin/<application_name>
|
|
||||||
|
|
||||||
As a result, a lock file $HOME/.single-instance-locks/<application_name>/instance.lock
|
|
||||||
is created. If applauncherd cannot acquire the lock, it tries to find the
|
|
||||||
corresponding window and activates it.
|
|
||||||
|
|
||||||
This functionality is implemented in a position-independent executable called
|
|
||||||
single-instance. Applauncherd uses the executable as a library, but it can be
|
|
||||||
used as an ordinary program to start anything as a single instance:
|
|
||||||
|
|
||||||
/usr/bin/single-instance <application_name>
|
|
||||||
|
|
||||||
Note, that in this case the launcher is not used.
|
|
||||||
|
|
||||||
Consider using --single-instance instead of the single instance functionality
|
|
||||||
provided by D-Bus, because it very likely is much faster.
|
|
||||||
|
|
||||||
2.4 Splash screen
|
|
||||||
|
|
||||||
Applauncherd supports showing a splash screen if there is mcompositor
|
|
||||||
(the MeeGo window manager) running.
|
|
||||||
|
|
||||||
The splash screen is not shown by default. If an application wants it
|
|
||||||
to be shown, it must pass --splash, and optionally --splash-landscape
|
|
||||||
arguments to the invoker.
|
|
||||||
|
|
||||||
For instance,
|
|
||||||
|
|
||||||
/usr/bin/invoker --splash=/usr/share/application_name/splash.jpg \
|
|
||||||
--splash-landscape=/usr/share/application_name/splash-l.jpg \
|
|
||||||
--type=d \
|
|
||||||
/usr/bin/application_name
|
|
||||||
|
|
||||||
shows the splash screen with splash.jpg as its content when the device
|
|
||||||
is in the portrait orientation. Otherwise splash-l.jpg is shown. If
|
|
||||||
only --splash is given, that image is shown in both orientations.
|
|
||||||
|
|
||||||
Invoker passes the splash request to the booster. The booster sends
|
|
||||||
the splash request to the window manager by setting a window property
|
|
||||||
to window manager's window.
|
|
||||||
|
|
||||||
If the filenames do not include absolute paths, the window manager
|
|
||||||
looks for the files from a default location.
|
|
||||||
|
|
||||||
3. PACKAGE DEPENDENCIES
|
|
||||||
|
|
||||||
Applications using the launcher must depend on the applauncherd Debian package.
|
|
||||||
|
|
||||||
|
|
||||||
4. CURRENT KNOWN ISSUES
|
|
||||||
|
|
||||||
4.1 Forking
|
|
||||||
|
|
||||||
Using QApplication or QDeclarativeView fetched from the cache in a child
|
|
||||||
process does not work, because they would share the X11 connection with the
|
|
||||||
parent.
|
|
||||||
|
|
||||||
4.2 Non-working QCoreApplication methods
|
|
||||||
|
|
||||||
The following methods of QCoreApplication are known not to work with
|
|
||||||
qdeclarative booster:
|
|
||||||
|
|
||||||
QCoreApplication::applicationDirPath()
|
|
||||||
QCoreApplication::applicationFilePath()
|
|
||||||
|
|
||||||
The reason for this that the methods get the path from the /proc file system,
|
|
||||||
so they return the path to the booster rather than the path to the launched
|
|
||||||
application. This is unlikely to be fixed for Qt 4.7.
|
|
||||||
|
|
||||||
The MDeclarativeCache class provides the replacements
|
|
||||||
MDeclarativeCache::applicationDirPath() and
|
|
||||||
MDeclarativeCache::applicationFilePath(), which are identical to the
|
|
||||||
QCoreApplication counterparts, except that in the boosted case they use argv[0]
|
|
||||||
of the boosted application.
|
|
||||||
|
|
||||||
5. COMMAND-LINE PARAMETERS
|
|
||||||
|
|
||||||
All parameters are listed by:
|
|
||||||
|
|
||||||
invoker --help
|
|
||||||
applauncherd --help
|
|
||||||
@ -1,120 +0,0 @@
|
|||||||
#include <QtConcurrentRun>
|
|
||||||
#include <QApplication>
|
|
||||||
|
|
||||||
#include "eventhandler.h"
|
|
||||||
#include "connection.h"
|
|
||||||
#include "logger.h"
|
|
||||||
#include "booster.h"
|
|
||||||
#include <sys/socket.h>
|
|
||||||
|
|
||||||
int EventHandler::m_sighupFd[2];
|
|
||||||
struct sigaction EventHandler::m_oldSigAction;
|
|
||||||
|
|
||||||
EventHandler::EventHandler(Booster* parent)
|
|
||||||
: m_parent(parent)
|
|
||||||
{
|
|
||||||
m_sighupFd[0] = -1;
|
|
||||||
m_sighupFd[1] = -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
EventHandler::~EventHandler()
|
|
||||||
{
|
|
||||||
if (m_sighupFd[0] != -1)
|
|
||||||
::close(m_sighupFd[0]);
|
|
||||||
|
|
||||||
if (m_sighupFd[1] != -1)
|
|
||||||
::close(m_sighupFd[1]);
|
|
||||||
}
|
|
||||||
|
|
||||||
void EventHandler::runEventLoop()
|
|
||||||
{
|
|
||||||
// Exit from event loop when invoker is ready to connect
|
|
||||||
connect(this, SIGNAL(connectionAccepted()), QApplication::instance(), SLOT(quit()));
|
|
||||||
connect(this, SIGNAL(connectionRejected()), QApplication::instance(), SLOT(quit()));
|
|
||||||
|
|
||||||
// Start another thread to listen connection from invoker
|
|
||||||
QtConcurrent::run(this, &EventHandler::accept);
|
|
||||||
|
|
||||||
// Create socket pair for SIGHUP
|
|
||||||
bool handlerIsSet = false;
|
|
||||||
if (::socketpair(AF_UNIX, SOCK_STREAM, 0, m_sighupFd))
|
|
||||||
{
|
|
||||||
Logger::logError("EventHandler: Couldn't create HUP socketpair");
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// Install signal handler e.g. to exit cleanly if launcher dies.
|
|
||||||
// This is a problem because MBooster runs a Qt event loop.
|
|
||||||
EventHandler::setupUnixSignalHandlers();
|
|
||||||
|
|
||||||
// Install a socket notifier on the socket
|
|
||||||
connect(new QSocketNotifier(m_sighupFd[1], QSocketNotifier::Read, this),
|
|
||||||
SIGNAL(activated(int)), this, SLOT(handleSigHup()));
|
|
||||||
|
|
||||||
handlerIsSet = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Run event loop so application instance can receive notifications
|
|
||||||
QApplication::exec();
|
|
||||||
|
|
||||||
// Restore signal handlers to previous values
|
|
||||||
if (handlerIsSet)
|
|
||||||
{
|
|
||||||
restoreUnixSignalHandlers();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void EventHandler::accept()
|
|
||||||
{
|
|
||||||
if (m_parent->connection()->accept(m_parent->appData()))
|
|
||||||
{
|
|
||||||
emit connectionAccepted();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
emit connectionRejected();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
// All this signal handling code is taken from Qt's Best Practices:
|
|
||||||
// http://doc.qt.nokia.com/latest/unix-signals.html
|
|
||||||
//
|
|
||||||
|
|
||||||
void EventHandler::hupSignalHandler(int)
|
|
||||||
{
|
|
||||||
char a = 1;
|
|
||||||
::write(m_sighupFd[0], &a, sizeof(a));
|
|
||||||
}
|
|
||||||
|
|
||||||
void EventHandler::handleSigHup()
|
|
||||||
{
|
|
||||||
QApplication::quit();
|
|
||||||
_exit(EXIT_SUCCESS);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool EventHandler::setupUnixSignalHandlers()
|
|
||||||
{
|
|
||||||
struct sigaction hup;
|
|
||||||
|
|
||||||
hup.sa_handler = hupSignalHandler;
|
|
||||||
sigemptyset(&hup.sa_mask);
|
|
||||||
hup.sa_flags = SA_RESTART;
|
|
||||||
|
|
||||||
if (sigaction(SIGHUP, &hup, &m_oldSigAction) > 0)
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool EventHandler::restoreUnixSignalHandlers()
|
|
||||||
{
|
|
||||||
if (sigaction(SIGHUP, &m_oldSigAction, 0) > 0)
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
@ -1,63 +0,0 @@
|
|||||||
#ifndef EVENTHANDLER_H
|
|
||||||
#define EVENTHANDLER_H
|
|
||||||
|
|
||||||
#include <QObject>
|
|
||||||
#include <QSocketNotifier>
|
|
||||||
#include <signal.h>
|
|
||||||
#include <tr1/memory>
|
|
||||||
|
|
||||||
using std::tr1::shared_ptr;
|
|
||||||
|
|
||||||
class Connection;
|
|
||||||
class Booster;
|
|
||||||
|
|
||||||
class EventHandler : public QObject
|
|
||||||
{
|
|
||||||
Q_OBJECT
|
|
||||||
|
|
||||||
public:
|
|
||||||
//! \brief Constructor
|
|
||||||
EventHandler(Booster* parent);
|
|
||||||
|
|
||||||
//! \brief Destructor
|
|
||||||
virtual ~EventHandler();
|
|
||||||
|
|
||||||
void runEventLoop();
|
|
||||||
|
|
||||||
//! UNIX signal handler for SIGHUP
|
|
||||||
static void hupSignalHandler(int unused);
|
|
||||||
|
|
||||||
//! Setup UNIX signal handlers
|
|
||||||
static bool setupUnixSignalHandlers();
|
|
||||||
|
|
||||||
//! Restore UNIX signal handlers to previous values
|
|
||||||
static bool restoreUnixSignalHandlers();
|
|
||||||
|
|
||||||
private:
|
|
||||||
|
|
||||||
//! wait for socket connection
|
|
||||||
void accept();
|
|
||||||
|
|
||||||
//! Socket pair used to get SIGHUP
|
|
||||||
static int m_sighupFd[2];
|
|
||||||
|
|
||||||
//! Socket notifier used for m_sighupFd
|
|
||||||
shared_ptr<QSocketNotifier> m_snHup;
|
|
||||||
|
|
||||||
//! Old sigaction struct
|
|
||||||
static struct sigaction m_oldSigAction;
|
|
||||||
|
|
||||||
// Parent object
|
|
||||||
Booster* m_parent;
|
|
||||||
|
|
||||||
private slots:
|
|
||||||
|
|
||||||
//! Qt signal handler for SIGHUP.
|
|
||||||
void handleSigHup();
|
|
||||||
|
|
||||||
signals:
|
|
||||||
void connectionAccepted();
|
|
||||||
void connectionRejected();
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@ -1,263 +0,0 @@
|
|||||||
/***************************************************************************
|
|
||||||
**
|
|
||||||
** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
|
|
||||||
** All rights reserved.
|
|
||||||
** Contact: Nokia Corporation (directui@nokia.com)
|
|
||||||
**
|
|
||||||
** This file is part of applauncherd
|
|
||||||
**
|
|
||||||
** If you have questions regarding the use of this file, please contact
|
|
||||||
** Nokia at directui@nokia.com.
|
|
||||||
**
|
|
||||||
** This library is free software; you can redistribute it and/or
|
|
||||||
** modify it under the terms of the GNU Lesser General Public
|
|
||||||
** License version 2.1 as published by the Free Software Foundation
|
|
||||||
** and appearing in the file LICENSE.LGPL included in the packaging
|
|
||||||
** of this file.
|
|
||||||
**
|
|
||||||
****************************************************************************/
|
|
||||||
|
|
||||||
#include <Qt/QtDeclarative>
|
|
||||||
#include <QX11Info>
|
|
||||||
#include <QtPlugin>
|
|
||||||
#include <QPluginLoader>
|
|
||||||
#include <QLibraryInfo>
|
|
||||||
#include <QApplication>
|
|
||||||
|
|
||||||
#include "mdeclarativecache.h"
|
|
||||||
#include "mdeclarativecache_p.h"
|
|
||||||
|
|
||||||
#ifdef Q_WS_X11
|
|
||||||
#include <X11/Xlib.h>
|
|
||||||
#include <X11/Xutil.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
MDeclarativeCachePrivate * const MDeclarativeCache::d_ptr = new MDeclarativeCachePrivate;
|
|
||||||
const int MDeclarativeCachePrivate::ARGV_LIMIT = 32;
|
|
||||||
|
|
||||||
MDeclarativeCachePrivate::MDeclarativeCachePrivate() :
|
|
||||||
qApplicationInstance(0),
|
|
||||||
qDeclarativeViewInstance(0),
|
|
||||||
initialArgc(ARGV_LIMIT),
|
|
||||||
initialArgv(new char* [initialArgc]),
|
|
||||||
appDirPath(QString()),
|
|
||||||
appFilePath(QString()),
|
|
||||||
cachePopulated(false),
|
|
||||||
testabilityInterface(0)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
MDeclarativeCachePrivate::~MDeclarativeCachePrivate()
|
|
||||||
{
|
|
||||||
delete qDeclarativeViewInstance;
|
|
||||||
delete[] initialArgv;
|
|
||||||
}
|
|
||||||
|
|
||||||
void MDeclarativeCachePrivate::populate()
|
|
||||||
{
|
|
||||||
// Record the fact that the cache has been populated
|
|
||||||
cachePopulated = true;
|
|
||||||
|
|
||||||
static const char *const emptyString = "";
|
|
||||||
static const QString appNameFormat = "mdeclarativecache_pre_initialized_qapplication-%1";
|
|
||||||
static QByteArray appName;
|
|
||||||
|
|
||||||
// Append pid to appName to make it unique. This is required because the
|
|
||||||
// libminputcontext.so instantiates MComponentData, which in turn registers
|
|
||||||
// a dbus service with the application's name.
|
|
||||||
appName = appNameFormat.arg(getpid()).toLatin1();
|
|
||||||
|
|
||||||
// We support at most ARGV_LIMIT arguments in QCoreApplication. These will be set when real
|
|
||||||
// arguments are known (in MDeclarativeCachePrivate::qApplication).
|
|
||||||
initialArgv[0] = const_cast<char *>(appName.constData());
|
|
||||||
for (int i = 1; i < initialArgc; i++) {
|
|
||||||
initialArgv[i] = const_cast<char *>(emptyString);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (qApplicationInstance == 0) {
|
|
||||||
qApplicationInstance = new QApplication(initialArgc, initialArgv);
|
|
||||||
}
|
|
||||||
|
|
||||||
qDeclarativeViewInstance = new QDeclarativeView();
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
QApplication* MDeclarativeCachePrivate::qApplication(int &argc, char **argv)
|
|
||||||
{
|
|
||||||
if (qApplicationInstance == 0)
|
|
||||||
{
|
|
||||||
qApplicationInstance = new QApplication(argc, argv);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (argc > ARGV_LIMIT)
|
|
||||||
{
|
|
||||||
qWarning("MDeclarativeCache: QCoreApplication::arguments() will not contain all arguments.");
|
|
||||||
}
|
|
||||||
|
|
||||||
// Copy arguments to QCoreApplication
|
|
||||||
for (int i = 0; i < qMin(argc, ARGV_LIMIT); i++)
|
|
||||||
{
|
|
||||||
qApp->argv()[i] = argv[i];
|
|
||||||
}
|
|
||||||
|
|
||||||
// This changes argc in QCoreApplication
|
|
||||||
initialArgc = qMin(argc, ARGV_LIMIT);
|
|
||||||
|
|
||||||
// Take application name from argv
|
|
||||||
QString appName = QFileInfo(argv[0]).fileName();
|
|
||||||
|
|
||||||
// Set object name
|
|
||||||
qApp->setObjectName(appName);
|
|
||||||
|
|
||||||
bool loadTestabilityArg = false;
|
|
||||||
const char* testabilityArg = "-testability";
|
|
||||||
for (int i = 0; i < argc; i++)
|
|
||||||
{
|
|
||||||
if (strcmp(argv[i], testabilityArg) == 0)
|
|
||||||
{
|
|
||||||
loadTestabilityArg = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
bool loadTestabilityEnv = !qgetenv("QT_LOAD_TESTABILITY").isNull();
|
|
||||||
if (loadTestabilityEnv || loadTestabilityArg)
|
|
||||||
testabilityInit();
|
|
||||||
|
|
||||||
#ifdef Q_WS_X11
|
|
||||||
// Currently QDeclarativeView is "Alien" widget and doesn't have it's XWindow. The procedure below is not needed.
|
|
||||||
// Call to winId() converts the widget to "Native" and makes it slow.
|
|
||||||
// If things get changed to use the procedure need to define QDV_USE_NATIVE_WIDGETS
|
|
||||||
// In this case it should be considered to add XErrorHandler around XSetCommand and XSetClassHint
|
|
||||||
// because those can generate BadAlloc and BadWindow errors.
|
|
||||||
#ifdef QDV_USE_NATIVE_WIDGETS
|
|
||||||
// reinit WM_COMMAND X11 property
|
|
||||||
if (qDeclarativeViewInstance)
|
|
||||||
{
|
|
||||||
Display *display = QX11Info::display();
|
|
||||||
if (display)
|
|
||||||
{
|
|
||||||
qDeclarativeViewInstance->winId();
|
|
||||||
XSetCommand(display, qDeclarativeViewInstance->effectiveWinId(), argv, argc);
|
|
||||||
|
|
||||||
// set correct WM_CLASS properties
|
|
||||||
QString appClass = appName.left(1).toUpper();
|
|
||||||
if (appName.length() > 1)
|
|
||||||
appClass += appName.right(appName.length() - 1);
|
|
||||||
|
|
||||||
// reserve memory for C strings
|
|
||||||
QByteArray arrName(appName.toLatin1());
|
|
||||||
QByteArray arrClass(appClass.toLatin1());
|
|
||||||
|
|
||||||
XClassHint class_hint;
|
|
||||||
class_hint.res_name = arrName.data();
|
|
||||||
class_hint.res_class = arrClass.data();
|
|
||||||
|
|
||||||
XSetClassHint(display, qDeclarativeViewInstance->effectiveWinId(), &class_hint);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
if (cachePopulated)
|
|
||||||
{
|
|
||||||
// In Qt 4.7, QCoreApplication::applicationDirPath() and
|
|
||||||
// QCoreApplication::applicationFilePath() look up the paths in /proc,
|
|
||||||
// which does not work when the booster is used. As a workaround, we
|
|
||||||
// use argv[0] to provide the correct values in the cache class.
|
|
||||||
appFilePath = QString(argv[0]);
|
|
||||||
appDirPath = QString(argv[0]);
|
|
||||||
appDirPath.chop(appDirPath.size() - appDirPath.lastIndexOf("/"));
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef HAVE_PATH_REINIT
|
|
||||||
// Set the magic attribute so that paths are reinitialized
|
|
||||||
qApplicationInstance->setAttribute(Qt::AA_LinuxReinitPathsFromArgv0, true);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
return qApplicationInstance;
|
|
||||||
}
|
|
||||||
|
|
||||||
void MDeclarativeCachePrivate::testabilityInit()
|
|
||||||
{
|
|
||||||
// Activate testability plugin if exists
|
|
||||||
QString testabilityPluginPostfix = ".so";
|
|
||||||
QString testabilityPlugin = "testability/libtestability";
|
|
||||||
|
|
||||||
testabilityPlugin = QLibraryInfo::location(QLibraryInfo::PluginsPath) + QDir::separator() + testabilityPlugin + testabilityPluginPostfix;
|
|
||||||
QPluginLoader loader(testabilityPlugin.toLatin1().data());
|
|
||||||
|
|
||||||
QObject *plugin = loader.instance();
|
|
||||||
|
|
||||||
if (plugin)
|
|
||||||
{
|
|
||||||
testabilityInterface = qobject_cast<TestabilityInterface *>(plugin);
|
|
||||||
|
|
||||||
if (testabilityInterface)
|
|
||||||
{
|
|
||||||
testabilityInterface->Initialize();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
QDeclarativeView* MDeclarativeCachePrivate::qDeclarativeView()
|
|
||||||
{
|
|
||||||
QDeclarativeView *returnValue = 0;
|
|
||||||
if (qDeclarativeViewInstance != 0) {
|
|
||||||
returnValue = qDeclarativeViewInstance;
|
|
||||||
qDeclarativeViewInstance = 0;
|
|
||||||
} else {
|
|
||||||
returnValue = new QDeclarativeView();
|
|
||||||
}
|
|
||||||
|
|
||||||
return returnValue;
|
|
||||||
}
|
|
||||||
|
|
||||||
QString MDeclarativeCachePrivate::applicationDirPath()
|
|
||||||
{
|
|
||||||
if (cachePopulated) {
|
|
||||||
// In the booster case use the workaround
|
|
||||||
return appDirPath;
|
|
||||||
} else {
|
|
||||||
return QCoreApplication::applicationDirPath();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
QString MDeclarativeCachePrivate::applicationFilePath()
|
|
||||||
{
|
|
||||||
if (cachePopulated) {
|
|
||||||
// In the booster case use the workaround
|
|
||||||
return appFilePath;
|
|
||||||
} else {
|
|
||||||
return QCoreApplication::applicationFilePath();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
QDeclarativeView *MDeclarativeCache::populate()
|
|
||||||
{
|
|
||||||
d_ptr->populate();
|
|
||||||
return d_ptr->qDeclarativeViewInstance;
|
|
||||||
}
|
|
||||||
|
|
||||||
QApplication* MDeclarativeCache::qApplication(int &argc, char **argv)
|
|
||||||
{
|
|
||||||
return d_ptr->qApplication(argc, argv);
|
|
||||||
}
|
|
||||||
|
|
||||||
QDeclarativeView* MDeclarativeCache::qDeclarativeView()
|
|
||||||
{
|
|
||||||
return d_ptr->qDeclarativeView();
|
|
||||||
}
|
|
||||||
|
|
||||||
QString MDeclarativeCache::applicationDirPath()
|
|
||||||
{
|
|
||||||
return d_ptr->applicationDirPath();
|
|
||||||
}
|
|
||||||
|
|
||||||
QString MDeclarativeCache::applicationFilePath()
|
|
||||||
{
|
|
||||||
return d_ptr->applicationFilePath();
|
|
||||||
}
|
|
||||||
@ -1,96 +0,0 @@
|
|||||||
/*!
|
|
||||||
**
|
|
||||||
** @copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
|
|
||||||
** @license GNU Lesser General Public License version 2.1
|
|
||||||
** All rights reserved.
|
|
||||||
** Contact: Nokia Corporation (directui@nokia.com)
|
|
||||||
**
|
|
||||||
** This file is part of applauncherd
|
|
||||||
**
|
|
||||||
** If you have questions regarding the use of this file, please contact
|
|
||||||
** Nokia at directui@nokia.com.
|
|
||||||
**
|
|
||||||
** This library is free software; you can redistribute it and/or
|
|
||||||
** modify it under the terms of the GNU Lesser General Public
|
|
||||||
** License version 2.1 as published by the Free Software Foundation
|
|
||||||
** and appearing in the file LICENSE.LGPL included in the packaging
|
|
||||||
** of this file.
|
|
||||||
**
|
|
||||||
****************************************************************************/
|
|
||||||
|
|
||||||
#ifndef MDECLARATIVECACHE_H
|
|
||||||
#define MDECLARATIVECACHE_H
|
|
||||||
|
|
||||||
#include <QString>
|
|
||||||
|
|
||||||
class MDeclarativeCachePrivate;
|
|
||||||
class QApplication;
|
|
||||||
class QDeclarativeView;
|
|
||||||
|
|
||||||
/*!
|
|
||||||
* \class MDeclarativeCache.
|
|
||||||
* \brief Cache class for QDeclarativeBooster.
|
|
||||||
*/
|
|
||||||
class MDeclarativeCache
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
|
|
||||||
//! Constructor.
|
|
||||||
MDeclarativeCache() {};
|
|
||||||
|
|
||||||
//! Destructor.
|
|
||||||
virtual ~MDeclarativeCache() {};
|
|
||||||
|
|
||||||
//! Populate cache with QApplication and QDeclarativeView
|
|
||||||
/*!
|
|
||||||
* Returns the cached QDeclarativeView instance, which can be used for booster-specific
|
|
||||||
* initialization.
|
|
||||||
*/
|
|
||||||
static QDeclarativeView *populate();
|
|
||||||
|
|
||||||
//! Returns QApplication instance from cache or creates a new one.
|
|
||||||
/*!
|
|
||||||
* Ownership of the returned object is passed to the caller.
|
|
||||||
* NOTE: This is subject to change.
|
|
||||||
*/
|
|
||||||
static QApplication *qApplication(int &argc, char **argv);
|
|
||||||
|
|
||||||
//! Returns QDeclarativeView instance from cache or creates a new one.
|
|
||||||
/*!
|
|
||||||
* Ownership of the returned object is passed to the caller.
|
|
||||||
* NOTE: This is subject to change.
|
|
||||||
*/
|
|
||||||
static QDeclarativeView *qDeclarativeView();
|
|
||||||
|
|
||||||
//! Returns the directory that contains the application executable.
|
|
||||||
/*!
|
|
||||||
* This function is deprecated. It used to be a workaround for QApplication::applicationDirPath()
|
|
||||||
* not working on harmattan with qdeclarativebooster and Qt 4.7, but this has been fixed.
|
|
||||||
*/
|
|
||||||
static QString applicationDirPath() __attribute__ ((deprecated));
|
|
||||||
|
|
||||||
//! Returns the file path of the application executable.
|
|
||||||
/*!
|
|
||||||
* This function is deprecated. It used to be a workaround for QApplication::applicationFilePath()
|
|
||||||
* not working on harmattan with qdeclarativebooster and Qt 4.7, but this has been fixed.
|
|
||||||
*/
|
|
||||||
static QString applicationFilePath() __attribute__ ((deprecated));
|
|
||||||
|
|
||||||
protected:
|
|
||||||
|
|
||||||
static MDeclarativeCachePrivate* const d_ptr;
|
|
||||||
|
|
||||||
private:
|
|
||||||
|
|
||||||
//! Disable copy-constructor
|
|
||||||
MDeclarativeCache(const MDeclarativeCache & r);
|
|
||||||
|
|
||||||
//! Disable assignment operator
|
|
||||||
MDeclarativeCache & operator= (const MDeclarativeCache & r);
|
|
||||||
|
|
||||||
#ifdef UNIT_TEST
|
|
||||||
friend class Ut_MDeclarativeCache;
|
|
||||||
#endif
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif //MDECLARATIVECACHE_H
|
|
||||||
@ -1,61 +0,0 @@
|
|||||||
/***************************************************************************
|
|
||||||
**
|
|
||||||
** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
|
|
||||||
** All rights reserved.
|
|
||||||
** Contact: Nokia Corporation (directui@nokia.com)
|
|
||||||
**
|
|
||||||
** This file is part of applauncherd
|
|
||||||
**
|
|
||||||
** If you have questions regarding the use of this file, please contact
|
|
||||||
** Nokia at directui@nokia.com.
|
|
||||||
**
|
|
||||||
** This library is free software; you can redistribute it and/or
|
|
||||||
** modify it under the terms of the GNU Lesser General Public
|
|
||||||
** License version 2.1 as published by the Free Software Foundation
|
|
||||||
** and appearing in the file LICENSE.LGPL included in the packaging
|
|
||||||
** of this file.
|
|
||||||
**
|
|
||||||
****************************************************************************/
|
|
||||||
|
|
||||||
#ifndef MDECLARATIVECACHE_P_H
|
|
||||||
#define MDECLARATIVECACHE_P_H
|
|
||||||
|
|
||||||
#include <QString>
|
|
||||||
#include "testabilityinterface.h"
|
|
||||||
|
|
||||||
class MDeclarativeCache;
|
|
||||||
class QApplication;
|
|
||||||
class QDeclarativeView;
|
|
||||||
|
|
||||||
|
|
||||||
class MDeclarativeCachePrivate
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
MDeclarativeCachePrivate();
|
|
||||||
virtual ~MDeclarativeCachePrivate();
|
|
||||||
void populate();
|
|
||||||
QApplication* qApplication(int &argc, char **argv);
|
|
||||||
QDeclarativeView* qDeclarativeView();
|
|
||||||
QString applicationDirPath();
|
|
||||||
QString applicationFilePath();
|
|
||||||
void testabilityInit();
|
|
||||||
|
|
||||||
static const int ARGV_LIMIT;
|
|
||||||
QApplication *qApplicationInstance;
|
|
||||||
QDeclarativeView *qDeclarativeViewInstance;
|
|
||||||
int initialArgc;
|
|
||||||
char **initialArgv;
|
|
||||||
QString appDirPath;
|
|
||||||
QString appFilePath;
|
|
||||||
bool cachePopulated;
|
|
||||||
TestabilityInterface *testabilityInterface;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef UNIT_TEST
|
|
||||||
friend class Ut_MDeclarativeCache;
|
|
||||||
#endif
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
#endif // MDECLARATIVECACHE_P_H
|
|
||||||
@ -1,45 +0,0 @@
|
|||||||
/***************************************************************************
|
|
||||||
**
|
|
||||||
** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
|
|
||||||
** All rights reserved.
|
|
||||||
** Contact: Nokia Corporation (directui@nokia.com)
|
|
||||||
**
|
|
||||||
** This file is part of applauncherd
|
|
||||||
**
|
|
||||||
** If you have questions regarding the use of this file, please contact
|
|
||||||
** Nokia at directui@nokia.com.
|
|
||||||
**
|
|
||||||
** This library is free software; you can redistribute it and/or
|
|
||||||
** modify it under the terms of the GNU Lesser General Public
|
|
||||||
** License version 2.1 as published by the Free Software Foundation
|
|
||||||
** and appearing in the file LICENSE.LGPL included in the packaging
|
|
||||||
** of this file.
|
|
||||||
**
|
|
||||||
****************************************************************************/
|
|
||||||
|
|
||||||
#include <QtCore>
|
|
||||||
#include "qdeclarativebooster.h"
|
|
||||||
|
|
||||||
extern "C"
|
|
||||||
{
|
|
||||||
// Create a new plugin instance.
|
|
||||||
Q_DECL_EXPORT void * create()
|
|
||||||
{
|
|
||||||
return new QDeclarativeBooster;
|
|
||||||
}
|
|
||||||
|
|
||||||
Q_DECL_EXPORT char type()
|
|
||||||
{
|
|
||||||
return QDeclarativeBooster::type();
|
|
||||||
}
|
|
||||||
|
|
||||||
Q_DECL_EXPORT const char * socketName()
|
|
||||||
{
|
|
||||||
return QDeclarativeBooster::socketName().c_str();
|
|
||||||
}
|
|
||||||
|
|
||||||
Q_DECL_EXPORT const char * temporaryProcessName()
|
|
||||||
{
|
|
||||||
return QDeclarativeBooster::temporaryProcessName().c_str();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,112 +0,0 @@
|
|||||||
/***************************************************************************
|
|
||||||
**
|
|
||||||
** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
|
|
||||||
** All rights reserved.
|
|
||||||
** Contact: Nokia Corporation (directui@nokia.com)
|
|
||||||
**
|
|
||||||
** This file is part of applauncherd
|
|
||||||
**
|
|
||||||
** If you have questions regarding the use of this file, please contact
|
|
||||||
** Nokia at directui@nokia.com.
|
|
||||||
**
|
|
||||||
** This library is free software; you can redistribute it and/or
|
|
||||||
** modify it under the terms of the GNU Lesser General Public
|
|
||||||
** License version 2.1 as published by the Free Software Foundation
|
|
||||||
** and appearing in the file LICENSE.LGPL included in the packaging
|
|
||||||
** of this file.
|
|
||||||
**
|
|
||||||
****************************************************************************/
|
|
||||||
|
|
||||||
#include "qdeclarativebooster.h"
|
|
||||||
#include "mdeclarativecache.h"
|
|
||||||
#include "connection.h"
|
|
||||||
|
|
||||||
const string QDeclarativeBooster::m_socketId = "/tmp/boostd";
|
|
||||||
const string QDeclarativeBooster::m_temporaryProcessName = "booster-d";
|
|
||||||
|
|
||||||
const string & QDeclarativeBooster::socketId() const
|
|
||||||
{
|
|
||||||
return m_socketId;
|
|
||||||
}
|
|
||||||
|
|
||||||
const string & QDeclarativeBooster::socketName()
|
|
||||||
{
|
|
||||||
return m_socketId;
|
|
||||||
}
|
|
||||||
|
|
||||||
const string & QDeclarativeBooster::temporaryProcessName()
|
|
||||||
{
|
|
||||||
return m_temporaryProcessName;
|
|
||||||
}
|
|
||||||
|
|
||||||
const string & QDeclarativeBooster::boosterTemporaryProcessName() const
|
|
||||||
{
|
|
||||||
return temporaryProcessName();
|
|
||||||
}
|
|
||||||
|
|
||||||
char QDeclarativeBooster::type()
|
|
||||||
{
|
|
||||||
return 'd';
|
|
||||||
}
|
|
||||||
|
|
||||||
bool QDeclarativeBooster::preload()
|
|
||||||
{
|
|
||||||
MDeclarativeCache::populate();
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool QDeclarativeBooster::receiveDataFromInvoker(int socketFd)
|
|
||||||
{
|
|
||||||
// Use the default implementation if in boot mode
|
|
||||||
// (it won't require QApplication running).
|
|
||||||
|
|
||||||
if (bootMode())
|
|
||||||
{
|
|
||||||
return Booster::receiveDataFromInvoker(socketFd);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// Setup the conversation channel with the invoker.
|
|
||||||
setConnection(new Connection(socketFd));
|
|
||||||
|
|
||||||
EventHandler handler(this);
|
|
||||||
handler.runEventLoop();
|
|
||||||
|
|
||||||
if (!connection()->connected())
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Receive application data from the invoker
|
|
||||||
if(!connection()->receiveApplicationData(appData()))
|
|
||||||
{
|
|
||||||
connection()->close();
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Close the connection if exit status doesn't need
|
|
||||||
// to be sent back to invoker
|
|
||||||
if (!connection()->isReportAppExitStatusNeeded())
|
|
||||||
{
|
|
||||||
connection()->close();
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void QDeclarativeBooster::preinit()
|
|
||||||
{
|
|
||||||
QString appName = QFileInfo(m_appData->argv()[0]).fileName();
|
|
||||||
|
|
||||||
QString appClass = appName.left(1).toUpper();
|
|
||||||
if (appName.length() > 1)
|
|
||||||
appClass += appName.right(appName.length() - 1);
|
|
||||||
|
|
||||||
// char* app_name = qstrdup(appName.toLatin1().data());
|
|
||||||
// QApplication::setAppName(app_name);
|
|
||||||
|
|
||||||
// char* app_class = qstrdup(appClass.toLatin1().data());
|
|
||||||
// QApplication::setAppClass(app_class);
|
|
||||||
}
|
|
||||||
@ -1,98 +0,0 @@
|
|||||||
/***************************************************************************
|
|
||||||
**
|
|
||||||
** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
|
|
||||||
** All rights reserved.
|
|
||||||
** Contact: Nokia Corporation (directui@nokia.com)
|
|
||||||
**
|
|
||||||
** This file is part of applauncherd
|
|
||||||
**
|
|
||||||
** If you have questions regarding the use of this file, please contact
|
|
||||||
** Nokia at directui@nokia.com.
|
|
||||||
**
|
|
||||||
** This library is free software; you can redistribute it and/or
|
|
||||||
** modify it under the terms of the GNU Lesser General Public
|
|
||||||
** License version 2.1 as published by the Free Software Foundation
|
|
||||||
** and appearing in the file LICENSE.LGPL included in the packaging
|
|
||||||
** of this file.
|
|
||||||
**
|
|
||||||
****************************************************************************/
|
|
||||||
|
|
||||||
#ifndef QDECLARATIVEBOOSTER_H
|
|
||||||
#define QDECLARATIVEBOOSTER_H
|
|
||||||
|
|
||||||
#include <QApplication>
|
|
||||||
#include "QFileInfo"
|
|
||||||
|
|
||||||
#include "eventhandler.h"
|
|
||||||
#include "booster.h"
|
|
||||||
|
|
||||||
/*!
|
|
||||||
* \class QDeclarativeBooster.
|
|
||||||
* \brief QDeclarative-specific version of the Booster.
|
|
||||||
*/
|
|
||||||
class QDeclarativeBooster : public Booster
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
|
|
||||||
//! Constructor.
|
|
||||||
QDeclarativeBooster() {};
|
|
||||||
|
|
||||||
//! Destructor.
|
|
||||||
virtual ~QDeclarativeBooster() {};
|
|
||||||
|
|
||||||
/*!
|
|
||||||
* \brief Return the socket name common to all QDeclarativeBooster objects.
|
|
||||||
* \return Path to the socket file.
|
|
||||||
*/
|
|
||||||
static const string & socketName();
|
|
||||||
|
|
||||||
//! Return the process name to be used when booster is not
|
|
||||||
//! yet transformed into a running application
|
|
||||||
static const string & temporaryProcessName();
|
|
||||||
|
|
||||||
//! \reimp
|
|
||||||
virtual const string & boosterTemporaryProcessName() const;
|
|
||||||
|
|
||||||
//! \reimp
|
|
||||||
virtual char boosterType() const { return type(); }
|
|
||||||
|
|
||||||
/*!
|
|
||||||
* \brief Return a unique character ('d') represtenting the type of QDeclarativeBoosters.
|
|
||||||
* \return Type character.
|
|
||||||
*/
|
|
||||||
static char type();
|
|
||||||
|
|
||||||
//! \reimp
|
|
||||||
virtual bool preload();
|
|
||||||
|
|
||||||
protected:
|
|
||||||
|
|
||||||
//! \reimp
|
|
||||||
virtual const string & socketId() const;
|
|
||||||
|
|
||||||
//! \reimp
|
|
||||||
virtual bool receiveDataFromInvoker(int socketFd);
|
|
||||||
|
|
||||||
//! \reimp
|
|
||||||
virtual void preinit();
|
|
||||||
|
|
||||||
private:
|
|
||||||
|
|
||||||
//! Disable copy-constructor
|
|
||||||
QDeclarativeBooster(const QDeclarativeBooster & r);
|
|
||||||
|
|
||||||
//! Disable assignment operator
|
|
||||||
QDeclarativeBooster & operator= (const QDeclarativeBooster & r);
|
|
||||||
|
|
||||||
static const string m_socketId;
|
|
||||||
|
|
||||||
//! Process name to be used when booster is not
|
|
||||||
//! yet transformed into a running application
|
|
||||||
static const string m_temporaryProcessName;
|
|
||||||
|
|
||||||
#ifdef UNIT_TEST
|
|
||||||
friend class Ut_DBooster;
|
|
||||||
#endif
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif //QDECLARATIVEBOOSTER_H
|
|
||||||
@ -1,41 +0,0 @@
|
|||||||
/***************************************************************************
|
|
||||||
**
|
|
||||||
** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
|
|
||||||
** All rights reserved.
|
|
||||||
** Contact: Nokia Corporation (directui@nokia.com)
|
|
||||||
**
|
|
||||||
** This file is part of applauncherd
|
|
||||||
**
|
|
||||||
** If you have questions regarding the use of this file, please contact
|
|
||||||
** Nokia at directui@nokia.com.
|
|
||||||
**
|
|
||||||
** This library is free software; you can redistribute it and/or
|
|
||||||
** modify it under the terms of the GNU Lesser General Public
|
|
||||||
** License version 2.1 as published by the Free Software Foundation
|
|
||||||
** and appearing in the file LICENSE.LGPL included in the packaging
|
|
||||||
** of this file.
|
|
||||||
**
|
|
||||||
****************************************************************************/
|
|
||||||
|
|
||||||
#ifndef DBOOSTERTESTABILITYINTERFACE_H
|
|
||||||
#define DBOOSTERTESTABILITYINTERFACE_H
|
|
||||||
|
|
||||||
class TestabilityInterface
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
virtual ~TestabilityInterface() {}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
|
|
||||||
Initializes the plugin once loaded.
|
|
||||||
|
|
||||||
*/
|
|
||||||
virtual void Initialize() = 0;
|
|
||||||
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
Q_DECLARE_INTERFACE(TestabilityInterface,
|
|
||||||
"com.nokia.testability.TestabilityInterface/1.0")
|
|
||||||
|
|
||||||
#endif // DBOOSTERTESTABILITYINTERFACE_H
|
|
||||||
@ -1,27 +0,0 @@
|
|||||||
# Find Qt4
|
|
||||||
find_package(Qt4 4.6.0 REQUIRED)
|
|
||||||
include(${QT_USE_FILE})
|
|
||||||
if (${QTVERSION} VERSION_LESS 4.6.0)
|
|
||||||
message(FATAL_ERROR "You need Qt4.6, found ${QTVERSION}.")
|
|
||||||
endif (${QTVERSION} VERSION_LESS 4.6.0)
|
|
||||||
|
|
||||||
set(LAUNCHER "${CMAKE_HOME_DIRECTORY}/src/launcherlib")
|
|
||||||
|
|
||||||
include_directories(${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_HOME_DIRECTORY}/src/common ${LAUNCHER})
|
|
||||||
|
|
||||||
# Hide all symbols except the ones explicitly exported in the code (like main())
|
|
||||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fvisibility=hidden")
|
|
||||||
|
|
||||||
# Set sources
|
|
||||||
set(SRC qtbooster.cpp pluginfactory.cpp)
|
|
||||||
|
|
||||||
# Set libraries to be linked.
|
|
||||||
link_libraries("-L../launcherlib -lapplauncherd" ${LIBDL} ${QT_QTCORE_LIBRARY})
|
|
||||||
|
|
||||||
# Set executable
|
|
||||||
add_library(qtbooster MODULE ${SRC})
|
|
||||||
add_dependencies(qtbooster applauncherd)
|
|
||||||
|
|
||||||
# Add install rule
|
|
||||||
install(TARGETS qtbooster DESTINATION /usr/lib/applauncherd/)
|
|
||||||
|
|
||||||
@ -1,45 +0,0 @@
|
|||||||
/***************************************************************************
|
|
||||||
**
|
|
||||||
** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
|
|
||||||
** All rights reserved.
|
|
||||||
** Contact: Nokia Corporation (directui@nokia.com)
|
|
||||||
**
|
|
||||||
** This file is part of applauncherd
|
|
||||||
**
|
|
||||||
** If you have questions regarding the use of this file, please contact
|
|
||||||
** Nokia at directui@nokia.com.
|
|
||||||
**
|
|
||||||
** This library is free software; you can redistribute it and/or
|
|
||||||
** modify it under the terms of the GNU Lesser General Public
|
|
||||||
** License version 2.1 as published by the Free Software Foundation
|
|
||||||
** and appearing in the file LICENSE.LGPL included in the packaging
|
|
||||||
** of this file.
|
|
||||||
**
|
|
||||||
****************************************************************************/
|
|
||||||
|
|
||||||
#include <QtCore>
|
|
||||||
#include "qtbooster.h"
|
|
||||||
|
|
||||||
extern "C"
|
|
||||||
{
|
|
||||||
// Create a new plugin instance.
|
|
||||||
Q_DECL_EXPORT void * create()
|
|
||||||
{
|
|
||||||
return new QtBooster;
|
|
||||||
}
|
|
||||||
|
|
||||||
Q_DECL_EXPORT char type()
|
|
||||||
{
|
|
||||||
return QtBooster::type();
|
|
||||||
}
|
|
||||||
|
|
||||||
Q_DECL_EXPORT const char * socketName()
|
|
||||||
{
|
|
||||||
return QtBooster::socketName().c_str();
|
|
||||||
}
|
|
||||||
|
|
||||||
Q_DECL_EXPORT const char * temporaryProcessName()
|
|
||||||
{
|
|
||||||
return QtBooster::temporaryProcessName().c_str();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,53 +0,0 @@
|
|||||||
/***************************************************************************
|
|
||||||
**
|
|
||||||
** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
|
|
||||||
** All rights reserved.
|
|
||||||
** Contact: Nokia Corporation (directui@nokia.com)
|
|
||||||
**
|
|
||||||
** This file is part of applauncherd
|
|
||||||
**
|
|
||||||
** If you have questions regarding the use of this file, please contact
|
|
||||||
** Nokia at directui@nokia.com.
|
|
||||||
**
|
|
||||||
** This library is free software; you can redistribute it and/or
|
|
||||||
** modify it under the terms of the GNU Lesser General Public
|
|
||||||
** License version 2.1 as published by the Free Software Foundation
|
|
||||||
** and appearing in the file LICENSE.LGPL included in the packaging
|
|
||||||
** of this file.
|
|
||||||
**
|
|
||||||
****************************************************************************/
|
|
||||||
|
|
||||||
#include "qtbooster.h"
|
|
||||||
|
|
||||||
const string QtBooster::m_socketId = "/tmp/boostq";
|
|
||||||
const string QtBooster::m_temporaryProcessName = "booster-q";
|
|
||||||
|
|
||||||
const string & QtBooster::socketId() const
|
|
||||||
{
|
|
||||||
return m_socketId;
|
|
||||||
}
|
|
||||||
|
|
||||||
const string & QtBooster::socketName()
|
|
||||||
{
|
|
||||||
return m_socketId;
|
|
||||||
}
|
|
||||||
|
|
||||||
const string & QtBooster::temporaryProcessName()
|
|
||||||
{
|
|
||||||
return m_temporaryProcessName;
|
|
||||||
}
|
|
||||||
|
|
||||||
const string & QtBooster::boosterTemporaryProcessName() const
|
|
||||||
{
|
|
||||||
return temporaryProcessName();
|
|
||||||
}
|
|
||||||
|
|
||||||
char QtBooster::type()
|
|
||||||
{
|
|
||||||
return 'q';
|
|
||||||
}
|
|
||||||
|
|
||||||
bool QtBooster::preload()
|
|
||||||
{
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
@ -1,88 +0,0 @@
|
|||||||
/***************************************************************************
|
|
||||||
**
|
|
||||||
** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
|
|
||||||
** All rights reserved.
|
|
||||||
** Contact: Nokia Corporation (directui@nokia.com)
|
|
||||||
**
|
|
||||||
** This file is part of applauncherd
|
|
||||||
**
|
|
||||||
** If you have questions regarding the use of this file, please contact
|
|
||||||
** Nokia at directui@nokia.com.
|
|
||||||
**
|
|
||||||
** This library is free software; you can redistribute it and/or
|
|
||||||
** modify it under the terms of the GNU Lesser General Public
|
|
||||||
** License version 2.1 as published by the Free Software Foundation
|
|
||||||
** and appearing in the file LICENSE.LGPL included in the packaging
|
|
||||||
** of this file.
|
|
||||||
**
|
|
||||||
****************************************************************************/
|
|
||||||
|
|
||||||
#ifndef QTBOOSTER_H
|
|
||||||
#define QTBOOSTER_H
|
|
||||||
|
|
||||||
#include "booster.h"
|
|
||||||
|
|
||||||
/*!
|
|
||||||
* \class QtBooster.
|
|
||||||
* \brief Qt-specific version of the Booster.
|
|
||||||
*/
|
|
||||||
class QtBooster : public Booster
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
|
|
||||||
//! Constructor.
|
|
||||||
QtBooster() {};
|
|
||||||
|
|
||||||
//! Destructor.
|
|
||||||
virtual ~QtBooster() {};
|
|
||||||
|
|
||||||
/*!
|
|
||||||
* \brief Return the socket name common to all QtBooster objects.
|
|
||||||
* \return Path to the socket file.
|
|
||||||
*/
|
|
||||||
static const string & socketName();
|
|
||||||
|
|
||||||
//! Return the process name to be used when booster is not
|
|
||||||
//! yet transformed into a running application
|
|
||||||
static const string & temporaryProcessName();
|
|
||||||
|
|
||||||
//! \reimp
|
|
||||||
virtual const string & boosterTemporaryProcessName() const;
|
|
||||||
|
|
||||||
//! \reimp
|
|
||||||
virtual char boosterType() const { return type(); }
|
|
||||||
|
|
||||||
/*!
|
|
||||||
* \brief Return a unique character ('q') represtenting the type of QtBoosters.
|
|
||||||
* \return Type character.
|
|
||||||
*/
|
|
||||||
static char type();
|
|
||||||
|
|
||||||
protected:
|
|
||||||
|
|
||||||
//! \reimp
|
|
||||||
virtual bool preload();
|
|
||||||
|
|
||||||
//! \reimp
|
|
||||||
virtual const string & socketId() const;
|
|
||||||
|
|
||||||
private:
|
|
||||||
|
|
||||||
//! Disable copy-constructor
|
|
||||||
QtBooster(const QtBooster & r);
|
|
||||||
|
|
||||||
//! Disable assignment operator
|
|
||||||
QtBooster & operator= (const QtBooster & r);
|
|
||||||
|
|
||||||
static const string m_socketId;
|
|
||||||
|
|
||||||
//! Process name to be used when booster is not
|
|
||||||
//! yet transformed into a running application
|
|
||||||
static const string m_temporaryProcessName;
|
|
||||||
|
|
||||||
#ifdef UNIT_TEST
|
|
||||||
friend class Ut_QtBooster;
|
|
||||||
#endif
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif //QTBOOSTER_H
|
|
||||||
@ -1,33 +0,0 @@
|
|||||||
# Set sources
|
|
||||||
set(SRC fala_dbus.cpp)
|
|
||||||
|
|
||||||
link_libraries(${QT_QTCORE_LIBRARY} ${QT_QTGUI_LIBRARY} ${QT_QTDBUS_LIBRARY})
|
|
||||||
|
|
||||||
include(${QT_USE_FILE})
|
|
||||||
|
|
||||||
SET (QT_USE_QTDBUS true)
|
|
||||||
INCLUDE_DIRECTORIES(${QT_QTDBUS_INCLUDE_DIR})
|
|
||||||
|
|
||||||
execute_process(COMMAND "env"
|
|
||||||
"PKG_CONFIG_PATH=${CMAKE_SOURCE_DIR}/data/pkgconfig"
|
|
||||||
"/usr/bin/pkg-config"
|
|
||||||
"--cflags"
|
|
||||||
"qt-boostable"
|
|
||||||
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
|
|
||||||
OUTPUT_VARIABLE booster_cflags
|
|
||||||
OUTPUT_STRIP_TRAILING_WHITESPACE)
|
|
||||||
execute_process(COMMAND "env"
|
|
||||||
"PKG_CONFIG_PATH=${CMAKE_SOURCE_DIR}/data/pkgconfig"
|
|
||||||
"/usr/bin/pkg-config" "--libs"
|
|
||||||
"qt-boostable"
|
|
||||||
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
|
|
||||||
OUTPUT_VARIABLE booster_libs
|
|
||||||
OUTPUT_STRIP_TRAILING_WHITESPACE)
|
|
||||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${booster_cflags}")
|
|
||||||
set(CMAKE_EXE_LINKER_FLAGS ${booster_libs})
|
|
||||||
|
|
||||||
add_executable(fala_dbus ${SRC})
|
|
||||||
|
|
||||||
# Install
|
|
||||||
install(PROGRAMS fala_dbus DESTINATION /usr/bin/ )
|
|
||||||
|
|
||||||
@ -1,40 +0,0 @@
|
|||||||
/***************************************************************************
|
|
||||||
**
|
|
||||||
** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
|
|
||||||
** All rights reserved.
|
|
||||||
** Contact: Nokia Corporation (directui@nokia.com)
|
|
||||||
**
|
|
||||||
** This file is part of applauncherd
|
|
||||||
**
|
|
||||||
** If you have questions regarding the use of this file, please contact
|
|
||||||
** Nokia at directui@nokia.com.
|
|
||||||
**
|
|
||||||
** This library is free software; you can redistribute it and/or
|
|
||||||
** modify it under the terms of the GNU Lesser General Public
|
|
||||||
** License version 2.1 as published by the Free Software Foundation
|
|
||||||
** and appearing in the file LICENSE.LGPL included in the packaging
|
|
||||||
** of this file.
|
|
||||||
**
|
|
||||||
****************************************************************************/
|
|
||||||
|
|
||||||
#include <QApplication>
|
|
||||||
#include <QDBusConnection>
|
|
||||||
#include <QDBusMessage>
|
|
||||||
#include <QString>
|
|
||||||
#include <syslog.h>
|
|
||||||
#include <iostream>
|
|
||||||
|
|
||||||
Q_DECL_EXPORT int main(int argc, char ** argv)
|
|
||||||
{
|
|
||||||
QApplication app(argc, argv);
|
|
||||||
Q_UNUSED(app);
|
|
||||||
QDBusConnection bus = QDBusConnection::systemBus();
|
|
||||||
QDBusMessage msg = QDBusMessage::createMethodCall("com.nokia.dsme", "/com/nokia/dsme/request", "com.nokia.dsme.request", "req_powerup");
|
|
||||||
QDBusMessage reply = bus.call(msg,QDBus::AutoDetect, 5);
|
|
||||||
QString dbusReplyError = reply.errorName();
|
|
||||||
openlog ("qfala_dbus", LOG_NDELAY | LOG_PID | LOG_PERROR, LOG_DAEMON);
|
|
||||||
syslog (LOG_DAEMON | LOG_NOTICE, "fala_dbus connection error: '%s'", dbusReplyError.toLocal8Bit().data());
|
|
||||||
closelog();
|
|
||||||
std::cerr << "fala_dbus connection error:" << dbusReplyError.toLocal8Bit().data() << "\n";
|
|
||||||
_exit(0);
|
|
||||||
}
|
|
||||||
@ -1,42 +0,0 @@
|
|||||||
# Set sources
|
|
||||||
set(SRC main.cpp)
|
|
||||||
|
|
||||||
# Use the compiler and linker flags given in qdeclarative-boostable.pc
|
|
||||||
# in the source tree.
|
|
||||||
execute_process(COMMAND "env"
|
|
||||||
"PKG_CONFIG_PATH=${CMAKE_SOURCE_DIR}/data/pkgconfig"
|
|
||||||
"/usr/bin/pkg-config"
|
|
||||||
"--cflags"
|
|
||||||
"qdeclarative-boostable"
|
|
||||||
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
|
|
||||||
OUTPUT_VARIABLE booster_cflags
|
|
||||||
OUTPUT_STRIP_TRAILING_WHITESPACE)
|
|
||||||
execute_process(COMMAND "env"
|
|
||||||
"PKG_CONFIG_PATH=${CMAKE_SOURCE_DIR}/data/pkgconfig"
|
|
||||||
"/usr/bin/pkg-config" "--libs"
|
|
||||||
"qdeclarative-boostable"
|
|
||||||
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
|
|
||||||
OUTPUT_VARIABLE booster_libs
|
|
||||||
OUTPUT_STRIP_TRAILING_WHITESPACE)
|
|
||||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${booster_cflags}")
|
|
||||||
|
|
||||||
include_directories(${CMAKE_SOURCE_DIR}/src/qdeclarativebooster)
|
|
||||||
|
|
||||||
# Compile resources
|
|
||||||
QT4_ADD_RESOURCES(RESOURCE_SRC main.qrc)
|
|
||||||
|
|
||||||
# Enable Qt-support
|
|
||||||
include(${QT_USE_FILE})
|
|
||||||
|
|
||||||
link_libraries(${QT_QTCORE_LIBRARY} ${QT_QTGUI_LIBRARY} ${QT_QTDECLARATIVE_LIBRARY} "-L${CMAKE_SOURCE_DIR}/src/launcherlib -lapplauncherd -L${CMAKE_SOURCE_DIR}/src/qdeclarativebooster ${booster_libs}")
|
|
||||||
add_executable(fala_qml ${SRC} ${RESOURCE_SRC})
|
|
||||||
add_dependencies(fala_qml applauncherd mdeclarativecache)
|
|
||||||
|
|
||||||
# Install
|
|
||||||
install(PROGRAMS fala_qml DESTINATION /usr/bin/ RENAME fala_qml_wol)
|
|
||||||
install(PROGRAMS fala_qml DESTINATION /usr/bin/ RENAME fala_qml_helloworld)
|
|
||||||
install(PROGRAMS fala_qml DESTINATION /usr/bin/ RENAME fala_qml_wl)
|
|
||||||
install(PROGRAMS fala_qml DESTINATION /usr/share/fala_images RENAME fala_qml_helloworld)
|
|
||||||
install(FILES fala_qml_wl.desktop DESTINATION /usr/share/applications)
|
|
||||||
install(FILES fala_qml_wol.desktop DESTINATION /usr/share/applications)
|
|
||||||
install(SCRIPT scripts/create_links.cmake)
|
|
||||||
@ -1,7 +0,0 @@
|
|||||||
[Desktop Entry]
|
|
||||||
Type=Application
|
|
||||||
Name=fala_qml_wl
|
|
||||||
Icon=icon-l-video
|
|
||||||
Exec=invoker --single-instance --type=d /usr/bin/fala_qml_wl
|
|
||||||
Categories=X-MeeGo;X-Demos;
|
|
||||||
OnlyShowIn=X-MeeGo;
|
|
||||||
@ -1,7 +0,0 @@
|
|||||||
[Desktop Entry]
|
|
||||||
Type=Application
|
|
||||||
Name=fala_qml_wol
|
|
||||||
Icon=icon-l-video
|
|
||||||
Exec=single-instance /usr/bin/fala_qml_wol
|
|
||||||
Categories=X-MeeGo;X-Demos;
|
|
||||||
OnlyShowIn=X-MeeGo;
|
|
||||||
@ -1,144 +0,0 @@
|
|||||||
/***************************************************************************
|
|
||||||
**
|
|
||||||
** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
|
|
||||||
** All rights reserved.
|
|
||||||
** Contact: Nokia Corporation (directui@nokia.com)
|
|
||||||
**
|
|
||||||
** This file is part of applauncherd
|
|
||||||
**
|
|
||||||
** If you have questions regarding the use of this file, please contact
|
|
||||||
** Nokia at directui@nokia.com.
|
|
||||||
**
|
|
||||||
** This library is free software; you can redistribute it and/or
|
|
||||||
** modify it under the terms of the GNU Lesser General Public
|
|
||||||
** License version 2.1 as published by the Free Software Foundation
|
|
||||||
** and appearing in the file LICENSE.LGPL included in the packaging
|
|
||||||
** of this file.
|
|
||||||
**
|
|
||||||
****************************************************************************/
|
|
||||||
|
|
||||||
#include <Qt/QtDeclarative>
|
|
||||||
#include <QFile>
|
|
||||||
#include <sys/time.h>
|
|
||||||
#include "mdeclarativecache.h"
|
|
||||||
#include <exception>
|
|
||||||
|
|
||||||
|
|
||||||
QString log_file = "/tmp/fala_qml_helloworld.log";
|
|
||||||
|
|
||||||
void FANGORNLOG(const char* s, bool eol = true)
|
|
||||||
{
|
|
||||||
QFile f(log_file);
|
|
||||||
f.open(QIODevice::Append);
|
|
||||||
f.write(s, qstrlen(s));
|
|
||||||
if (eol) {
|
|
||||||
f.write("\n", 1);
|
|
||||||
}
|
|
||||||
f.close();
|
|
||||||
}
|
|
||||||
|
|
||||||
void FANGORNLOG(const QString& s, bool eol = true)
|
|
||||||
{
|
|
||||||
QByteArray ba = s.toLocal8Bit();
|
|
||||||
char *p = new char[ba.size() + 1];
|
|
||||||
strcpy(p, ba.data());
|
|
||||||
FANGORNLOG(p, eol);
|
|
||||||
}
|
|
||||||
|
|
||||||
void timestamp(const char *s)
|
|
||||||
{
|
|
||||||
timeval tim;
|
|
||||||
char msg[80];
|
|
||||||
gettimeofday(&tim, NULL);
|
|
||||||
snprintf(msg, 80, "%d%03d %s",
|
|
||||||
static_cast<int>(tim.tv_sec), static_cast<int>(tim.tv_usec/1000), s);
|
|
||||||
FANGORNLOG(msg);
|
|
||||||
}
|
|
||||||
|
|
||||||
void timestamp(const QString& s)
|
|
||||||
{
|
|
||||||
QByteArray ba = s.toLocal8Bit();
|
|
||||||
char *p = new char[ba.size() + 1];
|
|
||||||
strcpy(p, ba.data());
|
|
||||||
timestamp(p);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
Q_DECL_EXPORT int main(int argc, char **argv)
|
|
||||||
{
|
|
||||||
QApplication *app;
|
|
||||||
try
|
|
||||||
{
|
|
||||||
|
|
||||||
QString appName(argv[0]);
|
|
||||||
if (appName.endsWith("fala_qml_wl"))
|
|
||||||
{
|
|
||||||
log_file = "/tmp/fala_qml_wl.log";
|
|
||||||
}
|
|
||||||
else if (appName.endsWith("fala_qml_wol"))
|
|
||||||
{
|
|
||||||
log_file = "/tmp/fala_qml_wol.log";
|
|
||||||
}
|
|
||||||
timestamp("application main");
|
|
||||||
|
|
||||||
app = MDeclarativeCache::qApplication(argc, argv);
|
|
||||||
timestamp("QApplication from cache");
|
|
||||||
|
|
||||||
QDeclarativeView *window = NULL;
|
|
||||||
|
|
||||||
bool bWindowNotFromCache = false;
|
|
||||||
const QString sWindowNotFromCache = "window-not-from-cache";
|
|
||||||
for (int i = 1; i < argc; i++) {
|
|
||||||
QString sArg = QString(argv[i]);
|
|
||||||
if (sArg.contains(sWindowNotFromCache,Qt::CaseInsensitive)) {
|
|
||||||
bWindowNotFromCache = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (bWindowNotFromCache) {
|
|
||||||
window = new QDeclarativeView();
|
|
||||||
timestamp("QDeclarativeView NOT from cache");
|
|
||||||
} else {
|
|
||||||
window = MDeclarativeCache::qDeclarativeView();
|
|
||||||
timestamp("QDeclarativeView from cache");
|
|
||||||
}
|
|
||||||
|
|
||||||
timestamp(QString("applicationDirPath: ").append(QApplication::applicationDirPath()));
|
|
||||||
timestamp(QString("applicationFilePath: ").append(QApplication::applicationFilePath()));
|
|
||||||
|
|
||||||
if (argc > 2 && QString(argv[1]) == QString("--log-args")) {
|
|
||||||
FANGORNLOG("argv:", false);
|
|
||||||
for (int i = 0; i < argc; i++) {
|
|
||||||
FANGORNLOG(" ", false);
|
|
||||||
FANGORNLOG(argv[i], false);
|
|
||||||
}
|
|
||||||
FANGORNLOG("");
|
|
||||||
|
|
||||||
FANGORNLOG("argv:", false);
|
|
||||||
QStringList args = QCoreApplication::arguments();
|
|
||||||
for (int i = 0; i < args.size(); i++) {
|
|
||||||
FANGORNLOG(" ", false);
|
|
||||||
FANGORNLOG(args.at(i), false);
|
|
||||||
}
|
|
||||||
FANGORNLOG("");
|
|
||||||
}
|
|
||||||
|
|
||||||
window->setWindowTitle("Applauncherd QML testapp");
|
|
||||||
|
|
||||||
window->setResizeMode(QDeclarativeView::SizeRootObjectToView);
|
|
||||||
|
|
||||||
//window->setSource(QUrl::fromLocalFile("/usr/share/fala_qml_helloworld/main.qml"));
|
|
||||||
window->setSource(QUrl("qrc:/main.qml"));
|
|
||||||
window->showFullScreen();
|
|
||||||
|
|
||||||
timestamp("Calling app->exec()");
|
|
||||||
}
|
|
||||||
catch(std::exception& e)
|
|
||||||
{
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
_exit(app->exec());
|
|
||||||
}
|
|
||||||
|
|
||||||
@ -1,12 +0,0 @@
|
|||||||
import Qt 4.7
|
|
||||||
|
|
||||||
Rectangle {
|
|
||||||
width: 853
|
|
||||||
height: 480
|
|
||||||
Text {
|
|
||||||
id: text1
|
|
||||||
anchors.centerIn: parent
|
|
||||||
text: "Hello QML World!"
|
|
||||||
font.pixelSize: 80
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,5 +0,0 @@
|
|||||||
<RCC>
|
|
||||||
<qresource prefix="/">
|
|
||||||
<file>main.qml</file>
|
|
||||||
</qresource>
|
|
||||||
</RCC>
|
|
||||||
@ -1,4 +0,0 @@
|
|||||||
execute_process(COMMAND echo "Creating symlinks for fala_qml_helloworld..")
|
|
||||||
execute_process(COMMAND ln -v -s /usr/bin/fala_qml_helloworld $ENV{DESTDIR}/usr/bin/fala_qml_helloworld1)
|
|
||||||
execute_process(COMMAND ln -v -s /usr/bin/fala_qml_helloworld $ENV{DESTDIR}/usr/bin/fala_qml_helloworld2)
|
|
||||||
|
|
||||||
@ -1,30 +0,0 @@
|
|||||||
# Set sources
|
|
||||||
set(SRC fala_windowless.cpp)
|
|
||||||
|
|
||||||
execute_process(COMMAND "env"
|
|
||||||
"PKG_CONFIG_PATH=${CMAKE_SOURCE_DIR}/data/pkgconfig"
|
|
||||||
"/usr/bin/pkg-config"
|
|
||||||
"--cflags"
|
|
||||||
"qt-boostable"
|
|
||||||
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
|
|
||||||
OUTPUT_VARIABLE booster_cxxflags
|
|
||||||
OUTPUT_STRIP_TRAILING_WHITESPACE)
|
|
||||||
execute_process(COMMAND "env"
|
|
||||||
"PKG_CONFIG_PATH=${CMAKE_SOURCE_DIR}/data/pkgconfig"
|
|
||||||
"/usr/bin/pkg-config" "--libs"
|
|
||||||
"qt-boostable"
|
|
||||||
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
|
|
||||||
OUTPUT_VARIABLE booster_libs
|
|
||||||
OUTPUT_STRIP_TRAILING_WHITESPACE)
|
|
||||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${booster_cxxflags}")
|
|
||||||
set(CMAKE_EXE_LINKER_FLAGS ${booster_libs})
|
|
||||||
|
|
||||||
|
|
||||||
include(${QT_USE_FILE})
|
|
||||||
|
|
||||||
link_libraries(${QT_QTCORE_LIBRARY} ${QT_QTGUI_LIBRARY})
|
|
||||||
add_executable(fala_windowless ${SRC})
|
|
||||||
|
|
||||||
install(PROGRAMS fala_windowless DESTINATION /usr/bin/)
|
|
||||||
|
|
||||||
|
|
||||||
@ -1,26 +0,0 @@
|
|||||||
/***************************************************************************
|
|
||||||
**
|
|
||||||
** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
|
|
||||||
** All rights reserved.
|
|
||||||
** Contact: Nokia Corporation (directui@nokia.com)
|
|
||||||
**
|
|
||||||
** This file is part of applauncherd
|
|
||||||
**
|
|
||||||
** If you have questions regarding the use of this file, please contact
|
|
||||||
** Nokia at directui@nokia.com.
|
|
||||||
**
|
|
||||||
** This library is free software; you can redistribute it and/or
|
|
||||||
** modify it under the terms of the GNU Lesser General Public
|
|
||||||
** License version 2.1 as published by the Free Software Foundation
|
|
||||||
** and appearing in the file LICENSE.LGPL included in the packaging
|
|
||||||
** of this file.
|
|
||||||
**
|
|
||||||
****************************************************************************/
|
|
||||||
|
|
||||||
#include <QApplication>
|
|
||||||
|
|
||||||
Q_DECL_EXPORT int main(int argc, char ** argv)
|
|
||||||
{
|
|
||||||
QApplication app(argc, argv);
|
|
||||||
app.exec();
|
|
||||||
}
|
|
||||||
@ -1,4 +0,0 @@
|
|||||||
# Install
|
|
||||||
install(PROGRAMS fala_focus DESTINATION /usr/bin/ )
|
|
||||||
install(FILES view.qml DESTINATION /usr/share/applauncherd-testscripts/)
|
|
||||||
|
|
||||||
@ -1,18 +0,0 @@
|
|||||||
#!/usr/bin/python
|
|
||||||
# -*- coding: utf-8 -*-
|
|
||||||
|
|
||||||
import sys
|
|
||||||
from PySide.QtCore import *
|
|
||||||
from PySide.QtGui import *
|
|
||||||
from PySide.QtDeclarative import QDeclarativeView
|
|
||||||
|
|
||||||
# Create Qt application and the QDeclarative view
|
|
||||||
app = QApplication(sys.argv)
|
|
||||||
view = QDeclarativeView()
|
|
||||||
# Create an URL to the QML file
|
|
||||||
url = QUrl('/usr/share/applauncherd-testscripts/view.qml')
|
|
||||||
# Set the QML file and show
|
|
||||||
view.setSource(url)
|
|
||||||
view.show()
|
|
||||||
# Enter Qt main loop
|
|
||||||
sys.exit(app.exec_())
|
|
||||||
@ -1,12 +0,0 @@
|
|||||||
import Qt 4.7
|
|
||||||
|
|
||||||
Rectangle {
|
|
||||||
width: 200
|
|
||||||
height: 200
|
|
||||||
color: "red"
|
|
||||||
|
|
||||||
Text {
|
|
||||||
text: "Hello World"
|
|
||||||
anchors.centerIn: parent
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,34 +0,0 @@
|
|||||||
# Set sources
|
|
||||||
set(SRC main.cpp)
|
|
||||||
|
|
||||||
execute_process(COMMAND "env"
|
|
||||||
"PKG_CONFIG_PATH=${CMAKE_SOURCE_DIR}/data/pkgconfig"
|
|
||||||
"/usr/bin/pkg-config"
|
|
||||||
"--cflags"
|
|
||||||
"qt-boostable"
|
|
||||||
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
|
|
||||||
OUTPUT_VARIABLE booster_cflags
|
|
||||||
OUTPUT_STRIP_TRAILING_WHITESPACE)
|
|
||||||
execute_process(COMMAND "env"
|
|
||||||
"PKG_CONFIG_PATH=${CMAKE_SOURCE_DIR}/data/pkgconfig"
|
|
||||||
"/usr/bin/pkg-config" "--libs"
|
|
||||||
"qt-boostable"
|
|
||||||
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
|
|
||||||
OUTPUT_VARIABLE booster_libs
|
|
||||||
OUTPUT_STRIP_TRAILING_WHITESPACE)
|
|
||||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${booster_cflags}")
|
|
||||||
set(CMAKE_EXE_LINKER_FLAGS ${booster_libs})
|
|
||||||
|
|
||||||
# Enable Qt-support
|
|
||||||
include(${QT_USE_FILE})
|
|
||||||
link_libraries(${QT_QTCORE_LIBRARY} ${QT_QTGUI_LIBRARY})
|
|
||||||
add_executable(fala_testapp ${SRC})
|
|
||||||
|
|
||||||
# Install
|
|
||||||
install(PROGRAMS fala_testapp DESTINATION /usr/bin RENAME fala_wol)
|
|
||||||
install(PROGRAMS fala_testapp DESTINATION /usr/bin RENAME fala_wl)
|
|
||||||
install(FILES com.nokia.fala_testapp.service com.nokia.fala_wl.service com.nokia.fala_wol.service DESTINATION /usr/share/dbus-1/services)
|
|
||||||
install(FILES fala_wl.desktop fala_wol.desktop DESTINATION /usr/share/applications/)
|
|
||||||
install(FILES images/landscape.jpg DESTINATION /usr/share/fala_images/)
|
|
||||||
install(FILES images/portrait.jpg DESTINATION /usr/share/fala_images/)
|
|
||||||
|
|
||||||
@ -1,4 +0,0 @@
|
|||||||
[D-BUS Service]
|
|
||||||
Name=com.nokia.fala_testapp
|
|
||||||
Exec=/usr/bin/fala_testapp -prestart
|
|
||||||
|
|
||||||
@ -1,3 +0,0 @@
|
|||||||
[D-BUS Service]
|
|
||||||
Name=com.nokia.fala_wl
|
|
||||||
Exec=/usr/bin/fala_wl
|
|
||||||
@ -1,3 +0,0 @@
|
|||||||
[D-BUS Service]
|
|
||||||
Name=com.nokia.fala_wol
|
|
||||||
Exec=/usr/bin/fala_wol.sh
|
|
||||||
@ -1,7 +0,0 @@
|
|||||||
[Desktop Entry]
|
|
||||||
Type=Application
|
|
||||||
Name=fala_wl
|
|
||||||
Icon=icon-l-video
|
|
||||||
Exec=/usr/bin/invoker --test-mode --type=q /usr/bin/fala_wl
|
|
||||||
Categories=X-MeeGo;X-Demos;
|
|
||||||
OnlyShowIn=X-MeeGo;
|
|
||||||
@ -1,7 +0,0 @@
|
|||||||
[Desktop Entry]
|
|
||||||
Type=Application
|
|
||||||
Name=fala_wol
|
|
||||||
Icon=icon-l-video
|
|
||||||
Exec=/usr/bin/fala_wol
|
|
||||||
Categories=X-MeeGo;X-Demos;
|
|
||||||
OnlyShowIn=X-MeeGo;
|
|
||||||
Binary file not shown.
|
Before Width: | Height: | Size: 10 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 6.0 KiB |
@ -1,102 +0,0 @@
|
|||||||
/***************************************************************************
|
|
||||||
**
|
|
||||||
** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
|
|
||||||
** All rights reserved.
|
|
||||||
** Contact: Nokia Corporation (directui@nokia.com)
|
|
||||||
**
|
|
||||||
** This file is part of applauncherd
|
|
||||||
**
|
|
||||||
** If you have questions regarding the use of this file, please contact
|
|
||||||
** Nokia at directui@nokia.com.
|
|
||||||
**
|
|
||||||
** This library is free software; you can redistribute it and/or
|
|
||||||
** modify it under the terms of the GNU Lesser General Public
|
|
||||||
** License version 2.1 as published by the Free Software Foundation
|
|
||||||
** and appearing in the file LICENSE.LGPL included in the packaging
|
|
||||||
** of this file.
|
|
||||||
**
|
|
||||||
****************************************************************************/
|
|
||||||
|
|
||||||
#include <QApplication>
|
|
||||||
#include <QFile>
|
|
||||||
#include <QBrush>
|
|
||||||
#include <QColor>
|
|
||||||
#include <sys/time.h>
|
|
||||||
|
|
||||||
#include <exception>
|
|
||||||
|
|
||||||
QString log_file = "/tmp/fala_testapp.log";
|
|
||||||
|
|
||||||
void FANGORNLOG(const char* s, bool eol = true)
|
|
||||||
{
|
|
||||||
QFile f(log_file);
|
|
||||||
f.open(QIODevice::Append);
|
|
||||||
f.write(s, qstrlen(s));
|
|
||||||
if (eol) {
|
|
||||||
f.write("\n", 1);
|
|
||||||
}
|
|
||||||
f.close();
|
|
||||||
}
|
|
||||||
|
|
||||||
void FANGORNLOG(const QString& s, bool eol = true)
|
|
||||||
{
|
|
||||||
QByteArray ba = s.toLocal8Bit();
|
|
||||||
char *p = new char[ba.size() + 1];
|
|
||||||
strcpy(p, ba.data());
|
|
||||||
FANGORNLOG(p, eol);
|
|
||||||
}
|
|
||||||
|
|
||||||
void timestamp(const char *s)
|
|
||||||
{
|
|
||||||
timeval tim;
|
|
||||||
char msg[80];
|
|
||||||
gettimeofday(&tim, NULL);
|
|
||||||
snprintf(msg, 80, "%d%03d %s",
|
|
||||||
static_cast<int>(tim.tv_sec), static_cast<int>(tim.tv_usec)/1000, s);
|
|
||||||
FANGORNLOG(msg);
|
|
||||||
}
|
|
||||||
|
|
||||||
Q_DECL_EXPORT int main(int argc, char **argv)
|
|
||||||
{
|
|
||||||
QApplication *app;
|
|
||||||
try
|
|
||||||
{
|
|
||||||
QString appName(argv[0]);
|
|
||||||
if (appName.endsWith("fala_wl"))
|
|
||||||
{
|
|
||||||
log_file = "/tmp/fala_wl.log";
|
|
||||||
}
|
|
||||||
else if (appName.endsWith("fala_wol"))
|
|
||||||
{
|
|
||||||
log_file = "/tmp/fala_wol.log";
|
|
||||||
}
|
|
||||||
timestamp("application main");
|
|
||||||
|
|
||||||
app = new QApplication(argc, argv);
|
|
||||||
timestamp("app created without cache");
|
|
||||||
|
|
||||||
if (argc > 2 && QString(argv[1]) == QString("--log-args")) {
|
|
||||||
FANGORNLOG("argv:", false);
|
|
||||||
for (int i = 0; i < argc; i++) {
|
|
||||||
FANGORNLOG(" ", false);
|
|
||||||
FANGORNLOG(argv[i], false);
|
|
||||||
}
|
|
||||||
FANGORNLOG("");
|
|
||||||
|
|
||||||
FANGORNLOG("argv:", false);
|
|
||||||
QStringList args = QCoreApplication::arguments();
|
|
||||||
for (int i = 0; i < args.size(); i++) {
|
|
||||||
FANGORNLOG(" ", false);
|
|
||||||
FANGORNLOG(args.at(i), false);
|
|
||||||
}
|
|
||||||
FANGORNLOG("");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch(std::exception& e)
|
|
||||||
{
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
_exit(app->exec());
|
|
||||||
}
|
|
||||||
|
|
||||||
@ -1,9 +0,0 @@
|
|||||||
# Set sources
|
|
||||||
set(SRC main.cpp)
|
|
||||||
link_libraries(-lX11 ${QT_QTCORE_LIBRARY} ${QT_QTGUI_LIBRARY})
|
|
||||||
|
|
||||||
add_executable(xsendevent ${SRC})
|
|
||||||
|
|
||||||
# Install
|
|
||||||
install(PROGRAMS xsendevent DESTINATION /usr/bin/)
|
|
||||||
|
|
||||||
@ -1,10 +0,0 @@
|
|||||||
xsendevent - tool for sending various xevents to windows on command line
|
|
||||||
|
|
||||||
# Usage:
|
|
||||||
# Close window
|
|
||||||
xsendevent close [windowId]
|
|
||||||
|
|
||||||
# Move window to task switcher
|
|
||||||
xsendevent iconify [windowId]
|
|
||||||
|
|
||||||
|
|
||||||
@ -1,90 +0,0 @@
|
|||||||
#include <QApplication>
|
|
||||||
#include <QX11Info>
|
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <X11/Xlib.h>
|
|
||||||
#include <X11/Xutil.h>
|
|
||||||
|
|
||||||
void printUsage()
|
|
||||||
{
|
|
||||||
printf("Usage: xsendevent [event windowid]...\n");
|
|
||||||
printf("Supported events:\n");
|
|
||||||
printf(" close - sends _NET_CLOSE_WINDOW(windowid) the root window\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
void sendCloseEvent(Window window)
|
|
||||||
{
|
|
||||||
Display *display = QX11Info::display();
|
|
||||||
|
|
||||||
Window rootWin = QX11Info::appRootWindow(QX11Info::appScreen());
|
|
||||||
|
|
||||||
XEvent ev;
|
|
||||||
memset(&ev, 0, sizeof(ev));
|
|
||||||
|
|
||||||
Atom closeWindowAtom = XInternAtom(display, "_NET_CLOSE_WINDOW", False);
|
|
||||||
|
|
||||||
ev.xclient.type = ClientMessage;
|
|
||||||
ev.xclient.window = window;
|
|
||||||
ev.xclient.message_type = closeWindowAtom;
|
|
||||||
ev.xclient.format = 32;
|
|
||||||
ev.xclient.data.l[0] = CurrentTime;
|
|
||||||
ev.xclient.data.l[1] = rootWin;
|
|
||||||
XSendEvent(display, rootWin, False, SubstructureRedirectMask, &ev);
|
|
||||||
}
|
|
||||||
|
|
||||||
void iconifyWindow(Window window)
|
|
||||||
{
|
|
||||||
Display *display = QX11Info::display();
|
|
||||||
|
|
||||||
Window rootWin = QX11Info::appRootWindow(QX11Info::appScreen());
|
|
||||||
|
|
||||||
XEvent e;
|
|
||||||
memset(&e, 0, sizeof(e));
|
|
||||||
|
|
||||||
Atom iconicAtom = XInternAtom(display, "WM_CHANGE_STATE", True);
|
|
||||||
|
|
||||||
e.xclient.type = ClientMessage;
|
|
||||||
e.xclient.message_type = iconicAtom;
|
|
||||||
e.xclient.display = display;
|
|
||||||
e.xclient.window = window;
|
|
||||||
e.xclient.format = 32;
|
|
||||||
e.xclient.data.l[0] = IconicState;
|
|
||||||
XSendEvent(display, rootWin, False, SubstructureRedirectMask, &e);
|
|
||||||
}
|
|
||||||
|
|
||||||
int main (int argc, char **argv)
|
|
||||||
{
|
|
||||||
QApplication app(argc, argv); // connect to the X server
|
|
||||||
|
|
||||||
for (int i = 1; i < argc; i++)
|
|
||||||
{
|
|
||||||
if (QString(argv[i]) == "-h" ||
|
|
||||||
QString(argv[i]) == "-help" ||
|
|
||||||
QString(argv[i]) == "--help"
|
|
||||||
) {
|
|
||||||
printUsage();
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (QString(argv[i]) == "close") {
|
|
||||||
Window window;
|
|
||||||
|
|
||||||
// coverity[secure_coding]
|
|
||||||
sscanf(argv[++i], "%lx", &window);
|
|
||||||
|
|
||||||
sendCloseEvent(window);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (QString(argv[i]) == "iconify") {
|
|
||||||
Window window;
|
|
||||||
|
|
||||||
// coverity[secure_coding]
|
|
||||||
sscanf(argv[++i], "%lx", &window);
|
|
||||||
|
|
||||||
iconifyWindow(window);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,31 +0,0 @@
|
|||||||
set(LAUNCHER ${CMAKE_HOME_DIRECTORY}/src/launcherlib)
|
|
||||||
set(DBOOSTER ${CMAKE_HOME_DIRECTORY}/src/qdeclarativebooster)
|
|
||||||
|
|
||||||
# Set sources
|
|
||||||
set(SRC ut_dbooster.cpp ${LAUNCHER}/appdata.cpp ${LAUNCHER}/booster.cpp
|
|
||||||
${LAUNCHER}/connection.cpp ${LAUNCHER}/logger.cpp ${DBOOSTER}/qdeclarativebooster.cpp
|
|
||||||
${LAUNCHER}/singleinstance.cpp ${LAUNCHER}/socketmanager.cpp)
|
|
||||||
|
|
||||||
# Set moc headers
|
|
||||||
set(MOC_HDRS ut_dbooster.h)
|
|
||||||
|
|
||||||
# Run moc
|
|
||||||
qt4_wrap_cpp(MOC_SRC ${MOC_HDRS})
|
|
||||||
|
|
||||||
# Enable test library
|
|
||||||
set(QT_USE_QTTEST TRUE)
|
|
||||||
|
|
||||||
# Set include paths
|
|
||||||
include_directories(${CMAKE_CURRENT_SOURCE_DIR} ${LAUNCHER} ${CMAKE_HOME_DIRECTORY}/src/common ${DBOOSTER})
|
|
||||||
|
|
||||||
link_libraries(${QT_QTCORE_LIBRARY} ${QT_QTGUI_LIBRARY} ${QT_QTTEST_LIBRARY} "-L${CMAKE_SOURCE_DIR}/src/qdeclarativebooster -lmdeclarativecache" -ldl -lX11)
|
|
||||||
|
|
||||||
# Enable Qt (may not be needed, because already defined on higher level)
|
|
||||||
include(${QT_USE_FILE})
|
|
||||||
|
|
||||||
add_executable(ut_dbooster ${SRC} ${MOC_SRC} )
|
|
||||||
add_dependencies(ut_dbooster mdeclarativecache)
|
|
||||||
|
|
||||||
# Install
|
|
||||||
install(PROGRAMS ut_dbooster DESTINATION /usr/share/applauncherd-tests/)
|
|
||||||
|
|
||||||
@ -1,81 +0,0 @@
|
|||||||
/***************************************************************************
|
|
||||||
**
|
|
||||||
** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
|
|
||||||
** All rights reserved.
|
|
||||||
** Contact: Nokia Corporation (directui@nokia.com)
|
|
||||||
**
|
|
||||||
** This file is part of applauncherd
|
|
||||||
**
|
|
||||||
** If you have questions regarding the use of this file, please contact
|
|
||||||
** Nokia at directui@nokia.com.
|
|
||||||
**
|
|
||||||
** This library is free software; you can redistribute it and/or
|
|
||||||
** modify it under the terms of the GNU Lesser General Public
|
|
||||||
** License version 2.1 as published by the Free Software Foundation
|
|
||||||
** and appearing in the file LICENSE.LGPL included in the packaging
|
|
||||||
** of this file.
|
|
||||||
**
|
|
||||||
****************************************************************************/
|
|
||||||
|
|
||||||
#include "ut_dbooster.h"
|
|
||||||
#include "qdeclarativebooster.h"
|
|
||||||
#include "mdeclarativecache.h"
|
|
||||||
|
|
||||||
Ut_DBooster::Ut_DBooster() :
|
|
||||||
m_subject(new QDeclarativeBooster)
|
|
||||||
{}
|
|
||||||
|
|
||||||
Ut_DBooster::~Ut_DBooster()
|
|
||||||
{}
|
|
||||||
|
|
||||||
void Ut_DBooster::initTestCase()
|
|
||||||
{}
|
|
||||||
|
|
||||||
void Ut_DBooster::cleanupTestCase()
|
|
||||||
{}
|
|
||||||
|
|
||||||
void Ut_DBooster::testSocketName()
|
|
||||||
{
|
|
||||||
QVERIFY(QDeclarativeBooster::socketName() == QDeclarativeBooster::m_socketId);
|
|
||||||
QVERIFY(m_subject->socketId() == QDeclarativeBooster::m_socketId);
|
|
||||||
}
|
|
||||||
|
|
||||||
void Ut_DBooster::testType()
|
|
||||||
{
|
|
||||||
QVERIFY(QDeclarativeBooster::type() == 'd');
|
|
||||||
QVERIFY(m_subject->boosterType() == 'd');
|
|
||||||
}
|
|
||||||
|
|
||||||
void Ut_DBooster::testPreload()
|
|
||||||
{
|
|
||||||
m_subject->preload();
|
|
||||||
|
|
||||||
const char * argv[] = {"foo"};
|
|
||||||
int argc = 1;
|
|
||||||
|
|
||||||
// TODO: Somehow make sure that MDeclarativeCache really returns the cached
|
|
||||||
// QApplication instead of creating a new one here.
|
|
||||||
QApplication * app = MDeclarativeCache::qApplication(argc, const_cast<char **>(argv));
|
|
||||||
QVERIFY(app);
|
|
||||||
|
|
||||||
QStringList args = app->arguments();
|
|
||||||
QVERIFY(args.length() == 1);
|
|
||||||
QVERIFY(args[0] == "foo");
|
|
||||||
|
|
||||||
QVERIFY(MDeclarativeCache::qDeclarativeView());
|
|
||||||
}
|
|
||||||
|
|
||||||
void Ut_DBooster::testTemporaryProcessName()
|
|
||||||
{
|
|
||||||
QVERIFY(QDeclarativeBooster::temporaryProcessName() == QDeclarativeBooster::m_temporaryProcessName);
|
|
||||||
QVERIFY(m_subject->temporaryProcessName() == QDeclarativeBooster::m_temporaryProcessName);
|
|
||||||
QVERIFY(m_subject->boosterTemporaryProcessName() == QDeclarativeBooster::m_temporaryProcessName);
|
|
||||||
}
|
|
||||||
|
|
||||||
void Ut_DBooster::testReceiveDataFromInvokerWithBadSocket()
|
|
||||||
{
|
|
||||||
QVERIFY(m_subject->receiveDataFromInvoker(-100) == false);
|
|
||||||
}
|
|
||||||
|
|
||||||
QTEST_APPLESS_MAIN(Ut_DBooster);
|
|
||||||
|
|
||||||
@ -1,53 +0,0 @@
|
|||||||
/***************************************************************************
|
|
||||||
**
|
|
||||||
** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
|
|
||||||
** All rights reserved.
|
|
||||||
** Contact: Nokia Corporation (directui@nokia.com)
|
|
||||||
**
|
|
||||||
** This file is part of applauncherd
|
|
||||||
**
|
|
||||||
** If you have questions regarding the use of this file, please contact
|
|
||||||
** Nokia at directui@nokia.com.
|
|
||||||
**
|
|
||||||
** This library is free software; you can redistribute it and/or
|
|
||||||
** modify it under the terms of the GNU Lesser General Public
|
|
||||||
** License version 2.1 as published by the Free Software Foundation
|
|
||||||
** and appearing in the file LICENSE.LGPL included in the packaging
|
|
||||||
** of this file.
|
|
||||||
**
|
|
||||||
****************************************************************************/
|
|
||||||
|
|
||||||
#ifndef UT_DBOOSTER_H
|
|
||||||
#define UT_DBOOSTER_H
|
|
||||||
|
|
||||||
#include<QtTest/QtTest>
|
|
||||||
#include<QObject>
|
|
||||||
|
|
||||||
#include <tr1/memory>
|
|
||||||
|
|
||||||
#define UNIT_TEST
|
|
||||||
|
|
||||||
class QDeclarativeBooster;
|
|
||||||
|
|
||||||
class Ut_DBooster : public QObject
|
|
||||||
{
|
|
||||||
Q_OBJECT
|
|
||||||
|
|
||||||
public:
|
|
||||||
Ut_DBooster();
|
|
||||||
virtual ~Ut_DBooster();
|
|
||||||
|
|
||||||
private Q_SLOTS:
|
|
||||||
void initTestCase();
|
|
||||||
void cleanupTestCase();
|
|
||||||
void testSocketName();
|
|
||||||
void testType();
|
|
||||||
void testPreload();
|
|
||||||
void testTemporaryProcessName();
|
|
||||||
void testReceiveDataFromInvokerWithBadSocket();
|
|
||||||
|
|
||||||
private:
|
|
||||||
std::tr1::shared_ptr<QDeclarativeBooster> m_subject;
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif // UT_DBOOSTER_H
|
|
||||||
@ -1,27 +0,0 @@
|
|||||||
set(LAUNCHER ${CMAKE_HOME_DIRECTORY}/src/launcherlib)
|
|
||||||
set(QTBOOSTER ${CMAKE_HOME_DIRECTORY}/src/qtbooster)
|
|
||||||
|
|
||||||
# Set sources
|
|
||||||
set(SRC ut_qtbooster.cpp ${LAUNCHER}/appdata.cpp ${LAUNCHER}/booster.cpp
|
|
||||||
${LAUNCHER}/connection.cpp ${LAUNCHER}/logger.cpp ${QTBOOSTER}/qtbooster.cpp
|
|
||||||
${LAUNCHER}/singleinstance.cpp ${LAUNCHER}/socketmanager.cpp)
|
|
||||||
|
|
||||||
# Set moc headers
|
|
||||||
set(MOC_HDRS ut_qtbooster.h)
|
|
||||||
|
|
||||||
# Run moc
|
|
||||||
qt4_wrap_cpp(MOC_SRC ${MOC_HDRS})
|
|
||||||
|
|
||||||
# Enable test library
|
|
||||||
set(QT_USE_QTTEST TRUE)
|
|
||||||
|
|
||||||
# Set include paths
|
|
||||||
include_directories(${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_HOME_DIRECTORY}/src/common ${LAUNCHER} ${QTBOOSTER})
|
|
||||||
link_libraries(${QT_QTCORE_LIBRARY} ${QT_QTTEST_LIBRARY} ${X11_LIBRARIES} -ldl)
|
|
||||||
|
|
||||||
# Enable Qt (may not be needed, because already defined on higher level)
|
|
||||||
include(${QT_USE_FILE})
|
|
||||||
add_executable(ut_qtbooster ${SRC} ${MOC_SRC})
|
|
||||||
|
|
||||||
# Install
|
|
||||||
install(PROGRAMS ut_qtbooster DESTINATION /usr/share/applauncherd-tests/)
|
|
||||||
@ -1,56 +0,0 @@
|
|||||||
/***************************************************************************
|
|
||||||
**
|
|
||||||
** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
|
|
||||||
** All rights reserved.
|
|
||||||
** Contact: Nokia Corporation (directui@nokia.com)
|
|
||||||
**
|
|
||||||
** This file is part of applauncherd
|
|
||||||
**
|
|
||||||
** If you have questions regarding the use of this file, please contact
|
|
||||||
** Nokia at directui@nokia.com.
|
|
||||||
**
|
|
||||||
** This library is free software; you can redistribute it and/or
|
|
||||||
** modify it under the terms of the GNU Lesser General Public
|
|
||||||
** License version 2.1 as published by the Free Software Foundation
|
|
||||||
** and appearing in the file LICENSE.LGPL included in the packaging
|
|
||||||
** of this file.
|
|
||||||
**
|
|
||||||
****************************************************************************/
|
|
||||||
|
|
||||||
#include "ut_qtbooster.h"
|
|
||||||
#include "qtbooster.h"
|
|
||||||
|
|
||||||
Ut_QtBooster::Ut_QtBooster() :
|
|
||||||
m_subject(new QtBooster)
|
|
||||||
{}
|
|
||||||
|
|
||||||
Ut_QtBooster::~Ut_QtBooster()
|
|
||||||
{}
|
|
||||||
|
|
||||||
void Ut_QtBooster::initTestCase()
|
|
||||||
{}
|
|
||||||
|
|
||||||
void Ut_QtBooster::cleanupTestCase()
|
|
||||||
{}
|
|
||||||
|
|
||||||
void Ut_QtBooster::testSocketName()
|
|
||||||
{
|
|
||||||
QVERIFY2(QtBooster::socketName() == QtBooster::m_socketId, "Failure");
|
|
||||||
QVERIFY2(m_subject->socketId() == QtBooster::m_socketId, "Failure");
|
|
||||||
}
|
|
||||||
|
|
||||||
void Ut_QtBooster::testType()
|
|
||||||
{
|
|
||||||
QVERIFY2(QtBooster::type() == 'q', "Failure");
|
|
||||||
QVERIFY2(m_subject->boosterType() == 'q', "Failure");
|
|
||||||
}
|
|
||||||
|
|
||||||
void Ut_QtBooster::testTemporaryProcessName()
|
|
||||||
{
|
|
||||||
QVERIFY(QtBooster::temporaryProcessName() == QtBooster::m_temporaryProcessName);
|
|
||||||
QVERIFY(m_subject->temporaryProcessName() == QtBooster::m_temporaryProcessName);
|
|
||||||
QVERIFY(m_subject->boosterTemporaryProcessName() == QtBooster::m_temporaryProcessName);
|
|
||||||
}
|
|
||||||
|
|
||||||
QTEST_APPLESS_MAIN(Ut_QtBooster);
|
|
||||||
|
|
||||||
@ -1,51 +0,0 @@
|
|||||||
/***************************************************************************
|
|
||||||
**
|
|
||||||
** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
|
|
||||||
** All rights reserved.
|
|
||||||
** Contact: Nokia Corporation (directui@nokia.com)
|
|
||||||
**
|
|
||||||
** This file is part of applauncherd
|
|
||||||
**
|
|
||||||
** If you have questions regarding the use of this file, please contact
|
|
||||||
** Nokia at directui@nokia.com.
|
|
||||||
**
|
|
||||||
** This library is free software; you can redistribute it and/or
|
|
||||||
** modify it under the terms of the GNU Lesser General Public
|
|
||||||
** License version 2.1 as published by the Free Software Foundation
|
|
||||||
** and appearing in the file LICENSE.LGPL included in the packaging
|
|
||||||
** of this file.
|
|
||||||
**
|
|
||||||
****************************************************************************/
|
|
||||||
|
|
||||||
#ifndef UT_QTBOOSTER_H
|
|
||||||
#define UT_QTBOOSTER_H
|
|
||||||
|
|
||||||
#include<QtTest/QtTest>
|
|
||||||
#include<QObject>
|
|
||||||
|
|
||||||
#include <tr1/memory>
|
|
||||||
|
|
||||||
#define UNIT_TEST
|
|
||||||
|
|
||||||
class QtBooster;
|
|
||||||
|
|
||||||
class Ut_QtBooster : public QObject
|
|
||||||
{
|
|
||||||
Q_OBJECT
|
|
||||||
|
|
||||||
public:
|
|
||||||
Ut_QtBooster();
|
|
||||||
virtual ~Ut_QtBooster();
|
|
||||||
|
|
||||||
private Q_SLOTS:
|
|
||||||
void initTestCase();
|
|
||||||
void cleanupTestCase();
|
|
||||||
void testSocketName();
|
|
||||||
void testType();
|
|
||||||
void testTemporaryProcessName();
|
|
||||||
|
|
||||||
private:
|
|
||||||
std::tr1::shared_ptr<QtBooster> m_subject;
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif // UT_QTBOOSTER_H
|
|
||||||
Loading…
Reference in New Issue