public static Message ConstructReply(MessageContainer method_call, params object[] vals) { var msg = method_call.Message; MessageContainer method_return = new MessageContainer { Type = MessageType.MethodReturn, ReplySerial = msg.Header.Serial }; Message replyMsg = method_return.Message; Signature inSig = Signature.GetSig(vals); if (vals != null && vals.Length != 0) { MessageWriter writer = new MessageWriter(Connection.NativeEndianness); foreach (object arg in vals) { writer.Write(arg.GetType(), arg); } replyMsg.AttachBodyTo(writer); } //TODO: we should be more strict here, but this fallback was added as a quick fix for p2p if (method_call.Sender != null) { replyMsg.Header[FieldCode.Destination] = method_call.Sender; } replyMsg.Signature = inSig; //replyMsg.WriteHeader (); return(replyMsg); }
public void SendSignal(string iface, string member, string inSigStr, MessageWriter writer, Type retType, out Exception exception) { exception = null; Signature outSig = String.IsNullOrEmpty(inSigStr) ? Signature.Empty : new Signature(inSigStr); MessageContainer signal = new MessageContainer { Type = MessageType.Signal, Path = object_path, Interface = iface, Member = member, Signature = outSig, }; Message signalMsg = signal.Message; signalMsg.AttachBodyTo(writer); conn.Send(signalMsg); }
public static Message ConstructDynamicReply(MessageContainer method_call, MethodInfo mi, object retVal, object[] vals) { Type retType = mi.ReturnType; MessageContainer method_return = new MessageContainer { Serial = method_call.Serial, }; Message replyMsg = method_return.Message; Signature outSig = Signature.GetSig(retType); outSig += Signature.GetSig(Mapper.GetTypes(ArgDirection.Out, mi.GetParameters())); if (outSig != Signature.Empty) { MessageWriter writer = new MessageWriter(Connection.NativeEndianness); //first write the return value, if any if (retType != null && retType != typeof(void)) { writer.Write(retType, retVal); } //then write the out args WriteDynamicValues(writer, mi.GetParameters(), vals); replyMsg.AttachBodyTo(writer); } //TODO: we should be more strict here, but this fallback was added as a quick fix for p2p if (method_call.Sender != null) { replyMsg.Header[FieldCode.Destination] = method_call.Sender; } replyMsg.Signature = outSig; return(replyMsg); }
public MessageReader SendMethodCall(string iface, string member, string inSigStr, MessageWriter writer, Type retType, out Exception exception) { if (string.IsNullOrEmpty(bus_name)) { throw new ArgumentNullException("bus_name"); } if (object_path == null) { throw new ArgumentNullException("object_path"); } exception = null; Signature inSig = String.IsNullOrEmpty(inSigStr) ? Signature.Empty : new Signature(inSigStr); MessageContainer method_call = new MessageContainer { Path = object_path, Interface = iface, Member = member, Destination = bus_name, Signature = inSig }; Message callMsg = method_call.Message; callMsg.AttachBodyTo(writer); bool needsReply = true; callMsg.ReplyExpected = needsReply; callMsg.Signature = inSig; if (!needsReply) { conn.Send(callMsg); return(null); } #if PROTO_REPLY_SIGNATURE if (needsReply) { Signature outSig = Signature.GetSig(retType); callMsg.Header[FieldCode.ReplySignature] = outSig; } #endif Message retMsg = conn.SendWithReplyAndBlock(callMsg); MessageReader retVal = null; //handle the reply message switch (retMsg.Header.MessageType) { case MessageType.MethodReturn: retVal = new MessageReader(retMsg); break; case MessageType.Error: MessageContainer error = MessageContainer.FromMessage(retMsg); string errMsg = String.Empty; if (retMsg.Signature.Value.StartsWith("s")) { MessageReader reader = new MessageReader(retMsg); errMsg = reader.ReadString(); } exception = new Exception(error.ErrorName + ": " + errMsg); break; default: throw new Exception("Got unexpected message of type " + retMsg.Header.MessageType + " while waiting for a MethodReturn or Error"); } return(retVal); }