Beispiel #1
0
        public void Serialize()
        {
            var jsonSerializerSettings = new JsonSerializerSettings
            {
                DateFormatHandling = DateFormatHandling.MicrosoftDateFormat,
                DateParseHandling = DateParseHandling.DateTime,
                DateTimeZoneHandling = DateTimeZoneHandling.RoundtripKind
            };

            var part = new FilePart {Connected = true, Enabled = true, Guid = Guid.Empty};

            Assert.AreEqual(
                "{\"StartSize\":0,\"StopSize\":0,\"CurrentSize\":0,\"MissingSize\":0,\"TimeMissing\":0,\"Speed\":0,\"State\":0,\"Checked\":false,\"ParentGuid\":\"00000000-0000-0000-0000-000000000000\",\"Guid\":\"00000000-0000-0000-0000-000000000000\",\"Name\":\"\",\"Connected\":true,\"Enabled\":true}",
                JsonConvert.SerializeObject(part, jsonSerializerSettings)
            );

            var packet = new Packet
            {
                Name = "Test Packet",
                Connected = true,
                Enabled = true,
                Guid = Guid.Empty,
                LastMentioned = DateTime.Now,
                LastUpdated = DateTime.Now,
                Part = part
            };

            Assert.AreEqual(
                "{\"Part\":{\"StartSize\":0,\"StopSize\":0,\"CurrentSize\":0,\"MissingSize\":0,\"TimeMissing\":0,\"Speed\":0,\"State\":0,\"Checked\":false,\"ParentGuid\":\"00000000-0000-0000-0000-000000000000\",\"Guid\":\"00000000-0000-0000-0000-000000000000\",\"Name\":\"\",\"Connected\":true,\"Enabled\":true},\"Name\":\"Test Packet\",\"Id\":-1,\"Size\":0,\"RealSize\":0,\"RealName\":\"\",\"LastUpdated\":\"" + JsonDate(packet.LastUpdated) + "\",\"LastMentioned\":\"" + JsonDate(packet.LastMentioned) + "\",\"Next\":false,\"ParentGuid\":\"00000000-0000-0000-0000-000000000000\",\"Guid\":\"00000000-0000-0000-0000-000000000000\",\"Connected\":true,\"Enabled\":true}",
                JsonConvert.SerializeObject(packet, jsonSerializerSettings)
            );

            var bot = new Bot
            {
                Name = "Test Bot",
                Connected = true,
                Enabled = true,
                Guid = Guid.Empty,
                InfoQueueCurrent = 16,
                InfoQueueTotal = 16,
                InfoSlotCurrent = 16,
                InfoSlotTotal = 16,
                InfoSpeedCurrent = 16,
                InfoSpeedMax = 16,
                LastMessage = "Test Message",
                QueuePosition = 16,
                QueueTime = 16,
                State = Bot.States.Idle,
                LastContact = DateTime.Now
            };
            bot.AddPacket(packet);

            Assert.AreEqual(
                "{\"State\":0,\"LastMessage\":\"Test Message\",\"LastMessageTime\":\"" + JsonDate(bot.LastMessageTime) + "\",\"LastContact\":\"" + JsonDate(bot.LastContact) + "\",\"QueuePosition\":16,\"QueueTime\":16,\"InfoSpeedMax\":16,\"InfoSpeedCurrent\":16,\"InfoSlotTotal\":16,\"InfoSlotCurrent\":16,\"InfoQueueTotal\":16,\"InfoQueueCurrent\":16,\"Speed\":0,\"HasNetworkProblems\":false,\"ParentGuid\":\"00000000-0000-0000-0000-000000000000\",\"Guid\":\"00000000-0000-0000-0000-000000000000\",\"Name\":\"Test Bot\",\"Connected\":true,\"Enabled\":true}",
                JsonConvert.SerializeObject(bot, jsonSerializerSettings)
            );
        }
