/****************************************************************************
**
** Copyright (C) 2017 The Qt Company Ltd and/or its subsidiary(-ies).
** Contact: http://www.qt-project.org/legal
**
** This file is part of the documentation of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:FDL$
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms
** and conditions see https://www.qt.io/terms-conditions. For further
** information use the contact form at https://www.qt.io/contact-us.
**
** GNU Free Documentation License Usage
** Alternatively, this file may be used under the terms of the GNU Free
** Documentation License version 1.3 as published by the Free Software
** Foundation and appearing in the file included in the packaging of
** this file. Please review the following information to ensure
** the GNU Free Documentation License version 1.3 requirements
** will be met: https://www.gnu.org/licenses/fdl-1.3.html.
** $QT_END_LICENSE$
**
****************************************************************************/

/*!
\example dialer

\title Service Framework using QML Example

\ingroup serviceframework-examples

\brief This example demonstrates the usage of the Service Framework's QML API.

\b {Execution}

This example requires the example dialer services to be registered in order
for the application to discover and load the services. This can be done by using the
service framework command line tool to add the corresponding service XML file:

\list
    \li servicefw add landlinedialerplugin.xml
    \li servicefw add remotedialerservice.xml
    \li servicefw dbusservice removedialerservice.xml dialer_service
\endlist

These deployment commands will register the remote IPC-based service, and the Landline dialer plugin. The last
line features the ability to create an autostarting file for D-Bus if the platform supports the QtDBus module.

To run the example
\list
    \li dialer
\endlist

The XML files for all example services can be found in the Qt build directory
under examples/qtsystems/serviceframework/xmldata.

For Maemo and Linux platforms using D-Bus as the underlying IPC mechanism, the
autostart feature can be initialised by running the service framework tool:
\code
    servicefw dbusservice xmldata/remotedialerservice.xml dialer_service
\endcode

For other platforms that fall use QLocalSocket, then if the services
binary can be found in your path it'll auto start the service.

\b {Explanation}

This example should demonstrate how to use the Service Framework to
access a list of services in a QML context. A library plugin provides QML with elements
that can reference a single service or a list of services, called 'Service' and
'ServiceList' respectively.

\target guidesign

The GUI looks like following picture:

\image DialerServiceGUI.png "GUI"

The following steps outline how to make a QML based application using the Service Framework technology.
It is assumed that QtMobility has been successfully built and environment variables have been set
as per \l {Installation Guide}.

\b {Service Framework in QML:}

To include the Service Framework QML plugin we need to import it as follows:

\snippet serviceframework/dialer/content/DialerList.qml 4


\b {The Services:}

The services are implemented as a sevices and a shared library and can be register in the service framework.
After the service is registered it can be used in different applications.
In our case we'll access the services over an application that is based on QML scripting.
We will be able to change between different services and call their properties,
receiving their signals and so forth.

In this example we've implemented a service called
Voipdialer and a plugin Landlinedialer.
You can find the projects for these:

remotedialerservice
Those projects will create a service.

The service needs to be available over the Service Framework,
we need to register it.
In our example this will be done manually by using the servicefw tool. Refer to the project
README for further details.

As you can see we register the services using a xml file.
This xml file basically contains all information to register the shared library in the
Service Framework environment.
For more information please read more about the Qt Service Framework
\l {service-frameworks.html#adding-and-removing-of-services}{XML Format}

The QServiceManager creates an instance of a plugin service over a QServicePluginInterface.
For each plugin services we provide a Plugin.

\snippet serviceframework/voipdialerplugin/voipdialerplugin.h 0

The Q_INTERFACES macro tells Qt which interfaces the class implements.

Sevice plugins need to implement the QServicePluginInterface.
In our case we only need to overwrite the virtual function createInstance.
\snippet serviceframework/voipdialerplugin/voipdialerplugin.cpp 0

As you can see the createInstance function create the appropriate dialer object
and returns it.
The Q_PLUGIN_METADATA macro provides the necessary implementation for a plugin.
See \l{How to Create Qt Plugins} for more details.

The last thing we need to provide in our services are the states, properties, signals and slots that we
want to access in out QML script later.

\target voipdialer_h 0
\snippet serviceframework/voipdialerplugin/voipdialer.h 0


\b {Service access on the QML side}


The QML elements are implemented in 4 different qml scripting files
\l {guidesign}{ see GUI design}.

The first step is to use our ServiceWrapperList to specify the interface and minimum version (optional) through QML item
context, which will produce a list of ServiceWrapper objects.

\snippet serviceframework/dialer/content/DialerList.qml 5

In the DialerList.qml file the services property is assigned to the ListView model property.

\snippet serviceframework/dialer/content/DialerList.qml 0

To show the items of the model property we need to create a delegate component and assign it to the ListView
Delegate property:

\snippet serviceframework/dialer/content/DialerList.qml 1

In this component you can define how you want to draw one ListView item.
You can access inside of this component the current ListWiew item by using the variable modelData.
In our example we are using two text lines. Furthermore we can define whats happening if we click
on a ListView item by using the MouseRegion.

\target DialerList_qml_2
\snippet serviceframework/dialer/content/DialerList.qml 2

Another component can be created for highliting a list item:

\snippet serviceframework/dialer/content/DialerList.qml 3

\b {Service signals and function calls on the QML site}

In sfw-kinetic-example.qml we define a control named DialScreen and implement
the function onDial and onHangup.
As you can see in the onDial event we call the service function dialNumber and
the onHangup calls hangup.
Both function are implemented in the service \l {voipdialer_h_0} { (see voipdialer header file).}

\snippet serviceframework/dialer/dialer.qml 0

In DialScreen.qml the dial and the hangup signals are defined.
The hangup signal will be emitted if the HangUpButton was clicked:

\snippet serviceframework/dialer/content/DialScreen.qml 1

The dial signal will be emitted if the CallButton was clicked:

\snippet serviceframework/dialer/content/DialScreen.qml 2

Now we need to connect the stateChanged signal form the services with an event handler on the QML site.
This is done in our main declarative file:

\snippet serviceframework/dialer/dialer.qml 1

The DialScreen.currentDialer is assigned during a ListView item click in the
\l {DialerList_qml_2}{ ServiceList.qml file}.

*/
