<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>

    <meta http-equiv="content-type" content="text/html; charset=ISO-8859-1">
  </head>
  <body bgcolor="#ffffff" text="#000000">
    Hello,<br>
    <br>
    Could somebody please analyze the piece of source code below.<br>
    <br>
    I'd like to send a message containing an array of structures using
    low-level API. The sent message shall be received in Qt.&nbsp; <br>
    For the test purposes the structure is a two-string structure, the
    array contains 10 entries.<br>
    <br>
    The receiver side (Qt) defines following parameter for the slot
    method (Q_DECLARE METATYPE are omitted here):<br>
    <br>
    <font size="-1" face="Courier New, Courier, monospace">structure <br>
      {<br>
      &nbsp; QString str1;<br>
      &nbsp; QString str2;<br>
      } twoString;<br>
      <br>
      typedef QVector&lt;twoString&gt; structArr;<br>
      <br>
      void slotMethod( structArr arr );</font> <br>
    <br>
    Now to the sender. I have to use low-level API :(. <br>
    Running the example below I get the following run-time error:<br>
    <br>
    <font size="-1" face="Courier New, Courier, monospace">-------------------PASSED_0<br>
      -------------------PASSED_1<br>
      process 6585: Array or variant type requires that type struct be
      written, but begin_struct was written<br>
      &nbsp; D-Bus not built with -rdynamic so unable to print a backtrace</font><br>
    <br>
    And now the source code:<br>
    <br>
    <font size="-1" face="Courier New, Courier, monospace">gboolean
      arrayOfStructSignal( MyClass *self )<br>
      {<br>
      &nbsp; // unique number<br>
      &nbsp; dbus_uint32_t&nbsp;&nbsp; serialNr = 0; <br>
      <br>
      &nbsp; // DBusMessage<br>
      &nbsp; DBusMessage&nbsp;&nbsp;&nbsp;&nbsp; *msg;<br>
      <br>
      &nbsp; // Dbus Message Iterators - main, array, structure<br>
      &nbsp; DBusMessageIter iter,<br>
      &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; arr,<br>
      &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; strct;<br>
      <br>
      &nbsp; // Connection<br>
      &nbsp; DBusConnection&nbsp; *conn;<br>
      <br>
      &nbsp; gchar buffer[BUFF_SIZE_SMALL];<br>
      &nbsp; const char *buff = buffer;<br>
      <br>
      &nbsp; if( NULL == self )<br>
      &nbsp; {<br>
      &nbsp;&nbsp;&nbsp; return false;<br>
      &nbsp; }<br>
      <br>
      &nbsp; conn = self-&gt;m_conn;<br>
      &nbsp; assert( NULL != conn ); <br>
      <br>
      &nbsp; // create a signal and check for errors <br>
      &nbsp; msg = dbus_message_new_signal( "/myObj",&nbsp;&nbsp;&nbsp; <br>
      &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "my.test.Interface", <br>
      &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "arrOfStructSignal" );<br>
      &nbsp; if (NULL == msg) <br>
      &nbsp; { <br>
      &nbsp;&nbsp;&nbsp; return false; <br>
      &nbsp; }<br>
      <br>
      &nbsp; dbus_message_iter_init_append( msg, &amp;iter );<br>
      <br>
      &nbsp; // open the array of structures<br>
      &nbsp; dbus_message_iter_open_container( &amp;iter, <br>
      &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DBUS_TYPE_ARRAY, <br>
      &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "r",<br>
      &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &amp;arr );<br>
      <br>
      &nbsp;&nbsp; cout &lt;&lt; "-------------------PASSED_0 " &lt;&lt;&nbsp; endl; <br>
      <br>
      &nbsp; // array of 10 structures a(ss)&nbsp; - for test<br>
      &nbsp; for( int i = 0; i &lt; 10; i++ )<br>
      &nbsp; {<br>
      <br>
      &nbsp;&nbsp;&nbsp; cout &lt;&lt; "-------------------PASSED_1 " &lt;&lt;&nbsp; endl; <br>
      <br>
      &nbsp;&nbsp;&nbsp; // Open the a structure within an array&nbsp; <br>
      &nbsp;&nbsp;&nbsp; // Here run-time error&nbsp; !!!!!!!!!!!!!!!!!!!<br>
      &nbsp;&nbsp;&nbsp; dbus_message_iter_open_container( &amp;arr, <br>
      &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DBUS_TYPE_STRUCT, <br>
      &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NULL,<br>
      &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &amp;strct );<br>
      <br>
      &nbsp;&nbsp;&nbsp; cout &lt;&lt; "-------------------PASSED_2 " &lt;&lt;&nbsp; endl; <br>
      <br>
      &nbsp;&nbsp;&nbsp; memset( buffer, 0, BUFF_SIZE_SMALL );<br>
      &nbsp;&nbsp;&nbsp; sprintf(buffer, "test 0 %d", i );<br>
      <br>
      &nbsp;&nbsp;&nbsp; // append first string to the structure <br>
      &nbsp;&nbsp;&nbsp; if( !dbus_message_iter_append_basic(&amp;strct,
      DBUS_TYPE_STRING, &amp;buff) )<br>
      &nbsp;&nbsp;&nbsp; {<br>
      &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dbus_message_unref(msg); <br>
      &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return false;<br>
      &nbsp;&nbsp;&nbsp; }<br>
      <br>
      &nbsp;&nbsp;&nbsp; cout &lt;&lt; "-------------------PASSED_3 " &lt;&lt;&nbsp; endl; <br>
      <br>
      &nbsp;&nbsp;&nbsp; memset( buffer, 0, BUFF_SIZE_SMALL );<br>
      &nbsp;&nbsp;&nbsp; sprintf(buffer, "test 0 %d", i );<br>
      <br>
      &nbsp;&nbsp;&nbsp; // append second string to the structure <br>
      &nbsp;&nbsp;&nbsp; if( !dbus_message_iter_append_basic(&amp;strct,
      DBUS_TYPE_STRING, &amp;buff) )<br>
      &nbsp;&nbsp;&nbsp; {<br>
      &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dbus_message_unref(msg); <br>
      &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return false;<br>
      &nbsp;&nbsp;&nbsp; }<br>
      <br>
      &nbsp;&nbsp;&nbsp; cout &lt;&lt; "-------------------PASSED_4 " &lt;&lt;&nbsp; endl; <br>
      <br>
      &nbsp;&nbsp;&nbsp; // close structure container<br>
      &nbsp;&nbsp;&nbsp; dbus_message_iter_close_container( &amp;arr, &amp;strct );<br>
      &nbsp; }<br>
      <br>
      &nbsp; // close struct container<br>
      &nbsp; dbus_message_iter_close_container( &amp;iter, &amp;arr );<br>
      <br>
      &nbsp; // send the message and flush the connection<br>
      &nbsp; if( !dbus_connection_send(conn, msg, &amp;serialNr)) <br>
      &nbsp; { <br>
      &nbsp;&nbsp;&nbsp; dbus_message_unref(msg); <br>
      &nbsp;&nbsp;&nbsp; return false;<br>
      &nbsp; }<br>
      &nbsp; dbus_connection_flush(conn);<br>
      &nbsp;&nbsp; <br>
      &nbsp; // free the message <br>
      &nbsp; dbus_message_unref(msg);<br>
      &nbsp;&nbsp; <br>
      &nbsp; return true;<br>
      }<br>
      <br>
    </font>Thanks for your help<br>
    <br>
    regards,<br>
    <br>
    Bogdan<br>
    <font size="-1" face="Courier New, Courier, monospace"><br>
      <br>
      <br>
    </font><br>
    <br>
    <br>
    <br>
    <br>
  </body>
</html>