[yast-commit] r48943 - in /branches/tmp/lslezak/workshop/core/scr/src: DBusMsg.cc DBusMsg.h DBusServer.cc
Author: lslezak
Date: Thu Jul 10 10:18:28 2008
New Revision: 48943
URL: http://svn.opensuse.org/viewcvs/yast?rev=48943&view=rev
Log:
- send SCR result as DBUS_TYPE_VARIANT (which matches YCP 'any')
- fixed introspection XML data
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=48943&r1=48942&r2=48943&view=diff
==============================================================================
--- branches/tmp/lslezak/workshop/core/scr/src/DBusMsg.cc (original)
+++ branches/tmp/lslezak/workshop/core/scr/src/DBusMsg.cc Thu Jul 10 10:18:28 2008
@@ -57,6 +57,16 @@
return false;
}
+bool DBusMsg::addValue(int type, void* data, DBusMessageIter *i)
+{
+ if (msg != NULL && i != NULL && (dbus_message_iter_append_basic(i, type, data)))
+ {
+ return true;
+ }
+
+ return false;
+}
+
bool DBusMsg::addString(const std::string &val)
{
const char *ptr = val.c_str();
@@ -103,6 +113,16 @@
return false;
}
+std::string DBusMsg::path() const
+{
+ if (msg != NULL)
+ {
+ return std::string(dbus_message_get_path(msg));
+ }
+
+ return std::string();
+}
+
bool DBusMsg::empty() const
{
return msg == NULL;
@@ -130,54 +150,91 @@
bool DBusMsg::addYCPValue(const YCPValue &val)
{
+ // create insert iterator
+ DBusMessageIter it;
+ dbus_message_iter_init_append(msg, &it);
+
+ // create sub iterator for VARIANT container
+ DBusMessageIter sub;
+
+ // open container
+ dbus_message_iter_open_container(&it, DBUS_TYPE_VARIANT, typeStr(val), &sub);
+
+ bool ret = addYCPValue(val, &sub);
+ // close container
+ dbus_message_iter_close_container(&it, &sub);
+
+ return ret;
+}
+
+
+bool DBusMsg::addYCPValue(const YCPValue &val, DBusMessageIter *i)
+{
+ int type = typeInt(val);
+
if (val.isNull())
{
y2warning("Ignoring NULL YCPValue");
+ return false;
}
else if (val->isInteger())
{
- addInt64(val->asInteger()->value());
+ dbus_int64_t i64 = val->asInteger()->value();
+ addValue(type, &i64, i);
}
else if (val->isFloat())
{
- addDouble(val->asFloat()->value());
+ double d = val->asFloat()->value();
+ addValue(type, &d, i);
}
else if (val->isString())
{
- addString(val->asString()->value());
+ const char *str = val->asString()->value().c_str();
+ addValue(type, &str, i);
}
else if (val->isBoolean())
{
- addBoolean(val->asBoolean()->value());
+ bool b = val->asBoolean()->value();
+ addValue(type, &b, i);
}
// add term, path and symbol as string
else if (val->isTerm() || val->isPath() || val->isSymbol())
{
+ const char * str = val->toString().c_str();
// add path as a string
- addString(val->toString());
+ addValue(type, &str, i);
}
else if (val->isList())
{
YCPList lst = val->asList();
int sz = lst->size();
- int i = 0;
-
- DBusMessageIter it;
- dbus_message_iter_init_append(msg, &it);
+ int index = 0;
- DBusMessageIter sub;
+ DBusMessageIter array_it;
- // open container
- dbus_message_iter_open_container(&it, &sub);
- while(i < sz)
+ // open array container
+ y2milestone("Opening array container");
+ dbus_message_iter_open_container(i, DBUS_TYPE_ARRAY, DBUS_TYPE_VARIANT_AS_STRING, &array_it);
+ while(index < sz)
{
+ YCPValue item = lst->value(index);
+
+ // open variant container for each item
+ DBusMessageIter variant_it;
+ y2milestone("Opening variant container");
+ dbus_message_iter_open_container(&array_it, DBUS_TYPE_VARIANT, typeStr(item), &variant_it);
+
// add an item
- // TODO FIXME: addYCPValue(lst->value(i), &sub);
- i++;
+ addYCPValue(lst->value(index), &variant_it);
+
+ // close variant container
+ dbus_message_iter_close_container(&array_it, &variant_it);
+
+ index++;
}
- // close container
- dbus_message_iter_close_container(&it, &sub);
+ // close array container
+ dbus_message_iter_close_container(i, &array_it);
}
else
{
@@ -270,3 +327,78 @@
return ret;
}
+
+int DBusMsg::typeInt(const YCPValue &val) const
+{
+ if (val.isNull())
+ {
+ y2warning("Ignoring NULL YCPValue");
+ return DBUS_TYPE_INVALID;
+ }
+ else if (val->isInteger())
+ {
+ // YCPInteger is 64 bits wide
+ return DBUS_TYPE_INT64;
+ }
+ else if (val->isFloat())
+ {
+ return DBUS_TYPE_DOUBLE;
+ }
+ else if (val->isString() || val->isTerm() || val->isPath() || val->isSymbol())
+ {
+ return DBUS_TYPE_STRING;
+ }
+ else if (val->isBoolean())
+ {
+ return DBUS_TYPE_BOOLEAN;
+ }
+ else if (val->isList())
+ {
+ return DBUS_TYPE_ARRAY;
+ }
+// else if (val->isMap())
+// {
+// return DBUS_TYPE_DICT;
+// }
+
+ y2warning("Unsuppoerted type");
+ return DBUS_TYPE_INVALID;
+}
+
+const char * DBusMsg::typeStr(const YCPValue &val) const
+{
+ if (val.isNull())
+ {
+ y2warning("Ignoring NULL YCPValue");
+ return DBUS_TYPE_INVALID_AS_STRING;
+ }
+ else if (val->isInteger())
+ {
+ // YCPInteger is 64 bits wide
+ return DBUS_TYPE_INT64_AS_STRING;
+ }
+ else if (val->isFloat())
+ {
+ return DBUS_TYPE_DOUBLE_AS_STRING;
+ }
+ else if (val->isString() || val->isTerm() || val->isPath() || val->isSymbol())
+ {
+ return DBUS_TYPE_STRING_AS_STRING;
+ }
+ else if (val->isBoolean())
+ {
+ return DBUS_TYPE_BOOLEAN_AS_STRING;
+ }
+ else if (val->isList())
+ {
+ return DBUS_TYPE_ARRAY_AS_STRING\
+ DBUS_TYPE_VARIANT_AS_STRING;
+ }
+// else if (val->isMap())
+// {
+// return DBUS_TYPE_DICT_AS_STRING;
+// }
+
+ y2warning("Unsuppoerted type");
+ return DBUS_TYPE_INVALID_AS_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=48943&r1=48942&r2=48943&view=diff
==============================================================================
--- branches/tmp/lslezak/workshop/core/scr/src/DBusMsg.h (original)
+++ branches/tmp/lslezak/workshop/core/scr/src/DBusMsg.h Thu Jul 10 10:18:28 2008
@@ -45,12 +45,18 @@
std::string interface() const;
std::string method() const;
+ std::string path() const;
private:
bool addValue(int type, void* data);
+ bool addValue(int type, void* data, DBusMessageIter *i);
+ bool addYCPValue(const YCPValue &val, DBusMessageIter *i);
void release();
DBusMessage *msg;
+
+ int typeInt(const YCPValue &val) const;
+ const char * typeStr(const YCPValue &val) const;
};
#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=48943&r1=48942&r2=48943&view=diff
==============================================================================
--- branches/tmp/lslezak/workshop/core/scr/src/DBusServer.cc (original)
+++ branches/tmp/lslezak/workshop/core/scr/src/DBusServer.cc Thu Jul 10 10:18:28 2008
@@ -54,8 +54,8 @@
continue;
}
- // check this is a method call for the right interface & method
- if (request.isMethodCall("org.opensuse.yast.SCR", "Read"))
+ // 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();
@@ -85,7 +85,9 @@
y2milestone("Sending result %s", ret->toString().c_str());
}
+ y2milestone("Flushing connection...");
connection.flush();
+ y2milestone("...done");
}
}
else if (request.isMethodCall("org.opensuse.yast.SCR", "Write"))
@@ -96,18 +98,16 @@
}
else if (request.isMethodCall("org.freedesktop.DBus.Introspectable", "Introspect"))
{
+ y2milestone("Requesting path: %s", request.path().c_str());
// handle Introspection request from "org.freedesktop.DBus.Introspectable" "Introspect"
// define all exported methods here
- const char *introspect = "<!DOCTYPE node PUBLIC \"-//freedesktop//DTD D-BUS Object Introspection 1.0//EN\"\
- \"http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd\">\
-
participants (1)
-
lslezak@svn.opensuse.org