Skip to content

Commit

Permalink
feat: add more go to variants
Browse files Browse the repository at this point in the history
  • Loading branch information
NSEcho committed Jun 9, 2024
1 parent 1898b7c commit d12cc52
Showing 1 changed file with 33 additions and 4 deletions.
37 changes: 33 additions & 4 deletions frida/go_to_variants.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,15 @@ package frida
/*
#include <frida-core.h>
static void add_key_val_to_builder(GVariantBuilder *builder, char * key, GVariant *variant)
static void add_key_val_to_builder(GVariantBuilder *builder, char *key, GVariant *variant)
{
g_variant_builder_add(builder, "{sv}", key, variant);
}
static void add_val_to_builder(GVariantBuilder *builder, GVariant *variant)
{
g_variant_builder_add(builder, "v", variant);
}
*/
import "C"
import (
Expand All @@ -24,6 +29,15 @@ func parse(v reflect.Value) *C.GVariant {
v = v.Elem()
}
switch v.Kind() {
case reflect.Array, reflect.Slice:
var builder C.GVariantBuilder
C.g_variant_builder_init(&builder, C.G_VARIANT_TYPE_ARRAY)
for i := 0; i < v.Len(); i++ {
val := parse(v.Index(i))
C.add_val_to_builder(&builder, val)
}
variant := C.g_variant_builder_end(&builder)
return variant
case reflect.Map:
var builder C.GVariantBuilder
C.g_variant_builder_init(&builder, C.G_VARIANT_TYPE_VARDICT)
Expand All @@ -33,16 +47,31 @@ func parse(v reflect.Value) *C.GVariant {
}
variant := C.g_variant_builder_end(&builder)
return variant
case reflect.String:
return C.g_variant_new_string(C.CString(v.String()))
case reflect.Bool:
if v.Interface().(bool) {
return C.g_variant_new_boolean(C.gboolean(1))
} else {
return C.g_variant_new_boolean(C.gboolean(0))
}
case reflect.String:
return C.g_variant_new_string(C.CString(v.String()))
case reflect.Int16:
return C.g_variant_new_int16(C.gint16(v.Interface().(int16)))
case reflect.Uint16:
return C.g_variant_new_uint16(C.guint16(v.Interface().(uint16)))
case reflect.Int:
return C.g_variant_new_int32(C.gint32(v.Interface().(int)))
case reflect.Int32:
return C.g_variant_new_int32(C.gint32(v.Interface().(int32)))
case reflect.Uint32:
return C.g_variant_new_uint32(C.guint32(v.Interface().(uint32)))
case reflect.Int64:
return C.g_variant_new_int64(C.gint64(v.Interface().(int64)))
case reflect.Uint64:
return C.g_variant_new_int64(C.gint64(v.Interface().(int64)))
default:
msg := fmt.Sprintf("type \"%s\" not implemented", v.Kind().String())
msg := fmt.Sprintf("type \"%s\" not implemented, please file an issue on github", v.Kind().String())
panic(msg)
}
return nil
}

0 comments on commit d12cc52

Please sign in to comment.