DBus では、メソッド呼び出しからの出力は、従来の C 関数の戻りメカニズムではなく、引数リストを介して渡されます。さらに、メソッドが非同期でない場合は、1 つの true/false ブール値の結果 (従来の C 関数の return スタイルで返される) のみを返すことができます。このメソッドは複数の文字列値を返すため、イントロスペクションでは、このメソッドに非同期として注釈を付ける必要があります。プロキシ メソッド呼び出しは、結果を受け取る 2 つの文字列変数へのポインターを渡します。
例として dbus-glib を使用している場合...
<method name="getLocalTime">
<arg type="s" name="timeString" direction="out" />
<arg type="s" name="dateString" direction="out" />
<annotate name="org.freedesktop.DBus.GLib.Async" />
</method>
次に、そのメソッドの実装で...
void
dbus_service_get_local_time(
MyGObject* self,
DBusGMethodInvocation* context
)
{
char* timeString;
char* dateString;
// do stuff to create your two strings...
dbus_g_method_return( context, timeString, dateString );
// clean up allocated memory, etc...
}
呼び出し元の観点からは、プロキシ メソッド呼び出しは次のようになります...
gboolean
dbus_supplicant_get_local_time(
DBusProxy* proxy,
char* OUT_timeString,
char* OUT_dateString,
GError** error
);
プロキシ メソッドでは、gboolean の結果は、呼び出されたメソッドの結果ではなく、D-Bus 呼び出しが行われたかどうかであることに注意してください。