appinstaller/AppinstUi/sisxsifplugin/tsrc/testinstaller/testinstaller.cpp
branchRCL_3
changeset 65 7333d7932ef7
--- /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 <hbmainwindow.h>
+#include <hbview.h>
+#include <hbtoolbar.h>
+#include <hbpushbutton.h>
+#include <hbcheckbox.h>
+#include <hbcombobox.h>
+#include <hblabel.h>
+#include <hbmessagebox.h>
+#include <QGraphicsLinearLayout>
+#include <QDir>
+#include <xqappmgr.h>                       // XQApplicationManager
+#include <usif/scr/scr.h>                   // 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<Qt::CheckState>(state);
+    mUseSilentInstall = (s == Qt::Checked);
+}
+
+void TestInstaller::silentRemoveCheckChanged(int state)
+{
+    Qt::CheckState s = static_cast<Qt::CheckState>(state);
+    mUseSilentUninstall = (s == Qt::Checked);
+}
+
+void TestInstaller::rfileCheckChanged(int state)
+{
+    Qt::CheckState s = static_cast<Qt::CheckState>(state);
+    mUseRFileInstall = (s == Qt::Checked);
+}
+
+void TestInstaller::ocspCheckChanged(int state)
+{
+    Qt::CheckState s = static_cast<Qt::CheckState>(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<QString> 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<QFileInfo> 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<TComponentId> 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<CIntPropertyEntry*>(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, &registry);  // 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<QVariant> 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;
+        }
+    }
+}
+