1 (define-module (dolcon util))
2 (use-modules (dolcon ui))
5 (define loop-procs '())
8 (define-public dc-fn-update
11 (let ((resp (dc-ecmd "lsnodes")) (er #f))
12 (if (and resp (begin (set! er (dc-extract resp)) er) (= (cdr (assq 'code er)) 200))
14 (apply (lambda (id net name users state uid)
20 (cons 'state (list-ref '(syn hs est dead) state))
27 (define-public dc-fn-getattrib
29 (if (not (assq id fnetnodes))
31 (let ((aform (assq id fnetnodes)))
33 (cdr (assq attrib (cdr aform)))
36 (define-public dc-fn-getname
38 (dc-fn-getattrib id 'name)))
40 (define-public dc-getfnetnodes
42 (map (lambda (o) (car o))
47 (let ((aform (assq id fnetnodes)))
49 (set-cdr! (assq attr (cdr aform)) val)
52 (define-public dc-fnproc-reg
54 (set! fn-procs (cons (list event proc)
57 (define-public dc-handle-fn
60 (let* ((notify (lambda (event data) (for-each (lambda (o) (if (eq? event (car o)) ((cadr o) data))) fn-procs)))
61 (ua (lambda (r a) (let ((ires (dc-intresp r)))
62 (fn-updattr (car ires) a (cadr ires))
63 (notify a (cdr (assq (car ires) fnetnodes)))))))
64 (dc-loop-reg ".notify" 601 (lambda (r er) (let ((ires (dc-intresp r)))
65 (fn-updattr (car ires) 'state (list-ref '(syn hs est dead) (cadr ires)))
66 (notify 'state (cdr (assq (car ires) fnetnodes))))))
67 (dc-loop-reg ".notify" 602 (lambda (r er) (ua r 'name)))
68 (dc-loop-reg ".notify" 605 (lambda (r er) (ua r 'users)))
69 (dc-loop-reg ".notify" 604 (lambda (r er)
70 (let* ((ires (dc-intresp r))
71 (new (list (cons 'id (car ires))
72 (cons 'net (cadr ires))
77 (cons (cons (car ires) new)
79 (notify 'creat new))))
80 (dc-loop-reg ".notify" 603 (lambda (r er)
81 (let* ((ires (dc-intresp r)) (nform (assq (car ires) fnetnodes)))
82 (notify 'dstr (cdr nform))
83 (set! fnetnodes (delq nform fnetnodes))))))))
85 (define-public dc-loop-reg
86 (lambda (cmd code proc)
87 (set! loop-procs (cons (cons (cons cmd code) proc)
90 (define-public dc-loop
94 (while (let ((resp (dc-getresp)))
96 (let* ((er (dc-extract resp)) (code (cdr (assq 'code er))) (cmd (cdr (assq 'cmd er))))
99 (if (and (or (not (caar o)) (equal? cmd (caar o)))
100 (or (not (cdar o)) (equal? code (cdar o))))
105 (for-each (lambda (o)
106 (if (equal? (caar o) ".periodic")