public LinkStreamEditorContext(StatusControlContext statusContext, LinkStream linkContent, bool extractDataOnLoad = false) { StatusContext = statusContext ?? new StatusControlContext(); SaveUpdateDatabaseCommand = new Command(() => StatusContext.RunBlockingTask(() => SaveToDbWithValidation(StatusContext?.ProgressTracker()))); SaveUpdateDatabaseAndCloseCommand = new Command(() => StatusContext.RunBlockingTask(() => SaveToDbWithValidationAndClose(StatusContext?.ProgressTracker()))); ExtractDataCommand = new Command(() => StatusContext.RunBlockingTask(() => ExtractDataFromLink(StatusContext?.ProgressTracker()))); OpenUrlInBrowserCommand = new Command(() => { try { var ps = new ProcessStartInfo(LinkUrl) { UseShellExecute = true, Verb = "open" }; Process.Start(ps); } catch (Exception e) { StatusContext.ToastWarning($"Trouble opening link - {e.Message}"); } }); StatusContext.RunFireAndForgetTaskWithUiToastErrorReturn(async() => await LoadData(linkContent, extractDataOnLoad)); }
public LinkStreamEditorWindow(LinkStream toLoad, bool extractDataFromLink = false) { InitializeComponent(); StatusContext = new StatusControlContext(); EditorContent = new LinkStreamEditorContext(StatusContext, toLoad, extractDataFromLink); EditorContent.RequestLinkStreamEditorWindowClose += (sender, args) => { Dispatcher?.Invoke(Close); }; DataContext = this; AccidentalCloserHelper = new WindowAccidentalClosureHelper(this, StatusContext, EditorContent); }
private static string TypeToFilterTag(object content) { return(content switch { NoteContent _ => "post", PostContent _ => "post", ImageContent _ => "image", PhotoContent _ => "image", FileContent _ => "file", LinkStream _ => "link", _ => "other" });
[Test] public void LinkStream() { const string src = "This is a longest message to test blocking and asynchronous communication using the link stream"; string msg = string.Empty; var wait = new EventWaitHandle(false, EventResetMode.ManualReset); var write_ex = (Exception?)null; var read_ex = (Exception?)null; var link = new LinkStream { BlockBufferSize = 4, MaxCapacity = 8 }; ThreadPool.QueueUserWorkItem(x => { try { using (var sw = new StreamWriter(link.OStream)) sw.Write(src); } catch (Exception ex) { write_ex = ex; wait.Set(); } }); ThreadPool.QueueUserWorkItem(x => { try { using (var sr = new StreamReader(link.IStream)) msg = sr.ReadToEnd(); wait.Set(); } catch (Exception ex) { read_ex = ex; wait.Set(); } }); wait.WaitOne(); Assert.Null(write_ex); Assert.Null(read_ex); Assert.Equal(src, msg); }
public static HtmlTag FromLinkStream(LinkStream content) { if (content == null) { return(HtmlTag.Empty()); } var compactContentContainerDiv = new DivTag().AddClass("content-compact-container"); var compactContentMainTextContentDiv = new DivTag().AddClass("link-compact-text-content-container"); var compactContentMainTextTitleTextDiv = new DivTag().AddClass("content-compact-text-content-title-container"); var compactContentMainTextTitleLink = new LinkTag(string.IsNullOrWhiteSpace(content.Title) ? content.Url : content.Title, content.Url) .AddClass("content-compact-text-content-title-link"); compactContentMainTextTitleTextDiv.Children.Add(compactContentMainTextTitleLink); var compactContentSummaryTextDiv = new DivTag().AddClass("link-compact-text-content-summary"); var itemsPartOne = new List <string>(); if (!string.IsNullOrWhiteSpace(content.Author)) { itemsPartOne.Add(content.Author); } if (content.LinkDate != null) { itemsPartOne.Add(content.LinkDate.Value.ToString("M/d/yyyy")); } if (content.LinkDate == null) { itemsPartOne.Add($"Saved {content.CreatedOn:M/d/yyyy}"); } if (itemsPartOne.Any()) { var textPartOneDiv = new DivTag().AddClass("content-compact-text-content-link-summary") .Text(string.Join(" - ", itemsPartOne)); compactContentSummaryTextDiv.Children.Add(textPartOneDiv); } if (!string.IsNullOrWhiteSpace(content.Description)) { var textPartThreeDiv = new DivTag().AddClass("content-compact-text-content-link-summary") .Text(content.Description); compactContentSummaryTextDiv.Children.Add(textPartThreeDiv); } if (!string.IsNullOrWhiteSpace(content.Comments)) { var textPartTwoDiv = new DivTag().AddClass("content-compact-text-content-link-summary") .Text(content.Comments); compactContentSummaryTextDiv.Children.Add(textPartTwoDiv); } compactContentMainTextContentDiv.Children.Add(compactContentMainTextTitleTextDiv); compactContentMainTextContentDiv.Children.Add(compactContentSummaryTextDiv); compactContentContainerDiv.Children.Add(compactContentMainTextContentDiv); return(compactContentContainerDiv); }