예제 #1
0
        public new Client OnAttached()
        {
            Incoming.InitializeMapLoad(this);

            AddServerHandler(0x04, Incoming.ClientLocationUpdated);
            AddServerHandler(0x07, Incoming.EntitiesAdded);
            AddServerHandler(0x0A, Incoming.Barmessage);
            AddServerHandler(0x0B, Incoming.ClientPlayerWalked);
            AddServerHandler(0x0C, Incoming.ObjectWalked);
            AddServerHandler(0x0D, Incoming.ChatMessages);
            AddServerHandler(0x0E, Incoming.ObjectRemoved);
            AddServerHandler(0x11, Incoming.EntitiesChangedDirection);
            AddServerHandler(0x15, Incoming.MapLoaded);
            AddServerHandler(0x19, Incoming.PlaySound);
            AddServerHandler(0x1A, Incoming.PlayerAction);
            AddServerHandler(0x29, Incoming.Animation);
            AddServerHandler(0x33, Incoming.AislingsAdded);
            AddServerHandler(0x3A, Incoming.Sidebar);
            AddServerHandler(0x39, Incoming.ProfileRequested);
            AddServerHandler(0x05, Incoming.PlayerSerialAssigned);
            AddServerHandler(0x06, Incoming.LoadingMap);
            AddServerHandler(0x37, Incoming.EquipmentUpdated);

            AddClientHandler(0x03, Outgoing.LoggingIn);
            AddClientHandler(0x0B, Outgoing.LoggingOut);
            AddClientHandler(0x1C, Outgoing.UseInventorySlot);
            AddClientHandler(0x0F, Outgoing.SpellCasted);
            AddClientHandler(0x0D, Outgoing.SpellBegin);

            PreparePrelims();

            base.OnAttached();
            return(this);
        }
예제 #2
0
 internal void AddIncoming(BaseNode node)
 {
     Incoming.Add(new NodeLink(node)
     {
         Weight = Helpers.GetRandomWeight()
     });
 }
        public async Task <IActionResult> Edit(int id, [Bind("Id,TourImage,TourIcon,TourName,TourTitle,TourTime,TourAction,ServiceId,Duration,TourId")] Incoming incoming)
        {
            if (id != incoming.Id)
            {
                return(NotFound());
            }

            if (ModelState.IsValid)
            {
                try
                {
                    _context.Update(incoming);
                    await _context.SaveChangesAsync();
                }
                catch (DbUpdateConcurrencyException)
                {
                    if (!IncomingExists(incoming.Id))
                    {
                        return(NotFound());
                    }
                    else
                    {
                        throw;
                    }
                }
                return(RedirectToAction(nameof(Index)));
            }
            ViewData["ServiceId"] = new SelectList(_context.Services, "Id", "Id", incoming.ServiceId);
            ViewData["TourId"]    = new SelectList(_context.Tours, "Id", "ImagePath", incoming.TourId);
            return(View(incoming));
        }
예제 #4
0
    public override string ToString()
    {
        var sb = new StringBuilder();

        if (Unknown.Any())
        {
            sb.Append(string.Join(", ", Unknown.Select(x => x.Name)));
        }

        if (Incoming.Any())
        {
            if (sb.Length > 0)
            {
                sb.Append("; ");
            }
            sb.Append("Incoming: ");
            sb.Append(string.Join(", ", Incoming.Select(x => x.Name)));
        }

        if (Outgoing.Any())
        {
            if (sb.Length > 0)
            {
                sb.Append("; ");
            }
            sb.Append("Outgoing: ");
            sb.Append(string.Join(", ", Outgoing.Select(x => x.Name)));
        }

        return(sb.ToString());
    }
예제 #5
0
 public override String ToString()
 {
     return("OperatorDependencyEntry{" +
            "incoming=" + Incoming.Render() +
            ", outgoing=" + Outgoing.Render() +
            '}');
 }
