/// <summary>
        /// Start the preview on the Control.
        /// </summary>
        /// <param name="dataSource">Stream reference to access source file.</param>
        public override void DoPreview <T>(T dataSource)
        {
            CleanupWebView2UserDataFolder();

            string svgData = null;
            bool   blocked = false;

            try
            {
                using (var stream = new ReadonlyStream(dataSource as IStream))
                {
                    using (var reader = new StreamReader(stream))
                    {
                        svgData = reader.ReadToEnd();
                    }
                }

                blocked = SvgPreviewHandlerHelper.CheckBlockedElements(svgData);
            }
            catch (Exception ex)
            {
                PreviewError(ex, dataSource);
                return;
            }

            try
            {
                svgData = SvgPreviewHandlerHelper.AddStyleSVG(svgData);
            }
            catch (Exception ex)
            {
                PowerToysTelemetry.Log.WriteEvent(new SvgFilePreviewError {
                    Message = ex.Message
                });
            }

            InvokeOnControlThread(() =>
            {
                try
                {
                    _infoBarAdded = false;

                    // Add a info bar on top of the Preview if any blocked element is present.
                    if (blocked)
                    {
                        _infoBarAdded = true;
                        AddTextBoxControl(Properties.Resource.BlockedElementInfoText);
                    }

                    AddWebViewControl(svgData);
                    Resize += FormResized;
                    base.DoPreview(dataSource);
                    PowerToysTelemetry.Log.WriteEvent(new SvgFilePreviewed());
                }
                catch (Exception ex)
                {
                    PreviewError(ex, dataSource);
                }
            });
        }
Exemple #2
0
        /// <inheritdoc/>
        public void GetThumbnail(uint cx, out IntPtr phbmp, out WTS_ALPHATYPE pdwAlpha)
        {
            phbmp    = IntPtr.Zero;
            pdwAlpha = WTS_ALPHATYPE.WTSAT_UNKNOWN;

            if (cx == 0 || cx > MaxThumbnailSize)
            {
                return;
            }

            using (var stream = new ReadonlyStream(this.Stream as IStream))
            {
                using (var memStream = new MemoryStream())
                {
                    stream.CopyTo(memStream);

                    memStream.Position = 0;

                    using (Bitmap thumbnail = GetThumbnail(memStream, cx))
                    {
                        if (thumbnail != null && thumbnail.Size.Width > 0 && thumbnail.Size.Height > 0)
                        {
                            phbmp    = thumbnail.GetHbitmap(System.Drawing.Color.Transparent);
                            pdwAlpha = WTS_ALPHATYPE.WTSAT_ARGB;
                        }
                    }
                }
            }
        }
        public void StreamWrapperShouldSetValidBufferWhenReadCalled(int count, int offset)
        {
            // Arrange
            var inputBuffer = new byte[1024];
            var streamBytes = new byte[count];

            for (int i = 0; i < count; i++)
            {
                streamBytes[i] = (byte)i;
            }

            var streamMock = new Mock <IStream>();

            streamMock
            .Setup(x => x.Read(It.IsAny <byte[]>(), It.IsAny <int>(), It.IsAny <IntPtr>()))
            .Callback <byte[], int, IntPtr>((buffer, countToRead, bytesReadPtr) =>
            {
                Array.Copy(streamBytes, 0, buffer, 0, streamBytes.Length);
                Marshal.WriteInt32(bytesReadPtr, count);
            });

            using (var streamWrapper = new ReadonlyStream(streamMock.Object))
            {
                // Act
                var bytesRead = streamWrapper.Read(inputBuffer, offset, count);

                // Assert
                CollectionAssert.AreEqual(streamBytes, inputBuffer.Skip(offset).Take(count).ToArray());
                Assert.AreEqual(count, bytesRead);
            }
        }