Beispiel #2
0
        /// <summary>
        /// </summary>
        /// <param name="aPart"> </param>
        /// <param name="aBytes"> </param>
        /// <param name="aThreaded"> </param>
        /// <returns> </returns>
        Int64 CheckNextReferenceBytes(FilePart aPart, byte[] aBytes, bool aThreaded)
        {
            var tFile = aPart.Parent;
            IEnumerable<FilePart> parts = tFile.Parts;
            Log.Info("CheckNextReferenceBytes(" + tFile + ", " + aPart + ") with " + parts.Count() + " parts called");

            foreach (FilePart part in parts)
            {
                if (part.StartSize == aPart.StopSize)
                {
                    // is the part already checked?
                    if (part.Checked)
                    {
                        break;
                    }

                    // the file is open
                    if (part.State == FilePart.States.Open)
                    {
                        if (part.Packet != null)
                        {
                            if (!part.StartReference.IsEqualWith(aBytes))
                            {
                                Log.Warn("CheckNextReferenceBytes(" + tFile + ", " + aPart + ") removing next " + part);
                                part.Packet.Enabled = false;
                                part.Packet.Commit();
                                RemovePart(tFile, part);
                                return part.StopSize;
                            }
                            else
                            {
                                Log.Info("CheckNextReferenceBytes(" + tFile + ", " + aPart + ") " + part + " is checked");
                                part.Checked = true;
                                part.Commit();
                                return 0;
                            }
                        }
                        else
                        {
                            Log.Error("CheckNextReferenceBytes(" + tFile + ", " + aPart + ") " + part + " is open, but has no packet");
                            return 0;
                        }
                    }
                        // it is already ready
                    if (part.State == FilePart.States.Closed || part.State == FilePart.States.Ready)
                    {
                        string fileName = CompletePath(part);
                        try
                        {
                            BinaryReader reader = FileSystem.OpenFileReadable(fileName);
                            byte[] bytes = reader.ReadBytes(Settings.Instance.FileRollbackCheckBytes);
                            reader.Close();

                            if (!bytes.IsEqualWith(aBytes))
                            {
                                Log.Warn("CheckNextReferenceBytes(" + tFile + ", " + aPart + ") removing closed " + part);
                                RemovePart(tFile, part);
                                return part.StopSize;
                            }
                            else
                            {
                                part.Checked = true;
                                part.Commit();

                                if (part.State == FilePart.States.Ready)
                                {
                                    // file is not the last, so check the next one
                                    if (part.StopSize < tFile.Size)
                                    {
                                        FileStream fileStream = System.IO.File.Open(fileName, FileMode.Open, FileAccess.ReadWrite);
                                        var fileReader = new BinaryReader(fileStream);
                                        // extract the needed refernce bytes
                                        fileStream.Seek(-Settings.Instance.FileRollbackCheckBytes, SeekOrigin.End);
                                        bytes = fileReader.ReadBytes(Settings.Instance.FileRollbackCheckBytes);
                                        // and truncate the file
                                        //fileStream.SetLength(fileStream.Length - Settings.Instance.FileRollbackCheckBytes);
                                        fileStream.SetLength(part.StopSize - part.StartSize);
                                        fileReader.Close();

                                        // dont open a new thread if we are already threaded
                                        if (aThreaded)
                                        {
                                            CheckNextReferenceBytes(part, bytes, false);
                                        }
                                        else
                                        {
                                            new Thread(CheckNextReferenceBytes).Start(new PartBytesObject(part, bytes));
                                        }
                                    }
                                }
                            }
                        }
                        catch (Exception ex)
                        {
                            Log.Fatal("CheckNextReferenceBytes(" + aPart.Parent + ", " + aPart + ") handling " + part + "", ex);
                        }
                    }
                    else
                    {
                        Log.Error("CheckNextReferenceBytes(" + aPart.Parent + ", " + aPart + ") do not know what to do with " + part);
                    }

                    break;
                }
            }
            return 0;
        }
Beispiel #3
0
        /// <summary>
        /// </summary>
        /// <param name="aFile"> </param>
        /// <param name="aPart"> </param>
        public void RemovePart(Core.File aFile, FilePart aPart)
        {
            Log.Info("RemovePart(" + aFile + ", " + aPart + ")");

            IEnumerable<FilePart> parts = aFile.Parts;
            foreach (FilePart part in parts)
            {
                if (part.StopSize == aPart.StartSize)
                {
                    part.StopSize = aPart.StopSize;
                    if (part.State == FilePart.States.Ready)
                    {
                        Log.Info("RemovePart(" + aFile + ", " + aPart + ") expanding " + part.StartSize + " to " + aPart.StopSize);
                        part.State = FilePart.States.Closed;
                        part.Commit();
                        break;
                    }
                }
            }

            aFile.Remove(aPart);
            if (!aFile.Parts.Any())
            {
                RemoveFile(aFile);
            }
            else
            {
                FileSystem.DeleteFile(CompletePath(aPart));
            }
        }
Beispiel #4
0
        /// <summary>
        /// </summary>
        /// <param name="aFile"> </param>
        /// <param name="aSize"> </param>
        /// <returns> </returns>
        public FilePart Part(Core.File aFile, Int64 aSize)
        {
            FilePart returnPart = null;

            IEnumerable<FilePart> parts = aFile.Parts;
            if (!parts.Any() && aSize == 0)
            {
                returnPart = new FilePart {StartSize = aSize, CurrentSize = aSize, StopSize = aFile.Size, Checked = true};
                aFile.Add(returnPart);
            }
            else
            {
                // first search incomplete parts not in use
                foreach (FilePart part in parts)
                {
                    Int64 size = part.CurrentSize - Settings.Instance.FileRollbackBytes;
                    if (part.State == FilePart.States.Closed && (size < 0 ? 0 : size) == aSize)
                    {
                        returnPart = part;
                        break;
                    }
                }
                // if multi dling is enabled
                if (returnPart == null && Settings.Instance.EnableMultiDownloads)
                {
                    // now search incomplete parts in use
                    foreach (FilePart part in parts)
                    {
                        if (part.State == FilePart.States.Open)
                        {
                            // split the part
                            if (part.StartSize < aSize && part.StopSize > aSize)
                            {
                                returnPart = new FilePart {StartSize = aSize, CurrentSize = aSize, StopSize = part.StopSize};

                                // update previous part
                                part.StopSize = aSize;
                                part.Commit();
                                aFile.Add(returnPart);
                                break;
                            }
                        }
                    }
                }
            }
            return returnPart;
        }
Beispiel #5
0
 /// <summary>
 /// </summary>
 /// <param name="aPart"> </param>
 /// <returns> </returns>
 public string CompletePath(FilePart aPart)
 {
     return CompletePath(aPart.Parent) + aPart.StartSize;
 }
Beispiel #6
0
 /// <summary>
 /// </summary>
 /// <param name="aPart"> </param>
 /// <param name="aBytes"> </param>
 /// <returns> </returns>
 public Int64 CheckNextReferenceBytes(FilePart aPart, byte[] aBytes)
 {
     return CheckNextReferenceBytes(aPart, aBytes, false);
 }
Beispiel #7
0
 public bool Remove(FilePart aPart)
 {
     return base.Remove(aPart);
 }
Beispiel #8
0
 public bool Add(FilePart aPart)
 {
     return base.Add(aPart);
 }
 public PartBytesObject(FilePart aPart, byte[] aBytes)
 {
     Part = aPart;
     Bytes = aBytes;
 }