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".