/****************************************************************************
**
** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
** All rights reserved.
** Contact: Nokia Corporation (qt-info@nokia.com)
**
** This file is part of the documentation of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:FDL$
** No Commercial Usage
** This file contains pre-release code and may not be distributed.
** You may use this file in accordance with the terms and conditions
** contained in the Technology Preview License Agreement accompanying
** this package.
**
** GNU Free Documentation License
** 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.
**
** If you have questions regarding the use of this file, please contact
** Nokia at qt-info@nokia.com.
** $QT_END_LICENSE$
**
****************************************************************************/

/*!
    \example keepintouch
    \title 'Keep in Touch' Example

    This example demonstrates using the QtMobility Messaging API to
    extract useful information from the messages stored by the system.

    \image keepintouch-example.png

    The 'Keep in Touch' application locates people you have sent messages
    to in the past, but with whom you have not communicated recently.  It
    defines a user-selected date range in the past, beginning a certain
    amount of time ago and finishing more recently.  Any address that you
    sent a message to in this period is located.  Any address that you
    sent a message to more recently than this period will not be displayed.
    So, now might be a good time to say hello to the people whose addresses
    are reported!

    We find addresses when the user clicks the Search button.  First of all
    we find the dates that define the period that the user has selected.

    \snippet    ../../examples/keepintouch/addressfinder.cpp create-date-range

    We create filter objects that will constrain our message search to
    the date range that the user has selected:

    \snippet    ../../examples/keepintouch/addressfinder.cpp create-simple-filters

    Now we combine our filters to precisely specify the messages that we
    would like to inspect to perform our address search:

    \snippet    ../../examples/keepintouch/addressfinder.cpp create-composite-filters

    Now that we know what messages to search for, we use an instance of
    QMessageService to perform our first search:

    \snippet    ../../examples/keepintouch/addressfinder.cpp begin-search

    We could have queried the QMessageManager instance directly using the
    \l{QMessageManager::queryMessages()}{queryMessages} function, but that
    would keep our UI thread busy, and we wouldn't be able to keep our UI
    functioning at the same time.  Using the QMessageService interface
    allows us to process the search asynchronously.

    We receive the notification of matching messages by responding to the
    QMessageService::messagesFound() signal:

    \snippet    ../../examples/keepintouch/addressfinder.cpp accumulate-matches

    When the search is completed, the QMessageService::stateChanged()
    signal is emitted.  If the user specified an exclusion period then we have
    to perform two searches, so when the first finishes our handler initiates
    the second; when the second finishes, we begin processing the results:

    \snippet    ../../examples/keepintouch/addressfinder.cpp handle-search-result

    The \c continueSearch function processes the results of our searches, one
    message at a time.  Each address we sent a message to in the excluded
    time period is added to our exclusion list.  For each address we sent a
    message to in our included time period, and which is not in the exclusion
    list, we create a set of the messages that we sent to that address.

    \snippet    ../../examples/keepintouch/addressfinder.cpp continue-search

    We will display the resulting list of contacts in our Contacts pane.  If the
    system contains a contact definition that matches the address information
    we extracted, we will display the label for that contact - this matching
    process can be accomplished using the QtMobility Contacts API.  If we can't
    find a matching contact, we fall back to using the raw address information
    for display:

    \snippet    ../../examples/keepintouch/addressfinder.cpp contact-lookup

    If the user selects one of these contact addresses, we fill the Messages
    combo box with the list of messages that were previously sent to that contact:

    \snippet    ../../examples/keepintouch/addressfinder.cpp address-selected

    When the user has selected a message, two further actions become possible.
    We can use the QMessageService facility to either view the message
    or to compose a new message to the recipient of the earlier message. To
    view the message we only need to invoke the
    \l {QMessageService::show()}{show} function for the relevant QMessageId:

    \snippet    ../../examples/keepintouch/addressfinder.cpp show-message

    To compose a response, we will create a new message that forwards the
    existing message content to the same recipient, and requests that the
    system display a message composer prepared with the message content we
    have prepared:

    \snippet    ../../examples/keepintouch/addressfinder.cpp compose-message
*/


