2 * Copyright (C) 2005-2013 Team XBMC
5 * This Program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2, or (at your option)
10 * This Program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License
16 * along with XBMC; see the file COPYING. If not, see
17 * <http://www.gnu.org/licenses/>.
22 #include "utils/log.h"
24 CVariant CDBusUtil::GetVariant(const char *destination, const char *object, const char *interface, const char *property)
26 //dbus-send --system --print-reply --dest=destination object org.freedesktop.DBus.Properties.Get string:interface string:property
27 CDBusMessage message(destination, object, "org.freedesktop.DBus.Properties", "Get");
30 if (message.AppendArgument(interface) && message.AppendArgument(property))
32 DBusMessage *reply = message.SendSystem();
38 if (dbus_message_iter_init(reply, &iter))
40 if (!dbus_message_has_signature(reply, "v"))
41 CLog::Log(LOGERROR, "DBus: wrong signature on Get - should be \"v\" but was %s", dbus_message_iter_get_signature(&iter));
43 result = ParseVariant(&iter);
48 CLog::Log(LOGERROR, "DBus: append arguments failed");
53 CVariant CDBusUtil::GetAll(const char *destination, const char *object, const char *interface)
55 CDBusMessage message(destination, object, "org.freedesktop.DBus.Properties", "GetAll");
57 message.AppendArgument(interface);
58 DBusMessage *reply = message.SendSystem();
62 if (dbus_message_iter_init(reply, &iter))
64 if (!dbus_message_has_signature(reply, "a{sv}"))
65 CLog::Log(LOGERROR, "DBus: wrong signature on GetAll - should be \"a{sv}\" but was %s", dbus_message_iter_get_signature(&iter));
71 dbus_message_iter_recurse(&iter, &sub);
75 dbus_message_iter_recurse(&sub, &dict);
78 const char * key = NULL;
80 dbus_message_iter_get_basic(&dict, &key);
81 if (!dbus_message_iter_next(&dict))
84 CVariant value = ParseVariant(&dict);
87 properties[key] = value;
89 } while (dbus_message_iter_next(&dict));
91 } while (dbus_message_iter_next(&sub));
93 } while (dbus_message_iter_next(&iter));
101 CVariant CDBusUtil::ParseVariant(DBusMessageIter *itr)
103 DBusMessageIter variant;
104 dbus_message_iter_recurse(itr, &variant);
106 return ParseType(&variant);
109 CVariant CDBusUtil::ParseType(DBusMessageIter *itr)
112 const char * string = NULL;
113 dbus_int32_t int32 = 0;
114 dbus_uint32_t uint32 = 0;
115 dbus_int64_t int64 = 0;
116 dbus_uint64_t uint64 = 0;
117 dbus_bool_t boolean = false;
120 int type = dbus_message_iter_get_arg_type(itr);
123 case DBUS_TYPE_OBJECT_PATH:
124 case DBUS_TYPE_STRING:
125 dbus_message_iter_get_basic(itr, &string);
128 case DBUS_TYPE_UINT32:
129 dbus_message_iter_get_basic(itr, &uint32);
130 value = (uint64_t)uint32;
133 case DBUS_TYPE_INT32:
134 dbus_message_iter_get_basic(itr, &int32);
135 value = (int64_t)int32;
137 case DBUS_TYPE_UINT64:
138 dbus_message_iter_get_basic(itr, &uint64);
139 value = (uint64_t)uint64;
141 case DBUS_TYPE_INT64:
142 dbus_message_iter_get_basic(itr, &int64);
143 value = (int64_t)int64;
145 case DBUS_TYPE_BOOLEAN:
146 dbus_message_iter_get_basic(itr, &boolean);
147 value = (bool)boolean;
149 case DBUS_TYPE_DOUBLE:
150 dbus_message_iter_get_basic(itr, &doublev);
151 value = (double)doublev;
153 case DBUS_TYPE_ARRAY:
154 DBusMessageIter array;
155 dbus_message_iter_recurse(itr, &array);
157 value = CVariant::VariantTypeArray;
161 CVariant item = ParseType(&array);
163 value.push_back(item);
164 } while (dbus_message_iter_next(&array));