qthighway/xqserviceutil/src/xqserviceutil.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Fri, 17 Sep 2010 08:34:25 +0300
changeset 26 3d09643def13
parent 24 9d760f716ca8
child 27 6bfad47013df
permissions -rw-r--r--
Revision: 201035 Kit: 201037

/*
* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
* All rights reserved.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, version 2.1 of the License.
* 
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program.  If not, 
* see "http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html/".
*
* Description:                                                         
*
*/

#include "xqservicelog.h"
#include "xqrequestutil.h"
#include "xqserviceutil.h"

#include <QCoreApplication>
#include <QStringList>

#include <apgcli.h>
#include <apacmdln.h>
#include <apgtask.h>
#include <apacmdln.h>
#include <eikenv.h>


// ======== LOCAL FUNCTIONS ========
static bool isKeySet(const QString &key)
{
    XQSERVICE_DEBUG_PRINT("XQServiceUtil isKeySet %s", qPrintable(key));
    QStringList args = QCoreApplication::arguments();
    foreach (QString arg, args)
    {
        XQSERVICE_DEBUG_PRINT("arg: %s", qPrintable(arg));
        if (!arg.compare(key,Qt::CaseInsensitive))
        {
            XQSERVICE_DEBUG_PRINT("Key set");
            return true;
        }
    }
    XQSERVICE_DEBUG_PRINT("Key not set");
    return false;
    
}

static bool isKeySet(int argc, char **argv, const QString &key)
{
    XQSERVICE_DEBUG_PRINT("XQServiceUtil argv isKeySet %s", qPrintable(key));
    for (int i=0; i < argc; i++)
    {
        QString arg(argv[i]);
        XQSERVICE_DEBUG_PRINT("arg: %s", qPrintable(arg));
        if (!arg.compare(key,Qt::CaseInsensitive)) {
            XQSERVICE_DEBUG_PRINT("Key set");
            return true;
        }
    }
    XQSERVICE_DEBUG_PRINT("Key not set");
    return false;

}



static QString keyValue(const QString &key)
{
    XQSERVICE_DEBUG_PRINT("XQServiceUtil keyValue %s", qPrintable(key));
    QString ret;
    QStringList args = QCoreApplication::arguments();
    foreach (QString arg, args) {
        if (arg.contains(key,Qt::CaseInsensitive)) {
            QStringList l= arg.split("=");
            ret = l.value(1);
        }
    }
    XQSERVICE_DEBUG_PRINT("key value=%s", qPrintable(ret));
    return ret;
}


static QString keyValue(int argc, char **argv, const QString &key)
{
    XQSERVICE_DEBUG_PRINT("XQServiceUtil argv keyValue %s", qPrintable(key));
    QString ret;
    for (int i=0; i < argc; i++)
    {
        QString arg(argv[i]);
        XQSERVICE_DEBUG_PRINT("arg: %s", qPrintable(arg));
        if (arg.contains(key,Qt::CaseInsensitive)) {
            QStringList l= arg.split("=");
            ret = l.value(1);
        }
    }
    XQSERVICE_DEBUG_PRINT("key value=%s", qPrintable(ret));
    return ret;
}

// ======== MEMBER FUNCTIONS ========

/*!
    Send service application to backround in asynchronous service call.
    \param value Defines should application be send to backround (if set to true)
                 or to be brought back to foreground (if set to false)
*/
void XQServiceUtil::toBackground( bool value )
{
    XQSERVICE_DEBUG_PRINT("XQServiceUtil::toBackground");
    XQSERVICE_DEBUG_PRINT("value: %d", value);
    RWsSession ws;
    int sid = RProcess().SecureId().iId;  // Assumes UID3 == SID !!!
    XQSERVICE_DEBUG_PRINT("sid: %d", sid);
    if (ws.Connect() == KErrNone) {
        XQSERVICE_DEBUG_PRINT("Connected to window server");
        TApaTaskList tasklist(ws);
        TApaTask task = tasklist.FindApp(TUid::Uid(sid));
        XQSERVICE_DEBUG_PRINT("task.Exists(): %x", task.Exists());
        if (task.Exists()) {
            if (value) {
                task.SendToBackground();
            }
            else {
                task.BringToForeground();
            }
        }

        ws.Close();
    }
}

