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