videocollection/videocollectionview/src/videooperatorservice_p.cpp
author hgs
Mon, 23 Aug 2010 14:27:29 +0300
changeset 55 4bfa887905cf
child 67 72c709219fcd
permissions -rw-r--r--
201033
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
55
hgs
parents:
diff changeset
     1
/*
hgs
parents:
diff changeset
     2
* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies).
hgs
parents:
diff changeset
     3
* All rights reserved.
hgs
parents:
diff changeset
     4
* This component and the accompanying materials are made available
hgs
parents:
diff changeset
     5
* under the terms of "Eclipse Public License v1.0"
hgs
parents:
diff changeset
     6
* which accompanies this distribution, and is available
hgs
parents:
diff changeset
     7
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
hgs
parents:
diff changeset
     8
*
hgs
parents:
diff changeset
     9
* Initial Contributors:
hgs
parents:
diff changeset
    10
* Nokia Corporation - initial contribution.
hgs
parents:
diff changeset
    11
*
hgs
parents:
diff changeset
    12
* Contributors:
hgs
parents:
diff changeset
    13
*
hgs
parents:
diff changeset
    14
* Description:   VideoOperatorServicePrivate class implementation.
hgs
parents:
diff changeset
    15
*
hgs
parents:
diff changeset
    16
*/
hgs
parents:
diff changeset
    17
hgs
parents:
diff changeset
    18
// Version : 
hgs
parents:
diff changeset
    19
hgs
parents:
diff changeset
    20
// INCLUDE FILES
hgs
parents:
diff changeset
    21
#include "videooperatorservice_p.h"
hgs
parents:
diff changeset
    22
#include "videocollectionviewutils.h"
hgs
parents:
diff changeset
    23
#include "videocollectioncenrepdefs.h"
hgs
parents:
diff changeset
    24
#include "videocollectiontrace.h"
hgs
parents:
diff changeset
    25
hgs
parents:
diff changeset
    26
#include <qdesktopservices.h>
hgs
parents:
diff changeset
    27
#include <qurl.h>
hgs
parents:
diff changeset
    28
#include <e32base.h>
hgs
parents:
diff changeset
    29
#include <coemain.h>
hgs
parents:
diff changeset
    30
#include <apgcli.h>
hgs
parents:
diff changeset
    31
#include <apaid.h>
hgs
parents:
diff changeset
    32
#include <apgtask.h>
hgs
parents:
diff changeset
    33
hgs
parents:
diff changeset
    34
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    35
// Constructor
hgs
parents:
diff changeset
    36
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    37
//
hgs
parents:
diff changeset
    38
VideoOperatorServicePrivate::VideoOperatorServicePrivate() :
hgs
parents:
diff changeset
    39
    mProcess(0)
hgs
parents:
diff changeset
    40
{
hgs
parents:
diff changeset
    41
    
hgs
parents:
diff changeset
    42
}
hgs
parents:
diff changeset
    43
hgs
parents:
diff changeset
    44
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    45
// Destructor
hgs
parents:
diff changeset
    46
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    47
//
hgs
parents:
diff changeset
    48
VideoOperatorServicePrivate::~VideoOperatorServicePrivate()
hgs
parents:
diff changeset
    49
{   
hgs
parents:
diff changeset
    50
    if(mProcess)
hgs
parents:
diff changeset
    51
    {
hgs
parents:
diff changeset
    52
        disconnect(mProcess, SIGNAL(finished(int, QProcess::ExitStatus)),
hgs
parents:
diff changeset
    53
                this, SLOT(processFinished(int, QProcess::ExitStatus)));
hgs
parents:
diff changeset
    54
        
hgs
parents:
diff changeset
    55
        disconnect(mProcess, SIGNAL(error(QProcess::ProcessError)), 
hgs
parents:
diff changeset
    56
                this, SLOT(processError(QProcess::ProcessError)));        
hgs
parents:
diff changeset
    57
        mProcess->close();
hgs
parents:
diff changeset
    58
    }
hgs
parents:
diff changeset
    59
    delete mProcess;
hgs
parents:
diff changeset
    60
}
hgs
parents:
diff changeset
    61
