Author: lslezak Date: Wed Feb 4 10:28:44 2009 New Revision: 55222 URL: http://svn.opensuse.org/viewcvs/yast?rev=55222&view=rev Log: - fixed YCPMap -> DBus array conversion (DBus allows only basic types as the key) Modified: branches/tmp/lslezak/core/liby2dbus/src/DBusMsg.cc Modified: branches/tmp/lslezak/core/liby2dbus/src/DBusMsg.cc URL: http://svn.opensuse.org/viewcvs/yast/branches/tmp/lslezak/core/liby2dbus/src/DBusMsg.cc?rev=55222&r1=55221&r2=55222&view=diff ============================================================================== --- branches/tmp/lslezak/core/liby2dbus/src/DBusMsg.cc (original) +++ branches/tmp/lslezak/core/liby2dbus/src/DBusMsg.cc Wed Feb 4 10:28:44 2009 @@ -311,47 +311,68 @@ DBusMessageIter array_it; + YCPMapIterator mit = map.begin(); + // use string as fallback for empty map + std::string key_type(mit == map.end() ? "s" : typeStr(mit.key())); + + // dbus allows only basic types as key type in a map + const std::string valid_key_types(DBUS_TYPE_INT64_AS_STRING DBUS_TYPE_DOUBLE_AS_STRING + DBUS_TYPE_STRING_AS_STRING DBUS_TYPE_BOOLEAN_AS_STRING); + + if (valid_key_types.find(key_type) == std::string::npos) + { + y2error("Invalid type of key in map (non-basic type): %s, ignoring the map", key_type.c_str()); + return false; + } + + std::string map_signature("{" + key_type + "v}"); + // open array container y2debug("Opening DICT container"); - dbus_message_iter_open_container(i, DBUS_TYPE_ARRAY, "{vv}", &array_it); + dbus_message_iter_open_container(i, DBUS_TYPE_ARRAY, map_signature.c_str(), &array_it); for(YCPMapIterator mit = map.begin(); mit != map.end() ; ++mit) { YCPValue key = mit.key(); YCPValue val = mit.value(); + // error: this is a different key type than the announced type + if (key_type != typeStr(key)) + { + y2error("Found different key type %s (expected %s) - ignoring pair $[ %s : %s ]", + typeStr(key), key_type.c_str(), + key->toString().c_str(), val->toString().c_str()); + + continue; + } + DBusMessageIter map_item_it; y2debug("Opening map item container"); dbus_message_iter_open_container(&array_it, DBUS_TYPE_DICT_ENTRY, 0, &map_item_it); - // add VARIANT container - DBusMessageIter var_it; - dbus_message_iter_open_container(&array_it, DBUS_TYPE_VARIANT, typeStr(key), &var_it); - // add the key - addValueAt(key, &var_it); - - y2debug("Closing VARIANT container"); - dbus_message_iter_close_container(&array_it, &var_it); - + addValueAt(key, &map_item_it); // add VARIANT container DBusMessageIter var_it2; - dbus_message_iter_open_container(&array_it, DBUS_TYPE_VARIANT, typeStr(val), &var_it2); + y2debug("Opening VARIANT container with type %s", typeStr(val)); + dbus_message_iter_open_container(&map_item_it, DBUS_TYPE_VARIANT, typeStr(val), &var_it2); // add the key addValueAt(val, &var_it2); y2debug("Closing VARIANT container"); - dbus_message_iter_close_container(&array_it, &var_it2); + dbus_message_iter_close_container(&map_item_it, &var_it2); // close map item dbus_message_iter_close_container(&array_it, &map_item_it); + y2debug("Closing map item container"); } // close array container dbus_message_iter_close_container(i, &array_it); + y2debug("Closing DICT container"); } else { -- To unsubscribe, e-mail: yast-commit+unsubscribe@opensuse.org For additional commands, e-mail: yast-commit+help@opensuse.org