0

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」を呼び出すときにセグメンテーション エラーが発生します。

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 に答える