contentstorage/cahandler/app/src/caapphandler.cpp
author hgs
Fri, 14 May 2010 17:24:44 +0300
changeset 94 dbb8300717f7
parent 92 782e3408c2ab
child 96 5d243a69bdda
permissions -rw-r--r--
201019
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
hgs
parents:
diff changeset
    18
#include <w32std.h>
hgs
parents:
diff changeset
    19
#include <apgtask.h>
hgs
parents:
diff changeset
    20
#include <apgcli.h>
hgs
parents:
diff changeset
    21
#include <eikenv.h>
hgs
parents:
diff changeset
    22
#include <eikappui.h>
hgs
parents:
diff changeset
    23
#include <vwsdef.h>
hgs
parents:
diff changeset
    24
#include <AknDef.h>
hgs
parents:
diff changeset
    25
#include <AknTaskList.h>
hgs
parents:
diff changeset
    26
92
hgs
parents: 89
diff changeset
    27
#include <usif/usifcommon.h>
hgs
parents: 89
diff changeset
    28
#include <usif/scr/scr.h>
hgs
parents: 89
diff changeset
    29
88
hgs
parents:
diff changeset
    30
#include "caapphandler.h"
hgs
parents:
diff changeset
    31
#include "cainnerentry.h"
92
hgs
parents: 89
diff changeset
    32
#include "causifuninstalloperation.h"
hgs
parents: 89
diff changeset
    33
#include "catasklist.h"
88
hgs
parents:
diff changeset
    34
hgs
parents:
diff changeset
    35
#include "cautils.h"
hgs
parents:
diff changeset
    36
#include "cadef.h"
hgs
parents:
diff changeset
    37
hgs
parents:
diff changeset
    38
// ======== MEMBER FUNCTIONS ========
92
hgs
parents: 89
diff changeset
    39
using namespace Usif;
88
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
CCaAppHandler::~CCaAppHandler()
hgs
parents:
diff changeset
    46
{
92
hgs
parents: 89
diff changeset
    47
    delete iUsifUninstallOperation;
88
hgs
parents:
diff changeset
    48
}
hgs
parents:
diff changeset
    49
hgs
parents:
diff changeset
    50
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    51
//
hgs
parents:
diff changeset
    52
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    53
//
hgs
parents:
diff changeset
    54
CCaAppHandler *CCaAppHandler::NewL()
hgs
parents:
diff changeset
    55
{
hgs
parents:
diff changeset
    56
    CCaAppHandler *handler = new(ELeave) CCaAppHandler();
89
hgs
parents: 88
diff changeset
    57
    CleanupStack::PushL( handler );
88
hgs
parents:
diff changeset
    58
    handler->ConstructL();
89
hgs
parents: 88
diff changeset
    59
    CleanupStack::Pop( handler );
88
hgs
parents:
diff changeset
    60
    return handler;
hgs
parents:
diff changeset
    61
}
hgs
parents:
diff changeset
    62
hgs
parents:
diff changeset
    63
// ---------------------------------------------------------
hgs
parents:
diff changeset
    64
// CCaAppHandler::CCaAppHandler
hgs
parents:
diff changeset
    65
// ---------------------------------------------------------
hgs
parents:
diff changeset
    66
//
hgs
parents:
diff changeset
    67
CCaAppHandler::CCaAppHandler()
hgs
parents:
diff changeset
    68
{
hgs
parents:
diff changeset
    69
    iEikEnv = CEikonEnv::Static();
92
hgs
parents: 89
diff changeset
    70
    iUsifUninstallOperation = NULL;
88
hgs
parents:
diff changeset
    71
}
hgs
parents:
diff changeset
    72
hgs
parents:
diff changeset
    73
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    74
//
hgs
parents:
diff changeset
    75
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    76
//
hgs
parents:
diff changeset
    77
void CCaAppHandler::ConstructL()
hgs
parents:
diff changeset
    78
{
hgs
parents:
diff changeset
    79
}
hgs
parents:
diff changeset
    80
89
hgs
parents: 88
diff changeset
    81
// ---------------------------------------------------------------------------
hgs
parents: 88
diff changeset
    82
//
hgs
parents: 88
diff changeset
    83
// ---------------------------------------------------------------------------
hgs
parents: 88
diff changeset
    84
//
hgs
parents: 88
diff changeset
    85
