private void OnUploading(object state) { UploadablePart part = null; lock (_itemsSyncRoot) { for (var i = 0; i < _items.Count; i++) { var item = _items[i]; if (item.Canceled) { _items.RemoveAt(i--); try { _eventAggregator.Publish(new UploadingCanceledEventArgs(item)); } catch (Exception e) { TLUtils.WriteException(e); } } } foreach (var item in _items) { part = item.Parts.FirstOrDefault(x => x.Status == PartStatus.Ready); if (part != null) { part.Status = PartStatus.Processing; break; } } } if (part != null) { var bytes = FileUtils.ReadBytes(part.ParentItem.IsoFileName, part.Position, part.Count); part.SetBuffer(bytes); bool result = PutFile(part.ParentItem.FileId, part.FilePart, part.Bytes); while (!result) { if (part.ParentItem.Canceled) { return; } result = PutFile(part.ParentItem.FileId, part.FilePart, part.Bytes); } part.ClearBuffer(); // indicate progress // indicate complete 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) { Execute.BeginOnThreadPool(() => _eventAggregator.Publish(part.ParentItem)); } else { Execute.BeginOnThreadPool(() => _eventAggregator.Publish(new UploadProgressChangedEventArgs(part.ParentItem, progress))); } } } else { var currentWorker = (Worker)state; currentWorker.Stop(); } }
private void OnUploading(object state) { UploadablePart part = null; lock (_itemsSyncRoot) { for (var i = 0; i < _items.Count; i++) { var item = _items[i]; if (item.Canceled) { _items.RemoveAt(i--); try { _eventAggregator.Publish(new UploadingCanceledEventArgs(item)); } catch (Exception e) { TLUtils.WriteException(e); } } } foreach (var item in _items) { part = item.Parts.FirstOrDefault(x => x.Status == PartStatus.Ready); if (part != null) { part.Status = PartStatus.Processing; break; } } } if (part != null) { var bytes = part.Bytes; var fileName = part.ParentItem.IsoFileName; if (!string.IsNullOrEmpty(fileName)) { bytes = FileUtils.ReadBytes(fileName, part.Position, part.Count); } #if WP8 if (bytes == null) { var file = part.ParentItem.File; Tuple<bool, byte[]> result = null; if (file != null) { var task = FileUtils.FillBuffer(file, part); task.Wait(); result = task.Result; } if (result == null) { part.Status = PartStatus.Ready; return; } if (!result.Item1) { part.ParentItem.FileNotFound = true; part.Status = PartStatus.Processed; FileUtils.NotifyProgress(_itemsSyncRoot, _items, part, _eventAggregator); return; } bytes = result.Item2; } #endif if (part.ParentItem.IsSmallFile) { var result = PutFile(part.ParentItem.FileId, part.FilePart, bytes); while (!result) { if (part.ParentItem.Canceled) { return; } result = PutFile(part.ParentItem.FileId, part.FilePart, bytes); } } else { var result = PutBigFile(part.ParentItem.FileId, part.FilePart, new TLInt(part.ParentItem.Parts.Count), bytes); while (!result) { if (part.ParentItem.Canceled) { return; } result = PutBigFile(part.ParentItem.FileId, part.FilePart, new TLInt(part.ParentItem.Parts.Count), bytes); } } part.ClearBuffer(); FileUtils.NotifyProgress(_itemsSyncRoot, _items, part, _eventAggregator); } else { var currentWorker = (Worker)state; currentWorker.Stop(); } }
private void OnUploading(object state) { UploadablePart part = null; lock (_itemsSyncRoot) { for (var i = 0; i < _items.Count; i++) { var item = _items[i]; if (item.IsCancelled) { _items.RemoveAt(i--); try { // TODO: verify if (item.Callback != null) { item.Callback.TrySetResult(null); } else { _eventAggregator.Publish(new UploadingCanceledEventArgs(item)); } } catch (Exception e) { TLUtils.WriteException(e); } } } foreach (var item in _items) { part = item.Parts.FirstOrDefault(x => x.Status == PartStatus.Ready); if (part != null) { part.Status = PartStatus.Processing; break; } } } if (part != null) { var bytes = FileUtils.ReadTemporaryBytes(part.ParentItem.FileName, part.Position, part.Count); part.SetBuffer(bytes); //bool result = PutFile(part.ParentItem.FileId, part.FilePart, part.Bytes); //while (!result) //{ // if (part.ParentItem.Canceled) // { // return; // } // result = PutFile(part.ParentItem.FileId, part.FilePart, part.Bytes); //} if (part.ParentItem.IsSmallFile) { bool result = PutFile(part.ParentItem.FileId, part.FilePart, bytes); while (!result) { if (part.ParentItem.IsCancelled) { return; } result = PutFile(part.ParentItem.FileId, part.FilePart, bytes); } } else { bool result = PutBigFile(part.ParentItem.FileId, part.FilePart, part.ParentItem.Parts.Count, bytes); while (!result) { if (part.ParentItem.IsCancelled) { return; } result = PutBigFile(part.ParentItem.FileId, part.FilePart, part.ParentItem.Parts.Count, bytes); } } part.ClearBuffer(); // indicate progress // indicate complete bool isComplete = false; bool isCanceled; var progress = 0.0; lock (_itemsSyncRoot) { part.Status = PartStatus.Processed; isCanceled = part.ParentItem.IsCancelled; 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) { if (part.ParentItem.Callback != null) { part.ParentItem.Progress.Report(1.0); part.ParentItem.Callback.TrySetResult(part.ParentItem); } else { Execute.BeginOnThreadPool(() => _eventAggregator.Publish(part.ParentItem)); } _statsService.IncrementSentItemsCount(_mtProtoService.NetworkType, _dataType, 1); } else { if (part.ParentItem.Callback != null) { part.ParentItem.Progress.Report(progress); } else { Execute.BeginOnThreadPool(() => _eventAggregator.Publish(new UploadProgressChangedEventArgs(part.ParentItem, progress))); } } } } else { var currentWorker = (Worker)state; currentWorker.Stop(); } }