236 } |
236 } |
237 |
237 |
238 def remove_task(task: Task): Unit = |
238 def remove_task(task: Task): Unit = |
239 _tasks.change(_ - task) |
239 _tasks.change(_ - task) |
240 |
240 |
241 def cancel_task(id: UUID): Unit = |
241 def cancel_task(id: UUID.T): Unit = |
242 _tasks.change(tasks => { tasks.find(task => task.id == id).foreach(_.cancel); tasks }) |
242 _tasks.change(tasks => { tasks.find(task => task.id == id).foreach(_.cancel); tasks }) |
243 |
243 |
244 def close() |
244 def close() |
245 { |
245 { |
246 while(_tasks.change_result(tasks => { tasks.foreach(_.cancel); (tasks.nonEmpty, tasks) })) |
246 while(_tasks.change_result(tasks => { tasks.foreach(_.cancel); (tasks.nonEmpty, tasks) })) |
280 |
280 |
281 class Task private[Server](val context: Context, body: Task => JSON.Object.T) |
281 class Task private[Server](val context: Context, body: Task => JSON.Object.T) |
282 { |
282 { |
283 task => |
283 task => |
284 |
284 |
285 val id: UUID = UUID() |
285 val id: UUID.T = UUID.random() |
286 val ident: JSON.Object.Entry = ("task" -> id.toString) |
286 val ident: JSON.Object.Entry = ("task" -> id.toString) |
287 |
287 |
288 val progress: Connection_Progress = context.progress(ident) |
288 val progress: Connection_Progress = context.progress(ident) |
289 def cancel { progress.stop } |
289 def cancel { progress.stop } |
290 |
290 |
490 { |
490 { |
491 server => |
491 server => |
492 |
492 |
493 private val server_socket = new ServerSocket(_port, 50, InetAddress.getByName("127.0.0.1")) |
493 private val server_socket = new ServerSocket(_port, 50, InetAddress.getByName("127.0.0.1")) |
494 |
494 |
495 private val _sessions = Synchronized(Map.empty[UUID, Headless.Session]) |
495 private val _sessions = Synchronized(Map.empty[UUID.T, Headless.Session]) |
496 def err_session(id: UUID): Nothing = error("No session " + Library.single_quote(id.toString)) |
496 def err_session(id: UUID.T): Nothing = error("No session " + Library.single_quote(id.toString)) |
497 def the_session(id: UUID): Headless.Session = _sessions.value.get(id) getOrElse err_session(id) |
497 def the_session(id: UUID.T): Headless.Session = _sessions.value.get(id) getOrElse err_session(id) |
498 def add_session(entry: (UUID, Headless.Session)) { _sessions.change(_ + entry) } |
498 def add_session(entry: (UUID.T, Headless.Session)) { _sessions.change(_ + entry) } |
499 def remove_session(id: UUID): Headless.Session = |
499 def remove_session(id: UUID.T): Headless.Session = |
500 { |
500 { |
501 _sessions.change_result(sessions => |
501 _sessions.change_result(sessions => |
502 sessions.get(id) match { |
502 sessions.get(id) match { |
503 case Some(session) => (session, sessions - id) |
503 case Some(session) => (session, sessions - id) |
504 case None => err_session(id) |
504 case None => err_session(id) |
518 catch { case ERROR(msg) => log("Session shutdown failed: " + msg) } |
518 catch { case ERROR(msg) => log("Session shutdown failed: " + msg) } |
519 } |
519 } |
520 } |
520 } |
521 |
521 |
522 def port: Int = server_socket.getLocalPort |
522 def port: Int = server_socket.getLocalPort |
523 val password: String = UUID().toString |
523 val password: String = UUID.random_string() |
524 |
524 |
525 override def toString: String = Server.print(port, password) |
525 override def toString: String = Server.print(port, password) |
526 |
526 |
527 private def handle(connection: Server.Connection) |
527 private def handle(connection: Server.Connection) |
528 { |
528 { |