emailuis/nmindicatorplugin/src/nmindicatorplugin.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Mon, 03 May 2010 12:23:15 +0300
changeset 20 ecc8def7944a
parent 18 578830873419
child 23 2dc6caa42ec3
permissions -rw-r--r--
Revision: 201015 Kit: 201018

/*
* Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
* All rights reserved.
* This component and the accompanying materials are made available
* under the terms of "Eclipse Public License v1.0"
* which accompanies this distribution, and is available
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
*
* Initial Contributors:
* Nokia Corporation - initial contribution.
*
* Contributors:
*
* Description:
*
*/

#include "nmindicatorplugin.h"
#include "nmindicator.h"

#include <QCoreApplication>
#include <QLocale>
#include <QVariant>
#include <QTimer>

#include <xqservicerequest.h>
#include <email_services_api.h>

Q_EXPORT_PLUGIN(NmIndicatorPlugin)

const int NmMaxIndicatorCount = 10;

/*!
    \class NmIndicatorPlugin
    \brief Mail indicator plugin class.
*/

/*!
     Class constructor.
*/
NmIndicatorPlugin::NmIndicatorPlugin()
: mError(0), mTranslator(0), mStatusBarIndicator(0), mSending(false)
{
}

/*!
    Class destructor.
*/
NmIndicatorPlugin::~NmIndicatorPlugin()
{
    NMLOG("NmIndicatorPlugin::~NmIndicatorPlugin");
	delete mTranslator;
}

/*!
	Return notification types this plugin implements
 */
QStringList NmIndicatorPlugin::indicatorTypes() const
{
    QStringList types;
    for (int i=0; i<NmMaxIndicatorCount; i++) {
		QString name = QString("com.nokia.nmail.indicatorplugin_%1/1.0").arg(i);
		types << name;
    }
    return types;
}

/*!
	Check if client is allowed to use notification widget
	see HbIndicatorPluginInterface
*/
bool NmIndicatorPlugin::accessAllowed(const QString &indicatorType,
    const HbSecurityInfo *securityInfo) const
{
    Q_UNUSED(indicatorType)
    Q_UNUSED(securityInfo)

    // This plugin doesn't perform operations that may compromise security.
    // All clients are allowed to use.
    return true;
}

/*!
    Called when any of the indicator receive updated status of the global status
 */
void NmIndicatorPlugin::globalStatusChanged(bool sending)
{
    mSending = sending;

    // Pass the information to the indicator handling the status bar icon
    if (mStatusBarIndicator) {
        mStatusBarIndicator->acceptIcon(sending);
    }
    else {
		// No indicator is showing the status now.
		indicatorIconLost();
	}
}

/*!
	Creates an indicator of type indicatorType. Ownership is passed to the caller.
 */
HbIndicatorInterface* NmIndicatorPlugin::createIndicator(
        const QString &indicatorType)
{
    if (!mTranslator) {
        mTranslator = new QTranslator();
        QString lang = QLocale::system().name();
        QString appName = "mail_";
        QString path = "z:/resource/qt/translations/";
        mTranslator->load(appName + lang, path);
        QCoreApplication::installTranslator(mTranslator);
    }

    NmIndicator* indicator = new NmIndicator(indicatorType);
    connect(indicator, SIGNAL(indicatorIconLost()), this, SLOT(indicatorIconLost()));
    connect(indicator, SIGNAL(destroyed(QObject *)), this, SLOT(indicatorDeactivated(QObject *)));
    connect(indicator, SIGNAL(globalStatusChanged(bool)), this, SLOT(globalStatusChanged(bool)));
    connect(indicator, SIGNAL(mailboxLaunched(quint64)), this, SLOT(showMailbox(quint64)));
    mIndicators.append(indicator);

    return indicator;
}

/*!
	Returns the last error code.
 */
int NmIndicatorPlugin::error() const
{
    return mError;
}

/*!
    Called when an indicator signals about lost indicator.
    \param true if a new indicator was found
 */
bool NmIndicatorPlugin::indicatorIconLost()
{
    bool found(false);
    mStatusBarIndicator = NULL;

    foreach (NmIndicator* indicator, mIndicators) {
        // Find a new candidate to handle the status bar icon
        if (indicator->acceptIcon(mSending)) {
			mStatusBarIndicator = indicator;
			found = true;
            break;
        }
    }
    return found;
}

/*!
    Remove destroyed indicators from the list.
    \param indicator item that has been deleted
 */
void NmIndicatorPlugin::indicatorDeactivated(QObject *indObject)
{
    NMLOG(QString("NmIndicatorPlugin::indicatorDeactivated %1").arg((int)indObject));
    NmIndicator *indicator = static_cast<NmIndicator*>(indObject);
    mIndicators.removeAll(indicator);
    if (mStatusBarIndicator == indicator) {
		mStatusBarIndicator = NULL;

		// Find new indicator to take care of the status bar icon
		indicatorIconLost();
	}
}

/*!
    Opens inbox view to specific mailbox
    \return true if inbox is succesfully opened
*/
bool NmIndicatorPlugin::showMailbox(quint64 mailboxId)
{
    NMLOG("NmIndicatorPlugin::showMailbox");
    XQServiceRequest request(
        emailInterfaceNameMailbox,
        emailOperationViewInbox,
        true);

    QList<QVariant> list;
    list.append(QVariant(mailboxId));

    request.setArguments(list);

    int returnValue(-1);
    return request.send(returnValue);
}