public static ReusableList <IUserCmd> FromProtoBuf(UserCmdMessage message)
        {
            ReusableList <IUserCmd> list = ReusableList <IUserCmd> .Allocate();

            var count = message.UserCmdList.Count;

            for (int i = 0; i < count; i++)
            {
                var     item = message.UserCmdList[i];
                UserCmd cmd  = UserCmd.Allocate();
                cmd.RenderTime     = item.RenderTime;
                cmd.FrameInterval  = item.FrameInterval;
                cmd.MoveHorizontal = item.MoveHorizontal;
                cmd.MoveVertical   = item.MoveVertical;
                cmd.MoveUpDown     = item.MoveUpDown;
                cmd.Seq            = item.Seq;
                cmd.DeltaPitch     = item.DeltaPitch;
                cmd.DeltaYaw       = item.DeltaYaw;
                cmd.Buttons        = item.Buttons;
                cmd.BeState        = item.BeState;
                cmd.SwitchNumber   = item.SwitchNumber;
                cmd.ChangedSeat    = item.ChangedSeat;
                cmd.ChangeChannel  = item.ChangeChannel;
                cmd.SnapshotId     = item.SnapshotId;
                cmd.CurWeapon      = item.CurWeapon;
                cmd.PickUpEquip    = item.PickUpEquip;
                cmd.UseEntityId    = item.UseVehicleId;
                cmd.UseVehicleSeat = item.UseVehicleSeat;
                cmd.UseType        = item.UseType;
                cmd.BagIndex       = item.BagIndex;
                list.Value.Add(cmd);
            }
            return(list);
        }
Example #2
0
        private string MakeNode(DataType item, StringBuilder classText)
        {
            StringBuilder outputText = new StringBuilder();

            foreach (var property in item.Properties)
            {
                classText.Append(property.Name + " : " + property.DataTypeName);
                if (!string.IsNullOrWhiteSpace(property.MinCardinality) && !string.IsNullOrWhiteSpace(property.MaxCardinality))
                {
                    classText.Append("[" + property.MinCardinality + "..." + property.MaxCardinality + "] ");
                }
                classText.Append("\\l");
                if (ClassList.Contains(property.DataType))
                {
                    outputText.Append("edge[ arrowhead = \"none\" headlabel = \"0...*\" taillabel = \"0...*\"] ");
                    outputText.Append(item.Name + " -> " + property.DataTypeName + "[ label = \"" + property.Name + "\"] ");
                }
                if (ReusableList.Contains(property.DataType) && ShowReusables)
                {
                    return(MakeCluster(item));
                }
            }
            if (!string.IsNullOrWhiteSpace(item.ExtendsTypeName) && Inheritance)
            {
                outputText.Append("edge [arrowhead = \"empty\" headlabel = \"\" taillabel = \"\"] ");
                outputText.Append(item.Name + "->" + item.ExtendsTypeName + " ");
            }
            outputText.Append(classText.ToString() + "}\"] ");
            return(outputText.ToString());
        }
 public static void ToProtoBuf(UserCmdMessage rc, ReusableList <IUserCmd> list)
 {
     foreach (var item in list.Value)
     {
         UserCmdItem cmd = UserCmdItem.Allocate();
         {
             cmd.RenderTime     = item.RenderTime;
             cmd.FrameInterval  = item.FrameInterval;
             cmd.Buttons        = item.Buttons;
             cmd.MoveHorizontal = item.MoveHorizontal;
             cmd.MoveVertical   = item.MoveVertical;
             cmd.MoveUpDown     = item.MoveUpDown;
             cmd.Seq            = item.Seq;
             cmd.DeltaPitch     = item.DeltaPitch;
             cmd.DeltaYaw       = item.DeltaYaw;
             cmd.SwitchNumber   = item.SwitchNumber;
             cmd.ChangedSeat    = item.ChangedSeat;
             cmd.ChangeChannel  = item.ChangeChannel;
             cmd.SnapshotId     = item.SnapshotId;
             cmd.CurWeapon      = item.CurWeapon;
             cmd.PickUpEquip    = item.PickUpEquip;
             cmd.UseVehicleId   = item.UseEntityId;
             cmd.UseVehicleSeat = item.UseVehicleSeat;
             cmd.UseType        = item.UseType;
             cmd.BagIndex       = item.BagIndex;
         };
         rc.UserCmdList.Add(cmd);
     }
 }
Example #4
0
    public ReusableList <T> GetRange(int index, int count)
    {
        if (index < 0)
        {
            throw new ArgumentException();
        }

        if (count < 0)
        {
            throw new ArgumentException();
        }

        if (_size - index < count)
        {
            throw new ArgumentException();
        }
        Contract.Ensures(Contract.Result <ReusableList <T> >() != null);
        Contract.EndContractBlock();

        ReusableList <T> list = new ReusableList <T>(count);

        Array.Copy(_items, index, list._items, 0, count);
        list._size = count;
        return(list);
    }
Example #5
0
 internal Enumerator(ReusableList <T> list)
 {
     this.list = list;
     index     = 0;
     version   = list._version;
     current   = default(T);
 }
Example #6
0
        public void List()
        {
            ReusableList <int> integers = new ReusableList <int>();
            List <int>         list     = integers.CleanList;

            Assert.AreEqual(0, list.Count);
        }
Example #7
0
        public object Deserialize(Stream inStream)
        {
            ReusableList <UpdateLatestPacakge> list = ReusableList <UpdateLatestPacakge> .Allocate();

            BinaryReader binaryReader = new BinaryReader(inStream);
            int          count        = binaryReader.ReadByte();

            for (int i = 0; i < count; i++)
            {
                UpdateLatestPacakge pacakge = UpdateLatestPacakge.Allocate();

                pacakge.Head.Deserialize(binaryReader);
                var seq        = pacakge.Head.UserCmdSeq;
                var bodyLenght = pacakge.Head.BodyLength;
                if (MessagePool.GetPackageBySeq(seq) == null)
                {
                    var baseSeq = pacakge.Head.BaseUserCmdSeq;
                    var old     = MessagePool.GetPackageBySeq(baseSeq);
                    if (old != null)
                    {
                        pacakge.CopyUpdateComponentsFrom(old.UpdateComponents);
                    }



                    for (int c = 0; c < pacakge.Head.ComponentCount; c++)
                    {
                        var opType = (ComponentReplicateOperationType)binaryReader.ReadByte();

                        var patch = CreateEmptyComponentPatch(opType);
                        patch.DeSerialize(binaryReader, _componentSerializerManager);
                        ApplyPatchTo(patch, pacakge.UpdateComponents);

                        patch.ReleaseReference();
                    }

                    if (pacakge.Head.ComponentCount == pacakge.UpdateComponents.Count)
                    {
                        MessagePool.AddMessage(pacakge);
                        pacakge.AcquireReference();
                        list.Value.Add(pacakge);
                    }
                    else
                    {
                        _logger.WarnFormat("Skip package {0} with length {1} baseSeq;{2}", pacakge.Head.UserCmdSeq, pacakge.Head.BodyLength, pacakge.Head.BaseUserCmdSeq);
                    }
                }
                else
                {
                    _logger.DebugFormat("Skip package {0} with length {1}", pacakge.Head.UserCmdSeq, pacakge.Head.BodyLength);
                    binaryReader.BaseStream.Seek(bodyLenght, SeekOrigin.Current);
                }


                pacakge.ReleaseReference();
            }

            return(list);
        }
