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); }
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); } } }
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)); } } }
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)); } }
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)); } }