Example #1
0
        private static List <UploadablePart> GetItemParts(UploadableItem item, int size)
        {
            var chunkSize  = GetChunkSize(size);
            var partsCount = GetPartsCount(size, chunkSize);
            var parts      = new List <UploadablePart>(partsCount);

            for (var i = 0; i < partsCount; i++)
            {
                var part = new UploadablePart(item, new TLInt(i), i * chunkSize, Math.Min(chunkSize, (long)size - i * chunkSize));
                parts.Add(part);
            }

            item.IsSmallFile = size < Constants.SmallFileMaxSize; // size < chunkSize;

            return(parts);
        }
Example #2
0
        public static void NotifyProgress(object itemsSyncRoot, IList <UploadableItem> items, UploadablePart part, ITelegramEventAggregator eventAggregator)
        {
            bool   flag     = false;
            double progress = 0.0;
            bool   canceled;

            lock (itemsSyncRoot)
            {
                part.Status = PartStatus.Processed;
                canceled    = part.ParentItem.IsCancelled;
                if (!canceled)
                {
                    flag = Enumerable.All(part.ParentItem.Parts, (UploadablePart x) => x.Status == PartStatus.Processed);
                    if (!flag)
                    {
                        double num  = (double)Enumerable.Count <UploadablePart>(part.ParentItem.Parts, (UploadablePart x) => x.Status == PartStatus.Processed);
                        double num2 = (double)part.ParentItem.Parts.Count;
                        progress = num / num2;
                    }
                    else
                    {
                        items.Remove(part.ParentItem);
                    }
                }
            }
            if (!canceled)
            {
                if (flag)
                {
                    FileUtils.SwitchIdleDetectionMode(true);
                    Execute.BeginOnThreadPool(() => eventAggregator.Publish(part.ParentItem));

                    // TODO: verify
                    if (part.ParentItem.Callback != null)
                    {
                        part.ParentItem.Callback.TrySetResult(part.ParentItem);
                    }

                    return;
                }
                if (part.ParentItem.FileNotFound)
                {
                    return;
                }
                UploadProgressChangedEventArgs args = new UploadProgressChangedEventArgs(part.ParentItem, progress);
                Execute.BeginOnThreadPool(delegate
                {
                    eventAggregator.Publish(args);
                });

                if (part.ParentItem.Progress != null)
                {
                    part.ParentItem.Progress.Report(progress);
                }
            }
        }
Example #3
0
        public static void NotifyProgress(object itemsSyncRoot, IList <UploadableItem> items, UploadablePart part, ITelegramEventAggregator eventAggregator)
        {
            bool isComplete = false;
            bool isCanceled;
            var  progress = 0.0;

            lock (itemsSyncRoot)
            {
                part.Status = PartStatus.Processed;
                isCanceled  = part.ParentItem.Canceled;
                if (!isCanceled)
                {
                    isComplete = part.ParentItem.Parts.All(x => x.Status == PartStatus.Processed);
                    if (!isComplete)
                    {
                        double uploadedCount = part.ParentItem.Parts.Count(x => x.Status == PartStatus.Processed);
                        double totalCount    = part.ParentItem.Parts.Count;
                        progress = uploadedCount / totalCount;
                    }
                    else
                    {
                        items.Remove(part.ParentItem);
                    }
                }
            }

            if (!isCanceled)
            {
                if (isComplete)
                {
                    SwitchIdleDetectionMode(true);
                    Execute.BeginOnThreadPool(() => eventAggregator.Publish(part.ParentItem));
                }
                else
                {
                    if (part.ParentItem.FileNotFound)
                    {
                        return;
                    }

                    var args = new UploadProgressChangedEventArgs(part.ParentItem, progress);
                    Execute.BeginOnThreadPool(() => eventAggregator.Publish(args));
                }
            }
        }