Example #8
0
        public static void ToProtoBuf(VehicleCmdMessage msg, ReusableList <IVehicleCmd> list)
        {
            foreach (var cmd in list.Value)
            {
                var item = VehicleCmdItem.Allocate();

                item.Seq            = cmd.Seq;
                item.PlayerId       = cmd.PlayerId;
                item.VehicleId      = cmd.VehicleId;
                item.MoveHorizontal = cmd.MoveHorizontal;
                item.MoveVertical   = cmd.MoveVertical;
                item.IsSpeedup      = cmd.IsSpeedup;
                item.IsHandbrake    = cmd.IsHandbrake;
                item.ExecuteTime    = cmd.ExecuteTime;
                item.CmdSeq         = cmd.CmdSeq;
                item.IsHornOn       = cmd.IsHornOn;
                item.IsStunt        = cmd.IsStunt;
                item.IsLeftShift    = cmd.IsLeftShift;
                item.IsRightShift   = cmd.IsRightShift;

                var vehicleCmd = (VehicleCmd)cmd;
                item.Body                 = VehicleBodyItem.Allocate();
                item.Body.Position        = Vector3Converter.UnityToProtobufVector3(vehicleCmd.Body.Position.WorldVector3());
                item.Body.Rotation        = Vector3Converter.UnityToProtobufQuaternion(vehicleCmd.Body.Rotation);
                item.Body.LinearVelocity  = Vector3Converter.UnityToProtobufVector3(vehicleCmd.Body.LinearVelocity);
                item.Body.AngularVelocity = Vector3Converter.UnityToProtobufVector3(vehicleCmd.Body.AngularVelocity);
                item.Body.Crashed         = vehicleCmd.Body.Crashed;
                item.Body.IsSleeping      = vehicleCmd.Body.IsSleeping;

                if (vehicleCmd.VehicleType == (int)EVehicleType.Car)
                {
                    for (int i = 0; i < vehicleCmd.SteerableCount; ++i)
                    {
                        var steerableItem = CarSteerableItem.Allocate();
                        var steerable     = vehicleCmd.Steerables[i].Car;
                        steerableItem.Position = Vector3Converter.UnityToProtobufVector3(steerable.Position);
                        steerableItem.Rotation = Vector3Converter.UnityToProtobufQuaternion(steerable.Rotation);
                        steerableItem.Angle    = steerable.Angle;
                        item.CarSteerables.Add(steerableItem);
                    }
                }
                else
                {
                    for (int i = 0; i < vehicleCmd.SteerableCount; ++i)
                    {
                        var steerableItem = ShipSteerableItem.Allocate();
                        var steerable     = vehicleCmd.Steerables[i].Ship;

                        steerableItem.Angle = steerable.Angle;
                        item.ShipSteerables.Add(steerableItem);
                    }
                }



                msg.VehicleCmdList.Add(item);
            }
        }
        public void Serialize(Stream outStream, object message)
        {
            ReusableList <IUserCmd> list = (ReusableList <IUserCmd>)message;
            UserCmdMessage          msg  = UserCmdMessage.Allocate();

            UserCmdMessageConverter.ToProtoBuf(msg, list);
            _serialize.Serialize(outStream, msg);
            msg.ReleaseReference();
        }
Example #10
0
        public void MakeGraphSingle(CogsModel model, string header)
        {
            int previousOutput = 0;

            foreach (var item in model.ItemTypes.Concat(model.ReusableDataTypes))
            {
                if (previousOutput > item.Name.Length)
                {
                    Console.Write("\rCreating Graph for " + item.Name + string.Join("", Enumerable.Repeat(" ", previousOutput - item.Name.Length)));
                }
                else
                {
                    Console.Write("\rCreating Graph for " + item.Name);
                }
                previousOutput = item.Name.Length;
                StringBuilder arrows    = new StringBuilder();
                bool          isCluster = false;
                if (ShowReusables && item.Properties.Where(x => ReusableList.Contains(x.DataType)).ToList().Count > 0)
                {
                    isCluster = true;
                }
                foreach (var clss in model.ItemTypes.Concat(model.ReusableDataTypes))
                {
                    if (Inheritance && clss.ExtendsTypeName.Equals(item.Name))
                    {
                        if (isCluster)
                        {
                            arrows.Append($"{clss.Name} -> {item.Name}Properties [arrowhead=\"empty\" lhead = cluster{item.Name}] ");
                        }
                        else
                        {
                            arrows.Append($"{clss.Name} -> {item.Name} [ arrowhead=\"empty\"] ");
                        }
                    }
                    foreach (var property in clss.Properties)
                    {
                        if (property.DataTypeName.Equals(item.Name))
                        {
                            if (isCluster && clss.Name.Equals(item.Name))
                            {
                                arrows.Append($"{clss.Name}Properties -> {item.Name}Properties [ arrowhead=\"none\" label = {property.Name}] ");
                            }
                            else if (isCluster)
                            {
                                arrows.Append($"{clss.Name} -> {item.Name}Properties [ arrowhead=\"none\" label= {property.Name} lhead = cluster{item.Name}] ");
                            }
                            else
                            {
                                arrows.Append($"{clss.Name} -> {item.Name}[ arrowhead=\"none\" label={property.Name}] ");
                            }
                        }
                    }
                }
                GenerateOutput(item.Name, header + " " + MakeItem(item) + arrows + " }");
            }
        }