예제 #6
0
        public IHttpActionResult PutIncoming(Incoming incoming)
        {
            var id = incoming.IncomingID;

            if (!ModelState.IsValid)
            {
                return(BadRequest(ModelState));
            }

            if (id != incoming.IncomingID)
            {
                return(BadRequest());
            }

            db.Entry(incoming).State = EntityState.Modified;

            try
            {
                db.SaveChanges();
            }
            catch (DbUpdateConcurrencyException)
            {
                if (!IncomingExists(id))
                {
                    return(NotFound());
                }
                else
                {
                    throw;
                }
            }

            return(StatusCode(HttpStatusCode.NoContent));
        }
        public async Task <IActionResult> Create([Bind("Id,TourImage,TourIcon,TourName,TourTitle,TourTime,TourAction,ServiceId,Duration,TourId")] Incoming incoming, IFormFile TourImage)
        {
            //CustomDateTimeFile customDateTimeFile = new CustomDateTimeFile();
            //string fileName = customDateTimeFile.GetFileName(TourImage.FileName);

            if (ModelState.IsValid)
            {
                //incoming.TourImage = fileName;
                //if (_IsAcceptedFormat(TourImage.ContentType))
                //{

                //    string path = Path.Combine(hostingEnvironment.WebRootPath, "images", fileName);
                //    byte[] data = new byte[TourImage.Length];

                //    using (FileStream fileStream = new FileStream(path, FileMode.Create))
                //    {
                //        await TourImage.CopyToAsync(fileStream);
                //    }
                //}
                await _context.AddAsync(incoming);

                await _context.SaveChangesAsync();

                return(RedirectToAction(nameof(Index)));
            }
            ViewData["ServiceId"] = new SelectList(_context.Services, "Id", "Id", incoming.ServiceId);
            ViewData["TourId"]    = new SelectList(_context.Tours, "Id", "ImagePath", incoming.TourId);
            return(View(incoming));
        }
예제 #8
0
파일: Program.cs 프로젝트: dank074/HabKit
        public Program(string[] args)
        {
            _baseDirectory = AppDomain.CurrentDomain.BaseDirectory;

            In  = new Incoming();
            Out = new Outgoing();

            Options = HBOptions.Parse(args);
            if (string.IsNullOrWhiteSpace(Options.FetchRevision))
            {
                Game = new HGame(Options.GameInfo.FullName);
                if (Options.Compression == null)
                {
                    Options.Compression = Game.Compression;
                }
            }
            if (string.IsNullOrWhiteSpace(Options.OutputDirectory))
            {
                if (Options.GameInfo == null)
                {
                    Options.OutputDirectory = Environment.CurrentDirectory;
                }
                else
                {
                    Options.OutputDirectory = Options.GameInfo.DirectoryName;
                }
            }
            else
            {
                Options.OutputDirectory = Path.Combine(
                    Environment.CurrentDirectory, Options.OutputDirectory);
            }
        }
예제 #9
0
        void DoReceive(bool slowOutgoing, bool slowIncoming)
        {
            Incoming.SlowConnection = slowIncoming;
            Outgoing.SlowConnection = slowOutgoing;

            int sent = 0;

            buffer = new byte [data.Length];

            var handle = new ManualResetEvent(false);

            NetworkIO.EnqueueReceive(Outgoing, buffer, 0, buffer.Length, null, null, null, (s, t, o) => {
                Assert.IsTrue(s, "#Receive successful");
                Assert.AreEqual(buffer.Length, t, "#data was all received");
                handle.Set();
            }, null);

            while (sent != buffer.Length)
            {
                int r = Incoming.Send(data, sent, data.Length - sent);
                Assert.AreNotEqual(0, r, "#Received data");
                sent += r;
            }

            Assert.IsTrue(handle.WaitOne(TimeSpan.FromSeconds(4)), "Data should be all received");
            for (int i = 0; i < buffer.Length; i++)
            {
                if (data[i] != buffer[i])
                {
                    Assert.Fail("Buffers differ at position " + i);
                }
            }
        }
예제 #10
0
 public override Task AppendLoad(XElement item, Process target)
 {
     return(Task.Run(() =>
     {
         // 中间流对象拥有前后连接
         var ins = item.Elements("incoming");
         foreach (var @in in ins)
         {
             if (Incoming == null)
             {
                 Incoming = new List <SequenceFlow>();
             }
             Incoming.Add(target.Where(a => a.Id == @in.Value).FirstOrDefault() as SequenceFlow);
         }
         var outs = item.Elements("outgoing");
         foreach (var @out in outs)
         {
             if (Outgoing == null)
             {
                 Outgoing = new List <SequenceFlow>();
             }
             Outgoing.Add(target.Where(a => a.Id == @out.Value).FirstOrDefault() as SequenceFlow);
         }
         ProcessRef = target;
         Executor.Init(this, item, Executor.TypesAll);
     }));
 }
