/// <summary> /// Sends a clocked rset to another client /// </summary> /// <param name="PeerId">The peer to send to</param> /// <param name="Reliability">Reliability to send at</param> /// <param name="Target">The node that is the target of our rpc call</param> /// <param name="MemberName">The name of the member to set</param> /// <param name="Value">The value to set</param> public void SendClockedRset(int PeerId, MDReliability Reliability, Node Target, string MemberName, object Value) { if (PeerId == MDStatics.GetPeerId()) { // This is to ourselves so just set Target.SetMemberValue(MemberName, Value); return; } MDRemoteMode Mode = MDStatics.GetMemberRpcType(Target, MemberName); MemberInfo info = MDStatics.GetMemberInfo(Target, MemberName); IMDDataConverter Converter = MDStatics.GetConverterForType(info.GetUnderlyingType()); switch (Mode) { case MDRemoteMode.Master: if (!Target.IsNetworkMaster()) { // Remote invoke master only SendClockedCall(PeerId, ClockedRemoteCall.TypeOfCall.RSET, Reliability, Target.GetPath(), MemberName, Mode, Converter.ConvertForSending(Value, true)); } break; case MDRemoteMode.MasterSync: if (!Target.IsNetworkMaster()) { // Remote invoke master only SendClockedCall(PeerId, ClockedRemoteCall.TypeOfCall.RSET, Reliability, Target.GetPath(), MemberName, Mode, Converter.ConvertForSending(Value, true)); } Target.SetMemberValue(MemberName, Value); break; case MDRemoteMode.Puppet: case MDRemoteMode.Remote: // Remote invoke SendClockedCall(PeerId, ClockedRemoteCall.TypeOfCall.RSET, Reliability, Target.GetPath(), MemberName, Mode, Converter.ConvertForSending(Value, true)); break; case MDRemoteMode.PuppetSync: case MDRemoteMode.RemoteSync: // Remote invoke and local invoke SendClockedCall(PeerId, ClockedRemoteCall.TypeOfCall.RSET, Reliability, Target.GetPath(), MemberName, Mode, Converter.ConvertForSending(Value, true)); Target.SetMemberValue(MemberName, Value); break; } }
public object[] ConvertForSending(object Item, bool Complete) { ExtractMembers(); if (Item == null) { return(new object[] { null }); } List <object> ObjectArray = new List <object>(); List <object> newLastValues = new List <object>(); for (int i = 0; i < Members.Count; i++) { object value = Members[i].GetValue(Item); IMDDataConverter Converter = DataConverters[i]; if (Complete || LastValues.Count == 0 || Converter.ShouldObjectBeReplicated(LastValues[i], value)) { object[] dataArray = Converter.ConvertForSending(value, Complete); if (dataArray != null) { ObjectArray.Add($"{i}{SEPARATOR}{dataArray.Length}"); ObjectArray.AddRange(dataArray); } else { ObjectArray.Add($"{i}{SEPARATOR}{1}"); ObjectArray.Add(null); } } newLastValues.Add(value); } MDLog.Trace(LOG_CAT, $"MDCustomClass converting for sending ({MDStatics.GetParametersAsString(ObjectArray.ToArray())})"); LastValues = newLastValues; return(ObjectArray.ToArray()); }
/// <summary> /// Converts the parameters for sending /// </summary> /// <param name="MethodInfo">The method the parameters are for</param> /// <param name="Parameters">The parameters</param> /// <returns>List of converted parameters</returns> public static object[] ConvertParametersForSending(MethodInfo MethodInfo, params object[] Parameters) { ParameterInfo[] CandidateParams = MethodInfo.GetParameters(); List <object> NewParams = new List <object>(); for (int i = 0; i < CandidateParams.Length; i++) { IMDDataConverter Converter = GetConverterForType(CandidateParams[i].ParameterType); object[] paramsForSending = new object[] { null }; if (Parameters != null && i < Parameters.Length) { paramsForSending = Converter.ConvertForSending(Parameters[i], true); NewParams.Add($"{i}{SEPARATOR}{paramsForSending.Length}"); } else { NewParams.Add($"{i}{SEPARATOR}{1}"); } NewParams.AddRange(paramsForSending); } return(NewParams.ToArray()); }
/// <summary> /// Just for convenience /// </summary> /// <param name="Item">The item to convert</param> /// <param name="Complete">Should we do a complete conversion?</param> /// <returns>The object array to send</returns> protected object[] ConvertToObject(object Item, bool Complete) { return(DataConverter.ConvertForSending(Item, Complete)); }