-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathskin.c
125 lines (112 loc) · 4.46 KB
/
skin.c
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
#include "skin.h"
#include "common.h"
#include "helper.h"
#include <vdr/skins.h>
namespace cDBusSkinHelper
{
static const char *_xmlNodeInfo =
"<!DOCTYPE node PUBLIC \"-//freedesktop//DTD D-BUS Object Introspection 1.0//EN\"\n"
" \"http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd\">\n"
"<node>\n"
" <interface name=\""DBUS_VDR_SKIN_INTERFACE"\">\n"
" <method name=\"CurrentSkin\">\n"
" <arg name=\"replycode\" type=\"i\" direction=\"out\"/>\n"
" <arg name=\"skin\" type=\"(iss)\" direction=\"out\"/>\n"
" </method>\n"
" <method name=\"ListSkins\">\n"
" <arg name=\"replycode\" type=\"i\" direction=\"out\"/>\n"
" <arg name=\"names\" type=\"a(iss)\" direction=\"out\"/>\n"
" </method>\n"
" <method name=\"SetSkin\">\n"
" <arg name=\"name\" type=\"s\" direction=\"in\"/>\n"
" <arg name=\"replycode\" type=\"i\" direction=\"out\"/>\n"
" <arg name=\"replymessage\" type=\"s\" direction=\"out\"/>\n"
" </method>\n"
" <method name=\"QueueMessage\">\n"
" <arg name=\"messageText\" type=\"s\" direction=\"in\"/>\n"
" <arg name=\"replycode\" type=\"i\" direction=\"out\"/>\n"
" <arg name=\"replymessage\" type=\"s\" direction=\"out\"/>\n"
" </method>\n"
" </interface>\n"
"</node>\n";
static GVariant *BuildSkin(cSkin *skin)
{
GVariantBuilder *struc = g_variant_builder_new(G_VARIANT_TYPE("(iss)"));
gint32 index = -1;
const char *name = "";
const char *description = "";
if (skin != NULL) {
index = skin->Index();
name = skin->Name();
description = skin->Description();
}
g_variant_builder_add(struc, "i", index);
g_variant_builder_add(struc, "s", name);
g_variant_builder_add(struc, "s", description);
GVariant *ret = g_variant_builder_end(struc);
g_variant_builder_unref(struc);
return ret;
}
static void CurrentSkin(cDBusObject *Object, GVariant *Parameters, GDBusMethodInvocation *Invocation)
{
GVariantBuilder *ret = g_variant_builder_new(G_VARIANT_TYPE("(i(iss))"));
g_variant_builder_add(ret, "i", 900);
g_variant_builder_add_value(ret, BuildSkin(Skins.Current()));
g_dbus_method_invocation_return_value(Invocation, g_variant_builder_end(ret));
g_variant_builder_unref(ret);
};
static void ListSkins(cDBusObject *Object, GVariant *Parameters, GDBusMethodInvocation *Invocation)
{
GVariantBuilder *ret = g_variant_builder_new(G_VARIANT_TYPE("(ia(iss))"));
g_variant_builder_add(ret, "i", 900);
GVariantBuilder *array = g_variant_builder_new(G_VARIANT_TYPE("a(iss)"));
for (cSkin* skin = Skins.First(); skin; skin = Skins.Next(skin))
g_variant_builder_add_value(array, BuildSkin(skin));
g_variant_builder_add_value(ret, g_variant_builder_end(array));
g_dbus_method_invocation_return_value(Invocation, g_variant_builder_end(ret));
g_variant_builder_unref(array);
g_variant_builder_unref(ret);
};
static void SetSkin(cDBusObject *Object, GVariant *Parameters, GDBusMethodInvocation *Invocation)
{
const char *name = NULL;
g_variant_get(Parameters, "(&s)", &name);
gint32 replyCode = 900;
cString replyMessage = cString::sprintf("set skin to '%s'", name);
if (*name == 0) {
replyCode = 501;
replyMessage = "no skin name given";
}
else if (!Skins.SetCurrent(name)) {
replyCode = 550;
replyMessage = cString::sprintf("can't set skin to '%s'", name);
}
cDBusHelper::SendReply(Invocation, replyCode, *replyMessage);
};
static void QueueMessage(cDBusObject *Object, GVariant *Parameters, GDBusMethodInvocation *Invocation)
{
const char *messageText = NULL;
g_variant_get(Parameters, "(&s)", &messageText);
gint32 replyCode = 501;
cString replyMessage;
if ((messageText != NULL) && (*messageText != 0)) {
Skins.QueueMessage(mtInfo, messageText);
replyCode = 250;
replyMessage = "Message queued";
}
else
replyMessage = "Missing message";
cDBusHelper::SendReply(Invocation, replyCode, replyMessage);
};
}
cDBusSkin::cDBusSkin(void)
:cDBusObject("/Skin", cDBusSkinHelper::_xmlNodeInfo)
{
AddMethod("CurrentSkin", cDBusSkinHelper::CurrentSkin);
AddMethod("ListSkins", cDBusSkinHelper::ListSkins);
AddMethod("SetSkin", cDBusSkinHelper::SetSkin);
AddMethod("QueueMessage", cDBusSkinHelper::QueueMessage);
}
cDBusSkin::~cDBusSkin(void)
{
}