hgs
parents:
diff changeset
    62
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    63
// load
hgs
parents:
diff changeset
    64
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    65
//
hgs
parents:
diff changeset
    66
bool VideoOperatorServicePrivate::load(int titleKey, int iconKey, int serviceUriKey, int appUidKey)
hgs
parents:
diff changeset
    67
{
hgs
parents:
diff changeset
    68
    FUNC_LOG;
hgs
parents:
diff changeset
    69
    VideoCollectionViewUtils& utils = VideoCollectionViewUtils::instance();
hgs
parents:
diff changeset
    70
    
hgs
parents:
diff changeset
    71
    mTitle = utils.getCenRepStringValue(titleKey);
hgs
parents:
diff changeset
    72
    mIconResource = utils.getCenRepStringValue(iconKey);
hgs
parents:
diff changeset
    73
    mServiceUri = utils.getCenRepStringValue(serviceUriKey);
hgs
parents:
diff changeset
    74
    mApplicationUid = utils.getCenRepIntValue(appUidKey);
hgs
parents:
diff changeset
    75
    
hgs
parents:
diff changeset
    76
    // Icon is required, either service uri or application uid is required.
hgs
parents:
diff changeset
    77
    if(mIconResource.isEmpty() || (mServiceUri.isEmpty() && mApplicationUid <= 0))
hgs
parents:
diff changeset
    78
    {
hgs
parents:
diff changeset
    79
        return false;
hgs
parents:
diff changeset
    80
    }
hgs
parents:
diff changeset
    81
    
hgs
parents:
diff changeset
    82
    return true;
hgs
parents:
diff changeset
    83
}
hgs
parents:
diff changeset
    84
hgs
parents:
diff changeset
    85
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    86
// title
hgs
parents:
diff changeset
    87
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    88
//
hgs
parents:
diff changeset
    89
const QString VideoOperatorServicePrivate::title() const
hgs
parents:
diff changeset
    90
{
hgs
parents:
diff changeset
    91
    return mTitle;
hgs
parents:
diff changeset
    92
}
hgs
parents:
diff changeset
    93
hgs
parents:
diff changeset
    94
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    95
// iconResource
hgs
parents:
diff changeset
    96
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    97
//
hgs
parents:
diff changeset
    98
const QString VideoOperatorServicePrivate::iconResource() const
hgs
parents:
diff changeset
    99
{
hgs
parents:
diff changeset
   100
    return mIconResource;
hgs
parents:
diff changeset
   101
}
hgs
parents:
diff changeset
   102
hgs
parents:
diff changeset
   103
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   104
// launchService
hgs
parents:
diff changeset
   105
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   106
//
hgs
parents:
diff changeset
   107
void VideoOperatorServicePrivate::launchService()
hgs
parents:
diff changeset
   108
{
hgs
parents:
diff changeset
   109
    FUNC_LOG;
hgs
parents:
diff changeset
   110
    
hgs
parents:
diff changeset
   111
    if(!mServiceUri.isEmpty())
hgs
parents:
diff changeset
   112
    {
hgs
parents:
diff changeset
   113
        INFOQSTR_1("VideoOperatorServicePrivate::launchService() starting url: %S", mServiceUri);
hgs
parents:
diff changeset
   114
        QDesktopServices::openUrl(QUrl(mServiceUri));
hgs
parents:
diff changeset
   115
    }
hgs
parents:
diff changeset
   116
    else
hgs
parents:
diff changeset
   117
    {
hgs
parents:
diff changeset
   118
        INFO_1("VideoOperatorServicePrivate::launchService() starting application 0x%x", mApplicationUid);
hgs
parents:
diff changeset
   119
        TRAPD(err, startApplicationL(TUid::Uid(mApplicationUid)));
hgs
parents:
diff changeset
   120
        if(err)
hgs
parents:
diff changeset
   121
        {
hgs
parents:
diff changeset
   122
            INFO_1("VideoOperatorServicePrivate::launchService() failed to start, error: %d", err);
hgs
parents:
diff changeset
   123
        }
hgs
parents:
diff changeset
   124
    }
hgs
parents:
diff changeset
   125
}
hgs
parents:
diff changeset
   126
