「C Sharpの応用 - D-Bus」の版間の差分

73行目: 73行目:
<br><br>
<br><br>


== サンプルコード ==
== D-Busの呼び出し (クライアント側) ==
以下の例では、Linuxにおいてセッションをログオフしている。<br>
以下の例では、Linuxにおいてセッションをログオフしている。<br>
<br>
<br>
120行目: 120行目:
     }
     }
  }
  }
</syntaxhighlight>
<br><br>
== D-Busヘルパーファイル ==
==== D-Busヘルパーファイルのサンプルコード ====
以下の例で使用しているD-Busヘルパーファイルのインターフェースは、以下に示すような構造をしている。<br>
<syntaxhighlight lang="xml">
<node>
  <interface name="com.example.MyInterface">
    <method name="SayHello">
    </method>
    <method name="Add">
      <arg type="i" name="x" direction="in"/>
      <arg type="i" name="y" direction="in"/>
      <arg type="i" name="sum" direction="out"/>
    </method>
  </interface>
</node>
</syntaxhighlight>
<br>
<syntaxhighlight lang="c#">
using Tmds.DBus;
namespace DBusHelper;
// D-Busインターフェースの定義
[DBusInterface("com.example.MyInterface")]  // D-Busインターフェース名を指定する  例: com.example.MyInterface
public interface IMyInterface : IDBusObject
{
    Task SayHelloAsync();
    Task<int> AddAsync(int x, int y);
}
// D-Busオブジェクトの定義
public class MyObject : IMyInterface
{
    // D-Busオブジェクト名
    public ObjectPath ObjectPath { get; } = new ObjectPath("/com/example/MyObject");
    // 各D-Busインターフェースの詳細な定義
    public async Task SayHelloAsync()
    {
      await Task.Run(() => Console.WriteLine("Hello from D-Bus server!"));
    }
    public async Task<int> AddAsync(int x, int y)
    {
      return await Task.Run(() => x + y);
    }
    public Task<IDisposable> WatchPropertiesAsync(Action<PropertyChanges> onChanged)
    {
      return Task.FromResult<IDisposable>(null!);
    }
    public Task<PropertyChanges> GetAllAsync()
    {
      return Task.FromResult(new PropertyChanges());
    }
}
class Program
{
    static async Task Main(string[] _)
    {
      // D-Busシステムバスを使用
      // D-Busセッションバスを使用する場合は、Address.Sessionを使用すること
      var connection = new Connection(Address.System);
      await connection.ConnectAsync();
      try
      {
          // D-Busオブジェクトを登録
          var myObject = new MyObject();
          await connection.RegisterObjectAsync(myObject);
          // D-Busサービスを登録
          const string helperServiceName = "com.example.MyObject";
          await connection.RegisterServiceAsync(helperServiceName);
          // D-Busサービスを有効化
          await connection.ActivateServiceAsync("com.example.MyObject");
          Console.WriteLine("D-Bus server is start.");
          // D-Busヘルパーファイルの起動時間を指定  例: 30[Sec]
          await Task.Delay(1000 * 30);
          Console.WriteLine("Terminates the D-Bus server.");
      }
      catch (Exception e)
      {
          Console.WriteLine($"{e.Message}");
      }
      finally
      {
          // 登録したD-BusサービスおよびD-Busオブジェクトを削除
          connection.Dispose();
      }
    }
}
</syntaxhighlight>
<br>
==== D-Busセッションバスを使用する場合 ====
セッションバス向けD-Busサービスファイルを作成する。<br>
sudo vi /usr/share/dbus-1/services/<任意の名前>.service
<br>
<syntaxhighlight lang="ini">
# /usr/share/dbus-1/services/<任意の名前>.serviceファイル
[D-BUS Service]
Name=<D-Busサービス名>
Exec=<D-Busヘルパーファイルのパス>
</syntaxhighlight>
<br>
==== D-Busシステムバスを使用する場合 ====
まず、システムバス向けD-Busサービスファイルを作成する。<br>
sudo vi /usr/share/dbus-1/system-services/<任意の名前>.service
<br>
<syntaxhighlight lang="ini">
# /usr/share/dbus-1/system-services/<任意の名前>.serviceファイル
[D-BUS Service]
Name=<D-Busサービス名>
Exec=<D-Busヘルパーファイルのパス>
User=root
</syntaxhighlight>
<br>
次に、PolicyKit (PolKit) の動作するために必要なセキュリティポリシーを設定する。<br>
sudo vi /usr/share/dbus-1/system.d/<任意の名前>.conf
<br>
<syntaxhighlight lang="xml">
# /usr/share/dbus-1/system.d/<任意の名前>.confファイル
<policy user="root">
  <allow own="<D-Busサービス名>"/>
</policy>
<policy context="default">
  <allow send_destination="<D-Busサービス名>"/>
</policy>
  </syntaxhighlight>
  </syntaxhighlight>
<br><br>
<br><br>