Merge pull request #79 from jsouthworth/fix/78
Fix a few bugs related to storing values.
diff --git a/dbus.go b/dbus.go
index 51f531b..446c5d0 100644
--- a/dbus.go
+++ b/dbus.go
@@ -81,6 +81,11 @@
}
func setDest(dest, src reflect.Value) error {
+ if !isVariant(src.Type()) && isVariant(dest.Type()) {
+ //special conversion for dbus.Variant
+ dest.Set(reflect.ValueOf(MakeVariant(src.Interface())))
+ return nil
+ }
if !src.Type().ConvertibleTo(dest.Type()) {
return errors.New(
"dbus.Store: type mismatch")
@@ -171,17 +176,26 @@
func newDestValue(srcValue reflect.Value, destType reflect.Type) reflect.Value {
switch srcValue.Kind() {
case reflect.Map:
- if !isVariant(srcValue.Type().Elem()) {
+ switch {
+ case !isVariant(srcValue.Type().Elem()):
return reflect.New(destType)
+ case destType.Kind() == reflect.Map:
+ return reflect.New(destType)
+ default:
+ return reflect.New(
+ reflect.MapOf(srcValue.Type().Key(), destType))
}
- return reflect.New(
- reflect.MapOf(srcValue.Type().Key(), destType))
+
case reflect.Slice:
- if !isVariant(srcValue.Type().Elem()) {
+ switch {
+ case !isVariant(srcValue.Type().Elem()):
return reflect.New(destType)
+ case destType.Kind() == reflect.Slice:
+ return reflect.New(destType)
+ default:
+ return reflect.New(
+ reflect.SliceOf(destType))
}
- return reflect.New(
- reflect.SliceOf(destType))
default:
if !isVariant(srcValue.Type()) {
return reflect.New(destType)
diff --git a/encoder_test.go b/encoder_test.go
index 8e3b19d..91a0312 100644
--- a/encoder_test.go
+++ b/encoder_test.go
@@ -332,3 +332,33 @@
out, val)
}
}
+
+func TestEncodeVariant(t *testing.T) {
+ var res map[ObjectPath]map[string]map[string]Variant
+ var src = map[ObjectPath]map[string]map[string]Variant{
+ ObjectPath("/foo/bar"): {
+ "foo": {
+ "bar": MakeVariant(10),
+ "baz": MakeVariant("20"),
+ },
+ },
+ }
+ buf := new(bytes.Buffer)
+ order := binary.LittleEndian
+ enc := newEncoder(buf, binary.LittleEndian)
+ err := enc.Encode(src)
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ dec := newDecoder(buf, order)
+ v, err := dec.Decode(SignatureOf(src))
+ if err != nil {
+ t.Fatal(err)
+ }
+ err = Store(v, &res)
+ if err != nil {
+ t.Fatal(err)
+ }
+ _ = res[ObjectPath("/foo/bar")]["foo"]["baz"].Value().(string)
+}