throw specs: must add XThread if method can be cancelled must add out-of-memory exception if method allocs and returns an object should catch and handle out-of-mem if object wasn't going to be returned CServer * must have connection thread in screen info map allows disconnect if screen map changes and screen is removed * put mutex locks wherever necessary (like accessing m_active) CClient * need methods for screen event handler to call as appropriate server client ------ ------ [accept] <-- connect challenge --> [encrypt] [verify] <-- response (encrypted challenge, client name) hangup if invalid query info --> <-- info (size) ... enter (x,y) --> clipboard data --> optional mouse/key events --> optional query clipboard --> optional <-- clipboard data (cont.) leave --> ... grab clipboard --> ... (on clipboard ownership stolen) <-- clipboard lost ... (on screen resize) <-- info (size) ... (on screen saver, primary screen) saver (on/off) --> ... quit --> <-- close --- primary screen open close enter leave warp clipboard (get/set) screen saver (show/hide) queue events with server (including screen saver activation) secondary screen open close enter leave warp synth mouse synth key clipboard (get/set) screen saver (show/hide) queue events with client (clipboard lost/changed, size change) --- client: open close wait: server messages, clipboard taken, screen resize, quit server: accept asynchronously accept new clients config asynchronously accept and handle config message (via HTTP) primary asynchronously handle primary screen events comm send/recv messages to/from clients