private string GenerateIntrospectionXml(TypeDescription description) { var writer = new IntrospectionWriter(); bool hasProperties = false; foreach (var interf in description.Interfaces) { writer.WriteInterfaceStart(interf.Name); foreach (var method in interf.Methods) { writer.WriteMethodStart(method.Name); foreach (var arg in method.InArguments) { writer.WriteInArg(arg.Name, arg.Signature); } foreach (var arg in method.OutArguments) { writer.WriteOutArg(arg.Name, arg.Signature); } writer.WriteMethodEnd(); } foreach (var signal in interf.Signals) { writer.WriteSignalStart(signal.Name); foreach (var arg in signal.SignalArguments) { writer.WriteArg(arg.Name, arg.Signature); } writer.WriteSignalEnd(); } foreach (var prop in interf.Properties) { hasProperties = true; writer.WriteProperty(prop.Name, prop.Signature, prop.Access); } writer.WriteInterfaceEnd(); } if (hasProperties) { writer.WritePropertiesInterface(); } writer.WriteIntrospectableInterface(); writer.WritePeerInterface(); return(writer.ToString()); }
private async void HandleMethodCall(Message methodCall, IMessageStream peer) { switch (methodCall.Header.Interface) { case "org.freedesktop.DBus.Peer": switch (methodCall.Header.Member) { case "Ping": { SendMessage(MessageHelper.ConstructReply(methodCall), peer); return; } case "GetMachineId": { SendMessage(MessageHelper.ConstructReply(methodCall, Environment.MachineId), peer); return; } } break; } MethodHandler methodHandler; if (_methodHandlers.TryGetValue(methodCall.Header.Path.Value, out methodHandler)) { var reply = await methodHandler(methodCall); reply.Header.ReplySerial = methodCall.Header.Serial; reply.Header.Destination = methodCall.Header.Sender; SendMessage(reply, peer); } else { if (methodCall.Header.Interface == "org.freedesktop.DBus.Introspectable" && methodCall.Header.Member == "Introspect" && methodCall.Header.Path.HasValue) { var path = methodCall.Header.Path.Value; var childNames = GetChildNames(path); if (childNames.Length > 0) { var writer = new IntrospectionWriter(); writer.WriteDocType(); writer.WriteNodeStart(path.Value); writer.WriteIntrospectableInterface(); writer.WritePeerInterface(); foreach (var child in childNames) { writer.WriteChildNode(child); } writer.WriteNodeEnd(); var xml = writer.ToString(); SendMessage(MessageHelper.ConstructReply(methodCall, xml), peer); return; } } SendUnknownMethodError(methodCall, peer); } }