void CCaAppHandler::HandleCommandL(
hgs
parents: 88
diff changeset
    86
        CCaInnerEntry &aEntry, const TDesC8 &aCommand )
hgs
parents: 88
diff changeset
    87
{
92
hgs
parents: 89
diff changeset
    88
89
hgs
parents: 88
diff changeset
    89
    if( aCommand == KCaCmdOpen()
hgs
parents: 88
diff changeset
    90
            && aEntry.GetEntryTypeName() == KCaTypeApp() )
hgs
parents: 88
diff changeset
    91
        {
hgs
parents: 88
diff changeset
    92
        TInt viewId(-1);
92
hgs
parents: 89
diff changeset
    93
        TPtrC viewIdValue;
89
hgs
parents: 88
diff changeset
    94
        if( aEntry.FindAttribute( KCaAttrView(), viewIdValue ) )
hgs
parents: 88
diff changeset
    95
            {
hgs
parents: 88
diff changeset
    96
            if( MenuUtils::GetTUint( viewIdValue, (TUint &) viewId )
hgs
parents: 88
diff changeset
    97
                    != KErrNone )
hgs
parents: 88
diff changeset
    98
                {
hgs
parents: 88
diff changeset
    99
                User::Leave( KErrCorrupt );
hgs
parents: 88
diff changeset
   100
                }
hgs
parents: 88
diff changeset
   101
            }
hgs
parents: 88
diff changeset
   102
        LaunchApplicationL(
hgs
parents: 88
diff changeset
   103
                TUid::Uid( aEntry.GetUid() ), KNullDesC8(), viewId );
hgs
parents: 88
diff changeset
   104
        }
hgs
parents: 88
diff changeset
   105
    else if ( aCommand == KCaCmdClose()
hgs
parents: 88
diff changeset
   106
            && aEntry.GetEntryTypeName() == KCaTypeApp() )
hgs
parents: 88
diff changeset
   107
        {
hgs
parents: 88
diff changeset
   108
        CloseApplicationL( aEntry );
hgs
parents: 88
diff changeset
   109
        }
92
hgs
parents: 89
diff changeset
   110
    else if ( aCommand == KCaCmdRemove() )
89
hgs
parents: 88
diff changeset
   111
        {
92
hgs
parents: 89
diff changeset
   112
        HandleRemoveL(aEntry);
89
hgs
parents: 88
diff changeset
   113
        }
hgs
parents: 88
diff changeset
   114
    else
hgs
parents: 88
diff changeset
   115
        {
hgs
parents: 88
diff changeset
   116
        User::Leave( KErrNotSupported );
hgs
parents: 88
diff changeset
   117
        }
hgs
parents: 88
diff changeset
   118
}
88
hgs
parents:
diff changeset
   119
hgs
parents:
diff changeset
   120
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   121
//
hgs
parents:
diff changeset
   122
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   123
//
89
hgs
parents: 88
diff changeset
   124
void CCaAppHandler::LaunchApplicationL(
hgs
parents: 88
diff changeset
   125
        const TUid aUid, const TDesC8 &aParam, TInt aViewId )
