Hi,<br><br>studying the low level API Tutorial at <a href="http://dbus.freedesktop.org/doc/api/html/index.html">http://dbus.freedesktop.org/doc/api/html/index.html</a><br>I want to make sure that I&#39;ve understood the concept of getting arguments of a received message correctly.<br>
<br>If I want to keep the&nbsp; argument of a received message I have to allocate new memory and copy the value of the argument (which is presented by a pointer).<br>After that I have to unref the message. <br>Here an example of a possible function (pseudo-code):<br>
<br>char * myReceiveMethod(void){<br>&nbsp; DBusMessage* msg;<br>&nbsp; DBusMessage* reply;<br>&nbsp; char *resultarg;<br>&nbsp; char *buf=NULL;<br><br>&nbsp; (....)<br><br>&nbsp;&nbsp; if (!dbus_message_get_args (reply, &amp;err, <br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DBUS_TYPE_STRING, &amp;resultarg,<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DBUS_TYPE_INVALID)){ <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fprintf (stderr, &quot;Failed to complete ListServices call: %s\n&quot;,<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; err.message);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; exit (1);<br>&nbsp;&nbsp; }&nbsp; <br><br>&nbsp;&nbsp; //copy value of received argument and make necessary memory allocation<br>
&nbsp;&nbsp; buf = (char *)malloc(sizeof(char) * (strlen(resultarg) +1));<br>&nbsp;&nbsp; strcpy(buf, resultarg);&nbsp; <br>&nbsp;&nbsp; //unref messages, <br clear="all">&nbsp;&nbsp; dbus_message_unref(reply);<br>&nbsp;&nbsp; dbus_message_unref(msg);<br>&nbsp; <br>&nbsp;&nbsp; return buf; //return pointer, to do anything with it, of course it still must be &quot;free&#39;ed&quot; when Im done with it ( free() )<br>
}<br><br>The adress where resultarg points to is not valid anymore after the reply was unrefed, right?<br><br><br><br>Handling reply arguments of type array is different.<br>Here you don&#39;t have to allocate new memory If you want to keep the arguments.<br>
But you have to free the memory after the message reply was unrefed, although you haven&#39;t allocated the memory.<br>Example:<br><br>char ** myMethod(){<br>&nbsp; DBusMessage* msg;<br>&nbsp; DBusMessage* reply;<br>&nbsp; char **services;<br>
&nbsp; int servicesCount=0<br><br>(...)<br><br>&nbsp;if (!dbus_message_get_args (reply, &amp;err, <br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DBUS_TYPE_ARRAY,DBUS_TYPE_STRING,<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &amp;services,&amp;servicesCount,&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DBUS_TYPE_INVALID)){ <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fprintf (stderr, &quot;Failed to complete GetRemoteServiceClasses call: %s\n&quot;,<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; err.message);<br><br>&nbsp; dbus_message_unref(reply);<br>&nbsp; dbus_message_unref(msg);<br><br><br>&nbsp; //&nbsp; for (i = 0; i &lt; servicesCount; i++)<br>
&nbsp; // &nbsp; free (services[i]);<br>&nbsp; //&nbsp; free (services);<br><br>//<br><br>&nbsp; return services;<br>&nbsp; }&nbsp; <br><br><br>Of course I still have to free the services when Im done with them, e.g. before exiting the application, for example wit the following code:<br>
&nbsp;&nbsp;&nbsp; for (i = 0; i &lt; servicesCount; i++)<br>
&nbsp;&nbsp; &nbsp; free (services[i]);<br>
&nbsp;&nbsp;&nbsp; free (services);<br><br><br>Thanks for your comments and hints.<br><br>-- <br>Regards,<br>--Codefritz<br><br><br><br>