2017-01-07 63 views
0

uint16을 키로 사용하여 바이트 배열 (예 : "a {qay}")에 매핑하는 사전에 G_Variant 포인터를 반환하려고합니다. 여기 GLib의 배열에 매핑되는 사전을 어떻게 만듭니 까?

내 시도입니다 :

#define KEY 0xDEAD 
    #define BYTE1 0xBE 
    #define BYTE2 0xEF 
    GVariantBuilder *arrBuilder, *builder; 
    GVariant *arr; 

    //build array of bytes ('ay') 
    arrBuilder = g_variant_builder_new(G_VARIANT_TYPE("ay")); 
    g_variant_builder_add(arrBuilder, "y", BYTE1); 
    g_variant_builder_add(arrBuilder, "y", BYTE2); 

    arr = g_variant_new("v",g_variant_new("ay", arrBuilder)); 

    //put it in a dict ('a{sv}') 
    builder = g_variant_builder_new(G_VARIANT_TYPE("a{qay}")); 
    g_variant_builder_add(builder, "{qay}", KEY, arr); 
    return g_variant_builder_end(builder); 

그것은 작동하지 않습니다와 나는 D-버스에이 속성 쿼리하려고 할 때 다음과 같은 오류 메시지가 :

(process:18319): GLib-CRITICAL **: g_variant_builder_end: assertion 'is_valid_builder (builder)' failed 

(process:18319): GLib-CRITICAL **: g_variant_get_type: assertion 'value != NULL' failed 

(process:18319): GLib-CRITICAL **: g_variant_type_is_array: assertion 'g_variant_type_check (type)' failed 

(process:18319): GLib-CRITICAL **: g_variant_get_type_string: assertion 'value != NULL' failed 

(process:18319): GLib-ERROR **: g_variant_new: expected array GVariantBuilder but the built value has type '(null)' 
Trace/breakpoint trap (core dumped) 

답변

0
arr = g_variant_new("v",g_variant_new("ay", arrBuilder)); 

을 아마 bytearray를 반환하도록 배열 빌더를 종료해야합니까?

arr = g_variant_builder_end(arrBuilder); 

편집 :

다음은 어떻게 원하는 것을 달성 할 코드 다음, 트릭 바이트의 배열이 변형은 (모든 변종이다) 인 것을 : 나는 대답을 발견!) 당신이 쓴이가 = 작품을 만들 었는지 노력

+0

나는 당신의 제안을 시도하고 나는 동일한 오류 메시지가 때

GVariant *arr_builder, *dict_builder; /* Build the array of bytes */ arr_builder = g_variant_builder_new(G_VARIANT_TYPE("ay")); g_variant_builder_add(arr_builder, "y",0xAA); // Add some more if you want GVariant *byte_array = g_variant_builder_end(arr_builder); g_variant_builder_unref(arr_builder); /* Build the dictionary, now is the trick */ dict_builder = g_variant_builder_new(G_VARIANT_TYPE("a{qv}")); g_variant_builder_add(dict_builder, "{qv}", 0x0F0F, byte_array); GVariant *dict = g_variant_builder_end(dict_builder); g_variant_builder_unref(dict_builder); /* Now you can print your variants (dict and byte_array) and print their type */ g_print(g_variant_print(dict,TRUE)); g_print(g_variant_get_type_string(dict)); 

난 당신 같은 오류를했다. 나는 또한 시도했다 : "arr = g_variant_new ("ay ", g_variant_builder_end (arrBuilder));" 같은 결과로 같은 줄에 흠 –