contentstorage/cahandler/app/src/caapphandler.cpp
author hgs
Fri, 28 May 2010 16:17:03 +0300
changeset 96 5d243a69bdda
parent 94 dbb8300717f7
child 98 d2f833ab7940
permissions -rw-r--r--
201021
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>
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 caCmdClose[] = "close";
hgs
parents: 94
diff changeset
    50
static const char caAttrWindowGroupId[] = "window_group_id";
hgs
parents: 94
diff changeset
    51
static const char caAttrComponentId[] = "component_id";
hgs
parents: 94
diff changeset
    52
static const char caCmdRemove[] = "remove";
88
hgs
parents:
diff changeset
    53
hgs
parents:
diff changeset
    54
// ---------------------------------------------------------
96
hgs
parents: 94
diff changeset
    55
//
88
hgs
parents:
diff changeset
    56
// ---------------------------------------------------------
hgs
parents:
diff changeset
    57
//
96
hgs
parents: 94
diff changeset
    58
CaAppHandler::CaAppHandler(QObject *parent):
hgs
parents: 94
diff changeset
    59
    iEikEnv(CEikonEnv::Static()),
hgs
parents: 94
diff changeset
    60
    iUsifUninstallOperation(NULL)
88
hgs
parents:
diff changeset
    61
{
96
hgs
parents: 94
diff changeset
    62
    Q_UNUSED(parent);
88
hgs
parents:
diff changeset
    63
}
hgs
parents:
diff changeset
    64
hgs
parents:
diff changeset
    65
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    66
//
hgs
parents:
diff changeset
    67
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    68
//
96
hgs
parents: 94
diff changeset
    69
CaAppHandler::~CaAppHandler()
hgs
parents: 94
diff changeset
    70
{
hgs
parents: 94
diff changeset
    71
    delete iUsifUninstallOperation;
hgs
parents: 94
diff changeset
    72
}
hgs
parents: 94
diff changeset
    73
hgs
parents: 94
diff changeset
    74
int CaAppHandler::execute(const CaEntry &entry, const QString &command)
88
hgs
parents:
diff changeset
    75
{
96
hgs
parents: 94
diff changeset
    76
    int result(KErrGeneral);
hgs
parents: 94
diff changeset
    77
    if (command == caCmdOpen && entry.entryTypeName() == caTypeApp) {
hgs
parents: 94
diff changeset
    78
        QString viewIdValue = entry.attribute(caAttrView);
hgs
parents: 94
diff changeset
    79
        bool viewIdIsCorrect(true);
hgs
parents: 94
diff changeset
    80
        int viewId(-1);
hgs
parents: 94
diff changeset
    81
        if (!viewIdValue.isNull()) {
hgs
parents: 94
diff changeset
    82
            viewId = viewIdValue.toInt(&viewIdIsCorrect, 0);
hgs
parents: 94
diff changeset
    83
        }
hgs
parents: 94
diff changeset
    84
        if (viewIdIsCorrect) {
hgs
parents: 94
diff changeset
    85
            QString uidValue =
hgs
parents: 94
diff changeset
    86
                entry.attribute(APPLICATION_UID_ATTRIBUTE_NAME);
hgs
parents: 94
diff changeset
    87
            int uid = uidValue.toInt();
hgs
parents: 94
diff changeset
    88
            TRAP(result, launchApplicationL(TUid::Uid(uid), viewId));
hgs
parents: 94
diff changeset
    89
        }
hgs
parents: 94
diff changeset
    90
    } else if (command == caCmdClose && entry.entryTypeName() == caTypeApp ) {
hgs
parents: 94
diff changeset
    91
        QString windowGroupId = entry.attribute(caAttrWindowGroupId);
hgs
parents: 94
diff changeset
    92
        if (!windowGroupId.isNull()) {
hgs
parents: 94
diff changeset
    93
            result = closeApplication(entry.flags(), windowGroupId.toInt());
hgs
parents: 94
diff changeset
    94
        }
hgs
parents: 94
diff changeset
    95
    } else if (command == caCmdRemove) {
hgs
parents: 94
diff changeset
    96
        QString componentId(entry.attribute(caAttrComponentId));
hgs
parents: 94
diff changeset
    97
        result = handleRemove(entry.flags(),
hgs
parents: 94
diff changeset
    98
            entry.entryTypeName(),
hgs
parents: 94
diff changeset
    99
            componentId);
hgs
parents: 94
diff changeset
   100
    } else {
hgs
parents: 94
diff changeset
   101
        result = KErrNotSupported;
hgs
parents: 94
diff changeset
   102
    }
hgs
parents: 94
diff changeset
   103
hgs
parents: 94
diff changeset
   104
    return result;
88
hgs
parents:
diff changeset
   105
}
hgs
parents:
diff changeset
   106
89
hgs
parents: 88
diff changeset
   107
// ---------------------------------------------------------------------------
hgs
parents: 88
diff changeset
   108
//
hgs
parents: 88
diff changeset
   109
// ---------------------------------------------------------------------------
hgs
parents: 88
diff changeset
   110