예제 #11
0
        public virtual string GetProperty(string strPropertyName, string strFormat, System.Globalization.CultureInfo formatProvider, DotNetNuke.Entities.Users.UserInfo accessingUser, DotNetNuke.Services.Tokens.Scope accessLevel, ref bool propertyNotFound)
        {
            switch (strPropertyName.ToLower())
            {
            case "rideid": // Int
                return(RideId.ToString(strFormat, formatProvider));

            case "moduleid": // Int
                return(ModuleId.ToString(strFormat, formatProvider));

            case "userid": // Int
                return(UserId.ToString(strFormat, formatProvider));

            case "incoming": // Bit
                return(Incoming.ToString());

            case "location": // NVarChar
                return(PropertyAccess.FormatString(Location, strFormat));

            case "notes": // NVarCharMax
                return(PropertyAccess.FormatString(Notes, strFormat));

            case "placesavailable": // Int
                return(PlacesAvailable.ToString(strFormat, formatProvider));

            default:
                propertyNotFound = true;
                break;
            }

            return(Null.NullString);
        }
예제 #12
0
        private void disableControls()
        {
            btnConnect.Text = "Connect";

            btnLaser.Enabled        = false;
            laserStatus.BackColor   = Color.LightGray;
            laserStatusText.Text    = disconnectedStatus;
            laserStatusText.Enabled = false;
            btnCalibrate.Enabled    = false;
            Incoming.ResetText();
            btnRandomSpeed.Enabled = false;
            btnFixedSpeed.Enabled  = false;
            btnIncrease.Enabled    = false;
            btnDecrease.Enabled    = false;
            btnStop.Enabled        = false;
            btnStop.BackColor      = Color.LightGray;

            square1.Enabled   = false;
            square2.Enabled   = false;
            square3.Enabled   = false;
            square4.Enabled   = false;
            line1.Enabled     = false;
            line2.Enabled     = false;
            line3.Enabled     = false;
            line4.Enabled     = false;
            cross1.Enabled    = false;
            cross2.Enabled    = false;
            triangle1.Enabled = false;
            triangle2.Enabled = false;
            manFigure.Enabled = false;
            smiley.Enabled    = false;
            heart.Enabled     = false;
            star.Enabled      = false;
        }
예제 #13
0
        //
        // GET: /Incoming/Delete/5

        public ActionResult Delete(int id)
        {
            Outcoming outcoming = db.Outcomings.Find(id);
            Incoming  incoming  = db.Incomings.Find(id);

            return(View());
        }
        /// <summary>
        /// Initialize sockets for file stream
        /// </summary>
        private void InitSockets()
        {
            FileTransfer = new TCPClient(AddressString, TransferPort, SSL, Logging);

            FileTransfer.OnMessage += (message) => {
                using (MemoryStream ms = new MemoryStream(message.Content)) {
                    long id    = TCPReaderWriter.ReadLong(ms, false);
                    long index = TCPReaderWriter.ReadLong(ms, false);

                    byte[] data = TCPReaderWriter.Read(ms, (uint)message.Content.Length - 16);

                    TCPFileProgress progress = Incoming.Peek();

                    if (progress.TransferData.ID == id)
                    {
                        progress.Cache.AddData(new TCPFileTile()
                        {
                            ID    = id,
                            Data  = data,
                            Index = index
                        });
                    }
                }
            };
        }
예제 #15
0
        private static void UpdateQueue()
        {
            Incoming inc = QueueManager.GetNextIncoming();

            while (inc != null)
            {
                switch (inc.Method)
                {
                case "message":
                    QueueManager.Push(UsersManager.OnMessage(inc.Message), inc.UserInfo);
                    break;

                case "start":
                    QueueManager.Push(UsersManager.Start(inc.UserInfo), inc.UserInfo);
                    break;

                case "lang":
                    UsersManager.SetLanguage(inc.Message);
                    break;

                default:
                    continue;
                }
                inc = QueueManager.GetNextIncoming();
            }
        }