Example #4
0
        public static async Task <Tuple <bool, byte[]> > FillBuffer(IStorageFile file, UploadablePart part)
        {
            try
            {
                if (part.ParentItem.FileNotFound)
                {
                    return(new Tuple <bool, byte[]>(false, null));
                }

                System.Diagnostics.Debug.WriteLine("FillBuffer part=" + part.FilePart);
                using (var inStream = await file.OpenSequentialReadAsync())
                {
                    using (var stream = inStream.AsStreamForRead())
                    //using (var inStream = stream.GetInputStreamAt((ulong) part.Position))
                    {
                        stream.Seek(part.Position, SeekOrigin.Begin);
                        var bytes = new byte[part.Count];

                        stream.Read(bytes, 0, bytes.Length);
                        //using (var reader = new DataReader(inStream))
                        //{
                        //    await reader.LoadAsync((uint) bytes.Length);
                        //    reader.ReadBytes(bytes);
                        //}

                        // encrypting part
                        if (part.ParentItem.Key != null &&
                            part.ParentItem.IV != null)
                        {
                            var key = part.ParentItem.Key;
                            var iv  = part.FilePart.Value == 0 ? part.ParentItem.IV : part.IV;

                            if (iv == null)
                            {
                                return(new Tuple <bool, byte[]>(true, null));
                            }

                            byte[] nextIV;

                            var encryptedBytes = Utils.AesIge(bytes, key.Data, iv.Data, true, out nextIV);
                            bytes = encryptedBytes;

                            var nextPartId = part.FilePart.Value + 1;
                            if (part.ParentItem.Parts.Count > nextPartId)
                            {
                                part.ParentItem.Parts[nextPartId].IV = TLString.FromBigEndianData(nextIV);
                            }
                        }

                        return(new Tuple <bool, byte[]>(true, bytes));
                    }
                }
            }
            catch (FileNotFoundException ex)
            {
                Logs.Log.Write(string.Format("FileUtils.FillBuffer bytes=null position={0} count={1} ex={2}", part.Position, part.Count, ex));
                Execute.ShowDebugMessage("FillBuffer FileNotFoundException\n" + ex);
                return(new Tuple <bool, byte[]>(false, null));
            }
            catch (Exception ex)
            {
                System.Diagnostics.Debug.WriteLine("FillBuffer ex part=" + part.FilePart);
                Logs.Log.Write(string.Format("FileUtils.FillBuffer bytes=null position={0} count={1} ex={2}", part.Position, part.Count, ex));
                Execute.ShowDebugMessage("FillBuffer Exception\n" + ex);
                return(new Tuple <bool, byte[]>(true, null));
            }
        }
Example #5
0
        public static async Task <Tuple <bool, byte[]> > FillBuffer(IStorageFile file, UploadablePart part)
        {
            try
            {
                if (part.ParentItem.FileNotFound)
                {
                    return(new Tuple <bool, byte[]>(false, null));
                }

                using (var stream = await file.OpenAsync(FileAccessMode.Read))
                {
                    using (var inStream = stream.GetInputStreamAt((ulong)part.Position))
                    {
                        var bytes = new byte[part.Count];
                        using (var reader = new DataReader(inStream))
                        {
                            await reader.LoadAsync((uint)bytes.Length);

                            reader.ReadBytes(bytes);
                        }

                        // encrypting part
                        if (part.ParentItem.Key != null &&
                            part.ParentItem.IV != null)
                        {
                            var key = part.ParentItem.Key;
                            var iv  = part.FilePart.Value == 0 ? part.ParentItem.IV : part.IV;

                            if (iv == null)
                            {
                                return(new Tuple <bool, byte[]>(true, null));
                            }

                            byte[] nextIV;

                            var encryptedBytes = Utils.AesIge(bytes, key.Data, iv.Data, true, out nextIV);
                            bytes = encryptedBytes;

                            var nextPartId = part.FilePart.Value + 1;
                            if (part.ParentItem.Parts.Count > nextPartId)
                            {
                                part.ParentItem.Parts[nextPartId].IV = TLString.FromBigEndianData(nextIV);
                            }
                        }

                        return(new Tuple <bool, byte[]>(true, bytes));
                    }
                }
            }
            catch (FileNotFoundException ex)
            {
                Execute.ShowDebugMessage("FillBuffer FileNotFoundException\n" + ex);
                return(new Tuple <bool, byte[]>(false, null));
            }
            catch (Exception ex)
            {
                Execute.ShowDebugMessage("FillBuffer Exception\n" + ex);
                return(new Tuple <bool, byte[]>(true, null));
            }
        }