Ejemplo n.º 1
0
        public TypedData Process(TypedData data, IMutableProgressTracker progress, CancellationToken cancelToken)
        {
            switch (data.DataType) {
                case TypedDataType.Stream:
                    progress.Status = "Saving to file";

                    string path = Path.Combine(RootPath ?? "", data.Name);

                    using (var file = File.Open(path, FileMode.Create, FileAccess.Write)) {
                        var inputStream = (Stream) data.Data;

                        CopyStream(inputStream, file, progress);

                        var uriBuilder = new UriBuilder {
                            Scheme = Uri.UriSchemeFile,
                            Path = path
                        };

                        return TypedData.FromUri(uriBuilder.Uri, "output file");
                    }

                default:
                    return null;
            }
        }
Ejemplo n.º 2
0
        public override TypedData Process(TypedData data, IMutableProgressTracker progress, CancellationToken cancelToken)
        {
            switch (data.DataType) {
                case TypedDataType.Image:
                    var rawImageProgress = new MutableProgressTracker();
                    var uploadProgress = new MutableProgressTracker();

                    var aggregateProgress = new AggregateProgressTracker(new ProgressTrackerCollection {
                        { rawImageProgress, ImageWriter.ProcessTimeEstimate.ProgressWeight },
                        { uploadProgress, ProcessTimeEstimate.ProgressWeight },
                    });

                    aggregateProgress.BindTo(progress);

                    progress.Status = "Converting image";

                    using (var rawImageData = ImageWriter.Process(data, rawImageProgress, cancelToken)) {
                        progress.Status = "Uploading image";

                        return Upload(rawImageData, uploadProgress, cancelToken);
                    }

                default:
                    return null;
            }
        }
Ejemplo n.º 3
0
        public TypedData Process(TypedData data, IMutableProgressTracker progress, CancellationToken cancelToken)
        {
            progress.Status = "Taking a crop shot";

            CropShotWindow cropShotWindow = null;

            var thread = new Thread(() => {
                cropShotWindow = new CropShotWindow {
                    SourceImage = (Image) data.Data,
                    DataName = data.Name
                };

                cropShotWindow.ShowDialog();
            });

            // UI objects want to be in STA; make sure we're in STA
            thread.SetApartmentState(ApartmentState.STA);

            thread.Start();
            thread.Join();

            if (cropShotWindow.Data == null) {
                throw new CommandCanceledException(this);
            }

            progress.Progress = 1;

            return cropShotWindow.Data;
        }
Ejemplo n.º 4
0
        public static void BindTo(this IProgressTracker from, IMutableProgressTracker to)
        {
            from.ProgressUpdated += (sender, e) => {
                to.Progress = e.Progress;
            };

            from.StatusUpdated += (sender, e) => {
                to.Status = e.Status;
            };
        }
Ejemplo n.º 5
0
        public TypedData Upload(TypedData data, IMutableProgressTracker progress, CancellationToken cancelToken)
        {
            try {
                var response = HttpRequest.Execute(Uri, GetRequestData(data), RequestMethod, progress, cancelToken);

                return GetResponseData(response, data);
            } catch (OperationCanceledException e) {
                throw CommandCanceledException.Wrap(e, this);
            }
        }
Ejemplo n.º 6
0
        protected override Stream Encode(Bitmap image, IMutableProgressTracker progress, CancellationToken cancelToken)
        {
            var stream = new MemoryStream();
            var encoder = ImageCodecInfo.GetImageEncoders().First((enc) => enc.FormatID.Equals(EncoderFormat.Guid));
            image.Save(stream, encoder, null);

            stream.Position = 0;

            progress.Progress = 1;

            return stream;
        }
Ejemplo n.º 7
0
        public override TypedData Process(TypedData data, IMutableProgressTracker progress, CancellationToken cancelToken)
        {
            switch (data.DataType) {
                case TypedDataType.Text:
                    progress.Status = "Uploading text";

                    return Upload(data, progress, cancelToken);

                default:
                    return null;
            }
        }
