1

C ++ std ::vector<...>データをglibクライアントに転送するのが好きです

問題:ベクターデータを送信すると、glibクライアントのコールバックハンドラーにコールバックが届きませんでした。

これをC++クライアントアプリでチェックしたので、ベクターデータは確実にバス上にあります。

ディスクリートデータ転送(int、int、..)コールバックは正常に機能します。したがって、セットアップとマーシャルのプロセスは単純なタイプに対して正しいと確信しています。

XMLベクトル定義:

 arg name="vectorData" type="a(uuuuuuu)"

bus-binding-toolは以下を生成します:

gboolean com_xxx_yyy_method (DBusGProxy *proxy, const GPtrArray* IN_vectorData, GError **error)
{
   return dbus_g_proxy_call (proxy, "Method", error, dbus_g_type_get_collection ("GPtrArray", dbus_g_type_get_struct ("GValueArray", G_TYPE_UINT, G_TYPE_UINT, G_TYPE_UINT, G_TYPE_UINT, G_TYPE_UINT, G_TYPE_UINT, G_TYPE_UINT, G_TYPE_INVALID)), IN_vectorData, G_TYPE_INVALID, G_TYPE_INVALID);
}

マーシャルとコールバックの設定:

void setupVectorCallback(DBusGProxy *proxy)
{
   dbus_g_object_register_marshaller(marshal_VOID__BOXED, // parameter
                                     G_TYPE_NONE,         // return type
                                     G_TYPE_BOXED,        // or G_TYPE_POINTER ?
                                     G_TYPE_INVALID);     // end parameter list

   dbus_g_proxy_add_signal(proxy, "myVector", dbus_g_type_get_struct ("GValueArray", G_TYPE_UINT, G_TYPE_UINT, G_TYPE_UINT, G_TYPE_UINT, G_TYPE_UINT, G_TYPE_UINT, G_TYPE_UINT, G_TYPE_INVALID), G_TYPE_INVALID);

   dbus_g_proxy_connect_signal(proxy, "myVector", G_CALLBACK(_VectorEvent_handler), NULL, NULL);
}

元帥:

Marshal:void marshal_VOID__BOXED (GClosure *closure, GValue *return_value G_GNUC_UNUSED, guint n_param_values, const GValue *param_values, gpointer invocation_hint G_GNUC_UNUSED, gpointer marshal_data)
{
  typedef void (*GMarshalFunc_VOID__BOXED) (gpointer data1,
                                            gpointer arg_1,
                                            gpointer data2);
  register GMarshalFunc_VOID__BOXED callback;
  register GCClosure *cc = (GCClosure*) closure;
  register gpointer data1, data2;

  //g_return_if_fail (n_param_values == 1+1);

  if (G_CCLOSURE_SWAP_DATA (closure))
  {
      data1 = closure->data;
      data2 = g_value_peek_pointer (param_values + 0);
  }
  else
  {
      data1 = g_value_peek_pointer (param_values + 0);
      data2 = closure->data;
  }
  callback = (GMarshalFunc_VOID__BOXED) (marshal_data ? marshal_data : cc->callback);

  callback (data1,
            g_marshal_value_peek_boxed (param_values + 1),
            data2);
}

コールバックハンドラー:

void _VectorEvent_handler(void *proxy, gpointer *data)
{
}

誰かが私のコードの何が悪いのか、そしてなぜDBusが私のフォーマットを受け入れず、私のコールバックを処理したのか知っていますか?

私のC++ベクトル実装は(C ++クライアントで)機能しますが、私のライブラリでは使用できません。したがって、glibの実装についてのみヒントを与えてください。

4

0 に答える 0