aboutsummaryrefslogtreecommitdiff
path: root/installer/process/removeworker.cpp
blob: 5356f2617251436d9e2e06ce0a2a22f498f734e3 (plain) (blame)
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
#include "removeworker.h"

RemoveWorker::RemoveWorker(QObject *parent) : QObject(parent)
{

}

bool RemoveWorker::startWork() {
    QLocalSocket* sock = new QLocalSocket();
    QString metadataFilePath;

    QString previousToken;
    for (QString arg : QApplication::arguments()) {
        if (previousToken != "") {
            if (previousToken == "--socket") {
                sock->setServerName(arg);
            } else if (previousToken == "--uninstallmetadata") {
                metadataFilePath = arg;
            }
            previousToken = "";
        } else {
            if (arg == "--socket" || arg == "--uninstallmetadata") {
                previousToken = arg;
            }
        }
    }

    if (sock->serverName() == "") {
        qDebug() << "Required argument --socket missing";
        return false;
    }

    if (metadataFilePath == "") {
        qDebug() << "Required argument --uninstallmetadata missing";
        return false;
    }

    qDebug() << "Connecting to socket server...";
    sock->connectToServer();
    if (!sock->waitForConnected()) {
        qDebug() << "Failed to connect to socket server";
        return false;
    }
    connect(sock, &QLocalSocket::disconnected, [=] {
        qDebug() << "Socket closed";
        QApplication::exit(1);
    });

    QFile metadataFile(metadataFilePath);
    metadataFile.open(QFile::ReadOnly);
    QJsonObject metadata = QJsonDocument::fromJson(metadataFile.readAll()).object();
    metadataFile.close();

    QString name = metadata.value("name").toString();
    QString vendor = metadata.value("vendor").toString();

    sock->write(QString("STATUS ").append(tr("Removing %1...").arg(name)).append("\n").toUtf8());

    //Remove Start menu entry
    QDir startMenu;
    if (metadata.value("global").toBool()) {
        startMenu = QDir("C:/ProgramData/Microsoft/Windows/Start Menu/Programs");
    } else {
        startMenu = QDir(QStandardPaths::writableLocation(QStandardPaths::ApplicationsLocation));
    }
    startMenu.cd(vendor + "/" + name);
    startMenu.removeRecursively();
    startMenu.cdUp();
    if (startMenu.entryList(QDir::NoDotAndDotDot | QDir::Files | QDir::Dirs).count() == 0) {
        startMenu.removeRecursively();
    }

    //Remove items in installation directory
    QDir dest(metadata.value("installPath").toString());
    dest.removeRecursively();

    //Remove registry entry
    QSettings* settings;
    if (metadata.value("global").toBool()) {
        settings = new QSettings("HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall", QSettings::NativeFormat);
    } else {
        settings = new QSettings("HKEY_CURRENT_USER\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall", QSettings::NativeFormat);
    }
    settings->remove(metadata.value("registryUuid").toString());
    settings->sync();

    sock->write("COMPLETE\n");
    sock->flush();
    sock->waitForBytesWritten();
    QTimer::singleShot(0, [=] {
        QApplication::exit(0);
    });
    return 0;
}