/****************************************************************************
**
** Copyright (C) 2017 Ford Motor Company
** Contact: https://www.qt.io/licensing/
**
** This file is part of the QtRemoteObjects module of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:LGPL$
** 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 Lesser General Public License Usage
** Alternatively, this file may be used under the terms of the GNU Lesser
** General Public License version 3 as published by the Free Software
** Foundation and appearing in the file LICENSE.LGPL3 included in the
** packaging of this file. Please review the following information to
** ensure the GNU Lesser General Public License version 3 requirements
** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
**
** GNU General Public License Usage
** Alternatively, this file may be used under the terms of the GNU
** General Public License version 2.0 or (at your option) the GNU General
** Public license version 3 or any later version approved by the KDE Free
** Qt Foundation. The licenses are as published by the Free Software
** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
** included in the packaging of this file. Please review the following
** information to ensure the GNU General Public License requirements will
** be met: https://www.gnu.org/licenses/gpl-2.0.html and
** https://www.gnu.org/licenses/gpl-3.0.html.
**
** $QT_END_LICENSE$
**
****************************************************************************/

/*!
\page qtremoteobjects-index.html
\title Qt Remote Objects
\ingroup overviews
\brief Provides APIs for inter-process communication using Qt Remote Objects

\target Qt Remote Objects
\section1 Remote Object Concepts

Qt Remote Objects (QtRO) is an inter-process communication (IPC) module
developed for Qt. The idea is to extend existing Qt's functionalities to enable
an easy exchange of information between processes or computers.

One of the key features of Qt to enable this is the distinction between an
objects API (defined by its Q_Property, Signals and Slots) and the
implementation of that API. The purpose of QtRO is to meet the expected API, even
if the true QObject is in a different process. A Slot called on a copy of an
object (called a \l {Replica} in QtRO) is forwarded to the true object (called
a \l {Source} in QtRO) for handling. Updates to the \l {Source} (either
property changes or emitted Signals) are forwarded to every \l {Replica}.

A \l {Replica} is a light-weight proxy for the \l {Source} object, but one that
supports the same connections and behavior of QObjects, which makes them as
easy to use as any other QObject provided by Qt. Everything needed for the \l
{Replica} to look like the \l {Source} object is handled behind the scenes by
QtRO.

Note that Remote Objects behave differently from traditional remote procedure
call (RPC) implementations. In RPC, the client makes a request and waits for
the response. In RPC, the server does not push anything to the client unless it
is in response to a request. The design of RPC is often such that different
clients are independent of each other (for instance, two clients can ask a
mapping service for directions and get different results). While it is possible
to implement this in QtRO (as \l {Source} without properties, and Slots that
have return values), it is designed more to hide the fact that the processing
is really remote. You let a node give you the \l {Replica} instead of creating
it yourself, possibly use the status signals (\l {QRemoteObjectReplica::} {isReplicaValid()}),
but then interact with the object like you would with any other QObject-based type.

\section1 Related Information

\section2 Getting Started

To enable \e {Qt Remote Objects} in a project, add this directive into
the C++ files:

\code
#include <QtRemoteObjects>
\endcode

To link against the \e {Qt Remote Objects} module, add this line to the project file:
\code
QT += remoteobjects
\endcode

\section2 Guides
 \list
    \li \l {Overview Qt Remote Objects}
    \li \l {Qt Remote Objects C++ Classes}
    \li \l {Qt Remote Objects Nodes}
    \li \l {Source Objects}{Qt Remote Objects Source Objects}
    \li \l {Replica Objects}{Qt Remote Objects Replica Objects}
    \li \l {Qt Remote Objects Registry}
    \li \l {Qt Remote Objects Compiler}
    \li \l {Remote Object Interaction}
    \li \l {Using Qt RemoteObjects}
    \li \l {Troubleshooting Qt Remote Objects}

 \endlist

\section2 Reference

\l {Qt Remote Objects C++ Classes}

*/
