blob: 39a890b498a1c2b8b15092030c2ae18de1ae47eb (
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
95
96
97
98
99
100
101
102
103
104
105
106
107
108
|
#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();
if (metadata.contains("clsid")) {
QSettings* comServer;
if (metadata.value("global").toBool()) {
comServer = new QSettings(QStringLiteral("HKEY_LOCAL_MACHINE\\SOFTWARE\\Classes\\CLSID"), QSettings::NativeFormat);
} else {
comServer = new QSettings(QStringLiteral("HKEY_CURRENT_USER\\SOFTWARE\\Classes\\CLSID"), QSettings::NativeFormat);
}
comServer->remove(metadata.value("clsid").toString());
comServer->sync();
comServer->deleteLater();
}
//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;
}
|