Exemple #4
0
        /// <inheritdoc/>
        public void GetThumbnail(uint cx, out IntPtr phbmp, out WTS_ALPHATYPE pdwAlpha)
        {
            phbmp    = IntPtr.Zero;
            pdwAlpha = WTS_ALPHATYPE.WTSAT_UNKNOWN;

            if (cx == 0 || cx > MaxThumbnailSize)
            {
                return;
            }

            using var dataStream = new ReadonlyStream(this.Stream as IStream);
            using var memStream  = new MemoryStream();

            dataStream.CopyTo(memStream);
            memStream.Position = 0;

            // AsRandomAccessStream() extension method from System.Runtime.WindowsRuntime
            var pdf = PdfDocument.LoadFromStreamAsync(memStream.AsRandomAccessStream()).GetAwaiter().GetResult();

            if (pdf.PageCount > 0)
            {
                using var page = pdf.GetPage(0);

                var image = PageToImage(page, cx);

                using Bitmap thumbnail = new Bitmap(image);

                phbmp    = thumbnail.GetHbitmap();
                pdwAlpha = WTS_ALPHATYPE.WTSAT_RGB;
            }
        }
        /// <inheritdoc/>
        public void GetThumbnail(uint cx, out IntPtr phbmp, out WTS_ALPHATYPE pdwAlpha)
        {
            phbmp    = IntPtr.Zero;
            pdwAlpha = WTS_ALPHATYPE.WTSAT_UNKNOWN;

            if (cx == 0 || cx > MaxThumbnailSize)
            {
                return;
            }

            string svgData = null;

            using (var stream = new ReadonlyStream(this.Stream as IStream))
            {
                using (var reader = new StreamReader(stream))
                {
                    svgData = reader.ReadToEnd();
                }
            }

            if (svgData != null)
            {
                using (Bitmap thumbnail = GetThumbnail(svgData, cx))
                {
                    if (thumbnail != null && thumbnail.Size.Width > 0 && thumbnail.Size.Height > 0)
                    {
                        phbmp    = thumbnail.GetHbitmap();
                        pdwAlpha = WTS_ALPHATYPE.WTSAT_RGB;
                    }
                }
            }
        }
        public void StreamWrapperShouldCallIStreamSeekWithValidArgumentsWhenSeekCalled(long offset, SeekOrigin origin)
        {
            // Arrange
            int expectedDwOrigin = 0;

            switch (origin)
            {
            case SeekOrigin.Begin:
                expectedDwOrigin = 0;
                break;

            case SeekOrigin.Current:
                expectedDwOrigin = 1;
                break;

            case SeekOrigin.End:
                expectedDwOrigin = 2;
                break;
            }

            var streamMock = new Mock <IStream>();

            using (var streamWrapper = new ReadonlyStream(streamMock.Object))
            {
                // Act
                streamWrapper.Seek(offset, origin);

                // Assert
                streamMock.Verify(_ => _.Seek(It.Is <long>(actualOffset => actualOffset == offset), It.Is <int>(actualDwOrigin => actualDwOrigin == expectedDwOrigin), It.IsAny <IntPtr>()), Times.Once);
            }
        }
        public void StreamWrapperShouldReturnValidPosition()
        {
            // Arrange
            int  expectedDwOrigin = 1; // STREAM_SEEK_CUR
            long expectedOffset   = 0;
            long currPosition     = 5;
            var  streamMock       = new Mock <IStream>();

            streamMock
            .Setup(x => x.Seek(It.IsAny <long>(), It.IsAny <int>(), It.IsAny <IntPtr>()))
            .Callback <long, int, IntPtr>((dlibMove, dwOrigin, plibNewPosition) =>
            {
                Marshal.WriteInt64(plibNewPosition, currPosition);
            });

            using (var streamWrapper = new ReadonlyStream(streamMock.Object))
            {
                // Act
                var actualPosition = streamWrapper.Position;

                // Assert
                Assert.AreEqual(actualPosition, currPosition);
                streamMock.Verify(_ => _.Seek(It.Is <long>(offset => offset == expectedOffset), It.Is <int>(dworigin => dworigin == expectedDwOrigin), It.IsAny <IntPtr>()), Times.Once);
            }
        }
        public void StreamWrapper_ShouldReturnCanWriteFalse()
        {
            // Arrange
            var streamMock = new Mock <IStream>();

            // Act
            var streamWrapper = new ReadonlyStream(streamMock.Object);

            // Assert
            Assert.AreEqual(streamWrapper.CanWrite, false);
        }
        public void StreamWrapperShouldReturnCanSeekTrue()
        {
            // Arrange
            var streamMock = new Mock <IStream>();

            // Act
            using (var streamWrapper = new ReadonlyStream(streamMock.Object))
            {
                // Assert
                Assert.AreEqual(streamWrapper.CanSeek, true);
            }
        }
