internal override void InternalWormHole(object obj)
        {
            //文件开始发送时,会调用这个函数。所以ProcessingItems里面存储的,是所有尝试开始过的Item,如果成功了,就会从里面移除,不管是主动发送完毕,还是对方已经有这个文件,直接变成完成状态。

            //TODO 现在有个问题没有解决,获取正在等待确认的文件,或者出错的文件,是应该在这个ProcessingItems里面呢,还是应该去Items属性里面?因为这两个是重复的。
            //作为临时的解决方案,可以查找ProcessingItems里面的Item的相对路径是不是"", 如果是,就不要显示,因为Items那里已经显示了。

            //TODO 重构 有没有更好的解决方案?不要冒然删除ProcessingItems,因为Items属性只管理了顶层的文件、文件夹。嵌套的子文件在那里面查找不到。
            if (obj is FileItem)
            {
                //这里的item可以是嵌套很深的文件。在构造requester的时候设置item的回调达不到这个效果,除非遍历子元素。
                //文件等待确认或者出错,会转移到PendingItems里面去。会话会尽量完成能传输完毕的文件,传不成功的(出错或没有得到及时确认)会留在这里。
                var fi = obj as FileItem;
                if (ProcessingItems.Find(i => { return(i.ID == fi.ID); }) != null || fi.TransferState == TransferState.Confirmed)
                {
                    return;                                                                                                              //如果滥用了InternalWormHole,这样可以避免一下,否则会导致事件被触发多次。
                }
                ProcessingItems.Add(fi);
                fi.Confirmed += (o) => ProcessingItems.Remove(fi);
                fi.Completed += (o) =>
                {
                    if (fi.NeedConfirm)
                    {
                        fi.TransferState = TransferState.WaitingConfirm;
                    }
                };
            }
        }
        public IHttpActionResult PostProcessingItems(ProcessingItems processingItems)
        {
            if (!ModelState.IsValid)
            {
                return(BadRequest(ModelState));
            }

            db.ProcessingItems.Add(processingItems);

            try
            {
                db.SaveChanges();
            }
            catch (DbUpdateException)
            {
                if (ProcessingItemsExists(processingItems.ProcessNumber))
                {
                    return(Conflict());
                }
                else
                {
                    throw;
                }
            }

            return(CreatedAtRoute("DefaultApi", new { id = processingItems.ProcessNumber }, processingItems));
        }
        public IHttpActionResult PutProcessingItems(string id, ProcessingItems processingItems)
        {
            if (!ModelState.IsValid)
            {
                return(BadRequest(ModelState));
            }

            if (!id.Equals(processingItems.ProcessNumber))
            {
                return(BadRequest());
            }

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

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

            return(StatusCode(HttpStatusCode.NoContent));
        }
        public IHttpActionResult GetProcessingItems(string id)
        {
            ProcessingItems processingItems = db.ProcessingItems.Find(id);

            if (processingItems == null)
            {
                return(NotFound());
            }

            return(Ok(processingItems));
        }
        //速度可以计算出来?用传送开始时间、传输的数据量,再用一个timer定时更新速度就可以了。更新总的速度,或者一个会话的速度都可以。
        //public event Action<int> SpeedChanged;
        internal protected override void OnInitRequest()
        {
            SendItemsMessage message = new SendItemsMessage(Items);

            Items.ForEach(item =>
            {
                if (item is FileItem)
                {
                    ProcessingItems.Add(item);
                }
            });
            PostMessage(message);
        }
        public IHttpActionResult DeleteProcessingItems(int id)
        {
            ProcessingItems processingItems = db.ProcessingItems.Find(id);

            if (processingItems == null)
            {
                return(NotFound());
            }

            db.ProcessingItems.Remove(processingItems);
            db.SaveChanges();

            return(Ok(processingItems));
        }
