Fix let form.
[doldaconnect.git] / lib / guile / dolcon / util.scm
CommitLineData
d3372da9 1(define-module (dolcon util))
2(use-modules (dolcon ui))
3
4(define fnetnodes '())
c5233277 5(define loop-procs '())
6(define fn-procs '())
d3372da9 7
8(define-public dc-fn-update
9 (lambda ()
10 (set! fnetnodes
11 (let ((resp (dc-ecmd "lsnodes")) (er #f))
12 (if (and resp (begin (set! er (dc-extract resp)) er) (= (cdr (assq 'code er)) 200))
13 (map (lambda (o)
c5233277 14 (apply (lambda (id net name users state uid)
d3372da9 15 (cons id
16 (list (cons 'id id)
17 (cons 'net net)
18 (cons 'name name)
19 (cons 'users users)
c5233277 20 (cons 'state (list-ref '(syn hs est dead) state))
21 (cons 'uid uid))))
d3372da9 22 o))
23 (dc-intall resp))
24 '())))
25 fnetnodes))
26
27(define-public dc-fn-getattrib
28 (lambda (id attrib)
29 (if (not (assq id fnetnodes))
30 (dc-fn-update))
31 (let ((aform (assq id fnetnodes)))
32 (if aform
33 (cdr (assq attrib (cdr aform)))
34 #f))))
35
36(define-public dc-fn-getname
37 (lambda (id)
38 (dc-fn-getattrib id 'name)))
39
40(define-public dc-getfnetnodes
41 (lambda ()
42 (map (lambda (o) (car o))
43 fnetnodes)))
c5233277 44
45(define fn-updattr
46 (lambda (id attr val)
47 (let ((aform (assq id fnetnodes)))
48 (if aform
49 (set-cdr! (assq attr (cdr aform)) val)
50 #f))))
51
52(define-public dc-fnproc-reg
53 (lambda (event proc)
54 (set! fn-procs (cons (list event proc)
55 fn-procs))))
56
57(define-public dc-handle-fn
58 (lambda ()
59 (dc-fn-update)
60 (let* ((notify (lambda (event data) (for-each (lambda (o) (if (eq? event (car o)) ((cadr o) data))) fn-procs)))
a7b765eb 61 (ua (lambda (r a) (let* ((ires (dc-intresp r))
62 (hubform (assq (car ires) fnetnodes)))
bf21dd04 63 (if hubform
64 (begin (fn-updattr (car ires) a (cadr ires))
65 (notify a (cdr (assq (car ires) fnetnodes)))))))))
c5233277 66 (dc-loop-reg ".notify" 601 (lambda (r er) (let ((ires (dc-intresp r)))
67 (fn-updattr (car ires) 'state (list-ref '(syn hs est dead) (cadr ires)))
68 (notify 'state (cdr (assq (car ires) fnetnodes))))))
69 (dc-loop-reg ".notify" 602 (lambda (r er) (ua r 'name)))
70 (dc-loop-reg ".notify" 605 (lambda (r er) (ua r 'users)))
71 (dc-loop-reg ".notify" 604 (lambda (r er)
72 (let* ((ires (dc-intresp r))
73 (new (list (cons 'id (car ires))
74 (cons 'net (cadr ires))
75 (cons 'name "")
76 (cons 'users 0)
77 (cons 'state 'syn))))
78 (set! fnetnodes
79 (cons (cons (car ires) new)
80 fnetnodes))
81 (notify 'creat new))))
82 (dc-loop-reg ".notify" 603 (lambda (r er)
83 (let* ((ires (dc-intresp r)) (nform (assq (car ires) fnetnodes)))
84 (notify 'dstr (cdr nform))
85 (set! fnetnodes (delq nform fnetnodes))))))))
86
87(define-public dc-loop-reg
88 (lambda (cmd code proc)
89 (set! loop-procs (cons (cons (cons cmd code) proc)
90 loop-procs))))
91
92(define-public dc-loop
93 (lambda ()
94 (while #t
95 (dc-select 10000)
96 (while (let ((resp (dc-getresp)))
97 (if resp
98 (let* ((er (dc-extract resp)) (code (cdr (assq 'code er))) (cmd (cdr (assq 'cmd er))))
99 (for-each
100 (lambda (o)
101 (if (and (or (not (caar o)) (equal? cmd (caar o)))
102 (or (not (cdar o)) (equal? code (cdar o))))
103 ((cdr o) resp er)))
104 loop-procs))
105 #f))
106 #f)
107 (for-each (lambda (o)
108 (if (equal? (caar o) ".periodic")
109 ((cdr o))))
110 loop-procs))))