예제 #16
0
        void DoReceive(bool slowOutgoing, bool slowIncoming)
        {
            Incoming.SlowConnection = slowIncoming;
            Outgoing.SlowConnection = slowOutgoing;

            int sent = 0;

            buffer = new byte[data.Length];

            var task = NetworkIO.ReceiveAsync(Outgoing, buffer, 0, buffer.Length, null, null, null);

            while (sent != buffer.Length)
            {
                int r = Incoming.Send(data, sent, data.Length - sent);
                Assert.AreNotEqual(0, r, "#Received data");
                sent += r;
            }

            Assert.IsTrue(task.Wait(TimeSpan.FromSeconds(10)), "Data should be all received");
            for (int i = 0; i < buffer.Length; i++)
            {
                if (data[i] != buffer[i])
                {
                    Assert.Fail("Buffers differ at position " + i);
                }
            }
        }
예제 #17
0
        public async Task ReceiveAsync(
            PipeWriter writer,
            CancellationToken cancellationToken)
        {
            while (!cancellationToken.IsCancellationRequested &&
                   !Incoming.Any())
            {
                await Task.Delay(100, cancellationToken);
            }

            if (cancellationToken.IsCancellationRequested)
            {
                return;
            }

            GenericOperationMessage message = Incoming.Dequeue();
            string json = JsonConvert.SerializeObject(message);

            byte[] buffer = Encoding.UTF8.GetBytes(json);

            Memory <byte> memory = writer.GetMemory(buffer.Length);

            for (int i = 0; i < buffer.Length; i++)
            {
                memory.Span[i] = buffer[i];
            }

            writer.Advance(buffer.Length);

            await writer
            .FlushAsync(cancellationToken)
            .ConfigureAwait(false);
        }
예제 #18
0
 public override string ToString()
 {
     return(string.Format("{0} (color: {1}, before: {2})",
                          Type.Name,
                          Color,
                          Incoming.Select(i => i.Type.Name).JoinToString(", ")));
 }
예제 #19
0
        public async Task <IHttpActionResult> PostIncoming(Incoming incoming)
        {
            if (!ModelState.IsValid)
            {
                return(BadRequest(ModelState));
            }

            db.Incoming.Add(incoming);

            try
            {
                await db.SaveChangesAsync();
            }
            catch (DbUpdateException)
            {
                if (IncomingExists(incoming.IncomeID))
                {
                    return(Conflict());
                }
                else
                {
                    throw;
                }
            }

            return(CreatedAtRoute("DefaultApi", new { id = incoming.IncomeID }, incoming));
        }
예제 #20
0
        public void Test_RemainNomenclature_WithDifferentIncConsMoreQuantity_ShouldReturnBalanceWithMinusQuantity()
        {
            var incoming    = new Incoming();
            var consumption = new Consumption();

            var selectedNomenclature = SelectNomenclature("AMD");

            var incomingQuantity = 50;

            incoming.Warehouse = SelectWarehouse("Main");
            incoming.ListOfNomenc.Add(CreateLineItemWithData(selectedNomenclature, incomingQuantity));

            var consumptionQuantity = 100;

            consumption.Warehouse = SelectWarehouse("Main");
            consumption.ListOfNomenc.Add(CreateLineItemWithData(selectedNomenclature, consumptionQuantity));

            try
            {
                _incomingService.Write(incoming);
                _consumptionService.Write(consumption);
            }
            catch (ArgumentException e)
            {
                Assert.NotNull(e);
            }
            ///// var costPriceBalance = _db.GetLeftoversRemainCostPriceBalance("AMD");
            /////  var remainNomenclatureBalance = _db.GetLeftoversRemainNomenclatureBalance("AMD", "Main");

            //// Assert.Equal(incomingQuantity - consumptionQuantity, costPriceBalance.Select(t => t.Amount).First());
            //// Assert.Equal(incomingQuantity - consumptionQuantity, remainNomenclatureBalance.Select(t => t.Quantity).First());
        }
