/************************************************************************** ** ** Copyright (C) 2012-2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Installer Framework. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** **************************************************************************/ #ifndef PACKAGEMANAGERCORE_P_H #define PACKAGEMANAGERCORE_P_H #include "getrepositoriesmetainfojob.h" #include "settings.h" #include "packagemanagercore.h" #include "packagemanagercoredata.h" #include #include #include #include #include #include #include class FSEngineClientHandler; class KDJob; QT_FORWARD_DECLARE_CLASS(QFile) QT_FORWARD_DECLARE_CLASS(QFileInfo) using namespace KDUpdater; namespace QInstaller { struct BinaryLayout; class Component; class ComponentModel; class TempDirDeleter; class PackageManagerCorePrivate : public QObject { Q_OBJECT friend class PackageManagerCore; public: enum OperationType { Backup, Perform, Undo }; explicit PackageManagerCorePrivate(PackageManagerCore *core); explicit PackageManagerCorePrivate(PackageManagerCore *core, qint64 magicInstallerMaker, const OperationList &performedOperations); ~PackageManagerCorePrivate(); static bool isProcessRunning(const QString &name, const QList &processes); static bool performOperationThreaded(Operation *op, PackageManagerCorePrivate::OperationType type = PackageManagerCorePrivate::Perform); void initialize(const QHash ¶ms); bool isOfflineOnly() const; bool statusCanceledOrFailed() const; void setStatus(int status, const QString &error = QString()); QString targetDir() const; QString registerPath() const; QString uninstallerName() const; QString installerBinaryPath() const; void writeMaintenanceConfigFiles(); void readMaintenanceConfigFiles(const QString &targetDir); void writeUninstaller(OperationList performedOperations); QString componentsXmlPath() const; QString configurationFileName() const; bool buildComponentTree(QHash &components, bool loadScript); void clearAllComponentLists(); void clearUpdaterComponentLists(); QList &replacementDependencyComponents(RunMode mode); QHash > &componentsToReplace(RunMode mode); void clearComponentsToInstall(); bool appendComponentsToInstall(const QList &components); bool appendComponentToInstall(Component *components); QString installReason(Component *component); bool runInstaller(); bool isInstaller() const; bool runUninstaller(); bool isUninstaller() const; void runUpdater(); bool isUpdater() const; bool runPackageUpdater(); bool isPackageManager() const; QString replaceVariables(const QString &str) const; QByteArray replaceVariables(const QByteArray &str) const; void callBeginInstallation(const QList &componentList); void stopProcessesForUpdates(const QList &components); int countProgressOperations(const QList &components); int countProgressOperations(const OperationList &operations); void connectOperationToInstaller(Operation *const operation, double progressOperationPartSize); void connectOperationCallMethodRequest(Operation *const operation); Operation *createOwnedOperation(const QString &type); Operation *takeOwnedOperation(Operation *operation); Operation *createPathOperation(const QFileInfo &fileInfo, const QString &componentName); void registerPathesForUninstallation(const QList > &pathesForUninstallation, const QString &componentName); void addPerformed(Operation *op) { m_performedOperationsCurrentSession.append(op); } void commitSessionOperations() { m_performedOperationsOld += m_performedOperationsCurrentSession; m_performedOperationsCurrentSession.clear(); } void installComponent(Component *component, double progressOperationSize, bool adminRightsGained = false); bool appendComponentToUninstall(Component *component); bool appendComponentsToUninstall(const QList &components); signals: void installationStarted(); void installationFinished(); void uninstallationStarted(); void uninstallationFinished(); public: UpdateFinder *m_updateFinder; Application m_updaterApplication; FSEngineClientHandler *m_FSEngineClientHandler; int m_status; QString m_error; bool m_forceRestart; bool m_testChecksum; bool m_launchedAsRoot; bool m_completeUninstall; bool m_needToWriteUninstaller; PackageManagerCoreData m_data; QHash m_sharedFlags; QString m_installerBaseBinaryUnreplaced; QList m_rootComponents; QList m_rootDependencyReplacements; QList m_updaterComponents; QList m_updaterComponentsDeps; QList m_updaterDependencyReplacements; OperationList m_ownedOperations; OperationList m_performedOperationsOld; OperationList m_performedOperationsCurrentSession; bool m_dependsOnLocalInstallerBinary; private slots: void infoMessage(KDJob *, const QString &message) { emit m_core->metaJobInfoMessage(message); } void handleMethodInvocationRequest(const QString &invokableMethodName); private: void deleteUninstaller(); void registerUninstaller(); void unregisterUninstaller(); void writeUninstallerBinary(QFile *const input, qint64 size, bool writeBinaryLayout); void writeUninstallerBinaryData(QIODevice *output, QFile *const input, const OperationList &performed, const BinaryLayout &layout); void runUndoOperations(const OperationList &undoOperations, double undoOperationProgressSize, bool adminRightsGained, bool deleteOperation); PackagesList remotePackages(); LocalPackagesHash localInstalledPackages(); bool fetchMetaInformationFromRepositories(); bool addUpdateResourcesFromRepositories(bool parseChecksum); void realAppendToInstallComponents(Component *component); void insertInstallReason(Component *component, const QString &reason); private: PackageManagerCore *m_core; GetRepositoriesMetaInfoJob *m_repoMetaInfoJob; bool m_updates; bool m_repoFetched; bool m_updateSourcesAdded; qint64 m_magicBinaryMarker; bool m_componentsToInstallCalculated; // < name (component to replace), < replacement component, component to replace > > QHash > m_componentsToReplaceAllMode; QHash > m_componentsToReplaceUpdaterMode; //calculate installation order variables QList m_orderedComponentsToInstall; QHash > m_visitedComponents; QSet m_toInstallComponentIds; //for faster lookups //we can't use this reason hash as component id hash, because some reasons are ready before //the component is added QHash m_toInstallComponentIdReasonHash; QSet m_componentsToUninstall; QString m_componentsToInstallError; FileDownloaderProxyFactory *m_proxyFactory; ComponentModel *m_defaultModel; ComponentModel *m_updaterModel; private: // remove once we deprecate isSelected, setSelected etc... void resetComponentsToUserCheckedState(); QHash m_coreCheckedHash; void setCheckedState(Component *component, Qt::CheckState state); }; } // namespace QInstaller #endif // PACKAGEMANAGERCORE_P_H