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); foreach (var child in childNames) { writer.WriteChildNode(child); } writer.WriteNodeEnd(); var xml = writer.ToString(); SendMessage(MessageHelper.ConstructReply(methodCall, xml), peer); } } SendUnknownMethodError(methodCall, peer); } }
async void HandleMethodCall(Message methodCall, IMessageStream peer) { bool pathKnown = false; IMethodHandler methodHandler = null; if (methodCall.Header.Path.HasValue && !string.IsNullOrEmpty(methodCall.Header.Interface)) { var pathHandler = PartHandlerForPath(methodCall.Header.Path.Value); if (pathHandler != null) { pathKnown = true; if (!pathHandler.InterfaceHandlers.TryGetValue(methodCall.Header.Interface, out methodHandler)) { methodHandler = GlobalInterfaceHandlers.GetValueOrDefault(methodCall.Header.Interface); } if (methodHandler != null && !methodHandler.CheckExposure(methodCall.Header.Path.Value)) { methodHandler = null; } } } if (methodHandler != null) { var reply = await methodHandler.HandleMethodCall(methodCall); if (reply != null) { reply.Header.ReplySerial = methodCall.Header.Serial; reply.Header.Destination = methodCall.Header.Sender; SendMessage(reply, peer); } else if (methodCall.Header.ReplyExpected) { SendMessage(MessageHelper.ConstructReply(methodCall), peer); } } else if (methodCall.Header.ReplyExpected) { if (!pathKnown) { SendErrorReply(methodCall, DBusErrors.UnknownObject, $"No objects at path {methodCall.Header.Path}", peer); } else { SendErrorReply(methodCall, DBusErrors.UnknownInterface, $"No interface {methodCall.Header.Interface} at path {methodCall.Header.Path}", peer); } } }