contentstorage/cahandler/app/src/caapphandler.cpp
author hgs
Mon, 13 Sep 2010 13:26:33 +0300
changeset 116 305818acdca4
parent 98 d2f833ab7940
child 119 50e220be30d1
permissions -rw-r--r--
201036
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
88
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:  ?Description
hgs
parents:
diff changeset
    15
 *
hgs
parents:
diff changeset
    16
 */
hgs
parents:
diff changeset
    17
96
hgs
parents: 94
diff changeset
    18
#include <QString>
hgs
parents: 94
diff changeset
    19
#include <e32base.h>
88
hgs
parents:
diff changeset
    20
#include <w32std.h>
hgs
parents:
diff changeset
    21
#include <apgtask.h>
hgs
parents:
diff changeset
    22
#include <apgcli.h>
hgs
parents:
diff changeset
    23
#include <eikenv.h>
hgs
parents:
diff changeset
    24
#include <eikappui.h>
hgs
parents:
diff changeset
    25
#include <vwsdef.h>
hgs
parents:
diff changeset
    26
#include <AknDef.h>
hgs
parents:
diff changeset
    27
#include <AknTaskList.h>
hgs
parents:
diff changeset
    28
92
hgs
parents: 89
diff changeset
    29
#include <usif/usifcommon.h>
hgs
parents: 89
diff changeset
    30
#include <usif/scr/scr.h>
116
hgs
parents: 98
diff changeset
    31
#include <usif/usiferror.h>
92
hgs
parents: 89
diff changeset
    32
96
hgs
parents: 94
diff changeset
    33
#include <cadefs.h>
hgs
parents: 94
diff changeset
    34
#include <caentry.h>
hgs
parents: 94
diff changeset
    35
88
hgs
parents:
diff changeset
    36
#include "caapphandler.h"
hgs
parents:
diff changeset
    37
#include "cainnerentry.h"
92
hgs
parents: 89
diff changeset
    38
#include "causifuninstalloperation.h"
hgs
parents: 89
diff changeset
    39
#include "catasklist.h"
88
hgs
parents:
diff changeset
    40
#include "cautils.h"
96
hgs
parents: 94
diff changeset
    41
#include "caclient_defines.h"
88
hgs
parents:
diff changeset
    42
#include "cadef.h"
hgs
parents:
diff changeset
    43
92
hgs
parents: 89
diff changeset
    44
using namespace Usif;
88
hgs
parents:
diff changeset
    45
96
hgs
parents: 94
diff changeset
    46
static const char caTypeApp[] = "application";
hgs
parents: 94
diff changeset
    47
static const char caTypePackage[] = "package";
hgs
parents: 94
diff changeset
    48
static const char caTypeWidget[] = "widget";
hgs
parents: 94
diff changeset
    49
static const char caAttrView[] = "view";
hgs
parents: 94
diff changeset
    50
static const char caCmdClose[] = "close";
hgs
parents: 94
diff changeset
    51
static const char caAttrWindowGroupId[] = "window_group_id";
hgs
parents: 94
diff changeset
    52
static const char caAttrComponentId[] = "component_id";
88
hgs
parents:
diff changeset
    53
98
hgs
parents: 96
diff changeset
    54
/*!
hgs
parents: 96
diff changeset
    55
 *  Command handler for application entries.
hgs
parents: 96
diff changeset
    56
 *
hgs
parents: 96
diff changeset
    57
 *  \lib caclient.lib
hgs
parents: 96
diff changeset
    58
 */
hgs
parents: 96
diff changeset
    59
hgs
parents: 96
diff changeset
    60
/*!
hgs
parents: 96
diff changeset
    61
 * Constructor.
hgs
parents: 96
diff changeset
    62
 */
96
hgs
parents: 94
diff changeset
    63
CaAppHandler::CaAppHandler(QObject *parent):
hgs
parents: 94
diff changeset
    64
    iEikEnv(CEikonEnv::Static()),
hgs
parents: 94
diff changeset
    65
    iUsifUninstallOperation(NULL)
88
hgs
parents:
diff changeset
    66
{
96
hgs
parents: 94
diff changeset
    67
    Q_UNUSED(parent);
88
hgs
parents:
diff changeset
    68
}
hgs
parents:
diff changeset
    69
