package Ġme . for never . aval on iar ider . preview er Ċ Ċ import Ġcom . intellij . openapi . command . Write Command Action Ċ import Ġcom . intellij . openapi . diagnostic . Logger Ċ import Ġcom . intellij . openapi . diagnostic . debug Ċ import Ġcom . intellij . openapi . file Editor . File Document Manager Ċ import Ġcom . intellij . openapi . project . Project Ċ import Ġcom . intellij . openapi . rd . util . launch Long Background Ċ import Ġcom . intellij . openapi . rd . util . start IO Background Async Ċ import Ġcom . intellij . openapi . rd . util . with IO Background Context Ċ import Ġcom . intellij . openapi . rd . util . with Ui Context Ċ import Ġcom . intellij . openapi . util . Comp utable Ċ import Ġcom . intellij . openapi . vfs . Virtual File Ċ import Ġcom . intellij . util . application Ċ import Ġcom . intellij . workspace Model . ide . Workspace Model Ċ import Ġcom . jetbrains . rd . util . lifetime .* Ċ import Ġcom . jetbrains . rd . util . reactive .* Ċ import Ġcom . jetbrains . rd . util . throttle Last Ċ import Ġcom . jetbrains . r ider . build . Build Host Ċ import Ġcom . jetbrains . r ider . model . r ider Solution Lifecycle Ċ import Ġcom . jetbrains . r ider . project View . solution Ċ import Ġcom . jetbrains . r ider . project View . workspace . Project Model Entity Ċ import Ġcom . jetbrains . r ider . project View . workspace . containing Project Entity Ċ import Ġcom . jetbrains . r ider . project View . workspace . getProject Model Entities Ċ import Ġcom . jetbrains . r ider . ui . Swing Scheduler Ċ import Ġcom . jetbrains . r ider . ui . components . utils . document Changed Ċ import Ġkotlinx . coroutines . Cancellation Exception Ċ import Ġkotlinx . coroutines . Comp letable Deferred Ċ import Ġkotlinx . coroutines . select s . select Ċ import Ġme . for never . aval on iar ider . control messages .* Ċ import Ġme . for never . aval on iar ider . exceptions . A val onia Preview er Initialization Exception Ċ import Ġme . for never . aval on iar ider . idea . concurrency . adv ise On Ui Thread Ċ import Ġme . for never . aval on iar ider . idea . settings . A val onia Preview er Method Ċ import Ġme . for never . aval on iar ider . idea . settings . A val onia Settings Ċ import Ġme . for never . aval on iar ider . rd . compose Ċ import Ġme . for never . aval on iar ider . r ider . A val onia R ider Project Model Host Ċ import Ġme . for never . aval on iar ider . r ider . project Relative Virtual Path Ċ import Ġme . for never . aval on iar ider . statistics . Preview er Usage Logger Ċ import Ġjava . io . EOF Exception Ċ import Ġjava . net . Server Socket Ċ import Ġjava . net . Socket Exception Ċ import Ġjava . nio . file . Path Ċ import Ġjava . time . Duration Ċ import Ġjava . util . concurrent . atomic . Atomic Boolean Ċ Ċ /** Ċ Ġ* ĠThe Ġsources Ġon Ġthis Ġclass Ġare Ġthread - free . ĠMake Ġsure Ġto Ġschedule Ġthem Ġonto Ġthe Ġproper Ġthreads Ġif Ġnecessary . Ċ Ġ*/ Ċ @ Suppress (" Un stable Api Usage ") Ċ class ĠAval onia Preview er Session Controller ( ĊĠĠĠ Ġprivate Ġval Ġproject : ĠProject , ĊĠĠĠ Ġouter Lifetime : ĠL ifetime , ĊĠĠĠ Ġprivate Ġval Ġx aml File : ĠVirtual File , ĊĠĠĠ Ġproject FilePath Property : ĠIO pt Property View < Path >) Ġ{ ĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġlogger Ġ= ĠLogger . getInstance ( A val onia Preview er Session Controller :: class . java ) ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġx aml Edit Th rottling Ġ= ĠDuration . of Millis ( 3 0 0 L ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġenum Ġclass ĠStatus Ġ{ ĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠNo Ġsessions Ġhave Ġbeen Ġstarted Ġso Ġfar . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ ĠId le , ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠTrying Ġto Ġconnect Ġto Ġa Ġstarted Ġpre viewer Ġprocess . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ ĠConnect ing , ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠPreview er Ġprocess Ġis Ġworking . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ ĠWorking , ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠPreview er Ġprocess Ġhas Ġreported Ġa ĠX AML Ġerror . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ ĠX aml Error , ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠPreview Ġhas Ġbeen Ġsus pended Ġ( e . g . Ġby Ġan Ġongoing Ġbuild Ġsession ). ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ ĠS us pended , ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠPreview Ġprocess Ġhas Ġbeen Ġterminated , Ġand Ġno Ġother Ġprocess Ġis Ġpresent . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ ĠTermin ated ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġpreview Reported Ġ= ĠAtomic Boolean () ĊĠĠĠ Ġprivate Ġval Ġworkspace Model Ġ= ĠWorkspace Model . getInstance ( project ) ĊĊĠĠĠ Ġprivate Ġval Ġstatus Property Ġ= ĠProperty ( Status . Idle ) ĊĊĠĠĠ Ġval Ġstatus : ĠI Property View < Status > Ġ= Ġstatus Property ĊĠĠĠ Ġprivate Ġval Ġcontroller Lifetime Ġ= Ġouter Lifetime . create Nested () ĊĊĠĠĠ Ġprivate Ġval Ġhtml Transport Started Signal Ġ= ĠSignal < Html Transport Started Message >() ĊĠĠĠ Ġprivate Ġval Ġrequest Viewport Resize Signal Ġ= ĠSignal < Request Viewport Resize Message >() ĊĠĠĠ Ġprivate Ġval Ġframe Signal Ġ= ĠSignal < Frame Message >() ĊĠĠĠ Ġprivate Ġval Ġupdate Xaml Result Signal Ġ= ĠSignal < Update Xaml Result Message >() ĊĠĠĠ Ġprivate Ġval Ġcritical Error Signal Ġ= ĠSignal < Throwable >() ĊĊĠĠĠ Ġval Ġhtml Transport Started : ĠI Source < Html Transport Started Message > Ġ= Ġhtml Transport Started Signal ĊĠĠĠ Ġval Ġrequest Viewport Resize : ĠI Source < Request Viewport Resize Message > Ġ= Ġrequest Viewport Resize Signal ĊĠĠĠ Ġval Ġframe : ĠI Source < Frame Message > Ġ= Ġframe Signal ĊĠĠĠ Ġval Ġupdate Xaml Result : ĠI Source < Update Xaml Result Message > Ġ= Ġupdate Xaml Result Signal ĊĠĠĠ Ġval Ġcritical Error : ĠI Source < Throwable > Ġ= Ġcritical Error Signal ĊĊĠĠĠ Ġprivate Ġvar Ġ_ session : ĠAval onia Preview er Session ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġsession : ĠAval onia Preview er Session ? ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġapplication . run Read Action ( Comp utable Ġ{ Ġ_ session Ġ}) ĊĠĠĠĠĠĠĠ Ġset ( value ) Ġ= ĠWrite Command Action . run Write Command Action ( project ) Ġ{ Ġ_ session Ġ= Ġvalue Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġsession Lifetime Source Ġ= ĠSequential Lifetime s ( controller Lifetime ) ĊĠĠĠ Ġprivate Ġvar Ġcurrent Session Lifetime : ĠL ifetime Definition ? Ġ= Ġnull ĊĊĠĠĠ Ġprivate Ġfun Ġenable Statistics () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġstatistics Reporter Lifetime Ġ= Ġcontroller Lifetime . create Nested () ĊĊĠĠĠĠĠĠĠ Ġfun Ġreport ( action : Ġ() Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( preview Reported . get AndSet ( true )) Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaction () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstatistics Reporter Lifetime . terminate ( true ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġstatus . adv ise ( statistics Reporter Lifetime ) Ġ{ Ġstatus Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( status ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠStatus . Xaml Error Ġ-> Ġreport Ġ{ ĠPreview er Usage Logger . log Preview Error ( project ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠStatus . Terminated Ġ-> Ġreport Ġ{ ĠPreview er Usage Logger . log Preview Critical Failure ( project ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġframe . adv ise ( statistics Reporter Lifetime ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreport Ġ{ ĠPreview er Usage Logger . log Preview Success ( project ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġcontroller Lifetime . on Termination Ġ{ Ġstatus Property . set ( Status . Terminated ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġis Building Property Ġ= ĠBuild Host . getInstance ( project ). building ĊĠĠĠĠĠĠĠ Ġcompose ( is Building Property , Ġproject FilePath Property ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. adv ise ( controller Lifetime ) Ġ{ Ġ( is Building , Ġproject FilePath ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . info (" Controller Ġstate Ġchange : Ġis Building Ġ= Ġ$ is Building , Ġproject FilePath Ġ= Ġ$ project FilePath ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Building Ġ|| Ġproject FilePath Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . info (" Sus pending Ġpreview Ġfor Ġ$ xaml File ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuspend () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . info (" Force Ġstart Ġpreview Ġfor Ġ$ xaml File ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart ( project FilePath , Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġenable Statistics () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġget Project Containing File ( virtual File : ĠVirtual File ): ĠProject Model Entity Ġ{ ĊĠĠĠĠĠĠĠ Ġapplication . assertIs Dispatch Thread () ĊĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= ĠComp letable Deferred < Project Model Entity >() ĊĊĠĠĠĠĠĠĠ Ġproject . solution . r ider Solution Lifecycle . is Project Model Ready . adv ise Until ( controller Lifetime ) Ġ{ Ġis Ready Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! is Ready ) Ġreturn @ adv ise Until Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . debug Ġ{ Ġ" Project Ġmodel Ġview Ġsynchronized " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġproject Model Entities Ġ= Ġworkspace Model . getProject Model Entities ( virtual File , Ġproject ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . debug Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Project Ġmodel Ġnodes Ġfor Ġfile Ġ$ xaml File : Ġ" Ġ+ Ġproject Model Entities . join ToString (", Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcontaining Project Ġ= Ġproject Model Entities . as Sequence () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit . containing Project Entity () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter NotNull () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. first () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . complete ( containing Project ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( t : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . complete Exception ally ( t ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ adv ise Until Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġresult . await () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcreate Session ( ĊĠĠĠĠĠĠĠ Ġlifetime : ĠL ifetime , ĊĠĠĠĠĠĠĠ Ġsocket : ĠServer Socket , ĊĠĠĠĠĠĠĠ Ġparameters : ĠAval onia Preview er Parameters , ĊĠĠĠĠĠĠĠ Ġx aml File : ĠVirtual File ĊĠĠĠ Ġ) Ġ= ĠAval onia Preview er Session ( ĊĠĠĠĠĠĠĠ Ġlifetime , ĊĠĠĠĠĠĠĠ Ġsocket , ĊĠĠĠĠĠĠĠ Ġparameters . xaml Containing Assembly Path ĊĠĠĠ Ġ). apply Ġ{ ĊĠĠĠĠĠĠĠ Ġsession Started . adv ise ( lifetime ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsend Client Supported PixelFormat () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsend D pi ( 9 6 . 0 ) Ġ// ĠTODO [ F ]: ĠPro per ly Ġacquire Ġfrom Ġthe ĠUI Ġside Ġ(# 9 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġapplication . run Read Action Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdocument Ġ= ĠFile Document Manager . getInstance (). getDocument ( xaml File ) !! ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġget Document Path In Project (): ĠString Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġproject Model Items Ġ= Ġworkspace Model . getProject Model Entities ( xaml File , Ġproject ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġitem Ġ= Ġproject Model Items . first OrNull () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġitem ?. project Relative Virtual Path ?. let Ġ{ Ġ"/ $ it " Ġ} Ġ?: Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdocument . document Changed () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. throttle Last ( xaml Edit Th rottling , ĠSw ing Scheduler ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. adv ise ( lifetime ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsend Xaml Update ( document . text , Ġget Document Path In Project ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsend Xaml Update ( document . text , Ġget Document Path In Project ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġhtml Transport Started . flow Into ( lifetime , Ġhtml Transport Started Signal ) ĊĠĠĠĠĠĠĠ Ġrequest Viewport Resize . flow Into ( lifetime , Ġrequest Viewport Resize Signal ) ĊĠĠĠĠĠĠĠ Ġupdate Xaml Result . adv ise On Ui Thread ( lifetime ) Ġ{ Ġmessage Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( message . error Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstatus Property . value Ġ= ĠStatus . Xaml Error ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Xaml Result Signal . fire ( message ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġframe . adv ise On Ui Thread ( lifetime ) Ġ{ Ġframe Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstatus Property . value Ġ= ĠStatus . Working ĊĠĠĠĠĠĠĠĠĠĠĠ Ġframe Signal . fire ( frame ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġexecute Preview er Async ( lifetime : ĠL ifetime , Ġproject FilePath : ĠPath ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsettings Ġ= ĠAval onia Settings . getInstance ( project ). state ĊĊĠĠĠĠĠĠĠ Ġstatus Property . set ( Status . Connecting ) ĊĊĠĠĠĠĠĠĠ Ġlogger . info (" Re ceiving Ġthe Ġcontaining Ġproject Ġfor Ġthe Ġfile Ġ$ xaml File ") ĊĠĠĠĠĠĠĠ Ġval Ġx aml Containing Project Ġ= Ġwith Ui Context ( lifetime ) Ġ{ Ġget Project Containing File ( xaml File ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġlogger . info (" Calcul ating Ġa Ġproject Ġoutput Ġfor Ġthe Ġproject Ġ$ project FilePath ") ĊĠĠĠĠĠĠĠ Ġval Ġr ider Project Output Host Ġ= ĠAval onia R ider Project Model Host . getInstance ( project ) ĊĠĠĠĠĠĠĠ Ġval Ġproject Output Ġ= Ġr ider Project Output Host . getProject Output ( lifetime , Ġproject FilePath ) ĊĊĠĠĠĠĠĠĠ Ġlogger . info (" Calcul ating Ġpre viewer Ġstart Ġparameters Ġfor Ġthe Ġproject Ġ$ project FilePath , Ġoutput Ġ$ project Output ") ĊĠĠĠĠĠĠĠ Ġval Ġms Build Ġ= ĠMs Build Parameter Collector . getInstance ( project ) ĊĠĠĠĠĠĠĠ Ġval Ġparameters Ġ= Ġms Build . get A val onia Preview er Parameters ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġproject FilePath , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġproject Output , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġx aml Containing Project ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġval Ġsocket Ġ= Ġwith IO Background Context ( lifetime ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Suppress (" Blocking Method In Non Blocking Context ") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠServer Socket ( 0 ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlifetime . on Termination Ġ{ Ġclose () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġtransport Ġ= ĠPreview er B son Transport ( socket . local Port ) ĊĠĠĠĠĠĠĠ Ġval Ġmethod Ġ= Ġwhen Ġ( settings . preview er Method ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAval onia Preview er Method . A val onia Remote Ġ-> ĠAval onia Remote Method ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAval onia Preview er Method . Html Ġ-> ĠHtml Method ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġprocess Title Ġ= Ġ"${ xaml File . name } Ġ( port Ġ${ socket . local Port })" ĊĠĠĠĠĠĠĠ Ġval Ġprocess Ġ= ĠAval onia Preview er Process ( lifetime , Ġparameters ) ĊĠĠĠĠĠĠĠ Ġval Ġnew Session Ġ= Ġcreate Session ( lifetime , Ġsocket , Ġparameters , Ġx aml File ) ĊĠĠĠĠĠĠĠ Ġsession Ġ= Ġnew Session ĊĊĠĠĠĠĠĠĠ Ġval Ġsession Job Ġ= Ġlifetime . start IO Background Async Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . info (" Starting Ġsocket Ġlistener ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Session . process Socket Messages () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ex : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( ex ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠSocket Exception , Ġis ĠEOF Exception Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠLog Ġsocket Ġerrors Ġonly Ġif Ġthe Ġsession Ġis Ġstill Ġalive . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( lifetime . is Alive ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . error (" Socket Ġerror Ġwhile Ġsession Ġis Ġstill Ġalive ", Ġex ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow Ġex ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġprocess Job Ġ= Ġlifetime . start IO Background Async Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . info (" Starting Ġpre viewer Ġprocess ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprocess . run ( lifetime , Ġproject , Ġtransport , Ġmethod , Ġprocess Title ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġstatus Property . set ( Status . Working ) ĊĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġselect < String > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsession Job . on Await Ġ{ Ġ" Socket Ġlistener " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprocess Job . on Await Ġ{ Ġ" Process " Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġlogger . info ("$ result Ġhas Ġbeen Ġterminated Ġfirst ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġstart ( project FilePath : ĠPath , Ġforce : ĠBoolean Ġ= Ġfalse ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( status . value Ġ== ĠStatus . Sus pended Ġ&& Ġ! force ) Ġreturn ĊĊĠĠĠĠĠĠĠ Ġval Ġlt Ġ= Ġsession Lifetime Source . next () ĊĠĠĠĠĠĠĠ Ġcurrent Session Lifetime Ġ= Ġlt ĊĠĠĠĠĠĠĠ Ġlt . launch Long Background Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexecute Preview er Async ( current Session Lifetime !! , Ġproject FilePath ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ex : ĠAval onia Preview er Initialization Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcritical Error Signal . fire ( ex ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . warn ( ex ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ex : ĠC ancellation Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . info ("${ xaml File . name }: Ġpre viewer Ġsession Ġhas Ġbeen Ġcancelled ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( t : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . error ( t ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsession Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlt . terminate () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsuspend () Ġ{ ĊĠĠĠĠĠĠĠ Ġapplication . assertIs Dispatch Thread () ĊĊĠĠĠĠĠĠĠ Ġstatus Property . set ( Status . Sus pended ) ĊĠĠĠĠĠĠĠ Ġcurrent Session Lifetime ?. terminate () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġacknowledge Frame ( frame : ĠFrame Message ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsession ?. send Frame Ack nowledge ment ( frame ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġsend Input Event Message ( event : ĠAval onia Input Event Message ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsession ?. send Input Event Message ( event ) ĊĠĠĠ Ġ} Ċ } Ċ