gdbus バインディングを使用しています。これが私のインターフェースの一部です:
<node>
<interface name="USB.Manager">
<property name="Devices" type="ao" access="read">
<annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="false"/>
</property>
</interface>
</node>
このインターフェイスから取得したデバイス リストを文字列配列に抽出できませんでした。誰でも dbus 文字列配列の正しいマーシャリングを教えてもらえますか?
dbus 文字列配列構造の私の仮定は次のとおりです。
|--------|--------|--------|--------|
| array length |
| pointer to first string |
| pointer to second string |
また、文字列の内部構造は次のとおりです。
|--------|--------|--------|--------|
| string length |
| char | char | char | char |
| ...... |
| char | '\0' | | |
以下は私のコードです:
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]);
}
}
このコードは、「usbmanager_set_devices」を呼び出すときにセグメンテーション エラーが発生します。