예제 #21
0
        // PUT api/Incoming/5
        public async Task <IHttpActionResult> PutIncoming(short id, Incoming incoming)
        {
            if (!ModelState.IsValid)
            {
                return(BadRequest(ModelState));
            }

            if (id != incoming.IncomeID)
            {
                return(BadRequest());
            }

            db.Entry(incoming).State = EntityState.Modified;

            try
            {
                await db.SaveChangesAsync();
            }
            catch (DbUpdateConcurrencyException)
            {
                if (!IncomingExists(id))
                {
                    return(NotFound());
                }
                else
                {
                    throw;
                }
            }

            return(StatusCode(HttpStatusCode.NoContent));
        }
예제 #22
0
        public void Test_RemainNomenclature_WithManyDifferentIncConsQuantity_ShouldReturnBalanceWithSomeQuantity()
        {
            var incoming    = new Incoming();
            var consumption = new Consumption();
            var rand        = new Random();

            string[] nomenc = new string[3] {
                "NVIDIA", "NVIDIA", "NVIDIA"
            };

            for (int i = 0; i < 3; i++)
            {
                var quantity     = 20 * i + 10;
                var lineItemInc  = CreateLineItemWithData(SelectNomenclature("NVIDIA"), quantity + 10 * i);
                var lineItemCons = CreateLineItemWithData(SelectNomenclature("NVIDIA"), quantity);
                incoming.ListOfNomenc.Add(lineItemInc);
                consumption.ListOfNomenc.Add(lineItemCons);
            }

            incoming.Warehouse    = SelectWarehouse("Main");
            consumption.Warehouse = SelectWarehouse("Main");

            _incomingService.Write(incoming);
            _consumptionService.Write(consumption);

            var costPriceBalance           = _db.GetLeftoversRemainCostPriceBalance("NVIDIA");
            var remainNomenclatureBalance  = _db.GetLeftoversRemainNomenclatureBalance("NVIDIA", "Main");
            var costPriceBalance1          = _db.GetLeftoversRemainCostPriceBalance("AMD");
            var remainNomenclatureBalance1 = _db.GetLeftoversRemainNomenclatureBalance("AMD", "Main");
            var costPriceBalance2          = _db.GetLeftoversRemainCostPriceBalance("WD");
            var remainNomenclatureBalance2 = _db.GetLeftoversRemainNomenclatureBalance("WD", "Main");

            Assert.True(true);
        }
예제 #23
0
        public void Test_RemainNomenclature_WithEqualIncConsQuantity_ShouldReturnBalanceWithZeroQuantity()
        {
            var incoming    = new Incoming();
            var consumption = new Consumption();

            var selectedNomenclature = SelectNomenclature("AMD");

            var incomingQuantity = 100;

            incoming.Warehouse = SelectWarehouse("Main");
            incoming.ListOfNomenc.Add(CreateLineItemWithData(selectedNomenclature, incomingQuantity));

            var consumptionQuantity = 100;

            consumption.Warehouse = SelectWarehouse("Main");
            consumption.ListOfNomenc.Add(CreateLineItemWithData(selectedNomenclature, consumptionQuantity));

            _incomingService.Write(incoming);
            _consumptionService.Write(consumption);

            var costPriceBalance          = _db.GetLeftoversRemainCostPriceBalance("AMD");
            var remainNomenclatureBalance = _db.GetLeftoversRemainNomenclatureBalance("AMD", "Main");

            Assert.Equal(incomingQuantity - consumptionQuantity, costPriceBalance.Select(t => t.Amount).First());
            Assert.Equal(incomingQuantity - consumptionQuantity, remainNomenclatureBalance.Select(t => t.Quantity).First());
        }
예제 #24
0
        public IHttpActionResult PutIncoming(Incoming incoming)
        {
            if (!ModelState.IsValid)
            {
                return(BadRequest(ModelState));
            }

            //if (id != incoming.IncomeID)
            //{
            //    return BadRequest();
            //}

            db.Entry(incoming).State = EntityState.Modified;

            try
            {
                db.SaveChanges();
            }
            catch (DbUpdateConcurrencyException)
            {
                //if (!IncomingExists(id))
                //{
                //    return NotFound();
                //}
                //else
                //{
                //    throw;
                //}
            }

            return(StatusCode(HttpStatusCode.NoContent));
        }