88
hgs
parents:
diff changeset
   126
{
89
hgs
parents: 88
diff changeset
   127
    if( aViewId > 0 && iEikEnv )
hgs
parents: 88
diff changeset
   128
        {
hgs
parents: 88
diff changeset
   129
        TUid viewId = TUid::Uid( aViewId );
hgs
parents: 88
diff changeset
   130
        TVwsViewId view( aUid, viewId );
hgs
parents: 88
diff changeset
   131
        iEikEnv->EikAppUi()->ActivateViewL( view );
88
hgs
parents:
diff changeset
   132
        }
89
hgs
parents: 88
diff changeset
   133
    else
hgs
parents: 88
diff changeset
   134
        {
hgs
parents: 88
diff changeset
   135
        RWsSession wsSession;
hgs
parents: 88
diff changeset
   136
        User::LeaveIfError( wsSession.Connect() );
hgs
parents: 88
diff changeset
   137
        CleanupClosePushL<RWsSession>( wsSession );
hgs
parents: 88
diff changeset
   138
hgs
parents: 88
diff changeset
   139
        CCaTaskList* taskList = CCaTaskList::NewLC( wsSession );
hgs
parents: 88
diff changeset
   140
        TApaTask task = taskList->FindRootApp( aUid );
hgs
parents: 88
diff changeset
   141
        CleanupStack::PopAndDestroy( taskList );
hgs
parents: 88
diff changeset
   142
hgs
parents: 88
diff changeset
   143
        if( task.Exists() )
hgs
parents: 88
diff changeset
   144
            {
hgs
parents: 88
diff changeset
   145
            task.BringToForeground();
hgs
parents: 88
diff changeset
   146
            }
hgs
parents: 88
diff changeset
   147
        else
hgs
parents: 88
diff changeset
   148
            {
92
hgs
parents: 89
diff changeset
   149
            // TApaAppInfo size is greater then 1024 bytes
hgs
parents: 89
diff changeset
   150
            // so its instances should not be created on the stack.
hgs
parents: 89
diff changeset
   151
            TApaAppInfo* appInfo = new( ELeave ) TApaAppInfo;
hgs
parents: 89
diff changeset
   152
            CleanupStack::PushL( appInfo );
89
hgs
parents: 88
diff changeset
   153
            TApaAppCapabilityBuf capabilityBuf;
hgs
parents: 88
diff changeset
   154
            RApaLsSession appArcSession;
hgs
parents: 88
diff changeset
   155
            User::LeaveIfError( appArcSession.Connect() );
hgs
parents: 88
diff changeset
   156
            CleanupClosePushL<RApaLsSession>( appArcSession );
hgs
parents: 88
diff changeset
   157
92
hgs
parents: 89
diff changeset
   158
            User::LeaveIfError( appArcSession.GetAppInfo( *appInfo, aUid ) );
89
hgs
parents: 88
diff changeset
   159
            User::LeaveIfError( appArcSession.GetAppCapability(
hgs
parents: 88
diff changeset
   160
                                   capabilityBuf, aUid ) );
hgs
parents: 88
diff changeset
   161
hgs
parents: 88
diff changeset
   162
            TApaAppCapability &caps = capabilityBuf();
hgs
parents: 88
diff changeset
   163
            CApaCommandLine *cmdLine = CApaCommandLine::NewLC();
92
hgs
parents: 89
diff changeset
   164
            cmdLine->SetExecutableNameL( appInfo->iFullName );
89
hgs
parents: 88
diff changeset
   165
hgs
parents: 88
diff changeset
   166
            if( caps.iLaunchInBackground )
hgs
parents: 88
diff changeset
   167
                {
hgs
parents: 88
diff changeset
   168
                cmdLine->SetCommandL( EApaCommandBackground );
hgs
parents: 88
diff changeset
   169
                }
hgs
parents: 88
diff changeset
   170
            else
hgs
parents: 88
diff changeset
   171
                {
hgs
parents: 88
diff changeset
   172
                cmdLine->SetCommandL( EApaCommandRun );
hgs
parents: 88
diff changeset
   173
                }
hgs
parents: 88
diff changeset
   174
hgs
parents: 88
diff changeset
   175
            cmdLine->SetTailEndL( aParam );
hgs
parents: 88
diff changeset
   176
hgs
parents: 88
diff changeset
   177
            User::LeaveIfError( appArcSession.StartApp( *cmdLine ) );
hgs
parents: 88
diff changeset
   178
hgs
parents: 88
diff changeset
   179
            CleanupStack::PopAndDestroy( cmdLine );
hgs
parents: 88
diff changeset
   180
            CleanupStack::PopAndDestroy( &appArcSession );
92
hgs
parents: 89
diff changeset
   181
            CleanupStack::PopAndDestroy( appInfo );
88
hgs
parents:
diff changeset
   182
        }
89
hgs
parents: 88
diff changeset
   183
        CleanupStack::PopAndDestroy( &wsSession );
88
hgs
parents:
diff changeset
   184
    }
hgs
parents:
diff changeset
   185
}
hgs
parents:
diff changeset
   186
hgs
parents:
diff changeset
   187
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   188
//
hgs
parents:
diff changeset
   189
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   190
//
89
hgs
parents: 88
diff changeset
   191
