contentstorage/cahandler/app/src/caapphandler.cpp
author hgs
Tue, 23 Mar 2010 23:55:55 +0200
changeset 88 7f0462e8c3da
child 89 1e87eb3b400f
permissions -rw-r--r--
201009
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
hgs
parents:
diff changeset
    27
#include "caapphandler.h"
hgs
parents:
diff changeset
    28
#include "cainnerentry.h"
hgs
parents:
diff changeset
    29
#include "cauninstalloperation.h"
hgs
parents:
diff changeset
    30
hgs
parents:
diff changeset
    31
#include "cautils.h"
hgs
parents:
diff changeset
    32
#include "cadef.h"
hgs
parents:
diff changeset
    33
hgs
parents:
diff changeset
    34
// ======== MEMBER FUNCTIONS ========
hgs
parents:
diff changeset
    35
hgs
parents:
diff changeset
    36
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    37
//
hgs
parents:
diff changeset
    38
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    39
//
hgs
parents:
diff changeset
    40
CCaAppHandler::~CCaAppHandler()
hgs
parents:
diff changeset
    41
{
hgs
parents:
diff changeset
    42
    delete iUninstallOperation;
hgs
parents:
diff changeset
    43
}
hgs
parents:
diff changeset
    44
hgs
parents:
diff changeset
    45
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    46
//
hgs
parents:
diff changeset
    47
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    48
//
hgs
parents:
diff changeset
    49
CCaAppHandler *CCaAppHandler::NewL()
hgs
parents:
diff changeset
    50
{
hgs
parents:
diff changeset
    51
    CCaAppHandler *handler = new(ELeave) CCaAppHandler();
hgs
parents:
diff changeset
    52
    CleanupStack::PushL(handler);
hgs
parents:
diff changeset
    53
    handler->ConstructL();
hgs
parents:
diff changeset
    54
    CleanupStack::Pop(handler);
hgs
parents:
diff changeset
    55
    return handler;
hgs
parents:
diff changeset
    56
}
hgs
parents:
diff changeset
    57
hgs
parents:
diff changeset
    58
// ---------------------------------------------------------
hgs
parents:
diff changeset
    59
// CCaAppHandler::CCaAppHandler
hgs
parents:
diff changeset
    60
// ---------------------------------------------------------
hgs
parents:
diff changeset
    61
//
hgs
parents:
diff changeset
    62
CCaAppHandler::CCaAppHandler()
hgs
parents:
diff changeset
    63
{
hgs
parents:
diff changeset
    64
    iEikEnv = CEikonEnv::Static();
hgs
parents:
diff changeset
    65
    iUninstallOperation = NULL;
hgs
parents:
diff changeset
    66
}
hgs
parents:
diff changeset
    67
hgs
parents:
diff changeset
    68
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    69
//
hgs
parents:
diff changeset
    70
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    71
//
hgs
parents:
diff changeset
    72
void CCaAppHandler::ConstructL()
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
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    78
//
hgs
parents:
diff changeset
    79
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    80
//
hgs
parents:
diff changeset
    81
void CCaAppHandler::HandleCommandL(CCaInnerEntry &aEntry,
hgs
parents:
diff changeset
    82
                                   const TDesC8 &aCommand)
hgs
parents:
diff changeset
    83
{
hgs
parents:
diff changeset
    84
    if (aCommand == KCaCmdOpen() && aEntry.GetEntryTypeName()
hgs
parents:
diff changeset
    85
            == KCaTypeApp()) {
hgs
parents:
diff changeset
    86
        TInt viewId(-1);
hgs
parents:
diff changeset
    87
        TBuf<KCaMaxAttrValueLen> viewIdValue;
hgs
parents:
diff changeset
    88
        if (aEntry.FindAttribute(KCaAttrView(), viewIdValue)) {
hgs
parents:
diff changeset
    89
            if (MenuUtils::GetTUint(viewIdValue, (TUint &) viewId)
hgs
parents:
diff changeset
    90
                    != KErrNone) {
hgs
parents:
diff changeset
    91
                User::Leave(KErrCorrupt);
hgs
parents:
diff changeset
    92
            }
hgs
parents:
diff changeset
    93
        }
hgs
parents:
diff changeset
    94
        LaunchApplicationL(TUid::Uid(aEntry.GetUid()), KNullDesC8(),
hgs
parents:
diff changeset
    95
                           viewId);
hgs
parents:
diff changeset
    96
    } else if (aCommand == KCaCmdClose() && aEntry.GetEntryTypeName()
hgs
parents:
diff changeset
    97
               == KCaTypeApp()) {
hgs
parents:
diff changeset
    98
        CloseApplicationL(aEntry);
hgs
parents:
diff changeset
    99
    } else if (aCommand == KCaCmdRemove()
hgs
parents:
diff changeset
   100
               && (aEntry.GetEntryTypeName() == KCaTypeApp()
hgs
parents:
diff changeset
   101
                   || aEntry.GetEntryTypeName() == KCaTypeWidget())) {
hgs
parents:
diff changeset
   102
        if (iUninstallOperation && iUninstallOperation->IsActive()) {
hgs
parents:
diff changeset
   103
            User::Leave(KErrInUse);
hgs
parents:
diff changeset
   104
        }
hgs
parents:
diff changeset
   105
        delete iUninstallOperation;
hgs
parents:
diff changeset
   106
        iUninstallOperation = NULL;
hgs
parents:
diff changeset
   107
        iUninstallOperation = CCaUninstallOperation::NewL(aEntry);
hgs
parents:
diff changeset
   108
    } else {
hgs
parents:
diff changeset
   109
        User::Leave(KErrNotSupported);
hgs
parents:
diff changeset
   110
    }
hgs
parents:
diff changeset
   111
}
hgs
parents:
diff changeset
   112
hgs
parents:
diff changeset
   113
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   114
//
hgs
parents:
diff changeset
   115
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   116
//
hgs
parents:
diff changeset
   117
void CCaAppHandler::LaunchApplicationL(const TUid aUid,
hgs
parents:
diff changeset
   118
                                       const TDesC8 &aParam, TInt aViewId)
hgs
parents:
diff changeset
   119
{
hgs
parents:
diff changeset
   120
    if (aViewId > 0 && iEikEnv) {
hgs
parents:
diff changeset
   121
        TUid viewId = TUid::Uid(aViewId);
hgs
parents:
diff changeset
   122
        TVwsViewId view(aUid, viewId);
hgs
parents:
diff changeset
   123
        iEikEnv->EikAppUi()->ActivateViewL(view);
hgs
parents:
diff changeset
   124
    } else {
hgs
parents:
diff changeset
   125
        RWsSession wsSession;
hgs
parents:
diff changeset
   126
        User::LeaveIfError(wsSession.Connect());
hgs
parents:
diff changeset
   127
        CleanupClosePushL<RWsSession> (wsSession);
hgs
parents:
diff changeset
   128
hgs
parents:
diff changeset
   129
        CAknTaskList *taskList = CAknTaskList::NewL(wsSession);
hgs
parents:
diff changeset
   130
        TApaTask task = taskList->FindRootApp(aUid);
hgs
parents:
diff changeset
   131
        delete taskList;
hgs
parents:
diff changeset
   132
hgs
parents:
diff changeset
   133
        if (task.Exists()) {
hgs
parents:
diff changeset
   134
            task.BringToForeground();
hgs
parents:
diff changeset
   135
        } else {
hgs
parents:
diff changeset
   136
            TApaAppInfo appInfo;
hgs
parents:
diff changeset
   137
            TApaAppCapabilityBuf capabilityBuf;
hgs
parents:
diff changeset
   138
            RApaLsSession appArcSession;
hgs
parents:
diff changeset
   139
            User::LeaveIfError(appArcSession.Connect());
hgs
parents:
diff changeset
   140
            CleanupClosePushL<RApaLsSession> (appArcSession);
hgs
parents:
diff changeset
   141
hgs
parents:
diff changeset
   142
            User::LeaveIfError(appArcSession.GetAppInfo(appInfo, aUid));
hgs
parents:
diff changeset
   143
            User::LeaveIfError(appArcSession.GetAppCapability(
hgs
parents:
diff changeset
   144
                                   capabilityBuf, aUid));
hgs
parents:
diff changeset
   145
hgs
parents:
diff changeset
   146
            TApaAppCapability &caps = capabilityBuf();
hgs
parents:
diff changeset
   147
            TFileName appName = appInfo.iFullName;
hgs
parents:
diff changeset
   148
            CApaCommandLine *cmdLine = CApaCommandLine::NewLC();
hgs
parents:
diff changeset
   149
            cmdLine->SetExecutableNameL(appName);
hgs
parents:
diff changeset
   150
hgs
parents:
diff changeset
   151
            if (caps.iLaunchInBackground) {
hgs
parents:
diff changeset
   152
                cmdLine->SetCommandL(EApaCommandBackground);
hgs
parents:
diff changeset
   153
            } else {
hgs
parents:
diff changeset
   154
                cmdLine->SetCommandL(EApaCommandRun);
hgs
parents:
diff changeset
   155
            }
hgs
parents:
diff changeset
   156
hgs
parents:
diff changeset
   157
            cmdLine->SetTailEndL(aParam);
hgs
parents:
diff changeset
   158
hgs
parents:
diff changeset
   159
            User::LeaveIfError(appArcSession.StartApp(*cmdLine));
hgs
parents:
diff changeset
   160
hgs
parents:
diff changeset
   161
            CleanupStack::PopAndDestroy(cmdLine);
hgs
parents:
diff changeset
   162
            CleanupStack::PopAndDestroy(&appArcSession);
hgs
parents:
diff changeset
   163
        }
hgs
parents:
diff changeset
   164
        CleanupStack::PopAndDestroy(&wsSession);
hgs
parents:
diff changeset
   165
    }
hgs
parents:
diff changeset
   166
}
hgs
parents:
diff changeset
   167
