/// <summary> Globally calls an <see cref="RPCMessage"/>, as if the given client had sent it. </summary> /// <param name="client"> Client to simulate call of method for </param> /// <param name="callback"> Callback to call </param> /// <param name="stuff"> Parameters for call </param> public void Call(Client client, RPCMessage.Handler callback, params System.Object[] stuff) { string str = Client.FormatCall(callback, stuff); RPCMessage msg = RPCMessage.TCP(client, str); incoming.Enqueue(msg); }
private void HandleMessage(RPCMessage msg) { RPCMessage.Handler handler = GetHandler(msg); try { handler?.Invoke(msg); } catch (Exception e) { Log.Warning($"Error occurred during {msg.rpcName}: ", e); } }
/// <summary> Sends a message to remotely call a function handler on the client. </summary> /// <param name="callback"> Handler to call </param> /// <param name="stuff"> parameters to send into call </param> public void Call(RPCMessage.Handler callback, params System.Object[] stuff) { if (closed) { throw new InvalidOperationException("Cannot send messages on a closed Client"); } string msg = FormatCall(callback, stuff); tcpOutgoing.Enqueue(msg); }
public void Reply(RPCMessage.Handler callback, params System.Object[] stuff) { if (wasUDP) { sender.Hurl(callback, stuff); } else { sender.Call(callback, stuff); } }
/// <summary> Formats a message into a string intended to be sent over the network. </summary> /// <param name="stuff"> Array of parameters to format. </param> /// <returns> String of all objects in <paramref name="stuff"/> formatted to be sent over the network. </returns> public static string FormatCall(RPCMessage.Handler callback, params System.Object[] stuff) { string time = Pack.Base64(DateTime.UtcNow); string methodName = callback.Method.Name; string typeName = callback.Method.DeclaringType.ShortName(); string msg; if (stuff.Length > 0) { string[] strs = new string[stuff.Length]; for (int i = 0; i < strs.Length; i++) { strs[i] = stuff[i].ToString(); } string rest = String.Join("" + RPCMessage.SEPARATOR, strs); msg = String.Join("" + RPCMessage.SEPARATOR, typeName, methodName, time, rest); } else { msg = String.Join("" + RPCMessage.SEPARATOR, typeName, methodName, time); } return(msg); }
public void Forward(IEnumerable <Client> clients, RPCMessage.Handler callback, params System.Object[] stuff) { }