2017-06-10 1 views
0

私はVala言語でDbusサービスを作成しました。異なるパスを持つデバイスを追加するためのインターフェイスを作成します。デバイスはdirをスキャンし、サブパスでメソッドをバインドする必要があります。DBus上の第2クラスのメソッドは呼び出し不可能

私はsu.example.Phone.AddBySyspath(/sys/bus/usb/devices/2-2.4)を呼び出し、 "/ su/example/phone/2_2d4"を期待どおりに返します。しかし、このパス上でResetを呼び出すと、「su/example/phone/2_2d4のパスをインタフェースsu.example.Phoneにリセットする方法が見つかりません」というメッセージが表示されます。

私はコードを持っている:私はこれを解決した質問を書いている間

using Gee; 

[DBus (name = "su.example.Phone")] 
public class Phone : Object { 

    Regex ttyregex; 
    string path; 
    string manufacturer; 

    public Phone(string path){ 
     this.path = path; 
     this.ttyregex = new Regex ("tty[A-Z0-9]+"); 
     this.manufacturer = "Unknown"; 
     load(); 
    } 

    private async void load(){ 
     string[3] ttys = {"", "", ""}; 
     var dir = File.new_for_path (path); 
     stderr.printf ("path %s\n", path); 

     FindTTY(dir,0,ttys); 
     stdout.printf ("done\n"); 
    } 


    private void FindTTY(File dir, int sub, string[] ttys){ 
     sub++; 
     FileEnumerator enumerator = dir.enumerate_children(
      "standard::*", 
      FileQueryInfoFlags.NONE 
     ); 

     FileInfo info = null; 
     while 
      ((info = enumerator.next_file()) != null) 
     { 
      var name = info.get_name(); 

      if (name == "manufacturer") { 
       File f = dir.resolve_relative_path (info.get_name()); 
       var dis = new DataInputStream (f.read()); 
       manufacturer = dis.read_line (null); 
      } 

      stdout.printf ("%s\n", info.get_name()); 
      stdout.printf ("%d\n", info.get_file_type()); 
     } 
    } 

    public string reset() throws Error { 

     stdout.printf ("ATZ\n"); 
     return "OK"; 

    } 



} 



[DBus (name = "su.example.Phone")] 
public class PhoneServer : Object { 

    Regex dotregex; 
    Regex nonalpharegex; 

    private DBusConnection conn; 
    private HashMap<string, Phone> map; 

    public PhoneServer(DBusConnection conn) { 
     this.conn = conn; 
     this.map = new HashMap<string, Phone>(); 

     this.dotregex = new Regex ("[.]+"); 
     this.nonalpharegex = new Regex ("\\W+"); 

    } 



    public string add_by_syspath(string path, GLib.BusName sender) throws Error { 
     // path = /sys/bus/usb/devices/2-2.4 

     var pathv = path.split("/"); 
     string name = pathv[pathv.length-1]; 

     name = dotregex.replace(name,name.length,0, "d"); 
     name = nonalpharegex.replace(name,name.length,0, "_"); 

     stderr.printf ("name %s\n", name); 

     var buspath = "/su/example/phone/%s".printf(name); 

     if (map.has_key(name)) { 

     } else { 

      var phone = new Phone (path); 
      map.set(name,phone); 

      try { 
       conn.register_object ("/su/example/phone/%s".printf(name), phone); 
      } catch (IOError e) { 
       stderr.printf ("Could not register service\n"); 
      } 

     } 

     return buspath; 
    } 
} 

[DBus (name = "su.example.PhoneError")] 
public errordomain PhoneError 
{ 
    SOME_ERROR 
} 


void on_bus_aquired (DBusConnection conn) { 
    try { 
     conn.register_object ("/su/example/phone", new PhoneServer (conn)); 
    } catch (IOError e) { 
     stderr.printf ("Could not register service\n"); 
    } 
} 

void main (string[] args) { 

    Bus.own_name (BusType.SYSTEM, "su.example.Phone", BusNameOwnerFlags.NONE, 
        on_bus_aquired, 
       () => {}, 
       () => stderr.printf ("Could not aquire name\n")); 

    new MainLoop().run(); 
} 

答えて

2

を。

私は、ハンドラクラスごとに異なるDバス名を使用する必要があります。

[DBus (name = "su.eerie.PhoneManager.Phone")] 
public class Phone : Object { 

... 


[DBus (name = "su.eerie.PhoneManager")] 
public class PhoneServer : Object { 

... 
+0

どのように受け入れ答えとしてこれをマークするでしょうか? – AlexB

関連する問題