diff -r 5cc91383ab1e -r 7333d7932ef7 appinstaller/AppinstUi/sisxsifplugin/tsrc/testinstaller/testinstaller.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/appinstaller/AppinstUi/sisxsifplugin/tsrc/testinstaller/testinstaller.cpp Tue Aug 31 15:21:33 2010 +0300 @@ -0,0 +1,475 @@ +/* +* Copyright (c) 2010 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: Test installer that uses Usif::RSoftwareInstall API. +* +*/ + +#include "testinstaller.h" +#include "activerunner.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include // XQApplicationManager +#include // RSoftwareComponentRegistry + +using namespace Usif; + +#define INSTALLS_PATH_1 "C:\\Data\\Installs\\" +#define INSTALLS_PATH_2 "E:\\Installs\\" +#define INSTALLS_PATH_3 "F:\\Installs\\" +#define INSTALLS_PATH_4 "C:\\" +#define INSTALLS_PATH_5 "E:\\" +#define INSTALLS_PATH_6 "F:\\" + + +TestInstaller::TestInstaller(int& argc, char* argv[]) : HbApplication(argc, argv), + mMainWindow(0), mInstallView(0), mRemoveView(0), + mUseSilentInstall(false), mUseSilentUninstall(false), mUseRFileInstall(false), mOcsp(false), + mInstallDirectories(0), mInstallableFiles(0), mRemovableApps(0), + mCurrentDirPath(), mCurrentFile(), mRunner(0) +{ + mMainWindow = new HbMainWindow(); + + // Install view + mInstallView = new HbView(); + mInstallView->setTitle(tr("Test Installer")); + + QGraphicsLinearLayout *installLayout = new QGraphicsLinearLayout(Qt::Vertical); + + HbLabel *installTitle = new HbLabel(tr("Install:")); + installLayout->addItem(installTitle); + + mInstallDirectories = new HbComboBox; + mInstallDirectories->setEditable(false); + QStringList dirList; + getInstallDirs(dirList); + mInstallDirectories->setItems(dirList); + connect(mInstallDirectories, SIGNAL(currentIndexChanged(int)), + this, SLOT(installableDirChanged(int))); + installLayout->addItem(mInstallDirectories); + + mInstallableFiles = new HbComboBox; + mInstallableFiles->setEditable(false); + connect(mInstallableFiles, SIGNAL(currentIndexChanged(int)), + this, SLOT(installableFileChanged(int))); + installLayout->addItem(mInstallableFiles); + + QGraphicsLinearLayout *checkboxesLayout = new QGraphicsLinearLayout(Qt::Horizontal); + HbCheckBox *silentInstallCheckBox = new HbCheckBox; + silentInstallCheckBox->setText(tr("Silent")); + connect(silentInstallCheckBox, SIGNAL(stateChanged(int)), + this, SLOT(silentInstallCheckChanged(int))); + checkboxesLayout->addItem(silentInstallCheckBox); + HbCheckBox *rfileCheckBox = new HbCheckBox; + rfileCheckBox->setText(tr("Use RFile")); + connect(rfileCheckBox, SIGNAL(stateChanged(int)), this, SLOT(rfileCheckChanged(int))); + checkboxesLayout->addItem(rfileCheckBox); + HbCheckBox *ocspCheckBox = new HbCheckBox; + ocspCheckBox->setText(tr("OCSP")); + connect(ocspCheckBox, SIGNAL(stateChanged(int)), this, SLOT(ocspCheckChanged(int))); + checkboxesLayout->addItem(ocspCheckBox); + installLayout->addItem(checkboxesLayout); + installLayout->addStretch(); + + HbPushButton *installNew = new HbPushButton(tr("Install using new API")); + installLayout->addItem(installNew); + HbPushButton *installOld = new HbPushButton(tr("Install using old API")); + installLayout->addItem(installOld); + HbPushButton *launchApp = new HbPushButton(tr("Install by opening file")); + installLayout->addItem(launchApp); + HbPushButton *cancelInstall = new HbPushButton(tr("Cancel installing")); + installLayout->addItem(cancelInstall); + installLayout->addStretch(); + connect(installNew, SIGNAL(clicked()), this, SLOT(installUsingNewApi())); + connect(installOld, SIGNAL(clicked()), this, SLOT(installUsingOldApi())); + connect(launchApp, SIGNAL(clicked()), this, SLOT(installByOpeningFile())); + connect(cancelInstall, SIGNAL(clicked()), this, SLOT(cancelInstalling())); + + HbToolBar *installToolBar = new HbToolBar(); + installToolBar->addAction(tr("RemoveView"), this, SLOT(removeViewActivated())); + installToolBar->addAction(tr("Exit"), this, SLOT(closeApp())); + mInstallView->setToolBar(installToolBar); + + mInstallView->setLayout(installLayout); + mMainWindow->addView(mInstallView); + + // Remove view + mRemoveView = new HbView(); + mRemoveView->setTitle(tr("Test Uninstaller")); + + QGraphicsLinearLayout *removeLayout = new QGraphicsLinearLayout(Qt::Vertical); + + HbLabel *uninstallTitle = new HbLabel(tr("Uninstall:")); + removeLayout->addItem(uninstallTitle); + + mRemovableApps = new HbComboBox; + mRemovableApps->setEditable(false); + removeLayout->addItem(mRemovableApps); + + HbCheckBox *silentRemoveCheckBox = new HbCheckBox; + silentRemoveCheckBox->setText(tr("Silent")); + connect(silentRemoveCheckBox, SIGNAL(stateChanged(int)), + this, SLOT(silentCheckChanged(int))); + removeLayout->addItem(silentRemoveCheckBox); + removeLayout->addStretch(); + + HbPushButton *removeNew = new HbPushButton(tr("Remove using new API")); + removeLayout->addItem(removeNew); + HbPushButton *removeOld = new HbPushButton(tr("Remove using old API")); + removeLayout->addItem(removeOld); + removeLayout->addStretch(); + connect(removeNew, SIGNAL(clicked()), this, SLOT(removeUsingNewApi())); + connect(removeOld, SIGNAL(clicked()), this, SLOT(removeUsingOldApi())); + + mRemoveView->setLayout(removeLayout); + mMainWindow->addView(mRemoveView); + + HbToolBar *removeToolBar = new HbToolBar(); + removeToolBar->addAction(tr("InstallView"), this, SLOT(installViewActivated())); + removeToolBar->addAction(tr("Exit"), this, SLOT(closeApp())); + mRemoveView->setToolBar(removeToolBar); + + mMainWindow->setCurrentView(mInstallView); + mMainWindow->show(); + + changeDir(mInstallDirectories->currentText()); + getRemovableApps(); +} + +TestInstaller::~TestInstaller() +{ + delete mRunner; + delete mInstallView; + delete mRemoveView; + delete mMainWindow; +} + +void TestInstaller::installViewActivated() +{ + mMainWindow->setCurrentView(mInstallView); +} + +void TestInstaller::removeViewActivated() +{ + mMainWindow->setCurrentView(mRemoveView); +} + +void TestInstaller::silentInstallCheckChanged(int state) +{ + Qt::CheckState s = static_cast(state); + mUseSilentInstall = (s == Qt::Checked); +} + +void TestInstaller::silentRemoveCheckChanged(int state) +{ + Qt::CheckState s = static_cast(state); + mUseSilentUninstall = (s == Qt::Checked); +} + +void TestInstaller::rfileCheckChanged(int state) +{ + Qt::CheckState s = static_cast(state); + mUseRFileInstall = (s == Qt::Checked); +} + +void TestInstaller::ocspCheckChanged(int state) +{ + Qt::CheckState s = static_cast(state); + mOcsp = (s == Qt::Checked); +} + +void TestInstaller::installableDirChanged(int /*index*/) +{ + if (mInstallDirectories) { + changeDir(mInstallDirectories->currentText()); + } +} + +void TestInstaller::installableFileChanged(int /*index*/) +{ + if (mInstallableFiles) { + mCurrentFile = mCurrentDirPath; + mCurrentFile.append(mInstallableFiles->currentText()); + } +} + +void TestInstaller::installUsingNewApi() +{ + if (isFileSelected() && createRunner(true)) { + doInstall(mCurrentFile); + } +} + +void TestInstaller::installUsingOldApi() +{ + if (isFileSelected() && createRunner(false)) { + doInstall(mCurrentFile); + } +} + +void TestInstaller::installByOpeningFile() +{ + if (mInstallableFiles) { + doOpenFile(mCurrentFile); + } +} + +void TestInstaller::cancelInstalling() +{ + if (mRunner) { + delete mRunner; + mRunner = 0; + HbMessageBox::warning(tr("Running operation deleted")); + } else { + HbMessageBox::warning(tr("No operation running")); + } +} + +void TestInstaller::removeUsingNewApi() +{ + if (isFileSelected() && createRunner(true)) { + removeSelectedUsingNewApi(); + } +} + +void TestInstaller::removeUsingOldApi() +{ + if (isFileSelected() && createRunner(false)) { + removeSelectedUsingOldApi(); + } +} + +void TestInstaller::handleComplete() +{ + HbMessageBox::information(tr("Completed")); + + delete mRunner; + mRunner = 0; + + changeDir(mCurrentDirPath); + getRemovableApps(); +} + +void TestInstaller::handleError(int error) +{ + QString messageText; + if (error == KErrCancel) { + messageText = tr("Cancelled"); + } else { + messageText = tr("Error %1").arg(error); + } + HbMessageBox::warning(messageText); + + delete mRunner; + mRunner = 0; +} + +void TestInstaller::closeApp() +{ + qApp->exit(); +} + +void TestInstaller::fileOpenOk(const QVariant &/*result*/) +{ + HbMessageBox::information(tr("Open ok")); +} + +void TestInstaller::fileOpenFailed(int errorCode, const QString &errorMsg) +{ + HbMessageBox::warning(tr("Open failed: %1: %2").arg(errorCode).arg(errorMsg)); +} + +void TestInstaller::getInstallDirs(QStringList& dirList) +{ + QStringList possibleDirs; + possibleDirs << INSTALLS_PATH_1 << INSTALLS_PATH_2 << INSTALLS_PATH_3 + << INSTALLS_PATH_4 << INSTALLS_PATH_5 << INSTALLS_PATH_6; + + QListIterator iter(possibleDirs); + while (iter.hasNext()) { + QString dirName(iter.next()); + QDir dir(dirName); + if (dir.exists()) { + dirList.append(dirName); + } + } +} + +void TestInstaller::changeDir(const QString& dirPath) +{ + QDir dir(dirPath); + if (dir.exists()) { + mCurrentDirPath = dirPath; + mInstallableFiles->clear(); + + QFileInfoList list = dir.entryInfoList(QDir::Files); + QListIterator iter(list); + while (iter.hasNext()) { + const QFileInfo &info(iter.next()); + mInstallableFiles->addItem(info.fileName()); + } + + mCurrentFile.clear(); + if (mInstallableFiles->count()) { + mCurrentFile = mCurrentDirPath; + mCurrentFile.append(mInstallableFiles->currentText()); + } + } +} + +void TestInstaller::getRemovableApps() +{ + TRAP_IGNORE(doGetRemovableAppsL()); +} + +void TestInstaller::doGetRemovableAppsL() +{ + mRemovableApps->clear(); + mRemovableComponentIds.clear(); + mRemovableUids.clear(); + mRemovableSoftwareTypes.clear(); + + RSoftwareComponentRegistry registry; + User::LeaveIfError(registry.Connect()); + CleanupClosePushL(registry); + + RArray componentIdList; + CleanupClosePushL( componentIdList ); + registry.GetComponentIdsL(componentIdList); + for (int i = 0; i < componentIdList.Count(); ++i) { + TComponentId compId = componentIdList[i]; + CComponentEntry *compEntry = CComponentEntry::NewLC(); + if (registry.GetComponentL(compId, *compEntry)) { + if (compEntry->IsRemovable()) { + TPtrC compName = compEntry->Name(); + QString name = QString::fromUtf16(compName.Ptr(), compName.Length()); + mRemovableApps->addItem(name); + + mRemovableComponentIds.append(compId); + + _LIT(KCompUid, "CompUid"); + CPropertyEntry *property = registry.GetComponentPropertyL(compId, KCompUid); + CleanupStack::PushL(property); + CIntPropertyEntry* intProperty = dynamic_cast(property); + mRemovableUids.append(TUid::Uid(intProperty->IntValue())); + CleanupStack::PopAndDestroy(property); + + TPtrC softwareType = compEntry->SoftwareType(); + if (softwareType == KSoftwareTypeNative) { + mRemovableSoftwareTypes.append(Native); + } else if (softwareType == KSoftwareTypeJava) { + mRemovableSoftwareTypes.append(Java); + } else { + mRemovableSoftwareTypes.append(Unknown); + } + } + } + CleanupStack::PopAndDestroy(compEntry); + } + + CleanupStack::PopAndDestroy(2, ®istry); // componentIdList, registry +} + +bool TestInstaller::isFileSelected() +{ + if (mCurrentFile.isEmpty()) { + HbMessageBox::warning(tr("No files selected")); + changeDir(mCurrentDirPath); + return false; + } + return true; +} + +bool TestInstaller::createRunner(bool useSif) +{ + if (!mRunner) { + mRunner = new ActiveRunner(useSif); + connect(mRunner, SIGNAL(opCompleted()), this, SLOT(handleComplete())); + connect(mRunner, SIGNAL(opFailed(int)), this, SLOT(handleError(int))); + } else { + HbMessageBox::warning(tr("Already running")); + return false; + } + return true; +} + +void TestInstaller::doInstall(const QString &fileName) +{ + if (mRunner) { + mRunner->install(fileName, mUseSilentInstall, mUseRFileInstall, mOcsp ); + } +} + +void TestInstaller::doOpenFile(const QString &fileName) +{ + QFile file(fileName); + if (file.exists()) { + XQApplicationManager appManager; + XQAiwRequest *request = appManager.create(file); + if (request) { + connect(request, SIGNAL(requestOk(const QVariant &)), + this, SLOT(fileOpenOk(const QVariant &))); + connect(request, SIGNAL(requestError(int, const QString &)), + this, SLOT(fileOpenFailed(int, const QString &))); + QList args; + args << file.fileName(); + request->setArguments(args); + if (request->send()) { + HbMessageBox::information(tr("Opening...")); + } else { + HbMessageBox::warning(tr("Cannot open")); + } + delete request; + } else { + HbMessageBox::warning(tr("No handler for file '%1'").arg(fileName)); + } + } +} + +void TestInstaller::removeSelectedUsingNewApi() +{ + if (mRemovableApps && mRunner) { + int index = mRemovableApps->currentIndex(); + const TComponentId &compId(mRemovableComponentIds.at(index)); + mRunner->remove(compId, mUseSilentUninstall); + } +} + +void TestInstaller::removeSelectedUsingOldApi() +{ + if (mRemovableApps && mRunner) { + int index = mRemovableApps->currentIndex(); + const TUid &uid(mRemovableUids.at(index)); + + if (mRemovableSoftwareTypes.at(index) == Native) { + _LIT8(KSisxMimeType, "x-epoc/x-sisx-app"); + mRunner->remove(uid, KSisxMimeType, mUseSilentInstall); + } else if (mRemovableSoftwareTypes.at(index) == Java) { + _LIT8(KJarMIMEType, "application/java-archive"); + mRunner->remove(uid, KJarMIMEType, mUseSilentInstall); + } else { + HbMessageBox::warning(tr("Not supported software type")); + delete mRunner; + mRunner = 0; + } + } +} +