(in-package :ssl)
;;;;;;;;;;;;;;;;;;;;;
;;; ACL style API ;;;
;;;;;;;;;;;;;;;;;;;;;

(defmethod make-ssl-client-stream ((socket integer) &rest options)
  (destructuring-bind (&key (format :binary)) options
    (when (minusp socket)
      (error "not a proper socket descriptor"))
    (let ((ssl-socket (make-instance 'ssl-internal:ssl-client-socket :fd socket)))
      (case format
        (:binary (make-instance 'binary-ssl-stream 
                                :ssl-socket ssl-socket))
        (:text (make-instance 'character-ssl-stream
                              :ssl-socket ssl-socket))
        (otherwise (error "Unknown ssl-stream format"))))))

#+lispworks
(defmethod make-ssl-client-stream ((lw-socket-stream comm:socket-stream) &rest options)
  (apply #'make-ssl-client-stream (comm:socket-stream-socket lw-socket-stream) options))

#+cormanlisp
(defmethod make-ssl-client-stream (stream  &rest options)
  (apply #'make-ssl-client-stream (sockets:socket-descriptor (cl::stream-handle stream)) options))

(defmethod make-ssl-server-stream ((socket integer) &rest options)
  (destructuring-bind (&key certificate key other-certificates (format :binary)) options
    (when (minusp socket)
      (error "not a proper socket descriptor"))
        (let ((ssl-socket (make-instance 'ssl-internal:ssl-server-socket
                                         :fd socket
                                         :rsa-privatekey-file (or key certificate)
                                         :certificate-file (or certificate key))))
      (case format
        (:binary (make-instance 'binary-ssl-stream 
                                :ssl-socket ssl-socket))
        (:text (make-instance 'character-ssl-stream
                              :ssl-socket ssl-socket))
        (otherwise (error "Unknown ssl-stream format"))))))

(defmethod make-ssl-server-stream ((socket ssl-stream-mixin) &rest options)
  (warn "SSL socket ~A reused" socket)
  socket)

#+lispworks
(defmethod make-ssl-server-stream ((lw-socket-stream comm:socket-stream) &rest options)
  (apply #'make-ssl-server-stream (comm:socket-stream-socket lw-socket-stream) options))


#+ignore
(defmethod make-ssl-server-stream ((acl-socket acl-socket::server-socket) &rest options)
  (apply #'make-ssl-server-stream 
         (comm::get-fd-from-socket (acl-socket::passive-socket acl-socket)) options))

#+ignore
(defmethod make-ssl-server-stream ((lw-socket-stream acl-socket::chunked-socket-stream) &rest options)
  (apply #'make-ssl-server-stream (comm:socket-stream-socket lw-socket-stream) options))