/// <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;
            }
        }
Exemple #2
0
        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());
        }
Exemple #3
0
        /// <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));
 }