#lang scheme/base
(require (planet bzlib/base)
         net/base64
         "port.ss"
         "filter.ss"
         (rename-in net/base64 (base64-decode-stream input-base64-filter))
         )
(define (output-base64-filter in out)
  (base64-encode-stream in out #"\n"))
(define (open-input-base64-port in)
  (make-input-filter-port in input-base64-filter #f))
(define call-with-input-base64-port
  (make-call-with-input-port open-input-base64-port in))
(define (open-input-base64-file path)
  (open-input-base64-port (open-input-file path)))
(define call-with-input-base64-file
  (make-call-with-input-port open-input-base64-file path))
(define (open-output-base64-port out)
  (make-output-filter-port out output-base64-filter #f))
(define call-with-output-base64-port
  (make-call-with-output-port open-output-base64-port out))
(define (open-output-base64-file path #:exists (exists 'replace))
  (open-input-base64-port (open-output-file path #:exists exists)))
(define call-with-output-base64-file
  (make-call-with-output-port open-output-base64-file path #:exists (exists 'replace)))
(provide/contract 
 (open-input-base64-port (-> input-port? input-port?))
 (call-with-input-base64-port (-> input-port? (-> input-port? any) any))
 (open-input-base64-file (-> path-string? input-port?))
 (call-with-input-base64-file (-> path-string? (-> input-port? any) any))
 (open-output-base64-port (-> output-port? output-port?))
 (call-with-output-base64-port (-> output-port? (-> output-port? any) any))
 (open-output-base64-file (->* (path-string?)
                               (#:exists (or/c 'replace 'error))
                               output-port?))
 (call-with-output-base64-file (->* (path-string? (-> output-port? any))
                                    (#:exists (or/c 'replace 'error))
                                    any))
 (output-base64-filter port-filter/c)
 )
(provide input-base64-filter)