Exemple #10
0
        /// <summary>
        /// Start the preview on the Control.
        /// </summary>
        /// <param name="dataSource">Stream reference to access source file.</param>
        public override void DoPreview <T>(T dataSource)
        {
            string svgData = null;
            bool   blocked = false;

            try
            {
                using (var stream = new ReadonlyStream(dataSource as IStream))
                {
                    using (var reader = new StreamReader(stream))
                    {
                        svgData = reader.ReadToEnd();
                    }
                }

                blocked = SvgPreviewHandlerHelper.CheckBlockedElements(svgData);
            }
#pragma warning disable CA1031 // Do not catch general exception types
            catch (Exception ex)
#pragma warning restore CA1031 // Do not catch general exception types
            {
                PreviewError(ex, dataSource);
                return;
            }

            InvokeOnControlThread(() =>
            {
                try
                {
                    _infoBarAdded = false;

                    // Add a info bar on top of the Preview if any blocked element is present.
                    if (blocked)
                    {
                        _infoBarAdded = true;
                        AddTextBoxControl(Resource.BlockedElementInfoText);
                    }

                    AddBrowserControl(svgData);
                    Resize += FormResized;
                    base.DoPreview(dataSource);
                    PowerToysTelemetry.Log.WriteEvent(new SvgFilePreviewed());
                }
#pragma warning disable CA1031 // Do not catch general exception types
                catch (Exception ex)
#pragma warning restore CA1031 // Do not catch general exception types
                {
                    PreviewError(ex, dataSource);
                }
            });
        }
        public void StreamWrapperShouldCallIStreamSeekWhenSetPosition()
        {
            // Arrange
            long positionToSet    = 5;
            int  expectedDwOrigin = 0; // STREAM_SEEK_SET
            var  streamMock       = new Mock <IStream>();

            using (var streamWrapper = new ReadonlyStream(streamMock.Object))
            {
                // Act
                streamWrapper.Position = positionToSet;

                // Assert
                streamMock.Verify(_ => _.Seek(It.Is <long>(offset => offset == positionToSet), It.Is <int>(dworigin => dworigin == expectedDwOrigin), It.IsAny <IntPtr>()), Times.Once);
            }
        }
Exemple #12
0
        /// <inheritdoc/>
        public void GetThumbnail(uint cx, out IntPtr phbmp, out WTS_ALPHATYPE pdwAlpha)
        {
            phbmp    = IntPtr.Zero;
            pdwAlpha = WTS_ALPHATYPE.WTSAT_UNKNOWN;

            if (cx == 0 || cx > MaxThumbnailSize)
            {
                return;
            }

            string svgData = null;

            using (var stream = new ReadonlyStream(this.Stream as IStream))
            {
                using (var reader = new StreamReader(stream))
                {
                    svgData = reader.ReadToEnd();
                    try
                    {
                        // Fixes #17527 - Inkscape v1.1 swapped order of default and svg namespaces in svg file (default first, svg after).
                        // That resulted in parser being unable to parse it correctly and instead of svg, text was previewed.
                        // MS Edge and Firefox also couldn't preview svg files with mentioned order of namespaces definitions.
                        svgData = SvgPreviewHandlerHelper.SwapNamespaces(svgData);
                        svgData = SvgPreviewHandlerHelper.AddStyleSVG(svgData);
                    }
                    catch (Exception)
                    {
                    }
                }
            }

            if (svgData != null)
            {
                using (Bitmap thumbnail = GetThumbnail(svgData, cx))
                {
                    if (thumbnail != null && thumbnail.Size.Width > 0 && thumbnail.Size.Height > 0)
                    {
                        phbmp    = thumbnail.GetHbitmap();
                        pdwAlpha = WTS_ALPHATYPE.WTSAT_RGB;
                    }
                }
            }
        }
        public void StreamWrapper_ShouldThrow_IfInitializeWithNullStream()
        {
            // Arrange
            IStream stream = null;
            ArgumentNullException exception = null;

            // Act
            try
            {
                var streamWrapper = new ReadonlyStream(stream);
            }
            catch (ArgumentNullException ex)
            {
                exception = ex;
            }

            // Assert
            Assert.IsNotNull(exception);
        }
