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