Example #11
0
        public override void DoHandle(INetworkChannel channel, PlayerEntity entity,
                                      EClient2ServerMessage eClient2ServerMessage, ReusableList <UpdateLatestPacakge> messageBody)
        {
            var messageAck = UpdateMessageAck.Allocate();

            messageAck.AckSeq = channel.Serializer.MessageTypeInfo.LatestUpdateMessageSeq;
            _logger.DebugFormat("UserUpdateAckMsgHandler:{0}", messageAck.AckSeq);
            channel.SendRealTime((int)EServer2ClientMessage.UpdateAck, messageAck);
            messageAck.ReleaseReference();
        }
Example #12
0
        public int Serialize(Stream outStream, object message)
        {
            ReusableList <IVehicleCmd> list = (ReusableList <IVehicleCmd>)message;
            VehicleCmdMessage          msg  = VehicleCmdMessage.Allocate();

            VehicleCmdMessageConverter.ToProtoBuf(msg, list);
            var ret = _serialize.Serialize(outStream, msg);

            msg.ReleaseReference();
            return(ret);
        }
Example #13
0
        public bool MoveNext()
        {
            ReusableList <T> localList = list;

            if (version == localList._version && ((uint)index < (uint)localList._size))
            {
                current = localList._items[index];
                index++;
                return(true);
            }
            return(MoveNextRare());
        }
Example #14
0
        public override void DoHandle(INetworkChannel channel, PlayerEntity entity,
                                      EClient2ServerMessage eClient2ServerMessage, ReusableList <UpdateLatestPacakge> messageBody)
        {
            var pool = entity.updateMessagePool.UpdateMessagePool;

            foreach (var updateLatestPacakge in messageBody.Value)
            {
                pool.AddMessage(updateLatestPacakge);
                updateLatestPacakge.ReleaseReference();
                _logger.DebugFormat("DoHandle:{0}", updateLatestPacakge.Head.UserCmdSeq);
                entity.network.NetworkChannel.Serializer.MessageTypeInfo.SetReplicationAckId(updateLatestPacakge.Head.LastSnapshotId);
            }
        }
Example #15
0
        public override void DoHandle(INetworkChannel channel, PlayerEntity entity,
                                      EClient2ServerMessage eClient2ServerMessage, ReusableList <IVehicleCmd> messageBody)
        {
            //_logger.DebugFormat("Server VehicleCmd seq is {0}", messageBody.Seq);
            var vehicle = PlayerVehicleUtility.GetControlledVehicle(entity, _contexts.vehicle);
            var cmdList = messageBody.Value;

            if (vehicle != null)
            {
                vehicle.vehicleCmd.AddLatestList(cmdList);
            }

            CheckVehicleCmdList(cmdList);
        }
Example #16
0
        // a list of latest 'SendCount' item, from newest to oldest
        public ReusableList <TCmd> CreateLatestList()
        {
            var rc = ReusableList <TCmd> .Allocate();

            int count = 0;

            foreach (var cmd in _userCmdList)
            {
                rc.Value.Add(cmd);
                count++;
                if (count >= SendCount)
                {
                    break;
                }
            }
            return(rc);
        }
Example #17
0
        //Author : Benjamin Lemelin, John Smith, Mary Smith
        public Region(Vector2 topLeft, Vector2 bottomRight)
        {
            if (topLeft.x > bottomRight.x || topLeft.y < bottomRight.y)
            {
                throw new ArgumentException("Unable to create region : top left limit is below or to the right of the bottom right limit.");
            }

            nodeCount  = 0;
            nodes      = new Node[MAX_NODE_COUNT];
            subregions = new Region[NB_SUB_REGIONS];

            this.topLeft     = topLeft;
            this.bottomRight = bottomRight;
            size             = new Vector2(bottomRight.x - topLeft.x, topLeft.y - bottomRight.y);
            center           = new Vector2(bottomRight.x - size.x / 2, topLeft.y - size.y / 2);

            reusableNodeList = new ReusableList <Node>();
        }
Example #18
0
    public ReusableList <T> FindAll(Predicate <T> match)
    {
        if (match == null)
        {
            throw new ArgumentException();
        }
        Contract.EndContractBlock();

        ReusableList <T> list = new ReusableList <T>();

        for (int i = 0; i < _size; i++)
        {
            if (match(_items[i]))
            {
                list.Add(_items[i]);
            }
        }
        return(list);
    }