hgs
parents:
diff changeset
   127
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   128
// getApplicationFilenameL
hgs
parents:
diff changeset
   129
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   130
//
hgs
parents:
diff changeset
   131
QString VideoOperatorServicePrivate::getApplicationFilenameL(const TUid uid)
hgs
parents:
diff changeset
   132
{
hgs
parents:
diff changeset
   133
    FUNC_LOG;
hgs
parents:
diff changeset
   134
hgs
parents:
diff changeset
   135
    // TApaAppInfo size is greater then 1024 bytes
hgs
parents:
diff changeset
   136
    // so its instances should not be created on the stack.
hgs
parents:
diff changeset
   137
    TApaAppInfo* appInfo = new (ELeave) TApaAppInfo;
hgs
parents:
diff changeset
   138
    CleanupStack::PushL(appInfo);
hgs
parents:
diff changeset
   139
    RApaLsSession appArcSession;
hgs
parents:
diff changeset
   140
    User::LeaveIfError(appArcSession.Connect());
hgs
parents:
diff changeset
   141
    CleanupClosePushL<RApaLsSession>(appArcSession);
hgs
parents:
diff changeset
   142
hgs
parents:
diff changeset
   143
    User::LeaveIfError(appArcSession.GetAppInfo(*appInfo, uid));
hgs
parents:
diff changeset
   144
hgs
parents:
diff changeset
   145
    QString fullName((QChar*)appInfo->iFullName.Ptr(), appInfo->iFullName.Length()); 
hgs
parents:
diff changeset
   146
    
hgs
parents:
diff changeset
   147
    CleanupStack::PopAndDestroy(&appArcSession);
hgs
parents:
diff changeset
   148
    CleanupStack::PopAndDestroy(appInfo);
hgs
parents:
diff changeset
   149
    
hgs
parents:
diff changeset
   150
    return fullName;
hgs
parents:
diff changeset
   151
}
hgs
parents:
diff changeset
   152
hgs
parents:
diff changeset
   153
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   154
// bringApplicationToForeground
hgs
parents:
diff changeset
   155
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   156
//
hgs
parents:
diff changeset
   157
bool VideoOperatorServicePrivate::bringApplicationToForeground(const TUid uid)
hgs
parents:
diff changeset
   158
{
hgs
parents:
diff changeset
   159
    FUNC_LOG;
hgs
parents:
diff changeset
   160
    
hgs
parents:
diff changeset
   161
    CCoeEnv* coe = CCoeEnv::Static();
hgs
parents:
diff changeset
   162
    bool ret = false;
hgs
parents:
diff changeset
   163
    if(coe)
hgs
parents:
diff changeset
   164
    {
hgs
parents:
diff changeset
   165
        TApaTaskList taskList(coe->WsSession());
hgs
parents:
diff changeset
   166
        TApaTask task(taskList.FindApp(uid));
hgs
parents:
diff changeset
   167
        
hgs
parents:
diff changeset
   168
        if(task.Exists())
hgs
parents:
diff changeset
   169
        {
hgs
parents:
diff changeset
   170
            INFO("VideoOperatorServicePrivate::processFinished() task found.");
hgs
parents:
diff changeset
   171
            task.BringToForeground();
hgs
parents:
diff changeset
   172
            ret = true;
hgs
parents:
diff changeset
   173
        }
hgs
parents:
diff changeset
   174
    }
hgs
parents:
diff changeset
   175
    return ret;
hgs
parents:
diff changeset
   176
}
hgs
parents:
diff changeset
   177
hgs
parents:
diff changeset
   178
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   179
// startApplicationL
hgs
parents:
diff changeset
   180
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   181
//
hgs
parents:
diff changeset
   182
