#!r6rs (library (rsc3 osc transport) (export open-tcp close-transport osc-send osc-recv osc-request) (import (rnrs) (rnrs bytevectors) (ikarus) (rsc3 osc decode) (rsc3 osc encode) (rsc3 u8 encode) (rsc3 u8 decode)) (define-record-type transport (fields type ip op)) (define (tcp-transport? t) (eq? (transport-type t) 'tcp)) (define (udp-transport? t) (eq? (transport-type t) 'tcp)) (define (open-tcp h p) (let-values (((op ip) (tcp-connect h p))) (make-transport 'tcp ip op))) (define (close-transport t) (close-input-port (transport-ip t)) (close-output-port (transport-op t))) (define (put-bytevector* p v) (let ((n (bytevector-length v))) (let loop ((i 0)) (if (= i n) #f (let ((b (bytevector-u8-ref v i))) (put-u8 p b) (loop (+ i 1))))))) (define (osc-send t m) (let ((p (transport-op t)) (v (encode-osc m))) (cond ((tcp-transport? t) (put-bytevector* p (encode-i32 (bytevector-length v))) (put-bytevector* p v)) (else (error 'osc-send "unknown transport"))))) (define (osc-recv t _) (error 'osc-recv "unknown transport")) (define (osc-request u r m t) (osc-send u m) (let ((p (osc-recv u t))) (if (and p (string=? (car p) r)) p #f))) )