I get this exception when trying to get a call that returns a Dictionary<string,Dictionary<string,object>>:
Unhandled Exception: System.IndexOutOfRangeException: Array index is out of range.
at NDesk.DBus.MessageReader.MarshalUInt (System.Byte* dst) [0x00017] in /build/buildd/ndesk-dbus-0.6.0/src/MessageReader.cs:195
at NDesk.DBus.MessageReader.ReadInt32 () [0x00000] in /build/buildd/ndesk-dbus-0.6.0/src/MessageReader.cs:213
at NDesk.DBus.MessageReader.ReadValue (DType dtype) [0x000a0] in /build/buildd/ndesk-dbus-0.6.0/src/MessageReader.cs:95
at NDesk.DBus.MessageReader.ReadValue (System.Type type) [0x0011d] in /build/buildd/ndesk-dbus-0.6.0/src/MessageReader.cs:68
at NDesk.DBus.MessageReader.ReadStruct (System.Type type) [0x0002b] in /build/buildd/ndesk-dbus-0.6.0/src/MessageReader.cs:410
at NDesk.DBus.MessageReader.ReadValue (System.Type type) [0x0010d] in /build/buildd/ndesk-dbus-0.6.0/src/MessageReader.cs:64
at NDesk.DBus.MessageReader.ReadArray (System.Type elemType) [0x000b2] in /build/buildd/ndesk-dbus-0.6.0/src/MessageReader.cs:374
at NDesk.DBus.MessageReader.ReadValue (System.Type type) [0x0001d] in /build/buildd/ndesk-dbus-0.6.0/src/MessageReader.cs:44
at NDesk.DBus.MessageReader.ReadStruct (System.Type type) [0x0002b] in /build/buildd/ndesk-dbus-0.6.0/src/MessageReader.cs:410
at NDesk.DBus.MessageReader.ReadValue (System.Type type) [0x0010d] in /build/buildd/ndesk-dbus-0.6.0/src/MessageReader.cs:64
at NDesk.DBus.MessageHelper.GetDynamicValues (NDesk.DBus.Message msg, System.Type[] types) [0x00086] in /build/buildd/ndesk-dbus-0.6.0/src/Mapper.cs:289
at NDesk.DBus.BusObject.SendMethodCall (System.String iface, System.String member, System.String inSigStr, NDesk.DBus.MessageWriter writer, System.Type retType, System.Exception& exception) [0x000b5] in /build/buildd/ndesk-dbus-0.6.0/src/BusObject.cs:149
at INetworkManagerSettingsConnectionProxy.GetSettings () [0x00000]
at testNMDbus.MainClass.Main (System.String[] args) [0x00010] in /home/kev/Projects/VTel/GPS/GPSLocationAssistant/testNMDbus/Main.cs:15
The dbus method is from org.freedesktop.NetworkManagerSettings.Connection. I generated the c# interface from DBus-explorer.
Example code to reproduce the bug:
using System; Collections. Generic;
using System.
using NDesk.DBus;
namespace testNMDbus ettings Settings nms; ettings( ) GetObject< INetworkManager Settings> ("org.freedeskt op.NetworkManag erUserSettings" , new ObjectPath( "/org/freedeskt op/NetworkManag erSettings" ));
{
public class NetworkManagerS
{
private INetworkManager
private Connection DBusConnection;
public NetworkManagerS
{
DBusConnection = Bus.System;
nms = DBusConnection.
}
public ObjectPath[] ListConnections() ions();
{
return nms.ListConnect
}
}
[Interface( "org.freedeskto p.NetworkManage rSettings" )] Settings
public interface INetworkManager
{
ObjectPath[] ListConnections();
}
public delegate void UpdatedSettings Handler( Dictionary< string, Dictionary<string, object>> properties);
public class NetworkManagerS ettingsConnecti on SettingsConnect ion nmsc; ettingsConnecti on(ObjectPath connectionPath) GetObject< INetworkManager SettingsConnect ion>("org. freedesktop. NetworkManagerU serSettings" , connectionPath);
{
private Connection DBusConnection;
public INetworkManager
public NetworkManagerS
{
DBusConnection = Bus.System;
nmsc = DBusConnection.
}
}
[Interface( "org.freedeskto p.NetworkManage rSettings. Connection" )] SettingsConnect ion <string, Dictionary<string, object>> GetSettings(); Dictionary< string, Dictionary<string, object>> properties); Handler Updated;
public interface INetworkManager
{
Dictionary
void Delete();
void Update(
event EventHandler Removed;
event UpdatedSettings
}
class MainClass erSettingsConne ction connection = new NetworkManagerS ettingsConnecti on(new ObjectPath( "/org/freedeskt op/NetworkManag erSettings/ 10"));
{
public static void Main(string[] args)
{
NetworkManag
Dictionary< string, Dictionary< string, object> > settings = connection. nmsc.GetSetting s();
foreach(string key in settings.Keys) WriteLine( key+":" ); key][setting] ; WriteLine( "\t"+setting+ " = "+value. ToString( ));
{
Console.
foreach(string setting in settings[key].Keys)
{
object value = settings[
Console.
}
}
}
}
}