示例#7
0
        private bool ProcessItemExists(string caller) // Tjekker om processnummer eksisterer i forvejen. Om det passer med færdigvarenummer.
        {
            bool exists = true;

            if (FinishNumber == 0 || Processnumber.Equals("")) // Er der indtastet nul eller ingenting
            {
                //Warn about missing fields if caller is button
                if (caller.Equals("button"))
                {
                    ShowMsg.ShowMessage("Indtast venligst processordrenummer og færdigvarenummer");
                }
                exists = false;
            }
            else if (ProItem.FinishedItemNumber != FinishNumber || ProItem.ProcessNumber != Processnumber) // Er der bare én af indtastningerne, der ikke passer med lagret processItem
            {
                // Opretter et processingItem at sammenligne med.   Et processingItem forsøges hentet fra databasen med det indtastede processNummer som ID
                ProcessingItems comparableProcessingItemFromDb = ComGeneric.GetOne <ProcessingItems, string>(Processnumber);

                ProItem = new ProcessingItems          // Opretter nyt processingItem til lagret processingItem
                {
                    FinishedItemNumber = FinishNumber, // Oprettes med indtastede oplysninger
                    ProcessNumber      = Processnumber
                };
                if (comparableProcessingItemFromDb == null) // Er processingItem - hentet fra databasen - null?
                {
                    if (!ComGeneric.Post(ProItem))          // Gemmer nyt processingItem i DB
                    {
                        //Warn about connection problem to DB
                        ShowMsg.ShowMessage("Der er ikke forbindelse til serveren");
                        exists = false;
                    }
                }
                else if (!comparableProcessingItemFromDb.FinishedItemNumber.Equals(ProItem.FinishedItemNumber)) // Er indtastet færdigvarenummer og processingitems færdigvarenummer (fra databasen) ens?
                {
                    // Warn about conflicting ProcessItem
                    ShowMsg.ShowMessage("Procesordrenummeret eksisterer i forvejen, men med et andet færdigvarenummer");
                    exists = false;
                }
            }

            return(exists);
        }
示例#8
0
        private SaveTapOperator()
        {
            for (int i = 0; i < TapOperatorMoments.Length; i++) // initialiserer objekter i listen TapOperatorMoments
            {
                TapOperatorMoments[i] = new TapOperatorMoment();
            }

            for (int i = 0; i < FluidWeightControls.Length; i++) // initialiserer objekter i listen FluidWeightControls
            {
                FluidWeightControls[i] = new FluidWeightControl(this);
            }

            GenerateObjectsToBeSaved();
            _saveToDbMethod   = PostSaveMethod;
            SaveCommand       = new RelayCommand(SaveCommandPush);
            AutoSaveTimer     = new AutoSaveTimer(this);
            LiquidTankCommand = new RelayCommand <object>(LiquidTankCommandMethod);
            ProItem           = new ProcessingItems();
            ShowMsg           = new ShowMsg();
            CalculateAverageWeight();
            CurrentFinishedItem = new FinishedItems();
        }
        protected internal override void OnMessageReceived(ConversationMessage message)
        {
            if (message is CancelItemMessage)
            {
                CancelItemMessage msg = message as CancelItemMessage;
                msg.Items.ForEach((o) =>
                {
                    var cutItem = Items.FirstOrDefault(d => d.ID == o.ID);
                    if (cutItem != null)
                    {
                        cutItem.TransferState = TransferState.Canceled;
                    }
                });

                holder.Remove(msg.Items);
            }
            else if (message is ConfirmItemMessage)
            {
                Debug.WriteLine("ConfirmedItem msg count=" + (confirmMsgCount++));
                var cm = message as ConfirmItemMessage;
                //若不复制,Confirmed中的移除动作报错。测试确认一下。
                var tmpProcessingList = new List <Item>(ProcessingItems);
                //Console.WriteLine("Received a confirm message itemid=" + cm.ItemID);
                var item = tmpProcessingList.Find(i => i.ID == cm.ItemID);
                if (item != null)
                {
                    //这个状态改变,会导致item从ProcessingItems中移除。
                    item.ForceComplete(TransferState.Confirmed);
                    //移除动作是在同一线程中,移除完毕会进入这里。
                    if (ProcessingItems.Count() == 0)
                    {
                        //应该还需要做这个检查,有可能存在没有正在处理的文件,但其他也没法送,或者状态不对的情况。
                        if (Items.All(o => o.TransferState == TransferState.Confirmed))
                        {
                            //所有文件成功发送完毕
                            Completed?.Invoke(this);
                        }
                        else
                        {
                            //该做什么?没有正在处理的Item,但也不是所有的Item状态都是Confirmed。出错了..., 如果给对方发了列表,对方马上就回复Confirm,也是0
                        }
                    }
                    else
                    {
                        if (tmpProcessingList.All(o => o.TransferState == TransferState.WaitConfirmTimeouted || o.TransferState == TransferState.Error))
                        {
                            //处理列表中的东西,都是出错 / 等待确认超时的,没办法再处理了。报告错误。上层如果要重新发送,可以到ProcessingItem里面去取。
                            //TODO 只需检查ProcessingItems即可。需要确认一个文件出错,或者等待确认超时,传递到父目录没有?
                            Errored?.Invoke(this);
                        }
                    }
                }
            }
            else if (message is ReceiveItemErrorMessage)
            {
                var rie  = message as ReceiveItemErrorMessage;
                var item = ProcessingItems.FirstOrDefault(i => i.ID == rie.ItemID);
                if (item == null)
                {
                    item = Items.Find(i => i.ID == rie.ID);
                }
                if (item != null)
                {
                    item.ErrorCode     = rie.ErrorCode;
                    item.TransferState = TransferState.Error;
                }
            }
        }