Ejemplo n.º 8
0
        public TypedData Process(TypedData data, IMutableProgressTracker progress, CancellationToken cancelToken)
        {
            switch (data.DataType) {
                case TypedDataType.Image:
                    return TypedData.FromStream(Encode((Bitmap) data.Data, progress, cancelToken), data.Name);

                case TypedDataType.Stream:
                    return TypedData.FromImage(Decode((Stream) data.Data, progress, cancelToken), data.Name);

                default:
                    throw new NotSupportedException();
            }
        }
Ejemplo n.º 9
0
        public TypedData Process(TypedData data, IMutableProgressTracker progress, CancellationToken cancelToken)
        {
            switch (SourceType) {
                case ScreenshotSourceType.EntireDesktop:
                    var image = ScreenCapturer.CaptureEntireDesktop();

                    progress.Progress = 1;  // Can't really track progress on this...

                    return TypedData.FromImage(image, "screenshot");

                default:
                    return null;
            }
        }
Ejemplo n.º 10
0
        public TypedData Process(TypedData data, IMutableProgressTracker progress, CancellationToken cancelToken)
        {
            Action operation;
            bool success = false;
            Exception exception = null;

            if (data == null) {
                operation = new Action(() => {
                    progress.Status = "Reading clipboard";

                    try {
                        data = GetClipboardData();
                        success = true;
                    } catch (Exception e) {
                        exception = e;
                    }
                });
            } else {
                operation = new Action(() => {
                    progress.Status = "Saving to clipboard";

                    try {
                        SetClipboardData(data);
                        success = true;
                    } catch (Exception e) {
                        exception = e;
                    }
                });
            }

            var thread = new Thread(new ThreadStart(operation));

            // Clipboard object uses COM; make sure we're in STA
            thread.SetApartmentState(ApartmentState.STA);

            thread.Start();
            thread.Join();

            if (!success) {
                if (exception == null) {
                    throw new CommandCanceledException(this);
                }

                throw exception;
            }

            progress.Progress = 1;

            return data;
        }
Ejemplo n.º 11
0
        public static HttpWebResponse Execute(Uri uri, Stream requestData, IMutableProgressTracker progress, CancellationToken cancelToken)
        {
            // QUICK HACK

            var requestProgress = new MutableProgressTracker();
            var responseProgress = new MutableProgressTracker();

            var aggregateProgress = new AggregateProgressTracker(new ProgressTrackerCollection {
                { requestProgress,  TimeEstimates.LongOperation.ProgressWeight },
                { responseProgress, TimeEstimates.ShortOperation.ProgressWeight },
            });

            aggregateProgress.BindTo(progress);

            try {
                var request = CreateRequest(uri, @"POST");
                request.ContentLength = requestData.Length;

                using (var requestStream = request.GetRequestStream())
                using (var progressStream = new ProgressTrackingStreamWrapper(requestStream, request.ContentLength)) {
                    progressStream.BindTo(requestProgress);

                    requestData.CopyTo(progressStream, cancelToken);
                }

                bool canCancel = true;

                cancelToken.Register(() => {
                    if (canCancel) {
                        request.Abort();
                    }
                });

                var response = (HttpWebResponse) request.GetResponse();

                responseProgress.Progress = 1; // TODO HTTP download Progress

                canCancel = false;

                return response;
            } catch (WebException e) {
                if (e.Status == WebExceptionStatus.RequestCanceled) {
                    throw new OperationCanceledException(e.Message, e, cancelToken);
                }

                throw new OperationCanceledException(e.Message, e, cancelToken);
            }
        }
Ejemplo n.º 12
0
        public TypedData Process(TypedData data, IMutableProgressTracker progress, CancellationToken cancelToken)
        {
            if (data.DataType != TypedDataType.Image) {
                throw new ArgumentException("data must be an image", "data");
            }

            if (!IsCodecValid(Codec)) {
                throw new InvalidOperationException("Codec must be non-null and support bitmap encoding");
            }

            // No dispose
            var processedImage = Codec.Process(data, progress, cancelToken);

            var name = processedImage.Name;
            return new TypedData(processedImage.DataType, processedImage.Data, GetDataName(name));
        }