Example #19
0
    public ReusableList <TOutput> ConvertAll <TOutput>(Converter <T, TOutput> converter)
    {
        if (converter == null)
        {
            throw new ArgumentException();
        }
        // @


        Contract.EndContractBlock();

        ReusableList <TOutput> list = new ReusableList <TOutput>(_size);

        for (int i = 0; i < _size; i++)
        {
            list._items[i] = converter(_items[i]);
        }
        list._size = _size;
        return(list);
    }
 public AttributeModifierList(Action onChanged, int capacity = 10)
 {
     Modifiers         = new List <T>(capacity);
     reusableModifiers = new ReusableList <T>(4);
     this.onChanged    = onChanged;
 }
        protected override void InternalExecute()
        {
            while (true)
            {
                var item = _contexts.session.clientSessionObjects.Replay.GetItem(EReplayMessageType.OUT, MyGameTime.stage,
                                                                                 MyGameTime.seq,
                                                                                 _contexts.session.clientSessionObjects.NetworkChannel.Id);
                if (item == null)
                {
                    return;
                }

                if (item.MessageBody is ReusableList <UpdateLatestPacakge> && item.ProcessSeq == MyGameTime.seq)
                {
                    var last = _contexts.player.flagSelfEntity.userCmd.Latest as UserCmd;
                    ReusableList <UpdateLatestPacakge> reusableList =
                        item.MessageBody as ReusableList <UpdateLatestPacakge>;
                    var current = reusableList.Value.Last();
                    foreach (var updateComponent in current.UpdateComponents)
                    {
                        if (updateComponent is SendUserCmdComponent)
                        {
                            var right = updateComponent as SendUserCmdComponent;
                            _logger.DebugFormat("replay usercmd: last:{0}, timeseq:{1}, msgSeq:{2} {3}", last.Seq, MyGameTime.seq, current.Head.LastUserCmdSeq, item);
                            //last.Seq = current.Head.UserCmdSeq;
                            //last.SnapshotId = current.Head.LastSnapshotId;
                            _contexts.session.clientSessionObjects.TimeManager.RenderTime = right.RenderTime;
                            last.FrameInterval  = right.FrameInterval;
                            last.MoveHorizontal = right.MoveHorizontal;
                            last.MoveUpDown     = right.MoveUpDown;
                            last.MoveVertical   = right.MoveVertical;
                            last.DeltaYaw       = right.DeltaYaw;
                            last.DeltaPitch     = right.DeltaPitch;
                            last.RenderTime     = right.RenderTime;
                            last.ClientTime     = right.ClientTime;
                            last.ChangedSeat    = right.ChangedSeat;

                            last.BeState      = right.BeState;
                            last.Buttons      = right.Buttons;
                            last.SwitchNumber = right.SwitchNumber;

                            last.CurWeapon         = right.CurWeapon;
                            last.UseEntityId       = right.UseEntityId;
                            last.ManualPickUpEquip = right.ManualPickUpEquip;

                            last.AutoPickUpEquip = UserCmd.CopyList(last.AutoPickUpEquip, right.AutoPickUpEquip);
                            last.UseVehicleSeat  = right.UseVehicleSeat;
                            last.UseType         = right.UseType;
                            last.ChangeChannel   = right.ChangeChannel;
                            last.BagIndex        = right.BagIndex;
                        }
                    }
                }

                if (item.MessageBody is ReusableList <IVehicleCmd> && item.ProcessSeq == MyGameTime.seq)
                {
                    var cmd = (item.MessageBody as ReusableList <IVehicleCmd>).Value.Last();
                    var controlledVehicle = PlayerVehicleUtility.GetControlledVehicle(_contexts.player.flagSelfEntity, _contexts.vehicle);
                    if (controlledVehicle != null)
                    {
                        controlledVehicle.vehicleCmd.AddLatest(cmd);
                    }
                }
                if (item.MessageBody is ReusableList <IRefCounter> )
                {
                    foreach (var updateLatestPacakge in (item.MessageBody as ReusableList <UpdateLatestPacakge>).Value)
                    {
                        updateLatestPacakge.ReleaseReference();
                    }
                }
                item.ReleaseReference();
            }
        }
        private void OverlappedIoThreadMainLoop()
        {
            // WaitCommEvent
            bool serialCommPending = false;
            bool serialCommError   = false;

            m_SerialCommEvent.Reset();
            NativeOverlapped serialCommOverlapped = new NativeOverlapped();

#if NETSTANDARD15
            serialCommOverlapped.EventHandle = m_SerialCommEvent.GetSafeWaitHandle().DangerousGetHandle();
#else
            serialCommOverlapped.EventHandle = m_SerialCommEvent.SafeWaitHandle.DangerousGetHandle();
#endif
            // ReadFile
            bool readPending = false;
            m_ReadEvent.Reset();
            NativeOverlapped readOverlapped = new NativeOverlapped();
#if NETSTANDARD15
            readOverlapped.EventHandle = m_ReadEvent.GetSafeWaitHandle().DangerousGetHandle();
#else
            readOverlapped.EventHandle = m_ReadEvent.SafeWaitHandle.DangerousGetHandle();
#endif
            // WriteFile
            bool writePending = false;
            m_WriteEvent.Reset();
            NativeOverlapped writeOverlapped = new NativeOverlapped();
            m_ReadByteAvailable = false;
#if NETSTANDARD15
            writeOverlapped.EventHandle = m_WriteEvent.GetSafeWaitHandle().DangerousGetHandle();
#else
            writeOverlapped.EventHandle = m_WriteEvent.SafeWaitHandle.DangerousGetHandle();
#endif
            // SEt up the types of serial events we want to see.
            UnsafeNativeMethods.SetCommMask(m_ComPortHandle, maskRead);

            bool result;
            NativeMethods.SerialEventMask commEventMask = 0;

            bool running = true;
            uint bytes;
            ReusableList <WaitHandle> handles = new ReusableList <WaitHandle>(2, 7);

            while (running)
            {
                handles.Clear();
                handles.Add(m_StopRunning);
                handles.Add(m_WriteClearEvent);

#if PL2303_WORKAROUNDS
                // - - - - - - - - - - - - - - - - - - - - - - - - -
                // PROLIFIC PL23030 WORKAROUND
                // - - - - - - - - - - - - - - - - - - - - - - - - -
                // If we have a read pending, we don't request events
                // for reading data. To do so will result in errors.
                // Have no idea why.
                if (readPending)
                {
                    UnsafeNativeMethods.SetCommMask(m_ComPortHandle, maskReadPending);
                }
                else
                {
                    UnsafeNativeMethods.SetCommMask(m_ComPortHandle, maskRead);

                    // While the comm event mask was set to ignore read events, data could have been written
                    // to the input queue. Check for that and if there are bytes waiting or EOF was received,
                    // set the appropriate flags.
                    uint bytesInQueue;
                    bool eofReceived;
                    if (GetReceiveStats(out bytesInQueue, out eofReceived) && (bytesInQueue > 0 || eofReceived))
                    {
                        // Tell DoReadEvent that there is data pending
                        m_ReadByteAvailable = true;
                        m_ReadByteEof      |= eofReceived;
                    }
                }
#else
                UnsafeNativeMethods.SetCommMask(m_ComPortHandle, maskRead);
#endif

                // commEventMask is on the stack, and is therefore fixed
                if (!serialCommError)
                {
                    try {
                        if (!serialCommPending)
                        {
                            serialCommPending = DoWaitCommEvent(out commEventMask, ref serialCommOverlapped);
                        }
                        if (serialCommPending)
                        {
                            handles.Add(m_SerialCommEvent);
                        }
                    } catch (IOException) {
                        // Some devices, such as the Arduino Uno with a CH340 on board don't support an overlapped
                        // WaitCommEvent. So if that occurs, we remember it and don't use it again. The Windows error
                        // returned was 87 (ERROR_INVALID_PARAMETER) was returned in that case. GetReceiveStats() did
                        // work, so we can still know of data pending by polling. But we won't get any other events,
                        // such as TX_EMPTY.
                        if (Log.SerialTrace(System.Diagnostics.TraceEventType.Warning))
                        {
                            Log.Serial.TraceEvent(System.Diagnostics.TraceEventType.Warning, 0,
                                                  "{0}: SerialThread: Not processing WaitCommEvent events", m_Name);
                        }
                        serialCommError = true;
                    }
                }

                if (!readPending)
                {
                    if (!m_Buffer.Serial.ReadBufferNotFull.WaitOne(0))
                    {
                        if (Log.SerialTrace(System.Diagnostics.TraceEventType.Verbose))
                        {
                            Log.Serial.TraceEvent(System.Diagnostics.TraceEventType.Verbose, 0, "{0}: SerialThread: Read Buffer Full", m_Name);
                        }
                        handles.Add(m_Buffer.Serial.ReadBufferNotFull);
                    }
                    else
                    {
                        readPending = DoReadEvent(ref readOverlapped);
                    }
                }
                if (readPending)
                {
                    handles.Add(m_ReadEvent);
                }

                if (!writePending)
                {
                    if (!m_Buffer.Serial.WriteBufferNotEmpty.WaitOne(0))
                    {
                        handles.Add(m_Buffer.Serial.WriteBufferNotEmpty);
                    }
                    else
                    {
                        writePending = DoWriteEvent(ref writeOverlapped);
                    }
                }
                if (writePending)
                {
                    handles.Add(m_WriteEvent);
                }

                // We wait up to 100ms, in case we're not actually pending on anything. Normally, we should always be
                // pending on a Comm event. Just in case this is not so (and is a theoretical possibility), we will
                // slip out of this WaitAny() after 100ms and then restart the loop, effectively polling every 100ms in
                // worst case.
                WaitHandle[] whandles = handles.ToArray();
                int          ev       = WaitHandle.WaitAny(whandles, 100);

                if (ev != WaitHandle.WaitTimeout)
                {
                    if (whandles[ev] == m_StopRunning)
                    {
                        if (Log.SerialTrace(System.Diagnostics.TraceEventType.Verbose))
                        {
                            Log.Serial.TraceEvent(System.Diagnostics.TraceEventType.Verbose, 0, "{0}: SerialThread: Thread closing", m_Name);
                        }
                        result = UnsafeNativeMethods.CancelIo(m_ComPortHandle);
                        if (!result)
                        {
                            int win32Error = Marshal.GetLastWin32Error();
                            //int hr = Marshal.GetHRForLastWin32Error();
                            if (Log.SerialTrace(System.Diagnostics.TraceEventType.Warning))
                            {
                                Log.Serial.TraceEvent(System.Diagnostics.TraceEventType.Warning, 0,
                                                      "{0}: SerialThread: CancelIo error {1}", m_Name, win32Error);
                            }
                            Marshal.ThrowExceptionForHR(win32Error);
                        }
                        running = false;
                    }
                    else if (whandles[ev] == m_SerialCommEvent)
                    {
                        result = UnsafeNativeMethods.GetOverlappedResult(m_ComPortHandle, ref serialCommOverlapped, out bytes, true);
                        if (!result)
                        {
                            int win32Error = Marshal.GetLastWin32Error();
                            //int hr = Marshal.GetHRForLastWin32Error();
                            if (Log.SerialTrace(System.Diagnostics.TraceEventType.Error))
                            {
                                Log.Serial.TraceEvent(System.Diagnostics.TraceEventType.Error, 0,
                                                      "{0}: SerialThread: Overlapped WaitCommEvent() error {1}", m_Name, win32Error);
                            }
                            Marshal.ThrowExceptionForHR(win32Error);
                        }
                        ProcessWaitCommEvent(commEventMask);
                        serialCommPending = false;
                    }
                    else if (whandles[ev] == m_ReadEvent)
                    {
                        result = UnsafeNativeMethods.GetOverlappedResult(m_ComPortHandle, ref readOverlapped, out bytes, true);
                        if (!result)
                        {
                            int win32Error = Marshal.GetLastWin32Error();
                            //int hr = Marshal.GetHRForLastWin32Error();
                            // Should never get ERROR_IO_PENDING, as this method is only called when the event is triggered.
                            if (win32Error != WinError.ERROR_OPERATION_ABORTED || bytes > 0)
                            {
                                if (Log.SerialTrace(System.Diagnostics.TraceEventType.Error))
                                {
                                    Log.Serial.TraceEvent(System.Diagnostics.TraceEventType.Error, 0,
                                                          "{0}: SerialThread: Overlapped ReadFile() error {1} bytes {2}", m_Name, win32Error, bytes);
                                }
                                Marshal.ThrowExceptionForHR(win32Error);
                            }
                            else
                            {
                                // ERROR_OPERATION_ABORTED may be caused by CancelIo or PurgeComm
                                if (Log.SerialTrace(System.Diagnostics.TraceEventType.Verbose))
                                {
                                    Log.Serial.TraceEvent(System.Diagnostics.TraceEventType.Verbose, 0,
                                                          "{0}: SerialThread: Overlapped ReadFile() error {1} bytes {2}", m_Name, win32Error, bytes);
                                }
                            }
                        }
                        else
                        {
                            ProcessReadEvent(bytes);
                        }
                        readPending = false;
                    }
                    else if (whandles[ev] == m_Buffer.Serial.ReadBufferNotFull)
                    {
                        // The read buffer is no longer full. We just loop back to the beginning to test if we
                        // should read or not.
                    }
                    else if (whandles[ev] == m_WriteEvent)
                    {
                        result = UnsafeNativeMethods.GetOverlappedResult(m_ComPortHandle, ref writeOverlapped, out bytes, true);
                        if (!result)
                        {
                            int win32Error = Marshal.GetLastWin32Error();
                            //int hr = Marshal.GetHRForLastWin32Error();
                            // Should never get ERROR_IO_PENDING, as this method is only called when the event is triggered.
                            if (win32Error != WinError.ERROR_OPERATION_ABORTED || bytes > 0)
                            {
                                if (Log.SerialTrace(System.Diagnostics.TraceEventType.Error))
                                {
                                    Log.Serial.TraceEvent(System.Diagnostics.TraceEventType.Error, 0,
                                                          "{0}: SerialThread: Overlapped WriteFile() error {1} bytes {2}", m_Name, win32Error, bytes);
                                }
                                Marshal.ThrowExceptionForHR(win32Error);
                            }
                            else
                            {
                                // ERROR_OPERATION_ABORTED may be caused by CancelIo or PurgeComm
                                if (Log.SerialTrace(System.Diagnostics.TraceEventType.Verbose))
                                {
                                    Log.Serial.TraceEvent(System.Diagnostics.TraceEventType.Verbose, 0,
                                                          "{0}: SerialThread: Overlapped WriteFile() error {1} bytes {2}", m_Name, win32Error, bytes);
                                }
                            }
                        }
                        else
                        {
                            ProcessWriteEvent(bytes);
                        }
                        writePending = false;
                    }
                    else if (whandles[ev] == m_Buffer.Serial.WriteBufferNotEmpty)
                    {
                        // The write buffer is no longer empty. We just loop back to the beginning to test if we
                        // should write or not.
                    }
                    else if (whandles[ev] == m_WriteClearEvent)
                    {
                        if (writePending)
                        {
                            if (Log.SerialTrace(System.Diagnostics.TraceEventType.Verbose))
                            {
                                Log.Serial.TraceEvent(System.Diagnostics.TraceEventType.Verbose, 0, "{0}: SerialThread: PurgeComm() write pending", m_Name);
                            }
                            m_PurgePending = true;
                            result         = UnsafeNativeMethods.PurgeComm(m_ComPortHandle,
                                                                           NativeMethods.PurgeFlags.PURGE_TXABORT | NativeMethods.PurgeFlags.PURGE_TXCLEAR);
                            if (!result)
                            {
                                int win32Error = Marshal.GetLastWin32Error();
                                //int hr = Marshal.GetHRForLastWin32Error();
                                if (win32Error != WinError.ERROR_OPERATION_ABORTED)
                                {
                                    if (Log.SerialTrace(System.Diagnostics.TraceEventType.Error))
                                    {
                                        Log.Serial.TraceEvent(System.Diagnostics.TraceEventType.Error, 0,
                                                              "{0}: SerialThread: PurgeComm() error {1}", m_Name, win32Error);
                                    }
                                    Marshal.ThrowExceptionForHR(win32Error);
                                }
                                else
                                {
                                    if (Log.SerialTrace(System.Diagnostics.TraceEventType.Verbose))
                                    {
                                        Log.Serial.TraceEvent(System.Diagnostics.TraceEventType.Verbose, 0,
                                                              "{0}: SerialThread: PurgeComm() error {1}", m_Name, win32Error);
                                    }
                                }
                            }
                        }
                        else
                        {
                            lock (m_Buffer.WriteLock) {
                                if (Log.SerialTrace(System.Diagnostics.TraceEventType.Verbose))
                                {
                                    Log.Serial.TraceEvent(System.Diagnostics.TraceEventType.Verbose, 0, "{0}: SerialThread: Purged", m_Name);
                                }
                                m_Buffer.Serial.Purge();
                                m_WriteClearDoneEvent.Set();
                            }
                        }
                    }
                }

#if STRESSTEST
                SerialTrace.TraceSer.TraceEvent(System.Diagnostics.TraceEventType.Verbose, 0, "{0}: STRESSTEST SerialThread: Stress Test Delay of 1000ms", m_Name);
                System.Threading.Thread.Sleep(1000);
                NativeMethods.ComStatErrors commStateErrors = new NativeMethods.ComStatErrors();
                NativeMethods.COMSTAT       commStat        = new NativeMethods.COMSTAT();
                result = UnsafeNativeMethods.ClearCommError(m_ComPortHandle, out commStateErrors, out commStat);
                if (result)
                {
                    SerialTrace.TraceSer.TraceEvent(System.Diagnostics.TraceEventType.Information, 0,
                                                    "{0}: STRESSTEST SerialThread: ClearCommError errors={1}", m_Name, commStateErrors);
                    SerialTrace.TraceSer.TraceEvent(System.Diagnostics.TraceEventType.Information, 0,
                                                    "{0}: STRESSTEST SerialThread: ClearCommError stats flags={1}, InQueue={2}, OutQueue={3}", m_Name, commStat.Flags, commStat.cbInQue, commStat.cbOutQue);
                }
                else
                {
                    SerialTrace.TraceSer.TraceEvent(System.Diagnostics.TraceEventType.Warning, 0,
                                                    "{0}: STRESSTEST SerialThread: ClearCommError error: {1}", m_Name, Marshal.GetLastWin32Error());
                }
#endif
            }
        }