98
hgs
parents: 96
diff changeset
    70
/*!
hgs
parents: 96
diff changeset
    71
 * Destructor.
hgs
parents: 96
diff changeset
    72
 */
96
hgs
parents: 94
diff changeset
    73
CaAppHandler::~CaAppHandler()
hgs
parents: 94
diff changeset
    74
{
hgs
parents: 94
diff changeset
    75
    delete iUsifUninstallOperation;
hgs
parents: 94
diff changeset
    76
}
hgs
parents: 94
diff changeset
    77
98
hgs
parents: 96
diff changeset
    78
/*!
hgs
parents: 96
diff changeset
    79
 * Execute a given command.
hgs
parents: 96
diff changeset
    80
 * \param entry a reference to a CaEntry instance.
hgs
parents: 96
diff changeset
    81
 * \param command a given command.
116
hgs
parents: 98
diff changeset
    82
 * \param receiver a QObject class with slot to invoke.
hgs
parents: 98
diff changeset
    83
 * \param member a slot to invoke.
98
hgs
parents: 96
diff changeset
    84
 * \retval an error code.
hgs
parents: 96
diff changeset
    85
 */
116
hgs
parents: 98
diff changeset
    86
int CaAppHandler::execute(const CaEntry &entry, const QString &command,
hgs
parents: 98
diff changeset
    87
        QObject* receiver, const char* member)
88
hgs
parents:
diff changeset
    88
{
116
hgs
parents: 98
diff changeset
    89
    if ( receiver && member ) {
hgs
parents: 98
diff changeset
    90
        connect( this, SIGNAL(uninstallFailed(int)), receiver, member, Qt::UniqueConnection );
hgs
parents: 98
diff changeset
    91
    }
hgs
parents: 98
diff changeset
    92
    
96
hgs
parents: 94
diff changeset
    93
    int result(KErrGeneral);
hgs
parents: 94
diff changeset
    94
    if (command == caCmdOpen && entry.entryTypeName() == caTypeApp) {
hgs
parents: 94
diff changeset
    95
        QString viewIdValue = entry.attribute(caAttrView);
hgs
parents: 94
diff changeset
    96
        bool viewIdIsCorrect(true);
hgs
parents: 94
diff changeset
    97
        int viewId(-1);
hgs
parents: 94
diff changeset
    98
        if (!viewIdValue.isNull()) {
hgs
parents: 94
diff changeset
    99
            viewId = viewIdValue.toInt(&viewIdIsCorrect, 0);
hgs
parents: 94
diff changeset
   100
        }
hgs
parents: 94
diff changeset
   101
        if (viewIdIsCorrect) {
hgs
parents: 94
diff changeset
   102
            QString uidValue =
hgs
parents: 94
diff changeset
   103
                entry.attribute(APPLICATION_UID_ATTRIBUTE_NAME);
hgs
parents: 94
diff changeset
   104
            int uid = uidValue.toInt();
hgs
parents: 94
diff changeset
   105
            TRAP(result, launchApplicationL(TUid::Uid(uid), viewId));
hgs
parents: 94
diff changeset
   106
        }
hgs
parents: 94
diff changeset
   107
    } else if (command == caCmdClose && entry.entryTypeName() == caTypeApp ) {
hgs
parents: 94
diff changeset
   108
        QString windowGroupId = entry.attribute(caAttrWindowGroupId);
hgs
parents: 94
diff changeset
   109
        if (!windowGroupId.isNull()) {
hgs
parents: 94
diff changeset
   110
            result = closeApplication(entry.flags(), windowGroupId.toInt());
hgs
parents: 94
diff changeset
   111
        }
hgs
parents: 94
diff changeset
   112
    } else if (command == caCmdRemove) {
hgs
parents: 94
diff changeset
   113
        QString componentId(entry.attribute(caAttrComponentId));
hgs
parents: 94
diff changeset
   114
        result = handleRemove(entry.flags(),
hgs
parents: 94
diff changeset
   115
            entry.entryTypeName(),
hgs
parents: 94
diff changeset
   116
            componentId);
hgs
parents: 94
diff changeset
   117
    } else {
hgs
parents: 94
diff changeset
   118
        result = KErrNotSupported;
hgs
parents: 94
diff changeset
   119
    }
hgs
parents: 94
diff changeset
   120
hgs
parents: 94
diff changeset
   121
    return result;
88
hgs
parents:
diff changeset
   122
}
hgs
parents:
diff changeset
   123