void CCaAppHandler::CloseApplicationL( CCaInnerEntry &aEntry )
88
hgs
parents:
diff changeset
   192
{
89
hgs
parents: 88
diff changeset
   193
    RWsSession wsSession;
hgs
parents: 88
diff changeset
   194
    User::LeaveIfError( wsSession.Connect() );
hgs
parents: 88
diff changeset
   195
    CleanupClosePushL<RWsSession>( wsSession );
88
hgs
parents:
diff changeset
   196
89
hgs
parents: 88
diff changeset
   197
    if( ( aEntry.GetFlags() & ERunning )
hgs
parents: 88
diff changeset
   198
            && !( aEntry.GetFlags() & ESystem ) )
hgs
parents: 88
diff changeset
   199
        {
hgs
parents: 88
diff changeset
   200
        RBuf value;
hgs
parents: 88
diff changeset
   201
        CleanupClosePushL( value );
hgs
parents: 88
diff changeset
   202
        value.CreateL( KCaMaxAttrValueLen );
hgs
parents: 88
diff changeset
   203
        if( aEntry.FindAttribute( KCaAttrWindowGroupId, value ) )
hgs
parents: 88
diff changeset
   204
            {
hgs
parents: 88
diff changeset
   205
            TInt wgId( KErrNotFound );
hgs
parents: 88
diff changeset
   206
            TLex16 parser( value );
hgs
parents: 88
diff changeset
   207
            if( KErrNone == parser.Val( wgId ) && wgId > 0 )
hgs
parents: 88
diff changeset
   208
                {
hgs
parents: 88
diff changeset
   209
                TWsEvent event;
hgs
parents: 88
diff changeset
   210
                event.SetTimeNow();
hgs
parents: 88
diff changeset
   211
                event.SetType( KAknShutOrHideApp );
hgs
parents: 88
diff changeset
   212
                wsSession.SendEventToWindowGroup( wgId, event );
hgs
parents: 88
diff changeset
   213
                }
hgs
parents: 88
diff changeset
   214
            }
hgs
parents: 88
diff changeset
   215
        CleanupStack::PopAndDestroy( &value );
hgs
parents: 88
diff changeset
   216
    }
88
hgs
parents:
diff changeset
   217
89
hgs
parents: 88
diff changeset
   218
    CleanupStack::PopAndDestroy( &wsSession );
88
hgs
parents:
diff changeset
   219
}
hgs
parents:
diff changeset
   220
92
hgs
parents: 89
diff changeset
   221
// ---------------------------------------------------------------------------
hgs
parents: 89
diff changeset
   222
//
hgs
parents: 89
diff changeset
   223
// ---------------------------------------------------------------------------
hgs
parents: 89
diff changeset
   224
//
hgs
parents: 89
diff changeset
   225
void CCaAppHandler::HandleRemoveL( CCaInnerEntry &aEntry )
94
hgs
parents: 92
diff changeset
   226
    {
hgs
parents: 92
diff changeset
   227
    if( !( aEntry.GetFlags() & ERemovable ) )
92
hgs
parents: 89
diff changeset
   228
        {
hgs
parents: 89
diff changeset
   229
        User::Leave( KErrAccessDenied );
hgs
parents: 89
diff changeset
   230
        }
94
hgs
parents: 92
diff changeset
   231
    
hgs
parents: 92
diff changeset
   232
    const TPtrC entryTypeName(aEntry.GetEntryTypeName());
hgs
parents: 92
diff changeset
   233
    
hgs
parents: 92
diff changeset
   234
    if( entryTypeName == KCaTypeApp()  ||
hgs
parents: 92
diff changeset
   235
        entryTypeName == KCaTypePackage() ||
hgs
parents: 92
diff changeset
   236
        entryTypeName == KCaTypeWidget() )
92
hgs
parents: 89
diff changeset
   237
        {
hgs
parents: 89
diff changeset
   238
        TPtrC componentId;
94
hgs
parents: 92
diff changeset
   239
        TBool result = aEntry.FindAttribute( KCaAttrComponentId, componentId );
hgs
parents: 92
diff changeset
   240
        if( result )
92
hgs
parents: 89
diff changeset
   241
            {
hgs
parents: 89
diff changeset
   242
            TInt32 id ;
hgs
parents: 89
diff changeset
   243
            TLex idDesc;
hgs
parents: 89
diff changeset
   244
            idDesc.Assign( componentId );
hgs
parents: 89
diff changeset
   245
            User::LeaveIfError( idDesc.Val( id ) );
hgs
parents: 89
diff changeset
   246
            StartUsifUninstallL( id );
hgs
parents: 89
diff changeset
   247
            }
94
hgs
parents: 92
diff changeset
   248
         else
hgs
parents: 92
diff changeset
   249
            {
hgs
parents: 92
diff changeset
   250
            User::Leave( KErrNotFound );
hgs
parents: 92
diff changeset
   251
            }
92
hgs
parents: 89
diff changeset
   252
        }
hgs
parents: 89
diff changeset
   253
    else
hgs
parents: 89
diff changeset
   254
        {
hgs
parents: 89
diff changeset
   255
        User::Leave( KErrNotSupported );
hgs
parents: 89
diff changeset
   256
        }
94
hgs
parents: 92
diff changeset
   257
    }