Example #23
0
        private bool ExecuteGuarded(IList <string> tokens, string commandLine = null)
        {
            ResetOptions();

            Iterator <string> iter = new Iterator <string>(tokens);

            iter.Next(); // first token is a command name

            if (this.IsManualMode)
            {
                PrintPrompt(commandLine);
            }

            if (this.IsPlayModeOnly && !Runtime.IsPlaying)
            {
                PrintError("Command is available in the play mode only");
                return(false);
            }

            ReusableList <string> argsList = ReusableLists.NextAutoRecycleList <string>();

            while (iter.HasNext())
            {
                string token = StringUtils.UnArg(iter.Next());

                // first, try to parse options
                if (!TryParseOption(iter, token))
                {
                    // consume the rest of the args
                    argsList.Add(token);
                    while (iter.HasNext())
                    {
                        token = StringUtils.UnArg(iter.Next());
                        argsList.Add(token);
                    }

                    break;
                }
            }

            if (m_values != null)
            {
                if (argsList.Count != 1)
                {
                    PrintError("Unexpected arguments count {0}", argsList.Count);
                    PrintUsage();
                    return(false);
                }

                string arg = argsList[0];
                if (Array.IndexOf(m_values, arg) == -1)
                {
                    PrintError("Unexpected argument '{0}'", arg);
                    PrintUsage();
                    return(false);
                }
            }

            if (m_options != null)
            {
                for (int i = 0; i < m_options.Count; ++i)
                {
                    Option opt = m_options[i];
                    if (opt.IsRequired && !opt.IsHandled)
                    {
                        PrintError("Missing required option --{0}{1}", opt.Name, opt.ShortName != null ? "(-" + opt.ShortName + ")" : "");
                        PrintUsage();
                        return(false);
                    }
                }
            }

            string[]   args          = argsList.Count > 0 ? argsList.ToArray() : EMPTY_COMMAND_ARGS;
            MethodInfo executeMethod = resolveExecuteMethod(args);

            if (executeMethod == null)
            {
                PrintError("Wrong arguments");
                PrintUsage();
                return(false);
            }

            return(CCommandUtils.Invoke(this, executeMethod, args));
        }