Ejemplo n.º 13
0
        public TypedData Process(TypedData data, IMutableProgressTracker progress, CancellationToken cancelToken)
        {
            // ToList is needed to prevent new MPT's from being
            // created for each loop of commandProgressTrackers
            var commandProgressTrackers = this.commands.Select((command) => new {
                ProgressTracker = new MutableProgressTracker(),
                Command = command
            }).ToList();

            var aggregateProgress = new AggregateProgressTracker(commandProgressTrackers.Select(
                (cpt) => new ProgressTrackerCollectionItem(
                    cpt.ProgressTracker,
                    cpt.Command.ProcessTimeEstimate.ProgressWeight
                )
            ));

            aggregateProgress.BindTo(progress);

            bool shouldDisposeData = false;

            foreach (var cpt in commandProgressTrackers) {
                cancelToken.ThrowIfCancellationRequested();

                TypedData newData;

                try {
                    cancelToken.ThrowIfCancellationRequested();

                    if (!cpt.Command.IsValid()) {
                        throw new CommandInvalidException(cpt.Command);
                    }

                    newData = cpt.Command.Process(data, cpt.ProgressTracker, cancelToken);

                    cancelToken.ThrowIfCancellationRequested();
                } finally {
                    if (shouldDisposeData && data != null) {
                        data.Dispose();
                    }
                }

                data = newData;
                shouldDisposeData = true;
            }

            return data;
        }
Ejemplo n.º 14
0
        private CommandTask(ICommand command, CancellationTokenSource cancellationTokenSource, bool ownsCancellationTokenSource)
        {
            if (command == null) {
                throw new ArgumentNullException("command");
            }

            if (cancellationTokenSource == null) {
                throw new ArgumentNullException("cancellationTokenSource");
            }

            this.command = command;
            this.cancellationTokenSource = cancellationTokenSource;
            this.ownsCancellationTokenSource = ownsCancellationTokenSource;

            this.progressTracker = new MutableProgressTracker();
            this.publicProgressTracker = new ReadOnlyProgressTracker(this.progressTracker);
        }
Ejemplo n.º 15
0
        public TypedData Process(TypedData data, IMutableProgressTracker progress, CancellationToken cancelToken)
        {
            progress.Status = "Uploading data";

            var galleryProgress = new MutableProgressTracker();
            var uploadProgress = new MutableProgressTracker();

            var aggregateProgress = new AggregateProgressTracker(new ProgressTrackerCollection {
                { galleryProgress, TimeEstimates.ShortOperation.ProgressWeight },
                { uploadProgress,  TimeEstimates.LongOperation.ProgressWeight },
            });

            aggregateProgress.BindTo(progress);

            var galleryAccessData = CreateGallery(galleryProgress, cancelToken);

            return UploadData(galleryAccessData, data, uploadProgress, cancelToken);
        }
Ejemplo n.º 16
0
        public override void Execute(IMutableProgressTracker progress, CancellationToken cancelToken)
        {
            var commandChain = new CommandChain(
                new Screenshot(),
                Renamer,
                new CropShot(),
                ImageUploader,
                new Clipboard()
            );

            using (commandChain.Process(null, progress, cancelToken)) {
                // Auto-dispose
            }

            progress.Status = "Image URL saved to clipboard";
        }
Ejemplo n.º 17
0
 public TypedData Process(TypedData data, IMutableProgressTracker progress, CancellationToken cancelToken)
 {
     return new CommandChain(ImageWriter, FileUploader).Process(data, progress, cancelToken);
 }
Ejemplo n.º 18
0
        private void UploadData(Stream stream, string fileName, IMutableProgressTracker progress, CancellationToken cancelToken)
        {
            using (var client = new FTPSClient()) {
                try {
                    progress.Status = "Connecting to FTP";

                    client.Connect(Host, Port, new NetworkCredential(UserName, Password), 0, null, null, 0, 0, 0, Timeout);
                } catch (TimeoutException e) {
                    throw new CommandCanceledException(this, "Connection to FTP server timed out", e);
                } catch (IOException e) {
                    throw new CommandCanceledException(this, "Connection to FTP server failed", e);
                }

                using (var outStream = client.PutFile(GetRemotePathName(fileName)))
                using (var outStreamWrapper = new ProgressTrackingStreamWrapper(outStream, stream.Length)) {
                    outStreamWrapper.BindTo(progress);

                    progress.Status = "Uploading file to FTP";

                    stream.CopyTo(outStreamWrapper, cancelToken);
                }
            }
        }
