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

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

}

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

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

    if (sock->serverName() == "") {
        qDebug() << "Required argument --socket 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(QApplication::applicationDirPath() + "/uninstall.json");
    metadataFile.open(QFile::ReadOnly);
    QJsonObject metadata = QJsonDocument::fromJson(metadataFile.readAll()).object();

    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();

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