Example #24
0
        public static StackTraceLine[] ParseStackTrace(string stackTrace)
        {
            if (stackTrace != null)
            {
                ReusableList <StackTraceLine> list = ReusableLists.NextList <StackTraceLine>();

                int lineStart = 0;
                int lineEnd;

                while (lineStart < stackTrace.Length)
                {
                    // extract next line
                    lineEnd = StringUtils.EndOfLineIndex(stackTrace, lineStart);
                    string line = stackTrace.Substring(lineStart, lineEnd - lineStart);
                    lineStart = lineEnd + 1;

                    // extract data
                    Match m;
                    if ((m = PatternUnityStackTrace.Match(line)).Success)
                    {
                        GroupCollection groups        = m.Groups;
                        string          sourcePath    = groups[2].Value;
                        string          lineNumberStr = groups[3].Value;
                        int             lineNumber    = StringUtils.ParseInt(lineNumberStr, -1);

                        list.Add(new StackTraceLine(line, string.IsNullOrEmpty(sourcePath) ? null : sourcePath, lineNumber, lineNumberStr.Length));
                    }
                    else if ((m = PatternSystemStackTrace.Match(line)).Success)
                    {
                        GroupCollection groups = m.Groups;

                        string method        = groups[1].Value;
                        string args          = OptimizeArgs(groups[2].Value);
                        string path          = OptimizePath(groups[4].Value);
                        string lineNumberStr = groups[5].Value;
                        int    lineNumber    = StringUtils.ParseInt(lineNumberStr, -1);

                        if (!string.IsNullOrEmpty(path) && lineNumber != -1)
                        {
                            line = StringUtils.TryFormat("{0}({1}) (at {2}:{3})", method, args, path, lineNumberStr);
                        }
                        else
                        {
                            line = StringUtils.TryFormat("{0}({1})", method, args);
                        }

                        list.Add(new StackTraceLine(line, path, lineNumber, lineNumberStr.Length));
                    }
                    else
                    {
                        list.Add(new StackTraceLine(line));
                    }
                }

                StackTraceLine[] lines = list.ToArray();
                list.Recycle();
                return(lines);
            }

            return(StackTraceLine.kEmptyLinesArray);
        }
        public override void DoHandle(INetworkChannel channel, PlayerEntity entity, EClient2ServerMessage eClient2ServerMessage, ReusableList <IUserCmd> messageBody)
        {
            var cmdList = messageBody.Value;

            entity.userCmd.AddLatestList(cmdList);

            entity.network.NetworkChannel.Serializer.MessageTypeInfo.SetReplicationAckId(entity.userCmd.Latest.SnapshotId);

            var lastCmd  = cmdList[cmdList.Count - 1];
            var firstCmd = cmdList[0];

#pragma warning disable RefCounter002 // possible reference counter error
            var cmd = firstCmd.Seq > lastCmd.Seq ? firstCmd : lastCmd;
#pragma warning restore RefCounter002 // possible reference counter error
            if (_logger.IsDebugEnabled)
            {
                _logger.DebugFormat("received usercmd message, seq {0}, ack snapshot {1}", cmd.Seq, cmd.SnapshotId);
            }

            CheckVehicleCmdList(cmdList);
        }
