[Kde-bindings] Qyoto DBUS

Richard Dale rdale at foton.es
Wed Jan 10 16:38:48 UTC 2007


On Wednesday 10 January 2007 16:25, Arno Rehn wrote:
> Am Mittwoch, 10. Januar 2007 16:24 schrieb Richard Dale:
> > On Wednesday 10 January 2007 14:15, Arno Rehn wrote:
> > > Hi,
> > >
> > > I have added most of the marshallers by now, I think, and the ones we
> > > need for getting dbus to work are also complete.
> >
> > Great! I've been meaning to do some work on Qyoto for a while, but
> > haven't got round to it.
>
> Same goes for me. ;-)
>
> > It would be really nice to get QDBus working. I've been
> > meaning to review your marshaller code - it had lists of 'void*'s which
> > didn't look quite right. I think there should be callbacks for each
> > element of a list, rather than for a complete list.
>
> These are only used when marshalling from an ArrayList to a
> QList<whatever>. I store the pointers to the C#-objects which are in the
> ArrayList in a QList<void*>. In C++ I iterate through the list and first
> get the
> smokeqyoto_objects with value_object_info and then the underlying real
> Qt-object. Couldn't think of a better solution.
Yes, that's fine I suppose because the pointer in the smokeqyoto_object struct 
is a 'void *'. But rather than build them up into a complete list I was 
suggesting have a callback to the c++ side for every element (although that 
might be less efficient), as it is more similar to the way the qtruby code 
works.

> > > I've again tried to get the
> > > listnames example to work, but as before it fails when we try to call
> > > get the session bus via SessionBus() - it doesn't return a real object.
> > >
> > > I tried it with the code from Richard:
> > > using Qyoto;
> > > using System;
> > >
> > > class ListNames {
> > >
> > > 	public static void method2()
> > >         {
> > > 		QDBusConnection bus = QDBusConnection.SessionBus();
> > > 		QDBusInterface dbus_iface = new
> > > QDBusInterface("org.freedesktop.DBus", "/org/freedesktop/DBus",
> > > 								"org.freedesktop.DBus", bus);
> > > 		QDBusMessage result = dbus_iface.Call("ListNames");
> > > 		QDBusMessage.MessageType mess = result.type();
> > > 	}
> > >
> > > 	public static int Main(string[] args) {
> > >         	new QCoreApplication(args);
> > >
> > > 		if (!QDBusConnection.SessionBus().IsConnected()) {
> > > 			Console.WriteLine("Cannot connect to the D-BUS session bus.\n" +
> > > 				"To start it, run:\n" +
> > > 				"\teval `dbus-launch --auto-syntax`\n");
> > > 			return 1;
> > > 		}
> > >
> > > 		method2();
> > > 		Qyoto.Qyoto.DeleteQApp();
> > > 		return 0;
> > > 	}
> > > }
> > >
> > > The line
> > > if (!QDBusConnection.SessionBus().IsConnected()) {
> > > gives the error
> > > Unhandled Exception: System.NullReferenceException: Object reference
> > > not set to an instance of an object
> > >   at ListNames.Main (System.String[] args) [0x00000]
> > >
> > > I don't really know what goes wrong here, other static methods do work
> > > well. Any ideas?
> >
> > Hmm, I've just tried it with some debugging messages and it works fine
> > for me:
> >
> > 	public static void method2()
> > 	{
> > Console.WriteLine("In method2");
> > 		QDBusConnection bus = QDBusConnection.SessionBus();
> > Console.WriteLine("In method2 bus: {0}", bus);
> > 		QDBusInterface dbus_iface = new
> > QDBusInterface("org.freedesktop.DBus", "/org/freedesktop/DBus",
> > 								"org.freedesktop.DBus", bus);
> > Console.WriteLine("In method2 dbus_iface: {0}", dbus_iface);
> > 		QDBusMessage result = dbus_iface.Call("ListNames");
> > Console.WriteLine("In method2 result: {0}", result);
> > 		QDBusMessage.MessageType mess = result.type();
> > Console.WriteLine("In method2 mess: {0}", mess);
> > 	}
> >
> > mardigras rdale 553% mono listnames.exe
> > In method2
> > In method2 bus: Qyoto.QDBusConnection
> > In method2 dbus_iface: Qyoto.QDBusInterface
> > In method2 result: Qyoto.QDBusMessage
> > In method2 mess: ReplyMessage
> >
> > Are you sure you have dbus running - does the c++ example work ok?
>
> DBus is running and the C++ example works perfectly. I have no clue why it
> doesn't work in C#. It doesn't even come as far as method2(). It gets stuck
> when trying to call QDBusConnection.SessionBus().IsConnected().
> QDBusConnection.SessionBus() returns 'null'
I'm not sure what can be going wrong. 

I've added some more code to print out the reply value of the dbus call, and 
it looks like the code for marshalling QStringLists and QLists of QVariants 
is all working fine:

	public static void method2()
	{
Console.WriteLine("In method2");
		QDBusConnection bus = QDBusConnection.SessionBus();
Console.WriteLine("In method2 bus: {0}", bus);
		QDBusInterface dbus_iface = new 
QDBusInterface("org.freedesktop.DBus", "/org/freedesktop/DBus",
								"org.freedesktop.DBus", bus);
Console.WriteLine("In method2 dbus_iface: {0}", dbus_iface);
		QDBusMessage result = dbus_iface.Call("ListNames");
Console.WriteLine("In method2 result: {0}", result);
		QDBusMessage.MessageType mess = result.type();
Console.WriteLine("In method2 mess: {0}", mess);
		ArrayList args = result.Arguments();
Console.WriteLine("In method2 args: {0}", args);
Console.WriteLine("In method2 args[0]: {0}", args[0]);
		ArrayList names = ((QVariant) args[0]).ToStringList();
Console.WriteLine("In method2 names: {0}", names);
		foreach (string name in names) {
			Console.WriteLine("name: {0}", name);
        }

	}

mardigras rdale 566% mono listnames.exe
In method2
In method2 bus: Qyoto.QDBusConnection
In method2 dbus_iface: Qyoto.QDBusInterface
In method2 result: Qyoto.QDBusMessage
In method2 mess: ReplyMessage
In method2 args: System.Collections.ArrayList
In method2 args[0]: Qyoto.QVariant
In method2 names: System.Collections.ArrayList
name: org.freedesktop.DBus
name: :1.0
name: :1.9
name: com.trolltech.Assistant
name: :1.1

-- Richard





More information about the Kde-bindings mailing list