hgs
parents:
diff changeset
   168
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   169
//
hgs
parents:
diff changeset
   170
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   171
//
hgs
parents:
diff changeset
   172
void CCaAppHandler::CloseApplicationL(CCaInnerEntry &aEntry)
hgs
parents:
diff changeset
   173
{
hgs
parents:
diff changeset
   174
    RWsSession wsSession;
hgs
parents:
diff changeset
   175
    User::LeaveIfError(wsSession.Connect());
hgs
parents:
diff changeset
   176
    CleanupClosePushL<RWsSession> (wsSession);
hgs
parents:
diff changeset
   177
hgs
parents:
diff changeset
   178
    if ((aEntry.GetFlags() & ERunning) &&
hgs
parents:
diff changeset
   179
            (!(aEntry.GetFlags() & ESystem))) {
hgs
parents:
diff changeset
   180
        RBuf value;
hgs
parents:
diff changeset
   181
        CleanupClosePushL(value);
hgs
parents:
diff changeset
   182
        value.CreateL(KCaMaxAttrValueLen);
hgs
parents:
diff changeset
   183
        if (aEntry.FindAttribute(KCaAttrWindowGroupId, value)) {
hgs
parents:
diff changeset
   184
            TInt wgId(KErrNotFound);
hgs
parents:
diff changeset
   185
            TLex16 parser(value);
hgs
parents:
diff changeset
   186
            if (KErrNone == parser.Val(wgId) && wgId > 0) {
hgs
parents:
diff changeset
   187
                TWsEvent event;
hgs
parents:
diff changeset
   188
                event.SetTimeNow();
hgs
parents:
diff changeset
   189
                event.SetType(KAknShutOrHideApp);
hgs
parents:
diff changeset
   190
                wsSession.SendEventToWindowGroup(wgId, event);
hgs
parents:
diff changeset
   191
            }
hgs
parents:
diff changeset
   192
        }
hgs
parents:
diff changeset
   193
        CleanupStack::PopAndDestroy(&value);
hgs
parents:
diff changeset
   194
    }
hgs
parents:
diff changeset
   195
hgs
parents:
diff changeset
   196
    CleanupStack::PopAndDestroy(&wsSession);
hgs
parents:
diff changeset
   197
}
hgs
parents:
diff changeset
   198