/*!
    Check if service application is being launched as an embedded application.
    This information is passed in the command line arguments to started service application.
    \return true if service application is as an embedded application, otherwise false.
*/
bool XQServiceUtil::isEmbedded()
{
    XQSERVICE_DEBUG_PRINT("XQServiceUtil::isEmbedded");
    return isKeySet(QString::fromLatin1(XQServiceUtils::StartupArgEmbedded));
}

/*!
    Check if service application is being launched as service (other include stand-alone launch
    or activity launch). This information is valid upon service application launch. It is passed
    in the command line arguments so can be used already in main() function before initializing any UI. 
    \return true if launched as service, false otherwise (lanched as stand-alone or activity or other mode).
*/
bool XQServiceUtil::isService()
{
    XQSERVICE_DEBUG_PRINT("XQServiceUtil::isService");
    return isKeySet(QString::fromLatin1(XQServiceUtils::StartupArgService));
}

/*!
    Returns the interface name part of the full service name to be called later.
    This information is valid upon service application launch. It is passed
    in the command line arguments so can be used already in main() function before
    initializing any UI. For example for initializing only necessary components,
    for generating interface specific UI etc.
    \return Interface name part of the full service name.
    - \b Note: The service name part should be known already by the service provider implicitly.
*/
QString XQServiceUtil::interfaceName()
{
    XQSERVICE_DEBUG_PRINT("XQServiceUtil::interfaceName");
    return keyValue(QString::fromLatin1(XQServiceUtils::StartupArgInterfaceName));
}

/*!
    Returns the operation name within the interfaceName() to be called later.
    This information is valid upon service application launch. It is passed
    in the command line arguments so can be used already in main() function before
    initializing any UI. For example for initializing only necessary components
    for the coming slot call.
    \return Operation name within the interfaceName()
*/
QString XQServiceUtil::operationName()
{
    XQSERVICE_DEBUG_PRINT("XQServiceUtil::operationName");
    return keyValue(QString::fromLatin1(XQServiceUtils::StartupArgOperationName));
}

/*!
    
*/
QString XQServiceUtil::serviceName()
{
    XQSERVICE_DEBUG_PRINT("XQServiceUtil::serviceName");
    return keyValue(QString::fromLatin1(XQServiceUtils::StartupArgServiceName));
}

/*!
    Check if service application is being launched as an embedded application,
    based on passed \a argv arguments.
    \param argc Number of command line arguments.
    \param argv List of command line arguments.
    \return true if service application is as an embedded application, otherwise false.
    \sa isEmbedded()
*/
bool XQServiceUtil::isEmbedded(int argc, char **argv)
{
    XQSERVICE_DEBUG_PRINT("XQServiceUtil::isEmbedded argv");
    return isKeySet(argc,argv,QString::fromLatin1(XQServiceUtils::StartupArgEmbedded));
}

/*!
    Check if service application is being launched as service (other include stand-alone launch
    or activity launch), based on passed \a argv arguments.
    \param argc Number of command line arguments.
    \param argv List of command line arguments.
    \return true if launched as service, false otherwise (lanched as stand-alone or activity or other mode).
    \sa isService()
*/
bool XQServiceUtil::isService(int argc, char **argv)
{
    XQSERVICE_DEBUG_PRINT("XQServiceUtil::isService argv");
    return isKeySet(argc,argv,QString::fromLatin1(XQServiceUtils::StartupArgService));
}

/*!
    Returns the interface name part of the full service name to be called later,
    based on passed \a argv arguments.
    \param argc Number of command line arguments.
    \param argv List of command line arguments.
    \return Interface name part of the full service name.
    \sa interfaceName()
*/
QString XQServiceUtil::interfaceName(int argc, char **argv)
{
    XQSERVICE_DEBUG_PRINT("XQServiceUtil::interfaceName");
    return keyValue(argc,argv,QString::fromLatin1(XQServiceUtils::StartupArgInterfaceName));
}

/*!
    Returns the operation name within the interfaceName() to be called later,
    based on passed \a argv arguments.
    \param argc Number of command line arguments.
    \param argv List of command line arguments.
    \return Operation name within the interfaceName()
    \sa operationName()
*/
QString XQServiceUtil::operationName(int argc, char **argv)
{
    XQSERVICE_DEBUG_PRINT("XQServiceUtil::operationName argv");
    return keyValue(argc,argv,QString::fromLatin1(XQServiceUtils::StartupArgOperationName));
}

