0

I'm using gdbus bindings. Here is part of my interface:

<node>
    <interface name="USB.Manager">
        <property name="Devices" type="ao" access="read">
             <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="false"/>
        </property>
    </interface>
</node>

I failed to extract device list get from this interface to a string array. Can anyone tell the correct marshalling for dbus string array?

My assumption for dbus string array structure is as follows:

|--------|--------|--------|--------|
|         array length              |
|        pointer to first string    |
|       pointer to second string    |

And also internal structure for string is as follows:

|--------|--------|--------|--------|
|        string length              |
|   char |  char  |  char  | char   |
|            ......                 |
|  char  | '\0'   |        |        |

And below is my code:

static USBManager *pSkeletonManager = usbmanager_skeleton_new();

gchar* deviceList[2] = { "/dev/obj/usb1", "/dev/obj/usb2" };
gchar* aoList[255];
ConvertStringArrayToAo(deviceList, aoList, 2);

usbmanager_set_devices(pSkeletonManager, aoList);

void ConvertStringArrayToAo(char** stringArray, char** aoString, int length)
{
    if (length == 0)
    {
        return;
    }

    // Array - leading length
    aoString[0] = (char*)length;

    g_print("Length: %d, aoString[0]: %d\n", length, aoString[0]);

    // Array - content
    int i = 0;
    for (; i < length; i++)
    {
        char* string = stringArray[i];
        char* resultString = aoString[i+1];

        // 4 byte for leading length
        // 1 byte for terminating \0
        aoString[i+1] = (char*)malloc(strlen(string) + 5);
        memset(aoString[i+1], 0, strlen(string)+5);

        // length
        int j = 0;
        aoString[i+1][0] = (strlen(string) & 0xF000) >> 24;
        aoString[i+1][1] = (strlen(string) & 0x0F00) >> 16;
        aoString[i+1][2] = (strlen(string) & 0x00F0) >> 8;
        aoString[i+1][3] = (strlen(string) & 0x000F);

        // content
        strncpy(&aoString[i+1][4], string, strlen(string));

        // terminating
        aoString[i+1][strlen(string)+4] = '\0';

        g_print("%s\n", &aoString[i+1][4]);
    }
}

This piece of code runs into segmentation fault when calling "usbmanager_set_devices".

4

1 回答 1

-1

我尝试使用我的 node.js dbus-native客户端库来序列化您的示例

这是我的代码:

var marshall = require('dnus-native/lib/marshall')
console.log( marshall('ao', [ ["/dev/obj/usb1", "/dev/obj/usb2"] ], 0) );

输出:

<Buffer 26 00 00 00 0d 00 00 00 2f 64 65 76 2f 6f 62 6a 2f 75 73 62 31 00 00 00 0d 00 00 00 2f 64 65 76 2f 6f 62 6a 2f 75 73 62 32 00>

请注意,长度前缀需要与 4 字节边界对齐(如果需要,字符串用零填充)。尝试aoString在我的示例中将您与缓冲区进行比较

于 2014-08-26T14:42:12.960 回答