void VideoOperatorServicePrivate::startApplicationL(const TUid uid)
hgs
parents:
diff changeset
   183
{
hgs
parents:
diff changeset
   184
    FUNC_LOG;
hgs
parents:
diff changeset
   185
    
hgs
parents:
diff changeset
   186
    // Process handle already exists, try to bring app to foreground.
hgs
parents:
diff changeset
   187
    if(mProcess)
hgs
parents:
diff changeset
   188
    {
hgs
parents:
diff changeset
   189
        if(bringApplicationToForeground(uid))
hgs
parents:
diff changeset
   190
        {
hgs
parents:
diff changeset
   191
            // App brought to foreground, all done.
hgs
parents:
diff changeset
   192
            return;
hgs
parents:
diff changeset
   193
        }
hgs
parents:
diff changeset
   194
        // Application is not running, cleanup previous process.
hgs
parents:
diff changeset
   195
        disconnect(mProcess, SIGNAL(finished(int, QProcess::ExitStatus)),
hgs
parents:
diff changeset
   196
                this, SLOT(processFinished(int, QProcess::ExitStatus)));
hgs
parents:
diff changeset
   197
        
hgs
parents:
diff changeset
   198
        disconnect(mProcess, SIGNAL(error(QProcess::ProcessError)), 
hgs
parents:
diff changeset
   199
                this, SLOT(processError(QProcess::ProcessError)));
hgs
parents:
diff changeset
   200
hgs
parents:
diff changeset
   201
        delete mProcess;
hgs
parents:
diff changeset
   202
        mProcess = 0;
hgs
parents:
diff changeset
   203
    }
hgs
parents:
diff changeset
   204
    
hgs
parents:
diff changeset
   205
    // Create new process and start it.
hgs
parents:
diff changeset
   206
    mProcess = new QProcess();
hgs
parents:
diff changeset
   207
hgs
parents:
diff changeset
   208
    if(!connect(mProcess, SIGNAL(finished(int, QProcess::ExitStatus)),
hgs
parents:
diff changeset
   209
            this, SLOT(processFinished(int, QProcess::ExitStatus)), Qt::UniqueConnection) ||
hgs
parents:
diff changeset
   210
       !connect(mProcess, SIGNAL(error(QProcess::ProcessError)), 
hgs
parents:
diff changeset
   211
            this, SLOT(processError(QProcess::ProcessError)), Qt::UniqueConnection))
hgs
parents:
diff changeset
   212
    {
hgs
parents:
diff changeset
   213
        INFO("VideoOperatorServicePrivate::startApplicationL() failed to connect signals");
hgs
parents:
diff changeset
   214
        User::Leave(KErrGeneral);
hgs
parents:
diff changeset
   215
    }
hgs
parents:
diff changeset
   216
hgs
parents:
diff changeset
   217
    QString appName = getApplicationFilenameL(uid);
hgs
parents:
diff changeset
   218
    if(!appName.isEmpty())
hgs
parents:
diff changeset
   219
    {
hgs
parents:
diff changeset
   220
        mProcess->start(appName);
hgs
parents:
diff changeset
   221
    }
hgs
parents:
diff changeset
   222
}
hgs
parents:
diff changeset
   223
hgs
parents:
diff changeset
   224
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   225
// processFinished
hgs
parents:
diff changeset
   226
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   227
//
hgs
parents:
diff changeset
   228
void VideoOperatorServicePrivate::processFinished(int exitCode, QProcess::ExitStatus exitStatus)
hgs
parents:
diff changeset
   229
{
hgs
parents:
diff changeset
   230
    Q_UNUSED(exitCode);
hgs
parents:
diff changeset
   231
    Q_UNUSED(exitStatus);
hgs
parents:
diff changeset
   232
    INFO_2("VideoOperatorServicePrivate::processFinished() code: %d, status: %d", exitCode, exitStatus);
hgs
parents:
diff changeset
   233
}
hgs
parents:
diff changeset
   234
hgs
parents:
diff changeset
   235
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   236
// processError
hgs
parents:
diff changeset
   237
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   238
//
hgs
parents:
diff changeset
   239
void VideoOperatorServicePrivate::processError(QProcess::ProcessError error)
hgs
parents:
diff changeset
   240
{
hgs
parents:
diff changeset
   241
    Q_UNUSED(error);
hgs
parents:
diff changeset
   242
    INFO_1("VideoOperatorServicePrivate::processError() error: %d", error);
hgs
parents:
diff changeset
   243
}
hgs
parents:
diff changeset
   244
hgs
parents:
diff changeset
   245
// End of file.