Author: hhubner Date: 2006-09-24 15:13:31 -0400 (Sun, 24 Sep 2006) New Revision: 1984
Added: branches/xml-class-rework/thirdparty/cl-mime/README branches/xml-class-rework/thirdparty/cl-mime/cl-mime.asd branches/xml-class-rework/thirdparty/cl-mime/encoding.lisp branches/xml-class-rework/thirdparty/cl-mime/package.lisp Removed: branches/xml-class-rework/thirdparty/cl-mime/fundamentals.lisp branches/xml-class-rework/thirdparty/cl-mime/mime.asd Modified: branches/xml-class-rework/thirdparty/cl-mime/classes.lisp branches/xml-class-rework/thirdparty/cl-mime/headers.lisp branches/xml-class-rework/thirdparty/cl-mime/parse-mime.lisp branches/xml-class-rework/thirdparty/cl-mime/print-mime.lisp branches/xml-class-rework/thirdparty/cl-mime/utilities.lisp Log: Update to cl-mime 0.5.1
Added: branches/xml-class-rework/thirdparty/cl-mime/README =================================================================== --- branches/xml-class-rework/thirdparty/cl-mime/README 2006-09-15 14:21:24 UTC (rev 1983) +++ branches/xml-class-rework/thirdparty/cl-mime/README 2006-09-24 19:13:31 UTC (rev 1984) @@ -0,0 +1,9 @@ +This is a library for reading and printing MIME content. It supports +automatic conversion between 7bit, quoted-printable and base64 +encodings via cl-base64 and cl-qprint libraries. + +The required libraries can be found at: +http://files.b9.com/cl-base64/cl-base64-latest.tar.gz +http://www.bobturf.org/software/cl-qprint +http://weitz.de/cl-ppcre/ +
Added: branches/xml-class-rework/thirdparty/cl-mime/cl-mime.asd =================================================================== --- branches/xml-class-rework/thirdparty/cl-mime/cl-mime.asd 2006-09-15 14:21:24 UTC (rev 1983) +++ branches/xml-class-rework/thirdparty/cl-mime/cl-mime.asd 2006-09-24 19:13:31 UTC (rev 1984) @@ -0,0 +1,42 @@ +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;; cl-mime.asd: System Definition +;;;; Copyright (C) 2004 Robert Marlow bobstopper@bobturf.org +;;;; +;;;; This library is free software; you can redistribute it and/or +;;;; modify it under the terms of the GNU Library General Public +;;;; License as published by the Free Software Foundation; either +;;;; version 2 of the License, or (at your option) any later version. +;;;; +;;;; This library is distributed in the hope that it will be useful, +;;;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +;;;; Library General Public License for more details. +;;;; +;;;; You should have received a copy of the GNU Library General Public +;;;; License along with this library; if not, write to the +;;;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, +;;;; Boston, MA 02111-1307, USA. +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + + +(defpackage :cl-mime-system + (:use :asdf :cl)) + +(in-package :cl-mime-system) + +(defsystem :cl-mime + :name "MIME" + :author "Robert Marlow bobstopper@bobturf.org" + :version "0.5.1" + :maintainer "Robert Marlow bobstopper@bobturf.org" + :depends-on (:cl-ppcre :cl-base64 :cl-qprint) + :serial t + :components + ((:file "package") + (:file "utilities") + (:file "classes") + (:file "headers") + (:file "encoding") + (:file "parse-mime") + (:file "print-mime")))
Modified: branches/xml-class-rework/thirdparty/cl-mime/classes.lisp =================================================================== --- branches/xml-class-rework/thirdparty/cl-mime/classes.lisp 2006-09-15 14:21:24 UTC (rev 1983) +++ branches/xml-class-rework/thirdparty/cl-mime/classes.lisp 2006-09-24 19:13:31 UTC (rev 1984) @@ -47,7 +47,16 @@ (content-transfer-encoding :accessor content-transfer-encoding :initarg :encoding - :initform "7bit") + :initform :7bit + :documentation + "Encoding to use when printing the MIME content. +May be :7BIT :BASE64 or :QUOTED-PRINTABLE") + (content-encoding + :accessor content-encoding + :initarg :content-encoding + :initform :7bit + :documentation "Encoding the MIME content is currently in. +May be :7BIT :BASE64 or :QUOTED-PRINTABLE") (content-disposition :accessor content-disposition :initarg :disposition
Added: branches/xml-class-rework/thirdparty/cl-mime/encoding.lisp =================================================================== --- branches/xml-class-rework/thirdparty/cl-mime/encoding.lisp 2006-09-15 14:21:24 UTC (rev 1983) +++ branches/xml-class-rework/thirdparty/cl-mime/encoding.lisp 2006-09-24 19:13:31 UTC (rev 1984) @@ -0,0 +1,46 @@ +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;; encoding.lisp: Tools for converting content encoding +;;;; Copyright (C) 2004 Robert Marlow bobstopper@bobturf.org +;;;; +;;;; This library is free software; you can redistribute it and/or +;;;; modify it under the terms of the GNU Library General Public +;;;; License as published by the Free Software Foundation; either +;;;; version 2 of the License, or (at your option) any later version. +;;;; +;;;; This library is distributed in the hope that it will be useful, +;;;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +;;;; Library General Public License for more details. +;;;; +;;;; You should have received a copy of the GNU Library General Public +;;;; License along with this library; if not, write to the +;;;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, +;;;; Boston, MA 02111-1307, USA. +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + + +(in-package :mime) + + +(defun encode-content (mime) + (if (eql (content-transfer-encoding mime) + (content-encoding mime)) + (content mime) + (let ((content (decode-content mime))) + (ecase (content-transfer-encoding mime) + (:7bit content) + (:base64 + (typecase content + (string (string-to-base64-string content :columns 75)) + ((array (unsigned-byte 8)) + (usb8-array-to-base64-string content :columns 75)))) + (:quoted-printable (qprint:encode content 75)))))) + + +(defun decode-content (mime) + (ecase (content-encoding mime) + (:7bit (content mime)) + (:base64 (base64-string-to-usb8-array (content mime))) + (:quoted-printable (qprint:decode (content mime))))) +
Deleted: branches/xml-class-rework/thirdparty/cl-mime/fundamentals.lisp =================================================================== --- branches/xml-class-rework/thirdparty/cl-mime/fundamentals.lisp 2006-09-15 14:21:24 UTC (rev 1983) +++ branches/xml-class-rework/thirdparty/cl-mime/fundamentals.lisp 2006-09-24 19:13:31 UTC (rev 1984) @@ -1,58 +0,0 @@ -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;;;; fundamentals.lisp: Package definition and any globals -;;;; Copyright (C) 2004 Robert Marlow bobstopper@bobturf.org -;;;; -;;;; This library is free software; you can redistribute it and/or -;;;; modify it under the terms of the GNU Library General Public -;;;; License as published by the Free Software Foundation; either -;;;; version 2 of the License, or (at your option) any later version. -;;;; -;;;; This library is distributed in the hope that it will be useful, -;;;; but WITHOUT ANY WARRANTY; without even the implied warranty of -;;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -;;;; Library General Public License for more details. -;;;; -;;;; You should have received a copy of the GNU Library General Public -;;;; License along with this library; if not, write to the -;;;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, -;;;; Boston, MA 02111-1307, USA. -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - - - -(defpackage :mime - (:documentation "A package for constructing MIME objects for printing and -parsing MIME formatted strings or streams.") - (:nicknames :cl-mime) - (:use :cl :kmrcl :cl-ppcre) - (:shadow :read-stream-to-string) - (:export :text-mime - :multipart-mime - :mime - :make-content-id - :content-type - :content-subtype - :content-type-parameters - :content-id - :content-description - :content-transfer-encoding - :content-disposition - :content-disposition-parameters - :mime-version - :charset - :boundary - :prologue - :epilogue - :content - :get-header - :get-mime-headers - :get-content-type-parameter - :get-content-disposition-parameter - :print-headers - :header-value - :header-parms - :header-comments - :print-mime - :parse-mime)) - -(in-package :mime)
Modified: branches/xml-class-rework/thirdparty/cl-mime/headers.lisp =================================================================== --- branches/xml-class-rework/thirdparty/cl-mime/headers.lisp 2006-09-15 14:21:24 UTC (rev 1983) +++ branches/xml-class-rework/thirdparty/cl-mime/headers.lisp 2006-09-24 19:13:31 UTC (rev 1984) @@ -51,16 +51,16 @@
(defmethod get-header ((mime-obj mime) (header (eql :content-disposition))) - (aif (slot-value mime-obj (intern (string header) :mime)) - (cons header - (format nil "~A~A" - (content-disposition mime-obj) - (format nil "~{~{;~%~5,5T~A="~A"~}~}" - (mapcar - (lambda (parm-pair) - (cons (string-downcase (symbol-name (car parm-pair))) - (cdr parm-pair))) - (content-disposition-parameters mime-obj))))))) + (when (content-disposition mime-obj) + (cons header + (format nil "~A~A" + (content-disposition mime-obj) + (format nil "~{~{;~%~5,5T~A="~A"~}~}" + (mapcar + (lambda (parm-pair) + (cons (string-downcase (symbol-name (car parm-pair))) + (cdr parm-pair))) + (content-disposition-parameters mime-obj)))))))
(defmethod get-header ((mime-obj mime) (header symbol))
Deleted: branches/xml-class-rework/thirdparty/cl-mime/mime.asd =================================================================== --- branches/xml-class-rework/thirdparty/cl-mime/mime.asd 2006-09-15 14:21:24 UTC (rev 1983) +++ branches/xml-class-rework/thirdparty/cl-mime/mime.asd 2006-09-24 19:13:31 UTC (rev 1984) @@ -1,41 +0,0 @@ -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;;;; mime.asd: System Definition -;;;; Copyright (C) 2004 Robert Marlow bobstopper@bobturf.org -;;;; -;;;; This library is free software; you can redistribute it and/or -;;;; modify it under the terms of the GNU Library General Public -;;;; License as published by the Free Software Foundation; either -;;;; version 2 of the License, or (at your option) any later version. -;;;; -;;;; This library is distributed in the hope that it will be useful, -;;;; but WITHOUT ANY WARRANTY; without even the implied warranty of -;;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -;;;; Library General Public License for more details. -;;;; -;;;; You should have received a copy of the GNU Library General Public -;;;; License along with this library; if not, write to the -;;;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, -;;;; Boston, MA 02111-1307, USA. -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - - - -(defpackage :mime-system - (:use :asdf :cl)) - -(in-package :mime-system) - -(defsystem :mime - :name "MIME" - :author "Robert Marlow rob@bobturf.org" - :version "0.3.0" - :maintainer "Robert Marlow rob@bobturf.org" - :depends-on (:kmrcl :cl-ppcre) - :serial t - :components - ((:file "fundamentals") - (:file "utilities") - (:file "classes") - (:file "headers") - (:file "parse-mime") - (:file "print-mime")))
Added: branches/xml-class-rework/thirdparty/cl-mime/package.lisp =================================================================== --- branches/xml-class-rework/thirdparty/cl-mime/package.lisp 2006-09-15 14:21:24 UTC (rev 1983) +++ branches/xml-class-rework/thirdparty/cl-mime/package.lisp 2006-09-24 19:13:31 UTC (rev 1984) @@ -0,0 +1,62 @@ +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;; package.lisp: Package definition +;;;; Copyright (C) 2004 Robert Marlow bobstopper@bobturf.org +;;;; +;;;; This library is free software; you can redistribute it and/or +;;;; modify it under the terms of the GNU Library General Public +;;;; License as published by the Free Software Foundation; either +;;;; version 2 of the License, or (at your option) any later version. +;;;; +;;;; This library is distributed in the hope that it will be useful, +;;;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +;;;; Library General Public License for more details. +;;;; +;;;; You should have received a copy of the GNU Library General Public +;;;; License along with this library; if not, write to the +;;;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, +;;;; Boston, MA 02111-1307, USA. +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + + +(defpackage :cl-mime + (:documentation "A package for constructing MIME objects for printing and +parsing MIME formatted strings or streams.") + (:nicknames :mime) + (:use :cl :cl-ppcre :base64) + (:export :text-mime + :multipart-mime + :mime + :lookup-mime + :make-content-id + :content-type + :content-subtype + :content-type-parameters + :content-id + :content-description + :content-transfer-encoding + :content-disposition + :content-disposition-parameters + :mime-version + :charset + :boundary + :prologue + :epilogue + :content + :get-header + :get-mime-headers + :get-content-type-parameter + :get-content-disposition-parameter + :header-value + :header-parms + :header-comments + :print-mime + :print-headers + :parse-mime + :parse-body + :parse-headers + :decode-content + :encode-content)) + +(in-package :mime)
Modified: branches/xml-class-rework/thirdparty/cl-mime/parse-mime.lisp =================================================================== --- branches/xml-class-rework/thirdparty/cl-mime/parse-mime.lisp 2006-09-15 14:21:24 UTC (rev 1983) +++ branches/xml-class-rework/thirdparty/cl-mime/parse-mime.lisp 2006-09-24 19:13:31 UTC (rev 1984) @@ -29,8 +29,7 @@
(defmethod parse-mime ((mime string) &optional headers) - (declare (ignore headers)) - (parse-mime (make-string-input-stream mime))) + (parse-mime (make-string-input-stream mime) headers))
(defmethod parse-mime ((mime stream) &optional headers) @@ -56,19 +55,23 @@
(if (equal mime-version "1.0") - (let ((mime-obj-gen - (list - mime-type - :type content-type - :subtype content-subtype - ; :parameters content-parm - :encoding (cdr (assoc :content-transfer-encoding - headers)) - :description (cdr (assoc :content-description - headers)) - :id (remove #< (remove #> (cdr (assoc :content-id headers)))) - :disposition content-disposition - :disposition-parameters content-disposition-parm))) + (let* ((encoding (intern (or (string-upcase + (cdr (assoc :content-transfer-encoding + headers))) + "7BIT") + :keyword)) + (mime-obj-gen + (list + mime-type + :type content-type + :subtype content-subtype + :encoding encoding + :content-encoding encoding + :description (cdr (assoc :content-description + headers)) + :id (remove #< (remove #> (cdr (assoc :content-id headers)))) + :disposition content-disposition + :disposition-parameters content-disposition-parm))) (case mime-type ((text-mime) @@ -289,3 +292,31 @@ (setq end-type 'end-mime)))) end-type)))
+ +(defparameter *mime-types-file* + (make-pathname :directory '(:absolute "etc") + :name "mime" + :type "types")) + + +(defun lookup-mime (pathname &optional mime-types-file) + "Takes a PATHNAME argument and uses MIME-TYPES-FILE (or the system +default) to determine the mime type of PATHNAME. Returns two values: +the content type and the the content subtype" + (let ((extension (pathname-type pathname))) + (with-open-file + (mime (or mime-types-file *mime-types-file*) :direction :input) + (read-lines + (line mime) + ((register-groups-bind + (extensions) + ("^[^#\s]+\s+([^#]+)" line) + (find extension (split "\s+" extensions) + :test #'string-equal)) + (if (eq line 'eof) + (values "application" "octet-stream") + (register-groups-bind + (content-type content-subtype) + ("^([^/]+)/([^\s]+)" line) + (values (or content-type "application") + (or content-subtype "octet-stream")))))))))
Modified: branches/xml-class-rework/thirdparty/cl-mime/print-mime.lisp =================================================================== --- branches/xml-class-rework/thirdparty/cl-mime/print-mime.lisp 2006-09-15 14:21:24 UTC (rev 1983) +++ branches/xml-class-rework/thirdparty/cl-mime/print-mime.lisp 2006-09-24 19:13:31 UTC (rev 1984) @@ -30,10 +30,14 @@ (format nil "~A: ~A~%" (if (eql :mime-version (car it)) "MIME-Version" - (string-capitalize (symbol-name (car it)))) - (if (eql :content-id (car it)) - (format nil "<~A>" (cdr it)) - (cdr it)))) + (string-capitalize (symbol-name (car it)))) + (cond + ((eql :content-id (car it)) + (format nil "<~A>" (cdr it))) + ((eql :content-transfer-encoding (car it)) + (string-downcase (symbol-name (cdr it)))) + (t + (cdr it))))) headers-out))
@@ -68,6 +72,7 @@ (:documentation "Prints a mime object's contents, optionally with headers"))
+ (defmethod print-mime (stream (mime-obj mime) headers-p version-p) (format stream "~A~A" (if headers-p @@ -75,8 +80,8 @@ (print-headers nil (get-mime-headers mime-obj) version-p) (string #\newline)) - "") - (content mime-obj))) + "") + (encode-content mime-obj)))
(defmethod print-mime (stream (mime-obj multipart-mime) headers-p version-p)
Modified: branches/xml-class-rework/thirdparty/cl-mime/utilities.lisp =================================================================== --- branches/xml-class-rework/thirdparty/cl-mime/utilities.lisp 2006-09-15 14:21:24 UTC (rev 1983) +++ branches/xml-class-rework/thirdparty/cl-mime/utilities.lisp 2006-09-24 19:13:31 UTC (rev 1984) @@ -47,3 +47,18 @@ (,exit-clause t) (princ ,line-var ,string-stream) (terpri ,string-stream))))) + + +;;; These macros stolen from KMRCL +(defmacro aif (test then &optional else) + `(let ((it ,test)) + (if it ,then ,else))) + + +(defun ensure-keyword (name) + "Returns keyword for a name" + (etypecase name + (keyword name) + (string (nth-value 0 (intern (string-upcase name) :keyword))) + (symbol (nth-value 0 (intern (symbol-name name) :keyword))))) +