예제 #25
0
        protected override void ProcessIncomingData(byte[] data, int start, int len)
        {
            //if (data.Length > 0)
            if (len > 0)
            {
                var type = (Utilities.PackType)data[start];
                switch (type)
                {
                case Utilities.PackType.Udp:
                    var realdata = new byte[len - 1];    //todo , try to reuse
                    Array.Copy(data, start + 1, realdata, 0, realdata.Length);
                    if (Incoming != null)
                    {
                        Incoming.Enqueue(realdata);
                    }
                    break;

                case Utilities.PackType.Kcp:
                    base.ProcessIncomingData(data, start + 1, len - 1);
                    break;

                default:
                    //unknown packtype, drop it
                    debug($"unknown packtype, drop it. typeid = {type}");
                    break;
                }
            }
        }
예제 #26
0
        public bool CanFire()
        {
            var incoming = Incoming.TrueForAll(a => a.CanFire());
            var outgoing = Outgoing.TrueForAll(a => a.CanFire());

            return(incoming && outgoing);
        }
예제 #27
0
 public void IncomingItem(Product[] products)
 {
     foreach (Product item in products)
     {
         Incoming.InCome(item);
         View.ViewProduct(item, "Incoming");
     }
 }
예제 #28
0
 private void Read(Incoming packet)
 {
     //lock (ReadQueue)
     {
         ReadQueue.Add(packet);
     }
     ContinueRead();
 }
예제 #29
0
        public ActionResult DeleteConfirmed(int id)
        {
            Incoming incoming = db.Incomings.Find(id);

            db.Incomings.Remove(incoming);
            db.SaveChanges();
            return(RedirectToAction("Index"));
        }
예제 #30
0
        public void Process(Incoming incoming)
        {
            var validator = new IncomingValidator();

            validator.ValidateAndThrow(incoming);

            // Do some awesome work ...
        }
예제 #31
0
        protected void Next(int aPacketSize, Action<byte[]> aCompleted)
        {
            if (aCompleted == null)
            {
                throw new ArgumentNullException("aCompleted");
            }
            var xIncoming = new Incoming();
            if (aPacketSize == 0)
            {
                // Can occur with variable size packets for exampmle.
                // Dont call read, becuase that will close the stream.
                // So we just call the Completed directly
                aCompleted(new byte[0]);
                return;
            }
            else if (aPacketSize == -1)
            {
                // Variable size packet, split into two reads
                mCompletedAfterSize = aCompleted;
                aPacketSize = 2;
                xIncoming.Completed = SizePacket;
            }
            else
            {
                xIncoming.Completed = bytes =>
                {
                    DebugLog(String.Format("DC - Received: 0x{0}", BytesToString(bytes, 0, bytes.Length)));
                    try
                    {
                        aCompleted(bytes);
                    }
                    catch (Exception E)
                    {
                        HandleError(E);
                    }
                };
            }
            if (aPacketSize > (1024 * 1024))
            {
                throw new Exception("Safety exception. Receiving " + aPacketSize + " bytes!");
            }
            xIncoming.Packet = new byte[aPacketSize];

            DebugLog(String.Format("DC - Next: Expecting: {0}", aPacketSize) + "\r\n");
            if (xIncoming.Completed == null)
            {
                throw new InvalidOperationException("No completed!");
            }
            mPendingReads.Add(xIncoming);
        }
예제 #32
0
        private void ProcessPendingActions()
        {
            Incoming xPendingRead = mIncompletePendingRead;
            if (xPendingRead != null || mPendingReads.TryTake(out xPendingRead, 5))
            {
                var xNrOfBytesToRead = xPendingRead.Packet.Length - xPendingRead.CurrentPos;
                var xBytesRead = TryRead(xPendingRead.Packet, xPendingRead.CurrentPos, xNrOfBytesToRead, 5);

                xPendingRead.CurrentPos += xBytesRead;

                if (xPendingRead.CurrentPos == xPendingRead.Packet.Length)
                {
                    // Full packet received, process it
                    xPendingRead.Completed(xPendingRead.Packet);
                    mIncompletePendingRead = null;
                }
                else
                {
                    mIncompletePendingRead = xPendingRead;
                }
            }

            //process_writes:

            // now process sends.
            Outgoing xPendingWrite;
            if (mPendingWrites.TryTake(out xPendingWrite, 5))
            {
                if (!SendRawData(xPendingWrite.Packet))
                {
                    throw new Exception("SendRawData returned false!");
                }
                if (xPendingWrite.Completed != null)
                {
                    xPendingWrite.Completed.Set();
                }
            }
        }
