1717using Kantan . Net ;
1818using SmartImage . Lib . Utilities ;
1919using System . Text . Json . Serialization ;
20+ using SmartImage . Lib . Engines ;
2021using SmartImage . Lib . Results ;
2122using Spectre . Console . Rendering ;
23+ using System . Threading . Tasks ;
24+ using Kantan . Text ;
2225
2326#nullable disable
2427namespace SmartImage . Rdx . Commands ;
@@ -65,7 +68,6 @@ public ServerCommand()
6568
6669 } ;
6770
68-
6971 m_scs = null ;
7072 }
7173
@@ -92,19 +94,25 @@ public override async Task<int> ExecuteAsync(CommandContext context, ServerComma
9294 var uriPrefix = $ "http://*:{ m_scs . Port } /";
9395 Trace . WriteLine ( $ "{ uriPrefix } ") ;
9496
95- AnsiConsole . WriteLine ( "Loading..." ) ;
96- await InitConfigAsync ( null ) ;
97+ await AnsiConsole . Progress ( ) . StartAsync ( async ctx =>
98+ {
99+ var task = ctx . AddTask ( "Starting server" ) ;
100+ task . IsIndeterminate = true ;
101+ // task.Description = "Initializing config";
102+ await InitConfigAsync ( null ) ;
103+ task . Increment ( ConsoleFormat . COMPLETE ) ;
104+ } ) ;
97105
98106 Listener = new SmartHttpListener ( Handlers , uriPrefix ) ;
99107
100- AnsiConsole . WriteLine ( "Starting server" ) ;
108+
109+ AnsiConsole . WriteLine ( $ "Listening on { Listener . Listener . Prefixes . QuickJoin ( ) } ") ;
101110
102111 await Listener . StartAsync ( ) ;
103112
104113 return BaseOSIntegration . EC_OK ;
105114 }
106115
107-
108116
109117 private async Task < object > HandleRequestAsync ( HttpListenerRequest request , HttpListenerResponse response )
110118 {
@@ -113,127 +121,98 @@ private async Task<object> HandleRequestAsync(HttpListenerRequest request, HttpL
113121 object ok ;
114122 var remEndpoint = request . RemoteEndPoint ;
115123
116- Trace . WriteLine ( $ "Request endpoint: { remEndpoint } ") ;
124+ AnsiConsole . WriteLine ( $ "Received request { remEndpoint } ") ;
125+
126+ // Trace.WriteLine($"Request endpoint: {remEndpoint}");
117127
118128 var redirHdr = request . Headers [ "Redirect" ] ;
119129 var srvResponse = new SearchServerResponse ( ) ;
120130
121131 try {
122- var contentType = request . Headers [ "Content-Type" ] ?? MediaTypeNames . Text . Plain ;
123- Debug . WriteLine ( $ "{ contentType } ") ;
124-
125- SearchQuery query ;
126- object sqInput = null ;
127-
128- // contentType??= MediaTypeNames.Multipart.FormData;
129-
130- var mediaTypeHeaderValue = MediaTypeHeaderValue . Parse ( contentType ) ;
131-
132- using var sc = new StreamContent ( request . InputStream ) ;
133-
134- switch ( mediaTypeHeaderValue . MediaType ) {
135- case MediaTypeNames . Text . Plain :
136- goto default ;
132+ SearchQuery query = await GetQuery ( request ) ;
137133
138- case MediaTypeNames . Image . Bmp :
139- break ;
134+ if ( query == SearchQuery . Null ) {
135+ srvResponse . Message = R1 . Err_Query ;
136+ }
137+ else {
138+ var url = await query . UploadAsync ( ) ;
140139
141- case MediaTypeNames . Multipart . FormData :
142- var parser = await MultipartFormDataParser . ParseAsync ( request . InputStream ) ;
140+ await Client . LoadEnginesAsync ( ) ;
143141
144- var file = parser . Files . FirstOrDefault ( ) ;
142+ var layout = new Layout ( "Root" )
143+ . SplitColumns ( new Layout ( "Left" )
144+ . SplitRows ( new Layout ( "LT" ) , new Layout ( "LB" ) ) ,
145+ new Layout ( "Right" ) ) ;
145146
146- if ( file == null ) {
147- srvResponse . Message = R1 . Err_Content ;
148- }
149- else {
150- string filename = file . FileName ;
151- Stream data = file . Data ;
152- sqInput = data ;
147+ // LT
153148
154- }
149+ var grid = ConsoleFormat . CreateConfigGrid ( Client . Config , query ) ;
150+ var padding = new Padding ( vertical : 1 , horizontal : 0 ) ;
155151
156- break ;
152+ var gridPanel = new Panel ( grid )
153+ {
154+ Padding = padding ,
155+ Expand = false
156+ } ;
157157
158- default :
159- sqInput = await sc . ReadAsStringAsync ( ) ;
160- break ;
161- }
158+ layout [ "LT" ] . Update ( gridPanel ) ;
162159
163- query = await SearchQuery . TryCreateAsync ( sqInput ) ;
160+ // LB
164161
165- if ( query == SearchQuery . Null ) {
166- srvResponse . Message = R1 . Err_Query ;
167- }
168- else {
169- var url = await query . UploadAsync ( ) ;
162+ var ( engineMap , table ) = ConsoleFormat . GetEngineMapTable ( Client . Engines ) ;
163+ table . Expand = true ;
170164
171- var layout = new Layout ( "Root" )
172- . SplitColumns ( new Layout ( "Left" ) ,
173- new Layout ( "Right" ) ) ;
165+ layout [ "LB" ] . Update ( table ) ;
174166
167+ // Right
175168
176- var grid = ConsoleFormat . CreateConfigGrid ( Client . Config , query ) ;
177- var gridPanel = new Panel ( grid ) { Padding = null , Expand = false } ;
178- layout [ "Left" ] . Update ( gridPanel ) ;
169+ var canvasImage = ConsoleFormat . GetQueryCanvasImage ( query . Source ) ;
179170
180- var canvasImage = ConsoleFormat . GetQueryCanvasImage ( query . Source ) ;
181- var canvasImagePanel = new Panel ( canvasImage ) { Padding = null } ;
171+ var canvasImagePanel = new Panel ( canvasImage )
172+ {
173+ Padding = null
174+ } ;
182175 layout [ "Right" ] . Update ( canvasImagePanel ) ;
183176
184177 var results = new ConcurrentBag < SearchResult > ( ) ;
185- AnsiConsole . Write ( layout ) ;
186178
187- // Console.WriteLine(layout);
188- await Client . LoadEnginesAsync ( ) ;
179+ AnsiConsole . Write ( layout ) ;
189180
190- await AnsiConsole . Progress ( ) . StartAsync ( async ctx =>
181+ await AnsiConsole . Live ( layout ) . StartAsync ( async ctx =>
191182 {
192- var task = ctx . AddTask ( "Searching" , maxValue : Client . Engines . Length ) ;
193-
194- // srvResponse.Results = await Client.RunSearchAsync(sq);
195-
196183 var search = Client . RunSearchAsync ( query ) ;
197184
198185 while ( await Client . ResultChannel . Reader . WaitToReadAsync ( ) ) {
199186 var result = await Client . ResultChannel . Reader . ReadAsync ( ) ;
200187
201188 results . Add ( result ) ;
189+ var b = engineMap . TryGetValue ( result . Engine , out int r ) ;
202190
203- // m_results.Add(result);
204-
205-
206- /*var txt = new Text(result.Engine.Name, GetEngineColor(result.Engine.EngineOption));
207- var txt2 = new Text($"{result.Results.Count}");
191+ if ( b ) {
192+ table . Rows . Update ( r , 1 , new Text ( result . Results . Count . ToString ( ) ) ) ;
193+ table . Rows . Update ( r , 2 , new Text ( result . Status . ToString ( ) ) ) ;
208194
209- m_mainTable.AddRow(txt, txt2);*/
210-
211-
212- task . Increment ( 1 ) ;
213- task . Description = $ "{ result . Engine . Name } ";
214- ctx . Refresh ( ) ;
195+ // table.Rows.RemoveAt(r);
196+ ctx . Refresh ( ) ;
197+ }
215198 }
216199
217200 await search ;
218201 srvResponse . Results = results . ToArray ( ) ;
219202 srvResponse . Best = SearchClient . GetBest ( srvResponse . Results ) ;
203+ } ) ;
220204
205+ engineMap . Clear ( ) ;
221206
222- } ) ;
223207 }
224208
225209
226- /*
227- var json = JsonSerializer.Serialize(allResults, Options2);
228- ok = await response.WriteResponseStringAsync(json);
229- */
230-
231210 }
232211 catch ( IOException io ) {
233212 Trace . WriteLine ( $ "{ io } ") ;
234213 }
235214 finally {
236-
215+
237216 var responseStr = JsonSerializer . Serialize ( srvResponse , Options2 ) ;
238217 var responseBytes = Listener . Encoding . GetBytes ( responseStr ) ;
239218 var writeOk = await response . WriteResponseDataAsync ( responseBytes ) ;
@@ -252,6 +231,56 @@ await AnsiConsole.Progress().StartAsync(async ctx =>
252231 return ok ;
253232 }
254233
234+ private static async Task < SearchQuery > GetQuery ( HttpListenerRequest request )
235+ {
236+ var contentType = request . Headers [ "Content-Type" ] ?? MediaTypeNames . Text . Plain ;
237+
238+ Debug . WriteLine ( $ "{ contentType } ") ;
239+
240+ SearchQuery query ;
241+ object sqInput = null ;
242+
243+ // contentType??= MediaTypeNames.Multipart.FormData;
244+
245+ var mediaTypeHeaderValue = MediaTypeHeaderValue . Parse ( contentType ) ;
246+
247+ using var sc = new StreamContent ( request . InputStream ) ;
248+
249+ switch ( mediaTypeHeaderValue . MediaType ) {
250+ case MediaTypeNames . Text . Plain :
251+ goto default ;
252+
253+ case MediaTypeNames . Image . Bmp :
254+ break ;
255+
256+ case MediaTypeNames . Multipart . FormData :
257+ var parser = await MultipartFormDataParser . ParseAsync ( request . InputStream ) ;
258+
259+ var file = parser . Files . FirstOrDefault ( ) ;
260+
261+ if ( file == null ) {
262+ // srvResponse.Message = R1.Err_Content;
263+
264+ return null ;
265+ }
266+ else {
267+ string filename = file . FileName ;
268+ Stream data = file . Data ;
269+ sqInput = data ;
270+
271+ }
272+
273+ break ;
274+
275+ default :
276+ sqInput = await sc . ReadAsStringAsync ( ) ;
277+ break ;
278+ }
279+
280+ query = await SearchQuery . TryCreateAsync ( sqInput ) ;
281+ return query ;
282+ }
283+
255284 public Task StartAsync ( CancellationToken ct = default )
256285 {
257286 return Listener . StartAsync ( ct ) ;
@@ -266,4 +295,5 @@ public void Dispose()
266295 }
267296
268297}
298+
269299#pragma warning restore IL2026
0 commit comments