/*!
    
*/
QString XQServiceUtil::serviceName(int argc, char **argv)
{
    XQSERVICE_DEBUG_PRINT("XQServiceUtil::serviceName argv");
    return keyValue(argc,argv,QString::fromLatin1(XQServiceUtils::StartupArgServiceName));
}

static const quint32 CrcTab32[256] = {
        0x00000000UL, 0x77073096UL, 0xee0e612cUL, 0x990951baUL,
        0x076dc419UL, 0x706af48fUL, 0xe963a535UL, 0x9e6495a3UL,
        0x0edb8832UL, 0x79dcb8a4UL, 0xe0d5e91eUL, 0x97d2d988UL,
        0x09b64c2bUL, 0x7eb17cbdUL, 0xe7b82d07UL, 0x90bf1d91UL,
        0x1db71064UL, 0x6ab020f2UL, 0xf3b97148UL, 0x84be41deUL,
        0x1adad47dUL, 0x6ddde4ebUL, 0xf4d4b551UL, 0x83d385c7UL,
        0x136c9856UL, 0x646ba8c0UL, 0xfd62f97aUL, 0x8a65c9ecUL,
        0x14015c4fUL, 0x63066cd9UL, 0xfa0f3d63UL, 0x8d080df5UL,
        0x3b6e20c8UL, 0x4c69105eUL, 0xd56041e4UL, 0xa2677172UL,
        0x3c03e4d1UL, 0x4b04d447UL, 0xd20d85fdUL, 0xa50ab56bUL,
        0x35b5a8faUL, 0x42b2986cUL, 0xdbbbc9d6UL, 0xacbcf940UL,
        0x32d86ce3UL, 0x45df5c75UL, 0xdcd60dcfUL, 0xabd13d59UL,
        0x26d930acUL, 0x51de003aUL, 0xc8d75180UL, 0xbfd06116UL,
        0x21b4f4b5UL, 0x56b3c423UL, 0xcfba9599UL, 0xb8bda50fUL,
        0x2802b89eUL, 0x5f058808UL, 0xc60cd9b2UL, 0xb10be924UL,
        0x2f6f7c87UL, 0x58684c11UL, 0xc1611dabUL, 0xb6662d3dUL,
        0x76dc4190UL, 0x01db7106UL, 0x98d220bcUL, 0xefd5102aUL,
        0x71b18589UL, 0x06b6b51fUL, 0x9fbfe4a5UL, 0xe8b8d433UL,
        0x7807c9a2UL, 0x0f00f934UL, 0x9609a88eUL, 0xe10e9818UL,
        0x7f6a0dbbUL, 0x086d3d2dUL, 0x91646c97UL, 0xe6635c01UL,
        0x6b6b51f4UL, 0x1c6c6162UL, 0x856530d8UL, 0xf262004eUL,
        0x6c0695edUL, 0x1b01a57bUL, 0x8208f4c1UL, 0xf50fc457UL,
        0x65b0d9c6UL, 0x12b7e950UL, 0x8bbeb8eaUL, 0xfcb9887cUL,
        0x62dd1ddfUL, 0x15da2d49UL, 0x8cd37cf3UL, 0xfbd44c65UL,
        0x4db26158UL, 0x3ab551ceUL, 0xa3bc0074UL, 0xd4bb30e2UL,
        0x4adfa541UL, 0x3dd895d7UL, 0xa4d1c46dUL, 0xd3d6f4fbUL,
        0x4369e96aUL, 0x346ed9fcUL, 0xad678846UL, 0xda60b8d0UL,
        0x44042d73UL, 0x33031de5UL, 0xaa0a4c5fUL, 0xdd0d7cc9UL,
        0x5005713cUL, 0x270241aaUL, 0xbe0b1010UL, 0xc90c2086UL,
        0x5768b525UL, 0x206f85b3UL, 0xb966d409UL, 0xce61e49fUL,
        0x5edef90eUL, 0x29d9c998UL, 0xb0d09822UL, 0xc7d7a8b4UL,
        0x59b33d17UL, 0x2eb40d81UL, 0xb7bd5c3bUL, 0xc0ba6cadUL,
        0xedb88320UL, 0x9abfb3b6UL, 0x03b6e20cUL, 0x74b1d29aUL,
        0xead54739UL, 0x9dd277afUL, 0x04db2615UL, 0x73dc1683UL,
        0xe3630b12UL, 0x94643b84UL, 0x0d6d6a3eUL, 0x7a6a5aa8UL,
        0xe40ecf0bUL, 0x9309ff9dUL, 0x0a00ae27UL, 0x7d079eb1UL,
        0xf00f9344UL, 0x8708a3d2UL, 0x1e01f268UL, 0x6906c2feUL,
        0xf762575dUL, 0x806567cbUL, 0x196c3671UL, 0x6e6b06e7UL,
        0xfed41b76UL, 0x89d32be0UL, 0x10da7a5aUL, 0x67dd4accUL,
        0xf9b9df6fUL, 0x8ebeeff9UL, 0x17b7be43UL, 0x60b08ed5UL,
        0xd6d6a3e8UL, 0xa1d1937eUL, 0x38d8c2c4UL, 0x4fdff252UL,
        0xd1bb67f1UL, 0xa6bc5767UL, 0x3fb506ddUL, 0x48b2364bUL,
        0xd80d2bdaUL, 0xaf0a1b4cUL, 0x36034af6UL, 0x41047a60UL,
        0xdf60efc3UL, 0xa867df55UL, 0x316e8eefUL, 0x4669be79UL,
        0xcb61b38cUL, 0xbc66831aUL, 0x256fd2a0UL, 0x5268e236UL,
        0xcc0c7795UL, 0xbb0b4703UL, 0x220216b9UL, 0x5505262fUL,
        0xc5ba3bbeUL, 0xb2bd0b28UL, 0x2bb45a92UL, 0x5cb36a04UL,
        0xc2d7ffa7UL, 0xb5d0cf31UL, 0x2cd99e8bUL, 0x5bdeae1dUL,
        0x9b64c2b0UL, 0xec63f226UL, 0x756aa39cUL, 0x026d930aUL,
        0x9c0906a9UL, 0xeb0e363fUL, 0x72076785UL, 0x05005713UL,
        0x95bf4a82UL, 0xe2b87a14UL, 0x7bb12baeUL, 0x0cb61b38UL,
        0x92d28e9bUL, 0xe5d5be0dUL, 0x7cdcefb7UL, 0x0bdbdf21UL,
        0x86d3d2d4UL, 0xf1d4e242UL, 0x68ddb3f8UL, 0x1fda836eUL,
        0x81be16cdUL, 0xf6b9265bUL, 0x6fb077e1UL, 0x18b74777UL,
        0x88085ae6UL, 0xff0f6a70UL, 0x66063bcaUL, 0x11010b5cUL,
        0x8f659effUL, 0xf862ae69UL, 0x616bffd3UL, 0x166ccf45UL,
        0xa00ae278UL, 0xd70dd2eeUL, 0x4e048354UL, 0x3903b3c2UL,
        0xa7672661UL, 0xd06016f7UL, 0x4969474dUL, 0x3e6e77dbUL,
        0xaed16a4aUL, 0xd9d65adcUL, 0x40df0b66UL, 0x37d83bf0UL,
        0xa9bcae53UL, 0xdebb9ec5UL, 0x47b2cf7fUL, 0x30b5ffe9UL,
        0xbdbdf21cUL, 0xcabac28aUL, 0x53b39330UL, 0x24b4a3a6UL,
        0xbad03605UL, 0xcdd70693UL, 0x54de5729UL, 0x23d967bfUL,
        0xb3667a2eUL, 0xc4614ab8UL, 0x5d681b02UL, 0x2a6f2b94UL,
        0xb40bbe37UL, 0xc30c8ea1UL, 0x5a05df1bUL, 0x2d02ef8dUL
};

quint32 XQServiceUtil::serviceIdFromName(const char *serviceName) 
{
    XQSERVICE_DEBUG_PRINT("XQServiceUtil::serviceIdFromName");
    const char* p = serviceName;
    quint32 crc = 0xffffffffUL;
    while ((*p)!=0) {
        crc = (crc >> 8)  ^ CrcTab32[(crc ^ *p) & 0xff];
        p++;
    }  
    quint32 ret = 0xffffffffUL - crc; 
    XQSERVICE_DEBUG_PRINT("XQServiceUtil::serviceIdFromName: Crc calculated for: [%s]. Value is: %d.", serviceName, ret);
    return ret; 
}