예제 #33
0
        private void ThreadMethod()
        {
            // todo: error handling
            mIncompletePendingRead = null;
            try
            {
                InitializeBackground();
                DoConnected();
                Next(1, WaitForSignature);
                while (true)
                {
                    if (!GetIsConnectedToDebugStub())
                    {
                        ConnectionLost(null);
                        return;
                    }
                    ProcessPendingActions();
                }
            }
            catch (ThreadAbortException)
            {
                while (true)
                {
                    Outgoing xPendingOutgoing;
                    if (!mPendingWrites.TryTake(out xPendingOutgoing))
                    {
                        break;
                    }
                    xPendingOutgoing.Packet = null;
                    xPendingOutgoing.Completed.Set();
                }

                return;
            }
            catch (Exception E)
            {
                CmdMessageBox("Error occurred in DebugConnector.ThreadMethod: " + E.ToString());
            }
            ConnectionLost(null);
        }
예제 #34
0
        protected override void Next(int aPacketSize, Action<byte[]> aCompleted)
        {
            var xIncoming = new Incoming();
            if (aPacketSize == 0)
            {
                // Can occur with variable size packets for exampmle.
                // Dont call read, becuase that will close the stream.
                // So we just call the Completed directly
                aCompleted(new byte[0]);
            }
            else if (aPacketSize == -1)
            {
                // Variable size packet, split into two reads
                mCompletedAfterSize = aCompleted;
                aPacketSize = 2;
                xIncoming.Completed = SizePacket;
            }
            else
            {
                xIncoming.Completed = bytes =>
                                      {
                                          DoDebugMsg(String.Format("DC - Received: 0x{0}", BytesToString(bytes, 0, bytes.Length)));
                                          try
                                          {
                                              aCompleted(bytes);
                                          }
                                          catch (Exception E)
                                          {
                                              HandleError(E);
                                          }
                                      };
            }
            if (aPacketSize > (1024 * 1024))
            {
              throw new Exception("Safety exception. Receiving " + aPacketSize + " bytes!");
            }
            xIncoming.Packet = new byte[aPacketSize];
            xIncoming.Stream = mStream;

            System.Diagnostics.Debug.WriteLine(String.Format("DC - Next: Expecting: {0}", aPacketSize));
            DoDebugMsg(String.Format("DC - Next: Expecting: {0}", aPacketSize) + "\r\n");

            Read(xIncoming);

#if TRACK_PENDING
      try {
        Interlocked.Increment(ref _pendingReadsCount);
#endif
            //mStream.BeginRead(xIncoming.Packet, 0, aPacketSize, new AsyncCallback(DoRead), xIncoming);
#if TRACK_PENDING
      }
      catch (Exception e) {
        Interlocked.Decrement(ref _pendingReadsCount);
        throw;
      }
#endif
        }
예제 #35
0
 private void Read(Incoming packet)
 {
     //lock (ReadQueue)
     {
         ReadQueue.Add(packet);
     }
     ContinueRead();
 }
