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