98
hgs
parents: 96
diff changeset
   124
/*!
hgs
parents: 96
diff changeset
   125
 * Launch application
hgs
parents: 96
diff changeset
   126
 * \param uid UID of the application to launch.
hgs
parents: 96
diff changeset
   127
 * \param viewId id of the view the application is to start in.
hgs
parents: 96
diff changeset
   128
 */
hgs
parents: 96
diff changeset
   129
void CaAppHandler::launchApplicationL(const TUid uid, TInt viewId)
88
hgs
parents:
diff changeset
   130
{
98
hgs
parents: 96
diff changeset
   131
    if (viewId > 0 && iEikEnv) {
hgs
parents: 96
diff changeset
   132
        TVwsViewId view(uid, TUid::Uid(viewId));
89
hgs
parents: 88
diff changeset
   133
        iEikEnv->EikAppUi()->ActivateViewL( view );
98
hgs
parents: 96
diff changeset
   134
    } else {
89
hgs
parents: 88
diff changeset
   135
        RWsSession wsSession;
98
hgs
parents: 96
diff changeset
   136
        User::LeaveIfError(wsSession.Connect());
hgs
parents: 96
diff changeset
   137
        CleanupClosePushL<RWsSession>(wsSession);
89
hgs
parents: 88
diff changeset
   138
98
hgs
parents: 96
diff changeset
   139
        CCaTaskList* taskList = CCaTaskList::NewLC(wsSession);
hgs
parents: 96
diff changeset
   140
        TApaTask task = taskList->FindRootApp(uid);
hgs
parents: 96
diff changeset
   141
        CleanupStack::PopAndDestroy(taskList);
89
hgs
parents: 88
diff changeset
   142
98
hgs
parents: 96
diff changeset
   143
        if (task.Exists()) {
89
hgs
parents: 88
diff changeset
   144
            task.BringToForeground();
98
hgs
parents: 96
diff changeset
   145
        } else {
92
hgs
parents: 89
diff changeset
   146
            // TApaAppInfo size is greater then 1024 bytes
hgs
parents: 89
diff changeset
   147
            // so its instances should not be created on the stack.
98
hgs
parents: 96
diff changeset
   148
            TApaAppInfo* appInfo = new(ELeave) TApaAppInfo;
hgs
parents: 96
diff changeset
   149
            CleanupStack::PushL(appInfo);
89
hgs
parents: 88
diff changeset
   150
            TApaAppCapabilityBuf capabilityBuf;
hgs
parents: 88
diff changeset
   151
            RApaLsSession appArcSession;
98
hgs
parents: 96
diff changeset
   152
            User::LeaveIfError(appArcSession.Connect());
hgs
parents: 96
diff changeset
   153
            CleanupClosePushL<RApaLsSession>(appArcSession);
89
hgs
parents: 88
diff changeset
   154
98
hgs
parents: 96
diff changeset
   155
            User::LeaveIfError(appArcSession.GetAppInfo(*appInfo, uid));
hgs
parents: 96
diff changeset
   156
            User::LeaveIfError(appArcSession.GetAppCapability(
hgs
parents: 96
diff changeset
   157
               capabilityBuf, uid));
89
hgs
parents: 88
diff changeset
   158
hgs
parents: 88
diff changeset
   159
            TApaAppCapability &caps = capabilityBuf();
hgs
parents: 88
diff changeset
   160
            CApaCommandLine *cmdLine = CApaCommandLine::NewLC();
98
hgs
parents: 96
diff changeset
   161
            cmdLine->SetExecutableNameL(appInfo->iFullName);
hgs
parents: 96
diff changeset
   162
hgs
parents: 96
diff changeset
   163
            if (caps.iLaunchInBackground) {
hgs
parents: 96
diff changeset
   164
                cmdLine->SetCommandL(EApaCommandBackground);
hgs
parents: 96
diff changeset
   165
            } else {
hgs
parents: 96
diff changeset
   166
                cmdLine->SetCommandL(EApaCommandRun);
hgs
parents: 96
diff changeset
   167
            }
89
hgs
parents: 88
diff changeset
   168
98
hgs
parents: 96
diff changeset
   169
            cmdLine->SetTailEndL(KNullDesC8);
hgs
parents: 96
diff changeset
   170
hgs
parents: 96
diff changeset
   171
            User::LeaveIfError(appArcSession.StartApp(*cmdLine));
89
hgs
parents: 88
diff changeset
   172
98
hgs
parents: 96
diff changeset
   173
            CleanupStack::PopAndDestroy(cmdLine);
hgs
parents: 96
diff changeset
   174
            CleanupStack::PopAndDestroy(&appArcSession);
hgs
parents: 96
diff changeset
   175
            CleanupStack::PopAndDestroy(appInfo);
88
hgs
parents:
diff changeset
   176
        }
89
hgs
parents: 88
diff changeset
   177
        CleanupStack::PopAndDestroy( &wsSession );
88
hgs
parents:
diff changeset
   178
    }
hgs
parents:
diff changeset
   179
}
hgs
parents:
diff changeset
   180
