diff -r 053c6c7c14f3 -r 0efa10d348c0 contentstorage/cahandler/app/src/caapphandler.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/contentstorage/cahandler/app/src/caapphandler.cpp Tue Aug 31 15:30:51 2010 +0300 @@ -0,0 +1,246 @@ +/* + * Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). + * All rights reserved. + * This component and the accompanying materials are made available + * under the terms of "Eclipse Public License v1.0" + * which accompanies this distribution, and is available + * at the URL "http://www.eclipse.org/legal/epl-v10.html". + * + * Initial Contributors: + * Nokia Corporation - initial contribution. + * + * Contributors: + * + * Description: ?Description + * + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include +#include + +#include "caapphandler.h" +#include "cainnerentry.h" +#include "causifuninstalloperation.h" +#include "catasklist.h" +#include "cautils.h" +#include "caclient_defines.h" +#include "cadef.h" + +using namespace Usif; + +static const char caTypeApp[] = "application"; +static const char caTypePackage[] = "package"; +static const char caTypeWidget[] = "widget"; +static const char caAttrView[] = "view"; +static const char caCmdClose[] = "close"; +static const char caAttrWindowGroupId[] = "window_group_id"; +static const char caAttrComponentId[] = "component_id"; + +/*! + * Command handler for application entries. + * + * \lib caclient.lib + */ + +/*! + * Constructor. + */ +CaAppHandler::CaAppHandler(QObject *parent): + iEikEnv(CEikonEnv::Static()), + iUsifUninstallOperation(NULL) +{ + Q_UNUSED(parent); +} + +/*! + * Destructor. + */ +CaAppHandler::~CaAppHandler() +{ + delete iUsifUninstallOperation; +} + +/*! + * Execute a given command. + * \param entry a reference to a CaEntry instance. + * \param command a given command. + * \retval an error code. + */ +int CaAppHandler::execute(const CaEntry &entry, const QString &command) +{ + int result(KErrGeneral); + if (command == caCmdOpen && entry.entryTypeName() == caTypeApp) { + QString viewIdValue = entry.attribute(caAttrView); + bool viewIdIsCorrect(true); + int viewId(-1); + if (!viewIdValue.isNull()) { + viewId = viewIdValue.toInt(&viewIdIsCorrect, 0); + } + if (viewIdIsCorrect) { + QString uidValue = + entry.attribute(APPLICATION_UID_ATTRIBUTE_NAME); + int uid = uidValue.toInt(); + TRAP(result, launchApplicationL(TUid::Uid(uid), viewId)); + } + } else if (command == caCmdClose && entry.entryTypeName() == caTypeApp ) { + QString windowGroupId = entry.attribute(caAttrWindowGroupId); + if (!windowGroupId.isNull()) { + result = closeApplication(entry.flags(), windowGroupId.toInt()); + } + } else if (command == caCmdRemove) { + QString componentId(entry.attribute(caAttrComponentId)); + result = handleRemove(entry.flags(), + entry.entryTypeName(), + componentId); + } else { + result = KErrNotSupported; + } + + return result; +} + +/*! + * Launch application + * \param uid UID of the application to launch. + * \param viewId id of the view the application is to start in. + */ +void CaAppHandler::launchApplicationL(const TUid uid, TInt viewId) +{ + if (viewId > 0 && iEikEnv) { + TVwsViewId view(uid, TUid::Uid(viewId)); + iEikEnv->EikAppUi()->ActivateViewL( view ); + } else { + RWsSession wsSession; + User::LeaveIfError(wsSession.Connect()); + CleanupClosePushL(wsSession); + + CCaTaskList* taskList = CCaTaskList::NewLC(wsSession); + TApaTask task = taskList->FindRootApp(uid); + CleanupStack::PopAndDestroy(taskList); + + if (task.Exists()) { + task.BringToForeground(); + } else { + // TApaAppInfo size is greater then 1024 bytes + // so its instances should not be created on the stack. + TApaAppInfo* appInfo = new(ELeave) TApaAppInfo; + CleanupStack::PushL(appInfo); + TApaAppCapabilityBuf capabilityBuf; + RApaLsSession appArcSession; + User::LeaveIfError(appArcSession.Connect()); + CleanupClosePushL(appArcSession); + + User::LeaveIfError(appArcSession.GetAppInfo(*appInfo, uid)); + User::LeaveIfError(appArcSession.GetAppCapability( + capabilityBuf, uid)); + + TApaAppCapability &caps = capabilityBuf(); + CApaCommandLine *cmdLine = CApaCommandLine::NewLC(); + cmdLine->SetExecutableNameL(appInfo->iFullName); + + if (caps.iLaunchInBackground) { + cmdLine->SetCommandL(EApaCommandBackground); + } else { + cmdLine->SetCommandL(EApaCommandRun); + } + + cmdLine->SetTailEndL(KNullDesC8); + + User::LeaveIfError(appArcSession.StartApp(*cmdLine)); + + CleanupStack::PopAndDestroy(cmdLine); + CleanupStack::PopAndDestroy(&appArcSession); + CleanupStack::PopAndDestroy(appInfo); + } + CleanupStack::PopAndDestroy( &wsSession ); + } +} + +/*! + * Closes application. + * \param flags an entry flags. + * \param windowGroupId window group id. + * \retval an error code. + */ +int CaAppHandler::closeApplication(const EntryFlags &flags, int windowGroupId) +{ + int result(KErrNone); + if (flags.testFlag(RunningEntryFlag) && windowGroupId > 0) { + RWsSession wsSession; + result = wsSession.Connect(); + if (result==KErrNone) { + TWsEvent event; + event.SetTimeNow(); + event.SetType(KAknShutOrHideApp); + wsSession.SendEventToWindowGroup(windowGroupId, event); + } + wsSession.Close(); + } + return result; +} + +/*! + * Uninstall application. + * \param flags flags of the application which is to uninstall. + * \param typeName type name of the entry. + * \param componentId component id. + * \retval an error code. + */ +int CaAppHandler::handleRemove(const EntryFlags &flags, + const QString &typeName, + const QString &componentId) +{ + int result(KErrNone); + if (flags.testFlag(RemovableEntryFlag)) { + if (typeName == caTypeApp + || typeName == caTypePackage + || typeName == caTypeWidget) { + if(componentId.isNull()) { + result = KErrNotFound; + } else { + bool convertStatus(false); + int id = componentId.toInt(&convertStatus); + if (convertStatus) { + TRAP(result, startUsifUninstallL(id)); + } else { + result = KErrGeneral; + } + } + } + else { + result = KErrNotSupported; + } + } else { + result = KErrAccessDenied; + } + return result; +} + +/*! + * Start uninstall operation via usif. + * \param componentId component id. + */ +void CaAppHandler::startUsifUninstallL(TInt componentId) +{ + if (iUsifUninstallOperation && iUsifUninstallOperation->IsActive()) { + User::Leave( KErrInUse ); + } + delete iUsifUninstallOperation; + iUsifUninstallOperation = NULL; + iUsifUninstallOperation = CCaUsifUninstallOperation::NewL(componentId); +} +