Exemple #14
0
        /// <summary>
        /// Start the preview on the Control.
        /// </summary>
        /// <param name="dataSource">Stream reference to access source file.</param>
        public override void DoPreview <T>(T dataSource)
        {
            InvokeOnControlThread(() =>
            {
                try
                {
                    Bitmap thumbnail = null;

                    using (var stream = new ReadonlyStream(dataSource as IStream))
                    {
                        using (var reader = new StreamReader(stream))
                        {
#pragma warning disable CA2000 // Do not dispose here
                            thumbnail = GetThumbnail(reader);
#pragma warning restore CA2000
                        }
                    }

                    _infoBarAdded = false;

                    if (thumbnail == null)
                    {
                        _infoBarAdded = true;
                        AddTextBoxControl(Properties.Resource.GcodeWithoutEmbeddedThumbnails);
                    }
                    else
                    {
                        AddPictureBoxControl(thumbnail);
                    }

                    Resize += FormResized;
                    base.DoPreview(dataSource);
                    PowerToysTelemetry.Log.WriteEvent(new GcodeFilePreviewed());
                }
#pragma warning disable CA1031 // Do not catch general exception types
                catch (Exception ex)
#pragma warning restore CA1031 // Do not catch general exception types
                {
                    PreviewError(ex, dataSource);
                }
            });
        }
        public void StreamWrapper_ShouldReturnValidLength()
        {
            // Arrange
            long streamLength = 5;
            var  stremMock    = new Mock <IStream>();
            var  stat         = new System.Runtime.InteropServices.ComTypes.STATSTG
            {
                cbSize = streamLength,
            };

            stremMock
            .Setup(x => x.Stat(out stat, It.IsAny <int>()));
            var streamWrapper = new ReadonlyStream(stremMock.Object);

            // Act
            var actualLength = streamWrapper.Length;

            // Assert
            Assert.AreEqual(actualLength, streamLength);
        }
        public void StreamWrapper_ShouldThrowNotImplementedException_WhenWriteCalled()
        {
            // Arrange
            var stremMock     = new Mock <IStream>();
            var streamWrapper = new ReadonlyStream(stremMock.Object);
            NotImplementedException exception = null;

            // Act
            try
            {
                streamWrapper.Write(new byte[5], 0, 0);
            }
            catch (NotImplementedException ex)
            {
                exception = ex;
            }

            // Assert
            Assert.IsNotNull(exception);
        }
        public void StreamWrapper_ShouldReturnValidPosition_WhenSeekCalled()
        {
            // Arrange
            long position  = 5;
            var  stremMock = new Mock <IStream>();

            stremMock
            .Setup(x => x.Seek(It.IsAny <long>(), It.IsAny <int>(), It.IsAny <IntPtr>()))
            .Callback <long, int, IntPtr>((dlibMove, dwOrigin, plibNewPosition) =>
            {
                Marshal.WriteInt64(plibNewPosition, position);
            });

            var streamWrapper = new ReadonlyStream(stremMock.Object);

            // Act
            var actualPosition = streamWrapper.Seek(0, SeekOrigin.Begin);

            // Assert
            Assert.AreEqual(position, actualPosition);
        }
        public void StreamWrapper_ShouldThrow_WhenReadCalledWithOutOfRangeArguments(int bufferLength, int offSet, int bytesToRead)
        {
            // Arrange
            var buffer    = new byte[bufferLength];
            var stremMock = new Mock <IStream>();
            ArgumentOutOfRangeException exception = null;

            var streamWrapper = new ReadonlyStream(stremMock.Object);

            // Act
            try
            {
                streamWrapper.Read(buffer, offSet, bytesToRead);
            }
            catch (ArgumentOutOfRangeException ex)
            {
                exception = ex;
            }

            // Assert
            Assert.IsNotNull(exception);
        }
        public void StreamWrapperShouldThrowNotImplementedExceptionWhenSetLengthCalled()
        {
            // Arrange
            var streamMock = new Mock <IStream>();

            using (var streamWrapper = new ReadonlyStream(streamMock.Object))
            {
                NotImplementedException exception = null;

                // Act
                try
                {
                    streamWrapper.SetLength(5);
                }
                catch (NotImplementedException ex)
                {
                    exception = ex;
                }

                // Assert
                Assert.IsNotNull(exception);
            }
        }
        /// <summary>
        /// Start the preview on the Control.
        /// </summary>
        /// <param name="dataSource">Stream reference to access source file.</param>
        public override void DoPreview <T>(T dataSource)
        {
            this.SuspendLayout();

            try
            {
                using (var dataStream = new ReadonlyStream(dataSource as IStream))
                {
                    var memStream = new MemoryStream();
                    dataStream.CopyTo(memStream);
                    memStream.Position = 0;

                    try
                    {
                        // AsRandomAccessStream() extension method from System.Runtime.WindowsRuntime
                        var pdf = PdfDocument.LoadFromStreamAsync(memStream.AsRandomAccessStream()).GetAwaiter().GetResult();

                        if (pdf.PageCount > 0)
                        {
                            InvokeOnControlThread(() =>
                            {
                                _flowLayoutPanel = new FlowLayoutPanel
                                {
                                    AutoScroll    = true,
                                    AutoSize      = true,
                                    Dock          = DockStyle.Fill,
                                    FlowDirection = FlowDirection.TopDown,
                                    WrapContents  = false,
                                };
                                _flowLayoutPanel.Resize += FlowLayoutPanel_Resize;

                                // Only show first 10 pages.
                                for (uint i = 0; i < pdf.PageCount && i < 10; i++)
                                {
                                    using (var page = pdf.GetPage(i))
                                    {
                                        var image = PageToImage(page);

                                        var picturePanel = new Panel()
                                        {
                                            Name        = "picturePanel",
                                            Margin      = new Padding(6, 6, 6, 0),
                                            Size        = CalculateSize(image),
                                            BorderStyle = BorderStyle.FixedSingle,
                                        };

                                        var picture = new PictureBox
                                        {
                                            Dock     = DockStyle.Fill,
                                            Image    = image,
                                            SizeMode = PictureBoxSizeMode.Zoom,
                                        };

                                        picturePanel.Controls.Add(picture);
                                        _flowLayoutPanel.Controls.Add(picturePanel);
                                    }
                                }

                                if (pdf.PageCount > 10)
                                {
                                    var messageBox = new RichTextBox
                                    {
                                        Name        = "messageBox",
                                        Text        = Resources.PdfMorePagesMessage,
                                        BackColor   = Color.LightYellow,
                                        Dock        = DockStyle.Fill,
                                        Multiline   = true,
                                        ReadOnly    = true,
                                        ScrollBars  = RichTextBoxScrollBars.None,
                                        BorderStyle = BorderStyle.None,
                                    };
                                    messageBox.ContentsResized += RTBContentsResized;

                                    _flowLayoutPanel.Controls.Add(messageBox);
                                }

                                Controls.Add(_flowLayoutPanel);
                            });
                        }
                    }
                    catch (Exception ex)
                    {
                        if (ex.Message.Contains("Unable to update the password. The value provided as the current password is incorrect.", StringComparison.Ordinal))
                        {
                            InvokeOnControlThread(() =>
                            {
                                Controls.Clear();
                                _infoBar = GetTextBoxControl(Resources.PdfPasswordProtectedError);
                                Controls.Add(_infoBar);
                            });
                        }
                        else
                        {
                            throw;
                        }
                    }
                    finally
                    {
                        memStream.Dispose();
                    }
                }

                PowerToysTelemetry.Log.WriteEvent(new PdfFilePreviewed());
            }
            catch (Exception ex)
            {
                PowerToysTelemetry.Log.WriteEvent(new PdfFilePreviewError {
                    Message = ex.Message
                });

                InvokeOnControlThread(() =>
                {
                    Controls.Clear();
                    _infoBar = GetTextBoxControl(Resources.PdfNotPreviewedError);
                    Controls.Add(_infoBar);
                });
            }
            finally
            {
                base.DoPreview(dataSource);
            }

            this.ResumeLayout(false);
            this.PerformLayout();
        }
        /// <summary>
        /// Start the preview on the Control.
        /// </summary>
        /// <param name="dataSource">Stream reference to access source file.</param>
        public override void DoPreview <T>(T dataSource)
        {
            CleanupWebView2UserDataFolder();

            string svgData = null;
            bool   blocked = false;

            try
            {
                using (var stream = new ReadonlyStream(dataSource as IStream))
                {
                    using (var reader = new StreamReader(stream))
                    {
                        svgData = reader.ReadToEnd();
                    }
                }

                blocked = SvgPreviewHandlerHelper.CheckBlockedElements(svgData);
            }
            catch (Exception ex)
            {
                PreviewError(ex, dataSource);
                return;
            }

            try
            {
                // Fixes #17527 - Inkscape v1.1 swapped order of default and svg namespaces in svg file (default first, svg after).
                // That resulted in parser being unable to parse it correctly and instead of svg, text was previewed.
                // MS Edge and Firefox also couldn't preview svg files with mentioned order of namespaces definitions.
                svgData = SvgPreviewHandlerHelper.SwapNamespaces(svgData);
                svgData = SvgPreviewHandlerHelper.AddStyleSVG(svgData);
            }
            catch (Exception ex)
            {
                PowerToysTelemetry.Log.WriteEvent(new SvgFilePreviewError {
                    Message = ex.Message
                });
            }

            InvokeOnControlThread(() =>
            {
                try
                {
                    _infoBarAdded = false;

                    // Add a info bar on top of the Preview if any blocked element is present.
                    if (blocked)
                    {
                        _infoBarAdded = true;
                        AddTextBoxControl(Properties.Resource.BlockedElementInfoText);
                    }

                    AddWebViewControl(svgData);
                    Resize += FormResized;
                    base.DoPreview(dataSource);
                    PowerToysTelemetry.Log.WriteEvent(new SvgFilePreviewed());
                }
                catch (Exception ex)
                {
                    PreviewError(ex, dataSource);
                }
            });
        }