Ejemplo n.º 19
0
        private static string FetchToken(IMutableProgressTracker progress, CancellationToken cancelToken)
        {
            var response = HttpRequest.Execute(new UriBuilder(ApiUri) {
                Query = HttpUtility.ToQueryString(new Dictionary<string, string> {
                    { "method", "auth.createtoken" },
                    { "api_key", Properties.Settings.Default.sendSpaceApiKey },
                    { "api_version", "1.0" },
                    { "response_format", "XML" },
                    { "app_version", "NoCap" },
                }),
            }.Uri, null, HttpRequestMethod.Get, progress, cancelToken);

            var xmlDoc = GetXml(response);

            return xmlDoc.SelectSingleNode("/result/token").InnerText;
        }
Ejemplo n.º 20
0
 protected virtual Stream Encode(Bitmap image, IMutableProgressTracker progress, CancellationToken cancelToken)
 {
     throw new NotSupportedException();
 }
Ejemplo n.º 21
0
        public TypedData Process(TypedData data, IMutableProgressTracker progress, CancellationToken cancelToken)
        {
            string fileName = data.Name;
            var stream = (Stream) data.Data;

            UploadData(stream, fileName, progress, cancelToken);

            progress.Progress = 1;

            string result;
            bool success = TryGetResultString(fileName, out result);

            return TypedData.FromUri(new Uri(success && !string.IsNullOrWhiteSpace(result) ? result : data.Name, UriKind.Absolute), fileName);
        }
Ejemplo n.º 22
0
        private static Uri FetchUploadUri(string sessionKey, out string uploadId, out string uploadInfo, out ulong maxFileSize, IMutableProgressTracker progress, CancellationToken cancelToken)
        {
            var response = HttpRequest.Execute(new UriBuilder(ApiUri) {
                Query = HttpUtility.ToQueryString(new Dictionary<string, string> {
                    { "method", "upload.getInfo" },
                    { "session_key", sessionKey },
                }),
            }.Uri, null, HttpRequestMethod.Get, progress, cancelToken);

            var xmlDoc = GetXml(response);

            uploadId = xmlDoc.SelectSingleNode("/result/upload/@upload_identifier").InnerText;
            uploadInfo = xmlDoc.SelectSingleNode("/result/upload/@extra_info").InnerText;
            maxFileSize = ulong.Parse(xmlDoc.SelectSingleNode("/result/upload/@max_file_size").InnerText);

            return new Uri(xmlDoc.SelectSingleNode("/result/upload/@url").InnerText, UriKind.Absolute);
        }
Ejemplo n.º 23
0
 protected virtual Bitmap Decode(Stream stream, IMutableProgressTracker progress, CancellationToken cancelToken)
 {
     throw new NotSupportedException();
 }
Ejemplo n.º 24
0
        private static Uri UploadData(TypedData data, Uri uri, string uploadId, string uploadInfo, ulong maxFileSize, IMutableProgressTracker progress, CancellationToken cancelToken)
        {
            var postData = new MultipartDataBuilder()
                .KeyValuePair("MAX_FILE_SIZE", maxFileSize.ToString())
                .KeyValuePair("UPLOAD_IDENTIFIER", uploadId)
                .KeyValuePair("extra_info", uploadInfo)
                .File((Stream) data.Data, "userfile", data.Name)
                .GetData();

            var response = HttpRequest.Execute(uri, postData, HttpRequestMethod.Post, progress, cancelToken);

            string text = HttpRequest.GetResponseText(response);
            var match = new Regex(@"\bfile_id=(?<FileId>\S+)\b").Match(text);

            return new Uri(string.Format(OutputFileUriFormat, match.Groups["FileId"].Value), UriKind.Absolute);
        }