92
hgs
parents: 89
diff changeset
   258
hgs
parents: 89
diff changeset
   259
// ---------------------------------------------------------------------------
hgs
parents: 89
diff changeset
   260
//
hgs
parents: 89
diff changeset
   261
// ---------------------------------------------------------------------------
hgs
parents: 89
diff changeset
   262
//
hgs
parents: 89
diff changeset
   263
TInt CCaAppHandler::GetComponentIdL( const CCaInnerEntry &aEntry,
hgs
parents: 89
diff changeset
   264
        const TDesC& aSoftwareType )
hgs
parents: 89
diff changeset
   265
{
hgs
parents: 89
diff changeset
   266
    TInt id(KErrNotFound);
hgs
parents: 89
diff changeset
   267
    RSoftwareComponentRegistry scr;
hgs
parents: 89
diff changeset
   268
    CleanupClosePushL(scr);
hgs
parents: 89
diff changeset
   269
    User::LeaveIfError(scr.Connect());
hgs
parents: 89
diff changeset
   270
    CComponentFilter* compFilter = CComponentFilter::NewLC();
hgs
parents: 89
diff changeset
   271
    compFilter->AddPropertyL(_L("Uid"), aEntry.GetUid());
hgs
parents: 89
diff changeset
   272
    compFilter->SetSoftwareTypeL(aSoftwareType);
hgs
parents: 89
diff changeset
   273
    RArray<TComponentId> componentIdList;
hgs
parents: 89
diff changeset
   274
    CleanupClosePushL(componentIdList);
hgs
parents: 89
diff changeset
   275
    scr.GetComponentIdsL(componentIdList, compFilter);
hgs
parents: 89
diff changeset
   276
    if (componentIdList.Count() > 0)
hgs
parents: 89
diff changeset
   277
        {
hgs
parents: 89
diff changeset
   278
        id = componentIdList[0];
hgs
parents: 89
diff changeset
   279
        }
hgs
parents: 89
diff changeset
   280
    CleanupStack::PopAndDestroy(&componentIdList);
hgs
parents: 89
diff changeset
   281
    CleanupStack::PopAndDestroy(compFilter);
hgs
parents: 89
diff changeset
   282
    CleanupStack::PopAndDestroy(&scr);
hgs
parents: 89
diff changeset
   283
    return id;
hgs
parents: 89
diff changeset
   284
}
hgs
parents: 89
diff changeset
   285
hgs
parents: 89
diff changeset
   286
// ---------------------------------------------------------------------------
hgs
parents: 89
diff changeset
   287
//
hgs
parents: 89
diff changeset
   288
// ---------------------------------------------------------------------------
hgs
parents: 89
diff changeset
   289
//
hgs
parents: 89
diff changeset
   290
void CCaAppHandler::StartUsifUninstallL( TInt aComponentId )
hgs
parents: 89
diff changeset
   291
{
hgs
parents: 89
diff changeset
   292
    if ( iUsifUninstallOperation && iUsifUninstallOperation->IsActive() )
hgs
parents: 89
diff changeset
   293
        {
hgs
parents: 89
diff changeset
   294
        User::Leave( KErrInUse );
hgs
parents: 89
diff changeset
   295
        }
hgs
parents: 89
diff changeset
   296
    delete iUsifUninstallOperation;
hgs
parents: 89
diff changeset
   297
    iUsifUninstallOperation = NULL;
hgs
parents: 89
diff changeset
   298
    iUsifUninstallOperation = CCaUsifUninstallOperation::NewL( aComponentId );
hgs
parents: 89
diff changeset
   299
}
hgs
parents: 89
diff changeset
   300