//
96
hgs
parents: 94
diff changeset
   111
void CaAppHandler::launchApplicationL(const TUid aUid, TInt aViewId)
88
hgs
parents:
diff changeset
   112
{
89
hgs
parents: 88
diff changeset
   113
    if( aViewId > 0 && iEikEnv )
hgs
parents: 88
diff changeset
   114
        {
hgs
parents: 88
diff changeset
   115
        TUid viewId = TUid::Uid( aViewId );
hgs
parents: 88
diff changeset
   116
        TVwsViewId view( aUid, viewId );
hgs
parents: 88
diff changeset
   117
        iEikEnv->EikAppUi()->ActivateViewL( view );
88
hgs
parents:
diff changeset
   118
        }
89
hgs
parents: 88
diff changeset
   119
    else
hgs
parents: 88
diff changeset
   120
        {
hgs
parents: 88
diff changeset
   121
        RWsSession wsSession;
hgs
parents: 88
diff changeset
   122
        User::LeaveIfError( wsSession.Connect() );
hgs
parents: 88
diff changeset
   123
        CleanupClosePushL<RWsSession>( wsSession );
hgs
parents: 88
diff changeset
   124
hgs
parents: 88
diff changeset
   125
        CCaTaskList* taskList = CCaTaskList::NewLC( wsSession );
hgs
parents: 88
diff changeset
   126
        TApaTask task = taskList->FindRootApp( aUid );
hgs
parents: 88
diff changeset
   127
        CleanupStack::PopAndDestroy( taskList );
hgs
parents: 88
diff changeset
   128
hgs
parents: 88
diff changeset
   129
        if( task.Exists() )
hgs
parents: 88
diff changeset
   130
            {
hgs
parents: 88
diff changeset
   131
            task.BringToForeground();
hgs
parents: 88
diff changeset
   132
            }
hgs
parents: 88
diff changeset
   133
        else
hgs
parents: 88
diff changeset
   134
            {
92
hgs
parents: 89
diff changeset
   135
            // TApaAppInfo size is greater then 1024 bytes
hgs
parents: 89
diff changeset
   136
            // so its instances should not be created on the stack.
hgs
parents: 89
diff changeset
   137
            TApaAppInfo* appInfo = new( ELeave ) TApaAppInfo;
hgs
parents: 89
diff changeset
   138
            CleanupStack::PushL( appInfo );
89
hgs
parents: 88
diff changeset
   139
            TApaAppCapabilityBuf capabilityBuf;
hgs
parents: 88
diff changeset
   140
            RApaLsSession appArcSession;
hgs
parents: 88
diff changeset
   141
            User::LeaveIfError( appArcSession.Connect() );
hgs
parents: 88
diff changeset
   142
            CleanupClosePushL<RApaLsSession>( appArcSession );
hgs
parents: 88
diff changeset
   143
92
hgs
parents: 89
diff changeset
   144
            User::LeaveIfError( appArcSession.GetAppInfo( *appInfo, aUid ) );
89
hgs
parents: 88
diff changeset
   145
            User::LeaveIfError( appArcSession.GetAppCapability(
hgs
parents: 88
diff changeset
   146
                                   capabilityBuf, aUid ) );
hgs
parents: 88
diff changeset
   147
hgs
parents: 88
diff changeset
   148
            TApaAppCapability &caps = capabilityBuf();
hgs
parents: 88
diff changeset
   149
            CApaCommandLine *cmdLine = CApaCommandLine::NewLC();
92
hgs
parents: 89
diff changeset
   150
            cmdLine->SetExecutableNameL( appInfo->iFullName );
89
hgs
parents: 88
diff changeset
   151
hgs
parents: 88
diff changeset
   152
            if( caps.iLaunchInBackground )
hgs
parents: 88
diff changeset
   153
                {
hgs
parents: 88
diff changeset
   154
                cmdLine->SetCommandL( EApaCommandBackground );
hgs
parents: 88
diff changeset
   155
                }
hgs
parents: 88
diff changeset
   156
            else
hgs
parents: 88
diff changeset
   157
                {
hgs
parents: 88
diff changeset
   158
                cmdLine->SetCommandL( EApaCommandRun );
hgs
parents: 88
diff changeset
   159
                }
hgs
parents: 88
diff changeset
   160
96
hgs
parents: 94
diff changeset
   161
            cmdLine->SetTailEndL( KNullDesC8 );
89
hgs
parents: 88
diff changeset
   162
hgs
parents: 88
diff changeset
   163
            User::LeaveIfError( appArcSession.StartApp( *cmdLine ) );
hgs
parents: 88
diff changeset
   164
hgs
parents: 88
diff changeset
   165
            CleanupStack::PopAndDestroy( cmdLine );
hgs
parents: 88
diff changeset
   166
            CleanupStack::PopAndDestroy( &appArcSession );
92
hgs
parents: 89
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
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   174
//
hgs
parents:
diff changeset
   175
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   176
//
96
hgs
parents: 94
diff changeset
   177
int CaAppHandler::closeApplication(const EntryFlags &flags, int windowGroupId)
88
hgs
parents:
diff changeset
   178
{
96
hgs
parents: 94
diff changeset
   179
    int result(KErrNone);
hgs
parents: 94
diff changeset
   180
    if (flags.testFlag(RunningEntryFlag)
hgs
parents: 94
diff changeset
   181
        && !( flags.testFlag(SystemEntryFlag))
hgs
parents: 94
diff changeset
   182
        && windowGroupId > 0) {
hgs
parents: 94
diff changeset
   183
        RWsSession wsSession;
hgs
parents: 94
diff changeset
   184
        result = wsSession.Connect();
hgs
parents: 94
diff changeset
   185
        if (result==KErrNone) {
hgs
parents: 94
diff changeset
   186
            TWsEvent event;
hgs
parents: 94
diff changeset
   187
            event.SetTimeNow();
hgs
parents: 94
diff changeset
   188
            event.SetType( KAknShutOrHideApp );
hgs
parents: 94
diff changeset
   189
            wsSession.SendEventToWindowGroup( windowGroupId, event );
hgs
parents: 94
diff changeset
   190
        }
hgs
parents: 94
diff changeset
   191
        wsSession.Close();
89
hgs
parents: 88
diff changeset
   192
    }
96
hgs
parents: 94
diff changeset
   193
    return result;
88
hgs
parents:
diff changeset
   194
}
hgs
parents:
diff changeset
   195
92
hgs
parents: 89
diff changeset
   196
// ---------------------------------------------------------------------------
hgs
parents: 89
diff changeset
   197
//
hgs
parents: 89
diff changeset
   198
// ---------------------------------------------------------------------------
hgs
parents: 89
diff changeset
   199
//
96
hgs
parents: 94
diff changeset
   200
int CaAppHandler::handleRemove(const EntryFlags &flags,
hgs
parents: 94
diff changeset
   201
    const QString &typeName,
hgs
parents: 94
diff changeset
   202
    const QString &componentId)
hgs
parents: 94
diff changeset
   203
{
hgs
parents: 94
diff changeset
   204
    int result(KErrNone);
hgs
parents: 94
diff changeset
   205
    if (flags.testFlag(RemovableEntryFlag)) {
hgs
parents: 94
diff changeset
   206
        if (typeName == caTypeApp
hgs
parents: 94
diff changeset
   207
            || typeName == caTypePackage
hgs
parents: 94
diff changeset
   208
            || typeName == caTypeWidget) {
hgs
parents: 94
diff changeset
   209
            if(componentId.isNull()) {
hgs
parents: 94
diff changeset
   210
                result = KErrNotFound;
hgs
parents: 94
diff changeset
   211
            } else {
hgs
parents: 94
diff changeset
   212
                bool convertStatus(false);
hgs
parents: 94
diff changeset
   213
                int id = componentId.toInt(&convertStatus);
hgs
parents: 94
diff changeset
   214
                if (convertStatus) {
hgs
parents: 94
diff changeset
   215
                    TRAP(result, startUsifUninstallL(id));
hgs
parents: 94
diff changeset
   216
                } else {
hgs
parents: 94
diff changeset
   217
                    result = KErrGeneral;
hgs
parents: 94
diff changeset
   218
                }
94
hgs
parents: 92
diff changeset
   219
            }
92
hgs
parents: 89
diff changeset
   220
        }
96
hgs
parents: 94
diff changeset
   221
        else {
hgs
parents: 94
diff changeset
   222
            result = KErrNotSupported;
92
hgs
parents: 89
diff changeset
   223
        }
96
hgs
parents: 94
diff changeset
   224
    } else {
hgs
parents: 94
diff changeset
   225
        result = KErrAccessDenied;
94
hgs
parents: 92
diff changeset
   226
    }
96
hgs
parents: 94
diff changeset
   227
    return result;
92
hgs
parents: 89
diff changeset
   228
}
hgs
parents: 89
diff changeset
   229
hgs
parents: 89
diff changeset
   230
// ---------------------------------------------------------------------------
hgs
parents: 89
diff changeset
   231
//
hgs
parents: 89
diff changeset
   232
// ---------------------------------------------------------------------------
hgs
parents: 89
diff changeset
   233
//
96
hgs
parents: 94
diff changeset
   234
void CaAppHandler::startUsifUninstallL(TInt aComponentId)
92
hgs
parents: 89
diff changeset
   235
{
96
hgs
parents: 94
diff changeset
   236
    if (iUsifUninstallOperation && iUsifUninstallOperation->IsActive()) {
92
hgs
parents: 89
diff changeset
   237
        User::Leave( KErrInUse );
96
hgs
parents: 94
diff changeset
   238
    }
92
hgs
parents: 89
diff changeset
   239
    delete iUsifUninstallOperation;
hgs
parents: 89
diff changeset
   240
    iUsifUninstallOperation = NULL;
96
hgs
parents: 94
diff changeset
   241
    iUsifUninstallOperation = CCaUsifUninstallOperation::NewL(aComponentId);
92
hgs
parents: 89
diff changeset
   242
}
hgs
parents: 89
diff changeset
   243