clog/clog-system.lisp
2021-01-19 21:27:02 -05:00

86 lines
3.2 KiB
Common Lisp

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;; CLOG - The Common Lisp Omnificent GUI ;;;;
;;;; (c) 2020-2021 David Botton ;;;;
;;;; License BSD 3 Clause ;;;;
;;;; ;;;;
;;;; clog-system.lisp ;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(cl:in-package :clog)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Implementation - CLOG System
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defvar *url-to-on-new-window* (make-hash-table :test 'equalp)
"URL to on-new-window handlers")
(defvar *clog-running* nil "If clog running.")
;;;;;;;;;;;;;;;;
;; initialize ;;
;;;;;;;;;;;;;;;;
(defun on-connect (connection-id)
(when cc:*verbose-output*
(format t "Start new window handler on connection-id - ~A" connection-id))
(let ((body (make-clog-body connection-id)))
(let* ((path (path-name (location body)))
(on-new-window (or (gethash path *url-to-on-new-window*)
(gethash "default" *url-to-on-new-window*)
(gethash "/" *url-to-on-new-window*))))
(if on-new-window
(funcall on-new-window body)
(put-br (html-document win) "No route to on-new-window")))))
(defun initialize (on-new-window-handler
&key
(host "0.0.0.0")
(port 8080)
(boot-file "/boot.html")
(static-root #P"./static-files/"))
"Inititalize CLOG on a socket using HOST and PORT to serve BOOT-FILE as
the default route to establish web-socket connections and static files
located at STATIC-ROOT. If CLOG was already initialized and not shut
down, this function does the same as set-on-new-window. If the variable
clog:*overide-static-root* is set STATIC-ROOT will be ignored. If BOOT-FILE
is nil no default boot-file will be set for /."
(set-on-new-window on-new-window-handler :path "/" :boot-file boot-file)
(unless *clog-running*
(setf *clog-running* t)
(cc:initialize #'on-connect
:host host
:port port
:boot-file boot-file
:static-root (if (boundp '*overide-static-root*)
*overide-static-root*
static-root))))
;;;;;;;;;;;;;;;;;;;;;;;
;; set-on-new-window ;;
;;;;;;;;;;;;;;;;;;;;;;;
(defun set-on-new-window (on-new-window-handler
&key (path "/") (boot-file "/boot.html"))
"Set or change the on-new-window handler or set a new one for PATH
using BOOT_FILE. Paths should always begin with a '/'. If PATH is set to
\"default\" will use boot-file when the route can not be determined, ie
a static html file including boot.js that has not been added with this
function. If BOOT-FILE is nil path is removed."
(cc:set-clog-path path boot-file)
(if boot-file
(setf (gethash path *url-to-on-new-window*) on-new-window-handler)
(remhash path *url-to-on-new-window*)))
;;;;;;;;;;;;;;
;; shutdown ;;
;;;;;;;;;;;;;;
(defun shutdown ()
"Shutdown CLOG."
(clrhash *url-to-on-new-window*)
(setf *clog-running* nil)
(cc:shutdown-clog))