IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

GTK+ Discussion :

D-BUS - - La methode n'éxiste pas sur l'interface


Sujet :

GTK+

  1. #1
    Membre actif Avatar de Gamall
    Profil pro
    Étudiant ENSEA
    Inscrit en
    août 2009
    Messages
    252
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant ENSEA

    Informations forums :
    Inscription : août 2009
    Messages : 252
    Points : 221
    Points
    221
    Par défaut D-BUS - - La methode n'éxiste pas sur l'interface
    Bonjour,
    Je sais pas trop si je suis sur le bon forum, mais vu qu'il s'agit quand même un peu de GLib, j'ai préféré poster ici.
    Mon problème est le suivant, j'essaie faire un petit test avec D-BUS, qui consiste à implémenter un objet qui servira de proxy. L'interface de ce proxy comporte un seule méthode "EchoString", qui prend en entrée une chaîne de caractère et renvoie une copie de cette chaîne.
    Le problème, c'est que quand j'appelle la méthode sur mon proxy, D-BUS me dit qu'aucune méthode de ce nom avec cette signature n’existe pas pour l'interface en question, alors qu'elle est bien dans mon fichier xml
    (Plus de détails sur l'erreur ci-dessous)

    Voici le code source du proxy:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    #include <glib.h>
    #include <dbus/dbus-glib.h>
    #include <dbus/dbus.h>
    #include "test.h"
     
    int
    main (void)
    {
    	GMainLoop *loop;
    	TestObject *t_object;
     
    	g_type_init ();
     
     
    	t_object = g_object_new (TEST_TYPE_OBJECT, NULL);
     
    	loop = g_main_loop_new(NULL, FALSE);
     
    	g_main_loop_run(loop);
     
    	g_object_unref (t_object);
     
    	return 0;
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    /* test.h */
     
    #ifndef __TEST_H__
    #define __TEST_H__
     
    #include <glib-object.h>
     
    G_BEGIN_DECLS
     
    #define TEST_TYPE_OBJECT (test_object_get_type())
    #define TEST_IS_OBJECT(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), TEST_TYPE_OBJECT))
    #define TEST_OBJECT(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), TEST_TYPE_OBJECT, TestObject))
    #define TEST_IS_OBJECT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), TEST_TYPE_OBJECT))
    #define TEST_OBJECT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), TEST_TYPE_OBJECT, TestObjectClass))
     
    typedef struct _TestObjectClass TestObjectClass;
    typedef struct _TestObject TestObject;
    typedef struct _TestObjectPrivate TestObjectPrivate;
     
    struct _TestObject
    {
    	GObject parent_object;
     
    	TestObjectPrivate *priv;
    };
     
    struct _TestObjectClass
    {
    	GObjectClass parent_class;
    };
     
    GType test_object_get_type (void) G_GNUC_CONST;
     
     
    G_END_DECLS
     
    #endif
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    /* test.c */
     
    #include <glib-object.h>
    #include <dbus/dbus-glib.h>
    #include <stdlib.h>
    #include "test.h"
     
    struct _TestObjectPrivate
    {
    	DBusGConnection *connection;
    	DBusGProxy *bus_proxy;
    };
     
    G_DEFINE_TYPE (TestObject, test_object, G_TYPE_OBJECT)
     
    gboolean test_echo_string (TestObject *t_obj, gchar *str_in, gchar **str_out_ptr, GError **error);
     
    static void test_object_dispose (GObject *object);
     
    void
    test_object_init (TestObject *t_obj)
    {
    	TestObjectPrivate *t_obj_priv;
    	GError *error;
    	guint32 x;
     
    	t_obj_priv = t_obj->priv = G_TYPE_INSTANCE_GET_PRIVATE (t_obj, TEST_TYPE_OBJECT, TestObjectPrivate);
     
    	error = NULL;
    	t_obj_priv->connection = dbus_g_bus_get(DBUS_BUS_SESSION, &error);
    	if (t_obj_priv->connection == NULL) {
    		g_printerr("Failed to open connection to bus: %s\n",
    				error->message);
    		exit (1);
    	}
     
    	t_obj_priv->bus_proxy = dbus_g_proxy_new_for_name(t_obj_priv->connection, "org.freedesktop.DBus",
    			"/org/freedesktop/DBus",
    			"org.freedesktop.DBus");
     
    	g_debug("About to request D-Bus name...\n");
    	if (!dbus_g_proxy_call(t_obj_priv->bus_proxy, "RequestName", &error,
    				G_TYPE_STRING, "home.joker.Test",
    				G_TYPE_UINT,
    				DBUS_NAME_FLAG_ALLOW_REPLACEMENT
    				| DBUS_NAME_FLAG_REPLACE_EXISTING
    				| DBUS_NAME_FLAG_DO_NOT_QUEUE,
    				G_TYPE_INVALID,
    				G_TYPE_UINT, &x,
    				G_TYPE_INVALID))
    	{           
    		g_printerr("Couldn't acquire name: %s\n", error->message);
    		exit(1);
    	}
    	else if (x != DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER) {
    		g_printerr("Couldn't acquire name: RequestName returned %u\n", x);
    		exit(1);
    	}
    	g_debug("D-Bus name acquired\n");
     
    	dbus_g_connection_register_g_object(t_obj_priv->connection, "/home/joker/test", G_OBJECT(t_obj));
    }
     
    #include "test-object-glue.h"
     
    void
    test_object_class_init (TestObjectClass *t_class)
    {
    	GObjectClass *object_class = G_OBJECT_CLASS (t_class);
     
    	object_class->dispose = test_object_dispose;
     
    	g_type_class_add_private (object_class, sizeof (TestObjectPrivate));
     
    	dbus_g_object_type_install_info (TEST_TYPE_OBJECT, &dbus_glib_test_object_info);
    }
     
    gboolean 
    test_echo_string (TestObject *t_obj, gchar *str_in, gchar **str_out_ptr, GError **error)
    {
    	*str_out_ptr = g_strdup (str_in);
     
    	if (NULL == *str_out_ptr)
    	{
    		g_set_error (error, g_quark_from_static_string ("echo"),
    				0xdeadbeef,
    				"Unable to allocate memory !");
    		return FALSE;
    	}
     
    	return TRUE;
    }
     
    static void
    test_object_dispose (GObject *object)
    {
    	TestObject *t_object = TEST_OBJECT (object);
     
    	if (NULL != t_object->priv->bus_proxy)
    	{
    		g_object_unref (t_object->priv->bus_proxy);
    		t_object->priv->bus_proxy = NULL;
    	}
     
    	G_OBJECT_CLASS (test_object_parent_class)->dispose (object);
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <?xml version="1.0" encoding="UTF-8"?>
     
    <node name="/home/joker/test">
    	<interface name="home.joker.test">
    		<annotation name="org.freedesktop.DBus.GLib.CSymbol" value="test"/>
    		<method name="EchoString">
    			<arg type="s" name="str_in" direction="in" />
    			<arg type="s" name="str_out_ptr" direction="out" />
    		</method>
    		<!-- Add more methods/signals if you want -->
    	</interface>
    </node>
    [zaour@joker dbus-activ]$ dbus-binding-tool --mode=glib-server --prefix=test test-object-infos.xml > test-object-glue.h
    [zaour@joker dbus-activ]$ gcc *.c $(pkg-config --libs --cflags dbus-glib-1) -W -Wall -std=c99 -o server
    test.c: In function ‘test_echo_string’:
    test.c:79:31: attention : unused parameter ‘t_obj’ [-Wunused-parameter]
    [zaour@joker dbus-activ]$ ./server
    ** (process:6418): DEBUG: About to request D-Bus name...

    ** (process:6418): DEBUG: D-Bus name acquired
    Et voici le code source, où j'appelle la méthode:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    #include <glib.h>
    #include <dbus/dbus-glib.h>
     
    int
    main (int argc, char **argv)
    {
      DBusGConnection *connection;
      GError *error;
      DBusGProxy *proxy;
      char send[] = "Hello, World !\n";
      char *result;
     
      g_type_init ();
     
      error = NULL;
      connection = dbus_g_bus_get (DBUS_BUS_SESSION,
                                   &error);
      if (connection == NULL)
        {
          g_printerr ("Failed to open connection to bus: %s\n",
                      error->message);
          g_error_free (error);
          exit (1);
        }
     
      /* Création du proxy */
     
      proxy = dbus_g_proxy_new_for_name (connection,
                                         "home.joker.Test",
                                         "/home/joker/Test",
                                         "home.joker.test");
     
      /* Appel d'EchoString, attente d'une réponse */
      error = NULL;
      if (!dbus_g_proxy_call (proxy, "EchoString", &error, 
    			  G_TYPE_STRING, send, G_TYPE_INVALID,
    			  G_TYPE_STRING, &result, G_TYPE_INVALID))
        {
          if (error->domain == DBUS_GERROR && error->code == DBUS_GERROR_REMOTE_EXCEPTION)
            g_printerr ("Caught remote method exception %s: %s",
    	            dbus_g_error_get_name (error),
    	            error->message);
          else
            g_printerr ("Error: %s\n", error->message);
          g_error_free (error);
          exit (1);
        }
     
          /* Affichage du résultat */
     
      g_print ("String on the message bus:\n");
      g_print (result);
      g_free (result);
     
      g_object_unref (proxy);
     
      return 0;
    }
    [zaour@joker essai]$ ./a.out
    Error: Method "EchoString" with signature "s" on interface "home.joker.test" doesn't exist

    [zaour@joker essai]$
    Alors si quelqu'un a une idée de la provenance du problème, ça serait génial
    Merci

  2. #2
    Membre averti
    Inscrit en
    janvier 2007
    Messages
    329
    Détails du profil
    Informations forums :
    Inscription : janvier 2007
    Messages : 329
    Points : 365
    Points
    365
    Par défaut
    Hello,

    C'est possible que tu doives redémarrer le daemon dbus pour que ton nouveau service "home.joker.test" soit pris en compte.

    Si ça ne marche toujours pas, essaie d'utiliser dbus-monitor ou dbus-explorer pour voir ce qui se passe ; vu comme ça je peux pas t'en dire plus...

    -

  3. #3
    Membre actif Avatar de Gamall
    Profil pro
    Étudiant ENSEA
    Inscrit en
    août 2009
    Messages
    252
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant ENSEA

    Informations forums :
    Inscription : août 2009
    Messages : 252
    Points : 221
    Points
    221
    Par défaut Sujet résolu, exemple de code source proxy D-BUS
    Salut,

    J'ai carrément redémarré mon système, et effectivement, ça fonctionne actuellement. De plus, je me suis rendu compte qu'il y avait une erreur de syntaxe dans mon .service, il manquait un crochet. J'ai aussi apporté quelques modifs à mon code source.

    Vu comme j'ai eu du mal à trouver des exemples de codes suffisamment clairs et exploitable, je poste l'intégralité de mon code source fonctionnel, au cas ou ça pourrait en aider certains.

    Finalement, plutôt que de mettre le code ici, j'ai créé un dépôt sur gitorious, voici le lien: (dbus-test)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $git clone git://gitorious.org/projeti3-apache-log-analyser/projeti3-apache-log-analyser.git
    $cd dbus-test
    $./configure --prefix=/usr
    $make
    $sudo make install
    $sudo make uninstall

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [WM20] HTTPRequête avec methode POST fonctionne sur android mais pas sur ios
    Par law56100 dans le forum Windev Mobile
    Réponses: 2
    Dernier message: 01/07/2015, 12h20
  2. Code qui ne fonctionne pas sur Mac
    Par malbaladejo dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 14/01/2005, 12h08
  3. Réponses: 3
    Dernier message: 08/09/2003, 16h06
  4. [Tomcat]Fonctionne sur Tomcat 3.2.1, pas sur 4.1.27
    Par lujayne dans le forum Tomcat et TomEE
    Réponses: 6
    Dernier message: 07/08/2003, 10h50
  5. Réponses: 9
    Dernier message: 07/05/2003, 13h57

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo