/*
 * Copyright (c) 2009 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: Utility class for univiewer.
 *
 */

#include "univiewerutils.h"

// SYSTEM INCLUDES
#include <xqaiwrequest.h>
#include <xqrequestinfo.h>
#include <xqappmgr.h>
#include <hbglobal.h>

// USER INCLUDES
#include "msgcontactsutil.h"

// LOCAL CONSTANTS
#define LOC_TITLE   hbTrId("txt_messaging_title_messaging")

const QString IMAGE_MIMETYPE("image");
const QString AUDIO_MIMETYPE("audio");
const QString VCARD_MIMETYPE("text/X-vCard");
const QString VIDEO_MIMETYPE("video");

//---------------------------------------------------------------
// UniViewerUtils::UniViewerUtils
// @see header file
//---------------------------------------------------------------
UniViewerUtils::UniViewerUtils(QObject *parent) :
    QObject(parent)
{
}

//---------------------------------------------------------------
// UniViewerUtils::~UniViewerUtils
// @see header file
//---------------------------------------------------------------
UniViewerUtils::~UniViewerUtils()
{
}

//---------------------------------------------------------------
// UniViewerUtils::addAttachmentWidget
// @see header file
//---------------------------------------------------------------
void UniViewerUtils::launchContentViewer(const QString &mimeType, const QString &filePath)
{
    if (mimeType.contains(IMAGE_MIMETYPE) || mimeType.contains(AUDIO_MIMETYPE) || 
        mimeType.contains(VIDEO_MIMETYPE)) {
        launchViaSharableFile(filePath);
    }
    else if (mimeType.contains(VCARD_MIMETYPE, Qt::CaseInsensitive)) {
        MsgContactsUtil::launchVCardViewer(filePath);
    }
}

//---------------------------------------------------------------
// UniViewerUtils::handleOk
// @see header file
//---------------------------------------------------------------
void UniViewerUtils::handleOk(const QVariant& result)
{
    emit requestOk(result);
}

//---------------------------------------------------------------
// UniViewerUtils::handleError
// @see header file
//---------------------------------------------------------------
void UniViewerUtils::handleError(int errorCode, const QString& errorMessage)
{
    emit requestError(errorCode, errorMessage);
}

//---------------------------------------------------------------
// UniViewerUtils::launchViaSharableFile
// @see header file
//---------------------------------------------------------------
void UniViewerUtils::launchViaSharableFile(const QString &filePath)
{
    XQSharableFile sf;
    XQAiwRequest* request = 0;

    if (!sf.open(filePath)) {
        return;
    }

    // Get handlers
    XQApplicationManager appManager;
    QList<XQAiwInterfaceDescriptor> fileHandlers = appManager.list(sf);
    if (fileHandlers.count() > 0) {
        XQAiwInterfaceDescriptor d = fileHandlers.first();
        request = appManager.create(sf, d);

        if (!request) {
            sf.close();
            return;
        }
    }
    else {
        sf.close();
        return;
    }

    // Result handlers
    connect(request, SIGNAL(requestOk(const QVariant&)), this, SLOT(handleOk(const QVariant&)),
        Qt::UniqueConnection);
    connect(request, SIGNAL(requestError(int,const QString&)), this,
        SLOT(handleError(int,const QString&)), Qt::UniqueConnection);

    request->setEmbedded(true);
    request->setSynchronous(true);

    // Fill args
    QList<QVariant> args;
    args << qVariantFromValue(sf);
    request->setArguments(args);

    // Fill headers
    QString key("WindowTitle");
    QVariant value(QString(LOC_TITLE));
    XQRequestInfo info;
    info.setInfo(key, value);
    request->setInfo(info);

    request->send();

    // Cleanup
    sf.close();
    delete request;
}

//EOF