98
hgs
parents: 96
diff changeset
   181
/*!
hgs
parents: 96
diff changeset
   182
 * Closes application.
hgs
parents: 96
diff changeset
   183
 * \param flags an entry flags.
hgs
parents: 96
diff changeset
   184
 * \param windowGroupId window group id.
hgs
parents: 96
diff changeset
   185
 * \retval an error code.
hgs
parents: 96
diff changeset
   186
 */
96
hgs
parents: 94
diff changeset
   187
int CaAppHandler::closeApplication(const EntryFlags &flags, int windowGroupId)
88
hgs
parents:
diff changeset
   188
{
96
hgs
parents: 94
diff changeset
   189
    int result(KErrNone);
116
hgs
parents: 98
diff changeset
   190
    if (windowGroupId > 0) {
96
hgs
parents: 94
diff changeset
   191
        RWsSession wsSession;
hgs
parents: 94
diff changeset
   192
        result = wsSession.Connect();
hgs
parents: 94
diff changeset
   193
        if (result==KErrNone) {
hgs
parents: 94
diff changeset
   194
            TWsEvent event;
hgs
parents: 94
diff changeset
   195
            event.SetTimeNow();
98
hgs
parents: 96
diff changeset
   196
            event.SetType(KAknShutOrHideApp);
hgs
parents: 96
diff changeset
   197
            wsSession.SendEventToWindowGroup(windowGroupId, event);
96
hgs
parents: 94
diff changeset
   198
        }
hgs
parents: 94
diff changeset
   199
        wsSession.Close();
89
hgs
parents: 88
diff changeset
   200
    }
96
hgs
parents: 94
diff changeset
   201
    return result;
88
hgs
parents:
diff changeset
   202
}
hgs
parents:
diff changeset
   203
98
hgs
parents: 96
diff changeset
   204
/*!
hgs
parents: 96
diff changeset
   205
 * Uninstall application.
hgs
parents: 96
diff changeset
   206
 * \param flags flags of the application which is to uninstall.
hgs
parents: 96
diff changeset
   207
 * \param typeName type name of the entry.
hgs
parents: 96
diff changeset
   208
 * \param componentId component id.
hgs
parents: 96
diff changeset
   209
 * \retval an error code.
hgs
parents: 96
diff changeset
   210
 */
96
hgs
parents: 94
diff changeset
   211
int CaAppHandler::handleRemove(const EntryFlags &flags,
hgs
parents: 94
diff changeset
   212
    const QString &typeName,
hgs
parents: 94
diff changeset
   213
    const QString &componentId)