Example #26
0
        public static ReusableList <IVehicleCmd> FromProtoBuf(VehicleCmdMessage message)
        {
            ReusableList <IVehicleCmd> list = ReusableList <IVehicleCmd> .Allocate();

            var count = message.VehicleCmdList.Count;

            for (int i = 0; i < count; ++i)
            {
                var item = message.VehicleCmdList[i];

                var cmd = VehicleCmd.Allocate();
                {
                    cmd.Seq            = item.Seq;
                    cmd.PlayerId       = item.PlayerId;
                    cmd.VehicleId      = item.VehicleId;
                    cmd.MoveHorizontal = item.MoveHorizontal;
                    cmd.MoveVertical   = item.MoveVertical;
                    cmd.IsSpeedup      = item.IsSpeedup;
                    cmd.IsHandbrake    = item.IsHandbrake;
                    cmd.IsHornOn       = item.IsHornOn;
                    cmd.IsStunt        = item.IsStunt;
                    cmd.IsLeftShift    = item.IsLeftShift;
                    cmd.IsRightShift   = item.IsRightShift;

                    cmd.ExecuteTime = item.ExecuteTime;

                    cmd.CmdSeq = item.CmdSeq;

                    cmd.Body.Position = Vector3Converter.ProtobufToUnityVector3(item.Body.Position).ShiftedToFixedVector3();
                    cmd.Body.Rotation = Vector3Converter.ProtobufToUnityQuaternion(item.Body.Rotation);
//                    cmd.Body.Body2WorldPosition = Vector3Converter.ProtobufToUnityVector3(item.Body.Body2WorldPosition);
//                    cmd.Body.Body2WorldRotation = Vector3Converter.ProtobufToUnityQuaternion(item.Body.Body2WorldRotation);
                    cmd.Body.LinearVelocity  = Vector3Converter.ProtobufToUnityVector3(item.Body.LinearVelocity);
                    cmd.Body.AngularVelocity = Vector3Converter.ProtobufToUnityVector3(item.Body.AngularVelocity);
                    //                   cmd.Body.ContactCount = item.Body.ContactCount;
                    cmd.Body.Crashed    = item.Body.Crashed;
                    cmd.Body.IsSleeping = item.Body.IsSleeping;

                    var carSteerableCount = item.CarSteerables.Count;
                    for (int j = 0; j < carSteerableCount; ++j)
                    {
                        var steerable     = cmd.Steerables[j].Car;
                        var steerableItem = item.CarSteerables[j];
                        steerable.Position = Vector3Converter.ProtobufToUnityVector3(steerableItem.Position);
                        steerable.Rotation = Vector3Converter.ProtobufToUnityQuaternion(steerableItem.Rotation);
                        steerable.Angle    = steerableItem.Angle;
//                        steerable.Grounded = steerableItem.Grounded;
//                        steerable.GroundedOnTerrain = steerableItem.GroundedOnTerrain;

//                        steerable.ColliderSteerAngle = steerableItem.ColliderSteerAngle;
//                        steerable.SteerAngle = steerableItem.SteerAngle;
//                        steerable.MotorTorque = steerableItem.MotorTorque;
//
//                        steerable.SuspensionDistance = steerableItem.SuspensionDistance;
//                        steerable.SuspensionSpring = steerableItem.SuspensionSpring;
//                        steerable.SuspensionTargetPosition = steerableItem.SuspensionTargetPosition;
//
//                        steerable.SprungMass = steerableItem.SprungMass;
//                        steerable.ForceDistance = steerableItem.ForceDistance;
//
//                        steerable.AngularVelocity = steerableItem.AngularVelocity;
//                        steerable.AngularPosition = steerableItem.AngularPosition;
//                        steerable.RotationAngle = steerableItem.RotationAngle;
//
//                        steerable.RotationSpeed = steerableItem.RotationSpeed;
//                        steerable.CorrectedRotationSpeed = steerableItem.CorrectedRotationSpeed;
//                        steerable.Jounce = steerableItem.Jounce;
//
//                        steerable.TireLowSideSpeedTimers = steerableItem.TireLowSideSpeedTimers;
//                        steerable.TireLowforwardSpeedTimers = steerableItem.TireLowforwardSpeedTimers;
//
//                        steerable.Grounded = steerableItem.Grounded;
//                        steerable.Point = Vector3Converter.ProtobufToUnityVector3(steerableItem.Point);
//                        steerable.Normal = Vector3Converter.ProtobufToUnityVector3(steerableItem.Normal);
//                        steerable.ForwardDir = Vector3Converter.ProtobufToUnityVector3(steerableItem.ForwardDir);
//                        steerable.SidewaysDir = Vector3Converter.ProtobufToUnityVector3(steerableItem.SidewaysDir);
//                        steerable.Force = steerableItem.Force;
//
//                        steerable.ForwardSlip = steerableItem.ForwardSlip;
//                        steerable.SidewaysSlip = steerableItem.SidewaysSlip;

                        cmd.Steerables[j].Car = steerable;
                    }

                    var shipSteerableCount = item.ShipSteerables.Count;
                    for (int j = 0; j < shipSteerableCount; ++j)
                    {
                        var steerable     = cmd.Steerables[j].Ship;
                        var steerableItem = item.ShipSteerables[j];

                        steerable.Angle = steerableItem.Angle;
//                        steerableItem.Rpm = steerableItem.Rpm;
//                        steerableItem.SpinVelocity = steerableItem.SpinVelocity;
//                        steerableItem.Submerged = steerableItem.Submerged;

                        cmd.Steerables[j].Ship = steerable;
                    }

                    if (carSteerableCount > shipSteerableCount)
                    {
                        cmd.VehicleType    = (int)EVehicleType.Car;
                        cmd.SteerableCount = carSteerableCount;
                    }
                    else
                    {
                        cmd.VehicleType    = (int)EVehicleType.Ship;
                        cmd.SteerableCount = shipSteerableCount;
                    }
                };

                list.Value.Add(cmd);
            }


            return(list);
        }
