[yast-commit] r48962 - in /branches/tmp/lslezak/workshop/core/scr/src: DBusMsg.cc DBusMsg.h DBusServer.cc
Author: lslezak
Date: Thu Jul 10 14:50:32 2008
New Revision: 48962
URL: http://svn.opensuse.org/viewcvs/yast?rev=48962&view=rev
Log:
- added support for YCPMap type
- Read accepts 2 additional optional parameters
Modified:
branches/tmp/lslezak/workshop/core/scr/src/DBusMsg.cc
branches/tmp/lslezak/workshop/core/scr/src/DBusMsg.h
branches/tmp/lslezak/workshop/core/scr/src/DBusServer.cc
Modified: branches/tmp/lslezak/workshop/core/scr/src/DBusMsg.cc
URL: http://svn.opensuse.org/viewcvs/yast/branches/tmp/lslezak/workshop/core/scr/src/DBusMsg.cc?rev=48962&r1=48961&r2=48962&view=diff
==============================================================================
--- branches/tmp/lslezak/workshop/core/scr/src/DBusMsg.cc (original)
+++ branches/tmp/lslezak/workshop/core/scr/src/DBusMsg.cc Thu Jul 10 14:50:32 2008
@@ -150,6 +150,14 @@
bool DBusMsg::addYCPValue(const YCPValue &val)
{
+ if (val.isNull())
+ {
+ y2milestone("Ignoring YCPNull value");
+ return false;
+ }
+
+ y2milestone("Adding YCP value: %s", val->toString().c_str());
+
// create insert iterator
DBusMessageIter it;
dbus_message_iter_init_append(msg, &it);
@@ -236,6 +244,49 @@
// close array container
dbus_message_iter_close_container(i, &array_it);
}
+ else if (val->isMap())
+ {
+ YCPMap map = val->asMap();
+
+ // get key type, use string as a fallback for an empty map
+ std::string key_type((map.size() > 0) ? typeStr(map.begin().key()) : "s");
+
+ DBusMessageIter array_it;
+
+ // open array container
+ y2milestone("Opening dict container");
+ dbus_message_iter_open_container(i, DBUS_TYPE_ARRAY, (std::string(DBUS_DICT_ENTRY_BEGIN_CHAR_AS_STRING) +
+ + key_type.c_str() + DBUS_TYPE_VARIANT_AS_STRING + DBUS_DICT_ENTRY_END_CHAR_AS_STRING).c_str(),
+ &array_it);
+
+ for(YCPMapIterator it = map.begin(); it != map.end() ; ++it)
+ {
+ YCPValue key = it.key();
+ YCPValue val = it.value();
+
+ DBusMessageIter map_item_it;
+ y2milestone("Opening map item container");
+
+ dbus_message_iter_open_container(&array_it, DBUS_TYPE_DICT_ENTRY, 0, &map_item_it);
+
+ // add the key
+ addYCPValue(key, &map_item_it);
+
+ // add the value
+ DBusMessageIter val_item_it;
+ // open variant container for value
+ dbus_message_iter_open_container(&map_item_it, DBUS_TYPE_VARIANT, typeStr(val), &val_item_it);
+ addYCPValue(val, &val_item_it);
+ // close variant container
+ dbus_message_iter_close_container(&map_item_it, &val_item_it);
+
+ // close dict entry
+ dbus_message_iter_close_container(&array_it, &map_item_it);
+ }
+
+ // close array container
+ dbus_message_iter_close_container(i, &array_it);
+ }
else
{
y2error("Unsupported type: %s", val->toString().c_str());
@@ -275,10 +326,47 @@
return ret;
}
-YCPValue DBusMsg::getYCPValue(int index)
+
+YCPValue DBusMsg::getYCPValue(DBusMessageIter *it)
{
YCPValue ret;
+ int type = dbus_message_iter_get_arg_type(it);
+ y2milestone("Found DBus type: %d (%c)", type, (char)type);
+
+ // TODO support more types
+ if (type == DBUS_TYPE_BOOLEAN)
+ {
+ bool b;
+ dbus_message_iter_get_basic(it, &b);
+ ret = YCPBoolean(b);
+ }
+ else if (type == DBUS_TYPE_STRING)
+ {
+ const char *s;
+ dbus_message_iter_get_basic(it, &s);
+ ret = YCPString(s);
+ }
+ else if (type == DBUS_TYPE_VARIANT)
+ {
+ DBusMessageIter sub;
+ dbus_message_iter_recurse(it, &sub);
+
+ // recurse into the variant iterator
+ return getYCPValue(&sub);
+ }
+ else
+ {
+ y2error("Unsupported Dbus type: %d (%c)", type, (char)type);
+ }
+
+ return ret;
+}
+
+YCPValue DBusMsg::getYCPValue(int index)
+{
+ YCPValue ret = YCPNull();
+
if (msg != NULL)
{
DBusMessageIter it;
@@ -300,28 +388,11 @@
if (i == index)
{
- int type = dbus_message_iter_get_arg_type(&it);
-
- if (type == DBUS_TYPE_BOOLEAN)
- {
- bool b;
- dbus_message_iter_get_basic(&it, &b);
- ret = YCPBoolean(b);
- }
- else if (type == DBUS_TYPE_STRING)
- {
- const char *s;
- dbus_message_iter_get_basic(&it, &s);
- ret = YCPString(s);
- }
- else
- {
- y2error("Unsupported Dbus type: %d (%c)", type, (char)type);
- }
+ ret = getYCPValue(&it);
}
else
{
- y2error("No argument at index %d", i);
+ y2debug("No argument at index %d", i);
}
}
@@ -356,10 +427,10 @@
{
return DBUS_TYPE_ARRAY;
}
-// else if (val->isMap())
-// {
-// return DBUS_TYPE_DICT;
-// }
+ else if (val->isMap())
+ {
+ return DBUS_TYPE_ARRAY;
+ }
y2warning("Unsuppoerted type");
return DBUS_TYPE_INVALID;
@@ -394,11 +465,27 @@
return DBUS_TYPE_ARRAY_AS_STRING\
DBUS_TYPE_VARIANT_AS_STRING;
}
-// else if (val->isMap())
-// {
-// return DBUS_TYPE_DICT_AS_STRING;
-// }
+ else if (val->isMap())
+ {
+ YCPMap map = val->asMap();
+
+ // get key type, use string as a fallback for an empty map
+ std::string key_type((map.size() > 0) ? typeStr(map.begin().key()) : "s");
+
+ return (std::string(DBUS_TYPE_ARRAY_AS_STRING) + DBUS_DICT_ENTRY_BEGIN_CHAR_AS_STRING +
+ + key_type.c_str() + DBUS_TYPE_VARIANT_AS_STRING + DBUS_DICT_ENTRY_END_CHAR_AS_STRING).c_str();
+ }
- y2warning("Unsuppoerted type");
+ y2warning("Unsupported type for value %s", val->toString().c_str());
return DBUS_TYPE_INVALID_AS_STRING;
}
+
+std::string DBusMsg::sender() const
+{
+ if (msg != NULL)
+ {
+ return std::string(dbus_message_get_sender(msg));
+ }
+
+ return std::string();
+}
Modified: branches/tmp/lslezak/workshop/core/scr/src/DBusMsg.h
URL: http://svn.opensuse.org/viewcvs/yast/branches/tmp/lslezak/workshop/core/scr/src/DBusMsg.h?rev=48962&r1=48961&r2=48962&view=diff
==============================================================================
--- branches/tmp/lslezak/workshop/core/scr/src/DBusMsg.h (original)
+++ branches/tmp/lslezak/workshop/core/scr/src/DBusMsg.h Thu Jul 10 14:50:32 2008
@@ -46,6 +46,7 @@
std::string interface() const;
std::string method() const;
std::string path() const;
+ std::string sender() const;
private:
@@ -57,6 +58,8 @@
int typeInt(const YCPValue &val) const;
const char * typeStr(const YCPValue &val) const;
+
+ YCPValue getYCPValue(DBusMessageIter *it);
};
#endif
Modified: branches/tmp/lslezak/workshop/core/scr/src/DBusServer.cc
URL: http://svn.opensuse.org/viewcvs/yast/branches/tmp/lslezak/workshop/core/scr/src/DBusServer.cc?rev=48962&r1=48961&r2=48962&view=diff
==============================================================================
--- branches/tmp/lslezak/workshop/core/scr/src/DBusServer.cc (original)
+++ branches/tmp/lslezak/workshop/core/scr/src/DBusServer.cc Thu Jul 10 14:50:32 2008
@@ -53,11 +53,15 @@
sleep(1);
continue;
}
+
+ y2milestone("Received request from %s: interface: %s, method: %s", request.sender().c_str(),
+ request.interface().c_str(), request.method().c_str());
// check this is a method call for the right object, interface & method
if (request.isMethodCall("org.opensuse.yast.SCR", "Read") && request.path() == "/SCR")
{
- request.arguments();
+ int args = request.arguments();
+ if (args == 0) continue;
YCPValue arg0 = request.getYCPValue(0);
@@ -67,13 +71,20 @@
std::string path_str(arg0->asString()->value());
YCPPath pth(path_str);
y2milestone("Reading path %s", path_str.c_str());
-
- YCPValue ret = sa->Read(pth);
+
+ YCPValue arg = request.getYCPValue(1);
+ YCPValue opt = request.getYCPValue(2);
+
+ // result from SCR::
+ YCPValue ret = sa->Read(pth, arg, opt);
DBusMsg reply;
reply.createReply(request);
- reply.addYCPValue(ret);
+ if (!ret.isNull())
+ {
+ reply.addYCPValue(ret);
+ }
// send the result
if (!connection.send(reply))
@@ -106,7 +117,7 @@
"<!DOCTYPE node PUBLIC \"-//freedesktop//DTD D-BUS Object Introspection 1.0//EN\" \"http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd\"> <node>
participants (1)
-
lslezak@svn.opensuse.org