hgs
parents: 94
diff changeset
   214
{
hgs
parents: 94
diff changeset
   215
    int result(KErrNone);
hgs
parents: 94
diff changeset
   216
    if (flags.testFlag(RemovableEntryFlag)) {
hgs
parents: 94
diff changeset
   217
        if (typeName == caTypeApp
hgs
parents: 94
diff changeset
   218
            || typeName == caTypePackage
hgs
parents: 94
diff changeset
   219
            || typeName == caTypeWidget) {
hgs
parents: 94
diff changeset
   220
            if(componentId.isNull()) {
hgs
parents: 94
diff changeset
   221
                result = KErrNotFound;
hgs
parents: 94
diff changeset
   222
            } else {
hgs
parents: 94
diff changeset
   223
                bool convertStatus(false);
hgs
parents: 94
diff changeset
   224
                int id = componentId.toInt(&convertStatus);
hgs
parents: 94
diff changeset
   225
                if (convertStatus) {
hgs
parents: 94
diff changeset
   226
                    TRAP(result, startUsifUninstallL(id));
hgs
parents: 94
diff changeset
   227
                } else {
hgs
parents: 94
diff changeset
   228
                    result = KErrGeneral;
hgs
parents: 94
diff changeset
   229
                }
94
hgs
parents: 92
diff changeset
   230
            }
92
hgs
parents: 89
diff changeset
   231
        }
96
hgs
parents: 94
diff changeset
   232
        else {
hgs
parents: 94
diff changeset
   233
            result = KErrNotSupported;
92
hgs
parents: 89
diff changeset
   234
        }
96
hgs
parents: 94
diff changeset
   235
    } else {
hgs
parents: 94
diff changeset
   236
        result = KErrAccessDenied;
94
hgs
parents: 92
diff changeset
   237
    }
96
hgs
parents: 94
diff changeset
   238
    return result;
92
hgs
parents: 89
diff changeset
   239
}
hgs
parents: 89
diff changeset
   240
98
hgs
parents: 96
diff changeset
   241
/*!
hgs
parents: 96
diff changeset
   242
 * Start uninstall operation via usif.
hgs
parents: 96
diff changeset
   243
 * \param componentId component id.
hgs
parents: 96
diff changeset
   244
 */
hgs
parents: 96
diff changeset
   245
void CaAppHandler::startUsifUninstallL(TInt componentId)
92
hgs
parents: 89
diff changeset
   246
{
96
hgs
parents: 94
diff changeset
   247
    if (iUsifUninstallOperation && iUsifUninstallOperation->IsActive()) {
116
hgs
parents: 98
diff changeset
   248
        uninstallError(Usif::EInstallerBusy);
hgs
parents: 98
diff changeset
   249
    } else {
hgs
parents: 98
diff changeset
   250
        delete iUsifUninstallOperation;
hgs
parents: 98
diff changeset
   251
        iUsifUninstallOperation = NULL;
hgs
parents: 98
diff changeset
   252
        iUsifUninstallOperation = CCaUsifUninstallOperation::NewL(componentId);
hgs
parents: 98
diff changeset
   253
        iUsifUninstallOperation->AddObserver(this);
96
hgs
parents: 94
diff changeset
   254
    }
92
hgs
parents: 89
diff changeset
   255
}
hgs
parents: 89
diff changeset
   256
116
hgs
parents: 98
diff changeset
   257
#ifdef COVERAGE_MEASUREMENT
hgs
parents: 98
diff changeset
   258
#pragma CTC SKIP
hgs
parents: 98
diff changeset
   259
#endif //COVERAGE_MEASUREMENT 
hgs
parents: 98
diff changeset
   260
/*!
hgs
parents: 98
diff changeset
   261
 * Show information message about unninstall error.
hgs
parents: 98
diff changeset
   262
 * \param error uninstall error.
hgs
parents: 98
diff changeset
   263
 * \retval void.
hgs
parents: 98
diff changeset
   264
 */
hgs
parents: 98
diff changeset
   265
void CaAppHandler::uninstallError(int error)
hgs
parents: 98
diff changeset
   266
{
hgs
parents: 98
diff changeset
   267
   	emit uninstallFailed(error);
hgs
parents: 98
diff changeset
   268
}
hgs
parents: 98
diff changeset
   269
#ifdef COVERAGE_MEASUREMENT
hgs
parents: 98
diff changeset
   270
#pragma CTC ENDSKIP
hgs
parents: 98
diff changeset
   271
#endif //COVERAGE_MEASUREMENT
hgs
parents: 98
diff changeset
   272
hgs
parents: 98
diff changeset
   273