예제 #36
0
파일: PacketLane.cs 프로젝트: raxptor/putki
		// This will start reading from the buffers and modify the incoming array.
		public static void HandleIncomingPackets(LaneSetup setup, Incoming[] packets, uint packetsCount)
		{
			// Zero pass make own buffers.
			for (uint i=0;i<packetsCount;i++)
			{
				if (!packets[i].CanKeepData)
				{
					Bitstream.Buffer tmp = packets[i].Packet;
					Bitstream.Buffer copy = setup.Factory.GetBuffer((uint)tmp.buf.Length);
					Bitstream.Insert(copy, tmp);
					copy.Flip();
					packets[i].Packet = copy;
				}
			}

			// First pass extract.
			for (uint i=0;i<packetsCount;i++)
			{
				Bitstream.Buffer tmp = packets[i].Packet;
				Lane lane = packets[i].Lane;
				lane.Stats.RecvCount++;
				lane.Stats.RecvBytes += tmp.BitsLeft() / 8;

				bool reliable = Bitstream.ReadBits(tmp, 1) == 1;
				uint seq = Bitstream.ReadCompressedUint(tmp);
				packets[i].Internal.Seq = seq;
				packets[i].Internal.IsReliable = reliable;

				if (seq == 0)
				{
					lane.Stats.RecvAckOnly++;
				}

				if (reliable)
				{
					packets[i].Internal.IsFinalPiece = Bitstream.ReadBits(tmp, 1) == 1;

					if (!packets[i].Internal.IsFinalPiece)
					{
						lane.Stats.RecvNonFinal++;
					}

					if (seq != 0)
					{
						if (lane.AckCount < lane.Acks.Length)
						{						
							lane.Acks[lane.AckCount++] = seq;
						}
					}

					while (true)
					{
						uint seqAck = Bitstream.ReadCompressedUint(tmp);
						if (seqAck != 0)
						{
							for (int j=0;j!=lane.OutCount;j++)
							{								
								if (lane.Out[j].SeqId == seqAck)
								{
									double msLag = (packets[i].ArrivalTime - lane.Out[j].InitialSendTime).TotalMilliseconds;
									if (msLag > 0)
									{
										uint ms = (uint) msLag;
										if (ms < lane.LagMsMin || lane.LagMsMin == 0)
										{
											if (ms >= setup.MinResendTimeMs)
											{
												lane.LagMsMin = ms;
												lane.ResendMs = 2 * ms;
											}
										}
									}

									if (lane.Out[j].Source != null)
									{
										if (--lane.Out[j].Source.userdata == 0)
										{
											setup.Factory.ReturnBuffer(lane.Out[j].Source);
										}
										lane.Out[j].Source = null;
									}
								}
							}
							continue;
						}
						break;
					}
				}
				else
				{
					packets[i].Internal.IsFinalPiece = true;
				}

				Bitstream.SyncByte(tmp);
			}

			// Unreliable packets, these are placed in the out queue after reading out the sequence and mode.
			for (int i=0;i<packets.Length;i++)
			{
				if (packets[i].Internal.IsReliable || packets[i].Internal.Seq == 0)
					continue;
				Lane lane = packets[i].Lane;
				if (lane.DoneHead - lane.DoneTail != lane.Done.Length)
				{
					uint head = lane.DoneHead % (uint)lane.Done.Length;
					lane.Done[head].Data = packets[i].Packet;
					lane.Done[head].Reliable = false;
					lane.Done[head].SeqId = packets[i].Internal.Seq;
					lane.Done[head].ArrivalTime = packets[i].ArrivalTime;
					lane.Done[head].CompletionTime = packets[i].ArrivalTime;
					lane.Done[head].Lane = lane;
					lane.DoneHead = lane.DoneHead + 1;
				}
			}

			// Handle reliable. These go straight
			for (int i=0;i<packets.Length;i++)
			{
				if (!packets[i].Internal.IsReliable || packets[i].Internal.Seq == 0)
					continue;

				Lane lane = packets[i].Lane;

				if (packets[i].Internal.Seq <= lane.ReliableSeq)
				{
					lane.Stats.RecvDupes++;
					continue;
				}

				// If packet arrives a second time, ignore.
				uint numProgress = (uint)lane.Progress.Length;
				bool hadit = false;
				for (uint p = lane.ProgressTail;p != lane.ProgressHead;p++)
				{
					uint idx = p % numProgress;
					if (lane.Progress[idx].SeqId == packets[i].Internal.Seq)
					{
						hadit = true;
						break;
					}
				}

				if (hadit)
				{
					// Already got the packet for this sequence id.
					lane.Stats.RecvDupes++;
					continue;
				}

				if (lane.ProgressHead - lane.ProgressTail != lane.Progress.Length)
				{
					uint head = lane.ProgressHead % (uint)lane.Progress.Length;
					lane.Progress[head].Data = packets[i].Packet;
					lane.Progress[head].IsFinalPiece = packets[i].Internal.IsFinalPiece;
					lane.Progress[head].ArrivalTime = packets[i].ArrivalTime;
					lane.Progress[head].SeqId = packets[i].Internal.Seq;
					lane.ProgressHead = lane.ProgressHead + 1;
				}
			}
		}