-
Notifications
You must be signed in to change notification settings - Fork 126
/
client-qt.cc
120 lines (91 loc) · 2.86 KB
/
client-qt.cc
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
// g++ client-qt.cc -o client-qt -Wall -O2 -lQtCore -lQtDBus
#include <QtCore/QCoreApplication>
#include <QtCore/QDebug>
#include <QtDBus/QtDBus>
enum SnapshotType { SINGLE, PRE, POST };
struct Snapshot
{
unsigned int num;
SnapshotType type;
unsigned int pre_num;
QDateTime date;
uid_t uid;
QString description;
QString cleanup;
QMap<QString, QString> userdata;
};
Q_DECLARE_METATYPE(Snapshot)
QDBusArgument& operator<<(QDBusArgument& argument, const Snapshot& mystruct)
{
argument.beginStructure();
argument << mystruct.num << static_cast<unsigned short>(mystruct.type) << mystruct.pre_num
<< mystruct.date.toTime_t() << mystruct.uid << mystruct.description
<< mystruct.cleanup << mystruct.userdata;
argument.endStructure();
return argument;
}
const QDBusArgument& operator>>(const QDBusArgument& argument, Snapshot& mystruct)
{
unsigned short tmp1;
unsigned long long tmp2;
argument.beginStructure();
argument >> mystruct.num >> tmp1 >> mystruct.pre_num >> tmp2 >> mystruct.uid
>> mystruct.description >> mystruct.cleanup >> mystruct.userdata;
argument.endStructure();
mystruct.type = static_cast<SnapshotType>(tmp1);
mystruct.date.setTime_t(tmp2);
return argument;
}
void
command_list_snapshots()
{
QDBusInterface dbus_iface("org.opensuse.Snapper", "/org/opensuse/Snapper",
"org.opensuse.Snapper", QDBusConnection::systemBus());
QDBusMessage reply = dbus_iface.call("ListSnapshots", "root");
// qDebug() << reply;
// qDebug() << (reply.type() == QDBusMessage::ReplyMessage);
if (reply.type() == QDBusMessage::ErrorMessage)
{
fprintf(stderr, "error: %s, %s\n", qPrintable(reply.errorMessage()),
qPrintable(reply.errorName()));
return;
}
QList<QVariant> args = reply.arguments();
// qDebug() << args.size();
QDBusArgument arg = args.at(0).value<QDBusArgument>();
// qDebug() << arg.currentSignature();
QList<Snapshot> snapshots;
arg >> snapshots;
QListIterator<Snapshot> it(snapshots);
while (it.hasNext())
{
const Snapshot& snapshot = it.next();
printf("%d %d %d", snapshot.num, snapshot.type, snapshot.pre_num);
if (snapshot.date.toTime_t() == (uint)(-1))
printf(" %s", "now");
else
printf(" %s", qPrintable(snapshot.date.toString()));
printf(" %d", snapshot.uid);
printf(" %s", qPrintable(snapshot.description));
QMapIterator<QString, QString> it2(snapshot.userdata);
while (it2.hasNext())
{
it2.next();
printf(" %s=%s", qPrintable(it2.key()), qPrintable(it2.value()));
}
printf("\n");
}
}
int
main(int argc, char** argv)
{
QCoreApplication app(argc, argv);
qDBusRegisterMetaType<Snapshot>();
if (!QDBusConnection::systemBus().isConnected())
{
fprintf(stderr, "Cannot connect to the D-Bus system bus.\n");
return 1;
}
command_list_snapshots();
return 0;
}