summaryrefslogtreecommitdiffstats
path: root/api/logic/updater/GoUpdate.h
blob: 8f92bb996998c030a6ef3c14f143af13070fbb39 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
#pragma once
#include <QByteArray>
#include <net/NetJob.h>

#include "multimc_logic_export.h"

namespace GoUpdate
{

/**
 * A temporary object exchanged between updated checker and the actual update task
 */
struct MULTIMC_LOGIC_EXPORT Status
{
    bool updateAvailable = false;

    int newVersionId = -1;
    QString newRepoUrl;

    int currentVersionId = -1;
    QString currentRepoUrl;

    // path to the root of the application
    QString rootPath;
};

/**
 * Struct that describes an entry in a VersionFileEntry's `Sources` list.
 */
struct MULTIMC_LOGIC_EXPORT FileSource
{
    FileSource(QString type, QString url, QString compression="")
    {
        this->type = type;
        this->url = url;
        this->compressionType = compression;
    }

    bool operator==(const FileSource &f2) const
    {
        return type == f2.type && url == f2.url && compressionType == f2.compressionType;
    }

    QString type;
    QString url;
    QString compressionType;
};
typedef QList<FileSource> FileSourceList;

/**
 * Structure that describes an entry in a GoUpdate version's `Files` list.
 */
struct MULTIMC_LOGIC_EXPORT VersionFileEntry
{
    QString path;
    int mode;
    FileSourceList sources;
    QString md5;
    bool operator==(const VersionFileEntry &v2) const
    {
        return path == v2.path && mode == v2.mode && sources == v2.sources && md5 == v2.md5;
    }
};
typedef QList<VersionFileEntry> VersionFileList;

/**
 * Structure that describes an operation to perform when installing updates.
 */
struct MULTIMC_LOGIC_EXPORT Operation
{
    static Operation CopyOp(QString from, QString to, int fmode=0644)
    {
        return Operation{OP_REPLACE, from, to, fmode};
    }
    static Operation DeleteOp(QString file)
    {
        return Operation{OP_DELETE, QString(), file, 0644};
    }

    // FIXME: for some types, some of the other fields are irrelevant!
    bool operator==(const Operation &u2) const
    {
        return type == u2.type &&
            source == u2.source &&
            destination == u2.destination &&
            destinationMode == u2.destinationMode;
    }

    //! Specifies the type of operation that this is.
    enum Type
    {
        OP_REPLACE,
        OP_DELETE,
    } type;

    //! The source file, if any
    QString source;

    //! The destination file.
    QString destination;

    //! The mode to change the destination file to.
    int destinationMode;
};
typedef QList<Operation> OperationList;

/**
 * Loads the file list from the given version info JSON object into the given list.
 */
bool MULTIMC_LOGIC_EXPORT parseVersionInfo(const QByteArray &data, VersionFileList& list, QString &error);

/*!
 * Takes a list of file entries for the current version's files and the new version's files
 * and populates the downloadList and operationList with information about how to download and install the update.
 */
bool MULTIMC_LOGIC_EXPORT processFileLists
(
    const VersionFileList &currentVersion,
    const VersionFileList &newVersion,
    const QString &rootPath,
    const QString &tempPath,
    NetJobPtr job,
    OperationList &ops
);

}
Q_DECLARE_METATYPE(GoUpdate::Status)