Example #27
0
 internal SynchronizedList(ReusableList <T> list)
 {
     _list = list;
     _root = ((System.Collections.ICollection)list).SyncRoot;
 }
Example #28
0
        private string MakeCluster(DataType item)
        {
            StringBuilder output     = new StringBuilder();
            StringBuilder outerClass = new StringBuilder($"subgraph cluster{item.Name} {{ style = \"filled\" " +
                                                         $"fillcolor = \"#4abdac\" label = \"{item.Name}\" ");
            List <DataType> reusablesPresent = new List <DataType>();

            outerClass.Append(item.Name + "Properties [ shape = \"record\" label=\"{Properties |");
            foreach (var property in item.Properties)
            {
                outerClass.Append(property.Name + " : " + property.DataTypeName);
                if (!string.IsNullOrWhiteSpace(property.MinCardinality) && !string.IsNullOrWhiteSpace(property.MaxCardinality))
                {
                    outerClass.Append("[" + property.MinCardinality + "..." + property.MaxCardinality + "] ");
                }
                outerClass.Append("\\l");
                if (ClassList.Contains(property.DataType))
                {
                    output.Append("edge[ arrowhead = \"none\" headlabel = \"0...*\" taillabel = \"0...*\"] ");
                    output.Append(item.Name + "Properties -> " + property.DataTypeName + "[ arrowhead = \"none\" label = \"" + property.Name + "\"] ");
                }
                else if (ReusableList.Contains(property.DataType))
                {
                    // add reusableTypes within that type to reusable list as well
                    Stack <DataType> stack = new Stack <DataType>();
                    if (!property.DataTypeName.Equals(item.Name) && !reusablesPresent.Contains(property.DataType))
                    {
                        stack.Push(property.DataType);
                        reusablesPresent.Add(property.DataType);
                        while (stack.Count > 0)
                        {
                            var type = stack.Pop();
                            foreach (var prop in type.Properties)
                            {
                                // checks: item is a reusable type, item is not already seen, item isn't current item, item isn't primitive
                                if (ReusableList.Contains(prop.DataType) && !reusablesPresent.Contains(type) &&
                                    !type.Name.Equals(prop.DataTypeName) && !prop.DataTypeName.Equals(item.Name))
                                {
                                    stack.Push(prop.DataType);
                                    reusablesPresent.Add(prop.DataType);
                                }
                            }
                        }
                        output.Append(item.Name + "Properties -> " + item.Name + property.DataTypeName + "[ arrowhead = \"none\" label = \"" + property.Name + "\"] ");
                    }
                }
            }
            if (Inheritance && !string.IsNullOrWhiteSpace(item.ExtendsTypeName))
            {
                output.Append("edge [arrowhead = \"empty\"] ");
                output.Append(item.Name + "Properties ->" + item.ExtendsTypeName + "[ltail=cluster" + item.Name + "] ");
            }
            outerClass.Append("}\"] ");
            foreach (var reused in reusablesPresent)
            {
                outerClass.Append(item.Name + reused.Name + " [ shape = \"record\" fillcolor = \"#fc4a1a\" label=\"{ " + reused.Name + " | ");
                foreach (var property in reused.Properties)
                {
                    outerClass.Append(property.Name + " : " + property.DataTypeName);
                    if (!string.IsNullOrWhiteSpace(property.MinCardinality) && !string.IsNullOrWhiteSpace(property.MaxCardinality))
                    {
                        outerClass.Append("[" + property.MinCardinality + "..." + property.MaxCardinality + "] ");
                    }
                    outerClass.Append("\\l");
                    if (ClassList.Contains(property.DataType) && !property.IsPrimitive)
                    {
                        output.Append("edge[ arrowhead = \"none\" headlabel = \"0...*\" taillabel = \"0...*\"] ");
                        output.Append(item.Name + reused.Name + " -> " + property.DataTypeName + "[ label = \"" + property.Name + "\"] ");
                    }
                    else if (reusablesPresent.Contains(property.DataType))
                    {
                        output.Append(item.Name + reused.Name + " -> " + item.Name + property.DataTypeName + "[ arrowhead = \"none\" label = \"" + property.Name + "\"] ");
                    }
                }
                if (Inheritance && !string.IsNullOrWhiteSpace(reused.ExtendsTypeName))
                {
                    output.Append("edge [arrowhead = \"empty\"] ");
                    output.Append(item.Name + reused.Name + "->" + reused.ExtendsTypeName + " ");
                }
                outerClass.Append("}\"] ");
            }
            outerClass.Append("}");
            output.Append(outerClass);
            return(output.ToString());
        }
Example #29
0
 internal static IList <T> Synchronized(ReusableList <T> list)
 {
     return(new SynchronizedList(list));
 }