Ejemplo n.º 25
0
        private static void CopyStream(Stream inputStream, Stream outputStream, IMutableProgressTracker progress)
        {
            long originalByteCount;
            long bytesProcessed = 0;

            try {
                originalByteCount = inputStream.Length;
            } catch (NotSupportedException) {
                // .Length is not supported; length is undefined
                originalByteCount = -1;
            }

            const int bufferSize = 1024;
            byte[] readBuffer = new byte[bufferSize];

            while (true) {
                if (originalByteCount > 0) {
                    progress.Progress = (double) bytesProcessed / originalByteCount;
                }

                int bytesRead = inputStream.Read(readBuffer, 0, readBuffer.Length);

                outputStream.Write(readBuffer, 0, bytesRead);
                bytesProcessed += bufferSize;

                if (bytesRead < bufferSize) {
                    // We hit end-of-file
                    break;
                }
            }

            progress.Progress = 1;
        }
Ejemplo n.º 26
0
        private string FetchSessionKey(string token, IMutableProgressTracker progress, CancellationToken cancelToken)
        {
            var response = HttpRequest.Execute(new UriBuilder(ApiUri) {
                Query = HttpUtility.ToQueryString(new Dictionary<string, string> {
                    { "method", "auth.login" },
                    { "token", token },
                    { "user_name", UserName },
                    { "tokened_password", GetTokenedPassword(token, Password) },
                }),
            }.Uri, null, HttpRequestMethod.Get, progress, cancelToken);

            var xmlDoc = GetXml(response);

            return xmlDoc.SelectSingleNode("/result/session_key").InnerText;
        }
Ejemplo n.º 27
0
        TypedData ICommand.Process(TypedData data, IMutableProgressTracker progress, CancellationToken cancelToken)
        {
            Execute(progress, cancelToken);

            return null;
        }
Ejemplo n.º 28
0
 public abstract void Execute(IMutableProgressTracker progress, CancellationToken cancelToken);
Ejemplo n.º 29
0
        public TypedData Process(TypedData data, IMutableProgressTracker progress, CancellationToken cancelToken)
        {
            if (string.IsNullOrEmpty(UserName)) {
                throw new InvalidOperationException("User name must be set");
            }

            if (Password == null) {
                throw new InvalidOperationException("Password must be set");
            }

            var progressTrackerCollection = new ProgressTrackerCollection {
                { new MutableProgressTracker(), 1 },
                { new MutableProgressTracker(), 1 },
                { new MutableProgressTracker(), 2 },
                { new MutableProgressTracker(), 100 },
            };

            var progressTrackers = progressTrackerCollection.Select((item) => item.ProgressTracker).OfType<IMutableProgressTracker>().ToArray();

            var aggregateProgressTracker = new AggregateProgressTracker(progressTrackerCollection);
            aggregateProgressTracker.BindTo(progress);

            string token = FetchToken(progressTrackers[0], cancelToken);
            string sessionKey = FetchSessionKey(token, progressTrackers[1], cancelToken);

            string uploadId, uploadInfo;
            ulong maxFileSize;
            var uploadUri = FetchUploadUri(sessionKey, out uploadId, out uploadInfo, out maxFileSize, progressTrackers[2], cancelToken);

            var uri = UploadData(data, uploadUri, uploadId, uploadInfo, maxFileSize, progressTrackers[3], cancelToken);

            return TypedData.FromUri(uri, data.Name);
        }
Ejemplo n.º 30
0
        public override void Execute(IMutableProgressTracker progress, CancellationToken cancelToken)
        {
            var clipboard = new Clipboard();
            var router = new DataRouter {
                { TypedDataType.Image, ImageUploader },
                { TypedDataType.Text, TextUploader },
                { TypedDataType.Uri, UrlShortener },
                { TypedDataType.Stream, FileUploader },
            };

            var commandChain = new CommandChain(
                clipboard,
                router,
                clipboard
            );

            using (commandChain.Process(null, progress, cancelToken)) {
                // Auto-dispose
            }

            progress.Status = "URL saved to clipboard";
        }