mail-1.1.2/0000775000076500007650000000000010614714024012014 5ustar dogdog00000000000000mail-1.1.2/acinclude.m40000664000076500007650000000101710614714012014201 0ustar dogdog00000000000000m4_include([m4/ac_check_class.m4]) m4_include([m4/ac_check_classpath.m4]) m4_include([m4/ac_check_rqrd_class.m4]) m4_include([m4/ac_java_options.m4]) m4_include([m4/ac_prog_jar.m4]) m4_include([m4/ac_prog_java.m4]) m4_include([m4/ac_prog_java_works.m4]) m4_include([m4/ac_prog_javac.m4]) m4_include([m4/ac_prog_javac_works.m4]) m4_include([m4/ac_prog_javadoc.m4]) m4_include([m4/am_prog_gcj.m4]) m4_include([m4/gnumail_with_activation_jar.m4]) m4_include([m4/gnumail_with_inetlib_jar.m4]) m4_include([m4/gnumail_with_jsse.m4]) mail-1.1.2/aclocal.m40000664000076500007650000005052110614714012013654 0ustar dogdog00000000000000# generated automatically by aclocal 1.9.6 -*- Autoconf -*- # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, # 2005 Free Software Foundation, Inc. # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. # Copyright (C) 2002, 2003, 2005 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_AUTOMAKE_VERSION(VERSION) # ---------------------------- # Automake X.Y traces this macro to ensure aclocal.m4 has been # generated from the m4 files accompanying Automake X.Y. AC_DEFUN([AM_AUTOMAKE_VERSION], [am__api_version="1.9"]) # AM_SET_CURRENT_AUTOMAKE_VERSION # ------------------------------- # Call AM_AUTOMAKE_VERSION so it can be traced. # This function is AC_REQUIREd by AC_INIT_AUTOMAKE. AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], [AM_AUTOMAKE_VERSION([1.9.6])]) # AM_AUX_DIR_EXPAND -*- Autoconf -*- # Copyright (C) 2001, 2003, 2005 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets # $ac_aux_dir to `$srcdir/foo'. In other projects, it is set to # `$srcdir', `$srcdir/..', or `$srcdir/../..'. # # Of course, Automake must honor this variable whenever it calls a # tool from the auxiliary directory. The problem is that $srcdir (and # therefore $ac_aux_dir as well) can be either absolute or relative, # depending on how configure is run. This is pretty annoying, since # it makes $ac_aux_dir quite unusable in subdirectories: in the top # source directory, any form will work fine, but in subdirectories a # relative path needs to be adjusted first. # # $ac_aux_dir/missing # fails when called from a subdirectory if $ac_aux_dir is relative # $top_srcdir/$ac_aux_dir/missing # fails if $ac_aux_dir is absolute, # fails when called from a subdirectory in a VPATH build with # a relative $ac_aux_dir # # The reason of the latter failure is that $top_srcdir and $ac_aux_dir # are both prefixed by $srcdir. In an in-source build this is usually # harmless because $srcdir is `.', but things will broke when you # start a VPATH build or use an absolute $srcdir. # # So we could use something similar to $top_srcdir/$ac_aux_dir/missing, # iff we strip the leading $srcdir from $ac_aux_dir. That would be: # am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"` # and then we would define $MISSING as # MISSING="\${SHELL} $am_aux_dir/missing" # This will work as long as MISSING is not called from configure, because # unfortunately $(top_srcdir) has no meaning in configure. # However there are other variables, like CC, which are often used in # configure, and could therefore not use this "fixed" $ac_aux_dir. # # Another solution, used here, is to always expand $ac_aux_dir to an # absolute PATH. The drawback is that using absolute paths prevent a # configured tree to be moved without reconfiguration. AC_DEFUN([AM_AUX_DIR_EXPAND], [dnl Rely on autoconf to set up CDPATH properly. AC_PREREQ([2.50])dnl # expand $ac_aux_dir to an absolute path am_aux_dir=`cd $ac_aux_dir && pwd` ]) # AM_CONDITIONAL -*- Autoconf -*- # Copyright (C) 1997, 2000, 2001, 2003, 2004, 2005 # Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 7 # AM_CONDITIONAL(NAME, SHELL-CONDITION) # ------------------------------------- # Define a conditional. AC_DEFUN([AM_CONDITIONAL], [AC_PREREQ(2.52)dnl ifelse([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl AC_SUBST([$1_TRUE]) AC_SUBST([$1_FALSE]) if $2; then $1_TRUE= $1_FALSE='#' else $1_TRUE='#' $1_FALSE= fi AC_CONFIG_COMMANDS_PRE( [if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then AC_MSG_ERROR([[conditional "$1" was never defined. Usually this means the macro was only invoked conditionally.]]) fi])]) # Do all the work for Automake. -*- Autoconf -*- # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005 # Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 12 # This macro actually does too much. Some checks are only needed if # your package does certain things. But this isn't really a big deal. # AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE]) # AM_INIT_AUTOMAKE([OPTIONS]) # ----------------------------------------------- # The call with PACKAGE and VERSION arguments is the old style # call (pre autoconf-2.50), which is being phased out. PACKAGE # and VERSION should now be passed to AC_INIT and removed from # the call to AM_INIT_AUTOMAKE. # We support both call styles for the transition. After # the next Automake release, Autoconf can make the AC_INIT # arguments mandatory, and then we can depend on a new Autoconf # release and drop the old call support. AC_DEFUN([AM_INIT_AUTOMAKE], [AC_PREREQ([2.58])dnl dnl Autoconf wants to disallow AM_ names. We explicitly allow dnl the ones we care about. m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl AC_REQUIRE([AC_PROG_INSTALL])dnl # test to see if srcdir already configured if test "`cd $srcdir && pwd`" != "`pwd`" && test -f $srcdir/config.status; then AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi AC_SUBST([CYGPATH_W]) # Define the identity of the package. dnl Distinguish between old-style and new-style calls. m4_ifval([$2], [m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl AC_SUBST([PACKAGE], [$1])dnl AC_SUBST([VERSION], [$2])], [_AM_SET_OPTIONS([$1])dnl AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl _AM_IF_OPTION([no-define],, [AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package]) AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])])dnl # Some tools Automake needs. AC_REQUIRE([AM_SANITY_CHECK])dnl AC_REQUIRE([AC_ARG_PROGRAM])dnl AM_MISSING_PROG(ACLOCAL, aclocal-${am__api_version}) AM_MISSING_PROG(AUTOCONF, autoconf) AM_MISSING_PROG(AUTOMAKE, automake-${am__api_version}) AM_MISSING_PROG(AUTOHEADER, autoheader) AM_MISSING_PROG(MAKEINFO, makeinfo) AM_PROG_INSTALL_SH AM_PROG_INSTALL_STRIP AC_REQUIRE([AM_PROG_MKDIR_P])dnl # We need awk for the "check" target. The system "awk" is bad on # some platforms. AC_REQUIRE([AC_PROG_AWK])dnl AC_REQUIRE([AC_PROG_MAKE_SET])dnl AC_REQUIRE([AM_SET_LEADING_DOT])dnl _AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])], [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], [_AM_PROG_TAR([v7])])]) _AM_IF_OPTION([no-dependencies],, [AC_PROVIDE_IFELSE([AC_PROG_CC], [_AM_DEPENDENCIES(CC)], [define([AC_PROG_CC], defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl AC_PROVIDE_IFELSE([AC_PROG_CXX], [_AM_DEPENDENCIES(CXX)], [define([AC_PROG_CXX], defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl ]) ]) # When config.status generates a header, we must update the stamp-h file. # This file resides in the same directory as the config header # that is generated. The stamp files are numbered to have different names. # Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the # loop where config.status creates the headers, so we can generate # our stamp files there. AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK], [# Compute $1's index in $config_headers. _am_stamp_count=1 for _am_header in $config_headers :; do case $_am_header in $1 | $1:* ) break ;; * ) _am_stamp_count=`expr $_am_stamp_count + 1` ;; esac done echo "timestamp for $1" >`AS_DIRNAME([$1])`/stamp-h[]$_am_stamp_count]) # Copyright (C) 2001, 2003, 2005 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_PROG_INSTALL_SH # ------------------ # Define $install_sh. AC_DEFUN([AM_PROG_INSTALL_SH], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl install_sh=${install_sh-"$am_aux_dir/install-sh"} AC_SUBST(install_sh)]) # Copyright (C) 2003, 2005 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 2 # Check whether the underlying file-system supports filenames # with a leading dot. For instance MS-DOS doesn't. AC_DEFUN([AM_SET_LEADING_DOT], [rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null AC_SUBST([am__leading_dot])]) # Fake the existence of programs that GNU maintainers use. -*- Autoconf -*- # Copyright (C) 1997, 1999, 2000, 2001, 2003, 2005 # Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 4 # AM_MISSING_PROG(NAME, PROGRAM) # ------------------------------ AC_DEFUN([AM_MISSING_PROG], [AC_REQUIRE([AM_MISSING_HAS_RUN]) $1=${$1-"${am_missing_run}$2"} AC_SUBST($1)]) # AM_MISSING_HAS_RUN # ------------------ # Define MISSING if not defined so far and test if it supports --run. # If it does, set am_missing_run to use it, otherwise, to nothing. AC_DEFUN([AM_MISSING_HAS_RUN], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl test x"${MISSING+set}" = xset || MISSING="\${SHELL} $am_aux_dir/missing" # Use eval to expand $SHELL if eval "$MISSING --run true"; then am_missing_run="$MISSING --run " else am_missing_run= AC_MSG_WARN([`missing' script is too old or missing]) fi ]) # Copyright (C) 2003, 2004, 2005 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_PROG_MKDIR_P # --------------- # Check whether `mkdir -p' is supported, fallback to mkinstalldirs otherwise. # # Automake 1.8 used `mkdir -m 0755 -p --' to ensure that directories # created by `make install' are always world readable, even if the # installer happens to have an overly restrictive umask (e.g. 077). # This was a mistake. There are at least two reasons why we must not # use `-m 0755': # - it causes special bits like SGID to be ignored, # - it may be too restrictive (some setups expect 775 directories). # # Do not use -m 0755 and let people choose whatever they expect by # setting umask. # # We cannot accept any implementation of `mkdir' that recognizes `-p'. # Some implementations (such as Solaris 8's) are not thread-safe: if a # parallel make tries to run `mkdir -p a/b' and `mkdir -p a/c' # concurrently, both version can detect that a/ is missing, but only # one can create it and the other will error out. Consequently we # restrict ourselves to GNU make (using the --version option ensures # this.) AC_DEFUN([AM_PROG_MKDIR_P], [if mkdir -p --version . >/dev/null 2>&1 && test ! -d ./--version; then # We used to keeping the `.' as first argument, in order to # allow $(mkdir_p) to be used without argument. As in # $(mkdir_p) $(somedir) # where $(somedir) is conditionally defined. However this is wrong # for two reasons: # 1. if the package is installed by a user who cannot write `.' # make install will fail, # 2. the above comment should most certainly read # $(mkdir_p) $(DESTDIR)$(somedir) # so it does not work when $(somedir) is undefined and # $(DESTDIR) is not. # To support the latter case, we have to write # test -z "$(somedir)" || $(mkdir_p) $(DESTDIR)$(somedir), # so the `.' trick is pointless. mkdir_p='mkdir -p --' else # On NextStep and OpenStep, the `mkdir' command does not # recognize any option. It will interpret all options as # directories to create, and then abort because `.' already # exists. for d in ./-p ./--version; do test -d $d && rmdir $d done # $(mkinstalldirs) is defined by Automake if mkinstalldirs exists. if test -f "$ac_aux_dir/mkinstalldirs"; then mkdir_p='$(mkinstalldirs)' else mkdir_p='$(install_sh) -d' fi fi AC_SUBST([mkdir_p])]) # Helper functions for option handling. -*- Autoconf -*- # Copyright (C) 2001, 2002, 2003, 2005 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 3 # _AM_MANGLE_OPTION(NAME) # ----------------------- AC_DEFUN([_AM_MANGLE_OPTION], [[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])]) # _AM_SET_OPTION(NAME) # ------------------------------ # Set option NAME. Presently that only means defining a flag for this option. AC_DEFUN([_AM_SET_OPTION], [m4_define(_AM_MANGLE_OPTION([$1]), 1)]) # _AM_SET_OPTIONS(OPTIONS) # ---------------------------------- # OPTIONS is a space-separated list of Automake options. AC_DEFUN([_AM_SET_OPTIONS], [AC_FOREACH([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])]) # _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET]) # ------------------------------------------- # Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. AC_DEFUN([_AM_IF_OPTION], [m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) # Check to make sure that the build environment is sane. -*- Autoconf -*- # Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005 # Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 4 # AM_SANITY_CHECK # --------------- AC_DEFUN([AM_SANITY_CHECK], [AC_MSG_CHECKING([whether build environment is sane]) # Just in case sleep 1 echo timestamp > conftest.file # Do `set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( set X `ls -Lt $srcdir/configure conftest.file 2> /dev/null` if test "$[*]" = "X"; then # -L didn't work. set X `ls -t $srcdir/configure conftest.file` fi rm -f conftest.file if test "$[*]" != "X $srcdir/configure conftest.file" \ && test "$[*]" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken alias in your environment]) fi test "$[2]" = conftest.file ) then # Ok. : else AC_MSG_ERROR([newly created file is older than distributed files! Check your system clock]) fi AC_MSG_RESULT(yes)]) # Copyright (C) 2001, 2003, 2005 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_PROG_INSTALL_STRIP # --------------------- # One issue with vendor `install' (even GNU) is that you can't # specify the program used to strip binaries. This is especially # annoying in cross-compiling environments, where the build's strip # is unlikely to handle the host's binaries. # Fortunately install-sh will honor a STRIPPROG variable, so we # always use install-sh in `make install-strip', and initialize # STRIPPROG with the value of the STRIP variable (set by the user). AC_DEFUN([AM_PROG_INSTALL_STRIP], [AC_REQUIRE([AM_PROG_INSTALL_SH])dnl # Installed binaries are usually stripped using `strip' when the user # run `make install-strip'. However `strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the `STRIP' environment variable to overrule this program. dnl Don't test for $cross_compiling = yes, because it might be `maybe'. if test "$cross_compiling" != no; then AC_CHECK_TOOL([STRIP], [strip], :) fi INSTALL_STRIP_PROGRAM="\${SHELL} \$(install_sh) -c -s" AC_SUBST([INSTALL_STRIP_PROGRAM])]) # Check how to create a tarball. -*- Autoconf -*- # Copyright (C) 2004, 2005 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 2 # _AM_PROG_TAR(FORMAT) # -------------------- # Check how to create a tarball in format FORMAT. # FORMAT should be one of `v7', `ustar', or `pax'. # # Substitute a variable $(am__tar) that is a command # writing to stdout a FORMAT-tarball containing the directory # $tardir. # tardir=directory && $(am__tar) > result.tar # # Substitute a variable $(am__untar) that extract such # a tarball read from stdin. # $(am__untar) < result.tar AC_DEFUN([_AM_PROG_TAR], [# Always define AMTAR for backward compatibility. AM_MISSING_PROG([AMTAR], [tar]) m4_if([$1], [v7], [am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -'], [m4_case([$1], [ustar],, [pax],, [m4_fatal([Unknown tar format])]) AC_MSG_CHECKING([how to create a $1 tar archive]) # Loop over all known methods to create a tar archive until one works. _am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none' _am_tools=${am_cv_prog_tar_$1-$_am_tools} # Do not fold the above two line into one, because Tru64 sh and # Solaris sh will not grok spaces in the rhs of `-'. for _am_tool in $_am_tools do case $_am_tool in gnutar) for _am_tar in tar gnutar gtar; do AM_RUN_LOG([$_am_tar --version]) && break done am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"' am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"' am__untar="$_am_tar -xf -" ;; plaintar) # Must skip GNU tar: if it does not support --format= it doesn't create # ustar tarball either. (tar --version) >/dev/null 2>&1 && continue am__tar='tar chf - "$$tardir"' am__tar_='tar chf - "$tardir"' am__untar='tar xf -' ;; pax) am__tar='pax -L -x $1 -w "$$tardir"' am__tar_='pax -L -x $1 -w "$tardir"' am__untar='pax -r' ;; cpio) am__tar='find "$$tardir" -print | cpio -o -H $1 -L' am__tar_='find "$tardir" -print | cpio -o -H $1 -L' am__untar='cpio -i -H $1 -d' ;; none) am__tar=false am__tar_=false am__untar=false ;; esac # If the value was cached, stop now. We just wanted to have am__tar # and am__untar set. test -n "${am_cv_prog_tar_$1}" && break # tar/untar a dummy directory, and stop if the command works rm -rf conftest.dir mkdir conftest.dir echo GrepMe > conftest.dir/file AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar]) rm -rf conftest.dir if test -s conftest.tar; then AM_RUN_LOG([$am__untar /dev/null 2>&1 && break fi done rm -rf conftest.dir AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool]) AC_MSG_RESULT([$am_cv_prog_tar_$1])]) AC_SUBST([am__tar]) AC_SUBST([am__untar]) ]) # _AM_PROG_TAR m4_include([acinclude.m4]) mail-1.1.2/AUTHORS0000664000076500007650000000031610614714012013061 0ustar dogdog00000000000000Andrew Selkirk did the initial work on the API classes and on the SMTP provider. Nic Ferrier wrote the IMAP provider based on Kawa. Chris Burdess wrote the IMAP4, POP3, mbox, Maildir, and NNTP providers. mail-1.1.2/build.xml0000664000076500007650000002261610614714012013641 0ustar dogdog00000000000000 This file is provided in the event that you do not have GNU Make installed. WARNING: compilation using Ant is not supported, see the file INSTALL for details rfc822=smtp protocol=smtp; type=transport; class=gnu.mail.providers.smtp.SMTPTransport; vendor=nferrier@tapsellferrier.co.uk; protocol=smtps; type=transport; class=gnu.mail.providers.smtp.SMTPTransport; vendor=nferrier@tapsellferrier.co.uk; protocol=imap; type=store; class=gnu.mail.providers.imap.IMAPStore; vendor=dog@gnu.org; protocol=pop3; type=store; class=gnu.mail.providers.pop3.POP3Store; vendor=dog@gnu.org; protocol=nntp; type=store; class=gnu.mail.providers.nntp.NNTPStore; vendor=dog@gnu.org; protocol=nntp-post; type=transport; class=gnu.mail.providers.nntp.NNTPTransport; vendor=dog@gnu.org; protocol=mbox; type=store; class=gnu.mail.providers.mbox.MboxStore; vendor=dog@gnu.org; protocol=maildir; type=store; class=gnu.mail.providers.maildir.MaildirStore; vendor=dog@gnu.org; GNU JavaMail]]> Copyright 2003, 2004 The Free Software Foundation, All rights reserved mail-1.1.2/ChangeLog0000664000076500007650000003106210614714012013565 0ustar dogdog000000000000002007-04-28 Chris Burdess * source/javax/mail/internet/MimeUtility.java: Ensure pseudorandom hashCode generated integers are positive. 2007-04-26 Chris Burdess * source/javax/mail/internet/InternetAddress.java: Use FQDN of host. * source/javax/mail/internet/MimeMessage.java, source/javax/mail/internet/MimeUtility.java: Update Message-ID when message content changes. 2007-04-24 Arend Freije * source/javax/mail/util/SharedFileInputStream.java: Maintain a count of open streams that share the same file. 2007-04-24 Arend Freije * javamail.providers.in, source/gnu/mail/providers/smtp/SMTPTransport.java: Complete SMTPS implementation. 2007-03-29 Chris Burdess * source/gnu/mail/providers/smtp/SMTPTransport.java: updated licence terms. 2007-03-27 Chris Burdess * source/javax/mail/internet/InternetHeaders.java: make inner class InternetHeader constructors public. 2007-03-27 Chris Burdess * source/javax/mail/internet/InternetHeaders.java: make inner class InternetHeader protected for compatibility with JavaMail 1.4. 2006-07-24 Chris Burdess * source/javax/mail/internet/MimeBodyPart.java, * source/javax/mail/internet/MimeMessage.java: Ensure correct content-type is applied for new MIME body parts in setFileName. 2006-07-24 Chris Burdess * source/gnu/mail/protocol/pop3/POP3Folder.java: Return null for getParent if root folder. 2006-07-19 Chris Burdess * source/gnu/mail/handler/Application.java: Permit InputStream as a supported object type. 2006-05-05 Cedric Hyppolite * source/gnu/mail/providers/nntp/NNTPRootFolder.java, * source/gnu/mail/providers/nntp/ListFolderListener: Provide callback interface for receiving group names asynchronously. 2006-05-03 Chris Burdess * source/gnu/mail/providers/imap/IMAPBodyPart.java: Handle IMAP strings as content in FETCH BODY MIME body part updates. 2006-04-26 Chris Burdess * source/gnu/mail/providers/imap/IMAPMessage.java: Fix BODYSTRUCTURE parsing of MIME body parts. 2006-03-08 Chris Burdess * source/gnu/mail/providers/smtp/SMTPTransport.java: Fix NPE in sendMessage. 2006-02-23 Chris Burdess * source/gnu/mail/providers/imap/IMAPStore.java, source/gnu/mail/providers/pop3/POP3Store.java: isConnected method issues a NOOP to server to ensure that connection is still usable. 2006-02-21 Chris Burdess * source/gnu/mail/providers/imap/IMAPFolder.java: Permit custom SearchTerms in IMAP searches. 2006-02-18 Chris Burdess * source/gnu/mail/providers/imap/IMAPFolder.java: Always list from NIL context rather than parent folder. * source/javax/mail/Flags.java: Fix for IllegalAccessError in libgcj. 2006-02-12 Chris Burdess * IMAPStore.java: Fix for possible NPE getting namespaces. 2005-11-26 Chris Burdess * (all): Updated JavaMail API to 1.4 (except PreencodedMimeBodyPart class, see TODO) based on JSR 919. 2005-11-25 Chris Burdess * IMAPStore.java,POP3Store.java,MaildirStore.java: Un-URL-encode file paths from URLNames. 2005-11-24 Chris Burdess * m4/gnumail_with_activation_jar.m4,m4/gnumail_with_inetlib_jar.m4: Add $prefix/share/java to search path for external libraries. 2005-11-20 Chris Burdess * build.xml: Fixed obsolete classpath reference in javadoc target. 2005-09-09 Chris Burdess * smtp: Implemented MTRK extension. 2005-09-07 Chris Burdess * IMAPFolder.java,ACL.java,Rights.java: Simplistic (and deprecated) IMAP ACL implementation for compatibility purposes. 2005-06-20 Archit Shah * MimeMessage.java,MimeBodyPart.java: Remove line wrapping in the bodies of MIME parts. 2005-06-06 Chris Burdess * InternetAddress.java: Do not set strict in no-arg constructor. * all: Redocumented all javax.mail classes. 2005-06-08 Archit Shah * InternetHeaders.java: Do not wrap header input stream in CRLFInputStream. 2005-06-06 Chris Burdess * Makefile.am,Session.java,IMAPStore.java,POP3Store.java, SMTPTransport.java,NNTPTransport.java,NNTPStore.java, MboxStore.java,MaildirStore.java: New logging framework. * POP3Store.java,SMTPTransport.java: Handle POP3S, SMTPS protocols. 2005-06-06 Byron Foster * Makefile.am: Fix creation of javamail.address.map. * IMAPStore.java: Handle IMAPS protocol. 2005-06-02 Byron Foster * IMAPFolder.java: Do server-side searches for unread message counts. 2005-05-16 Fernando Nasser * SMTPConnection.java: Make SMTP transport behave the same as the Sun RI when host is not supplied on connect. 2005-05-16 Fernando Nasser * FetchProfile.java,Header.java,Message.java,MimeUtility.java, InternetHeaders.java: Changes to conform to JavaMail 1.3 API. 2005-05-11 Chris Burdess * Service.java,Multipart.java: Changes to conform to JavaMail 1.3 API. * SMTPTransport.java: Default to localhost if no host specified. 2005-05-01 Chris Burdess * MboxStore.java,MboxFolder.java: Encode/decode URL paths correctly. 2005-04-26 Chris Burdess * MboxStore.java,MboxFolder.java: Convert slashes in folder pathnames to platform path separator before interpreting. 2005-04-23 Chris Burdess * Makefile.am,Makefile.in,acinclude.m4,build.xml,configure, configure.ac,m4/ac_check_class.m4,m4/ac_check_classpath.m4, m4/ac_check_home.m4,m4/ac_check_junit.m4,m4/ac_check_rqrd_class.m4, m4/ac_java_options.m4,m4/ac_prog_jar.m4,m4/ac_prog_java.m4, m4/ac_prog_java_cc.m4,m4/ac_prog_java_works.m4,m4/ac_prog_javac.m4, m4/ac_prog_javac_works.m4,m4/ac_prog_javadoc.m4,m4/ac_prog_javah.m4, m4/ac_try_run_javac.m4,m4/am_prog_gcj.m4, m4/gnumail_with_activation_jar.m4,m4/gnumail_with_inetlib_jar.m4 m4/gnumail_with_jsse.m4: Updated build system to detect common free JVMs, compilers and utilities. * INSTALL: Updated install documentation. 2005-04-21 Chris Burdess * MboxStore.java,MboxFolder.java: Rework of path framework to better follow JavaMail standard. 2005-04-20 Chris Burdess * MboxStore.java: Clarification of default mailbox directory location. 2005-04-19 Chris Burdess * IMAPMessage.java,IMAPFlags.java: Store only flag deltas using +FLAGS and -FLAGS during setFlags. 2005-04-19 Chris Burdess * MimeMultipart.java: Remove debugging code. * mailcap,MultipartReport.java: Mailcap entry for multipart/report. 2005-03-04 Chris Burdess * InternetHeaders.java: Ensure input stream is always filtered for CRLF pairs. 2005-02-21 Chris Burdess * MboxStore.java,MboxFolder.java: Allow absolute filenames. 2005-02-17 Chris Burdess * MboxFolder.java: Clarification of canonical function. * MailDateFormat.java: Handle trailing whitespace. 2005-02-15 Countach * MboxFolder.java,MboxStore.java: Support Windows filenames. 2005-02-14 Neil Campbell * IMAPFolder.java: Allow folders to hold both messages and folders. 2005-02-07 Chris Burdess * README.pop3,README.nntp,README.mbox,README.maildir: Correct method names in documentation. 2005-01-19 Chris Burdess * acinclude.m4: Detect JSSE in Java runtime. * UUInputStream.java,UUOutputStream.java: New UU encoder/decoder supporting block reads and under FSF copyright. * UUDecoderStream.java,UUEncoderStream.java: Removed. 2005-01-05 Chris Burdess * UUDecoderStream.java: Fixed case where EOF is reached before buffer is full. * POP3Message.java: Make Message.setFlag(DELETED) work. * mbox: Converted to GNU style. 2004-12-08 Chris Burdess * Makefile.am: Fixed relative META-INF. * all: Reformatted according to GNU Classpath guidelines. * ContentType.java,ParameterList.java: Parse exception message details cause of exception (#103447). 2004-12-04 Chris Burdess * IMAPStore.java,IMAPFolder.java: Expose quota functionality of underlying IMAPConnection. 2004-11-01 Chris Burdess * ParameterList.java: Report original value which caused a parse to fail. 2004-09-30 Chris Burdess * MANIFEST.MF: Added Implementation-* entries. 2004-09-29 Chris Burdess * IMAPStore.java: Implement IMAP namespaces. 2004-09-28 Chris Burdess * URLName.java: Permit '@' in userInfo component of URL. 2004-09-24 Chris Burdess * SMTPTransport.java,IMAPStore.java,POP3Store.java: Implement password authentication callbacks where necessary. 2004-09-10 Chris Burdess * SMTPTransport.java,IMAPStore.java,POP3Store.java: Implement user ordering of SASL mechanism preferences. 2004-09-09 Chris Burdess * SMTPTransport.java: Only use DSN if server advertises the capability. * ParameterList.java,MimeUtility.java: Support RFC 2231. 2004-09-08 Chris Burdess * SMTPTransport.java: New property value tls=required added and ESMTP extension list no longer exposed. EHLO issued following STARTTLS. * MimeMultipart.java,InternetHeaders.java: Trim method to remove final CR. 2004-09-07 Chris Burdess * SMTPTransport.java: Expose ESMTP extension list. * SMTPTransport.java: Don't pass ESMTP parameters when EHLO fails. * SMTPTransport.java: Don't invoke DATA when no valid recipients are specified. 2004-08-06 Chris Burdess * IMAPFolder.java: Correct folder pathnames in list() commands. 2004-07-31 Chris Burdess * IMAPFolder.java: Implement UIDFolder. 2004-07-08 Chris Burdess * MailDateFormat.java: Accept obsolete style of timezone. 2004-06-07 Chris Burdess * NNTPTransport.java: Implemented transport events. 2004-06-01 Chris Burdess * Makefile.am: Applied patch #3105. 2004-05-27 Chris Burdess * MessagingException.java: Print embedded stack trace. * MailboxURLConnection.java: Stream handler for mailboxes. 2004-05-24 Chris Burdess * MimeUtility.java: Fixed MIME-Java character conversion (#8658) * SMTPTransport.java: Fixed typo propagating wrong delivery event type. 2004-03-28 Chris Burdess * Updated all required files for JavaMail 1.3 * configure.ac: Removed AC_PROG_JAVADOC. * Makefile.am: Added install targets. 2004-03-13 Chris Burdess * acinclude.m4: Added macros to find activation.jar and inetlib.jar. * configure.ac: Search for jarfiles. * Makefile.am: Allow builds in other directories. 2004-02-10 Chris Burdess * javamail.charset.map: Added some missing Java charsets. * MimeUtility.java: Corrected a charset detection bug. 2004-02-05 Chris Burdess * NNTPStore.java: Corrected retrieval of "listall" property. 2004-01-29 Chris Burdess * QPOutputStream.java: Applied O/yvind Harboe's patch to correct output of space character. 2004-01-26 Chris Burdess * build.xml: Updated ant build script to match new build system. 2004-01-25 Chris Burdess * SMTPTransport.java: Incorporated code to recover the connection to control state on an I/O error during message transmission. 2004-01-23 Chris Burdess * RFC2822OutputStream.java: Applied O/yvind Harboe's patch to correct UTF-8 encoding problem in gcj runtime. 2004-01-19 Chris Burdess * Makefile.am: Workarounds to avoid recursion. * configure.ac: Added PACKAGE and VERSION for compatibility with different versions of automake. 2004-01-11 Chris Burdess * Makefile.am: Major rework, dropping jarcompiler. Incremental builds are now supported. 2 jars are generated: gnumail.jar (API) and providers.jar. javamail.default.providers lists only providers selected in configure. New target `javadoc' generates API documentation in docs subdirectory. * configure.ac: Added javadoc program. * imap/package.html: Corrected typos. mail-1.1.2/config/0000775000076500007650000000000010614714024013261 5ustar dogdog00000000000000mail-1.1.2/config/compile0000775000076500007650000000533210614714012014637 0ustar dogdog00000000000000#! /bin/sh # Wrapper for compilers which do not understand `-c -o'. # Copyright 1999, 2000 Free Software Foundation, Inc. # Written by Tom Tromey . # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This program 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 General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # Usage: # compile PROGRAM [ARGS]... # `-o FOO.o' is removed from the args passed to the actual compile. prog=$1 shift ofile= cfile= args= while test $# -gt 0; do case "$1" in -o) # configure might choose to run compile as `compile cc -o foo foo.c'. # So we do something ugly here. ofile=$2 shift case "$ofile" in *.o | *.obj) ;; *) args="$args -o $ofile" ofile= ;; esac ;; *.c) cfile=$1 args="$args $1" ;; *) args="$args $1" ;; esac shift done if test -z "$ofile" || test -z "$cfile"; then # If no `-o' option was seen then we might have been invoked from a # pattern rule where we don't need one. That is ok -- this is a # normal compilation that the losing compiler can handle. If no # `.c' file was seen then we are probably linking. That is also # ok. exec "$prog" $args fi # Name of file we expect compiler to create. cofile=`echo $cfile | sed -e 's|^.*/||' -e 's/\.c$/.o/'` # Create the lock directory. # Note: use `[/.-]' here to ensure that we don't use the same name # that we are using for the .o file. Also, base the name on the expected # object file name, since that is what matters with a parallel build. lockdir=`echo $cofile | sed -e 's|[/.-]|_|g'`.d while true; do if mkdir $lockdir > /dev/null 2>&1; then break fi sleep 1 done # FIXME: race condition here if user kills between mkdir and trap. trap "rmdir $lockdir; exit 1" 1 2 15 # Run the compile. "$prog" $args status=$? if test -f "$cofile"; then mv "$cofile" "$ofile" fi rmdir $lockdir exit $status mail-1.1.2/config/config.guess0000775000076500007650000011315410614714012015603 0ustar dogdog00000000000000#! /bin/sh # Attempt to guess a canonical system name. # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001 # Free Software Foundation, Inc. timestamp='2001-09-04' # This file is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program 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 # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # Written by Per Bothner . # Please send patches to . # # This script attempts to guess a canonical system name similar to # config.sub. If it succeeds, it prints the system name on stdout, and # exits with 0. Otherwise, it exits with 1. # # The plan is that this can be called by configure scripts if you # don't specify an explicit build system type. me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] Output the configuration name of the system \`$me' is run on. Operation modes: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.guess ($timestamp) Originally written by Per Bothner. Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit 0 ;; --version | -v ) echo "$version" ; exit 0 ;; --help | --h* | -h ) echo "$usage"; exit 0 ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" >&2 exit 1 ;; * ) break ;; esac done if test $# != 0; then echo "$me: too many arguments$help" >&2 exit 1 fi dummy=dummy-$$ trap 'rm -f $dummy.c $dummy.o $dummy.rel $dummy; exit 1' 1 2 15 # CC_FOR_BUILD -- compiler used by this script. # Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still # use `HOST_CC' if defined, but it is deprecated. set_cc_for_build='case $CC_FOR_BUILD,$HOST_CC,$CC in ,,) echo "int dummy(){}" > $dummy.c ; for c in cc gcc c89 ; do ($c $dummy.c -c -o $dummy.o) >/dev/null 2>&1 ; if test $? = 0 ; then CC_FOR_BUILD="$c"; break ; fi ; done ; rm -f $dummy.c $dummy.o $dummy.rel ; if test x"$CC_FOR_BUILD" = x ; then CC_FOR_BUILD=no_compiler_found ; fi ;; ,,*) CC_FOR_BUILD=$CC ;; ,*,*) CC_FOR_BUILD=$HOST_CC ;; esac' # This is needed to find uname on a Pyramid OSx when run in the BSD universe. # (ghazi@noc.rutgers.edu 1994-08-24) if (test -f /.attbin/uname) >/dev/null 2>&1 ; then PATH=$PATH:/.attbin ; export PATH fi UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown # Note: order is significant - the case branches are not exclusive. case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in *:NetBSD:*:*) # Netbsd (nbsd) targets should (where applicable) match one or # more of the tupples: *-*-netbsdelf*, *-*-netbsdaout*, # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently # switched to ELF, *-*-netbsd* would select the old # object file format. This provides both forward # compatibility and a consistent mechanism for selecting the # object file format. # Determine the machine/vendor (is the vendor relevant). case "${UNAME_MACHINE}" in amiga) machine=m68k-unknown ;; arm32) machine=arm-unknown ;; atari*) machine=m68k-atari ;; sun3*) machine=m68k-sun ;; mac68k) machine=m68k-apple ;; macppc) machine=powerpc-apple ;; hp3[0-9][05]) machine=m68k-hp ;; ibmrt|romp-ibm) machine=romp-ibm ;; *) machine=${UNAME_MACHINE}-unknown ;; esac # The Operating System including object format, if it has switched # to ELF recently, or will in the future. case "${UNAME_MACHINE}" in i386|sparc|amiga|arm*|hp300|mvme68k|vax|atari|luna68k|mac68k|news68k|next68k|pc532|sun3*|x68k) eval $set_cc_for_build if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep __ELF__ >/dev/null then # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). # Return netbsd for either. FIX? os=netbsd else os=netbsdelf fi ;; *) os=netbsd ;; esac # The OS release release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: # contains redundant information, the shorter form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. echo "${machine}-${os}${release}" exit 0 ;; alpha:OSF1:*:*) if test $UNAME_RELEASE = "V4.0"; then UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` fi # A Vn.n version is a released version. # A Tn.n version is a released field test version. # A Xn.n version is an unreleased experimental baselevel. # 1.2 uses "1.2" for uname -r. cat <$dummy.s .data \$Lformat: .byte 37,100,45,37,120,10,0 # "%d-%x\n" .text .globl main .align 4 .ent main main: .frame \$30,16,\$26,0 ldgp \$29,0(\$27) .prologue 1 .long 0x47e03d80 # implver \$0 lda \$2,-1 .long 0x47e20c21 # amask \$2,\$1 lda \$16,\$Lformat mov \$0,\$17 not \$1,\$18 jsr \$26,printf ldgp \$29,0(\$26) mov 0,\$16 jsr \$26,exit .end main EOF eval $set_cc_for_build $CC_FOR_BUILD $dummy.s -o $dummy 2>/dev/null if test "$?" = 0 ; then case `./$dummy` in 0-0) UNAME_MACHINE="alpha" ;; 1-0) UNAME_MACHINE="alphaev5" ;; 1-1) UNAME_MACHINE="alphaev56" ;; 1-101) UNAME_MACHINE="alphapca56" ;; 2-303) UNAME_MACHINE="alphaev6" ;; 2-307) UNAME_MACHINE="alphaev67" ;; 2-1307) UNAME_MACHINE="alphaev68" ;; esac fi rm -f $dummy.s $dummy echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[VTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` exit 0 ;; Alpha\ *:Windows_NT*:*) # How do we know it's Interix rather than the generic POSIX subsystem? # Should we change UNAME_MACHINE based on the output of uname instead # of the specific Alpha model? echo alpha-pc-interix exit 0 ;; 21064:Windows_NT:50:3) echo alpha-dec-winnt3.5 exit 0 ;; Amiga*:UNIX_System_V:4.0:*) echo m68k-unknown-sysv4 exit 0;; amiga:OpenBSD:*:*) echo m68k-unknown-openbsd${UNAME_RELEASE} exit 0 ;; *:[Aa]miga[Oo][Ss]:*:*) echo ${UNAME_MACHINE}-unknown-amigaos exit 0 ;; arc64:OpenBSD:*:*) echo mips64el-unknown-openbsd${UNAME_RELEASE} exit 0 ;; arc:OpenBSD:*:*) echo mipsel-unknown-openbsd${UNAME_RELEASE} exit 0 ;; hkmips:OpenBSD:*:*) echo mips-unknown-openbsd${UNAME_RELEASE} exit 0 ;; pmax:OpenBSD:*:*) echo mipsel-unknown-openbsd${UNAME_RELEASE} exit 0 ;; sgi:OpenBSD:*:*) echo mips-unknown-openbsd${UNAME_RELEASE} exit 0 ;; wgrisc:OpenBSD:*:*) echo mipsel-unknown-openbsd${UNAME_RELEASE} exit 0 ;; *:OS/390:*:*) echo i370-ibm-openedition exit 0 ;; arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) echo arm-acorn-riscix${UNAME_RELEASE} exit 0;; SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) echo hppa1.1-hitachi-hiuxmpp exit 0;; Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. if test "`(/bin/universe) 2>/dev/null`" = att ; then echo pyramid-pyramid-sysv3 else echo pyramid-pyramid-bsd fi exit 0 ;; NILE*:*:*:dcosx) echo pyramid-pyramid-svr4 exit 0 ;; sun4H:SunOS:5.*:*) echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit 0 ;; sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit 0 ;; i86pc:SunOS:5.*:*) echo i386-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit 0 ;; sun4*:SunOS:6*:*) # According to config.sub, this is the proper way to canonicalize # SunOS6. Hard to guess exactly what SunOS6 will be like, but # it's likely to be more like Solaris than SunOS4. echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit 0 ;; sun4*:SunOS:*:*) case "`/usr/bin/arch -k`" in Series*|S4*) UNAME_RELEASE=`uname -v` ;; esac # Japanese Language versions have a version number like `4.1.3-JL'. echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'` exit 0 ;; sun3*:SunOS:*:*) echo m68k-sun-sunos${UNAME_RELEASE} exit 0 ;; sun*:*:4.2BSD:*) UNAME_RELEASE=`(head -1 /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3 case "`/bin/arch`" in sun3) echo m68k-sun-sunos${UNAME_RELEASE} ;; sun4) echo sparc-sun-sunos${UNAME_RELEASE} ;; esac exit 0 ;; aushp:SunOS:*:*) echo sparc-auspex-sunos${UNAME_RELEASE} exit 0 ;; sparc*:NetBSD:*) echo `uname -p`-unknown-netbsd${UNAME_RELEASE} exit 0 ;; atari*:OpenBSD:*:*) echo m68k-unknown-openbsd${UNAME_RELEASE} exit 0 ;; # The situation for MiNT is a little confusing. The machine name # can be virtually everything (everything which is not # "atarist" or "atariste" at least should have a processor # > m68000). The system name ranges from "MiNT" over "FreeMiNT" # to the lowercase version "mint" (or "freemint"). Finally # the system name "TOS" denotes a system which is actually not # MiNT. But MiNT is downward compatible to TOS, so this should # be no problem. atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit 0 ;; atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit 0 ;; *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit 0 ;; milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) echo m68k-milan-mint${UNAME_RELEASE} exit 0 ;; hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) echo m68k-hades-mint${UNAME_RELEASE} exit 0 ;; *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) echo m68k-unknown-mint${UNAME_RELEASE} exit 0 ;; sun3*:OpenBSD:*:*) echo m68k-unknown-openbsd${UNAME_RELEASE} exit 0 ;; mac68k:OpenBSD:*:*) echo m68k-unknown-openbsd${UNAME_RELEASE} exit 0 ;; mvme68k:OpenBSD:*:*) echo m68k-unknown-openbsd${UNAME_RELEASE} exit 0 ;; mvme88k:OpenBSD:*:*) echo m88k-unknown-openbsd${UNAME_RELEASE} exit 0 ;; powerpc:machten:*:*) echo powerpc-apple-machten${UNAME_RELEASE} exit 0 ;; RISC*:Mach:*:*) echo mips-dec-mach_bsd4.3 exit 0 ;; RISC*:ULTRIX:*:*) echo mips-dec-ultrix${UNAME_RELEASE} exit 0 ;; VAX*:ULTRIX*:*:*) echo vax-dec-ultrix${UNAME_RELEASE} exit 0 ;; 2020:CLIX:*:* | 2430:CLIX:*:*) echo clipper-intergraph-clix${UNAME_RELEASE} exit 0 ;; mips:*:*:UMIPS | mips:*:*:RISCos) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #ifdef __cplusplus #include /* for printf() prototype */ int main (int argc, char *argv[]) { #else int main (argc, argv) int argc; char *argv[]; { #endif #if defined (host_mips) && defined (MIPSEB) #if defined (SYSTYPE_SYSV) printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_SVR4) printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0); #endif #endif exit (-1); } EOF $CC_FOR_BUILD $dummy.c -o $dummy \ && ./$dummy `echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` \ && rm -f $dummy.c $dummy && exit 0 rm -f $dummy.c $dummy echo mips-mips-riscos${UNAME_RELEASE} exit 0 ;; Motorola:PowerMAX_OS:*:*) echo powerpc-motorola-powermax exit 0 ;; Night_Hawk:Power_UNIX:*:*) echo powerpc-harris-powerunix exit 0 ;; m88k:CX/UX:7*:*) echo m88k-harris-cxux7 exit 0 ;; m88k:*:4*:R4*) echo m88k-motorola-sysv4 exit 0 ;; m88k:*:3*:R3*) echo m88k-motorola-sysv3 exit 0 ;; AViiON:dgux:*:*) # DG/UX returns AViiON for all architectures UNAME_PROCESSOR=`/usr/bin/uname -p` if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ] then if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \ [ ${TARGET_BINARY_INTERFACE}x = x ] then echo m88k-dg-dgux${UNAME_RELEASE} else echo m88k-dg-dguxbcs${UNAME_RELEASE} fi else echo i586-dg-dgux${UNAME_RELEASE} fi exit 0 ;; M88*:DolphinOS:*:*) # DolphinOS (SVR3) echo m88k-dolphin-sysv3 exit 0 ;; M88*:*:R3*:*) # Delta 88k system running SVR3 echo m88k-motorola-sysv3 exit 0 ;; XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) echo m88k-tektronix-sysv3 exit 0 ;; Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) echo m68k-tektronix-bsd exit 0 ;; *:IRIX*:*:*) echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` exit 0 ;; ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id exit 0 ;; # Note that: echo "'`uname -s`'" gives 'AIX ' i*86:AIX:*:*) echo i386-ibm-aix exit 0 ;; ia64:AIX:*:*) if [ -x /usr/bin/oslevel ] ; then IBM_REV=`/usr/bin/oslevel` else IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} fi echo ${UNAME_MACHINE}-ibm-aix${IBM_REV} exit 0 ;; *:AIX:2:3) if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include main() { if (!__power_pc()) exit(1); puts("powerpc-ibm-aix3.2.5"); exit(0); } EOF $CC_FOR_BUILD $dummy.c -o $dummy && ./$dummy && rm -f $dummy.c $dummy && exit 0 rm -f $dummy.c $dummy echo rs6000-ibm-aix3.2.5 elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then echo rs6000-ibm-aix3.2.4 else echo rs6000-ibm-aix3.2 fi exit 0 ;; *:AIX:*:[45]) IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | head -1 | awk '{ print $1 }'` if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then IBM_ARCH=rs6000 else IBM_ARCH=powerpc fi if [ -x /usr/bin/oslevel ] ; then IBM_REV=`/usr/bin/oslevel` else IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} fi echo ${IBM_ARCH}-ibm-aix${IBM_REV} exit 0 ;; *:AIX:*:*) echo rs6000-ibm-aix exit 0 ;; ibmrt:4.4BSD:*|romp-ibm:BSD:*) echo romp-ibm-bsd4.4 exit 0 ;; ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to exit 0 ;; # report: romp-ibm BSD 4.3 *:BOSX:*:*) echo rs6000-bull-bosx exit 0 ;; DPX/2?00:B.O.S.:*:*) echo m68k-bull-sysv3 exit 0 ;; 9000/[34]??:4.3bsd:1.*:*) echo m68k-hp-bsd exit 0 ;; hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) echo m68k-hp-bsd4.4 exit 0 ;; 9000/[34678]??:HP-UX:*:*) HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` case "${UNAME_MACHINE}" in 9000/31? ) HP_ARCH=m68000 ;; 9000/[34]?? ) HP_ARCH=m68k ;; 9000/[678][0-9][0-9]) case "${HPUX_REV}" in 11.[0-9][0-9]) if [ -x /usr/bin/getconf ]; then sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` case "${sc_cpu_version}" in 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1 532) # CPU_PA_RISC2_0 case "${sc_kernel_bits}" in 32) HP_ARCH="hppa2.0n" ;; 64) HP_ARCH="hppa2.0w" ;; esac ;; esac fi ;; esac if [ "${HP_ARCH}" = "" ]; then eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #define _HPUX_SOURCE #include #include int main () { #if defined(_SC_KERNEL_BITS) long bits = sysconf(_SC_KERNEL_BITS); #endif long cpu = sysconf (_SC_CPU_VERSION); switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0"); break; case CPU_PA_RISC1_1: puts ("hppa1.1"); break; case CPU_PA_RISC2_0: #if defined(_SC_KERNEL_BITS) switch (bits) { case 64: puts ("hppa2.0w"); break; case 32: puts ("hppa2.0n"); break; default: puts ("hppa2.0"); break; } break; #else /* !defined(_SC_KERNEL_BITS) */ puts ("hppa2.0"); break; #endif default: puts ("hppa1.0"); break; } exit (0); } EOF (CCOPTS= $CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null ) && HP_ARCH=`./$dummy` if test -z "$HP_ARCH"; then HP_ARCH=hppa; fi rm -f $dummy.c $dummy fi ;; esac echo ${HP_ARCH}-hp-hpux${HPUX_REV} exit 0 ;; ia64:HP-UX:*:*) HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` echo ia64-hp-hpux${HPUX_REV} exit 0 ;; 3050*:HI-UX:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include int main () { long cpu = sysconf (_SC_CPU_VERSION); /* The order matters, because CPU_IS_HP_MC68K erroneously returns true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct results, however. */ if (CPU_IS_PA_RISC (cpu)) { switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; default: puts ("hppa-hitachi-hiuxwe2"); break; } } else if (CPU_IS_HP_MC68K (cpu)) puts ("m68k-hitachi-hiuxwe2"); else puts ("unknown-hitachi-hiuxwe2"); exit (0); } EOF $CC_FOR_BUILD $dummy.c -o $dummy && ./$dummy && rm -f $dummy.c $dummy && exit 0 rm -f $dummy.c $dummy echo unknown-hitachi-hiuxwe2 exit 0 ;; 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) echo hppa1.1-hp-bsd exit 0 ;; 9000/8??:4.3bsd:*:*) echo hppa1.0-hp-bsd exit 0 ;; *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) echo hppa1.0-hp-mpeix exit 0 ;; hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) echo hppa1.1-hp-osf exit 0 ;; hp8??:OSF1:*:*) echo hppa1.0-hp-osf exit 0 ;; i*86:OSF1:*:*) if [ -x /usr/sbin/sysversion ] ; then echo ${UNAME_MACHINE}-unknown-osf1mk else echo ${UNAME_MACHINE}-unknown-osf1 fi exit 0 ;; parisc*:Lites*:*:*) echo hppa1.1-hp-lites exit 0 ;; hppa*:OpenBSD:*:*) echo hppa-unknown-openbsd exit 0 ;; C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) echo c1-convex-bsd exit 0 ;; C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi exit 0 ;; C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) echo c34-convex-bsd exit 0 ;; C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) echo c38-convex-bsd exit 0 ;; C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) echo c4-convex-bsd exit 0 ;; CRAY*X-MP:*:*:*) echo xmp-cray-unicos exit 0 ;; CRAY*Y-MP:*:*:*) echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit 0 ;; CRAY*[A-Z]90:*:*:*) echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \ | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ -e 's/\.[^.]*$/.X/' exit 0 ;; CRAY*TS:*:*:*) echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit 0 ;; CRAY*T3D:*:*:*) echo alpha-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit 0 ;; CRAY*T3E:*:*:*) echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit 0 ;; CRAY*SV1:*:*:*) echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit 0 ;; CRAY-2:*:*:*) echo cray2-cray-unicos exit 0 ;; F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit 0 ;; hp300:OpenBSD:*:*) echo m68k-unknown-openbsd${UNAME_RELEASE} exit 0 ;; i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} exit 0 ;; sparc*:BSD/OS:*:*) echo sparc-unknown-bsdi${UNAME_RELEASE} exit 0 ;; *:BSD/OS:*:*) echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} exit 0 ;; *:FreeBSD:*:*) echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` exit 0 ;; *:OpenBSD:*:*) echo ${UNAME_MACHINE}-unknown-openbsd`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` exit 0 ;; i*:CYGWIN*:*) echo ${UNAME_MACHINE}-pc-cygwin exit 0 ;; i*:MINGW*:*) echo ${UNAME_MACHINE}-pc-mingw32 exit 0 ;; i*:PW*:*) echo ${UNAME_MACHINE}-pc-pw32 exit 0 ;; i*:Windows_NT*:* | Pentium*:Windows_NT*:*) # How do we know it's Interix rather than the generic POSIX subsystem? # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we # UNAME_MACHINE based on the output of uname instead of i386? echo i386-pc-interix exit 0 ;; i*:UWIN*:*) echo ${UNAME_MACHINE}-pc-uwin exit 0 ;; p*:CYGWIN*:*) echo powerpcle-unknown-cygwin exit 0 ;; prep*:SunOS:5.*:*) echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit 0 ;; *:GNU:*:*) echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` exit 0 ;; i*86:Minix:*:*) echo ${UNAME_MACHINE}-pc-minix exit 0 ;; arm*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit 0 ;; ia64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux exit 0 ;; m68*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit 0 ;; mips:Linux:*:*) case `sed -n '/^byte/s/^.*: \(.*\) endian/\1/p' < /proc/cpuinfo` in big) echo mips-unknown-linux-gnu && exit 0 ;; little) echo mipsel-unknown-linux-gnu && exit 0 ;; esac ;; ppc:Linux:*:*) echo powerpc-unknown-linux-gnu exit 0 ;; ppc64:Linux:*:*) echo powerpc64-unknown-linux-gnu exit 0 ;; alpha:Linux:*:*) case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in EV5) UNAME_MACHINE=alphaev5 ;; EV56) UNAME_MACHINE=alphaev56 ;; PCA56) UNAME_MACHINE=alphapca56 ;; PCA57) UNAME_MACHINE=alphapca56 ;; EV6) UNAME_MACHINE=alphaev6 ;; EV67) UNAME_MACHINE=alphaev67 ;; EV68*) UNAME_MACHINE=alphaev68 ;; esac objdump --private-headers /bin/sh | grep ld.so.1 >/dev/null if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC} exit 0 ;; parisc:Linux:*:* | hppa:Linux:*:*) # Look for CPU level case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in PA7*) echo hppa1.1-unknown-linux-gnu ;; PA8*) echo hppa2.0-unknown-linux-gnu ;; *) echo hppa-unknown-linux-gnu ;; esac exit 0 ;; parisc64:Linux:*:* | hppa64:Linux:*:*) echo hppa64-unknown-linux-gnu exit 0 ;; s390:Linux:*:* | s390x:Linux:*:*) echo ${UNAME_MACHINE}-ibm-linux exit 0 ;; sh*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit 0 ;; sparc:Linux:*:* | sparc64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit 0 ;; x86_64:Linux:*:*) echo x86_64-unknown-linux-gnu exit 0 ;; i*86:Linux:*:*) # The BFD linker knows what the default object file format is, so # first see if it will tell us. cd to the root directory to prevent # problems with other programs or directories called `ld' in the path. ld_supported_targets=`cd /; ld --help 2>&1 \ | sed -ne '/supported targets:/!d s/[ ][ ]*/ /g s/.*supported targets: *// s/ .*// p'` case "$ld_supported_targets" in elf32-i386) TENTATIVE="${UNAME_MACHINE}-pc-linux-gnu" ;; a.out-i386-linux) echo "${UNAME_MACHINE}-pc-linux-gnuaout" exit 0 ;; coff-i386) echo "${UNAME_MACHINE}-pc-linux-gnucoff" exit 0 ;; "") # Either a pre-BFD a.out linker (linux-gnuoldld) or # one that does not give us useful --help. echo "${UNAME_MACHINE}-pc-linux-gnuoldld" exit 0 ;; esac # Determine whether the default compiler is a.out or elf eval $set_cc_for_build cat >$dummy.c < #ifdef __cplusplus #include /* for printf() prototype */ int main (int argc, char *argv[]) { #else int main (argc, argv) int argc; char *argv[]; { #endif #ifdef __ELF__ # ifdef __GLIBC__ # if __GLIBC__ >= 2 printf ("%s-pc-linux-gnu\n", argv[1]); # else printf ("%s-pc-linux-gnulibc1\n", argv[1]); # endif # else printf ("%s-pc-linux-gnulibc1\n", argv[1]); # endif #else printf ("%s-pc-linux-gnuaout\n", argv[1]); #endif return 0; } EOF $CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null && ./$dummy "${UNAME_MACHINE}" && rm -f $dummy.c $dummy && exit 0 rm -f $dummy.c $dummy test x"${TENTATIVE}" != x && echo "${TENTATIVE}" && exit 0 ;; i*86:DYNIX/ptx:4*:*) # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. # earlier versions are messed up and put the nodename in both # sysname and nodename. echo i386-sequent-sysv4 exit 0 ;; i*86:UNIX_SV:4.2MP:2.*) # Unixware is an offshoot of SVR4, but it has its own version # number series starting with 2... # I am not positive that other SVR4 systems won't match this, # I just have to hope. -- rms. # Use sysv4.2uw... so that sysv4* matches it. echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION} exit 0 ;; i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*) UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'` if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL} else echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL} fi exit 0 ;; i*86:*:5:[78]*) case `/bin/uname -X | grep "^Machine"` in *486*) UNAME_MACHINE=i486 ;; *Pentium) UNAME_MACHINE=i586 ;; *Pent*|*Celeron) UNAME_MACHINE=i686 ;; esac echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} exit 0 ;; i*86:*:3.2:*) if test -f /usr/options/cb.name; then UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then UNAME_REL=`(/bin/uname -X|egrep Release|sed -e 's/.*= //')` (/bin/uname -X|egrep i80486 >/dev/null) && UNAME_MACHINE=i486 (/bin/uname -X|egrep '^Machine.*Pentium' >/dev/null) \ && UNAME_MACHINE=i586 (/bin/uname -X|egrep '^Machine.*Pent ?II' >/dev/null) \ && UNAME_MACHINE=i686 (/bin/uname -X|egrep '^Machine.*Pentium Pro' >/dev/null) \ && UNAME_MACHINE=i686 echo ${UNAME_MACHINE}-pc-sco$UNAME_REL else echo ${UNAME_MACHINE}-pc-sysv32 fi exit 0 ;; i*86:*DOS:*:*) echo ${UNAME_MACHINE}-pc-msdosdjgpp exit 0 ;; pc:*:*:*) # Left here for compatibility: # uname -m prints for DJGPP always 'pc', but it prints nothing about # the processor, so we play safe by assuming i386. echo i386-pc-msdosdjgpp exit 0 ;; Intel:Mach:3*:*) echo i386-pc-mach3 exit 0 ;; paragon:*:*:*) echo i860-intel-osf1 exit 0 ;; i860:*:4.*:*) # i860-SVR4 if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4 else # Add other i860-SVR4 vendors below as they are discovered. echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4 fi exit 0 ;; mini*:CTIX:SYS*5:*) # "miniframe" echo m68010-convergent-sysv exit 0 ;; M68*:*:R3V[567]*:*) test -r /sysV68 && echo 'm68k-motorola-sysv' && exit 0 ;; 3[34]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 4850:*:4.0:3.0) OS_REL='' test -r /etc/.relid \ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && echo i486-ncr-sysv4.3${OS_REL} && exit 0 /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ && echo i586-ncr-sysv4.3${OS_REL} && exit 0 ;; 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && echo i486-ncr-sysv4 && exit 0 ;; m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) echo m68k-unknown-lynxos${UNAME_RELEASE} exit 0 ;; mc68030:UNIX_System_V:4.*:*) echo m68k-atari-sysv4 exit 0 ;; i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.0*:*) echo i386-unknown-lynxos${UNAME_RELEASE} exit 0 ;; TSUNAMI:LynxOS:2.*:*) echo sparc-unknown-lynxos${UNAME_RELEASE} exit 0 ;; rs6000:LynxOS:2.*:*) echo rs6000-unknown-lynxos${UNAME_RELEASE} exit 0 ;; PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.0*:*) echo powerpc-unknown-lynxos${UNAME_RELEASE} exit 0 ;; SM[BE]S:UNIX_SV:*:*) echo mips-dde-sysv${UNAME_RELEASE} exit 0 ;; RM*:ReliantUNIX-*:*:*) echo mips-sni-sysv4 exit 0 ;; RM*:SINIX-*:*:*) echo mips-sni-sysv4 exit 0 ;; *:SINIX-*:*:*) if uname -p 2>/dev/null >/dev/null ; then UNAME_MACHINE=`(uname -p) 2>/dev/null` echo ${UNAME_MACHINE}-sni-sysv4 else echo ns32k-sni-sysv fi exit 0 ;; PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort # says echo i586-unisys-sysv4 exit 0 ;; *:UNIX_System_V:4*:FTX*) # From Gerald Hewes . # How about differentiating between stratus architectures? -djm echo hppa1.1-stratus-sysv4 exit 0 ;; *:*:*:FTX*) # From seanf@swdc.stratus.com. echo i860-stratus-sysv4 exit 0 ;; *:VOS:*:*) # From Paul.Green@stratus.com. echo hppa1.1-stratus-vos exit 0 ;; mc68*:A/UX:*:*) echo m68k-apple-aux${UNAME_RELEASE} exit 0 ;; news*:NEWS-OS:6*:*) echo mips-sony-newsos6 exit 0 ;; R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) if [ -d /usr/nec ]; then echo mips-nec-sysv${UNAME_RELEASE} else echo mips-unknown-sysv${UNAME_RELEASE} fi exit 0 ;; BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. echo powerpc-be-beos exit 0 ;; BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. echo powerpc-apple-beos exit 0 ;; BePC:BeOS:*:*) # BeOS running on Intel PC compatible. echo i586-pc-beos exit 0 ;; SX-4:SUPER-UX:*:*) echo sx4-nec-superux${UNAME_RELEASE} exit 0 ;; SX-5:SUPER-UX:*:*) echo sx5-nec-superux${UNAME_RELEASE} exit 0 ;; Power*:Rhapsody:*:*) echo powerpc-apple-rhapsody${UNAME_RELEASE} exit 0 ;; *:Rhapsody:*:*) echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} exit 0 ;; *:Darwin:*:*) echo `uname -p`-apple-darwin${UNAME_RELEASE} exit 0 ;; *:procnto*:*:* | *:QNX:[0123456789]*:*) if test "${UNAME_MACHINE}" = "x86pc"; then UNAME_MACHINE=pc fi echo `uname -p`-${UNAME_MACHINE}-nto-qnx exit 0 ;; *:QNX:*:4*) echo i386-pc-qnx exit 0 ;; NSR-[KW]:NONSTOP_KERNEL:*:*) echo nsr-tandem-nsk${UNAME_RELEASE} exit 0 ;; *:NonStop-UX:*:*) echo mips-compaq-nonstopux exit 0 ;; BS2000:POSIX*:*:*) echo bs2000-siemens-sysv exit 0 ;; DS/*:UNIX_System_V:*:*) echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE} exit 0 ;; *:Plan9:*:*) # "uname -m" is not consistent, so use $cputype instead. 386 # is converted to i386 for consistency with other x86 # operating systems. if test "$cputype" = "386"; then UNAME_MACHINE=i386 else UNAME_MACHINE="$cputype" fi echo ${UNAME_MACHINE}-unknown-plan9 exit 0 ;; i*86:OS/2:*:*) # If we were able to find `uname', then EMX Unix compatibility # is probably installed. echo ${UNAME_MACHINE}-pc-os2-emx exit 0 ;; *:TOPS-10:*:*) echo pdp10-unknown-tops10 exit 0 ;; *:TENEX:*:*) echo pdp10-unknown-tenex exit 0 ;; KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) echo pdp10-dec-tops20 exit 0 ;; XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) echo pdp10-xkl-tops20 exit 0 ;; *:TOPS-20:*:*) echo pdp10-unknown-tops20 exit 0 ;; *:ITS:*:*) echo pdp10-unknown-its exit 0 ;; i*86:XTS-300:*:STOP) echo ${UNAME_MACHINE}-unknown-stop exit 0 ;; i*86:atheos:*:*) echo ${UNAME_MACHINE}-unknown-atheos exit 0 ;; esac #echo '(No uname command or uname output not recognized.)' 1>&2 #echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2 eval $set_cc_for_build cat >$dummy.c < # include #endif main () { #if defined (sony) #if defined (MIPSEB) /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed, I don't know.... */ printf ("mips-sony-bsd\n"); exit (0); #else #include printf ("m68k-sony-newsos%s\n", #ifdef NEWSOS4 "4" #else "" #endif ); exit (0); #endif #endif #if defined (__arm) && defined (__acorn) && defined (__unix) printf ("arm-acorn-riscix"); exit (0); #endif #if defined (hp300) && !defined (hpux) printf ("m68k-hp-bsd\n"); exit (0); #endif #if defined (NeXT) #if !defined (__ARCHITECTURE__) #define __ARCHITECTURE__ "m68k" #endif int version; version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`; if (version < 4) printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version); else printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version); exit (0); #endif #if defined (MULTIMAX) || defined (n16) #if defined (UMAXV) printf ("ns32k-encore-sysv\n"); exit (0); #else #if defined (CMU) printf ("ns32k-encore-mach\n"); exit (0); #else printf ("ns32k-encore-bsd\n"); exit (0); #endif #endif #endif #if defined (__386BSD__) printf ("i386-pc-bsd\n"); exit (0); #endif #if defined (sequent) #if defined (i386) printf ("i386-sequent-dynix\n"); exit (0); #endif #if defined (ns32000) printf ("ns32k-sequent-dynix\n"); exit (0); #endif #endif #if defined (_SEQUENT_) struct utsname un; uname(&un); if (strncmp(un.version, "V2", 2) == 0) { printf ("i386-sequent-ptx2\n"); exit (0); } if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ printf ("i386-sequent-ptx1\n"); exit (0); } printf ("i386-sequent-ptx\n"); exit (0); #endif #if defined (vax) # if !defined (ultrix) # include # if defined (BSD) # if BSD == 43 printf ("vax-dec-bsd4.3\n"); exit (0); # else # if BSD == 199006 printf ("vax-dec-bsd4.3reno\n"); exit (0); # else printf ("vax-dec-bsd\n"); exit (0); # endif # endif # else printf ("vax-dec-bsd\n"); exit (0); # endif # else printf ("vax-dec-ultrix\n"); exit (0); # endif #endif #if defined (alliant) && defined (i860) printf ("i860-alliant-bsd\n"); exit (0); #endif exit (1); } EOF $CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null && ./$dummy && rm -f $dummy.c $dummy && exit 0 rm -f $dummy.c $dummy # Apollos put the system type in the environment. test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit 0; } # Convex versions that predate uname can use getsysinfo(1) if [ -x /usr/convex/getsysinfo ] then case `getsysinfo -f cpu_type` in c1*) echo c1-convex-bsd exit 0 ;; c2*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi exit 0 ;; c34*) echo c34-convex-bsd exit 0 ;; c38*) echo c38-convex-bsd exit 0 ;; c4*) echo c4-convex-bsd exit 0 ;; esac fi cat >&2 < in order to provide the needed information to handle your system. config.guess timestamp = $timestamp uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null` /bin/uname -X = `(/bin/uname -X) 2>/dev/null` hostinfo = `(hostinfo) 2>/dev/null` /bin/universe = `(/bin/universe) 2>/dev/null` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` /bin/arch = `(/bin/arch) 2>/dev/null` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` UNAME_MACHINE = ${UNAME_MACHINE} UNAME_RELEASE = ${UNAME_RELEASE} UNAME_SYSTEM = ${UNAME_SYSTEM} UNAME_VERSION = ${UNAME_VERSION} EOF exit 1 # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: mail-1.1.2/config/config.sub0000775000076500007650000006710410614714012015251 0ustar dogdog00000000000000#! /bin/sh # Configuration validation subroutine script. # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001 # Free Software Foundation, Inc. timestamp='2001-09-07' # This file is (in principle) common to ALL GNU software. # The presence of a machine in this file suggests that SOME GNU software # can handle that machine. It does not imply ALL GNU software can. # # This file is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program 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 General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, # Boston, MA 02110-1301, USA. # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # Please send patches to . # # Configuration subroutine to validate and canonicalize a configuration type. # Supply the specified configuration type as an argument. # If it is invalid, we print an error message on stderr and exit with code 1. # Otherwise, we print the canonical config type on stdout and succeed. # This file is supposed to be the same for all GNU packages # and recognize all the CPU types, system types and aliases # that are meaningful with *any* GNU software. # Each package is responsible for reporting which valid configurations # it does not support. The user should be able to distinguish # a failure to support a valid configuration from a meaningless # configuration. # The goal of this file is to map all the various variations of a given # machine specification into a single specification in the form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM # or in some cases, the newer four-part form: # CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM # It is wrong to echo any other type of specification. me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] CPU-MFR-OPSYS $0 [OPTION] ALIAS Canonicalize a configuration name. Operation modes: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.sub ($timestamp) Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit 0 ;; --version | -v ) echo "$version" ; exit 0 ;; --help | --h* | -h ) echo "$usage"; exit 0 ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" exit 1 ;; *local*) # First pass through any local machine types. echo $1 exit 0;; * ) break ;; esac done case $# in 0) echo "$me: missing argument$help" >&2 exit 1;; 1) ;; *) echo "$me: too many arguments$help" >&2 exit 1;; esac # Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). # Here we must recognize all the valid KERNEL-OS combinations. maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` case $maybe_os in nto-qnx* | linux-gnu* | storm-chaos* | os2-emx* | windows32-*) os=-$maybe_os basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` ;; *) basic_machine=`echo $1 | sed 's/-[^-]*$//'` if [ $basic_machine != $1 ] then os=`echo $1 | sed 's/.*-/-/'` else os=; fi ;; esac ### Let's recognize common machines as not being operating systems so ### that things like config.sub decstation-3100 work. We also ### recognize some manufacturers as not being operating systems, so we ### can provide default operating systems below. case $os in -sun*os*) # Prevent following clause from handling this invalid input. ;; -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \ -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \ -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \ -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ -apple | -axis) os= basic_machine=$1 ;; -sim | -cisco | -oki | -wec | -winbond) os= basic_machine=$1 ;; -scout) ;; -wrs) os=-vxworks basic_machine=$1 ;; -chorusos*) os=-chorusos basic_machine=$1 ;; -chorusrdb) os=-chorusrdb basic_machine=$1 ;; -hiux*) os=-hiuxwe2 ;; -sco5) os=-sco3.2v5 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco4) os=-sco3.2v4 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco3.2.[4-9]*) os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco3.2v[4-9]*) # Don't forget version if it is 3.2v4 or newer. basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco*) os=-sco3.2v2 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -udk*) basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -isc) os=-isc2.2 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -clix*) basic_machine=clipper-intergraph ;; -isc*) basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -lynx*) os=-lynxos ;; -ptx*) basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'` ;; -windowsnt*) os=`echo $os | sed -e 's/windowsnt/winnt/'` ;; -psos*) os=-psos ;; -mint | -mint[0-9]*) basic_machine=m68k-atari os=-mint ;; esac # Decode aliases for certain CPU-COMPANY combinations. case $basic_machine in # Recognize the basic CPU types without company name. # Some are omitted here because they have special meanings below. 1750a | 580 \ | a29k \ | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr \ | c4x | clipper \ | d10v | d30v | dsp16xx \ | fr30 \ | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ | i370 | i860 | i960 | ia64 \ | m32r | m68000 | m68k | m88k | mcore \ | mips16 | mips64 | mips64el | mips64orion | mips64orionel \ | mips64vr4100 | mips64vr4100el | mips64vr4300 \ | mips64vr4300el | mips64vr5000 | mips64vr5000el \ | mipsbe | mipseb | mipsel | mipsle | mipstx39 | mipstx39el \ | mipsisa32 \ | mn10200 | mn10300 \ | ns16k | ns32k \ | openrisc \ | pdp10 | pdp11 | pj | pjl \ | powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \ | pyramid \ | s390 | s390x \ | sh | sh[34] | sh[34]eb | shbe | shle \ | sparc | sparc64 | sparclet | sparclite | sparcv9 | sparcv9b \ | stormy16 | strongarm \ | tahoe | thumb | tic80 | tron \ | v850 \ | we32k \ | x86 | xscale \ | z8k) basic_machine=$basic_machine-unknown ;; m6811 | m68hc11 | m6812 | m68hc12) # Motorola 68HC11/12. basic_machine=$basic_machine-unknown os=-none ;; m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k) ;; # We use `pc' rather than `unknown' # because (1) that's what they normally are, and # (2) the word "unknown" tends to confuse beginning users. i*86 | x86_64) basic_machine=$basic_machine-pc ;; # Object if more than one company name word. *-*-*) echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 exit 1 ;; # Recognize the basic CPU types with company name. 580-* \ | a29k-* \ | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ | alphapca5[67]-* | arc-* \ | arm-* | armbe-* | armle-* | armv*-* \ | bs2000-* \ | c[123]* | c30-* | [cjt]90-* | c54x-* \ | clipper-* | cray2-* | cydra-* \ | d10v-* | d30v-* \ | elxsi-* \ | f30[01]-* | f700-* | fr30-* | fx80-* \ | h8300-* | h8500-* \ | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ | i*86-* | i860-* | i960-* | ia64-* \ | m32r-* \ | m68000-* | m680[01234]0-* | m68360-* | m683?2-* | m68k-* \ | m88110-* | m88k-* | mcore-* \ | mips-* | mips16-* | mips64-* | mips64el-* | mips64orion-* \ | mips64orionel-* | mips64vr4100-* | mips64vr4100el-* \ | mips64vr4300-* | mips64vr4300el-* | mipsbe-* | mipseb-* \ | mipsle-* | mipsel-* | mipstx39-* | mipstx39el-* \ | none-* | np1-* | ns16k-* | ns32k-* \ | orion-* \ | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \ | pyramid-* \ | romp-* | rs6000-* \ | s390-* | s390x-* \ | sh-* | sh[34]-* | sh[34]eb-* | shbe-* | shle-* \ | sparc-* | sparc64-* | sparc86x-* | sparclite-* \ | sparcv9-* | sparcv9b-* | stormy16-* | strongarm-* | sv1-* \ | t3e-* | tahoe-* | thumb-* | tic30-* | tic54x-* | tic80-* | tron-* \ | v850-* | vax-* \ | we32k-* \ | x86-* | x86_64-* | xmp-* | xps100-* | xscale-* \ | ymp-* \ | z8k-*) ;; # Recognize the various machine names and aliases which stand # for a CPU type and a company and sometimes even an OS. 386bsd) basic_machine=i386-unknown os=-bsd ;; 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) basic_machine=m68000-att ;; 3b*) basic_machine=we32k-att ;; a29khif) basic_machine=a29k-amd os=-udi ;; adobe68k) basic_machine=m68010-adobe os=-scout ;; alliant | fx80) basic_machine=fx80-alliant ;; altos | altos3068) basic_machine=m68k-altos ;; am29k) basic_machine=a29k-none os=-bsd ;; amdahl) basic_machine=580-amdahl os=-sysv ;; amiga | amiga-*) basic_machine=m68k-unknown ;; amigaos | amigados) basic_machine=m68k-unknown os=-amigaos ;; amigaunix | amix) basic_machine=m68k-unknown os=-sysv4 ;; apollo68) basic_machine=m68k-apollo os=-sysv ;; apollo68bsd) basic_machine=m68k-apollo os=-bsd ;; aux) basic_machine=m68k-apple os=-aux ;; balance) basic_machine=ns32k-sequent os=-dynix ;; convex-c1) basic_machine=c1-convex os=-bsd ;; convex-c2) basic_machine=c2-convex os=-bsd ;; convex-c32) basic_machine=c32-convex os=-bsd ;; convex-c34) basic_machine=c34-convex os=-bsd ;; convex-c38) basic_machine=c38-convex os=-bsd ;; cray | ymp) basic_machine=ymp-cray os=-unicos ;; cray2) basic_machine=cray2-cray os=-unicos ;; [cjt]90) basic_machine=${basic_machine}-cray os=-unicos ;; crds | unos) basic_machine=m68k-crds ;; cris | cris-* | etrax*) basic_machine=cris-axis ;; da30 | da30-*) basic_machine=m68k-da30 ;; decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) basic_machine=mips-dec ;; delta | 3300 | motorola-3300 | motorola-delta \ | 3300-motorola | delta-motorola) basic_machine=m68k-motorola ;; delta88) basic_machine=m88k-motorola os=-sysv3 ;; dpx20 | dpx20-*) basic_machine=rs6000-bull os=-bosx ;; dpx2* | dpx2*-bull) basic_machine=m68k-bull os=-sysv3 ;; ebmon29k) basic_machine=a29k-amd os=-ebmon ;; elxsi) basic_machine=elxsi-elxsi os=-bsd ;; encore | umax | mmax) basic_machine=ns32k-encore ;; es1800 | OSE68k | ose68k | ose | OSE) basic_machine=m68k-ericsson os=-ose ;; fx2800) basic_machine=i860-alliant ;; genix) basic_machine=ns32k-ns ;; gmicro) basic_machine=tron-gmicro os=-sysv ;; go32) basic_machine=i386-pc os=-go32 ;; h3050r* | hiux*) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; h8300hms) basic_machine=h8300-hitachi os=-hms ;; h8300xray) basic_machine=h8300-hitachi os=-xray ;; h8500hms) basic_machine=h8500-hitachi os=-hms ;; harris) basic_machine=m88k-harris os=-sysv3 ;; hp300-*) basic_machine=m68k-hp ;; hp300bsd) basic_machine=m68k-hp os=-bsd ;; hp300hpux) basic_machine=m68k-hp os=-hpux ;; hp3k9[0-9][0-9] | hp9[0-9][0-9]) basic_machine=hppa1.0-hp ;; hp9k2[0-9][0-9] | hp9k31[0-9]) basic_machine=m68000-hp ;; hp9k3[2-9][0-9]) basic_machine=m68k-hp ;; hp9k6[0-9][0-9] | hp6[0-9][0-9]) basic_machine=hppa1.0-hp ;; hp9k7[0-79][0-9] | hp7[0-79][0-9]) basic_machine=hppa1.1-hp ;; hp9k78[0-9] | hp78[0-9]) # FIXME: really hppa2.0-hp basic_machine=hppa1.1-hp ;; hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) # FIXME: really hppa2.0-hp basic_machine=hppa1.1-hp ;; hp9k8[0-9][13679] | hp8[0-9][13679]) basic_machine=hppa1.1-hp ;; hp9k8[0-9][0-9] | hp8[0-9][0-9]) basic_machine=hppa1.0-hp ;; hppa-next) os=-nextstep3 ;; hppaosf) basic_machine=hppa1.1-hp os=-osf ;; hppro) basic_machine=hppa1.1-hp os=-proelf ;; i370-ibm* | ibm*) basic_machine=i370-ibm ;; # I'm not sure what "Sysv32" means. Should this be sysv3.2? i*86v32) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv32 ;; i*86v4*) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv4 ;; i*86v) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv ;; i*86sol2) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-solaris2 ;; i386mach) basic_machine=i386-mach os=-mach ;; i386-vsta | vsta) basic_machine=i386-unknown os=-vsta ;; iris | iris4d) basic_machine=mips-sgi case $os in -irix*) ;; *) os=-irix4 ;; esac ;; isi68 | isi) basic_machine=m68k-isi os=-sysv ;; m88k-omron*) basic_machine=m88k-omron ;; magnum | m3230) basic_machine=mips-mips os=-sysv ;; merlin) basic_machine=ns32k-utek os=-sysv ;; mingw32) basic_machine=i386-pc os=-mingw32 ;; miniframe) basic_machine=m68000-convergent ;; *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*) basic_machine=m68k-atari os=-mint ;; mipsel*-linux*) basic_machine=mipsel-unknown os=-linux-gnu ;; mips*-linux*) basic_machine=mips-unknown os=-linux-gnu ;; mips3*-*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` ;; mips3*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown ;; mmix*) basic_machine=mmix-knuth os=-mmixware ;; monitor) basic_machine=m68k-rom68k os=-coff ;; msdos) basic_machine=i386-pc os=-msdos ;; mvs) basic_machine=i370-ibm os=-mvs ;; ncr3000) basic_machine=i486-ncr os=-sysv4 ;; netbsd386) basic_machine=i386-unknown os=-netbsd ;; netwinder) basic_machine=armv4l-rebel os=-linux ;; news | news700 | news800 | news900) basic_machine=m68k-sony os=-newsos ;; news1000) basic_machine=m68030-sony os=-newsos ;; news-3600 | risc-news) basic_machine=mips-sony os=-newsos ;; necv70) basic_machine=v70-nec os=-sysv ;; next | m*-next ) basic_machine=m68k-next case $os in -nextstep* ) ;; -ns2*) os=-nextstep2 ;; *) os=-nextstep3 ;; esac ;; nh3000) basic_machine=m68k-harris os=-cxux ;; nh[45]000) basic_machine=m88k-harris os=-cxux ;; nindy960) basic_machine=i960-intel os=-nindy ;; mon960) basic_machine=i960-intel os=-mon960 ;; nonstopux) basic_machine=mips-compaq os=-nonstopux ;; np1) basic_machine=np1-gould ;; nsr-tandem) basic_machine=nsr-tandem ;; op50n-* | op60c-*) basic_machine=hppa1.1-oki os=-proelf ;; OSE68000 | ose68000) basic_machine=m68000-ericsson os=-ose ;; os68k) basic_machine=m68k-none os=-os68k ;; pa-hitachi) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; paragon) basic_machine=i860-intel os=-osf ;; pbd) basic_machine=sparc-tti ;; pbb) basic_machine=m68k-tti ;; pc532 | pc532-*) basic_machine=ns32k-pc532 ;; pentium | p5 | k5 | k6 | nexgen) basic_machine=i586-pc ;; pentiumpro | p6 | 6x86 | athlon) basic_machine=i686-pc ;; pentiumii | pentium2) basic_machine=i686-pc ;; pentium-* | p5-* | k5-* | k6-* | nexgen-*) basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentiumpro-* | p6-* | 6x86-* | athlon-*) basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentiumii-* | pentium2-*) basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pn) basic_machine=pn-gould ;; power) basic_machine=power-ibm ;; ppc) basic_machine=powerpc-unknown ;; ppc-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppcle | powerpclittle | ppc-le | powerpc-little) basic_machine=powerpcle-unknown ;; ppcle-* | powerpclittle-*) basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppc64) basic_machine=powerpc64-unknown ;; ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppc64le | powerpc64little | ppc64-le | powerpc64-little) basic_machine=powerpc64le-unknown ;; ppc64le-* | powerpc64little-*) basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ps2) basic_machine=i386-ibm ;; pw32) basic_machine=i586-unknown os=-pw32 ;; rom68k) basic_machine=m68k-rom68k os=-coff ;; rm[46]00) basic_machine=mips-siemens ;; rtpc | rtpc-*) basic_machine=romp-ibm ;; sa29200) basic_machine=a29k-amd os=-udi ;; sequent) basic_machine=i386-sequent ;; sh) basic_machine=sh-hitachi os=-hms ;; sparclite-wrs) basic_machine=sparclite-wrs os=-vxworks ;; sps7) basic_machine=m68k-bull os=-sysv2 ;; spur) basic_machine=spur-unknown ;; st2000) basic_machine=m68k-tandem ;; stratus) basic_machine=i860-stratus os=-sysv4 ;; sun2) basic_machine=m68000-sun ;; sun2os3) basic_machine=m68000-sun os=-sunos3 ;; sun2os4) basic_machine=m68000-sun os=-sunos4 ;; sun3os3) basic_machine=m68k-sun os=-sunos3 ;; sun3os4) basic_machine=m68k-sun os=-sunos4 ;; sun4os3) basic_machine=sparc-sun os=-sunos3 ;; sun4os4) basic_machine=sparc-sun os=-sunos4 ;; sun4sol2) basic_machine=sparc-sun os=-solaris2 ;; sun3 | sun3-*) basic_machine=m68k-sun ;; sun4) basic_machine=sparc-sun ;; sun386 | sun386i | roadrunner) basic_machine=i386-sun ;; sv1) basic_machine=sv1-cray os=-unicos ;; symmetry) basic_machine=i386-sequent os=-dynix ;; t3e) basic_machine=t3e-cray os=-unicos ;; tic54x | c54x*) basic_machine=tic54x-unknown os=-coff ;; tx39) basic_machine=mipstx39-unknown ;; tx39el) basic_machine=mipstx39el-unknown ;; tower | tower-32) basic_machine=m68k-ncr ;; udi29k) basic_machine=a29k-amd os=-udi ;; ultra3) basic_machine=a29k-nyu os=-sym1 ;; v810 | necv810) basic_machine=v810-nec os=-none ;; vaxv) basic_machine=vax-dec os=-sysv ;; vms) basic_machine=vax-dec os=-vms ;; vpp*|vx|vx-*) basic_machine=f301-fujitsu ;; vxworks960) basic_machine=i960-wrs os=-vxworks ;; vxworks68) basic_machine=m68k-wrs os=-vxworks ;; vxworks29k) basic_machine=a29k-wrs os=-vxworks ;; w65*) basic_machine=w65-wdc os=-none ;; w89k-*) basic_machine=hppa1.1-winbond os=-proelf ;; windows32) basic_machine=i386-pc os=-windows32-msvcrt ;; xmp) basic_machine=xmp-cray os=-unicos ;; xps | xps100) basic_machine=xps100-honeywell ;; z8k-*-coff) basic_machine=z8k-unknown os=-sim ;; none) basic_machine=none-none os=-none ;; # Here we handle the default manufacturer of certain CPU types. It is in # some cases the only manufacturer, in others, it is the most popular. w89k) basic_machine=hppa1.1-winbond ;; op50n) basic_machine=hppa1.1-oki ;; op60c) basic_machine=hppa1.1-oki ;; mips) if [ x$os = x-linux-gnu ]; then basic_machine=mips-unknown else basic_machine=mips-mips fi ;; romp) basic_machine=romp-ibm ;; rs6000) basic_machine=rs6000-ibm ;; vax) basic_machine=vax-dec ;; pdp10) # there are many clones, so DEC is not a safe bet basic_machine=pdp10-unknown ;; pdp11) basic_machine=pdp11-dec ;; we32k) basic_machine=we32k-att ;; sh3 | sh4 | sh3eb | sh4eb) basic_machine=sh-unknown ;; sparc | sparcv9 | sparcv9b) basic_machine=sparc-sun ;; cydra) basic_machine=cydra-cydrome ;; orion) basic_machine=orion-highlevel ;; orion105) basic_machine=clipper-highlevel ;; mac | mpw | mac-mpw) basic_machine=m68k-apple ;; pmac | pmac-mpw) basic_machine=powerpc-apple ;; c4x*) basic_machine=c4x-none os=-coff ;; *-unknown) # Make sure to match an already-canonicalized machine name. ;; *) echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 exit 1 ;; esac # Here we canonicalize certain aliases for manufacturers. case $basic_machine in *-digital*) basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'` ;; *-commodore*) basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'` ;; *) ;; esac # Decode manufacturer-specific aliases for certain operating systems. if [ x"$os" != x"" ] then case $os in # First match some system type aliases # that might get confused with valid system types. # -solaris* is a basic system type, with this one exception. -solaris1 | -solaris1.*) os=`echo $os | sed -e 's|solaris1|sunos4|'` ;; -solaris) os=-solaris2 ;; -svr4*) os=-sysv4 ;; -unixware*) os=-sysv4.2uw ;; -gnu/linux*) os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` ;; # First accept the basic system types. # The portable systems comes first. # Each alternative MUST END IN A *, to match a version number. # -sysv* is not here because it comes later, after sysvr4. -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ | -*vms* | -sco* | -esix* | -isc* | -aix* | -sunos | -sunos[34]*\ | -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \ | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ | -aos* \ | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ | -hiux* | -386bsd* | -netbsd* | -openbsd* | -freebsd* | -riscix* \ | -lynxos* | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ | -chorusos* | -chorusrdb* \ | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ | -mingw32* | -linux-gnu* | -uxpv* | -beos* | -mpeix* | -udk* \ | -interix* | -uwin* | -rhapsody* | -darwin* | -opened* \ | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ | -os2* | -vos*) # Remember, each alternative MUST END IN *, to match a version number. ;; -qnx*) case $basic_machine in x86-* | i*86-*) ;; *) os=-nto$os ;; esac ;; -nto*) os=-nto-qnx ;; -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ | -windows* | -osx | -abug | -netware* | -os9* | -beos* \ | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) ;; -mac*) os=`echo $os | sed -e 's|mac|macos|'` ;; -linux*) os=`echo $os | sed -e 's|linux|linux-gnu|'` ;; -sunos5*) os=`echo $os | sed -e 's|sunos5|solaris2|'` ;; -sunos6*) os=`echo $os | sed -e 's|sunos6|solaris3|'` ;; -opened*) os=-openedition ;; -wince*) os=-wince ;; -osfrose*) os=-osfrose ;; -osf*) os=-osf ;; -utek*) os=-bsd ;; -dynix*) os=-bsd ;; -acis*) os=-aos ;; -386bsd) os=-bsd ;; -ctix* | -uts*) os=-sysv ;; -ns2 ) os=-nextstep2 ;; -nsk*) os=-nsk ;; # Preserve the version number of sinix5. -sinix5.*) os=`echo $os | sed -e 's|sinix|sysv|'` ;; -sinix*) os=-sysv4 ;; -triton*) os=-sysv3 ;; -oss*) os=-sysv3 ;; -svr4) os=-sysv4 ;; -svr3) os=-sysv3 ;; -sysvr4) os=-sysv4 ;; # This must come after -sysvr4. -sysv*) ;; -ose*) os=-ose ;; -es1800*) os=-ose ;; -xenix) os=-xenix ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) os=-mint ;; -none) ;; *) # Get rid of the `-' at the beginning of $os. os=`echo $os | sed 's/[^-]*-//'` echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2 exit 1 ;; esac else # Here we handle the default operating systems that come with various machines. # The value should be what the vendor currently ships out the door with their # machine or put another way, the most popular os provided with the machine. # Note that if you're going to try to match "-MANUFACTURER" here (say, # "-sun"), then you have to tell the case statement up towards the top # that MANUFACTURER isn't an operating system. Otherwise, code above # will signal an error saying that MANUFACTURER isn't an operating # system, and we'll never get to this point. case $basic_machine in *-acorn) os=-riscix1.2 ;; arm*-rebel) os=-linux ;; arm*-semi) os=-aout ;; pdp10-*) os=-tops20 ;; pdp11-*) os=-none ;; *-dec | vax-*) os=-ultrix4.2 ;; m68*-apollo) os=-domain ;; i386-sun) os=-sunos4.0.2 ;; m68000-sun) os=-sunos3 # This also exists in the configure program, but was not the # default. # os=-sunos4 ;; m68*-cisco) os=-aout ;; mips*-cisco) os=-elf ;; mips*-*) os=-elf ;; *-tti) # must be before sparc entry or we get the wrong os. os=-sysv3 ;; sparc-* | *-sun) os=-sunos4.1.1 ;; *-be) os=-beos ;; *-ibm) os=-aix ;; *-wec) os=-proelf ;; *-winbond) os=-proelf ;; *-oki) os=-proelf ;; *-hp) os=-hpux ;; *-hitachi) os=-hiux ;; i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) os=-sysv ;; *-cbm) os=-amigaos ;; *-dg) os=-dgux ;; *-dolphin) os=-sysv3 ;; m68k-ccur) os=-rtu ;; m88k-omron*) os=-luna ;; *-next ) os=-nextstep ;; *-sequent) os=-ptx ;; *-crds) os=-unos ;; *-ns) os=-genix ;; i370-*) os=-mvs ;; *-next) os=-nextstep3 ;; *-gould) os=-sysv ;; *-highlevel) os=-bsd ;; *-encore) os=-bsd ;; *-sgi) os=-irix ;; *-siemens) os=-sysv4 ;; *-masscomp) os=-rtu ;; f30[01]-fujitsu | f700-fujitsu) os=-uxpv ;; *-rom68k) os=-coff ;; *-*bug) os=-coff ;; *-apple) os=-macos ;; *-atari*) os=-mint ;; *) os=-none ;; esac fi # Here we handle the case where we know the os, and the CPU type, but not the # manufacturer. We pick the logical manufacturer. vendor=unknown case $basic_machine in *-unknown) case $os in -riscix*) vendor=acorn ;; -sunos*) vendor=sun ;; -aix*) vendor=ibm ;; -beos*) vendor=be ;; -hpux*) vendor=hp ;; -mpeix*) vendor=hp ;; -hiux*) vendor=hitachi ;; -unos*) vendor=crds ;; -dgux*) vendor=dg ;; -luna*) vendor=omron ;; -genix*) vendor=ns ;; -mvs* | -opened*) vendor=ibm ;; -ptx*) vendor=sequent ;; -vxsim* | -vxworks*) vendor=wrs ;; -aux*) vendor=apple ;; -hms*) vendor=hitachi ;; -mpw* | -macos*) vendor=apple ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) vendor=atari ;; -vos*) vendor=stratus ;; esac basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"` ;; esac echo $basic_machine$os exit 0 # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: mail-1.1.2/config/depcomp0000775000076500007650000003034110614714012014634 0ustar dogdog00000000000000#! /bin/sh # depcomp - compile a program generating dependencies as side-effects # Copyright 1999, 2000 Free Software Foundation, Inc. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # This program 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 General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA # 02110-1301, USA. # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # Originally written by Alexandre Oliva . if test -z "$depmode" || test -z "$source" || test -z "$object"; then echo "depcomp: Variables source, object and depmode must be set" 1>&2 exit 1 fi # `libtool' can also be set to `yes' or `no'. if test -z "$depfile"; then base=`echo "$object" | sed -e 's,^.*/,,' -e 's,\.\([^.]*\)$,.P\1,'` dir=`echo "$object" | sed 's,/.*$,/,'` if test "$dir" = "$object"; then dir= fi # FIXME: should be _deps on DOS. depfile="$dir.deps/$base" fi tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} rm -f "$tmpdepfile" # Some modes work just like other modes, but use different flags. We # parameterize here, but still list the modes in the big case below, # to make depend.m4 easier to write. Note that we *cannot* use a case # here, because this file can only contain one case statement. if test "$depmode" = hp; then # HP compiler uses -M and no extra arg. gccflag=-M depmode=gcc fi if test "$depmode" = dashXmstdout; then # This is just like dashmstdout with a different argument. dashmflag=-xM depmode=dashmstdout fi case "$depmode" in gcc3) ## gcc 3 implements dependency tracking that does exactly what ## we want. Yay! Note: for some reason libtool 1.4 doesn't like ## it if -MD -MP comes after the -MF stuff. Hmm. "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi mv "$tmpdepfile" "$depfile" ;; gcc) ## There are various ways to get dependency output from gcc. Here's ## why we pick this rather obscure method: ## - Don't want to use -MD because we'd like the dependencies to end ## up in a subdir. Having to rename by hand is ugly. ## (We might end up doing this anyway to support other compilers.) ## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like ## -MM, not -M (despite what the docs say). ## - Using -M directly means running the compiler twice (even worse ## than renaming). if test -z "$gccflag"; then gccflag=-MD, fi "$@" -Wp,"$gccflag$tmpdepfile" stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" echo "$object : \\" > "$depfile" alpha=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz ## The second -e expression handles DOS-style file names with drive letters. sed -e 's/^[^:]*: / /' \ -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile" ## This next piece of magic avoids the `deleted header file' problem. ## The problem is that when a header file which appears in a .P file ## is deleted, the dependency causes make to die (because there is ## typically no way to rebuild the header). We avoid this by adding ## dummy dependencies for each header file. Too bad gcc doesn't do ## this for us directly. tr ' ' ' ' < "$tmpdepfile" | ## Some versions of gcc put a space before the `:'. On the theory ## that the space means something, we add a space to the output as ## well. ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; hp) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; sgi) if test "$libtool" = yes; then "$@" "-Wp,-MDupdate,$tmpdepfile" else "$@" -MDupdate "$tmpdepfile" fi stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files echo "$object : \\" > "$depfile" # Clip off the initial element (the dependent). Don't try to be # clever and replace this with sed code, as IRIX sed won't handle # lines with more than a fixed number of characters (4096 in # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines; # the IRIX cc adds comments like `#:fec' to the end of the # dependency line. tr ' ' ' ' < "$tmpdepfile" \ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' | \ tr ' ' ' ' >> $depfile echo >> $depfile # The second pass generates a dummy entry for each header file. tr ' ' ' ' < "$tmpdepfile" \ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ >> $depfile else # The sourcefile does not contain any dependencies, so just # store a dummy comment line, to avoid errors with the Makefile # "include basename.Plo" scheme. echo "#dummy" > "$depfile" fi rm -f "$tmpdepfile" ;; aix) # The C for AIX Compiler uses -M and outputs the dependencies # in a .u file. This file always lives in the current directory. # Also, the AIX compiler puts `$object:' at the start of each line; # $object doesn't have directory information. stripped=`echo "$object" | sed -e 's,^.*/,,' -e 's/\(.*\)\..*$/\1/'` tmpdepfile="$stripped.u" outname="$stripped.o" if test "$libtool" = yes; then "$@" -Wc,-M else "$@" -M fi stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi if test -f "$tmpdepfile"; then # Each line is of the form `foo.o: dependent.h'. # Do two passes, one to just change these to # `$object: dependent.h' and one to simply `dependent.h:'. sed -e "s,^$outname:,$object :," < "$tmpdepfile" > "$depfile" sed -e "s,^$outname: \(.*\)$,\1:," < "$tmpdepfile" >> "$depfile" else # The sourcefile does not contain any dependencies, so just # store a dummy comment line, to avoid errors with the Makefile # "include basename.Plo" scheme. echo "#dummy" > "$depfile" fi rm -f "$tmpdepfile" ;; tru64) # The Tru64 compiler uses -MD to generate dependencies as a side # effect. `cc -MD -o foo.o ...' puts the dependencies into `foo.o.d'. # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put # dependencies in `foo.d' instead, so we check for that too. # Subdirectories are respected. base=`echo "$object" | sed -e 's/\.o$//' -e 's/\.lo$//'` tmpdepfile1="$base.o.d" tmpdepfile2="$base.d" if test "$libtool" = yes; then "$@" -Wc,-MD else "$@" -MD fi stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile1" "$tmpdepfile2" exit $stat fi if test -f "$tmpdepfile1"; then tmpdepfile="$tmpdepfile1" else tmpdepfile="$tmpdepfile2" fi if test -f "$tmpdepfile"; then sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile" # That's a space and a tab in the []. sed -e 's,^.*\.[a-z]*:[ ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile" else echo "#dummy" > "$depfile" fi rm -f "$tmpdepfile" ;; #nosideeffect) # This comment above is used by automake to tell side-effect # dependency tracking mechanisms from slower ones. dashmstdout) # Important note: in order to support this mode, a compiler *must* # always write the proprocessed file to stdout, regardless of -o, # because we must use -o when running libtool. test -z "$dashmflag" && dashmflag=-M ( IFS=" " case " $* " in *" --mode=compile "*) # this is libtool, let us make it quiet for arg do # cycle over the arguments case "$arg" in "--mode=compile") # insert --quiet before "--mode=compile" set fnord "$@" --quiet shift # fnord ;; esac set fnord "$@" "$arg" shift # fnord shift # "$arg" done ;; esac "$@" $dashmflag | sed 's:^[^:]*\:[ ]*:'"$object"'\: :' > "$tmpdepfile" ) & proc=$! "$@" stat=$? wait "$proc" if test "$stat" != 0; then exit $stat; fi rm -f "$depfile" cat < "$tmpdepfile" > "$depfile" tr ' ' ' ' < "$tmpdepfile" | \ ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; dashXmstdout) # This case only exists to satisfy depend.m4. It is never actually # run, as this mode is specially recognized in the preamble. exit 1 ;; makedepend) # X makedepend ( shift cleared=no for arg in "$@"; do case $cleared in no) set ""; shift cleared=yes esac case "$arg" in -D*|-I*) set fnord "$@" "$arg"; shift;; -*) ;; *) set fnord "$@" "$arg"; shift;; esac done obj_suffix="`echo $object | sed 's/^.*\././'`" touch "$tmpdepfile" ${MAKEDEPEND-makedepend} 2>/dev/null -o"$obj_suffix" -f"$tmpdepfile" "$@" ) & proc=$! "$@" stat=$? wait "$proc" if test "$stat" != 0; then exit $stat; fi rm -f "$depfile" cat < "$tmpdepfile" > "$depfile" sed '1,2d' "$tmpdepfile" | tr ' ' ' ' | \ ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" "$tmpdepfile".bak ;; cpp) # Important note: in order to support this mode, a compiler *must* # always write the proprocessed file to stdout, regardless of -o, # because we must use -o when running libtool. ( IFS=" " case " $* " in *" --mode=compile "*) for arg do # cycle over the arguments case $arg in "--mode=compile") # insert --quiet before "--mode=compile" set fnord "$@" --quiet shift # fnord ;; esac set fnord "$@" "$arg" shift # fnord shift # "$arg" done ;; esac "$@" -E | sed -n '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' | sed '$ s: \\$::' > "$tmpdepfile" ) & proc=$! "$@" stat=$? wait "$proc" if test "$stat" != 0; then exit $stat; fi rm -f "$depfile" echo "$object : \\" > "$depfile" cat < "$tmpdepfile" >> "$depfile" sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; msvisualcpp) # Important note: in order to support this mode, a compiler *must* # always write the proprocessed file to stdout, regardless of -o, # because we must use -o when running libtool. ( IFS=" " case " $* " in *" --mode=compile "*) for arg do # cycle over the arguments case $arg in "--mode=compile") # insert --quiet before "--mode=compile" set fnord "$@" --quiet shift # fnord ;; esac set fnord "$@" "$arg" shift # fnord shift # "$arg" done ;; esac for arg do case "$arg" in "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") set fnord "$@" shift shift ;; *) set fnord "$@" "$arg" shift shift ;; esac done "$@" -E | sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::echo "`cygpath -u \\"\1\\"`":p' | sort | uniq > "$tmpdepfile" ) & proc=$! "$@" stat=$? wait "$proc" if test "$stat" != 0; then exit $stat; fi rm -f "$depfile" echo "$object : \\" > "$depfile" . "$tmpdepfile" | sed 's% %\\ %g' | sed -n '/^\(.*\)$/ s:: \1 \\:p' >> "$depfile" echo " " >> "$depfile" . "$tmpdepfile" | sed 's% %\\ %g' | sed -n '/^\(.*\)$/ s::\1\::p' >> "$depfile" rm -f "$tmpdepfile" ;; none) exec "$@" ;; *) echo "Unknown depmode $depmode" 1>&2 exit 1 ;; esac exit 0 mail-1.1.2/config/install-sh0000775000076500007650000001267110614714012015271 0ustar dogdog00000000000000#!/bin/sh # # install - install a program, script, or datafile # This comes from X11R5 (mit/util/scripts/install.sh). # # Copyright 1991 by the Massachusetts Institute of Technology # # Permission to use, copy, modify, distribute, and sell this software and its # documentation for any purpose is hereby granted without fee, provided that # the above copyright notice appear in all copies and that both that # copyright notice and this permission notice appear in supporting # documentation, and that the name of M.I.T. not be used in advertising or # publicity pertaining to distribution of the software without specific, # written prior permission. M.I.T. makes no representations about the # suitability of this software for any purpose. It is provided "as is" # without express or implied warranty. # # Calling this script install-sh is preferred over install.sh, to prevent # `make' implicit rules from creating a file called install from it # when there is no Makefile. # # This script is compatible with the BSD install script, but was written # from scratch. It can only install one file at a time, a restriction # shared with many OS's install programs. # set DOITPROG to echo to test this script # Don't use :- since 4.3BSD and earlier shells don't like it. doit="${DOITPROG-}" # put in absolute paths if you don't have them in your path; or use env. vars. mvprog="${MVPROG-mv}" cpprog="${CPPROG-cp}" chmodprog="${CHMODPROG-chmod}" chownprog="${CHOWNPROG-chown}" chgrpprog="${CHGRPPROG-chgrp}" stripprog="${STRIPPROG-strip}" rmprog="${RMPROG-rm}" mkdirprog="${MKDIRPROG-mkdir}" transformbasename="" transform_arg="" instcmd="$mvprog" chmodcmd="$chmodprog 0755" chowncmd="" chgrpcmd="" stripcmd="" rmcmd="$rmprog -f" mvcmd="$mvprog" src="" dst="" dir_arg="" while [ x"$1" != x ]; do case $1 in -c) instcmd="$cpprog" shift continue;; -d) dir_arg=true shift continue;; -m) chmodcmd="$chmodprog $2" shift shift continue;; -o) chowncmd="$chownprog $2" shift shift continue;; -g) chgrpcmd="$chgrpprog $2" shift shift continue;; -s) stripcmd="$stripprog" shift continue;; -t=*) transformarg=`echo $1 | sed 's/-t=//'` shift continue;; -b=*) transformbasename=`echo $1 | sed 's/-b=//'` shift continue;; *) if [ x"$src" = x ] then src=$1 else # this colon is to work around a 386BSD /bin/sh bug : dst=$1 fi shift continue;; esac done if [ x"$src" = x ] then echo "install: no input file specified" exit 1 else : fi if [ x"$dir_arg" != x ]; then dst=$src src="" if [ -d $dst ]; then instcmd=: chmodcmd="" else instcmd=$mkdirprog fi else # Waiting for this to be detected by the "$instcmd $src $dsttmp" command # might cause directories to be created, which would be especially bad # if $src (and thus $dsttmp) contains '*'. if [ -f $src -o -d $src ] then : else echo "install: $src does not exist" exit 1 fi if [ x"$dst" = x ] then echo "install: no destination specified" exit 1 else : fi # If destination is a directory, append the input filename; if your system # does not like double slashes in filenames, you may need to add some logic if [ -d $dst ] then dst="$dst"/`basename $src` else : fi fi ## this sed command emulates the dirname command dstdir=`echo $dst | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'` # Make sure that the destination directory exists. # this part is taken from Noah Friedman's mkinstalldirs script # Skip lots of stat calls in the usual case. if [ ! -d "$dstdir" ]; then defaultIFS=' ' IFS="${IFS-${defaultIFS}}" oIFS="${IFS}" # Some sh's can't handle IFS=/ for some reason. IFS='%' set - `echo ${dstdir} | sed -e 's@/@%@g' -e 's@^%@/@'` IFS="${oIFS}" pathcomp='' while [ $# -ne 0 ] ; do pathcomp="${pathcomp}${1}" shift if [ ! -d "${pathcomp}" ] ; then $mkdirprog "${pathcomp}" else : fi pathcomp="${pathcomp}/" done fi if [ x"$dir_arg" != x ] then $doit $instcmd $dst && if [ x"$chowncmd" != x ]; then $doit $chowncmd $dst; else : ; fi && if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dst; else : ; fi && if [ x"$stripcmd" != x ]; then $doit $stripcmd $dst; else : ; fi && if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dst; else : ; fi else # If we're going to rename the final executable, determine the name now. if [ x"$transformarg" = x ] then dstfile=`basename $dst` else dstfile=`basename $dst $transformbasename | sed $transformarg`$transformbasename fi # don't allow the sed command to completely eliminate the filename if [ x"$dstfile" = x ] then dstfile=`basename $dst` else : fi # Make a temp file name in the proper directory. dsttmp=$dstdir/#inst.$$# # Move or copy the file name to the temp name $doit $instcmd $src $dsttmp && trap "rm -f ${dsttmp}" 0 && # and set any options; do chmod last to preserve setuid bits # If any of these fail, we abort the whole thing. If we want to # ignore errors from any of these, just make sure not to ignore # errors from the above "$doit $instcmd $src $dsttmp" command. if [ x"$chowncmd" != x ]; then $doit $chowncmd $dsttmp; else :;fi && if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dsttmp; else :;fi && if [ x"$stripcmd" != x ]; then $doit $stripcmd $dsttmp; else :;fi && if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dsttmp; else :;fi && # Now rename the file to the real destination. $doit $rmcmd -f $dstdir/$dstfile && $doit $mvcmd $dsttmp $dstdir/$dstfile fi && exit 0 mail-1.1.2/config/ltmain.sh0000775000076500007650000041724310614714012015114 0ustar dogdog00000000000000# ltmain.sh - Provide generalized library-building support services. # NOTE: Changing this file will not affect anything until you rerun configure. # # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001 # Free Software Foundation, Inc. # Originally by Gordon Matzigkeit , 1996 # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program 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 # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # Check that we have a working $echo. if test "X$1" = X--no-reexec; then # Discard the --no-reexec flag, and continue. shift elif test "X$1" = X--fallback-echo; then # Avoid inline document here, it may be left over : elif test "X`($echo '\t') 2>/dev/null`" = 'X\t'; then # Yippee, $echo works! : else # Restart under the correct shell, and then maybe $echo will work. exec $SHELL "$0" --no-reexec ${1+"$@"} fi if test "X$1" = X--fallback-echo; then # used as fallback echo shift cat <&2 echo "Fatal configuration error. See the $PACKAGE docs for more information." 1>&2 exit 1 fi # Global variables. mode=$default_mode nonopt= prev= prevopt= run= show="$echo" show_help= execute_dlfiles= lo2o="s/\\.lo\$/.${objext}/" o2lo="s/\\.${objext}\$/.lo/" # Parse our command line options once, thoroughly. while test $# -gt 0 do arg="$1" shift case $arg in -*=*) optarg=`$echo "X$arg" | $Xsed -e 's/[-_a-zA-Z0-9]*=//'` ;; *) optarg= ;; esac # If the previous option needs an argument, assign it. if test -n "$prev"; then case $prev in execute_dlfiles) execute_dlfiles="$execute_dlfiles $arg" ;; *) eval "$prev=\$arg" ;; esac prev= prevopt= continue fi # Have we seen a non-optional argument yet? case $arg in --help) show_help=yes ;; --version) echo "$PROGRAM (GNU $PACKAGE) $VERSION$TIMESTAMP" exit 0 ;; --config) sed -e '1,/^# ### BEGIN LIBTOOL CONFIG/d' -e '/^# ### END LIBTOOL CONFIG/,$d' $0 exit 0 ;; --debug) echo "$progname: enabling shell trace mode" set -x ;; --dry-run | -n) run=: ;; --features) echo "host: $host" if test "$build_libtool_libs" = yes; then echo "enable shared libraries" else echo "disable shared libraries" fi if test "$build_old_libs" = yes; then echo "enable static libraries" else echo "disable static libraries" fi exit 0 ;; --finish) mode="finish" ;; --mode) prevopt="--mode" prev=mode ;; --mode=*) mode="$optarg" ;; --quiet | --silent) show=: ;; -dlopen) prevopt="-dlopen" prev=execute_dlfiles ;; -*) $echo "$modename: unrecognized option \`$arg'" 1>&2 $echo "$help" 1>&2 exit 1 ;; *) nonopt="$arg" break ;; esac done if test -n "$prevopt"; then $echo "$modename: option \`$prevopt' requires an argument" 1>&2 $echo "$help" 1>&2 exit 1 fi # If this variable is set in any of the actions, the command in it # will be execed at the end. This prevents here-documents from being # left over by shells. exec_cmd= if test -z "$show_help"; then # Infer the operation mode. if test -z "$mode"; then case $nonopt in *cc | *++ | gcc* | *-gcc*) mode=link for arg do case $arg in -c) mode=compile break ;; esac done ;; *db | *dbx | *strace | *truss) mode=execute ;; *install*|cp|mv) mode=install ;; *rm) mode=uninstall ;; *) # If we have no mode, but dlfiles were specified, then do execute mode. test -n "$execute_dlfiles" && mode=execute # Just use the default operation mode. if test -z "$mode"; then if test -n "$nonopt"; then $echo "$modename: warning: cannot infer operation mode from \`$nonopt'" 1>&2 else $echo "$modename: warning: cannot infer operation mode without MODE-ARGS" 1>&2 fi fi ;; esac fi # Only execute mode is allowed to have -dlopen flags. if test -n "$execute_dlfiles" && test "$mode" != execute; then $echo "$modename: unrecognized option \`-dlopen'" 1>&2 $echo "$help" 1>&2 exit 1 fi # Change the help message to a mode-specific one. generic_help="$help" help="Try \`$modename --help --mode=$mode' for more information." # These modes are in order of execution frequency so that they run quickly. case $mode in # libtool compile mode compile) modename="$modename: compile" # Get the compilation command and the source file. base_compile= prev= lastarg= srcfile="$nonopt" suppress_output= user_target=no for arg do case $prev in "") ;; xcompiler) # Aesthetically quote the previous argument. prev= lastarg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"` case $arg in # Double-quote args containing other shell metacharacters. # Many Bourne shells cannot handle close brackets correctly # in scan sets, so we specify it separately. *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") arg="\"$arg\"" ;; esac # Add the previous argument to base_compile. if test -z "$base_compile"; then base_compile="$lastarg" else base_compile="$base_compile $lastarg" fi continue ;; esac # Accept any command-line options. case $arg in -o) if test "$user_target" != "no"; then $echo "$modename: you cannot specify \`-o' more than once" 1>&2 exit 1 fi user_target=next ;; -static) build_old_libs=yes continue ;; -prefer-pic) pic_mode=yes continue ;; -prefer-non-pic) pic_mode=no continue ;; -Xcompiler) prev=xcompiler continue ;; -Wc,*) args=`$echo "X$arg" | $Xsed -e "s/^-Wc,//"` lastarg= save_ifs="$IFS"; IFS=',' for arg in $args; do IFS="$save_ifs" # Double-quote args containing other shell metacharacters. # Many Bourne shells cannot handle close brackets correctly # in scan sets, so we specify it separately. case $arg in *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") arg="\"$arg\"" ;; esac lastarg="$lastarg $arg" done IFS="$save_ifs" lastarg=`$echo "X$lastarg" | $Xsed -e "s/^ //"` # Add the arguments to base_compile. if test -z "$base_compile"; then base_compile="$lastarg" else base_compile="$base_compile $lastarg" fi continue ;; esac case $user_target in next) # The next one is the -o target name user_target=yes continue ;; yes) # We got the output file user_target=set libobj="$arg" continue ;; esac # Accept the current argument as the source file. lastarg="$srcfile" srcfile="$arg" # Aesthetically quote the previous argument. # Backslashify any backslashes, double quotes, and dollar signs. # These are the only characters that are still specially # interpreted inside of double-quoted scrings. lastarg=`$echo "X$lastarg" | $Xsed -e "$sed_quote_subst"` # Double-quote args containing other shell metacharacters. # Many Bourne shells cannot handle close brackets correctly # in scan sets, so we specify it separately. case $lastarg in *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") lastarg="\"$lastarg\"" ;; esac # Add the previous argument to base_compile. if test -z "$base_compile"; then base_compile="$lastarg" else base_compile="$base_compile $lastarg" fi done case $user_target in set) ;; no) # Get the name of the library object. libobj=`$echo "X$srcfile" | $Xsed -e 's%^.*/%%'` ;; *) $echo "$modename: you must specify a target with \`-o'" 1>&2 exit 1 ;; esac # Recognize several different file suffixes. # If the user specifies -o file.o, it is replaced with file.lo xform='[cCFSfmso]' case $libobj in *.ada) xform=ada ;; *.adb) xform=adb ;; *.ads) xform=ads ;; *.asm) xform=asm ;; *.c++) xform=c++ ;; *.cc) xform=cc ;; *.cpp) xform=cpp ;; *.cxx) xform=cxx ;; *.f90) xform=f90 ;; *.for) xform=for ;; esac libobj=`$echo "X$libobj" | $Xsed -e "s/\.$xform$/.lo/"` case $libobj in *.lo) obj=`$echo "X$libobj" | $Xsed -e "$lo2o"` ;; *) $echo "$modename: cannot determine name of library object from \`$libobj'" 1>&2 exit 1 ;; esac if test -z "$base_compile"; then $echo "$modename: you must specify a compilation command" 1>&2 $echo "$help" 1>&2 exit 1 fi # Delete any leftover library objects. if test "$build_old_libs" = yes; then removelist="$obj $libobj" else removelist="$libobj" fi $run $rm $removelist trap "$run $rm $removelist; exit 1" 1 2 15 # On Cygwin there's no "real" PIC flag so we must build both object types case $host_os in cygwin* | mingw* | pw32* | os2*) pic_mode=default ;; esac if test $pic_mode = no && test "$deplibs_check_method" != pass_all; then # non-PIC code in shared libraries is not supported pic_mode=default fi # Calculate the filename of the output object if compiler does # not support -o with -c if test "$compiler_c_o" = no; then output_obj=`$echo "X$srcfile" | $Xsed -e 's%^.*/%%' -e 's%\.[^.]*$%%'`.${objext} lockfile="$output_obj.lock" removelist="$removelist $output_obj $lockfile" trap "$run $rm $removelist; exit 1" 1 2 15 else need_locks=no lockfile= fi # Lock this critical section if it is needed # We use this script file to make the link, it avoids creating a new file if test "$need_locks" = yes; then until $run ln "$0" "$lockfile" 2>/dev/null; do $show "Waiting for $lockfile to be removed" sleep 2 done elif test "$need_locks" = warn; then if test -f "$lockfile"; then echo "\ *** ERROR, $lockfile exists and contains: `cat $lockfile 2>/dev/null` This indicates that another process is trying to use the same temporary object file, and libtool could not work around it because your compiler does not support \`-c' and \`-o' together. If you repeat this compilation, it may succeed, by chance, but you had better avoid parallel builds (make -j) in this platform, or get a better compiler." $run $rm $removelist exit 1 fi echo $srcfile > "$lockfile" fi if test -n "$fix_srcfile_path"; then eval srcfile=\"$fix_srcfile_path\" fi # Only build a PIC object if we are building libtool libraries. if test "$build_libtool_libs" = yes; then # Without this assignment, base_compile gets emptied. fbsd_hideous_sh_bug=$base_compile if test "$pic_mode" != no; then # All platforms use -DPIC, to notify preprocessed assembler code. command="$base_compile $srcfile $pic_flag -DPIC" else # Don't build PIC code command="$base_compile $srcfile" fi if test "$build_old_libs" = yes; then lo_libobj="$libobj" dir=`$echo "X$libobj" | $Xsed -e 's%/[^/]*$%%'` if test "X$dir" = "X$libobj"; then dir="$objdir" else dir="$dir/$objdir" fi libobj="$dir/"`$echo "X$libobj" | $Xsed -e 's%^.*/%%'` if test -d "$dir"; then $show "$rm $libobj" $run $rm $libobj else $show "$mkdir $dir" $run $mkdir $dir status=$? if test $status -ne 0 && test ! -d $dir; then exit $status fi fi fi if test "$compiler_o_lo" = yes; then output_obj="$libobj" command="$command -o $output_obj" elif test "$compiler_c_o" = yes; then output_obj="$obj" command="$command -o $output_obj" fi $run $rm "$output_obj" $show "$command" if $run eval "$command"; then : else test -n "$output_obj" && $run $rm $removelist exit 1 fi if test "$need_locks" = warn && test x"`cat $lockfile 2>/dev/null`" != x"$srcfile"; then echo "\ *** ERROR, $lockfile contains: `cat $lockfile 2>/dev/null` but it should contain: $srcfile This indicates that another process is trying to use the same temporary object file, and libtool could not work around it because your compiler does not support \`-c' and \`-o' together. If you repeat this compilation, it may succeed, by chance, but you had better avoid parallel builds (make -j) in this platform, or get a better compiler." $run $rm $removelist exit 1 fi # Just move the object if needed, then go on to compile the next one if test x"$output_obj" != x"$libobj"; then $show "$mv $output_obj $libobj" if $run $mv $output_obj $libobj; then : else error=$? $run $rm $removelist exit $error fi fi # If we have no pic_flag, then copy the object into place and finish. if (test -z "$pic_flag" || test "$pic_mode" != default) && test "$build_old_libs" = yes; then # Rename the .lo from within objdir to obj if test -f $obj; then $show $rm $obj $run $rm $obj fi $show "$mv $libobj $obj" if $run $mv $libobj $obj; then : else error=$? $run $rm $removelist exit $error fi xdir=`$echo "X$obj" | $Xsed -e 's%/[^/]*$%%'` if test "X$xdir" = "X$obj"; then xdir="." else xdir="$xdir" fi baseobj=`$echo "X$obj" | $Xsed -e "s%.*/%%"` libobj=`$echo "X$baseobj" | $Xsed -e "$o2lo"` # Now arrange that obj and lo_libobj become the same file $show "(cd $xdir && $LN_S $baseobj $libobj)" if $run eval '(cd $xdir && $LN_S $baseobj $libobj)'; then # Unlock the critical section if it was locked if test "$need_locks" != no; then $run $rm "$lockfile" fi exit 0 else error=$? $run $rm $removelist exit $error fi fi # Allow error messages only from the first compilation. suppress_output=' >/dev/null 2>&1' fi # Only build a position-dependent object if we build old libraries. if test "$build_old_libs" = yes; then if test "$pic_mode" != yes; then # Don't build PIC code command="$base_compile $srcfile" else # All platforms use -DPIC, to notify preprocessed assembler code. command="$base_compile $srcfile $pic_flag -DPIC" fi if test "$compiler_c_o" = yes; then command="$command -o $obj" output_obj="$obj" fi # Suppress compiler output if we already did a PIC compilation. command="$command$suppress_output" $run $rm "$output_obj" $show "$command" if $run eval "$command"; then : else $run $rm $removelist exit 1 fi if test "$need_locks" = warn && test x"`cat $lockfile 2>/dev/null`" != x"$srcfile"; then echo "\ *** ERROR, $lockfile contains: `cat $lockfile 2>/dev/null` but it should contain: $srcfile This indicates that another process is trying to use the same temporary object file, and libtool could not work around it because your compiler does not support \`-c' and \`-o' together. If you repeat this compilation, it may succeed, by chance, but you had better avoid parallel builds (make -j) in this platform, or get a better compiler." $run $rm $removelist exit 1 fi # Just move the object if needed if test x"$output_obj" != x"$obj"; then $show "$mv $output_obj $obj" if $run $mv $output_obj $obj; then : else error=$? $run $rm $removelist exit $error fi fi # Create an invalid libtool object if no PIC, so that we do not # accidentally link it into a program. if test "$build_libtool_libs" != yes; then $show "echo timestamp > $libobj" $run eval "echo timestamp > \$libobj" || exit $? else # Move the .lo from within objdir $show "$mv $libobj $lo_libobj" if $run $mv $libobj $lo_libobj; then : else error=$? $run $rm $removelist exit $error fi fi fi # Unlock the critical section if it was locked if test "$need_locks" != no; then $run $rm "$lockfile" fi exit 0 ;; # libtool link mode link | relink) modename="$modename: link" case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2*) # It is impossible to link a dll without this setting, and # we shouldn't force the makefile maintainer to figure out # which system we are compiling for in order to pass an extra # flag for every libtool invokation. # allow_undefined=no # FIXME: Unfortunately, there are problems with the above when trying # to make a dll which has undefined symbols, in which case not # even a static library is built. For now, we need to specify # -no-undefined on the libtool link line when we can be certain # that all symbols are satisfied, otherwise we get a static library. allow_undefined=yes ;; *) allow_undefined=yes ;; esac libtool_args="$nonopt" compile_command="$nonopt" finalize_command="$nonopt" compile_rpath= finalize_rpath= compile_shlibpath= finalize_shlibpath= convenience= old_convenience= deplibs= old_deplibs= compiler_flags= linker_flags= dllsearchpath= lib_search_path=`pwd` avoid_version=no dlfiles= dlprefiles= dlself=no export_dynamic=no export_symbols= export_symbols_regex= generated= libobjs= ltlibs= module=no no_install=no objs= prefer_static_libs=no preload=no prev= prevarg= release= rpath= xrpath= perm_rpath= temp_rpath= thread_safe=no vinfo= # We need to know -static, to get the right output filenames. for arg do case $arg in -all-static | -static) if test "X$arg" = "X-all-static"; then if test "$build_libtool_libs" = yes && test -z "$link_static_flag"; then $echo "$modename: warning: complete static linking is impossible in this configuration" 1>&2 fi if test -n "$link_static_flag"; then dlopen_self=$dlopen_self_static fi else if test -z "$pic_flag" && test -n "$link_static_flag"; then dlopen_self=$dlopen_self_static fi fi build_libtool_libs=no build_old_libs=yes prefer_static_libs=yes break ;; esac done # See if our shared archives depend on static archives. test -n "$old_archive_from_new_cmds" && build_old_libs=yes # Go through the arguments, transforming them on the way. while test $# -gt 0; do arg="$1" shift case $arg in *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") qarg=\"`$echo "X$arg" | $Xsed -e "$sed_quote_subst"`\" ### testsuite: skip nested quoting test ;; *) qarg=$arg ;; esac libtool_args="$libtool_args $qarg" # If the previous option needs an argument, assign it. if test -n "$prev"; then case $prev in output) compile_command="$compile_command @OUTPUT@" finalize_command="$finalize_command @OUTPUT@" ;; esac case $prev in dlfiles|dlprefiles) if test "$preload" = no; then # Add the symbol object into the linking commands. compile_command="$compile_command @SYMFILE@" finalize_command="$finalize_command @SYMFILE@" preload=yes fi case $arg in *.la | *.lo) ;; # We handle these cases below. force) if test "$dlself" = no; then dlself=needless export_dynamic=yes fi prev= continue ;; self) if test "$prev" = dlprefiles; then dlself=yes elif test "$prev" = dlfiles && test "$dlopen_self" != yes; then dlself=yes else dlself=needless export_dynamic=yes fi prev= continue ;; *) if test "$prev" = dlfiles; then dlfiles="$dlfiles $arg" else dlprefiles="$dlprefiles $arg" fi prev= continue ;; esac ;; expsyms) export_symbols="$arg" if test ! -f "$arg"; then $echo "$modename: symbol file \`$arg' does not exist" exit 1 fi prev= continue ;; expsyms_regex) export_symbols_regex="$arg" prev= continue ;; release) release="-$arg" prev= continue ;; rpath | xrpath) # We need an absolute path. case $arg in [\\/]* | [A-Za-z]:[\\/]*) ;; *) $echo "$modename: only absolute run-paths are allowed" 1>&2 exit 1 ;; esac if test "$prev" = rpath; then case "$rpath " in *" $arg "*) ;; *) rpath="$rpath $arg" ;; esac else case "$xrpath " in *" $arg "*) ;; *) xrpath="$xrpath $arg" ;; esac fi prev= continue ;; xcompiler) compiler_flags="$compiler_flags $qarg" prev= compile_command="$compile_command $qarg" finalize_command="$finalize_command $qarg" continue ;; xlinker) linker_flags="$linker_flags $qarg" compiler_flags="$compiler_flags $wl$qarg" prev= compile_command="$compile_command $wl$qarg" finalize_command="$finalize_command $wl$qarg" continue ;; *) eval "$prev=\"\$arg\"" prev= continue ;; esac fi # test -n $prev prevarg="$arg" case $arg in -all-static) if test -n "$link_static_flag"; then compile_command="$compile_command $link_static_flag" finalize_command="$finalize_command $link_static_flag" fi continue ;; -allow-undefined) # FIXME: remove this flag sometime in the future. $echo "$modename: \`-allow-undefined' is deprecated because it is the default" 1>&2 continue ;; -avoid-version) avoid_version=yes continue ;; -dlopen) prev=dlfiles continue ;; -dlpreopen) prev=dlprefiles continue ;; -export-dynamic) export_dynamic=yes continue ;; -export-symbols | -export-symbols-regex) if test -n "$export_symbols" || test -n "$export_symbols_regex"; then $echo "$modename: more than one -exported-symbols argument is not allowed" exit 1 fi if test "X$arg" = "X-export-symbols"; then prev=expsyms else prev=expsyms_regex fi continue ;; # The native IRIX linker understands -LANG:*, -LIST:* and -LNO:* # so, if we see these flags be careful not to treat them like -L -L[A-Z][A-Z]*:*) case $with_gcc/$host in no/*-*-irix*) compile_command="$compile_command $arg" finalize_command="$finalize_command $arg" ;; esac continue ;; -L*) dir=`$echo "X$arg" | $Xsed -e 's/^-L//'` # We need an absolute path. case $dir in [\\/]* | [A-Za-z]:[\\/]*) ;; *) absdir=`cd "$dir" && pwd` if test -z "$absdir"; then $echo "$modename: cannot determine absolute directory name of \`$dir'" 1>&2 exit 1 fi dir="$absdir" ;; esac case "$deplibs " in *" -L$dir "*) ;; *) deplibs="$deplibs -L$dir" lib_search_path="$lib_search_path $dir" ;; esac case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2*) case :$dllsearchpath: in *":$dir:"*) ;; *) dllsearchpath="$dllsearchpath:$dir";; esac ;; esac continue ;; -l*) if test "X$arg" = "X-lc" || test "X$arg" = "X-lm"; then case $host in *-*-cygwin* | *-*-pw32* | *-*-beos*) # These systems don't actually have a C or math library (as such) continue ;; *-*-mingw* | *-*-os2*) # These systems don't actually have a C library (as such) test "X$arg" = "X-lc" && continue ;; *-*-openbsd*) # Do not include libc due to us having libc/libc_r. test "X$arg" = "X-lc" && continue ;; esac elif test "X$arg" = "X-lc_r"; then case $host in *-*-openbsd*) # Do not include libc_r directly, use -pthread flag. continue ;; esac fi deplibs="$deplibs $arg" continue ;; -module) module=yes continue ;; -no-fast-install) fast_install=no continue ;; -no-install) case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2*) # The PATH hackery in wrapper scripts is required on Windows # in order for the loader to find any dlls it needs. $echo "$modename: warning: \`-no-install' is ignored for $host" 1>&2 $echo "$modename: warning: assuming \`-no-fast-install' instead" 1>&2 fast_install=no ;; *) no_install=yes ;; esac continue ;; -no-undefined) allow_undefined=no continue ;; -o) prev=output ;; -release) prev=release continue ;; -rpath) prev=rpath continue ;; -R) prev=xrpath continue ;; -R*) dir=`$echo "X$arg" | $Xsed -e 's/^-R//'` # We need an absolute path. case $dir in [\\/]* | [A-Za-z]:[\\/]*) ;; *) $echo "$modename: only absolute run-paths are allowed" 1>&2 exit 1 ;; esac case "$xrpath " in *" $dir "*) ;; *) xrpath="$xrpath $dir" ;; esac continue ;; -static) # The effects of -static are defined in a previous loop. # We used to do the same as -all-static on platforms that # didn't have a PIC flag, but the assumption that the effects # would be equivalent was wrong. It would break on at least # Digital Unix and AIX. continue ;; -thread-safe) thread_safe=yes continue ;; -version-info) prev=vinfo continue ;; -Wc,*) args=`$echo "X$arg" | $Xsed -e "$sed_quote_subst" -e 's/^-Wc,//'` arg= save_ifs="$IFS"; IFS=',' for flag in $args; do IFS="$save_ifs" case $flag in *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") flag="\"$flag\"" ;; esac arg="$arg $wl$flag" compiler_flags="$compiler_flags $flag" done IFS="$save_ifs" arg=`$echo "X$arg" | $Xsed -e "s/^ //"` ;; -Wl,*) args=`$echo "X$arg" | $Xsed -e "$sed_quote_subst" -e 's/^-Wl,//'` arg= save_ifs="$IFS"; IFS=',' for flag in $args; do IFS="$save_ifs" case $flag in *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") flag="\"$flag\"" ;; esac arg="$arg $wl$flag" compiler_flags="$compiler_flags $wl$flag" linker_flags="$linker_flags $flag" done IFS="$save_ifs" arg=`$echo "X$arg" | $Xsed -e "s/^ //"` ;; -Xcompiler) prev=xcompiler continue ;; -Xlinker) prev=xlinker continue ;; # Some other compiler flag. -* | +*) # Unknown arguments in both finalize_command and compile_command need # to be aesthetically quoted because they are evaled later. arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"` case $arg in *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") arg="\"$arg\"" ;; esac ;; *.lo | *.$objext) # A library or standard object. if test "$prev" = dlfiles; then # This file was specified with -dlopen. if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then dlfiles="$dlfiles $arg" prev= continue else # If libtool objects are unsupported, then we need to preload. prev=dlprefiles fi fi if test "$prev" = dlprefiles; then # Preload the old-style object. dlprefiles="$dlprefiles "`$echo "X$arg" | $Xsed -e "$lo2o"` prev= else case $arg in *.lo) libobjs="$libobjs $arg" ;; *) objs="$objs $arg" ;; esac fi ;; *.$libext) # An archive. deplibs="$deplibs $arg" old_deplibs="$old_deplibs $arg" continue ;; *.la) # A libtool-controlled library. if test "$prev" = dlfiles; then # This library was specified with -dlopen. dlfiles="$dlfiles $arg" prev= elif test "$prev" = dlprefiles; then # The library was specified with -dlpreopen. dlprefiles="$dlprefiles $arg" prev= else deplibs="$deplibs $arg" fi continue ;; # Some other compiler argument. *) # Unknown arguments in both finalize_command and compile_command need # to be aesthetically quoted because they are evaled later. arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"` case $arg in *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") arg="\"$arg\"" ;; esac ;; esac # arg # Now actually substitute the argument into the commands. if test -n "$arg"; then compile_command="$compile_command $arg" finalize_command="$finalize_command $arg" fi done # argument parsing loop if test -n "$prev"; then $echo "$modename: the \`$prevarg' option requires an argument" 1>&2 $echo "$help" 1>&2 exit 1 fi if test "$export_dynamic" = yes && test -n "$export_dynamic_flag_spec"; then eval arg=\"$export_dynamic_flag_spec\" compile_command="$compile_command $arg" finalize_command="$finalize_command $arg" fi # calculate the name of the file, without its directory outputname=`$echo "X$output" | $Xsed -e 's%^.*/%%'` libobjs_save="$libobjs" if test -n "$shlibpath_var"; then # get the directories listed in $shlibpath_var eval shlib_search_path=\`\$echo \"X\${$shlibpath_var}\" \| \$Xsed -e \'s/:/ /g\'\` else shlib_search_path= fi eval sys_lib_search_path=\"$sys_lib_search_path_spec\" eval sys_lib_dlsearch_path=\"$sys_lib_dlsearch_path_spec\" output_objdir=`$echo "X$output" | $Xsed -e 's%/[^/]*$%%'` if test "X$output_objdir" = "X$output"; then output_objdir="$objdir" else output_objdir="$output_objdir/$objdir" fi # Create the object directory. if test ! -d $output_objdir; then $show "$mkdir $output_objdir" $run $mkdir $output_objdir status=$? if test $status -ne 0 && test ! -d $output_objdir; then exit $status fi fi # Determine the type of output case $output in "") $echo "$modename: you must specify an output file" 1>&2 $echo "$help" 1>&2 exit 1 ;; *.$libext) linkmode=oldlib ;; *.lo | *.$objext) linkmode=obj ;; *.la) linkmode=lib ;; *) linkmode=prog ;; # Anything else should be a program. esac specialdeplibs= libs= # Find all interdependent deplibs by searching for libraries # that are linked more than once (e.g. -la -lb -la) for deplib in $deplibs; do case "$libs " in *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;; esac libs="$libs $deplib" done deplibs= newdependency_libs= newlib_search_path= need_relink=no # whether we're linking any uninstalled libtool libraries notinst_deplibs= # not-installed libtool libraries notinst_path= # paths that contain not-installed libtool libraries case $linkmode in lib) passes="conv link" for file in $dlfiles $dlprefiles; do case $file in *.la) ;; *) $echo "$modename: libraries can \`-dlopen' only libtool libraries: $file" 1>&2 exit 1 ;; esac done ;; prog) compile_deplibs= finalize_deplibs= alldeplibs=no newdlfiles= newdlprefiles= passes="conv scan dlopen dlpreopen link" ;; *) passes="conv" ;; esac for pass in $passes; do if test $linkmode = prog; then # Determine which files to process case $pass in dlopen) libs="$dlfiles" save_deplibs="$deplibs" # Collect dlpreopened libraries deplibs= ;; dlpreopen) libs="$dlprefiles" ;; link) libs="$deplibs %DEPLIBS% $dependency_libs" ;; esac fi for deplib in $libs; do lib= found=no case $deplib in -l*) if test $linkmode = oldlib && test $linkmode = obj; then $echo "$modename: warning: \`-l' is ignored for archives/objects: $deplib" 1>&2 continue fi if test $pass = conv; then deplibs="$deplib $deplibs" continue fi name=`$echo "X$deplib" | $Xsed -e 's/^-l//'` for searchdir in $newlib_search_path $lib_search_path $sys_lib_search_path $shlib_search_path; do # Search the libtool library lib="$searchdir/lib${name}.la" if test -f "$lib"; then found=yes break fi done if test "$found" != yes; then # deplib doesn't seem to be a libtool library if test "$linkmode,$pass" = "prog,link"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else deplibs="$deplib $deplibs" test $linkmode = lib && newdependency_libs="$deplib $newdependency_libs" fi continue fi ;; # -l -L*) case $linkmode in lib) deplibs="$deplib $deplibs" test $pass = conv && continue newdependency_libs="$deplib $newdependency_libs" newlib_search_path="$newlib_search_path "`$echo "X$deplib" | $Xsed -e 's/^-L//'` ;; prog) if test $pass = conv; then deplibs="$deplib $deplibs" continue fi if test $pass = scan; then deplibs="$deplib $deplibs" newlib_search_path="$newlib_search_path "`$echo "X$deplib" | $Xsed -e 's/^-L//'` else compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" fi ;; *) $echo "$modename: warning: \`-L' is ignored for archives/objects: $deplib" 1>&2 ;; esac # linkmode continue ;; # -L -R*) if test $pass = link; then dir=`$echo "X$deplib" | $Xsed -e 's/^-R//'` # Make sure the xrpath contains only unique directories. case "$xrpath " in *" $dir "*) ;; *) xrpath="$xrpath $dir" ;; esac fi deplibs="$deplib $deplibs" continue ;; *.la) lib="$deplib" ;; *.$libext) if test $pass = conv; then deplibs="$deplib $deplibs" continue fi case $linkmode in lib) if test "$deplibs_check_method" != pass_all; then echo echo "*** Warning: This library needs some functionality provided by $deplib." echo "*** I have the capability to make that library automatically link in when" echo "*** you link to this library. But I can only do this if you have a" echo "*** shared version of the library, which you do not appear to have." else echo echo "*** Warning: Linking the shared library $output against the" echo "*** static library $deplib is not portable!" deplibs="$deplib $deplibs" fi continue ;; prog) if test $pass != link; then deplibs="$deplib $deplibs" else compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" fi continue ;; esac # linkmode ;; # *.$libext *.lo | *.$objext) if test $pass = dlpreopen || test "$dlopen_support" != yes || test "$build_libtool_libs" = no; then # If there is no dlopen support or we're linking statically, # we need to preload. newdlprefiles="$newdlprefiles $deplib" compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else newdlfiles="$newdlfiles $deplib" fi continue ;; %DEPLIBS%) alldeplibs=yes continue ;; esac # case $deplib if test $found = yes || test -f "$lib"; then : else $echo "$modename: cannot find the library \`$lib'" 1>&2 exit 1 fi # Check to see that this really is a libtool archive. if (sed -e '2q' $lib | egrep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then : else $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2 exit 1 fi ladir=`$echo "X$lib" | $Xsed -e 's%/[^/]*$%%'` test "X$ladir" = "X$lib" && ladir="." dlname= dlopen= dlpreopen= libdir= library_names= old_library= # If the library was installed with an old release of libtool, # it will not redefine variable installed. installed=yes # Read the .la file case $lib in */* | *\\*) . $lib ;; *) . ./$lib ;; esac if test "$linkmode,$pass" = "lib,link" || test "$linkmode,$pass" = "prog,scan" || { test $linkmode = oldlib && test $linkmode = obj; }; then # Add dl[pre]opened files of deplib test -n "$dlopen" && dlfiles="$dlfiles $dlopen" test -n "$dlpreopen" && dlprefiles="$dlprefiles $dlpreopen" fi if test $pass = conv; then # Only check for convenience libraries deplibs="$lib $deplibs" if test -z "$libdir"; then if test -z "$old_library"; then $echo "$modename: cannot find name of link library for \`$lib'" 1>&2 exit 1 fi # It is a libtool convenience library, so add in its objects. convenience="$convenience $ladir/$objdir/$old_library" old_convenience="$old_convenience $ladir/$objdir/$old_library" tmp_libs= for deplib in $dependency_libs; do deplibs="$deplib $deplibs" case "$tmp_libs " in *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;; esac tmp_libs="$tmp_libs $deplib" done elif test $linkmode != prog && test $linkmode != lib; then $echo "$modename: \`$lib' is not a convenience library" 1>&2 exit 1 fi continue fi # $pass = conv # Get the name of the library we link against. linklib= for l in $old_library $library_names; do linklib="$l" done if test -z "$linklib"; then $echo "$modename: cannot find name of link library for \`$lib'" 1>&2 exit 1 fi # This library was specified with -dlopen. if test $pass = dlopen; then if test -z "$libdir"; then $echo "$modename: cannot -dlopen a convenience library: \`$lib'" 1>&2 exit 1 fi if test -z "$dlname" || test "$dlopen_support" != yes || test "$build_libtool_libs" = no; then # If there is no dlname, no dlopen support or we're linking # statically, we need to preload. dlprefiles="$dlprefiles $lib" else newdlfiles="$newdlfiles $lib" fi continue fi # $pass = dlopen # We need an absolute path. case $ladir in [\\/]* | [A-Za-z]:[\\/]*) abs_ladir="$ladir" ;; *) abs_ladir=`cd "$ladir" && pwd` if test -z "$abs_ladir"; then $echo "$modename: warning: cannot determine absolute directory name of \`$ladir'" 1>&2 $echo "$modename: passing it literally to the linker, although it might fail" 1>&2 abs_ladir="$ladir" fi ;; esac laname=`$echo "X$lib" | $Xsed -e 's%^.*/%%'` # Find the relevant object directory and library name. if test "X$installed" = Xyes; then if test ! -f "$libdir/$linklib" && test -f "$abs_ladir/$linklib"; then $echo "$modename: warning: library \`$lib' was moved." 1>&2 dir="$ladir" absdir="$abs_ladir" libdir="$abs_ladir" else dir="$libdir" absdir="$libdir" fi else dir="$ladir/$objdir" absdir="$abs_ladir/$objdir" # Remove this search path later notinst_path="$notinst_path $abs_ladir" fi # $installed = yes name=`$echo "X$laname" | $Xsed -e 's/\.la$//' -e 's/^lib//'` # This library was specified with -dlpreopen. if test $pass = dlpreopen; then if test -z "$libdir"; then $echo "$modename: cannot -dlpreopen a convenience library: \`$lib'" 1>&2 exit 1 fi # Prefer using a static library (so that no silly _DYNAMIC symbols # are required to link). if test -n "$old_library"; then newdlprefiles="$newdlprefiles $dir/$old_library" # Otherwise, use the dlname, so that lt_dlopen finds it. elif test -n "$dlname"; then newdlprefiles="$newdlprefiles $dir/$dlname" else newdlprefiles="$newdlprefiles $dir/$linklib" fi fi # $pass = dlpreopen if test -z "$libdir"; then # Link the convenience library if test $linkmode = lib; then deplibs="$dir/$old_library $deplibs" elif test "$linkmode,$pass" = "prog,link"; then compile_deplibs="$dir/$old_library $compile_deplibs" finalize_deplibs="$dir/$old_library $finalize_deplibs" else deplibs="$lib $deplibs" fi continue fi if test $linkmode = prog && test $pass != link; then newlib_search_path="$newlib_search_path $ladir" deplibs="$lib $deplibs" linkalldeplibs=no if test "$link_all_deplibs" != no || test -z "$library_names" || test "$build_libtool_libs" = no; then linkalldeplibs=yes fi tmp_libs= for deplib in $dependency_libs; do case $deplib in -L*) newlib_search_path="$newlib_search_path "`$echo "X$deplib" | $Xsed -e 's/^-L//'`;; ### testsuite: skip nested quoting test esac # Need to link against all dependency_libs? if test $linkalldeplibs = yes; then deplibs="$deplib $deplibs" else # Need to hardcode shared library paths # or/and link against static libraries newdependency_libs="$deplib $newdependency_libs" fi case "$tmp_libs " in *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;; esac tmp_libs="$tmp_libs $deplib" done # for deplib continue fi # $linkmode = prog... link_static=no # Whether the deplib will be linked statically if test -n "$library_names" && { test "$prefer_static_libs" = no || test -z "$old_library"; }; then # Link against this shared library if test "$linkmode,$pass" = "prog,link" || { test $linkmode = lib && test $hardcode_into_libs = yes; }; then # Hardcode the library path. # Skip directories that are in the system default run-time # search path. case " $sys_lib_dlsearch_path " in *" $absdir "*) ;; *) case "$compile_rpath " in *" $absdir "*) ;; *) compile_rpath="$compile_rpath $absdir" esac ;; esac case " $sys_lib_dlsearch_path " in *" $libdir "*) ;; *) case "$finalize_rpath " in *" $libdir "*) ;; *) finalize_rpath="$finalize_rpath $libdir" esac ;; esac if test $linkmode = prog; then # We need to hardcode the library path if test -n "$shlibpath_var"; then # Make sure the rpath contains only unique directories. case "$temp_rpath " in *" $dir "*) ;; *" $absdir "*) ;; *) temp_rpath="$temp_rpath $dir" ;; esac fi fi fi # $linkmode,$pass = prog,link... if test "$alldeplibs" = yes && { test "$deplibs_check_method" = pass_all || { test "$build_libtool_libs" = yes && test -n "$library_names"; }; }; then # We only need to search for static libraries continue fi if test "$installed" = no; then notinst_deplibs="$notinst_deplibs $lib" need_relink=yes fi if test -n "$old_archive_from_expsyms_cmds"; then # figure out the soname set dummy $library_names realname="$2" shift; shift libname=`eval \\$echo \"$libname_spec\"` # use dlname if we got it. it's perfectly good, no? if test -n "$dlname"; then soname="$dlname" elif test -n "$soname_spec"; then # bleh windows case $host in *cygwin*) major=`expr $current - $age` versuffix="-$major" ;; esac eval soname=\"$soname_spec\" else soname="$realname" fi # Make a new name for the extract_expsyms_cmds to use soroot="$soname" soname=`echo $soroot | sed -e 's/^.*\///'` newlib="libimp-`echo $soname | sed 's/^lib//;s/\.dll$//'`.a" # If the library has no export list, then create one now if test -f "$output_objdir/$soname-def"; then : else $show "extracting exported symbol list from \`$soname'" save_ifs="$IFS"; IFS='~' eval cmds=\"$extract_expsyms_cmds\" for cmd in $cmds; do IFS="$save_ifs" $show "$cmd" $run eval "$cmd" || exit $? done IFS="$save_ifs" fi # Create $newlib if test -f "$output_objdir/$newlib"; then :; else $show "generating import library for \`$soname'" save_ifs="$IFS"; IFS='~' eval cmds=\"$old_archive_from_expsyms_cmds\" for cmd in $cmds; do IFS="$save_ifs" $show "$cmd" $run eval "$cmd" || exit $? done IFS="$save_ifs" fi # make sure the library variables are pointing to the new library dir=$output_objdir linklib=$newlib fi # test -n $old_archive_from_expsyms_cmds if test $linkmode = prog || test "$mode" != relink; then add_shlibpath= add_dir= add= lib_linked=yes case $hardcode_action in immediate | unsupported) if test "$hardcode_direct" = no; then add="$dir/$linklib" elif test "$hardcode_minus_L" = no; then case $host in *-*-sunos*) add_shlibpath="$dir" ;; esac add_dir="-L$dir" add="-l$name" elif test "$hardcode_shlibpath_var" = no; then add_shlibpath="$dir" add="-l$name" else lib_linked=no fi ;; relink) if test "$hardcode_direct" = yes; then add="$dir/$linklib" elif test "$hardcode_minus_L" = yes; then add_dir="-L$dir" add="-l$name" elif test "$hardcode_shlibpath_var" = yes; then add_shlibpath="$dir" add="-l$name" else lib_linked=no fi ;; *) lib_linked=no ;; esac if test "$lib_linked" != yes; then $echo "$modename: configuration error: unsupported hardcode properties" exit 1 fi if test -n "$add_shlibpath"; then case :$compile_shlibpath: in *":$add_shlibpath:"*) ;; *) compile_shlibpath="$compile_shlibpath$add_shlibpath:" ;; esac fi if test $linkmode = prog; then test -n "$add_dir" && compile_deplibs="$add_dir $compile_deplibs" test -n "$add" && compile_deplibs="$add $compile_deplibs" else test -n "$add_dir" && deplibs="$add_dir $deplibs" test -n "$add" && deplibs="$add $deplibs" if test "$hardcode_direct" != yes && \ test "$hardcode_minus_L" != yes && \ test "$hardcode_shlibpath_var" = yes; then case :$finalize_shlibpath: in *":$libdir:"*) ;; *) finalize_shlibpath="$finalize_shlibpath$libdir:" ;; esac fi fi fi if test $linkmode = prog || test "$mode" = relink; then add_shlibpath= add_dir= add= # Finalize command for both is simple: just hardcode it. if test "$hardcode_direct" = yes; then add="$libdir/$linklib" elif test "$hardcode_minus_L" = yes; then add_dir="-L$libdir" add="-l$name" elif test "$hardcode_shlibpath_var" = yes; then case :$finalize_shlibpath: in *":$libdir:"*) ;; *) finalize_shlibpath="$finalize_shlibpath$libdir:" ;; esac add="-l$name" else # We cannot seem to hardcode it, guess we'll fake it. add_dir="-L$libdir" add="-l$name" fi if test $linkmode = prog; then test -n "$add_dir" && finalize_deplibs="$add_dir $finalize_deplibs" test -n "$add" && finalize_deplibs="$add $finalize_deplibs" else test -n "$add_dir" && deplibs="$add_dir $deplibs" test -n "$add" && deplibs="$add $deplibs" fi fi elif test $linkmode = prog; then if test "$alldeplibs" = yes && { test "$deplibs_check_method" = pass_all || { test "$build_libtool_libs" = yes && test -n "$library_names"; }; }; then # We only need to search for static libraries continue fi # Try to link the static library # Here we assume that one of hardcode_direct or hardcode_minus_L # is not unsupported. This is valid on all known static and # shared platforms. if test "$hardcode_direct" != unsupported; then test -n "$old_library" && linklib="$old_library" compile_deplibs="$dir/$linklib $compile_deplibs" finalize_deplibs="$dir/$linklib $finalize_deplibs" else compile_deplibs="-l$name -L$dir $compile_deplibs" finalize_deplibs="-l$name -L$dir $finalize_deplibs" fi elif test "$build_libtool_libs" = yes; then # Not a shared library if test "$deplibs_check_method" != pass_all; then # We're trying link a shared library against a static one # but the system doesn't support it. # Just print a warning and add the library to dependency_libs so # that the program can be linked against the static library. echo echo "*** Warning: This library needs some functionality provided by $lib." echo "*** I have the capability to make that library automatically link in when" echo "*** you link to this library. But I can only do this if you have a" echo "*** shared version of the library, which you do not appear to have." if test "$module" = yes; then echo "*** Therefore, libtool will create a static module, that should work " echo "*** as long as the dlopening application is linked with the -dlopen flag." if test -z "$global_symbol_pipe"; then echo echo "*** However, this would only work if libtool was able to extract symbol" echo "*** lists from a program, using \`nm' or equivalent, but libtool could" echo "*** not find such a program. So, this module is probably useless." echo "*** \`nm' from GNU binutils and a full rebuild may help." fi if test "$build_old_libs" = no; then build_libtool_libs=module build_old_libs=yes else build_libtool_libs=no fi fi else convenience="$convenience $dir/$old_library" old_convenience="$old_convenience $dir/$old_library" deplibs="$dir/$old_library $deplibs" link_static=yes fi fi # link shared/static library? if test $linkmode = lib; then if test -n "$dependency_libs" && { test $hardcode_into_libs != yes || test $build_old_libs = yes || test $link_static = yes; }; then # Extract -R from dependency_libs temp_deplibs= for libdir in $dependency_libs; do case $libdir in -R*) temp_xrpath=`$echo "X$libdir" | $Xsed -e 's/^-R//'` case " $xrpath " in *" $temp_xrpath "*) ;; *) xrpath="$xrpath $temp_xrpath";; esac;; *) temp_deplibs="$temp_deplibs $libdir";; esac done dependency_libs="$temp_deplibs" fi newlib_search_path="$newlib_search_path $absdir" # Link against this library test "$link_static" = no && newdependency_libs="$abs_ladir/$laname $newdependency_libs" # ... and its dependency_libs tmp_libs= for deplib in $dependency_libs; do newdependency_libs="$deplib $newdependency_libs" case "$tmp_libs " in *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;; esac tmp_libs="$tmp_libs $deplib" done if test $link_all_deplibs != no; then # Add the search paths of all dependency libraries for deplib in $dependency_libs; do case $deplib in -L*) path="$deplib" ;; *.la) dir=`$echo "X$deplib" | $Xsed -e 's%/[^/]*$%%'` test "X$dir" = "X$deplib" && dir="." # We need an absolute path. case $dir in [\\/]* | [A-Za-z]:[\\/]*) absdir="$dir" ;; *) absdir=`cd "$dir" && pwd` if test -z "$absdir"; then $echo "$modename: warning: cannot determine absolute directory name of \`$dir'" 1>&2 absdir="$dir" fi ;; esac if grep "^installed=no" $deplib > /dev/null; then path="-L$absdir/$objdir" else eval libdir=`sed -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` if test -z "$libdir"; then $echo "$modename: \`$deplib' is not a valid libtool archive" 1>&2 exit 1 fi if test "$absdir" != "$libdir"; then $echo "$modename: warning: \`$deplib' seems to be moved" 1>&2 fi path="-L$absdir" fi ;; *) continue ;; esac case " $deplibs " in *" $path "*) ;; *) deplibs="$deplibs $path" ;; esac done fi # link_all_deplibs != no fi # linkmode = lib done # for deplib in $libs if test $pass = dlpreopen; then # Link the dlpreopened libraries before other libraries for deplib in $save_deplibs; do deplibs="$deplib $deplibs" done fi if test $pass != dlopen; then test $pass != scan && dependency_libs="$newdependency_libs" if test $pass != conv; then # Make sure lib_search_path contains only unique directories. lib_search_path= for dir in $newlib_search_path; do case "$lib_search_path " in *" $dir "*) ;; *) lib_search_path="$lib_search_path $dir" ;; esac done newlib_search_path= fi if test "$linkmode,$pass" != "prog,link"; then vars="deplibs" else vars="compile_deplibs finalize_deplibs" fi for var in $vars dependency_libs; do # Add libraries to $var in reverse order eval tmp_libs=\"\$$var\" new_libs= for deplib in $tmp_libs; do case $deplib in -L*) new_libs="$deplib $new_libs" ;; *) case " $specialdeplibs " in *" $deplib "*) new_libs="$deplib $new_libs" ;; *) case " $new_libs " in *" $deplib "*) ;; *) new_libs="$deplib $new_libs" ;; esac ;; esac ;; esac done tmp_libs= for deplib in $new_libs; do case $deplib in -L*) case " $tmp_libs " in *" $deplib "*) ;; *) tmp_libs="$tmp_libs $deplib" ;; esac ;; *) tmp_libs="$tmp_libs $deplib" ;; esac done eval $var=\"$tmp_libs\" done # for var fi if test "$pass" = "conv" && { test "$linkmode" = "lib" || test "$linkmode" = "prog"; }; then libs="$deplibs" # reset libs deplibs= fi done # for pass if test $linkmode = prog; then dlfiles="$newdlfiles" dlprefiles="$newdlprefiles" fi case $linkmode in oldlib) if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then $echo "$modename: warning: \`-dlopen' is ignored for archives" 1>&2 fi if test -n "$rpath"; then $echo "$modename: warning: \`-rpath' is ignored for archives" 1>&2 fi if test -n "$xrpath"; then $echo "$modename: warning: \`-R' is ignored for archives" 1>&2 fi if test -n "$vinfo"; then $echo "$modename: warning: \`-version-info' is ignored for archives" 1>&2 fi if test -n "$release"; then $echo "$modename: warning: \`-release' is ignored for archives" 1>&2 fi if test -n "$export_symbols" || test -n "$export_symbols_regex"; then $echo "$modename: warning: \`-export-symbols' is ignored for archives" 1>&2 fi # Now set the variables for building old libraries. build_libtool_libs=no oldlibs="$output" objs="$objs$old_deplibs" ;; lib) # Make sure we only generate libraries of the form `libNAME.la'. case $outputname in lib*) name=`$echo "X$outputname" | $Xsed -e 's/\.la$//' -e 's/^lib//'` eval libname=\"$libname_spec\" ;; *) if test "$module" = no; then $echo "$modename: libtool library \`$output' must begin with \`lib'" 1>&2 $echo "$help" 1>&2 exit 1 fi if test "$need_lib_prefix" != no; then # Add the "lib" prefix for modules if required name=`$echo "X$outputname" | $Xsed -e 's/\.la$//'` eval libname=\"$libname_spec\" else libname=`$echo "X$outputname" | $Xsed -e 's/\.la$//'` fi ;; esac if test -n "$objs"; then if test "$deplibs_check_method" != pass_all; then $echo "$modename: cannot build libtool library \`$output' from non-libtool objects on this host:$objs" 2>&1 exit 1 else echo echo "*** Warning: Linking the shared library $output against the non-libtool" echo "*** objects $objs is not portable!" libobjs="$libobjs $objs" fi fi if test "$dlself" != no; then $echo "$modename: warning: \`-dlopen self' is ignored for libtool libraries" 1>&2 fi set dummy $rpath if test $# -gt 2; then $echo "$modename: warning: ignoring multiple \`-rpath's for a libtool library" 1>&2 fi install_libdir="$2" oldlibs= if test -z "$rpath"; then if test "$build_libtool_libs" = yes; then # Building a libtool convenience library. libext=al oldlibs="$output_objdir/$libname.$libext $oldlibs" build_libtool_libs=convenience build_old_libs=yes fi if test -n "$vinfo"; then $echo "$modename: warning: \`-version-info' is ignored for convenience libraries" 1>&2 fi if test -n "$release"; then $echo "$modename: warning: \`-release' is ignored for convenience libraries" 1>&2 fi else # Parse the version information argument. save_ifs="$IFS"; IFS=':' set dummy $vinfo 0 0 0 IFS="$save_ifs" if test -n "$8"; then $echo "$modename: too many parameters to \`-version-info'" 1>&2 $echo "$help" 1>&2 exit 1 fi current="$2" revision="$3" age="$4" # Check that each of the things are valid numbers. case $current in 0 | [1-9] | [1-9][0-9] | [1-9][0-9][0-9]) ;; *) $echo "$modename: CURRENT \`$current' is not a nonnegative integer" 1>&2 $echo "$modename: \`$vinfo' is not valid version information" 1>&2 exit 1 ;; esac case $revision in 0 | [1-9] | [1-9][0-9] | [1-9][0-9][0-9]) ;; *) $echo "$modename: REVISION \`$revision' is not a nonnegative integer" 1>&2 $echo "$modename: \`$vinfo' is not valid version information" 1>&2 exit 1 ;; esac case $age in 0 | [1-9] | [1-9][0-9] | [1-9][0-9][0-9]) ;; *) $echo "$modename: AGE \`$age' is not a nonnegative integer" 1>&2 $echo "$modename: \`$vinfo' is not valid version information" 1>&2 exit 1 ;; esac if test $age -gt $current; then $echo "$modename: AGE \`$age' is greater than the current interface number \`$current'" 1>&2 $echo "$modename: \`$vinfo' is not valid version information" 1>&2 exit 1 fi # Calculate the version variables. major= versuffix= verstring= case $version_type in none) ;; darwin) # Like Linux, but with the current version available in # verstring for coding it into the library header major=.`expr $current - $age` versuffix="$major.$age.$revision" # Darwin ld doesn't like 0 for these options... minor_current=`expr $current + 1` verstring="-compatibility_version $minor_current -current_version $minor_current.$revision" ;; freebsd-aout) major=".$current" versuffix=".$current.$revision"; ;; freebsd-elf) major=".$current" versuffix=".$current"; ;; irix) major=`expr $current - $age + 1` verstring="sgi$major.$revision" # Add in all the interfaces that we are compatible with. loop=$revision while test $loop != 0; do iface=`expr $revision - $loop` loop=`expr $loop - 1` verstring="sgi$major.$iface:$verstring" done # Before this point, $major must not contain `.'. major=.$major versuffix="$major.$revision" ;; linux) major=.`expr $current - $age` versuffix="$major.$age.$revision" ;; osf) major=`expr $current - $age` versuffix=".$current.$age.$revision" verstring="$current.$age.$revision" # Add in all the interfaces that we are compatible with. loop=$age while test $loop != 0; do iface=`expr $current - $loop` loop=`expr $loop - 1` verstring="$verstring:${iface}.0" done # Make executables depend on our current version. verstring="$verstring:${current}.0" ;; sunos) major=".$current" versuffix=".$current.$revision" ;; windows) # Use '-' rather than '.', since we only want one # extension on DOS 8.3 filesystems. major=`expr $current - $age` versuffix="-$major" ;; *) $echo "$modename: unknown library version type \`$version_type'" 1>&2 echo "Fatal configuration error. See the $PACKAGE docs for more information." 1>&2 exit 1 ;; esac # Clear the version info if we defaulted, and they specified a release. if test -z "$vinfo" && test -n "$release"; then major= verstring="0.0" case $version_type in darwin) # we can't check for "0.0" in archive_cmds due to quoting # problems, so we reset it completely verstring="" ;; *) verstring="0.0" ;; esac if test "$need_version" = no; then versuffix= else versuffix=".0.0" fi fi # Remove version info from name if versioning should be avoided if test "$avoid_version" = yes && test "$need_version" = no; then major= versuffix= verstring="" fi # Check to see if the archive will have undefined symbols. if test "$allow_undefined" = yes; then if test "$allow_undefined_flag" = unsupported; then $echo "$modename: warning: undefined symbols not allowed in $host shared libraries" 1>&2 build_libtool_libs=no build_old_libs=yes fi else # Don't allow undefined symbols. allow_undefined_flag="$no_undefined_flag" fi fi if test "$mode" != relink; then # Remove our outputs. $show "${rm}r $output_objdir/$outputname $output_objdir/$libname.* $output_objdir/${libname}${release}.*" $run ${rm}r $output_objdir/$outputname $output_objdir/$libname.* $output_objdir/${libname}${release}.* fi # Now set the variables for building old libraries. if test "$build_old_libs" = yes && test "$build_libtool_libs" != convenience ; then oldlibs="$oldlibs $output_objdir/$libname.$libext" # Transform .lo files to .o files. oldobjs="$objs "`$echo "X$libobjs" | $SP2NL | $Xsed -e '/\.'${libext}'$/d' -e "$lo2o" | $NL2SP` fi # Eliminate all temporary directories. for path in $notinst_path; do lib_search_path=`echo "$lib_search_path " | sed -e 's% $path % %g'` deplibs=`echo "$deplibs " | sed -e 's% -L$path % %g'` dependency_libs=`echo "$dependency_libs " | sed -e 's% -L$path % %g'` done if test -n "$xrpath"; then # If the user specified any rpath flags, then add them. temp_xrpath= for libdir in $xrpath; do temp_xrpath="$temp_xrpath -R$libdir" case "$finalize_rpath " in *" $libdir "*) ;; *) finalize_rpath="$finalize_rpath $libdir" ;; esac done if test $hardcode_into_libs != yes || test $build_old_libs = yes; then dependency_libs="$temp_xrpath $dependency_libs" fi fi # Make sure dlfiles contains only unique files that won't be dlpreopened old_dlfiles="$dlfiles" dlfiles= for lib in $old_dlfiles; do case " $dlprefiles $dlfiles " in *" $lib "*) ;; *) dlfiles="$dlfiles $lib" ;; esac done # Make sure dlprefiles contains only unique files old_dlprefiles="$dlprefiles" dlprefiles= for lib in $old_dlprefiles; do case "$dlprefiles " in *" $lib "*) ;; *) dlprefiles="$dlprefiles $lib" ;; esac done if test "$build_libtool_libs" = yes; then if test -n "$rpath"; then case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos*) # these systems don't actually have a c library (as such)! ;; *-*-rhapsody* | *-*-darwin1.[012]) # Rhapsody C library is in the System framework deplibs="$deplibs -framework System" ;; *-*-netbsd*) # Don't link with libc until the a.out ld.so is fixed. ;; *-*-openbsd*) # Do not include libc due to us having libc/libc_r. ;; *) # Add libc to deplibs on all other systems if necessary. if test $build_libtool_need_lc = "yes"; then deplibs="$deplibs -lc" fi ;; esac fi # Transform deplibs into only deplibs that can be linked in shared. name_save=$name libname_save=$libname release_save=$release versuffix_save=$versuffix major_save=$major # I'm not sure if I'm treating the release correctly. I think # release should show up in the -l (ie -lgmp5) so we don't want to # add it in twice. Is that correct? release="" versuffix="" major="" newdeplibs= droppeddeps=no case $deplibs_check_method in pass_all) # Don't check for shared/static. Everything works. # This might be a little naive. We might want to check # whether the library exists or not. But this is on # osf3 & osf4 and I'm not really sure... Just # implementing what was already the behaviour. newdeplibs=$deplibs ;; test_compile) # This code stresses the "libraries are programs" paradigm to its # limits. Maybe even breaks it. We compile a program, linking it # against the deplibs as a proxy for the library. Then we can check # whether they linked in statically or dynamically with ldd. $rm conftest.c cat > conftest.c </dev/null` for potent_lib in $potential_libs; do # Follow soft links. if ls -lLd "$potent_lib" 2>/dev/null \ | grep " -> " >/dev/null; then continue fi # The statement above tries to avoid entering an # endless loop below, in case of cyclic links. # We might still enter an endless loop, since a link # loop can be closed while we follow links, # but so what? potlib="$potent_lib" while test -h "$potlib" 2>/dev/null; do potliblink=`ls -ld $potlib | sed 's/.* -> //'` case $potliblink in [\\/]* | [A-Za-z]:[\\/]*) potlib="$potliblink";; *) potlib=`$echo "X$potlib" | $Xsed -e 's,[^/]*$,,'`"$potliblink";; esac done if eval $file_magic_cmd \"\$potlib\" 2>/dev/null \ | sed 10q \ | egrep "$file_magic_regex" > /dev/null; then newdeplibs="$newdeplibs $a_deplib" a_deplib="" break 2 fi done done if test -n "$a_deplib" ; then droppeddeps=yes echo echo "*** Warning: This library needs some functionality provided by $a_deplib." echo "*** I have the capability to make that library automatically link in when" echo "*** you link to this library. But I can only do this if you have a" echo "*** shared version of the library, which you do not appear to have." fi else # Add a -L argument. newdeplibs="$newdeplibs $a_deplib" fi done # Gone through all deplibs. ;; match_pattern*) set dummy $deplibs_check_method match_pattern_regex=`expr "$deplibs_check_method" : "$2 \(.*\)"` for a_deplib in $deplibs; do name="`expr $a_deplib : '-l\(.*\)'`" # If $name is empty we are operating on a -L argument. if test -n "$name" && test "$name" != "0"; then libname=`eval \\$echo \"$libname_spec\"` for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do potential_libs=`ls $i/$libname[.-]* 2>/dev/null` for potent_lib in $potential_libs; do if eval echo \"$potent_lib\" 2>/dev/null \ | sed 10q \ | egrep "$match_pattern_regex" > /dev/null; then newdeplibs="$newdeplibs $a_deplib" a_deplib="" break 2 fi done done if test -n "$a_deplib" ; then droppeddeps=yes echo echo "*** Warning: This library needs some functionality provided by $a_deplib." echo "*** I have the capability to make that library automatically link in when" echo "*** you link to this library. But I can only do this if you have a" echo "*** shared version of the library, which you do not appear to have." fi else # Add a -L argument. newdeplibs="$newdeplibs $a_deplib" fi done # Gone through all deplibs. ;; none | unknown | *) newdeplibs="" if $echo "X $deplibs" | $Xsed -e 's/ -lc$//' \ -e 's/ -[LR][^ ]*//g' -e 's/[ ]//g' | grep . >/dev/null; then echo if test "X$deplibs_check_method" = "Xnone"; then echo "*** Warning: inter-library dependencies are not supported in this platform." else echo "*** Warning: inter-library dependencies are not known to be supported." fi echo "*** All declared inter-library dependencies are being dropped." droppeddeps=yes fi ;; esac versuffix=$versuffix_save major=$major_save release=$release_save libname=$libname_save name=$name_save case $host in *-*-rhapsody* | *-*-darwin1.[012]) # On Rhapsody replace the C library is the System framework newdeplibs=`$echo "X $newdeplibs" | $Xsed -e 's/ -lc / -framework System /'` ;; esac if test "$droppeddeps" = yes; then if test "$module" = yes; then echo echo "*** Warning: libtool could not satisfy all declared inter-library" echo "*** dependencies of module $libname. Therefore, libtool will create" echo "*** a static module, that should work as long as the dlopening" echo "*** application is linked with the -dlopen flag." if test -z "$global_symbol_pipe"; then echo echo "*** However, this would only work if libtool was able to extract symbol" echo "*** lists from a program, using \`nm' or equivalent, but libtool could" echo "*** not find such a program. So, this module is probably useless." echo "*** \`nm' from GNU binutils and a full rebuild may help." fi if test "$build_old_libs" = no; then oldlibs="$output_objdir/$libname.$libext" build_libtool_libs=module build_old_libs=yes else build_libtool_libs=no fi else echo "*** The inter-library dependencies that have been dropped here will be" echo "*** automatically added whenever a program is linked with this library" echo "*** or is declared to -dlopen it." if test $allow_undefined = no; then echo echo "*** Since this library must not contain undefined symbols," echo "*** because either the platform does not support them or" echo "*** it was explicitly requested with -no-undefined," echo "*** libtool will only create a static version of it." if test "$build_old_libs" = no; then oldlibs="$output_objdir/$libname.$libext" build_libtool_libs=module build_old_libs=yes else build_libtool_libs=no fi fi fi fi # Done checking deplibs! deplibs=$newdeplibs fi # All the library-specific variables (install_libdir is set above). library_names= old_library= dlname= # Test again, we may have decided not to build it any more if test "$build_libtool_libs" = yes; then if test $hardcode_into_libs = yes; then # Hardcode the library paths hardcode_libdirs= dep_rpath= rpath="$finalize_rpath" test "$mode" != relink && rpath="$compile_rpath$rpath" for libdir in $rpath; do if test -n "$hardcode_libdir_flag_spec"; then if test -n "$hardcode_libdir_separator"; then if test -z "$hardcode_libdirs"; then hardcode_libdirs="$libdir" else # Just accumulate the unique libdirs. case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) ;; *) hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir" ;; esac fi else eval flag=\"$hardcode_libdir_flag_spec\" dep_rpath="$dep_rpath $flag" fi elif test -n "$runpath_var"; then case "$perm_rpath " in *" $libdir "*) ;; *) perm_rpath="$perm_rpath $libdir" ;; esac fi done # Substitute the hardcoded libdirs into the rpath. if test -n "$hardcode_libdir_separator" && test -n "$hardcode_libdirs"; then libdir="$hardcode_libdirs" eval dep_rpath=\"$hardcode_libdir_flag_spec\" fi if test -n "$runpath_var" && test -n "$perm_rpath"; then # We should set the runpath_var. rpath= for dir in $perm_rpath; do rpath="$rpath$dir:" done eval "$runpath_var='$rpath\$$runpath_var'; export $runpath_var" fi test -n "$dep_rpath" && deplibs="$dep_rpath $deplibs" fi shlibpath="$finalize_shlibpath" test "$mode" != relink && shlibpath="$compile_shlibpath$shlibpath" if test -n "$shlibpath"; then eval "$shlibpath_var='$shlibpath\$$shlibpath_var'; export $shlibpath_var" fi # Get the real and link names of the library. eval library_names=\"$library_names_spec\" set dummy $library_names realname="$2" shift; shift if test -n "$soname_spec"; then eval soname=\"$soname_spec\" else soname="$realname" fi test -z "$dlname" && dlname=$soname lib="$output_objdir/$realname" for link do linknames="$linknames $link" done # Ensure that we have .o objects for linkers which dislike .lo # (e.g. aix) in case we are running --disable-static for obj in $libobjs; do xdir=`$echo "X$obj" | $Xsed -e 's%/[^/]*$%%'` if test "X$xdir" = "X$obj"; then xdir="." else xdir="$xdir" fi baseobj=`$echo "X$obj" | $Xsed -e 's%^.*/%%'` oldobj=`$echo "X$baseobj" | $Xsed -e "$lo2o"` if test ! -f $xdir/$oldobj; then $show "(cd $xdir && ${LN_S} $baseobj $oldobj)" $run eval '(cd $xdir && ${LN_S} $baseobj $oldobj)' || exit $? fi done # Use standard objects if they are pic test -z "$pic_flag" && libobjs=`$echo "X$libobjs" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` # Prepare the list of exported symbols if test -z "$export_symbols"; then if test "$always_export_symbols" = yes || test -n "$export_symbols_regex"; then $show "generating symbol list for \`$libname.la'" export_symbols="$output_objdir/$libname.exp" $run $rm $export_symbols eval cmds=\"$export_symbols_cmds\" save_ifs="$IFS"; IFS='~' for cmd in $cmds; do IFS="$save_ifs" $show "$cmd" $run eval "$cmd" || exit $? done IFS="$save_ifs" if test -n "$export_symbols_regex"; then $show "egrep -e \"$export_symbols_regex\" \"$export_symbols\" > \"${export_symbols}T\"" $run eval 'egrep -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' $show "$mv \"${export_symbols}T\" \"$export_symbols\"" $run eval '$mv "${export_symbols}T" "$export_symbols"' fi fi fi if test -n "$export_symbols" && test -n "$include_expsyms"; then $run eval '$echo "X$include_expsyms" | $SP2NL >> "$export_symbols"' fi if test -n "$convenience"; then if test -n "$whole_archive_flag_spec"; then eval libobjs=\"\$libobjs $whole_archive_flag_spec\" else gentop="$output_objdir/${outputname}x" $show "${rm}r $gentop" $run ${rm}r "$gentop" $show "mkdir $gentop" $run mkdir "$gentop" status=$? if test $status -ne 0 && test ! -d "$gentop"; then exit $status fi generated="$generated $gentop" for xlib in $convenience; do # Extract the objects. case $xlib in [\\/]* | [A-Za-z]:[\\/]*) xabs="$xlib" ;; *) xabs=`pwd`"/$xlib" ;; esac xlib=`$echo "X$xlib" | $Xsed -e 's%^.*/%%'` xdir="$gentop/$xlib" $show "${rm}r $xdir" $run ${rm}r "$xdir" $show "mkdir $xdir" $run mkdir "$xdir" status=$? if test $status -ne 0 && test ! -d "$xdir"; then exit $status fi $show "(cd $xdir && $AR x $xabs)" $run eval "(cd \$xdir && $AR x \$xabs)" || exit $? libobjs="$libobjs "`find $xdir -name \*.o -print -o -name \*.lo -print | $NL2SP` done fi fi if test "$thread_safe" = yes && test -n "$thread_safe_flag_spec"; then eval flag=\"$thread_safe_flag_spec\" linker_flags="$linker_flags $flag" fi # Make a backup of the uninstalled library when relinking if test "$mode" = relink; then $run eval '(cd $output_objdir && $rm ${realname}U && $mv $realname ${realname}U)' || exit $? fi # Do each of the archive commands. if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then eval cmds=\"$archive_expsym_cmds\" else eval cmds=\"$archive_cmds\" fi save_ifs="$IFS"; IFS='~' for cmd in $cmds; do IFS="$save_ifs" $show "$cmd" $run eval "$cmd" || exit $? done IFS="$save_ifs" # Restore the uninstalled library and exit if test "$mode" = relink; then $run eval '(cd $output_objdir && $rm ${realname}T && $mv $realname ${realname}T && $mv "$realname"U $realname)' || exit $? exit 0 fi # Create links to the real library. for linkname in $linknames; do if test "$realname" != "$linkname"; then $show "(cd $output_objdir && $rm $linkname && $LN_S $realname $linkname)" $run eval '(cd $output_objdir && $rm $linkname && $LN_S $realname $linkname)' || exit $? fi done # If -module or -export-dynamic was specified, set the dlname. if test "$module" = yes || test "$export_dynamic" = yes; then # On all known operating systems, these are identical. dlname="$soname" fi fi ;; obj) if test -n "$deplibs"; then $echo "$modename: warning: \`-l' and \`-L' are ignored for objects" 1>&2 fi if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then $echo "$modename: warning: \`-dlopen' is ignored for objects" 1>&2 fi if test -n "$rpath"; then $echo "$modename: warning: \`-rpath' is ignored for objects" 1>&2 fi if test -n "$xrpath"; then $echo "$modename: warning: \`-R' is ignored for objects" 1>&2 fi if test -n "$vinfo"; then $echo "$modename: warning: \`-version-info' is ignored for objects" 1>&2 fi if test -n "$release"; then $echo "$modename: warning: \`-release' is ignored for objects" 1>&2 fi case $output in *.lo) if test -n "$objs$old_deplibs"; then $echo "$modename: cannot build library object \`$output' from non-libtool objects" 1>&2 exit 1 fi libobj="$output" obj=`$echo "X$output" | $Xsed -e "$lo2o"` ;; *) libobj= obj="$output" ;; esac # Delete the old objects. $run $rm $obj $libobj # Objects from convenience libraries. This assumes # single-version convenience libraries. Whenever we create # different ones for PIC/non-PIC, this we'll have to duplicate # the extraction. reload_conv_objs= gentop= # reload_cmds runs $LD directly, so let us get rid of # -Wl from whole_archive_flag_spec wl= if test -n "$convenience"; then if test -n "$whole_archive_flag_spec"; then eval reload_conv_objs=\"\$reload_objs $whole_archive_flag_spec\" else gentop="$output_objdir/${obj}x" $show "${rm}r $gentop" $run ${rm}r "$gentop" $show "mkdir $gentop" $run mkdir "$gentop" status=$? if test $status -ne 0 && test ! -d "$gentop"; then exit $status fi generated="$generated $gentop" for xlib in $convenience; do # Extract the objects. case $xlib in [\\/]* | [A-Za-z]:[\\/]*) xabs="$xlib" ;; *) xabs=`pwd`"/$xlib" ;; esac xlib=`$echo "X$xlib" | $Xsed -e 's%^.*/%%'` xdir="$gentop/$xlib" $show "${rm}r $xdir" $run ${rm}r "$xdir" $show "mkdir $xdir" $run mkdir "$xdir" status=$? if test $status -ne 0 && test ! -d "$xdir"; then exit $status fi $show "(cd $xdir && $AR x $xabs)" $run eval "(cd \$xdir && $AR x \$xabs)" || exit $? reload_conv_objs="$reload_objs "`find $xdir -name \*.o -print -o -name \*.lo -print | $NL2SP` done fi fi # Create the old-style object. reload_objs="$objs$old_deplibs "`$echo "X$libobjs" | $SP2NL | $Xsed -e '/\.'${libext}$'/d' -e '/\.lib$/d' -e "$lo2o" | $NL2SP`" $reload_conv_objs" ### testsuite: skip nested quoting test output="$obj" eval cmds=\"$reload_cmds\" save_ifs="$IFS"; IFS='~' for cmd in $cmds; do IFS="$save_ifs" $show "$cmd" $run eval "$cmd" || exit $? done IFS="$save_ifs" # Exit if we aren't doing a library object file. if test -z "$libobj"; then if test -n "$gentop"; then $show "${rm}r $gentop" $run ${rm}r $gentop fi exit 0 fi if test "$build_libtool_libs" != yes; then if test -n "$gentop"; then $show "${rm}r $gentop" $run ${rm}r $gentop fi # Create an invalid libtool object if no PIC, so that we don't # accidentally link it into a program. $show "echo timestamp > $libobj" $run eval "echo timestamp > $libobj" || exit $? exit 0 fi if test -n "$pic_flag" || test "$pic_mode" != default; then # Only do commands if we really have different PIC objects. reload_objs="$libobjs $reload_conv_objs" output="$libobj" eval cmds=\"$reload_cmds\" save_ifs="$IFS"; IFS='~' for cmd in $cmds; do IFS="$save_ifs" $show "$cmd" $run eval "$cmd" || exit $? done IFS="$save_ifs" else # Just create a symlink. $show $rm $libobj $run $rm $libobj xdir=`$echo "X$libobj" | $Xsed -e 's%/[^/]*$%%'` if test "X$xdir" = "X$libobj"; then xdir="." else xdir="$xdir" fi baseobj=`$echo "X$libobj" | $Xsed -e 's%^.*/%%'` oldobj=`$echo "X$baseobj" | $Xsed -e "$lo2o"` $show "(cd $xdir && $LN_S $oldobj $baseobj)" $run eval '(cd $xdir && $LN_S $oldobj $baseobj)' || exit $? fi if test -n "$gentop"; then $show "${rm}r $gentop" $run ${rm}r $gentop fi exit 0 ;; prog) case $host in *cygwin*) output=`echo $output | sed -e 's,.exe$,,;s,$,.exe,'` ;; esac if test -n "$vinfo"; then $echo "$modename: warning: \`-version-info' is ignored for programs" 1>&2 fi if test -n "$release"; then $echo "$modename: warning: \`-release' is ignored for programs" 1>&2 fi if test "$preload" = yes; then if test "$dlopen_support" = unknown && test "$dlopen_self" = unknown && test "$dlopen_self_static" = unknown; then $echo "$modename: warning: \`AC_LIBTOOL_DLOPEN' not used. Assuming no dlopen support." fi fi case $host in *-*-rhapsody* | *-*-darwin1.[012]) # On Rhapsody replace the C library is the System framework compile_deplibs=`$echo "X $compile_deplibs" | $Xsed -e 's/ -lc / -framework System /'` finalize_deplibs=`$echo "X $finalize_deplibs" | $Xsed -e 's/ -lc / -framework System /'` ;; esac compile_command="$compile_command $compile_deplibs" finalize_command="$finalize_command $finalize_deplibs" if test -n "$rpath$xrpath"; then # If the user specified any rpath flags, then add them. for libdir in $rpath $xrpath; do # This is the magic to use -rpath. case "$finalize_rpath " in *" $libdir "*) ;; *) finalize_rpath="$finalize_rpath $libdir" ;; esac done fi # Now hardcode the library paths rpath= hardcode_libdirs= for libdir in $compile_rpath $finalize_rpath; do if test -n "$hardcode_libdir_flag_spec"; then if test -n "$hardcode_libdir_separator"; then if test -z "$hardcode_libdirs"; then hardcode_libdirs="$libdir" else # Just accumulate the unique libdirs. case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) ;; *) hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir" ;; esac fi else eval flag=\"$hardcode_libdir_flag_spec\" rpath="$rpath $flag" fi elif test -n "$runpath_var"; then case "$perm_rpath " in *" $libdir "*) ;; *) perm_rpath="$perm_rpath $libdir" ;; esac fi case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2*) case :$dllsearchpath: in *":$libdir:"*) ;; *) dllsearchpath="$dllsearchpath:$libdir";; esac ;; esac done # Substitute the hardcoded libdirs into the rpath. if test -n "$hardcode_libdir_separator" && test -n "$hardcode_libdirs"; then libdir="$hardcode_libdirs" eval rpath=\" $hardcode_libdir_flag_spec\" fi compile_rpath="$rpath" rpath= hardcode_libdirs= for libdir in $finalize_rpath; do if test -n "$hardcode_libdir_flag_spec"; then if test -n "$hardcode_libdir_separator"; then if test -z "$hardcode_libdirs"; then hardcode_libdirs="$libdir" else # Just accumulate the unique libdirs. case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) ;; *) hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir" ;; esac fi else eval flag=\"$hardcode_libdir_flag_spec\" rpath="$rpath $flag" fi elif test -n "$runpath_var"; then case "$finalize_perm_rpath " in *" $libdir "*) ;; *) finalize_perm_rpath="$finalize_perm_rpath $libdir" ;; esac fi done # Substitute the hardcoded libdirs into the rpath. if test -n "$hardcode_libdir_separator" && test -n "$hardcode_libdirs"; then libdir="$hardcode_libdirs" eval rpath=\" $hardcode_libdir_flag_spec\" fi finalize_rpath="$rpath" if test -n "$libobjs" && test "$build_old_libs" = yes; then # Transform all the library objects into standard objects. compile_command=`$echo "X$compile_command" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` finalize_command=`$echo "X$finalize_command" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` fi dlsyms= if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then if test -n "$NM" && test -n "$global_symbol_pipe"; then dlsyms="${outputname}S.c" else $echo "$modename: not configured to extract global symbols from dlpreopened files" 1>&2 fi fi if test -n "$dlsyms"; then case $dlsyms in "") ;; *.c) # Discover the nlist of each of the dlfiles. nlist="$output_objdir/${outputname}.nm" $show "$rm $nlist ${nlist}S ${nlist}T" $run $rm "$nlist" "${nlist}S" "${nlist}T" # Parse the name list into a source file. $show "creating $output_objdir/$dlsyms" test -z "$run" && $echo > "$output_objdir/$dlsyms" "\ /* $dlsyms - symbol resolution table for \`$outputname' dlsym emulation. */ /* Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP */ #ifdef __cplusplus extern \"C\" { #endif /* Prevent the only kind of declaration conflicts we can make. */ #define lt_preloaded_symbols some_other_symbol /* External symbol declarations for the compiler. */\ " if test "$dlself" = yes; then $show "generating symbol list for \`$output'" test -z "$run" && $echo ': @PROGRAM@ ' > "$nlist" # Add our own program objects to the symbol list. progfiles=`$echo "X$objs$old_deplibs" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` for arg in $progfiles; do $show "extracting global C symbols from \`$arg'" $run eval "$NM $arg | $global_symbol_pipe >> '$nlist'" done if test -n "$exclude_expsyms"; then $run eval 'egrep -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T' $run eval '$mv "$nlist"T "$nlist"' fi if test -n "$export_symbols_regex"; then $run eval 'egrep -e "$export_symbols_regex" "$nlist" > "$nlist"T' $run eval '$mv "$nlist"T "$nlist"' fi # Prepare the list of exported symbols if test -z "$export_symbols"; then export_symbols="$output_objdir/$output.exp" $run $rm $export_symbols $run eval "sed -n -e '/^: @PROGRAM@$/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"' else $run eval "sed -e 's/\([][.*^$]\)/\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$output.exp"' $run eval 'grep -f "$output_objdir/$output.exp" < "$nlist" > "$nlist"T' $run eval 'mv "$nlist"T "$nlist"' fi fi for arg in $dlprefiles; do $show "extracting global C symbols from \`$arg'" name=`echo "$arg" | sed -e 's%^.*/%%'` $run eval 'echo ": $name " >> "$nlist"' $run eval "$NM $arg | $global_symbol_pipe >> '$nlist'" done if test -z "$run"; then # Make sure we have at least an empty file. test -f "$nlist" || : > "$nlist" if test -n "$exclude_expsyms"; then egrep -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T $mv "$nlist"T "$nlist" fi # Try sorting and uniquifying the output. if grep -v "^: " < "$nlist" | sort +2 | uniq > "$nlist"S; then : else grep -v "^: " < "$nlist" > "$nlist"S fi if test -f "$nlist"S; then eval "$global_symbol_to_cdecl"' < "$nlist"S >> "$output_objdir/$dlsyms"' else echo '/* NONE */' >> "$output_objdir/$dlsyms" fi $echo >> "$output_objdir/$dlsyms" "\ #undef lt_preloaded_symbols #if defined (__STDC__) && __STDC__ # define lt_ptr void * #else # define lt_ptr char * # define const #endif /* The mapping between symbol names and symbols. */ const struct { const char *name; lt_ptr address; } lt_preloaded_symbols[] = {\ " eval "$global_symbol_to_c_name_address" < "$nlist" >> "$output_objdir/$dlsyms" $echo >> "$output_objdir/$dlsyms" "\ {0, (lt_ptr) 0} }; /* This works around a problem in FreeBSD linker */ #ifdef FREEBSD_WORKAROUND static const void *lt_preloaded_setup() { return lt_preloaded_symbols; } #endif #ifdef __cplusplus } #endif\ " fi pic_flag_for_symtable= case $host in # compiling the symbol table file with pic_flag works around # a FreeBSD bug that causes programs to crash when -lm is # linked before any other PIC object. But we must not use # pic_flag when linking with -static. The problem exists in # FreeBSD 2.2.6 and is fixed in FreeBSD 3.1. *-*-freebsd2*|*-*-freebsd3.0*|*-*-freebsdelf3.0*) case "$compile_command " in *" -static "*) ;; *) pic_flag_for_symtable=" $pic_flag -DPIC -DFREEBSD_WORKAROUND";; esac;; *-*-hpux*) case "$compile_command " in *" -static "*) ;; *) pic_flag_for_symtable=" $pic_flag -DPIC";; esac esac # Now compile the dynamic symbol file. $show "(cd $output_objdir && $CC -c$no_builtin_flag$pic_flag_for_symtable \"$dlsyms\")" $run eval '(cd $output_objdir && $CC -c$no_builtin_flag$pic_flag_for_symtable "$dlsyms")' || exit $? # Clean up the generated files. $show "$rm $output_objdir/$dlsyms $nlist ${nlist}S ${nlist}T" $run $rm "$output_objdir/$dlsyms" "$nlist" "${nlist}S" "${nlist}T" # Transform the symbol file into the correct name. compile_command=`$echo "X$compile_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}S.${objext}%"` finalize_command=`$echo "X$finalize_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}S.${objext}%"` ;; *) $echo "$modename: unknown suffix for \`$dlsyms'" 1>&2 exit 1 ;; esac else # We keep going just in case the user didn't refer to # lt_preloaded_symbols. The linker will fail if global_symbol_pipe # really was required. # Nullify the symbol file. compile_command=`$echo "X$compile_command" | $Xsed -e "s% @SYMFILE@%%"` finalize_command=`$echo "X$finalize_command" | $Xsed -e "s% @SYMFILE@%%"` fi if test $need_relink = no || test "$build_libtool_libs" != yes; then # Replace the output file specification. compile_command=`$echo "X$compile_command" | $Xsed -e 's%@OUTPUT@%'"$output"'%g'` link_command="$compile_command$compile_rpath" # We have no uninstalled library dependencies, so finalize right now. $show "$link_command" $run eval "$link_command" status=$? # Delete the generated files. if test -n "$dlsyms"; then $show "$rm $output_objdir/${outputname}S.${objext}" $run $rm "$output_objdir/${outputname}S.${objext}" fi exit $status fi if test -n "$shlibpath_var"; then # We should set the shlibpath_var rpath= for dir in $temp_rpath; do case $dir in [\\/]* | [A-Za-z]:[\\/]*) # Absolute path. rpath="$rpath$dir:" ;; *) # Relative path: add a thisdir entry. rpath="$rpath\$thisdir/$dir:" ;; esac done temp_rpath="$rpath" fi if test -n "$compile_shlibpath$finalize_shlibpath"; then compile_command="$shlibpath_var=\"$compile_shlibpath$finalize_shlibpath\$$shlibpath_var\" $compile_command" fi if test -n "$finalize_shlibpath"; then finalize_command="$shlibpath_var=\"$finalize_shlibpath\$$shlibpath_var\" $finalize_command" fi compile_var= finalize_var= if test -n "$runpath_var"; then if test -n "$perm_rpath"; then # We should set the runpath_var. rpath= for dir in $perm_rpath; do rpath="$rpath$dir:" done compile_var="$runpath_var=\"$rpath\$$runpath_var\" " fi if test -n "$finalize_perm_rpath"; then # We should set the runpath_var. rpath= for dir in $finalize_perm_rpath; do rpath="$rpath$dir:" done finalize_var="$runpath_var=\"$rpath\$$runpath_var\" " fi fi if test "$no_install" = yes; then # We don't need to create a wrapper script. link_command="$compile_var$compile_command$compile_rpath" # Replace the output file specification. link_command=`$echo "X$link_command" | $Xsed -e 's%@OUTPUT@%'"$output"'%g'` # Delete the old output file. $run $rm $output # Link the executable and exit $show "$link_command" $run eval "$link_command" || exit $? exit 0 fi if test "$hardcode_action" = relink; then # Fast installation is not supported link_command="$compile_var$compile_command$compile_rpath" relink_command="$finalize_var$finalize_command$finalize_rpath" $echo "$modename: warning: this platform does not like uninstalled shared libraries" 1>&2 $echo "$modename: \`$output' will be relinked during installation" 1>&2 else if test "$fast_install" != no; then link_command="$finalize_var$compile_command$finalize_rpath" if test "$fast_install" = yes; then relink_command=`$echo "X$compile_var$compile_command$compile_rpath" | $Xsed -e 's%@OUTPUT@%\$progdir/\$file%g'` else # fast_install is set to needless relink_command= fi else link_command="$compile_var$compile_command$compile_rpath" relink_command="$finalize_var$finalize_command$finalize_rpath" fi fi # Replace the output file specification. link_command=`$echo "X$link_command" | $Xsed -e 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'` # Delete the old output files. $run $rm $output $output_objdir/$outputname $output_objdir/lt-$outputname $show "$link_command" $run eval "$link_command" || exit $? # Now create the wrapper script. $show "creating $output" # Quote the relink command for shipping. if test -n "$relink_command"; then # Preserve any variables that may affect compiler behavior for var in $variables_saved_for_relink; do if eval test -z \"\${$var+set}\"; then relink_command="{ test -z \"\${$var+set}\" || unset $var || { $var=; export $var; }; }; $relink_command" elif eval var_value=\$$var; test -z "$var_value"; then relink_command="$var=; export $var; $relink_command" else var_value=`$echo "X$var_value" | $Xsed -e "$sed_quote_subst"` relink_command="$var=\"$var_value\"; export $var; $relink_command" fi done relink_command="cd `pwd`; $relink_command" relink_command=`$echo "X$relink_command" | $Xsed -e "$sed_quote_subst"` fi # Quote $echo for shipping. if test "X$echo" = "X$SHELL $0 --fallback-echo"; then case $0 in [\\/]* | [A-Za-z]:[\\/]*) qecho="$SHELL $0 --fallback-echo";; *) qecho="$SHELL `pwd`/$0 --fallback-echo";; esac qecho=`$echo "X$qecho" | $Xsed -e "$sed_quote_subst"` else qecho=`$echo "X$echo" | $Xsed -e "$sed_quote_subst"` fi # Only actually do things if our run command is non-null. if test -z "$run"; then # win32 will think the script is a binary if it has # a .exe suffix, so we strip it off here. case $output in *.exe) output=`echo $output|sed 's,.exe$,,'` ;; esac # test for cygwin because mv fails w/o .exe extensions case $host in *cygwin*) exeext=.exe ;; *) exeext= ;; esac $rm $output trap "$rm $output; exit 1" 1 2 15 $echo > $output "\ #! $SHELL # $output - temporary wrapper script for $objdir/$outputname # Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP # # The $output program cannot be directly executed until all the libtool # libraries that it depends on are installed. # # This wrapper script should never be moved out of the build directory. # If it is, it will not operate correctly. # Sed substitution that helps us do robust quoting. It backslashifies # metacharacters that are still active within double-quoted strings. Xsed='sed -e 1s/^X//' sed_quote_subst='$sed_quote_subst' # The HP-UX ksh and POSIX shell print the target directory to stdout # if CDPATH is set. if test \"\${CDPATH+set}\" = set; then CDPATH=:; export CDPATH; fi relink_command=\"$relink_command\" # This environment variable determines our operation mode. if test \"\$libtool_install_magic\" = \"$magic\"; then # install mode needs the following variable: notinst_deplibs='$notinst_deplibs' else # When we are sourced in execute mode, \$file and \$echo are already set. if test \"\$libtool_execute_magic\" != \"$magic\"; then echo=\"$qecho\" file=\"\$0\" # Make sure echo works. if test \"X\$1\" = X--no-reexec; then # Discard the --no-reexec flag, and continue. shift elif test \"X\`(\$echo '\t') 2>/dev/null\`\" = 'X\t'; then # Yippee, \$echo works! : else # Restart under the correct shell, and then maybe \$echo will work. exec $SHELL \"\$0\" --no-reexec \${1+\"\$@\"} fi fi\ " $echo >> $output "\ # Find the directory that this script lives in. thisdir=\`\$echo \"X\$file\" | \$Xsed -e 's%/[^/]*$%%'\` test \"x\$thisdir\" = \"x\$file\" && thisdir=. # Follow symbolic links until we get to the real thisdir. file=\`ls -ld \"\$file\" | sed -n 's/.*-> //p'\` while test -n \"\$file\"; do destdir=\`\$echo \"X\$file\" | \$Xsed -e 's%/[^/]*\$%%'\` # If there was a directory component, then change thisdir. if test \"x\$destdir\" != \"x\$file\"; then case \"\$destdir\" in [\\\\/]* | [A-Za-z]:[\\\\/]*) thisdir=\"\$destdir\" ;; *) thisdir=\"\$thisdir/\$destdir\" ;; esac fi file=\`\$echo \"X\$file\" | \$Xsed -e 's%^.*/%%'\` file=\`ls -ld \"\$thisdir/\$file\" | sed -n 's/.*-> //p'\` done # Try to get the absolute directory name. absdir=\`cd \"\$thisdir\" && pwd\` test -n \"\$absdir\" && thisdir=\"\$absdir\" " if test "$fast_install" = yes; then echo >> $output "\ program=lt-'$outputname'$exeext progdir=\"\$thisdir/$objdir\" if test ! -f \"\$progdir/\$program\" || \\ { file=\`ls -1dt \"\$progdir/\$program\" \"\$progdir/../\$program\" 2>/dev/null | sed 1q\`; \\ test \"X\$file\" != \"X\$progdir/\$program\"; }; then file=\"\$\$-\$program\" if test ! -d \"\$progdir\"; then $mkdir \"\$progdir\" else $rm \"\$progdir/\$file\" fi" echo >> $output "\ # relink executable if necessary if test -n \"\$relink_command\"; then if relink_command_output=\`eval \$relink_command 2>&1\`; then : else $echo \"\$relink_command_output\" >&2 $rm \"\$progdir/\$file\" exit 1 fi fi $mv \"\$progdir/\$file\" \"\$progdir/\$program\" 2>/dev/null || { $rm \"\$progdir/\$program\"; $mv \"\$progdir/\$file\" \"\$progdir/\$program\"; } $rm \"\$progdir/\$file\" fi" else echo >> $output "\ program='$outputname' progdir=\"\$thisdir/$objdir\" " fi echo >> $output "\ if test -f \"\$progdir/\$program\"; then" # Export our shlibpath_var if we have one. if test "$shlibpath_overrides_runpath" = yes && test -n "$shlibpath_var" && test -n "$temp_rpath"; then $echo >> $output "\ # Add our own library path to $shlibpath_var $shlibpath_var=\"$temp_rpath\$$shlibpath_var\" # Some systems cannot cope with colon-terminated $shlibpath_var # The second colon is a workaround for a bug in BeOS R4 sed $shlibpath_var=\`\$echo \"X\$$shlibpath_var\" | \$Xsed -e 's/::*\$//'\` export $shlibpath_var " fi # fixup the dll searchpath if we need to. if test -n "$dllsearchpath"; then $echo >> $output "\ # Add the dll search path components to the executable PATH PATH=$dllsearchpath:\$PATH " fi $echo >> $output "\ if test \"\$libtool_execute_magic\" != \"$magic\"; then # Run the actual program with our arguments. " case $host in # win32 systems need to use the prog path for dll # lookup to work *-*-cygwin* | *-*-pw32*) $echo >> $output "\ exec \$progdir/\$program \${1+\"\$@\"} " ;; # Backslashes separate directories on plain windows *-*-mingw | *-*-os2*) $echo >> $output "\ exec \$progdir\\\\\$program \${1+\"\$@\"} " ;; *) $echo >> $output "\ # Export the path to the program. PATH=\"\$progdir:\$PATH\" export PATH exec \$program \${1+\"\$@\"} " ;; esac $echo >> $output "\ \$echo \"\$0: cannot exec \$program \${1+\"\$@\"}\" exit 1 fi else # The program doesn't exist. \$echo \"\$0: error: \$progdir/\$program does not exist\" 1>&2 \$echo \"This script is just a wrapper for \$program.\" 1>&2 echo \"See the $PACKAGE documentation for more information.\" 1>&2 exit 1 fi fi\ " chmod +x $output fi exit 0 ;; esac # See if we need to build an old-fashioned archive. for oldlib in $oldlibs; do if test "$build_libtool_libs" = convenience; then oldobjs="$libobjs_save" addlibs="$convenience" build_libtool_libs=no else if test "$build_libtool_libs" = module; then oldobjs="$libobjs_save" build_libtool_libs=no else oldobjs="$objs$old_deplibs "`$echo "X$libobjs_save" | $SP2NL | $Xsed -e '/\.'${libext}'$/d' -e '/\.lib$/d' -e "$lo2o" | $NL2SP` fi addlibs="$old_convenience" fi if test -n "$addlibs"; then gentop="$output_objdir/${outputname}x" $show "${rm}r $gentop" $run ${rm}r "$gentop" $show "mkdir $gentop" $run mkdir "$gentop" status=$? if test $status -ne 0 && test ! -d "$gentop"; then exit $status fi generated="$generated $gentop" # Add in members from convenience archives. for xlib in $addlibs; do # Extract the objects. case $xlib in [\\/]* | [A-Za-z]:[\\/]*) xabs="$xlib" ;; *) xabs=`pwd`"/$xlib" ;; esac xlib=`$echo "X$xlib" | $Xsed -e 's%^.*/%%'` xdir="$gentop/$xlib" $show "${rm}r $xdir" $run ${rm}r "$xdir" $show "mkdir $xdir" $run mkdir "$xdir" status=$? if test $status -ne 0 && test ! -d "$xdir"; then exit $status fi $show "(cd $xdir && $AR x $xabs)" $run eval "(cd \$xdir && $AR x \$xabs)" || exit $? oldobjs="$oldobjs "`find $xdir -name \*.${objext} -print -o -name \*.lo -print | $NL2SP` done fi # Do each command in the archive commands. if test -n "$old_archive_from_new_cmds" && test "$build_libtool_libs" = yes; then eval cmds=\"$old_archive_from_new_cmds\" else # Ensure that we have .o objects in place in case we decided # not to build a shared library, and have fallen back to building # static libs even though --disable-static was passed! for oldobj in $oldobjs; do if test ! -f $oldobj; then xdir=`$echo "X$oldobj" | $Xsed -e 's%/[^/]*$%%'` if test "X$xdir" = "X$oldobj"; then xdir="." else xdir="$xdir" fi baseobj=`$echo "X$oldobj" | $Xsed -e 's%^.*/%%'` obj=`$echo "X$baseobj" | $Xsed -e "$o2lo"` $show "(cd $xdir && ${LN_S} $obj $baseobj)" $run eval '(cd $xdir && ${LN_S} $obj $baseobj)' || exit $? fi done eval cmds=\"$old_archive_cmds\" fi save_ifs="$IFS"; IFS='~' for cmd in $cmds; do IFS="$save_ifs" $show "$cmd" $run eval "$cmd" || exit $? done IFS="$save_ifs" done if test -n "$generated"; then $show "${rm}r$generated" $run ${rm}r$generated fi # Now create the libtool archive. case $output in *.la) old_library= test "$build_old_libs" = yes && old_library="$libname.$libext" $show "creating $output" # Preserve any variables that may affect compiler behavior for var in $variables_saved_for_relink; do if eval test -z \"\${$var+set}\"; then relink_command="{ test -z \"\${$var+set}\" || unset $var || { $var=; export $var; }; }; $relink_command" elif eval var_value=\$$var; test -z "$var_value"; then relink_command="$var=; export $var; $relink_command" else var_value=`$echo "X$var_value" | $Xsed -e "$sed_quote_subst"` relink_command="$var=\"$var_value\"; export $var; $relink_command" fi done # Quote the link command for shipping. relink_command="cd `pwd`; $SHELL $0 --mode=relink $libtool_args" relink_command=`$echo "X$relink_command" | $Xsed -e "$sed_quote_subst"` # Only create the output if not a dry run. if test -z "$run"; then for installed in no yes; do if test "$installed" = yes; then if test -z "$install_libdir"; then break fi output="$output_objdir/$outputname"i # Replace all uninstalled libtool libraries with the installed ones newdependency_libs= for deplib in $dependency_libs; do case $deplib in *.la) name=`$echo "X$deplib" | $Xsed -e 's%^.*/%%'` eval libdir=`sed -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` if test -z "$libdir"; then $echo "$modename: \`$deplib' is not a valid libtool archive" 1>&2 exit 1 fi newdependency_libs="$newdependency_libs $libdir/$name" ;; *) newdependency_libs="$newdependency_libs $deplib" ;; esac done dependency_libs="$newdependency_libs" newdlfiles= for lib in $dlfiles; do name=`$echo "X$lib" | $Xsed -e 's%^.*/%%'` eval libdir=`sed -n -e 's/^libdir=\(.*\)$/\1/p' $lib` if test -z "$libdir"; then $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2 exit 1 fi newdlfiles="$newdlfiles $libdir/$name" done dlfiles="$newdlfiles" newdlprefiles= for lib in $dlprefiles; do name=`$echo "X$lib" | $Xsed -e 's%^.*/%%'` eval libdir=`sed -n -e 's/^libdir=\(.*\)$/\1/p' $lib` if test -z "$libdir"; then $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2 exit 1 fi newdlprefiles="$newdlprefiles $libdir/$name" done dlprefiles="$newdlprefiles" fi $rm $output # place dlname in correct position for cygwin tdlname=$dlname case $host,$output,$installed,$module,$dlname in *cygwin*,*lai,yes,no,*.dll) tdlname=../bin/$dlname ;; esac $echo > $output "\ # $outputname - a libtool library file # Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP # # Please DO NOT delete this file! # It is necessary for linking the library. # The name that we can dlopen(3). dlname='$tdlname' # Names of this library. library_names='$library_names' # The name of the static archive. old_library='$old_library' # Libraries that this one depends upon. dependency_libs='$dependency_libs' # Version information for $libname. current=$current age=$age revision=$revision # Is this an already installed library? installed=$installed # Files to dlopen/dlpreopen dlopen='$dlfiles' dlpreopen='$dlprefiles' # Directory that this library needs to be installed in: libdir='$install_libdir'" if test "$installed" = no && test $need_relink = yes; then $echo >> $output "\ relink_command=\"$relink_command\"" fi done fi # Do a symbolic link so that the libtool archive can be found in # LD_LIBRARY_PATH before the program is installed. $show "(cd $output_objdir && $rm $outputname && $LN_S ../$outputname $outputname)" $run eval '(cd $output_objdir && $rm $outputname && $LN_S ../$outputname $outputname)' || exit $? ;; esac exit 0 ;; # libtool install mode install) modename="$modename: install" # There may be an optional sh(1) argument at the beginning of # install_prog (especially on Windows NT). if test "$nonopt" = "$SHELL" || test "$nonopt" = /bin/sh || # Allow the use of GNU shtool's install command. $echo "X$nonopt" | $Xsed | grep shtool > /dev/null; then # Aesthetically quote it. arg=`$echo "X$nonopt" | $Xsed -e "$sed_quote_subst"` case $arg in *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*) arg="\"$arg\"" ;; esac install_prog="$arg " arg="$1" shift else install_prog= arg="$nonopt" fi # The real first argument should be the name of the installation program. # Aesthetically quote it. arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"` case $arg in *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*) arg="\"$arg\"" ;; esac install_prog="$install_prog$arg" # We need to accept at least all the BSD install flags. dest= files= opts= prev= install_type= isdir=no stripme= for arg do if test -n "$dest"; then files="$files $dest" dest="$arg" continue fi case $arg in -d) isdir=yes ;; -f) prev="-f" ;; -g) prev="-g" ;; -m) prev="-m" ;; -o) prev="-o" ;; -s) stripme=" -s" continue ;; -*) ;; *) # If the previous option needed an argument, then skip it. if test -n "$prev"; then prev= else dest="$arg" continue fi ;; esac # Aesthetically quote the argument. arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"` case $arg in *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*) arg="\"$arg\"" ;; esac install_prog="$install_prog $arg" done if test -z "$install_prog"; then $echo "$modename: you must specify an install program" 1>&2 $echo "$help" 1>&2 exit 1 fi if test -n "$prev"; then $echo "$modename: the \`$prev' option requires an argument" 1>&2 $echo "$help" 1>&2 exit 1 fi if test -z "$files"; then if test -z "$dest"; then $echo "$modename: no file or destination specified" 1>&2 else $echo "$modename: you must specify a destination" 1>&2 fi $echo "$help" 1>&2 exit 1 fi # Strip any trailing slash from the destination. dest=`$echo "X$dest" | $Xsed -e 's%/$%%'` # Check to see that the destination is a directory. test -d "$dest" && isdir=yes if test "$isdir" = yes; then destdir="$dest" destname= else destdir=`$echo "X$dest" | $Xsed -e 's%/[^/]*$%%'` test "X$destdir" = "X$dest" && destdir=. destname=`$echo "X$dest" | $Xsed -e 's%^.*/%%'` # Not a directory, so check to see that there is only one file specified. set dummy $files if test $# -gt 2; then $echo "$modename: \`$dest' is not a directory" 1>&2 $echo "$help" 1>&2 exit 1 fi fi case $destdir in [\\/]* | [A-Za-z]:[\\/]*) ;; *) for file in $files; do case $file in *.lo) ;; *) $echo "$modename: \`$destdir' must be an absolute directory name" 1>&2 $echo "$help" 1>&2 exit 1 ;; esac done ;; esac # This variable tells wrapper scripts just to set variables rather # than running their programs. libtool_install_magic="$magic" staticlibs= future_libdirs= current_libdirs= for file in $files; do # Do each installation. case $file in *.$libext) # Do the static libraries later. staticlibs="$staticlibs $file" ;; *.la) # Check to see that this really is a libtool archive. if (sed -e '2q' $file | egrep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then : else $echo "$modename: \`$file' is not a valid libtool archive" 1>&2 $echo "$help" 1>&2 exit 1 fi library_names= old_library= relink_command= # If there is no directory component, then add one. case $file in */* | *\\*) . $file ;; *) . ./$file ;; esac # Add the libdir to current_libdirs if it is the destination. if test "X$destdir" = "X$libdir"; then case "$current_libdirs " in *" $libdir "*) ;; *) current_libdirs="$current_libdirs $libdir" ;; esac else # Note the libdir as a future libdir. case "$future_libdirs " in *" $libdir "*) ;; *) future_libdirs="$future_libdirs $libdir" ;; esac fi dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'`/ test "X$dir" = "X$file/" && dir= dir="$dir$objdir" if test -n "$relink_command"; then $echo "$modename: warning: relinking \`$file'" 1>&2 $show "$relink_command" if $run eval "$relink_command"; then : else $echo "$modename: error: relink \`$file' with the above command before installing it" 1>&2 continue fi fi # See the names of the shared library. set dummy $library_names if test -n "$2"; then realname="$2" shift shift srcname="$realname" test -n "$relink_command" && srcname="$realname"T # Install the shared library and build the symlinks. $show "$install_prog $dir/$srcname $destdir/$realname" $run eval "$install_prog $dir/$srcname $destdir/$realname" || exit $? if test -n "$stripme" && test -n "$striplib"; then $show "$striplib $destdir/$realname" $run eval "$striplib $destdir/$realname" || exit $? fi if test $# -gt 0; then # Delete the old symlinks, and create new ones. for linkname do if test "$linkname" != "$realname"; then $show "(cd $destdir && $rm $linkname && $LN_S $realname $linkname)" $run eval "(cd $destdir && $rm $linkname && $LN_S $realname $linkname)" fi done fi # Do each command in the postinstall commands. lib="$destdir/$realname" eval cmds=\"$postinstall_cmds\" save_ifs="$IFS"; IFS='~' for cmd in $cmds; do IFS="$save_ifs" $show "$cmd" $run eval "$cmd" || exit $? done IFS="$save_ifs" fi # Install the pseudo-library for information purposes. name=`$echo "X$file" | $Xsed -e 's%^.*/%%'` instname="$dir/$name"i $show "$install_prog $instname $destdir/$name" $run eval "$install_prog $instname $destdir/$name" || exit $? # Maybe install the static library, too. test -n "$old_library" && staticlibs="$staticlibs $dir/$old_library" ;; *.lo) # Install (i.e. copy) a libtool object. # Figure out destination file name, if it wasn't already specified. if test -n "$destname"; then destfile="$destdir/$destname" else destfile=`$echo "X$file" | $Xsed -e 's%^.*/%%'` destfile="$destdir/$destfile" fi # Deduce the name of the destination old-style object file. case $destfile in *.lo) staticdest=`$echo "X$destfile" | $Xsed -e "$lo2o"` ;; *.$objext) staticdest="$destfile" destfile= ;; *) $echo "$modename: cannot copy a libtool object to \`$destfile'" 1>&2 $echo "$help" 1>&2 exit 1 ;; esac # Install the libtool object if requested. if test -n "$destfile"; then $show "$install_prog $file $destfile" $run eval "$install_prog $file $destfile" || exit $? fi # Install the old object if enabled. if test "$build_old_libs" = yes; then # Deduce the name of the old-style object file. staticobj=`$echo "X$file" | $Xsed -e "$lo2o"` $show "$install_prog $staticobj $staticdest" $run eval "$install_prog \$staticobj \$staticdest" || exit $? fi exit 0 ;; *) # Figure out destination file name, if it wasn't already specified. if test -n "$destname"; then destfile="$destdir/$destname" else destfile=`$echo "X$file" | $Xsed -e 's%^.*/%%'` destfile="$destdir/$destfile" fi # Do a test to see if this is really a libtool program. if (sed -e '4q' $file | egrep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then notinst_deplibs= relink_command= # If there is no directory component, then add one. case $file in */* | *\\*) . $file ;; *) . ./$file ;; esac # Check the variables that should have been set. if test -z "$notinst_deplibs"; then $echo "$modename: invalid libtool wrapper script \`$file'" 1>&2 exit 1 fi finalize=yes for lib in $notinst_deplibs; do # Check to see that each library is installed. libdir= if test -f "$lib"; then # If there is no directory component, then add one. case $lib in */* | *\\*) . $lib ;; *) . ./$lib ;; esac fi libfile="$libdir/"`$echo "X$lib" | $Xsed -e 's%^.*/%%g'` ### testsuite: skip nested quoting test if test -n "$libdir" && test ! -f "$libfile"; then $echo "$modename: warning: \`$lib' has not been installed in \`$libdir'" 1>&2 finalize=no fi done relink_command= # If there is no directory component, then add one. case $file in */* | *\\*) . $file ;; *) . ./$file ;; esac outputname= if test "$fast_install" = no && test -n "$relink_command"; then if test "$finalize" = yes && test -z "$run"; then tmpdir="/tmp" test -n "$TMPDIR" && tmpdir="$TMPDIR" tmpdir="$tmpdir/libtool-$$" if $mkdir -p "$tmpdir" && chmod 700 "$tmpdir"; then : else $echo "$modename: error: cannot create temporary directory \`$tmpdir'" 1>&2 continue fi file=`$echo "X$file" | $Xsed -e 's%^.*/%%'` outputname="$tmpdir/$file" # Replace the output file specification. relink_command=`$echo "X$relink_command" | $Xsed -e 's%@OUTPUT@%'"$outputname"'%g'` $show "$relink_command" if $run eval "$relink_command"; then : else $echo "$modename: error: relink \`$file' with the above command before installing it" 1>&2 ${rm}r "$tmpdir" continue fi file="$outputname" else $echo "$modename: warning: cannot relink \`$file'" 1>&2 fi else # Install the binary that we compiled earlier. file=`$echo "X$file" | $Xsed -e "s%\([^/]*\)$%$objdir/\1%"` fi fi # remove .exe since cygwin /usr/bin/install will append another # one anyways case $install_prog,$host in /usr/bin/install*,*cygwin*) case $file:$destfile in *.exe:*.exe) # this is ok ;; *.exe:*) destfile=$destfile.exe ;; *:*.exe) destfile=`echo $destfile | sed -e 's,.exe$,,'` ;; esac ;; esac $show "$install_prog$stripme $file $destfile" $run eval "$install_prog\$stripme \$file \$destfile" || exit $? test -n "$outputname" && ${rm}r "$tmpdir" ;; esac done for file in $staticlibs; do name=`$echo "X$file" | $Xsed -e 's%^.*/%%'` # Set up the ranlib parameters. oldlib="$destdir/$name" $show "$install_prog $file $oldlib" $run eval "$install_prog \$file \$oldlib" || exit $? if test -n "$stripme" && test -n "$striplib"; then $show "$old_striplib $oldlib" $run eval "$old_striplib $oldlib" || exit $? fi # Do each command in the postinstall commands. eval cmds=\"$old_postinstall_cmds\" save_ifs="$IFS"; IFS='~' for cmd in $cmds; do IFS="$save_ifs" $show "$cmd" $run eval "$cmd" || exit $? done IFS="$save_ifs" done if test -n "$future_libdirs"; then $echo "$modename: warning: remember to run \`$progname --finish$future_libdirs'" 1>&2 fi if test -n "$current_libdirs"; then # Maybe just do a dry run. test -n "$run" && current_libdirs=" -n$current_libdirs" exec_cmd='$SHELL $0 --finish$current_libdirs' else exit 0 fi ;; # libtool finish mode finish) modename="$modename: finish" libdirs="$nonopt" admincmds= if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then for dir do libdirs="$libdirs $dir" done for libdir in $libdirs; do if test -n "$finish_cmds"; then # Do each command in the finish commands. eval cmds=\"$finish_cmds\" save_ifs="$IFS"; IFS='~' for cmd in $cmds; do IFS="$save_ifs" $show "$cmd" $run eval "$cmd" || admincmds="$admincmds $cmd" done IFS="$save_ifs" fi if test -n "$finish_eval"; then # Do the single finish_eval. eval cmds=\"$finish_eval\" $run eval "$cmds" || admincmds="$admincmds $cmds" fi done fi # Exit here if they wanted silent mode. test "$show" = ":" && exit 0 echo "----------------------------------------------------------------------" echo "Libraries have been installed in:" for libdir in $libdirs; do echo " $libdir" done echo echo "If you ever happen to want to link against installed libraries" echo "in a given directory, LIBDIR, you must either use libtool, and" echo "specify the full pathname of the library, or use the \`-LLIBDIR'" echo "flag during linking and do at least one of the following:" if test -n "$shlibpath_var"; then echo " - add LIBDIR to the \`$shlibpath_var' environment variable" echo " during execution" fi if test -n "$runpath_var"; then echo " - add LIBDIR to the \`$runpath_var' environment variable" echo " during linking" fi if test -n "$hardcode_libdir_flag_spec"; then libdir=LIBDIR eval flag=\"$hardcode_libdir_flag_spec\" echo " - use the \`$flag' linker flag" fi if test -n "$admincmds"; then echo " - have your system administrator run these commands:$admincmds" fi if test -f /etc/ld.so.conf; then echo " - have your system administrator add LIBDIR to \`/etc/ld.so.conf'" fi echo echo "See any operating system documentation about shared libraries for" echo "more information, such as the ld(1) and ld.so(8) manual pages." echo "----------------------------------------------------------------------" exit 0 ;; # libtool execute mode execute) modename="$modename: execute" # The first argument is the command name. cmd="$nonopt" if test -z "$cmd"; then $echo "$modename: you must specify a COMMAND" 1>&2 $echo "$help" exit 1 fi # Handle -dlopen flags immediately. for file in $execute_dlfiles; do if test ! -f "$file"; then $echo "$modename: \`$file' is not a file" 1>&2 $echo "$help" 1>&2 exit 1 fi dir= case $file in *.la) # Check to see that this really is a libtool archive. if (sed -e '2q' $file | egrep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then : else $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2 $echo "$help" 1>&2 exit 1 fi # Read the libtool library. dlname= library_names= # If there is no directory component, then add one. case $file in */* | *\\*) . $file ;; *) . ./$file ;; esac # Skip this library if it cannot be dlopened. if test -z "$dlname"; then # Warn if it was a shared library. test -n "$library_names" && $echo "$modename: warning: \`$file' was not linked with \`-export-dynamic'" continue fi dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'` test "X$dir" = "X$file" && dir=. if test -f "$dir/$objdir/$dlname"; then dir="$dir/$objdir" else $echo "$modename: cannot find \`$dlname' in \`$dir' or \`$dir/$objdir'" 1>&2 exit 1 fi ;; *.lo) # Just add the directory containing the .lo file. dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'` test "X$dir" = "X$file" && dir=. ;; *) $echo "$modename: warning \`-dlopen' is ignored for non-libtool libraries and objects" 1>&2 continue ;; esac # Get the absolute pathname. absdir=`cd "$dir" && pwd` test -n "$absdir" && dir="$absdir" # Now add the directory to shlibpath_var. if eval "test -z \"\$$shlibpath_var\""; then eval "$shlibpath_var=\"\$dir\"" else eval "$shlibpath_var=\"\$dir:\$$shlibpath_var\"" fi done # This variable tells wrapper scripts just to set shlibpath_var # rather than running their programs. libtool_execute_magic="$magic" # Check if any of the arguments is a wrapper script. args= for file do case $file in -*) ;; *) # Do a test to see if this is really a libtool program. if (sed -e '4q' $file | egrep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then # If there is no directory component, then add one. case $file in */* | *\\*) . $file ;; *) . ./$file ;; esac # Transform arg to wrapped name. file="$progdir/$program" fi ;; esac # Quote arguments (to preserve shell metacharacters). file=`$echo "X$file" | $Xsed -e "$sed_quote_subst"` args="$args \"$file\"" done if test -z "$run"; then if test -n "$shlibpath_var"; then # Export the shlibpath_var. eval "export $shlibpath_var" fi # Restore saved enviroment variables if test "${save_LC_ALL+set}" = set; then LC_ALL="$save_LC_ALL"; export LC_ALL fi if test "${save_LANG+set}" = set; then LANG="$save_LANG"; export LANG fi # Now prepare to actually exec the command. exec_cmd='"$cmd"$args' else # Display what would be done. if test -n "$shlibpath_var"; then eval "\$echo \"\$shlibpath_var=\$$shlibpath_var\"" $echo "export $shlibpath_var" fi $echo "$cmd$args" exit 0 fi ;; # libtool clean and uninstall mode clean | uninstall) modename="$modename: $mode" rm="$nonopt" files= rmforce= exit_status=0 # This variable tells wrapper scripts just to set variables rather # than running their programs. libtool_install_magic="$magic" for arg do case $arg in -f) rm="$rm $arg"; rmforce=yes ;; -*) rm="$rm $arg" ;; *) files="$files $arg" ;; esac done if test -z "$rm"; then $echo "$modename: you must specify an RM program" 1>&2 $echo "$help" 1>&2 exit 1 fi rmdirs= for file in $files; do dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'` if test "X$dir" = "X$file"; then dir=. objdir="$objdir" else objdir="$dir/$objdir" fi name=`$echo "X$file" | $Xsed -e 's%^.*/%%'` test $mode = uninstall && objdir="$dir" # Remember objdir for removal later, being careful to avoid duplicates if test $mode = clean; then case " $rmdirs " in *" $objdir "*) ;; *) rmdirs="$rmdirs $objdir" ;; esac fi # Don't error if the file doesn't exist and rm -f was used. if (test -L "$file") >/dev/null 2>&1 \ || (test -h "$file") >/dev/null 2>&1 \ || test -f "$file"; then : elif test -d "$file"; then exit_status=1 continue elif test "$rmforce" = yes; then continue fi rmfiles="$file" case $name in *.la) # Possibly a libtool archive, so verify it. if (sed -e '2q' $file | egrep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then . $dir/$name # Delete the libtool libraries and symlinks. for n in $library_names; do rmfiles="$rmfiles $objdir/$n" done test -n "$old_library" && rmfiles="$rmfiles $objdir/$old_library" test $mode = clean && rmfiles="$rmfiles $objdir/$name $objdir/${name}i" if test $mode = uninstall; then if test -n "$library_names"; then # Do each command in the postuninstall commands. eval cmds=\"$postuninstall_cmds\" save_ifs="$IFS"; IFS='~' for cmd in $cmds; do IFS="$save_ifs" $show "$cmd" $run eval "$cmd" if test $? != 0 && test "$rmforce" != yes; then exit_status=1 fi done IFS="$save_ifs" fi if test -n "$old_library"; then # Do each command in the old_postuninstall commands. eval cmds=\"$old_postuninstall_cmds\" save_ifs="$IFS"; IFS='~' for cmd in $cmds; do IFS="$save_ifs" $show "$cmd" $run eval "$cmd" if test $? != 0 && test "$rmforce" != yes; then exit_status=1 fi done IFS="$save_ifs" fi # FIXME: should reinstall the best remaining shared library. fi fi ;; *.lo) if test "$build_old_libs" = yes; then oldobj=`$echo "X$name" | $Xsed -e "$lo2o"` rmfiles="$rmfiles $dir/$oldobj" fi ;; *) # Do a test to see if this is a libtool program. if test $mode = clean && (sed -e '4q' $file | egrep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then relink_command= . $dir/$file rmfiles="$rmfiles $objdir/$name $objdir/${name}S.${objext}" if test "$fast_install" = yes && test -n "$relink_command"; then rmfiles="$rmfiles $objdir/lt-$name" fi fi ;; esac $show "$rm $rmfiles" $run $rm $rmfiles || exit_status=1 done # Try to remove the ${objdir}s in the directories where we deleted files for dir in $rmdirs; do if test -d "$dir"; then $show "rmdir $dir" $run rmdir $dir >/dev/null 2>&1 fi done exit $exit_status ;; "") $echo "$modename: you must specify a MODE" 1>&2 $echo "$generic_help" 1>&2 exit 1 ;; esac if test -z "$exec_cmd"; then $echo "$modename: invalid operation mode \`$mode'" 1>&2 $echo "$generic_help" 1>&2 exit 1 fi fi # test -z "$show_help" if test -n "$exec_cmd"; then eval exec $exec_cmd exit 1 fi # We need to display help for each of the modes. case $mode in "") $echo \ "Usage: $modename [OPTION]... [MODE-ARG]... Provide generalized library-building support services. --config show all configuration variables --debug enable verbose shell tracing -n, --dry-run display commands without modifying any files --features display basic configuration information and exit --finish same as \`--mode=finish' --help display this help message and exit --mode=MODE use operation mode MODE [default=inferred from MODE-ARGS] --quiet same as \`--silent' --silent don't print informational messages --version print version information MODE must be one of the following: clean remove files from the build directory compile compile a source file into a libtool object execute automatically set library path, then run a program finish complete the installation of libtool libraries install install libraries or executables link create a library or an executable uninstall remove libraries from an installed directory MODE-ARGS vary depending on the MODE. Try \`$modename --help --mode=MODE' for a more detailed description of MODE." exit 0 ;; clean) $echo \ "Usage: $modename [OPTION]... --mode=clean RM [RM-OPTION]... FILE... Remove files from the build directory. RM is the name of the program to use to delete files associated with each FILE (typically \`/bin/rm'). RM-OPTIONS are options (such as \`-f') to be passed to RM. If FILE is a libtool library, object or program, all the files associated with it are deleted. Otherwise, only FILE itself is deleted using RM." ;; compile) $echo \ "Usage: $modename [OPTION]... --mode=compile COMPILE-COMMAND... SOURCEFILE Compile a source file into a libtool library object. This mode accepts the following additional options: -o OUTPUT-FILE set the output file name to OUTPUT-FILE -prefer-pic try to building PIC objects only -prefer-non-pic try to building non-PIC objects only -static always build a \`.o' file suitable for static linking COMPILE-COMMAND is a command to be used in creating a \`standard' object file from the given SOURCEFILE. The output file name is determined by removing the directory component from SOURCEFILE, then substituting the C source code suffix \`.c' with the library object suffix, \`.lo'." ;; execute) $echo \ "Usage: $modename [OPTION]... --mode=execute COMMAND [ARGS]... Automatically set library path, then run a program. This mode accepts the following additional options: -dlopen FILE add the directory containing FILE to the library path This mode sets the library path environment variable according to \`-dlopen' flags. If any of the ARGS are libtool executable wrappers, then they are translated into their corresponding uninstalled binary, and any of their required library directories are added to the library path. Then, COMMAND is executed, with ARGS as arguments." ;; finish) $echo \ "Usage: $modename [OPTION]... --mode=finish [LIBDIR]... Complete the installation of libtool libraries. Each LIBDIR is a directory that contains libtool libraries. The commands that this mode executes may require superuser privileges. Use the \`--dry-run' option if you just want to see what would be executed." ;; install) $echo \ "Usage: $modename [OPTION]... --mode=install INSTALL-COMMAND... Install executables or libraries. INSTALL-COMMAND is the installation command. The first component should be either the \`install' or \`cp' program. The rest of the components are interpreted as arguments to that command (only BSD-compatible install options are recognized)." ;; link) $echo \ "Usage: $modename [OPTION]... --mode=link LINK-COMMAND... Link object files or libraries together to form another library, or to create an executable program. LINK-COMMAND is a command using the C compiler that you would use to create a program from several object files. The following components of LINK-COMMAND are treated specially: -all-static do not do any dynamic linking at all -avoid-version do not add a version suffix if possible -dlopen FILE \`-dlpreopen' FILE if it cannot be dlopened at runtime -dlpreopen FILE link in FILE and add its symbols to lt_preloaded_symbols -export-dynamic allow symbols from OUTPUT-FILE to be resolved with dlsym(3) -export-symbols SYMFILE try to export only the symbols listed in SYMFILE -export-symbols-regex REGEX try to export only the symbols matching REGEX -LLIBDIR search LIBDIR for required installed libraries -lNAME OUTPUT-FILE requires the installed library libNAME -module build a library that can dlopened -no-fast-install disable the fast-install mode -no-install link a not-installable executable -no-undefined declare that a library does not refer to external symbols -o OUTPUT-FILE create OUTPUT-FILE from the specified objects -release RELEASE specify package release information -rpath LIBDIR the created library will eventually be installed in LIBDIR -R[ ]LIBDIR add LIBDIR to the runtime path of programs and libraries -static do not do any dynamic linking of libtool libraries -version-info CURRENT[:REVISION[:AGE]] specify library version info [each variable defaults to 0] All other options (arguments beginning with \`-') are ignored. Every other argument is treated as a filename. Files ending in \`.la' are treated as uninstalled libtool libraries, other files are standard or library object files. If the OUTPUT-FILE ends in \`.la', then a libtool library is created, only library objects (\`.lo' files) may be specified, and \`-rpath' is required, except when creating a convenience library. If OUTPUT-FILE ends in \`.a' or \`.lib', then a standard library is created using \`ar' and \`ranlib', or on Windows using \`lib'. If OUTPUT-FILE ends in \`.lo' or \`.${objext}', then a reloadable object file is created, otherwise an executable program is created." ;; uninstall) $echo \ "Usage: $modename [OPTION]... --mode=uninstall RM [RM-OPTION]... FILE... Remove libraries from an installation directory. RM is the name of the program to use to delete files associated with each FILE (typically \`/bin/rm'). RM-OPTIONS are options (such as \`-f') to be passed to RM. If FILE is a libtool library, all the files associated with it are deleted. Otherwise, only FILE itself is deleted using RM." ;; *) $echo "$modename: invalid operation mode \`$mode'" 1>&2 $echo "$help" 1>&2 exit 1 ;; esac echo $echo "Try \`$modename --help' for more information about other modes." exit 0 # Local Variables: # mode:shell-script # sh-indentation:2 # End: mail-1.1.2/config/missing0000775000076500007650000002405410614714012014662 0ustar dogdog00000000000000#! /bin/sh # Common stub for a few missing GNU programs while installing. # Copyright 1996, 1997, 1999, 2000 Free Software Foundation, Inc. # Originally by Fran,cois Pinard , 1996. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # This program 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 General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA # 02110-1301, USA. # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. if test $# -eq 0; then echo 1>&2 "Try \`$0 --help' for more information" exit 1 fi run=: # In the cases where this matters, `missing' is being run in the # srcdir already. if test -f configure.ac; then configure_ac=configure.ac else configure_ac=configure.in fi case "$1" in --run) # Try to run requested program, and just exit if it succeeds. run= shift "$@" && exit 0 ;; esac # If it does not exist, or fails to run (possibly an outdated version), # try to emulate it. case "$1" in -h|--h|--he|--hel|--help) echo "\ $0 [OPTION]... PROGRAM [ARGUMENT]... Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an error status if there is no known handling for PROGRAM. Options: -h, --help display this help and exit -v, --version output version information and exit --run try to run the given command, and emulate it if it fails Supported PROGRAM values: aclocal touch file \`aclocal.m4' autoconf touch file \`configure' autoheader touch file \`config.h.in' automake touch all \`Makefile.in' files bison create \`y.tab.[ch]', if possible, from existing .[ch] flex create \`lex.yy.c', if possible, from existing .c help2man touch the output file lex create \`lex.yy.c', if possible, from existing .c makeinfo touch the output file tar try tar, gnutar, gtar, then tar without non-portable flags yacc create \`y.tab.[ch]', if possible, from existing .[ch]" ;; -v|--v|--ve|--ver|--vers|--versi|--versio|--version) echo "missing 0.4 - GNU automake" ;; -*) echo 1>&2 "$0: Unknown \`$1' option" echo 1>&2 "Try \`$0 --help' for more information" exit 1 ;; aclocal*) if test -z "$run" && ($1 --version) > /dev/null 2>&1; then # We have it, but it failed. exit 1 fi echo 1>&2 "\ WARNING: \`$1' is missing on your system. You should only need it if you modified \`acinclude.m4' or \`${configure_ac}'. You might want to install the \`Automake' and \`Perl' packages. Grab them from any GNU archive site." touch aclocal.m4 ;; autoconf) if test -z "$run" && ($1 --version) > /dev/null 2>&1; then # We have it, but it failed. exit 1 fi echo 1>&2 "\ WARNING: \`$1' is missing on your system. You should only need it if you modified \`${configure_ac}'. You might want to install the \`Autoconf' and \`GNU m4' packages. Grab them from any GNU archive site." touch configure ;; autoheader) if test -z "$run" && ($1 --version) > /dev/null 2>&1; then # We have it, but it failed. exit 1 fi echo 1>&2 "\ WARNING: \`$1' is missing on your system. You should only need it if you modified \`acconfig.h' or \`${configure_ac}'. You might want to install the \`Autoconf' and \`GNU m4' packages. Grab them from any GNU archive site." files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' ${configure_ac}` test -z "$files" && files="config.h" touch_files= for f in $files; do case "$f" in *:*) touch_files="$touch_files "`echo "$f" | sed -e 's/^[^:]*://' -e 's/:.*//'`;; *) touch_files="$touch_files $f.in";; esac done touch $touch_files ;; automake*) if test -z "$run" && ($1 --version) > /dev/null 2>&1; then # We have it, but it failed. exit 1 fi echo 1>&2 "\ WARNING: \`$1' is missing on your system. You should only need it if you modified \`Makefile.am', \`acinclude.m4' or \`${configure_ac}'. You might want to install the \`Automake' and \`Perl' packages. Grab them from any GNU archive site." find . -type f -name Makefile.am -print | sed 's/\.am$/.in/' | while read f; do touch "$f"; done ;; autom4te) if test -z "$run" && ($1 --version) > /dev/null 2>&1; then # We have it, but it failed. exit 1 fi echo 1>&2 "\ WARNING: \`$1' is needed, and you do not seem to have it handy on your system. You might have modified some files without having the proper tools for further handling them. You can get \`$1Help2man' as part of \`Autoconf' from any GNU archive site." file=`echo "$*" | sed -n 's/.*--output[ =]*\([^ ]*\).*/\1/p'` test -z "$file" && file=`echo "$*" | sed -n 's/.*-o[ ]*\([^ ]*\).*/\1/p'` if test -f "$file"; then touch $file else test -z "$file" || exec >$file echo "#! /bin/sh" echo "# Created by GNU Automake missing as a replacement of" echo "# $ $@" echo "exit 0" chmod +x $file exit 1 fi ;; bison|yacc) echo 1>&2 "\ WARNING: \`$1' is missing on your system. You should only need it if you modified a \`.y' file. You may need the \`Bison' package in order for those modifications to take effect. You can get \`Bison' from any GNU archive site." rm -f y.tab.c y.tab.h if [ $# -ne 1 ]; then eval LASTARG="\${$#}" case "$LASTARG" in *.y) SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'` if [ -f "$SRCFILE" ]; then cp "$SRCFILE" y.tab.c fi SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'` if [ -f "$SRCFILE" ]; then cp "$SRCFILE" y.tab.h fi ;; esac fi if [ ! -f y.tab.h ]; then echo >y.tab.h fi if [ ! -f y.tab.c ]; then echo 'main() { return 0; }' >y.tab.c fi ;; lex|flex) echo 1>&2 "\ WARNING: \`$1' is missing on your system. You should only need it if you modified a \`.l' file. You may need the \`Flex' package in order for those modifications to take effect. You can get \`Flex' from any GNU archive site." rm -f lex.yy.c if [ $# -ne 1 ]; then eval LASTARG="\${$#}" case "$LASTARG" in *.l) SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'` if [ -f "$SRCFILE" ]; then cp "$SRCFILE" lex.yy.c fi ;; esac fi if [ ! -f lex.yy.c ]; then echo 'main() { return 0; }' >lex.yy.c fi ;; help2man) if test -z "$run" && ($1 --version) > /dev/null 2>&1; then # We have it, but it failed. exit 1 fi echo 1>&2 "\ WARNING: \`$1' is missing on your system. You should only need it if you modified a dependency of a manual page. You may need the \`Help2man' package in order for those modifications to take effect. You can get \`Help2man' from any GNU archive site." file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'` if test -z "$file"; then file=`echo "$*" | sed -n 's/.*--output=\([^ ]*\).*/\1/p'` fi if [ -f "$file" ]; then touch $file else test -z "$file" || exec >$file echo ".ab help2man is required to generate this page" exit 1 fi ;; makeinfo) if test -z "$run" && (makeinfo --version) > /dev/null 2>&1; then # We have makeinfo, but it failed. exit 1 fi echo 1>&2 "\ WARNING: \`$1' is missing on your system. You should only need it if you modified a \`.texi' or \`.texinfo' file, or any other file indirectly affecting the aspect of the manual. The spurious call might also be the consequence of using a buggy \`make' (AIX, DU, IRIX). You might want to install the \`Texinfo' package or the \`GNU make' package. Grab either from any GNU archive site." file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'` if test -z "$file"; then file=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'` file=`sed -n '/^@setfilename/ { s/.* \([^ ]*\) *$/\1/; p; q; }' $file` fi touch $file ;; tar) shift if test -n "$run"; then echo 1>&2 "ERROR: \`tar' requires --run" exit 1 fi # We have already tried tar in the generic part. # Look for gnutar/gtar before invocation to avoid ugly error # messages. if (gnutar --version > /dev/null 2>&1); then gnutar ${1+"$@"} && exit 0 fi if (gtar --version > /dev/null 2>&1); then gtar ${1+"$@"} && exit 0 fi firstarg="$1" if shift; then case "$firstarg" in *o*) firstarg=`echo "$firstarg" | sed s/o//` tar "$firstarg" ${1+"$@"} && exit 0 ;; esac case "$firstarg" in *h*) firstarg=`echo "$firstarg" | sed s/h//` tar "$firstarg" ${1+"$@"} && exit 0 ;; esac fi echo 1>&2 "\ WARNING: I can't seem to be able to run \`tar' with the given arguments. You may want to install GNU tar or Free paxutils, or check the command line arguments." exit 1 ;; *) echo 1>&2 "\ WARNING: \`$1' is needed, and you do not seem to have it handy on your system. You might have modified some files without having the proper tools for further handling them. Check the \`README' file, it often tells you about the needed prerequirements for installing this package. You may also peek at any GNU archive site, in case some other package would contain this missing \`$1' program." exit 1 ;; esac exit 0 mail-1.1.2/config/mkinstalldirs0000775000076500007650000000277010614714012016072 0ustar dogdog00000000000000#! /bin/sh # mkinstalldirs --- make directory hierarchy # Author: Noah Friedman # Created: 1993-05-16 # Public domain # $Id: mkinstalldirs,v 1.1 2003/08/13 20:54:30 nferrier Exp $ errstatus=0 dirmode="" usage="\ Usage: mkinstalldirs [-h] [--help] [-m mode] dir ..." # process command line arguments while test $# -gt 0 ; do case "${1}" in -h | --help | --h* ) # -h for help echo "${usage}" 1>&2; exit 0 ;; -m ) # -m PERM arg shift test $# -eq 0 && { echo "${usage}" 1>&2; exit 1; } dirmode="${1}" shift ;; -- ) shift; break ;; # stop option processing -* ) echo "${usage}" 1>&2; exit 1 ;; # unknown option * ) break ;; # first non-opt arg esac done for file do set fnord `echo ":$file" | sed -ne 's/^:\//#/;s/^://;s/\// /g;s/^#/\//;p'` shift pathcomp= for d do pathcomp="$pathcomp$d" case "$pathcomp" in -* ) pathcomp=./$pathcomp ;; esac if test ! -d "$pathcomp"; then echo "mkdir $pathcomp" mkdir "$pathcomp" || lasterr=$? if test ! -d "$pathcomp"; then errstatus=$lasterr else if test ! -z "$dirmode"; then echo "chmod $dirmode $pathcomp" lasterr="" chmod $dirmode "$pathcomp" || lasterr=$? if test ! -z "$lasterr"; then errstatus=$lasterr fi fi fi fi pathcomp="$pathcomp/" done done exit $errstatus # Local Variables: # mode:shell-script # sh-indentation:3 # End: mail-1.1.2/config/move-if-change0000775000076500007650000000034510614714012015773 0ustar dogdog00000000000000#!/bin/sh # Like mv $1 $2, but if the files are the same, just delete $1. # Status is 0 if $2 is changed, 1 otherwise. if test -r $2 then if cmp -s $1 $2 then echo $2 is unchanged rm -f $1 else mv -f $1 $2 fi else mv -f $1 $2 fi mail-1.1.2/config.guess0000775000076500007650000011313210614714012014332 0ustar dogdog00000000000000#! /bin/sh # Attempt to guess a canonical system name. # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001 # Free Software Foundation, Inc. timestamp='2001-08-23' # This file is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program 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 # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # Written by Per Bothner . # Please send patches to . # # This script attempts to guess a canonical system name similar to # config.sub. If it succeeds, it prints the system name on stdout, and # exits with 0. Otherwise, it exits with 1. # # The plan is that this can be called by configure scripts if you # don't specify an explicit build system type. me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] Output the configuration name of the system \`$me' is run on. Operation modes: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.guess ($timestamp) Originally written by Per Bothner. Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit 0 ;; --version | -v ) echo "$version" ; exit 0 ;; --help | --h* | -h ) echo "$usage"; exit 0 ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" >&2 exit 1 ;; * ) break ;; esac done if test $# != 0; then echo "$me: too many arguments$help" >&2 exit 1 fi dummy=dummy-$$ trap 'rm -f $dummy.c $dummy.o $dummy.rel $dummy; exit 1' 1 2 15 # CC_FOR_BUILD -- compiler used by this script. # Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still # use `HOST_CC' if defined, but it is deprecated. set_cc_for_build='case $CC_FOR_BUILD,$HOST_CC,$CC in ,,) echo "int dummy(){}" > $dummy.c ; for c in cc gcc c89 ; do ($c $dummy.c -c -o $dummy.o) >/dev/null 2>&1 ; if test $? = 0 ; then CC_FOR_BUILD="$c"; break ; fi ; done ; rm -f $dummy.c $dummy.o $dummy.rel ; if test x"$CC_FOR_BUILD" = x ; then CC_FOR_BUILD=no_compiler_found ; fi ;; ,,*) CC_FOR_BUILD=$CC ;; ,*,*) CC_FOR_BUILD=$HOST_CC ;; esac' # This is needed to find uname on a Pyramid OSx when run in the BSD universe. # (ghazi@noc.rutgers.edu 1994-08-24) if (test -f /.attbin/uname) >/dev/null 2>&1 ; then PATH=$PATH:/.attbin ; export PATH fi UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown # Note: order is significant - the case branches are not exclusive. case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in *:NetBSD:*:*) # Netbsd (nbsd) targets should (where applicable) match one or # more of the tupples: *-*-netbsdelf*, *-*-netbsdaout*, # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently # switched to ELF, *-*-netbsd* would select the old # object file format. This provides both forward # compatibility and a consistent mechanism for selecting the # object file format. # Determine the machine/vendor (is the vendor relevant). case "${UNAME_MACHINE}" in amiga) machine=m68k-unknown ;; arm32) machine=arm-unknown ;; atari*) machine=m68k-atari ;; sun3*) machine=m68k-sun ;; mac68k) machine=m68k-apple ;; macppc) machine=powerpc-apple ;; hp3[0-9][05]) machine=m68k-hp ;; ibmrt|romp-ibm) machine=romp-ibm ;; *) machine=${UNAME_MACHINE}-unknown ;; esac # The Operating System including object format, if it has switched # to ELF recently, or will in the future. case "${UNAME_MACHINE}" in i386|sparc|amiga|arm*|hp300|mvme68k|vax|atari|luna68k|mac68k|news68k|next68k|pc532|sun3*|x68k) eval $set_cc_for_build if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep __ELF__ >/dev/null then # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). # Return netbsd for either. FIX? os=netbsd else os=netbsdelf fi ;; *) os=netbsd ;; esac # The OS release release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: # contains redundant information, the shorter form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. echo "${machine}-${os}${release}" exit 0 ;; alpha:OSF1:*:*) if test $UNAME_RELEASE = "V4.0"; then UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` fi # A Vn.n version is a released version. # A Tn.n version is a released field test version. # A Xn.n version is an unreleased experimental baselevel. # 1.2 uses "1.2" for uname -r. cat <$dummy.s .data \$Lformat: .byte 37,100,45,37,120,10,0 # "%d-%x\n" .text .globl main .align 4 .ent main main: .frame \$30,16,\$26,0 ldgp \$29,0(\$27) .prologue 1 .long 0x47e03d80 # implver \$0 lda \$2,-1 .long 0x47e20c21 # amask \$2,\$1 lda \$16,\$Lformat mov \$0,\$17 not \$1,\$18 jsr \$26,printf ldgp \$29,0(\$26) mov 0,\$16 jsr \$26,exit .end main EOF eval $set_cc_for_build $CC_FOR_BUILD $dummy.s -o $dummy 2>/dev/null if test "$?" = 0 ; then case `./$dummy` in 0-0) UNAME_MACHINE="alpha" ;; 1-0) UNAME_MACHINE="alphaev5" ;; 1-1) UNAME_MACHINE="alphaev56" ;; 1-101) UNAME_MACHINE="alphapca56" ;; 2-303) UNAME_MACHINE="alphaev6" ;; 2-307) UNAME_MACHINE="alphaev67" ;; 2-1307) UNAME_MACHINE="alphaev68" ;; esac fi rm -f $dummy.s $dummy echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[VTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` exit 0 ;; Alpha\ *:Windows_NT*:*) # How do we know it's Interix rather than the generic POSIX subsystem? # Should we change UNAME_MACHINE based on the output of uname instead # of the specific Alpha model? echo alpha-pc-interix exit 0 ;; 21064:Windows_NT:50:3) echo alpha-dec-winnt3.5 exit 0 ;; Amiga*:UNIX_System_V:4.0:*) echo m68k-unknown-sysv4 exit 0;; amiga:OpenBSD:*:*) echo m68k-unknown-openbsd${UNAME_RELEASE} exit 0 ;; *:[Aa]miga[Oo][Ss]:*:*) echo ${UNAME_MACHINE}-unknown-amigaos exit 0 ;; arc64:OpenBSD:*:*) echo mips64el-unknown-openbsd${UNAME_RELEASE} exit 0 ;; arc:OpenBSD:*:*) echo mipsel-unknown-openbsd${UNAME_RELEASE} exit 0 ;; hkmips:OpenBSD:*:*) echo mips-unknown-openbsd${UNAME_RELEASE} exit 0 ;; pmax:OpenBSD:*:*) echo mipsel-unknown-openbsd${UNAME_RELEASE} exit 0 ;; sgi:OpenBSD:*:*) echo mips-unknown-openbsd${UNAME_RELEASE} exit 0 ;; wgrisc:OpenBSD:*:*) echo mipsel-unknown-openbsd${UNAME_RELEASE} exit 0 ;; *:OS/390:*:*) echo i370-ibm-openedition exit 0 ;; arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) echo arm-acorn-riscix${UNAME_RELEASE} exit 0;; SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) echo hppa1.1-hitachi-hiuxmpp exit 0;; Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. if test "`(/bin/universe) 2>/dev/null`" = att ; then echo pyramid-pyramid-sysv3 else echo pyramid-pyramid-bsd fi exit 0 ;; NILE*:*:*:dcosx) echo pyramid-pyramid-svr4 exit 0 ;; sun4H:SunOS:5.*:*) echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit 0 ;; sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit 0 ;; i86pc:SunOS:5.*:*) echo i386-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit 0 ;; sun4*:SunOS:6*:*) # According to config.sub, this is the proper way to canonicalize # SunOS6. Hard to guess exactly what SunOS6 will be like, but # it's likely to be more like Solaris than SunOS4. echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit 0 ;; sun4*:SunOS:*:*) case "`/usr/bin/arch -k`" in Series*|S4*) UNAME_RELEASE=`uname -v` ;; esac # Japanese Language versions have a version number like `4.1.3-JL'. echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'` exit 0 ;; sun3*:SunOS:*:*) echo m68k-sun-sunos${UNAME_RELEASE} exit 0 ;; sun*:*:4.2BSD:*) UNAME_RELEASE=`(head -1 /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3 case "`/bin/arch`" in sun3) echo m68k-sun-sunos${UNAME_RELEASE} ;; sun4) echo sparc-sun-sunos${UNAME_RELEASE} ;; esac exit 0 ;; aushp:SunOS:*:*) echo sparc-auspex-sunos${UNAME_RELEASE} exit 0 ;; sparc*:NetBSD:*) echo `uname -p`-unknown-netbsd${UNAME_RELEASE} exit 0 ;; atari*:OpenBSD:*:*) echo m68k-unknown-openbsd${UNAME_RELEASE} exit 0 ;; # The situation for MiNT is a little confusing. The machine name # can be virtually everything (everything which is not # "atarist" or "atariste" at least should have a processor # > m68000). The system name ranges from "MiNT" over "FreeMiNT" # to the lowercase version "mint" (or "freemint"). Finally # the system name "TOS" denotes a system which is actually not # MiNT. But MiNT is downward compatible to TOS, so this should # be no problem. atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit 0 ;; atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit 0 ;; *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit 0 ;; milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) echo m68k-milan-mint${UNAME_RELEASE} exit 0 ;; hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) echo m68k-hades-mint${UNAME_RELEASE} exit 0 ;; *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) echo m68k-unknown-mint${UNAME_RELEASE} exit 0 ;; sun3*:OpenBSD:*:*) echo m68k-unknown-openbsd${UNAME_RELEASE} exit 0 ;; mac68k:OpenBSD:*:*) echo m68k-unknown-openbsd${UNAME_RELEASE} exit 0 ;; mvme68k:OpenBSD:*:*) echo m68k-unknown-openbsd${UNAME_RELEASE} exit 0 ;; mvme88k:OpenBSD:*:*) echo m88k-unknown-openbsd${UNAME_RELEASE} exit 0 ;; powerpc:machten:*:*) echo powerpc-apple-machten${UNAME_RELEASE} exit 0 ;; RISC*:Mach:*:*) echo mips-dec-mach_bsd4.3 exit 0 ;; RISC*:ULTRIX:*:*) echo mips-dec-ultrix${UNAME_RELEASE} exit 0 ;; VAX*:ULTRIX*:*:*) echo vax-dec-ultrix${UNAME_RELEASE} exit 0 ;; 2020:CLIX:*:* | 2430:CLIX:*:*) echo clipper-intergraph-clix${UNAME_RELEASE} exit 0 ;; mips:*:*:UMIPS | mips:*:*:RISCos) sed 's/^ //' << EOF >$dummy.c #ifdef __cplusplus #include /* for printf() prototype */ int main (int argc, char *argv[]) { #else int main (argc, argv) int argc; char *argv[]; { #endif #if defined (host_mips) && defined (MIPSEB) #if defined (SYSTYPE_SYSV) printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_SVR4) printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0); #endif #endif exit (-1); } EOF eval $set_cc_for_build $CC_FOR_BUILD $dummy.c -o $dummy \ && ./$dummy `echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` \ && rm -f $dummy.c $dummy && exit 0 rm -f $dummy.c $dummy echo mips-mips-riscos${UNAME_RELEASE} exit 0 ;; Motorola:PowerMAX_OS:*:*) echo powerpc-motorola-powermax exit 0 ;; Night_Hawk:Power_UNIX:*:*) echo powerpc-harris-powerunix exit 0 ;; m88k:CX/UX:7*:*) echo m88k-harris-cxux7 exit 0 ;; m88k:*:4*:R4*) echo m88k-motorola-sysv4 exit 0 ;; m88k:*:3*:R3*) echo m88k-motorola-sysv3 exit 0 ;; AViiON:dgux:*:*) # DG/UX returns AViiON for all architectures UNAME_PROCESSOR=`/usr/bin/uname -p` if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ] then if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \ [ ${TARGET_BINARY_INTERFACE}x = x ] then echo m88k-dg-dgux${UNAME_RELEASE} else echo m88k-dg-dguxbcs${UNAME_RELEASE} fi else echo i586-dg-dgux${UNAME_RELEASE} fi exit 0 ;; M88*:DolphinOS:*:*) # DolphinOS (SVR3) echo m88k-dolphin-sysv3 exit 0 ;; M88*:*:R3*:*) # Delta 88k system running SVR3 echo m88k-motorola-sysv3 exit 0 ;; XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) echo m88k-tektronix-sysv3 exit 0 ;; Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) echo m68k-tektronix-bsd exit 0 ;; *:IRIX*:*:*) echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` exit 0 ;; ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id exit 0 ;; # Note that: echo "'`uname -s`'" gives 'AIX ' i*86:AIX:*:*) echo i386-ibm-aix exit 0 ;; ia64:AIX:*:*) if [ -x /usr/bin/oslevel ] ; then IBM_REV=`/usr/bin/oslevel` else IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} fi echo ${UNAME_MACHINE}-ibm-aix${IBM_REV} exit 0 ;; *:AIX:2:3) if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then sed 's/^ //' << EOF >$dummy.c #include main() { if (!__power_pc()) exit(1); puts("powerpc-ibm-aix3.2.5"); exit(0); } EOF eval $set_cc_for_build $CC_FOR_BUILD $dummy.c -o $dummy && ./$dummy && rm -f $dummy.c $dummy && exit 0 rm -f $dummy.c $dummy echo rs6000-ibm-aix3.2.5 elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then echo rs6000-ibm-aix3.2.4 else echo rs6000-ibm-aix3.2 fi exit 0 ;; *:AIX:*:[45]) IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | head -1 | awk '{ print $1 }'` if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then IBM_ARCH=rs6000 else IBM_ARCH=powerpc fi if [ -x /usr/bin/oslevel ] ; then IBM_REV=`/usr/bin/oslevel` else IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} fi echo ${IBM_ARCH}-ibm-aix${IBM_REV} exit 0 ;; *:AIX:*:*) echo rs6000-ibm-aix exit 0 ;; ibmrt:4.4BSD:*|romp-ibm:BSD:*) echo romp-ibm-bsd4.4 exit 0 ;; ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to exit 0 ;; # report: romp-ibm BSD 4.3 *:BOSX:*:*) echo rs6000-bull-bosx exit 0 ;; DPX/2?00:B.O.S.:*:*) echo m68k-bull-sysv3 exit 0 ;; 9000/[34]??:4.3bsd:1.*:*) echo m68k-hp-bsd exit 0 ;; hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) echo m68k-hp-bsd4.4 exit 0 ;; 9000/[34678]??:HP-UX:*:*) HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` case "${UNAME_MACHINE}" in 9000/31? ) HP_ARCH=m68000 ;; 9000/[34]?? ) HP_ARCH=m68k ;; 9000/[678][0-9][0-9]) case "${HPUX_REV}" in 11.[0-9][0-9]) if [ -x /usr/bin/getconf ]; then sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` case "${sc_cpu_version}" in 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1 532) # CPU_PA_RISC2_0 case "${sc_kernel_bits}" in 32) HP_ARCH="hppa2.0n" ;; 64) HP_ARCH="hppa2.0w" ;; esac ;; esac fi ;; esac if [ "${HP_ARCH}" = "" ]; then sed 's/^ //' << EOF >$dummy.c #define _HPUX_SOURCE #include #include int main () { #if defined(_SC_KERNEL_BITS) long bits = sysconf(_SC_KERNEL_BITS); #endif long cpu = sysconf (_SC_CPU_VERSION); switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0"); break; case CPU_PA_RISC1_1: puts ("hppa1.1"); break; case CPU_PA_RISC2_0: #if defined(_SC_KERNEL_BITS) switch (bits) { case 64: puts ("hppa2.0w"); break; case 32: puts ("hppa2.0n"); break; default: puts ("hppa2.0"); break; } break; #else /* !defined(_SC_KERNEL_BITS) */ puts ("hppa2.0"); break; #endif default: puts ("hppa1.0"); break; } exit (0); } EOF eval $set_cc_for_build (CCOPTS= $CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null ) && HP_ARCH=`./$dummy` if test -z "$HP_ARCH"; then HP_ARCH=hppa; fi rm -f $dummy.c $dummy fi ;; esac echo ${HP_ARCH}-hp-hpux${HPUX_REV} exit 0 ;; ia64:HP-UX:*:*) HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` echo ia64-hp-hpux${HPUX_REV} exit 0 ;; 3050*:HI-UX:*:*) sed 's/^ //' << EOF >$dummy.c #include int main () { long cpu = sysconf (_SC_CPU_VERSION); /* The order matters, because CPU_IS_HP_MC68K erroneously returns true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct results, however. */ if (CPU_IS_PA_RISC (cpu)) { switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; default: puts ("hppa-hitachi-hiuxwe2"); break; } } else if (CPU_IS_HP_MC68K (cpu)) puts ("m68k-hitachi-hiuxwe2"); else puts ("unknown-hitachi-hiuxwe2"); exit (0); } EOF eval $set_cc_for_build $CC_FOR_BUILD $dummy.c -o $dummy && ./$dummy && rm -f $dummy.c $dummy && exit 0 rm -f $dummy.c $dummy echo unknown-hitachi-hiuxwe2 exit 0 ;; 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) echo hppa1.1-hp-bsd exit 0 ;; 9000/8??:4.3bsd:*:*) echo hppa1.0-hp-bsd exit 0 ;; *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) echo hppa1.0-hp-mpeix exit 0 ;; hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) echo hppa1.1-hp-osf exit 0 ;; hp8??:OSF1:*:*) echo hppa1.0-hp-osf exit 0 ;; i*86:OSF1:*:*) if [ -x /usr/sbin/sysversion ] ; then echo ${UNAME_MACHINE}-unknown-osf1mk else echo ${UNAME_MACHINE}-unknown-osf1 fi exit 0 ;; parisc*:Lites*:*:*) echo hppa1.1-hp-lites exit 0 ;; hppa*:OpenBSD:*:*) echo hppa-unknown-openbsd exit 0 ;; C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) echo c1-convex-bsd exit 0 ;; C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi exit 0 ;; C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) echo c34-convex-bsd exit 0 ;; C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) echo c38-convex-bsd exit 0 ;; C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) echo c4-convex-bsd exit 0 ;; CRAY*X-MP:*:*:*) echo xmp-cray-unicos exit 0 ;; CRAY*Y-MP:*:*:*) echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit 0 ;; CRAY*[A-Z]90:*:*:*) echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \ | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ -e 's/\.[^.]*$/.X/' exit 0 ;; CRAY*TS:*:*:*) echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit 0 ;; CRAY*T3D:*:*:*) echo alpha-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit 0 ;; CRAY*T3E:*:*:*) echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit 0 ;; CRAY*SV1:*:*:*) echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit 0 ;; CRAY-2:*:*:*) echo cray2-cray-unicos exit 0 ;; F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit 0 ;; hp300:OpenBSD:*:*) echo m68k-unknown-openbsd${UNAME_RELEASE} exit 0 ;; i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} exit 0 ;; sparc*:BSD/OS:*:*) echo sparc-unknown-bsdi${UNAME_RELEASE} exit 0 ;; *:BSD/OS:*:*) echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} exit 0 ;; *:FreeBSD:*:*) echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` exit 0 ;; *:OpenBSD:*:*) echo ${UNAME_MACHINE}-unknown-openbsd`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` exit 0 ;; i*:CYGWIN*:*) echo ${UNAME_MACHINE}-pc-cygwin exit 0 ;; i*:MINGW*:*) echo ${UNAME_MACHINE}-pc-mingw32 exit 0 ;; i*:PW*:*) echo ${UNAME_MACHINE}-pc-pw32 exit 0 ;; i*:Windows_NT*:* | Pentium*:Windows_NT*:*) # How do we know it's Interix rather than the generic POSIX subsystem? # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we # UNAME_MACHINE based on the output of uname instead of i386? echo i386-pc-interix exit 0 ;; i*:UWIN*:*) echo ${UNAME_MACHINE}-pc-uwin exit 0 ;; p*:CYGWIN*:*) echo powerpcle-unknown-cygwin exit 0 ;; prep*:SunOS:5.*:*) echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit 0 ;; *:GNU:*:*) echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` exit 0 ;; i*86:Minix:*:*) echo ${UNAME_MACHINE}-pc-minix exit 0 ;; arm*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit 0 ;; ia64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux exit 0 ;; m68*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit 0 ;; mips:Linux:*:*) case `sed -n '/^byte/s/^.*: \(.*\) endian/\1/p' < /proc/cpuinfo` in big) echo mips-unknown-linux-gnu && exit 0 ;; little) echo mipsel-unknown-linux-gnu && exit 0 ;; esac ;; ppc:Linux:*:*) echo powerpc-unknown-linux-gnu exit 0 ;; ppc64:Linux:*:*) echo powerpc64-unknown-linux-gnu exit 0 ;; alpha:Linux:*:*) case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in EV5) UNAME_MACHINE=alphaev5 ;; EV56) UNAME_MACHINE=alphaev56 ;; PCA56) UNAME_MACHINE=alphapca56 ;; PCA57) UNAME_MACHINE=alphapca56 ;; EV6) UNAME_MACHINE=alphaev6 ;; EV67) UNAME_MACHINE=alphaev67 ;; EV68*) UNAME_MACHINE=alphaev68 ;; esac objdump --private-headers /bin/sh | grep ld.so.1 >/dev/null if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC} exit 0 ;; parisc:Linux:*:* | hppa:Linux:*:*) # Look for CPU level case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in PA7*) echo hppa1.1-unknown-linux-gnu ;; PA8*) echo hppa2.0-unknown-linux-gnu ;; *) echo hppa-unknown-linux-gnu ;; esac exit 0 ;; parisc64:Linux:*:* | hppa64:Linux:*:*) echo hppa64-unknown-linux-gnu exit 0 ;; s390:Linux:*:* | s390x:Linux:*:*) echo ${UNAME_MACHINE}-ibm-linux exit 0 ;; sh*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit 0 ;; sparc:Linux:*:* | sparc64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit 0 ;; x86_64:Linux:*:*) echo x86_64-unknown-linux-gnu exit 0 ;; i*86:Linux:*:*) # The BFD linker knows what the default object file format is, so # first see if it will tell us. cd to the root directory to prevent # problems with other programs or directories called `ld' in the path. ld_supported_targets=`cd /; ld --help 2>&1 \ | sed -ne '/supported targets:/!d s/[ ][ ]*/ /g s/.*supported targets: *// s/ .*// p'` case "$ld_supported_targets" in elf32-i386) TENTATIVE="${UNAME_MACHINE}-pc-linux-gnu" ;; a.out-i386-linux) echo "${UNAME_MACHINE}-pc-linux-gnuaout" exit 0 ;; coff-i386) echo "${UNAME_MACHINE}-pc-linux-gnucoff" exit 0 ;; "") # Either a pre-BFD a.out linker (linux-gnuoldld) or # one that does not give us useful --help. echo "${UNAME_MACHINE}-pc-linux-gnuoldld" exit 0 ;; esac # Determine whether the default compiler is a.out or elf cat >$dummy.c < #ifdef __cplusplus #include /* for printf() prototype */ int main (int argc, char *argv[]) { #else int main (argc, argv) int argc; char *argv[]; { #endif #ifdef __ELF__ # ifdef __GLIBC__ # if __GLIBC__ >= 2 printf ("%s-pc-linux-gnu\n", argv[1]); # else printf ("%s-pc-linux-gnulibc1\n", argv[1]); # endif # else printf ("%s-pc-linux-gnulibc1\n", argv[1]); # endif #else printf ("%s-pc-linux-gnuaout\n", argv[1]); #endif return 0; } EOF eval $set_cc_for_build $CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null && ./$dummy "${UNAME_MACHINE}" && rm -f $dummy.c $dummy && exit 0 rm -f $dummy.c $dummy test x"${TENTATIVE}" != x && echo "${TENTATIVE}" && exit 0 ;; i*86:DYNIX/ptx:4*:*) # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. # earlier versions are messed up and put the nodename in both # sysname and nodename. echo i386-sequent-sysv4 exit 0 ;; i*86:UNIX_SV:4.2MP:2.*) # Unixware is an offshoot of SVR4, but it has its own version # number series starting with 2... # I am not positive that other SVR4 systems won't match this, # I just have to hope. -- rms. # Use sysv4.2uw... so that sysv4* matches it. echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION} exit 0 ;; i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*) UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'` if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL} else echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL} fi exit 0 ;; i*86:*:5:[78]*) case `/bin/uname -X | grep "^Machine"` in *486*) UNAME_MACHINE=i486 ;; *Pentium) UNAME_MACHINE=i586 ;; *Pent*|*Celeron) UNAME_MACHINE=i686 ;; esac echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} exit 0 ;; i*86:*:3.2:*) if test -f /usr/options/cb.name; then UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then UNAME_REL=`(/bin/uname -X|egrep Release|sed -e 's/.*= //')` (/bin/uname -X|egrep i80486 >/dev/null) && UNAME_MACHINE=i486 (/bin/uname -X|egrep '^Machine.*Pentium' >/dev/null) \ && UNAME_MACHINE=i586 (/bin/uname -X|egrep '^Machine.*Pent ?II' >/dev/null) \ && UNAME_MACHINE=i686 (/bin/uname -X|egrep '^Machine.*Pentium Pro' >/dev/null) \ && UNAME_MACHINE=i686 echo ${UNAME_MACHINE}-pc-sco$UNAME_REL else echo ${UNAME_MACHINE}-pc-sysv32 fi exit 0 ;; i*86:*DOS:*:*) echo ${UNAME_MACHINE}-pc-msdosdjgpp exit 0 ;; pc:*:*:*) # Left here for compatibility: # uname -m prints for DJGPP always 'pc', but it prints nothing about # the processor, so we play safe by assuming i386. echo i386-pc-msdosdjgpp exit 0 ;; Intel:Mach:3*:*) echo i386-pc-mach3 exit 0 ;; paragon:*:*:*) echo i860-intel-osf1 exit 0 ;; i860:*:4.*:*) # i860-SVR4 if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4 else # Add other i860-SVR4 vendors below as they are discovered. echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4 fi exit 0 ;; mini*:CTIX:SYS*5:*) # "miniframe" echo m68010-convergent-sysv exit 0 ;; M68*:*:R3V[567]*:*) test -r /sysV68 && echo 'm68k-motorola-sysv' && exit 0 ;; 3[34]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 4850:*:4.0:3.0) OS_REL='' test -r /etc/.relid \ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && echo i486-ncr-sysv4.3${OS_REL} && exit 0 /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ && echo i586-ncr-sysv4.3${OS_REL} && exit 0 ;; 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && echo i486-ncr-sysv4 && exit 0 ;; m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) echo m68k-unknown-lynxos${UNAME_RELEASE} exit 0 ;; mc68030:UNIX_System_V:4.*:*) echo m68k-atari-sysv4 exit 0 ;; i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.0*:*) echo i386-unknown-lynxos${UNAME_RELEASE} exit 0 ;; TSUNAMI:LynxOS:2.*:*) echo sparc-unknown-lynxos${UNAME_RELEASE} exit 0 ;; rs6000:LynxOS:2.*:*) echo rs6000-unknown-lynxos${UNAME_RELEASE} exit 0 ;; PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.0*:*) echo powerpc-unknown-lynxos${UNAME_RELEASE} exit 0 ;; SM[BE]S:UNIX_SV:*:*) echo mips-dde-sysv${UNAME_RELEASE} exit 0 ;; RM*:ReliantUNIX-*:*:*) echo mips-sni-sysv4 exit 0 ;; RM*:SINIX-*:*:*) echo mips-sni-sysv4 exit 0 ;; *:SINIX-*:*:*) if uname -p 2>/dev/null >/dev/null ; then UNAME_MACHINE=`(uname -p) 2>/dev/null` echo ${UNAME_MACHINE}-sni-sysv4 else echo ns32k-sni-sysv fi exit 0 ;; PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort # says echo i586-unisys-sysv4 exit 0 ;; *:UNIX_System_V:4*:FTX*) # From Gerald Hewes . # How about differentiating between stratus architectures? -djm echo hppa1.1-stratus-sysv4 exit 0 ;; *:*:*:FTX*) # From seanf@swdc.stratus.com. echo i860-stratus-sysv4 exit 0 ;; *:VOS:*:*) # From Paul.Green@stratus.com. echo hppa1.1-stratus-vos exit 0 ;; mc68*:A/UX:*:*) echo m68k-apple-aux${UNAME_RELEASE} exit 0 ;; news*:NEWS-OS:6*:*) echo mips-sony-newsos6 exit 0 ;; R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) if [ -d /usr/nec ]; then echo mips-nec-sysv${UNAME_RELEASE} else echo mips-unknown-sysv${UNAME_RELEASE} fi exit 0 ;; BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. echo powerpc-be-beos exit 0 ;; BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. echo powerpc-apple-beos exit 0 ;; BePC:BeOS:*:*) # BeOS running on Intel PC compatible. echo i586-pc-beos exit 0 ;; SX-4:SUPER-UX:*:*) echo sx4-nec-superux${UNAME_RELEASE} exit 0 ;; SX-5:SUPER-UX:*:*) echo sx5-nec-superux${UNAME_RELEASE} exit 0 ;; Power*:Rhapsody:*:*) echo powerpc-apple-rhapsody${UNAME_RELEASE} exit 0 ;; *:Rhapsody:*:*) echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} exit 0 ;; *:Darwin:*:*) echo `uname -p`-apple-darwin${UNAME_RELEASE} exit 0 ;; *:procnto*:*:* | *:QNX:[0123456789]*:*) if test "${UNAME_MACHINE}" = "x86pc"; then UNAME_MACHINE=pc fi echo `uname -p`-${UNAME_MACHINE}-nto-qnx exit 0 ;; *:QNX:*:4*) echo i386-pc-qnx exit 0 ;; NSR-[KW]:NONSTOP_KERNEL:*:*) echo nsr-tandem-nsk${UNAME_RELEASE} exit 0 ;; *:NonStop-UX:*:*) echo mips-compaq-nonstopux exit 0 ;; BS2000:POSIX*:*:*) echo bs2000-siemens-sysv exit 0 ;; DS/*:UNIX_System_V:*:*) echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE} exit 0 ;; *:Plan9:*:*) # "uname -m" is not consistent, so use $cputype instead. 386 # is converted to i386 for consistency with other x86 # operating systems. if test "$cputype" = "386"; then UNAME_MACHINE=i386 else UNAME_MACHINE="$cputype" fi echo ${UNAME_MACHINE}-unknown-plan9 exit 0 ;; i*86:OS/2:*:*) # If we were able to find `uname', then EMX Unix compatibility # is probably installed. echo ${UNAME_MACHINE}-pc-os2-emx exit 0 ;; *:TOPS-10:*:*) echo pdp10-unknown-tops10 exit 0 ;; *:TENEX:*:*) echo pdp10-unknown-tenex exit 0 ;; KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) echo pdp10-dec-tops20 exit 0 ;; XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) echo pdp10-xkl-tops20 exit 0 ;; *:TOPS-20:*:*) echo pdp10-unknown-tops20 exit 0 ;; *:ITS:*:*) echo pdp10-unknown-its exit 0 ;; i*86:XTS-300:*:STOP) echo ${UNAME_MACHINE}-unknown-stop exit 0 ;; i*86:atheos:*:*) echo ${UNAME_MACHINE}-unknown-atheos exit 0 ;; esac #echo '(No uname command or uname output not recognized.)' 1>&2 #echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2 cat >$dummy.c < # include #endif main () { #if defined (sony) #if defined (MIPSEB) /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed, I don't know.... */ printf ("mips-sony-bsd\n"); exit (0); #else #include printf ("m68k-sony-newsos%s\n", #ifdef NEWSOS4 "4" #else "" #endif ); exit (0); #endif #endif #if defined (__arm) && defined (__acorn) && defined (__unix) printf ("arm-acorn-riscix"); exit (0); #endif #if defined (hp300) && !defined (hpux) printf ("m68k-hp-bsd\n"); exit (0); #endif #if defined (NeXT) #if !defined (__ARCHITECTURE__) #define __ARCHITECTURE__ "m68k" #endif int version; version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`; if (version < 4) printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version); else printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version); exit (0); #endif #if defined (MULTIMAX) || defined (n16) #if defined (UMAXV) printf ("ns32k-encore-sysv\n"); exit (0); #else #if defined (CMU) printf ("ns32k-encore-mach\n"); exit (0); #else printf ("ns32k-encore-bsd\n"); exit (0); #endif #endif #endif #if defined (__386BSD__) printf ("i386-pc-bsd\n"); exit (0); #endif #if defined (sequent) #if defined (i386) printf ("i386-sequent-dynix\n"); exit (0); #endif #if defined (ns32000) printf ("ns32k-sequent-dynix\n"); exit (0); #endif #endif #if defined (_SEQUENT_) struct utsname un; uname(&un); if (strncmp(un.version, "V2", 2) == 0) { printf ("i386-sequent-ptx2\n"); exit (0); } if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ printf ("i386-sequent-ptx1\n"); exit (0); } printf ("i386-sequent-ptx\n"); exit (0); #endif #if defined (vax) # if !defined (ultrix) # include # if defined (BSD) # if BSD == 43 printf ("vax-dec-bsd4.3\n"); exit (0); # else # if BSD == 199006 printf ("vax-dec-bsd4.3reno\n"); exit (0); # else printf ("vax-dec-bsd\n"); exit (0); # endif # endif # else printf ("vax-dec-bsd\n"); exit (0); # endif # else printf ("vax-dec-ultrix\n"); exit (0); # endif #endif #if defined (alliant) && defined (i860) printf ("i860-alliant-bsd\n"); exit (0); #endif exit (1); } EOF eval $set_cc_for_build $CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null && ./$dummy && rm -f $dummy.c $dummy && exit 0 rm -f $dummy.c $dummy # Apollos put the system type in the environment. test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit 0; } # Convex versions that predate uname can use getsysinfo(1) if [ -x /usr/convex/getsysinfo ] then case `getsysinfo -f cpu_type` in c1*) echo c1-convex-bsd exit 0 ;; c2*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi exit 0 ;; c34*) echo c34-convex-bsd exit 0 ;; c38*) echo c38-convex-bsd exit 0 ;; c4*) echo c4-convex-bsd exit 0 ;; esac fi cat >&2 < in order to provide the needed information to handle your system. config.guess timestamp = $timestamp uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null` /bin/uname -X = `(/bin/uname -X) 2>/dev/null` hostinfo = `(hostinfo) 2>/dev/null` /bin/universe = `(/bin/universe) 2>/dev/null` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` /bin/arch = `(/bin/arch) 2>/dev/null` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` UNAME_MACHINE = ${UNAME_MACHINE} UNAME_RELEASE = ${UNAME_RELEASE} UNAME_SYSTEM = ${UNAME_SYSTEM} UNAME_VERSION = ${UNAME_VERSION} EOF exit 1 # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: mail-1.1.2/config.sub0000775000076500007650000006704110614714012014004 0ustar dogdog00000000000000#! /bin/sh # Configuration validation subroutine script. # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001 # Free Software Foundation, Inc. timestamp='2001-08-23' # This file is (in principle) common to ALL GNU software. # The presence of a machine in this file suggests that SOME GNU software # can handle that machine. It does not imply ALL GNU software can. # # This file is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program 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 General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, # Boston, MA 02110-1301, USA. # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # Please send patches to . # # Configuration subroutine to validate and canonicalize a configuration type. # Supply the specified configuration type as an argument. # If it is invalid, we print an error message on stderr and exit with code 1. # Otherwise, we print the canonical config type on stdout and succeed. # This file is supposed to be the same for all GNU packages # and recognize all the CPU types, system types and aliases # that are meaningful with *any* GNU software. # Each package is responsible for reporting which valid configurations # it does not support. The user should be able to distinguish # a failure to support a valid configuration from a meaningless # configuration. # The goal of this file is to map all the various variations of a given # machine specification into a single specification in the form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM # or in some cases, the newer four-part form: # CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM # It is wrong to echo any other type of specification. me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] CPU-MFR-OPSYS $0 [OPTION] ALIAS Canonicalize a configuration name. Operation modes: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.sub ($timestamp) Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit 0 ;; --version | -v ) echo "$version" ; exit 0 ;; --help | --h* | -h ) echo "$usage"; exit 0 ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" exit 1 ;; *local*) # First pass through any local machine types. echo $1 exit 0;; * ) break ;; esac done case $# in 0) echo "$me: missing argument$help" >&2 exit 1;; 1) ;; *) echo "$me: too many arguments$help" >&2 exit 1;; esac # Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). # Here we must recognize all the valid KERNEL-OS combinations. maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` case $maybe_os in nto-qnx* | linux-gnu* | storm-chaos* | os2-emx* | windows32-*) os=-$maybe_os basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` ;; *) basic_machine=`echo $1 | sed 's/-[^-]*$//'` if [ $basic_machine != $1 ] then os=`echo $1 | sed 's/.*-/-/'` else os=; fi ;; esac ### Let's recognize common machines as not being operating systems so ### that things like config.sub decstation-3100 work. We also ### recognize some manufacturers as not being operating systems, so we ### can provide default operating systems below. case $os in -sun*os*) # Prevent following clause from handling this invalid input. ;; -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \ -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \ -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \ -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ -apple | -axis) os= basic_machine=$1 ;; -sim | -cisco | -oki | -wec | -winbond) os= basic_machine=$1 ;; -scout) ;; -wrs) os=-vxworks basic_machine=$1 ;; -chorusos*) os=-chorusos basic_machine=$1 ;; -chorusrdb) os=-chorusrdb basic_machine=$1 ;; -hiux*) os=-hiuxwe2 ;; -sco5) os=-sco3.2v5 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco4) os=-sco3.2v4 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco3.2.[4-9]*) os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco3.2v[4-9]*) # Don't forget version if it is 3.2v4 or newer. basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco*) os=-sco3.2v2 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -udk*) basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -isc) os=-isc2.2 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -clix*) basic_machine=clipper-intergraph ;; -isc*) basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -lynx*) os=-lynxos ;; -ptx*) basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'` ;; -windowsnt*) os=`echo $os | sed -e 's/windowsnt/winnt/'` ;; -psos*) os=-psos ;; -mint | -mint[0-9]*) basic_machine=m68k-atari os=-mint ;; esac # Decode aliases for certain CPU-COMPANY combinations. case $basic_machine in # Recognize the basic CPU types without company name. # Some are omitted here because they have special meanings below. 1750a | 580 \ | a29k \ | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr \ | c4x | clipper \ | d10v | d30v | dsp16xx \ | fr30 \ | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ | i370 | i860 | i960 | ia64 \ | m32r | m68000 | m68k | m88k | mcore \ | mips16 | mips64 | mips64el | mips64orion | mips64orionel \ | mips64vr4100 | mips64vr4100el | mips64vr4300 \ | mips64vr4300el | mips64vr5000 | mips64vr5000el \ | mipsbe | mipsel | mipsle | mipstx39 | mipstx39el \ | mn10200 | mn10300 \ | ns16k | ns32k \ | openrisc \ | pdp10 | pdp11 | pj | pjl \ | powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \ | pyramid \ | s390 | s390x \ | sh | sh[34] | sh[34]eb | shbe | shle \ | sparc | sparc64 | sparclet | sparclite | sparcv9 | sparcv9b \ | stormy16 | strongarm \ | tahoe | thumb | tic80 | tron \ | v850 \ | we32k \ | x86 | xscale \ | z8k) basic_machine=$basic_machine-unknown ;; m6811 | m68hc11 | m6812 | m68hc12) # Motorola 68HC11/12. basic_machine=$basic_machine-unknown os=-none ;; m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k) ;; # We use `pc' rather than `unknown' # because (1) that's what they normally are, and # (2) the word "unknown" tends to confuse beginning users. i*86 | x86_64) basic_machine=$basic_machine-pc ;; # Object if more than one company name word. *-*-*) echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 exit 1 ;; # Recognize the basic CPU types with company name. 580-* \ | a29k-* \ | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ | alphapca5[67]-* | arc-* \ | arm-* | armbe-* | armle-* | armv*-* \ | bs2000-* \ | c[123]* | c30-* | [cjt]90-* | c54x-* \ | clipper-* | cray2-* | cydra-* \ | d10v-* | d30v-* \ | elxsi-* \ | f30[01]-* | f700-* | fr30-* | fx80-* \ | h8300-* | h8500-* \ | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ | i*86-* | i860-* | i960-* | ia64-* \ | m32r-* \ | m68000-* | m680[01234]0-* | m68360-* | m683?2-* | m68k-* \ | m88110-* | m88k-* | mcore-* \ | mips-* | mips16-* | mips64-* | mips64el-* | mips64orion-* \ | mips64orionel-* | mips64vr4100-* | mips64vr4100el-* \ | mips64vr4300-* | mips64vr4300el-* | mipsbe-* | mipsel-* \ | mipsle-* | mipstx39-* | mipstx39el-* \ | none-* | np1-* | ns16k-* | ns32k-* \ | orion-* \ | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \ | pyramid-* \ | romp-* | rs6000-* \ | s390-* | s390x-* \ | sh-* | sh[34]-* | sh[34]eb-* | shbe-* | shle-* \ | sparc-* | sparc64-* | sparc86x-* | sparclite-* \ | sparcv9-* | sparcv9b-* | stormy16-* | strongarm-* | sv1-* \ | t3e-* | tahoe-* | thumb-* | tic30-* | tic54x-* | tic80-* | tron-* \ | v850-* | vax-* \ | we32k-* \ | x86-* | x86_64-* | xmp-* | xps100-* | xscale-* \ | ymp-* \ | z8k-*) ;; # Recognize the various machine names and aliases which stand # for a CPU type and a company and sometimes even an OS. 386bsd) basic_machine=i386-unknown os=-bsd ;; 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) basic_machine=m68000-att ;; 3b*) basic_machine=we32k-att ;; a29khif) basic_machine=a29k-amd os=-udi ;; adobe68k) basic_machine=m68010-adobe os=-scout ;; alliant | fx80) basic_machine=fx80-alliant ;; altos | altos3068) basic_machine=m68k-altos ;; am29k) basic_machine=a29k-none os=-bsd ;; amdahl) basic_machine=580-amdahl os=-sysv ;; amiga | amiga-*) basic_machine=m68k-unknown ;; amigaos | amigados) basic_machine=m68k-unknown os=-amigaos ;; amigaunix | amix) basic_machine=m68k-unknown os=-sysv4 ;; apollo68) basic_machine=m68k-apollo os=-sysv ;; apollo68bsd) basic_machine=m68k-apollo os=-bsd ;; aux) basic_machine=m68k-apple os=-aux ;; balance) basic_machine=ns32k-sequent os=-dynix ;; convex-c1) basic_machine=c1-convex os=-bsd ;; convex-c2) basic_machine=c2-convex os=-bsd ;; convex-c32) basic_machine=c32-convex os=-bsd ;; convex-c34) basic_machine=c34-convex os=-bsd ;; convex-c38) basic_machine=c38-convex os=-bsd ;; cray | ymp) basic_machine=ymp-cray os=-unicos ;; cray2) basic_machine=cray2-cray os=-unicos ;; [cjt]90) basic_machine=${basic_machine}-cray os=-unicos ;; crds | unos) basic_machine=m68k-crds ;; cris | cris-* | etrax*) basic_machine=cris-axis ;; da30 | da30-*) basic_machine=m68k-da30 ;; decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) basic_machine=mips-dec ;; delta | 3300 | motorola-3300 | motorola-delta \ | 3300-motorola | delta-motorola) basic_machine=m68k-motorola ;; delta88) basic_machine=m88k-motorola os=-sysv3 ;; dpx20 | dpx20-*) basic_machine=rs6000-bull os=-bosx ;; dpx2* | dpx2*-bull) basic_machine=m68k-bull os=-sysv3 ;; ebmon29k) basic_machine=a29k-amd os=-ebmon ;; elxsi) basic_machine=elxsi-elxsi os=-bsd ;; encore | umax | mmax) basic_machine=ns32k-encore ;; es1800 | OSE68k | ose68k | ose | OSE) basic_machine=m68k-ericsson os=-ose ;; fx2800) basic_machine=i860-alliant ;; genix) basic_machine=ns32k-ns ;; gmicro) basic_machine=tron-gmicro os=-sysv ;; go32) basic_machine=i386-pc os=-go32 ;; h3050r* | hiux*) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; h8300hms) basic_machine=h8300-hitachi os=-hms ;; h8300xray) basic_machine=h8300-hitachi os=-xray ;; h8500hms) basic_machine=h8500-hitachi os=-hms ;; harris) basic_machine=m88k-harris os=-sysv3 ;; hp300-*) basic_machine=m68k-hp ;; hp300bsd) basic_machine=m68k-hp os=-bsd ;; hp300hpux) basic_machine=m68k-hp os=-hpux ;; hp3k9[0-9][0-9] | hp9[0-9][0-9]) basic_machine=hppa1.0-hp ;; hp9k2[0-9][0-9] | hp9k31[0-9]) basic_machine=m68000-hp ;; hp9k3[2-9][0-9]) basic_machine=m68k-hp ;; hp9k6[0-9][0-9] | hp6[0-9][0-9]) basic_machine=hppa1.0-hp ;; hp9k7[0-79][0-9] | hp7[0-79][0-9]) basic_machine=hppa1.1-hp ;; hp9k78[0-9] | hp78[0-9]) # FIXME: really hppa2.0-hp basic_machine=hppa1.1-hp ;; hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) # FIXME: really hppa2.0-hp basic_machine=hppa1.1-hp ;; hp9k8[0-9][13679] | hp8[0-9][13679]) basic_machine=hppa1.1-hp ;; hp9k8[0-9][0-9] | hp8[0-9][0-9]) basic_machine=hppa1.0-hp ;; hppa-next) os=-nextstep3 ;; hppaosf) basic_machine=hppa1.1-hp os=-osf ;; hppro) basic_machine=hppa1.1-hp os=-proelf ;; i370-ibm* | ibm*) basic_machine=i370-ibm ;; # I'm not sure what "Sysv32" means. Should this be sysv3.2? i*86v32) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv32 ;; i*86v4*) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv4 ;; i*86v) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv ;; i*86sol2) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-solaris2 ;; i386mach) basic_machine=i386-mach os=-mach ;; i386-vsta | vsta) basic_machine=i386-unknown os=-vsta ;; iris | iris4d) basic_machine=mips-sgi case $os in -irix*) ;; *) os=-irix4 ;; esac ;; isi68 | isi) basic_machine=m68k-isi os=-sysv ;; m88k-omron*) basic_machine=m88k-omron ;; magnum | m3230) basic_machine=mips-mips os=-sysv ;; merlin) basic_machine=ns32k-utek os=-sysv ;; mingw32) basic_machine=i386-pc os=-mingw32 ;; miniframe) basic_machine=m68000-convergent ;; *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*) basic_machine=m68k-atari os=-mint ;; mipsel*-linux*) basic_machine=mipsel-unknown os=-linux-gnu ;; mips*-linux*) basic_machine=mips-unknown os=-linux-gnu ;; mips3*-*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` ;; mips3*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown ;; mmix*) basic_machine=mmix-knuth os=-mmixware ;; monitor) basic_machine=m68k-rom68k os=-coff ;; msdos) basic_machine=i386-pc os=-msdos ;; mvs) basic_machine=i370-ibm os=-mvs ;; ncr3000) basic_machine=i486-ncr os=-sysv4 ;; netbsd386) basic_machine=i386-unknown os=-netbsd ;; netwinder) basic_machine=armv4l-rebel os=-linux ;; news | news700 | news800 | news900) basic_machine=m68k-sony os=-newsos ;; news1000) basic_machine=m68030-sony os=-newsos ;; news-3600 | risc-news) basic_machine=mips-sony os=-newsos ;; necv70) basic_machine=v70-nec os=-sysv ;; next | m*-next ) basic_machine=m68k-next case $os in -nextstep* ) ;; -ns2*) os=-nextstep2 ;; *) os=-nextstep3 ;; esac ;; nh3000) basic_machine=m68k-harris os=-cxux ;; nh[45]000) basic_machine=m88k-harris os=-cxux ;; nindy960) basic_machine=i960-intel os=-nindy ;; mon960) basic_machine=i960-intel os=-mon960 ;; nonstopux) basic_machine=mips-compaq os=-nonstopux ;; np1) basic_machine=np1-gould ;; nsr-tandem) basic_machine=nsr-tandem ;; op50n-* | op60c-*) basic_machine=hppa1.1-oki os=-proelf ;; OSE68000 | ose68000) basic_machine=m68000-ericsson os=-ose ;; os68k) basic_machine=m68k-none os=-os68k ;; pa-hitachi) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; paragon) basic_machine=i860-intel os=-osf ;; pbd) basic_machine=sparc-tti ;; pbb) basic_machine=m68k-tti ;; pc532 | pc532-*) basic_machine=ns32k-pc532 ;; pentium | p5 | k5 | k6 | nexgen) basic_machine=i586-pc ;; pentiumpro | p6 | 6x86 | athlon) basic_machine=i686-pc ;; pentiumii | pentium2) basic_machine=i686-pc ;; pentium-* | p5-* | k5-* | k6-* | nexgen-*) basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentiumpro-* | p6-* | 6x86-* | athlon-*) basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentiumii-* | pentium2-*) basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pn) basic_machine=pn-gould ;; power) basic_machine=power-ibm ;; ppc) basic_machine=powerpc-unknown ;; ppc-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppcle | powerpclittle | ppc-le | powerpc-little) basic_machine=powerpcle-unknown ;; ppcle-* | powerpclittle-*) basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppc64) basic_machine=powerpc64-unknown ;; ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppc64le | powerpc64little | ppc64-le | powerpc64-little) basic_machine=powerpc64le-unknown ;; ppc64le-* | powerpc64little-*) basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ps2) basic_machine=i386-ibm ;; pw32) basic_machine=i586-unknown os=-pw32 ;; rom68k) basic_machine=m68k-rom68k os=-coff ;; rm[46]00) basic_machine=mips-siemens ;; rtpc | rtpc-*) basic_machine=romp-ibm ;; sa29200) basic_machine=a29k-amd os=-udi ;; sequent) basic_machine=i386-sequent ;; sh) basic_machine=sh-hitachi os=-hms ;; sparclite-wrs) basic_machine=sparclite-wrs os=-vxworks ;; sps7) basic_machine=m68k-bull os=-sysv2 ;; spur) basic_machine=spur-unknown ;; st2000) basic_machine=m68k-tandem ;; stratus) basic_machine=i860-stratus os=-sysv4 ;; sun2) basic_machine=m68000-sun ;; sun2os3) basic_machine=m68000-sun os=-sunos3 ;; sun2os4) basic_machine=m68000-sun os=-sunos4 ;; sun3os3) basic_machine=m68k-sun os=-sunos3 ;; sun3os4) basic_machine=m68k-sun os=-sunos4 ;; sun4os3) basic_machine=sparc-sun os=-sunos3 ;; sun4os4) basic_machine=sparc-sun os=-sunos4 ;; sun4sol2) basic_machine=sparc-sun os=-solaris2 ;; sun3 | sun3-*) basic_machine=m68k-sun ;; sun4) basic_machine=sparc-sun ;; sun386 | sun386i | roadrunner) basic_machine=i386-sun ;; sv1) basic_machine=sv1-cray os=-unicos ;; symmetry) basic_machine=i386-sequent os=-dynix ;; t3e) basic_machine=t3e-cray os=-unicos ;; tic54x | c54x*) basic_machine=tic54x-unknown os=-coff ;; tx39) basic_machine=mipstx39-unknown ;; tx39el) basic_machine=mipstx39el-unknown ;; tower | tower-32) basic_machine=m68k-ncr ;; udi29k) basic_machine=a29k-amd os=-udi ;; ultra3) basic_machine=a29k-nyu os=-sym1 ;; v810 | necv810) basic_machine=v810-nec os=-none ;; vaxv) basic_machine=vax-dec os=-sysv ;; vms) basic_machine=vax-dec os=-vms ;; vpp*|vx|vx-*) basic_machine=f301-fujitsu ;; vxworks960) basic_machine=i960-wrs os=-vxworks ;; vxworks68) basic_machine=m68k-wrs os=-vxworks ;; vxworks29k) basic_machine=a29k-wrs os=-vxworks ;; w65*) basic_machine=w65-wdc os=-none ;; w89k-*) basic_machine=hppa1.1-winbond os=-proelf ;; windows32) basic_machine=i386-pc os=-windows32-msvcrt ;; xmp) basic_machine=xmp-cray os=-unicos ;; xps | xps100) basic_machine=xps100-honeywell ;; z8k-*-coff) basic_machine=z8k-unknown os=-sim ;; none) basic_machine=none-none os=-none ;; # Here we handle the default manufacturer of certain CPU types. It is in # some cases the only manufacturer, in others, it is the most popular. w89k) basic_machine=hppa1.1-winbond ;; op50n) basic_machine=hppa1.1-oki ;; op60c) basic_machine=hppa1.1-oki ;; mips) if [ x$os = x-linux-gnu ]; then basic_machine=mips-unknown else basic_machine=mips-mips fi ;; romp) basic_machine=romp-ibm ;; rs6000) basic_machine=rs6000-ibm ;; vax) basic_machine=vax-dec ;; pdp10) # there are many clones, so DEC is not a safe bet basic_machine=pdp10-unknown ;; pdp11) basic_machine=pdp11-dec ;; we32k) basic_machine=we32k-att ;; sh3 | sh4 | sh3eb | sh4eb) basic_machine=sh-unknown ;; sparc | sparcv9 | sparcv9b) basic_machine=sparc-sun ;; cydra) basic_machine=cydra-cydrome ;; orion) basic_machine=orion-highlevel ;; orion105) basic_machine=clipper-highlevel ;; mac | mpw | mac-mpw) basic_machine=m68k-apple ;; pmac | pmac-mpw) basic_machine=powerpc-apple ;; c4x*) basic_machine=c4x-none os=-coff ;; *-unknown) # Make sure to match an already-canonicalized machine name. ;; *) echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 exit 1 ;; esac # Here we canonicalize certain aliases for manufacturers. case $basic_machine in *-digital*) basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'` ;; *-commodore*) basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'` ;; *) ;; esac # Decode manufacturer-specific aliases for certain operating systems. if [ x"$os" != x"" ] then case $os in # First match some system type aliases # that might get confused with valid system types. # -solaris* is a basic system type, with this one exception. -solaris1 | -solaris1.*) os=`echo $os | sed -e 's|solaris1|sunos4|'` ;; -solaris) os=-solaris2 ;; -svr4*) os=-sysv4 ;; -unixware*) os=-sysv4.2uw ;; -gnu/linux*) os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` ;; # First accept the basic system types. # The portable systems comes first. # Each alternative MUST END IN A *, to match a version number. # -sysv* is not here because it comes later, after sysvr4. -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ | -*vms* | -sco* | -esix* | -isc* | -aix* | -sunos | -sunos[34]*\ | -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \ | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ | -aos* \ | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ | -hiux* | -386bsd* | -netbsd* | -openbsd* | -freebsd* | -riscix* \ | -lynxos* | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ | -chorusos* | -chorusrdb* \ | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ | -mingw32* | -linux-gnu* | -uxpv* | -beos* | -mpeix* | -udk* \ | -interix* | -uwin* | -rhapsody* | -darwin* | -opened* \ | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ | -os2* | -vos*) # Remember, each alternative MUST END IN *, to match a version number. ;; -qnx*) case $basic_machine in x86-* | i*86-*) ;; *) os=-nto$os ;; esac ;; -nto*) os=-nto-qnx ;; -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ | -windows* | -osx | -abug | -netware* | -os9* | -beos* \ | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) ;; -mac*) os=`echo $os | sed -e 's|mac|macos|'` ;; -linux*) os=`echo $os | sed -e 's|linux|linux-gnu|'` ;; -sunos5*) os=`echo $os | sed -e 's|sunos5|solaris2|'` ;; -sunos6*) os=`echo $os | sed -e 's|sunos6|solaris3|'` ;; -opened*) os=-openedition ;; -wince*) os=-wince ;; -osfrose*) os=-osfrose ;; -osf*) os=-osf ;; -utek*) os=-bsd ;; -dynix*) os=-bsd ;; -acis*) os=-aos ;; -386bsd) os=-bsd ;; -ctix* | -uts*) os=-sysv ;; -ns2 ) os=-nextstep2 ;; -nsk*) os=-nsk ;; # Preserve the version number of sinix5. -sinix5.*) os=`echo $os | sed -e 's|sinix|sysv|'` ;; -sinix*) os=-sysv4 ;; -triton*) os=-sysv3 ;; -oss*) os=-sysv3 ;; -svr4) os=-sysv4 ;; -svr3) os=-sysv3 ;; -sysvr4) os=-sysv4 ;; # This must come after -sysvr4. -sysv*) ;; -ose*) os=-ose ;; -es1800*) os=-ose ;; -xenix) os=-xenix ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) os=-mint ;; -none) ;; *) # Get rid of the `-' at the beginning of $os. os=`echo $os | sed 's/[^-]*-//'` echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2 exit 1 ;; esac else # Here we handle the default operating systems that come with various machines. # The value should be what the vendor currently ships out the door with their # machine or put another way, the most popular os provided with the machine. # Note that if you're going to try to match "-MANUFACTURER" here (say, # "-sun"), then you have to tell the case statement up towards the top # that MANUFACTURER isn't an operating system. Otherwise, code above # will signal an error saying that MANUFACTURER isn't an operating # system, and we'll never get to this point. case $basic_machine in *-acorn) os=-riscix1.2 ;; arm*-rebel) os=-linux ;; arm*-semi) os=-aout ;; pdp10-*) os=-tops20 ;; pdp11-*) os=-none ;; *-dec | vax-*) os=-ultrix4.2 ;; m68*-apollo) os=-domain ;; i386-sun) os=-sunos4.0.2 ;; m68000-sun) os=-sunos3 # This also exists in the configure program, but was not the # default. # os=-sunos4 ;; m68*-cisco) os=-aout ;; mips*-cisco) os=-elf ;; mips*-*) os=-elf ;; *-tti) # must be before sparc entry or we get the wrong os. os=-sysv3 ;; sparc-* | *-sun) os=-sunos4.1.1 ;; *-be) os=-beos ;; *-ibm) os=-aix ;; *-wec) os=-proelf ;; *-winbond) os=-proelf ;; *-oki) os=-proelf ;; *-hp) os=-hpux ;; *-hitachi) os=-hiux ;; i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) os=-sysv ;; *-cbm) os=-amigaos ;; *-dg) os=-dgux ;; *-dolphin) os=-sysv3 ;; m68k-ccur) os=-rtu ;; m88k-omron*) os=-luna ;; *-next ) os=-nextstep ;; *-sequent) os=-ptx ;; *-crds) os=-unos ;; *-ns) os=-genix ;; i370-*) os=-mvs ;; *-next) os=-nextstep3 ;; *-gould) os=-sysv ;; *-highlevel) os=-bsd ;; *-encore) os=-bsd ;; *-sgi) os=-irix ;; *-siemens) os=-sysv4 ;; *-masscomp) os=-rtu ;; f30[01]-fujitsu | f700-fujitsu) os=-uxpv ;; *-rom68k) os=-coff ;; *-*bug) os=-coff ;; *-apple) os=-macos ;; *-atari*) os=-mint ;; *) os=-none ;; esac fi # Here we handle the case where we know the os, and the CPU type, but not the # manufacturer. We pick the logical manufacturer. vendor=unknown case $basic_machine in *-unknown) case $os in -riscix*) vendor=acorn ;; -sunos*) vendor=sun ;; -aix*) vendor=ibm ;; -beos*) vendor=be ;; -hpux*) vendor=hp ;; -mpeix*) vendor=hp ;; -hiux*) vendor=hitachi ;; -unos*) vendor=crds ;; -dgux*) vendor=dg ;; -luna*) vendor=omron ;; -genix*) vendor=ns ;; -mvs* | -opened*) vendor=ibm ;; -ptx*) vendor=sequent ;; -vxsim* | -vxworks*) vendor=wrs ;; -aux*) vendor=apple ;; -hms*) vendor=hitachi ;; -mpw* | -macos*) vendor=apple ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) vendor=atari ;; -vos*) vendor=stratus ;; esac basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"` ;; esac echo $basic_machine$os exit 0 # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: mail-1.1.2/configure0000775000076500007650000034077410614714012013737 0ustar dogdog00000000000000#! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.59 for gnumail 1.1.1. # # Copyright (C) 2003 Free Software Foundation, Inc. # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. ## --------------------- ## ## M4sh Initialization. ## ## --------------------- ## # Be Bourne compatible if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then set -o posix fi DUALCASE=1; export DUALCASE # for MKS sh # Support unset when possible. if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then as_unset=unset else as_unset=false fi # Work around bugs in pre-3.0 UWIN ksh. $as_unset ENV MAIL MAILPATH PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. for as_var in \ LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \ LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \ LC_TELEPHONE LC_TIME do if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then eval $as_var=C; export $as_var else $as_unset $as_var fi done # Required to use basename. if expr a : '\(a\)' >/dev/null 2>&1; then as_expr=expr else as_expr=false fi if (basename /) >/dev/null 2>&1 && test "X`basename / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi # Name of the executable. as_me=`$as_basename "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)$' \| \ . : '\(.\)' 2>/dev/null || echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; } /^X\/\(\/\/\)$/{ s//\1/; q; } /^X\/\(\/\).*/{ s//\1/; q; } s/.*/./; q'` # PATH needs CR, and LINENO needs CR and PATH. # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then echo "#! /bin/sh" >conf$$.sh echo "exit 0" >>conf$$.sh chmod +x conf$$.sh if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then PATH_SEPARATOR=';' else PATH_SEPARATOR=: fi rm -f conf$$.sh fi as_lineno_1=$LINENO as_lineno_2=$LINENO as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` test "x$as_lineno_1" != "x$as_lineno_2" && test "x$as_lineno_3" = "x$as_lineno_2" || { # Find who we are. Look in the path if we contain no path at all # relative or not. case $0 in *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then { echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2 { (exit 1); exit 1; }; } fi case $CONFIG_SHELL in '') as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for as_base in sh bash ksh sh5; do case $as_dir in /*) if ("$as_dir/$as_base" -c ' as_lineno_1=$LINENO as_lineno_2=$LINENO as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` test "x$as_lineno_1" != "x$as_lineno_2" && test "x$as_lineno_3" = "x$as_lineno_2" ') 2>/dev/null; then $as_unset BASH_ENV || test "${BASH_ENV+set}" != set || { BASH_ENV=; export BASH_ENV; } $as_unset ENV || test "${ENV+set}" != set || { ENV=; export ENV; } CONFIG_SHELL=$as_dir/$as_base export CONFIG_SHELL exec "$CONFIG_SHELL" "$0" ${1+"$@"} fi;; esac done done ;; esac # Create $as_me.lineno as a copy of $as_myself, but with $LINENO # uniformly replaced by the line number. The first 'sed' inserts a # line-number line before each line; the second 'sed' does the real # work. The second script uses 'N' to pair each line-number line # with the numbered line, and appends trailing '-' during # substitution so that $LINENO is not a special case at line end. # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the # second 'sed' script. Blame Lee E. McMahon for sed's syntax. :-) sed '=' <$as_myself | sed ' N s,$,-, : loop s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3, t loop s,-$,, s,^['$as_cr_digits']*\n,, ' >$as_me.lineno && chmod +x $as_me.lineno || { echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2 { (exit 1); exit 1; }; } # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensible to this). . ./$as_me.lineno # Exit status is that of the last command. exit } case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in *c*,-n*) ECHO_N= ECHO_C=' ' ECHO_T=' ' ;; *c*,* ) ECHO_N=-n ECHO_C= ECHO_T= ;; *) ECHO_N= ECHO_C='\c' ECHO_T= ;; esac if expr a : '\(a\)' >/dev/null 2>&1; then as_expr=expr else as_expr=false fi rm -f conf$$ conf$$.exe conf$$.file echo >conf$$.file if ln -s conf$$.file conf$$ 2>/dev/null; then # We could just check for DJGPP; but this test a) works b) is more generic # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04). if test -f conf$$.exe; then # Don't use ln at all; we don't have any links as_ln_s='cp -p' else as_ln_s='ln -s' fi elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -p' fi rm -f conf$$ conf$$.exe conf$$.file if mkdir -p . 2>/dev/null; then as_mkdir_p=: else test -d ./-p && rmdir ./-p as_mkdir_p=false fi as_executable_p="test -f" # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" # IFS # We need space, tab and new line, in precisely that order. as_nl=' ' IFS=" $as_nl" # CDPATH. $as_unset CDPATH # Name of the host. # hostname on some systems (SVR3.2, Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` exec 6>&1 # # Initializations. # ac_default_prefix=/usr/local ac_config_libobj_dir=. cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= SHELL=${CONFIG_SHELL-/bin/sh} # Maximum number of lines to put in a shell here document. # This variable seems obsolete. It should probably be removed, and # only ac_max_sed_lines should be used. : ${ac_max_here_lines=38} # Identity of this package. PACKAGE_NAME='gnumail' PACKAGE_TARNAME='gnumail' PACKAGE_VERSION='1.1.1' PACKAGE_STRING='gnumail 1.1.1' PACKAGE_BUGREPORT='' ac_unique_file="source/gnu/mail/providers/ReadOnlyMessage.java" ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA CYGPATH_W PACKAGE VERSION ACLOCAL AUTOCONF AUTOMAKE AUTOHEADER MAKEINFO install_sh STRIP ac_ct_STRIP INSTALL_STRIP_PROGRAM mkdir_p AWK SET_MAKE am__leading_dot AMTAR am__tar am__untar ENABLE_SMTP_TRUE ENABLE_SMTP_FALSE ENABLE_IMAP_TRUE ENABLE_IMAP_FALSE ENABLE_POP3_TRUE ENABLE_POP3_FALSE ENABLE_NNTP_TRUE ENABLE_NNTP_FALSE ENABLE_MBOX_TRUE ENABLE_MBOX_FALSE ENABLE_MAILDIR_TRUE ENABLE_MAILDIR_FALSE JAVAC JAVADOC JAR JAVAPREFIX JAVACFLAGS JAVAFLAGS JAVADOCFLAGS JAVA ACTIVATION_JAR INETLIB_JAR uudecode JSSE_JAR LIBOBJS LTLIBOBJS' ac_subst_files='' # Initialize some variables set by options. ac_init_help= ac_init_version=false # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null exec_prefix=NONE no_create= no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= verbose= x_includes=NONE x_libraries=NONE # Installation directory options. # These are left unexpanded so users can "make install exec_prefix=/foo" # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datadir='${prefix}/share' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' libdir='${exec_prefix}/lib' includedir='${prefix}/include' oldincludedir='/usr/include' infodir='${prefix}/info' mandir='${prefix}/man' ac_prev= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval "$ac_prev=\$ac_option" ac_prev= continue fi ac_optarg=`expr "x$ac_option" : 'x[^=]*=\(.*\)'` # Accept the important Cygnus configure options, so we can diagnose typos. case $ac_option in -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir=$ac_optarg ;; -build | --build | --buil | --bui | --bu) ac_prev=build_alias ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build_alias=$ac_optarg ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file=$ac_optarg ;; --config-cache | -C) cache_file=config.cache ;; -datadir | --datadir | --datadi | --datad | --data | --dat | --da) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \ | --da=*) datadir=$ac_optarg ;; -disable-* | --disable-*) ac_feature=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null && { echo "$as_me: error: invalid feature name: $ac_feature" >&2 { (exit 1); exit 1; }; } ac_feature=`echo $ac_feature | sed 's/-/_/g'` eval "enable_$ac_feature=no" ;; -enable-* | --enable-*) ac_feature=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null && { echo "$as_me: error: invalid feature name: $ac_feature" >&2 { (exit 1); exit 1; }; } ac_feature=`echo $ac_feature | sed 's/-/_/g'` case $ac_option in *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;; *) ac_optarg=yes ;; esac eval "enable_$ac_feature='$ac_optarg'" ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix=$ac_optarg ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he | -h) ac_init_help=long ;; -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) ac_init_help=recursive ;; -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) ac_init_help=short ;; -host | --host | --hos | --ho) ac_prev=host_alias ;; -host=* | --host=* | --hos=* | --ho=*) host_alias=$ac_optarg ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir=$ac_optarg ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir=$ac_optarg ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir=$ac_optarg ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir=$ac_optarg ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst \ | --locals | --local | --loca | --loc | --lo) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* \ | --locals=* | --local=* | --loca=* | --loc=* | --lo=*) localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir=$ac_optarg ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c | -n) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir=$ac_optarg ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix=$ac_optarg ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix=$ac_optarg ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix=$ac_optarg ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name=$ac_optarg ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir=$ac_optarg ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir=$ac_optarg ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site=$ac_optarg ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir=$ac_optarg ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir=$ac_optarg ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target_alias ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target_alias=$ac_optarg ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers | -V) ac_init_version=: ;; -with-* | --with-*) ac_package=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null && { echo "$as_me: error: invalid package name: $ac_package" >&2 { (exit 1); exit 1; }; } ac_package=`echo $ac_package| sed 's/-/_/g'` case $ac_option in *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;; *) ac_optarg=yes ;; esac eval "with_$ac_package='$ac_optarg'" ;; -without-* | --without-*) ac_package=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null && { echo "$as_me: error: invalid package name: $ac_package" >&2 { (exit 1); exit 1; }; } ac_package=`echo $ac_package | sed 's/-/_/g'` eval "with_$ac_package=no" ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes=$ac_optarg ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; -*) { echo "$as_me: error: unrecognized option: $ac_option Try \`$0 --help' for more information." >&2 { (exit 1); exit 1; }; } ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. expr "x$ac_envvar" : ".*[^_$as_cr_alnum]" >/dev/null && { echo "$as_me: error: invalid variable name: $ac_envvar" >&2 { (exit 1); exit 1; }; } ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` eval "$ac_envvar='$ac_optarg'" export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. echo "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && echo "$as_me: WARNING: invalid host type: $ac_option" >&2 : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option} ;; esac done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` { echo "$as_me: error: missing argument to $ac_option" >&2 { (exit 1); exit 1; }; } fi # Be sure to have absolute paths. for ac_var in exec_prefix prefix do eval ac_val=$`echo $ac_var` case $ac_val in [\\/$]* | ?:[\\/]* | NONE | '' ) ;; *) { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2 { (exit 1); exit 1; }; };; esac done # Be sure to have absolute paths. for ac_var in bindir sbindir libexecdir datadir sysconfdir sharedstatedir \ localstatedir libdir includedir oldincludedir infodir mandir do eval ac_val=$`echo $ac_var` case $ac_val in [\\/$]* | ?:[\\/]* ) ;; *) { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2 { (exit 1); exit 1; }; };; esac done # There might be people who depend on the old broken behavior: `$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias host=$host_alias target=$target_alias # FIXME: To remove some day. if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host. If a cross compiler is detected then cross compile mode will be used." >&2 elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi fi ac_tool_prefix= test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then its parent. ac_confdir=`(dirname "$0") 2>/dev/null || $as_expr X"$0" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$0" : 'X\(//\)[^/]' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| \ . : '\(.\)' 2>/dev/null || echo X"$0" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } /^X\(\/\/\)[^/].*/{ s//\1/; q; } /^X\(\/\/\)$/{ s//\1/; q; } /^X\(\/\).*/{ s//\1/; q; } s/.*/./; q'` srcdir=$ac_confdir if test ! -r $srcdir/$ac_unique_file; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r $srcdir/$ac_unique_file; then if test "$ac_srcdir_defaulted" = yes; then { echo "$as_me: error: cannot find sources ($ac_unique_file) in $ac_confdir or .." >&2 { (exit 1); exit 1; }; } else { echo "$as_me: error: cannot find sources ($ac_unique_file) in $srcdir" >&2 { (exit 1); exit 1; }; } fi fi (cd $srcdir && test -r ./$ac_unique_file) 2>/dev/null || { echo "$as_me: error: sources are in $srcdir, but \`cd $srcdir' does not work" >&2 { (exit 1); exit 1; }; } srcdir=`echo "$srcdir" | sed 's%\([^\\/]\)[\\/]*$%\1%'` ac_env_build_alias_set=${build_alias+set} ac_env_build_alias_value=$build_alias ac_cv_env_build_alias_set=${build_alias+set} ac_cv_env_build_alias_value=$build_alias ac_env_host_alias_set=${host_alias+set} ac_env_host_alias_value=$host_alias ac_cv_env_host_alias_set=${host_alias+set} ac_cv_env_host_alias_value=$host_alias ac_env_target_alias_set=${target_alias+set} ac_env_target_alias_value=$target_alias ac_cv_env_target_alias_set=${target_alias+set} ac_cv_env_target_alias_value=$target_alias # # Report the --help message. # if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF \`configure' configures gnumail 1.1.1 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print \`checking...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for \`--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or \`..'] _ACEOF cat <<_ACEOF Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [PREFIX] By default, \`make install' will install all the files in \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify an installation prefix other than \`$ac_default_prefix' using \`--prefix', for instance \`--prefix=\$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --datadir=DIR read-only architecture-independent data [PREFIX/share] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --infodir=DIR info documentation [PREFIX/info] --mandir=DIR man documentation [PREFIX/man] _ACEOF cat <<\_ACEOF Program names: --program-prefix=PREFIX prepend PREFIX to installed program names --program-suffix=SUFFIX append SUFFIX to installed program names --program-transform-name=PROGRAM run sed PROGRAM on installed program names _ACEOF fi if test -n "$ac_init_help"; then case $ac_init_help in short | recursive ) echo "Configuration of gnumail 1.1.1:";; esac cat <<\_ACEOF Optional Features: --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --enable-smtp Enable the SMTP provider (default=yes). --enable-imap Enable the IMAP provider (default=yes). --enable-pop3 Enable the POP3 provider (default=yes). --enable-nntp Enable the NNTP provider (default=yes). --enable-mbox Enable the mbox provider (default=yes). --enable-maildir Enable the Maildir provider (default=yes). Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --with-java-prefix=PFX prefix where Java runtime is installed (optional) --with-javac-flags=FLAGS flags to pass to the Java compiler (optional) --with-java-flags=FLAGS flags to pass to the Java VM (optional) --with-javadoc-flags=FLAGS flags to pass to the Javadoc generator (optional) --with-activation-jar=DIR path to JAF (activation.jar). If unspecified, /usr/share/java and /usr/local/share/java are searched, in that order. --with-inetlib-jar=DIR path to GNU inetlib (inetlib.jar). If unspecified, /usr/share/java and /usr/local/share/java are searched, in that order. --with-jsse=FILE path to external JSSE library _ACEOF fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. ac_popdir=`pwd` for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue test -d $ac_dir || continue ac_builddir=. if test "$ac_dir" != .; then ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` # A "../" for each directory in $ac_dir_suffix. ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'` else ac_dir_suffix= ac_top_builddir= fi case $srcdir in .) # No --srcdir option. We are building in place. ac_srcdir=. if test -z "$ac_top_builddir"; then ac_top_srcdir=. else ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'` fi ;; [\\/]* | ?:[\\/]* ) # Absolute path. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ;; *) # Relative path. ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_builddir$srcdir ;; esac # Do not use `cd foo && pwd` to compute absolute paths, because # the directories may not exist. case `pwd` in .) ac_abs_builddir="$ac_dir";; *) case "$ac_dir" in .) ac_abs_builddir=`pwd`;; [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";; *) ac_abs_builddir=`pwd`/"$ac_dir";; esac;; esac case $ac_abs_builddir in .) ac_abs_top_builddir=${ac_top_builddir}.;; *) case ${ac_top_builddir}. in .) ac_abs_top_builddir=$ac_abs_builddir;; [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;; *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;; esac;; esac case $ac_abs_builddir in .) ac_abs_srcdir=$ac_srcdir;; *) case $ac_srcdir in .) ac_abs_srcdir=$ac_abs_builddir;; [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;; *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;; esac;; esac case $ac_abs_builddir in .) ac_abs_top_srcdir=$ac_top_srcdir;; *) case $ac_top_srcdir in .) ac_abs_top_srcdir=$ac_abs_builddir;; [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;; *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;; esac;; esac cd $ac_dir # Check for guested configure; otherwise get Cygnus style configure. if test -f $ac_srcdir/configure.gnu; then echo $SHELL $ac_srcdir/configure.gnu --help=recursive elif test -f $ac_srcdir/configure; then echo $SHELL $ac_srcdir/configure --help=recursive elif test -f $ac_srcdir/configure.ac || test -f $ac_srcdir/configure.in; then echo $ac_configure --help else echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi cd $ac_popdir done fi test -n "$ac_init_help" && exit 0 if $ac_init_version; then cat <<\_ACEOF gnumail configure 1.1.1 generated by GNU Autoconf 2.59 Copyright (C) 2003 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF exit 0 fi exec 5>config.log cat >&5 <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by gnumail $as_me 1.1.1, which was generated by GNU Autoconf 2.59. Invocation command line was $ $0 $@ _ACEOF { cat <<_ASUNAME ## --------- ## ## Platform. ## ## --------- ## hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` /bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` /bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` hostinfo = `(hostinfo) 2>/dev/null || echo unknown` /bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` /bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` _ASUNAME as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. echo "PATH: $as_dir" done } >&5 cat >&5 <<_ACEOF ## ----------- ## ## Core tests. ## ## ----------- ## _ACEOF # Keep a trace of the command line. # Strip out --no-create and --no-recursion so they do not pile up. # Strip out --silent because we don't want to record it for future runs. # Also quote any args containing shell meta-characters. # Make two passes to allow for proper duplicate-argument suppression. ac_configure_args= ac_configure_args0= ac_configure_args1= ac_sep= ac_must_keep_next=false for ac_pass in 1 2 do for ac_arg do case $ac_arg in -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*) ac_arg=`echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) ac_configure_args0="$ac_configure_args0 '$ac_arg'" ;; 2) ac_configure_args1="$ac_configure_args1 '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else case $ac_arg in *=* | --config-cache | -C | -disable-* | --disable-* \ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ | -with-* | --with-* | -without-* | --without-* | --x) case "$ac_configure_args0 " in "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; esac ;; -* ) ac_must_keep_next=true ;; esac fi ac_configure_args="$ac_configure_args$ac_sep'$ac_arg'" # Get rid of the leading space. ac_sep=" " ;; esac done done $as_unset ac_configure_args0 || test "${ac_configure_args0+set}" != set || { ac_configure_args0=; export ac_configure_args0; } $as_unset ac_configure_args1 || test "${ac_configure_args1+set}" != set || { ac_configure_args1=; export ac_configure_args1; } # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there # would cause problems or look ugly. # WARNING: Be sure not to use single quotes in there, as some shells, # such as our DU 5.0 friend, will then `close' the trap. trap 'exit_status=$? # Save into config.log some information that might help in debugging. { echo cat <<\_ASBOX ## ---------------- ## ## Cache variables. ## ## ---------------- ## _ASBOX echo # The following way of writing the cache mishandles newlines in values, { (set) 2>&1 | case `(ac_space='"'"' '"'"'; set | grep ac_space) 2>&1` in *ac_space=\ *) sed -n \ "s/'"'"'/'"'"'\\\\'"'"''"'"'/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='"'"'\\2'"'"'/p" ;; *) sed -n \ "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p" ;; esac; } echo cat <<\_ASBOX ## ----------------- ## ## Output variables. ## ## ----------------- ## _ASBOX echo for ac_var in $ac_subst_vars do eval ac_val=$`echo $ac_var` echo "$ac_var='"'"'$ac_val'"'"'" done | sort echo if test -n "$ac_subst_files"; then cat <<\_ASBOX ## ------------- ## ## Output files. ## ## ------------- ## _ASBOX echo for ac_var in $ac_subst_files do eval ac_val=$`echo $ac_var` echo "$ac_var='"'"'$ac_val'"'"'" done | sort echo fi if test -s confdefs.h; then cat <<\_ASBOX ## ----------- ## ## confdefs.h. ## ## ----------- ## _ASBOX echo sed "/^$/d" confdefs.h | sort echo fi test "$ac_signal" != 0 && echo "$as_me: caught signal $ac_signal" echo "$as_me: exit $exit_status" } >&5 rm -f core *.core && rm -rf conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; { (exit 1); exit 1; }' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -rf conftest* confdefs.h # AIX cpp loses on an empty file, so make sure it contains at least a newline. echo >confdefs.h # Predefined preprocessor variables. cat >>confdefs.h <<_ACEOF #define PACKAGE_NAME "$PACKAGE_NAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_TARNAME "$PACKAGE_TARNAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_VERSION "$PACKAGE_VERSION" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_STRING "$PACKAGE_STRING" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" _ACEOF # Let the site file select an alternate cache file if it wants to. # Prefer explicitly selected file to automatically selected ones. if test -z "$CONFIG_SITE"; then if test "x$prefix" != xNONE; then CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site" else CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site" fi fi for ac_site_file in $CONFIG_SITE; do if test -r "$ac_site_file"; then { echo "$as_me:$LINENO: loading site script $ac_site_file" >&5 echo "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" fi done if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special # files actually), so we avoid doing that. if test -f "$cache_file"; then { echo "$as_me:$LINENO: loading cache $cache_file" >&5 echo "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . $cache_file;; *) . ./$cache_file;; esac fi else { echo "$as_me:$LINENO: creating cache $cache_file" >&5 echo "$as_me: creating cache $cache_file" >&6;} >$cache_file fi # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false for ac_var in `(set) 2>&1 | sed -n 's/^ac_env_\([a-zA-Z_0-9]*\)_set=.*/\1/p'`; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set eval ac_old_val="\$ac_cv_env_${ac_var}_value" eval ac_new_val="\$ac_env_${ac_var}_value" case $ac_old_set,$ac_new_set in set,) { echo "$as_me:$LINENO: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { echo "$as_me:$LINENO: error: \`$ac_var' was not set in the previous run" >&5 echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then { echo "$as_me:$LINENO: error: \`$ac_var' has changed since the previous run:" >&5 echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} { echo "$as_me:$LINENO: former value: $ac_old_val" >&5 echo "$as_me: former value: $ac_old_val" >&2;} { echo "$as_me:$LINENO: current value: $ac_new_val" >&5 echo "$as_me: current value: $ac_new_val" >&2;} ac_cache_corrupted=: fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*) ac_arg=$ac_var=`echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. *) ac_configure_args="$ac_configure_args '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { echo "$as_me:$LINENO: error: changes in the environment can compromise the build" >&5 echo "$as_me: error: changes in the environment can compromise the build" >&2;} { { echo "$as_me:$LINENO: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&5 echo "$as_me: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&2;} { (exit 1); exit 1; }; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu am__api_version="1.9" ac_aux_dir= for ac_dir in $srcdir $srcdir/.. $srcdir/../..; do if test -f $ac_dir/install-sh; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install-sh -c" break elif test -f $ac_dir/install.sh; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install.sh -c" break elif test -f $ac_dir/shtool; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/shtool install -c" break fi done if test -z "$ac_aux_dir"; then { { echo "$as_me:$LINENO: error: cannot find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." >&5 echo "$as_me: error: cannot find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." >&2;} { (exit 1); exit 1; }; } fi ac_config_guess="$SHELL $ac_aux_dir/config.guess" ac_config_sub="$SHELL $ac_aux_dir/config.sub" ac_configure="$SHELL $ac_aux_dir/configure" # This should be Cygnus configure. # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or # incompatible versions: # SysV /etc/install, /usr/sbin/install # SunOS /usr/etc/install # IRIX /sbin/install # AIX /bin/install # AmigaOS /C/install, which installs bootblocks on floppy discs # AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag # AFS /usr/afsws/bin/install, which mishandles nonexistent args # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # OS/2's system install, which has a completely different semantic # ./install, which can be erroneously created by make from ./install.sh. echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5 echo $ECHO_N "checking for a BSD-compatible install... $ECHO_C" >&6 if test -z "$INSTALL"; then if test "${ac_cv_path_install+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. # Account for people who put trailing slashes in PATH elements. case $as_dir/ in ./ | .// | /cC/* | \ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ ?:\\/os2\\/install\\/* | ?:\\/OS2\\/INSTALL\\/* | \ /usr/ucb/* ) ;; *) # OSF1 and SCO ODT 3.0 have their own names for install. # Don't use installbsd from OSF since it installs stuff as root # by default. for ac_prog in ginstall scoinst install; do for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then if test $ac_prog = install && grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # AIX install. It has an incompatible calling convention. : elif test $ac_prog = install && grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # program-specific install script used by HP pwplus--don't use. : else ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" break 3 fi fi done done ;; esac done fi if test "${ac_cv_path_install+set}" = set; then INSTALL=$ac_cv_path_install else # As a last resort, use the slow shell script. We don't cache a # path for INSTALL within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the path is relative. INSTALL=$ac_install_sh fi fi echo "$as_me:$LINENO: result: $INSTALL" >&5 echo "${ECHO_T}$INSTALL" >&6 # Use test -z because SunOS4 sh mishandles braces in ${var-val}. # It thinks the first close brace ends the variable substitution. test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' echo "$as_me:$LINENO: checking whether build environment is sane" >&5 echo $ECHO_N "checking whether build environment is sane... $ECHO_C" >&6 # Just in case sleep 1 echo timestamp > conftest.file # Do `set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( set X `ls -Lt $srcdir/configure conftest.file 2> /dev/null` if test "$*" = "X"; then # -L didn't work. set X `ls -t $srcdir/configure conftest.file` fi rm -f conftest.file if test "$*" != "X $srcdir/configure conftest.file" \ && test "$*" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". { { echo "$as_me:$LINENO: error: ls -t appears to fail. Make sure there is not a broken alias in your environment" >&5 echo "$as_me: error: ls -t appears to fail. Make sure there is not a broken alias in your environment" >&2;} { (exit 1); exit 1; }; } fi test "$2" = conftest.file ) then # Ok. : else { { echo "$as_me:$LINENO: error: newly created file is older than distributed files! Check your system clock" >&5 echo "$as_me: error: newly created file is older than distributed files! Check your system clock" >&2;} { (exit 1); exit 1; }; } fi echo "$as_me:$LINENO: result: yes" >&5 echo "${ECHO_T}yes" >&6 test "$program_prefix" != NONE && program_transform_name="s,^,$program_prefix,;$program_transform_name" # Use a double $ so make ignores it. test "$program_suffix" != NONE && program_transform_name="s,\$,$program_suffix,;$program_transform_name" # Double any \ or $. echo might interpret backslashes. # By default was `s,x,x', remove it if useless. cat <<\_ACEOF >conftest.sed s/[\\$]/&&/g;s/;s,x,x,$// _ACEOF program_transform_name=`echo $program_transform_name | sed -f conftest.sed` rm conftest.sed # expand $ac_aux_dir to an absolute path am_aux_dir=`cd $ac_aux_dir && pwd` test x"${MISSING+set}" = xset || MISSING="\${SHELL} $am_aux_dir/missing" # Use eval to expand $SHELL if eval "$MISSING --run true"; then am_missing_run="$MISSING --run " else am_missing_run= { echo "$as_me:$LINENO: WARNING: \`missing' script is too old or missing" >&5 echo "$as_me: WARNING: \`missing' script is too old or missing" >&2;} fi if mkdir -p --version . >/dev/null 2>&1 && test ! -d ./--version; then # We used to keeping the `.' as first argument, in order to # allow $(mkdir_p) to be used without argument. As in # $(mkdir_p) $(somedir) # where $(somedir) is conditionally defined. However this is wrong # for two reasons: # 1. if the package is installed by a user who cannot write `.' # make install will fail, # 2. the above comment should most certainly read # $(mkdir_p) $(DESTDIR)$(somedir) # so it does not work when $(somedir) is undefined and # $(DESTDIR) is not. # To support the latter case, we have to write # test -z "$(somedir)" || $(mkdir_p) $(DESTDIR)$(somedir), # so the `.' trick is pointless. mkdir_p='mkdir -p --' else # On NextStep and OpenStep, the `mkdir' command does not # recognize any option. It will interpret all options as # directories to create, and then abort because `.' already # exists. for d in ./-p ./--version; do test -d $d && rmdir $d done # $(mkinstalldirs) is defined by Automake if mkinstalldirs exists. if test -f "$ac_aux_dir/mkinstalldirs"; then mkdir_p='$(mkinstalldirs)' else mkdir_p='$(install_sh) -d' fi fi for ac_prog in gawk mawk nawk awk do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_AWK+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$AWK"; then ac_cv_prog_AWK="$AWK" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_AWK="$ac_prog" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done fi fi AWK=$ac_cv_prog_AWK if test -n "$AWK"; then echo "$as_me:$LINENO: result: $AWK" >&5 echo "${ECHO_T}$AWK" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi test -n "$AWK" && break done echo "$as_me:$LINENO: checking whether ${MAKE-make} sets \$(MAKE)" >&5 echo $ECHO_N "checking whether ${MAKE-make} sets \$(MAKE)... $ECHO_C" >&6 set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y,:./+-,___p_,'` if eval "test \"\${ac_cv_prog_make_${ac_make}_set+set}\" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.make <<\_ACEOF all: @echo 'ac_maketemp="$(MAKE)"' _ACEOF # GNU make sometimes prints "make[1]: Entering...", which would confuse us. eval `${MAKE-make} -f conftest.make 2>/dev/null | grep temp=` if test -n "$ac_maketemp"; then eval ac_cv_prog_make_${ac_make}_set=yes else eval ac_cv_prog_make_${ac_make}_set=no fi rm -f conftest.make fi if eval "test \"`echo '$ac_cv_prog_make_'${ac_make}_set`\" = yes"; then echo "$as_me:$LINENO: result: yes" >&5 echo "${ECHO_T}yes" >&6 SET_MAKE= else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 SET_MAKE="MAKE=${MAKE-make}" fi rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null # test to see if srcdir already configured if test "`cd $srcdir && pwd`" != "`pwd`" && test -f $srcdir/config.status; then { { echo "$as_me:$LINENO: error: source directory already configured; run \"make distclean\" there first" >&5 echo "$as_me: error: source directory already configured; run \"make distclean\" there first" >&2;} { (exit 1); exit 1; }; } fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi # Define the identity of the package. PACKAGE='gnumail' VERSION='1.1.1' cat >>confdefs.h <<_ACEOF #define PACKAGE "$PACKAGE" _ACEOF cat >>confdefs.h <<_ACEOF #define VERSION "$VERSION" _ACEOF # Some tools Automake needs. ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"} AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"} AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"} AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} install_sh=${install_sh-"$am_aux_dir/install-sh"} # Installed binaries are usually stripped using `strip' when the user # run `make install-strip'. However `strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the `STRIP' environment variable to overrule this program. if test "$cross_compiling" != no; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. set dummy ${ac_tool_prefix}strip; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_STRIP+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$STRIP"; then ac_cv_prog_STRIP="$STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_STRIP="${ac_tool_prefix}strip" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done fi fi STRIP=$ac_cv_prog_STRIP if test -n "$STRIP"; then echo "$as_me:$LINENO: result: $STRIP" >&5 echo "${ECHO_T}$STRIP" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi fi if test -z "$ac_cv_prog_STRIP"; then ac_ct_STRIP=$STRIP # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$ac_ct_STRIP"; then ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_STRIP="strip" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done test -z "$ac_cv_prog_ac_ct_STRIP" && ac_cv_prog_ac_ct_STRIP=":" fi fi ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP if test -n "$ac_ct_STRIP"; then echo "$as_me:$LINENO: result: $ac_ct_STRIP" >&5 echo "${ECHO_T}$ac_ct_STRIP" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi STRIP=$ac_ct_STRIP else STRIP="$ac_cv_prog_STRIP" fi fi INSTALL_STRIP_PROGRAM="\${SHELL} \$(install_sh) -c -s" # We need awk for the "check" target. The system "awk" is bad on # some platforms. # Always define AMTAR for backward compatibility. AMTAR=${AMTAR-"${am_missing_run}tar"} am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -' PACKAGE="mail" VERSION="1.1.1" # Check whether --enable-smtp or --disable-smtp was given. if test "${enable_smtp+set}" = set; then enableval="$enable_smtp" case "$enableval" in no) enable_smtp=no ;; *) enable_smtp=yes ;; esac else enable_smtp=yes fi; if test "x$enable_smtp" = "xyes"; then ENABLE_SMTP_TRUE= ENABLE_SMTP_FALSE='#' else ENABLE_SMTP_TRUE='#' ENABLE_SMTP_FALSE= fi # Check whether --enable-imap or --disable-imap was given. if test "${enable_imap+set}" = set; then enableval="$enable_imap" case "$enableval" in no) enable_imap=no ;; *) enable_imap=yes ;; esac else enable_imap=yes fi; if test "x$enable_imap" = "xyes"; then ENABLE_IMAP_TRUE= ENABLE_IMAP_FALSE='#' else ENABLE_IMAP_TRUE='#' ENABLE_IMAP_FALSE= fi # Check whether --enable-pop3 or --disable-pop3 was given. if test "${enable_pop3+set}" = set; then enableval="$enable_pop3" case "$enableval" in no) enable_pop3=no ;; *) enable_pop3=yes ;; esac else enable_pop3=yes fi; if test "x$enable_pop3" = "xyes"; then ENABLE_POP3_TRUE= ENABLE_POP3_FALSE='#' else ENABLE_POP3_TRUE='#' ENABLE_POP3_FALSE= fi # Check whether --enable-nntp or --disable-nntp was given. if test "${enable_nntp+set}" = set; then enableval="$enable_nntp" case "$enableval" in no) enable_nntp=no ;; *) enable_nntp=yes ;; esac else enable_nntp=yes fi; if test "x$enable_nntp" = "xyes"; then ENABLE_NNTP_TRUE= ENABLE_NNTP_FALSE='#' else ENABLE_NNTP_TRUE='#' ENABLE_NNTP_FALSE= fi # Check whether --enable-mbox or --disable-mbox was given. if test "${enable_mbox+set}" = set; then enableval="$enable_mbox" case "$enableval" in no) enable_mbox=no ;; *) enable_mbox=yes ;; esac else enable_mbox=yes fi; if test "x$enable_mbox" = "xyes"; then ENABLE_MBOX_TRUE= ENABLE_MBOX_FALSE='#' else ENABLE_MBOX_TRUE='#' ENABLE_MBOX_FALSE= fi # Check whether --enable-maildir or --disable-maildir was given. if test "${enable_maildir+set}" = set; then enableval="$enable_maildir" case "$enableval" in no) enable_maildir=no ;; *) enable_maildir=yes ;; esac else enable_maildir=yes fi; if test "x$enable_maildir" = "xyes"; then ENABLE_MAILDIR_TRUE= ENABLE_MAILDIR_FALSE='#' else ENABLE_MAILDIR_TRUE='#' ENABLE_MAILDIR_FALSE= fi if test "x$JAVAPREFIX" = x; then test "x$JAVAC" = x && for ac_prog in "gcj$EXEEXT -C" jikes$EXEEXT ejc$EXEEXT guavac$EXEEXT javac$EXEEXT do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_JAVAC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$JAVAC"; then ac_cv_prog_JAVAC="$JAVAC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_JAVAC="$ac_prog" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done fi fi JAVAC=$ac_cv_prog_JAVAC if test -n "$JAVAC"; then echo "$as_me:$LINENO: result: $JAVAC" >&5 echo "${ECHO_T}$JAVAC" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi test -n "$JAVAC" && break done else test "x$JAVAC" = x && for ac_prog in "gcj$EXEEXT -C" jikes$EXEEXT ejc$EXEEXT guavac$EXEEXT javac$EXEEXT do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_JAVAC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$JAVAC"; then ac_cv_prog_JAVAC="$JAVAC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_JAVAC="$ac_prog" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done fi fi JAVAC=$ac_cv_prog_JAVAC if test -n "$JAVAC"; then echo "$as_me:$LINENO: result: $JAVAC" >&5 echo "${ECHO_T}$JAVAC" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi test -n "$JAVAC" && break done test -n "$JAVAC" || JAVAC="$JAVAPREFIX" fi test "x$JAVAC" = x && { { echo "$as_me:$LINENO: error: no acceptable Java compiler found in \$PATH" >&5 echo "$as_me: error: no acceptable Java compiler found in \$PATH" >&2;} { (exit 1); exit 1; }; } echo "$as_me:$LINENO: checking if $JAVAC works" >&5 echo $ECHO_N "checking if $JAVAC works... $ECHO_C" >&6 if test "${ac_cv_prog_javac_works+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else JAVA_TEST=Test.java CLASS_TEST=Test.class cat << \EOF > $JAVA_TEST /* #line 1930 "configure" */ public class Test { } EOF if { ac_try='$JAVAC $JAVACFLAGS -classpath .:$CLASSPATH $JAVA_TEST' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } >/dev/null 2>&1; then ac_cv_prog_javac_works=yes else { { echo "$as_me:$LINENO: error: The Java compiler $JAVAC failed (see config.log, check the CLASSPATH?)" >&5 echo "$as_me: error: The Java compiler $JAVAC failed (see config.log, check the CLASSPATH?)" >&2;} { (exit 1); exit 1; }; } echo "configure: failed program was:" >&5 cat $JAVA_TEST >&5 fi rm -f $JAVA_TEST $CLASS_TEST fi echo "$as_me:$LINENO: result: $ac_cv_prog_javac_works" >&5 echo "${ECHO_T}$ac_cv_prog_javac_works" >&6 (echo "$JAVAC" | grep -e " -C$" >/dev/null 2>/dev/null) && { echo "$as_me:$LINENO: WARNING: The build seems to be using gcj for bytecode generation. Some versions of gcj are known to produce bad bytecode. See here for a list of bugs that may be relevant: http://gcc.gnu.org/bugzilla/buglist.cgi?component=java&keywords=wrong-code&order=default At least bug 19921 is known to affect gjdoc (in Feb 2005). You may want to set the environment variable JAVAC to an alternate compiler, such as jikes, to make sure that you end up with valid bytecode. " >&5 echo "$as_me: WARNING: The build seems to be using gcj for bytecode generation. Some versions of gcj are known to produce bad bytecode. See here for a list of bugs that may be relevant: http://gcc.gnu.org/bugzilla/buglist.cgi?component=java&keywords=wrong-code&order=default At least bug 19921 is known to affect gjdoc (in Feb 2005). You may want to set the environment variable JAVAC to an alternate compiler, such as jikes, to make sure that you end up with valid bytecode. " >&2;}; if test "x$JAVAPREFIX" = x; then test "x$JAVADOC" = x && for ac_prog in gjdoc$EXEEXT javadoc$EXEEXT do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_JAVADOC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$JAVADOC"; then ac_cv_prog_JAVADOC="$JAVADOC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_JAVADOC="$ac_prog" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done fi fi JAVADOC=$ac_cv_prog_JAVADOC if test -n "$JAVADOC"; then echo "$as_me:$LINENO: result: $JAVADOC" >&5 echo "${ECHO_T}$JAVADOC" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi test -n "$JAVADOC" && break done else test "x$JAVADOC" = x && for ac_prog in gjdoc$EXEEXT javadoc$EXEEXT do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_JAVADOC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$JAVADOC"; then ac_cv_prog_JAVADOC="$JAVADOC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_JAVADOC="$ac_prog" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done fi fi JAVADOC=$ac_cv_prog_JAVADOC if test -n "$JAVADOC"; then echo "$as_me:$LINENO: result: $JAVADOC" >&5 echo "${ECHO_T}$JAVADOC" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi test -n "$JAVADOC" && break done test -n "$JAVADOC" || JAVADOC="$JAVAPREFIX" fi test "x$JAVADOC" = x && { { echo "$as_me:$LINENO: error: no acceptable javadoc generator found in \$PATH" >&5 echo "$as_me: error: no acceptable javadoc generator found in \$PATH" >&2;} { (exit 1); exit 1; }; } if test "x$JAVAPREFIX" = x; then test "x$JAR" = x && for ac_prog in fastjar$EXEEXT jar$EXEEXT do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_JAR+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$JAR"; then ac_cv_prog_JAR="$JAR" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_JAR="$ac_prog" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done fi fi JAR=$ac_cv_prog_JAR if test -n "$JAR"; then echo "$as_me:$LINENO: result: $JAR" >&5 echo "${ECHO_T}$JAR" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi test -n "$JAR" && break done else test "x$JAR" = x && for ac_prog in fastjar$EXEEXT jar$EXEEXT do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_JAR+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$JAR"; then ac_cv_prog_JAR="$JAR" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_JAR="$ac_prog" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done fi fi JAR=$ac_cv_prog_JAR if test -n "$JAR"; then echo "$as_me:$LINENO: result: $JAR" >&5 echo "${ECHO_T}$JAR" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi test -n "$JAR" && break done test -n "$JAR" || JAR="$JAVAPREFIX" fi test "x$JAR" = "x" && { { echo "$as_me:$LINENO: error: no acceptable jar program found in \$PATH" >&5 echo "$as_me: error: no acceptable jar program found in \$PATH" >&2;} { (exit 1); exit 1; }; } sed_expr_param='s/[ ][^"]*$//' jarabs=`echo $JAR | sed -e "$sed_expr_param"` sed_expr_home="s|^~/|$HOME/|" jarabs=`echo $jarabs | sed -e "$sed_expr_home"` sed_expr_abspath='s/^~?\/.*$//' if (test `echo $jarabs | sed -e "$sed_expr_abspath"`); then lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for dir in $PATH; do IFS="$lt_save_ifs" if (test -f $dir/$jarabs || test -f $dir/$jarabs$ac_exeext); then jarabs="$dir/$jarabs" break fi done fi grep 'kaffe\.tools\.jar\.Jar' "$jarabs" >/dev/null test "$?" != "0" || \ { echo "$as_me:$LINENO: WARNING: The build seems to be using the Jar tool that comes with Kaffe. Note that there are known issues in some versions of this tool. Unfortunately it does not support any --version option, so I can't detect whether your version works. If you see error messages from the Jar tool, or the build hangs, please set environment variable JAR to a working Jar tool. " >&5 echo "$as_me: WARNING: The build seems to be using the Jar tool that comes with Kaffe. Note that there are known issues in some versions of this tool. Unfortunately it does not support any --version option, so I can't detect whether your version works. If you see error messages from the Jar tool, or the build hangs, please set environment variable JAR to a working Jar tool. " >&2;} # Check whether --with-java-prefix or --without-java-prefix was given. if test "${with_java_prefix+set}" = set; then withval="$with_java_prefix" fi; # Check whether --with-javac-flags or --without-javac-flags was given. if test "${with_javac_flags+set}" = set; then withval="$with_javac_flags" fi; # Check whether --with-java-flags or --without-java-flags was given. if test "${with_java_flags+set}" = set; then withval="$with_java_flags" fi; # Check whether --with-javadoc-flags or --without-javadoc-flags was given. if test "${with_javadoc_flags+set}" = set; then withval="$with_javadoc_flags" fi; JAVAPREFIX=$with_java_prefix JAVACFLAGS=$with_javac_flags JAVAFLAGS=$with_java_flags JAVADOCFLAGS=$with_javadoc_flags # Check whether --with-activation_jar or --without-activation_jar was given. if test "${with_activation_jar+set}" = set; then withval="$with_activation_jar" if test "x${withval}" != x ; then echo "$as_me:$LINENO: checking for ${withval}/activation.jar" >&5 echo $ECHO_N "checking for ${withval}/activation.jar... $ECHO_C" >&6 if test -r ${withval}/activation.jar ; then echo "$as_me:$LINENO: result: yes" >&5 echo "${ECHO_T}yes" >&6 ACTIVATION_JAR=${withval}/activation.jar found_activation_jar=true else { { echo "$as_me:$LINENO: error: can't find activation.jar in specified path" >&5 echo "$as_me: error: can't find activation.jar in specified path" >&2;} { (exit 1); exit 1; }; } fi fi else found_activation_jar=false fi; if test "x${ACTIVATION_JAR}" = x ; then echo "$as_me:$LINENO: checking for activation.jar" >&5 echo $ECHO_N "checking for activation.jar... $ECHO_C" >&6 for _F in /usr/share/java /usr/local/share/java ${prefix}/share/java ;do if test -r ${_F}/activation.jar ; then ACTIVATION_JAR=${_F}/activation.jar break fi done if test x${ACTIVATION_JAR} = x ; then echo "$as_me:$LINENO: result: not found" >&5 echo "${ECHO_T}not found" >&6 else echo "$as_me:$LINENO: result: ${ACTIVATION_JAR}" >&5 echo "${ECHO_T}${ACTIVATION_JAR}" >&6 fi if test "x${ACTIVATION_JAR}" = x; then { { echo "$as_me:$LINENO: error: can't find activation.jar; use --with-activation-jar" >&5 echo "$as_me: error: can't find activation.jar; use --with-activation-jar" >&2;} { (exit 1); exit 1; }; } fi fi # Check whether --with-inetlib_jar or --without-inetlib_jar was given. if test "${with_inetlib_jar+set}" = set; then withval="$with_inetlib_jar" if test "x${withval}" != x; then echo "$as_me:$LINENO: checking for ${withval}/inetlib.jar" >&5 echo $ECHO_N "checking for ${withval}/inetlib.jar... $ECHO_C" >&6 if test -r ${withval}/inetlib.jar ; then echo "$as_me:$LINENO: result: yes" >&5 echo "${ECHO_T}yes" >&6 INETLIB_JAR=${withval}/inetlib.jar found_inetlib_jar=true else { { echo "$as_me:$LINENO: error: can't find inetlib.jar in specified path" >&5 echo "$as_me: error: can't find inetlib.jar in specified path" >&2;} { (exit 1); exit 1; }; } fi fi else found_inetlib_jar=false fi; if test "x${INETLIB_JAR}" = x ;then echo "$as_me:$LINENO: checking for inetlib.jar" >&5 echo $ECHO_N "checking for inetlib.jar... $ECHO_C" >&6 for _F in /usr/share/java /usr/local/share/java ${prefix}/share/java ;do if test -r ${_F}/inetlib.jar ; then INETLIB_JAR=${_F}/inetlib.jar break fi done if test x${INETLIB_JAR} = x ; then echo "$as_me:$LINENO: result: not found" >&5 echo "${ECHO_T}not found" >&6 else echo "$as_me:$LINENO: result: ${INETLIB_JAR}" >&5 echo "${ECHO_T}${INETLIB_JAR}" >&6 fi if test "x${INETLIB_JAR}" = x; then { { echo "$as_me:$LINENO: error: can't find inetlib.jar; use --with-inetlib-jar" >&5 echo "$as_me: error: can't find inetlib.jar; use --with-inetlib-jar" >&2;} { (exit 1); exit 1; }; } fi found_inetlib_jar=true fi if test x$JAVAPREFIX = x; then test x$JAVA = x && for ac_prog in jamvm$EXEEXT kaffe$EXEEXT sablevm$EXEEXT cacao$EXEEXT gij$EXEEXT java$EXEEXT do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_JAVA+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$JAVA"; then ac_cv_prog_JAVA="$JAVA" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_JAVA="$ac_prog" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done fi fi JAVA=$ac_cv_prog_JAVA if test -n "$JAVA"; then echo "$as_me:$LINENO: result: $JAVA" >&5 echo "${ECHO_T}$JAVA" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi test -n "$JAVA" && break done else test x$JAVA = x && for ac_prog in jamvm$EXEEXT kaffe$EXEEXT sablevm$EXEEXT cacao$EXEEXT gij$EXEEXT java$EXEEXT do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_JAVA+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$JAVA"; then ac_cv_prog_JAVA="$JAVA" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_JAVA="$ac_prog" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done fi fi JAVA=$ac_cv_prog_JAVA if test -n "$JAVA"; then echo "$as_me:$LINENO: result: $JAVA" >&5 echo "${ECHO_T}$JAVA" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi test -n "$JAVA" && break done test -n "$JAVA" || JAVA="$JAVAPREFIX" fi test x$JAVA = x && { { echo "$as_me:$LINENO: error: no acceptable Java virtual machine found in \$PATH" >&5 echo "$as_me: error: no acceptable Java virtual machine found in \$PATH" >&2;} { (exit 1); exit 1; }; } # Extract the first word of "uudecode$EXEEXT", so it can be a program name with args. set dummy uudecode$EXEEXT; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_uudecode+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$uudecode"; then ac_cv_prog_uudecode="$uudecode" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_uudecode="yes" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done fi fi uudecode=$ac_cv_prog_uudecode if test -n "$uudecode"; then echo "$as_me:$LINENO: result: $uudecode" >&5 echo "${ECHO_T}$uudecode" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi if test x$uudecode = xyes; then echo "$as_me:$LINENO: checking if uudecode can decode base 64 file" >&5 echo $ECHO_N "checking if uudecode can decode base 64 file... $ECHO_C" >&6 if test "${ac_cv_prog_uudecode_base64+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat << \EOF > Test.uue begin-base64 644 Test.class yv66vgADAC0AFQcAAgEABFRlc3QHAAQBABBqYXZhL2xhbmcvT2JqZWN0AQAE bWFpbgEAFihbTGphdmEvbGFuZy9TdHJpbmc7KVYBAARDb2RlAQAPTGluZU51 bWJlclRhYmxlDAAKAAsBAARleGl0AQAEKEkpVgoADQAJBwAOAQAQamF2YS9s YW5nL1N5c3RlbQEABjxpbml0PgEAAygpVgwADwAQCgADABEBAApTb3VyY2VG aWxlAQAJVGVzdC5qYXZhACEAAQADAAAAAAACAAkABQAGAAEABwAAACEAAQAB AAAABQO4AAyxAAAAAQAIAAAACgACAAAACgAEAAsAAQAPABAAAQAHAAAAIQAB AAEAAAAFKrcAErEAAAABAAgAAAAKAAIAAAAEAAQABAABABMAAAACABQ= ==== EOF if uudecode$EXEEXT Test.uue; then ac_cv_prog_uudecode_base64=yes else echo "configure: 2470: uudecode had trouble decoding base 64 file 'Test.uue'" >&5 echo "configure: failed file was:" >&5 cat Test.uue >&5 ac_cv_prog_uudecode_base64=no fi rm -f Test.uue fi echo "$as_me:$LINENO: result: $ac_cv_prog_uudecode_base64" >&5 echo "${ECHO_T}$ac_cv_prog_uudecode_base64" >&6 fi if test x$ac_cv_prog_uudecode_base64 != xyes; then rm -f Test.class { echo "$as_me:$LINENO: WARNING: I have to compile Test.class from scratch" >&5 echo "$as_me: WARNING: I have to compile Test.class from scratch" >&2;} if test x$ac_cv_prog_javac_works = xno; then { { echo "$as_me:$LINENO: error: Cannot compile java source. $JAVAC does not work properly" >&5 echo "$as_me: error: Cannot compile java source. $JAVAC does not work properly" >&2;} { (exit 1); exit 1; }; } fi if test x$ac_cv_prog_javac_works = x; then if test "x$JAVAPREFIX" = x; then test "x$JAVAC" = x && for ac_prog in "gcj$EXEEXT -C" jikes$EXEEXT ejc$EXEEXT guavac$EXEEXT javac$EXEEXT do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_JAVAC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$JAVAC"; then ac_cv_prog_JAVAC="$JAVAC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_JAVAC="$ac_prog" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done fi fi JAVAC=$ac_cv_prog_JAVAC if test -n "$JAVAC"; then echo "$as_me:$LINENO: result: $JAVAC" >&5 echo "${ECHO_T}$JAVAC" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi test -n "$JAVAC" && break done else test "x$JAVAC" = x && for ac_prog in "gcj$EXEEXT -C" jikes$EXEEXT ejc$EXEEXT guavac$EXEEXT javac$EXEEXT do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_JAVAC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$JAVAC"; then ac_cv_prog_JAVAC="$JAVAC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_JAVAC="$ac_prog" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done fi fi JAVAC=$ac_cv_prog_JAVAC if test -n "$JAVAC"; then echo "$as_me:$LINENO: result: $JAVAC" >&5 echo "${ECHO_T}$JAVAC" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi test -n "$JAVAC" && break done test -n "$JAVAC" || JAVAC="$JAVAPREFIX" fi test "x$JAVAC" = x && { { echo "$as_me:$LINENO: error: no acceptable Java compiler found in \$PATH" >&5 echo "$as_me: error: no acceptable Java compiler found in \$PATH" >&2;} { (exit 1); exit 1; }; } echo "$as_me:$LINENO: checking if $JAVAC works" >&5 echo $ECHO_N "checking if $JAVAC works... $ECHO_C" >&6 if test "${ac_cv_prog_javac_works+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else JAVA_TEST=Test.java CLASS_TEST=Test.class cat << \EOF > $JAVA_TEST /* #line 2588 "configure" */ public class Test { } EOF if { ac_try='$JAVAC $JAVACFLAGS -classpath .:$CLASSPATH $JAVA_TEST' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } >/dev/null 2>&1; then ac_cv_prog_javac_works=yes else { { echo "$as_me:$LINENO: error: The Java compiler $JAVAC failed (see config.log, check the CLASSPATH?)" >&5 echo "$as_me: error: The Java compiler $JAVAC failed (see config.log, check the CLASSPATH?)" >&2;} { (exit 1); exit 1; }; } echo "configure: failed program was:" >&5 cat $JAVA_TEST >&5 fi rm -f $JAVA_TEST $CLASS_TEST fi echo "$as_me:$LINENO: result: $ac_cv_prog_javac_works" >&5 echo "${ECHO_T}$ac_cv_prog_javac_works" >&6 (echo "$JAVAC" | grep -e " -C$" >/dev/null 2>/dev/null) && { echo "$as_me:$LINENO: WARNING: The build seems to be using gcj for bytecode generation. Some versions of gcj are known to produce bad bytecode. See here for a list of bugs that may be relevant: http://gcc.gnu.org/bugzilla/buglist.cgi?component=java&keywords=wrong-code&order=default At least bug 19921 is known to affect gjdoc (in Feb 2005). You may want to set the environment variable JAVAC to an alternate compiler, such as jikes, to make sure that you end up with valid bytecode. " >&5 echo "$as_me: WARNING: The build seems to be using gcj for bytecode generation. Some versions of gcj are known to produce bad bytecode. See here for a list of bugs that may be relevant: http://gcc.gnu.org/bugzilla/buglist.cgi?component=java&keywords=wrong-code&order=default At least bug 19921 is known to affect gjdoc (in Feb 2005). You may want to set the environment variable JAVAC to an alternate compiler, such as jikes, to make sure that you end up with valid bytecode. " >&2;}; fi fi echo "$as_me:$LINENO: checking if $JAVA works" >&5 echo $ECHO_N "checking if $JAVA works... $ECHO_C" >&6 if test "${ac_cv_prog_java_works+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else JAVA_TEST=Test.java CLASS_TEST=Test.class TEST=Test cat << \EOF > $JAVA_TEST /* [#]line 2651 "configure" */ public class Test { public static void main (String args[]) { System.exit (0); } } EOF if test x$ac_cv_prog_uudecode_base64 != xyes; then if { ac_try='$JAVAC $JAVACFLAGS $JAVA_TEST' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && test -s $CLASS_TEST; then : else echo "configure: failed program was:" >&5 cat $JAVA_TEST >&5 { { echo "$as_me:$LINENO: error: The Java compiler $JAVAC failed (see config.log, check the CLASSPATH?)" >&5 echo "$as_me: error: The Java compiler $JAVAC failed (see config.log, check the CLASSPATH?)" >&2;} { (exit 1); exit 1; }; } fi fi if { ac_try='CLASSPATH=.:$CLASSPATH $JAVA $JAVAFLAGS $TEST' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } >/dev/null 2>&1; then ac_cv_prog_java_works=yes else echo "configure: failed program was:" >&5 cat $JAVA_TEST >&5 { { echo "$as_me:$LINENO: error: The Java VM $JAVA failed (see config.log, check the CLASSPATH?)" >&5 echo "$as_me: error: The Java VM $JAVA failed (see config.log, check the CLASSPATH?)" >&2;} { (exit 1); exit 1; }; } fi rm -fr $JAVA_TEST $CLASS_TEST Test.uue fi echo "$as_me:$LINENO: result: $ac_cv_prog_java_works" >&5 echo "${ECHO_T}$ac_cv_prog_java_works" >&6 echo "$as_me:$LINENO: checking for JSSE" >&5 echo $ECHO_N "checking for JSSE... $ECHO_C" >&6 JSSE_JAR="" JSSE_CLASSPATH=. if test "x" != "x$CLASSPATH" ; then JSSE_CLASSPATH="$JSSE_CLASSPATH:$CLASSPATH" fi # Check whether --with-jsse or --without-jsse was given. if test "${with_jsse+set}" = set; then withval="$with_jsse" if test -r "${withval}" ; then JSSE_JAR="${withval}" JSSE_CLASSPATH="$JSSE_CLASSPATH:$JSSE_JAR" fi fi; cat << \EOF > Test.java /* [#]line 2715 "configure" */ public class Test { public static void main(String[] args) { try { Class.forName("javax.net.ssl.SSLSocket"); } catch (Throwable e) { System.exit(1); } } } EOF if { ac_try='$JAVAC $JAVACFLAGS Test.java' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && test -s Test.class && ($JAVA $JAVAFLAGS -classpath "$JSSE_CLASSPATH" Test; exit) 2>/dev/null then echo "$as_me:$LINENO: result: yes" >&5 echo "${ECHO_T}yes" >&6 else { { echo "$as_me:$LINENO: error: can't find JSSE classes; use --with-jsse" >&5 echo "$as_me: error: can't find JSSE classes; use --with-jsse" >&2;} { (exit 1); exit 1; }; } fi rm Test.java Test.class ac_config_files="$ac_config_files Makefile" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs, see configure's option --config-cache. # It is not useful on other systems. If it contains results you don't # want to keep, you may remove or edit it. # # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # # `ac_cv_env_foo' variables (set or unset) will be overridden when # loading this file, other *unset* `ac_cv_foo' will be assigned the # following values. _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, don't put newlines in cache variables' values. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. { (set) 2>&1 | case `(ac_space=' '; set | grep ac_space) 2>&1` in *ac_space=\ *) # `set' does not quote correctly, so add quotes (double-quote # substitution turns \\\\ into \\, and sed turns \\ into \). sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n \ "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p" ;; esac; } | sed ' t clear : clear s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ t end /^ac_cv_env/!s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ : end' >>confcache if diff $cache_file confcache >/dev/null 2>&1; then :; else if test -w $cache_file; then test "x$cache_file" != "x/dev/null" && echo "updating cache $cache_file" cat confcache >$cache_file else echo "not updating unwritable cache $cache_file" fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' # VPATH may cause trouble with some makes, so we remove $(srcdir), # ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=/{ s/:*\$(srcdir):*/:/; s/:*\${srcdir}:*/:/; s/:*@srcdir@:*/:/; s/^\([^=]*=[ ]*\):*/\1/; s/:*$//; s/^[^=]*=[ ]*$//; }' fi # Transform confdefs.h into DEFS. # Protect against shell expansion while executing Makefile rules. # Protect against Makefile macro expansion. # # If the first sed substitution is executed (which looks for macros that # take arguments), then we branch to the quote section. Otherwise, # look for a macro that doesn't take arguments. cat >confdef2opt.sed <<\_ACEOF t clear : clear s,^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*([^)]*)\)[ ]*\(.*\),-D\1=\2,g t quote s,^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\),-D\1=\2,g t quote d : quote s,[ `~#$^&*(){}\\|;'"<>?],\\&,g s,\[,\\&,g s,\],\\&,g s,\$,$$,g p _ACEOF # We use echo to avoid assuming a particular line-breaking character. # The extra dot is to prevent the shell from consuming trailing # line-breaks from the sub-command output. A line-break within # single-quotes doesn't work because, if this script is created in a # platform that uses two characters for line-breaks (e.g., DOS), tr # would break. ac_LF_and_DOT=`echo; echo .` DEFS=`sed -n -f confdef2opt.sed confdefs.h | tr "$ac_LF_and_DOT" ' .'` rm -f confdef2opt.sed ac_libobjs= ac_ltlibobjs= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_i=`echo "$ac_i" | sed 's/\$U\././;s/\.o$//;s/\.obj$//'` # 2. Add them. ac_libobjs="$ac_libobjs $ac_i\$U.$ac_objext" ac_ltlibobjs="$ac_ltlibobjs $ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs if test -z "${ENABLE_SMTP_TRUE}" && test -z "${ENABLE_SMTP_FALSE}"; then { { echo "$as_me:$LINENO: error: conditional \"ENABLE_SMTP\" was never defined. Usually this means the macro was only invoked conditionally." >&5 echo "$as_me: error: conditional \"ENABLE_SMTP\" was never defined. Usually this means the macro was only invoked conditionally." >&2;} { (exit 1); exit 1; }; } fi if test -z "${ENABLE_IMAP_TRUE}" && test -z "${ENABLE_IMAP_FALSE}"; then { { echo "$as_me:$LINENO: error: conditional \"ENABLE_IMAP\" was never defined. Usually this means the macro was only invoked conditionally." >&5 echo "$as_me: error: conditional \"ENABLE_IMAP\" was never defined. Usually this means the macro was only invoked conditionally." >&2;} { (exit 1); exit 1; }; } fi if test -z "${ENABLE_POP3_TRUE}" && test -z "${ENABLE_POP3_FALSE}"; then { { echo "$as_me:$LINENO: error: conditional \"ENABLE_POP3\" was never defined. Usually this means the macro was only invoked conditionally." >&5 echo "$as_me: error: conditional \"ENABLE_POP3\" was never defined. Usually this means the macro was only invoked conditionally." >&2;} { (exit 1); exit 1; }; } fi if test -z "${ENABLE_NNTP_TRUE}" && test -z "${ENABLE_NNTP_FALSE}"; then { { echo "$as_me:$LINENO: error: conditional \"ENABLE_NNTP\" was never defined. Usually this means the macro was only invoked conditionally." >&5 echo "$as_me: error: conditional \"ENABLE_NNTP\" was never defined. Usually this means the macro was only invoked conditionally." >&2;} { (exit 1); exit 1; }; } fi if test -z "${ENABLE_MBOX_TRUE}" && test -z "${ENABLE_MBOX_FALSE}"; then { { echo "$as_me:$LINENO: error: conditional \"ENABLE_MBOX\" was never defined. Usually this means the macro was only invoked conditionally." >&5 echo "$as_me: error: conditional \"ENABLE_MBOX\" was never defined. Usually this means the macro was only invoked conditionally." >&2;} { (exit 1); exit 1; }; } fi if test -z "${ENABLE_MAILDIR_TRUE}" && test -z "${ENABLE_MAILDIR_FALSE}"; then { { echo "$as_me:$LINENO: error: conditional \"ENABLE_MAILDIR\" was never defined. Usually this means the macro was only invoked conditionally." >&5 echo "$as_me: error: conditional \"ENABLE_MAILDIR\" was never defined. Usually this means the macro was only invoked conditionally." >&2;} { (exit 1); exit 1; }; } fi : ${CONFIG_STATUS=./config.status} ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { echo "$as_me:$LINENO: creating $CONFIG_STATUS" >&5 echo "$as_me: creating $CONFIG_STATUS" >&6;} cat >$CONFIG_STATUS <<_ACEOF #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF ## --------------------- ## ## M4sh Initialization. ## ## --------------------- ## # Be Bourne compatible if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then set -o posix fi DUALCASE=1; export DUALCASE # for MKS sh # Support unset when possible. if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then as_unset=unset else as_unset=false fi # Work around bugs in pre-3.0 UWIN ksh. $as_unset ENV MAIL MAILPATH PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. for as_var in \ LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \ LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \ LC_TELEPHONE LC_TIME do if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then eval $as_var=C; export $as_var else $as_unset $as_var fi done # Required to use basename. if expr a : '\(a\)' >/dev/null 2>&1; then as_expr=expr else as_expr=false fi if (basename /) >/dev/null 2>&1 && test "X`basename / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi # Name of the executable. as_me=`$as_basename "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)$' \| \ . : '\(.\)' 2>/dev/null || echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; } /^X\/\(\/\/\)$/{ s//\1/; q; } /^X\/\(\/\).*/{ s//\1/; q; } s/.*/./; q'` # PATH needs CR, and LINENO needs CR and PATH. # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then echo "#! /bin/sh" >conf$$.sh echo "exit 0" >>conf$$.sh chmod +x conf$$.sh if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then PATH_SEPARATOR=';' else PATH_SEPARATOR=: fi rm -f conf$$.sh fi as_lineno_1=$LINENO as_lineno_2=$LINENO as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` test "x$as_lineno_1" != "x$as_lineno_2" && test "x$as_lineno_3" = "x$as_lineno_2" || { # Find who we are. Look in the path if we contain no path at all # relative or not. case $0 in *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then { { echo "$as_me:$LINENO: error: cannot find myself; rerun with an absolute path" >&5 echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2;} { (exit 1); exit 1; }; } fi case $CONFIG_SHELL in '') as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for as_base in sh bash ksh sh5; do case $as_dir in /*) if ("$as_dir/$as_base" -c ' as_lineno_1=$LINENO as_lineno_2=$LINENO as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` test "x$as_lineno_1" != "x$as_lineno_2" && test "x$as_lineno_3" = "x$as_lineno_2" ') 2>/dev/null; then $as_unset BASH_ENV || test "${BASH_ENV+set}" != set || { BASH_ENV=; export BASH_ENV; } $as_unset ENV || test "${ENV+set}" != set || { ENV=; export ENV; } CONFIG_SHELL=$as_dir/$as_base export CONFIG_SHELL exec "$CONFIG_SHELL" "$0" ${1+"$@"} fi;; esac done done ;; esac # Create $as_me.lineno as a copy of $as_myself, but with $LINENO # uniformly replaced by the line number. The first 'sed' inserts a # line-number line before each line; the second 'sed' does the real # work. The second script uses 'N' to pair each line-number line # with the numbered line, and appends trailing '-' during # substitution so that $LINENO is not a special case at line end. # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the # second 'sed' script. Blame Lee E. McMahon for sed's syntax. :-) sed '=' <$as_myself | sed ' N s,$,-, : loop s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3, t loop s,-$,, s,^['$as_cr_digits']*\n,, ' >$as_me.lineno && chmod +x $as_me.lineno || { { echo "$as_me:$LINENO: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&5 echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2;} { (exit 1); exit 1; }; } # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensible to this). . ./$as_me.lineno # Exit status is that of the last command. exit } case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in *c*,-n*) ECHO_N= ECHO_C=' ' ECHO_T=' ' ;; *c*,* ) ECHO_N=-n ECHO_C= ECHO_T= ;; *) ECHO_N= ECHO_C='\c' ECHO_T= ;; esac if expr a : '\(a\)' >/dev/null 2>&1; then as_expr=expr else as_expr=false fi rm -f conf$$ conf$$.exe conf$$.file echo >conf$$.file if ln -s conf$$.file conf$$ 2>/dev/null; then # We could just check for DJGPP; but this test a) works b) is more generic # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04). if test -f conf$$.exe; then # Don't use ln at all; we don't have any links as_ln_s='cp -p' else as_ln_s='ln -s' fi elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -p' fi rm -f conf$$ conf$$.exe conf$$.file if mkdir -p . 2>/dev/null; then as_mkdir_p=: else test -d ./-p && rmdir ./-p as_mkdir_p=false fi as_executable_p="test -f" # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" # IFS # We need space, tab and new line, in precisely that order. as_nl=' ' IFS=" $as_nl" # CDPATH. $as_unset CDPATH exec 6>&1 # Open the log real soon, to keep \$[0] and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. Logging --version etc. is OK. exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX } >&5 cat >&5 <<_CSEOF This file was extended by gnumail $as_me 1.1.1, which was generated by GNU Autoconf 2.59. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ _CSEOF echo "on `(hostname || uname -n) 2>/dev/null | sed 1q`" >&5 echo >&5 _ACEOF # Files that config.status was made for. if test -n "$ac_config_files"; then echo "config_files=\"$ac_config_files\"" >>$CONFIG_STATUS fi if test -n "$ac_config_headers"; then echo "config_headers=\"$ac_config_headers\"" >>$CONFIG_STATUS fi if test -n "$ac_config_links"; then echo "config_links=\"$ac_config_links\"" >>$CONFIG_STATUS fi if test -n "$ac_config_commands"; then echo "config_commands=\"$ac_config_commands\"" >>$CONFIG_STATUS fi cat >>$CONFIG_STATUS <<\_ACEOF ac_cs_usage="\ \`$as_me' instantiates files from templates according to the current configuration. Usage: $0 [OPTIONS] [FILE]... -h, --help print this help, then exit -V, --version print version number, then exit -q, --quiet do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE Configuration files: $config_files Report bugs to ." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF ac_cs_version="\\ gnumail config.status 1.1.1 configured by $0, generated by GNU Autoconf 2.59, with options \\"`echo "$ac_configure_args" | sed 's/[\\""\`\$]/\\\\&/g'`\\" Copyright (C) 2003 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." srcdir=$srcdir INSTALL="$INSTALL" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF # If no file are specified by the user, then we need to provide default # value. By we need to know if files were specified by the user. ac_need_defaults=: while test $# != 0 do case $1 in --*=*) ac_option=`expr "x$1" : 'x\([^=]*\)='` ac_optarg=`expr "x$1" : 'x[^=]*=\(.*\)'` ac_shift=: ;; -*) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; *) # This is not an option, so the user has probably given explicit # arguments. ac_option=$1 ac_need_defaults=false;; esac case $ac_option in # Handling of the options. _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --vers* | -V ) echo "$ac_cs_version"; exit 0 ;; --he | --h) # Conflict between --help and --header { { echo "$as_me:$LINENO: error: ambiguous option: $1 Try \`$0 --help' for more information." >&5 echo "$as_me: error: ambiguous option: $1 Try \`$0 --help' for more information." >&2;} { (exit 1); exit 1; }; };; --help | --hel | -h ) echo "$ac_cs_usage"; exit 0 ;; --debug | --d* | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift CONFIG_FILES="$CONFIG_FILES $ac_optarg" ac_need_defaults=false;; --header | --heade | --head | --hea ) $ac_shift CONFIG_HEADERS="$CONFIG_HEADERS $ac_optarg" ac_need_defaults=false;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) { { echo "$as_me:$LINENO: error: unrecognized option: $1 Try \`$0 --help' for more information." >&5 echo "$as_me: error: unrecognized option: $1 Try \`$0 --help' for more information." >&2;} { (exit 1); exit 1; }; } ;; *) ac_config_targets="$ac_config_targets $1" ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF if \$ac_cs_recheck; then echo "running $SHELL $0 " $ac_configure_args \$ac_configure_extra_args " --no-create --no-recursion" >&6 exec $SHELL $0 $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF for ac_config_target in $ac_config_targets do case "$ac_config_target" in # Handling of arguments. "Makefile" ) CONFIG_FILES="$CONFIG_FILES Makefile" ;; *) { { echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5 echo "$as_me: error: invalid argument: $ac_config_target" >&2;} { (exit 1); exit 1; }; };; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason to put it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Create a temporary directory, and hook for its removal unless debugging. $debug || { trap 'exit_status=$?; rm -rf $tmp && exit $exit_status' 0 trap '{ (exit 1); exit 1; }' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d -q "./confstatXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" } || { tmp=./confstat$$-$RANDOM (umask 077 && mkdir $tmp) } || { echo "$me: cannot create a temporary directory in ." >&2 { (exit 1); exit 1; } } _ACEOF cat >>$CONFIG_STATUS <<_ACEOF # # CONFIG_FILES section. # # No need to generate the scripts if there are no CONFIG_FILES. # This happens for instance when ./config.status config.h if test -n "\$CONFIG_FILES"; then # Protect against being on the right side of a sed subst in config.status. sed 's/,@/@@/; s/@,/@@/; s/,;t t\$/@;t t/; /@;t t\$/s/[\\\\&,]/\\\\&/g; s/@@/,@/; s/@@/@,/; s/@;t t\$/,;t t/' >\$tmp/subs.sed <<\\CEOF s,@SHELL@,$SHELL,;t t s,@PATH_SEPARATOR@,$PATH_SEPARATOR,;t t s,@PACKAGE_NAME@,$PACKAGE_NAME,;t t s,@PACKAGE_TARNAME@,$PACKAGE_TARNAME,;t t s,@PACKAGE_VERSION@,$PACKAGE_VERSION,;t t s,@PACKAGE_STRING@,$PACKAGE_STRING,;t t s,@PACKAGE_BUGREPORT@,$PACKAGE_BUGREPORT,;t t s,@exec_prefix@,$exec_prefix,;t t s,@prefix@,$prefix,;t t s,@program_transform_name@,$program_transform_name,;t t s,@bindir@,$bindir,;t t s,@sbindir@,$sbindir,;t t s,@libexecdir@,$libexecdir,;t t s,@datadir@,$datadir,;t t s,@sysconfdir@,$sysconfdir,;t t s,@sharedstatedir@,$sharedstatedir,;t t s,@localstatedir@,$localstatedir,;t t s,@libdir@,$libdir,;t t s,@includedir@,$includedir,;t t s,@oldincludedir@,$oldincludedir,;t t s,@infodir@,$infodir,;t t s,@mandir@,$mandir,;t t s,@build_alias@,$build_alias,;t t s,@host_alias@,$host_alias,;t t s,@target_alias@,$target_alias,;t t s,@DEFS@,$DEFS,;t t s,@ECHO_C@,$ECHO_C,;t t s,@ECHO_N@,$ECHO_N,;t t s,@ECHO_T@,$ECHO_T,;t t s,@LIBS@,$LIBS,;t t s,@INSTALL_PROGRAM@,$INSTALL_PROGRAM,;t t s,@INSTALL_SCRIPT@,$INSTALL_SCRIPT,;t t s,@INSTALL_DATA@,$INSTALL_DATA,;t t s,@CYGPATH_W@,$CYGPATH_W,;t t s,@PACKAGE@,$PACKAGE,;t t s,@VERSION@,$VERSION,;t t s,@ACLOCAL@,$ACLOCAL,;t t s,@AUTOCONF@,$AUTOCONF,;t t s,@AUTOMAKE@,$AUTOMAKE,;t t s,@AUTOHEADER@,$AUTOHEADER,;t t s,@MAKEINFO@,$MAKEINFO,;t t s,@install_sh@,$install_sh,;t t s,@STRIP@,$STRIP,;t t s,@ac_ct_STRIP@,$ac_ct_STRIP,;t t s,@INSTALL_STRIP_PROGRAM@,$INSTALL_STRIP_PROGRAM,;t t s,@mkdir_p@,$mkdir_p,;t t s,@AWK@,$AWK,;t t s,@SET_MAKE@,$SET_MAKE,;t t s,@am__leading_dot@,$am__leading_dot,;t t s,@AMTAR@,$AMTAR,;t t s,@am__tar@,$am__tar,;t t s,@am__untar@,$am__untar,;t t s,@ENABLE_SMTP_TRUE@,$ENABLE_SMTP_TRUE,;t t s,@ENABLE_SMTP_FALSE@,$ENABLE_SMTP_FALSE,;t t s,@ENABLE_IMAP_TRUE@,$ENABLE_IMAP_TRUE,;t t s,@ENABLE_IMAP_FALSE@,$ENABLE_IMAP_FALSE,;t t s,@ENABLE_POP3_TRUE@,$ENABLE_POP3_TRUE,;t t s,@ENABLE_POP3_FALSE@,$ENABLE_POP3_FALSE,;t t s,@ENABLE_NNTP_TRUE@,$ENABLE_NNTP_TRUE,;t t s,@ENABLE_NNTP_FALSE@,$ENABLE_NNTP_FALSE,;t t s,@ENABLE_MBOX_TRUE@,$ENABLE_MBOX_TRUE,;t t s,@ENABLE_MBOX_FALSE@,$ENABLE_MBOX_FALSE,;t t s,@ENABLE_MAILDIR_TRUE@,$ENABLE_MAILDIR_TRUE,;t t s,@ENABLE_MAILDIR_FALSE@,$ENABLE_MAILDIR_FALSE,;t t s,@JAVAC@,$JAVAC,;t t s,@JAVADOC@,$JAVADOC,;t t s,@JAR@,$JAR,;t t s,@JAVAPREFIX@,$JAVAPREFIX,;t t s,@JAVACFLAGS@,$JAVACFLAGS,;t t s,@JAVAFLAGS@,$JAVAFLAGS,;t t s,@JAVADOCFLAGS@,$JAVADOCFLAGS,;t t s,@JAVA@,$JAVA,;t t s,@ACTIVATION_JAR@,$ACTIVATION_JAR,;t t s,@INETLIB_JAR@,$INETLIB_JAR,;t t s,@uudecode@,$uudecode,;t t s,@JSSE_JAR@,$JSSE_JAR,;t t s,@LIBOBJS@,$LIBOBJS,;t t s,@LTLIBOBJS@,$LTLIBOBJS,;t t CEOF _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF # Split the substitutions into bite-sized pieces for seds with # small command number limits, like on Digital OSF/1 and HP-UX. ac_max_sed_lines=48 ac_sed_frag=1 # Number of current file. ac_beg=1 # First line for current file. ac_end=$ac_max_sed_lines # Line after last line for current file. ac_more_lines=: ac_sed_cmds= while $ac_more_lines; do if test $ac_beg -gt 1; then sed "1,${ac_beg}d; ${ac_end}q" $tmp/subs.sed >$tmp/subs.frag else sed "${ac_end}q" $tmp/subs.sed >$tmp/subs.frag fi if test ! -s $tmp/subs.frag; then ac_more_lines=false else # The purpose of the label and of the branching condition is to # speed up the sed processing (if there are no `@' at all, there # is no need to browse any of the substitutions). # These are the two extra sed commands mentioned above. (echo ':t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b' && cat $tmp/subs.frag) >$tmp/subs-$ac_sed_frag.sed if test -z "$ac_sed_cmds"; then ac_sed_cmds="sed -f $tmp/subs-$ac_sed_frag.sed" else ac_sed_cmds="$ac_sed_cmds | sed -f $tmp/subs-$ac_sed_frag.sed" fi ac_sed_frag=`expr $ac_sed_frag + 1` ac_beg=$ac_end ac_end=`expr $ac_end + $ac_max_sed_lines` fi done if test -z "$ac_sed_cmds"; then ac_sed_cmds=cat fi fi # test -n "$CONFIG_FILES" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF for ac_file in : $CONFIG_FILES; do test "x$ac_file" = x: && continue # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". case $ac_file in - | *:- | *:-:* ) # input from stdin cat >$tmp/stdin ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; * ) ac_file_in=$ac_file.in ;; esac # Compute @srcdir@, @top_srcdir@, and @INSTALL@ for subdirectories. ac_dir=`(dirname "$ac_file") 2>/dev/null || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| \ . : '\(.\)' 2>/dev/null || echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } /^X\(\/\/\)[^/].*/{ s//\1/; q; } /^X\(\/\/\)$/{ s//\1/; q; } /^X\(\/\).*/{ s//\1/; q; } s/.*/./; q'` { if $as_mkdir_p; then mkdir -p "$ac_dir" else as_dir="$ac_dir" as_dirs= while test ! -d "$as_dir"; do as_dirs="$as_dir $as_dirs" as_dir=`(dirname "$as_dir") 2>/dev/null || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| \ . : '\(.\)' 2>/dev/null || echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } /^X\(\/\/\)[^/].*/{ s//\1/; q; } /^X\(\/\/\)$/{ s//\1/; q; } /^X\(\/\).*/{ s//\1/; q; } s/.*/./; q'` done test ! -n "$as_dirs" || mkdir $as_dirs fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5 echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;} { (exit 1); exit 1; }; }; } ac_builddir=. if test "$ac_dir" != .; then ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` # A "../" for each directory in $ac_dir_suffix. ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'` else ac_dir_suffix= ac_top_builddir= fi case $srcdir in .) # No --srcdir option. We are building in place. ac_srcdir=. if test -z "$ac_top_builddir"; then ac_top_srcdir=. else ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'` fi ;; [\\/]* | ?:[\\/]* ) # Absolute path. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ;; *) # Relative path. ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_builddir$srcdir ;; esac # Do not use `cd foo && pwd` to compute absolute paths, because # the directories may not exist. case `pwd` in .) ac_abs_builddir="$ac_dir";; *) case "$ac_dir" in .) ac_abs_builddir=`pwd`;; [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";; *) ac_abs_builddir=`pwd`/"$ac_dir";; esac;; esac case $ac_abs_builddir in .) ac_abs_top_builddir=${ac_top_builddir}.;; *) case ${ac_top_builddir}. in .) ac_abs_top_builddir=$ac_abs_builddir;; [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;; *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;; esac;; esac case $ac_abs_builddir in .) ac_abs_srcdir=$ac_srcdir;; *) case $ac_srcdir in .) ac_abs_srcdir=$ac_abs_builddir;; [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;; *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;; esac;; esac case $ac_abs_builddir in .) ac_abs_top_srcdir=$ac_top_srcdir;; *) case $ac_top_srcdir in .) ac_abs_top_srcdir=$ac_abs_builddir;; [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;; *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;; esac;; esac case $INSTALL in [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; *) ac_INSTALL=$ac_top_builddir$INSTALL ;; esac if test x"$ac_file" != x-; then { echo "$as_me:$LINENO: creating $ac_file" >&5 echo "$as_me: creating $ac_file" >&6;} rm -f "$ac_file" fi # Let's still pretend it is `configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ if test x"$ac_file" = x-; then configure_input= else configure_input="$ac_file. " fi configure_input=$configure_input"Generated from `echo $ac_file_in | sed 's,.*/,,'` by configure." # First look for the input files in the build tree, otherwise in the # src tree. ac_file_inputs=`IFS=: for f in $ac_file_in; do case $f in -) echo $tmp/stdin ;; [\\/$]*) # Absolute (can't be DOS-style, as IFS=:) test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 echo "$as_me: error: cannot find input file: $f" >&2;} { (exit 1); exit 1; }; } echo "$f";; *) # Relative if test -f "$f"; then # Build tree echo "$f" elif test -f "$srcdir/$f"; then # Source tree echo "$srcdir/$f" else # /dev/null tree { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 echo "$as_me: error: cannot find input file: $f" >&2;} { (exit 1); exit 1; }; } fi;; esac done` || { (exit 1); exit 1; } _ACEOF cat >>$CONFIG_STATUS <<_ACEOF sed "$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s,@configure_input@,$configure_input,;t t s,@srcdir@,$ac_srcdir,;t t s,@abs_srcdir@,$ac_abs_srcdir,;t t s,@top_srcdir@,$ac_top_srcdir,;t t s,@abs_top_srcdir@,$ac_abs_top_srcdir,;t t s,@builddir@,$ac_builddir,;t t s,@abs_builddir@,$ac_abs_builddir,;t t s,@top_builddir@,$ac_top_builddir,;t t s,@abs_top_builddir@,$ac_abs_top_builddir,;t t s,@INSTALL@,$ac_INSTALL,;t t " $ac_file_inputs | (eval "$ac_sed_cmds") >$tmp/out rm -f $tmp/stdin if test x"$ac_file" != x-; then mv $tmp/out $ac_file else cat $tmp/out rm -f $tmp/out fi done _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF { (exit 0); exit 0; } _ACEOF chmod +x $CONFIG_STATUS ac_clean_files=$ac_clean_files_save # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. # Unfortunately, on DOS this fails, as config.log is still kept open # by configure, so config.status won't be able to write to it; its # output is simply discarded. So we exec the FD to /dev/null, # effectively closing config.log, so it can be properly (re)opened and # appended to by config.status. When coming back to configure, we # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: ac_config_status_args= test "$silent" = yes && ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. $ac_cs_success || { (exit 1); exit 1; } fi mail-1.1.2/configure.ac0000664000076500007650000000543310614714012014304 0ustar dogdog00000000000000# Process this file with autoconf to produce a configure script. # # $Id: configure.ac,v 1.11 2005/08/25 12:31:12 dog Exp $ # Copyright (C) 2003 Nic Ferrier # # This file is part of GNU JavaMail. # # GNU JavaMail is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by the # Free Software Foundation; either version 2, or (at your option) any # later version. # # GNU JavaMail 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 # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with GNU JavaMail; see the file COPYING. If not, write to the # Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA # 02110-1301 USA. # AC_INIT(gnumail, 1.1.1) AC_CONFIG_SRCDIR(source/gnu/mail/providers/ReadOnlyMessage.java) AM_INIT_AUTOMAKE PACKAGE="mail" VERSION="1.1.1" AC_SUBST(PACKAGE) AC_SUBST(VERSION) AC_ARG_ENABLE(smtp, AC_HELP_STRING([--enable-smtp], [Enable the SMTP provider (default=yes).]), [case "$enableval" in no) enable_smtp=no ;; *) enable_smtp=yes ;; esac], [enable_smtp=yes]) AM_CONDITIONAL(ENABLE_SMTP, test "x$enable_smtp" = "xyes") AC_ARG_ENABLE(imap, AC_HELP_STRING([--enable-imap], [Enable the IMAP provider (default=yes).]), [case "$enableval" in no) enable_imap=no ;; *) enable_imap=yes ;; esac], [enable_imap=yes]) AM_CONDITIONAL(ENABLE_IMAP, test "x$enable_imap" = "xyes") AC_ARG_ENABLE(pop3, AC_HELP_STRING([--enable-pop3], [Enable the POP3 provider (default=yes).]), [case "$enableval" in no) enable_pop3=no ;; *) enable_pop3=yes ;; esac], [enable_pop3=yes]) AM_CONDITIONAL(ENABLE_POP3, test "x$enable_pop3" = "xyes") AC_ARG_ENABLE(nntp, AC_HELP_STRING([--enable-nntp], [Enable the NNTP provider (default=yes).]), [case "$enableval" in no) enable_nntp=no ;; *) enable_nntp=yes ;; esac], [enable_nntp=yes]) AM_CONDITIONAL(ENABLE_NNTP, test "x$enable_nntp" = "xyes") AC_ARG_ENABLE(mbox, AC_HELP_STRING([--enable-mbox], [Enable the mbox provider (default=yes).]), [case "$enableval" in no) enable_mbox=no ;; *) enable_mbox=yes ;; esac], [enable_mbox=yes]) AM_CONDITIONAL(ENABLE_MBOX, test "x$enable_mbox" = "xyes") AC_ARG_ENABLE(maildir, AC_HELP_STRING([--enable-maildir], [Enable the Maildir provider (default=yes).]), [case "$enableval" in no) enable_maildir=no ;; *) enable_maildir=yes ;; esac], [enable_maildir=yes]) AM_CONDITIONAL(ENABLE_MAILDIR, test "x$enable_maildir" = "xyes") AC_PROG_JAVAC AC_PROG_JAVADOC AC_PROG_JAR AC_JAVA_OPTIONS dnl AC_CHECK_CLASSPATH GNUMAIL_WITH_ACTIVATION_JAR GNUMAIL_WITH_INETLIB_JAR GNUMAIL_WITH_JSSE AC_CONFIG_FILES(Makefile) AC_OUTPUT mail-1.1.2/COPYING0000664000076500007650000004314110614714012013047 0ustar dogdog00000000000000 GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) 19yy This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program 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 General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) 19yy name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Library General Public License instead of this License. mail-1.1.2/INSTALL0000664000076500007650000000437210614714012013050 0ustar dogdog00000000000000Installing GNU JavaMail Dependencies GNU JavaMail depends on a JAF implementation and GNU inetlib. GNU distributes its own JAF implementation as part of the ClasspathX project: http://www.gnu.org/software/classpathx/ The GNU inetlib library is a separate module within the aegis of the Classpath project: http://www.gnu.org/software/classpath/ The latest release at time of writing is version 1.1.1: http://ftp.gnu.org/gnu/classpath/inetlib-1.1.1.tar.gz The configuration script will search for these jarfiles in some standard locations, or you can use the --with-activation-jar and --with-inetlib-jar configuration options to specify your own locations. At runtime, you will need to reference these libraries in your classpath along with the JavaMail jarfiles. Configuration The configure program configures GNU JavaMail for your system. The various programs required to build GNU JavaMail should be automatically identified. If they aren't, or you wish to override the default programs found, you can do so here. Set the environment variable corresponding to the program you wish to change befre running configure, e.g.: JAVAC=/my/special/javac ./configure The default should work for most environments: ./configure You can exclude specific providers from being built if you want to save space. Set the corresponding configuration option to "no", e.g.: ./configure --enable-nntp=no --enable-maildir=no A full list of configuration options is available by entering: ./configure --help at the command prompt. Building To build GNU JavaMail, type the following at the command prompt: make You may additionally build the API documentation in Javadoc format (you need the javadoc program in your PATH for this): make javadoc GNU JavaMail requires at least version 1.4 of the Java libraries. Installation To install, simply type: make install This installs gnumail.jar and gnumail-providers.jar in $(prefix)/share/java (see the configuration options to change the prefix variable). Ant build A simple Ant buildfile is included for platforms where GNU Make is not installed. This buildfile is not officially supported and may not provide options available during the standard autotools-based installation. $Author: dog $ $Date: 2007/04/26 10:16:51 $ mail-1.1.2/install-sh0000775000076500007650000001425310614714012014022 0ustar dogdog00000000000000#!/bin/sh # # install - install a program, script, or datafile # This comes from X11R5 (mit/util/scripts/install.sh). # # Copyright 1991 by the Massachusetts Institute of Technology # # Permission to use, copy, modify, distribute, and sell this software and its # documentation for any purpose is hereby granted without fee, provided that # the above copyright notice appear in all copies and that both that # copyright notice and this permission notice appear in supporting # documentation, and that the name of M.I.T. not be used in advertising or # publicity pertaining to distribution of the software without specific, # written prior permission. M.I.T. makes no representations about the # suitability of this software for any purpose. It is provided "as is" # without express or implied warranty. # # Calling this script install-sh is preferred over install.sh, to prevent # `make' implicit rules from creating a file called install from it # when there is no Makefile. # # This script is compatible with the BSD install script, but was written # from scratch. It can only install one file at a time, a restriction # shared with many OS's install programs. # set DOITPROG to echo to test this script # Don't use :- since 4.3BSD and earlier shells don't like it. doit="${DOITPROG-}" # put in absolute paths if you don't have them in your path; or use env. vars. mvprog="${MVPROG-mv}" cpprog="${CPPROG-cp}" chmodprog="${CHMODPROG-chmod}" chownprog="${CHOWNPROG-chown}" chgrpprog="${CHGRPPROG-chgrp}" stripprog="${STRIPPROG-strip}" rmprog="${RMPROG-rm}" mkdirprog="${MKDIRPROG-mkdir}" transformbasename="" transform_arg="" instcmd="$mvprog" chmodcmd="$chmodprog 0755" chowncmd="" chgrpcmd="" stripcmd="" rmcmd="$rmprog -f" mvcmd="$mvprog" src="" dst="" dir_arg="" while [ x"$1" != x ]; do case $1 in -c) instcmd=$cpprog shift continue;; -d) dir_arg=true shift continue;; -m) chmodcmd="$chmodprog $2" shift shift continue;; -o) chowncmd="$chownprog $2" shift shift continue;; -g) chgrpcmd="$chgrpprog $2" shift shift continue;; -s) stripcmd=$stripprog shift continue;; -t=*) transformarg=`echo $1 | sed 's/-t=//'` shift continue;; -b=*) transformbasename=`echo $1 | sed 's/-b=//'` shift continue;; *) if [ x"$src" = x ] then src=$1 else # this colon is to work around a 386BSD /bin/sh bug : dst=$1 fi shift continue;; esac done if [ x"$src" = x ] then echo "$0: no input file specified" >&2 exit 1 else : fi if [ x"$dir_arg" != x ]; then dst=$src src="" if [ -d "$dst" ]; then instcmd=: chmodcmd="" else instcmd=$mkdirprog fi else # Waiting for this to be detected by the "$instcmd $src $dsttmp" command # might cause directories to be created, which would be especially bad # if $src (and thus $dsttmp) contains '*'. if [ -f "$src" ] || [ -d "$src" ] then : else echo "$0: $src does not exist" >&2 exit 1 fi if [ x"$dst" = x ] then echo "$0: no destination specified" >&2 exit 1 else : fi # If destination is a directory, append the input filename; if your system # does not like double slashes in filenames, you may need to add some logic if [ -d "$dst" ] then dst=$dst/`basename "$src"` else : fi fi ## this sed command emulates the dirname command dstdir=`echo "$dst" | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'` # Make sure that the destination directory exists. # this part is taken from Noah Friedman's mkinstalldirs script # Skip lots of stat calls in the usual case. if [ ! -d "$dstdir" ]; then defaultIFS=' ' IFS="${IFS-$defaultIFS}" oIFS=$IFS # Some sh's can't handle IFS=/ for some reason. IFS='%' set - `echo "$dstdir" | sed -e 's@/@%@g' -e 's@^%@/@'` IFS=$oIFS pathcomp='' while [ $# -ne 0 ] ; do pathcomp=$pathcomp$1 shift if [ ! -d "$pathcomp" ] ; then $mkdirprog "$pathcomp" else : fi pathcomp=$pathcomp/ done fi if [ x"$dir_arg" != x ] then $doit $instcmd "$dst" && if [ x"$chowncmd" != x ]; then $doit $chowncmd "$dst"; else : ; fi && if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd "$dst"; else : ; fi && if [ x"$stripcmd" != x ]; then $doit $stripcmd "$dst"; else : ; fi && if [ x"$chmodcmd" != x ]; then $doit $chmodcmd "$dst"; else : ; fi else # If we're going to rename the final executable, determine the name now. if [ x"$transformarg" = x ] then dstfile=`basename "$dst"` else dstfile=`basename "$dst" $transformbasename | sed $transformarg`$transformbasename fi # don't allow the sed command to completely eliminate the filename if [ x"$dstfile" = x ] then dstfile=`basename "$dst"` else : fi # Make a couple of temp file names in the proper directory. dsttmp=$dstdir/#inst.$$# rmtmp=$dstdir/#rm.$$# # Trap to clean up temp files at exit. trap 'status=$?; rm -f "$dsttmp" "$rmtmp" && exit $status' 0 trap '(exit $?); exit' 1 2 13 15 # Move or copy the file name to the temp name $doit $instcmd "$src" "$dsttmp" && # and set any options; do chmod last to preserve setuid bits # If any of these fail, we abort the whole thing. If we want to # ignore errors from any of these, just make sure not to ignore # errors from the above "$doit $instcmd $src $dsttmp" command. if [ x"$chowncmd" != x ]; then $doit $chowncmd "$dsttmp"; else :;fi && if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd "$dsttmp"; else :;fi && if [ x"$stripcmd" != x ]; then $doit $stripcmd "$dsttmp"; else :;fi && if [ x"$chmodcmd" != x ]; then $doit $chmodcmd "$dsttmp"; else :;fi && # Now remove or move aside any old file at destination location. We try this # two ways since rm can't unlink itself on some systems and the destination # file might be busy for other reasons. In this case, the final cleanup # might fail but the new file should still install successfully. { if [ -f "$dstdir/$dstfile" ] then $doit $rmcmd -f "$dstdir/$dstfile" 2>/dev/null || $doit $mvcmd -f "$dstdir/$dstfile" "$rmtmp" 2>/dev/null || { echo "$0: cannot unlink or rename $dstdir/$dstfile" >&2 (exit 1); exit } else : fi } && # Now rename the file to the real destination. $doit $mvcmd "$dsttmp" "$dstdir/$dstfile" fi && # The final little trick to "correctly" pass the exit status to the exit trap. { (exit 0); exit } mail-1.1.2/javamail.address.map.in0000664000076500007650000000001410614714012016320 0ustar dogdog00000000000000rfc822=smtp mail-1.1.2/javamail.charset.map0000664000076500007650000001324610614714012015732 0ustar dogdog00000000000000# MIME -> Java US-ASCII ASCII ANSI_X3.4-1968 ASCII iso-ir-6 ASCII ANSI_X3.4-1986 ASCII ISO_646.irv:1991 ASCII ISO646-US ASCII us ASCII IBM367 ASCII cp367 ASCII csASCII ASCII csBig5 Big5 Big5-HKSCS Big5_HKSCS IBM037 Cp037 ebcdic-cp-us Cp037 ebcdic-cp-ca Cp037 ebcdic-cp-wt Cp037 ebcdic-cp-nl Cp037 csIBM037 Cp037 IBM273 Cp273 csIBM273 Cp273 IBM277 Cp277 EBCDIC-CP-DK Cp277 EBCDIC-CP-NO Cp277 csIBM277 Cp277 IBM278 Cp278 ebcdic-cp-fi Cp278 ebcdic-cp-se Cp278 csIBM278 Cp278 IBM280 Cp280 ebcdic-cp-it Cp280 csIBM280 Cp280 IBM284 Cp284 ebcdic-cp-es Cp284 csIBM284 Cp284 IBM285 Cp285 ebcdic-cp-gb Cp285 csIBM285 Cp285 IBM297 Cp297 ebcdic-cp-fr Cp297 csIBM297 Cp297 IBM420 Cp420 ebcdic-cp-ar1 Cp420 csIBM420 Cp420 IBM424 Cp424 ebcdic-cp-he Cp424 csIBM424 Cp424 IBM437 Cp437 437 Cp437 csPC8CodePage437 Cp437 IBM500 Cp500 ebcdic-cp-be Cp500 ebcdic-cp-ch Cp500 csIBM500 Cp500 IBM775 Cp775 csPC775Baltic Cp775 IBM850 Cp850 850 Cp850 csPC850Multilingual Cp850 IBM852 Cp852 852 Cp852 csPCp852 Cp852 IBM855 Cp855 855 Cp855 csIBM855 Cp855 IBM857 Cp857 857 Cp857 csIBM857 Cp857 IBM860 Cp860 860 Cp860 csIBM860 Cp860 IBM861 Cp861 861 Cp861 cp-is Cp861 csIBM861 Cp861 IBM862 Cp862 862 Cp862 csPC862LatinHebrew Cp862 IBM863 Cp863 863 Cp863 csIBM863 Cp863 IBM864 Cp864 csIBM864 Cp864 IBM865 Cp865 865 Cp865 csIBM865 Cp865 IBM866 Cp866 866 Cp866 csIBM866 Cp866 IBM868 Cp868 cp-ar Cp868 csIBM868 Cp868 IBM869 Cp869 869 Cp869 cp-gr Cp869 csIBM869 Cp869 IBM870 Cp870 ebcdic-cp-roece Cp870 ebcdic-cp-yu Cp870 csIBM870 Cp870 IBM871 Cp871 ebcdic-cp-is Cp871 csIBM871 Cp871 IBM918 Cp918 ebcdic-cp-ar2 Cp918 csIBM918 Cp918 IBM1026 Cp1026 csIBM1026 Cp1026 IBM1047 Cp1047 IBM01140 Cp1140 CCSID01140 Cp1140 CP01140 Cp1140 ebcdic-us-37+euro Cp1140 IBM01141 Cp1141 CCSID01141 Cp1141 CP01141 Cp1141 ebcdic-de-273+euro Cp1141 IBM01142 Cp1142 CCSID01142 Cp1142 CP01142 Cp1142 ebcdic-dk-277+euro Cp1142 ebcdic-no-277+euro Cp1142 IBM01143 Cp1143 CCSID01143 Cp1143 CP01143 Cp1143 ebcdic-fi-278+euro Cp1143 ebcdic-se-278+euro Cp1143 IBM01144 Cp1144 CCSID01144 Cp1144 CP01144 Cp1144 ebcdic-it-280+euro Cp1144 IBM01145 Cp1145 CCSID01145 Cp1145 CP01145 Cp1145 ebcdic-es-284+euro Cp1145 IBM01146 Cp1146 CCSID01146 Cp1146 CP01146 Cp1146 ebcdic-gb-285+euro Cp1146 IBM01147 Cp1147 CCSID01147 Cp1147 CP01147 Cp1147 ebcdic-fr-297+euro Cp1147 IBM01148 Cp1148 CCSID01148 Cp1148 CP01148 Cp1148 ebcdic-international-500+euro Cp1148 IBM01149 Cp1149 CCSID01149 Cp1149 CP01149 Cp1149 ebcdic-is-871+euro Cp1149 windows-1250 Cp1250 windows-1251 Cp1251 windows-1252 Cp1252 windows-1253 Cp1253 windows-1254 Cp1254 windows-1255 Cp1255 windows-1256 Cp1256 windows-1257 Cp1257 windows-1258 Cp1258 EUC-KR EUC_KR csEUCKR EUC_KR EUC-JP EUC_JP Extended_UNIX_Code_Packed_Format_for_Japanese EUC_JP csEUCPkdFmtJapanese EUC_JP CP936 GBK MS936 GBK windows-936 GBK ISO-2022-CN ISO2022_CN_CNS ISO-2022-CN-EXT ISO2022_CN_GB ISO-2022-JP ISO2022JP csISO2022JP ISO2022JP ISO-2022-KR ISO2022KR csISO2022KR ISO2022KR ISO_8859-1:1987 ISO8859_1 iso-ir-100 ISO8859_1 ISO_8859-1 ISO8859_1 ISO-8859-1 ISO8859_1 latin1 ISO8859_1 l1 ISO8859_1 IBM819 ISO8859_1 CP819 ISO8859_1 csISOLatin1 ISO8859_1 ISO_8859-2:1987 ISO8859_2 iso-ir-101 ISO8859_2 ISO_8859-2 ISO8859_2 ISO-8859-2 ISO8859_2 latin2 ISO8859_2 l2 ISO8859_2 csISOLatin2 ISO8859_2 ISO_8859-3:1988 ISO8859_3 iso-ir-109 ISO8859_3 ISO_8859-3 ISO8859_3 ISO-8859-3 ISO8859_3 latin3 ISO8859_3 l3 ISO8859_3 csISOLatin3 ISO8859_3 ISO_8859-4:1988 ISO8859_4 iso-ir-110 ISO8859_4 ISO_8859-4 ISO8859_4 ISO-8859-4 ISO8859_4 latin4 ISO8859_4 l4 ISO8859_4 csISOLatin4 ISO8859_4 ISO_8859-5:1988 ISO8859_5 iso-ir-144 ISO8859_5 ISO_8859-5 ISO8859_5 ISO-8859-5 ISO8859_5 cyrillic ISO8859_5 csISOLatinCyrillic ISO8859_5 ISO_8859-6:1987 ISO8859_6 iso-ir-127 ISO8859_6 ISO_8859-6 ISO8859_6 ISO-8859-6 ISO8859_6 ECMA-114 ISO8859_6 ASMO-708 ISO8859_6 arabic ISO8859_6 csISOLatinArabic ISO8859_6 ISO_8859-7:1987 ISO8859_7 iso-ir-126 ISO8859_7 ISO_8859-7 ISO8859_7 ISO-8859-7 ISO8859_7 ELOT_928 ISO8859_7 ECMA-118 ISO8859_7 greek ISO8859_7 greek8 ISO8859_7 csISOLatinGreek ISO8859_7 ISO_8859-8:1988 ISO8859_8 iso-ir-138 ISO8859_8 ISO_8859-8 ISO8859_8 ISO-8859-8 ISO8859_8 hebrew ISO8859_8 csISOLatinHebrew ISO8859_8 ISO_8859-9:1989 ISO8859_9 iso-ir-148 ISO8859_9 ISO_8859-9 ISO8859_9 ISO-8859-9 ISO8859_9 latin5 ISO8859_9 l5 ISO8859_9 csISOLatin5 ISO8859_9 ISO-8859-13 ISO8859_13 ISO-8859-15 ISO8859_15 KOI8-R KOI8_R csKOI8R KOI8_R Shift_JIS SJIS MS_Kanji SJIS csShiftJIS SJIS TIS-620 TIS620 UTF-8 UTF8 -- # Java -> MIME ASCII US-ASCII Big5 Big5 Big5_HKSCS Big5-HKSCS Cp1250 windows-1250 Cp1251 windows-1251 Cp1252 windows-1252 Cp1253 windows-1253 Cp1254 windows-1254 Cp1255 windows-1255 Cp1256 windows-1256 Cp1257 windows-1257 Cp1258 windows-1258 EUC_JP EUC-JP EUC_KR EUC-KR ISO2022_CN_CNS ISO-2022-CN ISO2022_CN_GB ISO-2022-CN-EXT ISO2022JP ISO-2022-JP ISO2022KR ISO-2022-KR 8859_1 ISO-8859-1 ISO8859_1 ISO-8859-1 8859_2 ISO-8859-2 ISO8859_2 ISO-8859-2 8859_3 ISO-8859-3 ISO8859_3 ISO-8859-3 8859_4 ISO-8859-4 ISO8859_4 ISO-8859-4 8859_5 ISO-8859-5 ISO8859_5 ISO-8859-5 8859_6 ISO-8859-6 ISO8859_6 ISO-8859-6 8859_7 ISO-8859-7 ISO8859_7 ISO-8859-7 8859_8 ISO-8859-8 ISO8859_8 ISO-8859-8 8859_9 ISO-8859-9 ISO8859_9 ISO-8859-9 8859_13 ISO-8859-13 ISO8859_13 ISO-8859-13 8859_15 ISO-8859-15 ISO8859_15 ISO-8859-15 KOI8_R KOI8-R SJIS Shift_JIS TIS620 TIS-620 UTF8 UTF-8 mail-1.1.2/javamail.providers.in0000664000076500007650000000213410614714012016141 0ustar dogdog00000000000000#if the user selected the mbox provider protocol=mbox; type=store; class=gnu.mail.providers.mbox.MboxStore; vendor=dog@gnu.org; #if the user selected the maildir provider protocol=maildir; type=store; class=gnu.mail.providers.maildir.MaildirStore; vendor=dog@gnu.org; #if the user selected the nntp provider protocol=nntp; type=store; class=gnu.mail.providers.nntp.NNTPStore; vendor=dog@gnu.org; protocol=nntp-post; type=transport; class=gnu.mail.providers.nntp.NNTPTransport; vendor=dog@gnu.org; #if the user selected the pop3 provider protocol=pop3; type=store; class=gnu.mail.providers.pop3.POP3Store; vendor=dog@gnu.org; #if the user selected the imap provider protocol=imap; type=store; class=gnu.mail.providers.imap.IMAPStore; vendor=dog@gnu.org; protocol=imaps; type=store; class=gnu.mail.providers.imap.IMAPStore; vendor=dog@gnu.org; #the user almost always needs SMTP protocol=smtp; type=transport; class=gnu.mail.providers.smtp.SMTPTransport; vendor=nferrier@tapsellferrier.co.uk; protocol=smtps; type=transport; class=gnu.mail.providers.smtp.SMTPTransport; vendor=nferrier@tapsellferrier.co.uk; mail-1.1.2/m4/0000775000076500007650000000000010614714024012334 5ustar dogdog00000000000000mail-1.1.2/m4/ac_check_class.m40000664000076500007650000000621210614714012015501 0ustar dogdog00000000000000dnl Available from the GNU Autoconf Macro Archive at: dnl http://www.gnu.org/software/ac-archive/htmldoc/ac_check_class.html dnl AC_DEFUN([AC_CHECK_CLASS],[ AC_REQUIRE([AC_PROG_JAVA]) ac_var_name=`echo $1 | sed 's/\./_/g'` dnl Normaly I'd use a AC_CACHE_CHECK here but since the variable name is dnl dynamic I need an extra level of extraction AC_MSG_CHECKING([for $1 class]) AC_CACHE_VAL(ac_cv_class_$ac_var_name, [ if test x$ac_cv_prog_uudecode_base64 = xyes; then dnl /** dnl * Test.java: used to test dynamicaly if a class exists. dnl */ dnl public class Test dnl { dnl dnl public static void dnl main( String[] argv ) dnl { dnl Class lib; dnl if (argv.length < 1) dnl { dnl System.err.println ("Missing argument"); dnl System.exit (77); dnl } dnl try dnl { dnl lib = Class.forName (argv[0]); dnl } dnl catch (ClassNotFoundException e) dnl { dnl System.exit (1); dnl } dnl lib = null; dnl System.exit (0); dnl } dnl dnl } cat << \EOF > Test.uue begin-base64 644 Test.class yv66vgADAC0AKQcAAgEABFRlc3QHAAQBABBqYXZhL2xhbmcvT2JqZWN0AQAE bWFpbgEAFihbTGphdmEvbGFuZy9TdHJpbmc7KVYBAARDb2RlAQAPTGluZU51 bWJlclRhYmxlDAAKAAsBAANlcnIBABVMamF2YS9pby9QcmludFN0cmVhbTsJ AA0ACQcADgEAEGphdmEvbGFuZy9TeXN0ZW0IABABABBNaXNzaW5nIGFyZ3Vt ZW50DAASABMBAAdwcmludGxuAQAVKExqYXZhL2xhbmcvU3RyaW5nOylWCgAV ABEHABYBABNqYXZhL2lvL1ByaW50U3RyZWFtDAAYABkBAARleGl0AQAEKEkp VgoADQAXDAAcAB0BAAdmb3JOYW1lAQAlKExqYXZhL2xhbmcvU3RyaW5nOylM amF2YS9sYW5nL0NsYXNzOwoAHwAbBwAgAQAPamF2YS9sYW5nL0NsYXNzBwAi AQAgamF2YS9sYW5nL0NsYXNzTm90Rm91bmRFeGNlcHRpb24BAAY8aW5pdD4B AAMoKVYMACMAJAoAAwAlAQAKU291cmNlRmlsZQEACVRlc3QuamF2YQAhAAEA AwAAAAAAAgAJAAUABgABAAcAAABtAAMAAwAAACkqvgSiABCyAAwSD7YAFBBN uAAaKgMyuAAeTKcACE0EuAAaAUwDuAAasQABABMAGgAdACEAAQAIAAAAKgAK AAAACgAAAAsABgANAA4ADgATABAAEwASAB4AFgAiABgAJAAZACgAGgABACMA JAABAAcAAAAhAAEAAQAAAAUqtwAmsQAAAAEACAAAAAoAAgAAAAQABAAEAAEA JwAAAAIAKA== ==== EOF if uudecode$EXEEXT Test.uue; then : else echo "configure: __oline__: uudecode had trouble decoding base 64 file 'Test.uue'" >&AC_FD_CC echo "configure: failed file was:" >&AC_FD_CC cat Test.uue >&AC_FD_CC ac_cv_prog_uudecode_base64=no fi rm -f Test.uue if AC_TRY_COMMAND(CLASSPATH=.:$CLASSPATH $JAVA $JAVAFLAGS Test $1) >/dev/null 2>&1; then eval "ac_cv_class_$ac_var_name=yes" else eval "ac_cv_class_$ac_var_name=no" fi rm -f Test.class else AC_TRY_COMPILE_JAVA([$1], , [eval "ac_cv_class_$ac_var_name=yes"], [eval "ac_cv_class_$ac_var_name=no"]) fi eval "ac_var_val=$`eval echo ac_cv_class_$ac_var_name`" eval "HAVE_$ac_var_name=$`echo ac_cv_class_$ac_var_val`" HAVE_LAST_CLASS=$ac_var_val if test x$ac_var_val = xyes; then ifelse([$2], , :, [$2]) else ifelse([$3], , :, [$3]) fi ]) dnl for some reason the above statment didn't fall though here? dnl do scripts have variable scoping? eval "ac_var_val=$`eval echo ac_cv_class_$ac_var_name`" AC_MSG_RESULT($ac_var_val) ]) mail-1.1.2/m4/ac_check_classpath.m40000664000076500007650000000051110614714012016352 0ustar dogdog00000000000000dnl Available from the GNU Autoconf Macro Archive at: dnl http://www.gnu.org/software/ac-archive/htmldoc/ac_check_classpath.html dnl AC_DEFUN([AC_CHECK_CLASSPATH],[ if test "x$CLASSPATH" = x; then echo "You have no CLASSPATH, I hope it is good" else echo "You have CLASSPATH $CLASSPATH, hope it is correct" fi ]) mail-1.1.2/m4/ac_check_home.m40000664000076500007650000000075110614714012015326 0ustar dogdog00000000000000dnl Available from the GNU Autoconf Macro Archive at: dnl http://www.gnu.org/software/ac-archive/htmldoc/ac_check_java_home.html dnl AC_DEFUN([AC_CHECK_JAVA_HOME],[ AC_REQUIRE([AC_EXEEXT])dnl TRY_JAVA_HOME=`ls -dr /usr/java/* 2> /dev/null | head -n 1` if test x$TRY_JAVA_HOME != x; then PATH=$PATH:$TRY_JAVA_HOME/bin fi AC_PATH_PROG(JAVA_PATH_NAME, java$EXEEXT) if test x$JAVA_PATH_NAME != x; then JAVA_HOME=`echo $JAVA_PATH_NAME | sed "s/\(.*\)[[/]]bin[[/]]java$EXEEXT$/\1/"` fi;dnl ]) mail-1.1.2/m4/ac_check_junit.m40000664000076500007650000000127310614714012015527 0ustar dogdog00000000000000dnl Available from the GNU Autoconf Macro Archive at: dnl http://www.gnu.org/software/ac-archive/htmldoc/ac_check_junit.html dnl AC_DEFUN([AC_CHECK_JUNIT],[ AC_CACHE_VAL(ac_cv_prog_JUNIT,[ AC_CHECK_CLASS(junit.textui.TestRunner) if test x"`eval 'echo $ac_cv_class_junit_textui_TestRunner'`" != xno ; then ac_cv_prog_JUNIT='$(CLASSPATH_ENV) $(JAVA) $(JAVAFLAGS) junit.textui.TestRunner' fi]) AC_MSG_CHECKING([for junit]) if test x"`eval 'echo $ac_cv_prog_JUNIT'`" != x ; then JUNIT="$ac_cv_prog_JUNIT" JAVA_JUNIT='$(JAVA_JUNIT)' TESTS_JUNIT='$(TESTS_JUNIT)' else JUNIT= JAVA_JUNIT= TESTS_JUNIT= fi AC_MSG_RESULT($JAVA_JUNIT) AC_SUBST(JUNIT) AC_SUBST(JAVA_JUNIT) AC_SUBST(TESTS_JUNIT)]) mail-1.1.2/m4/ac_check_rqrd_class.m40000664000076500007650000000050310614714012016526 0ustar dogdog00000000000000dnl Available from the GNU Autoconf Macro Archive at: dnl http://www.gnu.org/software/ac-archive/htmldoc/ac_check_rqrd_class.html dnl AC_DEFUN([AC_CHECK_RQRD_CLASS],[ CLASS=`echo $1|sed 's/\./_/g'` AC_CHECK_CLASS($1) if test "$HAVE_LAST_CLASS" = "no"; then AC_MSG_ERROR([Required class $1 missing, exiting.]) fi ]) mail-1.1.2/m4/ac_java_options.m40000664000076500007650000000162510614714012015736 0ustar dogdog00000000000000dnl Available from the GNU Autoconf Macro Archive at: dnl http://www.gnu.org/software/ac-archive/htmldoc/ac_java_options.html dnl AC_DEFUN([AC_JAVA_OPTIONS],[ AC_ARG_WITH(java-prefix, [ --with-java-prefix=PFX prefix where Java runtime is installed (optional)]) AC_ARG_WITH(javac-flags, [ --with-javac-flags=FLAGS flags to pass to the Java compiler (optional)]) AC_ARG_WITH(java-flags, [ --with-java-flags=FLAGS flags to pass to the Java VM (optional)]) AC_ARG_WITH(javadoc-flags, [ --with-javadoc-flags=FLAGS flags to pass to the Javadoc generator (optional)]) JAVAPREFIX=$with_java_prefix JAVACFLAGS=$with_javac_flags JAVAFLAGS=$with_java_flags JAVADOCFLAGS=$with_javadoc_flags AC_SUBST(JAVAPREFIX)dnl AC_SUBST(JAVACFLAGS)dnl AC_SUBST(JAVAFLAGS)dnl AC_SUBST(JAVADOCFLAGS)dnl AC_SUBST(JAVA)dnl AC_SUBST(JAVAC)dnl ]) mail-1.1.2/m4/ac_prog_jar.m40000664000076500007650000000326710614714012015051 0ustar dogdog00000000000000dnl Available from the GNU Autoconf Macro Archive at: dnl http://www.gnu.org/software/ac-archive/htmldoc/ac_prog_jar.html dnl dnl Changes for gjdoc: dnl - check for "fastjar, jar", not only "jar"; dnl - output warning if detected jar is kaffe jar. dnl AC_DEFUN([AC_PROG_JAR],[ AC_REQUIRE([AC_EXEEXT])dnl if test "x$JAVAPREFIX" = x; then test "x$JAR" = x && AC_CHECK_PROGS(JAR, fastjar$EXEEXT jar$EXEEXT) else test "x$JAR" = x && AC_CHECK_PROGS(JAR, fastjar$EXEEXT jar$EXEEXT, $JAVAPREFIX) fi dnl Complain if not found test "x$JAR" = "x" && AC_MSG_ERROR([no acceptable jar program found in \$PATH]) dnl Strip any parameters sed_expr_param=['s/[ ][^"]*$//'] jarabs=`echo $JAR | sed -e "$sed_expr_param"` dnl Convert ~/ to $HOME/ sed_expr_home="s|^~/|$HOME/|" jarabs=`echo $jarabs | sed -e "$sed_expr_home"` dnl If not already absolute filename, find on PATH sed_expr_abspath=['s/^~?\/.*$//'] if (test `echo $jarabs | sed -e "$sed_expr_abspath"`); then dnl Stolen from libtool.m4: lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for dir in $PATH; do IFS="$lt_save_ifs" if (test -f $dir/$jarabs || test -f $dir/$jarabs$ac_exeext); then jarabs="$dir/$jarabs" break fi done fi dnl Warn if it's the kaffe jar grep 'kaffe\.tools\.jar\.Jar' "$jarabs" >/dev/null test "$?" != "0" || \ AC_MSG_WARN([ The build seems to be using the Jar tool that comes with Kaffe. Note that there are known issues in some versions of this tool. Unfortunately it does not support any --version option, so I can't detect whether your version works. If you see error messages from the Jar tool, or the build hangs, please set environment variable JAR to a working Jar tool. ]) AC_PROVIDE([$0])dnl ]) mail-1.1.2/m4/ac_prog_java.m40000664000076500007650000000132010614714012015202 0ustar dogdog00000000000000dnl Available from the GNU Autoconf Macro Archive at: dnl http://www.gnu.org/software/ac-archive/htmldoc/ac_prog_java.html dnl dnl Changes for classpathx: check for "jamvm, kaffe, sablevm, cacao, gij, java", not only "kaffe, java" dnl AC_DEFUN([AC_PROG_JAVA],[ AC_REQUIRE([AC_EXEEXT])dnl if test x$JAVAPREFIX = x; then test x$JAVA = x && AC_CHECK_PROGS(JAVA, jamvm$EXEEXT kaffe$EXEEXT sablevm$EXEEXT cacao$EXEEXT gij$EXEEXT java$EXEEXT) else test x$JAVA = x && AC_CHECK_PROGS(JAVA, jamvm$EXEEXT kaffe$EXEEXT sablevm$EXEEXT cacao$EXEEXT gij$EXEEXT java$EXEEXT, $JAVAPREFIX) fi test x$JAVA = x && AC_MSG_ERROR([no acceptable Java virtual machine found in \$PATH]) AC_PROG_JAVA_WORKS AC_PROVIDE([$0])dnl ]) mail-1.1.2/m4/ac_prog_java_cc.m40000664000076500007650000000201510614714012015651 0ustar dogdog00000000000000dnl Available from the GNU Autoconf Macro Archive at: dnl http://www.gnu.org/software/ac-archive/htmldoc/ac_prog_java_cc.html dnl # AC_PROG_JAVA_CC([COMPILER ...]) # -------------------------- # COMPILER ... is a space separated list of java compilers to search for. # This just gives the user an opportunity to specify an alternative # search list for the java compiler. AC_DEFUN([AC_PROG_JAVA_CC], [AC_ARG_VAR([JAVA_CC], [java compiler command])dnl AC_ARG_VAR([JAVA_CC_FLAGS], [java compiler flags])dnl m4_ifval([$1], [AC_CHECK_TOOLS(JAVA_CC, [$1])], [AC_CHECK_TOOL(JAVA_CC, gcj) if test -z "$JAVA_CC"; then AC_CHECK_TOOL(JAVA_CC, javac) fi if test -z "$JAVA_CC"; then AC_CHECK_TOOL(JAVA_CC, jikes) fi ]) if test "$JAVA_CC" = "gcj"; then if test "$GCJ_OPTS" = ""; then AC_SUBST(GCJ_OPTS,-C) fi AC_SUBST(JAVA_CC_OPTS, @GCJ_OPTS@, [Define the compilation options for GCJ]) fi test -z "$JAVA_CC" && AC_MSG_ERROR([no acceptable java compiler found in \$PATH]) ])# AC_PROG_JAVA_CC mail-1.1.2/m4/ac_prog_java_works.m40000664000076500007650000000647110614714012016443 0ustar dogdog00000000000000dnl Available from the GNU Autoconf Macro Archive at: dnl http://www.gnu.org/software/ac-archive/htmldoc/ac_prog_java_works.html dnl AC_DEFUN([AC_PROG_JAVA_WORKS], [ AC_CHECK_PROG(uudecode, uudecode$EXEEXT, yes) if test x$uudecode = xyes; then AC_CACHE_CHECK([if uudecode can decode base 64 file], ac_cv_prog_uudecode_base64, [ dnl /** dnl * Test.java: used to test if java compiler works. dnl */ dnl public class Test dnl { dnl dnl public static void dnl main( String[] argv ) dnl { dnl System.exit (0); dnl } dnl dnl } cat << \EOF > Test.uue begin-base64 644 Test.class yv66vgADAC0AFQcAAgEABFRlc3QHAAQBABBqYXZhL2xhbmcvT2JqZWN0AQAE bWFpbgEAFihbTGphdmEvbGFuZy9TdHJpbmc7KVYBAARDb2RlAQAPTGluZU51 bWJlclRhYmxlDAAKAAsBAARleGl0AQAEKEkpVgoADQAJBwAOAQAQamF2YS9s YW5nL1N5c3RlbQEABjxpbml0PgEAAygpVgwADwAQCgADABEBAApTb3VyY2VG aWxlAQAJVGVzdC5qYXZhACEAAQADAAAAAAACAAkABQAGAAEABwAAACEAAQAB AAAABQO4AAyxAAAAAQAIAAAACgACAAAACgAEAAsAAQAPABAAAQAHAAAAIQAB AAEAAAAFKrcAErEAAAABAAgAAAAKAAIAAAAEAAQABAABABMAAAACABQ= ==== EOF if uudecode$EXEEXT Test.uue; then ac_cv_prog_uudecode_base64=yes else echo "configure: __oline__: uudecode had trouble decoding base 64 file 'Test.uue'" >&AC_FD_CC echo "configure: failed file was:" >&AC_FD_CC cat Test.uue >&AC_FD_CC ac_cv_prog_uudecode_base64=no fi rm -f Test.uue]) fi if test x$ac_cv_prog_uudecode_base64 != xyes; then rm -f Test.class AC_MSG_WARN([I have to compile Test.class from scratch]) if test x$ac_cv_prog_javac_works = xno; then AC_MSG_ERROR([Cannot compile java source. $JAVAC does not work properly]) fi if test x$ac_cv_prog_javac_works = x; then AC_PROG_JAVAC fi fi AC_CACHE_CHECK(if $JAVA works, ac_cv_prog_java_works, [ JAVA_TEST=Test.java CLASS_TEST=Test.class TEST=Test changequote(, )dnl cat << \EOF > $JAVA_TEST /* [#]line __oline__ "configure" */ public class Test { public static void main (String args[]) { System.exit (0); } } EOF changequote([, ])dnl if test x$ac_cv_prog_uudecode_base64 != xyes; then if AC_TRY_COMMAND($JAVAC $JAVACFLAGS $JAVA_TEST) && test -s $CLASS_TEST; then : else echo "configure: failed program was:" >&AC_FD_CC cat $JAVA_TEST >&AC_FD_CC AC_MSG_ERROR(The Java compiler $JAVAC failed (see config.log, check the CLASSPATH?)) fi fi if AC_TRY_COMMAND(CLASSPATH=.:$CLASSPATH $JAVA $JAVAFLAGS $TEST) >/dev/null 2>&1; then ac_cv_prog_java_works=yes else echo "configure: failed program was:" >&AC_FD_CC cat $JAVA_TEST >&AC_FD_CC AC_MSG_ERROR(The Java VM $JAVA failed (see config.log, check the CLASSPATH?)) fi rm -fr $JAVA_TEST $CLASS_TEST Test.uue ]) AC_PROVIDE([$0])dnl ] ) dnl Available from the GNU Autoconf Macro Archive at: dnl http://www.gnu.org/software/ac-archive/htmldoc/ac_try_compile_java.html dnl AC_DEFUN([AC_TRY_COMPILE_JAVA],[ AC_REQUIRE([AC_PROG_JAVAC])dnl cat << \EOF > Test.java /* [#]line __oline__ "configure" */ ifelse([$1], , , [import $1;]) public class Test { [$2] } EOF if AC_TRY_COMMAND($JAVAC $JAVACFLAGS Test.java) && test -s Test.class then dnl Don't remove the temporary files here, so they can be examined. ifelse([$3], , :, [$3]) else echo "configure: failed program was:" >&AC_FD_CC cat Test.java >&AC_FD_CC ifelse([$4], , , [ rm -fr Test* $4 ])dnl fi rm -fr Test*]) mail-1.1.2/m4/ac_prog_javac.m40000664000076500007650000000216010614714012015350 0ustar dogdog00000000000000dnl Available from the GNU Autoconf Macro Archive at: dnl http://www.gnu.org/software/ac-archive/htmldoc/ac_prog_javac.html dnl AC_DEFUN([AC_PROG_JAVAC],[ AC_REQUIRE([AC_EXEEXT])dnl if test "x$JAVAPREFIX" = x; then test "x$JAVAC" = x && AC_CHECK_PROGS(JAVAC, "gcj$EXEEXT -C" jikes$EXEEXT ejc$EXEEXT guavac$EXEEXT javac$EXEEXT) else test "x$JAVAC" = x && AC_CHECK_PROGS(JAVAC, "gcj$EXEEXT -C" jikes$EXEEXT ejc$EXEEXT guavac$EXEEXT javac$EXEEXT, $JAVAPREFIX) fi test "x$JAVAC" = x && AC_MSG_ERROR([no acceptable Java compiler found in \$PATH]) AC_PROG_JAVAC_WORKS (echo "$JAVAC" | grep -e " -C$" >/dev/null 2>/dev/null) && AC_MSG_WARN([ The build seems to be using gcj for bytecode generation. Some versions of gcj are known to produce bad bytecode. See here for a list of bugs that may be relevant: http://gcc.gnu.org/bugzilla/buglist.cgi?component=java&keywords=wrong-code&order=default At least bug 19921 is known to affect gjdoc (in Feb 2005). You may want to set the environment variable JAVAC to an alternate compiler, such as jikes, to make sure that you end up with valid bytecode. ]); AC_PROVIDE([$0])dnl ]) mail-1.1.2/m4/ac_prog_javac_works.m40000664000076500007650000000130710614714012016577 0ustar dogdog00000000000000dnl Available from the GNU Autoconf Macro Archive at: dnl http://www.gnu.org/software/ac-archive/htmldoc/ac_prog_javac_works.html dnl AC_DEFUN([AC_PROG_JAVAC_WORKS],[ AC_CACHE_CHECK([if $JAVAC works], ac_cv_prog_javac_works, [ JAVA_TEST=Test.java CLASS_TEST=Test.class cat << \EOF > $JAVA_TEST /* [#]line __oline__ "configure" */ public class Test { } EOF if AC_TRY_COMMAND($JAVAC $JAVACFLAGS -classpath .:$CLASSPATH $JAVA_TEST) >/dev/null 2>&1; then ac_cv_prog_javac_works=yes else AC_MSG_ERROR([The Java compiler $JAVAC failed (see config.log, check the CLASSPATH?)]) echo "configure: failed program was:" >&AC_FD_CC cat $JAVA_TEST >&AC_FD_CC fi rm -f $JAVA_TEST $CLASS_TEST ]) AC_PROVIDE([$0])dnl ]) mail-1.1.2/m4/ac_prog_javadoc.m40000664000076500007650000000113010614714012015667 0ustar dogdog00000000000000dnl Available from the GNU Autoconf Macro Archive at: dnl http://www.gnu.org/software/ac-archive/htmldoc/ac_prog_javadoc.html dnl dnl Changes for classpathx: check for "gjdoc, javadoc" not just "javadoc" dnl AC_DEFUN([AC_PROG_JAVADOC],[ AC_REQUIRE([AC_EXEEXT])dnl if test "x$JAVAPREFIX" = x; then test "x$JAVADOC" = x && AC_CHECK_PROGS(JAVADOC, gjdoc$EXEEXT javadoc$EXEEXT) else test "x$JAVADOC" = x && AC_CHECK_PROGS(JAVADOC, gjdoc$EXEEXT javadoc$EXEEXT, $JAVAPREFIX) fi test "x$JAVADOC" = x && AC_MSG_ERROR([no acceptable javadoc generator found in \$PATH]) AC_PROVIDE([$0])dnl ]) mail-1.1.2/m4/ac_prog_javah.m40000664000076500007650000000212210614714012015353 0ustar dogdog00000000000000dnl Available from the GNU Autoconf Macro Archive at: dnl http://www.gnu.org/software/ac-archive/htmldoc/ac_prog_javah.html dnl AC_DEFUN([AC_PROG_JAVAH],[ AC_REQUIRE([AC_CANONICAL_SYSTEM])dnl AC_REQUIRE([AC_PROG_CPP])dnl if test "x$JAVAPREFIX" = x; then test "x$JAVAH" = x && AC_CHECK_PROGS(JAVAH, gcjh$EXEEXT javah$EXEEXT) else test "x$JAVAH" = x && AC_CHECK_PROGS(JAVAH, gcjh$EXEEXT javah$EXEEXT, $JAVAPREFIX) fi test "x$JAVAH" = x && AC_MSG_ERROR([no acceptable JNI header file generator found in \$PATH]) AC_PROVIDE([$0])dnl if test x"`eval 'echo $ac_cv_path_JAVAH'`" != x ; then AC_TRY_CPP([#include ],,[ ac_save_CPPFLAGS="$CPPFLAGS" changequote(, )dnl ac_dir=`echo $ac_cv_path_JAVAH | sed 's,\(.*\)/[^/]*/[^/]*$,\1/include,'` ac_machdep=`echo $build_os | sed 's,[-0-9].*,,' | sed 's,cygwin,win32,'` changequote([, ])dnl CPPFLAGS="$ac_save_CPPFLAGS -I$ac_dir -I$ac_dir/$ac_machdep" AC_TRY_CPP([#include ], ac_save_CPPFLAGS="$CPPFLAGS", AC_MSG_WARN([unable to include ])) CPPFLAGS="$ac_save_CPPFLAGS"]) fi ]) mail-1.1.2/m4/ac_try_run_javac.m40000664000076500007650000000132610614714012016106 0ustar dogdog00000000000000dnl Available from the GNU Autoconf Macro Archive at: dnl http://www.gnu.org/software/ac-archive/htmldoc/ac_try_run_javac.html dnl AC_DEFUN([AC_TRY_RUN_JAVA],[ AC_REQUIRE([AC_PROG_JAVAC])dnl AC_REQUIRE([AC_PROG_JAVA])dnl cat << \EOF > Test.java /* [#]line __oline__ "configure" */ ifelse([$1], , , [include $1;]) public class Test { [$2] } EOF if AC_TRY_COMMAND($JAVAC $JAVACFLAGS Test.java) && test -s Test.class && (CLASSPATH=.:$CLASSPATH $JAVA $JAVAFLAGS Test; exit) 2>/dev/null then dnl Don't remove the temporary files here, so they can be examined. ifelse([$3], , :, [$3]) else echo "configure: failed program was:" >&AC_FD_CC cat Test.java >&AC_FD_CC ifelse([$4], , , [ rm -fr Test* $4 ])dnl fi rm -fr Test*]) mail-1.1.2/m4/am_prog_gcj.m40000664000076500007650000000211510614714012015041 0ustar dogdog00000000000000# Check for Java compiler. # For now we only handle the GNU compiler. # Copyright (C) 1999, 2000, 2003 Free Software Foundation, Inc. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # This program 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 General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA # 02110-1301, USA. AC_DEFUN([AM_PROG_GCJ],[ AC_CHECK_PROGS(GCJ, gcj, false) test -z "$GCJ" && AC_MSG_ERROR([no acceptable gcj found in \$PATH]) if test "x${GCJFLAGS-unset}" = xunset; then GCJFLAGS="-g -O2" fi AC_SUBST(GCJFLAGS) _AM_IF_OPTION([no-dependencies],, [_AM_DEPENDENCIES(GCJ)]) ]) mail-1.1.2/m4/gnumail_with_activation_jar.m40000664000076500007650000000310310614714012020334 0ustar dogdog00000000000000dnl @synopsis GNUMAIL_WITH_ACTIVATION_JAR dnl AC_DEFUN([GNUMAIL_WITH_ACTIVATION_JAR],[ AC_ARG_WITH([activation_jar], AC_HELP_STRING([--with-activation-jar=DIR], [path to JAF (activation.jar). If unspecified, /usr/share/java and /usr/local/share/java are searched, in that order.]), [if test "x${withval}" != x ; then AC_MSG_CHECKING([for ${withval}/activation.jar]) if test -r ${withval}/activation.jar ; then AC_MSG_RESULT(yes) ACTIVATION_JAR=${withval}/activation.jar found_activation_jar=true else AC_MSG_ERROR([can't find activation.jar in specified path]) fi fi], [found_activation_jar=false]) if test "x${ACTIVATION_JAR}" = x ; then dnl AC_MSG_NOTICE([no value supplied, searching default locations]) _GNUMAIL_FIND_ACTIVATION_JAR([/usr/share/java /usr/local/share/java ${prefix}/share/java]) if test "x${ACTIVATION_JAR}" = x; then AC_MSG_ERROR([can't find activation.jar; use --with-activation-jar]) fi fi AC_SUBST(ACTIVATION_JAR) ]) dnl @synopsis _GNUMAIL_FIND_ACTIVATION_JAR dnl AC_DEFUN([_GNUMAIL_FIND_ACTIVATION_JAR],[ AC_MSG_CHECKING([for activation.jar]) for _F in $1 ;do if test -r ${_F}/activation.jar ; then ACTIVATION_JAR=${_F}/activation.jar break fi done if test x${ACTIVATION_JAR} = x ; then AC_MSG_RESULT([not found]) else AC_MSG_RESULT([${ACTIVATION_JAR}]) fi]) mail-1.1.2/m4/gnumail_with_inetlib_jar.m40000664000076500007650000000303210614714012017622 0ustar dogdog00000000000000dnl @synopsis GNUMAIL_WITH_INETLIB_JAR dnl AC_DEFUN([GNUMAIL_WITH_INETLIB_JAR],[ AC_ARG_WITH([inetlib_jar], AC_HELP_STRING([--with-inetlib-jar=DIR], [path to GNU inetlib (inetlib.jar). If unspecified, /usr/share/java and /usr/local/share/java are searched, in that order.]), [if test "x${withval}" != x; then AC_MSG_CHECKING([for ${withval}/inetlib.jar]) if test -r ${withval}/inetlib.jar ; then AC_MSG_RESULT(yes) INETLIB_JAR=${withval}/inetlib.jar found_inetlib_jar=true else AC_MSG_ERROR([can't find inetlib.jar in specified path]) fi fi], [found_inetlib_jar=false]) if test "x${INETLIB_JAR}" = x ;then dnl AC_MSG_NOTICE([no value supplied, searching default locations]) _GNUMAIL_FIND_INETLIB_JAR([/usr/share/java /usr/local/share/java ${prefix}/share/java]) if test "x${INETLIB_JAR}" = x; then AC_MSG_ERROR([can't find inetlib.jar; use --with-inetlib-jar]) fi found_inetlib_jar=true fi AC_SUBST(INETLIB_JAR) ]) dnl @synopsis _GNUMAIL_FIND_INETLIB_JAR dnl AC_DEFUN([_GNUMAIL_FIND_INETLIB_JAR],[ AC_MSG_CHECKING([for inetlib.jar]) for _F in $1 ;do if test -r ${_F}/inetlib.jar ; then INETLIB_JAR=${_F}/inetlib.jar break fi done if test x${INETLIB_JAR} = x ; then AC_MSG_RESULT([not found]) else AC_MSG_RESULT([${INETLIB_JAR}]) fi]) mail-1.1.2/m4/gnumail_with_jsse.m40000664000076500007650000000201310614714012016302 0ustar dogdog00000000000000dnl @synopsis GNUMAIL_WITH_JSSE dnl AC_DEFUN([GNUMAIL_WITH_JSSE],[ AC_REQUIRE([AC_PROG_JAVAC])dnl AC_REQUIRE([AC_PROG_JAVA])dnl AC_MSG_CHECKING([for JSSE]) JSSE_JAR="" JSSE_CLASSPATH=. if test "x" != "x$CLASSPATH" ; then JSSE_CLASSPATH="$JSSE_CLASSPATH:$CLASSPATH" fi AC_ARG_WITH([jsse], AC_HELP_STRING([--with-jsse=FILE], [path to external JSSE library]), [ if test -r "${withval}" ; then JSSE_JAR="${withval}" JSSE_CLASSPATH="$JSSE_CLASSPATH:$JSSE_JAR" fi ]) changequote(, )dnl cat << \EOF > Test.java /* [#]line __oline__ "configure" */ public class Test { public static void main(String[] args) { try { Class.forName("javax.net.ssl.SSLSocket"); } catch (Throwable e) { System.exit(1); } } } EOF changequote([, ])dnl if AC_TRY_COMMAND($JAVAC $JAVACFLAGS Test.java) && test -s Test.class && ($JAVA $JAVAFLAGS -classpath "$JSSE_CLASSPATH" Test; exit) 2>/dev/null then AC_MSG_RESULT(yes) else AC_MSG_ERROR([can't find JSSE classes; use --with-jsse]) fi rm Test.java Test.class AC_SUBST(JSSE_JAR) ]) mail-1.1.2/mailcap0000664000076500007650000000151310614714012013342 0ustar dogdog00000000000000# # mailcap # # JAF data content handlers for GNU Javamail # application/octet-stream;;x-java-content-handler=gnu.mail.handler.ApplicationOctetStream message/rfc822;;x-java-content-handler=gnu.mail.handler.MessageRFC822 multipart/alternative;;x-java-content-handler=gnu.mail.handler.MultipartAlternative multipart/mixed;;x-java-content-handler=gnu.mail.handler.MultipartMixed multipart/related;;x-java-content-handler=gnu.mail.handler.MultipartRelated multipart/report;;x-java-content-handler=gnu.mail.handler.MultipartReport multipart/signed;;x-java-content-handler=gnu.mail.handler.MultipartSigned multipart/*;;x-java-content-handler=gnu.mail.handler.Multipart text/plain;;x-java-content-handler=gnu.mail.handler.TextPlain text/html;;x-java-content-handler=gnu.mail.handler.TextHtml text/xml;;x-java-content-handler=gnu.mail.handler.TextXml mail-1.1.2/Makefile.am0000664000076500007650000003312610614714012014052 0ustar dogdog00000000000000## Process this file with automake to produce Makefile.in. # Makefile.am for GNU Classpathx JavaMail. JAVAC = @JAVAC@ JAVACFLAGS = @JAVACFLAGS@ JAVADOC = @JAVADOC@ JAVADOCFLAGS = @JAVADOCFLAGS@ src = @srcdir@/source dst = classes doc = @srcdir@/docs gnumail_jar = gnumail.jar providers_jar = gnumail-providers.jar # The java source files that make up the GNU version of the javax.mail API. gnumail_sources = \ $(src)/javax/mail/Address.java \ $(src)/javax/mail/AuthenticationFailedException.java \ $(src)/javax/mail/Authenticator.java \ $(src)/javax/mail/BodyPart.java \ $(src)/javax/mail/FetchProfile.java \ $(src)/javax/mail/Flags.java \ $(src)/javax/mail/Folder.java \ $(src)/javax/mail/FolderClosedException.java \ $(src)/javax/mail/FolderNotFoundException.java \ $(src)/javax/mail/Header.java \ $(src)/javax/mail/IllegalWriteException.java \ $(src)/javax/mail/Message.java \ $(src)/javax/mail/MessageAware.java \ $(src)/javax/mail/MessageContext.java \ $(src)/javax/mail/MessageRemovedException.java \ $(src)/javax/mail/MessagingException.java \ $(src)/javax/mail/MethodNotSupportedException.java \ $(src)/javax/mail/Multipart.java \ $(src)/javax/mail/MultipartDataSource.java \ $(src)/javax/mail/NoSuchProviderException.java \ $(src)/javax/mail/Part.java \ $(src)/javax/mail/PasswordAuthentication.java \ $(src)/javax/mail/Provider.java \ $(src)/javax/mail/Quota.java \ $(src)/javax/mail/QuotaAwareStore.java \ $(src)/javax/mail/ReadOnlyFolderException.java \ $(src)/javax/mail/SendFailedException.java \ $(src)/javax/mail/Service.java \ $(src)/javax/mail/Session.java \ $(src)/javax/mail/Store.java \ $(src)/javax/mail/StoreClosedException.java \ $(src)/javax/mail/Transport.java \ $(src)/javax/mail/UIDFolder.java \ $(src)/javax/mail/URLName.java \ $(src)/javax/mail/event/ConnectionAdapter.java \ $(src)/javax/mail/event/ConnectionEvent.java \ $(src)/javax/mail/event/ConnectionListener.java \ $(src)/javax/mail/event/FolderAdapter.java \ $(src)/javax/mail/event/FolderEvent.java \ $(src)/javax/mail/event/FolderListener.java \ $(src)/javax/mail/event/MailEvent.java \ $(src)/javax/mail/event/MessageChangedEvent.java \ $(src)/javax/mail/event/MessageChangedListener.java \ $(src)/javax/mail/event/MessageCountAdapter.java \ $(src)/javax/mail/event/MessageCountEvent.java \ $(src)/javax/mail/event/MessageCountListener.java \ $(src)/javax/mail/event/StoreEvent.java \ $(src)/javax/mail/event/StoreListener.java \ $(src)/javax/mail/event/TransportAdapter.java \ $(src)/javax/mail/event/TransportEvent.java \ $(src)/javax/mail/event/TransportListener.java \ $(src)/javax/mail/internet/AddressException.java \ $(src)/javax/mail/internet/ContentDisposition.java \ $(src)/javax/mail/internet/ContentType.java \ $(src)/javax/mail/internet/HeaderTokenizer.java \ $(src)/javax/mail/internet/InternetAddress.java \ $(src)/javax/mail/internet/InternetHeaders.java \ $(src)/javax/mail/internet/MailDateFormat.java \ $(src)/javax/mail/internet/MimeBodyPart.java \ $(src)/javax/mail/internet/MimeMessage.java \ $(src)/javax/mail/internet/MimeMultipart.java \ $(src)/javax/mail/internet/MimePart.java \ $(src)/javax/mail/internet/MimePartDataSource.java \ $(src)/javax/mail/internet/MimeUtility.java \ $(src)/javax/mail/internet/NewsAddress.java \ $(src)/javax/mail/internet/ParameterList.java \ $(src)/javax/mail/internet/ParseException.java \ $(src)/javax/mail/internet/SharedInputStream.java \ $(src)/javax/mail/search/AddressStringTerm.java \ $(src)/javax/mail/search/AddressTerm.java \ $(src)/javax/mail/search/AndTerm.java \ $(src)/javax/mail/search/BodyTerm.java \ $(src)/javax/mail/search/ComparisonTerm.java \ $(src)/javax/mail/search/DateTerm.java \ $(src)/javax/mail/search/FlagTerm.java \ $(src)/javax/mail/search/FromStringTerm.java \ $(src)/javax/mail/search/FromTerm.java \ $(src)/javax/mail/search/HeaderTerm.java \ $(src)/javax/mail/search/IntegerComparisonTerm.java \ $(src)/javax/mail/search/MessageIDTerm.java \ $(src)/javax/mail/search/MessageNumberTerm.java \ $(src)/javax/mail/search/NotTerm.java \ $(src)/javax/mail/search/OrTerm.java \ $(src)/javax/mail/search/ReceivedDateTerm.java \ $(src)/javax/mail/search/RecipientStringTerm.java \ $(src)/javax/mail/search/RecipientTerm.java \ $(src)/javax/mail/search/SearchException.java \ $(src)/javax/mail/search/SearchTerm.java \ $(src)/javax/mail/search/SentDateTerm.java \ $(src)/javax/mail/search/SizeTerm.java \ $(src)/javax/mail/search/StringTerm.java \ $(src)/javax/mail/search/SubjectTerm.java \ $(src)/javax/mail/util/ByteArrayDataSource.java \ $(src)/javax/mail/util/SharedByteArrayInputStream.java \ $(src)/javax/mail/util/SharedFileInputStream.java \ $(src)/gnu/mail/handler/Application.java \ $(src)/gnu/mail/handler/ApplicationOctetStream.java \ $(src)/gnu/mail/handler/Message.java \ $(src)/gnu/mail/handler/MessageRFC822.java \ $(src)/gnu/mail/handler/Multipart.java \ $(src)/gnu/mail/handler/MultipartAlternative.java \ $(src)/gnu/mail/handler/MultipartMixed.java \ $(src)/gnu/mail/handler/MultipartRelated.java \ $(src)/gnu/mail/handler/MultipartSigned.java \ $(src)/gnu/mail/handler/Text.java \ $(src)/gnu/mail/handler/TextHtml.java \ $(src)/gnu/mail/handler/TextPlain.java \ $(src)/gnu/mail/handler/TextXml.java # Utility and helper classes for the JavaMail API. util_sources = \ $(src)/gnu/mail/util/BOutputStream.java \ $(src)/gnu/mail/util/Base64InputStream.java \ $(src)/gnu/mail/util/Base64OutputStream.java \ $(src)/gnu/mail/util/MailboxURLConnection.java \ $(src)/gnu/mail/util/QInputStream.java \ $(src)/gnu/mail/util/QOutputStream.java \ $(src)/gnu/mail/util/QPInputStream.java \ $(src)/gnu/mail/util/QPOutputStream.java \ $(src)/gnu/mail/util/RFC2822OutputStream.java \ $(src)/gnu/mail/util/UUInputStream.java \ $(src)/gnu/mail/util/UUOutputStream.java # Utility and helper classes for the providers. provider_sources = \ $(src)/gnu/mail/treeutil/StatusEvent.java \ $(src)/gnu/mail/treeutil/StatusListener.java \ $(src)/gnu/mail/treeutil/StatusSource.java \ $(src)/gnu/mail/providers/ReadOnlyMessage.java # The SMTP provider if ENABLE_SMTP smtp_sources = \ $(src)/gnu/mail/providers/smtp/SMTPTransport.java else smtp_sources = endif # The IMAP provider if ENABLE_IMAP imap_sources = \ $(src)/gnu/mail/providers/imap/ACL.java \ $(src)/gnu/mail/providers/imap/IMAPBodyPart.java \ $(src)/gnu/mail/providers/imap/IMAPFlags.java \ $(src)/gnu/mail/providers/imap/IMAPFolder.java \ $(src)/gnu/mail/providers/imap/IMAPMessage.java \ $(src)/gnu/mail/providers/imap/IMAPMultipart.java \ $(src)/gnu/mail/providers/imap/IMAPMultipartDataSource.java \ $(src)/gnu/mail/providers/imap/IMAPStore.java \ $(src)/gnu/mail/providers/imap/Rights.java else imap_sources = endif # POP3 protocol if ENABLE_POP3 pop3_sources = \ $(src)/gnu/mail/providers/pop3/POP3Folder.java \ $(src)/gnu/mail/providers/pop3/POP3Message.java \ $(src)/gnu/mail/providers/pop3/POP3Store.java else pop3_sources = endif # News protocol if ENABLE_NNTP nntp_sources = \ $(src)/gnu/mail/providers/nntp/ListFolderListener.java \ $(src)/gnu/mail/providers/nntp/NNTPFolder.java \ $(src)/gnu/mail/providers/nntp/NNTPMessage.java \ $(src)/gnu/mail/providers/nntp/NNTPRootFolder.java \ $(src)/gnu/mail/providers/nntp/NNTPStore.java \ $(src)/gnu/mail/providers/nntp/NNTPTransport.java else nntp_sources = endif # Mbox provider. if ENABLE_MBOX mbox_sources = \ $(src)/gnu/mail/providers/mbox/MboxFolder.java \ $(src)/gnu/mail/providers/mbox/MboxMessage.java \ $(src)/gnu/mail/providers/mbox/MboxOutputStream.java \ $(src)/gnu/mail/providers/mbox/MboxStore.java else mbox_sources = endif # Maildir message store provider. if ENABLE_MAILDIR maildir_sources = \ $(src)/gnu/mail/providers/maildir/MaildirFolder.java \ $(src)/gnu/mail/providers/maildir/MaildirMessage.java \ $(src)/gnu/mail/providers/maildir/MaildirStore.java else maildir_sources = endif # Package names for Javadoc if ENABLE_SMTP smtp_package_name = gnu.mail.providers.smtp else smtp_package_name = endif if ENABLE_IMAP imap_package_name = gnu.mail.providers.imap else imap_package_name = endif if ENABLE_POP3 pop3_package_name = gnu.mail.providers.pop3 else pop3_package_name = endif if ENABLE_NNTP nntp_package_name = gnu.mail.providers.nntp else nntp_package_name = endif if ENABLE_MBOX mbox_package_name = gnu.mail.providers.mbox else mbox_package_name = endif if ENABLE_MAILDIR maildir_package_name = gnu.mail.providers.maildir else maildir_package_name = endif package_names = \ javax.mail \ javax.mail.event \ javax.mail.internet \ javax.mail.search \ $(smtp_package_name) \ $(imap_package_name) \ $(pop3_package_name) \ $(nntp_package_name) \ $(mbox_package_name) \ $(maildir_package_name) \ gnu.mail.util # The GNU JAF library. activation_jar = @ACTIVATION_JAR@ # The GNU classpath inetlib library. inetlib_jar = @INETLIB_JAR@ # The JSSE library. jsse_jar = @JSSE_JAR@ # The META stuff gnumail_meta = \ META-INF/COPYING \ META-INF/mime.types \ META-INF/mailcap \ META-INF/javamail.charset.map providers_meta = \ META-INF/javamail.default.providers \ META-INF/javamail.default.address.map manifest_mf = @srcdir@/MANIFEST.MF # Classpaths classpath = $(src):$(activation_jar):$(inetlib_jar):$(jsse_jar) # Targets BUILT_SOURCES = $(gnumail_jar) $(providers_jar) #£EXTRA_DIST = jarcompiler $(API_JAVASRC) $(GNU_SRC) $(MAIL_META) gnumail_classes = $(patsubst $(src)/%.java, $(dst)/%.class, $(gnumail_sources)) util_classes = $(patsubst $(src)/%.java, $(dst)/%.class, $(util_sources)) provider_classes = $(patsubst $(src)/%.java, $(dst)/%.class, $(provider_sources)) smtp_classes = $(patsubst $(src)/%.java, $(dst)/%.class, $(smtp_sources)) imap_classes = $(patsubst $(src)/%.java, $(dst)/%.class, $(imap_sources)) pop3_classes = $(patsubst $(src)/%.java, $(dst)/%.class, $(pop3_sources)) nntp_classes = $(patsubst $(src)/%.java, $(dst)/%.class, $(nntp_sources)) mbox_classes = $(patsubst $(src)/%.java, $(dst)/%.class, $(mbox_sources)) maildir_classes = $(patsubst $(src)/%.java, $(dst)/%.class, $(maildir_sources)) META-INF: mkdir -p META-INF META-INF/COPYING: META-INF @srcdir@/COPYING cp @srcdir@/COPYING META-INF/COPYING META-INF/mime.types: META-INF @srcdir@/mime.types cp @srcdir@/mime.types META-INF/mime.types META-INF/mailcap: META-INF @srcdir@/mailcap cp @srcdir@/mailcap META-INF/mailcap META-INF/javamail.charset.map: META-INF @srcdir@/javamail.charset.map cp @srcdir@/javamail.charset.map META-INF/javamail.charset.map META-INF/javamail.default.providers: META-INF echo "# javamail.providers for GNU JavaMail" > javamail.providers if ENABLE_SMTP grep "protocol=smtp" @srcdir@/javamail.providers.in >> javamail.providers endif if ENABLE_IMAP grep "protocol=imap" @srcdir@/javamail.providers.in >> javamail.providers endif if ENABLE_POP3 grep "protocol=pop3" @srcdir@/javamail.providers.in >> javamail.providers endif if ENABLE_NNTP grep "protocol=nntp" @srcdir@/javamail.providers.in >> javamail.providers endif if ENABLE_MBOX grep "protocol=mbox" @srcdir@/javamail.providers.in >> javamail.providers endif if ENABLE_MAILDIR grep "protocol=maildir" @srcdir@/javamail.providers.in >> javamail.providers endif cp javamail.providers META-INF/javamail.default.providers META-INF/javamail.default.address.map: META-INF javamail.address.map cp javamail.address.map META-INF/javamail.default.address.map javamail.address.map: rm -f javamail.address.map if ENABLE_SMTP echo "rfc822=smtp" >> javamail.address.map endif if ENABLE_NNTP echo "news=nntp-post" >> javamail.address.map endif $(dst): test ! -d $(dst) && mkdir $(dst) # Jars $(gnumail_jar): $(dst) $(gnumail_meta) $(gnumail_classes) $(util_classes) $(JAR) cfm $(gnumail_jar) $(manifest_mf) \ $(gnumail_meta) \ -C $(dst) javax \ -C $(dst) gnu/mail/handler \ -C $(dst) gnu/mail/util $(providers_jar): $(dst) $(providers_meta) $(provider_classes) $(smtp_classes) \ $(imap_classes) $(pop3_classes) $(nntp_classes) $(mbox_classes) \ $(maildir_classes) $(JAR) cfm $(providers_jar) $(manifest_mf) \ $(providers_meta) \ -C $(dst) gnu/mail/providers \ -C $(dst) gnu/mail/treeutil # Compilation #gnumail: util $(gnumail_classes) $(gnumail_classes): $(dst)/%.class: $(src)/%.java $(JAVAC) $(JAVACFLAGS) -classpath $(classpath) -d $(dst) $< #util: $(util_classes) $(util_classes): $(dst)/%.class: $(src)/%.java $(JAVAC) $(JAVACFLAGS) -classpath $(classpath) -d $(dst) $< #provider_util: $(gnumail_jar) $(provider_classes) $(provider_classes): $(dst)/%.class: $(src)/%.java $(JAVAC) $(JAVACFLAGS) -classpath $(classpath) -d $(dst) $< #smtp: provider_util $(smtp_classes) $(smtp_classes): $(dst)/%.class: $(src)/%.java $(JAVAC) $(JAVACFLAGS) -classpath $(classpath) -d $(dst) $< #imap: provider_util $(imap_classes) $(imap_classes): $(dst)/%.class: $(src)/%.java $(JAVAC) $(JAVACFLAGS) -classpath $(classpath) -d $(dst) $< #pop3: provider_util $(pop3_classes) $(pop3_classes): $(dst)/%.class: $(src)/%.java $(JAVAC) $(JAVACFLAGS) -classpath $(classpath) -d $(dst) $< #nntp: provider_util $(nntp_classes) $(nntp_classes): $(dst)/%.class: $(src)/%.java $(JAVAC) $(JAVACFLAGS) -classpath $(classpath) -d $(dst) $< #mbox: provider_util $(mbox_classes) $(mbox_classes): $(dst)/%.class: $(src)/%.java $(JAVAC) $(JAVACFLAGS) -classpath $(classpath) -d $(dst) $< #maildir: provider_util $(maildir_classes) $(maildir_classes): $(dst)/%.class: $(src)/%.java $(JAVAC) $(JAVACFLAGS) -classpath $(classpath) -d $(dst) $< # Javadoc javadoc: mkdir -p $(doc) $(JAVADOC) $(JAVADOCFLAGS) -d $(doc) -sourcepath $(src) \ -windowtitle "GNU JavaMail API documentation" $(package_names) # Remove jar files and directories clean-local: rm -f javamail.address.map javamail.providers rm -rf $(gnumail_jar) $(providers_jar) META-INF $(dst) $(doc) install-data-local: @srcdir@/mkinstalldirs $(DESTDIR)/$(datadir)/java $(INSTALL_DATA) $(gnumail_jar) $(DESTDIR)/$(datadir)/java $(INSTALL_DATA) $(providers_jar) $(DESTDIR)/$(datadir)/java # End of Makefile.am mail-1.1.2/Makefile.in0000664000076500007650000006602110614714012014063 0ustar dogdog00000000000000# Makefile.in generated by automake 1.9.6 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # Makefile.am for GNU Classpathx JavaMail. srcdir = @srcdir@ top_srcdir = @top_srcdir@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ top_builddir = . am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd INSTALL = @INSTALL@ install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : subdir = . DIST_COMMON = README $(am__configure_deps) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in $(top_srcdir)/configure AUTHORS COPYING \ ChangeLog INSTALL NEWS TODO config.guess config.sub install-sh \ missing mkinstalldirs ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ $(top_srcdir)/m4/ac_check_class.m4 \ $(top_srcdir)/m4/ac_check_classpath.m4 \ $(top_srcdir)/m4/ac_check_rqrd_class.m4 \ $(top_srcdir)/m4/ac_java_options.m4 \ $(top_srcdir)/m4/ac_prog_jar.m4 \ $(top_srcdir)/m4/ac_prog_java.m4 \ $(top_srcdir)/m4/ac_prog_java_works.m4 \ $(top_srcdir)/m4/ac_prog_javac.m4 \ $(top_srcdir)/m4/ac_prog_javac_works.m4 \ $(top_srcdir)/m4/ac_prog_javadoc.m4 \ $(top_srcdir)/m4/am_prog_gcj.m4 \ $(top_srcdir)/m4/gnumail_with_activation_jar.m4 \ $(top_srcdir)/m4/gnumail_with_inetlib_jar.m4 \ $(top_srcdir)/m4/gnumail_with_jsse.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ configure.lineno configure.status.lineno mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_CLEAN_FILES = SOURCES = DIST_SOURCES = DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) distdir = $(PACKAGE)-$(VERSION) top_distdir = $(distdir) am__remove_distdir = \ { test ! -d $(distdir) \ || { find $(distdir) -type d ! -perm -200 -exec chmod u+w {} ';' \ && rm -fr $(distdir); }; } DIST_ARCHIVES = $(distdir).tar.gz GZIP_ENV = --best distuninstallcheck_listfiles = find . -type f -print distcleancheck_listfiles = find . -type f -print ACLOCAL = @ACLOCAL@ ACTIVATION_JAR = @ACTIVATION_JAR@ AMTAR = @AMTAR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ ENABLE_IMAP_FALSE = @ENABLE_IMAP_FALSE@ ENABLE_IMAP_TRUE = @ENABLE_IMAP_TRUE@ ENABLE_MAILDIR_FALSE = @ENABLE_MAILDIR_FALSE@ ENABLE_MAILDIR_TRUE = @ENABLE_MAILDIR_TRUE@ ENABLE_MBOX_FALSE = @ENABLE_MBOX_FALSE@ ENABLE_MBOX_TRUE = @ENABLE_MBOX_TRUE@ ENABLE_NNTP_FALSE = @ENABLE_NNTP_FALSE@ ENABLE_NNTP_TRUE = @ENABLE_NNTP_TRUE@ ENABLE_POP3_FALSE = @ENABLE_POP3_FALSE@ ENABLE_POP3_TRUE = @ENABLE_POP3_TRUE@ ENABLE_SMTP_FALSE = @ENABLE_SMTP_FALSE@ ENABLE_SMTP_TRUE = @ENABLE_SMTP_TRUE@ INETLIB_JAR = @INETLIB_JAR@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ JAR = @JAR@ JAVA = @JAVA@ JAVAC = @JAVAC@ JAVACFLAGS = @JAVACFLAGS@ JAVADOC = @JAVADOC@ JAVADOCFLAGS = @JAVADOCFLAGS@ JAVAFLAGS = @JAVAFLAGS@ JAVAPREFIX = @JAVAPREFIX@ JSSE_JAR = @JSSE_JAR@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ ac_ct_STRIP = @ac_ct_STRIP@ am__leading_dot = @am__leading_dot@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build_alias = @build_alias@ datadir = @datadir@ exec_prefix = @exec_prefix@ host_alias = @host_alias@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ prefix = @prefix@ program_transform_name = @program_transform_name@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ uudecode = @uudecode@ src = @srcdir@/source dst = classes doc = @srcdir@/docs gnumail_jar = gnumail.jar providers_jar = gnumail-providers.jar # The java source files that make up the GNU version of the javax.mail API. gnumail_sources = \ $(src)/javax/mail/Address.java \ $(src)/javax/mail/AuthenticationFailedException.java \ $(src)/javax/mail/Authenticator.java \ $(src)/javax/mail/BodyPart.java \ $(src)/javax/mail/FetchProfile.java \ $(src)/javax/mail/Flags.java \ $(src)/javax/mail/Folder.java \ $(src)/javax/mail/FolderClosedException.java \ $(src)/javax/mail/FolderNotFoundException.java \ $(src)/javax/mail/Header.java \ $(src)/javax/mail/IllegalWriteException.java \ $(src)/javax/mail/Message.java \ $(src)/javax/mail/MessageAware.java \ $(src)/javax/mail/MessageContext.java \ $(src)/javax/mail/MessageRemovedException.java \ $(src)/javax/mail/MessagingException.java \ $(src)/javax/mail/MethodNotSupportedException.java \ $(src)/javax/mail/Multipart.java \ $(src)/javax/mail/MultipartDataSource.java \ $(src)/javax/mail/NoSuchProviderException.java \ $(src)/javax/mail/Part.java \ $(src)/javax/mail/PasswordAuthentication.java \ $(src)/javax/mail/Provider.java \ $(src)/javax/mail/Quota.java \ $(src)/javax/mail/QuotaAwareStore.java \ $(src)/javax/mail/ReadOnlyFolderException.java \ $(src)/javax/mail/SendFailedException.java \ $(src)/javax/mail/Service.java \ $(src)/javax/mail/Session.java \ $(src)/javax/mail/Store.java \ $(src)/javax/mail/StoreClosedException.java \ $(src)/javax/mail/Transport.java \ $(src)/javax/mail/UIDFolder.java \ $(src)/javax/mail/URLName.java \ $(src)/javax/mail/event/ConnectionAdapter.java \ $(src)/javax/mail/event/ConnectionEvent.java \ $(src)/javax/mail/event/ConnectionListener.java \ $(src)/javax/mail/event/FolderAdapter.java \ $(src)/javax/mail/event/FolderEvent.java \ $(src)/javax/mail/event/FolderListener.java \ $(src)/javax/mail/event/MailEvent.java \ $(src)/javax/mail/event/MessageChangedEvent.java \ $(src)/javax/mail/event/MessageChangedListener.java \ $(src)/javax/mail/event/MessageCountAdapter.java \ $(src)/javax/mail/event/MessageCountEvent.java \ $(src)/javax/mail/event/MessageCountListener.java \ $(src)/javax/mail/event/StoreEvent.java \ $(src)/javax/mail/event/StoreListener.java \ $(src)/javax/mail/event/TransportAdapter.java \ $(src)/javax/mail/event/TransportEvent.java \ $(src)/javax/mail/event/TransportListener.java \ $(src)/javax/mail/internet/AddressException.java \ $(src)/javax/mail/internet/ContentDisposition.java \ $(src)/javax/mail/internet/ContentType.java \ $(src)/javax/mail/internet/HeaderTokenizer.java \ $(src)/javax/mail/internet/InternetAddress.java \ $(src)/javax/mail/internet/InternetHeaders.java \ $(src)/javax/mail/internet/MailDateFormat.java \ $(src)/javax/mail/internet/MimeBodyPart.java \ $(src)/javax/mail/internet/MimeMessage.java \ $(src)/javax/mail/internet/MimeMultipart.java \ $(src)/javax/mail/internet/MimePart.java \ $(src)/javax/mail/internet/MimePartDataSource.java \ $(src)/javax/mail/internet/MimeUtility.java \ $(src)/javax/mail/internet/NewsAddress.java \ $(src)/javax/mail/internet/ParameterList.java \ $(src)/javax/mail/internet/ParseException.java \ $(src)/javax/mail/internet/SharedInputStream.java \ $(src)/javax/mail/search/AddressStringTerm.java \ $(src)/javax/mail/search/AddressTerm.java \ $(src)/javax/mail/search/AndTerm.java \ $(src)/javax/mail/search/BodyTerm.java \ $(src)/javax/mail/search/ComparisonTerm.java \ $(src)/javax/mail/search/DateTerm.java \ $(src)/javax/mail/search/FlagTerm.java \ $(src)/javax/mail/search/FromStringTerm.java \ $(src)/javax/mail/search/FromTerm.java \ $(src)/javax/mail/search/HeaderTerm.java \ $(src)/javax/mail/search/IntegerComparisonTerm.java \ $(src)/javax/mail/search/MessageIDTerm.java \ $(src)/javax/mail/search/MessageNumberTerm.java \ $(src)/javax/mail/search/NotTerm.java \ $(src)/javax/mail/search/OrTerm.java \ $(src)/javax/mail/search/ReceivedDateTerm.java \ $(src)/javax/mail/search/RecipientStringTerm.java \ $(src)/javax/mail/search/RecipientTerm.java \ $(src)/javax/mail/search/SearchException.java \ $(src)/javax/mail/search/SearchTerm.java \ $(src)/javax/mail/search/SentDateTerm.java \ $(src)/javax/mail/search/SizeTerm.java \ $(src)/javax/mail/search/StringTerm.java \ $(src)/javax/mail/search/SubjectTerm.java \ $(src)/javax/mail/util/ByteArrayDataSource.java \ $(src)/javax/mail/util/SharedByteArrayInputStream.java \ $(src)/javax/mail/util/SharedFileInputStream.java \ $(src)/gnu/mail/handler/Application.java \ $(src)/gnu/mail/handler/ApplicationOctetStream.java \ $(src)/gnu/mail/handler/Message.java \ $(src)/gnu/mail/handler/MessageRFC822.java \ $(src)/gnu/mail/handler/Multipart.java \ $(src)/gnu/mail/handler/MultipartAlternative.java \ $(src)/gnu/mail/handler/MultipartMixed.java \ $(src)/gnu/mail/handler/MultipartRelated.java \ $(src)/gnu/mail/handler/MultipartSigned.java \ $(src)/gnu/mail/handler/Text.java \ $(src)/gnu/mail/handler/TextHtml.java \ $(src)/gnu/mail/handler/TextPlain.java \ $(src)/gnu/mail/handler/TextXml.java # Utility and helper classes for the JavaMail API. util_sources = \ $(src)/gnu/mail/util/BOutputStream.java \ $(src)/gnu/mail/util/Base64InputStream.java \ $(src)/gnu/mail/util/Base64OutputStream.java \ $(src)/gnu/mail/util/MailboxURLConnection.java \ $(src)/gnu/mail/util/QInputStream.java \ $(src)/gnu/mail/util/QOutputStream.java \ $(src)/gnu/mail/util/QPInputStream.java \ $(src)/gnu/mail/util/QPOutputStream.java \ $(src)/gnu/mail/util/RFC2822OutputStream.java \ $(src)/gnu/mail/util/UUInputStream.java \ $(src)/gnu/mail/util/UUOutputStream.java # Utility and helper classes for the providers. provider_sources = \ $(src)/gnu/mail/treeutil/StatusEvent.java \ $(src)/gnu/mail/treeutil/StatusListener.java \ $(src)/gnu/mail/treeutil/StatusSource.java \ $(src)/gnu/mail/providers/ReadOnlyMessage.java @ENABLE_SMTP_FALSE@smtp_sources = # The SMTP provider @ENABLE_SMTP_TRUE@smtp_sources = \ @ENABLE_SMTP_TRUE@$(src)/gnu/mail/providers/smtp/SMTPTransport.java @ENABLE_IMAP_FALSE@imap_sources = # The IMAP provider @ENABLE_IMAP_TRUE@imap_sources = \ @ENABLE_IMAP_TRUE@$(src)/gnu/mail/providers/imap/ACL.java \ @ENABLE_IMAP_TRUE@$(src)/gnu/mail/providers/imap/IMAPBodyPart.java \ @ENABLE_IMAP_TRUE@$(src)/gnu/mail/providers/imap/IMAPFlags.java \ @ENABLE_IMAP_TRUE@$(src)/gnu/mail/providers/imap/IMAPFolder.java \ @ENABLE_IMAP_TRUE@$(src)/gnu/mail/providers/imap/IMAPMessage.java \ @ENABLE_IMAP_TRUE@$(src)/gnu/mail/providers/imap/IMAPMultipart.java \ @ENABLE_IMAP_TRUE@$(src)/gnu/mail/providers/imap/IMAPMultipartDataSource.java \ @ENABLE_IMAP_TRUE@$(src)/gnu/mail/providers/imap/IMAPStore.java \ @ENABLE_IMAP_TRUE@$(src)/gnu/mail/providers/imap/Rights.java @ENABLE_POP3_FALSE@pop3_sources = # POP3 protocol @ENABLE_POP3_TRUE@pop3_sources = \ @ENABLE_POP3_TRUE@$(src)/gnu/mail/providers/pop3/POP3Folder.java \ @ENABLE_POP3_TRUE@$(src)/gnu/mail/providers/pop3/POP3Message.java \ @ENABLE_POP3_TRUE@$(src)/gnu/mail/providers/pop3/POP3Store.java @ENABLE_NNTP_FALSE@nntp_sources = # News protocol @ENABLE_NNTP_TRUE@nntp_sources = \ @ENABLE_NNTP_TRUE@$(src)/gnu/mail/providers/nntp/ListFolderListener.java \ @ENABLE_NNTP_TRUE@$(src)/gnu/mail/providers/nntp/NNTPFolder.java \ @ENABLE_NNTP_TRUE@$(src)/gnu/mail/providers/nntp/NNTPMessage.java \ @ENABLE_NNTP_TRUE@$(src)/gnu/mail/providers/nntp/NNTPRootFolder.java \ @ENABLE_NNTP_TRUE@$(src)/gnu/mail/providers/nntp/NNTPStore.java \ @ENABLE_NNTP_TRUE@$(src)/gnu/mail/providers/nntp/NNTPTransport.java @ENABLE_MBOX_FALSE@mbox_sources = # Mbox provider. @ENABLE_MBOX_TRUE@mbox_sources = \ @ENABLE_MBOX_TRUE@$(src)/gnu/mail/providers/mbox/MboxFolder.java \ @ENABLE_MBOX_TRUE@$(src)/gnu/mail/providers/mbox/MboxMessage.java \ @ENABLE_MBOX_TRUE@$(src)/gnu/mail/providers/mbox/MboxOutputStream.java \ @ENABLE_MBOX_TRUE@$(src)/gnu/mail/providers/mbox/MboxStore.java @ENABLE_MAILDIR_FALSE@maildir_sources = # Maildir message store provider. @ENABLE_MAILDIR_TRUE@maildir_sources = \ @ENABLE_MAILDIR_TRUE@$(src)/gnu/mail/providers/maildir/MaildirFolder.java \ @ENABLE_MAILDIR_TRUE@$(src)/gnu/mail/providers/maildir/MaildirMessage.java \ @ENABLE_MAILDIR_TRUE@$(src)/gnu/mail/providers/maildir/MaildirStore.java @ENABLE_SMTP_FALSE@smtp_package_name = # Package names for Javadoc @ENABLE_SMTP_TRUE@smtp_package_name = gnu.mail.providers.smtp @ENABLE_IMAP_FALSE@imap_package_name = @ENABLE_IMAP_TRUE@imap_package_name = gnu.mail.providers.imap @ENABLE_POP3_FALSE@pop3_package_name = @ENABLE_POP3_TRUE@pop3_package_name = gnu.mail.providers.pop3 @ENABLE_NNTP_FALSE@nntp_package_name = @ENABLE_NNTP_TRUE@nntp_package_name = gnu.mail.providers.nntp @ENABLE_MBOX_FALSE@mbox_package_name = @ENABLE_MBOX_TRUE@mbox_package_name = gnu.mail.providers.mbox @ENABLE_MAILDIR_FALSE@maildir_package_name = @ENABLE_MAILDIR_TRUE@maildir_package_name = gnu.mail.providers.maildir package_names = \ javax.mail \ javax.mail.event \ javax.mail.internet \ javax.mail.search \ $(smtp_package_name) \ $(imap_package_name) \ $(pop3_package_name) \ $(nntp_package_name) \ $(mbox_package_name) \ $(maildir_package_name) \ gnu.mail.util # The GNU JAF library. activation_jar = @ACTIVATION_JAR@ # The GNU classpath inetlib library. inetlib_jar = @INETLIB_JAR@ # The JSSE library. jsse_jar = @JSSE_JAR@ # The META stuff gnumail_meta = \ META-INF/COPYING \ META-INF/mime.types \ META-INF/mailcap \ META-INF/javamail.charset.map providers_meta = \ META-INF/javamail.default.providers \ META-INF/javamail.default.address.map manifest_mf = @srcdir@/MANIFEST.MF # Classpaths classpath = $(src):$(activation_jar):$(inetlib_jar):$(jsse_jar) # Targets BUILT_SOURCES = $(gnumail_jar) $(providers_jar) #£EXTRA_DIST = jarcompiler $(API_JAVASRC) $(GNU_SRC) $(MAIL_META) gnumail_classes = $(patsubst $(src)/%.java, $(dst)/%.class, $(gnumail_sources)) util_classes = $(patsubst $(src)/%.java, $(dst)/%.class, $(util_sources)) provider_classes = $(patsubst $(src)/%.java, $(dst)/%.class, $(provider_sources)) smtp_classes = $(patsubst $(src)/%.java, $(dst)/%.class, $(smtp_sources)) imap_classes = $(patsubst $(src)/%.java, $(dst)/%.class, $(imap_sources)) pop3_classes = $(patsubst $(src)/%.java, $(dst)/%.class, $(pop3_sources)) nntp_classes = $(patsubst $(src)/%.java, $(dst)/%.class, $(nntp_sources)) mbox_classes = $(patsubst $(src)/%.java, $(dst)/%.class, $(mbox_sources)) maildir_classes = $(patsubst $(src)/%.java, $(dst)/%.class, $(maildir_sources)) all: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) all-am .SUFFIXES: am--refresh: @: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ echo ' cd $(srcdir) && $(AUTOMAKE) --gnu '; \ cd $(srcdir) && $(AUTOMAKE) --gnu \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu Makefile'; \ cd $(top_srcdir) && \ $(AUTOMAKE) --gnu Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ echo ' $(SHELL) ./config.status'; \ $(SHELL) ./config.status;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) $(SHELL) ./config.status --recheck $(top_srcdir)/configure: $(am__configure_deps) cd $(srcdir) && $(AUTOCONF) $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS) uninstall-info-am: tags: TAGS TAGS: ctags: CTAGS CTAGS: distdir: $(DISTFILES) $(am__remove_distdir) mkdir $(distdir) $(mkdir_p) $(distdir)/m4 @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ list='$(DISTFILES)'; for file in $$list; do \ case $$file in \ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ esac; \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ if test "$$dir" != "$$file" && test "$$dir" != "."; then \ dir="/$$dir"; \ $(mkdir_p) "$(distdir)$$dir"; \ else \ dir=''; \ fi; \ if test -d $$d/$$file; then \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done -find $(distdir) -type d ! -perm -777 -exec chmod a+rwx {} \; -o \ ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \ ! -type d ! -perm -400 -exec chmod a+r {} \; -o \ ! -type d ! -perm -444 -exec $(SHELL) $(install_sh) -c -m a+r {} {} \; \ || chmod -R a+r $(distdir) dist-gzip: distdir tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz $(am__remove_distdir) dist-bzip2: distdir tardir=$(distdir) && $(am__tar) | bzip2 -9 -c >$(distdir).tar.bz2 $(am__remove_distdir) dist-tarZ: distdir tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z $(am__remove_distdir) dist-shar: distdir shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz $(am__remove_distdir) dist-zip: distdir -rm -f $(distdir).zip zip -rq $(distdir).zip $(distdir) $(am__remove_distdir) dist dist-all: distdir tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz $(am__remove_distdir) # This target untars the dist file and tries a VPATH configuration. Then # it guarantees that the distribution is self-contained by making another # tarfile. distcheck: dist case '$(DIST_ARCHIVES)' in \ *.tar.gz*) \ GZIP=$(GZIP_ENV) gunzip -c $(distdir).tar.gz | $(am__untar) ;;\ *.tar.bz2*) \ bunzip2 -c $(distdir).tar.bz2 | $(am__untar) ;;\ *.tar.Z*) \ uncompress -c $(distdir).tar.Z | $(am__untar) ;;\ *.shar.gz*) \ GZIP=$(GZIP_ENV) gunzip -c $(distdir).shar.gz | unshar ;;\ *.zip*) \ unzip $(distdir).zip ;;\ esac chmod -R a-w $(distdir); chmod a+w $(distdir) mkdir $(distdir)/_build mkdir $(distdir)/_inst chmod a-w $(distdir) dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \ && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \ && cd $(distdir)/_build \ && ../configure --srcdir=.. --prefix="$$dc_install_base" \ $(DISTCHECK_CONFIGURE_FLAGS) \ && $(MAKE) $(AM_MAKEFLAGS) \ && $(MAKE) $(AM_MAKEFLAGS) dvi \ && $(MAKE) $(AM_MAKEFLAGS) check \ && $(MAKE) $(AM_MAKEFLAGS) install \ && $(MAKE) $(AM_MAKEFLAGS) installcheck \ && $(MAKE) $(AM_MAKEFLAGS) uninstall \ && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \ distuninstallcheck \ && chmod -R a-w "$$dc_install_base" \ && ({ \ (cd ../.. && umask 077 && mkdir "$$dc_destdir") \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \ distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \ } || { rm -rf "$$dc_destdir"; exit 1; }) \ && rm -rf "$$dc_destdir" \ && $(MAKE) $(AM_MAKEFLAGS) dist \ && rm -rf $(DIST_ARCHIVES) \ && $(MAKE) $(AM_MAKEFLAGS) distcleancheck $(am__remove_distdir) @(echo "$(distdir) archives ready for distribution: "; \ list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \ sed -e '1{h;s/./=/g;p;x;}' -e '$${p;x;}' distuninstallcheck: @cd $(distuninstallcheck_dir) \ && test `$(distuninstallcheck_listfiles) | wc -l` -le 1 \ || { echo "ERROR: files left after uninstall:" ; \ if test -n "$(DESTDIR)"; then \ echo " (check DESTDIR support)"; \ fi ; \ $(distuninstallcheck_listfiles) ; \ exit 1; } >&2 distcleancheck: distclean @if test '$(srcdir)' = . ; then \ echo "ERROR: distcleancheck can only run from a VPATH build" ; \ exit 1 ; \ fi @test `$(distcleancheck_listfiles) | wc -l` -eq 0 \ || { echo "ERROR: files left in build directory after distclean:" ; \ $(distcleancheck_listfiles) ; \ exit 1; } >&2 check-am: all-am check: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) check-am all-am: Makefile installdirs: install: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) clean: clean-am clean-am: clean-generic clean-local mostlyclean-am distclean: distclean-am -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am info: info-am info-am: install-data-am: install-data-local install-exec-am: install-info: install-info-am install-man: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -rf $(top_srcdir)/autom4te.cache -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-info-am .PHONY: all all-am am--refresh check check-am clean clean-generic \ clean-local dist dist-all dist-bzip2 dist-gzip dist-shar \ dist-tarZ dist-zip distcheck distclean distclean-generic \ distcleancheck distdir distuninstallcheck dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-data-local install-exec \ install-exec-am install-info install-info-am install-man \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-generic pdf pdf-am ps ps-am uninstall uninstall-am \ uninstall-info-am META-INF: mkdir -p META-INF META-INF/COPYING: META-INF @srcdir@/COPYING cp @srcdir@/COPYING META-INF/COPYING META-INF/mime.types: META-INF @srcdir@/mime.types cp @srcdir@/mime.types META-INF/mime.types META-INF/mailcap: META-INF @srcdir@/mailcap cp @srcdir@/mailcap META-INF/mailcap META-INF/javamail.charset.map: META-INF @srcdir@/javamail.charset.map cp @srcdir@/javamail.charset.map META-INF/javamail.charset.map META-INF/javamail.default.providers: META-INF echo "# javamail.providers for GNU JavaMail" > javamail.providers @ENABLE_SMTP_TRUE@ grep "protocol=smtp" @srcdir@/javamail.providers.in >> javamail.providers @ENABLE_IMAP_TRUE@ grep "protocol=imap" @srcdir@/javamail.providers.in >> javamail.providers @ENABLE_POP3_TRUE@ grep "protocol=pop3" @srcdir@/javamail.providers.in >> javamail.providers @ENABLE_NNTP_TRUE@ grep "protocol=nntp" @srcdir@/javamail.providers.in >> javamail.providers @ENABLE_MBOX_TRUE@ grep "protocol=mbox" @srcdir@/javamail.providers.in >> javamail.providers @ENABLE_MAILDIR_TRUE@ grep "protocol=maildir" @srcdir@/javamail.providers.in >> javamail.providers cp javamail.providers META-INF/javamail.default.providers META-INF/javamail.default.address.map: META-INF javamail.address.map cp javamail.address.map META-INF/javamail.default.address.map javamail.address.map: rm -f javamail.address.map @ENABLE_SMTP_TRUE@ echo "rfc822=smtp" >> javamail.address.map @ENABLE_NNTP_TRUE@ echo "news=nntp-post" >> javamail.address.map $(dst): test ! -d $(dst) && mkdir $(dst) # Jars $(gnumail_jar): $(dst) $(gnumail_meta) $(gnumail_classes) $(util_classes) $(JAR) cfm $(gnumail_jar) $(manifest_mf) \ $(gnumail_meta) \ -C $(dst) javax \ -C $(dst) gnu/mail/handler \ -C $(dst) gnu/mail/util $(providers_jar): $(dst) $(providers_meta) $(provider_classes) $(smtp_classes) \ $(imap_classes) $(pop3_classes) $(nntp_classes) $(mbox_classes) \ $(maildir_classes) $(JAR) cfm $(providers_jar) $(manifest_mf) \ $(providers_meta) \ -C $(dst) gnu/mail/providers \ -C $(dst) gnu/mail/treeutil # Compilation #gnumail: util $(gnumail_classes) $(gnumail_classes): $(dst)/%.class: $(src)/%.java $(JAVAC) $(JAVACFLAGS) -classpath $(classpath) -d $(dst) $< #util: $(util_classes) $(util_classes): $(dst)/%.class: $(src)/%.java $(JAVAC) $(JAVACFLAGS) -classpath $(classpath) -d $(dst) $< #provider_util: $(gnumail_jar) $(provider_classes) $(provider_classes): $(dst)/%.class: $(src)/%.java $(JAVAC) $(JAVACFLAGS) -classpath $(classpath) -d $(dst) $< #smtp: provider_util $(smtp_classes) $(smtp_classes): $(dst)/%.class: $(src)/%.java $(JAVAC) $(JAVACFLAGS) -classpath $(classpath) -d $(dst) $< #imap: provider_util $(imap_classes) $(imap_classes): $(dst)/%.class: $(src)/%.java $(JAVAC) $(JAVACFLAGS) -classpath $(classpath) -d $(dst) $< #pop3: provider_util $(pop3_classes) $(pop3_classes): $(dst)/%.class: $(src)/%.java $(JAVAC) $(JAVACFLAGS) -classpath $(classpath) -d $(dst) $< #nntp: provider_util $(nntp_classes) $(nntp_classes): $(dst)/%.class: $(src)/%.java $(JAVAC) $(JAVACFLAGS) -classpath $(classpath) -d $(dst) $< #mbox: provider_util $(mbox_classes) $(mbox_classes): $(dst)/%.class: $(src)/%.java $(JAVAC) $(JAVACFLAGS) -classpath $(classpath) -d $(dst) $< #maildir: provider_util $(maildir_classes) $(maildir_classes): $(dst)/%.class: $(src)/%.java $(JAVAC) $(JAVACFLAGS) -classpath $(classpath) -d $(dst) $< # Javadoc javadoc: mkdir -p $(doc) $(JAVADOC) $(JAVADOCFLAGS) -d $(doc) -sourcepath $(src) \ -windowtitle "GNU JavaMail API documentation" $(package_names) # Remove jar files and directories clean-local: rm -f javamail.address.map javamail.providers rm -rf $(gnumail_jar) $(providers_jar) META-INF $(dst) $(doc) install-data-local: @srcdir@/mkinstalldirs $(DESTDIR)/$(datadir)/java $(INSTALL_DATA) $(gnumail_jar) $(DESTDIR)/$(datadir)/java $(INSTALL_DATA) $(providers_jar) $(DESTDIR)/$(datadir)/java # End of Makefile.am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: mail-1.1.2/MANIFEST.MF0000664000076500007650000000027710614714012013451 0ustar dogdog00000000000000Implementation-Title: GNU JavaMail Implementation-Version: 1.3 Implementation-Vendor: The Free Software Foundation, Inc. Implementation-URL: http://www.gnu.org/software/classpathx/javamail/ mail-1.1.2/mime.types0000664000076500007650000000661610614714012014037 0ustar dogdog00000000000000# Default MIME type registry # author: Chris Burdess application/activemessage application/andrew-inset application/applefile application/atomicmail application/cu-seeme csm cu application/dca-rft application/dec-dx application/dsptype tsp application/excel xls application/ghostview application/mac-binhex40 hqx application/macwriteii application/msword doc dot application/news-message-id application/news-transmission application/octet-stream bin application/octet-stream application/oda oda application/pdf pdf application/pgp-signature pgp application/postscript ps ai eps application/powerpoint ppt application/remote-printing application/rtf rtf application/slate application/wita application/wordperfect5.1 wp5 application/x-123 wk application/x-Wingz wz application/x-bcpio bcpio application/x-bzip2 bz2 application/x-compress z Z application/x-core application/x-cpio cpio application/x-csh csh application/x-debian-package deb application/x-dvi dvi application/x-executable application/x-font pfa pfb gsf pcf.Z application/x-gtar gtar tgz application/x-gzip gz application/x-hdf hdf application/x-httpd-php phtml pht php application/x-httpd-php3 php3 application/x-httpd-php3-source phps application/x-httpd-php3-preprocessed php3p application/x-java class application/x-kdelnk application/x-latex latex application/x-maker frm maker frame fm fb book fbdoc application/x-mif mif application/x-msdos-program com exe bat application/x-netcdf nc cdf application/x-object o application/x-perl pl pm application/x-rx application/x-sh sh application/x-shar shar application/x-shellscript application/x-stuffit sit application/x-sv4cpio sv4cpio application/x-sv4crc sv4crc application/x-tar tar application/x-tar tar application/x-tcl tcl application/x-tex tex application/x-tex-gf *gf application/x-tex-pk pk PK application/x-texinfo texinfo texi application/x-trash ~ % bak old sik application/x-troff t tr roff application/x-troff-man man application/x-troff-me me application/x-troff-ms ms application/x-ustar ustar application/x-wais-source src application/zip zip audio/basic au snd audio/midi mid midi audio/x-aiff aif aiff aifc audio/x-pn-realaudio ra rm ram audio/x-wav wav image/gif gif image/ief ief image/jpeg jpeg jpg jpe image/png png image/tiff tiff tif image/x-cmu-raster ras image/x-ms-bmp bmp BMP image/x-portable-anymap pnm image/x-portable-bitmap pbm image/x-portable-graymap pgm image/x-portable-pixmap ppm image/x-rgb rgb image/x-xbitmap xbm image/x-xpixmap xpm image/x-xwindowdump xwd inode/chardevice inode/blockdevice inode/directory-locked inode/directory inode/fifo inode/socket message/external-body message/news message/partial message/rfc822 multipart/alternative multipart/appledouble multipart/digest multipart/mixed multipart/parallel multipart/related text/comma-separated-values csv text/english text/html html htm text/plain txt text/richtext rtx text/tab-separated-values tsv text/x-c++hdr hpp hxx hh text/x-c++src cpp cxx cc text/x-chdr h text/x-csrc c text/x-java java text/x-makefile text/x-moc moc text/x-pascal p pas text/x-setext etx text/x-tcl tcl tk text/x-tex tex ltx sty cls text/x-vCalendar vcs text/x-vCard vcf video/dl dl video/fli fli video/gl gl video/mpeg mpeg mpg mpe video/quicktime qt mov video/x-msvideo avi video/x-sgi-movie movie x-world/x-vrml vrm vrml wrl mail-1.1.2/missing0000775000076500007650000002404210614714012013412 0ustar dogdog00000000000000#! /bin/sh # Common stub for a few missing GNU programs while installing. # Copyright (C) 1996, 1997, 1999, 2000, 2002 Free Software Foundation, Inc. # Originally by Fran,cois Pinard , 1996. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # This program 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 General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA # 02110-1301, USA. # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. if test $# -eq 0; then echo 1>&2 "Try \`$0 --help' for more information" exit 1 fi run=: # In the cases where this matters, `missing' is being run in the # srcdir already. if test -f configure.ac; then configure_ac=configure.ac else configure_ac=configure.in fi case "$1" in --run) # Try to run requested program, and just exit if it succeeds. run= shift "$@" && exit 0 ;; esac # If it does not exist, or fails to run (possibly an outdated version), # try to emulate it. case "$1" in -h|--h|--he|--hel|--help) echo "\ $0 [OPTION]... PROGRAM [ARGUMENT]... Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an error status if there is no known handling for PROGRAM. Options: -h, --help display this help and exit -v, --version output version information and exit --run try to run the given command, and emulate it if it fails Supported PROGRAM values: aclocal touch file \`aclocal.m4' autoconf touch file \`configure' autoheader touch file \`config.h.in' automake touch all \`Makefile.in' files bison create \`y.tab.[ch]', if possible, from existing .[ch] flex create \`lex.yy.c', if possible, from existing .c help2man touch the output file lex create \`lex.yy.c', if possible, from existing .c makeinfo touch the output file tar try tar, gnutar, gtar, then tar without non-portable flags yacc create \`y.tab.[ch]', if possible, from existing .[ch]" ;; -v|--v|--ve|--ver|--vers|--versi|--versio|--version) echo "missing 0.4 - GNU automake" ;; -*) echo 1>&2 "$0: Unknown \`$1' option" echo 1>&2 "Try \`$0 --help' for more information" exit 1 ;; aclocal*) if test -z "$run" && ($1 --version) > /dev/null 2>&1; then # We have it, but it failed. exit 1 fi echo 1>&2 "\ WARNING: \`$1' is missing on your system. You should only need it if you modified \`acinclude.m4' or \`${configure_ac}'. You might want to install the \`Automake' and \`Perl' packages. Grab them from any GNU archive site." touch aclocal.m4 ;; autoconf) if test -z "$run" && ($1 --version) > /dev/null 2>&1; then # We have it, but it failed. exit 1 fi echo 1>&2 "\ WARNING: \`$1' is missing on your system. You should only need it if you modified \`${configure_ac}'. You might want to install the \`Autoconf' and \`GNU m4' packages. Grab them from any GNU archive site." touch configure ;; autoheader) if test -z "$run" && ($1 --version) > /dev/null 2>&1; then # We have it, but it failed. exit 1 fi echo 1>&2 "\ WARNING: \`$1' is missing on your system. You should only need it if you modified \`acconfig.h' or \`${configure_ac}'. You might want to install the \`Autoconf' and \`GNU m4' packages. Grab them from any GNU archive site." files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' ${configure_ac}` test -z "$files" && files="config.h" touch_files= for f in $files; do case "$f" in *:*) touch_files="$touch_files "`echo "$f" | sed -e 's/^[^:]*://' -e 's/:.*//'`;; *) touch_files="$touch_files $f.in";; esac done touch $touch_files ;; automake*) if test -z "$run" && ($1 --version) > /dev/null 2>&1; then # We have it, but it failed. exit 1 fi echo 1>&2 "\ WARNING: \`$1' is missing on your system. You should only need it if you modified \`Makefile.am', \`acinclude.m4' or \`${configure_ac}'. You might want to install the \`Automake' and \`Perl' packages. Grab them from any GNU archive site." find . -type f -name Makefile.am -print | sed 's/\.am$/.in/' | while read f; do touch "$f"; done ;; autom4te) if test -z "$run" && ($1 --version) > /dev/null 2>&1; then # We have it, but it failed. exit 1 fi echo 1>&2 "\ WARNING: \`$1' is needed, and you do not seem to have it handy on your system. You might have modified some files without having the proper tools for further handling them. You can get \`$1Help2man' as part of \`Autoconf' from any GNU archive site." file=`echo "$*" | sed -n 's/.*--output[ =]*\([^ ]*\).*/\1/p'` test -z "$file" && file=`echo "$*" | sed -n 's/.*-o[ ]*\([^ ]*\).*/\1/p'` if test -f "$file"; then touch $file else test -z "$file" || exec >$file echo "#! /bin/sh" echo "# Created by GNU Automake missing as a replacement of" echo "# $ $@" echo "exit 0" chmod +x $file exit 1 fi ;; bison|yacc) echo 1>&2 "\ WARNING: \`$1' is missing on your system. You should only need it if you modified a \`.y' file. You may need the \`Bison' package in order for those modifications to take effect. You can get \`Bison' from any GNU archive site." rm -f y.tab.c y.tab.h if [ $# -ne 1 ]; then eval LASTARG="\${$#}" case "$LASTARG" in *.y) SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'` if [ -f "$SRCFILE" ]; then cp "$SRCFILE" y.tab.c fi SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'` if [ -f "$SRCFILE" ]; then cp "$SRCFILE" y.tab.h fi ;; esac fi if [ ! -f y.tab.h ]; then echo >y.tab.h fi if [ ! -f y.tab.c ]; then echo 'main() { return 0; }' >y.tab.c fi ;; lex|flex) echo 1>&2 "\ WARNING: \`$1' is missing on your system. You should only need it if you modified a \`.l' file. You may need the \`Flex' package in order for those modifications to take effect. You can get \`Flex' from any GNU archive site." rm -f lex.yy.c if [ $# -ne 1 ]; then eval LASTARG="\${$#}" case "$LASTARG" in *.l) SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'` if [ -f "$SRCFILE" ]; then cp "$SRCFILE" lex.yy.c fi ;; esac fi if [ ! -f lex.yy.c ]; then echo 'main() { return 0; }' >lex.yy.c fi ;; help2man) if test -z "$run" && ($1 --version) > /dev/null 2>&1; then # We have it, but it failed. exit 1 fi echo 1>&2 "\ WARNING: \`$1' is missing on your system. You should only need it if you modified a dependency of a manual page. You may need the \`Help2man' package in order for those modifications to take effect. You can get \`Help2man' from any GNU archive site." file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'` if test -z "$file"; then file=`echo "$*" | sed -n 's/.*--output=\([^ ]*\).*/\1/p'` fi if [ -f "$file" ]; then touch $file else test -z "$file" || exec >$file echo ".ab help2man is required to generate this page" exit 1 fi ;; makeinfo) if test -z "$run" && (makeinfo --version) > /dev/null 2>&1; then # We have makeinfo, but it failed. exit 1 fi echo 1>&2 "\ WARNING: \`$1' is missing on your system. You should only need it if you modified a \`.texi' or \`.texinfo' file, or any other file indirectly affecting the aspect of the manual. The spurious call might also be the consequence of using a buggy \`make' (AIX, DU, IRIX). You might want to install the \`Texinfo' package or the \`GNU make' package. Grab either from any GNU archive site." file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'` if test -z "$file"; then file=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'` file=`sed -n '/^@setfilename/ { s/.* \([^ ]*\) *$/\1/; p; q; }' $file` fi touch $file ;; tar) shift if test -n "$run"; then echo 1>&2 "ERROR: \`tar' requires --run" exit 1 fi # We have already tried tar in the generic part. # Look for gnutar/gtar before invocation to avoid ugly error # messages. if (gnutar --version > /dev/null 2>&1); then gnutar "$@" && exit 0 fi if (gtar --version > /dev/null 2>&1); then gtar "$@" && exit 0 fi firstarg="$1" if shift; then case "$firstarg" in *o*) firstarg=`echo "$firstarg" | sed s/o//` tar "$firstarg" "$@" && exit 0 ;; esac case "$firstarg" in *h*) firstarg=`echo "$firstarg" | sed s/h//` tar "$firstarg" "$@" && exit 0 ;; esac fi echo 1>&2 "\ WARNING: I can't seem to be able to run \`tar' with the given arguments. You may want to install GNU tar or Free paxutils, or check the command line arguments." exit 1 ;; *) echo 1>&2 "\ WARNING: \`$1' is needed, and you do not seem to have it handy on your system. You might have modified some files without having the proper tools for further handling them. Check the \`README' file, it often tells you about the needed prerequirements for installing this package. You may also peek at any GNU archive site, in case some other package would contain this missing \`$1' program." exit 1 ;; esac exit 0 mail-1.1.2/mkinstalldirs0000775000076500007650000000370410614714012014623 0ustar dogdog00000000000000#! /bin/sh # mkinstalldirs --- make directory hierarchy # Author: Noah Friedman # Created: 1993-05-16 # Public domain errstatus=0 dirmode="" usage="\ Usage: mkinstalldirs [-h] [--help] [-m mode] dir ..." # process command line arguments while test $# -gt 0 ; do case $1 in -h | --help | --h*) # -h for help echo "$usage" 1>&2 exit 0 ;; -m) # -m PERM arg shift test $# -eq 0 && { echo "$usage" 1>&2; exit 1; } dirmode=$1 shift ;; --) # stop option processing shift break ;; -*) # unknown option echo "$usage" 1>&2 exit 1 ;; *) # first non-opt arg break ;; esac done for file do if test -d "$file"; then shift else break fi done case $# in 0) exit 0 ;; esac case $dirmode in '') if mkdir -p -- . 2>/dev/null; then echo "mkdir -p -- $*" exec mkdir -p -- "$@" fi ;; *) if mkdir -m "$dirmode" -p -- . 2>/dev/null; then echo "mkdir -m $dirmode -p -- $*" exec mkdir -m "$dirmode" -p -- "$@" fi ;; esac for file do set fnord `echo ":$file" | sed -ne 's/^:\//#/;s/^://;s/\// /g;s/^#/\//;p'` shift pathcomp= for d do pathcomp="$pathcomp$d" case $pathcomp in -*) pathcomp=./$pathcomp ;; esac if test ! -d "$pathcomp"; then echo "mkdir $pathcomp" mkdir "$pathcomp" || lasterr=$? if test ! -d "$pathcomp"; then errstatus=$lasterr else if test ! -z "$dirmode"; then echo "chmod $dirmode $pathcomp" lasterr="" chmod "$dirmode" "$pathcomp" || lasterr=$? if test ! -z "$lasterr"; then errstatus=$lasterr fi fi fi fi pathcomp="$pathcomp/" done done exit $errstatus # Local Variables: # mode: shell-script # sh-indentation: 2 # End: # mkinstalldirs ends here mail-1.1.2/NEWS0000664000076500007650000000010410614714012012503 0ustar dogdog00000000000000GNU Mail is a free implementation of the Javamail(TM) API. Nic mail-1.1.2/README0000664000076500007650000000015510614714012012672 0ustar dogdog00000000000000Please refer to the INSTALL file for installation instructions. $Author: dog $ $Date: 2004/01/11 18:10:02 $ mail-1.1.2/README.imap0000664000076500007650000000143510614714012013621 0ustar dogdog00000000000000The IMAP provider is a complete store provider for IMAP4rev1, written from scratch for performance and to remove the Scheme-interpreter dependency in the previous provider. It uses GNU inetlib to manage the IMAP protocol level. Features: - all IMAP4rev1 commands except UID - BODYSTRUCTURE fetches for remote MIME body part handling - authentication via SASL - TLS - ANSI coloured debug output! (set session property mail.debug.ansi=true) - currently tested against UW imapd and GNU mailutils imapd For more information, see the Javadoc for the gnu.mail.providers.imap package. Todo: - implement message/* body parts - write the UID code and make IMAPFolder implement UIDFolder - test against as many IMAP servers as possible If you want to help with this provider, please contact dog@gnu.org mail-1.1.2/README.maildir0000664000076500007650000000350610614714012014315 0ustar dogdog00000000000000The maildir provider allows for both reading and saving of MIME messages to and from a local filesystem, using the Maildir format developed by Dan Bernstein and used in qmail, courier-imap, and other mail processing systems. Reading messages Nothing special should be required for the configuration of a connection to a local mailbox using the provider. The protocol to use is maildir. This will locate the default ("Maildir") directory: URLName url = new URLName("maildir:///home/user"); Store store = session.getStore(url); Folder root = store.getDefaultFolder(); Folder inbox = root.getFolder("INBOX"); An alternate mailbox can be read. Specify the parent directory, then look up the mailbox directory by name. URLName url = new URLName("maildir:///home/user/mail"); Store store = session.getStore(url); Folder root = store.getDefaultFolder(); Folder savedMessages = root.getFolder("MySavedMessages"); Any host details specified in the connection (username, password, host, or port) are ignored. The file part of the URL is used to specify the default root directory for mailboxes. If no directory is specified in the URL, the user's home directory becomes the de facto default directory context for lookups. Saving messages You may use the standard appendMessages() method to save MIME messages to a local mailbox using this provider. Filtering No inherent filtering mechanism is currently supplied, although you are free to use procmail or any other filtering MTA as you see fit. Session properties There is a session property you can set to the value of your MAILDIR environment variable: property --------------------+ type ---+ default + description ---------- mail.maildir.maildir | String | none | ${MAILDIR} This allows the provider to locate the correct directory for INBOX. Chris Burdess, April 2003 mail-1.1.2/README.mbox0000664000076500007650000000452010614714012013636 0ustar dogdog00000000000000The mbox provider allows for both reading and saving of MIME messages to and from a local filesystem, using the UNIX mbox format used by Netscape Messenger and many other MUAs. Reading messages Nothing special should be required for the configuration of a connection to a local mailbox using the provider. The protocol to use is mbox. URLName url = new URLName("mbox:///home/user/mail"); Store store = session.getStore(url); Folder root = store.getDefaultFolder(); Folder savedMessages = root.getFolder("saved.messages"); Any host details specified in the connection (username, password, host, or port) are ignored. The file part of the URL is used to specify the default root directory for mailboxes, however any valid filename can be used to refer to a mailbox anywhere in the filesystem. For instance, Folder localSpool = root.getFolder("/var/spool/mail/user"); would return a spool mailbox whatever the default root directory. If no directory is specified in the URL, the user's home directory becomes the de facto default directory context for lookups. WARNING The mbox provider does NOT use filesystem-level file locking using POSIX fcntl() or BSD flock(). Therefore if you attempt to use the mbox provider on systems that use these systems for file locking you may lose data. Use movemail if necessary. See below for details on the locking scheme used by the mbox provider. Locking mailboxes The mbox provider uses a modified version of the dotlock procedure to lock mailboxes that are opened for READ_WRITE. The formal dotlock procedure is to create a temporary file, hardlink it using the mailbox name plus ".lock", then remove the temporary file. Clearly this will not work for platforms that do not support hard links, so instead the mbox provider creates a zero-length file for the lockfile. If you come across any situations where this causes problems with existing dotlock mechanisms, please contact us and let us know. Otherwise, for the purposes of locking and unlocking mailboxes using only the mbox provider, the above should suffice. Saving messages You may use the standard appendMessages() method to save MIME messages to a local mailbox using this provider. Filtering No inherent filtering mechanism is currently supplied, although you are free to use procmail or any other filtering MTA as you see fit. Chris Burdess, September 2003 mail-1.1.2/README.nntp0000664000076500007650000000533010614714012013650 0ustar dogdog00000000000000The NNTP provider allows for both reading and posting of news articles on a news server. Reading news Nothing special should be required for the configuration of a connection to a news server using the provider. The protocol to use is nntp. URLName url = new URLName("nntp://user:pass@host:port"); Store store = session.getStore(url); Folder root = store.getDefaultFolder(); Folder altTest = root.getFolder("alt.test"); If a username and password are not supplied, no authentication will be attempted to the server (it assumes that the server is public). The port can be omitted, it defaults to 119. The NNTP store attempts to use NNTP extensions such as XOVER, but will fall back to standard NNTP as per RFC 977 if such commands are not understood. Posting articles Because JavaMail (or rather, the implementation of it provided by Sun) does not allow you to have both a Store and a Transport using the same protocol name, you must use the nntp-post protocol to locate a suitable Transport object for posting your articles. Otherwise, the URL format is identical. URLName url = new URLName("nntp-post://user:pass@host:port"); Transport transport = session.getTransport(url); transport.sendMessage(message, message.getAllRecipients()); The message should be an ordinary JavaMail MimeMessage, with the Newsgroups header set, as follows: Address[] addresses = { new NewsAddress("alt.test") }; message.addRecipients(MimeMessage.RecipientType.NEWSGROUPS, addresses); The NNTP Transport ignores any recipient types other than newsgroups, does not honour the host specified in the NewsAddress (it posts to the transport specified), and ignores address types other than NewsAddress. If you wish to simultaneously post and mail a message, you must also send the message by the other required Transport(s). Newsrc The NNTP provider provides a mechanism for marking articles as read. This corresponds to the .newsrc mechanism often used by UNIX newsreaders. You can write your own object implementing the Newsrc interface and use that to manage the read-states of articles any way you like, if for instance you do not have access to a local filesystem. By default a filesystem-based newsrc provider is supplied (FileNewsrc). This is currently under development and is not completely stable, please feel free to improve it. It uses the UNIX newsrc standard format, saved in a file called .newsrc- in the user's home directory (much like netscape messanger), if the user has the appropriate access privileges. Filtering No filtering mechanism is currently supplied. It was originally hoped that JavaMail would provide a standard architecture for this, but this possibility now seems remote. Suggestions are welcome. Chris Burdess, September 2003 mail-1.1.2/README.pop30000664000076500007650000000347510614714012013562 0ustar dogdog00000000000000The POP3 provider allows for reading of messages from a POP3 mailbox. Reading messages Nothing special should be required for the configuration of a connection to a POP server using the provider. The protocol to use is pop3. URLName url = new URLName("pop3://user:pass@host:port"); Store store = session.getStore(url); Folder root = store.getDefaultFolder(); Folder inbox = root.getFolder("INBOX"); A username and password must be supplied. The port can be omitted, it defaults to 110. Note that the POP3 protocol only allows for ONE mailbox. This is always called INBOX. Much of the advanced searching functionality provided by JavaMail, fecth profiles for instance, will not work over POP3. The POP3Connection class The POP3 provider internally uses an instance of POP3Connection to negotiate the POP3 protocol with the server. This simple class models a POP3 client. You may find it useful independently of the provider. Please note that access to the POP3Connection is not synchronized - you must synchronize on it yourself if you have a multithreaded application. This is taken care of by the POP3 JavaMail provider. Local cache No local cache is provided. It is recommended that if you want to maintain a local cache you use the mbox provider supplied, and transfer messages from the POP3 mailbox to the local mbox. Filtering No filtering mechanism is currently supplied. It was originally hoped that JavaMail would provide a standard architecture for this, but this possibility now seems remote. Suggestions are welcome. Session properties The following session properties may be set: mail.pop3.apop boolean if false, disable all attempts at APOP authentication The provider supports TLS. For further information, refer to the Javadoc for the gnu.mail.providers.pop3 package. mail-1.1.2/README.smtp0000664000076500007650000000033010614714012013647 0ustar dogdog00000000000000This is a provider for SMTP which includes support for ESMTP extensions, DSN, and MTRK. It can authenticate using SASL, and supports TLS. See the Javadoc for the gnu.mail.providers.smtp package for further details. mail-1.1.2/source/0000775000076500007650000000000010614714024013314 5ustar dogdog00000000000000mail-1.1.2/source/gnu/0000775000076500007650000000000010614714024014105 5ustar dogdog00000000000000mail-1.1.2/source/gnu/mail/0000775000076500007650000000000010614714024015027 5ustar dogdog00000000000000mail-1.1.2/source/gnu/mail/handler/0000775000076500007650000000000010614714024016444 5ustar dogdog00000000000000mail-1.1.2/source/gnu/mail/handler/Application.java0000664000076500007650000001130510614714012021547 0ustar dogdog00000000000000/* * Application.java * Copyright(C) 2003 Chris Burdess * * This file is part of GNU JavaMail, a library. * * GNU JavaMail is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or *(at your option) any later version. * * GNU JavaMail 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * As a special exception, if you link this library with other files to * produce an executable, this library does not by itself cause the * resulting executable to be covered by the GNU General Public License. * This exception does not however invalidate any other reasons why the * executable file might be covered by the GNU General Public License. */ package gnu.mail.handler; import java.awt.datatransfer.DataFlavor; import java.awt.datatransfer.UnsupportedFlavorException; import java.io.*; import javax.activation.*; import javax.mail.internet.ContentType; import javax.mail.internet.MimeUtility; import javax.mail.internet.ParseException; /** * A JAF data content handler for the application/* family of MIME content * types. * This provides the basic behaviour for any number of byte-array-handling * subtypes which simply need to override their default constructor to provide * the correct MIME content-type and description. */ public abstract class Application implements DataContentHandler { /** * Our favorite data flavor. */ protected DataFlavor flavor; /** * Constructor specifying the data flavor. * @param mimeType the MIME content type * @param description the description of the content type */ protected Application(String mimeType, String description) { flavor = new ActivationDataFlavor(byte[].class, mimeType, description); } /** * Returns an array of DataFlavor objects indicating the flavors the data * can be provided in. * @return the DataFlavors */ public DataFlavor[] getTransferDataFlavors() { DataFlavor[] flavors = new DataFlavor[1]; flavors[0] = flavor; return flavors; } /** * Returns an object which represents the data to be transferred. * The class of the object returned is defined by the representation class * of the flavor. * @param flavor the data flavor representing the requested type * @param source the data source representing the data to be converted * @return the constructed object */ public Object getTransferData(DataFlavor flavor, DataSource source) throws UnsupportedFlavorException, IOException { if (this.flavor.equals(flavor)) return getContent(source); return null; } /** * Return an object representing the data in its most preferred form. * Generally this will be the form described by the first data flavor * returned by the getTransferDataFlavors method. * @param source the data source representing the data to be converted * @return a byte array */ public Object getContent(DataSource source) throws IOException { InputStream in = source.getInputStream(); ByteArrayOutputStream out = new ByteArrayOutputStream(); byte[] buf = new byte[4096]; // TODO make configurable while (true) { int len = in.read(buf); if (len > -1) out.write(buf, 0, len); else break; } return out.toByteArray(); } /** * Convert the object to a byte stream of the specified MIME type and * write it to the output stream. * @param object the object to be converted * @param mimeType the requested MIME content type to write as * @param out the output stream into which to write the converted object */ public void writeTo(Object object, String mimeType, OutputStream out) throws IOException { if (object instanceof byte[]) { byte[] bytes = (byte[]) object; out.write(bytes); out.flush(); } else if (object instanceof InputStream) { InputStream in = (InputStream) object; byte[] bytes = new byte[4096]; for (int len = in.read(bytes); len != -1; len = in.read(bytes)) out.write(bytes, 0, len); out.flush(); } else throw new IOException("Unsupported data type: " + object.getClass().getName()); } } mail-1.1.2/source/gnu/mail/handler/ApplicationOctetStream.java0000664000076500007650000000304310614714012023722 0ustar dogdog00000000000000/* * ApplicationOctetStream.java * Copyright(C) 2003 Chris Burdess * * This file is part of GNU JavaMail, a library. * * GNU JavaMail is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or *(at your option) any later version. * * GNU JavaMail 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * As a special exception, if you link this library with other files to * produce an executable, this library does not by itself cause the * resulting executable to be covered by the GNU General Public License. * This exception does not however invalidate any other reasons why the * executable file might be covered by the GNU General Public License. */ package gnu.mail.handler; /** * A JAF data content handler for the application/octet-stream MIME content * type. */ public final class ApplicationOctetStream extends Application { /** * Constructor for application/octet-stream. */ public ApplicationOctetStream() { super("application/octet-stream", "binary"); } } mail-1.1.2/source/gnu/mail/handler/Message.java0000664000076500007650000001134010614714012020667 0ustar dogdog00000000000000/* * Message.java * Copyright(C) 2003 Chris Burdess * * This file is part of GNU JavaMail, a library. * * GNU JavaMail is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or *(at your option) any later version. * * GNU JavaMail 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * As a special exception, if you link this library with other files to * produce an executable, this library does not by itself cause the * resulting executable to be covered by the GNU General Public License. * This exception does not however invalidate any other reasons why the * executable file might be covered by the GNU General Public License. */ package gnu.mail.handler; import java.awt.datatransfer.DataFlavor; import java.awt.datatransfer.UnsupportedFlavorException; import java.io.*; import java.util.Properties; import javax.activation.*; import javax.mail.MessageAware; import javax.mail.MessageContext; import javax.mail.MessagingException; import javax.mail.Session; import javax.mail.internet.MimeMessage; /** * A JAF data content handler for the message/* family of MIME content * types. */ public abstract class Message implements DataContentHandler { /** * Our favorite data flavor. */ protected DataFlavor flavor; /** * Constructor specifying the data flavor. * @param mimeType the MIME content type * @param description the description of the content type */ protected Message(String mimeType, String description) { flavor = new ActivationDataFlavor(javax.mail.Message.class, mimeType, description); } /** * Returns an array of DataFlavor objects indicating the flavors the data * can be provided in. * @return the DataFlavors */ public DataFlavor[] getTransferDataFlavors() { DataFlavor[] flavors = new DataFlavor[1]; flavors[0] = flavor; return flavors; } /** * Returns an object which represents the data to be transferred. * The class of the object returned is defined by the representation class * of the flavor. * @param flavor the data flavor representing the requested type * @param source the data source representing the data to be converted * @return the constructed object */ public Object getTransferData(DataFlavor flavor, DataSource source) throws UnsupportedFlavorException, IOException { if (this.flavor.equals(flavor)) return getContent(source); return null; } /** * Return an object representing the data in its most preferred form. * Generally this will be the form described by the first data flavor * returned by the getTransferDataFlavors method. * @param source the data source representing the data to be converted * @return a message */ public Object getContent(DataSource source) throws IOException { try { Session session = null; if (source instanceof MessageAware) { MessageAware ma = (MessageAware)source; MessageContext context = ma.getMessageContext(); session = context.getSession(); } else { Properties props = null; /* Do we want to pass the system properties in? */ session = Session.getDefaultInstance(props, null); } InputStream in = source.getInputStream(); return new MimeMessage(session, in); } catch (MessagingException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return null; } /** * Convert the object to a byte stream of the specified MIME type and * write it to the output stream. * @param object the object to be converted * @param mimeType the requested MIME content type to write as * @param out the output stream into which to write the converted object */ public void writeTo(Object object, String mimeType, OutputStream out) throws IOException { if (object instanceof javax.mail.Message) { try { ((javax.mail.Message)object).writeTo(out); } catch (MessagingException e) { /* not brilliant as we lose any associated exception */ throw new IOException(e.getMessage()); } } else throw new UnsupportedDataTypeException(); } } mail-1.1.2/source/gnu/mail/handler/MessageRFC822.java0000664000076500007650000000274710614714012021471 0ustar dogdog00000000000000/* * MessageRFC822.java * Copyright(C) 2003 Chris Burdess * * This file is part of GNU JavaMail, a library. * * GNU JavaMail is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or *(at your option) any later version. * * GNU JavaMail 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * As a special exception, if you link this library with other files to * produce an executable, this library does not by itself cause the * resulting executable to be covered by the GNU General Public License. * This exception does not however invalidate any other reasons why the * executable file might be covered by the GNU General Public License. */ package gnu.mail.handler; /** * A JAF data content handler for the message/rfc822 MIME content * type. */ public final class MessageRFC822 extends Message { /** * Constructor for message/rfc822. */ public MessageRFC822() { super("message/rfc822", "message"); } } mail-1.1.2/source/gnu/mail/handler/Multipart.java0000664000076500007650000001066710614714012021277 0ustar dogdog00000000000000/* * Multipart.java * Copyright(C) 2003 Chris Burdess * * This file is part of GNU JavaMail, a library. * * GNU JavaMail is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or *(at your option) any later version. * * GNU JavaMail 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * As a special exception, if you link this library with other files to * produce an executable, this library does not by itself cause the * resulting executable to be covered by the GNU General Public License. * This exception does not however invalidate any other reasons why the * executable file might be covered by the GNU General Public License. */ package gnu.mail.handler; import java.awt.datatransfer.DataFlavor; import java.awt.datatransfer.UnsupportedFlavorException; import java.io.*; import javax.activation.*; import javax.mail.MessagingException; import javax.mail.internet.MimeMultipart; /** * A JAF data content handler for the multipart/* family of MIME content * types. * This provides the basic behaviour for any number of MimeMultipart-handling * subtypes which simply need to override their default constructor to provide * the correct MIME content-type and description. */ public class Multipart implements DataContentHandler { /** * Our favorite data flavor. */ protected DataFlavor flavor; /** * Generic constructor. */ public Multipart() { this("multipart/*", "multipart"); } /** * Constructor specifying the data flavor. * @param mimeType the MIME content type * @param description the description of the content type */ public Multipart(String mimeType, String description) { flavor = new ActivationDataFlavor(javax.mail.internet.MimeMultipart.class, mimeType, description); } /** * Returns an array of DataFlavor objects indicating the flavors the data * can be provided in. * @return the DataFlavors */ public DataFlavor[] getTransferDataFlavors() { DataFlavor[] flavors = new DataFlavor[1]; flavors[0] = flavor; return flavors; } /** * Returns an object which represents the data to be transferred. * The class of the object returned is defined by the representation class * of the flavor. * @param flavor the data flavor representing the requested type * @param source the data source representing the data to be converted * @return the constructed object */ public Object getTransferData(DataFlavor flavor, DataSource source) throws UnsupportedFlavorException, IOException { if (this.flavor.equals(flavor)) return getContent(source); return null; } /** * Return an object representing the data in its most preferred form. * Generally this will be the form described by the first data flavor * returned by the getTransferDataFlavors method. * @param source the data source representing the data to be converted * @return a byte array */ public Object getContent(DataSource source) throws IOException { try { return new MimeMultipart(source); } catch (MessagingException e) { /* This loses any attached exception */ throw new IOException(e.getMessage()); } } /** * Convert the object to a byte stream of the specified MIME type and * write it to the output stream. * @param object the object to be converted * @param mimeType the requested MIME content type to write as * @param out the output stream into which to write the converted object */ public void writeTo(Object object, String mimeType, OutputStream out) throws IOException { if (object instanceof MimeMultipart) { try { ((MimeMultipart)object).writeTo(out); } catch (MessagingException e) { /* This loses any attached exception */ throw new IOException(e.getMessage()); } } else throw new UnsupportedDataTypeException(); } } mail-1.1.2/source/gnu/mail/handler/MultipartAlternative.java0000664000076500007650000000302510614714012023464 0ustar dogdog00000000000000/* * MultipartAlternative.java * Copyright(C) 2003 Chris Burdess * * This file is part of GNU JavaMail, a library. * * GNU JavaMail is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or *(at your option) any later version. * * GNU JavaMail 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * As a special exception, if you link this library with other files to * produce an executable, this library does not by itself cause the * resulting executable to be covered by the GNU General Public License. * This exception does not however invalidate any other reasons why the * executable file might be covered by the GNU General Public License. */ package gnu.mail.handler; /** * A JAF data content handler for the multipart/alternative MIME content * type. */ public final class MultipartAlternative extends Multipart { /** * Constructor for multipart/alternative. */ public MultipartAlternative() { super("multipart/alternative", "multipart"); } } mail-1.1.2/source/gnu/mail/handler/MultipartMixed.java0000664000076500007650000000276110614714012022262 0ustar dogdog00000000000000/* * MultipartMixed.java * Copyright(C) 2003 Chris Burdess * * This file is part of GNU JavaMail, a library. * * GNU JavaMail is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or *(at your option) any later version. * * GNU JavaMail 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * As a special exception, if you link this library with other files to * produce an executable, this library does not by itself cause the * resulting executable to be covered by the GNU General Public License. * This exception does not however invalidate any other reasons why the * executable file might be covered by the GNU General Public License. */ package gnu.mail.handler; /** * A JAF data content handler for the multipart/mixed MIME content * type. */ public final class MultipartMixed extends Multipart { /** * Constructor for multipart/mixed. */ public MultipartMixed() { super("multipart/mixed", "multipart"); } } mail-1.1.2/source/gnu/mail/handler/MultipartRelated.java0000664000076500007650000000277510614714012022601 0ustar dogdog00000000000000/* * MultipartRelated.java * Copyright(C) 2003 Chris Burdess * * This file is part of GNU JavaMail, a library. * * GNU JavaMail is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or *(at your option) any later version. * * GNU JavaMail 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * As a special exception, if you link this library with other files to * produce an executable, this library does not by itself cause the * resulting executable to be covered by the GNU General Public License. * This exception does not however invalidate any other reasons why the * executable file might be covered by the GNU General Public License. */ package gnu.mail.handler; /** * A JAF data content handler for the multipart/related MIME content * type. */ public final class MultipartRelated extends Multipart { /** * Constructor for multipart/related. */ public MultipartRelated() { super("multipart/related", "multipart"); } } mail-1.1.2/source/gnu/mail/handler/MultipartReport.java0000664000076500007650000000276710614714012022475 0ustar dogdog00000000000000/* * MultipartReport.java * Copyright(C) 2003 Chris Burdess * * This file is part of GNU JavaMail, a library. * * GNU JavaMail is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or *(at your option) any later version. * * GNU JavaMail 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * As a special exception, if you link this library with other files to * produce an executable, this library does not by itself cause the * resulting executable to be covered by the GNU General Public License. * This exception does not however invalidate any other reasons why the * executable file might be covered by the GNU General Public License. */ package gnu.mail.handler; /** * A JAF data content handler for the multipart/report MIME content * type. */ public final class MultipartReport extends Multipart { /** * Constructor for multipart/report. */ public MultipartReport() { super("multipart/report", "multipart"); } } mail-1.1.2/source/gnu/mail/handler/MultipartSigned.java0000664000076500007650000000276710614714012022433 0ustar dogdog00000000000000/* * MultipartSigned.java * Copyright(C) 2003 Chris Burdess * * This file is part of GNU JavaMail, a library. * * GNU JavaMail is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or *(at your option) any later version. * * GNU JavaMail 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * As a special exception, if you link this library with other files to * produce an executable, this library does not by itself cause the * resulting executable to be covered by the GNU General Public License. * This exception does not however invalidate any other reasons why the * executable file might be covered by the GNU General Public License. */ package gnu.mail.handler; /** * A JAF data content handler for the multipart/signed MIME content * type. */ public final class MultipartSigned extends Multipart { /** * Constructor for multipart/signed. */ public MultipartSigned() { super("multipart/signed", "multipart"); } } mail-1.1.2/source/gnu/mail/handler/Text.java0000664000076500007650000001303410614714012020231 0ustar dogdog00000000000000/* * Text.java * Copyright(C) 2003 Chris Burdess * * This file is part of GNU JavaMail, a library. * * GNU JavaMail is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or *(at your option) any later version. * * GNU JavaMail 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * As a special exception, if you link this library with other files to * produce an executable, this library does not by itself cause the * resulting executable to be covered by the GNU General Public License. * This exception does not however invalidate any other reasons why the * executable file might be covered by the GNU General Public License. */ package gnu.mail.handler; import java.awt.datatransfer.DataFlavor; import java.awt.datatransfer.UnsupportedFlavorException; import java.io.*; import javax.activation.*; import javax.mail.internet.ContentType; import javax.mail.internet.MimeUtility; import javax.mail.internet.ParseException; /** * A JAF data content handler for the text/* family of MIME content types. * This provides the basic behaviour for any number of text-handling * subtypes which simply need to override their default constructor to provide * the correct MIME content-type and description. */ public abstract class Text implements DataContentHandler { /** * Our favorite data flavor. * Yum yum. */ protected DataFlavor flavor; /** * Constructor specifying the data flavor. * @param mimeType the MIME content type * @param description the description of the content type */ protected Text(String mimeType, String description) { flavor = new ActivationDataFlavor(java.lang.String.class, mimeType, description); } /** * Returns an array of DataFlavor objects indicating the flavors the data * can be provided in. * @return the DataFlavors */ public DataFlavor[] getTransferDataFlavors() { DataFlavor[] flavors = new DataFlavor[1]; flavors[0] = flavor; return flavors; } /** * Returns an object which represents the data to be transferred. * The class of the object returned is defined by the representation class * of the flavor. * @param flavor the data flavor representing the requested type * @param source the data source representing the data to be converted * @return the constructed object */ public Object getTransferData(DataFlavor flavor, DataSource source) throws UnsupportedFlavorException, IOException { if (this.flavor.equals(flavor)) return getContent(source); return null; } /** * Return an object representing the data in its most preferred form. * Generally this will be the form described by the first data flavor * returned by the getTransferDataFlavors method. * @param source the data source representing the data to be converted * @return the constructed object */ public Object getContent(DataSource source) throws IOException { InputStream in = source.getInputStream(); String mimeType = source.getContentType(); String charset = getJavaCharset(mimeType); InputStreamReader reader = new InputStreamReader(in, charset); char[] buf = new char[4096]; // TODO make configurable StringBuffer buffer = new StringBuffer(); while (true) { int len = reader.read(buf); if (len > -1) buffer.append(new String(buf, 0, len)); else break; } return buffer.toString(); } /** * Convert the object to a byte stream of the specified MIME type and * write it to the output stream. * @param object the object to be converted * @param mimeType the requested MIME content type to write as * @param out the output stream into which to write the converted object */ public void writeTo(Object object, String mimeType, OutputStream out) throws IOException { // We only handle strings or arrays of byte or char String text = null; if (object instanceof String) text = (String)object; else if (object instanceof byte[]) text = new String((byte[])object); else if (object instanceof char[]) text = new String((char[])object); else // Last attempt to get something useful text = object.toString(); String charset = getJavaCharset(mimeType); OutputStreamWriter writer = new OutputStreamWriter(out, charset); writer.write(text); writer.flush(); } /** * Returns the Java character set corresponding to the MIME charset * parameter of the content type value. * The default value is the Java character set mapped to the MIME charset * "us-ascii". * @return a java charset name */ protected static String getJavaCharset(String contentType) { String charset = "us-ascii"; if (contentType!=null) { try { ContentType ct = new ContentType(contentType); String ctCharset = ct.getParameter("charset"); if (ctCharset!=null) charset = ctCharset; } catch (ParseException e) { } } return MimeUtility.javaCharset(charset); } } mail-1.1.2/source/gnu/mail/handler/TextHtml.java0000664000076500007650000000270010614714012021054 0ustar dogdog00000000000000/* * TextHtml.java * Copyright(C) 2003 Chris Burdess * * This file is part of GNU JavaMail, a library. * * GNU JavaMail is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or *(at your option) any later version. * * GNU JavaMail 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * As a special exception, if you link this library with other files to * produce an executable, this library does not by itself cause the * resulting executable to be covered by the GNU General Public License. * This exception does not however invalidate any other reasons why the * executable file might be covered by the GNU General Public License. */ package gnu.mail.handler; /** * A JAF data content handler for the text/html MIME content type. */ public final class TextHtml extends Text { /** * Constructor for text/html. */ public TextHtml() { super("text/html", "HTML"); } } mail-1.1.2/source/gnu/mail/handler/TextPlain.java0000664000076500007650000000271310614714012021217 0ustar dogdog00000000000000/* * TextPlain.java * Copyright(C) 2003 Chris Burdess * * This file is part of GNU JavaMail, a library. * * GNU JavaMail is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or *(at your option) any later version. * * GNU JavaMail 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * As a special exception, if you link this library with other files to * produce an executable, this library does not by itself cause the * resulting executable to be covered by the GNU General Public License. * This exception does not however invalidate any other reasons why the * executable file might be covered by the GNU General Public License. */ package gnu.mail.handler; /** * A JAF data content handler for the text/plain MIME content type. */ public final class TextPlain extends Text { /** * Constructor for text/plain. */ public TextPlain() { super("text/plain", "plaintext"); } } mail-1.1.2/source/gnu/mail/handler/TextXml.java0000664000076500007650000000267110614714012020717 0ustar dogdog00000000000000/* * TextXml.java * Copyright(C) 2003 Chris Burdess * * This file is part of GNU JavaMail, a library. * * GNU JavaMail is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or *(at your option) any later version. * * GNU JavaMail 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * As a special exception, if you link this library with other files to * produce an executable, this library does not by itself cause the * resulting executable to be covered by the GNU General Public License. * This exception does not however invalidate any other reasons why the * executable file might be covered by the GNU General Public License. */ package gnu.mail.handler; /** * A JAF data content handler for the text/xml MIME content type. */ public final class TextXml extends Text { /** * Constructor for text/xml. */ public TextXml() { super("text/xml", "XML"); } } mail-1.1.2/source/gnu/mail/providers/0000775000076500007650000000000010614714024017044 5ustar dogdog00000000000000mail-1.1.2/source/gnu/mail/providers/imap/0000775000076500007650000000000010614714024017772 5ustar dogdog00000000000000mail-1.1.2/source/gnu/mail/providers/imap/ACL.java0000664000076500007650000000364710614714012021243 0ustar dogdog00000000000000/* * ACL.java * Copyright (C) 2005 Chris Burdess * * This file is part of GNU JavaMail, a library. * * GNU JavaMail is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * GNU JavaMail 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * As a special exception, if you link this library with other files to * produce an executable, this library does not by itself cause the * resulting executable to be covered by the GNU General Public License. * This exception does not however invalidate any other reasons why the * executable file might be covered by the GNU General Public License. */ package gnu.mail.providers.imap; /** * An access control list entry. * Please note that this API is experimental and will probably change * soon when the IETF working group delivers a a new specification. * * @author Chris Burdess * @deprecated this API will probably change incompatibly soon */ public final class ACL { String name; Rights rights; public ACL(String name) { this(name, null); } public ACL(String name, Rights rights) { this.name = name; this.rights = rights; } public String getName() { return name; } public void setRights(Rights rights) { this.rights = rights; } public Rights getRights() { return rights; } } mail-1.1.2/source/gnu/mail/providers/imap/IMAPBodyPart.java0000664000076500007650000001773310614714012023040 0ustar dogdog00000000000000/* * IMAPBodyPart.java * Copyright(C) 2003 Chris Burdess * * This file is part of GNU JavaMail, a library. * * GNU JavaMail is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or *(at your option) any later version. * * GNU JavaMail 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * As a special exception, if you link this library with other files to * produce an executable, this library does not by itself cause the * resulting executable to be covered by the GNU General Public License. * This exception does not however invalidate any other reasons why the * executable file might be covered by the GNU General Public License. */ package gnu.mail.providers.imap; import java.io.InputStream; import java.io.IOException; import java.util.Collections; import java.util.List; import javax.activation.DataHandler; import javax.mail.MessagingException; import javax.mail.internet.ContentType; import javax.mail.internet.InternetHeaders; import javax.mail.internet.MimeBodyPart; import gnu.inet.imap.IMAPConnection; import gnu.inet.imap.IMAPConstants; import gnu.inet.imap.MessageStatus; import gnu.inet.imap.Pair; /** * A MIME body part of an IMAP multipart message. * * @author Chris Burdess */ public class IMAPBodyPart extends MimeBodyPart implements IMAPConstants { /** * The message this part belongs to. */ protected IMAPMessage message; /** * The section used to refer to this part. */ protected String section; /** * The size of this part's content in bytes. */ protected int size; /** * The number of text lines of this part's content. */ protected int lines; /* * Multipart content. */ IMAPMultipart multipart = null; /** * Called by the IMAPMessage. */ protected IMAPBodyPart(IMAPMessage message, IMAPMultipart parent, String section, InternetHeaders headers, int size, int lines) throws MessagingException { super(headers, null); this.parent = parent; this.message = message; this.section = section; this.size = size; this.lines = lines; } /** * Fetches the message body. */ void fetchContent() throws MessagingException { String[] commands = new String[1]; commands[0] = "BODY.PEEK[" + section + "]"; fetch(commands); } /* * Perform the IMAP fetch. */ void fetch(String[] commands) throws MessagingException { try { IMAPConnection connection = ((IMAPStore) message.getFolder().getStore()).getConnection(); int msgnum = message.getMessageNumber(); int[] messages = new int[] { msgnum }; synchronized (connection) { MessageStatus[] ms = connection.fetch(messages, commands); for (int i = 0; i < ms.length; i++) { if (ms[i].getMessageNumber() == msgnum) { update(ms[i]); } } } } catch (IOException e) { throw new MessagingException(e.getMessage(), e); } } /* * Update this body part's content from the specified message status * object. */ void update(MessageStatus status) throws MessagingException { List code = status.getCode(); int clen = code.size(); for (int i = 0; i < clen; i += 2) { Object item = code.get(i); String key = null; List params = Collections.EMPTY_LIST; if (item instanceof Pair) { Pair pair = (Pair) item; key = pair.getKey(); params = pair.getValue(); } else if (item instanceof String) { key = (String) item; } else { throw new MessagingException("Unexpected status item: " + item); } if (key == BODY) { int plen = params.size(); if (plen > 0) { Object pitem = params.get(0); String pkey = null; if (pitem instanceof String) { pkey = (String) pitem; } else { throw new MessagingException("Unexpected status item: " + pitem); } if (pkey.equals(section)) { Object c = code.get(i + 1); if (c instanceof byte[]) content = (byte[]) c; else if (c instanceof String) { ContentType ct = new ContentType(getContentType()); String charset = ct.getParameter("charset"); if (charset == null) charset = "US-ASCII"; try { content = ((String) c).getBytes(charset); } catch (IOException e) { MessagingException e2 = new MessagingException(); e2.initCause(e); throw e2; } } else throw new MessagingException("Unexpected MIME body " + "part content: " + c); } else { throw new MessagingException("Unexpected section number: " + pkey); } } else { throw new MessagingException("Not a section!"); } } else { throw new MessagingException("Unknown section status key: " + key); } } } // -- Simple accessors -- /** * Returns the content size of this body part in bytes. */ public int getSize() throws MessagingException { return size; } /** * Returns the number of text lines in the content of this body part. */ public int getLineCount() throws MessagingException { return lines; } // -- Content access -- /** * Returns a data handler for this part's content. */ public DataHandler getDataHandler() throws MessagingException { ContentType ct = new ContentType(getContentType()); if ("multipart".equalsIgnoreCase(ct.getPrimaryType())) { // Our multipart object should already have been configured return new DataHandler(new IMAPMultipartDataSource(multipart)); } else { if (content == null) { fetchContent(); } return super.getDataHandler(); } } public Object getContent() throws MessagingException, IOException { ContentType ct = new ContentType(getContentType()); if ("multipart".equalsIgnoreCase(ct.getPrimaryType())) { return multipart; } return super.getContent(); } /** * Returns the raw content stream. */ protected InputStream getContentStream() throws MessagingException { if (content == null) { fetchContent(); } return super.getContentStream(); } } mail-1.1.2/source/gnu/mail/providers/imap/IMAPFlags.java0000664000076500007650000000646110614714012022344 0ustar dogdog00000000000000/* * IMAPFlags.java * Copyright(C) 2003 Chris Burdess * * This file is part of GNU JavaMail, a library. * * GNU JavaMail is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or *(at your option) any later version. * * GNU JavaMail 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * As a special exception, if you link this library with other files to * produce an executable, this library does not by itself cause the * resulting executable to be covered by the GNU General Public License. * This exception does not however invalidate any other reasons why the * executable file might be covered by the GNU General Public License. */ package gnu.mail.providers.imap; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.List; import javax.mail.Flags; import gnu.inet.imap.IMAPConstants; /** * A Flags implementation that can provide delta flag changes for an IMAP * implementation. * * @author Chris Burdess */ class IMAPFlags extends Flags { Flags saved; /** * Save the state of this flags object. */ void checkpoint() { saved = new Flags(this); } /** * Returns the flags added since the last checkpoint. */ List getAddedFlags() { if (saved == null) { return Collections.EMPTY_LIST; } List current = getIMAPFlags(this); List original = getIMAPFlags(saved); current.removeAll(original); return current; } /** * Returns the flags removed since the last checkpoint. */ List getRemovedFlags() { if (saved == null) { return Collections.EMPTY_LIST; } List current = getIMAPFlags(this); List original = getIMAPFlags(saved); original.removeAll(current); return original; } /** * Returns a list of IMAP flags for the given Flags object. */ static List getIMAPFlags(Flags flags) { Flags.Flag[] sflags = flags.getSystemFlags(); String[] uflags = flags.getUserFlags(); List iflags = new ArrayList(sflags.length + uflags.length); for (int i = 0; i < sflags.length; i++) { Flags.Flag f = sflags[i]; if (f == Flags.Flag.ANSWERED) { iflags.add(IMAPConstants.FLAG_ANSWERED); } else if (f == Flags.Flag.DELETED) { iflags.add(IMAPConstants.FLAG_DELETED); } else if (f == Flags.Flag.DRAFT) { iflags.add(IMAPConstants.FLAG_DRAFT); } else if (f == Flags.Flag.FLAGGED) { iflags.add(IMAPConstants.FLAG_FLAGGED); } else if (f == Flags.Flag.SEEN) { iflags.add(IMAPConstants.FLAG_SEEN); } } iflags.addAll(Arrays.asList(uflags)); return iflags; } } mail-1.1.2/source/gnu/mail/providers/imap/IMAPFolder.java0000664000076500007650000013622010614714012022520 0ustar dogdog00000000000000/* * IMAPFolder.java * Copyright (C) 2003, 2004 Chris Burdess * * This file is part of GNU JavaMail, a library. * * GNU JavaMail is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * GNU JavaMail 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * As a special exception, if you link this library with other files to * produce an executable, this library does not by itself cause the * resulting executable to be covered by the GNU General Public License. * This exception does not however invalidate any other reasons why the * executable file might be covered by the GNU General Public License. */ package gnu.mail.providers.imap; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.Iterator; import java.util.List; import java.util.Map; import javax.mail.Address; import javax.mail.FetchProfile; import javax.mail.Flags; import javax.mail.Folder; import javax.mail.FolderClosedException; import javax.mail.FolderNotFoundException; import javax.mail.IllegalWriteException; import javax.mail.Message; import javax.mail.MessagingException; import javax.mail.MethodNotSupportedException; import javax.mail.Store; import javax.mail.UIDFolder; import javax.mail.event.ConnectionEvent; import javax.mail.event.FolderEvent; import javax.mail.internet.MimeMessage; import javax.mail.search.AddressStringTerm; import javax.mail.search.AddressTerm; import javax.mail.search.AndTerm; import javax.mail.search.BodyTerm; import javax.mail.search.ComparisonTerm; import javax.mail.search.DateTerm; import javax.mail.search.FlagTerm; import javax.mail.search.FromStringTerm; import javax.mail.search.FromTerm; import javax.mail.search.HeaderTerm; import javax.mail.search.IntegerComparisonTerm; import javax.mail.search.MessageIDTerm; import javax.mail.search.MessageNumberTerm; import javax.mail.search.NotTerm; import javax.mail.search.OrTerm; import javax.mail.search.ReceivedDateTerm; import javax.mail.search.RecipientStringTerm; import javax.mail.search.RecipientTerm; import javax.mail.search.SearchTerm; import javax.mail.search.SentDateTerm; import javax.mail.search.SizeTerm; import javax.mail.search.StringTerm; import javax.mail.search.SubjectTerm; import gnu.inet.imap.IMAPConnection; import gnu.inet.imap.IMAPConstants; import gnu.inet.imap.ListEntry; import gnu.inet.imap.MailboxStatus; import gnu.inet.imap.MessageStatus; import gnu.inet.imap.Quota; /** * The folder class implementing the IMAP4rev1 mail protocol. * * @author Chris Burdess */ public class IMAPFolder extends Folder implements UIDFolder { /** * The folder path. */ protected String path; /** * The type of this folder (HOLDS_MESSAGES or HOLDS_FOLDERS). */ protected int type; protected Flags permanentFlags = new Flags(); protected char delimiter; protected int messageCount = -1; protected int newMessageCount = -1; protected long uidValidity = -1L; protected boolean subscribed; private static DateFormat searchdf = new SimpleDateFormat("d-MMM-yyyy"); /** * Constructor. */ protected IMAPFolder(Store store, String path) { this(store, path, -1, '\u0000'); } /** * Constructor. */ protected IMAPFolder(Store store, String path, char delimiter) { this(store, path, -1, delimiter); } /** * Constructor. */ protected IMAPFolder(Store store, String path, int type, char delimiter) { super(store); this.path = path; this.type = type; this.delimiter = delimiter; } /* * Updates this folder from the specified mailbox status object. */ void update(MailboxStatus status, boolean fireEvents) throws MessagingException { if (status == null) { throw new FolderNotFoundException(this); } mode = status.readWrite ? Folder.READ_WRITE : Folder.READ_ONLY; if (status.permanentFlags != null) { permanentFlags = readFlags(status.permanentFlags); } // message counts int oldMessageCount = messageCount; messageCount = status.messageCount; newMessageCount = status.newMessageCount; // uidvalidity uidValidity = status.uidValidity; // fire events if necessary if (fireEvents) { if (messageCount > oldMessageCount) { Message[] m = new Message[messageCount - oldMessageCount]; for (int i = oldMessageCount; i < messageCount; i++) { m[i - oldMessageCount] = getMessage(i); } notifyMessageAddedListeners(m); } else if (messageCount < oldMessageCount) { Message[] m = new Message[oldMessageCount - messageCount]; for (int i = messageCount; i < oldMessageCount; i++) { m[i - messageCount] = getMessage(i); } notifyMessageRemovedListeners(false, m); } } } Flags readFlags(List sflags) { Flags flags = new Flags(); int len = sflags.size(); for (int i = 0; i < len; i++) { String flag = (String) sflags.get(i); if (flag == IMAPConstants.FLAG_ANSWERED) { flags.add(Flags.Flag.ANSWERED); } else if (flag == IMAPConstants.FLAG_DELETED) { flags.add(Flags.Flag.DELETED); } else if (flag == IMAPConstants.FLAG_DRAFT) { flags.add(Flags.Flag.DRAFT); } else if (flag == IMAPConstants.FLAG_FLAGGED) { flags.add(Flags.Flag.FLAGGED); } else if (flag == IMAPConstants.FLAG_RECENT) { flags.add(Flags.Flag.RECENT); } else if (flag == IMAPConstants.FLAG_SEEN) { flags.add(Flags.Flag.SEEN); } // user flags? } return flags; } /** * Returns the name of this folder. */ public String getName() { int di = path.lastIndexOf(delimiter); return (di == -1) ? path : path.substring(di + 1); } /** * Returns the full path of this folder. */ public String getFullName() { return path; } /** * Returns the type of this folder. * @exception MessagingException if a messaging error occurred */ public int getType() throws MessagingException { if (type == -1) { int lsi = path.lastIndexOf(getSeparator()); String parent = (lsi == -1) ? "" : path.substring(0, lsi); String name = (lsi == -1) ? path : path.substring(lsi+1); IMAPConnection connection = ((IMAPStore) store).getConnection(); try { ListEntry[] entries = null; synchronized (connection) { entries = connection.list(parent, name); } if (connection.alertsPending()) { ((IMAPStore) store).processAlerts(); } type = Folder.HOLDS_FOLDERS; if (entries.length > 0) { if (!"".equals(path) && entries[0].isNoinferiors()) { type |= Folder.HOLDS_MESSAGES; } } else { throw new FolderNotFoundException(this); } } catch (IOException e) { throw new MessagingException(e.getMessage(), e); } } return type; } /** * Indicates whether this folder exists. * @exception MessagingException if a messaging error occurred */ public boolean exists() throws MessagingException { try { getType(); } catch (FolderNotFoundException e) { return false; } return true; } /** * Indicates whether this folder contains new messages. * @exception MessagingException if a messaging error occurred */ public boolean hasNewMessages() throws MessagingException { return getNewMessageCount() > 0; // TODO } /** * Opens this folder. * @exception MessagingException if a messaging error occurred */ public void open(int mode) throws MessagingException { IMAPStore s = (IMAPStore) store; IMAPConnection connection = s.getConnection(); try { MailboxStatus status = null; synchronized (connection) { switch (mode) { case Folder.READ_WRITE: status = connection.select(path); break; case Folder.READ_ONLY: status = connection.examine(path); break; default: throw new MessagingException("No such mode: " + mode); } update(status, false); } s.setSelected(this); notifyConnectionListeners(ConnectionEvent.OPENED); if (connection.alertsPending()) { s.processAlerts(); } } catch (IOException e) { throw new MessagingException(e.getMessage(), e); } } /** * Create this folder. */ public boolean create(int type) throws MessagingException { IMAPStore s = (IMAPStore) store; IMAPConnection connection = s.getConnection(); try { String newPath = path; if ((type & HOLDS_FOLDERS) != 0) { getSeparator(); if (delimiter == '\u0000') // this folder cannot be created { throw new FolderNotFoundException(this, newPath); } newPath = new StringBuffer(newPath) .append(delimiter) .toString(); } boolean ret = false; synchronized (connection) { ret = connection.create(newPath); } if (ret) { type = -1; notifyFolderListeners(FolderEvent.CREATED); } if (connection.alertsPending()) { s.processAlerts(); } return ret; } catch (IOException e) { throw new MessagingException(e.getMessage(), e); } } /** * Delete this folder. */ public boolean delete(boolean flag) throws MessagingException { IMAPStore s = (IMAPStore) store; IMAPConnection connection = s.getConnection(); try { boolean ret = false; synchronized (connection) { ret = connection.delete(path); } if (ret) { type = -1; notifyFolderListeners(FolderEvent.DELETED); } if (connection.alertsPending()) { s.processAlerts(); } return ret; } catch (IOException e) { throw new MessagingException(e.getMessage(), e); } } /** * Rename this folder. */ public boolean renameTo(Folder folder) throws MessagingException { IMAPStore s = (IMAPStore) store; IMAPConnection connection = s.getConnection(); try { boolean ret = false; synchronized (connection) { ret = connection.rename(path, folder.getFullName()); } if (ret) { type = -1; notifyFolderRenamedListeners(folder); // do we have to close? } if (connection.alertsPending()) { s.processAlerts(); } return ret; } catch (IOException e) { throw new MessagingException(e.getMessage(), e); } } /** * Closes this folder. * @param expunge if the folder is to be expunged before it is closed * @exception MessagingException if a messaging error occurred */ public void close(boolean expunge) throws MessagingException { if (mode == -1) { return; } IMAPStore s = (IMAPStore) store; boolean selected = s.isSelected(this); if (selected) { s.setSelected(null); } mode = -1; notifyConnectionListeners(ConnectionEvent.CLOSED); if (expunge) { if (!selected) { throw new FolderClosedException(this); } IMAPConnection connection = s.getConnection(); try { boolean success = false; synchronized (connection) { success = connection.close(); } if (connection.alertsPending()) { s.processAlerts(); } if (!success) { throw new IllegalWriteException(); } } catch (IOException e) { throw new MessagingException(e.getMessage(), e); } } } /** * Expunges this folder. * This deletes all the messages marked as deleted. * @exception MessagingException if a messaging error occurred */ public Message[] expunge() throws MessagingException { if (!isOpen()) { throw new MessagingException("Folder is not open"); } if (mode == Folder.READ_ONLY) { throw new MessagingException("Folder was opened read-only"); } IMAPStore s = (IMAPStore) store; IMAPConnection connection = s.getConnection(); try { int[] messageNumbers = null; synchronized (connection) { messageNumbers = connection.expunge(); } // construct empty IMAPMessages for the messageNumbers IMAPMessage[] messages = new IMAPMessage[messageNumbers.length]; for (int i = 0; i < messages.length; i++) { messages[i] = new IMAPMessage(this, messageNumbers[i]); } // do we need to do this? notifyMessageRemovedListeners(true, messages); if (connection.alertsPending()) { s.processAlerts(); } return messages; } catch (IOException e) { throw new MessagingException(e.getMessage(), e); } } /** * Indicates whether this folder is open. */ public boolean isOpen() { return (mode != -1); } /** * Returns the permanent flags for this folder. */ public Flags getPermanentFlags() { return permanentFlags; } /** * Returns the number of messages in this folder. * @exception MessagingException if a messaging error occurred */ public int getMessageCount() throws MessagingException { MailboxStatus ms = null; IMAPStore s = (IMAPStore) store; IMAPConnection connection = s.getConnection(); try { if (mode == -1 || messageCount < 0) { String[] items = new String[1]; items[0] = IMAPConstants.MESSAGES; synchronized (connection) { ms = connection.status(path, items); } update(ms, true); } else // NOOP { synchronized (connection) { ms = connection.noop(); } if (ms != null) { update(ms, true); } } } catch (IOException e) { throw new MessagingException(e.getMessage(), e); } if (connection.alertsPending()) { s.processAlerts(); } return messageCount; } /** * Returns the number of new messages in this folder. * @exception MessagingException if a messaging error occurred */ public int getNewMessageCount() throws MessagingException { MailboxStatus ms = null; IMAPStore s = (IMAPStore) store; IMAPConnection connection = s.getConnection(); try { if (mode == -1 || newMessageCount < 0) { String[] items = new String[1]; items[0] = IMAPConstants.RECENT; synchronized (connection) { ms = connection.status(path, items); update(ms, true); } } else // NOOP { synchronized (connection) { ms = connection.noop(); } if (ms != null) { update(ms, true); } } } catch (IOException e) { throw new MessagingException(e.getMessage(), e); } if (connection.alertsPending()) { s.processAlerts(); } return newMessageCount; } /** * Returns the specified message number from this folder. * The message is only retrieved once from the server. * Subsequent getMessage() calls to the same message are cached. * Since POP3 does not provide a mechanism for retrieving only part of * the message(headers, etc), the entire message is retrieved. * @exception MessagingException if a messaging error occurred */ public Message getMessage(int msgnum) throws MessagingException { if (mode == -1) { throw new FolderClosedException(this); } return new IMAPMessage(this, msgnum); } /** * Appends the specified set of messages to this folder. * Only MimeMessages are accepted. */ public void appendMessages(Message[] messages) throws MessagingException { MimeMessage[] m = new MimeMessage[messages.length]; try { for (int i = 0; i < messages.length; i++) { m[i] = (MimeMessage) messages[i]; } } catch (ClassCastException e) { throw new MessagingException("Only MimeMessages can be appended to " + "this folder"); } IMAPStore s = (IMAPStore) store; IMAPConnection connection = s.getConnection(); try { for (int i = 0; i < m.length; i++) { ByteArrayOutputStream out = new ByteArrayOutputStream(); m[i].writeTo(out); byte[] content = out.toByteArray(); out = null; synchronized (connection) { connection.append(path, null, content); } } if (connection.alertsPending()) { s.processAlerts(); } } catch (IOException e) { throw new MessagingException(e.getMessage(), e); } notifyMessageAddedListeners(m); } /** * IMAP fetch routine. * This executes the fetch for the specified message numbers * and updates the messages according to the message statuses returned. */ public void fetch(Message[] messages, FetchProfile fp) throws MessagingException { if (!isOpen()) { throw new FolderClosedException(this); } // decide which commands to send String[] headers = fp.getHeaderNames(); List l = new ArrayList(); if (fp.contains(FetchProfile.Item.CONTENT_INFO)) { l.add(IMAPMessage.FETCH_CONTENT); } else if (fp.contains(FetchProfile.Item.ENVELOPE)) { l.add(IMAPMessage.FETCH_HEADERS); } else if (headers.length > 0) { // specified headers only StringBuffer hbuf = new StringBuffer("BODY.PEEK[HEADER.FIELDS("); for (int i = 0; i < headers.length; i++) { if (i > 0) { hbuf.append(' '); } hbuf.append(headers[i]); } hbuf.append(')'); hbuf.append(']'); l.add(hbuf.toString()); } if (fp.contains(FetchProfile.Item.FLAGS)) { l.add(IMAPConstants.FLAGS); } l.add(IMAPConstants.INTERNALDATE); // for received date int llen = l.size(); if (llen == 0) { return; // no commands to send: don't bother the server } String[] commands = new String[llen]; l.toArray(commands); l = null; // get casted imapmessages and message numbers IMAPMessage[] m = new IMAPMessage[messages.length]; int[] msgnums = new int[messages.length]; try { for (int i = 0; i < messages.length; i++) { m[i] = (IMAPMessage) messages[i]; msgnums[i] = m[i].getMessageNumber(); } } catch (ClassCastException e) { throw new MessagingException("Only IMAPMessages can be fetched"); } // execute IMAPStore s = (IMAPStore) store; IMAPConnection connection = s.getConnection(); try { synchronized (connection) { MessageStatus[] ms = connection.fetch(msgnums, commands); for (int i = 0; i < ms.length; i++) { int msgnum = ms[i].getMessageNumber(); for (int j = 0; j < msgnums.length; j++) { if (msgnums[j] == msgnum) { m[j].update(ms[i]); break; } } } } if (connection.alertsPending()) { s.processAlerts(); } } catch (IOException e) { throw new MessagingException(e.getMessage(), e); } } /** * IMAP search function. */ public Message[] search(SearchTerm term) throws MessagingException { return search(term, null); } /** * IMAP search function. */ public Message[] search(SearchTerm term, Message[] msgs) throws MessagingException { List list = new ArrayList(); if (msgs != null) { // StringBuffer buffer = new StringBuffer(); for (int i = 0; i < msgs.length; i++) { int msgnum = msgs[i].getMessageNumber(); if (i > 0) { buffer.append(','); } buffer.append(msgnum); } list.add(buffer.toString()); } boolean isIMAPSearch = addTerm(term, list); String[] criteria = new String[list.size()]; list.toArray(criteria); IMAPStore s = (IMAPStore) store; IMAPConnection connection = s.getConnection(); try { Message[] messages; if (isIMAPSearch && criteria.length > 0) { int[] mn = null; synchronized (connection) { mn = connection.search(null, criteria); } messages = new Message[mn.length]; for (int i = 0; i < mn.length; i++) messages[i] = new IMAPMessage(this, mn[i]); if (connection.alertsPending()) s.processAlerts(); } else messages = (msgs != null) ? msgs : getMessages(); // Enforce final constraints return super.search(term, messages); } catch (IOException e) { throw new MessagingException(e.getMessage(), e); } } /** * Possibly recursive search term add function. * Note that this is not sufficient to enforce all the constraints imposed * by the SearchTerm structures - this is why we finally call * super.search() in the search method. * @return true if all the terms can be represented in IMAP */ private boolean addTerm(SearchTerm term, List list) { if (term instanceof AndTerm) { SearchTerm[] terms = ((AndTerm) term).getTerms(); for (int i = 0; i < terms.length; i++) { if (!addTerm(terms[i], list)) return false; } } else if (term instanceof OrTerm) { list.add(IMAPConstants.SEARCH_OR); SearchTerm[] terms = ((OrTerm) term).getTerms(); for (int i = 0; i < terms.length; i++) { if (!addTerm(terms[i], list)) return false; } } else if (term instanceof NotTerm) { list.add(IMAPConstants.SEARCH_NOT); if (!addTerm(((NotTerm) term).getTerm(), list)) return false; } else if (term instanceof FlagTerm) { FlagTerm ft = (FlagTerm) term; Flags f = ft.getFlags(); boolean set = ft.getTestSet(); // System flags Flags.Flag[] sf = f.getSystemFlags(); for (int i = 0; i < sf.length; i++) { Flags.Flag ff = sf[i]; if (ff == Flags.Flag.ANSWERED) { list.add(set ? IMAPConstants.SEARCH_ANSWERED : IMAPConstants.SEARCH_UNANSWERED); } else if (ff == Flags.Flag.DELETED) { list.add(set ? IMAPConstants.SEARCH_DELETED : IMAPConstants.SEARCH_UNDELETED); } else if (ff == Flags.Flag.DRAFT) { list.add(set ? IMAPConstants.SEARCH_DRAFT : IMAPConstants.SEARCH_UNDRAFT); } else if (ff == Flags.Flag.FLAGGED) { list.add(set ? IMAPConstants.SEARCH_FLAGGED : IMAPConstants.SEARCH_UNFLAGGED); } else if (ff == Flags.Flag.RECENT) { list.add(set ? IMAPConstants.SEARCH_RECENT : IMAPConstants.SEARCH_OLD); } else if (ff == Flags.Flag.SEEN) { list.add(set ? IMAPConstants.SEARCH_SEEN : IMAPConstants.SEARCH_UNSEEN); } } // Keywords String[] uf = f.getUserFlags(); for (int i = 0; i < uf.length; i++) { StringBuffer keyword = new StringBuffer(); keyword.append(set ? IMAPConstants.SEARCH_KEYWORD : IMAPConstants.SEARCH_UNKEYWORD); keyword.append('"'); keyword.append(uf[i]); keyword.append('"'); list.add(keyword.toString()); } } else if (term instanceof AddressTerm) { Address address = ((AddressTerm) term).getAddress(); StringBuffer criterion = new StringBuffer(); if (term instanceof FromTerm) criterion.append(IMAPConstants.SEARCH_FROM); else if (term instanceof RecipientTerm) { Message.RecipientType rt = ((RecipientTerm) term).getRecipientType(); if (rt == Message.RecipientType.TO) criterion.append(IMAPConstants.SEARCH_TO); else if (rt == Message.RecipientType.CC) criterion.append(IMAPConstants.SEARCH_CC); else if (rt == Message.RecipientType.BCC) criterion.append(IMAPConstants.SEARCH_BCC); else criterion = null; } else criterion = null; if (criterion != null) { criterion.append(' '); criterion.append('"'); criterion.append(address.toString()); criterion.append('"'); list.add(criterion.toString()); } else return false; } else if (term instanceof ComparisonTerm) { if (term instanceof DateTerm) { DateTerm dt = (DateTerm) term; Date date = dt.getDate(); int comparison = dt.getComparison(); StringBuffer criterion = new StringBuffer(); switch (comparison) { case ComparisonTerm.NE: case ComparisonTerm.GE: case ComparisonTerm.LE: criterion.append(IMAPConstants.SEARCH_NOT); criterion.append(' '); } if (term instanceof SentDateTerm) criterion.append("SENT"); switch (comparison) { case ComparisonTerm.EQ: case ComparisonTerm.NE: criterion.append(IMAPConstants.SEARCH_ON); break; case ComparisonTerm.LT: case ComparisonTerm.GE: criterion.append(IMAPConstants.SEARCH_BEFORE); break; case ComparisonTerm.GT: case ComparisonTerm.LE: criterion.append(IMAPConstants.SEARCH_SINCE); break; } criterion.append(' '); criterion.append(searchdf.format(date)); list.add(criterion.toString()); } else if (term instanceof IntegerComparisonTerm) { IntegerComparisonTerm it = (IntegerComparisonTerm) term; int number = it.getNumber(); int comparison = it.getComparison(); if (term instanceof SizeTerm) { StringBuffer criterion = new StringBuffer(); switch (comparison) { case ComparisonTerm.EQ: case ComparisonTerm.GE: case ComparisonTerm.LE: criterion.append(IMAPConstants.SEARCH_NOT); criterion.append(' '); } switch (comparison) { case ComparisonTerm.EQ: case ComparisonTerm.NE: criterion.append(IMAPConstants.SEARCH_OR); criterion.append(' '); criterion.append(IMAPConstants.SEARCH_SMALLER); criterion.append(' '); criterion.append(number); criterion.append(' '); criterion.append(IMAPConstants.SEARCH_LARGER); criterion.append(' '); criterion.append(number); break; case ComparisonTerm.LT: case ComparisonTerm.GE: criterion.append(IMAPConstants.SEARCH_SMALLER); criterion.append(' '); criterion.append(number); break; case ComparisonTerm.GT: case ComparisonTerm.LE: criterion.append(IMAPConstants.SEARCH_LARGER); criterion.append(' '); criterion.append(number); break; } list.add(criterion.toString()); } else return false; } } else if (term instanceof StringTerm) { String pattern = ((StringTerm) term).getPattern(); StringBuffer criterion = new StringBuffer(); if (term instanceof BodyTerm) { criterion.append(IMAPConstants.SEARCH_BODY); } else if (term instanceof HeaderTerm) { criterion.append(IMAPConstants.SEARCH_HEADER); criterion.append(' '); criterion.append(((HeaderTerm) term).getHeaderName()); } else if (term instanceof SubjectTerm) { criterion.append(IMAPConstants.SEARCH_SUBJECT); } else if (term instanceof MessageIDTerm) { criterion.append(IMAPConstants.SEARCH_HEADER); criterion.append(' '); criterion.append("Message-ID"); } else criterion = null; // TODO StringAddressTerms? if (criterion != null) { criterion.append(' '); criterion.append('"'); criterion.append(pattern); criterion.append('"'); list.add(criterion.toString()); } else return false; } else return false; return true; } public boolean isSubscribed() { return subscribed; } public void setSubscribed(boolean flag) throws MessagingException { IMAPStore s = (IMAPStore) store; IMAPConnection connection = s.getConnection(); try { synchronized (connection) { if (flag) { connection.subscribe(path); } else { connection.unsubscribe(path); } } } catch (IOException e) { throw new MessagingException(e.getMessage(), e); } } /** * Returns the subfolders for this folder. */ public Folder[] list(String pattern) throws MessagingException { char sep = getSeparator(); String spec = ("".equals(path)) ? path : new StringBuffer(path).append(sep).append(pattern).toString(); IMAPStore s = (IMAPStore) store; IMAPConnection connection = s.getConnection(); try { ListEntry[] entries; synchronized (connection) { entries = connection.list("", spec); } if (connection.alertsPending()) { s.processAlerts(); } return getFolders(entries, false); } catch (IOException e) { throw new MessagingException(e.getMessage(), e); } } /** * Returns the subscribed subfolders for this folder. */ public Folder[] listSubscribed(String pattern) throws MessagingException { char sep = getSeparator(); String spec = ("".equals(path)) ? path : new StringBuffer(path).append(sep).append(pattern).toString(); IMAPStore s = (IMAPStore) store; IMAPConnection connection = s.getConnection(); try { ListEntry[] entries = null; synchronized (connection) { entries = connection.lsub("", spec); } if (connection.alertsPending()) { s.processAlerts(); } return getFolders(entries, true); } catch (IOException e) { throw new MessagingException(e.getMessage(), e); } } /* * Returns a set of folders for a corresponding set of list entries. */ Folder[] getFolders(ListEntry[] entries, boolean subscribed) throws MessagingException { List unique = new ArrayList(entries.length); for (int i = 0; i < entries.length; i++) { ListEntry entry = entries[i]; int etype = entry.isNoinferiors() ? Folder.HOLDS_MESSAGES : Folder.HOLDS_FOLDERS; if (!entry.isNoselect()) { IMAPFolder f = new IMAPFolder(store, entry.getMailbox(), etype, entry.getDelimiter()); if (!unique.contains(f)) { unique.add(f); f.subscribed = subscribed; } } } Folder[] folders = new Folder[unique.size()]; unique.toArray(folders); return folders; } /** * Returns the parent folder of this folder. */ public Folder getParent() throws MessagingException { IMAPStore s = (IMAPStore) store; IMAPConnection connection = s.getConnection(); getSeparator(); int di = path.lastIndexOf(delimiter); if (di == -1) { return s.getDefaultFolder(); } return new IMAPFolder(store, path.substring(0, di), delimiter); } /** * Returns a subfolder with the specified name. */ public Folder getFolder(String name) throws MessagingException { StringBuffer buf = new StringBuffer(); if (path != null && path.length() > 0) { buf.append(path); buf.append(delimiter); } buf.append(name); return new IMAPFolder(store, buf.toString(), -1, getSeparator()); } /** * Returns the path separator charcter. */ public char getSeparator() throws MessagingException { if (delimiter == '\u0000') { IMAPStore s = (IMAPStore) store; IMAPConnection connection = s.getConnection(); try { ListEntry[] entries = null; synchronized (connection) { entries = connection.list(path, null); } if (connection.alertsPending()) { s.processAlerts(); } if (entries.length > 0) { delimiter = entries[0].getDelimiter(); } else { throw new FolderNotFoundException(this); } } catch (IOException e) { throw new MessagingException(e.getMessage(), e); } } return delimiter; } public boolean equals(Object other) { if (other instanceof IMAPFolder) { return ((IMAPFolder) other).path.equals(path); } return super.equals(other); } // -- UIDFolder -- public long getUIDValidity() throws MessagingException { MailboxStatus ms = null; IMAPStore s = (IMAPStore) store; IMAPConnection connection = s.getConnection(); try { if (mode == -1 || uidValidity < 0L) { String[] items = new String[1]; items[0] = IMAPConstants.UIDVALIDITY; synchronized (connection) { ms = connection.status(path, items); } update(ms, true); } else // NOOP { synchronized (connection) { ms = connection.noop(); } if (ms != null) { update(ms, true); } } } catch (IOException e) { throw new MessagingException(e.getMessage(), e); } if (connection.alertsPending()) { s.processAlerts(); } return uidValidity; } public Message getMessageByUID(long uid) throws MessagingException { if (mode == -1) { throw new FolderClosedException(this); } MessageStatus ms = null; IMAPStore s = (IMAPStore) store; IMAPConnection connection = s.getConnection(); try { String[] cmds = new String[] { IMAPConstants.FLAGS }; synchronized (connection) { ms = connection.uidFetch(uid, cmds); } } catch (IOException e) { throw new MessagingException(e.getMessage(), e); } if (connection.alertsPending()) { s.processAlerts(); } IMAPMessage message = new IMAPMessage(this, ms.getMessageNumber()); message.update(ms); return message; } public Message[] getMessagesByUID(long start, long end) throws MessagingException { if (mode == -1) { throw new FolderClosedException(this); } MessageStatus[] ms = null; IMAPStore s = (IMAPStore) store; IMAPConnection connection = s.getConnection(); try { String[] cmds = new String[] { IMAPConstants.FLAGS }; synchronized (connection) { ms = connection.uidFetch(start, end, cmds); } } catch (IOException e) { throw new MessagingException(e.getMessage(), e); } if (connection.alertsPending()) { s.processAlerts(); } Message[] messages = new Message[ms.length]; for (int i = 0; i < messages.length; i++) { IMAPMessage message = new IMAPMessage(this, ms[i].getMessageNumber()); message.update(ms[i]); messages[i] = message; } return messages; } public Message[] getMessagesByUID(long[] uids) throws MessagingException { if (mode == -1) { throw new FolderClosedException(this); } MessageStatus[] ms = null; IMAPStore s = (IMAPStore) store; IMAPConnection connection = s.getConnection(); try { String[] cmds = new String[] { IMAPConstants.FLAGS }; synchronized (connection) { ms = connection.uidFetch(uids, cmds); } } catch (IOException e) { throw new MessagingException(e.getMessage(), e); } if (connection.alertsPending()) { s.processAlerts(); } Message[] messages = new Message[ms.length]; for (int i = 0; i < messages.length; i++) { IMAPMessage message = new IMAPMessage(this, ms[i].getMessageNumber()); message.update(ms[i]); messages[i] = message; } return messages; } public long getUID(Message message) throws MessagingException { if (mode == -1) { throw new FolderClosedException(this); } if (!(message instanceof IMAPMessage)) { throw new MethodNotSupportedException("not an IMAPMessage"); } IMAPMessage m = (IMAPMessage) message; if (m.uid == -1L) { m.fetchUID(); } return m.uid; } /** * Returns the quotas for this folder. */ public Quota[] getQuota() throws MessagingException { if (mode == -1) { throw new FolderClosedException(this); } IMAPStore s = (IMAPStore) store; synchronized (s) { try { return s.connection.getquotaroot(path); } catch (IOException e) { throw new MessagingException(e.getMessage(), e); } } } /** * Returns the number of unread messages in this folder. * @see javax.mail.Folder#getUnreadMessageCount() */ public synchronized int getUnreadMessageCount() throws MessagingException { return getMessageCountByCriteria("NOT SEEN"); } /** * Returns the number of deleted messages in this folder. * @see javax.mail.Folder#getDeletedMessageCount() */ public synchronized int getDeletedMessageCount() throws MessagingException { return getMessageCountByCriteria("DELETED"); } /** * Convenience method for returning the number of messages in the * current folder that match the single criteria. */ public int getMessageCountByCriteria(String criteria) throws MessagingException { if (!isOpen()) { return -1; } IMAPStore s = (IMAPStore) store; IMAPConnection connection = s.getConnection(); String[] criterias = new String[] { criteria }; int[] ids = null; try { ids = connection.search(null, criterias); } catch (IOException e) { throw new MessagingException(e.getMessage(), e); } return ids.length; } /** * Returns the access control list for this folder. * This is an array of access control entries. * @deprecated this API will probably change incompatibly soon */ public ACL[] getACL() throws MessagingException { if (!isOpen()) { return null; } IMAPStore s = (IMAPStore) store; IMAPConnection connection = s.getConnection(); List acc = new ArrayList(); try { Map acl = connection.getacl(path); for (Iterator i = acl.entrySet().iterator(); i.hasNext(); ) { Map.Entry entry = (Map.Entry) i.next(); String name = (String) entry.getKey(); Integer rights = (Integer) entry.getValue(); ACL ace = new ACL(name); if (rights != null) { ace.rights = new Rights(); ace.rights.rights = rights.intValue(); } acc.add(ace); } } catch (IOException e) { throw new MessagingException(e.getMessage(), e); } ACL[] ret = new ACL[acc.size()]; acc.toArray(ret); return ret; } /** * Adds the specified access control entry to this folder. * @param ace the access control entry * @deprecated this API will probably change incompatibly soon */ public void addACL(ACL ace) throws MessagingException { if (!isOpen()) { return; } IMAPStore s = (IMAPStore) store; IMAPConnection connection = s.getConnection(); try { Rights aceRights = ace.getRights(); if (aceRights != null) { int rights = connection.listrights(path, ace.name); rights |= aceRights.rights; if (!connection.setacl(path, ace.name, rights)) { throw new MessagingException("can't set ACL"); } } } catch (IOException e) { throw new MessagingException(e.getMessage(), e); } } /** * Removes the ACL for the given principal. * @param name the name of the principal * @deprecated this API will probably change incompatibly soon */ public void removeACL(String name) throws MessagingException { if (!isOpen()) { return; } IMAPStore s = (IMAPStore) store; IMAPConnection connection = s.getConnection(); try { if (!connection.deleteacl(path, name)) { throw new MessagingException("can't delete ACL"); } } catch (IOException e) { throw new MessagingException(e.getMessage(), e); } } /** * Adds the rights for the specified access control entry. * @param ace the access control entry * @deprecated this API will probably change incompatibly soon */ public void addRights(ACL ace) throws MessagingException { addACL(ace); } /** * Removes the rights specified in the given access control entry from the * principal. * @param ace the access control entry * @deprecated this API will probably change incompatibly soon */ public void removeRights(ACL ace) throws MessagingException { if (!isOpen()) { return; } IMAPStore s = (IMAPStore) store; IMAPConnection connection = s.getConnection(); try { Rights aceRights = ace.getRights(); if (aceRights != null) { int rights = connection.listrights(path, ace.name); rights -= aceRights.rights; if (!connection.setacl(path, ace.name, rights)) { throw new MessagingException("can't set ACL"); } } } catch (IOException e) { throw new MessagingException(e.getMessage(), e); } } /** * Returns the rights currently assigned to the given principal. * @param name the name of the principal * @deprecated this API will probably change incompatibly soon */ public Rights listRights(String name) throws MessagingException { if (!isOpen()) { return null; } IMAPStore s = (IMAPStore) store; IMAPConnection connection = s.getConnection(); try { Rights rights = new Rights(); rights.rights = connection.listrights(path, name); return rights; } catch (IOException e) { throw new MessagingException(e.getMessage(), e); } } /** * Returns the rights assigned to the currently authenticated principal. * @deprecated this API will probably change incompatibly soon */ public Rights myRights() throws MessagingException { if (!isOpen()) { return null; } IMAPStore s = (IMAPStore) store; IMAPConnection connection = s.getConnection(); try { Rights rights = new Rights(); rights.rights = connection.myrights(path); return rights; } catch (IOException e) { throw new MessagingException(e.getMessage(), e); } } } mail-1.1.2/source/gnu/mail/providers/imap/IMAPMessage.java0000664000076500007650000005600410614714012022672 0ustar dogdog00000000000000/* * IMAPMessage.java * Copyright(C) 2003 Chris Burdess * * This file is part of GNU JavaMail, a library. * * GNU JavaMail is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or *(at your option) any later version. * * GNU JavaMail 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * As a special exception, if you link this library with other files to * produce an executable, this library does not by itself cause the * resulting executable to be covered by the GNU General Public License. * This exception does not however invalidate any other reasons why the * executable file might be covered by the GNU General Public License. */ package gnu.mail.providers.imap; import java.io.ByteArrayInputStream; import java.io.InputStream; import java.io.IOException; import java.io.OutputStream; import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.Date; import java.util.Enumeration; import java.util.Iterator; import java.util.List; import javax.activation.DataHandler; import javax.mail.Flags; import javax.mail.Folder; import javax.mail.Message; import javax.mail.MessagingException; import javax.mail.Part; import javax.mail.internet.ContentType; import javax.mail.internet.InternetHeaders; import javax.mail.internet.ParameterList; import javax.mail.internet.MimeMessage; import gnu.inet.imap.IMAPConnection; import gnu.inet.imap.IMAPConstants; import gnu.inet.imap.MessageStatus; import gnu.inet.imap.Pair; import gnu.mail.providers.ReadOnlyMessage; /** * The message class implementing the IMAP4 mail protocol. * * @author Chris Burdess * @version 1.0 */ public final class IMAPMessage extends ReadOnlyMessage { static final String FETCH_HEADERS = "BODY.PEEK[HEADER]"; static final String FETCH_CONTENT = "BODY.PEEK[]"; static final String PLUS_FLAGS = "+FLAGS"; static final String MINUS_FLAGS = "-FLAGS"; // BODYSTRUCTURE response atom indices static final int BS_CONTENT_TYPE = 0; static final int BS_CONTENT_SUBTYPE = 1; static final int BS_PARAMETERS = 2; static final int BS_ID = 3; static final int BS_DESCRIPTION = 4; static final int BS_ENCODING = 5; static final int BS_OCTETS = 6; static final int BS_LINES = 7; static final int BS_EXT_DISPOSITION = 8; static final int BS_EXT_LANGUAGE = 9; /** * If set, this contains the string value of the received date. */ protected String internalDate = null; /** * The UID associated with this message. */ protected long uid = -1L; /** * The date format used to parse IMAP INTERNALDATE values. */ protected static final DateFormat internalDateFormat = new SimpleDateFormat("dd-MMM-yyyy hh:mm:ss zzzzz"); /** * If set, the current set of headers is complete. * If false, and a header is requested but returns null, all headers will * be requested from the server. */ protected boolean headersComplete = false; /* * Parsed multipart object representing this message's content. */ private IMAPMultipart multipart = null; IMAPMessage(IMAPFolder folder, InputStream in, int msgnum) throws MessagingException { super(folder, in, msgnum); flags = null; } IMAPMessage(IMAPFolder folder, int msgnum) throws MessagingException { super(folder, msgnum); flags = null; } /** * Fetches the flags fo this message. */ void fetchFlags() throws MessagingException { String[] commands = new String[] { IMAPConstants.FLAGS }; fetch(commands); } /** * Fetches the message header. */ void fetchHeaders() throws MessagingException { String[] commands = new String[] { FETCH_HEADERS, IMAPConstants.INTERNALDATE }; fetch(commands); } /** * Fetches the message body. */ void fetchContent() throws MessagingException { String[] commands = new String[] { FETCH_CONTENT, IMAPConstants.INTERNALDATE }; fetch(commands); } /** * Fetches the multipart corresponding to the message body. */ void fetchMultipart() throws MessagingException { String[] commands = new String[] { IMAPConstants.BODYSTRUCTURE }; fetch(commands); } /** * Fetches the UID. */ void fetchUID() throws MessagingException { String[] commands = new String[] { IMAPConstants.UID }; fetch(commands); } /** * Generic fetch routine. */ void fetch(String[] commands) throws MessagingException { try { IMAPConnection connection = ((IMAPStore) folder.getStore()).getConnection(); // Select folder if (!folder.isOpen()) { folder.open(Folder.READ_WRITE); } int[] messages = new int[] { msgnum }; synchronized (connection) { MessageStatus[] ms = connection.fetch(messages, commands); for (int i = 0; i < ms.length; i++) { if (ms[i].getMessageNumber() == msgnum) { update(ms[i]); } } } } catch (IOException e) { throw new MessagingException(e.getMessage(), e); } } /** * Updates this message using the specified message status object. */ void update(MessageStatus status) throws MessagingException { List code = status.getCode(); int clen = code.size(); for (int i = 0; i < clen; i += 2) { Object item = code.get(i); String key = null; List params = Collections.EMPTY_LIST; if (item instanceof Pair) { Pair pair = (Pair) item; key = pair.getKey(); params = pair.getValue(); } else if (item instanceof String) { key = (String) item; } else { throw new MessagingException("Unexpected status item: " + item); } if (key == IMAPConstants.BODY || key == IMAPConstants.RFC822) { byte[] literal = (byte[]) code.get(i + 1); int plen = params.size(); if (plen == 0) { InputStream in = new ByteArrayInputStream(literal); parse(in); } else { for (int pi = 0; pi < plen; pi += 2) { Object pitem = params.get(pi); String pkey = null; if (pitem instanceof String) { pkey = (String) pitem; } else { throw new MessagingException("Unexpected status item: " + pitem); } if (pkey == IMAPConstants.HEADER) { InputStream in = new ByteArrayInputStream(literal); headers = createInternetHeaders(in); headersComplete = true; } else if (pkey == IMAPConstants.HEADER_FIELDS) { if (!headersComplete) { InputStream in = new ByteArrayInputStream(literal); headers = createInternetHeaders(in); } } else { throw new MessagingException("Unknown message status key: " + pkey); } } } } else if (key == IMAPConstants.RFC822_HEADER) { byte[] literal = (byte[]) code.get(i + 1); InputStream in = new ByteArrayInputStream(literal); headers = createInternetHeaders(in); headersComplete = true; } else if (key == IMAPConstants.BODYSTRUCTURE) { List mlist = (List) code.get(i + 1); if (headers == null) { headers = new InternetHeaders(); } multipart = parseMultipart(mlist, this, headers, null); } else if (key == IMAPConstants.ENVELOPE) { // TODO } else if (key == IMAPConstants.FLAGS) { List fl = (List) code.get(i + 1); flags = new IMAPFlags(); for (Iterator j = fl.iterator(); j.hasNext(); ) { Object f = j.next(); if (f == IMAPConstants.FLAG_ANSWERED) { flags.add(Flags.Flag.ANSWERED); } else if (f == IMAPConstants.FLAG_DELETED) { flags.add(Flags.Flag.DELETED); } else if (f == IMAPConstants.FLAG_DRAFT) { flags.add(Flags.Flag.DRAFT); } else if (f == IMAPConstants.FLAG_FLAGGED) { flags.add(Flags.Flag.FLAGGED); } else if (f == IMAPConstants.FLAG_RECENT) { flags.add(Flags.Flag.RECENT); } else if (f == IMAPConstants.FLAG_SEEN) { flags.add(Flags.Flag.SEEN); } else if (f instanceof String) { flags.add((String) f); } } ((IMAPFlags) flags).checkpoint(); } else if (key == IMAPConstants.INTERNALDATE) { internalDate = (String) code.get(i + 1); } else if (key==IMAPConstants.UID) { uid = Long.parseLong((String) code.get(i + 1)); } else { throw new MessagingException("Unknown message status key: " + key); } } } /* * Parse a multipart content object for the specified multipart Part. */ IMAPMultipart parseMultipart(List list, Part parent, InternetHeaders parentHeaders, String baseSection) throws MessagingException { int len = list.size(); if (len == 0) { throw new MessagingException("Empty [MIME-IMB] structure"); } int offset = 0; // First parts, in lists Object value = list.get(offset); List partList = new ArrayList(); List sectionList = new ArrayList(); for (; value instanceof List; value = list.get(++offset)) { String section = (baseSection == null) ? Integer.toString(offset+1) : baseSection + "." +(offset + 1); partList.add(value); sectionList.add(section); } // Next the multipart subtype String subtype = parseAtom(value).toLowerCase(); IMAPMultipart m = new IMAPMultipart(this, parent, subtype); ContentType ct = new ContentType(m.getContentType()); // Add the parts for (int i = 0; i < offset; i++) { List part = (List) partList.get(i); String section = (String) sectionList.get(i); m.addBodyPart(parseBodyPart(part, m, section)); } // Now extension data //offset++; if (offset < len) { // Last 2 are disposition and language String disposition = parseAtom(list.get(len - 2)); String language = parseAtom(list.get(len - 1)); if (disposition != null) { parentHeaders.setHeader("Content-Disposition", disposition); } if (language != null) { parentHeaders.setHeader("Content-Language", language); } // Next any parameters // Note that there should only be 1 slot containing a list, // but servers sometimes return multiple lists List plist = new ArrayList(); for (int i = offset; i < len - 2; i++) { value = list.get(i); if (value instanceof List) { plist.addAll((List) value); } } if (plist.size() > 0) { ParameterList params = parseParameterList(plist); ct = new ContentType(ct.getPrimaryType(), subtype, params); } } parentHeaders.setHeader("Content-Type", ct.toString()); return m; } /* * Parse a body part for the specified multipart content object. */ IMAPBodyPart parseBodyPart(List list, IMAPMultipart parent, String section) throws MessagingException { int len = list.size(); if (len == 0) { throw new MessagingException("Empty [MIME-IMB] structure"); } Object arg1 = list.get(0); if (arg1 instanceof List) { // Multipart body part InternetHeaders h = new InternetHeaders(); IMAPBodyPart part = new IMAPBodyPart(this, parent, section, h, -1, -1); IMAPMultipart m = parseMultipart(list, part, h, section); part.multipart = m; return part; } if (len < 8) { throw new MessagingException("Unexpected number of fields in " + "[MIME-IMB] structure: " + list); } // Basic fields String type = parseAtom(list.get(BS_CONTENT_TYPE)).toLowerCase(); String subtype = parseAtom(list.get(BS_CONTENT_SUBTYPE)).toLowerCase(); ParameterList params = parseParameterList(list.get(BS_PARAMETERS)); String id = parseAtom(list.get(BS_ID)); String description = parseAtom(list.get(BS_DESCRIPTION)); String encoding = parseAtom(list.get(BS_ENCODING)); String sizeVal = parseAtom(list.get(BS_OCTETS)); String linesVal = parseAtom(list.get(BS_LINES)); int size = -1; int lines = -1; try { if (sizeVal != null) { size = Integer.parseInt(sizeVal); } if (linesVal != null) { lines = Integer.parseInt(linesVal); } } catch (NumberFormatException e) { throw new MessagingException("Expecting number in [MIME-IMB] " + "structure: " + list); } ContentType ct = new ContentType(type, subtype, params); InternetHeaders h = new InternetHeaders(); h.setHeader("Content-Type", ct.toString()); if (id != null) { h.setHeader("Content-Id", id); } if (description != null) { h.setHeader("Content-Description", description); } if (encoding != null) { h.setHeader("Content-Transfer-Encoding", encoding); } // Extension fields if (len > 8) { Object dispositionVal = list.get(BS_EXT_DISPOSITION); String disposition = parseAtom(dispositionVal); if (disposition != null) { h.setHeader("Content-Disposition", disposition); } else if (dispositionVal instanceof List) { List d = (List) dispositionVal; if (d != null && d.size() == 2) { disposition = parseAtom(d.get(0)); ParameterList pl = parseParameterList(d.get(1)); h.setHeader("Content-Disposition", disposition + pl.toString()); } } } if (len > 9) { String language = parseAtom(list.get(BS_EXT_LANGUAGE)); if (language != null) { h.setHeader("Content-Language", language); } } return new IMAPBodyPart(this, parent, section, h, size, lines); } String parseAtom(Object value) { if (value instanceof String && !(value.equals(IMAPConstants.NIL))) { return (String) value; } return null; } ParameterList parseParameterList(Object params) { if (params instanceof List) { List list = (List) params; int len = list.size(); ParameterList plist = new ParameterList(); for (int i = 0; i < len - 1; i += 2) { Object key = list.get(i); Object value = list.get(i + 1); if (key instanceof String && value instanceof String) { String atom = parseAtom(value); if (atom != null) plist.set((String) key, atom); } } return plist; } return null; } /** * Returns the date on which this message was received. */ public Date getReceivedDate() throws MessagingException { if (internalDate == null && headers == null) { fetchHeaders(); // seems reasonable } if (internalDate == null) { return null; } try { return internalDateFormat.parse(internalDate); } catch (ParseException e) { throw new MessagingException(e.getMessage(), e); } } // -- Content access -- /** * Returns a data handler for this message's content. */ public DataHandler getDataHandler() throws MessagingException { // Hook into BODYSTRUCTURE method ContentType ct = new ContentType(getContentType()); // TODO message/* content-types if ("multipart".equalsIgnoreCase(ct.getPrimaryType())) { if (multipart == null) { fetchMultipart(); } return new DataHandler(new IMAPMultipartDataSource(multipart)); } if (content == null) { fetchContent(); } return super.getDataHandler(); } public Object getContent() throws MessagingException, IOException { ContentType ct = new ContentType(getContentType()); if ("multipart".equalsIgnoreCase(ct.getPrimaryType())) { if (multipart == null) { fetchMultipart(); } return multipart; } return super.getContent(); } /** * Returns the raw content stream. */ protected InputStream getContentStream() throws MessagingException { if (content == null) { fetchContent(); } return super.getContentStream(); } // -- Header access -- /** * Returns the specified header field. */ public String[] getHeader(String name) throws MessagingException { if (headers == null) { fetchHeaders(); } String[] header = super.getHeader(name); if (header == null && !headersComplete) { fetchHeaders(); } header = super.getHeader(name); return header; } /** * Returns the specified header field. */ public String getHeader(String name, String delimiter) throws MessagingException { if (headers == null) { fetchHeaders(); } String header = super.getHeader(name, delimiter); if (header == null && !headersComplete) { fetchHeaders(); } header = super.getHeader(name, delimiter); return header; } public Enumeration getAllHeaders() throws MessagingException { if (!headersComplete) { fetchHeaders(); } return super.getAllHeaders(); } public Enumeration getAllHeaderLines() throws MessagingException { if (!headersComplete) { fetchHeaders(); } return super.getAllHeaderLines(); } public Enumeration getMatchingHeaders(String[] names) throws MessagingException { if (!headersComplete) { fetchHeaders(); } return super.getMatchingHeaders(names); } public Enumeration getMatchingHeaderLines(String[] names) throws MessagingException { if (!headersComplete) { fetchHeaders(); } return super.getMatchingHeaderLines(names); } public Enumeration getNonMatchingHeaders(String[] names) throws MessagingException { if (!headersComplete) { fetchHeaders(); } return super.getNonMatchingHeaders(names); } public Enumeration getNonMatchingHeaderLines(String[] names) throws MessagingException { if (!headersComplete) { fetchHeaders(); } return super.getNonMatchingHeaderLines(names); } // -- Flags access -- public Flags getFlags() throws MessagingException { if (flags == null) { fetchFlags(); } return super.getFlags(); } public boolean isSet(Flags.Flag flag) throws MessagingException { if (flags == null) { fetchFlags(); } return super.isSet(flag); } /** * Set the specified flags. */ public void setFlags(Flags flag, boolean set) throws MessagingException { if (flags == null) { fetchFlags(); } try { if (set) { flags.add(flag); } else { flags.remove(flag); } // Create lists of flags to send to the server IMAPFlags iflags = (IMAPFlags) flags; List aflagList = iflags.getAddedFlags(); String[] aflags = new String[aflagList.size()]; aflagList.toArray(aflags); List rflagList = iflags.getRemovedFlags(); String[] rflags = new String[rflagList.size()]; rflagList.toArray(rflags); // Perform store if (aflags.length > 0 || rflags.length > 0) { IMAPStore store = (IMAPStore) folder.getStore(); IMAPConnection c = store.getConnection(); int[] messages = new int[] { msgnum }; if (aflags.length > 0) { c.store(messages, PLUS_FLAGS, aflags); } if (rflags.length > 0) { c.store(messages, MINUS_FLAGS, rflags); } flags = null; // Reread from server next time } } catch (IOException e) { flags = null; // will be re-read next time throw new MessagingException(e.getMessage(), e); } } // -- Utility -- public void writeTo(OutputStream msgStream) throws IOException, MessagingException { if (headers == null) { fetchHeaders(); } if (content == null) { fetchContent(); } super.writeTo(msgStream); } public void writeTo(OutputStream msgStream, String[] ignoreList) throws IOException, MessagingException { if (headers == null) { fetchHeaders(); } if (content == null) { fetchContent(); } super.writeTo(msgStream, ignoreList); } } mail-1.1.2/source/gnu/mail/providers/imap/IMAPMultipart.java0000664000076500007650000000362010614714012023263 0ustar dogdog00000000000000/* * IMAPMultipart.java * Copyright(C) 2003 Chris Burdess * * This file is part of GNU JavaMail, a library. * * GNU JavaMail is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or *(at your option) any later version. * * GNU JavaMail 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * As a special exception, if you link this library with other files to * produce an executable, this library does not by itself cause the * resulting executable to be covered by the GNU General Public License. * This exception does not however invalidate any other reasons why the * executable file might be covered by the GNU General Public License. */ package gnu.mail.providers.imap; import java.io.InputStream; import java.io.IOException; import java.io.OutputStream; import java.net.ProtocolException; import javax.mail.MultipartDataSource; import javax.mail.Part; import javax.mail.internet.MimeMultipart; /** * An IMAP multipart component. * * @author Chris Burdess * @version 0.1 */ public class IMAPMultipart extends MimeMultipart { /** * The message this multipart belongs to. */ protected IMAPMessage message; /** * Called by the IMAPMessage. */ protected IMAPMultipart(IMAPMessage message, Part parent, String subtype) { super(subtype); setParent(parent); this.message = message; } } mail-1.1.2/source/gnu/mail/providers/imap/IMAPMultipartDataSource.java0000664000076500007650000000735510614714012025247 0ustar dogdog00000000000000/* * IMAPMultipartDataSource.java * Copyright(C) 2003 Chris Burdess * * This file is part of GNU JavaMail, a library. * * GNU JavaMail is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or *(at your option) any later version. * * GNU JavaMail 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * As a special exception, if you link this library with other files to * produce an executable, this library does not by itself cause the * resulting executable to be covered by the GNU General Public License. * This exception does not however invalidate any other reasons why the * executable file might be covered by the GNU General Public License. */ package gnu.mail.providers.imap; import java.io.InputStream; import java.io.IOException; import java.io.OutputStream; import java.net.ProtocolException; import javax.mail.BodyPart; import javax.mail.MessagingException; import javax.mail.MultipartDataSource; import javax.mail.Part; /** * An IMAP multipart component. * * @author Chris Burdess * @version 0.1 */ public class IMAPMultipartDataSource implements MultipartDataSource { /** * The multipart object this data source is associated with. */ protected IMAPMultipart multipart; /** * Called by the IMAPMessage. */ protected IMAPMultipartDataSource(IMAPMultipart multipart) { this.multipart = multipart; } /** * Returns the content description of the body part that contains the * multipart. */ public String getName() { try { return multipart.getParent().getDescription(); } catch (MessagingException e) { return null; } } /** * Returns the content type of the body part that contains the multipart. */ public String getContentType() { try { return multipart.getParent().getContentType(); } catch (MessagingException e) { return null; } } /** * Returns an input stream from which the content of this multipart can be * read. */ public InputStream getInputStream() throws IOException { try { Part part = multipart.getParent(); if (part instanceof IMAPBodyPart) { return ((IMAPBodyPart) part).getContentStream(); } else if (part instanceof IMAPMessage) { return ((IMAPMessage) part).getContentStream(); } else { throw new IOException("Internal error in part structure"); } } catch (MessagingException e) { throw new IOException(e.getMessage()); } } /** * IMAP multiparts are read-only. */ public OutputStream getOutputStream() throws IOException { throw new ProtocolException("IMAP multiparts are read-only"); } /** * Returns the secified sub-part of the multipart. */ public BodyPart getBodyPart(int index) throws MessagingException { return multipart.getBodyPart(index); } /** * Returns the number of sub-parts of the multipart. */ public int getCount() { try { return multipart.getCount(); } catch (MessagingException e) { return 0; } } } mail-1.1.2/source/gnu/mail/providers/imap/IMAPStore.java0000664000076500007650000004307110614714012022402 0ustar dogdog00000000000000/* * IMAPStore.java * Copyright(C) 2003,2004 Chris Burdess * * This file is part of GNU JavaMail, a library. * * GNU JavaMail is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or *(at your option) any later version. * * GNU JavaMail 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * As a special exception, if you link this library with other files to * produce an executable, this library does not by itself cause the * resulting executable to be covered by the GNU General Public License. * This exception does not however invalidate any other reasons why the * executable file might be covered by the GNU General Public License. */ package gnu.mail.providers.imap; import java.io.IOException; import java.io.UnsupportedEncodingException; import java.net.InetAddress; import java.net.UnknownHostException; import java.net.URLDecoder; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.Collections; import java.util.Iterator; import java.util.List; import java.util.StringTokenizer; import javax.mail.Folder; import javax.mail.MessagingException; import javax.mail.MethodNotSupportedException; import javax.mail.PasswordAuthentication; import javax.mail.Session; import javax.mail.Store; import javax.mail.StoreClosedException; import javax.mail.URLName; import javax.mail.event.StoreEvent; import javax.net.ssl.TrustManager; import gnu.inet.imap.IMAPConnection; import gnu.inet.imap.IMAPConstants; import gnu.inet.imap.MailboxStatus; import gnu.inet.imap.Namespaces; import gnu.inet.imap.Quota; /** * The storage class implementing the IMAP4rev1 mail protocol. * * @author Chris Burdess */ public class IMAPStore extends Store { /** * The connection to the IMAP server. */ protected IMAPConnection connection = null; /** * Folder representing the root namespace of the IMAP connection. */ protected IMAPFolder root = null; /** * The currently selected folder. */ protected IMAPFolder selected = null; /** * Constructor. */ public IMAPStore(Session session, URLName url) { super(session, url); } /** * Connects to the IMAP server and authenticates with the specified * parameters. */ protected boolean protocolConnect(String host, int port, String username, String password) throws MessagingException { if (connection != null) { return true; } if (host == null) { host = getProperty("host"); } if (username == null) { username = getProperty("user"); } if (port < 0) { port = getIntProperty("port"); } if (host == null || username == null || password == null) { return false; } synchronized (this) { try { int connectionTimeout = getIntProperty("connectiontimeout"); int timeout = getIntProperty("timeout"); if (session.getDebug()) { IMAPConnection.logger.setLevel(IMAPConnection.IMAP_TRACE); } boolean tls = "imaps".equals(url.getProtocol()); // Locate custom trust manager TrustManager tm = getTrustManager(); connection = new IMAPConnection(host, port, connectionTimeout, timeout, tls, tm); if (propertyIsTrue("debug.ansi")) { connection.setAnsiDebug(true); } List capabilities = connection.capability(); // Ignore tls settings if we are making the connection // to a dedicated SSL port. (imaps) if (!tls && capabilities.contains(IMAPConstants.STARTTLS)) { if (!propertyIsFalse("tls")) { if (tm == null) { tls = connection.starttls(); } else { tls = connection.starttls(tm); } // Capabilities may have changed since STARTTLS if (tls) { capabilities = connection.capability(); } } } if (!tls && "required".equals(getProperty("tls"))) { throw new MessagingException("TLS not available"); } // Build list of available SASL mechanisms List authenticationMechanisms = null; for (Iterator i = capabilities.iterator(); i.hasNext(); ) { String cap = (String) i.next(); if (cap.startsWith("AUTH=")) { if (authenticationMechanisms == null) { authenticationMechanisms = new ArrayList(); } authenticationMechanisms.add(cap.substring(5)); } } // User authentication if (authenticationMechanisms != null && !authenticationMechanisms.isEmpty()) { if (username == null || password == null) { PasswordAuthentication pa = session.getPasswordAuthentication(url); if (pa == null) { InetAddress addr = InetAddress.getByName(host); pa = session.requestPasswordAuthentication(addr, port, "imap", null, null); } if (pa != null) { username = pa.getUserName(); password = pa.getPassword(); } } if (username != null && password != null) { // Discover user ordering preferences for auth // mechanisms String authPrefs = getProperty("auth.mechanisms"); Iterator i = null; if (authPrefs == null) { i = authenticationMechanisms.iterator(); } else { StringTokenizer st = new StringTokenizer(authPrefs, ","); List authPrefList = Collections.list(st); i = authPrefList.iterator(); } // Try each mechanism in the list in turn while (i.hasNext()) { String mechanism = (String) i.next(); if (authenticationMechanisms.contains(mechanism) && connection.authenticate(mechanism, username, password)) { return true; } } } } if (capabilities.contains(IMAPConstants.LOGINDISABLED)) { return false; // sorry } return connection.login(username, password); } catch (UnknownHostException e) { throw new MessagingException(e.getMessage(), e); } catch (IOException e) { throw new MessagingException(e.getMessage(), e); } finally { if (connection != null && connection.alertsPending()) { processAlerts(); } } } } /** * Returns a trust manager used for TLS negotiation. */ protected TrustManager getTrustManager() throws MessagingException { String tmt = getProperty("trustmanager"); if (tmt == null) { return null; } else { try { // Instantiate the trust manager Class t = Class.forName(tmt); TrustManager tm = (TrustManager) t.newInstance(); // If there is a setSession method, call it try { Class[] pt = new Class[] { Session.class }; Method m = t.getMethod("setSession", pt); Object[] args = new Object[] { session }; m.invoke(tm, args); } catch (NoSuchMethodException e) { } return tm; } catch (Exception e) { throw new MessagingException(e.getMessage(), e); } } } /** * Closes the connection. */ public synchronized void close() throws MessagingException { if (connection != null) { synchronized (this) { try { connection.logout(); } catch (IOException e) { } connection = null; } } super.close(); } /** * Returns the root folder. */ public Folder getDefaultFolder() throws MessagingException { if (root == null) { root = new IMAPFolder(this, ""); } return root; } /** * Returns the folder with the specified name. */ public Folder getFolder(String name) throws MessagingException { return new IMAPFolder(this, name); } /** * Returns the folder whose name is the file part of the specified URLName. */ public Folder getFolder(URLName urlname) throws MessagingException { try { String file = URLDecoder.decode(urlname.getFile(), "UTF-8"); return getFolder(file); } catch (UnsupportedEncodingException e) { throw new MessagingException(e.getMessage(), e); } } /** * Uses a NOOP to ensure that the connection to the IMAP server is still * valid. */ public boolean isConnected() { if (!super.isConnected()) return false; try { synchronized (this) { MailboxStatus ms = connection.noop(); if (selected != null) { try { selected.update(ms, true); } catch (MessagingException e) { // Ignore } } } return true; } catch (IOException e) { return false; } } /** * Returns the IMAP connection used by this store. * @exception StoreClosedException if the store is not currently connected */ protected IMAPConnection getConnection() throws StoreClosedException { if (!super.isConnected()) { throw new StoreClosedException(this); } return connection; } /** * Indicates whether the specified folder is selected. */ protected boolean isSelected(IMAPFolder folder) { return folder.equals(selected); } /** * Sets the selected folder. */ protected void setSelected(IMAPFolder folder) { selected = folder; } /** * Process any alerts supplied by the server. */ protected void processAlerts() { String[] alerts = connection.getAlerts(); for (int i = 0; i < alerts.length; i++) { notifyStoreListeners(StoreEvent.ALERT, alerts[i]); } } /** * Returns a list of folders representing personal namespaces. * See RFC 2342 for details. */ public Folder[] getPersonalNamespaces() throws MessagingException { if (!super.isConnected()) { throw new StoreClosedException(this); } synchronized (this) { try { Namespaces ns = connection.namespace(); if (ns == null) { throw new MethodNotSupportedException("IMAP NAMESPACE " + "command not supported"); } Namespaces.Namespace[] n = ns.getPersonal(); if (n == null) return new Folder[0]; Folder[] f = new Folder[n.length]; for (int i = 0; i < n.length; i++) { String prefix = n[i].getPrefix(); char delimiter = n[i].getDelimiter(); f[i] = new IMAPFolder(this, prefix, delimiter); } return f; } catch (IOException e) { throw new MessagingException(e.getMessage(), e); } } } /** * Returns a list of folders representing other users' namespaces. * See RFC 2342 for details. */ public Folder[] getUserNamespaces() throws MessagingException { if (!super.isConnected()) { throw new StoreClosedException(this); } synchronized (this) { try { Namespaces ns = connection.namespace(); if (ns == null) { throw new MethodNotSupportedException("IMAP NAMESPACE " + "command not supported"); } Namespaces.Namespace[] n = ns.getOther(); if (n == null) return new Folder[0]; Folder[] f = new Folder[n.length]; for (int i = 0; i < n.length; i++) { String prefix = n[i].getPrefix(); char delimiter = n[i].getDelimiter(); f[i] = new IMAPFolder(this, prefix, delimiter); } return f; } catch (IOException e) { throw new MessagingException(e.getMessage(), e); } } } /** * Returns a list of folders representing shared namespaces. * See RFC 2342 for details. */ public Folder[] getSharedNamespaces() throws MessagingException { if (!super.isConnected()) { throw new StoreClosedException(this); } synchronized (this) { try { Namespaces ns = connection.namespace(); if (ns == null) { throw new MethodNotSupportedException("IMAP NAMESPACE " + "command not supported"); } Namespaces.Namespace[] n = ns.getShared(); if (n == null) return new Folder[0]; Folder[] f = new Folder[n.length]; for (int i = 0; i < n.length; i++) { String prefix = n[i].getPrefix(); char delimiter = n[i].getDelimiter(); f[i] = new IMAPFolder(this, prefix, delimiter); } return f; } catch (IOException e) { throw new MessagingException(e.getMessage(), e); } } } /** * Returns the quota for the specified quota root. * @param root the quota root */ public Quota getQuota(String root) throws MessagingException { if (!super.isConnected()) { throw new StoreClosedException(this); } synchronized (this) { try { return connection.getquota(root); } catch (IOException e) { throw new MessagingException(e.getMessage(), e); } } } /** * Sets the quota resource set for the specified quota root. * @param root the quota root * @param resources the quota resources to set */ public void setQuota(String root, Quota.Resource[] resources) throws MessagingException { if (!super.isConnected()) { throw new StoreClosedException(this); } synchronized (this) { try { connection.setquota(root, resources); } catch (IOException e) { throw new MessagingException(e.getMessage(), e); } } } // -- Utility methods -- private int getIntProperty(String key) { String value = getProperty(key); if (value != null) { try { return Integer.parseInt(value); } catch (Exception e) { } } return -1; } private boolean propertyIsFalse(String key) { return "false".equals(getProperty(key)); } private boolean propertyIsTrue(String key) { return "true".equals(getProperty(key)); } /* * Returns the provider-specific or general mail property corresponding to * the specified key. */ private String getProperty(String key) { String value = session.getProperty("mail.imap." + key); if (value == null) { value = session.getProperty("mail." + key); } return value; } } mail-1.1.2/source/gnu/mail/providers/imap/package.html0000664000076500007650000000377610614714012022265 0ustar dogdog00000000000000

This is a provider for the Internet Message Access Protocol, version 4rev1 (IMAP4rev1), as detailed in RFC 3501.

This provider supports any supported SASL authentication mechanism including CRAM-MD5 as specified by RFC 2195, and transport layer security (TLS), as described in RFC 2595.

The GNU IMAP Store operates over a single socket connection to the server. It does not use a pool of connections.

This provider supports the following properties:
Name Type Description
mail.imap.host IP address or hostname The IMAP server to connect to.
mail.imap.port integer (>=1) The port to connect to, if not the default.
mail.imap.user username The default username for IMAP.
mail.imap.connectiontimeout integer (>=1) Socket connection timeout, in milliseconds. Default is no timeout.
mail.imap.timeout integer (>=1) Socket I/O timeout, in milliseconds. Default is no timeout.
mail.imap.tls boolean If set to false, TLS negotiation will not be attempted.
mail.imap.trustmanager String The name of a class implementing the javax.net.ssl.TrustManager interface, which will be used to determine trust in TLS negotiation.
mail.imap.auth.mechanisms comma-delimited list of SASL mechanisms If set, only the specified SASL mechanisms will be attempted during authentication, in the given order. If not present, the SASL mechanisms advertised by the server will be used.
mail.imap.debug.ansi boolean If set to true, and mail.debug is also true, and your terminal supports ANSI escape sequences, you will get syntax coloured responses.

mail-1.1.2/source/gnu/mail/providers/imap/Rights.java0000664000076500007650000001133110614714012022071 0ustar dogdog00000000000000/* * Rights.java * Copyright (C) 2005 Chris Burdess * * This file is part of GNU JavaMail, a library. * * GNU JavaMail is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * GNU JavaMail 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * As a special exception, if you link this library with other files to * produce an executable, this library does not by itself cause the * resulting executable to be covered by the GNU General Public License. * This exception does not however invalidate any other reasons why the * executable file might be covered by the GNU General Public License. */ package gnu.mail.providers.imap; import gnu.inet.imap.IMAPConstants; /** * A set of rights, as defined in RFC 2086. * Please note that this API is experimental and will probably change * soon when the IETF working group delivers a a new specification. * * @author Chris Burdess * @deprecated this API will probably change incompatibly soon */ public final class Rights { public static final class Right { public static final Right LOOKUP = new Right(IMAPConstants.RIGHTS_LOOKUP); public static final Right READ = new Right(IMAPConstants.RIGHTS_READ); public static final Right KEEP_SEEN = new Right(IMAPConstants.RIGHTS_SEEN); public static final Right WRITE = new Right(IMAPConstants.RIGHTS_WRITE); public static final Right INSERT = new Right(IMAPConstants.RIGHTS_INSERT); public static final Right POST = new Right(IMAPConstants.RIGHTS_POST); public static final Right CREATE = new Right(IMAPConstants.RIGHTS_CREATE); public static final Right DELETE = new Right(IMAPConstants.RIGHTS_DELETE); public static final Right ADMINISTER = new Right(IMAPConstants.RIGHTS_ADMIN);; final int code; Right(int code) { this.code = code; } public static Right getInstance(char right) { switch (right) { case 'l': return LOOKUP; case 'r': return READ; case 's': return KEEP_SEEN; case 'w': return WRITE; case 'i': return INSERT; case 'p': return POST; case 'c': return CREATE; case 'd': return DELETE; case 'a': return ADMINISTER; default: throw new IllegalArgumentException(); } } public String toString() { switch (code) { case IMAPConstants.RIGHTS_LOOKUP: return "l"; case IMAPConstants.RIGHTS_READ: return "r"; case IMAPConstants.RIGHTS_SEEN: return "s"; case IMAPConstants.RIGHTS_WRITE: return "w"; case IMAPConstants.RIGHTS_INSERT: return "i"; case IMAPConstants.RIGHTS_POST: return "p"; case IMAPConstants.RIGHTS_CREATE: return "c"; case IMAPConstants.RIGHTS_DELETE: return "d"; case IMAPConstants.RIGHTS_ADMIN: return "a"; default: throw new IllegalStateException(); } } } int rights; public Rights() { } public Rights(Rights rights) { this.rights = rights.rights; } public Rights(String rights) { if (rights != null) { int len = rights.length(); for (int i = 0; i < len; i++) this.rights |= Right.getInstance(rights.charAt(i)).code; } } public Rights(Right right) { this.rights = right.code; } public void add(Rights.Right right) { this.rights |= right.code; } public void add(Rights rights) { this.rights |= rights.rights; } public void remove(Rights.Right right) { this.rights -= right.code; } public void remove(Rights rights) { this.rights -= rights.rights; } public boolean contains(Rights.Right right) { return (this.rights & right.code) > 0; } public boolean contains(Rights rights) { return (this.rights & rights.rights) > 0; } public boolean equals(Object obj) { return (obj instanceof Rights && ((Rights) obj).rights == this.rights); } public int hashCode() { return rights; } } mail-1.1.2/source/gnu/mail/providers/maildir/0000775000076500007650000000000010614714024020465 5ustar dogdog00000000000000mail-1.1.2/source/gnu/mail/providers/maildir/MaildirFolder.java0000664000076500007650000005231310614714012024046 0ustar dogdog00000000000000/* * MaildirFolder.java * Copyright(C) 2003 Chris Burdess * * This file is part of GNU JavaMail, a library. * * GNU JavaMail is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or *(at your option) any later version. * * GNU JavaMail 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * As a special exception, if you link this library with other files to * produce an executable, this library does not by itself cause the * resulting executable to be covered by the GNU General Public License. * This exception does not however invalidate any other reasons why the * executable file might be covered by the GNU General Public License. */ package gnu.mail.providers.maildir; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.FilenameFilter; import java.io.InputStream; import java.io.IOException; import java.io.OutputStream; import java.net.InetAddress; import java.util.ArrayList; import java.util.Arrays; import java.util.Date; import java.util.List; import javax.mail.Address; import javax.mail.Flags; import javax.mail.Folder; import javax.mail.FolderNotFoundException; import javax.mail.IllegalWriteException; import javax.mail.Message; import javax.mail.MessagingException; import javax.mail.Store; import javax.mail.URLName; import javax.mail.event.ConnectionEvent; import javax.mail.event.FolderEvent; import javax.mail.internet.MimeMessage; import gnu.inet.util.LineInputStream; /** * The folder class implementing a Maildir-format mailbox. * * @author Chris Burdess */ public final class MaildirFolder extends Folder { /** * Singleton instance of filter. */ static final FilenameFilter filter = new MaildirFilter(); static final String INBOX = "INBOX"; /** * The maildir base directory. */ File maildir; /** * The maildir tmp directory. */ File tmpdir; /** * The maildir new directory. */ MaildirTuple newdir; /** * The maildir cur directory. */ MaildirTuple curdir; int type; boolean inbox; static Flags permanentFlags = new Flags(); static long deliveryCount = 0; /** * Constructor. */ protected MaildirFolder(Store store, String filename, boolean root, boolean inbox) { super(store); maildir = new File(filename); tmpdir = new File(maildir, "tmp"); newdir = new MaildirTuple(new File(maildir, "new")); curdir = new MaildirTuple(new File(maildir, "cur")); mode = -1; type = root ? HOLDS_FOLDERS : HOLDS_MESSAGES; this.inbox = inbox; } /** * Constructor. */ protected MaildirFolder(Store store, String filename) { this(store, filename, false, false); } /** * Returns the name of this folder. */ public String getName() { if (inbox) return INBOX; return maildir.getName(); } /** * Returns the full name of this folder. */ public String getFullName() { if (inbox) return INBOX; return maildir.getPath(); } /** * Return a URLName representing this folder. */ public URLName getURLName() throws MessagingException { URLName url = super.getURLName(); return new URLName(url.getProtocol(), null, -1, url.getFile(), null, null); } /** * Returns the type of this folder. * @exception MessagingException if a messaging error occurred */ public int getType() throws MessagingException { return type; } /** * Indicates whether this folder exists. * @exception MessagingException if a messaging error occurred */ public boolean exists() throws MessagingException { return maildir.exists(); } /** * Indicates whether this folder contains new messages. * @exception MessagingException if a messaging error occurred */ public boolean hasNewMessages() throws MessagingException { return getNewMessageCount()>0; } /** * Opens this folder. * If the folder is opened for writing, a lock must be acquired on the * mbox. If this fails a MessagingException is thrown. * @exception MessagingException if a messaging error occurred */ public void open(int mode) throws MessagingException { if (this.mode!=-1) throw new IllegalStateException("Folder is open"); if (!maildir.exists() || !maildir.canRead()) throw new FolderNotFoundException(this); // create subdirectories if necessary boolean success = true; if (!tmpdir.exists()) success = success && tmpdir.mkdirs(); if (!newdir.dir.exists()) success = success && newdir.dir.mkdirs(); if (!curdir.dir.exists()) success = success && curdir.dir.mkdirs(); if (!success) throw new MessagingException("Unable to create directories"); if (mode==READ_WRITE) { if (!maildir.canWrite()) throw new MessagingException("Folder is read-only"); } // OK this.mode = mode; notifyConnectionListeners(ConnectionEvent.OPENED); } /** * Closes this folder. * @param expunge if the folder is to be expunged before it is closed * @exception MessagingException if a messaging error occurred */ public void close(boolean expunge) throws MessagingException { if (mode==-1) throw new IllegalStateException("Folder is closed"); if (expunge) expunge(); mode = -1; notifyConnectionListeners(ConnectionEvent.CLOSED); } /** * Expunges this folder. * This deletes all the messages marked as deleted. * @exception MessagingException if a messaging error occurred */ public Message[] expunge() throws MessagingException { if (mode==-1) throw new IllegalStateException("Folder is closed"); if (!exists()) throw new FolderNotFoundException(this); if (mode==Folder.READ_ONLY) throw new IllegalWriteException(); Message[] expunged; synchronized (this) { List elist = new ArrayList(); try { // delete in new if (newdir.messages!=null) { int len = newdir.messages.length; for (int i=0; i0) notifyMessageRemovedListeners(true, expunged); return expunged; } /** * Indicates whether this folder is open. */ public boolean isOpen() { return (mode!=-1); } /** * Returns the permanent flags for this folder. */ public Flags getPermanentFlags() { return permanentFlags; } /** * Returns the number of messages in this folder. * @exception MessagingException if a messaging error occurred */ public synchronized int getMessageCount() throws MessagingException { statDir(curdir); statDir(newdir); return curdir.messages.length + newdir.messages.length; } /** * Returns the number of new messages in this folder. * @exception MessagingException if a messaging error occurred */ public synchronized int getNewMessageCount() throws MessagingException { statDir(newdir); return newdir.messages.length; } /** * Returns the specified message number from this folder. * @exception MessagingException if a messaging error occurred */ public synchronized Message getMessage(int msgnum) throws MessagingException { statDir(curdir); statDir(newdir); int clen = curdir.messages.length; int alen = clen+newdir.messages.length; int index = msgnum-1; if (index<0 || index>=alen) throw new MessagingException("No such message: "+msgnum); if (indexmessages member if necessary, * and updating its timestamp. */ void statDir(MaildirTuple dir) throws MessagingException { long timestamp = dir.dir.lastModified(); if (timestamp==dir.timestamp) return; File[] files = dir.dir.listFiles(filter); int mlen = files.length; dir.messages = new MaildirMessage[mlen]; for (int i=0; i0) appended.toArray(n); } // propagate event if (n.length>0) notifyMessageAddedListeners(n); } /** * Create a unique filename. */ static String createUniq() throws MessagingException, IOException { long time = System.currentTimeMillis() / 1000L; long pid = 0; File urandom = new File("/dev/urandom"); if (urandom.exists() && urandom.canRead()) { // Read 8 bytes from /dev/urandom byte[] bytes = new byte[8]; InputStream in = new FileInputStream(urandom); int offset = 0; while (offset0) return false; } if (!delete(maildir)) return false; notifyFolderListeners(FolderEvent.DELETED); return true; } catch (SecurityException e) { throw new MessagingException("Access denied", e); } } } /** * Depth-first file/directory delete. */ boolean delete(File file) throws SecurityException { if (file.isDirectory()) { File[] files = file.listFiles(); for (int i=0; i0 && name.charAt(0)!=0x2e; } } /** * Structure holding the details for a maildir subdirectory. */ static class MaildirTuple { File dir; long timestamp = 0L; MaildirMessage[] messages = null; MaildirTuple(File dir) { this.dir = dir; } } /** * Filename filter for listing subfolders. */ class MaildirListFilter implements FilenameFilter { String pattern; int asteriskIndex, percentIndex; MaildirListFilter(String pattern) { this.pattern = pattern; asteriskIndex = pattern.indexOf('*'); percentIndex = pattern.indexOf('%'); } public boolean accept(File directory, String name) { if (asteriskIndex>-1) { String start = pattern.substring(0, asteriskIndex); String end = pattern.substring(asteriskIndex+1, pattern.length()); return (name.startsWith(start) && name.endsWith(end)); } else if (percentIndex>-1) { String start = pattern.substring(0, percentIndex); String end = pattern.substring(percentIndex+1, pattern.length()); return (directory.equals(maildir) && name.startsWith(start) && name.endsWith(end)); } return name.equals(pattern); } } } mail-1.1.2/source/gnu/mail/providers/maildir/MaildirMessage.java0000664000076500007650000001731210614714012024217 0ustar dogdog00000000000000/* * MaildirMessage.java * Copyright(C) 2003 Chris Burdess * * This file is part of GNU JavaMail, a library. * * GNU JavaMail is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or *(at your option) any later version. * * GNU JavaMail 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * As a special exception, if you link this library with other files to * produce an executable, this library does not by itself cause the * resulting executable to be covered by the GNU General Public License. * This exception does not however invalidate any other reasons why the * executable file might be covered by the GNU General Public License. */ package gnu.mail.providers.maildir; import java.io.BufferedInputStream; import java.io.File; import java.io.FileInputStream; import java.io.InputStream; import java.io.IOException; import java.util.Enumeration; import javax.activation.DataHandler; import javax.mail.Flags; import javax.mail.MessagingException; import javax.mail.internet.MimeMessage; import gnu.mail.providers.ReadOnlyMessage; /** * The message class implementing the Maildir mail protocol. * * @author Chris Burdess */ public final class MaildirMessage extends ReadOnlyMessage { /** * The "passed" info flag. */ static final String PASSED = "Passed"; /** * The file this message is stored in. */ File file; /** * The unique name of this message. */ String uniq; /** * Creates a Maildir message. * This is called by the MaildirFolder. */ MaildirMessage(MaildirFolder folder, File file, String uniq, String info, int msgnum) throws MessagingException { super(folder, msgnum); this.file = file; this.uniq = uniq; // update flags if (info!=null && info.startsWith("2,")) { int len = info.length(); for (int i=2; iinfo field). */ public synchronized void setFlags(Flags flag, boolean set) throws MessagingException { if (set) flags.add(flag); else flags.remove(flag); if (flag.contains(Flags.Flag.SEEN)) ((MaildirFolder)folder).setSeen(this, set); } /** * Returns the unique name of this message. */ String getUniq() { return uniq; } /** * Returns an info field based on the current flags. */ String getInfo() throws MessagingException { return getInfo(flags); } static String getInfo(Flags flags) throws MessagingException { StringBuffer buffer = new StringBuffer(); buffer.append('2'); buffer.append(','); // Flags must be stored in ASCII order if (flags.contains(Flags.Flag.DRAFT)) buffer.append('D'); // "draft" flag if (flags.contains(Flags.Flag.FLAGGED)) buffer.append('F'); // "flagged" flag if (flags.contains(PASSED)) buffer.append('P'); // "passed" flag if (flags.contains(Flags.Flag.ANSWERED)) buffer.append('R'); // "replied" flag if (flags.contains(Flags.Flag.SEEN)) buffer.append('S'); // "seen" flag if (flags.contains(Flags.Flag.DELETED)) buffer.append('T'); // "trashed" flag return buffer.toString(); } /** * Reads the message headers from the underlying file. */ void fetchHeaders() throws MessagingException { if (headers!=null) return; try { InputStream in = new BufferedInputStream(new FileInputStream(file)); headers = createInternetHeaders(in); in.close(); } catch (IOException e) { throw new MessagingException(e.getMessage(), e); } } /** * Reads the entire message from the underlying file. */ void fetch() throws MessagingException { if (content!=null) return; try { InputStream in = new BufferedInputStream(new FileInputStream(file)); parse(in); in.close(); } catch (IOException e) { throw new MessagingException(e.getMessage(), e); } } // -- Headers -- public String[] getHeader(String name) throws MessagingException { if (headers==null) fetchHeaders(); return super.getHeader(name); } public String getHeader(String name, String delimiter) throws MessagingException { if (headers==null) fetchHeaders(); return super.getHeader(name, delimiter); } public Enumeration getAllHeaders() throws MessagingException { if (headers==null) fetchHeaders(); return super.getAllHeaders(); } public Enumeration getAllHeaderLines() throws MessagingException { if (headers==null) fetchHeaders(); return super.getAllHeaderLines(); } public Enumeration getMatchingHeaders(String[] names) throws MessagingException { if (headers==null) fetchHeaders(); return super.getMatchingHeaders(names); } public Enumeration getMatchingHeaderLines(String[] names) throws MessagingException { if (headers==null) fetchHeaders(); return super.getMatchingHeaderLines(names); } public Enumeration getNonMatchingHeaders(String[] names) throws MessagingException { if (headers==null) fetchHeaders(); return super.getNonMatchingHeaders(names); } public Enumeration getNonMatchingHeaderLines(String[] names) throws MessagingException { if (headers==null) fetchHeaders(); return super.getNonMatchingHeaderLines(names); } // -- Content -- public DataHandler getDataHandler() throws MessagingException { if (content==null) fetch(); return super.getDataHandler(); } protected InputStream getContentStream() throws MessagingException { if (content==null) fetch(); return super.getContentStream(); } // -- Utility methods -- public boolean equals(Object other) { if (other instanceof MimeMessage) { MimeMessage message = (MimeMessage)other; return (message.getFolder()==getFolder() && message.getMessageNumber()==getMessageNumber()); } return false; } } mail-1.1.2/source/gnu/mail/providers/maildir/MaildirStore.java0000664000076500007650000001724010614714012023727 0ustar dogdog00000000000000/* * MaildirStore.java * Copyright (C) 2003, 2005 Chris Burdess * * This file is part of GNU JavaMail, a library. * * GNU JavaMail is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * GNU JavaMail 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * As a special exception, if you link this library with other files to * produce an executable, this library does not by itself cause the * resulting executable to be covered by the GNU General Public License. * This exception does not however invalidate any other reasons why the * executable file might be covered by the GNU General Public License. */ package gnu.mail.providers.maildir; import java.io.File; import java.io.UnsupportedEncodingException; import java.net.URLDecoder; import java.util.ArrayList; import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; import javax.mail.Folder; import javax.mail.MessagingException; import javax.mail.Session; import javax.mail.Store; import javax.mail.URLName; import gnu.inet.util.TraceLevel; import gnu.mail.treeutil.StatusEvent; import gnu.mail.treeutil.StatusListener; import gnu.mail.treeutil.StatusSource; /** * The storage class implementing the Maildir mailbox format. * * @author Chris Burdess */ public final class MaildirStore extends Store implements StatusSource { static final Logger logger = Logger.getLogger("gnu.mail.util.providers.maildir"); static final Level MAILDIR_TRACE = new TraceLevel("maildir"); private static final char separatorChar = '/'; private List statusListeners = new ArrayList(); /** * Constructor. */ public MaildirStore(Session session, URLName urlname) { super(session, urlname); if (session.getDebug()) { logger.setLevel(MAILDIR_TRACE); } } /** * There isn't a protocol to implement, so this method just returns. */ protected boolean protocolConnect( String host, int port, String username, String password) throws MessagingException { return true; } /** * Returns the default folder. */ public Folder getDefaultFolder() throws MessagingException { // If the url used to contruct the store references a file directly, // return this file. if (url!=null) { String file = url.getFile(); if (file!=null && file.length()>0) return getFolder(file); } // Otherwise attempt to return a sensible root folder. String home = session.getProperty("mail.maildir.home"); if (home==null) { try { home = System.getProperty("user.home"); if (!exists(home)) home = null; } catch (SecurityException e) { log("access denied reading system properties"); } } home = toFilename(home); return new MaildirFolder(this, home, true, false); } /** * Returns the folder with the specified filename. */ public Folder getFolder(String filename) throws MessagingException { boolean inbox = false; if ("inbox".equalsIgnoreCase(filename)) { // First try the session property mail.mbox.inbox. String maildir = session.getProperty("mail.maildir.maildir"); if (!isMaildir(maildir)) { // Try some common(UNIX) locations. try { String userhome = System.getProperty("user.home"); maildir = userhome+"/Maildir"; if (!isMaildir(maildir)) maildir = null; } catch (SecurityException e) { // not allowed to read system properties log("unable to access system properties"); } } if (maildir!=null) { filename = maildir; inbox = true; } // otherwise we assume it is actually a file called "inbox" } filename = toFilename(filename); return new MaildirFolder(this, filename, false, inbox); } /* * Convert into a valid filename for this platform */ String toFilename(String filename) { StringBuffer buf = new StringBuffer(); if (filename.length()<1 || filename.charAt(0)!=separatorChar) buf.append(File.separator); if (separatorChar!=File.separatorChar) buf.append(filename.replace(separatorChar, File.separatorChar)); else buf.append(filename); return buf.toString(); } /* * Indicates whether the file referred to by the specified filename exists. */ private boolean exists(String filename) { if (filename!=null) { File file = new File(filename); if (separatorChar!=File.separatorChar) file = new File(filename.replace(separatorChar, File.separatorChar)); return file.exists(); } return false; } private boolean isMaildir(String path) { if (path==null) return false; File file = new File(path); if (separatorChar!=File.separatorChar) file = new File(path.replace(separatorChar, File.separatorChar)); return file.exists() && file.isDirectory(); } /** * Returns the folder specified by the filename of the URLName. */ public Folder getFolder(URLName urlname) throws MessagingException { try { String file = URLDecoder.decode(urlname.getFile(), "UTF-8"); return getFolder(file); } catch (UnsupportedEncodingException e) { throw new MessagingException(e.getMessage(), e); } } Session getSession() { return session; } /** * Print a log message. */ void log(String message) { logger.log(MAILDIR_TRACE, message); } // -- StatusSource -- /** * Adds a status listener to this store. * The listener will be informed of state changes during potentially * lengthy procedures(opening and closing mboxes). * @param l the status listener * @see #removeStatusListener */ public void addStatusListener(StatusListener l) { synchronized (statusListeners) { statusListeners.add(l); } } /** * Removes a status listener from this store. * @param l the status listener * @see #addStatusListener */ public void removeStatusListener(StatusListener l) { synchronized (statusListeners) { statusListeners.remove(l); } } /** * Processes a status event. * This dispatches the event to all the registered listeners. * @param event the status event */ protected void processStatusEvent(StatusEvent event) { StatusListener[] listeners; synchronized (statusListeners) { listeners = new StatusListener[statusListeners.size()]; statusListeners.toArray(listeners); } switch (event.getType()) { case StatusEvent.OPERATION_START: for (int i=0; i

This is a provider for Dan Bernstein's Maildir mailbox format, used primarily by the qmail MTA, and also by some MUAs such as mutt.

Further information about the format of a Maildir mailbox is available here.

This provider supports the following properties:
Name Type Description
mail.maildir.home directory path The path to a directory that holds Maildir mailboxes. Such files and directories will be exposed as mail folders by the provider.
mail.maildir.maildir file path The path to a Maildir directory which should be considered to be the primary inbox for the user (equivalent to the MAILDIR environment variable). Requests for "INBOX" will return this as a Folder. If not set, ${user.home}/Maildir will be attempted.

mail-1.1.2/source/gnu/mail/providers/mbox/0000775000076500007650000000000010614714024020011 5ustar dogdog00000000000000mail-1.1.2/source/gnu/mail/providers/mbox/MboxFolder.java0000664000076500007650000007144210614714012022722 0ustar dogdog00000000000000/* * MboxFolder.java * Copyright(C) 1999,2005 Chris Burdess * * This file is part of GNU JavaMail, a library. * * GNU JavaMail is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or *(at your option) any later version. * * GNU JavaMail 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * As a special exception, if you link this library with other files to * produce an executable, this library does not by itself cause the * resulting executable to be covered by the GNU General Public License. * This exception does not however invalidate any other reasons why the * executable file might be covered by the GNU General Public License. * * Contributor(s): Daniel Thor Kristjan * close and expunge clarification. * Sverre Huseby gzipped mailboxes * Countach Win32 support */ package gnu.mail.providers.mbox; import java.io.BufferedOutputStream; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileFilter; import java.io.FileOutputStream; import java.io.InputStream; import java.io.IOException; import java.io.OutputStream; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Arrays; import java.util.Date; import java.util.List; import java.util.zip.GZIPInputStream; import java.util.zip.GZIPOutputStream; import javax.mail.Address; import javax.mail.Flags; import javax.mail.Folder; import javax.mail.Message; import javax.mail.MessagingException; import javax.mail.Store; import javax.mail.URLName; import javax.mail.event.ConnectionEvent; import javax.mail.event.FolderEvent; import javax.mail.internet.AddressException; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeMessage; import gnu.inet.util.LineInputStream; import gnu.mail.treeutil.StatusEvent; /** * The folder class implementing a UNIX mbox-format mailbox. * * @author Chris Burdess */ public class MboxFolder extends Folder { static final DateFormat df = new SimpleDateFormat("EEE MMM d H:m:s yyyy"); static final String GNU_MESSAGE_ID = "X-GNU-Message-Id"; static final String FROM = "From "; final File file; final boolean inbox; MboxMessage[] messages; boolean open; boolean readOnly; Flags permanentFlags = null; /** * Constructor. */ protected MboxFolder(Store store, File file, boolean inbox) { super(store); this.file = file; this.inbox = inbox; open = false; readOnly = true; messages = new MboxMessage[0]; } /** * Returns the name of this folder. */ public String getName() { return inbox ? "INBOX" : file.getName(); } /** * Returns the full name of this folder. * If the folder resides under the root hierarchy of this Store, the * returned name is relative to the root. Otherwise an absolute name, * starting with the hierarchy delimiter, is returned. */ public String getFullName() { MboxStore s = (MboxStore) store; File f = file; StringBuffer buf = new StringBuffer(); while (f != null && !f.equals(s.root)) { if (buf.length() > 0) { buf.insert(0, File.separatorChar); } buf.insert(0, f.getName()); f = f.getParentFile(); } if (f == null) { // This file is relative to the root of the store. // Under Windows, we have to return a name starting with the // hierarchy delimiter, so we will return a special sequence of 3 // backslashes followed by the full Windows path name. if (File.separatorChar == '\\') { return "\\\\\\" + file.getPath(); } } return buf.toString(); } /** * Return a URLName representing this folder. */ public URLName getURLName() throws MessagingException { String path = getFullName(); if (File.separatorChar != '/') { path = path.replace(File.separatorChar, '/'); } path = MboxStore.encodeUrlPath(path); return new URLName("mbox", null, -1, path, null, null); } /** * Returns the type of this folder. * @exception MessagingException if a messaging error occurred */ public int getType() throws MessagingException { if (file.exists()) { return file.isDirectory() ? HOLDS_FOLDERS : HOLDS_MESSAGES; } return 0; } /** * Indicates whether this folder exists. * @exception MessagingException if a messaging error occurred */ public boolean exists() throws MessagingException { return file.exists(); } /** * Indicates whether this folder contains new messages. * @exception MessagingException if a messaging error occurred */ public boolean hasNewMessages() throws MessagingException { return getNewMessageCount() > 0; } /** * Opens this folder. * If the folder is opened for writing, a lock must be acquired on the * mbox. If this fails a MessagingException is thrown. * @exception MessagingException if a messaging error occurred */ public void open(int mode) throws MessagingException { String filename = file.getPath(); if (mode == READ_WRITE) { if (!file.canWrite()) { throw new MessagingException("Folder is read-only"); } if (!acquireLock()) { throw new MessagingException("Unable to acquire lock: " + filename); } readOnly = false; } if (!file.canRead()) { throw new MessagingException("Can't read folder: " + filename); } LineInputStream in = null; try { // Read messages MboxStore mstore = (MboxStore) this.store; mstore.log("reading " + filename); List acc = new ArrayList(256); in = new LineInputStream(getInputStream()); int count = 1; String line, fromLine = null; ByteArrayOutputStream buf = null; // notify listeners StatusEvent event; event = new StatusEvent(mstore, StatusEvent.OPERATION_START, "open"); mstore.processStatusEvent(event); for (line = in.readLine(); line != null; line = in.readLine()) { if (line.indexOf(FROM) == 0) { if (buf != null) { byte[] bytes = buf.toByteArray(); ByteArrayInputStream bin = new ByteArrayInputStream(bytes); MboxMessage m = new MboxMessage(this, fromLine, bin, count++); acc.add(m); event = new StatusEvent(mstore, StatusEvent.OPERATION_UPDATE, "open", 1, StatusEvent.UNKNOWN, count - 1); mstore.processStatusEvent(event); } fromLine = line; buf = new ByteArrayOutputStream(); } else if (buf != null) { byte[] bytes = decodeFrom(line).getBytes(); buf.write(bytes, 0, bytes.length); buf.write(10); // LF } } if (buf != null) { byte[] bytes = buf.toByteArray(); ByteArrayInputStream bin = new ByteArrayInputStream(bytes); MboxMessage m = new MboxMessage(this, fromLine, bin, count++); acc.add(m); event = new StatusEvent(mstore, StatusEvent.OPERATION_UPDATE, "open", 1, StatusEvent.UNKNOWN, count - 1); mstore.processStatusEvent(event); } messages = new MboxMessage[acc.size()]; acc.toArray(messages); buf = null; acc = null; event = new StatusEvent(mstore, StatusEvent.OPERATION_END, "open"); mstore.processStatusEvent(event); // OK open = true; notifyConnectionListeners(ConnectionEvent.OPENED); } catch (IOException e) { throw new MessagingException("Unable to open folder: " + filename, e); } finally { // release any file descriptors try { if (in != null) { in.close(); } } catch (IOException e) { // we tried } } } /** * Returns the specified line with any From_ line encoding removed. */ public static String decodeFrom(String line) { if (line != null) { int len = line.length(); for (int i = 0; i < (len - 5); i++) { char c = line.charAt(i); if (i > 0 && (c == 'F' && line.charAt(i + 1) == 'r' && line.charAt(i + 2) == 'o' && line.charAt(i + 3) == 'm' && line.charAt(i + 4) == ' ')) { return line.substring(1); } if (c != '>') { break; } } } return line; } /** * Closes this folder. * @param expunge if the folder is to be expunged before it is closed * @exception MessagingException if a messaging error occurred */ public void close(boolean expunge) throws MessagingException { if (open) { if (expunge) { expunge(); } if (!readOnly) { // Save messages MboxStore mstore = (MboxStore) this.store; StatusEvent event; mstore.log("saving " + file.getAbsolutePath()); synchronized (this) { OutputStream os = null; try { os = getOutputStream(); BufferedOutputStream bos = new BufferedOutputStream(os); MboxOutputStream mos = new MboxOutputStream(bos); event = new StatusEvent(mstore, StatusEvent.OPERATION_START, "close"); mstore.processStatusEvent(event); for (int i = 0; i < messages.length; i++) { String fromLine = fromLine(messages[i]); bos.write(fromLine.getBytes()); bos.write('\n'); bos.flush(); messages[i].writeTo(mos); mos.flush(); event = new StatusEvent(mstore, StatusEvent.OPERATION_UPDATE, "close", 1, messages.length, i + 1); mstore.processStatusEvent(event); } event = new StatusEvent(mstore, StatusEvent.OPERATION_END, "close"); mstore.processStatusEvent(event); } catch (IOException e) { throw new MessagingException("I/O error writing mailbox", e); } finally { // close any file descriptors try { if (os != null) { os.close(); } } catch (IOException e) { // we tried } } } if (!releaseLock()) { mstore.log("unable to clear up lock file!"); } } open = false; messages = new MboxMessage[0]; // release memory notifyConnectionListeners(ConnectionEvent.CLOSED); } } /** * Returns the From_ line for the specified mbox message. * If this does not already exist(the message was appended to the folder * since it was last opened), we will attempt to generate a suitable From_ * line for it. */ protected String fromLine(MboxMessage message) throws MessagingException { String fromLine = message.fromLine; if (fromLine == null) { StringBuffer buf = new StringBuffer("From "); String from = "-"; try { Address[] f = message.getFrom(); if (f != null && f.length > 0) { if (f[0] instanceof InternetAddress) { from = ((InternetAddress) f[0]).getAddress(); } else { from = f[0].toString(); } } } catch (AddressException e) { // these things happen... } buf.append(from); buf.append(' '); Date date = message.getSentDate(); if (date==null) { date = message.getReceivedDate(); } if (date==null) { date = new Date(); } buf.append(df.format(date)); fromLine = buf.toString(); } return fromLine; } /** * Expunges this folder. * This deletes all the messages marked as deleted. * @exception MessagingException if a messaging error occurred */ public Message[] expunge() throws MessagingException { Message[] expunged; synchronized (this) { List elist = new ArrayList(); if (open) { List mlist = new ArrayList(); for (int i=0; i 0) { notifyMessageRemovedListeners(true, expunged); } return expunged; } /** * Indicates whether this folder is open. */ public boolean isOpen() { return open; } /** * Returns the permanent flags for this folder. */ public Flags getPermanentFlags() { if (permanentFlags == null) { Flags flags = new Flags(); flags.add(Flags.Flag.DELETED); flags.add(Flags.Flag.SEEN); flags.add(Flags.Flag.RECENT); permanentFlags = flags; } return permanentFlags; } /** * Returns the number of messages in this folder. * @exception MessagingException if a messaging error occurred */ public int getMessageCount() throws MessagingException { return messages.length; } /** * Returns the specified message number from this folder. * @exception MessagingException if a messaging error occurred */ public Message getMessage(int msgnum) throws MessagingException { int index = msgnum-1; if (index < 0 || index >= messages.length) { throw new MessagingException("No such message: "+msgnum); } return messages[index]; } /** * Returns the messages in this folder. * @exception MessagingException if a messaging error occurred */ public synchronized Message[] getMessages() throws MessagingException { // Return a copy of the message array Message[] m = new Message[messages.length]; System.arraycopy(messages, 0, m, 0, messages.length); return m; } /** * Appends messages to this folder. * Only MimeMessages within the array will be appended, as we don't know * how to retrieve internet content for other kinds. * @param m an array of messages to be appended */ public synchronized void appendMessages(Message[] m) throws MessagingException { MboxMessage[] n; synchronized (this) { List appended = new ArrayList(m.length); int count = messages.length; for (int i = 0; i < m.length; i++) { if (m[i] instanceof MimeMessage) { MimeMessage mimem = (MimeMessage) m[i]; MboxMessage mboxm = new MboxMessage(this, mimem, count++); if (mimem instanceof MboxMessage) { mboxm.fromLine = ((MboxMessage) mimem).fromLine; } appended.add(mboxm); } } n = new MboxMessage[appended.size()]; if (n.length>0) { appended.toArray(n); // copy into the messages array List acc = new ArrayList(messages.length+n.length); acc.addAll(Arrays.asList(messages)); acc.addAll(Arrays.asList(n)); messages = new MboxMessage[acc.size()]; acc.toArray(messages); acc = null; } } // propagate event if (n.length > 0) { notifyMessageAddedListeners(n); } } /** * Returns the parent folder. */ public Folder getParent() throws MessagingException { if (inbox) { return store.getDefaultFolder(); } if (file.equals(((MboxStore) store).root)) { return null; } File parent = file.getParentFile(); return new MboxFolder(store, parent, false); } /** * Returns the subfolders of this folder. */ public Folder[] list() throws MessagingException { if (getType() != HOLDS_FOLDERS) { throw new MessagingException("This folder can't contain subfolders"); } try { File[] files = file.listFiles(); Folder[] folders = new Folder[files.length]; for (int i = 0; i < files.length; i++) { folders[i] = new MboxFolder(store, files[i], false); } return folders; } catch (SecurityException e) { throw new MessagingException("Access denied", e); } } /** * Returns the subfolders of this folder matching the specified pattern. */ public Folder[] list(String pattern) throws MessagingException { if (getType() != HOLDS_FOLDERS) { throw new MessagingException("This folder can't contain subfolders"); } try { File[] files = file.listFiles(new MboxFilenameFilter(pattern)); Folder[] folders = new Folder[files.length]; for (int i = 0; i < files.length; i++) { folders[i] = new MboxFolder(store, files[i], false); } return folders; } catch (SecurityException e) { throw new MessagingException("Access denied", e); } } /** * Returns the separator character. */ public char getSeparator() throws MessagingException { return File.separatorChar; } /** * Creates this folder in the store. */ public boolean create(int type) throws MessagingException { if (file.exists()) { throw new MessagingException("Folder already exists"); } switch (type) { case HOLDS_FOLDERS: try { if (!file.mkdirs()) { return false; } notifyFolderListeners(FolderEvent.CREATED); return true; } catch (SecurityException e) { throw new MessagingException("Access denied", e); } case HOLDS_MESSAGES: try { File parent = file.getParentFile(); if (!parent.exists()) { if (!parent.mkdirs()) { return false; } } synchronized (this) { createNewFile(file); } notifyFolderListeners(FolderEvent.CREATED); return true; } catch (IOException e) { throw new MessagingException("I/O error writing mailbox", e); } catch (SecurityException e) { throw new MessagingException("Access denied", e); } } return false; } /** * Deletes this folder. */ public boolean delete(boolean recurse) throws MessagingException { if (recurse) { try { if (file.isDirectory()) { Folder[] folders = list(); for (int i = 0; i < folders.length; i++) { if (!folders[i].delete(recurse)) { return false; } } } if (!readOnly) { releaseLock(); } if (!file.delete()) { return false; } notifyFolderListeners(FolderEvent.DELETED); return true; } catch (SecurityException e) { throw new MessagingException("Access denied", e); } } else { try { if (file.isDirectory()) { Folder[] folders = list(); if (folders.length > 0) { return false; } } if (!readOnly) { releaseLock(); } if (!file.delete()) { return false; } notifyFolderListeners(FolderEvent.DELETED); return true; } catch (SecurityException e) { throw new MessagingException("Access denied", e); } } } /** * Renames this folder. */ public boolean renameTo(Folder folder) throws MessagingException { if (folder instanceof MboxFolder) { File newfile = ((MboxFolder) folder).file; if (!file.renameTo(newfile)) { return false; } notifyFolderRenamedListeners(folder); return true; } else { throw new MessagingException("Target not an MboxFolder"); } } /** * Returns the subfolder of this folder with the specified name. */ public Folder getFolder(String name) throws MessagingException { if (!file.isDirectory()) { throw new MessagingException("Folder cannot contain folders"); } // Convert any slashes to platform path separator if (File.separatorChar != '/') { name = name.replace('/', File.separatorChar); } File f = new File(file, name); return new MboxFolder(store, f, false); } /** * Checks if the current file is or is supposed to be * compressed. Uses the filename to figure it out. */ private boolean isGzip() { return file.getName().toLowerCase().endsWith(".gz"); } /** * Creates an input stream that possibly will decompress the * file contents. */ private InputStream getInputStream() throws IOException { InputStream in = new FileInputStream(file); if (isGzip()) { in = new GZIPInputStream(in); } return in; } /** * Creates an output stream that possibly will compress * whatever is sent to it, based on the current filename. */ private OutputStream getOutputStream() throws IOException { OutputStream out = new FileOutputStream(file); if (isGzip()) { out = new GZIPOutputStream(out); } return out; } /** * Locks this mailbox. * This uses a dotlock-like mechanism - see createNewFile(). * If the directory containing the mbox * folder is not writable, we will not be able to open the mbox for * writing either. */ public synchronized boolean acquireLock() { MboxStore mstore = (MboxStore) store; try { String filename = file.getPath(); String lockFilename = filename + ".lock"; File lock = new File(lockFilename); mstore.log("creating " + lock.getPath()); if (lock.exists()) { return false; } //if (!lock.canWrite()) // return false; createNewFile(lock); return true; } catch (IOException e) { mstore.log("I/O exception acquiring lock on " + file.getPath()); } catch (SecurityException e) { mstore.log("Security exception acquiring lock on " + file.getPath()); } return false; } /** * This method creates a new file. * Because Java cannot properly dotlock a file by creating a temporary * file and hardlinking it(some platforms do not support hard links) we * must use this method to create a zero-length inode. * This is a replacement for File.createNewFile(), which only exists in * the JDK since 1.2. * The idea is simply to touch the specified file. */ private void createNewFile(File file) throws IOException { // there may be another, more efficient way to do this. // certainly just setLastModified() does not work. BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(file)); out.flush(); out.close(); } /** * Unlocks this mailbox. * This deletes any associated lockfile if it exists. It returns false if * an existing lockfile could not be deleted. */ public synchronized boolean releaseLock() { MboxStore mstore = (MboxStore) store; try { String filename = file.getPath(); String lockFilename = filename + ".lock"; File lock = new File(lockFilename); mstore.log("removing "+lock.getPath()); if (lock.exists()) { if (!lock.delete()) { return false; } } return true; } catch (SecurityException e) { mstore.log("Security exception releasing lock on " + file.getPath()); } return false; } class MboxFilenameFilter implements FileFilter { String pattern; int asteriskIndex, percentIndex; MboxFilenameFilter(String pattern) { this.pattern = pattern; asteriskIndex = pattern.indexOf('*'); percentIndex = pattern.indexOf('%'); } public boolean accept(File f) { String name = f.getName(); if (asteriskIndex > -1) { String start = pattern.substring(0, asteriskIndex); String end = pattern.substring(asteriskIndex + 1, pattern.length()); return (name.startsWith(start) && name.endsWith(end)); } else if (percentIndex > -1) { String start = pattern.substring(0, percentIndex); String end = pattern.substring(percentIndex + 1, pattern.length()); File parent = f.getParentFile(); return (parent != null && parent.equals(file) && name.startsWith(start) && name.endsWith(end)); } return name.equals(pattern); } } } mail-1.1.2/source/gnu/mail/providers/mbox/MboxMessage.java0000664000076500007650000001173410614714012023071 0ustar dogdog00000000000000/* * MboxMessage.java * Copyright(C) 1999 Chris Burdess * * This file is part of GNU JavaMail, a library. * * GNU JavaMail is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or *(at your option) any later version. * * GNU JavaMail 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * As a special exception, if you link this library with other files to * produce an executable, this library does not by itself cause the * resulting executable to be covered by the GNU General Public License. * This exception does not however invalidate any other reasons why the * executable file might be covered by the GNU General Public License. */ package gnu.mail.providers.mbox; import java.io.InputStream; import javax.activation.DataHandler; import javax.mail.Flags; import javax.mail.MessagingException; import javax.mail.internet.MimeMessage; import gnu.mail.providers.ReadOnlyMessage; /** * The message class implementing the Mbox mail protocol. * * @author Chris Burdess */ public class MboxMessage extends ReadOnlyMessage { /** * Status header key. * This keeps the mbox flags. */ protected static final String STATUS = "Status"; /** * The From_ line associated with this message. * We will preserve this if possible. */ protected String fromLine; /** * Creates a Mbox message. * This is called by the MboxStore. */ protected MboxMessage(MboxFolder folder, String fromLine, InputStream in, int msgnum) throws MessagingException { super(folder, in, msgnum); this.fromLine = fromLine; readStatusHeader(); } /** * Creates a Mbox message. * This is called by the MboxFolder when appending. * It creates a copy of the specified message for the new folder. */ protected MboxMessage(MboxFolder folder, MimeMessage message, int msgnum) throws MessagingException { super(message); this.folder = folder; this.msgnum = msgnum; readStatusHeader(); } /** * Allow MboxFolder access to set the expunged flag after expunge. */ protected void setExpunged(boolean expunged) { super.setExpunged(expunged); } /** * Set the specified flags(reflected in the Status header). */ public synchronized void setFlags(Flags flag, boolean set) throws MessagingException { if (set) { flags.add(flag); } else { flags.remove(flag); } } /** * Updates the status header from the current flags. */ protected void updateHeaders() throws MessagingException { super.updateHeaders(); String old = getHeader(STATUS, "\n"); StringBuffer buffer = new StringBuffer(); boolean seen = flags.contains(Flags.Flag.SEEN); boolean recent = flags.contains(Flags.Flag.RECENT); boolean answered = flags.contains(Flags.Flag.ANSWERED); boolean deleted = flags.contains(Flags.Flag.DELETED); if (seen) { buffer.append('R'); } if (!recent) { buffer.append('O'); } if (answered) { buffer.append('A'); } if (deleted) { buffer.append('D'); } String status = buffer.toString(); if (!(status.equals(old))) { setHeader(STATUS, status); } } /** * Reads the associated flags from the status header. */ private void readStatusHeader() throws MessagingException { String[] currentStatus = this.getHeader(STATUS); if (currentStatus != null && currentStatus.length > 0) { flags = new Flags(); if (currentStatus[0].indexOf('R') >= 0) { flags.add(Flags.Flag.SEEN); } if (currentStatus[0].indexOf('O') < 0) { flags.add(Flags.Flag.RECENT); } if (currentStatus[0].indexOf('A') >= 0) { flags.add(Flags.Flag.ANSWERED); } if (currentStatus[0].indexOf('D') >= 0) { flags.add(Flags.Flag.DELETED); } } } // -- Utility methods -- public boolean equals(Object other) { if (other instanceof MimeMessage) { MimeMessage message = (MimeMessage) other; return (message.getFolder() == getFolder() && message.getMessageNumber() == getMessageNumber()); } return false; } } mail-1.1.2/source/gnu/mail/providers/mbox/MboxOutputStream.java0000664000076500007650000001076310614714012024162 0ustar dogdog00000000000000/* * MboxOutputStream.java * Copyright(C) 1999 Chris Burdess * * This file is part of GNU JavaMail, a library. * * GNU JavaMail is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or *(at your option) any later version. * * GNU JavaMail 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * As a special exception, if you link this library with other files to * produce an executable, this library does not by itself cause the * resulting executable to be covered by the GNU General Public License. * This exception does not however invalidate any other reasons why the * executable file might be covered by the GNU General Public License. */ package gnu.mail.providers.mbox; import java.io.FilterOutputStream; import java.io.IOException; import java.io.OutputStream; /** * A filter stream that can escape mbox From_ lines in message content. * This will only work reliably for messages with <4096 bytes in any one * line. * * @author Chris Burdess */ class MboxOutputStream extends FilterOutputStream { private static byte KET = 62; /** * The buffer where the current line is stored. */ protected byte buf[]; /** * The number of valid bytes in the buffer. */ protected int count = 0; /** * Constructs an mbox From_-escaping output stream with a buffer size of * 1024 bytes. */ public MboxOutputStream(OutputStream out) { this(out, 4096); } /** * Constructs an mbox From_-escaping output stream with the specified * buffer size. * @param len the buffer size */ public MboxOutputStream(OutputStream out, int len) { super(out); buf = new byte[len]; } /** * Flush the internal buffer. */ protected void validateAndFlushBuffer() throws IOException { if (count > 0) { boolean done = false; for (int i=0; ibuf.length) validateAndFlushBuffer(); buf[count++] = (byte)b; if (b=='\n') validateAndFlushBuffer(); } /** * Writes len bytes from the specified byte array * starting at offset off to this output stream. */ public synchronized void write(byte b[], int off, int len) throws IOException { // strip any CRs in the byte array for (int i=off; ibuf.length) { int cl = (i-off>buf.length) ? buf.length : i-off; System.arraycopy(b, off, buf, count, cl); count += cl; validateAndFlushBuffer(); len = len-(i-off); byte[] b2 = new byte[b.length]; System.arraycopy(b, i, b2, off, len); b = b2; i = off; } } System.arraycopy(b, off, buf, count, len); count += len; } /** * Flushes this output stream. */ public synchronized void flush() throws IOException { validateAndFlushBuffer(); out.flush(); } } mail-1.1.2/source/gnu/mail/providers/mbox/MboxStore.java0000664000076500007650000003041610614714012022577 0ustar dogdog00000000000000/* * MboxStore.java * Copyright(C) 1999,2005 Chris Burdess * * This file is part of GNU JavaMail, a library. * * GNU JavaMail is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or *(at your option) any later version. * * GNU JavaMail 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * As a special exception, if you link this library with other files to * produce an executable, this library does not by itself cause the * resulting executable to be covered by the GNU General Public License. * This exception does not however invalidate any other reasons why the * executable file might be covered by the GNU General Public License. */ package gnu.mail.providers.mbox; import java.io.File; import java.io.IOException; import java.io.UnsupportedEncodingException; import java.util.ArrayList; import java.util.List; import java.security.AccessController; import java.security.PrivilegedAction; import java.util.logging.Level; import java.util.logging.Logger; import javax.mail.Folder; import javax.mail.MessagingException; import javax.mail.Session; import javax.mail.Store; import javax.mail.URLName; import gnu.inet.util.GetSystemPropertyAction; import gnu.inet.util.TraceLevel; import gnu.mail.treeutil.StatusEvent; import gnu.mail.treeutil.StatusListener; import gnu.mail.treeutil.StatusSource; /** * The storage class implementing the Mbox mailbox file format. * * @author Chris Burdess */ public final class MboxStore extends Store implements StatusSource { static final Logger logger = Logger.getLogger("gnu.mail.util.providers.mbox"); static final Level MBOX_TRACE = new TraceLevel("mbox"); private static final char separatorChar = '/'; static boolean attemptFallback = true; /** * File representing the root of this store's hierarchy. */ File root; private List statusListeners = new ArrayList(); /** * Constructor. */ public MboxStore(Session session, URLName urlname) { super(session, urlname); String af = session.getProperty("mail.mbox.attemptfallback"); if (af != null) { attemptFallback = Boolean.valueOf(af).booleanValue(); } if (session.getDebug()) { logger.setLevel(MBOX_TRACE); } } /** * There isn't a protocol to implement, so this method just returns. */ protected boolean protocolConnect(String host, int port, String username, String password) throws MessagingException { if (url != null) { String path = url.getFile(); if (path != null && !"".equals(path)) { path = decodeUrlPath(path); // Relative or Windows absolute path if (File.separatorChar != '/') { path = path.replace('/', File.separatorChar); } root = new File(path); if (!root.exists() && File.separatorChar == '/') { // Absolute path on POSIX platform root = new File("/" + path); } } } if (root == null) { String mailhome = session.getProperty("mail.mbox.mailhome"); if (mailhome != null) { root = new File(mailhome); } } if (root == null) { PrivilegedAction a = new GetSystemPropertyAction("user.name"); String userhome = (String) AccessController.doPrivileged(a); root = new File(userhome, "Mail"); // elm if (!root.exists()) { root = new File(userhome, "mail"); if (!root.exists()) { root = null; } } } return true; } /** * Sets the correct form of the URLName. */ protected void setURLName(URLName url) { url = new URLName(url.getProtocol(), null, -1, url.getFile(), null, null); super.setURLName(url); } /** * Returns the default folder. */ public Folder getDefaultFolder() throws MessagingException { return getFolder(""); } /** * Returns the folder with the specified filename. */ public Folder getFolder(String name) throws MessagingException { return getFolder(name, false); } /** * Returns the folder specified by the filename of the URLName. */ public Folder getFolder(URLName urlname) throws MessagingException { String path = urlname.getFile(); if (path != null) { path = decodeUrlPath(path); } return getFolder(path, true); } private Folder getFolder(String name, boolean tryPrepend) throws MessagingException { if (File.separatorChar == '\\' && name != null && name.startsWith("\\\\\\")) { // Remove spurious leading backslashes for Windows absolute // pathnames created by MboxFolder.getFullPath name = name.substring(3); } if (name == null || "".equals(name)) { // Default folder return (root != null) ? new MboxFolder(this, root, false) : null; } File file = null; // Convert any slashes to platform path separator if (File.separatorChar != '/') { name = name.replace('/', File.separatorChar); } if (root != null && root.isDirectory()) { file = new File(root, name); } if (file == null || !file.exists()) { // Relative or absolute path file = new File(name); if (!file.exists() && tryPrepend) { file = new File(File.separator + name); } } if ("INBOX".equalsIgnoreCase(name) && !file.exists()) { File inbox = file; // If the root is a file try that first. if (root != null && root.isFile()) { inbox = root; } if (!inbox.exists()) { // Try the session property mail.mbox.inbox. String inboxname = session.getProperty("mail.mbox.inbox"); if (inboxname != null) { inbox = new File(inboxname); } } if (!inbox.exists() && attemptFallback && File.separatorChar == '/') { PrivilegedAction a; if (File.separatorChar == '/') { // Try some common (UNIX) locations. a = new GetSystemPropertyAction("user.name"); String username = (String) AccessController.doPrivileged(a); inbox = new File("/var/mail/" + username); // GNU if (!inbox.exists()) { inbox = new File("/var/spool/mail/" + username); // common alternative } } if (!inbox.exists()) { a = new GetSystemPropertyAction("user.home"); String userhome = (String) AccessController.doPrivileged(a); inbox = new File(userhome, "Mailbox"); // qmail etc } } return new MboxFolder(this, inbox, true); } return new MboxFolder(this, file, false); } Session getSession() { return session; } /** * Print a log message. */ void log(String message) { logger.log(MBOX_TRACE, message); } // -- StatusSource -- /** * Adds a status listener to this store. * The listener will be informed of state changes during potentially * lengthy procedures(opening and closing mboxes). * @param l the status listener * @see #removeStatusListener */ public void addStatusListener(StatusListener l) { synchronized (statusListeners) { statusListeners.add(l); } } /** * Removes a status listener from this store. * @param l the status listener * @see #addStatusListener */ public void removeStatusListener(StatusListener l) { synchronized (statusListeners) { statusListeners.remove(l); } } /** * Processes a status event. * This dispatches the event to all the registered listeners. * @param event the status event */ protected void processStatusEvent(StatusEvent event) { StatusListener[] listeners; synchronized (statusListeners) { listeners = new StatusListener[statusListeners.size()]; statusListeners.toArray(listeners); } switch (event.getType()) { case StatusEvent.OPERATION_START: for (int i = 0; i < listeners.length; i++) { listeners[i].statusOperationStarted(event); } break; case StatusEvent.OPERATION_UPDATE: for (int i = 0; i < listeners.length; i++) { listeners[i].statusProgressUpdate(event); } break; case StatusEvent.OPERATION_END: for (int i = 0; i < listeners.length; i++) { listeners[i].statusOperationEnded(event); } break; } } static String decodeUrlPath(String path) { boolean hi = false; StringBuffer buf = null; int len = path.length(); for (int i = 0; i < len; i++) { char c = path.charAt(i); if (c == '%' && i < (len - 2)) { if (buf == null) { buf = new StringBuffer(path.substring(0, i)); } int code = Integer.parseInt(path.substring(i + 1, i + 3), 16); if (code > 127) { hi = true; } buf.append((char) code); i += 2; } else if (buf != null) { buf.append(c); } } if (buf != null) { if (!hi) { // ASCII only return buf.toString(); } // decode UTF-8 sequence len = buf.length(); byte[] seq = new byte[len]; for (int i = 0; i < len; i++) { seq[i] = (byte) buf.charAt(i); } try { return new String(seq, "UTF-8"); } catch (UnsupportedEncodingException e) { RuntimeException e2 = new RuntimeException(); e2.initCause(e); throw e2; } } // No encoded characters return path; } static String encodeUrlPath(String path) { int len = path.length(); StringBuffer buf = null; for (int i = 0; i < len; i++) { char c = path.charAt(i); if (!isUnreservedPathChar(c)) { if (buf == null) { buf = new StringBuffer(path.substring(0, i)); } try { // UTF-8 sequence for character byte[] seq = path.substring(i, i + 1).getBytes("UTF-8"); for (int j = 0; j < seq.length; j++) { String code = Integer.toHexString(seq[j]).toUpperCase(); buf.append('%'); if (code.length() < 2) { buf.append('0'); } buf.append(code); } return buf.toString(); } catch (UnsupportedEncodingException e) { RuntimeException e2 = new RuntimeException(); e2.initCause(e); throw e2; } } else if (buf != null) { buf.append(c); } } // ASCII only return path; } static boolean isUnreservedPathChar(char c) { return (c >= 0x41 && c <= 0x5a) || (c >= 0x61 && c <= 0x7a) || (c >= 0x30 && c <= 0x39) || c == '-' || c == '.' || c == '_' || c == '~' || c == '/'; } } mail-1.1.2/source/gnu/mail/providers/mbox/package.html0000664000076500007650000000242510614714012022272 0ustar dogdog00000000000000

This is a provider for the UNIX mbox mailbox file format, used by many 3rd-party MUAs including Netscape, Mozilla, mutt, elm, and pine.

Further information about the format of an mbox mailbox is available here.

This provider supports the following properties:
Name Type Description
mail.mbox.mailhome directory path The path to a directory that holds mbox mailboxes and/or directories. Such files and directories will be exposed as mail folders by the provider.
mail.mbox.inbox file path The path to a file which should be considered to be the primary inbox (equivalent to the MAIL environment variable). Requests for "INBOX" will return this file as a Folder. If not set, and the attemptfallback property is set to true (see below), /var/mail/${user.name}, /var/spool/mail/${user.name}, and ${user.home}/Mailbox will be attempted, in that order.
mail.mbox.attemptfallback boolean Whether to try to locate the mail spool in some common (UNIX) locations.

mail-1.1.2/source/gnu/mail/providers/nntp/0000775000076500007650000000000010614714024020023 5ustar dogdog00000000000000mail-1.1.2/source/gnu/mail/providers/nntp/ListFolderListener.java0000664000076500007650000000263310614714012024444 0ustar dogdog00000000000000/* * ListFolderListener.java * Copyright(C) 2006 Cedric Hyppolite * * This file is part of GNU JavaMail, a library. * * GNU JavaMail is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or *(at your option) any later version. * * GNU JavaMail 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * As a special exception, if you link this library with other files to * produce an executable, this library does not by itself cause the * resulting executable to be covered by the GNU General Public License. * This exception does not however invalidate any other reasons why the * executable file might be covered by the GNU General Public License. */ package gnu.mail.providers.nntp; /** * @author Cedric Hyppolite */ public interface ListFolderListener { void foundFolder(String folderName); } mail-1.1.2/source/gnu/mail/providers/nntp/NNTPFolder.java0000664000076500007650000004422110614714012022601 0ustar dogdog00000000000000/* * NNTPFolder.java * Copyright(C) 2002 Chris Burdess * * This file is part of GNU JavaMail, a library. * * GNU JavaMail is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or *(at your option) any later version. * * GNU JavaMail 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * As a special exception, if you link this library with other files to * produce an executable, this library does not by itself cause the * resulting executable to be covered by the GNU General Public License. * This exception does not however invalidate any other reasons why the * executable file might be covered by the GNU General Public License. */ package gnu.mail.providers.nntp; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.util.HashMap; import java.util.LinkedList; import java.util.List; import java.util.Map; import javax.mail.FetchProfile; import javax.mail.Flags; import javax.mail.Folder; import javax.mail.FolderNotFoundException; import javax.mail.IllegalWriteException; import javax.mail.Message; import javax.mail.MessageRemovedException; import javax.mail.MessagingException; import javax.mail.MethodNotSupportedException; import javax.mail.event.ConnectionEvent; import gnu.inet.nntp.ArticleResponse; import gnu.inet.nntp.GroupResponse; import gnu.inet.nntp.HeaderEntry; import gnu.inet.nntp.HeaderIterator; import gnu.inet.nntp.NNTPConstants; import gnu.inet.nntp.NNTPException; /** * A JavaMail folder delegate for an NNTP newsgroup. * * @author Chris Burdess * @version 2.0 */ public final class NNTPFolder extends Folder { String name; int first = -1; int last = -1; int count = -1; boolean open; Map articleCache; // cache of article-number to NNTPMessage NNTPFolder(NNTPStore store, String name) { super(store); this.name = name; } /** * Returns the name of the newsgroup, e.g. alt.test. */ public String getName() { return name; } /** * @see #getName */ public String getFullName() { return name; } /** * This implementation uses a flat namespace, so the parent of any * NNTPFolder is the NNTP root folder. */ public Folder getParent() throws MessagingException { NNTPStore ns = (NNTPStore) store; return ns.root; } /** * Returns the type of this folder. * This folder type only holds messages. */ public int getType() throws MessagingException { return HOLDS_MESSAGES; } public boolean isOpen() { return open; } /** * This folder type is always read-only. */ public int getMode() { return READ_ONLY; } /** * Returns the flags supported by this folder. */ public Flags getPermanentFlags() { NNTPStore ns = (NNTPStore) store; return new Flags(ns.permanentFlags); } /** * This method has no particular meaning in NNTP. * However, we will use it to send a GROUP command and refresh our article * stats. */ public void open(int mode) throws MessagingException { // NB this should probably throw an exception if READ_WRITE is // specified, but this tends to cause problems with existing clients. if (open) { throw new IllegalStateException(); } try { NNTPStore ns = (NNTPStore) store; synchronized (ns.connection) { GroupResponse response = ns.connection.group(name); count = response.count; first = response.first; last = response.last; } articleCache = new HashMap(1024); // TODO make configurable open = true; notifyConnectionListeners(ConnectionEvent.OPENED); } catch (NNTPException e) { if (e.getResponse().getStatus() == NNTPConstants.NO_SUCH_GROUP) { throw new FolderNotFoundException(e.getMessage(), this); } else { throw new MessagingException(e.getMessage(), e); } } catch (IOException e) { throw new MessagingException(e.getMessage(), e); } } /** * This method has no particular meaning in NNTP. */ public void close(boolean expunge) throws MessagingException { if (!open) { throw new IllegalStateException(); } articleCache = null; open = false; notifyConnectionListeners(ConnectionEvent.CLOSED); } /** * Indicates whether the newsgroup is present on the server. */ public boolean exists() throws MessagingException { try { NNTPStore ns = (NNTPStore) store; synchronized (ns.connection) { GroupResponse response = ns.connection.group(name); count = response.count; first = response.first; last = response.last; } return true; } catch (NNTPException e) { if (e.getResponse().getStatus() == NNTPConstants.NO_SUCH_GROUP) { return false; } else { throw new MessagingException(e.getMessage(), e); } } catch (IOException e) { throw new MessagingException(e.getMessage(), e); } } /** * Indicates whether there are new articles in this newsgroup. */ public boolean hasNewMessages() throws MessagingException { try { NNTPStore ns = (NNTPStore) store; boolean hasNew = false; synchronized (ns.connection) { GroupResponse response = ns.connection.group(name); if (response.last > last) { hasNew = true; } count = response.count; first = response.first; last = response.last; } return hasNew; } catch (NNTPException e) { if (e.getResponse().getStatus() == NNTPConstants.NO_SUCH_GROUP) { throw new FolderNotFoundException(e.getMessage(), this); } else { throw new MessagingException(e.getMessage(), e); } } catch (IOException e) { throw new MessagingException(e.getMessage(), e); } } /** * Returns the number of articles in this newsgroup. */ public int getMessageCount() throws MessagingException { return count; } /** * Returns the article corresponding to the specified article * number. * @throws MessageRemovedException often ;-) */ public Message getMessage(int msgnum) throws MessagingException { if (!open) { throw new IllegalStateException(); } // Cache lookup Integer key = new Integer(msgnum); NNTPMessage m = (NNTPMessage) articleCache.get(key); if (m!=null) { return m; } try { NNTPStore ns = (NNTPStore) store; synchronized (ns.connection) { // Ensure group selected GroupResponse gr = ns.connection.group(name); first = gr.first; last = gr.last; count = gr.count; // Get article m = getMessageImpl(msgnum - 1 + first); // Cache store articleCache.put(key, m); return m; } } catch (NNTPException e) { switch (e.getResponse().getStatus()) { case NNTPConstants.NO_ARTICLE_SELECTED: case NNTPConstants.NO_SUCH_ARTICLE_NUMBER: case NNTPConstants.NO_SUCH_ARTICLE: throw new MessageRemovedException(e.getMessage()); default: throw new MessagingException(e.getMessage(), e); } } catch (IOException e) { throw new MessagingException(e.getMessage(), e); } } /* * Perform article STAT. * NB not synchronized against the connection! */ NNTPMessage getMessageImpl(int msgnum) throws IOException { NNTPStore ns = (NNTPStore) store; // Issue STAT ArticleResponse response = ns.connection.stat(msgnum); String messageId = response.messageId; return new NNTPMessage(this, msgnum, messageId); } /** * Returns all articles in this group. * This tries XHDR first to retrieve Message-IDs for the articles. * If this fails we fall back to statting each article. */ public Message[] getMessages() throws MessagingException { NNTPStore ns = (NNTPStore) store; List acc = new LinkedList(); synchronized (ns.connection) { try { // Ensure group selected GroupResponse gr = ns.connection.group(name); first = gr.first; last = gr.last; count = gr.count; // Get Message-IDs for all article numbers StringBuffer rb = new StringBuffer(); rb.append(Integer.toString(first)); rb.append('-'); rb.append(Integer.toString(last)); HeaderIterator i = ns.connection.xhdr("Message-ID", rb.toString()); while (i.hasNext()) { HeaderEntry entry = i.nextHeaderEntry(); Integer key = new Integer(entry.getArticleId()); // Cache lookup NNTPMessage m = (NNTPMessage) articleCache.get(key); if (m == null) { int msgnum = key.intValue(); String messageId = entry.getHeader(); m = new NNTPMessage(this, msgnum, messageId); // Cache store articleCache.put(key, m); } acc.add(m); } } catch (NNTPException e) { // Perhaps the server does not understand XHDR. // We'll do it the slow way. for (int i = first; i <= last; i++) { Integer key = new Integer(i); // Cache lookup Message m = (NNTPMessage) articleCache.get(key); if (m == null) { try { m = getMessageImpl(i); // Cache store articleCache.put(key, m); acc.add(m); } catch (NNTPException e2) { switch (e2.getResponse().getStatus()) { case NNTPConstants.NO_ARTICLE_SELECTED: case NNTPConstants.NO_SUCH_ARTICLE_NUMBER: case NNTPConstants.NO_SUCH_ARTICLE: break; // article does not exist, ignore default: throw new MessagingException(e2.getMessage(), e2); } } catch (IOException ie) { throw new MessagingException(ie.getMessage(), ie); } } } } catch (IOException e) { throw new MessagingException(e.getMessage(), e); } } int len = acc.size(); Message[] messages = new Message[len]; acc.toArray(messages); return messages; } /** * Prefetch. */ public void fetch(Message[] msgs, FetchProfile fp) throws MessagingException { boolean head = fp.contains(FetchProfile.Item.ENVELOPE); head = head ||(fp.getHeaderNames().length > 0); boolean body = fp.contains(FetchProfile.Item.CONTENT_INFO); int op = (head && body) ? 3 : head ? 2 : body ? 1 : 0; try { NNTPStore ns = (NNTPStore) store; for (int i = 0; i < msgs.length; i++) { Message msg = msgs[i]; if (msg == null || !(msg instanceof NNTPMessage)) { continue; } NNTPMessage message = (NNTPMessage) msg; String messageId = message.getMessageId(); ArticleResponse response = null; synchronized (ns.connection) { switch (op) { case 3: // head & body response = ns.connection.article(messageId); break; case 2: // head response = ns.connection.head(messageId); break; case 1: // body response = ns.connection.body(messageId); break; } ByteArrayOutputStream out = new ByteArrayOutputStream(); byte[] buf = new byte[4096]; for (int len = response.in.read(buf); len >- 1; len = response.in.read(buf)) { out.write(buf, 0, len); } switch (op) { case 3: // head & body ByteArrayInputStream hbin = new ByteArrayInputStream(out.toByteArray()); message.updateHeaders(hbin); int len = hbin.available(); byte[] content = new byte[len]; hbin.read(content); message.updateContent(content); break; case 2: // head ByteArrayInputStream hin = new ByteArrayInputStream(out.toByteArray()); message.updateHeaders(hin); break; case 1: // body message.updateContent(out.toByteArray()); break; } } } } catch (NNTPException e) { switch (e.getResponse().getStatus()) { case NNTPConstants.NO_GROUP_SELECTED: throw new IllegalStateException(e.getMessage()); case NNTPConstants.NO_ARTICLE_SELECTED: case NNTPConstants.NO_SUCH_ARTICLE_NUMBER: case NNTPConstants.NO_SUCH_ARTICLE: throw new MessageRemovedException(e.getMessage()); default: throw new MessagingException(e.getMessage(), e); } } catch (IOException e) { throw new MessagingException(e.getMessage(), e); } } // -- Subscription -- /** * Indicates if the newsgroup is subscribed. * This uses the newsrc mechanism associated with this folder's store. */ public boolean isSubscribed() { NNTPStore ns = (NNTPStore) store; return ns.newsrc.isSubscribed(name); } /** * Subscribes or unsubscribes to this newsgroup. * This uses the newsrc mechanism associated with this folder's store. */ public void setSubscribed(boolean flag) throws MessagingException { NNTPStore ns = (NNTPStore) store; ns.newsrc.setSubscribed(name, flag); } boolean isSeen(int articleNumber) { NNTPStore ns = (NNTPStore) store; return ns.newsrc.isSeen(name, articleNumber); } void setSeen(int articleNumber, boolean flag) { NNTPStore ns = (NNTPStore) store; ns.newsrc.setSeen(name, articleNumber, flag); } // -- Stuff we can't do -- /** * This folder type does not contain other folders. */ public Folder getFolder(String name) throws MessagingException { throw new MethodNotSupportedException(); } /** * This folder type does not contain other folders. */ public Folder[] list(String pattern) throws MessagingException { throw new MethodNotSupportedException(); } /** * This folder type does not contain other folders. */ public Folder[] listSubscribed(String pattern) throws MessagingException { return list(pattern); } /** * If we move away from a flat namespace, this might be useful. */ public char getSeparator() throws MessagingException { return '.'; } /** * NNTP servers are read-only. */ public boolean create(int type) throws MessagingException { throw new MethodNotSupportedException(); } /** * NNTP servers are read-only. */ public boolean delete(boolean recurse) throws MessagingException { throw new MethodNotSupportedException(); } /** * NNTP servers are read-only. */ public boolean renameTo(Folder folder) throws MessagingException { throw new MethodNotSupportedException(); } /** * NNTP servers are read-only. */ public void appendMessages(Message[] messages) throws MessagingException { throw new IllegalWriteException(); } /** * NNTP servers are read-only. */ public Message[] expunge() throws MessagingException { throw new IllegalWriteException(); } } mail-1.1.2/source/gnu/mail/providers/nntp/NNTPMessage.java0000664000076500007650000001376710614714012022765 0ustar dogdog00000000000000/* * NNTPMessage.java * Copyright(C) 2002 Chris Burdess * * This file is part of GNU JavaMail, a library. * * GNU JavaMail is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or *(at your option) any later version. * * GNU JavaMail 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * As a special exception, if you link this library with other files to * produce an executable, this library does not by itself cause the * resulting executable to be covered by the GNU General Public License. * This exception does not however invalidate any other reasons why the * executable file might be covered by the GNU General Public License. */ package gnu.mail.providers.nntp; import java.io.IOException; import java.io.InputStream; import java.util.Enumeration; import javax.mail.FetchProfile; import javax.mail.Flags; import javax.mail.MessagingException; import javax.mail.internet.InternetHeaders; import javax.mail.internet.MimeMessage; /** * A JavaMail MIME message delegate for an NNTP article. * * @author Chris Burdess * @version 2.0 */ public final class NNTPMessage extends MimeMessage { String messageId; NNTPMessage(NNTPFolder folder, int msgnum, String messageId) { super(folder, msgnum); this.messageId = messageId; headers = null; // Set SEEN state flags = folder.getPermanentFlags(); if (folder.isSeen(msgnum)) { flags.add(Flags.Flag.SEEN); } else { flags.remove(Flags.Flag.SEEN); } } public String getMessageId() { return messageId; } void requestHeaders() throws MessagingException { FetchProfile fp = new FetchProfile(); fp.add(FetchProfile.Item.ENVELOPE); NNTPMessage[] messages = new NNTPMessage[1]; messages[0] = this; folder.fetch(messages, fp); } /* * Called by NNTPFolder */ void updateHeaders(InputStream in) throws MessagingException, IOException { headers = new InternetHeaders(in); } void requestContent() throws MessagingException { FetchProfile fp = new FetchProfile(); fp.add(FetchProfile.Item.CONTENT_INFO); NNTPMessage[] messages = new NNTPMessage[1]; messages[0] = this; folder.fetch(messages, fp); } /* * Called by NNTPFolder */ void updateContent(byte[] content) { this.content = content; } // -- Header retrieval -- public String[] getHeader(String name) throws MessagingException { if (headers == null) { requestHeaders(); } return super.getHeader(name); } public String getHeader(String name, String delimiter) throws MessagingException { if (headers == null) { requestHeaders(); } return super.getHeader(name, delimiter); } public Enumeration getAllHeaders() throws MessagingException { if (headers == null) { requestHeaders(); } return super.getAllHeaders(); } public Enumeration getMatchingHeaders(String[] names) throws MessagingException { if (headers == null) { requestHeaders(); } return super.getMatchingHeaders(names); } public Enumeration getNonMatchingHeaders(String[] names) throws MessagingException { if (headers == null) { requestHeaders(); } return super.getNonMatchingHeaders(names); } public Enumeration getAllHeaderLines() throws MessagingException { if (headers == null) { requestHeaders(); } return super.getAllHeaderLines(); } public Enumeration getMatchingHeaderLines(String[] names) throws MessagingException { if (headers == null) { requestHeaders(); } return super.getMatchingHeaderLines(names); } public Enumeration getNonMatchingHeaderLines(String[] names) throws MessagingException { if (headers == null) { requestHeaders(); } return super.getNonMatchingHeaderLines(names); } // setHeader / addHeader / removeHeader // -- Content retrieval -- public int getSize() throws MessagingException { if (content == null) { requestContent(); } return super.getSize(); } public int getLineCount() throws MessagingException { String value = getHeader("Lines", ","); if (value != null) { try { return Integer.parseInt(value.trim()); } catch (NumberFormatException e) { } } return -1; } public InputStream getContentStream() throws MessagingException { if (content == null) { requestContent(); } return super.getContentStream(); } // setContent(Object o, tring type), setContent(Multpart) public void saveChanges() throws MessagingException { if (headers == null) { requestHeaders(); } if (content == null) { requestContent(); } } // -- Update SEEN flag if necessary -- public void setFlags(Flags flag, boolean set) throws MessagingException { if (flag.contains(Flags.Flag.SEEN)) { ((NNTPFolder) folder).setSeen(msgnum, set); } super.setFlags(flag, set); } } mail-1.1.2/source/gnu/mail/providers/nntp/NNTPRootFolder.java0000664000076500007650000002227310614714012023450 0ustar dogdog00000000000000/* * NNTPRootFolder.java * Copyright(C) 2002, 2006 Chris Burdess * * This file is part of GNU JavaMail, a library. * * GNU JavaMail is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or *(at your option) any later version. * * GNU JavaMail 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * As a special exception, if you link this library with other files to * produce an executable, this library does not by itself cause the * resulting executable to be covered by the GNU General Public License. * This exception does not however invalidate any other reasons why the * executable file might be covered by the GNU General Public License. */ package gnu.mail.providers.nntp; import java.io.IOException; import java.util.Iterator; import java.util.List; import java.util.LinkedList; import javax.mail.Flags; import javax.mail.Folder; import javax.mail.IllegalWriteException; import javax.mail.Message; import javax.mail.MessagingException; import gnu.inet.nntp.Group; import gnu.inet.nntp.GroupIterator; import gnu.inet.nntp.NNTPConstants; import gnu.inet.nntp.NNTPException; /** * The "root" folder of the NNTP newsgroup list. * The NNTP folder namespace is taken to be a flat namespace. * This object allows us to retrieve folders corresponding to each newsgroup * in that space. * * @author Chris Burdess * @author Cedric Hyppolite * @version 2.0 */ final public class NNTPRootFolder extends Folder { NNTPRootFolder(NNTPStore store) { super(store); } public String getName() { NNTPStore ns = (NNTPStore) store; return ns.getURLName().getHost(); } public String getFullName() { NNTPStore ns = (NNTPStore) store; return ns.connection.getWelcome(); } /** * Returns the list of folders matching the specified pattern. * @param pattern the JavaMail pattern */ public Folder[] list(String pattern) throws MessagingException { return list(pattern, null); } /** * Returns the list of folders matching the specified pattern. * @param listener the listener to be called as soon as a new folder is * listed */ public Folder[] list(ListFolderListener listener) throws MessagingException { return list("%", listener); } /** * Returns the list of folders matching the specified pattern. * @param pattern the JavaMail pattern * @param listener the listener that will be called for each folder name * as soon as it is known */ public Folder[] list(String pattern, ListFolderListener listener) throws MessagingException { pattern = pattern.replace('%', '*'); // convert pattern to wildmat try { NNTPStore ns = (NNTPStore) store; // Indicates whether to *really* list all folders. boolean listAll = ns.isListAll(); List acc = new LinkedList(); synchronized (ns.connection) { GroupIterator i = listAll ? ns.connection.listActive(pattern) : ns.connection.listSubscriptions(); while (i.hasNext()) { Group group = i.nextGroup(); NNTPFolder folder = new NNTPFolder(ns, group.getName()); acc.add(folder); if (listener != null) listener.foundFolder(group.getName()); } } int len = acc.size(); Folder[] folders = new Folder[len]; acc.toArray(folders); return folders; } catch (NNTPException e) { switch (e.getResponse().getStatus()) { case NNTPConstants.COMMAND_NOT_RECOGNIZED: case NNTPConstants.SYNTAX_ERROR: case NNTPConstants.INTERNAL_ERROR: return listSubscribed(pattern); default: throw new MessagingException(e.getMessage(), e); } } catch (IOException e) { throw new MessagingException(e.getMessage(), e); } } /** * Returns the list of subscribed folders matching the specified pattern. * @param pattern the JavaMail pattern */ public Folder[] listSubscribed(String pattern) throws MessagingException { pattern = pattern.replace('%', '*'); // convert pattern to wildmat // Does the pattern contain any wildcards? boolean hasWildcard = pattern.indexOf('*') >- 1; // Does the pattern contain only a wildcard? boolean onlyWildcard = hasWildcard &&(pattern.length() == 0); NNTPStore ns = (NNTPStore) store; List acc = new LinkedList(); Iterator i = ns.newsrc.list(); while (i.hasNext()) { String name = (String) i.next(); // Check that name matches pattern if (!onlyWildcard) { if (hasWildcard && matches(name, pattern)) acc.add(new NNTPFolder(ns, name)); else if (!hasWildcard && pattern.equals(name)) acc.add(new NNTPFolder(ns, name)); } } int len = acc.size(); Folder[] folders = new Folder[len]; acc.toArray(folders); return folders; } /** * Implements a subset of wildmat matching on the client side. * This is necessary for newsgroup matching from newsrc lists. */ boolean matches(String name, String pattern) { int i1 = pattern.indexOf('*'); int pn = 0, pp = 0; while (i1 >- 1) { if (i1 > 0) { String ps = pattern.substring(pp, i1); int len = ps.length(); String ns = name.substring(pn, len); if (!ps.equals(ns)) { return false; } pp = i1 + 1; pn += len; i1 = 0; } else { pp = i1 + 1; i1 = pattern.indexOf('*', pp); String ps = null; if (i1 == -1) { ps = pattern.substring(pp); } else { ps = pattern.substring(pp, i1); } int len = ps.length(); if (len > 0) { String ns = name.substring(pn, len); if (!ps.equals(ns)) { return false; } } } } return true; } /** * Returns a new Folder object associated with the specified name. */ public Folder getFolder(String name) throws MessagingException { NNTPStore ns = (NNTPStore) store; return new NNTPFolder(ns, name); } public Folder getParent() throws MessagingException { return null; } public boolean exists() throws MessagingException { return true; } /** * As we're dealing with a flat namespace, the value of this is * irrelevant. */ public char getSeparator() throws MessagingException { return '.'; } /** * This folder contains only folders. */ public int getType() { return HOLDS_FOLDERS; } public void open(int mode) throws MessagingException { // Although we will never actually _be_ open, // it's always good to remind people.... if (mode != READ_ONLY) { throw new IllegalWriteException("Folder is read-only"); } } public void close(boolean expunge) throws MessagingException { } public Message[] expunge() throws MessagingException { throw new IllegalWriteException("Folder is read-only"); } public boolean isOpen() { return false; } public Flags getPermanentFlags() { return new Flags(); } public int getMessageCount() throws MessagingException { return -1; } public Message getMessage(int msgnum) throws MessagingException { throw new IllegalStateException("Folder not open"); } /** * This folder is always "subscribed". */ public void setSubscribed(boolean flag) throws MessagingException { if (!flag) { throw new IllegalWriteException("Can't unsubscribe root folder"); } } public boolean hasNewMessages() throws MessagingException { return false; } public void appendMessages(Message[] messages) throws MessagingException { throw new IllegalWriteException("Folder is read-only"); } public boolean create(int type) throws MessagingException { throw new MessagingException("Folder already exists"); } public boolean delete(boolean flag) throws MessagingException { throw new IllegalWriteException("Folder is read-only"); } public boolean renameTo(Folder folder) throws MessagingException { throw new IllegalWriteException("Folder is read-only"); } } mail-1.1.2/source/gnu/mail/providers/nntp/NNTPStore.java0000664000076500007650000001723410614714012022466 0ustar dogdog00000000000000/* * NNTPStore.java * Copyright(C) 2002 Chris Burdess * * This file is part of GNU JavaMail, a library. * * GNU JavaMail is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or *(at your option) any later version. * * GNU JavaMail 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * As a special exception, if you link this library with other files to * produce an executable, this library does not by itself cause the * resulting executable to be covered by the GNU General Public License. * This exception does not however invalidate any other reasons why the * executable file might be covered by the GNU General Public License. */ package gnu.mail.providers.nntp; import java.io.File; import java.io.IOException; import java.lang.reflect.Constructor; import java.util.logging.Level; import java.util.logging.Logger; import javax.mail.AuthenticationFailedException; import javax.mail.Flags; import javax.mail.Folder; import javax.mail.MessagingException; import javax.mail.Session; import javax.mail.Store; import javax.mail.URLName; import gnu.inet.nntp.FileNewsrc; import gnu.inet.nntp.Newsrc; import gnu.inet.nntp.NNTPConnection; /** * An NNTP store provider. * This uses an NNTPConnection to handle all the protocol-related * functionality. * * @author Chris Burdess * @version 2.0 */ public class NNTPStore extends Store { static final Logger logger = Logger.getLogger("gnu.mail.providers.nntp"); static final Level NNTP_TRACE = NNTPConnection.NNTP_TRACE; NNTPConnection connection; Newsrc newsrc; Folder root; /* * The permanent flags for NNTPFolders. */ Flags permanentFlags; /** * Constructor. * @param session the session * @param url the connection URL */ public NNTPStore(Session session, URLName url) { super(session, url); // The permanent flags for NNTPFolders. permanentFlags = new Flags(); permanentFlags.add(Flags.Flag.RECENT); permanentFlags.add(Flags.Flag.SEEN); // Init newsrc String tn = getProperty("newsrc"); if (tn != null) { try { ClassLoader l = Thread.currentThread().getContextClassLoader(); Class t = l.loadClass(tn); newsrc = (Newsrc) t.newInstance(); } catch (Exception e) { logger.log(NNTP_TRACE, "ERROR: unable to instantiate newsrc", e); } } else { File file = null; String filename = getProperty("newsrc.file"); if (filename == null) { String home = System.getProperty("user.home"); // ${HOME}/.newsrc[-${hostname}] String baseFilename = ".newsrc"; StringBuffer buffer = new StringBuffer(baseFilename); if (url != null) { buffer.append('-'); buffer.append(url.getHost()); } file = new File(home, buffer.toString()); if (!file.exists()) { // ${HOME}/.newsrc file = new File(home, baseFilename); } } else { file = new File(filename); } newsrc = new FileNewsrc(file, session.getDebug()); } } /** * Performs the protocol connection. */ protected boolean protocolConnect(String host, int port, String username, String password) throws MessagingException { if (connection != null) { return true; } if (host == null) { host = getProperty("host"); } if (username == null) { username = getProperty("user"); } if (port < 0) { port = getIntProperty("port"); } if (host == null) { return false; } try { int connectionTimeout = getIntProperty("connectiontimeout"); int timeout = getIntProperty("timeout"); if (port < 0) { port = NNTPConnection.DEFAULT_PORT; } if (session.getDebug()) { NNTPConnection.logger.setLevel(NNTPConnection.NNTP_TRACE); } connection = new NNTPConnection(host, port, connectionTimeout, timeout); if (username != null && password != null) { // TODO decide on authentication method // Original authinfo return connection.authinfo(username, password); } else { return true; } } catch (IOException e) { throw new MessagingException(e.getMessage(), e); } } /** * Close the connection. */ public void close() throws MessagingException { try { newsrc.close(); synchronized (connection) { connection.quit(); } } catch (IOException e) { throw new MessagingException(e.getMessage(), e); } super.close(); } /** * Returns the folder representing the "root" namespace. * This folder can be used to browse the folder hierarchy. */ public Folder getDefaultFolder() throws MessagingException { if (root == null) { root = new NNTPRootFolder(this); } return root; } /** * Returns a folder by name. */ public Folder getFolder(String name) throws MessagingException { return getDefaultFolder().getFolder(name); } /** * Returns the folder whose name corresponds to the file part * of the specified URL. */ public Folder getFolder(URLName url) throws MessagingException { return getDefaultFolder().getFolder(url.getFile()); } /* * Indicates whether we should attempt to list all newsgroups. * There are >30,000 newsgroups on Usenet. A naive client is unlikely to * expect upwards of 30,000 folders to be returned from list(). */ boolean isListAll() { return propertyIsTrue("listall"); } // -- Utility methods -- private int getIntProperty(String key) { String value = getProperty(key); if (value != null) { try { return Integer.parseInt(value); } catch (RuntimeException e) { } } return -1; } private boolean propertyIsFalse(String key) { return "false".equals(getProperty(key)); } private boolean propertyIsTrue(String key) { return "true".equals(getProperty(key)); } /* * Returns the provider-specific or general mail property corresponding to * the specified key. */ private String getProperty(String key) { String value = session.getProperty("mail.nntp." + key); if (value == null) { value = session.getProperty("mail." + key); } return value; } } mail-1.1.2/source/gnu/mail/providers/nntp/NNTPTransport.java0000664000076500007650000001540010614714012023357 0ustar dogdog00000000000000/* * NNTPTransport.java * Copyright(C) 2002 Chris Burdess * * This file is part of GNU JavaMail, a library. * * GNU JavaMail is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or *(at your option) any later version. * * GNU JavaMail 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * As a special exception, if you link this library with other files to * produce an executable, this library does not by itself cause the * resulting executable to be covered by the GNU General Public License. * This exception does not however invalidate any other reasons why the * executable file might be covered by the GNU General Public License. */ package gnu.mail.providers.nntp; import java.io.IOException; import java.io.OutputStream; import java.net.SocketException; import javax.mail.Address; import javax.mail.AuthenticationFailedException; import javax.mail.Message; import javax.mail.MessagingException; import javax.mail.Session; import javax.mail.Transport; import javax.mail.URLName; import javax.mail.event.TransportEvent; import javax.mail.internet.MimeMessage; import javax.mail.internet.NewsAddress; import gnu.inet.nntp.NNTPConnection; /** * An NNTP transport provider. * This uses an NNTPConnection to handle all the protocol-related * functionality. * * @author Chris Burdess * @version 2.0 */ public class NNTPTransport extends Transport { NNTPConnection connection; /** * Constructor. * @param session the session * @param url the connection URL */ public NNTPTransport(Session session, URLName url) { super(session, url); } /** * Performs the protocol connection. * @see NNTPStore#protocolConnect */ protected boolean protocolConnect(String host, int port, String username, String password) throws MessagingException { if (connection != null) { return true; } if (host == null) { host = getProperty("host"); } if (username == null) { username = getProperty("user"); } if (port < 0) { port = getIntProperty("port"); } if (host == null) { return false; } try { int connectionTimeout = getIntProperty("connectiontimeout"); int timeout = getIntProperty("timeout"); if (port < 0) { port = NNTPConnection.DEFAULT_PORT; } if (session.getDebug()) { NNTPConnection.logger.setLevel(NNTPConnection.NNTP_TRACE); } connection = new NNTPConnection(host, port, connectionTimeout, timeout); if (username != null && password != null) { // TODO decide on authentication method // Original authinfo return connection.authinfo(username, password); } else { return true; } } catch (IOException e) { throw new MessagingException(e.getMessage(), e); } catch (SecurityException e) { if (username != null && password != null) { throw new AuthenticationFailedException(e.getMessage()); } else { return false; } } } /** * Close the connection. * @see NNTPStore#close */ public void close() throws MessagingException { try { synchronized (connection) { connection.quit(); } } catch (IOException e) { if (!(e instanceof SocketException)) { throw new MessagingException(e.getMessage(), e); } } super.close(); } /** * Post an article. * @param message a MimeMessage * @param addresses an array of Address(ignored!) */ public void sendMessage(Message message, Address[] addresses) throws MessagingException { // Ensure corrent recipient type, and that all newsgroup recipients are // of type NewsAddress. addresses = message.getRecipients(MimeMessage.RecipientType.NEWSGROUPS); boolean ok = (addresses.length > 0); if (!ok) { throw new MessagingException("No recipients specified"); } for (int i = 0; i < addresses.length; i++) { if (!(addresses[i] instanceof NewsAddress)) { ok = false; break; } } if (!ok) { throw new MessagingException("Newsgroup recipients must be "+ "specified as type NewsAddress"); } try { synchronized (connection) { OutputStream out = connection.post(); message.writeTo(out); out.close(); } notifyTransportListeners(TransportEvent.MESSAGE_DELIVERED, addresses, new NewsAddress[0], new NewsAddress[0], message); } catch (IOException e) { throw new MessagingException(e.getMessage(), e); } } private int getIntProperty(String key) { String value = getProperty(key); if (value != null) { try { return Integer.parseInt(value); } catch (RuntimeException e) { } } return -1; } private boolean propertyIsFalse(String key) { return "false".equals(getProperty(key)); } private boolean propertyIsTrue(String key) { return "true".equals(getProperty(key)); } /* * Returns the provider-specific or general mail property corresponding to * the specified key. */ private String getProperty(String key) { String value = session.getProperty("mail.nntp." + key); if (value == null) { value = session.getProperty("mail." + key); } return value; } } mail-1.1.2/source/gnu/mail/providers/nntp/package.html0000664000076500007650000000367710614714012022316 0ustar dogdog00000000000000

This is a provider for the Network News Transfer Protocol (NNTP), as detailed in RFC 977.

This provider uses the XHDR command introduced in RFC 2980.

The provider can store the state of subscribed newsgroups and read articles on the local host, using the standard newsrc mechanism.

The provider includes both a Store and a Transport implementation. Due to JavaMail limitations, the transport protocol is called "nntp-post". Use the same connection setting as the store to post articles. The messages to be sent must be MimeMessages, and they must have a recipient of type MimeMessage.RecipientType.NEWSGROUPS, of which the address is a NewsAddress.

This provider supports the following properties:
Name Type Description
mail.nntp.host IP address or hostname The NNTP server to connect to.
mail.nntp.port integer (>=1) The port to connect to, if not the default.
mail.nntp.user username The default username for NNTP.
mail.nntp.connectiontimeout integer (>=1) Socket connection timeout, in milliseconds. Default is no timeout.
mail.nntp.newsrc file path The file path to the file to use as newsrc. Defaults to ${user.home}/.newsrc-${host} or ${user.home}/.newsrc
mail.nntp.listall boolean If set to true, calling Folder.list on the root folder will actually attempt to list all newsgroups. Since there are upwards of 30,000 newsgroups on Usenet, this option should be used with caution. Otherwise a small subset of default newsgroups are returned.

mail-1.1.2/source/gnu/mail/providers/pop3/0000775000076500007650000000000010614714024017725 5ustar dogdog00000000000000mail-1.1.2/source/gnu/mail/providers/pop3/package.html0000664000076500007650000000523310614714012022206 0ustar dogdog00000000000000

This is a provider for the Internet Post Office Protocol, version 3 (POP3), as detailed in RFC 1939.

This provider supports transport layer security (TLS), as described in RFC 2595, and uses APOP authentication if the server advertises this capability.

The POP3 store provides access to a single folder named "INBOX". Folder management operations are not supported by POP3; nor are permanent flags.

This store does not provide a local cache of messages. You can implement such a cache yourself using the mbox or Maildir providers in this distribution.

POP3 does not support the expunge method according to the JavaMail specification. Messages deleted using expunge will only be removed from the folder when the close method is called.

This provider supports the following properties:
Name Type Description
mail.pop3.host IP address or hostname The POP3 server to connect to.
mail.pop3.port integer (>=1) The port to connect to, if not the default.
mail.pop3.user username The default username for POP3.
mail.pop3.connectiontimeout integer (>=1) Socket connection timeout, in milliseconds. Default is no timeout.
mail.pop3.timeout integer (>=1) Socket I/O timeout, in milliseconds. Default is no timeout.
mail.pop3.tls boolean If set to false, TLS negotiation will not be attempted. Exceptionally, you may set this to required to throw an exception on connect when TLS is not available.
mail.pop3.trustmanager String The name of a class implementing the javax.net.ssl.TrustManager interface, which will be used to determine trust in TLS negotiation.
mail.pop3.auth.mechanisms comma-delimited list of SASL mechanisms If set, only the specified SASL mechanisms will be attempted during authentication, in the given order. If not present, the SASL mechanisms advertised by the server will be used.
mail.pop3.apop boolean If set to false, APOP authentication will not be attempted.
mail.pop3.rsetbeforequit boolean If set to true, an RSET command will be issued before QUIT. This is useful for broken servers that implicitly mark read messages as deleted.

mail-1.1.2/source/gnu/mail/providers/pop3/POP3Folder.java0000664000076500007650000002503610614714012022450 0ustar dogdog00000000000000/* * POP3Folder.java * Copyright (C) 1999, 2003 Chris Burdess * * This file is part of GNU JavaMail, a library. * * GNU JavaMail is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * GNU JavaMail 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * As a special exception, if you link this library with other files to * produce an executable, this library does not by itself cause the * resulting executable to be covered by the GNU General Public License. * This exception does not however invalidate any other reasons why the * executable file might be covered by the GNU General Public License. */ package gnu.mail.providers.pop3; import java.io.IOException; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import javax.mail.FetchProfile; import javax.mail.Flags; import javax.mail.Folder; import javax.mail.IllegalWriteException; import javax.mail.Message; import javax.mail.MessagingException; import javax.mail.Store; import javax.mail.UIDFolder; import javax.mail.event.ConnectionEvent; import gnu.inet.pop3.POP3Connection; /** * The folder class implementing the POP3 mail protocol. * * @author Chris Burdess * @author Nic Ferrier * @version 1.3 */ public final class POP3Folder extends Folder { boolean readonly = false, open = false; int type; Folder inbox; List deleted; /** * Constructor. */ protected POP3Folder(Store store, int type) { super(store); this.type = type; } /** * Returns the name of this folder. */ public String getName() { switch (type) { case HOLDS_FOLDERS: return "/"; case HOLDS_MESSAGES: return "INBOX"; default: return "(Unknown)"; } } /** * Returns the full name of this folder. */ public String getFullName() { return getName(); } /** * Returns the type of this folder. * @exception MessagingException if a messaging error occurred */ public int getType() throws MessagingException { return type; } /** * Indicates whether this folder exists. * @exception MessagingException if a messaging error occurred */ public boolean exists() throws MessagingException { return (type == HOLDS_MESSAGES); } /** * Indicates whether this folder contains new messages. * @exception MessagingException if a messaging error occurred */ public boolean hasNewMessages() throws MessagingException { return getNewMessageCount() > 0; } /** * Opens this folder. * @exception MessagingException if a messaging error occurred */ public void open(int mode) throws MessagingException { switch (mode) { case READ_WRITE: readonly = false; deleted = new ArrayList(); break; case READ_ONLY: readonly = true; break; } this.mode = mode; open = true; notifyConnectionListeners(ConnectionEvent.OPENED); } /** * Closes this folder. * @param expunge if the folder is to be expunged before it is closed * @exception MessagingException if a messaging error occurred */ public void close(boolean expunge) throws MessagingException { if (!open) { throw new MessagingException("Folder is not open"); } if (expunge) { expunge(); } deleted = null; open = false; notifyConnectionListeners(ConnectionEvent.CLOSED); } /** * Expunges this folder. * This deletes all the messages marked as deleted. * @exception MessagingException if a messaging error occurred */ public Message[] expunge() throws MessagingException { if (!open) { throw new MessagingException("Folder is not open"); } if (readonly) { throw new MessagingException("Folder was opened read-only"); } POP3Connection connection = ((POP3Store) store).connection; synchronized (connection) { try { for (Iterator i = deleted.iterator(); i.hasNext(); ) { Message msg = (Message) i.next(); int msgnum = msg.getMessageNumber(); connection.dele(msgnum); } } catch (IOException e) { throw new MessagingException(e.getMessage(), e); } } Message[] d = new Message[deleted.size()]; deleted.toArray(d); deleted.clear(); return d; } /** * Indicates whether this folder is open. */ public boolean isOpen() { return open; } /** * Returns the permanent flags for this folder. */ public Flags getPermanentFlags() { return new Flags(); } /** * Returns the number of messages in this folder. * This results in a STAT call to the POP3 server, so the latest * count is always delivered. * @exception MessagingException if a messaging error occurred */ public int getMessageCount() throws MessagingException { POP3Connection connection = ((POP3Store) store).connection; synchronized (connection) { try { return connection.stat(); } catch (IOException e) { throw new MessagingException(e.getMessage(), e); } } } /** * Returns the specified message from this folder. * @param msgnum the message number * @exception MessagingException if a messaging error occurred */ public Message getMessage(int msgnum) throws MessagingException { if (!open) { throw new MessagingException("Folder is not open"); } POP3Connection connection = ((POP3Store) store).connection; synchronized (connection) { try { int size = connection.list(msgnum); return new POP3Message(this, msgnum, size); } catch (IOException e) { throw new MessagingException(e.getMessage(), e); } } } /** * You can't append messages to a POP3 folder. */ public void appendMessages(Message[] messages) throws MessagingException { throw new IllegalWriteException(); } /** * Fetches headers and/or content for the specified messages. * @exception MessagingException ignore */ public void fetch(Message[] messages, FetchProfile fp) throws MessagingException { // Determine whether to fetch headers or content boolean fetchHeaders = false; boolean fetchContent = false; boolean fetchUid = false; FetchProfile.Item[] items = fp.getItems(); for (int i = 0; i < items.length; i++) { if (items[i] == UIDFolder.FetchProfileItem.UID) { fetchUid = true; } else if (items[i] == FetchProfile.Item.CONTENT_INFO) { fetchContent = true; } else { fetchHeaders = true; } } if (fp.getHeaderNames().length > 0) { fetchHeaders = true; } if (!fetchHeaders && !fetchContent && !fetchUid) { return; } // Do fetch for (int i = 0; i < messages.length; i++) { if (messages[i] instanceof POP3Message) { POP3Message m = (POP3Message) messages[i]; if (fetchUid) { m.fetchUid(); } if (fetchContent) { m.fetchContent(); } else { m.fetchHeaders(); } } } } /** * Returns the subfolders for this folder. */ public Folder[] list() throws MessagingException { switch (type) { case HOLDS_FOLDERS: if (inbox == null) { inbox = new POP3Folder(store, HOLDS_MESSAGES); } Folder[] folders = { inbox }; return folders; default: throw new MessagingException("This folder can't contain subfolders"); } } /** * Returns the subfolders for this folder. */ public Folder[] list(String pattern) throws MessagingException { return list(); } /** * POP3 folders can't have parents. */ public Folder getParent() throws MessagingException { switch (type) { case HOLDS_MESSAGES: return ((POP3Store) store).root; default: return null; } } /** * POP3 folders can't contain subfolders. */ public Folder getFolder(String s) throws MessagingException { switch (type) { case HOLDS_FOLDERS: if (inbox == null) { inbox = new POP3Folder(store, HOLDS_MESSAGES); } return inbox; default: throw new MessagingException("This folder can't contain subfolders"); } } /** * Returns the path separator charcter. */ public char getSeparator() throws MessagingException { return '\u0000'; } // -- These must be overridden to throw exceptions -- /** * POP3 folders can't be created, deleted, or renamed. */ public boolean create(int i) throws MessagingException { throw new IllegalWriteException(); } /** * POP3 folders can't be created, deleted, or renamed. */ public boolean delete(boolean flag) throws MessagingException { throw new IllegalWriteException("Folder can't be deleted"); } /** * POP3 folders can't be created, deleted, or renamed. */ public boolean renameTo(Folder folder) throws MessagingException { throw new IllegalWriteException("Folder can't be renamed"); } // -- UIDL -- /** * Returns the unique ID for the given message, or null if * not available. * @param message the message */ public String getUID(Message message) throws MessagingException { if (message instanceof POP3Message) { return ((POP3Message) message).getUID(); } return null; } } mail-1.1.2/source/gnu/mail/providers/pop3/POP3Message.java0000664000076500007650000002151310614714012022615 0ustar dogdog00000000000000/* * POP3Message.java * Copyright(C) 1999, 2003 Chris Burdess * * This file is part of GNU JavaMail, a library. * * GNU JavaMail is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or *(at your option) any later version. * * GNU JavaMail 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * As a special exception, if you link this library with other files to * produce an executable, this library does not by itself cause the * resulting executable to be covered by the GNU General Public License. * This exception does not however invalidate any other reasons why the * executable file might be covered by the GNU General Public License. */ package gnu.mail.providers.pop3; import java.io.InputStream; import java.io.IOException; import java.io.OutputStream; import java.util.Enumeration; import javax.activation.DataHandler; import javax.mail.Flags; import javax.mail.Folder; import javax.mail.IllegalWriteException; import javax.mail.MessagingException; import javax.mail.internet.InternetHeaders; import gnu.inet.pop3.POP3Connection; import gnu.mail.providers.ReadOnlyMessage; /** * The message class implementing the POP3 mail protocol. * * @author Chris Burdess * @author Nic Ferrier * @version 1.2 */ public final class POP3Message extends ReadOnlyMessage { /* * The size of this message. */ int size; /* * The UID of this message. */ String uid; /** * Create a POP3Message. * @param folder the parent folder * @param msgnum the message number * @param size the size of the entire message */ POP3Message(POP3Folder folder, int msgnum, int size) throws MessagingException { super(folder, msgnum); this.size = size; } // -- Content -- /** * Retrieves the content of the message. * This uses the POP3Store to do the retrieval. */ void fetchContent() throws MessagingException { if (content != null) { return; } POP3Connection connection = ((POP3Store) folder.getStore()).connection; synchronized (connection) { try { InputStream retr = connection.retr(msgnum); parse(retr); // Read to end of stream int c = retr.read(); while (c != -1) { c = retr.read(); } } catch (IOException e) { throw new MessagingException(e.getMessage(), e); } } } /** * Causes the content to be read in. */ public DataHandler getDataHandler() throws MessagingException { if (content == null) { fetchContent(); } return super.getDataHandler(); } /** * Causes the content to be read in. */ protected InputStream getContentStream() throws MessagingException { if (content == null) { fetchContent(); } return super.getContentStream(); } /** * Gets the size of the message. * Uses the cached size if it's available to us. */ public int getSize() throws MessagingException { if (size > -1) { return size; } if (content == null) { fetchContent(); } return super.getSize(); } // -- Headers -- /** * Causes the headers to be read. */ void fetchHeaders() throws MessagingException { if (headers != null) { return; } POP3Connection connection = ((POP3Store) folder.getStore()).connection; synchronized (connection) { try { InputStream top = connection.top(msgnum); headers = createInternetHeaders(top); // Read to end of stream int c = top.read(); while (c != -1) { c = top.read(); } } catch (IOException e) { throw new MessagingException(e.getMessage(), e); } } } /** * Causes the headers to be read. */ public String[] getHeader(String name) throws MessagingException { if (headers == null) { fetchHeaders(); } return super.getHeader(name); } /** * Causes the headers to be read. */ public String getHeader(String name, String delimiter) throws MessagingException { if (headers == null) { fetchHeaders(); } return super.getHeader(name, delimiter); } /** * Causes the headers to be read. */ public Enumeration getAllHeaders() throws MessagingException { if (headers == null) { fetchHeaders(); } return super.getAllHeaders(); } /** * Causes the headers to be read. */ public Enumeration getAllHeaderLines() throws MessagingException { if (headers == null) { fetchHeaders(); } return super.getAllHeaderLines(); } /** * Causes the headers to be read. */ public Enumeration getMatchingHeaders(String[] names) throws MessagingException { if (headers == null) { fetchHeaders(); } return super.getMatchingHeaders(names); } /** * Causes the headers to be read. */ public Enumeration getMatchingHeaderLines(String[] names) throws MessagingException { if (headers == null) { fetchHeaders(); } return super.getMatchingHeaderLines(names); } /** * Causes the headers to be read. */ public Enumeration getNonMatchingHeaders(String[] names) throws MessagingException { if (headers == null) { fetchHeaders(); } return super.getNonMatchingHeaders(names); } /** * Causes the headers to be read. */ public Enumeration getNonMatchingHeaderLines(String[] names) throws MessagingException { if (headers == null) { fetchHeaders(); } return super.getNonMatchingHeaderLines(names); } // -- Utility -- public void writeTo(OutputStream msgStream) throws IOException, MessagingException { if (headers == null) { fetchHeaders(); } if (content == null) { fetchContent(); } super.writeTo(msgStream); } public void writeTo(OutputStream msgStream, String[] ignoreList) throws IOException, MessagingException { if (headers == null) { fetchHeaders(); } if (content == null) { fetchContent(); } super.writeTo(msgStream, ignoreList); } // -- UIDL -- /** * Causes the UID to be fetched. */ void fetchUid() throws MessagingException { if (headers != null) { return; } POP3Connection connection = ((POP3Store) folder.getStore()).connection; synchronized (connection) { try { uid = connection.uidl(msgnum); } catch (IOException e) { throw new MessagingException(e.getMessage(), e); } } } /** * Returns the unique ID for this message. */ public String getUID() throws MessagingException { if (uid == null) { fetchUid(); } return uid; } /** * Set flags (but only DELETED is supported) * add or remove the message from the folder deleted message list. */ public void setFlags(Flags flags, boolean set) throws MessagingException { Flags.Flag[] tabFlags = flags.getSystemFlags(); for (int i = 0; i < tabFlags.length; i++) { Flags.Flag flagToSet = tabFlags[i]; if (set && !this.flags.contains(flagToSet)) { this.flags.add(flagToSet); } else if (!set && this.flags.contains(flagToSet)) { this.flags.remove(flagToSet); } if (flagToSet.equals(Flags.Flag.DELETED)) { POP3Folder pf = (POP3Folder) folder; if (set && !pf.deleted.contains(this)) { if (!(Folder.READ_WRITE==folder.getMode())) { throw new IllegalWriteException(); } pf.deleted.add(this); } else if (!set && pf.deleted.contains(this)) { pf.deleted.remove(this); } } } } } mail-1.1.2/source/gnu/mail/providers/pop3/POP3Store.java0000664000076500007650000003037010614714012022326 0ustar dogdog00000000000000/* * POP3Store.java * Copyright (C) 1999, 2003, 2005 Chris Burdess * * This file is part of GNU JavaMail, a library. * * GNU JavaMail is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * GNU JavaMail 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * As a special exception, if you link this library with other files to * produce an executable, this library does not by itself cause the * resulting executable to be covered by the GNU General Public License. * This exception does not however invalidate any other reasons why the * executable file might be covered by the GNU General Public License. */ package gnu.mail.providers.pop3; import java.io.InputStream; import java.io.IOException; import java.io.UnsupportedEncodingException; import java.lang.reflect.Method; import java.net.InetAddress; import java.net.URLDecoder; import java.net.UnknownHostException; import java.util.ArrayList; import java.util.Collections; import java.util.Iterator; import java.util.List; import java.util.StringTokenizer; import javax.mail.Folder; import javax.mail.Message; import javax.mail.MessagingException; import javax.mail.PasswordAuthentication; import javax.mail.Session; import javax.mail.Store; import javax.mail.URLName; import javax.net.ssl.TrustManager; import gnu.inet.pop3.POP3Connection; /** * The storage class implementing the POP3 mail protocol. * * @author Chris Burdess * @author Nic Ferrier * @version 1.3 */ public final class POP3Store extends Store { /* * The connection. */ POP3Connection connection; /* * The root folder. */ POP3Folder root; /** * If rue, disable use of APOP. */ boolean disableApop; /** * Constructor. */ public POP3Store(Session session, URLName urlname) { super(session, urlname); } /** * Connects to the POP3 server and authenticates with the specified * parameters. */ protected boolean protocolConnect(String host, int port, String username, String password) throws MessagingException { if (connection != null) { return true; } if (host == null) { host = getProperty("host"); } if (username == null) { username = getProperty("user"); } if (port < 0) { port = getIntProperty("port"); if (port < 0) { port = POP3Connection.DEFAULT_PORT; } } if (host == null || username == null || password == null) { return false; } disableApop = false; synchronized (this) { try { int connectionTimeout = getIntProperty("connectiontimeout"); int timeout = getIntProperty("timeout"); if (session.getDebug()) { POP3Connection.logger.setLevel(POP3Connection.POP3_TRACE); } boolean tls = "pop3s".equals(url.getProtocol()); // Locate custom trust manager TrustManager tm = getTrustManager(); connection = new POP3Connection(host, port, connectionTimeout, timeout, tls, tm); // Disable APOP if necessary if (propertyIsFalse("apop")) { disableApop = true; } // Get capabilities List capa = connection.capa(); if (capa != null) { if (capa.contains("STLS")) { if (!tls && !propertyIsFalse("tls")) { if (tm == null) { tls = connection.stls(); } else { tls = connection.stls(tm); } // Capabilities may have changed since STLS if (tls) { capa = connection.capa(); } } } if (!tls && "required".equals(getProperty("tls"))) { throw new MessagingException("TLS not available"); } // Build list of SASL mechanisms List authenticationMechanisms = null; for (Iterator i = capa.iterator(); i.hasNext(); ) { String cap = (String) i.next(); if (cap.startsWith("SASL ")) { if (authenticationMechanisms == null) { authenticationMechanisms = new ArrayList(); } authenticationMechanisms.add(cap.substring(5)); } } // User authentication if (authenticationMechanisms != null && !authenticationMechanisms.isEmpty()) { if (username == null || password == null) { PasswordAuthentication pa = session.getPasswordAuthentication(url); if (pa == null) { InetAddress addr = InetAddress.getByName(host); pa = session.requestPasswordAuthentication(addr, port, "pop3", null, null); } if (pa != null) { username = pa.getUserName(); password = pa.getPassword(); } } if (username != null && password != null) { // Discover user ordering preferences for auth // mechanisms String authPrefs = getProperty("auth.mechanisms"); Iterator i = null; if (authPrefs == null) { i = authenticationMechanisms.iterator(); } else { StringTokenizer st = new StringTokenizer(authPrefs, ","); List authPrefList = Collections.list(st); i = authPrefList.iterator(); } // Try each mechanism in the list in turn while (i.hasNext()) { String mechanism = (String) i.next(); if (authenticationMechanisms.contains(mechanism) && connection.auth(mechanism, username, password)) { return true; } } } } } // Fall back to APOP or login if (!disableApop) { return connection.apop(username, password); } else { return connection.login(username, password); } } catch (UnknownHostException e) { throw new MessagingException("Connect failed", e); } catch (IOException e) { throw new MessagingException("Connect failed", e); } } } /** * Returns a trust manager used for TLS negotiation. */ protected TrustManager getTrustManager() throws MessagingException { String tmt = getProperty("trustmanager"); if (tmt == null) { return null; } else { try { // Instantiate the trust manager Class t = Class.forName(tmt); TrustManager tm = (TrustManager) t.newInstance(); // If there is a setSession method, call it try { Class[] pt = new Class[] { Session.class }; Method m = t.getMethod("setSession", pt); Object[] args = new Object[] { session }; m.invoke(tm, args); } catch (NoSuchMethodException e) { } return tm; } catch (Exception e) { throw new MessagingException(e.getMessage(), e); } } } /** * Closes the connection. */ public void close() throws MessagingException { if (connection != null) { synchronized (connection) { try { if (propertyIsTrue("rsetbeforequit")) { connection.rset(); } connection.quit(); } catch (IOException e) { throw new MessagingException("Close failed", e); } } connection = null; } super.close(); } /** * Issues a NOOP to the POP server to determine whether the connection * is still alive. */ public boolean isConnected() { if (!super.isConnected()) return false; try { synchronized (connection) { connection.noop(); } return true; } catch (IOException e) { return false; } } /** * Returns the root folder. */ public Folder getDefaultFolder() throws MessagingException { synchronized (this) { if (root == null) { root = new POP3Folder(this, Folder.HOLDS_FOLDERS); } } return root; } /** * Returns the folder with the specified name. */ public Folder getFolder(String s) throws MessagingException { return getDefaultFolder().getFolder(s); } /** * Returns the folder whose name is the file part of the specified URLName. */ public Folder getFolder(URLName urlname) throws MessagingException { try { String file = URLDecoder.decode(urlname.getFile(), "UTF-8"); return getDefaultFolder().getFolder(file); } catch (UnsupportedEncodingException e) { throw new MessagingException(e.getMessage(), e); } } // -- Utility methods -- private int getIntProperty(String key) { String value = getProperty(key); if (value != null) { try { return Integer.parseInt(value); } catch (Exception e) { } } return -1; } private boolean propertyIsFalse(String key) { return "false".equals(getProperty(key)); } private boolean propertyIsTrue(String key) { return "true".equals(getProperty(key)); } /* * Returns the provider-specific or general mail property corresponding to * the specified key. */ private String getProperty(String key) { String value = session.getProperty("mail.pop3." + key); if (value == null) { value = session.getProperty("mail." + key); } return value; } } mail-1.1.2/source/gnu/mail/providers/ReadOnlyMessage.java0000664000076500007650000000645410614714012022737 0ustar dogdog00000000000000/* * ReadOnlyMessage.java * Copyright(C) 2003 Chris Burdess * * This file is part of GNU JavaMail, a library. * * GNU JavaMail is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or *(at your option) any later version. * * GNU JavaMail 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * As a special exception, if you link this library with other files to * produce an executable, this library does not by itself cause the * resulting executable to be covered by the GNU General Public License. * This exception does not however invalidate any other reasons why the * executable file might be covered by the GNU General Public License. */ package gnu.mail.providers; import java.io.InputStream; import javax.mail.Flags; import javax.mail.Folder; import javax.mail.IllegalWriteException; import javax.mail.Message; import javax.mail.MessagingException; import javax.mail.Multipart; import javax.mail.internet.InternetHeaders; import javax.mail.internet.MimeMessage; /** * Abstract read-only message. * The superclass of mail provider messages that do not support message * editing in-place. * * @author Chris Burdess * @version 1.0 */ public abstract class ReadOnlyMessage extends MimeMessage { protected ReadOnlyMessage(Folder folder, int msgnum) throws MessagingException { super(folder, msgnum); } protected ReadOnlyMessage(Folder folder, InputStream in, int msgnum) throws MessagingException { super(folder, in, msgnum); } protected ReadOnlyMessage(Folder folder, InternetHeaders headers, byte[] content, int msgnum) throws MessagingException { super(folder, msgnum); } protected ReadOnlyMessage(MimeMessage message) throws MessagingException { super(message); } // -- content -- public void setContent(Object o, String type) throws MessagingException { throw new IllegalWriteException(); } public void setContent(Multipart mp) throws MessagingException { throw new IllegalWriteException(); } // -- headers -- public void setHeader(String name, String value) throws MessagingException { throw new IllegalWriteException(); } public void addHeader(String name, String value) throws MessagingException { throw new IllegalWriteException(); } public void removeHeader(String name) throws MessagingException { throw new IllegalWriteException(); } public void addHeaderLine(String line) throws MessagingException { throw new IllegalWriteException(); } // -- flags -- public void setFlags(Flags flag, boolean set) throws MessagingException { throw new IllegalWriteException(); } // -- general -- public void saveChanges() throws MessagingException { } } mail-1.1.2/source/gnu/mail/providers/smtp/0000775000076500007650000000000010614714024020027 5ustar dogdog00000000000000mail-1.1.2/source/gnu/mail/providers/smtp/package.html0000664000076500007650000000663610614714012022320 0ustar dogdog00000000000000

A provider for the Simple Mail Transfer Protocol (SMTP), as detailed in RFC 2821, including support for ESMTP service extensions.

This provider can use SMTP authentication via any installed SASL mechanism, and transport layer security (TLS) for servers that support it (RFC 2554 and 3207).

You may also optionally request Delivery Status Notifications (DSN) as specified in RFC 3461, and/or message tracking (MTRK) as specified in RFC 3885.

The provider supports the following session properties:
Name Type Description
mail.smtp.host IP address or hostname The SMTP server to connect to
mail.smtp.port integer (>=1) The port to connect to, if not specified.
mail.smtp.connectiontimeout integer (>=1) Socket connection timeout, in milliseconds. Defaults to no timeout.
mail.smtp.timeout integer (>=1) Socket I/O timeout, in milliseconds. Defaults to no timeout.
mail.smtp.from RFC 822 address The mailbox to use for the SMTP MAIL command. If not set, the first InternetAddress in the From field of the message will be used, or failing that, InternetAddress.getLocalAddress().
mail.smtp.localhost IP address or hostname The host identifier for the local machine, to report in the EHLO/HELO command.
mail.smtp.ehlo boolean If set to false, service extensions negotiation will not be attempted.
mail.smtp.auth boolean If set to true, authentication will be attempted. Exceptionally, you may set this to the special value "required" to throw an exception on connect when authentication could not be performed.
mail.smtp.auth.mechanisms comma-delimited list of SASL mechanisms If set, only the specified SASL mechanisms will be attempted during authentication, in the given order. If not present, the SASL mechanisms advertised by the server will be used.
mail.smtp.dsn.notify string The RCPT NOTIFY option. Should be set to either "never", or one or more of "success", "failure", or "delay" (separated by commas and/or spaces). See RFC 3461 for details. This feature may not be supported by all servers.
mail.smtp.dsn.ret string The MAIL RET option. Should be set to "full" or "hdrs". See RFC 3461 for details. This feature may not be supported by all servers.
mail.smtp.tls boolean If set to false, TLS negotiation will not be attempted. Exceptionally, you may set this to the special value "required" to throw an exception on connect when TLS is not available.
mail.smtp.mtrk boolean If set to true, sends MTRK and ENVID parameters.
mail.smtp.mtrk.timeout integer If set, specified the number of seconds to request that the tracking information be retained on the server.
mail.smtp.trustmanager String The name of a class implementing the javax.net.ssl.TrustManager interface, which will be used to determine trust in TLS negotiation.

mail-1.1.2/source/gnu/mail/providers/smtp/SMTPTransport.java0000664000076500007650000005413610614714012023400 0ustar dogdog00000000000000/* * SMTPTransport.java * Copyright(C) 2001 Benjamin A. Speakmon * * This file is part of GNU JavaMail, a library. * * GNU JavaMail is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or *(at your option) any later version. * * GNU JavaMail 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * As a special exception, if you link this library with other files to * produce an executable, this library does not by itself cause the * resulting executable to be covered by the GNU General Public License. * This exception does not however invalidate any other reasons why the * executable file might be covered by the GNU General Public License. */ package gnu.mail.providers.smtp; import java.io.IOException; import java.io.OutputStream; import java.io.UnsupportedEncodingException; import java.net.InetAddress; import java.net.UnknownHostException; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.util.ArrayList; import java.util.Collections; import java.util.Iterator; import java.util.List; import java.util.Random; import java.util.StringTokenizer; import javax.mail.Address; import javax.mail.Message; import javax.mail.MessagingException; import javax.mail.PasswordAuthentication; import javax.mail.SendFailedException; import javax.mail.Session; import javax.mail.Transport; import javax.mail.URLName; import javax.mail.event.TransportEvent; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeMessage; import javax.net.ssl.TrustManager; import gnu.inet.smtp.Parameter; import gnu.inet.smtp.ParameterList; import gnu.inet.smtp.SMTPConnection; import gnu.inet.util.BASE64; /** * This transport handles communications with an SMTP server. * * @author Andrew Selkirk * @author Ben Speakmon * @author Chris Burdess * @author Arend Freije * @version 2.0 */ public class SMTPTransport extends Transport { /** * The connection used to communicate with the server. */ protected SMTPConnection connection; protected String localHostName; private List extensions = null; private List authenticationMechanisms = null; /** * Creates a new SMTPTransport instance. * * @param session a Session value * @param urlName an URLName value */ public SMTPTransport(Session session, URLName urlName) { super(session, urlName); // Check for mail.smtp.localhost property localHostName = getProperty("localhost"); if (localHostName == null) { try { localHostName = InetAddress.getLocalHost().getHostName(); } catch (UnknownHostException e) { localHostName = "localhost"; } } } /** * Connects to the SMTP server. */ protected boolean protocolConnect(String host, int port, String username, String password) throws MessagingException { if (connection != null) { return true; } if (host == null) { host = getProperty("host"); } if (port < 0) { port = getIntProperty("port"); } if (username == null) { username = getProperty("user"); } // Check host if (host == null) { host = "localhost"; } try { int connectionTimeout = getIntProperty("connectiontimeout"); int timeout = getIntProperty("timeout"); if (session.getDebug()) { SMTPConnection.logger.setLevel(SMTPConnection.SMTP_TRACE); } boolean tls = "stmps".equals(url.getProtocol()); // Locate custom trust manager TrustManager tm = null; if (tls) { tm = getTrustManager(); } connection = new SMTPConnection(host, port, connectionTimeout, timeout, tls, tm); // EHLO/HELO if (propertyIsFalse("ehlo")) { if (!connection.helo(localHostName)) throw new MessagingException("HELO failed: "+ connection.getLastResponse()); } else { extensions = connection.ehlo(localHostName); if (extensions == null) { if (!connection.helo(localHostName)) { throw new MessagingException("HELO failed: "+ connection.getLastResponse()); } } else { if (!tls && extensions.contains("STARTTLS")) { if (!propertyIsFalse("tls")) { tm = getTrustManager(); if (tm == null) { tls = connection.starttls(); } else { tls = connection.starttls(tm); } if (tls) { extensions = connection.ehlo(localHostName); } } } if (!tls && "required".equals(getProperty("tls"))) { throw new MessagingException("TLS not available"); } // Populate authenticationMechanisms for (Iterator i = extensions.iterator(); i.hasNext(); ) { String extension = (String) i.next(); if (extension.startsWith("AUTH ")) { String m = extension.substring(5); authenticationMechanisms = Collections.list(new StringTokenizer(m)); } } } } // User authentication String auth = getProperty("auth"); boolean authRequired = "required".equals(auth); if (authenticationMechanisms == null || authenticationMechanisms.isEmpty()) { return !authRequired; } if (authRequired || propertyIsTrue("auth")) { if (username == null || password == null) { PasswordAuthentication pa = session.getPasswordAuthentication(url); if (pa == null) { InetAddress addr = InetAddress.getByName(host); pa = session.requestPasswordAuthentication(addr, port, url.getProtocol(), null, null); } if (pa != null) { username = pa.getUserName(); password = pa.getPassword(); } } if (username != null && password != null) { // Discover user ordering preferences for auth mechanisms String authPrefs = getProperty("auth.mechanisms"); Iterator i = null; if (authPrefs == null) { i = authenticationMechanisms.iterator(); } else { List authPrefList = Collections.list(new StringTokenizer(authPrefs, ",")); i = authPrefList.iterator(); } // Try each mechanism in the list in turn while (i.hasNext()) { String mechanism = (String) i.next(); if (authenticationMechanisms.contains(mechanism) && connection.authenticate(mechanism, username, password)) { return true; } } } else { if (session.getDebug()) { debugWarning("server requested AUTH, " + "but authentication principal " + "and credentials are not available"); } } return false; } else { if (session.getDebug()) { debugWarning("server requested AUTH, " + "but authentication is not enabled"); } } return !authRequired; } catch (IOException e) { throw new MessagingException(e.getMessage(), e); } } private TrustManager getTrustManager() throws MessagingException { String tmt = getProperty("trustmanager"); if (tmt != null) { try { Class t = Class.forName(tmt); return (TrustManager) t.newInstance(); } catch (Exception e) { throw new MessagingException(e.getMessage(), e); } } return null; } private void debugWarning(final String warning) { System.err.println(url.getProtocol() + ": WARNING: " + warning); } /** * Returns the greeting banner. */ public String getGreeting() throws MessagingException { if (!isConnected()) { throw new MessagingException("not connected"); } synchronized (connection) { return connection.getGreeting(); } } /** * Send the specified message to the server. */ public void sendMessage(Message message, Address[] addresses) throws MessagingException, SendFailedException { if (!isConnected()) { throw new MessagingException("not connected"); } if (!(message instanceof MimeMessage)) { throw new SendFailedException("only MimeMessages are supported"); } // Cast message MimeMessage mimeMessage = (MimeMessage) message; int len = addresses.length; List sent = new ArrayList(len); List unsent = new ArrayList(len); List invalid = new ArrayList(len); int deliveryStatus = TransportEvent.MESSAGE_NOT_DELIVERED; ParameterList params = null; // ESMTP parameters synchronized (connection) { try { // reverse-path String from0 = getProperty("from"); InternetAddress from = null; if (from0 != null) { InternetAddress[] from1 = InternetAddress.parse(from0); if (from1 != null && from1.length > 0) { from = from1[0]; } } if (from == null) { Address[] from2 = mimeMessage.getFrom(); if (from2 != null && from2.length > 0 && from2[0] instanceof InternetAddress) { from = (InternetAddress) from2[0]; } } if (from == null) { from = InternetAddress.getLocalAddress(session); } String reversePath = from.getAddress(); // DSN RET String dsnRet = getProperty("dsn.ret"); if (dsnRet != null && extensions != null && extensions.contains("DSN")) { String FULL = "FULL", HDRS = "HDRS"; String value = null; if (FULL.equalsIgnoreCase(dsnRet)) { value = FULL; } else if (HDRS.equalsIgnoreCase(dsnRet)) { value = HDRS; } if (value != null) { if (params == null) params = new ParameterList(); params.add(new Parameter("RET", value)); } } // MTRK String mtrk = getProperty("mtrk"); if ("true".equals(mtrk) && extensions != null && extensions.contains("MTRK")) { int mtrkTimeout = 0; String mt = getProperty("mtrk.timeout"); if (mt != null) mtrkTimeout = Integer.parseInt(mt); try { Random r = new Random(); byte[] a = new byte[256]; r.nextBytes(a); MessageDigest md = MessageDigest.getInstance("SHA-1"); md.update(a); byte[] b = md.digest(); byte[] certifier = BASE64.encode(b); if (params == null) params = new ParameterList(); String value = new String(certifier, "US-ASCII"); if (mtrkTimeout > 0) { value += ":" + mtrkTimeout; } params.add(new Parameter("MTRK", value)); String envid = mimeMessage.getMessageID(); if (envid != null) { int ai = envid.indexOf('@'); if (ai != -1) envid = envid.substring(0, ai); } else { envid = ""; } envid += Long.toHexString(System.currentTimeMillis()); envid += "@"; String lha = InetAddress.getLocalHost().getHostAddress(); if (envid.length() + lha.length() > 100) { b = lha.getBytes("UTF-8"); md.reset(); md.update(b); b = md.digest(); b = BASE64.encode(b); lha = new String(b, "US-ASCII"); } envid += lha; params.add(new Parameter("ENVID", envid)); } catch (NoSuchAlgorithmException e) { MessagingException e2 = new MessagingException(e.getMessage()); e2.initCause(e); throw e2; } catch (UnsupportedEncodingException e) { MessagingException e2 = new MessagingException(e.getMessage()); e2.initCause(e); throw e2; } } // MAIL FROM if (!connection.mailFrom(reversePath, params)) { throw new SendFailedException(connection.getLastResponse()); } params = null; // DSN NOTIFY String dsnNotify = getProperty("dsn.notify"); if (dsnNotify != null && extensions != null && extensions.contains("DSN")) { String NEVER = "NEVER", SUCCESS = "SUCCESS"; String FAILURE = "FAILURE", DELAY = "DELAY"; String value = null; if (NEVER.equalsIgnoreCase(dsnNotify)) { value = NEVER; } else { StringBuffer buf = new StringBuffer(); StringTokenizer st = new StringTokenizer(dsnNotify, " ,"); while (st.hasMoreTokens()) { String token = st.nextToken(); if (SUCCESS.equalsIgnoreCase(token)) { if (buf.length() > 0) { buf.append(','); } buf.append(SUCCESS); } else if (FAILURE.equalsIgnoreCase(token)) { if (buf.length() > 0) { buf.append(','); } buf.append(FAILURE); } else if (DELAY.equalsIgnoreCase(token)) { if (buf.length() > 0) { buf.append(','); } buf.append(DELAY); } } if (buf.length() > 0) { value = buf.toString(); } } if (value != null) { params = new ParameterList(); params.add(new Parameter("NOTIFY", value)); } } // RCPT TO for (int i = 0; i < addresses.length; i++) { Address address = addresses[i]; if (address instanceof InternetAddress) { String forwardPath = ((InternetAddress) address).getAddress(); if (connection.rcptTo(forwardPath, params)) { sent.add(address); } else { invalid.add(address); } } else { invalid.add(address); } } } catch (IOException e) { try { // Reset connection connection.rset(); } catch (IOException e2) { // Possible transport-level problem } throw new SendFailedException(e.getMessage()); } if (sent.size() > 0) { try { // DATA OutputStream dataStream = connection.data(); if (dataStream == null) { String msg = connection.getLastResponse(); throw new MessagingException(msg); } mimeMessage.writeTo(dataStream); dataStream.flush(); if (!connection.finishData()) { unsent.addAll(sent); sent.clear(); deliveryStatus = TransportEvent.MESSAGE_NOT_DELIVERED; } else { deliveryStatus = invalid.isEmpty() ? TransportEvent.MESSAGE_DELIVERED : TransportEvent.MESSAGE_PARTIALLY_DELIVERED; } } catch (IOException e) { try { // Attempt to ensure that connection is in control mode if (connection.finishData()) { connection.rset(); } } catch (IOException e2) { // Possible transport-level problem } throw new SendFailedException(e.getMessage()); } } } // Notify transport listeners Address[] a_sent = new Address[sent.size()]; sent.toArray(a_sent); Address[] a_unsent = new Address[unsent.size()]; unsent.toArray(a_unsent); Address[] a_invalid = new Address[invalid.size()]; invalid.toArray(a_invalid); notifyTransportListeners(deliveryStatus, a_sent, a_unsent, a_invalid, mimeMessage); } /** * Close this transport. */ public void close() throws MessagingException { if (isConnected()) { synchronized (connection) { try { connection.quit(); } catch (IOException e) { throw new MessagingException(e.getMessage(), e); } finally { connection = null; } } } super.close(); } // -- Utility methods -- private int getIntProperty(String key) { String value = getProperty(key); if (value != null) { try { return Integer.parseInt(value); } catch (Exception e) { } } return -1; } private boolean propertyIsFalse(String key) { return "false".equals(getProperty(key)); } private boolean propertyIsTrue(String key) { return "true".equals(getProperty(key)); } /* * Returns the provider-specific or general mail property corresponding to * the specified key. */ private String getProperty(String key) { String value = session.getProperty("mail." + url.getProtocol() + "." + key); if (value == null) { value = session.getProperty("mail." + key); } return value; } } mail-1.1.2/source/gnu/mail/treeutil/0000775000076500007650000000000010614714024016664 5ustar dogdog00000000000000mail-1.1.2/source/gnu/mail/treeutil/StatusEvent.java0000664000076500007650000000633510614714012022020 0ustar dogdog00000000000000/* * StatusEvent.java * Copyright(C) 1999 Chris Burdess * * This file is part of GNU JavaMail, a library. * * GNU JavaMail is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or *(at your option) any later version. * * GNU JavaMail 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * As a special exception, if you link this library with other files to * produce an executable, this library does not by itself cause the * resulting executable to be covered by the GNU General Public License. * This exception does not however invalidate any other reasons why the * executable file might be covered by the GNU General Public License. */ package gnu.mail.treeutil; import java.util.*; /** * A status message. * * @author Chris Burdess * @version 1.0.2 */ public class StatusEvent extends EventObject { public static final int OPERATION_START = 0; public static final int OPERATION_UPDATE = 1; public static final int OPERATION_END = 2; public static final int UNKNOWN = -1; protected int type; protected String operation; protected int minimum = UNKNOWN; protected int maximum = UNKNOWN; protected int value = UNKNOWN; /** * Creates a new status event with the specified type and operation. */ public StatusEvent(Object source, int type, String operation) { super(source); switch (type) { case OPERATION_START: case OPERATION_UPDATE: case OPERATION_END: this.type = type; break; default: throw new IllegalArgumentException("Illegal event type: "+type); } this.operation = operation; } /** * Creates a new status event representing an update of the specified operation. */ public StatusEvent(Object source, int type, String operation, int minimum, int maximum, int value) { super(source); switch (type) { case OPERATION_START: case OPERATION_UPDATE: case OPERATION_END: this.type = type; break; default: throw new IllegalArgumentException("Illegal event type: "+type); } this.operation = operation; this.minimum = minimum; this.maximum = maximum; this.value = value; } /** * Returns the type of event(OPERATION_START, OPERATION_UPDATE, or OPERATION_END). */ public int getType() { return type; } /** * Returns a string describing the operation being performed. */ public String getOperation() { return operation; } /** * Returns the start point of the operation. */ public int getMinimum() { return minimum; } /** * Returns the end point of the operation. */ public int getMaximum() { return maximum; } /** * Returns the current point in the operation. */ public int getValue() { return value; } } mail-1.1.2/source/gnu/mail/treeutil/StatusListener.java0000664000076500007650000000327710614714012022526 0ustar dogdog00000000000000/* * StatusListener.java * Copyright(C) 1999 Chris Burdess * * This file is part of GNU JavaMail, a library. * * GNU JavaMail is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or *(at your option) any later version. * * GNU JavaMail 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * As a special exception, if you link this library with other files to * produce an executable, this library does not by itself cause the * resulting executable to be covered by the GNU General Public License. * This exception does not however invalidate any other reasons why the * executable file might be covered by the GNU General Public License. */ package gnu.mail.treeutil; import java.util.*; /** * A callback interface for passing status messages. * * @author Chris Burdess * @version 1.0.2 */ public interface StatusListener extends EventListener { /** * An operation started. */ void statusOperationStarted(StatusEvent event); /** * A progress update occurred. */ void statusProgressUpdate(StatusEvent event); /** * An operation completed. */ void statusOperationEnded(StatusEvent event); } mail-1.1.2/source/gnu/mail/treeutil/StatusSource.java0000664000076500007650000000323010614714012022166 0ustar dogdog00000000000000/* * StatusSource.java * Copyright(C) 1999 Chris Burdess * * This file is part of GNU JavaMail, a library. * * GNU JavaMail is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or *(at your option) any later version. * * GNU JavaMail 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * As a special exception, if you link this library with other files to * produce an executable, this library does not by itself cause the * resulting executable to be covered by the GNU General Public License. * This exception does not however invalidate any other reasons why the * executable file might be covered by the GNU General Public License. */ package gnu.mail.treeutil; /** * An interface for defining that an object can pass status messages. * * @author Chris Burdess * @version 1.0.2 */ public interface StatusSource { /** * Adds a status listener to this source. * @param l the listener */ void addStatusListener(StatusListener l); /** * Removes a status listener from this source. * @param l the listener */ void removeStatusListener(StatusListener l); } mail-1.1.2/source/gnu/mail/util/0000775000076500007650000000000010614714024016004 5ustar dogdog00000000000000mail-1.1.2/source/gnu/mail/util/Base64InputStream.java0000664000076500007650000001111510614714012022063 0ustar dogdog00000000000000/* * Base64InputStream.java * Copyright(C) 2002 The Free Software Foundation * * This file is part of GNU JavaMail, a library. * * GNU JavaMail is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or *(at your option) any later version. * * GNU JavaMail 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * As a special exception, if you link this library with other files to * produce an executable, this library does not by itself cause the * resulting executable to be covered by the GNU General Public License. * This exception does not however invalidate any other reasons why the * executable file might be covered by the GNU General Public License. */ package gnu.mail.util; import java.io.*; /** * A Base64 content transfer encoding filter stream. *

* From RFC 2045, section 6.8: *

* The Base64 Content-Transfer-Encoding is designed to represent * arbitrary sequences of octets in a form that need not be humanly * readable. The encoding and decoding algorithms are simple, but the * encoded data are consistently only about 33 percent larger than the * unencoded data. * * @author Chris Burdess */ public class Base64InputStream extends FilterInputStream { private byte[] buffer; private int buflen; private int index; private byte[] decodeBuf; private static final char[] src = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/' }; private static final byte[] dst; private static final int LF = 10, CR = 13, EQ = 61; static { dst = new byte[256]; for (int i = 0; i<255; i++) dst[i] = -1; for (int i = 0; i=buflen) { decode(); if (buflen==0) return -1; index = 0; } return buffer[index++] & 0xff; } /** * Reads up to len bytes of data from the input stream into an array of * bytes. */ public int read(byte[] b, int off, int len) throws IOException { try { int l = 0; for (; l>>4 & 0x3); if (decodeBuf[2]!=EQ) { b0 = b2; b2 = dst[decodeBuf[2] & 0xff]; buffer[buflen++] = (byte)(b0<<4 & 0xf0 | b2>>>2 & 0xf); if (decodeBuf[3]!=EQ) { b0 = b2; b2 = dst[decodeBuf[3] & 0xff]; buffer[buflen++] = (byte)(b0<<6 & 0xc0 | b2 & 0x3f); } } } } mail-1.1.2/source/gnu/mail/util/Base64OutputStream.java0000664000076500007650000001137110614714012022270 0ustar dogdog00000000000000/* * Base64OutputStream.java * Copyright(C) 2002 The Free Software Foundation * * This file is part of GNU JavaMail, a library. * * GNU JavaMail is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or *(at your option) any later version. * * GNU JavaMail 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * As a special exception, if you link this library with other files to * produce an executable, this library does not by itself cause the * resulting executable to be covered by the GNU General Public License. * This exception does not however invalidate any other reasons why the * executable file might be covered by the GNU General Public License. */ package gnu.mail.util; import java.io.*; /** * A Base64 content transfer encoding filter stream. *

* From RFC 2045, section 6.8: *

* The Base64 Content-Transfer-Encoding is designed to represent * arbitrary sequences of octets in a form that need not be humanly * readable. The encoding and decoding algorithms are simple, but the * encoded data are consistently only about 33 percent larger than the * unencoded data. * * @author Chris Burdess */ public class Base64OutputStream extends FilterOutputStream { private byte buffer[]; private int buflen; private int count; private int lineLength; private static final char src[] = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/' }; private static final int LF = 10, CR = 13, EQ = 61; /** * Default constructor. * This constructs a Base64OutputStream with a line length of 76. */ public Base64OutputStream(OutputStream out) { this(out, 76); } /** * Constructor. * @param out the underlying output stream to encode * @param lineLength the line length */ public Base64OutputStream(OutputStream out, int lineLength) { super(out); buffer = new byte[3]; this.lineLength = lineLength; } /** * Writes the specified byte to this output stream. */ public void write(int c) throws IOException { buffer[buflen++] = (byte)c; if (buflen==3) { encode(); buflen = 0; } } /** * Writes b.length bytes from the specified byte array * to this output stream. */ public void write(byte b[]) throws IOException { write(b, 0, b.length); } /** * Writes len bytes from the specified byte array * starting at offset off to this output stream. */ public void write(byte b[], int off, int len) throws IOException { for (int i=0; i0) { encode(); buflen = 0; } out.flush(); } /** * Closes this output stream and releases any system resources * associated with this stream. */ public void close() throws IOException { flush(); out.close(); } private void encode() throws IOException { if ((count+4)>lineLength) { out.write(CR); out.write(LF); count = 0; } if (buflen==1) { byte b = buffer[0]; int i = 0; boolean flag = false; out.write(src[b>>>2 & 0x3f]); out.write(src[(b<<4 & 0x30) +(i>>>4 & 0xf)]); out.write(EQ); out.write(EQ); } else if (buflen==2) { byte b1 = buffer[0], b2 = buffer[1]; int i = 0; out.write(src[b1>>>2 & 0x3f]); out.write(src[(b1<<4 & 0x30) +(b2>>>4 & 0xf)]); out.write(src[(b2<<2 & 0x3c) +(i>>>6 & 0x3)]); out.write(EQ); } else { byte b1 = buffer[0], b2 = buffer[1], b3 = buffer[2]; out.write(src[b1>>>2 & 0x3f]); out.write(src[(b1<<4 & 0x30) +(b2>>>4 & 0xf)]); out.write(src[(b2<<2 & 0x3c) +(b3>>>6 & 0x3)]); out.write(src[b3 & 0x3f]); } count += 4; } } mail-1.1.2/source/gnu/mail/util/BOutputStream.java0000664000076500007650000000314310614714012021423 0ustar dogdog00000000000000/* * BOutputStream.java * Copyright(C) 2002 The Free Software Foundation * * This file is part of GNU JavaMail, a library. * * GNU JavaMail is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or *(at your option) any later version. * * GNU JavaMail 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * As a special exception, if you link this library with other files to * produce an executable, this library does not by itself cause the * resulting executable to be covered by the GNU General Public License. * This exception does not however invalidate any other reasons why the * executable file might be covered by the GNU General Public License. */ package gnu.mail.util; import java.io.OutputStream; /** * Provides RFC 2047 "B" transfer encoding. * See section 4.1. * * @author Chris Burdess */ public class BOutputStream extends Base64OutputStream { public BOutputStream(OutputStream out) { super(out, 0x7fffffff); } public static int encodedLength(byte[] bytes) { return ((bytes.length+2)/3)*4; } } mail-1.1.2/source/gnu/mail/util/MailboxURLConnection.java0000664000076500007650000001613210614714012022645 0ustar dogdog00000000000000/* * $Id: MailboxURLConnection.java,v 1.3 2005/08/25 12:31:15 dog Exp $ * Copyright(C) 2004 The Free Software Foundation * * This file is part of GNU JavaMail, a library. * * GNU JavaMail is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or *(at your option) any later version. * * GNU JavaMail 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * As a special exception, if you link this library with other files to * produce an executable, this library does not by itself cause the * resulting executable to be covered by the GNU General Public License. * This exception does not however invalidate any other reasons why the * executable file might be covered by the GNU General Public License. */ package gnu.mail.util; import java.io.FileNotFoundException; import java.io.InputStream; import java.io.IOException; import java.io.OutputStream; import java.io.PipedInputStream; import java.io.PipedOutputStream; import java.net.URL; import java.net.URLConnection; import java.util.ArrayList; import java.util.Collections; import java.util.Enumeration; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.mail.Folder; import javax.mail.Header; import javax.mail.Message; import javax.mail.MessagingException; import javax.mail.Session; import javax.mail.Store; import javax.mail.URLName; import javax.mail.internet.MimeMessage; import javax.mail.search.HeaderTerm; import javax.mail.search.SearchTerm; /** * A URLConnection that can be used to access mailboxes using the JavaMail * API. * * @author Chris Burdess * @version $Revision: 1.3 $ $Date: 2005/08/25 12:31:15 $ */ public class MailboxURLConnection extends URLConnection { /** * The mail store. */ protected Store store; /** * The mail folder. */ protected Folder folder; /** * The mail message, if the URL represents a message. */ protected Message message; /** * The headers to return. */ protected Map headers; private List headerKeys; /** * Constructs a new mailbox URL connection using the specified URL. * @param url the URL representing the mailbox to connect to */ public MailboxURLConnection(URL url) { super(url); } /** * Connects to the mailbox. */ public synchronized void connect() throws IOException { if (connected) return; try { Session session = Session.getDefaultInstance(System.getProperties()); URLName urlName = asURLName(url); store = session.getStore(urlName); folder = store.getDefaultFolder(); // Resolve to a folder String path = url.getPath(); if ("/".equals(path)) folder = folder.getFolder("INBOX"); else { if (path.charAt(0) == '/') path = path.substring(1); int si = path.indexOf('/'); while (si != -1 && path.length() > 0) { String comp = path.substring(0, si); path = path.substring(si + 1); folder = folder.getFolder(comp); } } if (!folder.exists()) throw new FileNotFoundException(path); folder.open(Folder.READ_ONLY); // Find message if requested String ref = url.getRef(); if (ref != null) { SearchTerm term = new HeaderTerm("Message-Id", ref); Message[] messages = folder.search(term); if (messages.length > 0) message = messages[0]; else throw new FileNotFoundException(ref); headers = new HashMap(); headerKeys = new ArrayList(); if (message instanceof MimeMessage) { MimeMessage mm = (MimeMessage)message; Enumeration e = mm.getAllHeaderLines(); while (e.hasMoreElements()) { Header header = (Header)e.nextElement(); headerKeys.add(header.getName()); headers.put(header.getName(), header.getValue()); } } else { } } else { headers = Collections.EMPTY_MAP; headerKeys = Collections.EMPTY_LIST; } } catch (MessagingException e) { Exception e2 = e.getNextException(); if (e2 instanceof IOException) throw (IOException)e2; throw new IOException(e.getMessage()); } connected = true; } public String getHeaderField(int index) { return getHeaderField(getHeaderFieldKey(index)); } public String getHeaderFieldKey(int index) { return (String)headerKeys.get(index); } public String getHeaderField(String name) { return (String)headers.get(name); } public Map getHeaderFields() { return Collections.unmodifiableMap(headers); } public Object getContent() throws IOException { if (message != null) return message; else return folder; } public InputStream getInputStream() throws IOException { PipedOutputStream pos = new PipedOutputStream(); Runnable writer; if (message == null) writer = new FolderWriter(folder, pos); else writer = new MessageWriter(message, pos); Thread thread = new Thread(writer, "MailboxURLConnection.getInputStream"); thread.start(); return new PipedInputStream(pos); } /** * Converts a URL into a URLName. */ protected static URLName asURLName(URL url) { String protocol = url.getProtocol(); String host = url.getHost(); int port = url.getPort(); String userInfo = url.getUserInfo(); String username = null; String password = null; String path = url.getPath(); if (userInfo != null) { int ci = userInfo.indexOf(':'); username = (ci != -1) ? userInfo.substring(0, ci) : userInfo; password = (ci != -1) ? userInfo.substring(ci + 1) : null; } return new URLName(protocol, host, port, path, username, password); } static class MessageWriter implements Runnable { Message message; OutputStream out; MessageWriter(Message message, OutputStream out) { this.message = message; this.out = out; } public void run() { try { if (message instanceof MimeMessage) ((MimeMessage)message).writeTo(out); else { // TODO } } catch (Exception e) { // ? } } } static class FolderWriter implements Runnable { Folder folder; OutputStream out; FolderWriter(Folder folder, OutputStream out) { this.folder = folder; this.out = out; } public void run() { // TODO } } } mail-1.1.2/source/gnu/mail/util/QInputStream.java0000664000076500007650000000665210614714012021251 0ustar dogdog00000000000000/* * QInputStream.java * Copyright(C) 2002 The Free Software Foundation * * This file is part of GNU JavaMail, a library. * * GNU JavaMail is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or *(at your option) any later version. * * GNU JavaMail 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * As a special exception, if you link this library with other files to * produce an executable, this library does not by itself cause the * resulting executable to be covered by the GNU General Public License. * This exception does not however invalidate any other reasons why the * executable file might be covered by the GNU General Public License. */ package gnu.mail.util; import java.io.*; /** * Provides RFC 2047 "B" transfer encoding. * See section 4.2: *

* The "Q" encoding is similar to the "Quoted-Printable" content- * transfer-encoding defined in RFC 2045. It is designed to allow text * containing mostly ASCII characters to be decipherable on an ASCII * terminal without decoding. *

    *
  1. Any 8-bit value may be represented by a "=" followed by two * hexadecimal digits. For example, if the character set in use * were ISO-8859-1, the "=" character would thus be encoded as * "=3D", and a SPACE by "=20". (Upper case should be used for * hexadecimal digits "A" through "F".) *
  2. The 8-bit hexadecimal value 20(e.g., ISO-8859-1 SPACE) may be * represented as "_"(underscore, ASCII 95.). (This character may * not pass through some internetwork mail gateways, but its use * will greatly enhance readability of "Q" encoded data with mail * readers that do not support this encoding.) Note that the "_" * always represents hexadecimal 20, even if the SPACE character * occupies a different code position in the character set in use. *
  3. 8-bit values which correspond to printable ASCII characters other * than "=", "?", and "_"(underscore), MAY be represented as those * characters. (But see section 5 for restrictions.) In * particular, SPACE and TAB MUST NOT be represented as themselves * within encoded words. * * @author Chris Burdess */ public class QInputStream extends QPInputStream { private static final int SPACE = 32; private static final int EQ = 61; private static final int UNDERSCORE = 95; /** * Constructor. * @param in the underlying input stream. */ public QInputStream(InputStream in) { super(in); } /** * Read a character. */ public int read() throws IOException { int c = in.read(); if (c==UNDERSCORE) return SPACE; if (c==EQ) { buf[0] = (byte)in.read(); buf[1] = (byte)in.read(); try { return Integer.parseInt(new String(buf, 0, 2), 16); } catch (NumberFormatException e) { throw new IOException("Quoted-Printable encoding error: "+ e.getMessage()); } } return c; } } mail-1.1.2/source/gnu/mail/util/QOutputStream.java0000664000076500007650000001232610614714012021445 0ustar dogdog00000000000000/* * QOutputStream.java * Copyright(C) 2002 The Free Software Foundation * * This file is part of GNU JavaMail, a library. * * GNU JavaMail is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or *(at your option) any later version. * * GNU JavaMail 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * As a special exception, if you link this library with other files to * produce an executable, this library does not by itself cause the * resulting executable to be covered by the GNU General Public License. * This exception does not however invalidate any other reasons why the * executable file might be covered by the GNU General Public License. */ /* * QOutputStream.java * Copyright(C) 2002 The Free Software Foundation * * This file is part of GNU JavaMail, a library. * * GNU JavaMail is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or *(at your option) any later version. * * GNU JavaMail 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * As a special exception, if you link this library with other files to * produce an executable, this library does not by itself cause the * resulting executable to be covered by the GNU General Public License. * This exception does not however invalidate any other reasons why the * executable file might be covered by the GNU General Public License. */ package gnu.mail.util; import java.io.IOException; import java.io.OutputStream; /** * Provides RFC 2047 "B" transfer decoding. * See section 4.2: *

    * The "Q" encoding is similar to the "Quoted-Printable" content- * transfer-encoding defined in RFC 2045. It is designed to allow text * containing mostly ASCII characters to be decipherable on an ASCII * terminal without decoding. *

      *
    1. Any 8-bit value may be represented by a "=" followed by two * hexadecimal digits. For example, if the character set in use * were ISO-8859-1, the "=" character would thus be encoded as * "=3D", and a SPACE by "=20". (Upper case should be used for * hexadecimal digits "A" through "F".) *
    2. The 8-bit hexadecimal value 20(e.g., ISO-8859-1 SPACE) may be * represented as "_"(underscore, ASCII 95.). (This character may * not pass through some internetwork mail gateways, but its use * will greatly enhance readability of "Q" encoded data with mail * readers that do not support this encoding.) Note that the "_" * always represents hexadecimal 20, even if the SPACE character * occupies a different code position in the character set in use. *
    3. 8-bit values which correspond to printable ASCII characters other * than "=", "?", and "_"(underscore), MAY be represented as those * characters. (But see section 5 for restrictions.) In * particular, SPACE and TAB MUST NOT be represented as themselves * within encoded words. * * @author Chris Burdess */ public class QOutputStream extends QPOutputStream { private static final int SPACE = 32; private static final int UNDERSCORE = 95; private static String TEXT_SPECIALS = "=_?"; private static String WORD_SPECIALS = "=_?\"#$%&'(),.:;<>@[\\]^`{|}~"; private String specials; /** * Constructor. * The word parameter is used to indicate whether the bytes * passed to this stream are considered to be RFC 822 "word" tokens or * "text" tokens. * @param out the underlying output stream * @param word word mode if true, text mode otherwise */ public QOutputStream(OutputStream out, boolean word) { super(out, 0x7fffffff); specials = word ? WORD_SPECIALS : TEXT_SPECIALS; } /** * Write a character to the stream. */ public void write(int c) throws IOException { c &= 0xff; if (c==SPACE) output(UNDERSCORE, false); else { if (c<32 || c>=127 || specials.indexOf(c)>=0) output(c, true); else output(c, false); } } public static int encodedLength(byte[] bytes, boolean word) { int len = 0; String specials = word ? WORD_SPECIALS : TEXT_SPECIALS; for(int i = 0; i=127 || specials.indexOf(c)>=0) len += 3; else len++; } return len; } } mail-1.1.2/source/gnu/mail/util/QPInputStream.java0000664000076500007650000000713210614714012021363 0ustar dogdog00000000000000/* * QPInputStream.java * Copyright(C) 2002 The Free Software Foundation * * This file is part of GNU JavaMail, a library. * * GNU JavaMail is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or *(at your option) any later version. * * GNU JavaMail 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * As a special exception, if you link this library with other files to * produce an executable, this library does not by itself cause the * resulting executable to be covered by the GNU General Public License. * This exception does not however invalidate any other reasons why the * executable file might be covered by the GNU General Public License. */ package gnu.mail.util; import java.io.*; /** * A Quoted-Printable decoder stream. * * @author Chris Burdess */ public class QPInputStream extends FilterInputStream { protected byte[] buf; /** * The number of times read() will return a space. */ protected int spaceCount; private static final int LF = 10; private static final int CR = 13; private static final int SPACE = 32; private static final int EQ = 61; /** * Constructor. * @param in the underlying input stream. */ public QPInputStream(InputStream in) { super(new PushbackInputStream(in, 2)); buf = new byte[2]; } /** * Read a character from the stream. */ public int read() throws IOException { if (spaceCount>0) { spaceCount--; return SPACE; } int c = in.read(); if (c==SPACE) { while ((c = in.read())==SPACE) spaceCount++; if (c==LF || c==CR || c==-1) spaceCount = 0; else { ((PushbackInputStream)in).unread(c); c = SPACE; } return c; } if (c==EQ) { int c2 = super.in.read(); if (c2==LF) return read(); if (c2==CR) { int peek = in.read(); if (peek!=LF) ((PushbackInputStream)in).unread(peek); return read(); } if (c2==-1) return c2; buf[0] = (byte)c2; buf[1] = (byte)in.read(); try { return Integer.parseInt(new String(buf, 0, 2), 16); } catch (NumberFormatException e) { ((PushbackInputStream)in).unread(buf); } return c; } else return c; } /** * Reads from the underlying stream into the specified byte array. */ public int read(byte[] bytes, int off, int len) throws IOException { int pos = 0; try { while (posChris Burdess * @version 1.0 * @see java.io.FilterOutputStream **/ public class QPOutputStream extends FilterOutputStream { /** * Char array used in decimal to hexidecimal conversion. */ private static final char[] hex = {'0','1','2','3','4','5','6', '7','8','9','A','B','C','D', 'E','F'}; /** * Current byte position in output. */ private int count; /** * Number of bytes per line. */ private int bytesPerLine; /** * Flag when a space is seen. */ private boolean gotSpace; /** * Flag when a CR is seen. */ private boolean gotCR; //------------------------------------------------------------- // Initialization --------------------------------------------- //------------------------------------------------------------- /** * Create a new Quoted Printable Encoding stream. * @param stream Output stream * @param length Number of bytes per line */ public QPOutputStream(OutputStream stream, int length) { super(stream); this.bytesPerLine = length; this.count = 0; this.gotSpace = false; this.gotCR = false; } // QPEncoderStream() /** * Create a new Quoted Printable Encoding stream with * the default 76 bytes per line. * @param stream Output stream */ public QPOutputStream(OutputStream stream) { this(stream, 76); } // QPEWncoderStream() //------------------------------------------------------------- // Methods ---------------------------------------------------- //------------------------------------------------------------- /** * Flush encoding buffer. * @exception IOException IO Exception occurred */ public void flush() throws IOException { if (gotSpace) { output(0x20, false); gotSpace = false; } out.flush(); } // flush() /** * Write bytes to encoding stream. * @param bytes Byte array to read values from * @param offset Offset to start reading bytes from * @param length Number of bytes to read * @exception IOException IO Exception occurred */ public void write(byte[] bytes, int offset, int length) throws IOException { // Variables int index; // Process Each Byte for (index = offset; index < length; index++) { write(bytes[index]); } // for } // write() /** * Write bytes to stream. * @param bytes Byte array to write to stream * @exception IOException IO Exception occurred */ public void write(byte[] bytes) throws IOException { write(bytes, 0, bytes.length); } // write() /** * Write a byte to the stream. * @param b Byte to write to the stream * @exception IOException IO Exception occurred */ public void write(int b) throws IOException { b &= 0xff; if (gotSpace) { if (b=='\n' || b=='\r') output(' ', true); else output(' ', false); gotSpace = false; } if (b==' ') gotSpace = true; else if (b=='\r') { gotCR = true; outputCRLF(); } else if (b=='\n') { if (gotCR) gotCR = false; else outputCRLF(); } else { if (b<' ' || b>=127 || b=='=') output(b, true); else output(b, false); } } // write() /** * Close stream. * @exception IOException IO Exception occurred */ public void close() throws IOException { out.close(); } // close() /** * ???? * @param b ?? * @param value ?? * @exception IOException IO Exception occurred */ protected void output(int b, boolean value) throws IOException { if (value) { if ((count += 3) > bytesPerLine) { out.write('='); out.write('\r'); out.write('\n'); count = 3; } out.write('='); out.write(hex[b >> 4]); out.write(hex[b & 0xf]); } else { if (++count > bytesPerLine) { out.write('='); out.write('\r'); out.write('\n'); count = 1; } out.write(b); } } // output() /** * Write CRLF byte series to stream. * @exception IOException IO Exception occurred */ private void outputCRLF() throws IOException { out.write('\r'); out.write('\n'); count = 0; } // outputCRLF() } // QPEncoderStream mail-1.1.2/source/gnu/mail/util/RFC2822OutputStream.java0000664000076500007650000000646210614714012022201 0ustar dogdog00000000000000/* * RFC2822OutputStream.java * Copyright(C) 2002 The Free Software Foundation * * This file is part of GNU JavaMail, a library. * * GNU JavaMail is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or *(at your option) any later version. * * GNU JavaMail 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * As a special exception, if you link this library with other files to * produce an executable, this library does not by itself cause the * resulting executable to be covered by the GNU General Public License. * This exception does not however invalidate any other reasons why the * executable file might be covered by the GNU General Public License. */ package gnu.mail.util; import java.io.FilterOutputStream; import java.io.IOException; import java.io.OutputStream; /** * An output stream that ensures that lines of characters in the body are * limited to 998 octets(excluding CRLF). * * This is required by RFC 2822, section 2.3. * * @author Chris Burdess */ public class RFC2822OutputStream extends FilterOutputStream { /** * The CR octet. */ public static final int CR = 13; /** * The LF octet. */ public static final int LF = 10; /** * The number of bytes in the line. */ protected int count; /** * Constructs an RFC2822 output stream * connected to the specified output stream. * @param out the underlying OutputStream */ public RFC2822OutputStream(OutputStream out) { super(out); count = 0; } /** * Writes a character to the underlying stream. * @exception IOException if an I/O error occurred */ public void write(int ch) throws IOException { if (ch == CR || ch == LF) { out.write(ch); count = 0; } else { if (count > 998) { out.write(LF); count = 0; } out.write(ch); count++; } } /** * Writes a byte array to the underlying stream. * @exception IOException if an I/O error occurred */ public void write(byte[] b) throws IOException { write(b, 0, b.length); } /** * Writes a portion of a byte array to the underlying stream. * @exception IOException if an I/O error occurred */ public void write(byte[] b, int off, int len) throws IOException { int d = off; len += off; int i; for (i = off; i < len; i++) { count++; if (b[i] == CR || b[i] == LF) { out.write(b, d, i + 1 - d); d = i + 1; count = 0; } else { if (count > 998) { out.write(b, d, count); out.write(LF); d = i + 1; count = 0; } } } int leftToWrite = i - d; if (leftToWrite > 0) out.write(b, d, leftToWrite); } } mail-1.1.2/source/gnu/mail/util/UUInputStream.java0000664000076500007650000001107610614714012021376 0ustar dogdog00000000000000/* * UUInputStream.java * Copyright(C) 2002 The Free Software Foundation * * This file is part of GNU JavaMail, a library. * * GNU JavaMail is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or *(at your option) any later version. * * GNU JavaMail 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * As a special exception, if you link this library with other files to * produce an executable, this library does not by itself cause the * resulting executable to be covered by the GNU General Public License. * This exception does not however invalidate any other reasons why the * executable file might be covered by the GNU General Public License. */ package gnu.mail.util; import java.io.ByteArrayOutputStream; import java.io.EOFException; import java.io.FilterInputStream; import java.io.InputStream; import java.io.IOException; import gnu.inet.util.LineInputStream; /** * UU decoder. * * @author Chris Burdess */ public class UUInputStream extends FilterInputStream { /** * True if we are in the code body, between the begin and end lines. */ boolean body; /** * Decoded bytes that have not yet been read. */ ByteArrayOutputStream pending; public UUInputStream(InputStream in) { super(new LineInputStream(in)); pending = new ByteArrayOutputStream(); } public int read() throws IOException { byte[] buf = new byte[1]; int len; do { len = read(buf, 0, 1); } while (len == 0); return (len == -1) ? len : (int) buf[0]; } public int read(byte[] buf) throws IOException { return read(buf, 0, buf.length); } public int read(byte[] buf, int off, int len) throws IOException { // If there are pending decoded bytes, return these int plen = pending.size(); if (plen == 0) { // Populate pending buffer LineInputStream lin = (LineInputStream) in; String line; if (!body) { // Read begin line line = lin.readLine(); if (line == null || !line.startsWith("begin ")) { throw new IOException("No `begin' line"); } // mode and filename are currently ignored body = true; } do { line = lin.readLine(); } while ("".equals(line)); if (line == null) { throw new EOFException(); } byte[] src = line.getBytes("US-ASCII"); int i = 0; int n = decode(src[i]); if (n <= 0) { body = false; // Read end line line = lin.readLine(); if (line == null || !line.equals("end")) { throw new IOException("No `end' line"); } return -1; } for (++i; n > 0; i += 4, n -= 3) { int c; if (n >= 1) { c = decode(src[i]) << 2 | decode(src[i + 1]) >> 4; pending.write(c); } if (n >= 2) { c = decode(src[i + 1]) << 4 | decode(src[i + 2]) >> 2; pending.write(c); } if (n >= 3) { c = decode(src[i + 2]) << 6 | decode(src[i + 3]); pending.write(c); } } } // Copy pending to buf byte[] pbuf = pending.toByteArray(); plen = pbuf.length; pending.reset(); if (plen > len) { System.arraycopy(pbuf, 0, buf, 0, len); byte[] tmp = new byte[plen - len]; System.arraycopy(pbuf, len, tmp, 0, tmp.length); pending.write(tmp); return len; } else { System.arraycopy(pbuf, 0, buf, 0, plen); return plen; } } /** * Decode a single character. */ static int decode(byte c) { int c2 = (int) c; if (c2 < 0) { c2 += 256; } return (c2 - 32) & 077; } } mail-1.1.2/source/gnu/mail/util/UUOutputStream.java0000664000076500007650000001265210614714012021600 0ustar dogdog00000000000000/* * UUOutputStream.java * Copyright(C) 2002 The Free Software Foundation * * This file is part of GNU JavaMail, a library. * * GNU JavaMail is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or *(at your option) any later version. * * GNU JavaMail 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * As a special exception, if you link this library with other files to * produce an executable, this library does not by itself cause the * resulting executable to be covered by the GNU General Public License. * This exception does not however invalidate any other reasons why the * executable file might be covered by the GNU General Public License. */ package gnu.mail.util; import java.io.FilterOutputStream; import java.io.IOException; import java.io.OutputStream; /** * UU encoding output stream. * * @author Chris Burdess */ public class UUOutputStream extends FilterOutputStream { static final byte[] TABLE = { '`', '!', '"', '#', '$', '%', '&', '\'', '(', ')', '*', '+', ',', '-', '.', '/', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', ':', ';', '<', '=', '>', '?', '@', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '[', '\\', ']', '^', '_' }; static final int MAX_LINE_LENGTH = 45; byte[] line; String filename; int mode; boolean beginLineDone; /** * Default constructor. * This writes a UU encoded file with the filename "file". */ public UUOutputStream(OutputStream out) { this(out, null, 0600); } /** * Constructor with filename. * @param filename the filename to encode into the UU file. */ public UUOutputStream(OutputStream out, String filename) { this(out, filename, 0600); } /** * Constructor with filename and mode. * @param filename the filename to encode into the UU file. * @param mode the file mode to encode */ public UUOutputStream(OutputStream out, String filename, int mode) { super(out); if (filename == null) { filename = "file"; } this.filename = filename; this.mode = mode; line = new byte[0]; beginLineDone = false; } void writeBeginLine() throws IOException { // Output begin line String beginLine = "begin " + Integer.toString(mode, 8) + " " + filename + "\n"; out.write(beginLine.getBytes("US-ASCII")); beginLineDone = true; } public void close() throws IOException { flush(line, 0, line.length); out.write(encode('\0')); out.write('\n'); // Output end line out.write(new byte[] {'e', 'n', 'd', '\n'}); out.close(); } public void write(int c) throws IOException { byte[] buf = new byte[1]; buf[0] = (byte) c; write(buf, 0, 1); } public void write(byte[] buf) throws IOException { write(buf, 0, buf.length); } public void write(byte[] buf, int off, int len) throws IOException { // Append bytes to line byte[] tmp = new byte[line.length + (len - off)]; System.arraycopy(line, 0, tmp, 0, line.length); System.arraycopy(buf, off, tmp, line.length, len - off); line = tmp; // Flush line in chunks of MAX_LINE_LENGTH int loff = 0; for (; (line.length - loff) > MAX_LINE_LENGTH; loff += MAX_LINE_LENGTH) { flush(line, loff, MAX_LINE_LENGTH); } // Truncate line tmp = new byte[line.length - loff]; System.arraycopy(line, loff, tmp, 0, tmp.length); line = tmp; } void flush(byte[] buf, int off, int len) throws IOException { if (!beginLineDone) { writeBeginLine(); } // Write line length byte out.write(encode((byte) len)); // Read 3 bytes, write 4 bytes for (; len > 2; len -= 3, off += 3) { out.write(encode(buf[off] >> 2)); out.write(encode(((buf[off] << 4) & 060) | ((buf[off + 1] >> 4) & 017))); out.write(encode(((buf[off + 1] << 2) & 074) | ((buf[off + 2] >> 6) & 03))); out.write(encode(buf[off + 2] & 077)); } // Last len bytes if (len != 0) { byte c1 = buf[off]; byte c2 = '\0'; if (len != 1) { c2 = buf[off + 1]; } out.write(encode(c1 >> 2)); out.write(encode(((c1 << 4) & 060) | ((c2 >> 4) & 017))); if (len == 1) { out.write(encode('\0')); } else { out.write(encode((c2 << 2) & 074)); } out.write(encode('\0')); } // EOL out.write(0x0a); } static byte encode(int c) { return encode((byte) c); } /** * Encode a single character. */ static byte encode(byte c) { int c2 = (int) c; if (c2 < 0) { c2 += 256; } return TABLE[c2 & 077]; } } mail-1.1.2/source/javax/0000775000076500007650000000000010614714024014425 5ustar dogdog00000000000000mail-1.1.2/source/javax/mail/0000775000076500007650000000000010614714024015347 5ustar dogdog00000000000000mail-1.1.2/source/javax/mail/Address.java0000664000076500007650000000325010614714012017574 0ustar dogdog00000000000000/* * Address.java * Copyright (C) 2002 The Free Software Foundation * * This file is part of GNU JavaMail, a library. * * GNU JavaMail is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * GNU JavaMail 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * As a special exception, if you link this library with other files to * produce an executable, this library does not by itself cause the * resulting executable to be covered by the GNU General Public License. * This exception does not however invalidate any other reasons why the * executable file might be covered by the GNU General Public License. */ package javax.mail; import java.io.Serializable; /** * An address representing an endpoint in a messaging system. * Subclasses of this class should normally be serializable. * * @author Chris Burdess * @version 1.4 */ public abstract class Address implements Serializable { /** * Returns the type of this address. */ public abstract String getType(); public abstract String toString(); public abstract boolean equals(Object obj); } mail-1.1.2/source/javax/mail/AuthenticationFailedException.java0000664000076500007650000000317710614714012024162 0ustar dogdog00000000000000/* * AuthenticationFailedException.java * Copyright (C) 2002 The Free Software Foundation * * This file is part of GNU JavaMail, a library. * * GNU JavaMail is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * GNU JavaMail 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * As a special exception, if you link this library with other files to * produce an executable, this library does not by itself cause the * resulting executable to be covered by the GNU General Public License. * This exception does not however invalidate any other reasons why the * executable file might be covered by the GNU General Public License. */ package javax.mail; /** * An exception thrown to indicate that authentication failed during a * service's connect method. * * @author Chris Burdess * @version 1.4 */ public class AuthenticationFailedException extends MessagingException { public AuthenticationFailedException() { } public AuthenticationFailedException(String message) { super(message); } } mail-1.1.2/source/javax/mail/Authenticator.java0000664000076500007650000000620110614714012021020 0ustar dogdog00000000000000/* * Authenticator.java * Copyright (C) 2002 The Free Software Foundation * * This file is part of GNU JavaMail, a library. * * GNU JavaMail is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * GNU JavaMail 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * As a special exception, if you link this library with other files to * produce an executable, this library does not by itself cause the * resulting executable to be covered by the GNU General Public License. * This exception does not however invalidate any other reasons why the * executable file might be covered by the GNU General Public License. */ package javax.mail; import java.net.InetAddress; /** * Callback object that can be used to obtain password information during * authentication. This normally occurs by prompting the user for a password * or retrieving it from secure storage. * * @author Chris Burdess * @version 1.4 */ public abstract class Authenticator { private String defaultUserName; private int requestingPort = -1; private String requestingPrompt; private String requestingProtocol; private InetAddress requestingSite; final PasswordAuthentication requestPasswordAuthentication( InetAddress requestingSite, int requestingPort, String requestingProtocol, String requestingPrompt, String defaultUserName) { this.requestingSite = requestingSite; this.requestingPort = requestingPort; this.requestingProtocol = requestingProtocol; this.requestingPrompt = requestingPrompt; this.defaultUserName = defaultUserName; return getPasswordAuthentication(); } /** * Returns the default user name. */ protected final String getDefaultUserName() { return defaultUserName; } /** * Called when password authentication is needed. * This method should be overridden by subclasses. */ protected PasswordAuthentication getPasswordAuthentication() { return null; } /** * Returns the port used in the request. */ protected final int getRequestingPort() { return requestingPort; } /** * Returns the user prompt string for the request. */ protected final String getRequestingPrompt() { return requestingPrompt; } /** * Returns the protocol for the request. */ protected final String getRequestingProtocol() { return requestingProtocol; } /** * Returns the IP address of the request host, * or null if not available. */ protected final InetAddress getRequestingSite() { return requestingSite; } } mail-1.1.2/source/javax/mail/BodyPart.java0000664000076500007650000000341010614714012017731 0ustar dogdog00000000000000/* * BodyPart.java * Copyright (C) 2002 The Free Software Foundation * * This file is part of GNU JavaMail, a library. * * GNU JavaMail is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * GNU JavaMail 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * As a special exception, if you link this library with other files to * produce an executable, this library does not by itself cause the * resulting executable to be covered by the GNU General Public License. * This exception does not however invalidate any other reasons why the * executable file might be covered by the GNU General Public License. */ package javax.mail; /** * A MIME body part. This is a MIME part occurring inside a multipart in the * message content. * * @author Chris Burdess * @version 1.4 */ public abstract class BodyPart implements Part { /** * The Multipart object containing this BodyPart. */ protected Multipart parent = null; /** * Returns the containing Multipart object, or null if not * known. */ public Multipart getParent() { return parent; } void setParent(Multipart multipart) { parent = multipart; } } mail-1.1.2/source/javax/mail/event/0000775000076500007650000000000010614714024016470 5ustar dogdog00000000000000mail-1.1.2/source/javax/mail/event/ConnectionAdapter.java0000664000076500007650000000332010614714012022726 0ustar dogdog00000000000000/* * ConnectionAdapter.java * Copyright (C) 2002 The Free Software Foundation * * This file is part of GNU JavaMail, a library. * * GNU JavaMail is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * GNU JavaMail 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * As a special exception, if you link this library with other files to * produce an executable, this library does not by itself cause the * resulting executable to be covered by the GNU General Public License. * This exception does not however invalidate any other reasons why the * executable file might be covered by the GNU General Public License. */ package javax.mail.event; /** * An adapter for connection events. * * @author Chris Burdess * @version 1.4 */ public abstract class ConnectionAdapter implements ConnectionListener { /** * A service or folder was opened. */ public void opened(ConnectionEvent e) { } /** * A service was disconnected. */ public void disconnected(ConnectionEvent e) { } /** * A service or folder was closed. */ public void closed(ConnectionEvent e) { } } mail-1.1.2/source/javax/mail/event/ConnectionEvent.java0000664000076500007650000000460310614714012022434 0ustar dogdog00000000000000/* * ConnectionEvent.java * Copyright (C) 2002 The Free Software Fooundation * * This file is part of GNU JavaMail, a library. * * GNU JavaMail is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * GNU JavaMail 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * As a special exception, if you link this library with other files to * produce an executable, this library does not by itself cause the * resulting executable to be covered by the GNU General Public License. * This exception does not however invalidate any other reasons why the * executable file might be covered by the GNU General Public License. */ package javax.mail.event; /** * A connection event. * * @author Chris Burdess * @version 1.4 */ public class ConnectionEvent extends MailEvent { /** * A connection was opened. */ public static final int OPENED = 1; /** * A connection was disconnected (not currently used). */ public static final int DISCONNECTED = 2; /** * A connection was closed. */ public static final int CLOSED = 3; /** * The event type. */ protected int type; /** * Constructor. * @param source the source * @param type one of OPENED, DISCONNECTED, or CLOSED */ public ConnectionEvent(Object source, int type) { super(source); this.type = type; } /** * Returns the type of this event. */ public int getType() { return type; } /** * Invokes the appropriate listener method. */ public void dispatch(Object listener) { ConnectionListener l = (ConnectionListener) listener; switch (type) { case OPENED: l.opened(this); break; case DISCONNECTED: l.disconnected(this); break; case CLOSED: l.closed(this); break; } } } mail-1.1.2/source/javax/mail/event/ConnectionListener.java0000664000076500007650000000327410614714012023143 0ustar dogdog00000000000000/* * ConnectionListener.java * Copyright (C) 2002 The Free Software Foundation * * This file is part of GNU JavaMail, a library. * * GNU JavaMail is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * GNU JavaMail 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * As a special exception, if you link this library with other files to * produce an executable, this library does not by itself cause the * resulting executable to be covered by the GNU General Public License. * This exception does not however invalidate any other reasons why the * executable file might be covered by the GNU General Public License. */ package javax.mail.event; import java.util.EventListener; /** * A listener for connection events. * * @author Chris Burdess * @version 1.4 */ public interface ConnectionListener extends EventListener { /** * A service or folder was opened. */ void opened(ConnectionEvent e); /** * A service was disconnected. */ void disconnected(ConnectionEvent e); /** * A service or folder was closed. */ void closed(ConnectionEvent e); } mail-1.1.2/source/javax/mail/event/FolderAdapter.java0000664000076500007650000000325110614714012022045 0ustar dogdog00000000000000/* * FolderAdapter.java * Copyright (C) 2002 The Free Software Foundation * * This file is part of GNU JavaMail, a library. * * GNU JavaMail is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * GNU JavaMail 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * As a special exception, if you link this library with other files to * produce an executable, this library does not by itself cause the * resulting executable to be covered by the GNU General Public License. * This exception does not however invalidate any other reasons why the * executable file might be covered by the GNU General Public License. */ package javax.mail.event; /** * An adapter for folder events. * * @author Chris Burdess * @version 1.4 */ public abstract class FolderAdapter implements FolderListener { /** * A folder was created. */ public void folderCreated(FolderEvent e) { } /** * A folder was renamed. */ public void folderRenamed(FolderEvent e) { } /** * A folder was deleted. */ public void folderDeleted(FolderEvent e) { } } mail-1.1.2/source/javax/mail/event/FolderEvent.java0000664000076500007650000000655410614714012021557 0ustar dogdog00000000000000/* * FolderEvent.java * Copyright (C) 2002 The Free Software Foundation * * This file is part of GNU JavaMail, a library. * * GNU JavaMail is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * GNU JavaMail 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * As a special exception, if you link this library with other files to * produce an executable, this library does not by itself cause the * resulting executable to be covered by the GNU General Public License. * This exception does not however invalidate any other reasons why the * executable file might be covered by the GNU General Public License. */ package javax.mail.event; import javax.mail.Folder; /** * A folder event. * * @author Chris Burdess * @version 1.4 */ public class FolderEvent extends MailEvent { /** * The folder was created. */ public static final int CREATED = 1; /** * The folder was deleted. */ public static final int DELETED = 2; /** * The folder was renamed. */ public static final int RENAMED = 3; /** * The event type. */ protected int type; /** * The folder the event occurred on. */ protected transient Folder folder; /** * The folder representing the new name, in the case of a RENAMED event. */ protected transient Folder newFolder; /** * Constructor. * @param source the source * @param folder the affected folder * @param type the event type (CREATED or DELETED) */ public FolderEvent(Object source, Folder folder, int type) { this(source, folder, folder, type); } /** * Constructor for RENAMED events. * @param source the source * @param oldFolder the folder that is renamed * @param newFolder the folder that represents the new name * @param type the event type (RENAMED) */ public FolderEvent(Object source, Folder oldFolder, Folder newFolder, int type) { super(source); folder = oldFolder; this.newFolder = newFolder; this.type = type; } /** * Returns the type of this event. */ public int getType() { return type; } /** * Returns the affected folder. * @see #getNewFolder */ public Folder getFolder() { return folder; } /** * Returns the folder representing the new name, in the case of a RENAMED * event. * @see #getFolder */ public Folder getNewFolder() { return newFolder; } /** * Invokes the appropriate listener method. */ public void dispatch(Object listener) { FolderListener l = (FolderListener) listener; switch (type) { case CREATED: l.folderCreated(this); break; case DELETED: l.folderDeleted(this); break; case RENAMED: l.folderRenamed(this); break; } } } mail-1.1.2/source/javax/mail/event/FolderListener.java0000664000076500007650000000323310614714012022252 0ustar dogdog00000000000000/* * FolderListener.java * Copyright (C) 2002 The Free Software Foundation * * This file is part of GNU JavaMail, a library. * * GNU JavaMail is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * GNU JavaMail 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * As a special exception, if you link this library with other files to * produce an executable, this library does not by itself cause the * resulting executable to be covered by the GNU General Public License. * This exception does not however invalidate any other reasons why the * executable file might be covered by the GNU General Public License. */ package javax.mail.event; import java.util.EventListener; /** * A listener for folder events. * * @author Chris Burdess * @version 1.4 */ public interface FolderListener extends EventListener { /** * A folder was created. */ void folderCreated(FolderEvent e); /** * A folder was deleted. */ void folderDeleted(FolderEvent e); /** * A folder was renamed. */ void folderRenamed(FolderEvent e); } mail-1.1.2/source/javax/mail/event/MailEvent.java0000664000076500007650000000323610614714012021220 0ustar dogdog00000000000000/* * MessagingException.java * Copyright (C) 2002 The Free Software Foundation * * This file is part of GNU JavaMail, a library. * * GNU JavaMail is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * GNU JavaMail 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * As a special exception, if you link this library with other files to * produce an executable, this library does not by itself cause the * resulting executable to be covered by the GNU General Public License. * This exception does not however invalidate any other reasons why the * executable file might be covered by the GNU General Public License. */ package javax.mail.event; import java.util.EventObject; /** * Common base class for mail events, defining the dispatch method. * * @author Chris Burdess * @version 1.4 */ public abstract class MailEvent extends EventObject { public MailEvent(Object source) { super(source); } /** * Invokes the appropriate method on a listener for this type of event. */ public abstract void dispatch(Object listener); } mail-1.1.2/source/javax/mail/event/MessageChangedEvent.java0000664000076500007650000000470010614714012023171 0ustar dogdog00000000000000/* * MessageChangedEvent.java * Copyright (C) 2002 The Free Software Foundation * * This file is part of GNU JavaMail, a library. * * GNU JavaMail is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * GNU JavaMail 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * As a special exception, if you link this library with other files to * produce an executable, this library does not by itself cause the * resulting executable to be covered by the GNU General Public License. * This exception does not however invalidate any other reasons why the * executable file might be covered by the GNU General Public License. */ package javax.mail.event; import javax.mail.Message; /** * A message change event. * * @author Chris Burdess * @version 1.4 */ public class MessageChangedEvent extends MailEvent { /** * The message's flags changed. */ public static final int FLAGS_CHANGED = 1; /** * The message's envelope (headers, but not content) changed. */ public static final int ENVELOPE_CHANGED = 2; /** * The event type. */ protected int type; /** * The message that changed. */ protected transient Message msg; /** * Constructor. * @param source the owner folder * @param type the type of change (FLAGS_CHANGED or ENVELOPE_CHANGED) * @param msg the changed message */ public MessageChangedEvent(Object source, int type, Message msg) { super(source); this.msg = msg; this.type = type; } /** * Returns the type of this event. */ public int getMessageChangeType() { return type; } /** * Returns the changed message. */ public Message getMessage() { return msg; } /** * Invokes the appropriate listener method. */ public void dispatch(Object listener) { ((MessageChangedListener) listener).messageChanged(this); } } mail-1.1.2/source/javax/mail/event/MessageChangedListener.java0000664000076500007650000000304110614714012023672 0ustar dogdog00000000000000/* * MessageChangeListener.java * Copyright (C) 2002 The Free Software Foundation * * This file is part of GNU JavaMail, a library. * * GNU JavaMail is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * GNU JavaMail 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * As a special exception, if you link this library with other files to * produce an executable, this library does not by itself cause the * resulting executable to be covered by the GNU General Public License. * This exception does not however invalidate any other reasons why the * executable file might be covered by the GNU General Public License. */ package javax.mail.event; import java.util.EventListener; /** * A listener for message changed events. * * @author Chris Burdess * @version 1.4 */ public interface MessageChangedListener extends EventListener { /** * A message was changed. */ void messageChanged(MessageChangedEvent e); } mail-1.1.2/source/javax/mail/event/MessageCountAdapter.java0000664000076500007650000000323110614714012023225 0ustar dogdog00000000000000/* * MessageCountAdapter.java * Copyright (C) 2002 The Free Software Foundation * * This file is part of GNU JavaMail, a library. * * GNU JavaMail is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * GNU JavaMail 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * As a special exception, if you link this library with other files to * produce an executable, this library does not by itself cause the * resulting executable to be covered by the GNU General Public License. * This exception does not however invalidate any other reasons why the * executable file might be covered by the GNU General Public License. */ package javax.mail.event; /** * An adapter for message count events. * @author Chris Burdess * @version 1.4 */ public abstract class MessageCountAdapter implements MessageCountListener { /** * Messages were added into a folder. */ public void messagesAdded(MessageCountEvent e) { } /** * Messages were removed (expunged) from a folder. */ public void messagesRemoved(MessageCountEvent e) { } } mail-1.1.2/source/javax/mail/event/MessageCountEvent.java0000664000076500007650000000617210614714012022735 0ustar dogdog00000000000000/* * MessageCountEvent.java * Copyright (C) 2002 The Free Software Foundation * * This file is part of GNU JavaMail, a library. * * GNU JavaMail is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * GNU JavaMail 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * As a special exception, if you link this library with other files to * produce an executable, this library does not by itself cause the * resulting executable to be covered by the GNU General Public License. * This exception does not however invalidate any other reasons why the * executable file might be covered by the GNU General Public License. */ package javax.mail.event; import javax.mail.Folder; import javax.mail.Message; /** * A change in the number of messages in a folder. * * @author Chris Burdess * @version 1.4 */ public class MessageCountEvent extends MailEvent { /** * Messages were added to the folder. */ public static final int ADDED = 1; /** * Messages were removed from the folder. */ public static final int REMOVED = 2; /** * The event type. */ protected int type; /** * If true, this event is the result of an explicit expunge by this client. * Otherwise this event is the result of an expunge by external mechanisms. */ protected boolean removed; /** * The messages. */ protected transient Message[] msgs; /** * Constructor. * @param source the folder * @param type the event type (ADDED or REMOVED) * @param removed whether this event is the result of a specific expunge * @param msgs the messages added or removed */ public MessageCountEvent(Folder source, int type, boolean removed, Message[] msgs) { super(source); this.type = type; this.removed = removed; this.msgs = msgs; } /** * Returns the type of this event. */ public int getType() { return type; } /** * Indicates whether this event is the result of an explicit expunge, or * of an expunge by an external mechanism. */ public boolean isRemoved() { return removed; } /** * Returns the messages that were added or removed. */ public Message[] getMessages() { return msgs; } /** * Invokes the appropriate listener method. */ public void dispatch(Object listener) { MessageCountListener l = (MessageCountListener) listener; switch (type) { case ADDED: l.messagesAdded(this); break; case REMOVED: l.messagesRemoved(this); break; } } } mail-1.1.2/source/javax/mail/event/MessageCountListener.java0000664000076500007650000000322610614714012023436 0ustar dogdog00000000000000/* * MessageCountListener.java * Copyright (C) 2002 The Free Software Foundation * * This file is part of GNU JavaMail, a library. * * GNU JavaMail is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * GNU JavaMail 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * As a special exception, if you link this library with other files to * produce an executable, this library does not by itself cause the * resulting executable to be covered by the GNU General Public License. * This exception does not however invalidate any other reasons why the * executable file might be covered by the GNU General Public License. */ package javax.mail.event; import java.util.EventListener; /** * A listener for message count events. * * @author Chris Burdess * @version 1.4 */ public interface MessageCountListener extends EventListener { /** * Messages were added into a folder. */ void messagesAdded(MessageCountEvent e); /** * Messages were removed (expunged) from a folder. */ void messagesRemoved(MessageCountEvent e); } mail-1.1.2/source/javax/mail/event/package.html0000664000076500007650000000011610614714012020744 0ustar dogdog00000000000000

      Event objects and listener interfaces for JavaMail.

      mail-1.1.2/source/javax/mail/event/StoreEvent.java0000664000076500007650000000461110614714012021430 0ustar dogdog00000000000000/* * StoreEvent.java * Copyright (C) 2002 The Free Software Foundation * * This file is part of GNU JavaMail, a library. * * GNU JavaMail is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * GNU JavaMail 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * As a special exception, if you link this library with other files to * produce an executable, this library does not by itself cause the * resulting executable to be covered by the GNU General Public License. * This exception does not however invalidate any other reasons why the * executable file might be covered by the GNU General Public License. */ package javax.mail.event; import javax.mail.Store; /** * A store notification event. * * @author Chris Burdess * @version 1.4 */ public class StoreEvent extends MailEvent { /** * Indicates that this message is an ALERT. */ public static final int ALERT = 1; /** * Indicates that this message is a NOTICE. */ public static final int NOTICE = 2; /** * The event type. */ protected int type; /** * The message text to be presented to the user. */ protected String message; /** * Constructor. * @param source the store * @param type the type of event (ALERT or NOTICE) * @param message the notification message */ public StoreEvent(Store source, int type, String message) { super(source); this.type = type; this.message = message; } /** * Returns the type of this event. */ public int getMessageType() { return type; } /** * Returns the notification message. */ public String getMessage() { return message; } /** * Invokes the appropriate listener method. */ public void dispatch(Object listener) { ((StoreListener) listener).notification(this); } } mail-1.1.2/source/javax/mail/event/StoreListener.java0000664000076500007650000000302410614714012022131 0ustar dogdog00000000000000/* * StoreListener.java * Copyright (C) 2002 The Free Software Foundation * * This file is part of GNU JavaMail, a library. * * GNU JavaMail is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * GNU JavaMail 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * As a special exception, if you link this library with other files to * produce an executable, this library does not by itself cause the * resulting executable to be covered by the GNU General Public License. * This exception does not however invalidate any other reasons why the * executable file might be covered by the GNU General Public License. */ package javax.mail.event; import java.util.EventListener; /** * A listener for store notifications. * * @author Chris Burdess * @version 1.4 */ public interface StoreListener extends EventListener { /** * The store generated a notification event. */ void notification(StoreEvent e); } mail-1.1.2/source/javax/mail/event/TransportAdapter.java0000664000076500007650000000336710614714012022636 0ustar dogdog00000000000000/* * TransportAdapter.java * Copyright (C) 2002 The Free Software Foundation * * This file is part of GNU JavaMail, a library. * * GNU JavaMail is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * GNU JavaMail 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * As a special exception, if you link this library with other files to * produce an executable, this library does not by itself cause the * resulting executable to be covered by the GNU General Public License. * This exception does not however invalidate any other reasons why the * executable file might be covered by the GNU General Public License. */ package javax.mail.event; /** * An adapter for transport events. * * @author Chris Burdess * @version 1.4 */ public abstract class TransportAdapter implements TransportListener { /** * A message was delivered successfully. */ public void messageDelivered(TransportEvent e) { } /** * A message was not delivered. */ public void messageNotDelivered(TransportEvent e) { } /** * A message was partially delivered. */ public void messagePartiallyDelivered(TransportEvent e) { } } mail-1.1.2/source/javax/mail/event/TransportEvent.java0000664000076500007650000000737510614714012022342 0ustar dogdog00000000000000/* * TransportEvent.java * Copyright (C) 2002 The Free Software Foundation * * This file is part of GNU JavaMail, a library. * * GNU JavaMail is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * GNU JavaMail 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * As a special exception, if you link this library with other files to * produce an executable, this library does not by itself cause the * resulting executable to be covered by the GNU General Public License. * This exception does not however invalidate any other reasons why the * executable file might be covered by the GNU General Public License. */ package javax.mail.event; import javax.mail.Address; import javax.mail.Message; import javax.mail.Transport; /** * A transport event. * * @author Chris Burdess * @version 1.4 */ public class TransportEvent extends MailEvent { /** * The message was successfully delivered to all recipients. */ public static final int MESSAGE_DELIVERED = 1; /** * The message was not sent. */ public static final int MESSAGE_NOT_DELIVERED = 2; /** * The message was successfully sent to some but not all of the recipients. */ public static final int MESSAGE_PARTIALLY_DELIVERED = 3; /** * The event type. */ protected int type; protected transient Address[] validSent; protected transient Address[] validUnsent; protected transient Address[] invalid; protected transient Message msg; /** * Constructor. * @param source the transport * @param type the event type * @param validSent the valid sent addresses * @param validUnsent the valid unsent addresses * @param invalid the invalid addresses * @param msg the message */ public TransportEvent(Transport transport, int type, Address[] validSent, Address[] validUnsent, Address[] invalid, Message msg) { super(transport); this.type = type; this.validSent = validSent; this.validUnsent = validUnsent; this.invalid = invalid; this.msg = msg; } /** * Returns the type of this event. */ public int getType() { return type; } /** * Returns the addresses to which this message was delivered succesfully. */ public Address[] getValidSentAddresses() { return validSent; } /** * Returns the addresses that are valid but to which this message was not * delivered. */ public Address[] getValidUnsentAddresses() { return validUnsent; } /** * Returns the addresses to which this message could not be sent. */ public Address[] getInvalidAddresses() { return invalid; } /** * Returns the message. */ public Message getMessage() { return msg; } /** * Invokes the appropriate listener method. */ public void dispatch(Object listener) { TransportListener l = (TransportListener) listener; switch (type) { case MESSAGE_DELIVERED: l.messageDelivered(this); break; case MESSAGE_NOT_DELIVERED: l.messageNotDelivered(this); break; case MESSAGE_PARTIALLY_DELIVERED: l.messagePartiallyDelivered(this); break; } } } mail-1.1.2/source/javax/mail/event/TransportListener.java0000664000076500007650000000334610614714012023040 0ustar dogdog00000000000000/* * TransportListener.java * Copyright (C) 2002 The Free Software Foundation * * This file is part of GNU JavaMail, a library. * * GNU JavaMail is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * GNU JavaMail 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * As a special exception, if you link this library with other files to * produce an executable, this library does not by itself cause the * resulting executable to be covered by the GNU General Public License. * This exception does not however invalidate any other reasons why the * executable file might be covered by the GNU General Public License. */ package javax.mail.event; import java.util.EventListener; /** * A listener for transport events. * * @author Chris Burdess * @version 1.4 */ public interface TransportListener extends EventListener { /** * A message was delivered successfully. */ void messageDelivered(TransportEvent e); /** * A message was not delivered. */ void messageNotDelivered(TransportEvent e); /** * A message was partially delivered. */ void messagePartiallyDelivered(TransportEvent e); } mail-1.1.2/source/javax/mail/FetchProfile.java0000664000076500007650000000742010614714012020564 0ustar dogdog00000000000000/* * FetchProfile.java * Copyright (C) 2002 The Free Software Foundation * * This file is part of GNU JavaMail, a library. * * GNU JavaMail is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * GNU JavaMail 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * As a special exception, if you link this library with other files to * produce an executable, this library does not by itself cause the * resulting executable to be covered by the GNU General Public License. * This exception does not however invalidate any other reasons why the * executable file might be covered by the GNU General Public License. */ package javax.mail; import java.util.ArrayList; /** * Specification of the facets of a message that are to be preloaded from * the server. * * @author Chris Burdess * @version 1.4 */ public class FetchProfile { /** * Base class of all the facets of a message that can be fetched. */ public static class Item { /** * The common attributes of a message, e.g.: * From, To, Cc, Bcc, ReplyTo, Subject and Date. * Further items may be included as required. */ public static final Item ENVELOPE = new Item("ENVELOPE"); /** * The message content metadata, e.g.: * ContentType, ContentDisposition, ContentDescription, Size and LineCount. * Further items may be included as required. */ public static final Item CONTENT_INFO = new Item("CONTENT_INFO"); /** * The message flags. */ public static final Item FLAGS = new Item("FLAGS"); private String name; protected Item(String name) { this.name = name; } } private ArrayList items = null; private ArrayList headers = null; /** * Create an empty fetch profile. */ public FetchProfile() { } /** * Add the given item. */ public void add(Item item) { if (items == null) { items = new ArrayList(); } synchronized (items) { items.add(item); } } /** * Add the specified header name. */ public void add(String header) { if (headers == null) { headers = new ArrayList(); } synchronized (headers) { headers.add(header); } } /** * Indicates whether the fetch profile contains the specified item. */ public boolean contains(Item item) { return (items != null && items.contains(item)); } /** * Indicates whether the fetch profile contains the given header name. */ public boolean contains(String header) { return (headers!=null && headers.contains(header)); } /** * Get the items in this profile. */ public Item[] getItems() { if (items == null) { return new Item[0]; } synchronized (items) { Item[] i = new Item[items.size()]; items.toArray(i); return i; } } /** * Get the names of the header fields in this profile. */ public String[] getHeaderNames() { if (headers == null) { return new String[0]; } synchronized (headers) { String[] h = new String[headers.size()]; headers.toArray(h); return h; } } } mail-1.1.2/source/javax/mail/Flags.java0000664000076500007650000002050210614714012017242 0ustar dogdog00000000000000/* * Flags.java * Copyright (C) 2002 The Free Software Foundation * * This file is part of GNU JavaMail, a library. * * GNU JavaMail is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * GNU JavaMail 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * As a special exception, if you link this library with other files to * produce an executable, this library does not by itself cause the * resulting executable to be covered by the GNU General Public License. * This exception does not however invalidate any other reasons why the * executable file might be covered by the GNU General Public License. */ package javax.mail; import java.io.Serializable; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; /** * The set of flags on a message. * Flags are composed of predefined system flags (Flags.Flag), * and user defined flags (case-independent String). * * @author Chris Burdess * @version 1.4 */ public class Flags implements Cloneable, Serializable { /** * An individual system flag. */ public static final class Flag { /* * This holds the reverse mappings for flag bits to * flag objects. * It is used internally by the Flags class. */ private static final HashMap flag2flag = new HashMap(7); /** * This message has been answered. */ public static final Flag ANSWERED = new Flag(0x00000001); /** * This message is marked deleted. */ public static final Flag DELETED = new Flag(0x00000002); /** * This message is a draft. */ public static final Flag DRAFT = new Flag(0x00000004); /** * This message is flagged. */ public static final Flag FLAGGED = new Flag(0x00000008); /** * This message is recent. */ public static final Flag RECENT = new Flag(0x00000010); /** * This message is seen. */ public static final Flag SEEN = new Flag(0x00000020); /** * Special flag that indicates whether this folder supports * user defined flags. */ public static final Flag USER = new Flag(0x80000000); int flag; /* * Constructor. */ private Flag(int flag) { this.flag = flag; flag2flag.put(new Integer(flag), this); } } private int systemFlags; private HashMap userFlags; /** * Construct an empty Flags object. */ public Flags() { systemFlags = 0; userFlags = null; } /** * Construct a Flags object containing the given flags. */ public Flags(Flags flags) { systemFlags = flags.systemFlags; if (flags.userFlags != null) { userFlags = (HashMap) flags.userFlags.clone(); } else { userFlags = null; } } /** * Construct a Flags object containing the given system flag. */ public Flags(Flag flag) { systemFlags = systemFlags | flag.flag; userFlags = null; } /** * Construct a Flags object containing the given user flag. */ public Flags(String flag) { systemFlags = 0; userFlags = new HashMap(1); userFlags.put(flag.toLowerCase(), flag); } /** * Add the specified system flag. */ public void add(Flag flag) { systemFlags = systemFlags | flag.flag; } /** * Add the specified user flag. */ public void add(String flag) { if (userFlags == null) { userFlags = new HashMap(1); } synchronized (userFlags) { userFlags.put(flag.toLowerCase(), flag); } } /** * Add all the flags from the specified Flags object. */ public void add(Flags flags) { systemFlags = systemFlags | flags.systemFlags; if (flags.userFlags != null) { synchronized (flags.userFlags) { if (userFlags == null) { userFlags = new HashMap(flags.userFlags); } else { synchronized (userFlags) { userFlags.putAll(flags.userFlags); } } } } } /** * Remove the specified system flag. */ public void remove(Flag flag) { systemFlags = systemFlags & ~flag.flag; } /** * Remove the specified user flag. */ public void remove(String flag) { if (userFlags != null) { synchronized (userFlags) { userFlags.remove(flag.toLowerCase()); } } } /** * Remove all flags in the given Flags object from this Flags object. */ public void remove(Flags flags) { systemFlags = systemFlags & ~flags.systemFlags; if (userFlags != null && flags.userFlags != null) { synchronized (flags.userFlags) { synchronized (userFlags) { for (Iterator i = flags.userFlags.keySet().iterator(); i.hasNext(); ) { userFlags.remove(i.next()); } } } } } /** * Indicates whether the specified system flag is set. */ public boolean contains(Flag flag) { return (systemFlags & flag.flag) != 0; } /** * Indicates whether the specified user flag is set. */ public boolean contains(String flag) { if (userFlags == null) { return false; } return userFlags.containsKey(flag.toLowerCase()); } /** * Indicates whether all the flags in the specified Flags object * are set in this Flags object. */ public boolean contains(Flags flags) { if ((systemFlags & flags.systemFlags) == 0) { return false; } if (flags.userFlags != null) { if (userFlags == null) { return false; } synchronized (userFlags) { String[] fuf = flags.getUserFlags(); for (int i = 0; i < fuf.length; i++) { if (!userFlags.containsKey(fuf[i].toLowerCase())) { return false; } } } } return true; } public boolean equals(Object other) { if (other == this) { return true; } if (!(other instanceof Flags)) { return false; } Flags flags = (Flags) other; if (flags.systemFlags != systemFlags) { return false; } if (flags.userFlags == null && userFlags == null) { return true; } return (flags.userFlags != null && userFlags != null && flags.userFlags.equals(userFlags)); } public int hashCode() { int hashCode = systemFlags; if (userFlags != null) { hashCode += userFlags.hashCode(); } return hashCode; } /** * Returns the system flags. */ public Flag[] getSystemFlags() { ArrayList acc = new ArrayList(7); for (Iterator i = Flag.flag2flag.keySet().iterator(); i.hasNext(); ) { Integer flag = (Integer) i.next(); if ((systemFlags & flag.intValue()) != 0) { acc.add(Flag.flag2flag.get(flag)); } } Flag[] f = new Flag[acc.size()]; acc.toArray(f); return f; } /** * Returns the user flags. */ public String[] getUserFlags() { if (userFlags == null) { return new String[0]; } else { synchronized (userFlags) { String[] f = new String[userFlags.size()]; int index = 0; for (Iterator i = userFlags.keySet().iterator(); i.hasNext(); ) { f[index++] = (String) userFlags.get(i.next()); } return f; } } } public Object clone() { return new Flags(this); } } mail-1.1.2/source/javax/mail/Folder.java0000664000076500007650000007665610614714012017446 0ustar dogdog00000000000000/* * Folder.java * Copyright (C) 2002, 2004 The Free Software Foundation * * This file is part of GNU JavaMail, a library. * * GNU JavaMail is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * GNU JavaMail 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * As a special exception, if you link this library with other files to * produce an executable, this library does not by itself cause the * resulting executable to be covered by the GNU General Public License. * This exception does not however invalidate any other reasons why the * executable file might be covered by the GNU General Public License. */ package javax.mail; import java.util.ArrayList; import javax.mail.event.ConnectionEvent; import javax.mail.event.ConnectionListener; import javax.mail.event.FolderEvent; import javax.mail.event.FolderListener; import javax.mail.event.MailEvent; import javax.mail.event.MessageChangedEvent; import javax.mail.event.MessageChangedListener; import javax.mail.event.MessageCountEvent; import javax.mail.event.MessageCountListener; import javax.mail.search.SearchTerm; /** * A folder is a hierarchical messaging container in a store. * Folders may contain Messages, other Folders or both, depending on the * implementation. *

      * Folder names are implementation dependent; the hierarchy components in a * folder's full name are separated by the folder's ancestors' hierarchy * delimiter characters. *

      * The special (case-insensitive) folder name INBOX is reserved to mean the * primary folder for the authenticated user in the store. Not all stores * support INBOX folders, and not all users will have an INBOX folder. *

      * Unless documented otherwise, a folder must be opened in order to invoke * a method on it. * * @author Chris Burdess * @version 1.4 */ public abstract class Folder { /** * This folder can contain messages. */ public static final int HOLDS_MESSAGES = 1; /** * This folder can contain other folders. */ public static final int HOLDS_FOLDERS = 2; /** * This folder is read only. */ public static final int READ_ONLY = 1; /** * This folder can be modified. */ public static final int READ_WRITE = 2; /** * The parent store. */ protected Store store; /** * The folder mode: Folder.READ_ONLY, Folder.READ_WRITE, or -1 if not known. */ protected int mode = -1; // -- Event listener lists -- private volatile ArrayList connectionListeners = null; private volatile ArrayList folderListeners = null; private volatile ArrayList messageCountListeners = null; private volatile ArrayList messageChangedListeners = null; /** * Constructor. * @param store the parent store */ protected Folder(Store store) { this.store = store; } /** * Returns the name of this folder. *

      * This method can be invoked on a closed folder. */ public abstract String getName(); /** * Returns the full name of this folder. * If the folder resides under the root hierarchy of its store, * the returned name is relative to the root. * Otherwise an absolute name, starting with the hierarchy delimiter, * is returned. *

      * This method can be invoked on a closed folder. */ public abstract String getFullName(); /** * Return a URLName that can be used as a handle to access this folder. * This will not include the password used to authenticate to the store. *

      * This method can be invoked on a closed folder. */ public URLName getURLName() throws MessagingException { URLName url = getStore().getURLName(); String name = getFullName(); return new URLName(url.getProtocol(), url.getHost(), url.getPort(), name, url.getUsername(), null); } /** * Returns the parent store. * This method can be invoked on a closed folder. */ public Store getStore() { return store; } /** * Returns the parent folder of this folder, or null * if this folder is the root of a folder hierarchy. *

      * This method can be invoked on a closed folder. */ public abstract Folder getParent() throws MessagingException; /** * Indicates whether this folder exists in the Store. *

      * This method can be invoked on a closed folder. */ public abstract boolean exists() throws MessagingException; /** * Returns a list of subfolders matching the specified pattern. * Patterns may contain the wildcard characters "%", * which matches any character except hierarchy delimiters, and "*", * which matches any character. *

      * This method can be invoked on a closed folder. * @param pattern the match pattern */ public abstract Folder[] list(String pattern) throws MessagingException; /** * Returns a list of subscribed subfolders matching the specified pattern. * If the folder does not support subscription, returns the same as the * list method. * The pattern can contain wildcards. *

      * This method can be invoked on a closed folder. * @param pattern the match pattern */ public Folder[] listSubscribed(String pattern) throws MessagingException { return list(pattern); } /** * Returns the list of subfolders of this folder. *

      * This method can be invoked on a closed folder. */ public Folder[] list() throws MessagingException { return list("%"); } /** * Returns the list of subscribed subfolders of this folder. *

      * This method can be invoked on a closed folder. */ public Folder[] listSubscribed() throws MessagingException { return listSubscribed("%"); } /** * Return the hierarchy delimiter character for this folder. * This separates the full name of this folder from the names of * subfolders. *

      * This method can be invoked on a closed folder. */ public abstract char getSeparator() throws MessagingException; /** * Returns the type of this Folder, i.e. whether this folder can hold * messages or subfolders or both. * The returned value is an integer bitfield with the appropriate bits set. *

      * This method can be invoked on a closed folder. */ public abstract int getType() throws MessagingException; /** * Create this folder in the store. * When this folder is created, any folders in its path * that do not exist are also created. *

      * If the creation is successful, a CREATED FolderEvent is delivered * to any FolderListeners registered on this Folder and this Store. * @param type the desired type of the folder */ public abstract boolean create(int type) throws MessagingException; /** * Indicates whether this folder is subscribed. *

      * This method can be invoked on a closed folder. */ public boolean isSubscribed() { return true; } /** * Subscribe to or unsubscribe from this folder. * Not all Stores support subscription. *

      * This method can be invoked on a closed folder. */ public void setSubscribed(boolean flag) throws MessagingException { throw new MethodNotSupportedException(); } /** * Indicates whether this folder has new messages. *

      * This method can be invoked on a closed folder that can contain * messages. */ public abstract boolean hasNewMessages() throws MessagingException; /** * Return a folder corresponding to the given name. * Note that the folder does not have to exist in the store. *

      * In some stores, name can be an absolute path if it starts * with the hierarchy delimiter. Otherwise, it is interpreted relative to * this folder. *

      * This method can be invoked on a closed folder. * @param name the name of the folder */ public abstract Folder getFolder(String name) throws MessagingException; /** * Deletes this folder. * This method can only be invoked on a closed folder. * @param recurse delete any subfolders * @return true if the folder is deleted successfully, false otherwise * @exception FolderNotFoundException if this folder does not exist * @exception IllegalStateException if this folder is not closed */ public abstract boolean delete(boolean recurse) throws MessagingException; /** * Renames this folder. * This method can only be invoked on a closed folder. * @param folder a folder representing the new name for this folder * @return true if the folder is renamed successfully, false otherwise * @exception FolderNotFoundException if this folder does not exist * @exception IllegalStateException if this folder is not closed */ public abstract boolean renameTo(Folder folder) throws MessagingException; /** * Opens this folder. * This method can only be invoked on a closed folder that can contain * messages. * @param mode open the Folder READ_ONLY or READ_WRITE * @exception FolderNotFoundException if this folder does not exist * @exception IllegalStateException if this folder is not closed */ public abstract void open(int mode) throws MessagingException; /** * Closes this folder. * This method can only be invoked on an open folder. * @param expunge if true, expunge all deleted messages */ public abstract void close(boolean expunge) throws MessagingException; /** * Indicates whether this folder is open. */ public abstract boolean isOpen(); /** * Return the mode this folder is open in. * Returns Folder.READ_ONLY, Folder.READ_WRITE, * or -1 if the open mode is not known. * @exception IllegalStateException if this folder is not open */ public int getMode() { if (!isOpen()) { throw new IllegalStateException("Folder not open"); } return mode; } /** * Returns the permanent flags supported by this folder. */ public abstract Flags getPermanentFlags(); /** * Returns the number of messages in this folder. *

      * This method can be invoked on a closed folder; however, * note that for some stores, getting the message count can be an * expensive operation involving actually opening the folder. * In such cases, a provider can choose to return -1 here when the folder * is closed. */ public abstract int getMessageCount() throws MessagingException; /** * Returns the number of new messages in this folder. *

      * This method can be invoked on a closed folder; however, * note that for some stores, getting the message count can be an * expensive operation involving actually opening the folder. * In such cases, a provider can choose to return -1 here when the folder * is closed. */ public synchronized int getNewMessageCount() throws MessagingException { if (!isOpen()) { return -1; } int count = 0; int total = getMessageCount(); for (int i = 1; i <= total; i++) { try { if (getMessage(i).isSet(Flags.Flag.RECENT)) { count++; } } catch (MessageRemovedException e) { } } return count; } /** * Returns the number of unread messages in this folder. *

      * This method can be invoked on a closed folder; however, * note that for some stores, getting the message count can be an * expensive operation involving actually opening the folder. * In such cases, a provider can choose to return -1 here when the folder * is closed. */ public synchronized int getUnreadMessageCount() throws MessagingException { if (!isOpen()) { return -1; } int count = 0; int total = getMessageCount(); for (int i = 1; i <= total; i++) { try { if (!getMessage(i).isSet(Flags.Flag.SEEN)) { count++; } } catch (MessageRemovedException e) { } } return count; } /** * Returns the number of deleted messages in this folder. *

      * This method can be invoked on a closed folder; however, * note that for some stores, getting the message count can be an * expensive operation involving actually opening the folder. * In such cases, a provider can choose to return -1 here when the folder * is closed. * @exception FolderNotFoundException if this folder does not exist * @since JavaMail 1.3 */ public synchronized int getDeletedMessageCount() throws MessagingException { if (!isOpen()) { return -1; } int count = 0; int total = getMessageCount(); for (int i = 1; i <= total; i++) { try { if (!getMessage(i).isSet(Flags.Flag.DELETED)) { count++; } } catch (MessageRemovedException e) { } } return count; } /** * Returns the message with the given number. * The message number is the relative position of a message in its * folder, starting at 1. *

      * Note that message numbers can change within a session if the folder is * expunged, therefore the use of message numbers as references to * messages is inadvisable. * @param msgnum the message number * @exception FolderNotFoundException if this folder does not exist * @exception IllegalStateException if this folder is closed * @exception IndexOutOfBoundsException if the message number is out of * range */ public abstract Message getMessage(int msgnum) throws MessagingException; /** * Returns the messages in the given range (inclusive). * @param start the number of the first message * @param end the number of the last message * @exception FolderNotFoundException if this folder does not exist * @exception IllegalStateException if this folder is closed * @exception IndexOutOfBoundsException if the start or end message * numbers are out of range. */ public synchronized Message[] getMessages(int start, int end) throws MessagingException { Message[] messages = new Message[(end - start) + 1]; for (int i = start; i <= end; i++) { messages[i - start] = getMessage(i); } return messages; } /** * Returns the messages for the specified message numbers. * @param msgnums the array of message numbers * @exception FolderNotFoundException if this folder does not exist * @exception IllegalStateException if this folder is closed * @exception IndexOutOfBoundsException if any message number in the * given array is out of range */ public synchronized Message[] getMessages(int msgnums[]) throws MessagingException { int total = msgnums.length; Message[] messages = new Message[total]; for(int i = 0; i < total; i++) { messages[i] = getMessage(msgnums[i]); } return messages; } /** * Returns all messages in this folder. * @exception FolderNotFoundException if this folder does not exist * @exception IllegalStateException if this folder is closed */ public synchronized Message[] getMessages() throws MessagingException { if (!isOpen()) { throw new IllegalStateException("Folder not open"); } int total = getMessageCount(); Message[] messages = new Message[total]; for (int i = 1; i <= total; i++) { messages[i - 1] = getMessage(i); } return messages; } /** * Appends the specified messages to this folder. *

      * This method can be invoked on a closed folder. * @param msgs array of messages to be appended * @exception FolderNotFoundException if this folder does not exist * @exception MessagingException if the append operation failed */ public abstract void appendMessages(Message[] msgs) throws MessagingException; /** * Fetches the items specified in the given fetch profile for the specified * messages. * @param msgs the messages to fetch the items for * @param fp the fetch profile */ public void fetch(Message[] msgs, FetchProfile fp) throws MessagingException { } /** * Sets the specified flags on each specified message. * @param msgnums the messages * @param flag the flags to be set * @param value set the flags to this value * @exception IllegalStateException if this folder is closed or READ_ONLY */ public synchronized void setFlags(Message[] msgs, Flags flag, boolean value) throws MessagingException { for (int i = 0; i < msgs.length; i++) { try { msgs[i].setFlags(flag, value); } catch (MessageRemovedException e) { } } } /** * Set the specified flags on the given range of messages (inclusive). * @param start the number of the first message * @param end the number of the last message * @param flag the flags to be set * @param value set the flags to this value * @exception IllegalStateException if this folder is closed or READ_ONLY * @exception IndexOutOfBoundsException if the start or end message * numbers are out of range */ public synchronized void setFlags(int start, int end, Flags flag, boolean value) throws MessagingException { for (int i = start; i <= end; i++) { try { getMessage(i).setFlags(flag, value); } catch (MessageRemovedException e) { } } } /** * Sets the specified flags on each of the specified messages. * @param msgnums the message numbers * @param flag the flags to be set * @param value set the flags to this value * @exception IllegalStateException if this folder is closed or READ_ONLY * @exception IndexOutOfBoundsException if any message number in the * given array is out of range */ public synchronized void setFlags(int[] msgnums, Flags flag, boolean value) throws MessagingException { for (int i = 0; i < msgnums.length; i++) { try { getMessage(msgnums[i]).setFlags(flag, value); } catch (MessageRemovedException e) { } } } /** * Copies the specified messages into another folder. *

      * The destination folder does not have to be open. * @param msgs the messages * @param folder the folder to copy the messages to */ public void copyMessages(Message[] msgs, Folder folder) throws MessagingException { if (!folder.exists()) { throw new FolderNotFoundException("Folder does not exist", folder); } boolean isOpen = folder.isOpen(); if (!isOpen) { folder.open(Folder.READ_WRITE); } folder.appendMessages(msgs); if (!isOpen) { folder.close(false); } } /** * Expunges (permanently removing) all the messages marked DELETED. * Returns an array containing the expunged messages. *

      * Expunge causes the renumbering of any messages with numbers higher than * the message number of the lowest-numbered expunged message. *

      * After a message has been expunged, only the isExpunged and * getMessageNumber methods are still valid on the * corresponding Message object; other methods may throw * MessageRemovedException. * @exception FolderNotFoundException if this folder does not exist * @exception IllegalStateException if this folder is closed */ public abstract Message[] expunge() throws MessagingException; /** * Searches this folder for messages matching the specified search term. * Returns the matching messages. * @param term the search term * @exception SearchException if there was a problem with the search * @exception FolderNotFoundException if this folder does not exist * @exception IllegalStateException if this folder is closed */ public Message[] search(SearchTerm term) throws MessagingException { return search(term, getMessages()); } /** * Searches the given messages for those matching the specified search * term. * Returns the matching messages. * @param term the search term * @param msgs the messages to be searched * @exception SearchException if there was a problem with the search * @exception IllegalStateException if this folder is closed */ public Message[] search(SearchTerm term, Message[] msgs) throws MessagingException { ArrayList acc = new ArrayList(); for (int i = 0; i < msgs.length; i++) { try { if (msgs[i].match(term)) { acc.add(msgs[i]); } } catch (MessageRemovedException e) { } } Message[] m = new Message[acc.size()]; acc.toArray(m); return m; } // -- Event management -- /* * Because the propagation of events of different kinds in the JavaMail * API is so haphazard, I have here sacrificed a small time advantage for * readability and consistency. * * All the various propagation methods now call a method with a name based * on the eventual listener method name prefixed by 'fire', as is the * preferred pattern for usage of the EventListenerList in Swing. * * Note that all events are currently delivered synchronously, where in * Sun's implementation a different thread is used for event delivery. * * TODO Examine the impact of this. */ // -- Connection events -- /** * Add a listener for connection events on this folder. */ public void addConnectionListener(ConnectionListener l) { if (connectionListeners == null) { connectionListeners = new ArrayList(); } synchronized (connectionListeners) { connectionListeners.add(l); } } /** * Remove a connection event listener. */ public void removeConnectionListener(ConnectionListener l) { if (connectionListeners != null) { synchronized (connectionListeners) { connectionListeners.remove(l); } } } /** * Notify all connection listeners. */ protected void notifyConnectionListeners(int type) { ConnectionEvent event = new ConnectionEvent(this, type); switch (type) { case ConnectionEvent.OPENED: fireOpened(event); break; case ConnectionEvent.DISCONNECTED: fireDisconnected(event); break; case ConnectionEvent.CLOSED: fireClosed(event); break; } } /* * Propagates an OPENED ConnectionEvent to all registered listeners. */ void fireOpened(ConnectionEvent event) { if (connectionListeners != null) { ConnectionListener[] l = null; synchronized (connectionListeners) { l = new ConnectionListener[connectionListeners.size()]; connectionListeners.toArray(l); } for (int i = 0; i < l.length; i++) { l[i].opened(event); } } } /* * Propagates a DISCONNECTED ConnectionEvent to all registered listeners. */ void fireDisconnected(ConnectionEvent event) { if (connectionListeners != null) { ConnectionListener[] l = null; synchronized (connectionListeners) { l = new ConnectionListener[connectionListeners.size()]; connectionListeners.toArray(l); } for (int i = 0; i < l.length; i++) { l[i].disconnected(event); } } } /* * Propagates a CLOSED ConnectionEvent to all registered listeners. */ void fireClosed(ConnectionEvent event) { if (connectionListeners != null) { ConnectionListener[] l = null; synchronized (connectionListeners) { l = new ConnectionListener[connectionListeners.size()]; connectionListeners.toArray(l); } for (int i = 0; i < l.length; i++) { l[i].closed(event); } } } // -- Folder events -- /** * Add a listener for folder events on this folder. */ public void addFolderListener(FolderListener l) { if (folderListeners == null) { folderListeners = new ArrayList(); } synchronized (folderListeners) { folderListeners.add(l); } } /** * Remove a folder event listener. */ public void removeFolderListener(FolderListener l) { if (folderListeners != null) { synchronized (folderListeners) { folderListeners.remove(l); } } } /** * Notify all folder listeners registered on this Folder and * this folder's store. */ protected void notifyFolderListeners(int type) { FolderEvent event = new FolderEvent(this, this, type); switch (type) { case FolderEvent.CREATED: fireFolderCreated(event); break; case FolderEvent.DELETED: fireFolderDeleted(event); break; } store.notifyFolderListeners(type, this); } /** * Notify all folder listeners registered on this folder and * this folder's store about the renaming of this folder. */ protected void notifyFolderRenamedListeners(Folder folder) { FolderEvent event = new FolderEvent(this, this, folder, FolderEvent.RENAMED); fireFolderRenamed(event); store.notifyFolderRenamedListeners(this, folder); } /* * Propagates a CREATED FolderEvent to all registered listeners. */ void fireFolderCreated(FolderEvent event) { if (folderListeners != null) { FolderListener[] l = null; synchronized (folderListeners) { l = new FolderListener[folderListeners.size()]; folderListeners.toArray(l); } for (int i = 0; i < l.length; i++) { l[i].folderCreated(event); } } } /* * Propagates a DELETED FolderEvent to all registered listeners. */ void fireFolderDeleted(FolderEvent event) { if (folderListeners != null) { FolderListener[] l = null; synchronized (folderListeners) { l = new FolderListener[folderListeners.size()]; folderListeners.toArray(l); } for (int i = 0; i < l.length; i++) { l[i].folderDeleted(event); } } } /* * Propagates a RENAMED FolderEvent to all registered listeners. */ void fireFolderRenamed(FolderEvent event) { if (folderListeners != null) { FolderListener[] l = null; synchronized (folderListeners) { l = new FolderListener[folderListeners.size()]; folderListeners.toArray(l); } for (int i = 0; i < l.length; i++) { l[i].folderRenamed(event); } } } // -- Message count events -- /** * Add a listener for message count events on this folder. */ public void addMessageCountListener(MessageCountListener l) { if (messageCountListeners == null) { messageCountListeners = new ArrayList(); } synchronized (messageCountListeners) { messageCountListeners.add(l); } } /** * Remove a message count event listener. */ public void removeMessageCountListener(MessageCountListener l) { if (messageCountListeners != null) { synchronized (messageCountListeners) { messageCountListeners.remove(l); } } } /** * Notify all message count listeners about the addition of messages * into this folder. */ protected void notifyMessageAddedListeners(Message[] msgs) { MessageCountEvent event = new MessageCountEvent(this, MessageCountEvent.ADDED, false, msgs); fireMessagesAdded(event); } /** * Notify all message count listeners about the removal of messages from * this folder. */ protected void notifyMessageRemovedListeners(boolean removed, Message[] msgs) { MessageCountEvent event = new MessageCountEvent(this, MessageCountEvent.REMOVED, removed, msgs); fireMessagesRemoved(event); } /* * Propagates an ADDED MessageCountEvent to all registered listeners. */ void fireMessagesAdded(MessageCountEvent event) { if (messageCountListeners != null) { MessageCountListener[] l = null; synchronized (messageCountListeners) { l = new MessageCountListener[messageCountListeners.size()]; messageCountListeners.toArray(l); } for (int i = 0; i < l.length; i++) { l[i].messagesAdded(event); } } } /* * Propagates a REMOVED MessageCountEvent to all registered listeners. */ void fireMessagesRemoved(MessageCountEvent event) { if (messageCountListeners != null) { MessageCountListener[] l = null; synchronized (messageCountListeners) { l = new MessageCountListener[messageCountListeners.size()]; messageCountListeners.toArray(l); } for (int i = 0; i < l.length; i++) { l[i].messagesRemoved(event); } } } // -- Message changed events -- /** * Add a listener for message changed events on this folder. */ public void addMessageChangedListener(MessageChangedListener l) { if (messageChangedListeners == null) { messageChangedListeners = new ArrayList(); } synchronized (messageChangedListeners) { messageChangedListeners.add(l); } } /** * Remove a message changed event listener. */ public void removeMessageChangedListener(MessageChangedListener l) { if (messageChangedListeners != null) { synchronized (messageChangedListeners) { messageChangedListeners.remove(l); } } } /** * Notify all message changed event listeners. */ protected void notifyMessageChangedListeners(int type, Message msg) { MessageChangedEvent event = new MessageChangedEvent(this, type, msg); fireMessageChanged(event); } /* * Propagates a MessageChangedEvent to all registered listeners. */ void fireMessageChanged(MessageChangedEvent event) { if (messageChangedListeners != null) { MessageChangedListener[] l = null; synchronized (messageChangedListeners) { l = new MessageChangedListener[messageChangedListeners.size()]; messageChangedListeners.toArray(l); } for (int i = 0; i < l.length; i++) { l[i].messageChanged(event); } } } // -- Utility methods -- /** * Returns the value of Folder.getFullName(), or, if that is null, * returns the default toString(). */ public String toString() { String name = getFullName(); return (name != null) ? name : super.toString(); } } mail-1.1.2/source/javax/mail/FolderClosedException.java0000664000076500007650000000345610614714012022443 0ustar dogdog00000000000000/* * FolderClosedException.java * Copyright (C) 2002 The Free Software Foundation * * This file is part of GNU JavaMail, a library. * * GNU JavaMail is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * GNU JavaMail 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * As a special exception, if you link this library with other files to * produce an executable, this library does not by itself cause the * resulting executable to be covered by the GNU General Public License. * This exception does not however invalidate any other reasons why the * executable file might be covered by the GNU General Public License. */ package javax.mail; /** * An exception thrown when a method is invoked on a closed folder or one of * its messages. The folder may be reopened. * * @author Chris Burdess * @version 1.4 */ public class FolderClosedException extends MessagingException { private Folder folder; public FolderClosedException(Folder folder) { this(folder, null); } public FolderClosedException(Folder folder, String message) { super(message); this.folder = folder; } /** * Returns the folder. */ public Folder getFolder() { return folder; } } mail-1.1.2/source/javax/mail/FolderNotFoundException.java0000664000076500007650000000362710614714012022766 0ustar dogdog00000000000000/* * FolderNotFoundException.java * Copyright (C) 2002 The Free Software Foundation * * This file is part of GNU JavaMail, a library. * * GNU JavaMail is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * GNU JavaMail 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * As a special exception, if you link this library with other files to * produce an executable, this library does not by itself cause the * resulting executable to be covered by the GNU General Public License. * This exception does not however invalidate any other reasons why the * executable file might be covered by the GNU General Public License. */ package javax.mail; /** * An exception thrown when a method is invoked on a nonexistent folder. * * @author Chris Burdess * @version 1.4 */ public class FolderNotFoundException extends MessagingException { private Folder folder; public FolderNotFoundException() { } public FolderNotFoundException(Folder folder) { this.folder = folder; } public FolderNotFoundException(Folder folder, String message) { super(message); this.folder = folder; } public FolderNotFoundException(String message, Folder folder) { this(folder, message); } /** * Returns the folder. */ public Folder getFolder() { return folder; } } mail-1.1.2/source/javax/mail/Header.java0000664000076500007650000000364310614714012017405 0ustar dogdog00000000000000/* * Header.java * Copyright (C) 2002 The Free Software Foundation * * This file is part of GNU JavaMail, a library. * * GNU JavaMail is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * GNU JavaMail 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * As a special exception, if you link this library with other files to * produce an executable, this library does not by itself cause the * resulting executable to be covered by the GNU General Public License. * This exception does not however invalidate any other reasons why the * executable file might be covered by the GNU General Public License. */ package javax.mail; /** * A header is a name/value pair containing metadata about a message's * content and/or routing information. * * @author Chris Burdess * @version 1.4 */ public class Header { /** * The name. */ String name; /** * The value. */ String value; /** * Construct a header. * @param name name of the header * @param value value of the header */ public Header(String name, String value) { this.name = name; this.value = value; } /** * Returns the name of this header. */ public String getName() { return name; } /** * Returns the value of this header. */ public String getValue() { return value; } } mail-1.1.2/source/javax/mail/IllegalWriteException.java0000664000076500007650000000310310614714012022447 0ustar dogdog00000000000000/* * IllegalWriteException.java * Copyright (C) 2002 The Free Software Foundation * * This file is part of GNU JavaMail, a library. * * GNU JavaMail is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * GNU JavaMail 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * As a special exception, if you link this library with other files to * produce an executable, this library does not by itself cause the * resulting executable to be covered by the GNU General Public License. * This exception does not however invalidate any other reasons why the * executable file might be covered by the GNU General Public License. */ package javax.mail; /** * An exception thrown when a modification of a read-only property is * attempted. * * @author Chris Burdess * @version 1.4 */ public class IllegalWriteException extends MessagingException { public IllegalWriteException() { } public IllegalWriteException(String message) { super(message); } } mail-1.1.2/source/javax/mail/internet/0000775000076500007650000000000010614714024017177 5ustar dogdog00000000000000mail-1.1.2/source/javax/mail/internet/AddressException.java0000664000076500007650000000623110614714012023305 0ustar dogdog00000000000000/* * AddressException.java * Copyright (C) 2002 The Free Software Foundation * * This file is part of GNU JavaMail, a library. * * GNU JavaMail is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * GNU JavaMail 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * As a special exception, if you link this library with other files to * produce an executable, this library does not by itself cause the * resulting executable to be covered by the GNU General Public License. * This exception does not however invalidate any other reasons why the * executable file might be covered by the GNU General Public License. */ package javax.mail.internet; /** * An exception thrown when an incorrectly formatted address is encountered. * * @author Chris Burdess * @version 1.4 */ public class AddressException extends ParseException { /** * The address(es) being parsed. */ protected String ref; /** * The index in ref where the error occurred, or -1 if not known. */ protected int pos; /** * Constructor with no detail message. */ public AddressException() { this(null, null, -1); } /** * Constructor with the specified detail message. * @param s the detail message */ public AddressException(String s) { this(s, null, -1); } /** * Constructor with the specified detail message and address being parsed. * @param s the detail message * @param ref the address being parsed */ public AddressException(String s, String ref) { this(s, ref, -1); } /** * Constructor with the specified detail message and address being parsed. * @param s the detail message * @param ref the address being parsed * @param pos the index in ref where the error occurred */ public AddressException(String s, String ref, int pos) { super(s); this.ref = ref; this.pos = pos; } /** * Returns the address(es) being parsed when the error was detected. */ public String getRef() { return ref; } /** * Returns the position within ref where the error was detected, * or -1 if ref is null. */ public int getPos() { return pos; } public String toString() { StringBuffer buffer = new StringBuffer(); buffer.append(super.toString()); if (ref != null) { buffer.append(" in string "); buffer.append(ref); if (pos > -1) { buffer.append(" at position "); buffer.append(pos); } } return buffer.toString(); } } mail-1.1.2/source/javax/mail/internet/ContentDisposition.java0000664000076500007650000001046310614714012023702 0ustar dogdog00000000000000/* * ContentDisposition.java * Copyright (C) 2002 The Free Software Foundation * * This file is part of GNU JavaMail, a library. * * GNU JavaMail is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * GNU JavaMail 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * As a special exception, if you link this library with other files to * produce an executable, this library does not by itself cause the * resulting executable to be covered by the GNU General Public License. * This exception does not however invalidate any other reasons why the * executable file might be covered by the GNU General Public License. */ package javax.mail.internet; /** * A MIME Content-Disposition value. * * @author Chris Burdess * @version 1.4 */ public class ContentDisposition { /* * The disposition value. */ private String disposition; /* * The parameters. */ private ParameterList list; /** * Constructor for an empty Content-Disposition. */ public ContentDisposition() { } /** * Constructor. * @param disposition the disposition value * @param list the parameters */ public ContentDisposition(String disposition, ParameterList list) { this.disposition = disposition; this.list = list; } /** * Constructor that parses a Content-Disposition value from an RFC 2045 * string representation. * @param s the Content-Disposition value * @exception ParseException if there was an error in the value */ public ContentDisposition(String s) throws ParseException { HeaderTokenizer ht = new HeaderTokenizer(s, HeaderTokenizer.MIME); HeaderTokenizer.Token token = ht.next(); if (token.getType() != HeaderTokenizer.Token.ATOM) { throw new ParseException(); } disposition = token.getValue(); s = ht.getRemainder(); if (s != null) { list = new ParameterList(s); } } /** * Returns the disposition value. */ public String getDisposition() { return disposition; } /** * Returns the specified parameter value, or null if this * parameter is not present. * @param name the parameter name */ public String getParameter(String name) { return (list != null) ? list.get(name) : null; } /** * Returns the parameters, or null if there are no * parameters. */ public ParameterList getParameterList() { return list; } /** * Sets the disposition value. * @param disposition the disposition value */ public void setDisposition(String disposition) { this.disposition = disposition; } /** * Sets the specified parameter. * @param name the parameter name * @param value the parameter value */ public void setParameter(String name, String value) { if (list == null) { list = new ParameterList(); } list.set(name, value); } /** * Sets the parameters. * @param list the parameters */ public void setParameterList(ParameterList list) { this.list = list; } /** * Returns an RFC 2045 string representation of this Content-Disposition. */ public String toString() { if (disposition == null) { return null; } if (list == null) { return disposition; } else { StringBuffer buffer = new StringBuffer(); buffer.append(disposition); // Add the parameters, using the toString(int) method // which allows the resulting string to fold properly onto the next // header line. int used = buffer.length() + 21; // "Content-Disposition: ".length() buffer.append(list.toString(used)); return buffer.toString(); } } } mail-1.1.2/source/javax/mail/internet/ContentType.java0000664000076500007650000001423110614714012022314 0ustar dogdog00000000000000/* * ContentType.java * Copyright (C) 2002 The Free Software Foundation * * This file is part of GNU JavaMail, a library. * * GNU JavaMail is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * GNU JavaMail 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * As a special exception, if you link this library with other files to * produce an executable, this library does not by itself cause the * resulting executable to be covered by the GNU General Public License. * This exception does not however invalidate any other reasons why the * executable file might be covered by the GNU General Public License. */ package javax.mail.internet; /** * A MIME Content-Type value. * * @author Chris Burdess * @version 1.4 */ public class ContentType { /* * The primary type. */ private String primaryType; /* * The subtype. */ private String subType; /* * The parameters. */ private ParameterList list; /** * Constructor for an empty Content-Type. */ public ContentType() { } /** * Constructor. * @param primaryType the primary type * @param subType the subtype * @param list the parameters */ public ContentType(String primaryType, String subType, ParameterList list) { this.primaryType = primaryType; this.subType = subType; this.list = list; } /** * Constructor that parses a Content-Type value from an RFC 2045 string * representation. * @param s the Content-Type value * @exception ParseException if an error occurred during parsing */ public ContentType(String s) throws ParseException { HeaderTokenizer ht = new HeaderTokenizer(s, HeaderTokenizer.MIME); HeaderTokenizer.Token token = ht.next(); if (token.getType() != HeaderTokenizer.Token.ATOM) { throw new ParseException("expected primary type: " + s); } primaryType = token.getValue(); token = ht.next(); if (token.getType() != 0x2f) // '/' { throw new ParseException("expected '/': " + s); } token = ht.next(); if (token.getType() != HeaderTokenizer.Token.ATOM) { throw new ParseException("expected subtype: " + s); } subType = token.getValue(); s = ht.getRemainder(); if (s != null) { list = new ParameterList(s); } } /** * Returns the primary type. */ public String getPrimaryType() { return primaryType; } /** * Returns the subtype. */ public String getSubType() { return subType; } /** * Returns the MIME type string, without the parameters. */ public String getBaseType() { if (primaryType == null || subType == null) { return null; } StringBuffer buffer = new StringBuffer(); buffer.append(primaryType); buffer.append('/'); buffer.append(subType); return buffer.toString(); } /** * Returns the specified parameter value. */ public String getParameter(String name) { return (list == null) ? null : list.get(name); } /** * Returns the parameters. */ public ParameterList getParameterList() { return list; } /** * Sets the primary type. */ public void setPrimaryType(String primaryType) { this.primaryType = primaryType; } /** * Sets the subtype. */ public void setSubType(String subType) { this.subType = subType; } /** * Sets the specified parameter. * @param name the parameter name * @param value the parameter value */ public void setParameter(String name, String value) { if (list == null) { list = new ParameterList(); } list.set(name, value); } /** * Sets the parameters. * @param list the Parameter list */ public void setParameterList(ParameterList list) { this.list = list; } /** * Returns an RFC 2045 string representation of this Content-Type. */ public String toString() { if (primaryType == null || subType == null) { return null; } StringBuffer buffer = new StringBuffer(); buffer.append(primaryType); buffer.append('/'); buffer.append(subType); if (list != null) { // Add the parameters, using the toString(int) method // which allows the resulting string to fold properly onto the next // header line. int used = buffer.length() + 14; // "Content-Type: ".length() buffer.append(list.toString(used)); } return buffer.toString(); } /** * Returns true if the specified Content-Type matches this Content-Type. * Parameters are ignored. *

      * If the subtype of either Content-Type is the special character '*', * the subtype is ignored during the match. * @param cType the Content-Type for comparison */ public boolean match(ContentType cType) { if (!primaryType.equalsIgnoreCase(cType.getPrimaryType())) { return false; } String cTypeSubType = cType.getSubType(); if (subType.charAt(0) == '*' || cTypeSubType.charAt(0) == '*') { return true; } return subType.equalsIgnoreCase(cTypeSubType); } /** * Returns true if the specified Content-Type matches this Content-Type. * Parameters are ignored. *

      * If the subtype of either Content-Type is the special character '*', * the subtype is ignored during the match. * @param s the RFC 2045 string representation of the Content-Type to match */ public boolean match(String s) { try { return match(new ContentType(s)); } catch (ParseException e) { return false; } } } mail-1.1.2/source/javax/mail/internet/HeaderTokenizer.java0000664000076500007650000002324510614714012023130 0ustar dogdog00000000000000/* * HeaderTokenizer.java * Copyright (C) 2002 The Free Software Foundation * * This file is part of GNU JavaMail, a library. * * GNU JavaMail is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * GNU JavaMail 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * As a special exception, if you link this library with other files to * produce an executable, this library does not by itself cause the * resulting executable to be covered by the GNU General Public License. * This exception does not however invalidate any other reasons why the * executable file might be covered by the GNU General Public License. */ package javax.mail.internet; /** * A lexer for RFC 822 and MIME headers. * * @author Chris Burdess * @version 1.4 */ public class HeaderTokenizer { /** * A token returned by the lexer. These tokens are specified in RFC 822 * and MIME. */ public static class Token { /** * An ATOM. */ public static final int ATOM = -1; /** * A quoted-string. * The value of this token is the string without the quotes. */ public static final int QUOTEDSTRING = -2; /** * A comment. * The value of this token is the comment string without the comment * start and end symbols. */ public static final int COMMENT = -3; /** * The end of the input. */ public static final int EOF = -4; /* * The token type. */ private int type; /* * The value of the token if it is of type ATOM, QUOTEDSTRING, or * COMMENT. */ private String value; /** * Constructor. * @param type the token type * @param value the token value */ public Token(int type, String value) { this.type = type; this.value = value; } /** * Returns the token type. * If the token is a delimiter or a control character, * the type is the integer value of that character. * Otherwise, its value is one of the following: *

        *
      • ATOM: a sequence of ASCII characters delimited by either * SPACE, CTL, '(', '"' or the specified SPECIALS *
      • QUOTEDSTRING: a sequence of ASCII characters within quotes *
      • COMMENT: a sequence of ASCII characters within '(' and ')' *
      • EOF: the end of the header *
      */ public int getType() { return type; } /** * Returns the value of the token. */ public String getValue() { return value; } } /** * RFC 822 specials. */ public static final String RFC822 = "()<>@,;:\\\"\t .[]"; /** * MIME specials. */ public static final String MIME = "()<>@,;:\\\"\t []/?="; /* * The EOF token. */ private static final Token EOF = new Token(Token.EOF, null); /* * The header string to parse. */ private String header; /* * The delimiters. */ private String delimiters; /* * Whather to skip comments. */ private boolean skipComments; /* * The index of the character identified as current for the token() * call. */ private int pos = 0; /* * The index of the character that will be considered current on a call to * next(). */ private int next = 0; /* * The index of the character that will be considered current on a call to * peek(). */ private int peek = 0; private int maxPos; /** * Constructor. * @param header the RFC 822 header to be tokenized * @param delimiters the delimiter characters to be used to delimit ATOMs * @param skipComments whether to skip comments */ public HeaderTokenizer(String header, String delimiters, boolean skipComments) { this.header = (header == null) ? "" : header; this.delimiters = delimiters; this.skipComments = skipComments; pos = next = peek = 0; maxPos = header.length(); } /** * Constructor. * Comments are ignored. * @param header the RFC 822 header to be tokenized * @param delimiters the delimiter characters to be used to delimit ATOMs */ public HeaderTokenizer(String header, String delimiters) { this(header, delimiters, true); } /** * Constructor. * The RFC822-defined delimiters are used to delimit ATOMs. * Comments are ignored. */ public HeaderTokenizer(String header) { this(header, RFC822, true); } /** * Returns the next token. * @return the next token * @exception ParseException if the parse fails */ public Token next() throws ParseException { pos = next; Token token = token(); next = pos; peek = next; return token; } /** * Peeks at the next token. The token will still be available to be read * by next(). * Invoking this method multiple times returns successive tokens, * until next() is called. * @param ParseException if the parse fails */ public Token peek() throws ParseException { pos = peek; Token token = token(); peek = pos; return token; } /** * Returns the rest of the header. */ public String getRemainder() { return header.substring(next); } /* * Returns the next token. */ private Token token() throws ParseException { if (pos >= maxPos) { return EOF; } if (skipWhitespace() == Token.EOF) { return EOF; } boolean needsFilter = false; char c; // comment for (c = header.charAt(pos); c == '('; c = header.charAt(pos)) { int start = ++pos; int parenCount = 1; while (parenCount > 0 && pos < maxPos) { c = header.charAt(pos); if (c == '\\') { pos++; needsFilter = true; } else if (c == '\r') { needsFilter = true; } else if (c == '(') { parenCount++; } else if (c == ')') { parenCount--; } pos++; } if (parenCount != 0) { throw new ParseException("Illegal comment"); } if (!skipComments) { String ret = needsFilter ? filter(header, start, pos - 1) : header.substring(start, pos - 1); return new Token(Token.COMMENT, ret); } if (skipWhitespace() == Token.EOF) { return EOF; } } // quotedstring if (c == '"') { int start = ++pos; while (pos < maxPos) { c = header.charAt(pos); if (c == '\\') { pos++; needsFilter = true; } else if (c == '\r') { needsFilter = true; } else if (c == '"') { pos++; String ret = needsFilter ? filter(header, start, pos - 1) : header.substring(start, pos - 1); return new Token(Token.QUOTEDSTRING, ret); } pos++; } throw new ParseException("Illegal quoted string"); } // delimiter if (c < ' ' || c >= '\177' || delimiters.indexOf(c) >= 0) { pos++; char[] chars = new char[] { c }; return new Token(c, new String(chars)); } // atom int start = pos; while (pos < maxPos) { c = header.charAt(pos); if (c < ' ' || c >= '\177' || c == '(' || c == ' ' || c == '"' || delimiters.indexOf(c) >= 0) { break; } pos++; } return new Token(Token.ATOM, header.substring(start, pos)); } /* * Advance pos over any whitespace delimiters. */ private int skipWhitespace() { while (pos < maxPos) { char c = header.charAt(pos); if (c != ' ' && c != '\t' && c != '\r' && c != '\n') { return pos; } pos++; } return Token.EOF; } /* * Process out CR and backslash (line continuation) bytes. */ private String filter(String s, int start, int end) { StringBuffer buffer = new StringBuffer(); boolean backslash = false; boolean cr = false; for (int i = start; i < end; i++) { char c = s.charAt(i); if (c == '\n' && cr) { cr = false; } else { cr = false; if (!backslash) { if (c == '\\') { backslash = true; } else if (c == '\r') { cr = true; } else { buffer.append(c); } } else { buffer.append(c); backslash = false; } } } return buffer.toString(); } } mail-1.1.2/source/javax/mail/internet/InternetAddress.java0000664000076500007650000007574510614714012023157 0ustar dogdog00000000000000/* * InternetAddress.java * Copyright (C) 2002, 2004 The Free Software Foundation * * This file is part of GNU JavaMail, a library. * * GNU JavaMail is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * GNU JavaMail 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * As a special exception, if you link this library with other files to * produce an executable, this library does not by itself cause the * resulting executable to be covered by the GNU General Public License. * This exception does not however invalidate any other reasons why the * executable file might be covered by the GNU General Public License. */ package javax.mail.internet; import java.io.UnsupportedEncodingException; import java.net.InetAddress; import java.net.UnknownHostException; import java.util.ArrayList; import java.util.StringTokenizer; import javax.mail.Address; import javax.mail.Session; /** * An RFC 822 address. * * @author Chris Burdess * @version 1.4 */ public class InternetAddress extends Address implements Cloneable { /* * The type of address. */ private static final String RFC822 = "rfc822"; /** * The string representation of the address. */ protected String address; /** * The personal name. */ protected String personal; /** * The RFC 2047 encoded version of the personal name. */ protected String encodedPersonal; /** * Constructor for an empty address. */ public InternetAddress() { } /** * Constructor with an RFC 822 string representation of the address. * Note that this parses the address in non-strict mode: this is for * compatibility with implementations and not with the JavaMail * specification. * @param address the address in RFC 822 format * @exception AddressException if the parse failed */ public InternetAddress(String address) throws AddressException { this(address, false); } /** * Constructor with an RFC 822 string representation of the address. * @param address the address in RFC 822 format * @param strict enforce RFC 822 syntax * @exception AddressException if the parse failed * @since JavaMail 1.3 */ public InternetAddress(String address, boolean strict) throws AddressException { InternetAddress[] addresses = parseHeader(address, strict); if (addresses.length != 1) { throw new AddressException("Illegal address", address); } this.address = addresses[0].address; this.personal = addresses[0].personal; this.encodedPersonal = addresses[0].encodedPersonal; if (strict) { validate(address, true, true); } } /** * Constructor with an address and personal name. * The address is assumed to be syntactically valid according to RFC 822. * @param address the address in RFC 822 format * @param personal the personal name */ public InternetAddress(String address, String personal) throws UnsupportedEncodingException { this(address, personal, null); } /** * Construct with an address and personal name. * The address is assumed to be syntactically valid according to RFC 822. * @param address the address in RFC 822 format * @param personal the personal name * @param charset the charset for the personal name */ public InternetAddress(String address, String personal, String charset) throws UnsupportedEncodingException { this.address = address; setPersonal(personal, charset); } /** * Returns a copy of this address. */ public Object clone() { InternetAddress clone = new InternetAddress(); clone.address = this.address; clone.personal = personal; clone.encodedPersonal = encodedPersonal; return clone; } /** * Returns the type of this address. * The type of an InternetAddress is "rfc822". */ public String getType() { return RFC822; } /** * Indicates whether this address is an RFC 822 group address. * Group addresses are not mailing list addresses and are rarely used; * see RFC 822 for details. * @since JavaMail 1.3 */ public boolean isGroup() { int start = address.indexOf(':'); if (start == -1) { return false; } int end = address.length() - 1; return (address.charAt(end) == ';'); } /** * Returns the members of a group address. A group may have any number of * members. If this address is not a group, this method returns * null. * @exception AddressException if a parse error occurs * @since JavaMail 1.3 */ public InternetAddress[] getGroup(boolean strict) throws AddressException { int start = address.indexOf(':'); int end = address.length() - 1; if (start == -1 || address.charAt(end) == ';') { return null; } return parseHeader(address.substring(start + 1, end), strict); } /** * Sets the email address. */ public void setAddress(String address) { this.address = address; } /** * Sets the personal name. * If the name contains non US-ASCII characters, it will be encoded using * the specified charset as per RFC 2047. * @param name the personal name * @param charset the charset to be used for any encoding * @param UnsupportedEncodingException if charset encoding fails */ public void setPersonal(String name, String charset) throws UnsupportedEncodingException { personal = name; if (name != null) { if (charset == null) { encodedPersonal = MimeUtility.encodeWord(name); } else { encodedPersonal = MimeUtility.encodeWord(name, charset, null); } } else { encodedPersonal = null; } } /** * Sets the personal name. * If the name contains non US-ASCII characters, it will be encoded using * the platform default charset. * @param name the personal name * @exception UnsupportedEncodingException if charset encoding fails */ public void setPersonal(String name) throws UnsupportedEncodingException { setPersonal(name, null); } /** * Returns the email address. */ public String getAddress() { return address; } /** * Returns the personal name. */ public String getPersonal() { if (personal != null) { return personal; } if (encodedPersonal != null) { try { personal = MimeUtility.decodeText(encodedPersonal); return personal; } catch (Exception e) { return encodedPersonal; } } return null; } /** * Validate this address according to the syntax rules of RFC 822. * This implementation checks many but not all of the syntax rules. * @exception AddressException if the address is invalid * @since JavaMail 1.3 */ public void validate() throws AddressException { validate(address, true, true); } /** * Returns the RFC 822 / RFC 2047 string representation of this address. * The resulting string contains only US-ASCII characters, * and is therefore mail-safe. */ public String toString() { if (encodedPersonal == null && personal != null) { try { encodedPersonal = MimeUtility.encodeWord(personal); } catch (UnsupportedEncodingException e) { } } StringBuffer buffer = new StringBuffer(); if (encodedPersonal != null) { buffer.append(quote(encodedPersonal)); buffer.append(' '); buffer.append('<'); buffer.append(address); buffer.append('>'); } else if (isGroupAddress(address) || isSimpleAddress(address)) { buffer.append(address); } else { buffer.append('<'); buffer.append(address); buffer.append('>'); } return buffer.toString(); } /** * Returns the RFC 822 string representation of this address. * The returned string may contain unencoded Unicode characters and may * therefore not be mail-safe. */ public String toUnicodeString() { StringBuffer buffer = new StringBuffer(); if (getPersonal() != null) { buffer.append(quote(personal)); buffer.append(' '); buffer.append('<'); buffer.append(address); buffer.append('>'); } else if (isGroupAddress(address) || isSimpleAddress(address)) { buffer.append(address); } else { buffer.append('<'); buffer.append(address); buffer.append('>'); } return buffer.toString(); } /* * Indicates whether this address is simple. */ private static boolean isSimpleAddress(String address) { return (address.indexOf('"') == -1) && (address.indexOf('(') == -1) && (address.indexOf(')') == -1) && (address.indexOf(',') == -1) && (address.indexOf(':') == -1) && (address.indexOf(';') == -1) && (address.indexOf('<') == -1) && (address.indexOf('>') == -1) && (address.indexOf('[') == -1) && (address.indexOf('\\') == -1) && (address.indexOf(']') == -1); } /* * Indicates whether this address is a group address (see RFC 822). */ private static boolean isGroupAddress(String address) { int len = address.length(); return (len > 0 && address.indexOf(':') > 0 && address.charAt(len - 1) == ';'); } public boolean equals(Object other) { if (other instanceof InternetAddress) { String otherAddress = ((InternetAddress) other).getAddress(); return (this == other || (address != null && address.equalsIgnoreCase(otherAddress))); } return false; } public int hashCode() { return (address == null) ? 0 : address.hashCode(); } /** * Converts the given array of InternetAddresses into a comma-separated * sequence of address strings. * The resulting string contains only US-ASCII characters, * and is therefore mail-safe. * @param addresses the InternetAddresses * @exception ClassCastException if any of the specified addresses is not * an InternetAddress */ public static String toString(Address[] addresses) { return toString(addresses, 0); } /** * Converts the given array of InternetAddresses into a comma-separated * sequence of address strings. * The resulting string contains only US-ASCII characters, * and is therefore mail-safe. * @param addresses the InternetAddresses * @param used the number of character positions already used, in the * field into which the address string is to be inserted * @exception ClassCastException if any of the specified addresses is not * an InternetAddress */ public static String toString(Address[] addresses, int used) { if (addresses == null || addresses.length == 0) { return null; } String crlf = "\r\n"; StringBuffer buffer = new StringBuffer(); for (int i = 0; i < addresses.length; i++) { if (i != 0) { buffer.append(", "); used += 2; } String addressText = addresses[i].toString(); int len = addressText.length(); int fl = addressText.indexOf(crlf); // pos of first crlf if (fl < 0) { fl = addressText.length(); } int ll = addressText.lastIndexOf(crlf); // pos of last crlf if ((used + fl) > 76) { buffer.append("\r\n\t"); used = 8; } buffer.append(addressText); used = (ll > -1) ?(used + len) :(len - ll - 2); } return buffer.toString(); } /** * Returns an InternetAddress object representing the current user. * This information is determined from the following locations, in order * of preference: *
        *
      1. the session property mail.from
      2. *
      3. the session properties mail.user or * user.name, and mail.host
      4. *
      5. the system property user.name and the hostname of * localhost as determined by InetAddress.getLocalHost
      6. *
      * @param session the session */ public static InternetAddress getLocalAddress(Session session) { String username = null; String hostname = null; String address = null; try { if (session == null) { username = System.getProperty("user.name"); hostname = InetAddress.getLocalHost().getHostName(); } else { address = session.getProperty("mail.from"); if (address == null) { username = session.getProperty("mail.user"); if (username == null) { username = session.getProperty("user.name"); } if (username == null) { username = System.getProperty("user.name"); } hostname = session.getProperty("mail.host"); if (hostname == null) { InetAddress localhost = InetAddress.getLocalHost(); if (localhost != null) { hostname = localhost.getCanonicalHostName(); } } } } if (address == null && username != null && hostname != null) { StringBuffer buffer = new StringBuffer(); buffer.append(username); buffer.append('@'); buffer.append(hostname); address = buffer.toString(); } if (address != null) { return new InternetAddress(address); } } catch (AddressException e) { } catch (SecurityException e) { } catch (UnknownHostException e) { } return null; } /** * Parses the given comma-separated sequence of RFC 822 addresses into * InternetAddresses. * @param addresslist the comma-separated addresses * @exception AddressException if the parse failed */ public static InternetAddress[] parse(String addresslist) throws AddressException { return parse(addresslist, true); } /** * Parses the given comma-separated sequence of RFC 822 addresses into * InternetAddresses. * If strict is false, simple email addresses separated by * spaces are also allowed. If strict is true, many (but not * all) of the RFC 822 syntax rules are enforced. * Even if strict is true, addresses composed of simple * names (with no "@domain" part) are allowed. * @param addresslist the comma-separated addresses * @param strict whether to enforce RFC 822 syntax * @exception AddressException if the parse failed */ public static InternetAddress[] parse(String addresslist, boolean strict) throws AddressException { return parse(addresslist, strict ? STRICT : NONE); } /** * Parses the given comma-separated sequence of RFC 822 addresses into * InternetAddresses. * If strict is false, simple email addresses separated by * spaces are also allowed. If strict is true, many (but not * all) of the RFC 822 syntax rules are enforced. * @param addresslist the comma-separated addresses * @param strict whether to enforce RFC 822 syntax * @exception AddressException if the parse failed * @since JavaMail 1.3 */ public static InternetAddress[] parseHeader(String addresslist, boolean strict) throws AddressException { return parse(addresslist, strict ? STRICT_OR_LAX : LAX); } private static final int NONE = 0x00; private static final int LAX = 0x01; private static final int STRICT = 0x02; private static final int STRICT_OR_LAX = 0x03; private static InternetAddress[] parse(String addresslist, int rules) throws AddressException { /* * address := mailbox / group ; one addressee, named list * group := phrase ":" [#mailbox] ";" * mailbox := addr-spec / phrase route-addr ; simple address, * ; name & addr-spec * route-addr := "<" [route] addr-spec ">" * route := 1#("@" domain) ":" ; path-relative * addr-spec := local-part "@" domain ; global address * local-part := word *("." word) ; uninterpreted, case-preserved * domain := sub-domain *("." sub-domain) * sub-domain := domain-ref / domain-literal * domain-ref := atom ; symbolic reference */ // NB I have been working on this parse for about 8 hours now. // It is very likely I am starting to lose the plot. // If anyone wants to work on it, I strongly recommend you write some // kind of tokenizer and attack it from that direction. boolean inGroup = false; boolean gotDelimiter = false; boolean inAddress = false; int len = addresslist.length(); int pEnd = -1; int pStart = -1; int start = -1; int end = -1; ArrayList acc = new ArrayList(); int pos; for (pos = 0; pos < len; pos++) { char c = addresslist.charAt(pos); switch (c) { case '\t': case '\n': case '\r': case ' ': break; case '<': // bra-ket delimited address inAddress = true; if (gotDelimiter) { throw new AddressException("Too many route-addr", addresslist, pos); } if (!inGroup) { start = pStart; if (start >= 0) { end = pos; } pStart = pos + 1; } pos++; boolean inQuote = false; boolean gotKet = false; while (pos': if (!inQuote) { gotKet = true; pos--; } break; case '\\': pos++; break; } pos++; } if (!gotKet && pos >= len) { if (inQuote) { throw new AddressException("Unmatched '\"'", addresslist, pos); } throw new AddressException("Unmatched '<'", addresslist, pos); } gotDelimiter = true; pEnd = pos; break; case '>': throw new AddressException("Unmatched '>'", addresslist, pos); case '(': // paren delimited personal inAddress = true; if (pStart >= 0 && pEnd == -1) { pEnd = pos; } if (start == -1) { start = pos + 1; } pos++; int parenCount = 1; while (pos < len && parenCount > 0) { c = addresslist.charAt(pos); switch (c) { case '(': parenCount++; break; case ')': parenCount--; break; case '\\': pos++; break; } pos++; } if (parenCount > 0) { throw new AddressException("Unmatched '('", addresslist, pos); } pos--; if (end == -1) { end = pos; } break; case ')': throw new AddressException("Unmatched ')'", addresslist, pos); case '"': // quote delimited personal inAddress = true; if (pStart == -1) { pStart = pos; } pos++; boolean gotQuote = false; while (pos < len && !gotQuote) { c = addresslist.charAt(pos); switch (c) { case '"': gotQuote = true; pos--; break; case '\\': pos++; break; } pos++; } if (pos >= len) { throw new AddressException("Unmatched '\"'", addresslist, pos); } break; case '[': inAddress = true; pos++; boolean gotBracket = false; while (pos < len && !gotBracket) { c = addresslist.charAt(pos); switch (c) { case ']': gotBracket = true; pos--; break; case '\\': pos++; break; } pos++; } if (pos >= len) { throw new AddressException("Unmatched '['", addresslist, pos); } break; case ',': // address delimiter if (pStart == -1) { gotDelimiter = false; inAddress = false; pEnd = -1; break; } if (inGroup) { break; } if (pEnd == -1) { pEnd = pos; } { String addressText = addresslist.substring(pStart, pEnd); addressText = addressText.trim(); if (inAddress ||(rules | STRICT_OR_LAX) != 0) { if ((rules & STRICT) != 0 ||(rules & LAX) == 0) { validate(addressText, gotDelimiter, false); } InternetAddress address = new InternetAddress(); address.setAddress(addressText); if (start >= 0) { String personal = addresslist.substring(start, end); personal = personal.trim(); address.encodedPersonal = unquote(personal); start = end = -1; } acc.add(address); } else { StringTokenizer st = new StringTokenizer(addressText); while (st.hasMoreTokens()) { addressText = st.nextToken(); validate(addressText, false, false); InternetAddress address = new InternetAddress(); address.setAddress(addressText); acc.add(address); } } } gotDelimiter = false; inAddress = false; pStart = -1; pEnd = -1; break; case ':': // group indicator inAddress = true; if (inGroup) { throw new AddressException("Cannot have nested group", addresslist, pos); } inGroup = true; break; case ';': // group delimiter if (!inGroup) { throw new AddressException("Unexpected ';'", addresslist, pos); } inGroup = false; pEnd = pos + 1; { String addressText = addresslist.substring(pStart, pEnd); addressText = addressText.trim(); InternetAddress address = new InternetAddress(); address.setAddress(addressText); acc.add(address); } gotDelimiter = false; pStart = pEnd = -1; break; default: if (pStart == -1) { pStart = pos; } break; } } if (pStart > -1) { if (pEnd == -1) { pEnd = pos; } String addressText = addresslist.substring(pStart, pEnd); addressText = addressText.trim(); if (inAddress ||(rules | STRICT_OR_LAX) != 0) { if ((rules & STRICT) != 0 ||(rules & LAX) == 0) { validate(addressText, gotDelimiter, false); } InternetAddress address = new InternetAddress(); address.setAddress(addressText); if (start >= 0) { String personal = addresslist.substring(start, end); personal = personal.trim(); address.encodedPersonal = unquote(personal); } acc.add(address); } else { StringTokenizer st = new StringTokenizer(addressText); while (st.hasMoreTokens()) { addressText = st.nextToken(); validate(addressText, false, false); InternetAddress address = new InternetAddress(); address.setAddress(addressText); acc.add(address); } } } InternetAddress[] addresses = new InternetAddress[acc.size()]; acc.toArray(addresses); return addresses; } private static void validate(String address, boolean gotDelimiter, boolean strict) throws AddressException { // TODO What happens about addresses with quoted strings? int pos = 0; if (!strict || gotDelimiter) { int i = address.indexOf(',', pos); if (i < 0) { i = address.indexOf(':', pos); } while (i > -1) { if (address.charAt(pos) != '@') { throw new AddressException("Illegal route-addr", address); } if (address.charAt(i) != ':') { i = address.indexOf(',', pos); if (i < 0) { i = address.indexOf(':', pos); } } else { pos = i + 1; i = -1; } } } // Get atomic parts String localName = address; String domain = null; int atIndex = address.indexOf('@', pos); if (atIndex > -1) { if (atIndex == pos) { throw new AddressException("Missing local name", address); } if (atIndex == address.length() - 1) { throw new AddressException("Missing domain", address); } localName = address.substring(pos, atIndex); domain = address.substring(atIndex + 1); } else if (strict) { throw new AddressException("Missing final @domain", address); } // Check atomic parts String illegalWS = "\t\n\r "; int len = 4; // illegalWS.length() for (int i = 0; i < len; i++) { if (address.indexOf(illegalWS.charAt(i)) > -1) { throw new AddressException("Illegal whitespace", address); } } String illegalName = "\"(),:;<>@[\\]"; len = 12; // illegalName.length() for (int i = 0; i < len; i++) { if (localName.indexOf(illegalName.charAt(i)) > -1) { throw new AddressException("Illegal local name", address); } } if (domain != null) { for (int i = 0; i < len; i++) { if (domain.indexOf(illegalName.charAt(i)) > -1) { throw new AddressException("Illegal domain", address); } } } } /* * The list of characters that need quote-escaping. */ private static final String needsQuoting = "()<>@,;:\\\".[]"; /* * Quote-escapes the specified text. */ private static String quote(String text) { int len = text.length(); boolean needsQuotes = false; for (int i = 0; i < len; i++) { char c = text.charAt(i); if (c=='"' || c=='\\') { StringBuffer buffer = new StringBuffer(len + 3); buffer.append('"'); for (int j = 0; j < len; j++) { c = text.charAt(j); if (c == '"' || c == '\\') { buffer.append('\\'); } buffer.append(c); } buffer.append('"'); return buffer.toString(); } if ((c < ' ' && c != '\r' && c != '\n' && c != '\t') || (c >= '\177') || needsQuoting.indexOf(c ) > -1) { needsQuotes = true; } } if (needsQuotes) { StringBuffer buffer = new StringBuffer(len + 2); buffer.append('"'); buffer.append(text); buffer.append('"'); text = buffer.toString(); } return text; } /* * Un-quote-escapes the specified text. */ private static String unquote(String text) { int len = text.length(); if (len > 2 && text.charAt(0) == '"' && text.charAt(len - 1) == '"') { text = text.substring(1, len - 1); if (text.indexOf('\\') > -1) { len -= 2; StringBuffer buffer = new StringBuffer(len); for (int i = 0; i < len; i++) { char c = text.charAt(i); if (c == '\\' && i <(len - 1)) { c = text.charAt(++i); } buffer.append(c); } text = buffer.toString(); } } return text; } } mail-1.1.2/source/javax/mail/internet/InternetHeaders.java0000664000076500007650000003500410614714012023125 0ustar dogdog00000000000000/* * InternetHeaders.java * Copyright (C) 2002, 2005 The Free Software Foundation * * This file is part of GNU JavaMail, a library. * * GNU JavaMail is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * GNU JavaMail 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * As a special exception, if you link this library with other files to * produce an executable, this library does not by itself cause the * resulting executable to be covered by the GNU General Public License. * This exception does not however invalidate any other reasons why the * executable file might be covered by the GNU General Public License. */ package javax.mail.internet; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; import java.util.Enumeration; import java.util.Iterator; import java.util.List; import java.util.NoSuchElementException; import javax.mail.Header; import javax.mail.MessagingException; import gnu.inet.util.CRLFInputStream; import gnu.inet.util.LineInputStream; /** * A collection of RFC 822 headers. *

      * The string representation of RFC822 and MIME header fields must contain * only US-ASCII characters. Non US-ASCII characters must be encoded as per * the rules in RFC 2047. This class does not enforce those rules; the * caller is expected to use MimeUtility to ensure that header * values are correctly encoded. * * @author Chris Burdess * @version 1.4 */ public class InternetHeaders { /* * The header class that stores raw header lines. */ protected static class InternetHeader extends Header { /** * The name. * @since JavaMail 1.4 */ protected String name; /** * The value. * @since JavaMail 1.4 */ protected String line; public InternetHeader(String line) { super(null, null); int i = line.indexOf(':'); name = (i < 0) ? line.trim() : line.substring(0, i).trim(); this.line = line; } public InternetHeader(String name, String value) { super(null, null); this.name = name; if (value != null) { StringBuffer buffer = new StringBuffer(); buffer.append(name); buffer.append(':'); buffer.append(' '); buffer.append(value); line = buffer.toString(); } } public String getName() { return name; } public String getValue() { int i = line.indexOf(':'); if (i < 0) { return line; } int pos, len = line.length(); for (pos = i + 1; pos < len; pos++) { char c = line.charAt(pos); if (c != ' ' && c != '\t' && c != '\r' && c != '\n') { break; } } return line.substring(pos); } void setValue(String value) { StringBuffer buffer = new StringBuffer(); buffer.append(name); buffer.append(':'); buffer.append(' '); buffer.append(value); line = buffer.toString(); } boolean nameEquals(String other) { return name.equalsIgnoreCase(other); } } /* * The enumeration used to filter headers for the InternetHeaders object. */ static class HeaderEnumeration implements Iterator, Enumeration { private Iterator source; private String[] names; private boolean stringForm; private boolean matching; private InternetHeader nextHeader; HeaderEnumeration(Iterator source, String[] names, boolean stringForm, boolean matching) { this.source = source; this.names = names; this.stringForm = stringForm; this.matching = matching; } /** * Enumeration syntax */ public boolean hasMoreElements() { return hasNext(); } /** * Iterator syntax */ public boolean hasNext() { if (nextHeader == null) { nextHeader = getNext(); } return (nextHeader != null); } /** * Enumeration syntax */ public Object nextElement() { return next(); } /** * Iterator syntax */ public Object next() { if (nextHeader == null) { nextHeader = getNext(); } if (nextHeader == null) { throw new NoSuchElementException(); } InternetHeader header = nextHeader; nextHeader = null; if (stringForm) { return header.line; } return header; } public void remove() { throw new UnsupportedOperationException(); } private InternetHeader getNext() { while (source.hasNext()) { InternetHeader header = (InternetHeader) source.next(); if (header.line == null) { continue; } if (names == null) { return (matching) ? null : header; } for (int i = 0; i < names.length; i++) { if (!header.nameEquals(names[i])) { continue; } if (matching) { return header; } return getNext(); } if (!matching) { return header; } } return null; } } /** * The list of headers. * @since JavaMail 1.4 */ protected List headers = new ArrayList(20); /** * Constructor for an empty InternetHeaders. */ public InternetHeaders() { headers.add(new InternetHeader("Return-Path", null)); headers.add(new InternetHeader("Received", null)); headers.add(new InternetHeader("Message-Id", null)); headers.add(new InternetHeader("Resent-Date", null)); headers.add(new InternetHeader("Date", null)); headers.add(new InternetHeader("Resent-From", null)); headers.add(new InternetHeader("From", null)); headers.add(new InternetHeader("Reply-To", null)); headers.add(new InternetHeader("To", null)); headers.add(new InternetHeader("Subject", null)); headers.add(new InternetHeader("Cc", null)); headers.add(new InternetHeader("In-Reply-To", null)); headers.add(new InternetHeader("Resent-Message-Id", null)); headers.add(new InternetHeader("Errors-To", null)); headers.add(new InternetHeader("Mime-Version", null)); headers.add(new InternetHeader("Content-Type", null)); headers.add(new InternetHeader("Content-Transfer-Encoding", null)); headers.add(new InternetHeader("Content-MD5", null)); headers.add(new InternetHeader("Content-Length", null)); headers.add(new InternetHeader("Status", null)); } /** * Constructor with an RFC 822 message stream. * The stream is parsed up to the blank line separating the headers from * the body, and is left positioned at the start of the body. * @param is an RFC 822 input stream */ public InternetHeaders(InputStream is) throws MessagingException { load(is); } /** * Parses the specified RFC 822 message stream, storing the headers in * this InternetHeaders. * The stream is parsed up to the blank line separating the headers from * the body, and is left positioned at the start of the body. * Note that the headers are added into this InternetHeaders object: * any existing headers in this object are not affected. * @param is an RFC 822 input stream */ public void load(InputStream is) throws MessagingException { LineInputStream in = new LineInputStream(is); try { for (String line = in.readLine(); line != null; line = in.readLine()) { line = trim(line); if (line.length() == 0) { break; } addHeaderLine(line); } } catch (IOException e) { throw new MessagingException("I/O error", e); } } /** * Returns all the values for the specified header. * @param name the header name */ public String[] getHeader(String name) { ArrayList acc = new ArrayList(headers.size()); for (Iterator i = headers.iterator(); i.hasNext(); ) { InternetHeader header = (InternetHeader) i.next(); if (header.nameEquals(name) && header.line != null) { acc.add(header.getValue()); } } int size = acc.size(); if (size == 0) { return null; } String[] h = new String[size]; acc.toArray(h); return h; } /** * Returns all the headers for this header name as a single string, * with headers separated by the given delimiter. * If the delimiter is null, only the first header is returned. * @param name the header name * @param delimiter the delimiter */ public String getHeader(String name, String delimiter) { String[] h = getHeader(name); if (h == null) { return null; } if (delimiter == null || h.length == 1) { return h[0]; } StringBuffer buffer = new StringBuffer(); for(int i = 0; i < h.length; i++) { if (i > 0) { buffer.append(delimiter); } buffer.append(h[i]); } return buffer.toString(); } /** * Sets the specified header. * If existing header lines match the given name, they are all replaced by * the specified value. * @param name the header name * @param value the header value */ public void setHeader(String name, String value) { boolean first = true; for (int i = 0; i < headers.size(); i++) { InternetHeader header = (InternetHeader) headers.get(i); if (header.nameEquals(name)) { if (first) { header.setValue(value); first = false; } else { headers.remove(i); i--; } } } if (first) { addHeader(name, value); } } /** * Adds the specified header. * @param name the header name * @param value the header value */ public void addHeader(String name, String value) { synchronized (headers) { int len = headers.size(); for (int i = len - 1; i >= 0; i--) { InternetHeader header = (InternetHeader) headers.get(i); if (header.nameEquals(name)) { headers.add(i + 1, new InternetHeader(name, value)); return; } if (header.nameEquals(":")) { len = i; } } headers.add(len, new InternetHeader(name, value)); } } /** * Removes all headers matching the given name. * @param name the header name */ public void removeHeader(String name) { synchronized (headers) { int len = headers.size(); for (int i = 0; i < len; i++) { InternetHeader header = (InternetHeader) headers.get(i); if (header.nameEquals(name)) { header.line = null; } } } } /** * Returns all the headers. * @return an Enumeration of Header objects */ public Enumeration getAllHeaders() { return new HeaderEnumeration(headers.iterator(), null, false, false); } /** * Returns all the headers with any of the given names. * @param names the names to match * @return an Enumeration of Header objects */ public Enumeration getMatchingHeaders(String[] names) { return new HeaderEnumeration(headers.iterator(), names, false, true); } /** * Returns all the headers without any of the given names. * @param names the names not to match * @return an Enumeration of Header objects */ public Enumeration getNonMatchingHeaders(String[] names) { return new HeaderEnumeration(headers.iterator(), names, false, false); } /** * Adds an RFC 822 header-line to this InternetHeaders. * If the line starts with a space or tab (a continuation line for a * folded header), adds it to the last header line in the list. * @param line the raw RFC 822 header-line */ public void addHeaderLine(String line) { try { char c = line.charAt(0); if (c == ' ' || c == '\t') // continuation character { int len = headers.size(); InternetHeader header = (InternetHeader) headers.get(len - 1); StringBuffer buffer = new StringBuffer(); buffer.append(header.line); buffer.append("\r\n"); buffer.append(line); header.line = buffer.toString(); } else { synchronized (headers) { headers.add(new InternetHeader(line)); } } } catch (StringIndexOutOfBoundsException e) { } catch (NoSuchElementException e) { } } /** * Returns all the header-lines. * @return an Enumeration of Strings */ public Enumeration getAllHeaderLines() { return new HeaderEnumeration(headers.iterator(), null, true, false); } /** * Returns all the header-lines with any of the given names. * @return an Enumeration of Strings */ public Enumeration getMatchingHeaderLines(String[] names) { return new HeaderEnumeration(headers.iterator(), names, true, true); } /** * Returns all the header-lines without any of the given names. * @return an Enumeration of Strings */ public Enumeration getNonMatchingHeaderLines(String[] names) { return new HeaderEnumeration(headers.iterator(), names, true, false); } private static String trim(String line) { int len = line.length(); if (len > 0 && line.charAt(len - 1) == '\r') { line = line.substring(0, len - 1); } return line; } } mail-1.1.2/source/javax/mail/internet/MailDateFormat.java0000664000076500007650000002336110614714012022675 0ustar dogdog00000000000000/* * MailDateFormat.java * Copyright (C) 2002 The Free Software Foundation * * This file is part of GNU JavaMail, a library. * * GNU JavaMail is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * GNU JavaMail 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * As a special exception, if you link this library with other files to * produce an executable, this library does not by itself cause the * resulting executable to be covered by the GNU General Public License. * This exception does not however invalidate any other reasons why the * executable file might be covered by the GNU General Public License. */ package javax.mail.internet; import java.io.PrintStream; import java.text.DecimalFormat; import java.text.FieldPosition; import java.text.NumberFormat; import java.text.ParsePosition; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; import java.util.GregorianCalendar; import java.util.TimeZone; /** * A date format that applies the rules specified by the Internet Draft * draft-ietf-drums-msg-fmt-08 dated January 26, 2000. *

      * This class cannot take pattern strings. It always formats the date * based on the above specification. * * @author Chris Burdess * @version 1.4 */ public class MailDateFormat extends SimpleDateFormat { private static final String[] DAYS_OF_WEEK = { null, "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" }; private static final String[] MONTHS = { "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" }; public MailDateFormat() { //super("EEE, d MMM yyyy HH:mm:ss 'ZZZZZ'", Locale.US); calendar = new GregorianCalendar(TimeZone.getTimeZone("GMT")); numberFormat = new DecimalFormat(); } /** * Appends the string representation for the specified field to the * given string buffer. This method should be avoided, use * format(Date) instead. * @param date the date * @param buf the buffer to append to * @param field the current field position * @return the modified buffer */ public StringBuffer format(Date date, StringBuffer buf, FieldPosition field) { calendar.clear(); calendar.setTime(date); buf.setLength(0); // Day of week buf.append(DAYS_OF_WEEK[calendar.get(Calendar.DAY_OF_WEEK)]); buf.append(','); buf.append(' '); // Day of month buf.append(Integer.toString(calendar.get(Calendar.DAY_OF_MONTH))); buf.append(' '); // Month buf.append(MONTHS[calendar.get(Calendar.MONTH)]); buf.append(' '); // Year int year = calendar.get(Calendar.YEAR); if (year < 1000) { buf.append('0'); if (year < 100) { buf.append('0'); if (year < 10) { buf.append('0'); } } } buf.append(Integer.toString(year)); buf.append(' '); // Hour int hour = calendar.get(Calendar.HOUR_OF_DAY); buf.append(Character.forDigit(hour / 10, 10)); buf.append(Character.forDigit(hour % 10, 10)); buf.append(':'); // Minute int minute = calendar.get(Calendar.MINUTE); buf.append(Character.forDigit(minute / 10, 10)); buf.append(Character.forDigit(minute % 10, 10)); buf.append(':'); // Second int second = calendar.get(Calendar.SECOND); buf.append(Character.forDigit(second / 10, 10)); buf.append(Character.forDigit(second % 10, 10)); buf.append(' '); // Timezone // Get time offset in minutes int zoneOffset = (calendar.get(Calendar.ZONE_OFFSET) + calendar.get(Calendar.DST_OFFSET)) / 60000; // Apply + or - appropriately if (zoneOffset < 0) { zoneOffset = -zoneOffset; buf.append('-'); } else { buf.append('+'); } // Set the 2 2-char fields as specified above int tzhours = zoneOffset / 60; buf.append(Character.forDigit(tzhours / 10, 10)); buf.append(Character.forDigit(tzhours % 10, 10)); int tzminutes = zoneOffset % 60; buf.append(Character.forDigit(tzminutes / 10, 10)); buf.append(Character.forDigit(tzminutes % 10, 10)); field.setBeginIndex(0); field.setEndIndex(buf.length()); return buf; } /** * Parses the given date in the format specified by * draft-ietf-drums-msg-fmt-08 in the current TimeZone. * @param text the formatted date to be parsed * @param pos the current parse position */ public Date parse(String text, ParsePosition pos) { int start = 0, end = -1; int len = text.length(); calendar.clear(); pos.setIndex(start); try { // Advance to date if (Character.isLetter(text.charAt(start))) { start = skipNonWhitespace(text, start, len); } start = skipWhitespace(text, start, len); pos.setIndex(start); end = skipNonWhitespace(text, start + 1, len); int date = Integer.parseInt(text.substring(start, end)); // Advance to month start = skipWhitespace(text, end + 1, len); pos.setIndex(start); end = skipNonWhitespace(text, start + 1, len); String monthText = text.substring(start, end); int month = -1; for (int i = 0; i < 12; i++) { if (MONTHS[i].equals(monthText)) { month = i; break; } } if (month == -1) { pos.setErrorIndex(end); return null; } // Advance to year start = skipWhitespace(text, end + 1, len); pos.setIndex(start); end = skipNonWhitespace(text, start + 1, len); int year = Integer.parseInt(text.substring(start, end)); calendar.set(Calendar.YEAR, year); calendar.set(Calendar.MONTH, month); calendar.set(Calendar.DAY_OF_MONTH, date); // Advance to hour start = skipWhitespace(text, end + 1, len); pos.setIndex(start); end = skipToColon(text, start + 1, len); int hour = Integer.parseInt(text.substring(start, end)); calendar.set(Calendar.HOUR, hour); // Advance to minute start = end + 1; pos.setIndex(start); end = skipToColon(text, start + 1, len); int minute = Integer.parseInt(text.substring(start, end)); calendar.set(Calendar.MINUTE, minute); // Advance to second start = end + 1; pos.setIndex(start); end = skipNonWhitespace(text, start + 1, len); int second = Integer.parseInt(text.substring(start, end)); calendar.set(Calendar.SECOND, second); if (end != len) { start = skipWhitespace(text, end + 1, len); if (start != len) { // Trailing characters, therefore timezone end = skipNonWhitespace(text, start + 1, len); char pm = text.charAt(start); if (Character.isLetter(pm)) { TimeZone tz = TimeZone.getTimeZone(text.substring(start, end)); calendar.set(Calendar.ZONE_OFFSET, tz.getRawOffset()); } else { int zoneOffset = 0; zoneOffset += 600 * Character.digit(text.charAt(++start), 10); zoneOffset += 60 * Character.digit(text.charAt(++start), 10); zoneOffset += 10 * Character.digit(text.charAt(++start), 10); zoneOffset += Character.digit(text.charAt(++start), 10); zoneOffset *= 60000; // minutes -> ms if ('-' == pm) { zoneOffset = -zoneOffset; } calendar.set(Calendar.ZONE_OFFSET, zoneOffset); } } } pos.setIndex(end); return calendar.getTime(); } catch (NumberFormatException e) { pos.setErrorIndex(Math.max(start, end)); } catch (StringIndexOutOfBoundsException e) { pos.setErrorIndex(Math.max(start, end)); } return null; } private int skipWhitespace(final String text, int pos, final int len) { while (pos < len && Character.isWhitespace(text.charAt(pos))) { pos++; } return pos; } private int skipNonWhitespace(final String text, int pos, final int len) { while (pos < len && !Character.isWhitespace(text.charAt(pos))) { pos++; } return pos; } private int skipToColon(final String text, int pos, final int len) { while (pos < len && text.charAt(pos) != ':') { pos++; } return pos; } /** * Don't allow setting the calendar. */ public void setCalendar(Calendar newCalendar) { throw new UnsupportedOperationException(); } /** * Don't allow setting the NumberFormat. */ public void setNumberFormat(NumberFormat newNumberFormat) { throw new UnsupportedOperationException(); } } mail-1.1.2/source/javax/mail/internet/MimeBodyPart.java0000664000076500007650000010031410614714012022372 0ustar dogdog00000000000000/* * MimeBodyPart.java * Copyright (C) 2002, 2004, 2005 The Free Software Foundation * * This file is part of GNU JavaMail, a library. * * GNU JavaMail is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * GNU JavaMail 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * As a special exception, if you link this library with other files to * produce an executable, this library does not by itself cause the * resulting executable to be covered by the GNU General Public License. * This exception does not however invalidate any other reasons why the * executable file might be covered by the GNU General Public License. */ package javax.mail.internet; import java.io.BufferedInputStream; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.InputStream; import java.io.IOException; import java.io.OutputStream; import java.io.UnsupportedEncodingException; import java.security.AccessController; import java.security.PrivilegedAction; import java.util.ArrayList; import java.util.Enumeration; import java.util.StringTokenizer; import javax.activation.DataHandler; import javax.activation.FileTypeMap; import javax.mail.BodyPart; import javax.mail.MessagingException; import javax.mail.Multipart; import gnu.inet.util.GetSystemPropertyAction; import gnu.mail.util.RFC2822OutputStream; /** * A MIME body part. * Body parts are components of multipart parts. *

      * The string representation of RFC822 and MIME header fields must contain * only US-ASCII characters. Non US-ASCII characters must be encoded as per * the rules in RFC 2047. This class does not enforce those rules; the * caller is expected to use MimeUtility to ensure that header * values are correctly encoded. * * @author Chris Burdess * @version 1.4 */ public class MimeBodyPart extends BodyPart implements MimePart { /** * The data handler managing this part's content. */ protected DataHandler dh; /** * The bytes of the content of this part, if the part can be stored in * memory. */ protected byte[] content; /** * A SharedInputStream containing the bytes of this part, if it cannot be * stored in memory. */ protected InputStream contentStream; /** * The headers of this body part. */ protected InternetHeaders headers; /* * These constants are also referenced by MimeMessage. */ static final String CONTENT_TYPE_NAME = "Content-Type"; static final String CONTENT_DISPOSITION_NAME = "Content-Disposition"; static final String CONTENT_TRANSFER_ENCODING_NAME = "Content-Transfer-Encoding"; static final String CONTENT_ID_NAME = "Content-ID"; static final String CONTENT_MD5_NAME = "Content-MD5"; static final String CONTENT_LANGUAGE_NAME = "Content-Language"; static final String CONTENT_DESCRIPTION_NAME = "Content-Description"; static final String TEXT_PLAIN = "text/plain"; /** * Constructor for an empty MIME body part. */ public MimeBodyPart() { headers = new InternetHeaders(); } /** * Constructor with an input stream. * The stream must be positioned at the start of a valid MIME body part * and terminate at the end of that body part: the boundary string must * not be included in the stream. * @param is the input stream */ public MimeBodyPart(InputStream is) throws MessagingException { if (is instanceof SharedInputStream) { headers = new InternetHeaders(is); SharedInputStream sis = (SharedInputStream) is; contentStream = sis.newStream(sis.getPosition(), -1L); return; } // Buffer the stream if necessary if (!(is instanceof ByteArrayInputStream) && !(is instanceof BufferedInputStream)) { is = new BufferedInputStream(is); } // Read the headers headers = new InternetHeaders(is); // Read stream into byte array(see MimeMessage.parse()) try { // TODO Make buffer size configurable int len = 1024; if (is instanceof ByteArrayInputStream) { len = is.available(); content = new byte[len]; is.read(content, 0, len); } else { ByteArrayOutputStream bos = new ByteArrayOutputStream(len); byte[] b = new byte[len]; for (int l = is.read(b); l != -1; l = is.read(b)) { bos.write(b, 0, l); } content = bos.toByteArray(); } } catch (IOException e) { throw new MessagingException("I/O error", e); } } /** * Constructor with headers and byte content. * @param headers the header * @param content the byte content of this part */ public MimeBodyPart(InternetHeaders headers, byte[] content) throws MessagingException { this.headers = headers; this.content = content; } /** * Returns the size of the content of this body part in bytes, or -1 if * the size cannot be determined. *

      * Note that this number may not be an exact measure, but if not -1, it * will be suitable for display to the user. */ public int getSize() throws MessagingException { if (content != null) { return content.length; } if (contentStream != null) { try { int len = contentStream.available(); if (len > 0) { return len; } } catch (IOException e) { } } return -1; } /** * Returns the number of lines in the content of this body part, or -1 if * this number cannot be determined. *

      * Note that this number may not be an exact measure, but if not -1, it * will be suitable for display to the user. */ public int getLineCount() throws MessagingException { return -1; } /** * Returns the value of the RFC 822 Content-Type header field, or * "text/plain" if the header is not available. */ public String getContentType() throws MessagingException { String contentType = getHeader(CONTENT_TYPE_NAME, null); if (contentType == null) { contentType = TEXT_PLAIN; } return contentType; } /** * Indicates whether this part is of the specified MIME type. *

      * If the subtype of mimeType is the special character '*', * the subtype is ignored during the comparison. */ public boolean isMimeType(String mimeType) throws MessagingException { String contentType = getContentType(); try { return (new ContentType(contentType).match(mimeType)); } catch (ParseException e) { return (getContentType().equalsIgnoreCase(mimeType)); } } /** * Returns the value of the RFC 822 Content-Disposition header field, or * null if the header is not available. */ public String getDisposition() throws MessagingException { String disposition = getHeader(CONTENT_DISPOSITION_NAME, null); if (disposition != null) { return new ContentDisposition(disposition).getDisposition(); } return null; } /** * Sets the Content-Disposition header field of this part. * @exception IllegalWriteException if the underlying implementation * does not support modification * @exception IllegalStateException if this body part is obtained * from a READ_ONLY folder */ public void setDisposition(String disposition) throws MessagingException { if (disposition == null) { removeHeader(CONTENT_DISPOSITION_NAME); } else { String value = getHeader(CONTENT_DISPOSITION_NAME, null); if (value != null) { ContentDisposition cd = new ContentDisposition(value); cd.setDisposition(disposition); disposition = cd.toString(); } setHeader(CONTENT_DISPOSITION_NAME, disposition); } } /** * Returns the value of the Content-Transfer-Encoding header field. */ public String getEncoding() throws MessagingException { String encoding = getHeader(CONTENT_TRANSFER_ENCODING_NAME, null); if (encoding != null) { encoding = encoding.trim(); if (encoding.equalsIgnoreCase("7bit") || encoding.equalsIgnoreCase("8bit") || encoding.equalsIgnoreCase("quoted-printable") || encoding.equalsIgnoreCase("base64")) { return encoding; } HeaderTokenizer ht = new HeaderTokenizer(encoding, HeaderTokenizer.MIME); for (boolean done = false; !done; ) { HeaderTokenizer.Token token = ht.next(); switch (token.getType()) { case HeaderTokenizer.Token.EOF: done = true; break; case HeaderTokenizer.Token.ATOM: return token.getValue(); } } return encoding; } return null; } /** * Returns the value of the Content-ID header field. */ public String getContentID() throws MessagingException { return getHeader(CONTENT_ID_NAME, null); } /** * Sets the Content-ID header field of this part. * @exception IllegalWriteException if the underlying implementation * does not support modification * @exception IllegalStateException if this body part is obtained * from a READ_ONLY folder * @since JavaMail 1.3 */ public void setContentID(String cid) throws MessagingException { if (cid == null) { removeHeader(CONTENT_ID_NAME); } else { setHeader(CONTENT_ID_NAME, cid); } } /** * Returns the value of the Content-MD5 header field. */ public String getContentMD5() throws MessagingException { return getHeader(CONTENT_MD5_NAME, null); } /** * Sets the Content-MD5 header field of this part. * @exception IllegalWriteException if the underlying implementation * does not support modification * @exception IllegalStateException if this body part is obtained * from a READ_ONLY folder */ public void setContentMD5(String md5) throws MessagingException { setHeader(CONTENT_MD5_NAME, md5); } /** * Returns the languages specified in the Content-Language header of this * part, as defined by RFC 1766. This method returns null if * this header is not available. */ public String[] getContentLanguage() throws MessagingException { String header = getHeader(CONTENT_LANGUAGE_NAME, null); if (header != null) { HeaderTokenizer ht = new HeaderTokenizer(header, HeaderTokenizer.MIME); ArrayList acc = new ArrayList(); for (boolean done = false; !done; ) { HeaderTokenizer.Token token = ht.next(); switch (token.getType()) { case HeaderTokenizer.Token.EOF: done = true; break; case HeaderTokenizer.Token.ATOM: acc.add(token.getValue()); break; } } if (acc.size() > 0) { String[] languages = new String[acc.size()]; acc.toArray(languages); return languages; } } return null; } /** * Sets the Content-Language header of this part. * @param languages the array of language tags * @exception IllegalWriteException if the underlying implementation * does not support modification * @exception IllegalStateException if this body part is obtained * from a READ_ONLY folder */ public void setContentLanguage(String[] languages) throws MessagingException { if (languages != null && languages.length > 0) { StringBuffer buffer = new StringBuffer(); buffer.append(languages[0]); for (int i = 1; i < languages.length; i++) { buffer.append(','); buffer.append(languages[i]); } setHeader(CONTENT_LANGUAGE_NAME, buffer.toString()); } else { setHeader(CONTENT_LANGUAGE_NAME, null); } } /** * Returns the Content-Description header field of this part. *

      * If the Content-Description field is encoded as per RFC 2047, * it is decoded and converted into Unicode. */ public String getDescription() throws MessagingException { String header = getHeader(CONTENT_DESCRIPTION_NAME, null); if (header != null) { try { return MimeUtility.decodeText(header); } catch (UnsupportedEncodingException e) { return header; } } return null; } /** * Sets the Content-Description header field for this part. *

      * If description contains non US-ASCII characters, it will * be encoded using the platform default charset. * @param description the content description * @exception IllegalWriteException if the underlying implementation * does not support modification * @exception IllegalStateException if this body part is obtained * from a READ_ONLY folder */ public void setDescription(String description) throws MessagingException { setDescription(description, null); } /** * Sets the Content-Description header field for this part. *

      * If description contains non US-ASCII characters, it will * be encoded using the specified charset. * @param description the content description * @param charset the charset used for encoding * @exception IllegalWriteException if the underlying implementation * does not support modification * @exception IllegalStateException if this body part is obtained * from a READ_ONLY folder */ public void setDescription(String description, String charset) throws MessagingException { if (description != null) { try { setHeader(CONTENT_DESCRIPTION_NAME, MimeUtility.encodeText(description, charset, null)); } catch (UnsupportedEncodingException e) { throw new MessagingException("Encode error", e); } } else { removeHeader(CONTENT_DESCRIPTION_NAME); } } /** * Returns the filename associated with this body part. *

      * This method returns the value of the "filename" parameter from the * Content-Disposition header field. * If the latter is not available, it returns the value of the "name" * parameter from the Content-Type header field. */ public String getFileName() throws MessagingException { String filename = null; String header = getHeader(CONTENT_DISPOSITION_NAME, null); if (header != null) { ContentDisposition cd = new ContentDisposition(header); filename = cd.getParameter("filename"); } if (filename == null) { header = getHeader(CONTENT_TYPE_NAME, null); if (header != null) { try { ContentType contentType = new ContentType(header); filename = contentType.getParameter("name"); } catch (ParseException e) { } } } PrivilegedAction a = new GetSystemPropertyAction("mail.mime.decodefilename"); if ("true".equals(AccessController.doPrivileged(a))) { try { filename = MimeUtility.decodeText(filename); } catch (UnsupportedEncodingException e) { throw new MessagingException(e.getMessage(), e); } } return filename; } /** * Sets the filename associated with this body part. * @exception IllegalWriteException if the underlying implementation * does not support modification * @exception IllegalStateException if this body part is obtained * from a READ_ONLY folder */ public void setFileName(String filename) throws MessagingException { PrivilegedAction a = new GetSystemPropertyAction("mail.mime.encodefilename"); if ("true".equals(AccessController.doPrivileged(a))) { try { filename = MimeUtility.encodeText(filename); } catch (UnsupportedEncodingException e) { throw new MessagingException(e.getMessage(), e); } } String header = getHeader(CONTENT_DISPOSITION_NAME, null); if (header == null) { header = "attachment"; } ContentDisposition cd = new ContentDisposition(header); cd.setParameter("filename", filename); setHeader(CONTENT_DISPOSITION_NAME, cd.toString()); // We will also set the "name" parameter of the Content-Type field // to preserve compatibility with nonconformant MUAs header = getHeader(CONTENT_TYPE_NAME, null); if (header == null) { DataHandler dh0 = getDataHandler(); if (dh0 != null) header = dh0.getContentType(); else header = "text/plain"; } try { ContentType contentType = new ContentType(header); contentType.setParameter("name", filename); setHeader(CONTENT_TYPE_NAME, contentType.toString()); } catch (ParseException e) { } } /** * Returns a decoded input stream for this part's content. * @exception IOException if an error occurs in the data handler layer */ public InputStream getInputStream() throws IOException, MessagingException { return getDataHandler().getInputStream(); } /** * Returns the unencoded bytes of the content. */ protected InputStream getContentStream() throws MessagingException { if (contentStream != null) { return ((SharedInputStream) contentStream).newStream(0L, -1L); } if (content != null) { return new ByteArrayInputStream(content); } throw new MessagingException("No content"); } /** * Returns the unencoded bytes of the content without applying any * content transfer decoding. */ public InputStream getRawInputStream() throws MessagingException { return getContentStream(); } /** * Returns a data handler for accessing this part's content. */ public DataHandler getDataHandler() throws MessagingException { if (dh == null) { dh = new DataHandler(new MimePartDataSource(this)); } return dh; } /** * Returns this part's content as a Java object. * @exception IOException if an error occurred in the data handler layer */ public Object getContent() throws IOException, MessagingException { return getDataHandler().getContent(); } /** * Sets the content of this part using the specified data handler. * @exception IllegalWriteException if the underlying implementation * does not support modification * @exception IllegalStateException if this body part is obtained * from a READ_ONLY folder */ public void setDataHandler(DataHandler dh) throws MessagingException { this.dh = dh; // The Content-Type and Content-Transfer-Encoding headers may need to be // recalculated by the new DataHandler - see updateHeaders() removeHeader(CONTENT_TYPE_NAME); removeHeader(CONTENT_TRANSFER_ENCODING_NAME); } /** * Sets the content of this part using the specified Java object and MIME * type. Note that a data content handler for the MIME type must be * installed and accept objects of the type given. * @param o the content object * @param type the MIME type of the object * @exception IllegalWriteException if the underlying implementation * does not support modification * @exception IllegalStateException if this body part is obtained * from a READ_ONLY folder */ public void setContent(Object o, String type) throws MessagingException { if (o instanceof Multipart) { setContent((Multipart) o); } else { setDataHandler(new DataHandler(o, type)); } } /** * Sets the content of this part using the specified text, and with a * MIME type of "text/plain". *

      * If the text contains non US-ASCII characters, it will be encoded * using the platform default charset. * @param text the text content */ public void setText(String text) throws MessagingException { setText(text, null, "plain"); } /** * Sets the content of this part using the specified text, and with a * MIME type of "text/plain". *

      * If the text contains non US-ASCII characters, it will be encoded * using the specified charset. * @param text the text content * @param charset the charset used for any encoding */ public void setText(String text, String charset) throws MessagingException { setText(text, charset, "plain"); } /** * Sets the content of this part using the specified text, and with a * text MIME type of the specified subtype. *

      * If the text contains non US-ASCII characters, it will be encoded * using the specified charset. * @param text the text content * @param charset the charset used for any encoding * @param subtype the MIME text subtype (e.g. "plain", "html") * @since JavaMail 1.4 */ public void setText(String text, String charset, String subtype) throws MessagingException { if (charset == null) { // According to the API doc for getText(String), we may have to scan // the characters to determine the charset. // However this should work just as well and is hopefully relatively // cheap. charset = MimeUtility.mimeCharset(MimeUtility.getDefaultJavaCharset()); } if (subtype == null || "".equals(subtype)) subtype = "plain"; StringBuffer buffer = new StringBuffer(); buffer.append("text/").append(subtype).append("; charset="); buffer.append(MimeUtility.quote(charset, HeaderTokenizer.MIME)); setContent(text, buffer.toString()); } /** * Sets the content of this part to be the specified multipart. * @param mp the multipart content * @exception IllegalWriteException if the underlying implementation * does not support modification * @exception IllegalStateException if this body part is obtained * from a READ_ONLY folder */ public void setContent(Multipart mp) throws MessagingException { setDataHandler(new DataHandler(mp, mp.getContentType())); // Ensure component hierarchy mp.setParent(this); } /** * Writes this body part to the specified stream in RFC 822 format. * @exception IOException if an error occurs writing to the stream or in * the data handler layer */ public void writeTo(OutputStream os) throws IOException, MessagingException { final String charset = "US-ASCII"; final byte[] sep = { 0x0d, 0x0a }; // Write the headers for (Enumeration e = getAllHeaderLines(); e.hasMoreElements(); ) { String line = (String) e.nextElement(); StringTokenizer st = new StringTokenizer(line, "\r\n"); int count = 0; while (st.hasMoreTokens()) { String line2 = st.nextToken(); if (count > 0 && line2.charAt(0) != '\t') { // Folded line must start with tab os.write(0x09); } /* * RFC 2822, section 2.1 states that each line should be no more * than 998 characters. * Ensure that any headers we emit have no lines longer than * this by folding the line. */ int max = (count > 0) ? 997 : 998; while (line2.length() > max) { String left = line2.substring(0, max); byte[] bytes = left.getBytes(charset); os.write(bytes); os.write(sep); os.write(0x09); line2 = line2.substring(max); max = 997; // make space for the tab } byte[] bytes = line2.getBytes(charset); os.write(bytes); os.write(sep); count++; } } os.write(sep); os.flush(); // Write the content os = MimeUtility.encode(os, getEncoding()); getDataHandler().writeTo(os); os.flush(); } /** * Returns all the values for the specified header name. * Note that headers may be encoded as per RFC 2047 if they contain * non-US-ASCII characters: these should be decoded. * @param name the header name */ public String[] getHeader(String name) throws MessagingException { return headers.getHeader(name); } /** * Returns all the values for the specified header name as a single * string, with headers separated by the given delimiter. * If the delimiter is null, only the first header is * returned. * @param name the header name * @param delimiter the delimiter */ public String getHeader(String name, String delimiter) throws MessagingException { return headers.getHeader(name, delimiter); } /** * Sets the specified header. * @param name the header name * @param value the header value * @exception IllegalWriteException if the underlying implementation * does not support modification * @exception IllegalStateException if this body part is obtained * from a READ_ONLY folder */ public void setHeader(String name, String value) throws MessagingException { headers.setHeader(name, value); } /** * Adds the specified header. * @param name the header name * @param value the header value * @exception IllegalWriteException if the underlying implementation * does not support modification * @exception IllegalStateException if this body part is obtained * from a READ_ONLY folder */ public void addHeader(String name, String value) throws MessagingException { headers.addHeader(name, value); } /** * Removes all headers with the specified name. * @param name the header name * @exception IllegalWriteException if the underlying implementation * does not support modification * @exception IllegalStateException if this body part is obtained * from a READ_ONLY folder */ public void removeHeader(String name) throws MessagingException { headers.removeHeader(name); } /** * Returns all the headers. * @return an Enumeration of Header objects */ public Enumeration getAllHeaders() throws MessagingException { return headers.getAllHeaders(); } /** * Returns all the headers with any of the given names. * @return an Enumeration of Header objects */ public Enumeration getMatchingHeaders(String[] names) throws MessagingException { return headers.getMatchingHeaders(names); } /** * Returns all the headers without any of the given names. * @return an Enumeration of Header objects */ public Enumeration getNonMatchingHeaders(String[] names) throws MessagingException { return headers.getNonMatchingHeaders(names); } /** * Adds an RFC 822 header-line to this part. * @exception IllegalWriteException if the underlying implementation * does not support modification * @exception IllegalStateException if this body part is obtained * from a READ_ONLY folder */ public void addHeaderLine(String line) throws MessagingException { headers.addHeaderLine(line); } /** * Returns all the header-lines. * @return an Enumeration of Strings */ public Enumeration getAllHeaderLines() throws MessagingException { return headers.getAllHeaderLines(); } /** * Returns all the header-lines with any of the given names. * @return an Enumeration of Strings */ public Enumeration getMatchingHeaderLines(String[] names) throws MessagingException { return headers.getMatchingHeaderLines(names); } /** * Returns all the header-lines without any of the given names. * @return an Enumeration of Strings */ public Enumeration getNonMatchingHeaderLines(String[] names) throws MessagingException { return headers.getNonMatchingHeaderLines(names); } /** * Updates the headers of this part, based on the content. * @exception IllegalWriteException if the underlying implementation * does not support modification * @exception IllegalStateException if this body part is obtained * from a READ_ONLY folder */ protected void updateHeaders() throws MessagingException { if (getDataHandler() != null) { try { String contentType = dh.getContentType(); ContentType ct = new ContentType(contentType); if (ct.match("multipart/*")) { MimeMultipart mmp = (MimeMultipart) dh.getContent(); mmp.updateHeaders(); } else if (ct.match("message/rfc822")) { } else { // Update Content-Transfer-Encoding if (getHeader(CONTENT_TRANSFER_ENCODING_NAME) == null) { setHeader(CONTENT_TRANSFER_ENCODING_NAME, MimeUtility.getEncoding(dh)); } } // Update Content-Type if nonexistent, // and Content-Type "name" with Content-Disposition "filename" // parameter(see setFilename()) if (getHeader(CONTENT_TYPE_NAME) == null) { String disposition = getHeader(CONTENT_DISPOSITION_NAME, null); if (disposition != null) { ContentDisposition cd = new ContentDisposition(disposition); String filename = cd.getParameter("filename"); if (filename != null) { ct.setParameter("name", filename); contentType = ct.toString(); } } setHeader(CONTENT_TYPE_NAME, contentType); } } catch (IOException e) { throw new MessagingException("I/O error", e); } } } /** * Use the specified file as the content for this part. * @param file the file * @since JavaMail 1.4 */ public void attachFile(File file) throws IOException, MessagingException { FileTypeMap map = FileTypeMap.getDefaultFileTypeMap(); String contentType = map.getContentType(file); if (contentType == null) throw new MessagingException("Unable to determine MIME type of " + file); setContent(new FileInputStream(file), contentType); setFileName(file.getName()); } /** * Use the specified file as the content for this part. * @param file the file * @since JavaMail 1.4 */ public void attachFile(String file) throws IOException, MessagingException { attachFile(new File(file)); } /** * Saves the content of this part to the specified file. * @param file the file * @since JavaMail 1.4 */ public void saveFile(File file) throws IOException, MessagingException { OutputStream out = new FileOutputStream(file); try { out = MimeUtility.encode(out, getEncoding()); getDataHandler().writeTo(out); out.flush(); } finally { out.close(); } } /** * Saves the content of this part to the specified file. * @param file the file * @since JavaMail 1.4 */ public void saveFile(String file) throws IOException, MessagingException { saveFile(new File(file)); } } mail-1.1.2/source/javax/mail/internet/MimeMessage.java0000664000076500007650000015754110614714012022250 0ustar dogdog00000000000000/* * MimeMessage.java * Copyright (C) 2002, 2004, 2005 The Free Software Foundation * * This file is part of GNU JavaMail, a library. * * GNU JavaMail is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * GNU JavaMail 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * As a special exception, if you link this library with other files to * produce an executable, this library does not by itself cause the * resulting executable to be covered by the GNU General Public License. * This exception does not however invalidate any other reasons why the * executable file might be covered by the GNU General Public License. */ package javax.mail.internet; import java.io.BufferedInputStream; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.InputStream; import java.io.IOException; import java.io.ObjectStreamException; import java.io.OutputStream; import java.io.UnsupportedEncodingException; import java.security.AccessController; import java.security.PrivilegedAction; import java.text.DateFormat; import java.text.ParseException; import java.util.ArrayList; import java.util.Arrays; import java.util.Date; import java.util.Enumeration; import java.util.HashSet; import java.util.StringTokenizer; import javax.activation.DataHandler; import javax.mail.Address; import javax.mail.Flags; import javax.mail.Folder; import javax.mail.Message; import javax.mail.MessagingException; import javax.mail.Multipart; import javax.mail.Session; import gnu.inet.util.GetSystemPropertyAction; import gnu.mail.util.RFC2822OutputStream; /** * A MIME mail message. * This may be a top-level part, or the content of a MIME body part with a * "message/rfc822" Content-Type. *

      * The string representation of RFC822 and MIME header fields must contain * only US-ASCII characters. Non US-ASCII characters must be encoded as per * the rules in RFC 2047. This class does not enforce those rules; the * caller is expected to use MimeUtility to ensure that header * values are correctly encoded. * * @author Chris Burdess * @version 1.4 */ public class MimeMessage extends Message implements MimePart { /** * Additional recipient types specific to internet messages. */ public static class RecipientType extends Message.RecipientType { /** * The "Newsgroups" (Usenet news) recipient type. */ public static final RecipientType NEWSGROUPS = new RecipientType("Newsgroups"); protected Object readResolve() throws ObjectStreamException { if (type.equals("Newsgroups")) { return NEWSGROUPS; } return super.readResolve(); } // super :-) protected RecipientType(String type) { super(type); } } /** * The data handler managing this message's content. */ protected DataHandler dh; /** * The bytes of the content of this message, if the message can be stored * in memory. */ protected byte content[]; /** * A SharedInputStream containing the byte content of this message, if the * message cannot be stored in memory. */ protected InputStream contentStream; /** * The message headers. */ protected InternetHeaders headers; /** * The message flags. */ protected Flags flags; /** * Indicates whether the message has been modified. * If false, any data in the content array is assumed to be valid and is * used directly in the writeTo method. * This field is set to true when an empty message is created or when the * saveChanges method is called. */ protected boolean modified; /** * Indicates whether we do not need to call saveChanges on * the message. * This flag is set to false by the public constructor and set to true * by the saveChanges method. * The writeTo method checks this flag and calls the * saveChanges method as necessary. */ protected boolean saved; /* * This is used to parse and format values for the RFC822 Date header. */ private static MailDateFormat dateFormat = new MailDateFormat(); // Header constants. static final String TO_NAME = "To"; static final String CC_NAME = "Cc"; static final String BCC_NAME = "Bcc"; static final String NEWSGROUPS_NAME = "Newsgroups"; static final String FROM_NAME = "From"; static final String SENDER_NAME = "Sender"; static final String REPLY_TO_NAME = "Reply-To"; static final String SUBJECT_NAME = "Subject"; static final String DATE_NAME = "Date"; static final String MESSAGE_ID_NAME = "Message-ID"; /** * Constructor for an empty message. */ public MimeMessage(Session session) { super(session); headers = new InternetHeaders(); flags = new Flags(); modified = true; } /** * Constructor with an input stream contining an RFC 822 message. * When this method returns, the stream will be positioned at the end of * the data for the message. * @param session the session context * @param is the message input stream */ public MimeMessage(Session session, InputStream is) throws MessagingException { super(session); flags = new Flags(); parse(is); saved = true; } /** * Constructor with an existing message. * This performs a deep copy of the target message. * @param source the message to copy */ public MimeMessage(MimeMessage source) throws MessagingException { super(source.session); // Use a byte array for temporary storage try { ByteArrayOutputStream bos = new ByteArrayOutputStream(); source.writeTo(bos); bos.close(); ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray()); parse(bis); bis.close(); saved = true; } catch (IOException e) { throw new MessagingException("I/O error", e); } } /** * Constructor with a parent folder and message number. * @param folder the parent folder * @param msgnum the message number */ protected MimeMessage(Folder folder, int msgnum) { super(folder, msgnum); flags = new Flags(); saved = true; } /** * Constructor with a parent folder, message number, and RFC 822 input * stream. * When this method returns, the stream will be positioned at the end of * the data for the message. * @param folder the parent folder * @param is the message input stream * @param msgnum the message number of this message within the folder */ protected MimeMessage(Folder folder, InputStream is, int msgnum) throws MessagingException { this(folder, msgnum); parse(is); } /** * Constructor with a parent folder, message number, headers and byte * content. * @param folder the parent folder * @param headers the headers * @param content the content byte array * @param msgnum the message number of this message within the folder */ protected MimeMessage(Folder folder, InternetHeaders headers, byte[] content, int msgnum) throws MessagingException { this(folder, msgnum); this.headers = headers; this.content = content; } /** * Parses the given input stream, setting the headers and content fields * appropriately. * This resets the modified flag. * @param is the message input stream */ protected void parse(InputStream is) throws MessagingException { if (is instanceof SharedInputStream) { headers = createInternetHeaders(is); SharedInputStream sis = (SharedInputStream) is; contentStream = sis.newStream(sis.getPosition(), -1L); } else { // buffer it if (!(is instanceof ByteArrayInputStream) && !(is instanceof BufferedInputStream)) { is = new BufferedInputStream(is); } // headers headers = createInternetHeaders(is); // Read stream into byte array try { // TODO Make buffer size configurable int len = 1024; if (is instanceof ByteArrayInputStream) { len = is.available(); content = new byte[len]; is.read(content, 0, len); } else { ByteArrayOutputStream bos = new ByteArrayOutputStream(len); byte[] b = new byte[len]; for (int l = is.read(b); l != -1; l = is.read(b)) { bos.write(b, 0, l); } content = bos.toByteArray(); } } catch (IOException e) { throw new MessagingException("I/O error", e); } } modified = false; } // -- From -- /** * Returns the value of the RFC 822 From header field. * If this header field is absent, the Sender header field is used instead. */ public Address[] getFrom() throws MessagingException { Address[] from = getInternetAddresses(FROM_NAME); if (from == null) { from = getInternetAddresses(SENDER_NAME); } return from; } /** * Sets the RFC 822 From header field. * @param address the sender of this message * @exception IllegalWriteException if the underlying implementation * does not support modification of existing values * @exception IllegalStateException if this message is obtained from * a READ_ONLY folder */ public void setFrom(Address address) throws MessagingException { if (address == null) { removeHeader(FROM_NAME); } else { setHeader(FROM_NAME, address.toString()); } } /** * Sets the RFC 822 From header field using the value of the * InternetAddress.getLocalAddress method. * @exception IllegalWriteException if the underlying implementation * does not support modification of existing values * @exception IllegalStateException if this message is obtained from * a READ_ONLY folder */ public void setFrom() throws MessagingException { InternetAddress localAddress = InternetAddress.getLocalAddress(session); if (localAddress != null) { setFrom(localAddress); } else { throw new MessagingException("No local address"); } } /** * Adds the specified addresses to From header field. * @param addresses the senders of this message * @exception IllegalWriteException if the underlying implementation * does not support modification of existing values * @exception IllegalStateException if this message is obtained from * a READ_ONLY folder */ public void addFrom(Address[] addresses) throws MessagingException { addInternetAddresses(FROM_NAME, addresses); } /** * Returns the value of the RFC 822 Sender header field. * @since JavaMail 1.3 */ public Address getSender() throws MessagingException { Address[] sender = getInternetAddresses(SENDER_NAME); if (sender != null && sender.length > 0) { return sender[0]; } else { return null; } } /** * Sets the RFC 822 Sender header field. * @param address the sender of this message * @exception IllegalWriteException if the underlying implementation * does not support modification of existing values * @exception IllegalStateException if this message is obtained from * a READ_ONLY folder * @since JavaMail 1.3 */ public void setSender(Address address) throws MessagingException { Address[] addresses = new Address[] { address }; addInternetAddresses(SENDER_NAME, addresses); } // -- To -- /** * Returns the recipients of the given type. * @param type the recipient type */ public Address[] getRecipients(Message.RecipientType type) throws MessagingException { if (type == RecipientType.NEWSGROUPS) { // Can't use getInternetAddresses here // and it's not worth a getNewsAddresses method String header = getHeader(NEWSGROUPS_NAME, ","); return (header != null) ? NewsAddress.parse(header) : null; } return getInternetAddresses(getHeader(type)); } /** * Returns all the recipients. * This returns the TO, CC, BCC, and NEWSGROUPS recipients. */ public Address[] getAllRecipients() throws MessagingException { Address[] recipients = super.getAllRecipients(); Address[] newsgroups = getRecipients(RecipientType.NEWSGROUPS); if (newsgroups == null) { return recipients; } else if (recipients == null) { return newsgroups; } else { Address[] both = new Address[recipients.length + newsgroups.length]; System.arraycopy(recipients, 0, both, 0, recipients.length); System.arraycopy(newsgroups, 0, both, recipients.length, newsgroups.length); return both; } } /** * Sets the recipients of the given type. * @param type the recipient type * @param addresses the addresses, or null to remove recipients of this * type * @exception IllegalWriteException if the underlying implementation * does not support modification of existing values * @exception IllegalStateException if this message is obtained from * a READ_ONLY folder */ public void setRecipients(Message.RecipientType type, Address[] addresses) throws MessagingException { if (type == RecipientType.NEWSGROUPS) { if (addresses == null || addresses.length == 0) { removeHeader(NEWSGROUPS_NAME); } else { setHeader(NEWSGROUPS_NAME, NewsAddress.toString(addresses)); } } else { setInternetAddresses(getHeader(type), addresses); } } /** * Sets the recipients of the given type. * @param type the recipient type * @param addresses the addresses, or null to remove recpients of this * type * @exception IllegalWriteException if the underlying implementation * does not support modification of existing values * @exception IllegalStateException if this message is obtained from * a READ_ONLY folder */ public void setRecipients(Message.RecipientType type, String addresses) throws MessagingException { if (type == RecipientType.NEWSGROUPS) { if (addresses == null || addresses.length() == 0) { removeHeader(NEWSGROUPS_NAME); } else { setHeader(NEWSGROUPS_NAME, addresses); } } else { setInternetAddresses(getHeader(type), InternetAddress.parse(addresses)); } } /** * Adds the given addresses to the recipients of the specified type. * @param type the recipient type * @param addresses the addresses * @exception IllegalWriteException if the underlying implementation * does not support modification of existing values * @exception IllegalStateException if this message is obtained from * a READ_ONLY folder */ public void addRecipients(Message.RecipientType type, Address[] addresses) throws MessagingException { if (type == RecipientType.NEWSGROUPS) { String value = NewsAddress.toString(addresses); if (value != null) { addHeader(NEWSGROUPS_NAME, value); } } else { addInternetAddresses(getHeader(type), addresses); } } /** * Adds the given addresses to the recipients of the specified type. * @param type the recipient type * @param addresses the addresses * @exception IllegalWriteException if the underlying implementation * does not support modification of existing values * @exception IllegalStateException if this message is obtained from * a READ_ONLY folder */ public void addRecipients(Message.RecipientType type, String addresses) throws MessagingException { if (type == RecipientType.NEWSGROUPS) { if (addresses != null && addresses.length() != 0) { addHeader(NEWSGROUPS_NAME, addresses); } } else { addInternetAddresses(getHeader(type), InternetAddress.parse(addresses)); } } /** * Returns the value of the RFC 822 Reply-To header field. * If the header is absent, the value of the getFrom method * is returned. */ public Address[] getReplyTo() throws MessagingException { Address[] replyTo = getInternetAddresses(REPLY_TO_NAME); if (replyTo == null) { replyTo = getFrom(); } return replyTo; } /** * Sets the RFC 822 Reply-To header field. * @param addresses the addresses, or null to remove this * header * @exception IllegalWriteException if the underlying implementation * does not support modification of existing values * @exception IllegalStateException if this message is obtained from * a READ_ONLY folder */ public void setReplyTo(Address[] addresses) throws MessagingException { setInternetAddresses(REPLY_TO_NAME, addresses); } // convenience method private Address[] getInternetAddresses(String name) throws MessagingException { String value = getHeader(name, ","); // Use InternetAddress.parseHeader since 1.3 String s = session.getProperty("mail.mime.address.strict"); boolean strict = (s == null) || Boolean.valueOf(s).booleanValue(); return (value != null) ? InternetAddress.parseHeader(value, strict) : null; } // convenience method private void setInternetAddresses(String name, Address[] addresses) throws MessagingException { String line = InternetAddress.toString(addresses); if (line == null) { removeHeader(line); } else { setHeader(name, line); } } // convenience method private void addInternetAddresses(String name, Address[] addresses) throws MessagingException { String line = InternetAddress.toString(addresses); if (line != null) { addHeader(name, line); } } /* * Convenience method to return the header name for a given recipient * type. This should be faster than keeping a hash of recipient types to * names. */ private String getHeader(Message.RecipientType type) throws MessagingException { if (type == Message.RecipientType.TO) { return TO_NAME; } if (type == Message.RecipientType.CC) { return CC_NAME; } if (type == Message.RecipientType.BCC) { return BCC_NAME; } if (type == RecipientType.NEWSGROUPS) { return NEWSGROUPS_NAME; } throw new MessagingException("Invalid recipient type"); } /** * Returns the value of the Subject header field. *

      * If the subject is encoded as per RFC 2047, it is decoded and converted * into Unicode. */ public String getSubject() throws MessagingException { String subject = getHeader(SUBJECT_NAME, null); if (subject == null) { return null; } try { subject = MimeUtility.decodeText(subject); } catch (UnsupportedEncodingException e) { } return subject; } /** * Sets the Subject header field. *

      * If the subject contains non US-ASCII characters, it will be encoded * using the platform default charset. * @param subject the subject * @exception IllegalWriteException if the underlying implementation * does not support modification of existing values * @exception IllegalStateException if this message is obtained from * a READ_ONLY folder */ public void setSubject(String subject) throws MessagingException { setSubject(subject, null); } /** * Sets the Subject header field. *

      * If the subject contains non US-ASCII characters, it will be encoded * using the specified charset. * @param subject the subject * @param charset the charset used for any encoding * @exception IllegalWriteException if the underlying implementation * does not support modification of existing values * @exception IllegalStateException if this message is obtained from * a READ_ONLY folder */ public void setSubject(String subject, String charset) throws MessagingException { if (subject == null) { removeHeader(SUBJECT_NAME); } try { setHeader(SUBJECT_NAME, MimeUtility.encodeText(subject, charset, null)); } catch (UnsupportedEncodingException e) { throw new MessagingException("Encoding error", e); } } /** * Returns the value of the RFC 822 Date field. * This is the date on which this message was sent. */ public Date getSentDate() throws MessagingException { String value = getHeader(DATE_NAME, null); if (value != null) { try { return dateFormat.parse(value); } catch (ParseException e) { } } return null; } /** * Sets the RFC 822 Date header field. * @param date the sent date, or null to remove this header * @exception IllegalWriteException if the underlying implementation * does not support modification of existing values * @exception IllegalStateException if this message is obtained from * a READ_ONLY folder */ public void setSentDate(Date date) throws MessagingException { if (date == null) { removeHeader(DATE_NAME); } else { setHeader(DATE_NAME, dateFormat.format(date)); } } /** * Returns the date on which this message was received. * This returns null if the received date cannot be obtained. */ public Date getReceivedDate() throws MessagingException { // hence... return null; } /** * Returns the size of the content of this message in bytes, or -1 if the * size cannot be determined. *

      * Note that this number may not be an exact measure, but if not -1, it * will be suitable for display to the user. */ public int getSize() throws MessagingException { if (content != null) { return content.length; } if (contentStream != null) { try { int available = contentStream.available(); if (available > 0) { return available; } } catch (IOException e) { } } return -1; } /** * Returns the number of lines in the content of this message, or -1 if * this number cannot be determined. *

      * Note that this number may not be an exact measure, but if not -1, it * will be suitable for display to the user. */ public int getLineCount() throws MessagingException { return -1; } /** * Returns the value of the RFC 822 Content-Type header field, or * "text/plain" if the header is not available. */ public String getContentType() throws MessagingException { String contentType = getHeader(MimeBodyPart.CONTENT_TYPE_NAME, null); if (contentType == null) { return MimeBodyPart.TEXT_PLAIN; } return contentType; } /** * Indicates whether this message is of the specified MIME type. *

      * If the subtype of mimeType is the special character '*', * the subtype is ignored during the comparison. * @see MimeBodyPart#isMimeType */ public boolean isMimeType(String mimeType) throws MessagingException { return (new ContentType(getContentType()).match(mimeType)); } /** * Returns the value of the RFC 822 Content-Disposition header field, or * null if the header is not available. * @see MimeBodyPart#getDisposition */ public String getDisposition() throws MessagingException { String disposition = getHeader(MimeBodyPart.CONTENT_DISPOSITION_NAME, null); if (disposition != null) { return new ContentDisposition(disposition).getDisposition(); } return null; } /** * Sets the Content-Disposition header field of this message. * @param disposition the disposition value to set, or null to remove * @exception IllegalWriteException if the underlying implementation * does not support modification of existing values * @exception IllegalStateException if this message is obtained from * a READ_ONLY folder * @see MimeBodyPart#setDisposition */ public void setDisposition(String disposition) throws MessagingException { if (disposition == null) { removeHeader(MimeBodyPart.CONTENT_DISPOSITION_NAME); } else { String value = getHeader(MimeBodyPart.CONTENT_DISPOSITION_NAME, null); if (value != null) { ContentDisposition cd = new ContentDisposition(value); cd.setDisposition(disposition); disposition = cd.toString(); } setHeader(MimeBodyPart.CONTENT_DISPOSITION_NAME, disposition); } } /** * Returns the value of the Content-Transfer-Encoding header field. * @see MimeBodyPart#getEncoding */ public String getEncoding() throws MessagingException { String encoding = getHeader(MimeBodyPart.CONTENT_TRANSFER_ENCODING_NAME, null); if (encoding != null) { encoding = encoding.trim(); if (encoding.equalsIgnoreCase("7bit") || encoding.equalsIgnoreCase("8bit") || encoding.equalsIgnoreCase("quoted-printable") || encoding.equalsIgnoreCase("base64")) { return encoding; } HeaderTokenizer ht = new HeaderTokenizer(encoding, HeaderTokenizer.MIME); for (boolean done = false; !done; ) { HeaderTokenizer.Token token = ht.next(); switch (token.getType()) { case HeaderTokenizer.Token.EOF: done = true; break; case HeaderTokenizer.Token.ATOM: return token.getValue(); } } return encoding; } return null; } /** * Returns the value of the Content-ID header field. * @see MimeBodyPart#getContentID */ public String getContentID() throws MessagingException { return getHeader(MimeBodyPart.CONTENT_ID_NAME, null); } /** * Sets the Content-ID header field of this message. * @exception IllegalWriteException if the underlying implementation * does not support modification of existing values * @exception IllegalStateException if this message is obtained from * a READ_ONLY folder */ public void setContentID(String cid) throws MessagingException { if (cid == null) { removeHeader(MimeBodyPart.CONTENT_ID_NAME); } else { setHeader(MimeBodyPart.CONTENT_ID_NAME, cid); } } /** * Returns the value of the Content-MD5 header field. * @see MimeBodyPart#getContentMD5 */ public String getContentMD5() throws MessagingException { return getHeader(MimeBodyPart.CONTENT_MD5_NAME, null); } /** * Sets the Content-MD5 header field of this message. * @exception IllegalWriteException if the underlying implementation * does not support modification of existing values * @exception IllegalStateException if this message is obtained from * a READ_ONLY folder * @see MimeBodyPart#setContentMD5 */ public void setContentMD5(String md5) throws MessagingException { setHeader(MimeBodyPart.CONTENT_MD5_NAME, md5); } /** * Returns the Content-Description header field of this message. *

      * If the Content-Description field is encoded as per RFC 2047, * it is decoded and converted into Unicode. * @see MimeBodyPart#getDescription */ public String getDescription() throws MessagingException { String header = getHeader(MimeBodyPart.CONTENT_DESCRIPTION_NAME, null); if (header != null) { try { return MimeUtility.decodeText(header); } catch (UnsupportedEncodingException e) { return header; } } return null; } /** * Sets the Content-Description header field for this message. *

      * If the description contains non US-ASCII characters, it will be encoded * using the platform default charset. * @param description the content description * @exception IllegalWriteException if the underlying implementation * does not support modification of existing values * @exception IllegalStateException if this message is obtained from * a READ_ONLY folder * @see MimeBodyPart#setDescription */ public void setDescription(String description) throws MessagingException { setDescription(description, null); } /** * Sets the Content-Description header field for this message. *

      * If the description contains non US-ASCII characters, it will be encoded * using the specified charset. * @param description the content description * @param charset the charset used for any encoding * @exception IllegalWriteException if the underlying implementation * does not support modification of existing values * @exception IllegalStateException if this message is obtained from * a READ_ONLY folder * @see MimeBodyPart#setDescription */ public void setDescription(String description, String charset) throws MessagingException { if (description != null) { try { setHeader(MimeBodyPart.CONTENT_DESCRIPTION_NAME, MimeUtility.encodeText(description, charset, null)); } catch (UnsupportedEncodingException e) { throw new MessagingException("Encode error", e); } } else { removeHeader(MimeBodyPart.CONTENT_DESCRIPTION_NAME); } } /** * Returns the languages specified in the Content-Language header field * of this message, as defined by RFC 1766. This method returns * null if this header is not available. * @see MimeBodyPart#getContentLanguage */ public String[] getContentLanguage() throws MessagingException { String header = getHeader(MimeBodyPart.CONTENT_LANGUAGE_NAME, null); if (header != null) { HeaderTokenizer ht = new HeaderTokenizer(header, HeaderTokenizer.MIME); ArrayList acc = new ArrayList(); for (boolean done = false; !done; ) { HeaderTokenizer.Token token = ht.next(); switch (token.getType()) { case HeaderTokenizer.Token.EOF: done = true; break; case HeaderTokenizer.Token.ATOM: acc.add(token.getValue()); break; } } if (acc.size() > 0) { String[] languages = new String[acc.size()]; acc.toArray(languages); return languages; } } return null; } /** * Sets the Content-Language header of this message. * @param languages the array of language tags * @exception IllegalWriteException if the underlying implementation * does not support modification of existing values * @exception IllegalStateException if this message is obtained from * a READ_ONLY folder * @see MimeBodyPart#setContentLanguage */ public void setContentLanguage(String[] languages) throws MessagingException { if (languages != null && languages.length > 0) { StringBuffer buffer = new StringBuffer(); buffer.append(languages[0]); for (int i = 1; i < languages.length; i++) { buffer.append(','); buffer.append(languages[i]); } setHeader(MimeBodyPart.CONTENT_LANGUAGE_NAME, buffer.toString()); } else { setHeader(MimeBodyPart.CONTENT_LANGUAGE_NAME, null); } } /** * Returns the value of the Message-ID header field. */ public String getMessageID() throws MessagingException { return getHeader(MESSAGE_ID_NAME, null); } /** * Returns the filename associated with this message. *

      * This method returns the value of the "filename" parameter from the * Content-Disposition header field of this message. * If the latter is not available, it returns the value of the "name" * parameter from the Content-Type header field. * @see MimeBodyPart#getFileName */ public String getFileName() throws MessagingException { String filename = null; String header = getHeader(MimeBodyPart.CONTENT_DISPOSITION_NAME, null); if (header != null) { ContentDisposition cd = new ContentDisposition(header); filename = cd.getParameter("filename"); } if (filename == null) { header = getHeader(MimeBodyPart.CONTENT_TYPE_NAME, null); if (header != null) { ContentType contentType = new ContentType(header); filename = contentType.getParameter("name"); } } PrivilegedAction a = new GetSystemPropertyAction("mail.mime.decodefilename"); if ("true".equals(AccessController.doPrivileged(a))) { try { filename = MimeUtility.decodeText(filename); } catch (UnsupportedEncodingException e) { throw new MessagingException(e.getMessage(), e); } } return filename; } /** * Sets the filename associated with this part. * @exception IllegalWriteException if the underlying implementation * does not support modification of existing values * @exception IllegalStateException if this message is obtained from * a READ_ONLY folder * @see MimeBodyPart#setFileName */ public void setFileName(String filename) throws MessagingException { PrivilegedAction a = new GetSystemPropertyAction("mail.mime.encodefilename"); if ("true".equals(AccessController.doPrivileged(a))) { try { filename = MimeUtility.encodeText(filename); } catch (UnsupportedEncodingException e) { throw new MessagingException(e.getMessage(), e); } } String header = getHeader(MimeBodyPart.CONTENT_DISPOSITION_NAME, null); if (header == null) { header = "attachment"; } ContentDisposition cd = new ContentDisposition(header); cd.setParameter("filename", filename); setHeader(MimeBodyPart.CONTENT_DISPOSITION_NAME, cd.toString()); // We will also set the "name" parameter of the Content-Type field // to preserve compatibility with nonconformant MUAs header = getHeader(MimeBodyPart.CONTENT_TYPE_NAME, null); if (header == null) { DataHandler dh0 = getDataHandler(); if (dh0 != null) header = dh0.getContentType(); else header = "text/plain"; } ContentType contentType = new ContentType(header); contentType.setParameter("name", filename); setHeader(MimeBodyPart.CONTENT_TYPE_NAME, contentType.toString()); } /** * Returns a decoded input stream for this message's content. * @exception IOException if an error occurs in the data handler layer * @see MimeBodyPart#getInputStream */ public InputStream getInputStream() throws IOException, MessagingException { return getDataHandler().getInputStream(); } /** * Returns the unencoded bytes of the content. * @see MimeBodyPart#getContentStream */ protected InputStream getContentStream() throws MessagingException { if (contentStream != null) { return ((SharedInputStream) contentStream).newStream(0L, -1L); } if (content != null) { return new ByteArrayInputStream(content); } else { throw new MessagingException("No content"); } } /** * Returns the unencoded bytes of the content without applying any content * transfer encoding. * @see MimeBodyPart#getRawInputStream */ public InputStream getRawInputStream() throws MessagingException { return getContentStream(); } /** * Returns a data handler for accessing this message's content. */ public synchronized DataHandler getDataHandler() throws MessagingException { if (dh == null) { dh = new DataHandler(new MimePartDataSource(this)); } return dh; } /** * Returns this message's content as a Java object. * @exception IOException if an error occurred in the data handler layer */ public Object getContent() throws IOException, MessagingException { return getDataHandler().getContent(); } /** * Sets the content of this part using the specified data handler. * @exception IllegalWriteException if the underlying implementation * does not support modification of existing values * @exception IllegalStateException if this message is obtained from * a READ_ONLY folder * @see MimeBodyPart#setDataHandler */ public void setDataHandler(DataHandler datahandler) throws MessagingException { dh = datahandler; // The Content-Type and Content-Transfer-Encoding headers may need to be // recalculated by the new DataHandler - see updateHeaders() removeHeader(MimeBodyPart.CONTENT_TYPE_NAME); removeHeader(MimeBodyPart.CONTENT_TRANSFER_ENCODING_NAME); removeHeader(MESSAGE_ID_NAME); } /** * Sets the content of this message using the specified Java object and * MIME type. Note that a data content handler for the MIME type must be * installed and accept objects of the type given. * @param o the content object * @param type the MIME type of the object * @exception IllegalWriteException if the underlying implementation * does not support modification of existing values * @exception IllegalStateException if this message is obtained from * a READ_ONLY folder * @see MimeBodyPart#setContent */ public void setContent(Object o, String type) throws MessagingException { setDataHandler(new DataHandler(o, type)); } /** * Sets the content of this message using the specified text, and with a * MIME type of "text/plain". *

      * If the string contains non US-ASCII characters, it will be encoded * using the platform default charset. * @param text the text content * @see MimeBodyPart#setText(String) */ public void setText(String text) throws MessagingException { setText(text, null, "plain"); } /** * Sets the content of this message using the specified text, and with a * MIME type of "text/plain". *

      * If the string contains non US-ASCII characters, it will be encoded * using the specified charset. * @param text the text content * @param charset the charset used for any encoding * @see MimeBodyPart#setText(String,String) */ public void setText(String text, String charset) throws MessagingException { setText(text, charset, "plain"); } /** * Sets the content of this message using the specified text, and with a * text MIME type of the specified subtype. *

      * If the string contains non US-ASCII characters, it will be encoded * using the specified charset. * @param text the text content * @param charset the charset used for any encoding * @param subtype the MIME text subtype (e.g. "plain", "html") * @see MimeBodyPart#setText(String,String,String) * @since JavaMail 1.4 */ public void setText(String text, String charset, String subtype) throws MessagingException { if (charset == null) { // According to the API doc for getText(String), we may have to scan // the characters to determine the charset. // However this should work just as well and is hopefully relatively // cheap. charset = MimeUtility.mimeCharset(MimeUtility.getDefaultJavaCharset()); } if (subtype == null || "".equals(subtype)) subtype = "plain"; StringBuffer buffer = new StringBuffer(); buffer.append("text/").append(subtype).append("; charset="); buffer.append(MimeUtility.quote(charset, HeaderTokenizer.MIME)); setContent(text, buffer.toString()); } /** * Sets the content of this message to be the specified multipart. * @param mp the multipart content * @exception IllegalWriteException if the underlying implementation * does not support modification of existing values * @exception IllegalStateException if this message is obtained from * a READ_ONLY folder * @see MimeBodyPart#setContent(Multipart) */ public void setContent(Multipart mp) throws MessagingException { setDataHandler(new DataHandler(mp, mp.getContentType())); // Ensure component hierarchy mp.setParent(this); } /** * Returns a new message suitable for a reply to this message. * The new message will have its headers set appropriately for sending, * but no content. * @param replyToAll the reply should be sent to all the recipients of * this message */ public Message reply(boolean replyToAll) throws MessagingException { MimeMessage message = createMimeMessage(session); String subject = getHeader(SUBJECT_NAME, null); if (subject != null) { if (!subject.startsWith("Re: ")) { subject = "Re: " + subject; } message.setHeader(SUBJECT_NAME, subject); } Address[] addresses = getReplyTo(); message.setRecipients(Message.RecipientType.TO, addresses); if (replyToAll) { // We use a Set to store the addresses in order to ensure no address // duplication. HashSet set = new HashSet(); set.addAll(Arrays.asList(addresses)); InternetAddress localAddress = InternetAddress.getLocalAddress(session); if (localAddress != null) { set.add(localAddress); } String alternates = session.getProperty("mail.alternates"); if (alternates != null) { set.addAll( Arrays.asList( InternetAddress.parse(alternates, false))); } set.addAll(Arrays.asList(getRecipients(Message.RecipientType.TO))); addresses = new Address[set.size()]; set.toArray(addresses); boolean replyAllCC = new Boolean(session.getProperty("mail.replyallcc")).booleanValue(); if (addresses.length > 0) { if (replyAllCC) { message.addRecipients(Message.RecipientType.CC, addresses); } else { message.addRecipients(Message.RecipientType.TO, addresses); } } set.clear(); set.addAll(Arrays.asList(getRecipients(Message.RecipientType.CC))); addresses = new Address[set.size()]; set.toArray(addresses); if (addresses != null && addresses.length > 0) { message.addRecipients(Message.RecipientType.CC, addresses); } addresses = getRecipients(RecipientType.NEWSGROUPS); if (addresses != null && addresses.length > 0) { message.setRecipients(RecipientType.NEWSGROUPS, addresses); } } // Set In-Reply-To(will be replaced by References for NNTP) String mid = getHeader(MESSAGE_ID_NAME, null); if (mid != null) { message.setHeader("In-Reply-To", mid); } try { setFlag(Flags.Flag.ANSWERED, true); } catch (MessagingException e) { } return message; } /** * Writes this message to the specified stream in RFC 822 format. * @exception IOException if an error occurs writing to the stream or in * the data handler layer */ public void writeTo(OutputStream os) throws IOException, MessagingException { writeTo(os, null); } /** * Writes this message to the specified stream in RFC 822 format, without * the specified headers. * @exception IOException if an error occurs writing to the stream or in * the data handler layer */ public void writeTo(OutputStream os, String[] ignoreList) throws IOException, MessagingException { if (!saved) { saveChanges(); } String charset = "US-ASCII"; // MIME default charset byte[] sep = new byte[] { 0x0d, 0x0a }; // Write the headers for (Enumeration e = getNonMatchingHeaderLines(ignoreList); e.hasMoreElements(); ) { String line = (String) e.nextElement(); StringTokenizer st = new StringTokenizer(line, "\r\n"); int count = 0; while (st.hasMoreTokens()) { String line2 = st.nextToken(); if (count > 0 && line2.charAt(0) != '\t') { // Folded line must start with tab os.write(0x09); } /* * RFC 2822, section 2.1 states that each line should be no more * than 998 characters. * Ensure that any headers we emit have no lines longer than * this by folding the line. */ int max = (count > 0) ? 997 : 998; while (line2.length() > max) { String left = line2.substring(0, max); byte[] bytes = left.getBytes(charset); os.write(bytes); os.write(sep); os.write(0x09); line2 = line2.substring(max); max = 997; // make space for the tab } byte[] bytes = line2.getBytes(charset); os.write(bytes); os.write(sep); count++; } } os.write(sep); os.flush(); if (modified || content == null && contentStream == null) { // use datahandler os = MimeUtility.encode(os, getEncoding()); getDataHandler().writeTo(os); os.flush(); } else { // write content directly if (contentStream != null) { InputStream is = ((SharedInputStream) contentStream).newStream(0L, -1L); // TODO make buffer size configurable int len = 8192; byte[] bytes = new byte[len]; while ((len = is.read(bytes)) > -1) { os.write(bytes, 0, len); } is.close(); } else { os.write(content); } os.flush(); } } static int fc = 1; /** * Returns all the values for the specified header name. * Note that headers may be encoded as per RFC 2047 if they * contain non-US-ASCII characters: these should be decoded. * @param name the header name */ public String[] getHeader(String name) throws MessagingException { return headers.getHeader(name); } /** * Returns all the values for the specified header name as a single * string, with headers separated by the given delimiter. * If the delimiter is null, only the first header is * returned. * @param name the header name * @param delimiter the delimiter */ public String getHeader(String name, String delimiter) throws MessagingException { return headers.getHeader(name, delimiter); } /** * Sets the specified header. * @param name the header name * @param value the header value * @exception IllegalWriteException if the underlying implementation * does not support modification of existing values * @exception IllegalStateException if this message is obtained from * a READ_ONLY folder */ public void setHeader(String name, String value) throws MessagingException { headers.setHeader(name, value); } /** * Adds the specified header. * @param name the header name * @param value the header value * @exception IllegalWriteException if the underlying implementation * does not support modification of existing values * @exception IllegalStateException if this message is obtained from * a READ_ONLY folder */ public void addHeader(String name, String value) throws MessagingException { headers.addHeader(name, value); } /** * Removes all headers with the specified name. * @param name the header name * @exception IllegalWriteException if the underlying implementation * does not support modification of existing values * @exception IllegalStateException if this message is obtained from * a READ_ONLY folder */ public void removeHeader(String name) throws MessagingException { headers.removeHeader(name); } /** * Returns all the headers. * @return an Enumeration of Header objects */ public Enumeration getAllHeaders() throws MessagingException { return headers.getAllHeaders(); } /** * Returns all the headers with any of the given names. * @return an Enumeration of Header objects */ public Enumeration getMatchingHeaders(String[] names) throws MessagingException { return headers.getMatchingHeaders(names); } /** * Returns all the headers without any of the given names. * @return an Enumeration of Header objects */ public Enumeration getNonMatchingHeaders(String[] names) throws MessagingException { return headers.getNonMatchingHeaders(names); } /** * Adds an RFC 822 header-line to this message. * @exception IllegalWriteException if the underlying implementation * does not support modification of existing values * @exception IllegalStateException if this message is obtained from * a READ_ONLY folder */ public void addHeaderLine(String line) throws MessagingException { headers.addHeaderLine(line); } /** * Returns all the header-lines. * @return an Enumeration of Strings */ public Enumeration getAllHeaderLines() throws MessagingException { return headers.getAllHeaderLines(); } /** * Returns all the header-lines with any of the given names. * @return an Enumeration of Strings */ public Enumeration getMatchingHeaderLines(String[] names) throws MessagingException { return headers.getMatchingHeaderLines(names); } /** * Returns all the header-lines without any of the given names. * @return an Enumeration of Strings */ public Enumeration getNonMatchingHeaderLines(String[] names) throws MessagingException { return headers.getNonMatchingHeaderLines(names); } /** * Returns the flags for this message. */ public Flags getFlags() throws MessagingException { return (Flags) flags.clone(); } /** * Indicates whether the specified flag is set in this message. * @param flag the flag */ public boolean isSet(Flags.Flag flag) throws MessagingException { return flags.contains(flag); } /** * Sets the flags for this message. * @exception IllegalWriteException if the underlying implementation * does not support modification of existing values * @exception IllegalStateException if this message is obtained from * a READ_ONLY folder */ public void setFlags(Flags flag, boolean set) throws MessagingException { if (set) { flags.add(flag); } else { flags.remove(flag); } } /** * Saves any changes to this message. * Header fields in the message are updated appropriately to be consistent * with the message contents. * @exception IllegalWriteException if the underlying implementation * does not support modification of existing values * @exception IllegalStateException if this message is obtained from * a READ_ONLY folder */ public void saveChanges() throws MessagingException { modified = true; saved = true; updateHeaders(); } /** * Updates the headers of this part, based on the content. * @exception IllegalWriteException if the underlying implementation * does not support modification of existing values * @exception IllegalStateException if this message is obtained from * a READ_ONLY folder * @see MimeBodyPart#updateHeaders */ protected void updateHeaders() throws MessagingException { // This code is from MimeBodyPart if (getDataHandler() != null) { try { String contentType = dh.getContentType(); ContentType ct = new ContentType(contentType); if (ct.match("multipart/*")) { MimeMultipart mmp = (MimeMultipart) dh.getContent(); mmp.updateHeaders(); } else if (ct.match("message/rfc822")) { } else { // Update Content-Transfer-Encoding if (getHeader(MimeBodyPart.CONTENT_TRANSFER_ENCODING_NAME) == null) { setHeader(MimeBodyPart.CONTENT_TRANSFER_ENCODING_NAME, MimeUtility.getEncoding(dh)); } } // Update Content-Type if nonexistent, // and Content-Type "name" with Content-Disposition "filename" // parameter(see setFilename()) if (getHeader(MimeBodyPart.CONTENT_TYPE_NAME) == null) { String disposition = getHeader(MimeBodyPart.CONTENT_DISPOSITION_NAME, null); if (disposition != null) { ContentDisposition cd = new ContentDisposition(disposition); String filename = cd.getParameter("filename"); if (filename != null) { ct.setParameter("name", filename); contentType = ct.toString(); } } setHeader(MimeBodyPart.CONTENT_TYPE_NAME, contentType); } } catch (IOException e) { throw new MessagingException("I/O error", e); } } // Below is MimeMessage-specific. // set mime version setHeader("Mime-Version", "1.0"); // set new message-id if necessary updateMessageId(); } /** * Creates the headers from the given input stream. * @param is the input stream to read the headers from */ protected InternetHeaders createInternetHeaders(InputStream is) throws MessagingException { return new InternetHeaders(is); } /** * Updates the Message-ID header. This method is called by * updateHeaders, and should set the Message-Id header to a * suitably unique value if overridden. * @since JavaMail 1.4 */ protected void updateMessageId() throws MessagingException { String mid = getHeader(MESSAGE_ID_NAME, null); if (mid == null) { StringBuffer buffer = new StringBuffer(); buffer.append('<'); buffer.append(MimeUtility.getUniqueMessageIDValue(session)); buffer.append('>'); mid = buffer.toString(); setHeader(MESSAGE_ID_NAME, mid); } } /** * Creates a new MIME message. * Used by the reply method to determine the MimeMessage * subclass, if any, to use. * @since JavaMail 1.4 */ protected MimeMessage createMimeMessage(Session session) throws MessagingException { return new MimeMessage(session); } } mail-1.1.2/source/javax/mail/internet/MimeMultipart.java0000664000076500007650000004140310614714012022632 0ustar dogdog00000000000000/* * MimeMultipart.java * Copyright (C) 2002, 2005 The Free Software Foundation * * This file is part of GNU JavaMail, a library. * * GNU JavaMail is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * GNU JavaMail 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * As a special exception, if you link this library with other files to * produce an executable, this library does not by itself cause the * resulting executable to be covered by the GNU General Public License. * This exception does not however invalidate any other reasons why the * executable file might be covered by the GNU General Public License. */ package javax.mail.internet; import java.io.BufferedInputStream; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.InputStream; import java.io.IOException; import java.io.OutputStream; import java.security.AccessController; import java.security.PrivilegedAction; import javax.activation.DataSource; import javax.mail.BodyPart; import javax.mail.MessageAware; import javax.mail.MessageContext; import javax.mail.MessagingException; import javax.mail.Multipart; import javax.mail.MultipartDataSource; import gnu.inet.util.CRLFOutputStream; import gnu.inet.util.GetSystemPropertyAction; import gnu.inet.util.LineInputStream; /** * A MIME multipart container. *

      * The default multipart subtype is "mixed". However, an application can * construct a MIME multipart object of any subtype using the * MimeMultipart(String) constructor. * * @author Chris Burdess * @version 1.4 */ public class MimeMultipart extends Multipart { /** * The data source supplying the multipart data. */ protected DataSource ds; /** * Indicates whether the data from the input stream has been parsed yet. */ protected boolean parsed; /** * Indicates whether the final boundary line of the multipart has been * seen. */ private boolean complete; /** * The preamble text before the first boundary line. */ private String preamble; /** * Constructor for an empty MIME multipart of type "multipart/mixed". */ public MimeMultipart() { this("mixed"); } /** * Constructor for an empty MIME multipart of the given subtype. */ public MimeMultipart(String subtype) { String boundary = MimeUtility.getUniqueBoundaryValue(); ContentType ct = new ContentType("multipart", subtype, null); ct.setParameter("boundary", boundary); contentType = ct.toString(); parsed = true; } /** * Constructor with a given data source. * @param ds the data source, which can be a MultipartDataSource */ public MimeMultipart(DataSource ds) throws MessagingException { if (ds instanceof MessageAware) { MessageContext mc = ((MessageAware) ds).getMessageContext(); setParent(mc.getPart()); } if (ds instanceof MultipartDataSource) { setMultipartDataSource((MultipartDataSource) ds); parsed = true; } else { this.ds = ds; contentType = ds.getContentType(); parsed = false; } } /** * Sets the subtype. */ public void setSubType(String subtype) throws MessagingException { ContentType ct = new ContentType(contentType); ct.setSubType(subtype); contentType = ct.toString(); } /** * Returns the number of component body parts. */ public int getCount() throws MessagingException { synchronized (this) { parse(); return super.getCount(); } } /** * Returns the specified body part. * Body parts are numbered starting at 0. * @param index the body part index * @exception MessagingException if no such part exists */ public BodyPart getBodyPart(int index) throws MessagingException { synchronized (this) { parse(); return super.getBodyPart(index); } } /** * Returns the body part identified by the given Content-ID (CID). * @param CID the Content-ID of the desired part */ public BodyPart getBodyPart(String CID) throws MessagingException { synchronized (this) { parse(); int count = getCount(); for (int i = 0; i < count; i++) { MimeBodyPart bp = (MimeBodyPart) getBodyPart(i); String contentID = bp.getContentID(); if (contentID != null && contentID.equals(CID)) { return bp; } } return null; } } /** * Updates the headers of this part to be consistent with its content. */ protected void updateHeaders() throws MessagingException { if (parts == null) { return; } synchronized (parts) { int len = parts.size(); for (int i = 0; i < len; i++) { ((MimeBodyPart) parts.get(i)).updateHeaders(); } } } /** * Writes this multipart to the specified output stream. * This method iterates through all the component parts, outputting each * part separated by the Content-Type boundary parameter. */ public void writeTo(OutputStream os) throws IOException, MessagingException { final String charset = "US-ASCII"; final byte[] sep = { 0x0d, 0x0a }; parse(); ContentType ct = new ContentType(contentType); String boundaryParam = ct.getParameter("boundary"); if (boundaryParam == null) { PrivilegedAction a = new GetSystemPropertyAction("mail.mime.multipart.ignore"+ "missingboundaryparameter"); if ("false".equals(AccessController.doPrivileged(a))) throw new MessagingException("Missing boundary parameter"); } byte[] boundary = ("--" + boundaryParam).getBytes(charset); if (preamble != null) os.write(preamble.getBytes(charset)); synchronized (parts) { int len = parts.size(); for (int i = 0; i < len; i++) { os.write(boundary); os.write(sep); os.flush(); ((MimeBodyPart) parts.get(i)).writeTo(os); os.write(sep); } } boundary = ("--" + boundaryParam + "--").getBytes(charset); os.write(boundary); os.write(sep); os.flush(); } /** * Parses the body parts from this multipart's data source. */ protected void parse() throws MessagingException { if (parsed) { return; } synchronized (this) { InputStream is = null; SharedInputStream sis = null; try { is = ds.getInputStream(); if (is instanceof SharedInputStream) { sis = (SharedInputStream) is; } // buffer it if (!(is instanceof ByteArrayInputStream) && !(is instanceof BufferedInputStream)) { is = new BufferedInputStream(is); } ContentType ct = new ContentType(contentType); String boundaryParam = ct.getParameter("boundary"); if (boundaryParam == null) { PrivilegedAction a = new GetSystemPropertyAction("mail.mime.multipart.ignore"+ "missingboundaryparameter"); if ("false".equals(AccessController.doPrivileged(a))) throw new MessagingException("Missing boundary parameter"); } String boundary = (boundaryParam == null) ? null : "--" + boundaryParam; LineInputStream lis = new LineInputStream(is); String line; StringBuffer preambleBuf = null; while ((line = lis.readLine()) != null) { String l = trim(line); if (boundary == null && l.startsWith("--") && !l.endsWith("--")) { boundary = l.substring(2).trim(); break; } else if (l.equals(boundary)) { break; } if (preambleBuf == null) preambleBuf = new StringBuffer(); preambleBuf.append(line); preambleBuf.append('\n'); } if (preambleBuf != null) preamble = preambleBuf.toString(); if (line == null) { throw new MessagingException("No start boundary"); } byte[] bbytes = boundary.getBytes(); int blen = bbytes.length; long start = 0L, end = 0L; for (boolean done = false; !done;) { InternetHeaders headers = null; if (sis != null) { start = sis.getPosition(); do { line = trim(lis.readLine()); } while (line != null && line.length() > 0); if (line == null) { throw new IOException("EOF before content body"); } } else { headers = createInternetHeaders(is); } ByteArrayOutputStream bos = null; if (sis == null) { bos = new ByteArrayOutputStream(); } // NB this routine uses the InputStream.mark() method // if it is not supported by the underlying stream // we will run into problems if (!is.markSupported()) { String cn = is.getClass().getName(); throw new MessagingException("FIXME: mark not supported" + " on underlying input stre" + "am: " + cn); } boolean eol = true; int last = -1; int afterLast = -1; while (true) { int c; if (eol) { is.mark(blen + 1024); int pos = 0; while (pos < blen) { if (is.read() != bbytes[pos]) { break; } pos++; } if (pos == blen) { c = is.read(); if (c == '-' && is.read() == '-') { done = true; complete = true; break; } while (c == ' ' || c == '\t') { c = is.read(); } if (c == '\r') { is.mark(1); if (is.read() != '\n') { is.reset(); } break; } if (c == '\n') { break; } } if (bos != null && last != -1) { bos.write(last); if (afterLast != -1) { bos.write(afterLast); } last = afterLast = -1; } is.reset(); } c = is.read(); if (c < 0) { done = true; break; } else if (c == '\r' || c == '\n') { eol = true; if (sis != null) { end = sis.getPosition() - 1L; } last = c; if (c == '\r') { is.mark(1); if ((c = is.read()) == '\n') { afterLast = c; } else { is.reset(); } } } else { eol = false; if (bos != null) { bos.write(c); } } } // Create a body part from the stream MimeBodyPart bp; if (sis != null) { bp = createMimeBodyPart(sis.newStream(start, end)); } else { bp = createMimeBodyPart(headers, bos.toByteArray()); } addBodyPart(bp); } } catch (IOException e) { throw new MessagingException("I/O error", e); } parsed = true; if (!complete) { PrivilegedAction a = new GetSystemPropertyAction("mail.mime.multipart.ignoremissingendboundary"); if ("false".equals(AccessController.doPrivileged(a))) throw new MessagingException("Missing end boundary"); } } } /** * Indicates whether the final boundary line for this multipart has been * parsed. * @since JavaMail 1.4 */ public boolean isComplete() throws MessagingException { return complete; } /** * Returns the preamble text (if any) before the first boundary line in * this multipart's body. * @since JavaMail 1.4 */ public String getPreamble() throws MessagingException { return preamble; } /** * Sets the preamble text to be emitted before the first boundary line. * @param preamble the preamble text * @since JavaMail 1.4 */ public void setPreamble(String preamble) throws MessagingException { this.preamble = preamble; } /* * Ensures that CR is stripped from the end of the given line. */ private static String trim(String line) { if (line == null) { return null; } line = line.trim(); int len = line.length(); if (len > 0 && line.charAt(len - 1) == '\r') { line = line.substring(0, len - 1); } return line; } /** * Creates headers from the specified input stream. * @param is the input stream to read the headers from */ protected InternetHeaders createInternetHeaders(InputStream is) throws MessagingException { return new InternetHeaders(is); } /** * Creates a MIME body part object from the given headers and byte content. * @param headers the part headers * @param content the part content */ protected MimeBodyPart createMimeBodyPart(InternetHeaders headers, byte[] content) throws MessagingException { return new MimeBodyPart(headers, content); } /** * Creates a MIME body part from the specified input stream. * @param is the input stream to parse the part from */ protected MimeBodyPart createMimeBodyPart(InputStream is) throws MessagingException { return new MimeBodyPart(is); } } mail-1.1.2/source/javax/mail/internet/MimePart.java0000664000076500007650000001321610614714012021560 0ustar dogdog00000000000000/* * MimePart.java * Copyright (C) 2002 The Free Software Foundation * * This file is part of GNU JavaMail, a library. * * GNU JavaMail is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * GNU JavaMail 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * As a special exception, if you link this library with other files to * produce an executable, this library does not by itself cause the * resulting executable to be covered by the GNU General Public License. * This exception does not however invalidate any other reasons why the * executable file might be covered by the GNU General Public License. */ package javax.mail.internet; import java.util.Enumeration; import javax.mail.MessagingException; import javax.mail.Part; /** * A MIME part is an Entity as defined by MIME (RFC2045, Section 2.4). *

      * The string representation of RFC822 and MIME header fields must contain * only US-ASCII characters. Non US-ASCII characters must be encoded as per * the rules in RFC 2047. This class does not enforce those rules; the * caller is expected to use MimeUtility to ensure that header * values are correctly encoded. * * @author Chris Burdess * @version 1.4 */ public interface MimePart extends Part { /** * Returns the values of all header fields for the specified name, * returned as a single String with the values separated by the given * delimiter. * If the delimiter is null, only the first value is returned. * @param header_name the header name */ String getHeader(String header_name, String delimiter) throws MessagingException; /** * Adds an RFC822 header-line. * @exception IllegalWriteException if the underlying implementation does not * support modification * @exception IllegalStateException if this part is obtained from a READ_ONLY * folder */ void addHeaderLine(String line) throws MessagingException; /** * Returns all the header-lines. * @return an Enumeration of Strings */ Enumeration getAllHeaderLines() throws MessagingException; /** * Returns all the header-lines with any of the given names. * @return an Enumeration of Strings */ Enumeration getMatchingHeaderLines(String[] names) throws MessagingException; /** * Returns all the header-lines without any of the given names. * @return an Enumeration of Strings */ Enumeration getNonMatchingHeaderLines(String[] names) throws MessagingException; /** * Returns the value of the Content-Transfer-Encoding header field of * this part. */ String getEncoding() throws MessagingException; /** * Returns the value of the Content-ID header field of this part. */ String getContentID() throws MessagingException; /** * Returns the value of the Content-MD5 header field of this part. */ String getContentMD5() throws MessagingException; /** * Sets the Content-MD5 header value for this part. * @exception IllegalWriteException if the underlying implementation does not * support modification * @param IllegalStateException if this part is obtained from a READ_ONLY * folder */ void setContentMD5(String md5) throws MessagingException; /** * Returns the languages specified in the Content-Language header of this * part, as defined by RFC 1766. This method returns null if * this header is not available. */ String[] getContentLanguage() throws MessagingException; /** * Sets the Content-Language header of this part. * @param languages the array of language tags * @exception IllegalWriteException if the underlying implementation does not * support modification * @exception IllegalStateException if this Part is obtained from a READ_ONLY * folder */ void setContentLanguage(String[] languages) throws MessagingException; /** * Sets the content of this message using the specified text, and with a * MIME type of "text/plain". *

      * If the string contains non US-ASCII characters, it will be encoded * using the platform default charset. * @param text the text content */ void setText(String text) throws MessagingException; /** * Sets the content of this message using the specified text, and with a * MIME type of "text/plain". *

      * If the string contains non US-ASCII characters, it will be encoded * using the specified charset. * @param text the text content * @param charset the charset to use for any encoding */ void setText(String text, String charset) throws MessagingException; /** * Sets the content of this message using the specified text, and with a * text MIME type of the specified subtype. *

      * If the string contains non US-ASCII characters, it will be encoded * using the specified charset. * @param text the text content * @param charset the charset to use for any encoding * @param subtype the MIME text subtype (e.g. "plain", "html") * @since JavaMail 1.4 */ void setText(String text, String charset, String subtype) throws MessagingException; } mail-1.1.2/source/javax/mail/internet/MimePartDataSource.java0000664000076500007650000000710010614714012023526 0ustar dogdog00000000000000/* * MimePartDataSource.java * Copyright (C) 2002, 2005 The Free Software Foundation * * This file is part of GNU JavaMail, a library. * * GNU JavaMail is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * GNU JavaMail 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * As a special exception, if you link this library with other files to * produce an executable, this library does not by itself cause the * resulting executable to be covered by the GNU General Public License. * This exception does not however invalidate any other reasons why the * executable file might be covered by the GNU General Public License. */ package javax.mail.internet; import java.io.InputStream; import java.io.IOException; import java.io.OutputStream; import java.net.UnknownServiceException; import javax.activation.DataSource; import javax.mail.MessageAware; import javax.mail.MessageContext; import javax.mail.MessagingException; /** * A data source that manages content for a MIME part. * * @author Chris Burdess * @version 1.4 */ public class MimePartDataSource implements DataSource, MessageAware { /** * The part. * @since JavaMail 1.4 */ protected MimePart part; /* * Manages a MessageContext on behalf of the part. * @see #getMessageContext */ private MessageContext context; /** * Constructor with a MIME part. */ public MimePartDataSource(MimePart part) { this.part = part; } /** * Returns an input stream from the MIME part. *

      * This method applies the appropriate transfer-decoding, based on the * Content-Transfer-Encoding header of the MimePart. */ public InputStream getInputStream() throws IOException { try { InputStream is; if (part instanceof MimeBodyPart) { is = ((MimeBodyPart) part).getContentStream(); } else if (part instanceof MimeMessage) { is = ((MimeMessage) part).getContentStream(); } else { throw new MessagingException("Unknown part type"); } String encoding = part.getEncoding(); return (encoding != null) ? MimeUtility.decode(is, encoding) : is; } catch (MessagingException e) { throw new IOException(e.getMessage()); } } public OutputStream getOutputStream() throws IOException { throw new UnknownServiceException(); } public String getContentType() { try { return part.getContentType(); } catch (MessagingException e) { return null; } } public String getName() { // Shouldn't this return the filename parameter of the // Content-Disposition of a MimeBodyPart, if available? return ""; } /** * Returns the message context for the current part. */ public MessageContext getMessageContext() { if (context == null) { context = new MessageContext(part); } return context; } } mail-1.1.2/source/javax/mail/internet/MimeUtility.java0000664000076500007650000010227210614714012022316 0ustar dogdog00000000000000/* * MimeUtility.java * Copyright (C) 2002, 2004, 2005 The Free Software Foundation * * This file is part of GNU JavaMail, a library. * * GNU JavaMail is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * GNU JavaMail 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * As a special exception, if you link this library with other files to * produce an executable, this library does not by itself cause the * resulting executable to be covered by the GNU General Public License. * This exception does not however invalidate any other reasons why the * executable file might be covered by the GNU General Public License. */ package javax.mail.internet; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.EOFException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.IOException; import java.io.OutputStream; import java.io.UnsupportedEncodingException; import java.util.HashMap; import java.util.StringTokenizer; import java.util.NoSuchElementException; import javax.activation.DataHandler; import javax.activation.DataSource; import javax.mail.MessagingException; import javax.mail.Session; import gnu.inet.util.LineInputStream; import gnu.mail.util.Base64InputStream; import gnu.mail.util.Base64OutputStream; import gnu.mail.util.BOutputStream; import gnu.mail.util.QInputStream; import gnu.mail.util.QOutputStream; import gnu.mail.util.QPInputStream; import gnu.mail.util.QPOutputStream; import gnu.mail.util.UUInputStream; import gnu.mail.util.UUOutputStream; /** * This is a utility class providing micellaneous MIME-related functionality. * * @author Chris Burdess * @version 1.4 */ public class MimeUtility { /* * Uninstantiable. */ private MimeUtility() { } /** * Returns the Content-Transfer-Encoding that should be applied to the input * stream of this data source, to make it mail safe. *

        *
      • If the primary type of this datasource is "text" and if all the bytes * in its input stream are US-ASCII, then the encoding is "7bit". If more * than half of the bytes are non-US-ASCII, then the encoding is "base64". * If less than half of the bytes are non-US-ASCII, then the encoding is * "quoted-printable". *
      • If the primary type of this datasource is not "text", then if all the * bytes of its input stream are US-ASCII, the encoding is "7bit". If * there is even one non-US-ASCII character, the encoding is "base64". * @param ds the data source * @return "7bit", "quoted-printable" or "base64" */ public static String getEncoding(DataSource ds) { String encoding = "base64"; InputStream is = null; try { is = ds.getInputStream(); ContentType ct = new ContentType(ds.getContentType()); boolean text = ct.match("text/*"); switch (asciiStatus(is, ALL, text)) { case ALL_ASCII: encoding = "7bit"; break; case MAJORITY_ASCII: if (text) { encoding = "quoted-printable"; } break; } } catch (Exception e) { } try { is.close(); } catch (IOException e) { } return encoding; } /** * Returns the Content-Transfer-Encoding that needs to be applied to the * given content in order to make it mail safe. * This is the same as the getEncoding(DataSource) method * except that instead of reading the data from an input stream it uses * the writeTo method to examine the data, which can be more * efficient. */ public static String getEncoding(DataHandler dh) { String encoding = "base64"; if (dh.getName() != null) { return getEncoding(dh.getDataSource()); } try { ContentType ct = new ContentType(dh.getContentType()); boolean text = ct.match("text/*"); AsciiOutputStream aos = new AsciiOutputStream(!text, encodeeolStrict() && !text); try { dh.writeTo(aos); } catch (IOException e) { } switch (aos.status()) { case ALL_ASCII: encoding = "7bit"; break; case MAJORITY_ASCII: if (text) { encoding = "quoted-printable"; } break; } } catch (Exception e) { } return encoding; } /** * Decodes the given input stream. * All the encodings defined in RFC 2045 are supported here, including * "base64", "quoted-printable", "7bit", "8bit", and "binary". * "uuencode" is also supported. * @param is the input stream * @param encoding the encoding * @return the decoded input stream */ public static InputStream decode(InputStream is, String encoding) throws MessagingException { if (encoding.equalsIgnoreCase("base64")) { return new Base64InputStream(is); } if (encoding.equalsIgnoreCase("quoted-printable")) { return new QPInputStream(is); } if (encoding.equalsIgnoreCase("uuencode") || encoding.equalsIgnoreCase("x-uuencode")) { return new UUInputStream(is); } if (encoding.equalsIgnoreCase("binary") || encoding.equalsIgnoreCase("7bit") || encoding.equalsIgnoreCase("8bit")) { return is; } throw new MessagingException("Unknown encoding: " + encoding); } /** * Encodes the given output stream. * All the encodings defined in RFC 2045 are supported here, including * "base64", "quoted-printable", "7bit", "8bit" and "binary". * "uuencode" is also supported. * @param os the output stream * @param encoding the encoding * @return an output stream that applies the specified encoding */ public static OutputStream encode(OutputStream os, String encoding) throws MessagingException { if (encoding == null) { return os; } if (encoding.equalsIgnoreCase("base64")) { return new Base64OutputStream(os); } if (encoding.equalsIgnoreCase("quoted-printable")) { return new QPOutputStream(os); } if (encoding.equalsIgnoreCase("uuencode") || encoding.equalsIgnoreCase("x-uuencode")) { return new UUOutputStream(os); } if (encoding.equalsIgnoreCase("binary") || encoding.equalsIgnoreCase("7bit") || encoding.equalsIgnoreCase("8bit")) { return os; } throw new MessagingException("Unknown encoding: " + encoding); } /** * Encodes the given output stream. * All the encodings defined in RFC 2045 are supported here, including * "base64", "quoted-printable", "7bit", "8bit" and "binary". * "uuencode" is also supported. * @param os the output stream * @param encoding the encoding * @param filename the name for the file being encoded (this is only used * with the uuencode encoding) * @return an output stream that applies the specified encoding */ public static OutputStream encode(OutputStream os, String encoding, String filename) throws MessagingException { if (encoding == null) { return os; } if (encoding.equalsIgnoreCase("base64")) { return new Base64OutputStream(os); } if (encoding.equalsIgnoreCase("quoted-printable")) { return new QPOutputStream(os); } if (encoding.equalsIgnoreCase("uuencode") || encoding.equalsIgnoreCase("x-uuencode")) { return new UUOutputStream(os, filename); } if (encoding.equalsIgnoreCase("binary") || encoding.equalsIgnoreCase("7bit") || encoding.equalsIgnoreCase("8bit")) { return os; } throw new MessagingException("Unknown encoding: " + encoding); } /** * Encodes an RFC 822 "text" token into mail-safe form according to * RFC 2047. * @param text the Unicode string * @param UnsupportedEncodingException if the encoding fails */ public static String encodeText(String text) throws UnsupportedEncodingException { return encodeText(text, null, null); } /** * Encodes an RFC 822 "text" token into mail-safe form according to * RFC 2047. * @param text the Unicode string * @param charset the charset, or null to use the platform default charset * @param encoding the encoding to be used ("B" or "Q") */ public static String encodeText(String text, String charset, String encoding) throws UnsupportedEncodingException { return encodeWord(text, charset, encoding, false); } /** * Decodes headers that are defined as '*text' in RFC 822. * @param etext the possibly encoded value * @exception UnsupportedEncodingException if the charset conversion failed */ public static String decodeText(String etext) throws UnsupportedEncodingException { String delimiters = "\t\n\r "; if (etext.indexOf("=?") == -1) { return etext; } StringTokenizer st = new StringTokenizer(etext, delimiters, true); StringBuffer buffer = new StringBuffer(); StringBuffer extra = new StringBuffer(); boolean decoded = false; while (st.hasMoreTokens()) { String token = st.nextToken(); char c = token.charAt(0); if (delimiters.indexOf(c) > -1) { extra.append(c); } else { try { token = decodeWord(token); if (!decoded && extra.length() > 0) { buffer.append(extra); } decoded = true; } catch (ParseException e) { if (!decodetextStrict()) { token = decodeInnerText(token); } if (extra.length() > 0) { buffer.append(extra); } decoded = false; } buffer.append(token); extra.setLength(0); } } return buffer.toString(); } /** * Encodes an RFC 822 "word" token into mail-safe form according to * RFC 2047. * @param text the Unicode string * @exception UnsupportedEncodingException if the encoding fails */ public static String encodeWord(String text) throws UnsupportedEncodingException { return encodeWord(text, null, null); } /** * Encodes an RFC 822 "word" token into mail-safe form according to * RFC 2047. * @param text the Unicode string * @param charset the charset, or null to use the platform default charset * @param encoding the encoding to be used ("B" or "Q") * @exception UnsupportedEncodingException if the encoding fails */ public static String encodeWord(String text, String charset, String encoding) throws UnsupportedEncodingException { return encodeWord(text, charset, encoding, true); } private static String encodeWord(String text, String charset, String encoding, boolean word) throws UnsupportedEncodingException { if (asciiStatus(text.getBytes()) == ALL_ASCII) { return text; } String javaCharset; if (charset == null) { javaCharset = getDefaultJavaCharset(); charset = mimeCharset(javaCharset); } else { javaCharset = javaCharset(charset); } if (encoding == null) { byte[] bytes = text.getBytes(javaCharset); if (asciiStatus(bytes) != MINORITY_ASCII) { encoding = "Q"; } else { encoding = "B"; } } boolean bEncoding; if (encoding.equalsIgnoreCase("B")) { bEncoding = true; } else if (encoding.equalsIgnoreCase("Q")) { bEncoding = false; } else { throw new UnsupportedEncodingException("Unknown transfer encoding: " + encoding); } StringBuffer encodingBuffer = new StringBuffer(); encodingBuffer.append("=?"); encodingBuffer.append(charset); encodingBuffer.append("?"); encodingBuffer.append(encoding); encodingBuffer.append("?"); StringBuffer buffer = new StringBuffer(); encodeBuffer(buffer, text, javaCharset, bEncoding, 68 - charset.length(), encodingBuffer.toString(), true, word); return buffer.toString(); } private static void encodeBuffer(StringBuffer buffer, String text, String charset, boolean bEncoding, int max, String encoding, boolean keepTogether, boolean word) throws UnsupportedEncodingException { byte[] bytes = text.getBytes(charset); int elen; if (bEncoding) { elen = BOutputStream.encodedLength(bytes); } else { elen = QOutputStream.encodedLength(bytes, word); } int len = text.length(); if (elen > max && len > 1) { encodeBuffer(buffer, text.substring(0, len / 2), charset, bEncoding, max, encoding, keepTogether, word); encodeBuffer(buffer, text.substring(len / 2, len), charset, bEncoding, max, encoding, false, word); } else { ByteArrayOutputStream bos = new ByteArrayOutputStream(); OutputStream os = null; if (bEncoding) { os = new BOutputStream(bos); } else { os = new QOutputStream(bos, word); } try { os.write(bytes); os.close(); } catch (IOException e) { } bytes = bos.toByteArray(); if (!keepTogether) { buffer.append("\r\n "); } buffer.append(encoding); for (int i = 0; i < bytes.length; i++) { buffer.append((char) bytes[i]); } buffer.append("?="); } } /** * Decodes the specified string using the RFC 2047 rules for parsing an * "encoded-word". * @param eword the possibly encoded value * @exception ParseException if the string is not an encoded-word * @exception UnsupportedEncodingException if the decoding failed */ public static String decodeWord(String text) throws ParseException, UnsupportedEncodingException { if (!text.startsWith("=?")) { throw new ParseException(); } int start = 2; int end = text.indexOf('?', start); if (end < 0) { throw new ParseException(); } String charset = text.substring(start, end); // Allow for RFC2231 language int si = charset.indexOf('*'); if (si != -1) { charset = charset.substring(0, si); } charset = javaCharset(charset); start = end + 1; end = text.indexOf('?', start); if (end < 0) { throw new ParseException(); } String encoding = text.substring(start, end); start = end + 1; end = text.indexOf("?=", start); if (end < 0) { throw new ParseException(); } text = text.substring(start, end); try { // The characters in the remaining string must all be 7-bit clean. // Therefore it is safe just to copy them verbatim into a byte array. char[] chars = text.toCharArray(); int len = chars.length; byte[] bytes = new byte[len]; for (int i = 0; i < len; i++) { bytes[i] = (byte) chars[i]; } ByteArrayInputStream bis = new ByteArrayInputStream(bytes); InputStream is; if (encoding.equalsIgnoreCase("B")) { is = new Base64InputStream(bis); } else if (encoding.equalsIgnoreCase("Q")) { is = new QInputStream(bis); } else { throw new UnsupportedEncodingException("Unknown encoding: " + encoding); } len = bis.available(); bytes = new byte[len]; len = is.read(bytes, 0, len); String ret = new String(bytes, 0, len, charset); if (text.length() > end + 2) { String extra = text.substring(end + 2); if (!decodetextStrict()) { extra = decodeInnerText(extra); } ret = ret + extra; } return ret; } catch (IOException e) { throw new ParseException(); } catch (IllegalArgumentException e) { throw new UnsupportedEncodingException(); } } /** * Indicates that we should consider a lone CR or LF in a body part * that's not a MIME text type to indicate that the body part * needs to be encoded. * @since JavaMail 1.3 */ private static boolean encodeeolStrict() { try { String encodeeolStrict = System.getProperty("mail.mime.encodeeol.strict", "false"); return Boolean.valueOf(encodeeolStrict).booleanValue(); } catch (SecurityException e) { return false; } } /** * Indicates if text in the middle of words should be decoded. * @since JavaMail 1.3 */ private static boolean decodetextStrict() { try { String decodetextStrict = System.getProperty("mail.mime.decodetext.strict", "true"); return Boolean.valueOf(decodetextStrict).booleanValue(); } catch (SecurityException e) { return true; } } /** * Decodes text in the middle of the specified text. * @since JavaMail 1.3 */ private static String decodeInnerText(String text) throws UnsupportedEncodingException { final String LD = "=?", RD = "?="; int pos = 0; StringBuffer buffer = new StringBuffer(); for (int start = text.indexOf(LD, pos); start != -1; start = text.indexOf(LD, pos)) { int end = text.indexOf(RD, start + 2); if (end == -1) { break; } buffer.append(text.substring(pos, start)); pos = end + 2; String encoded = text.substring(start, pos); try { buffer.append(decodeWord(encoded)); } catch (ParseException e) { buffer.append(encoded); } } if (buffer.length() > 0) { if (pos < text.length()) { buffer.append(text.substring(pos)); } return buffer.toString(); } return text; } /** * Quotes the specified word, if it contains any characters from the * given "specials" list. *

        * The HeaderTokenizer class defines two "specials" lists, * MIME and RFC 822. * @param word the word to be quoted * @param specials the set of special characters */ public static String quote(String text, String specials) { int len = text.length(); boolean needsQuotes = false; for (int i = 0; i < len; i++) { char c = text.charAt(i); if (c == '\n' || c == '\r' || c == '"' || c == '\\') { StringBuffer buffer = new StringBuffer(len + 3); buffer.append('"'); for (int j = 0; j < len; j++) { char c2 = text.charAt(j); if (c2 == '"' || c2 == '\\' || c2 == '\r' || c2 == '\n') { buffer.append('\\'); } buffer.append(c2); } buffer.append('"'); return buffer.toString(); } if (c < ' ' || c > '\177' || specials.indexOf(c) >= 0) { needsQuotes = true; } } if (needsQuotes) { StringBuffer buffer = new StringBuffer(len + 2); buffer.append('"'); buffer.append(text); buffer.append('"'); return buffer.toString(); } return text; } // -- Java and MIME charset conversions -- /* * Map of MIME charset names to Java charset names. */ private static HashMap mimeCharsets; /* * Map of Java charset names to MIME charset names. */ private static HashMap javaCharsets; /* * Indicates if we are using Java 1.2 - if so, we return "Java" charsets * instead of MIME charsets. */ private static boolean java12; /* * Load the charset conversion tables. */ static { String mappings = "/META-INF/javamail.charset.map"; InputStream in = (MimeUtility.class).getResourceAsStream(mappings); if (in != null) { mimeCharsets = new HashMap(10); javaCharsets = new HashMap(20); LineInputStream lin = new LineInputStream(in); parse(mimeCharsets, lin); parse(javaCharsets, lin); } try { String version = System.getProperty("java.version"); java12 = (version.startsWith("1.2") || version.startsWith("1.1")); } catch (SecurityException e) { // TODO } } /* * Parse a charset map stream. */ private static void parse(HashMap mappings, LineInputStream lin) { try { while (true) { String line = lin.readLine(); if (line == null || (line.startsWith("--") && line.endsWith("--"))) { return; } if (line.trim().length() != 0 && !line.startsWith("#")) { StringTokenizer st = new StringTokenizer(line, "\t "); try { String key = st.nextToken(); String value = st.nextToken(); mappings.put(key.toLowerCase(), value); } catch (NoSuchElementException e2) { } } } } catch (IOException e) { e.printStackTrace(); } } /** * Converts a MIME charset name into a Java charset name. * @param charset the MIME charset name */ public static String javaCharset(String charset) { if (mimeCharsets == null || charset == null) { return charset; } String jc = (String) mimeCharsets.get(charset.toLowerCase()); if (jc != null) { if (java12) { return jc; } else { String mc = (String) javaCharsets.get(jc.toLowerCase()); return (mc != null) ? mc : charset; } } return charset; } /** * Converts a Java charset name into a MIME charset name. * @param charset the Java charset name */ public static String mimeCharset(String charset) { if (javaCharsets == null || charset == null) { return charset; } String mc = (String) javaCharsets.get(charset.toLowerCase()); return (mc != null) ? mc : charset; } // -- Java default charset -- /* * Local cache for the system default Java charset. * @see #getDefaultJavaCharset */ private static String defaultJavaCharset; /** * Returns the default Java charset. */ public static String getDefaultJavaCharset() { if (defaultJavaCharset == null) { try { // Use mail.mime.charset as of JavaMail 1.3 defaultJavaCharset = System.getProperty("mail.mime.charset"); if (defaultJavaCharset == null) { defaultJavaCharset = System.getProperty("file.encoding", "UTF-8"); } } catch (SecurityException e) { // InputStreamReader has access to the platform default encoding. // We create a dummy input stream to feed it with, just to get // this encoding value. InputStreamReader isr = new InputStreamReader(new InputStream() { public int read() { return 0; } }); defaultJavaCharset = isr.getEncoding(); // If all else fails use UTF-8 if (defaultJavaCharset == null) { defaultJavaCharset = "UTF-8"; } } } return javaCharset(defaultJavaCharset); } // -- Calculating multipart boundaries -- private static int part = 0; /* * Returns a suitably unique boundary value. */ static String getUniqueBoundaryValue() { StringBuffer buffer = new StringBuffer(); buffer.append("----=_Part_"); buffer.append(part++); buffer.append("_"); buffer.append(Math.abs(buffer.hashCode())); buffer.append('.'); buffer.append(System.currentTimeMillis()); return buffer.toString(); } /* * Returns a suitably unique Message-ID value. */ static String getUniqueMessageIDValue(Session session) { InternetAddress localAddress = InternetAddress.getLocalAddress(session); String address = (localAddress != null) ? localAddress.getAddress() : "javamailuser@localhost"; StringBuffer buffer = new StringBuffer(); buffer.append(Math.abs(getUniqueBoundaryValue().hashCode())); buffer.append('.'); buffer.append(System.currentTimeMillis()); buffer.append('.'); buffer.append("JavaMail."); buffer.append(address); return buffer.toString(); } // These methods provide checks on whether collections of bytes contain // all-ASCII, majority-ASCII, or minority-ASCII bytes. // Constants public static final int ALL = -1; static final int ALL_ASCII = 1; static final int MAJORITY_ASCII = 2; static final int MINORITY_ASCII = 3; static int asciiStatus(byte[] bytes) { int asciiCount = 0; int nonAsciiCount = 0; for (int i = 0; i < bytes.length; i++) { if (isAscii((int) bytes[i])) { asciiCount++; } else { nonAsciiCount++; } } if (nonAsciiCount == 0) { return ALL_ASCII; } return (asciiCount <= nonAsciiCount) ? MINORITY_ASCII : MAJORITY_ASCII; } static int asciiStatus(InputStream is, int len, boolean text) { int asciiCount = 0; int nonAsciiCount = 0; int blockLen = 4096; int lineLen = 0; boolean islong = false; byte[] bytes = null; if (len != 0) { blockLen = (len != ALL) ? Math.min(len, 4096) : 4096; bytes = new byte[blockLen]; } while (len != 0) { int readLen; try { readLen = is.read(bytes, 0, blockLen); if (readLen < 0) { break; } for (int i = 0; i < readLen; i++) { int c = bytes[i] & 0xff; if (c == 13 || c == 10) { lineLen = 0; } else { lineLen++; if (lineLen > 998) { islong = true; } } if (isAscii(c)) { asciiCount++; } else { if (text) { return MINORITY_ASCII; } nonAsciiCount++; } } } catch (IOException e) { break; } if (len != -1) { len -= readLen; } } if (len == 0 && text) { return MINORITY_ASCII; } if (nonAsciiCount == 0) { return !islong ? ALL_ASCII : MAJORITY_ASCII; } return (asciiCount <= nonAsciiCount) ? MINORITY_ASCII : MAJORITY_ASCII; } private static final boolean isAscii(int c) { if (c < 0) { c += 0xff; } return (c < 128 && c > 31) || c == 13 || c == 10 || c == 9; } /* * This is used by the getEncoding(DataHandler) method to ascertain which * encoding scheme to use. It embodies the same algorithm as the * asciiStatus methods above. */ static class AsciiOutputStream extends OutputStream { static final int LF = 0x0a; static final int CR = 0x0d; private boolean strict; private boolean eolStrict; private int asciiCount = 0; private int nonAsciiCount = 0; private int ret; private int len; private int last = -1; private boolean islong = false; private boolean eolCheckFailed = false; public AsciiOutputStream(boolean strict, boolean eolStrict) { this.strict = strict; this.eolStrict = eolStrict; } public void write(int c) throws IOException { check(c); } public void write(byte[] bytes) throws IOException { write(bytes, 0, bytes.length); } public void write(byte[] bytes, int offset, int length) throws IOException { length += offset; for (int i = offset; i < length; i++) { check(bytes[i]); } } private final void check(int c) throws IOException { c &= 0xff; if (eolStrict) { if (last == CR && c != LF || last != CR && c == LF) { eolCheckFailed = true; } } if (c == CR || c == LF) { len = 0; } else { len++; if (len > 998) { islong = true; } } if (c > 127) { nonAsciiCount++; if (strict) { ret = MINORITY_ASCII; throw new EOFException(); } } else { asciiCount++; } last = c; } int status() { if (ret != 0) { return ret; } if (eolCheckFailed) { return MINORITY_ASCII; } if (nonAsciiCount == 0) { return !islong ? ALL_ASCII : MAJORITY_ASCII; } return (asciiCount <= nonAsciiCount) ? MAJORITY_ASCII : MINORITY_ASCII; } } /** * Folds the specified string such that each line is no longer than 76 * characters, whitespace permitting. * @param used the number of characters used in the line already * @param s the string to fold * @since JavaMail 1.4 */ public static String fold(int used, String s) { int len = s.length(); int k = Math.min(76 - used, len); if (k == len) return s; StringBuffer buf = new StringBuffer(); int i; do { i = whitespaceIndexOf(s, k, -1, len); if (i == -1) i = whitespaceIndexOf(s, k, 1, len); if (i != -1) { buf.append(s.substring(0, i)); buf.append('\n'); s = s.substring(i); len -= i; } k = Math.min(76, len); } while (i != -1); buf.append(s); return buf.toString(); } private static int whitespaceIndexOf(String s, int offset, int step, int len) { for (int i = offset; i > 0 && i < len; i += step) { char c = s.charAt(i); if (c == ' ' || c == '\t') return i; } return -1; } /** * Unfolds a folded header. * @param s the header to unfold * @since JavaMail 1.4 */ public static String unfold(String s) { StringBuffer buf = null; int start = 0, len = s.length(); for (int end = start; end < len; end++) { char c = s.charAt(end); if (c == '\n' && end < (len - 1)) { char d = s.charAt(end + 1); if (d == ' ' || d == '\t') { String head = s.substring(start, end); if (buf == null) buf = new StringBuffer(); buf.append(head); start = end + 1; } } } if (buf == null) return s; buf.append(s.substring(start)); return buf.toString(); } } mail-1.1.2/source/javax/mail/internet/NewsAddress.java0000664000076500007650000001175610614714012022273 0ustar dogdog00000000000000/* * NewsAddress.java * Copyright (C) 2002 The Free Software Foundation * * This file is part of GNU JavaMail, a library. * * GNU JavaMail is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * GNU JavaMail 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * As a special exception, if you link this library with other files to * produce an executable, this library does not by itself cause the * resulting executable to be covered by the GNU General Public License. * This exception does not however invalidate any other reasons why the * executable file might be covered by the GNU General Public License. */ package javax.mail.internet; import java.util.ArrayList; import java.util.StringTokenizer; import javax.mail.Address; /** * An RFC 1036 newsgroup address. * * @author Chris Burdess * @version 1.4 */ public class NewsAddress extends Address { /* * The address type. */ private static final String TYPE = "news"; /** * The name of the newsgroup. */ protected String newsgroup; /** * The hostname of the news server. */ protected String host; /** * Constructor for an empty news address. */ public NewsAddress() { } /** * Constructor with the given newsgroup. * @param newsgroup the newsgroup */ public NewsAddress(String newsgroup) { this(newsgroup, null); } /** * Constructor with the given newsgroup and host. * @param newsgroup the newsgroup * @param host the host */ public NewsAddress(String newsgroup, String host) { this.newsgroup = newsgroup; this.host = host; } /** * Returns the type of this address. * The type of a NewsAddress is "news". */ public String getType() { return TYPE; } /** * Sets the newsgroup. * @param newsgroup the newsgroup */ public void setNewsgroup(String newsgroup) { this.newsgroup = newsgroup; } /** * Returns the newsgroup. */ public String getNewsgroup() { return newsgroup; } /** * Sets the hostname of the news server. * @param host the host name */ public void setHost(String host) { this.host = host; } /** * Returns the hostname of the news server. */ public String getHost() { return host; } /** * Returns an RFC 1036 string representation of this address. */ public String toString() { return newsgroup; } public boolean equals(Object a) { if (a instanceof NewsAddress) { NewsAddress na = (NewsAddress) a; return (newsgroup.equals(na.newsgroup) && ((host == null && na.host == null) || (host != null && na.host != null && host.equalsIgnoreCase(na.host)))); } return false; } public int hashCode() { int hashCode = 0; if (newsgroup != null) { hashCode += newsgroup.hashCode(); } if (host != null) { hashCode += host.hashCode(); } return hashCode; } /** * Converts the given array of NewsAddresses into a comma-separated * sequence of address strings. * The resulting string contains only US-ASCII characters, and is * therefore mail-safe. * @param addresses the NewsAddress objects * @exception ClassCastException if any of the specified addresses * is not a NewsAddress */ public static String toString(Address[] addresses) { if (addresses == null || addresses.length == 0) { return null; } StringBuffer buffer = new StringBuffer(); for (int i = 0; i < addresses.length; i++) { if (i > 0) { buffer.append(','); } // possible ClassCastException... NewsAddress na = (NewsAddress) addresses[i]; buffer.append(na.toString()); } return buffer.toString(); } /** * Parses the given comma-separated sequence of newsgroups into * NewsAddresses. * @param newsgroups a comma-separated newsgroup string * @exception AddressException if the parse failed */ public static NewsAddress[] parse(String newsgroups) throws AddressException { StringTokenizer st = new StringTokenizer(newsgroups, ","); ArrayList acc = new ArrayList(); while (st.hasMoreTokens()) { acc.add(new NewsAddress(st.nextToken())); } NewsAddress[] addresses = new NewsAddress[acc.size()]; acc.toArray(addresses); return addresses; } } mail-1.1.2/source/javax/mail/internet/package.html0000664000076500007650000000010310614714012021447 0ustar dogdog00000000000000

        Classes modelling Internet mail systems.

        mail-1.1.2/source/javax/mail/internet/ParameterList.java0000664000076500007650000003025010614714012022613 0ustar dogdog00000000000000/* * ParameterList.java * Copyright (C) 2002, 2005 The Free Software Foundation * * This file is part of GNU JavaMail, a library. * * GNU JavaMail is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * GNU JavaMail 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * As a special exception, if you link this library with other files to * produce an executable, this library does not by itself cause the * resulting executable to be covered by the GNU General Public License. * This exception does not however invalidate any other reasons why the * executable file might be covered by the GNU General Public License. */ package javax.mail.internet; import java.io.UnsupportedEncodingException; import java.security.AccessController; import java.security.PrivilegedAction; import java.util.ArrayList; import java.util.Enumeration; import java.util.LinkedHashMap; import java.util.Iterator; import java.util.Map; import gnu.inet.util.GetSystemPropertyAction; /** * A list of MIME parameters. MIME parameters are name-value pairs * associated with a MIME header. * * @author Chris Burdess * @version 1.4 */ public class ParameterList { /* * The underlying storage. */ private LinkedHashMap list = new LinkedHashMap(); /** * Constructor for an empty parameter list. */ public ParameterList() { } /** * Constructor with a parameter-list string. * @param s the parameter-list string * @exception ParseException if the parse fails */ public ParameterList(String s) throws ParseException { PrivilegedAction a = new GetSystemPropertyAction("mail.mime.decodeparameters"); boolean decodeParameters = "true".equals(AccessController.doPrivileged(a)); LinkedHashMap charsets = new LinkedHashMap(); HeaderTokenizer ht = new HeaderTokenizer(s, HeaderTokenizer.MIME); for (int type = 0; type != HeaderTokenizer.Token.EOF; ) { HeaderTokenizer.Token token = ht.next(); type = token.getType(); if (type != HeaderTokenizer.Token.EOF) { if (type != 0x3b) // ';' { throw new ParseException("expected ';': " + s); } token = ht.next(); type = token.getType(); if (type != HeaderTokenizer.Token.ATOM) { throw new ParseException("expected parameter name: " + s); } String key = token.getValue().toLowerCase(); token = ht.next(); type = token.getType(); if (type != 0x3d) // '=' { throw new ParseException("expected '=': " + s); } token = ht.next(); type = token.getType(); if (type != HeaderTokenizer.Token.ATOM && type != HeaderTokenizer.Token.QUOTEDSTRING) { throw new ParseException("expected parameter value: " + s); } String value = token.getValue(); // Handle RFC 2231 encoding and continuations // This will handle out-of-order extended-other-values // but the extended-initial-value must precede them int si = key.indexOf('*'); if (decodeParameters && si > 0) { int len = key.length(); if (si == len - 1 || (si == len - 3 && key.charAt(si + 1) == '0' && key.charAt(si + 2) == '*')) { // extended-initial-name key = key.substring(0, si); // extended-initial-value int ai = value.indexOf('\''); if (ai == -1) { throw new ParseException("no charset specified: " + value); } String charset = value.substring(0, ai); charset = MimeUtility.javaCharset(charset); charsets.put(key, charset); // advance to last apostrophe for (int i = value.indexOf('\'', ai + 1); i != -1; ) { ai = i; i = value.indexOf('\'', ai + 1); } value = decode(value.substring(ai + 1), charset); ArrayList values = new ArrayList(); set(values, 0, value); list.put(key, values); } else { // extended-other-name int end = (key.charAt(len - 1) == '*') ? len - 1 : len; int section = -1; try { section = Integer.parseInt(key.substring(si + 1, end)); if (section < 1) { throw new NumberFormatException(); } } catch (NumberFormatException e) { throw new ParseException("invalid section: " + key); } key = key.substring(0, si); // extended-other-value String charset = (String) charsets.get(key); ArrayList values = (ArrayList) list.get(key); if (charset == null || values == null) { throw new ParseException("no initial extended " + "parameter for '" + key + "'"); } if (type == HeaderTokenizer.Token.ATOM) { value = decode(value, charset); } set(values, section, value); } } else { set(key, value, null); } } } // Replace list values by string concatenations of their components int len = list.size(); String[] keys = new String[len]; list.keySet().toArray(keys); for (int i = 0; i < len; i++) { Object value = list.get(keys[i]); if (value instanceof ArrayList) { ArrayList values = (ArrayList) value; StringBuffer buf = new StringBuffer(); for (Iterator j = values.iterator(); j.hasNext(); ) { String comp = (String) j.next(); if (comp != null) { buf.append(comp); } } String charset = (String) charsets.get(keys[i]); set(keys[i], buf.toString(), charset); } } } private void set(ArrayList list, int index, Object value) { int len = list.size(); while (index > len - 1) { list.add(null); len++; } list.set(index, value); } private String decode(String text, String charset) throws ParseException { char[] schars = text.toCharArray(); int slen = schars.length; byte[] dchars = new byte[slen]; int dlen = 0; for (int i = 0; i < slen; i++) { char c = schars[i]; if (c == '%') { if (i + 3 > slen) { throw new ParseException("malformed: " + text); } int val = Character.digit(schars[i + 2], 16) + Character.digit(schars[i + 1], 16) * 16; dchars[dlen++] = ((byte) val); i += 2; } else { dchars[dlen++] = ((byte) c); } } try { return new String(dchars, 0, dlen, charset); } catch (UnsupportedEncodingException e) { throw new ParseException("Unsupported encoding: " + charset); } } /** * Returns the number of parameters in this list. */ public int size() { return list.size(); } /** * Returns the value of the specified parameter. * Parameter names are case insensitive. * @param name the parameter name */ public String get(String name) { String[] vc = (String[]) list.get(name.toLowerCase().trim()); return (vc != null) ? vc[0] : null; } /** * Sets the specified parameter. * @param name the parameter name * @param value the parameter value */ public void set(String name, String value) { set(name, value, null); } /** * Sets the specified parameter. * @param name the parameter name * @param value the parameter value * @param charset the character set to use to encode the value, if * mail.mime.encodeparameters is true. * @since JavaMail 1.5 */ public void set(String name, String value, String charset) { String[] vc = new String[] { value, charset }; list.put(name.toLowerCase().trim(), vc); } /** * Removes the specified parameter from this list. * @param name the parameter name */ public void remove(String name) { list.remove(name.toLowerCase().trim()); } /** * Returns the names of all parameters in this list. * @return an Enumeration of String */ public Enumeration getNames() { return new ParameterEnumeration(list.keySet().iterator()); } /** * Returns the MIME string representation of this parameter list. */ public String toString() { // Simply calls toString(int) with a used value of 0. return toString(0); } /** * Returns the MIME string representation of this parameter list. * @param used the number of character positions already used in the * field into which the parameter list is to be inserted */ public String toString(int used) { PrivilegedAction a = new GetSystemPropertyAction("mail.mime.encodeparameters"); boolean encodeParameters = "true".equals(AccessController.doPrivileged(a)); StringBuffer buffer = new StringBuffer(); for (Iterator i = list.entrySet().iterator(); i.hasNext(); ) { Map.Entry entry = (Map.Entry) i.next(); String key = (String) entry.getKey(); String[] vc = (String[]) entry.getValue(); String value = vc[0]; String charset = vc[1]; if (encodeParameters) { try { value = MimeUtility.encodeText(value, charset, "Q"); } catch (UnsupportedEncodingException e) { // ignore } } value = MimeUtility.quote(value, HeaderTokenizer.MIME); // delimiter buffer.append("; "); used += 2; // wrap to next line if necessary int len = key.length() + value.length() + 1; if ((used + len) > 76) { buffer.append("\r\n\t"); used = 8; } // append key=value buffer.append(key); buffer.append('='); buffer.append(value); } return buffer.toString(); } /* * Needed to provide an enumeration interface for the key iterator. */ static class ParameterEnumeration implements Enumeration { Iterator source; ParameterEnumeration(Iterator source) { this.source = source; } public boolean hasMoreElements() { return source.hasNext(); } public Object nextElement() { return source.next(); } } } mail-1.1.2/source/javax/mail/internet/ParseException.java0000664000076500007650000000333110614714012022770 0ustar dogdog00000000000000/* * ParseException.java * Copyright (C) 2002 The Free Software Foundation * * This file is part of GNU JavaMail, a library. * * GNU JavaMail is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * GNU JavaMail 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * As a special exception, if you link this library with other files to * produce an executable, this library does not by itself cause the * resulting executable to be covered by the GNU General Public License. * This exception does not however invalidate any other reasons why the * executable file might be covered by the GNU General Public License. */ package javax.mail.internet; import javax.mail.MessagingException; /** * An exception thrown to indicate an error parsing RFC822 or MIME headers. * * @author Chris Burdess * @version 1.4 */ public class ParseException extends MessagingException { /** * Constructor with no detail message. */ public ParseException() { } /** * Constructor with the specified detail message. * @param s the detail message */ public ParseException(String s) { super(s); } } mail-1.1.2/source/javax/mail/internet/SharedInputStream.java0000664000076500007650000000461610614714012023450 0ustar dogdog00000000000000/* * SharedInputStream.java * Copyright (C) 2002 The Free Software Foundation * * This file is part of GNU JavaMail, a library. * * GNU JavaMail is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * GNU JavaMail 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * As a special exception, if you link this library with other files to * produce an executable, this library does not by itself cause the * resulting executable to be covered by the GNU General Public License. * This exception does not however invalidate any other reasons why the * executable file might be covered by the GNU General Public License. */ package javax.mail.internet; import java.io.InputStream; /** * An InputStream backed by data that can be shared by multiple readers. * The users of such an InputStream can determine the current position in * the InputStream, and create new InputStreams representing a subset of * the data in the original InputStream. * The new InputStream will access the same underlying data as the original, * without copying the data in it. * * @author Chris Burdess * @version 1.4 */ public interface SharedInputStream { /** * Returns the current position in the InputStream as an offset from the * beginning of the InputStream. */ long getPosition(); /** * Returns a new InputStream representing a subset of the data from this * InputStream, from start (inclusive) up to * end (exclusive). start must be non-negative. * If end is -1, the new stream ends at the same place * as this stream. The returned InputStream will also implement the * SharedInputStream interface. * @param start the start position * @param end the end position + 1 */ InputStream newStream(long start, long end); } mail-1.1.2/source/javax/mail/Message.java0000664000076500007650000003324110614714012017576 0ustar dogdog00000000000000/* * Message.java * Copyright (C) 2002 The Free Software Foundation * * This file is part of GNU JavaMail, a library. * * GNU JavaMail is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * GNU JavaMail 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * As a special exception, if you link this library with other files to * produce an executable, this library does not by itself cause the * resulting executable to be covered by the GNU General Public License. * This exception does not however invalidate any other reasons why the * executable file might be covered by the GNU General Public License. */ package javax.mail; import java.io.InvalidObjectException; import java.io.ObjectStreamException; import java.io.Serializable; import java.util.Date; import java.util.Enumeration; import javax.mail.search.SearchTerm; /** * An abstract mail message, consisting of headers and content. *

        * A message is retrieved from a folder, and is normally a lightweight * object that retrieves its properties on demand. Fetch profiles may be * used to prefetch certain properties of a message. *

        * To send a message, an appropriate subclsass is instantiated, its * properties set, and it is then delivered via a transport using the * Transport.sendMessage method. * * @see Part * @author Chris Burdess * @version 1.4 */ public abstract class Message implements Part { /** * The types of recipients to which a message can be sent. * The types defined here are TO, CC and BCC. Other types may be defined * by subclasses. */ public static class RecipientType implements Serializable { /** * Primary recipients. */ public static final RecipientType TO = new RecipientType("To"); /** * Carbon-copy recipients. */ public static final RecipientType CC = new RecipientType("Cc"); /** * "Blind" carbon-copy recipients. This type of recipient is hidden from * other recipients of the message. */ public static final RecipientType BCC = new RecipientType("Bcc"); /** * The type of recipient. */ protected String type; protected RecipientType(String type) { this.type = type; } protected Object readResolve() throws ObjectStreamException { if (type.equals("To")) { return TO; } if (type.equals("Cc")) { return CC; } if (type.equals("Bcc")) { return BCC; } throw new InvalidObjectException("Unknown RecipientType: " + type); } public String toString() { return type; } } /** * The number of this message within its folder, starting from 1, * or 0 if the message was not retrieved from a folder. */ protected int msgnum = 0; /** * True if this message has been expunged. */ protected boolean expunged = false; /** * The containing folder. */ protected Folder folder; /** * The session in scope for this message. */ protected Session session; /** * Constructor with no folder or session. */ protected Message() { folder = null; session = null; } /** * Constructor with a folder and a message number. * Used by folder implementations. * @param folder the containing folder * @param msgnum the sequence number within the folder */ protected Message(Folder folder, int msgnum) { this.folder = folder; this.msgnum = msgnum; session = folder.store.session; } /** * Constructor with a session. Used to create messages for sending. * @param session the session in scope */ protected Message(Session session) { folder = null; this.session = session; } /** * Returns the identity of the person(s) who ordered the sending of * this message. *

        * In certain implementations, this may be different from the entity that * actually sent the message. */ public abstract Address[] getFrom() throws MessagingException; /** * Sets the identity of the person sending this message, as obtained * from the property "mail.user". * If this property is absent, the system property "user.name" is used. * @exception IllegalWriteException if the underlying implementation does * not support modification of existing values * @exception IllegalStateException if this message is obtained from a * READ_ONLY folder */ public abstract void setFrom() throws MessagingException; /** * Sets the identity of the person sending this message. * @param address the sender * @exception IllegalWriteException if the underlying implementation does * not support modification of existing values * @exception IllegalStateException if this message is obtained from a * READ_ONLY folder. */ public abstract void setFrom(Address address) throws MessagingException; /** * Adds addresses to the identity of the person sending this message. * @param addresses the senders * @exception IllegalWriteException if the underlying implementation does * not support modification of existing values * @exception IllegalStateException if this message is obtained from a * READ_ONLY folder. */ public abstract void addFrom(Address[] addresses) throws MessagingException; /** * Returns all the recipient addresses of the specified type. * @param type the recipient type */ public abstract Address[] getRecipients(RecipientType type) throws MessagingException; /** * Returns all the recipient addresses in the message. */ public Address[] getAllRecipients() throws MessagingException { Address[] to = getRecipients(RecipientType.TO); Address[] cc = getRecipients(RecipientType.CC); Address[] bcc = getRecipients(RecipientType.BCC); if (cc == null && bcc == null) return to; int count = (to == null ? 0 : to.length) + (cc == null ? 0 : cc.length) + (bcc == null ? 0 : bcc.length); Address[] all = new Address[count]; int offset = 0; if (to != null) { System.arraycopy(to, 0, all, offset, to.length); offset += to.length; } if (cc != null) { System.arraycopy(cc, 0, all, offset, cc.length); offset += cc.length; } if (bcc != null) { System.arraycopy(bcc, 0, all, offset, bcc.length); offset += bcc.length; } return all; } /** * Sets the recipient addresses of the specified type. * @param type the recipient type * @param addresses the addresses * @exception IllegalWriteException if the underlying implementation * does not support modification of existing values * @exception IllegalStateException if this message is obtained from * a READ_ONLY folder. */ public abstract void setRecipients(RecipientType type, Address[] addresses) throws MessagingException; /** * Sets the recipient address of the specified type. * @exception IllegalWriteException if the underlying implementation * does not support modification of existing values */ public void setRecipient(RecipientType type, Address address) throws MessagingException { setRecipients(type, new Address[] { address }); } /** * Adds the recipient addresses of the given type. * @param type the recipient type * @param addresses the addresses * @exception IllegalWriteException if the underlying implementation * does not support modification of existing values * @exception IllegalStateException if this message is obtained from * a READ_ONLY folder. */ public abstract void addRecipients(RecipientType type, Address[] addresses) throws MessagingException; /** * Adds the recipient address of the given type. * @exception IllegalWriteException if the underlying implementation * does not support modification of existing values */ public void addRecipient(RecipientType type, Address address) throws MessagingException { addRecipients(type, new Address[] { address }); } /** * Returns the addresses to which replies should be directed. This * defaults to the sender of the message. */ public Address[] getReplyTo() throws MessagingException { return getFrom(); } /** * Sets the addresses to which replies should be directed. */ public void setReplyTo(Address[] addresses) throws MessagingException { throw new MethodNotSupportedException(); } /** * Returns the subject of this message. */ public abstract String getSubject() throws MessagingException; /** * Sets the subject of this message. * @param subject the subject * @exception IllegalWriteException if the underlying implementation * does not support modification of existing values * @exception IllegalStateException if this message is obtained from * a READ_ONLY folder. */ public abstract void setSubject(String subject) throws MessagingException; /** * Returns the date this message was sent. */ public abstract Date getSentDate() throws MessagingException; /** * Sets the date this message was sent. * @param date the sent date of this message * @exception IllegalWriteException if the underlying implementation * does not support modification of existing values * @exception IllegalStateException if this message is obtained from * a READ_ONLY folder. */ public abstract void setSentDate(Date date) throws MessagingException; /** * Returns the date this message was received. */ public abstract Date getReceivedDate() throws MessagingException; /** * Returns the flags for this message. *

        * Modifying any of these flags does not affect the message flags. * Use the setFlags method to change the message's flags. */ public abstract Flags getFlags() throws MessagingException; /** * Indicates whether the specified flag is set in this message. * @param flag the flag */ public boolean isSet(Flags.Flag flag) throws MessagingException { return getFlags().contains(flag); } /** * Sets the specified flags on this message to the given value. * Any flags in this message that are not specified in the given flags * are unaffected. * @param flag the flags to be set * @param set the value to be set * @exception IllegalWriteException if the underlying implementation * does not support modification of existing values * @exception IllegalStateException if this message is obtained from * a READ_ONLY folder. */ public abstract void setFlags(Flags flag, boolean set) throws MessagingException; /** * Sets the specified flag on this message to the given value. * @param flag the flag to be set * @param set the value to be set * @exception IllegalWriteException if the underlying implementation * does not support modification of existing values * @exception IllegalStateException if this message is obtained from * a READ_ONLY folder. */ public void setFlag(Flags.Flag flag, boolean set) throws MessagingException { setFlags(new Flags(flag), set); } /** * Returns the message number for this message within its folder. * @see #msgnum */ public int getMessageNumber() { return msgnum; } /** * Sets the message number for this message. * @see #msgnum */ protected void setMessageNumber(int msgnum) { this.msgnum = msgnum; } /** * Returns the folder from which this message was obtained. */ public Folder getFolder() { return folder; } /** * Indicates whether this message is expunged. * @see Folder#expunge */ public boolean isExpunged() { return expunged; } /** * Sets the expunged flag for this message. */ protected void setExpunged(boolean expunged) { this.expunged = expunged; } /** * Returns a new message suitable for a reply to this message. * The new message will have its recipients set appropriately, but will * have no content. *

        * The subject field is filled in with the original subject prefixed with * "Re:" (unless it already starts with "Re:"). * @param replyToAll if the reply should be sent to all recipients of * this message */ public abstract Message reply(boolean replyToAll) throws MessagingException; /** * Save any changes made to this message into its underlying store, if * the message was obtained from a folder. The message may be saved * immediately or when its containing folder is closed. *

        * This method ensures that any header fields are consistent with the * changed message contents. * @exception IllegalWriteException if the underlying implementation * does not support modification of existing values * @exception IllegalStateException if this message is obtained from * a READ_ONLY folder. */ public abstract void saveChanges() throws MessagingException; /** * Indicates whether the specified search term applies to this message. * @param term the search term */ public boolean match(SearchTerm term) throws MessagingException { return term.match(this); } } mail-1.1.2/source/javax/mail/MessageAware.java0000664000076500007650000000306310614714012020555 0ustar dogdog00000000000000/* * MessageAware.java * Copyright (C) 2002 The Free Software Foundation * * This file is part of GNU JavaMail, a library. * * GNU JavaMail is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * GNU JavaMail 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * As a special exception, if you link this library with other files to * produce an executable, this library does not by itself cause the * resulting executable to be covered by the GNU General Public License. * This exception does not however invalidate any other reasons why the * executable file might be covered by the GNU General Public License. */ package javax.mail; /** * A data source may implement this interface to supply information to a * data content handler about the message context of the data content. * * @author Chris Burdess * @version 1.4 */ public interface MessageAware { /** * Return the message context. */ MessageContext getMessageContext(); } mail-1.1.2/source/javax/mail/MessageContext.java0000664000076500007650000000457110614714012021147 0ustar dogdog00000000000000/* * MessageContext.java * Copyright (C) 2002 The Free Software Foundation * * This file is part of GNU JavaMail, a library. * * GNU JavaMail is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * GNU JavaMail 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * As a special exception, if you link this library with other files to * produce an executable, this library does not by itself cause the * resulting executable to be covered by the GNU General Public License. * This exception does not however invalidate any other reasons why the * executable file might be covered by the GNU General Public License. */ package javax.mail; /** * The context of a datum of message content. * * @author Chris Burdess * @version 1.4 */ public class MessageContext { /** * The part. */ private Part part; /** * Creates a message context describing the given part. */ public MessageContext(Part part) { this.part = part; } /** * Returns the part containing the content. This may be null. */ public Part getPart() { return part; } /** * Returns the message that contains the content. */ public Message getMessage() { Part p = part; while (p != null) { if (p instanceof Message) { return (Message) p; } if (p instanceof BodyPart) { BodyPart bp = (BodyPart) p; Multipart mp = bp.getParent(); p = mp.getParent(); } else { p = null; } } return null; } /** * Returns the session context. */ public Session getSession() { Message message = getMessage(); if (message != null) { return message.session; } return null; } } mail-1.1.2/source/javax/mail/MessageRemovedException.java0000664000076500007650000000311410614714012022773 0ustar dogdog00000000000000/* * MessageRemovedException.java * Copyright (C) 2002 The Free Software Foundation * * This file is part of GNU JavaMail, a library. * * GNU JavaMail is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * GNU JavaMail 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * As a special exception, if you link this library with other files to * produce an executable, this library does not by itself cause the * resulting executable to be covered by the GNU General Public License. * This exception does not however invalidate any other reasons why the * executable file might be covered by the GNU General Public License. */ package javax.mail; /** * An exception thrown when an invalid method is invoked on an expunged * message. * * @author Chris Burdess * @version 1.4 */ public class MessageRemovedException extends MessagingException { public MessageRemovedException() { } public MessageRemovedException(String message) { super(message); } } mail-1.1.2/source/javax/mail/MessagingException.java0000664000076500007650000000773410614714012022016 0ustar dogdog00000000000000/* * MessagingException.java * Copyright (C) 2002 The Free Software Foundation * * This file is part of GNU JavaMail, a library. * * GNU JavaMail is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * GNU JavaMail 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * As a special exception, if you link this library with other files to * produce an executable, this library does not by itself cause the * resulting executable to be covered by the GNU General Public License. * This exception does not however invalidate any other reasons why the * executable file might be covered by the GNU General Public License. */ package javax.mail; import java.io.PrintStream; import java.io.PrintWriter; /** * A general messaging exception. * * @author Chris Burdess * @version 1.4 */ public class MessagingException extends Exception { /* * The next exception in a chain of exceptions. */ private Exception nextException; /** * Constructs a messaging exception with no detail message. */ public MessagingException() { this(null, null); } /** * Constructs a messaging exception with the specified detail message. * @param message the detail message */ public MessagingException(String message) { this(message, null); } /** * Constructs a messaging exception with the specified exception and detail * message. * @param message the detail message * @param exception the embedded exception */ public MessagingException(String message, Exception exception) { super(message); nextException = exception; } /** * Returns the next exception chained to this one. * If the next exception is a messaging exception, the chain may extend * further. */ public Exception getNextException() { return nextException; } /** * Adds an exception to the end of the chain. * If the end is not a messaging exception, this exception cannot be added * to the end. * @param exception the new end of the exception chain * @return true if this exception was added, false otherwise. */ public synchronized boolean setNextException(Exception exception) { Object o; for (o = this; (o instanceof MessagingException) && ((MessagingException) o).nextException != null; o = ((MessagingException) o).nextException); if (o instanceof MessagingException) { ((MessagingException) o).nextException = exception; return true; } return false; } /** * Returns the message, including the message from any nested exception. */ public String getMessage() { String message = super.getMessage(); if (nextException != null) { StringBuffer buffer = new StringBuffer(); buffer.append(message); buffer.append(";\n nested exception is: \n\t"); buffer.append(nextException.toString()); message = buffer.toString(); } return message; } public void printStackTrace(PrintStream out) { super.printStackTrace(out); if (nextException != null) { out.println("nested exception is:"); nextException.printStackTrace(out); } } public void printStackTrace(PrintWriter out) { super.printStackTrace(out); if (nextException != null) { out.println("nested exception is:"); nextException.printStackTrace(out); } } } mail-1.1.2/source/javax/mail/MethodNotSupportedException.java0000664000076500007650000000313310614714012023675 0ustar dogdog00000000000000/* * MethodNotSupportedException.java * Copyright (C) 2002 The Free Software Foundation * * This file is part of GNU JavaMail, a library. * * GNU JavaMail is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * GNU JavaMail 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * As a special exception, if you link this library with other files to * produce an executable, this library does not by itself cause the * resulting executable to be covered by the GNU General Public License. * This exception does not however invalidate any other reasons why the * executable file might be covered by the GNU General Public License. */ package javax.mail; /** * An exception thrown when an operation is not supported by the * implementation. * * @author Chris Burdess * @version 1.4 */ public class MethodNotSupportedException extends MessagingException { public MethodNotSupportedException() { } public MethodNotSupportedException(String message) { super(message); } } mail-1.1.2/source/javax/mail/Multipart.java0000664000076500007650000001442610614714012020177 0ustar dogdog00000000000000/* * Multipart.java * Copyright (C) 2002 The Free Software Foundation * * This file is part of GNU JavaMail, a library. * * GNU JavaMail is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * GNU JavaMail 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * As a special exception, if you link this library with other files to * produce an executable, this library does not by itself cause the * resulting executable to be covered by the GNU General Public License. * This exception does not however invalidate any other reasons why the * executable file might be covered by the GNU General Public License. */ package javax.mail; import java.io.IOException; import java.io.OutputStream; import java.util.Vector; import javax.activation.DataSource; /** * A multipart is a container for multiple body parts. *

        * Some messaging systems provide different subtypes of multiparts. * For example, MIME specifies a set of subtypes that include * "alternative", "mixed", "related", "parallel", "signed", etc. * * @author Chris Burdess * @version 1.4 */ public abstract class Multipart { /** * Vector of body parts. */ protected Vector parts; /** * The content-type of this multipart object. * It defaults to "multipart/mixed". */ protected String contentType; /** * The part containing this multipart, if known. */ protected Part parent; /** * Constructor for an empty multipart of type "multipart/mixed". */ protected Multipart() { contentType = "multipart/mixed"; parent = null; } /** * Configures this multipart from the given data source. *

        * The method adds the body parts in the data source to this multipart, * and sets the content-type. * @param mp a multipart data source */ protected void setMultipartDataSource(MultipartDataSource mp) throws MessagingException { contentType = mp.getContentType(); int count = mp.getCount(); for (int i = 0; i < count; i++) { addBodyPart(mp.getBodyPart(i)); } } /** * Returns the content-type of this multipart. */ public String getContentType() { return contentType; } /** * Returns the number of enclosed body parts. */ public int getCount() throws MessagingException { return (parts == null) ? 0 : parts.size(); } /** * Get the specified body part. * The body parts in this container are numbered starting at 0. * @param index the index of the desired body part * @exception IndexOutOfBoundsException if the given index is out of range */ public BodyPart getBodyPart(int index) throws MessagingException { if (parts == null) { throw new IndexOutOfBoundsException(); } return (BodyPart) parts.get(index); } /** * Removes the specified body part from this multipart. * @param part the body part to remove * @return true if a body part was removed, false otherwise * @exception MessagingException if the multipart has not been configured * @exception IllegalWriteException if the underlying implementation * does not support modification of existing values */ public boolean removeBodyPart(BodyPart part) throws MessagingException { if (parts == null) { throw new MessagingException("No such BodyPart"); } synchronized (parts) { boolean success = parts.remove(part); if (success) { part.setParent(null); } return success; } } /** * Removes the body part at the specified index. * The body parts in this container are numbered starting at 0. * @param index index of the part to remove * @exception IndexOutOfBoundsException if the given index is out of range * @exception IllegalWriteException if the underlying implementation * does not support modification of existing values */ public void removeBodyPart(int index) throws MessagingException { if (parts == null) { throw new IndexOutOfBoundsException("No such BodyPart"); } synchronized (parts) { BodyPart part = (BodyPart) parts.get(index); parts.remove(index); part.setParent(null); } } /** * Adds a body part to this multipart. * @param part the body part to be appended * @exception IllegalWriteException if the underlying implementation * does not support modification of existing values */ public synchronized void addBodyPart(BodyPart part) throws MessagingException { if (parts == null) { parts = new Vector(); } synchronized (parts) { parts.add(part); part.setParent(this); } } /** * Inserts a body part at the specified index. * The body parts in this container are numbered starting at 0. * @param part the body part to be inserted * @param index where to insert the part * @exception IllegalWriteException if the underlying implementation * does not support modification of existing values */ public synchronized void addBodyPart(BodyPart part, int index) throws MessagingException { if (parts == null) { parts = new Vector(); } synchronized (parts) { parts.add(index, part); part.setParent(this); } } /** * Writes this multipart to the specified byte stream. */ public abstract void writeTo(OutputStream os) throws IOException, MessagingException; /** * Returns the part containing this multipart, or null if * not known. */ public Part getParent() { return parent; } /** * Sets the parent of this multipart. */ public void setParent(Part part) { parent = part; } } mail-1.1.2/source/javax/mail/MultipartDataSource.java0000664000076500007650000000347610614714012022155 0ustar dogdog00000000000000/* * MultipartDataSource.java * Copyright (C) 2002 The Free Software Foundation * * This file is part of GNU JavaMail, a library. * * GNU JavaMail is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * GNU JavaMail 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * As a special exception, if you link this library with other files to * produce an executable, this library does not by itself cause the * resulting executable to be covered by the GNU General Public License. * This exception does not however invalidate any other reasons why the * executable file might be covered by the GNU General Public License. */ package javax.mail; import javax.activation.DataSource; /** * A data source that contains body parts. * * @see DataSource * @author Chris Burdess * @version 1.4 */ public interface MultipartDataSource extends DataSource { /** * Returns the number of body parts. */ int getCount(); /** * Returns the specified body part. * Body parts are numbered starting at 0. * @param index the index of the desired body part * @exception IndexOutOfBoundsException if the given index is out of range */ BodyPart getBodyPart(int index) throws MessagingException; } mail-1.1.2/source/javax/mail/NoSuchProviderException.java0000664000076500007650000000311410614714012022777 0ustar dogdog00000000000000/* * NoSuchProviderException.java * Copyright (C) 2002 The Free Software Foundation * * This file is part of GNU JavaMail, a library. * * GNU JavaMail is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * GNU JavaMail 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * As a special exception, if you link this library with other files to * produce an executable, this library does not by itself cause the * resulting executable to be covered by the GNU General Public License. * This exception does not however invalidate any other reasons why the * executable file might be covered by the GNU General Public License. */ package javax.mail; /** * An exception thrown on an attempt to instantiate a provider that * doesn't exist. * * @author Chris Burdess * @version 1.4 */ public class NoSuchProviderException extends MessagingException { public NoSuchProviderException() { } public NoSuchProviderException(String message) { super(message); } } mail-1.1.2/source/javax/mail/package.html0000664000076500007650000000007310614714012017625 0ustar dogdog00000000000000

        Classes modelling a mail system.

        mail-1.1.2/source/javax/mail/Part.java0000664000076500007650000002440210614714012017117 0ustar dogdog00000000000000/* * Part.java * Copyright (C) 2002 The Free Software Foundation * * This file is part of GNU JavaMail, a library. * * GNU JavaMail is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * GNU JavaMail 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * As a special exception, if you link this library with other files to * produce an executable, this library does not by itself cause the * resulting executable to be covered by the GNU General Public License. * This exception does not however invalidate any other reasons why the * executable file might be covered by the GNU General Public License. */ package javax.mail; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.util.Enumeration; import javax.activation.DataHandler; /** * A part consists of a set of attributes and a content. Some of the * attributes provide metadata describing the content and its encoding, * others may describe how to process the part. * The Part interface is the common base interface for Messages and BodyParts. *

        * The content of a part is available in various forms: *

          *
        • As a data handler, using the getDataHandler method. *
        • As an input stream, using the getInputStream method. *
        • As a Java object, using the getContent method. *
        * The writeTo method can be used to write the part to a * byte stream in mail-safe form suitable for transmission. *

        * In MIME terms, Part models an Entity (RFC 2045, Section 2.4). * * @author Chris Burdess * @version 1.4 */ public interface Part { /** * This part should be presented as an attachment. */ String ATTACHMENT = "attachment"; /** * This part should be presented inline. */ String INLINE = "inline"; /** * Returns the size of the content of this part in bytes, or -1 if the * size cannot be determined. *

        * Note that the size may not be an exact measure of the content size, * but will be suitable for display in a user interface to give the * user an idea of the size of this part. */ int getSize() throws MessagingException; /** * Returns the number of lines in the content of this part, or -1 if the * number cannot be determined. * Note that this number may not be an exact measure. */ int getLineCount() throws MessagingException; /** * Returns the content-type of the content of this part, or * null if the content-type could not be determined. *

        * The MIME typing system is used to name content-types. */ String getContentType() throws MessagingException; /** * Is this part of the specified MIME type? * This method compares only the primary type and subtype. * The parameters of the content types are ignored. *

        * If the subtype of mimeType is the special character '*', * then the subtype is ignored during the comparison. */ boolean isMimeType(String mimeType) throws MessagingException; /** * Returns the disposition of this part. * The disposition describes how the part should be presented to the user * (see RFC 2183). * Return values are not case sensitive. */ String getDisposition() throws MessagingException; /** * Sets the disposition of this part. * @param disposition the disposition of this part * @exception IllegalWriteException if the underlying implementation * does not support modification of this header * @exception IllegalStateException if this part is obtained from * a READ_ONLY folder */ void setDisposition(String disposition) throws MessagingException; /** * Returns the description of this part. */ String getDescription() throws MessagingException; /** * Sets the description of this part. * @param description the description of this part * @exception IllegalWriteException if the underlying implementation * does not support modification of this header * @exception IllegalStateException if this Part is obtained from * a READ_ONLY folder */ void setDescription(String description) throws MessagingException; /** * Returns the filename associated with this part, if available. */ String getFileName() throws MessagingException; /** * Sets the filename associated with this part. * @param filename the filename to associate with this part * @exception IllegalWriteException if the underlying implementation * does not support modification of this header * @exception IllegalStateException if this Part is obtained from * a READ_ONLY folder */ void setFileName(String filename) throws MessagingException; /** * Returns an input stream for reading the content of this part. * Any mail-specific transfer encodings will be decoded by the * implementation. * @exception IOException when a data handler error occurs */ InputStream getInputStream() throws IOException, MessagingException; /** * Returns a data handler for the content of this part. */ DataHandler getDataHandler() throws MessagingException; /** * Returns the content of this part as a Java object. * The type of the returned object is of course dependent on the content * itself. For instance, the object returned for "text/plain" content * is usually a String object. The object returned for a "multipart" * content is always a Multipart subclass. For content-types that are * unknown to the data handler system, an input stream is returned. * @exception IOException when a data handler error occurs */ Object getContent() throws IOException, MessagingException; /** * Sets the content of this part using the specified data handler. * @param dh the data handler for the content * @exception IllegalWriteException if the underlying implementation * does not support modification * @exception IllegalStateException if this part is obtained from * a READ_ONLY folder */ void setDataHandler(DataHandler dh) throws MessagingException; /** * Sets the content of this part using the specified object. The type of * the supplied argument must be known to the data handler system. * @param obj a Java object * @param type the MIME content-type of this object * @exception IllegalWriteException if the underlying implementation * does not support modification * @exception IllegalStateException if this part is obtained from * a READ_ONLY folder */ void setContent(Object obj, String type) throws MessagingException; /** * Sets the textual content of this part, using a MIME type of * text/plain. * @param text the textual content * @exception IllegalWriteException if the underlying implementation * does not support modification * @exception IllegalStateException if this part is obtained from * a READ_ONLY folder */ void setText(String text) throws MessagingException; /** * Sets the multipart content of this part. * @param mp the multipart content * @exception IllegalWriteException if the underlying implementation * does not support modification * @exception IllegalStateException if this part is obtained from * a READ_ONLY folder */ void setContent(Multipart mp) throws MessagingException; /** * Writes this part to the specified byte stream. * @exception IOException if an error occurs writing to the stream * or if an error occurs in the data handler system. * @exception MessagingException if an error occurs fetching the data * to be written */ void writeTo(OutputStream os) throws IOException, MessagingException; /** * Returns all the values for the specified header name, or * null if no such headers are available. * @param name the header name */ String[] getHeader(String name) throws MessagingException; /** * Sets the value for the specified header name. * @param name the header name * @param value the new value * @exception IllegalWriteException if the underlying implementation * does not support modification of this header * @exception IllegalStateException if this part is obtained from * a READ_ONLY folder */ void setHeader(String name, String value) throws MessagingException; /** * Adds the specified value to the existing values for this header name. * @param name the header name * @param value the value to add * @exception IllegalWriteException if the underlying implementation * does not support modification of this header * @exception IllegalStateException if this part is obtained from * a READ_ONLY folder */ void addHeader(String name, String value) throws MessagingException; /** * Removes all headers of the specified name. * @param name the header name * @exception IllegalWriteException if the underlying implementation * does not support modification of this header * @exception IllegalStateException if this part is obtained from * a READ_ONLY folder */ void removeHeader(String name) throws MessagingException; /** * Returns all the headers from this part. * @return an enumeration of Header */ Enumeration getAllHeaders() throws MessagingException; /** * Returns the matching headers from this part. * @param names the header names to match * @return an enumeration of Header */ Enumeration getMatchingHeaders(String[] names) throws MessagingException; /** * Returns the non-matching headers from this part. * @param names the header names to ignore * @return an enumeration of Header */ Enumeration getNonMatchingHeaders(String[] names) throws MessagingException; } mail-1.1.2/source/javax/mail/PasswordAuthentication.java0000664000076500007650000000372410614714012022717 0ustar dogdog00000000000000/* * PasswordAuthentication.java * Copyright (C) 2002 The Free Software Foundation * * This file is part of GNU JavaMail, a library. * * GNU JavaMail is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * GNU JavaMail 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * As a special exception, if you link this library with other files to * produce an executable, this library does not by itself cause the * resulting executable to be covered by the GNU General Public License. * This exception does not however invalidate any other reasons why the * executable file might be covered by the GNU General Public License. */ package javax.mail; /** * Container for a username/password combination. * * @author Chris Burdess * @version 1.4 */ public final class PasswordAuthentication { /* * The username. */ private String userName; /* * The password. */ private String password; /** * Creates a new password authentication * @param userName the username * @param password the password */ public PasswordAuthentication(String userName, String password) { this.userName = userName; this.password = password; } /** * Returns the username. */ public String getUserName() { return userName; } /** * Returns the password. */ public String getPassword() { return password; } } mail-1.1.2/source/javax/mail/Provider.java0000664000076500007650000000717410614714012020012 0ustar dogdog00000000000000/* * Provider.java * Copyright (C) 2002, 2005 The Free Software Foundation * * This file is part of GNU JavaMail, a library. * * GNU JavaMail is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * GNU JavaMail 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * As a special exception, if you link this library with other files to * produce an executable, this library does not by itself cause the * resulting executable to be covered by the GNU General Public License. * This exception does not however invalidate any other reasons why the * executable file might be covered by the GNU General Public License. */ package javax.mail; /** * A description of a messaging implementation that can store or send * messages. * * @author Chris Burdess * @version 1.4 */ public class Provider { /** * A provider type (STORE or TRANSPORT). */ public static class Type { public static final Type STORE = new Type("Store"); public static final Type TRANSPORT = new Type("Transport"); private String type; private Type(String type) { this.type = type; } } private Type type; private String protocol; private String className; private String vendor; private String version; /** * Creates a new provider of the given type and protocol. * @param type the provider type * @param protocol the protocol URL scheme * @param className the name of the implementing class * @param vendor the implementation vendor * @param version the implementation version * @since JavaMail 1.4 */ public Provider(Type type, String protocol, String className, String vendor, String version) { this.type = type; this.protocol = protocol; this.className = className; this.vendor = vendor; this.version = version; } /** * Returns the provider type. */ public Type getType() { return type; } /** * Returns the protocol implemented by this provider. */ public String getProtocol() { return protocol; } /** * Returns the name of the class implementing the protocol. */ public String getClassName() { return className; } /** * Returns the name of the vendor associated with this implementation. */ public String getVendor() { return vendor; } /** * Returns the version of this implementation. */ public String getVersion() { return version; } public String toString() { StringBuffer buffer = new StringBuffer(); buffer.append("javax.mail.Provider["); if (type == Type.STORE) { buffer.append("STORE,"); } else if (type == Type.TRANSPORT) { buffer.append("TRANSPORT,"); } buffer.append(protocol); buffer.append(','); buffer.append(className); if (vendor != null) { buffer.append(','); buffer.append(vendor); } if (version != null) { buffer.append(','); buffer.append(version); } buffer.append("]"); return buffer.toString(); } } mail-1.1.2/source/javax/mail/Quota.java0000664000076500007650000000621210614714012017301 0ustar dogdog00000000000000/* * Quota.java * Copyright (C) 2005 The Free Software Foundation * * This file is part of GNU JavaMail, a library. * * GNU JavaMail is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * GNU JavaMail 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * As a special exception, if you link this library with other files to * produce an executable, this library does not by itself cause the * resulting executable to be covered by the GNU General Public License. * This exception does not however invalidate any other reasons why the * executable file might be covered by the GNU General Public License. */ package javax.mail; /** * A set of quotas for a given quota root. * * @author Chris Burdess * @see RFC 2087 * @version 1.4 * @since JavaMail 1.4 */ public class Quota { /** * An individual quota resource. * @since JavaMail 1.4 */ public static class Resource { /** * The resource name. */ public String name; /** * The current resource usage. */ public long usage; /** * The usage limit for the resource. */ public long limit; /** * Constructor. * @param name the resource name * @param usage the current usage * @param limit the usage limit */ public Resource(String name, long usage, long limit) { this.name = name; this.usage = usage; this.limit = limit; } } /** * The quota root. */ public String quotaRoot; /** * The resources associated with this quota. */ public Resource[] resources; /** * Constructor. * @param quotaRoot the quota root */ public Quota(String quotaRoot) { this.quotaRoot = quotaRoot; } /** * Sets a resource limit. * @param name the resource name * @param limit the usage limit */ public void setResourceLimit(String name, long limit) { if (resources != null) { boolean found = false; for (int i = 0; i < resources.length; i++) { if (resources[i].name.equals(name)) { resources[i].limit = limit; found = true; } } if (!found) { Resource[] r = new Resource[resources.length + 1]; System.arraycopy(resources, 0, r, 0, resources.length); r[resources.length] = new Resource(name, 0L, limit); resources = r; } } else { resources = new Resource[1]; resources[0] = new Resource(name, 0L, limit); } } } mail-1.1.2/source/javax/mail/QuotaAwareStore.java0000664000076500007650000000363410614714012021303 0ustar dogdog00000000000000/* * QuotaAwareStore.java * Copyright (C) 2005 The Free Software Foundation * * This file is part of GNU JavaMail, a library. * * GNU JavaMail is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * GNU JavaMail 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * As a special exception, if you link this library with other files to * produce an executable, this library does not by itself cause the * resulting executable to be covered by the GNU General Public License. * This exception does not however invalidate any other reasons why the * executable file might be covered by the GNU General Public License. */ package javax.mail; /** * Interface implemented by mail stores that support quotas. * * @author Chris Burdess * @see RFC 2087 * @version 1.4 * @since JavaMail 1.4 */ public interface QuotaAwareStore { /** * Returns the quotas for the given quota root. * @param root the quota root * @exception MessagingException if the QUOTA extension is not supported */ Quota[] getQuota(String root) throws MessagingException; /** * Sets the quotas for the quota root specified in the quota argument. * @param quota the quota * @exception MessagingException if the QUOTA extension is not supported */ void setQuota(Quota quota) throws MessagingException; } mail-1.1.2/source/javax/mail/ReadOnlyFolderException.java0000664000076500007650000000353510614714012022745 0ustar dogdog00000000000000/* * ReadOnlyFolderException.java * Copyright (C) 2002 The Free Software Foundation * * This file is part of GNU JavaMail, a library. * * GNU JavaMail is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * GNU JavaMail 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * As a special exception, if you link this library with other files to * produce an executable, this library does not by itself cause the * resulting executable to be covered by the GNU General Public License. * This exception does not however invalidate any other reasons why the * executable file might be covered by the GNU General Public License. */ package javax.mail; /** * An exception thrown when an attempt is made to open a folder in * read-write mode when the folder can only be opened read-only. * * @author Chris Burdess * @version 1.4 */ public class ReadOnlyFolderException extends MessagingException { /** * The folder. */ private Folder folder; public ReadOnlyFolderException(Folder folder) { this(folder, null); } public ReadOnlyFolderException(Folder folder, String message) { super(message); this.folder = folder; } /** * Returns the folder. */ public Folder getFolder() { return folder; } } mail-1.1.2/source/javax/mail/search/0000775000076500007650000000000010614714024016614 5ustar dogdog00000000000000mail-1.1.2/source/javax/mail/search/AddressStringTerm.java0000664000076500007650000000425510614714012023066 0ustar dogdog00000000000000/* * AddressStringTerm.java * Copyright (C) 2002 The Free Software Foundation * * This file is part of GNU JavaMail, a library. * * GNU JavaMail is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * GNU JavaMail 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * As a special exception, if you link this library with other files to * produce an executable, this library does not by itself cause the * resulting executable to be covered by the GNU General Public License. * This exception does not however invalidate any other reasons why the * executable file might be covered by the GNU General Public License. */ package javax.mail.search; import javax.mail.Address; import javax.mail.internet.InternetAddress; /** * A string comparison of message addresses. * * @author Chris Burdess * @version 1.4 */ public abstract class AddressStringTerm extends StringTerm { /** * Constructor. * @param pattern the address pattern for comparison */ protected AddressStringTerm(String pattern) { super(pattern, true); } /** * Indicates whether the address pattern specified in the constructor is a * substring of the string representation of the given address. * @param a the address */ protected boolean match(Address a) { if (a instanceof InternetAddress) { return super.match(((InternetAddress) a).toUnicodeString()); } else { return super.match(a.toString()); } } public boolean equals(Object other) { return ((other instanceof AddressStringTerm) && super.equals(other)); } } mail-1.1.2/source/javax/mail/search/AddressTerm.java0000664000076500007650000000407710614714012021701 0ustar dogdog00000000000000/* * AddressTerm.java * Copyright (C) 2002 The Free Software Foundation * * This file is part of GNU JavaMail, a library. * * GNU JavaMail is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * GNU JavaMail 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * As a special exception, if you link this library with other files to * produce an executable, this library does not by itself cause the * resulting executable to be covered by the GNU General Public License. * This exception does not however invalidate any other reasons why the * executable file might be covered by the GNU General Public License. */ package javax.mail.search; import javax.mail.Address; /** * A comparison of message addresses. * * @author Chris Burdess * @version 1.4 */ public abstract class AddressTerm extends SearchTerm { /** * The address. */ protected Address address; protected AddressTerm(Address address) { this.address = address; } /** * Returns the address to match. */ public Address getAddress() { return address; } /** * Returns true if the specified address matches the address specified in * this term. */ protected boolean match(Address address) { return address.equals(this.address); } public boolean equals(Object other) { return ((other instanceof AddressTerm) && ((AddressTerm) other).address.equals(address)); } public int hashCode() { return address.hashCode(); } } mail-1.1.2/source/javax/mail/search/AndTerm.java0000664000076500007650000000567110614714012021017 0ustar dogdog00000000000000/* * AndTerm.java * Copyright (C) 2002 The Free Software Foundation * * This file is part of GNU JavaMail, a library. * * GNU JavaMail is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * GNU JavaMail 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * As a special exception, if you link this library with other files to * produce an executable, this library does not by itself cause the * resulting executable to be covered by the GNU General Public License. * This exception does not however invalidate any other reasons why the * executable file might be covered by the GNU General Public License. */ package javax.mail.search; import javax.mail.Message; /** * A logical AND of a number of search terms. * * @author Chris Burdess * @version 1.4 */ public final class AndTerm extends SearchTerm { /** * The target terms. */ protected SearchTerm[] terms; /** * Constructor with two terms. * @param t1 the first term * @param t2 the second term */ public AndTerm(SearchTerm t1, SearchTerm t2) { terms = new SearchTerm[2]; terms[0] = t1; terms[1] = t2; } /** * Constructor with multiple terms. * @param t the terms */ public AndTerm(SearchTerm[] t) { terms = new SearchTerm[t.length]; System.arraycopy(t, 0, terms, 0, t.length); } /** * Returns the search terms. */ public SearchTerm[] getTerms() { return (SearchTerm[]) terms.clone(); } /** * Returns true only if all the terms match the specified message. */ public boolean match(Message message) { for (int i = 0; i < terms.length; i++) { if (!terms[i].match(message)) { return false; } } return true; } public boolean equals(Object other) { if (other instanceof AndTerm) { AndTerm andterm = (AndTerm)other; if (andterm.terms.length != terms.length) { return false; } for (int i = 0; i < terms.length; i++) { if (!terms[i].equals(andterm.terms[i])) { return false; } } return true; } return false; } public int hashCode() { int acc = 0; for (int i = 0; i < terms.length; i++) { acc += terms[i].hashCode(); } return acc; } } mail-1.1.2/source/javax/mail/search/BodyTerm.java0000664000076500007650000000534610614714012021211 0ustar dogdog00000000000000/* * BodyTerm.java * Copyright (C) 2002 The Free Software Foundation * * This file is part of GNU JavaMail, a library. * * GNU JavaMail is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * GNU JavaMail 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * As a special exception, if you link this library with other files to * produce an executable, this library does not by itself cause the * resulting executable to be covered by the GNU General Public License. * This exception does not however invalidate any other reasons why the * executable file might be covered by the GNU General Public License. */ package javax.mail.search; import javax.mail.Message; import javax.mail.Multipart; import javax.mail.Part; /** * A textual search of the message content. * Body searches are done only on: *

          *
        1. single-part messages whose primary-type is text OR *
        2. multipart/mixed messages whose first body part's primary-type is * text. *
        * * @author Chris Burdess * @version 1.4 */ public final class BodyTerm extends StringTerm { /** * Constructor. * @param pattern the text to search for */ public BodyTerm(String pattern) { super(pattern); } /** * Returns true only if the search text was found in the message body. */ public boolean match(Message msg) { try { Part part = msg; String contentType = part.getContentType(); if (contentType.regionMatches(true, 0, "text/", 0, 5)) { return super.match((String) part.getContent()); } else if (contentType.regionMatches(true, 0, "multipart/mixed", 0, 15)) { part = ((Multipart) part.getContent()).getBodyPart(0); contentType = part.getContentType(); if (contentType.regionMatches(true, 0, "text/", 0, 5)) { return super.match((String) part.getContent()); } } } catch (Exception e) { } return false; } public boolean equals(Object other) { return ((other instanceof BodyTerm) && super.equals(other)); } } mail-1.1.2/source/javax/mail/search/ComparisonTerm.java0000664000076500007650000000423010614714012022415 0ustar dogdog00000000000000/* * ComparisonTerm.java * Copyright (C) 2002 The Free Software Foundation * * This file is part of GNU JavaMail, a library. * * GNU JavaMail is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * GNU JavaMail 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * As a special exception, if you link this library with other files to * produce an executable, this library does not by itself cause the * resulting executable to be covered by the GNU General Public License. * This exception does not however invalidate any other reasons why the * executable file might be covered by the GNU General Public License. */ package javax.mail.search; /** * A comparison for scalar values. * * @author Chris Burdess * @version 1.4 */ public abstract class ComparisonTerm extends SearchTerm { /** * The less than or equal to operator. */ public static final int LE = 1; /** * The less than operator. */ public static final int LT = 2; /** * The equality operator. */ public static final int EQ = 3; /** * The not equal to operator. */ public static final int NE = 4; /** * The greater than operator. */ public static final int GT = 5; /** * The greater than or equal to operator. */ public static final int GE = 6; /** * The comparison operator. */ protected int comparison; public boolean equals(Object other) { return ((other instanceof ComparisonTerm) && ((ComparisonTerm)other).comparison == comparison); } public int hashCode() { return comparison; } } mail-1.1.2/source/javax/mail/search/DateTerm.java0000664000076500007650000000516110614714012021164 0ustar dogdog00000000000000/* * DateTerm.java * Copyright (C) 2002 The Free Software Foundation * * This file is part of GNU JavaMail, a library. * * GNU JavaMail is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * GNU JavaMail 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * As a special exception, if you link this library with other files to * produce an executable, this library does not by itself cause the * resulting executable to be covered by the GNU General Public License. * This exception does not however invalidate any other reasons why the * executable file might be covered by the GNU General Public License. */ package javax.mail.search; import java.util.Date; /** * A date comparison. * * @author Chris Burdess * @version 1.4 */ public abstract class DateTerm extends ComparisonTerm { /** * The date. */ protected Date date; /** * Constructor. * @param comparison the comparison type * @param date the date */ protected DateTerm(int comparison, Date date) { this.comparison = comparison; this.date = date; } /** * Returns the date to compare with. */ public Date getDate() { return new Date(date.getTime()); } /** * Returns the comparison operator. */ public int getComparison() { return comparison; } /** * Returns true only if this comparison matches the supplied date. */ protected boolean match(Date d) { switch (comparison) { case LE: return d.before(date) || d.equals(date); case LT: return d.before(date); case EQ: return d.equals(date); case NE: return !d.equals(date); case GT: return d.after(date); case GE: return d.after(date) || d.equals(date); } return false; } public boolean equals(Object other) { return ((other instanceof DateTerm) && ((DateTerm)other).date.equals(date) && super.equals(other)); } public int hashCode() { return date.hashCode() + super.hashCode(); } } mail-1.1.2/source/javax/mail/search/FlagTerm.java0000664000076500007650000000661010614714012021160 0ustar dogdog00000000000000/* * FlagTerm.java * Copyright (C) 2002 The Free Software Foundation * * This file is part of GNU JavaMail, a library. * * GNU JavaMail is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * GNU JavaMail 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * As a special exception, if you link this library with other files to * produce an executable, this library does not by itself cause the * resulting executable to be covered by the GNU General Public License. * This exception does not however invalidate any other reasons why the * executable file might be covered by the GNU General Public License. */ package javax.mail.search; import javax.mail.Flags; import javax.mail.Message; /** * A comparison of message flags. * * @author Chris Burdess * @version 1.4 */ public final class FlagTerm extends SearchTerm { /** * Indicates whether to test for the presence or absence of the specified * flag. If true, test whether all the specified flags are present, * otherwise test whether all the specified flags are absent. */ protected boolean set; /** * The flags to test. */ protected Flags flags; /** * Constructor. * @param flags the flags to test * @param set whether to test for presence or absence of the specified * flags */ public FlagTerm(Flags flags, boolean set) { this.flags = flags; this.set = set; } /** * Returns the flags to test. */ public Flags getFlags() { return (Flags) flags.clone(); } /** * Indicates whether to test for the presence or the absence of the * specified flags. */ public boolean getTestSet() { return set; } /** * Returns true if the flags in the specified message match this term. */ public boolean match(Message msg) { try { Flags messageFlags = msg.getFlags(); if (set) { return messageFlags.contains(flags); } Flags.Flag[] systemFlags = flags.getSystemFlags(); for (int i = 0; i < systemFlags.length; i++) { if (messageFlags.contains(systemFlags[i])) { return false; } } String[] userFlags = flags.getUserFlags(); for (int i = 0; i < userFlags.length; i++) { if (messageFlags.contains(userFlags[i])) { return false; } } return true; } catch (Exception e) { } return false; } public boolean equals(Object other) { if (other instanceof FlagTerm) { FlagTerm ft = (FlagTerm) other; return (ft.set == set && ft.flags.equals(flags)); } return false; } public int hashCode() { return set ? flags.hashCode() : ~flags.hashCode(); } } mail-1.1.2/source/javax/mail/search/FromStringTerm.java0000664000076500007650000000457010614714012022404 0ustar dogdog00000000000000/* * FromStringTerm.java * Copyright (C) 2002 The Free Software Foundation * * This file is part of GNU JavaMail, a library. * * GNU JavaMail is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * GNU JavaMail 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * As a special exception, if you link this library with other files to * produce an executable, this library does not by itself cause the * resulting executable to be covered by the GNU General Public License. * This exception does not however invalidate any other reasons why the * executable file might be covered by the GNU General Public License. */ package javax.mail.search; import javax.mail.Address; import javax.mail.Message; /** * A string comparison of the From address header. * * @author Chris Burdess * @version 1.4 */ public final class FromStringTerm extends AddressStringTerm { /** * Constructor. * @param address the address pattern for comparison */ public FromStringTerm(String pattern) { super(pattern); } /** * Indicates whether the address pattern specified in the constructor is a * substring of the string representation of the From address in the given * message. * @param msg the message */ public boolean match(Message msg) { try { Address[] addresses = msg.getFrom(); if (addresses != null) { for (int i = 0; i < addresses.length; i++) { if (super.match(addresses[i])) { return true; } } } } catch (Exception e) { } return false; } public boolean equals(Object other) { return (other instanceof FromStringTerm && super.equals(other)); } } mail-1.1.2/source/javax/mail/search/FromTerm.java0000664000076500007650000000435510614714012021216 0ustar dogdog00000000000000/* * FromTerm.java * Copyright (C) 2002 The Free Software Foundation * * This file is part of GNU JavaMail, a library. * * GNU JavaMail is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * GNU JavaMail 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * As a special exception, if you link this library with other files to * produce an executable, this library does not by itself cause the * resulting executable to be covered by the GNU General Public License. * This exception does not however invalidate any other reasons why the * executable file might be covered by the GNU General Public License. */ package javax.mail.search; import javax.mail.Address; import javax.mail.Message; /** * A comparison of the From address. * * @author Chris Burdess * @version 1.4 */ public final class FromTerm extends AddressTerm { /** * Constructor. * @param address the address for comparison */ public FromTerm(Address address) { super(address); } /** * Returns true if the From address in the given message matches the * address specified in this term. */ public boolean match(Message msg) { try { Address[] addresses = msg.getFrom(); if (addresses != null) { for (int i = 0; i < addresses.length; i++) { if (super.match(addresses[i])) { return true; } } } } catch (Exception e) { } return false; } public boolean equals(Object other) { return (other instanceof FromTerm && super.equals(other)); } } mail-1.1.2/source/javax/mail/search/HeaderTerm.java0000664000076500007650000000537610614714012021507 0ustar dogdog00000000000000/* * HeaderTerm.java * Copyright (C) 2002 The Free Software Foundation * * This file is part of GNU JavaMail, a library. * * GNU JavaMail is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * GNU JavaMail 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * As a special exception, if you link this library with other files to * produce an executable, this library does not by itself cause the * resulting executable to be covered by the GNU General Public License. * This exception does not however invalidate any other reasons why the * executable file might be covered by the GNU General Public License. */ package javax.mail.search; import javax.mail.Message; /** * A case-insensitive string comparison of message header values. * * @author Chris Burdess * @version 1.4 */ public final class HeaderTerm extends StringTerm { /** * The header name. */ protected String headerName; /** * Constructor. * @param headerName the header name * @param pattern the pattern to search for */ public HeaderTerm(String headerName, String pattern) { super(pattern); this.headerName = headerName; } /** * Returns the name of the header to compare with. */ public String getHeaderName() { return headerName; } /** * Returns true if the header in the specified message matches the pattern * specified in this term. */ public boolean match(Message msg) { try { String[] headers = msg.getHeader(headerName); if (headers != null) { for (int i = 0; i < headers.length; i++) { if (super.match(headers[i])) { return true; } } } } catch (Exception e) { } return false; } public boolean equals(Object other) { if (other instanceof HeaderTerm) { HeaderTerm ht = (HeaderTerm) other; return ht.headerName.equalsIgnoreCase(headerName) && super.equals(ht); } return false; } public int hashCode() { return headerName.toLowerCase().hashCode() + super.hashCode(); } } mail-1.1.2/source/javax/mail/search/IntegerComparisonTerm.java0000664000076500007650000000464210614714012023742 0ustar dogdog00000000000000/* * IntegerComparisonTerm.java * Copyright (C) 2002 The Free Software Foundation * * This file is part of GNU JavaMail, a library. * * GNU JavaMail is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * GNU JavaMail 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * As a special exception, if you link this library with other files to * produce an executable, this library does not by itself cause the * resulting executable to be covered by the GNU General Public License. * This exception does not however invalidate any other reasons why the * executable file might be covered by the GNU General Public License. */ package javax.mail.search; /** * An integer comparison. * * @author Chris Burdess * @version 1.4 */ public abstract class IntegerComparisonTerm extends ComparisonTerm { /** * The number. */ protected int number; protected IntegerComparisonTerm(int comparison, int number) { this.comparison = comparison; this.number = number; } /** * Returns the number to compare with. */ public int getNumber() { return number; } /** * Returns the type of comparison. */ public int getComparison() { return super.comparison; } protected boolean match(int i) { switch (comparison) { case LE: return i <= number; case LT: return i < number; case EQ: return i == number; case NE: return i != number; case GT: return i > number; case GE: return i >= number; } return false; } public boolean equals(Object other) { return (other instanceof IntegerComparisonTerm && ((IntegerComparisonTerm) other).number == number && super.equals(other)); } public int hashCode() { return number + super.hashCode(); } } mail-1.1.2/source/javax/mail/search/MessageIDTerm.java0000664000076500007650000000452010614714012022106 0ustar dogdog00000000000000/* * MessageIDTerm.java * Copyright (C) 2002 The Free Software Foundation * * This file is part of GNU JavaMail, a library. * * GNU JavaMail is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * GNU JavaMail 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * As a special exception, if you link this library with other files to * produce an executable, this library does not by itself cause the * resulting executable to be covered by the GNU General Public License. * This exception does not however invalidate any other reasons why the * executable file might be covered by the GNU General Public License. */ package javax.mail.search; import javax.mail.Message; /** * A comparison for the RFC822 "Message-Id", a string message identifier * for Internet messages that is supposed to be unique per message. * * @author Chris Burdess * @version 1.4 */ public final class MessageIDTerm extends StringTerm { /** * Constructor. * @param msgid the Message-Id to search for */ public MessageIDTerm(String msgid) { super(msgid); } /** * Returns true if the given message's Message-Id matches the * Message-Id specified in this term. */ public boolean match(Message msg) { try { String[] messageIDs = msg.getHeader("Message-ID"); if (messageIDs != null) { for (int i = 0; i < messageIDs.length; i++) { if (super.match(messageIDs[i])) { return true; } } } } catch (Exception e) { } return false; } public boolean equals(Object other) { return (other instanceof MessageIDTerm && super.equals(other)); } } mail-1.1.2/source/javax/mail/search/MessageNumberTerm.java0000664000076500007650000000400410614714012023037 0ustar dogdog00000000000000/* * MessageNumberTerm.java * Copyright (C) 2002 The Free Software Foundation * * This file is part of GNU JavaMail, a library. * * GNU JavaMail is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * GNU JavaMail 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * As a special exception, if you link this library with other files to * produce an executable, this library does not by itself cause the * resulting executable to be covered by the GNU General Public License. * This exception does not however invalidate any other reasons why the * executable file might be covered by the GNU General Public License. */ package javax.mail.search; import javax.mail.Message; /** * A comparison of message numbers. * * @author Chris Burdess * @version 1.4 */ public final class MessageNumberTerm extends IntegerComparisonTerm { /** * Constructor. * @param number the message number to match */ public MessageNumberTerm(int number) { super(EQ, number); } /** * Returns true if the message number of the given message is equal to the * message number specified in this term. */ public boolean match(Message msg) { try { return super.match(msg.getMessageNumber()); } catch (Exception e) { } return false; } public boolean equals(Object other) { return (other instanceof MessageNumberTerm && super.equals(other)); } } mail-1.1.2/source/javax/mail/search/NotTerm.java0000664000076500007650000000403310614714012021044 0ustar dogdog00000000000000/* * NotTerm.java * Copyright (C) 2002 The Free Software Foundation * * This file is part of GNU JavaMail, a library. * * GNU JavaMail is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * GNU JavaMail 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * As a special exception, if you link this library with other files to * produce an executable, this library does not by itself cause the * resulting executable to be covered by the GNU General Public License. * This exception does not however invalidate any other reasons why the * executable file might be covered by the GNU General Public License. */ package javax.mail.search; import javax.mail.Message; /** * Provides the logical negation of the target term. * * @author Chris Burdess * @version 1.4 */ public final class NotTerm extends SearchTerm { /** * The search term to negate. */ protected SearchTerm term; public NotTerm(SearchTerm t) { term = t; } /** * Returns the term to negate. */ public SearchTerm getTerm() { return term; } /** * Returns true only if the term specified in this term does not match the * given message. */ public boolean match(Message msg) { return !term.match(msg); } public boolean equals(Object other) { return (other instanceof NotTerm && ((NotTerm) other).term.equals(term)); } public int hashCode() { return term.hashCode() << 1; } } mail-1.1.2/source/javax/mail/search/OrTerm.java0000664000076500007650000000571110614714012020670 0ustar dogdog00000000000000/* * OrTerm.java * Copyright (C) 2002 The Free Software Foundation * * This file is part of GNU JavaMail, a library. * * GNU JavaMail is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * GNU JavaMail 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * As a special exception, if you link this library with other files to * produce an executable, this library does not by itself cause the * resulting executable to be covered by the GNU General Public License. * This exception does not however invalidate any other reasons why the * executable file might be covered by the GNU General Public License. */ package javax.mail.search; import javax.mail.Message; /** * A logical OR of a number of search terms. * * @author Chris Burdess * @version 1.4 */ public final class OrTerm extends SearchTerm { /** * The target terms. */ protected SearchTerm[] terms; /** * Constructor with two operands. * @param t1 the first term * @param t2 the second term */ public OrTerm(SearchTerm t1, SearchTerm t2) { terms = new SearchTerm[2]; terms[0] = t1; terms[1] = t2; } /** * Constructor with multiple search terms. * @param t the terms */ public OrTerm(SearchTerm[] t) { terms = new SearchTerm[t.length]; System.arraycopy(t, 0, terms, 0, t.length); } /** * Returns the search terms. */ public SearchTerm[] getTerms() { return (SearchTerm[]) terms.clone(); } /** * Returns true only if any of the terms specified in this term match * the given message. */ public boolean match(Message msg) { for (int i = 0; i < terms.length; i++) { if (terms[i].match(msg)) { return true; } } return false; } public boolean equals(Object other) { if (other instanceof OrTerm) { OrTerm orterm = (OrTerm) other; if (orterm.terms.length != terms.length) { return false; } for (int i = 0; i < terms.length; i++) { if (!terms[i].equals(orterm.terms[i])) { return false; } } return true; } return false; } public int hashCode() { int acc = 0; for (int i = 0; i < terms.length; i++) { acc += terms[i].hashCode(); } return acc; } } mail-1.1.2/source/javax/mail/search/package.html0000664000076500007650000000014110614714012021066 0ustar dogdog00000000000000

        Search expressions for executing searches on the messages in a folder.

        mail-1.1.2/source/javax/mail/search/ReceivedDateTerm.java0000664000076500007650000000416010614714012022631 0ustar dogdog00000000000000/* * ReceivedDateTerm.java * Copyright (C) 2002 The Free Software Foundation * * This file is part of GNU JavaMail, a library. * * GNU JavaMail is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * GNU JavaMail 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * As a special exception, if you link this library with other files to * produce an executable, this library does not by itself cause the * resulting executable to be covered by the GNU General Public License. * This exception does not however invalidate any other reasons why the * executable file might be covered by the GNU General Public License. */ package javax.mail.search; import java.util.Date; import javax.mail.Message; /** * A comparison of message received dates. * * @author Chris Burdess * @version 1.4 */ public final class ReceivedDateTerm extends DateTerm { /** * Constructor. * @param comparison the comparison operator * @param date the date for comparison */ public ReceivedDateTerm(int comparison, Date date) { super(comparison, date); } /** * Returns true only if the given message's received date matches this * term. */ public boolean match(Message msg) { try { Date d = msg.getReceivedDate(); if (d != null) { return super.match(d); } } catch (Exception e) { } return false; } public boolean equals(Object other) { return (other instanceof ReceivedDateTerm && super.equals(other)); } } mail-1.1.2/source/javax/mail/search/RecipientStringTerm.java0000664000076500007650000000541410614714012023421 0ustar dogdog00000000000000/* * RecipientStringTerm.java * Copyright (C) 2002 The Free Software Foundation * * This file is part of GNU JavaMail, a library. * * GNU JavaMail is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * GNU JavaMail 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * As a special exception, if you link this library with other files to * produce an executable, this library does not by itself cause the * resulting executable to be covered by the GNU General Public License. * This exception does not however invalidate any other reasons why the * executable file might be covered by the GNU General Public License. */ package javax.mail.search; import javax.mail.Address; import javax.mail.Message; /** * A string comparison of the recipient headers in a message. * * @author Chris Burdess * @version 1.4 */ public final class RecipientStringTerm extends AddressStringTerm { /** * The recipient type. */ private Message.RecipientType type; /** * Constructor. * @param type the recipient type * @param address the address pattern for comparison */ public RecipientStringTerm(Message.RecipientType type, String pattern) { super(pattern); this.type = type; } /** * Return the recipient type. */ public Message.RecipientType getRecipientType() { return type; } /** * Returns true only if the address specified in this term is a substring * of the recipient address in the given message. */ public boolean match(Message msg) { try { Address[] addresses = msg.getRecipients(type); if (addresses != null) { for (int i = 0; i < addresses.length; i++) { if (super.match(addresses[i])) { return true; } } } } catch (Exception e) { } return false; } public boolean equals(Object other) { return (other instanceof RecipientStringTerm && ((RecipientStringTerm) other).type.equals(type) && super.equals(other)); } public int hashCode() { return type.hashCode() + super.hashCode(); } } mail-1.1.2/source/javax/mail/search/RecipientTerm.java0000664000076500007650000000533710614714012022236 0ustar dogdog00000000000000/* * RecipientTerm.java * Copyright (C) 2002 The Free Software Foundation * * This file is part of GNU JavaMail, a library. * * GNU JavaMail is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * GNU JavaMail 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * As a special exception, if you link this library with other files to * produce an executable, this library does not by itself cause the * resulting executable to be covered by the GNU General Public License. * This exception does not however invalidate any other reasons why the * executable file might be covered by the GNU General Public License. */ package javax.mail.search; import javax.mail.Address; import javax.mail.Message; /** * A comparison of recipient headers in a message. * * @author Chris Burdess * @version 1.4 */ public final class RecipientTerm extends AddressTerm { /** * The recipient type. */ protected Message.RecipientType type; /** * Constructor. * @param type the recipient type * @param address the address to match */ public RecipientTerm(Message.RecipientType type, Address address) { super(address); this.type = type; } /** * Returns the recipient type. */ public Message.RecipientType getRecipientType() { return type; } /** * Returns true only if the recipient address in the given message matches * the address specified in this term. */ public boolean match(Message msg) { Address aaddress[]; try { Address[] addresses = msg.getRecipients(type); if (addresses != null) { for (int i = 0; i < addresses.length; i++) { if (super.match(addresses[i])) { return true; } } } } catch (Exception e) { } return false; } public boolean equals(Object other) { return (other instanceof RecipientTerm && ((RecipientTerm) other).type.equals(type) && super.equals(other)); } public int hashCode() { return type.hashCode() + super.hashCode(); } } mail-1.1.2/source/javax/mail/search/SearchException.java0000664000076500007650000000340010614714012022535 0ustar dogdog00000000000000/* * SearchException.java * Copyright (C) 2002 The Free Software Foundation * * This file is part of GNU JavaMail, a library. * * GNU JavaMail is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * GNU JavaMail 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * As a special exception, if you link this library with other files to * produce an executable, this library does not by itself cause the * resulting executable to be covered by the GNU General Public License. * This exception does not however invalidate any other reasons why the * executable file might be covered by the GNU General Public License. */ package javax.mail.search; import javax.mail.MessagingException; /** * An exception thrown to indicate that a search expression could not be * handled by the store implementation. * * @author Chris Burdess * @version 1.4 */ public class SearchException extends MessagingException { /** * Constructor with no detail message. */ public SearchException() { } /** * Constructor with the specified detail message. * @param s the detail message */ public SearchException(String s) { super(s); } } mail-1.1.2/source/javax/mail/search/SearchTerm.java0000664000076500007650000000322410614714012021512 0ustar dogdog00000000000000/* * SearchTerm.java * Copyright (C) 2002 The Free Software Foundation * * This file is part of GNU JavaMail, a library. * * GNU JavaMail is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * GNU JavaMail 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * As a special exception, if you link this library with other files to * produce an executable, this library does not by itself cause the * resulting executable to be covered by the GNU General Public License. * This exception does not however invalidate any other reasons why the * executable file might be covered by the GNU General Public License. */ package javax.mail.search; import java.io.Serializable; import javax.mail.Message; /** * A search expression is represented as a tree of search terms. All search * terms derive from this class. * * @author Chris Burdess * @version 1.4 */ public abstract class SearchTerm implements Serializable { /** * Indicates whether the given message matches this search term. */ public abstract boolean match(Message msg); } mail-1.1.2/source/javax/mail/search/SentDateTerm.java0000664000076500007650000000417410614714012022021 0ustar dogdog00000000000000/* * SentDateTerm.java * Copyright (C) 2002 The Free Software Foundation * * This file is part of GNU JavaMail, a library. * * GNU JavaMail is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * GNU JavaMail 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * As a special exception, if you link this library with other files to * produce an executable, this library does not by itself cause the * resulting executable to be covered by the GNU General Public License. * This exception does not however invalidate any other reasons why the * executable file might be covered by the GNU General Public License. */ package javax.mail.search; import java.util.Date; import javax.mail.Message; /** * A comparison of message sent dates. * * @author Chris Burdess * @version 1.4 */ public final class SentDateTerm extends DateTerm { /** * Constructor. * @param comparison the comparison operator * @param date the date for comparison */ public SentDateTerm(int comparison, Date date) { super(comparison, date); } /** * Returns true only if the given message's sent date matches the * specified date using the specified operator. */ public boolean match(Message msg) { try { Date d = msg.getSentDate(); if (d != null) { return super.match(d); } } catch (Exception e) { } return false; } public boolean equals(Object other) { return (other instanceof SentDateTerm && super.equals(other)); } } mail-1.1.2/source/javax/mail/search/SizeTerm.java0000664000076500007650000000411710614714012021221 0ustar dogdog00000000000000/* * SizeTerm.java * Copyright (C) 2002 The Free Software Foundation * * This file is part of GNU JavaMail, a library. * * GNU JavaMail is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * GNU JavaMail 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * As a special exception, if you link this library with other files to * produce an executable, this library does not by itself cause the * resulting executable to be covered by the GNU General Public License. * This exception does not however invalidate any other reasons why the * executable file might be covered by the GNU General Public License. */ package javax.mail.search; import javax.mail.Message; /** * A comparison of message sizes. * * @author Chris Burdess * @version 1.4 */ public final class SizeTerm extends IntegerComparisonTerm { /** * Constructor. * @param comparison the comparison operator * @param size the size */ public SizeTerm(int comparison, int size) { super(comparison, size); } /** * Returns true only if the size of the given message matches the * specified size using the specified operator. */ public boolean match(Message msg) { try { int size = msg.getSize(); if (size != -1) { return super.match(size); } } catch (Exception e) { } return false; } public boolean equals(Object other) { return (other instanceof SizeTerm && super.equals(other)); } } mail-1.1.2/source/javax/mail/search/StringTerm.java0000664000076500007650000000561410614714012021560 0ustar dogdog00000000000000/* * StringTerm.java * Copyright (C) 2002 The Free Software Foundation * * This file is part of GNU JavaMail, a library. * * GNU JavaMail is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * GNU JavaMail 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * As a special exception, if you link this library with other files to * produce an executable, this library does not by itself cause the * resulting executable to be covered by the GNU General Public License. * This exception does not however invalidate any other reasons why the * executable file might be covered by the GNU General Public License. */ package javax.mail.search; /** * A comparison of string values. * * @author Chris Burdess * @version 1.4 */ public abstract class StringTerm extends SearchTerm { /** * The pattern to match. */ protected String pattern; /** * Whether to ignore case during comparison. */ protected boolean ignoreCase; protected StringTerm(String pattern) { this(pattern, true); } protected StringTerm(String pattern, boolean ignoreCase) { this.pattern = pattern; this.ignoreCase = ignoreCase; } /** * Returns the pattern to match. */ public String getPattern() { return pattern; } /** * Indicates whether to ignore case during comparison. */ public boolean getIgnoreCase() { return ignoreCase; } /** * Returns true if the specified pattern is a substring of the given string. */ protected boolean match(String s) { int patlen = pattern.length(); int len = s.length() - patlen; for (int i = 0; i <= len; i++) { if (s.regionMatches(ignoreCase, i, pattern, 0, patlen)) { return true; } } return false; } public boolean equals(Object other) { if (other instanceof StringTerm) { StringTerm st = (StringTerm)other; if (ignoreCase) { return st.pattern.equalsIgnoreCase(pattern) && st.ignoreCase == ignoreCase; } else { return st.pattern.equals(pattern) && st.ignoreCase == ignoreCase; } } return false; } public int hashCode() { return (ignoreCase) ? pattern.hashCode() : ~pattern.hashCode(); } } mail-1.1.2/source/javax/mail/search/SubjectTerm.java0000664000076500007650000000407010614714012021704 0ustar dogdog00000000000000/* * SubjectTerm.java * Copyright (C) 2002 The Free Software Foundation * * This file is part of GNU JavaMail, a library. * * GNU JavaMail is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * GNU JavaMail 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * As a special exception, if you link this library with other files to * produce an executable, this library does not by itself cause the * resulting executable to be covered by the GNU General Public License. * This exception does not however invalidate any other reasons why the * executable file might be covered by the GNU General Public License. */ package javax.mail.search; import javax.mail.Message; /** * A comparison of message subject headers. * * @author Chris Burdess * @version 1.4 */ public final class SubjectTerm extends StringTerm { /** * Constructor. * @param pattern the pattern to match */ public SubjectTerm(String pattern) { super(pattern); } /** * Returns true only if the pattern specified in this term is a substring * of the given message's Subject header. */ public boolean match(Message msg) { try { String subject = msg.getSubject(); if (subject != null) { return super.match(subject); } } catch (Exception e) { } return false; } public boolean equals(Object other) { return (other instanceof SubjectTerm && super.equals(other)); } } mail-1.1.2/source/javax/mail/SendFailedException.java0000664000076500007650000000613410614714012022070 0ustar dogdog00000000000000/* * SendFailedException.java * Copyright (C) 2002 The Free Software Foundation * * This file is part of GNU JavaMail, a library. * * GNU JavaMail is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or *(at your option) any later version. * * GNU JavaMail 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * As a special exception, if you link this library with other files to * produce an executable, this library does not by itself cause the * resulting executable to be covered by the GNU General Public License. * This exception does not however invalidate any other reasons why the * executable file might be covered by the GNU General Public License. */ package javax.mail; /** * An exception thrown when a message cannot be sent. *

        * It includes those addresses to which the message could not be * sent as well as the valid addresses to which the message was sent * and valid addresses to which the message was not sent. * * @author Chris Burdess * @version 1.4 */ public class SendFailedException extends MessagingException { protected transient Address[] invalid; protected transient Address[] validSent; protected transient Address[] validUnsent; public SendFailedException() { } public SendFailedException(String message) { super(message); } public SendFailedException(String message, Exception exception) { super(message, exception); } /** * Creates a send failed exception with the specified string and * addresses. * @param message the detail message * @param exception the embedded exception * @param validSent valid addresses to which message was sent * @param validUnsent valid addresses to which message was not sent * @param invalid the invalid addresses */ public SendFailedException(String message, Exception exception, Address[] validSent, Address[] validUnsent, Address[] invalid) { super(message, exception); this.validSent = validSent; this.validUnsent = validUnsent; this.invalid = invalid; } /** * Returns the addresses to which this message was sent succesfully. */ public Address[] getValidSentAddresses() { return validSent; } /** * Returns the addresses that are valid but to which this message was * not sent. */ public Address[] getValidUnsentAddresses() { return validUnsent; } /** * Returns the addresses to which this message could not be sent. */ public Address[] getInvalidAddresses() { return invalid; } } mail-1.1.2/source/javax/mail/Service.java0000664000076500007650000003356110614714012017617 0ustar dogdog00000000000000/* * Service.java * Copyright (C) 2002, 2005 The Free Software Foundation * * This file is part of GNU JavaMail, a library. * * GNU JavaMail is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * GNU JavaMail 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * As a special exception, if you link this library with other files to * produce an executable, this library does not by itself cause the * resulting executable to be covered by the GNU General Public License. * This exception does not however invalidate any other reasons why the * executable file might be covered by the GNU General Public License. */ package javax.mail; import java.net.InetAddress; import java.net.UnknownHostException; import java.util.ArrayList; import java.util.Iterator; import java.util.Vector; import javax.mail.event.ConnectionEvent; import javax.mail.event.ConnectionListener; import javax.mail.event.MailEvent; /** * An abstract messaging service (store or transport). * * @author Chris Burdess * @version 1.4 */ public abstract class Service { /** * The session context for this service. */ protected Session session; /** * The URLName of this service. */ protected URLName url; /** * The debug flag for this service. * Initialised from the session's debug flag when this service is created. */ protected boolean debug; /* * @see #isConnected */ private boolean connected = false; private ArrayList connectionListeners = null; /** * Constructor. * @param session the session context for this service * @param url the URLName of this service */ protected Service(Session session, URLName url) { this.session = session; this.url = url; debug = session.getDebug(); } /** * Connects to this service. * If additional information is required, the provider can determine them * from session properties or via a callback to the UI. * @exception AuthenticationFailedException on authentication failure * @exception MessagingException for other failures * @exception IllegalStateException if the service is already connected */ public void connect() throws MessagingException { connect(null, null, null); } /** * Connects to this service. * This method provides a simple authentication scheme requiring a * username and password. The host is determined from the inital URLName. * @param user the username * @param password the password * @exception AuthenticationFailedException on authentication failure * @exception MessagingException for other failures * @exception IllegalStateException if the service is already connected * @since JavaMail 1.4 */ public void connect(String user, String password) throws MessagingException { connect(null, user, password); } /** * Connects to this service using the specified details. * This method provides a simple authentication scheme requiring a * username and password. * @param host the host to connect to * @param user the username * @param password the password * @exception AuthenticationFailedException on authentication failure * @exception MessagingException for other failures * @exception IllegalStateException if the service is already connected */ public void connect(String host, String user, String password) throws MessagingException { connect(host, -1, user, password); } /** * Connects to this service using the specified details. * This method provides a simple authentication scheme requiring a * username and password. * @param host the host to connect to * @param port the port to use (-1 for the default port) * @param user the username * @param password the password * @exception AuthenticationFailedException on authentication failure * @exception MessagingException for other failures * @exception IllegalStateException if the service is already connected */ public void connect(String host, int port, String user, String password) throws MessagingException { if (isConnected()) { throw new MessagingException("already connected"); } boolean success = false; boolean authenticated = false; String protocol = null; String file = null; if (url != null) { protocol = url.getProtocol(); if (host == null) { host = url.getHost(); } if (port == -1) { port = url.getPort(); } if (user == null) { user = url.getUsername(); if (password == null) { password = url.getPassword(); } } else if (password == null && user.equals(url.getUsername())) { password = url.getPassword(); } file = url.getFile(); } if (protocol != null) { if (host == null) { host = session.getProperty("mail." + protocol + ".host"); } if (user == null) { user = session.getProperty("mail." + protocol + ".user"); } } if (host == null) { host = session.getProperty("mail.host"); } if (user == null) { user = session.getProperty("mail.user"); } if (user == null) { try { user = System.getProperty("user.name"); } catch (SecurityException e) { if (debug) { e.printStackTrace(); } } } if (password == null && url != null) { setURLName(new URLName(protocol, host, port, file, user, password)); PasswordAuthentication auth = session.getPasswordAuthentication(getURLName()); if (auth != null) { if (user == null) { user = auth.getUserName(); password = auth.getPassword(); } else if (user.equals(auth.getUserName())) { password = auth.getPassword(); } } else { authenticated = true; } } AuthenticationFailedException afex = null; try { success = protocolConnect(host, port, user, password); } catch (AuthenticationFailedException afex2) { afex = afex2; } if (!success) { InetAddress address = null; try { address = InetAddress.getByName(host); } catch (UnknownHostException e) { } PasswordAuthentication auth = session.requestPasswordAuthentication(address, port, protocol, null, user); if (auth != null) { user = auth.getUserName(); password = auth.getPassword(); success = protocolConnect(host, port, user, password); } } if (!success) { if (afex!=null) { throw afex; } throw new AuthenticationFailedException(); } setURLName(new URLName(protocol, host, port, file, user, password)); if (authenticated) { PasswordAuthentication auth = new PasswordAuthentication(user, password); session.setPasswordAuthentication(getURLName(), auth); } setConnected(true); notifyConnectionListeners(ConnectionEvent.OPENED); } /** * Provider implementation for a service. *

        * This method should return false if authentication fails, * due to the username or password being unavailable or incorrect, or may * throw AuthenticationFailedException for further details. *

        * In the case of failures not related to authentication, such as an * invalid configuration or network error, this method should throw an * appropriate MessagingException. * @param host the name of the host to connect to * @param port the port to use (-1 for the default port) * @param user the username * @param password the password * @return true on success, false if authentication failed * @exception AuthenticationFailedException on authentication failure * @exception MessagingException for non-authentication failures */ protected boolean protocolConnect(String host, int port, String user, String password) throws MessagingException { return false; } /** * Indicates whether this service is currently connected. */ public boolean isConnected() { return connected; } /** * Sets the connection state of this service. */ protected void setConnected(boolean connected) { this.connected = connected; } /** * Closes this service, terminating any underlying connections. */ public synchronized void close() throws MessagingException { setConnected(false); notifyConnectionListeners(ConnectionEvent.CLOSED); } /** * Return a URLName representing this service. The password field will not * be returned. */ public URLName getURLName() { if (url != null && (url.getPassword() != null || url.getFile() != null)) { return new URLName(url.getProtocol(), url.getHost(), url.getPort(), null, url.getUsername(), null); } return url; } /** * Set the URLName representing this service. * This method is called when the service has successfully connected. */ protected void setURLName(URLName url) { this.url = url; } // -- Event management -- /* * Because the propagation of events of different kinds in the JavaMail * API is so haphazard, I have here sacrificed a small time advantage for * readability and consistency. * * All the various propagation methods now call a method with a name based * on the eventual listener method name prefixed by 'fire', as is the * preferred pattern for usage of the EventListenerList in Swing. * * Note that all events are currently delivered synchronously, where in * Sun's implementation a different thread is used for event delivery. * * TODO Examine the impact of this. */ // -- Connection events -- /** * Adds a listener for connection events on this service. */ public void addConnectionListener(ConnectionListener l) { if (connectionListeners == null) { connectionListeners = new ArrayList(); } synchronized (connectionListeners) { connectionListeners.add(l); } } /** * Removes a connection event listener. */ public void removeConnectionListener(ConnectionListener l) { if (connectionListeners != null) { synchronized (connectionListeners) { connectionListeners.remove(l); } } } /** * Notify all connection listeners. */ protected void notifyConnectionListeners(int type) { ConnectionEvent event = new ConnectionEvent(this, type); switch (type) { case ConnectionEvent.OPENED: fireOpened(event); break; case ConnectionEvent.DISCONNECTED: fireDisconnected(event); break; case ConnectionEvent.CLOSED: fireClosed(event); break; } } /* * Propagates an OPENED ConnectionEvent to all registered listeners. */ void fireOpened(ConnectionEvent event) { if (connectionListeners != null) { ConnectionListener[] l = null; synchronized (connectionListeners) { l = new ConnectionListener[connectionListeners.size()]; connectionListeners.toArray(l); } for (int i = 0; i < l.length; i++) { l[i].opened(event); } } } /* * Propagates a DISCONNECTED ConnectionEvent to all registered listeners. */ void fireDisconnected(ConnectionEvent event) { if (connectionListeners != null) { ConnectionListener[] l = null; synchronized (connectionListeners) { l = new ConnectionListener[connectionListeners.size()]; connectionListeners.toArray(l); } for (int i = 0; i < l.length; i++) { l[i].disconnected(event); } } } /* * Propagates a CLOSED ConnectionEvent to all registered listeners. */ void fireClosed(ConnectionEvent event) { if (connectionListeners != null) { ConnectionListener[] l = null; synchronized (connectionListeners) { l = new ConnectionListener[connectionListeners.size()]; connectionListeners.toArray(l); } for (int i = 0; i < l.length; i++) { l[i].closed(event); } } } /** * Returns getURLName.toString if this service has a URLName, * otherwise returns the default toString. */ public String toString() { URLName urlName = getURLName(); return (urlName != null) ? urlName.toString() : super.toString(); } /** * Adds the event and vector of listeners to be notified. */ protected void queueEvent(MailEvent event, Vector vector) { for (Iterator i = vector.iterator(); i.hasNext(); ) { event.dispatch(i.next()); } } } mail-1.1.2/source/javax/mail/Session.java0000664000076500007650000007017710614714012017646 0ustar dogdog00000000000000/* * Session.java * Copyright (C) 2002, 2004, 2005 The Free Software Foundation * * This file is part of GNU JavaMail, a library. * * GNU JavaMail is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * GNU JavaMail 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * As a special exception, if you link this library with other files to * produce an executable, this library does not by itself cause the * resulting executable to be covered by the GNU General Public License. * This exception does not however invalidate any other reasons why the * executable file might be covered by the GNU General Public License. */ package javax.mail; import java.io.*; import java.lang.reflect.Constructor; import java.net.InetAddress; import java.net.URL; import java.util.ArrayList; import java.util.HashMap; import java.util.Properties; import java.util.StringTokenizer; import java.util.logging.Level; import java.util.logging.Logger; /** * A session represents the context of a messaging transaction. It provides * a repository of configuration information in the form of properties. * * @author Andrew Selkirk * @author Chris Burdess * @author Nic Ferrier * @version 1.4 */ public final class Session { // Constant definitions of property locations. private static final String SYSTEM_PROVIDERS = (System.getProperty("java.home") + File.separator + "lib" + File.separator + "javamail.providers"); private static final String CUSTOM_PROVIDERS = "META-INF/javamail.providers"; private static final String DEFAULT_PROVIDERS = "META-INF/javamail.default.providers"; private static final String SYSTEM_ADDRESS_MAP = (System.getProperty("java.home") + File.separator + "lib" + File.separator + "javamail.address.map"); private static final String CUSTOM_ADDRESS_MAP = "META-INF/javamail.address.map"; private static final String DEFAULT_ADDRESS_MAP = "META-INF/javamail.default.address.map"; // Class data. private Properties props; private Authenticator authenticator; private HashMap authTable = new HashMap(); private boolean debug; private ArrayList providers = new ArrayList(); private HashMap providersByProtocol = new HashMap(); private HashMap providersByClassName = new HashMap(); private Properties addressMap = new Properties(); private static Session defaultSession = null; private Logger logger = Logger.getLogger(Session.class.getName()); /** * Create the session. * @param props the session properties * @param authenticator callback for authentication */ private Session(Properties props, Authenticator authenticator) { this.props = props; this.authenticator = authenticator; debug = new Boolean(props.getProperty("mail.debug")).booleanValue(); logger.setLevel(debug ? Level.FINER : Level.SEVERE); logger.info("using GNU JavaMail 1.3"); ClassLoader loader = null; if (authenticator == null) { loader = getClass().getClassLoader(); } else { loader = authenticator.getClass().getClassLoader(); } // Load the providers loadProviders(getResourceAsStream(loader, DEFAULT_PROVIDERS), "default"); loadProviders(getResourceAsStream(loader, CUSTOM_PROVIDERS), "custom"); try { File file = new File(SYSTEM_PROVIDERS); InputStream pin = new BufferedInputStream(new FileInputStream(file)); loadProviders(pin, "system"); } catch (FileNotFoundException e) { logger.log(Level.WARNING, "no system providers", e); } logger.log(Level.FINE, "Providers by class name: " + providersByClassName.toString()); logger.log(Level.FINE, "Providers by protocol: " + providersByProtocol.toString()); // Load the address map loadAddressMap(getResourceAsStream(loader, DEFAULT_ADDRESS_MAP), "default"); loadAddressMap(getResourceAsStream(loader, CUSTOM_ADDRESS_MAP), "custom"); try { File file = new File(SYSTEM_ADDRESS_MAP); InputStream min = new BufferedInputStream(new FileInputStream(file)); loadAddressMap(min, "system"); } catch (FileNotFoundException e) { logger.log(Level.WARNING, "no system address map", e); } } /** * Returns an input stream for a resource name. * ClassLoader.getResourceAsStream should work, * but Class.getClassLoader() returns null in kaffe (2003-01-22). */ private InputStream getResourceAsStream(ClassLoader loader, String resource) { InputStream in = null; try { if (loader == null) { in = loader.getResourceAsStream(resource); } else { in = getClass().getResourceAsStream(resource); } if (in == null && resource.charAt(0) != '/') { in = getResourceAsStream(loader, "/" + resource); } } catch (Exception e) { } return in; } /** * Loads the provider database description. */ private void loadProviders(InputStream in, String description) { if (in == null) { logger.info("no " + description + " providers"); return; } try { BufferedReader reader = new BufferedReader(new InputStreamReader(in)); for (String line = reader.readLine(); line != null; line = reader.readLine()) { line = line.trim(); if (!line.startsWith("#") && line.length() > 0) { Provider.Type type = null; String protocol = null; String className = null; String vendor = null; String version = null; for (StringTokenizer st = new StringTokenizer(line, ";"); st.hasMoreTokens(); ) { String token = st.nextToken().trim(); int equalsIndex = token.indexOf("="); if (token.startsWith("protocol=")) { protocol = token.substring(equalsIndex + 1); } else if (token.startsWith("type=")) { String transportValue = token.substring(equalsIndex + 1); if (transportValue.equalsIgnoreCase("store")) { type = Provider.Type.STORE; } else if (transportValue.equalsIgnoreCase("transport")) { type = Provider.Type.TRANSPORT; } } else if (token.startsWith("class=")) { className = token.substring(equalsIndex + 1); } else if (token.startsWith("vendor=")) { vendor = token.substring(equalsIndex + 1); } else if (token.startsWith("version=")) { version = token.substring(equalsIndex + 1); } } if (type == null || protocol == null || className == null) { logger.warning("Invalid provider: " + line); } else { Provider provider = new Provider(type, protocol, className, vendor, version); providers.add(provider); providersByClassName.put(className, provider); if (!providersByProtocol.containsKey(protocol)) { providersByProtocol.put(protocol, provider); } } } } in.close(); logger.info("loaded " + description + " providers"); } catch (IOException e) { logger.log(Level.WARNING, e.getMessage(), e); } catch (SecurityException e) { logger.log(Level.WARNING, "can't load " + description + " providers", e); } } private void loadAddressMap(InputStream in, String description) { if (in == null) { logger.info("no " + description + " address map"); return; } try { addressMap.load(in); in.close(); logger.info("loaded " + description + " address map"); } catch (IOException e) { logger.log(Level.WARNING, e.getMessage(), e); } catch (SecurityException e) { logger.log(Level.WARNING, "can't load " + description + " address map", e); } } /** * Returns a new session. * @param props a properties object holding relevant properties. * It is expected that the client supplies values for the properties * listed in Appendix A of the JavaMail spec (particularly * mail.store.protocol, * mail.transport.protocol, * mail.host, * mail.user, * and mail.from) * as the defaults are unlikely to work in all cases. * @param authenticator an authenticator used to call back to the * application when a user name and password is needed. */ public static Session getInstance(Properties props, Authenticator authenticator) { return new Session(props, authenticator); } /** * Returns a new Session. * @param props a properties object holding relevant properties. * It is expected that the client supplies values for the properties * listed in Appendix A of the JavaMail spec (particularly * mail.store.protocol, * mail.transport.protocol, * mail.host, * mail.user, * and mail.from) * as the defaults are unlikely to work in all cases. */ public static Session getInstance(Properties props) { return getInstance(props, null); } /** * Returns the default session. * If a default has not yet been setup, a new session is created * and installed as the default. *

        * Since the default session is potentially available to all code * executing in the same Java virtual machine, and the session can * contain security sensitive information such as user names and * passwords, access to the default session is restricted. * The Authenticator object, which must be created by the caller, * is used indirectly to check access permission. The Authenticator * object passed in when the session is created is compared with * the Authenticator object passed in to subsequent requests to get the * default session. If both objects are the same, or are from the same * ClassLoader, the request is allowed. Otherwise, it is denied. *

        * Note that if the Authenticator object used to create the session is null, * anyone can get the default session by passing in null. *

        * In JDK 1.2, additional security Permission objects may be used to control * access to the default session. * @param props Properties object that hold relevant properties. * It is expected that the client supplies values for the properties * listed in Appendix A of the JavaMail spec (particularly * mail.store.protocol, * mail.transport.protocol, * mail.host, * mail.user, * and mail.from) * as the defaults are unlikely to work in all cases. * @param authenticator Authenticator object used to call back to the * application when a user name and password is needed. */ public static Session getDefaultInstance(Properties props, Authenticator authenticator) { if (defaultSession == null) { defaultSession = new Session(props, authenticator); } else if (defaultSession.authenticator != authenticator &&(defaultSession.authenticator == null || authenticator == null || (defaultSession.authenticator.getClass().getClassLoader() != authenticator.getClass().getClassLoader()))) { throw new SecurityException("Access denied"); } return defaultSession; } /** * Get the default Session object. * If a default has not yet been setup, a new Session object is created * and installed as the default. *

        * Note that a default session created with no Authenticator is available * to all code executing in the same Java virtual machine, and the session * can contain security sensitive information such as user names and * passwords. * @param props Properties object that hold relevant properties. * It is expected that the client supplies values for the properties * listed in Appendix A of the JavaMail spec(particularly * mail.store.protocol, * mail.transport.protocol, * mail.host, * mail.user, * and mail.from) * as the defaults are unlikely to work in all cases. */ public static Session getDefaultInstance(Properties props) { return getDefaultInstance(props, null); } /** * Set the debug setting for this Session. *

        * Since the debug setting can be turned on only after the Session has been * created, to turn on debugging in the Session constructor, set the property * mail.debug in the Properties object passed in to the * constructor to true. The value of the mail.debug property * is used to initialize the per-Session debugging flag. Subsequent calls * to the setDebug method manipulate the per-Session debugging * flag and have no affect on the mail.debug property. */ public void setDebug(boolean debug) { this.debug = debug; } /** * Get the debug setting for this Session. */ public boolean getDebug() { return debug; } /** * This method returns an array of all the implementations installed * via the javamail.[default.]providers files that can be loaded * using the ClassLoader available to this application. */ public Provider[] getProviders() { Provider[] p = new Provider[providers.size()]; providers.toArray(p); return p; } /** * Returns the default Provider for the protocol specified. * Checks mail.<protocol>.class property first * and if it exists, returns the Provider associated with * this implementation. If it doesn't exist, returns the Provider that * appeared first in the configuration files. * If an implementation for the protocol isn't found, * throws NoSuchProviderException * @param protocol Configured protocol(i.e. smtp, imap, etc) * @param NoSuchProviderException If a provider for the given protocol * is not found. */ public Provider getProvider(String protocol) throws NoSuchProviderException { if (protocol == null || protocol.length() <= 0) { throw new NoSuchProviderException("Invalid protocol: " + protocol); } Provider provider = null; String providerClassKey = "mail." + protocol + ".class"; String providerClassName = props.getProperty(providerClassKey); synchronized (providers) { if (providerClassName != null) { provider = (Provider) providersByClassName.get(providerClassName); } if (provider == null) { provider = (Provider) providersByProtocol.get(protocol); } } if (provider == null) { throw new NoSuchProviderException("No provider for " + protocol); } return provider; } /** * Set the passed Provider to be the default implementation for the protocol * in Provider.protocol overriding any previous values. */ public void setProvider(Provider provider) throws NoSuchProviderException { if (provider == null) { throw new NoSuchProviderException("Can't set null provider"); } synchronized (providers) { String protocol = provider.getProtocol(); providersByProtocol.put(protocol, provider); String providerClassKey = "mail." + protocol + ".class"; props.put(providerClassKey, provider.getClassName()); } } /** * Get a Store object that implements this user's desired Store protocol. * The mail.store.protocol property specifies the desired * protocol. If an appropriate Store object is not obtained, * NoSuchProviderException is thrown */ public Store getStore() throws NoSuchProviderException { return getStore(getProperty("mail.store.protocol")); } /** * Get a Store object that implements the specified protocol. * If an appropriate Store object cannot be obtained, * NoSuchProviderException is thrown. */ public Store getStore(String protocol) throws NoSuchProviderException { return getStore(new URLName(protocol, null, -1, null, null, null)); } /** * Get a Store object for the given URLName. * If the requested Store object cannot be obtained, * NoSuchProviderException is thrown. * The "scheme" part of the URL string(Refer RFC 1738) is used to * locate the Store protocol. * @param url URLName that represents the desired Store */ public Store getStore(URLName url) throws NoSuchProviderException { String protocol = url.getProtocol(); Provider provider = getProvider(protocol); return getStore(provider, url); } /** * Get an instance of the store specified by Provider. * Instantiates the store and returns it. * @param provider Store Provider that will be instantiated */ public Store getStore(Provider provider) throws NoSuchProviderException { return getStore(provider, null); } private Store getStore(Provider provider, URLName url) throws NoSuchProviderException { if (provider == null || provider.getType() != Provider.Type.STORE) { throw new NoSuchProviderException("invalid provider"); } try { return (Store) getService(provider, url); } catch (ClassCastException e) { throw new NoSuchProviderException("not a store"); } } /** * Get a Transport object that implements this user's desired Transport * protocol. * The mail.transport.protocol property specifies the desired * protocol. If an appropriate Transport object cannot be obtained, * MessagingException is thrown. * @exception NoSuchProviderException If the provider is not found. */ public Transport getTransport() throws NoSuchProviderException { return getTransport(getProperty("mail.transport.protocol")); } /** * Get a Transport object that implements the specified protocol. * If an appropriate Transport object cannot be obtained, null is returned. * @exception NoSuchProviderException If the provider is not found. */ public Transport getTransport(String protocol) throws NoSuchProviderException { return getTransport(new URLName(protocol, null, -1, null, null, null)); } /** * Get a Transport object for the given URLName. * If the requested Transport object cannot be obtained, * NoSuchProviderException is thrown. The "scheme" part of the URL * string(Refer RFC 1738) is used to locate the Transport protocol. * @param url URLName that represents the desired Transport * @exception NoSuchProviderException If the provider is not found. */ public Transport getTransport(URLName url) throws NoSuchProviderException { String protocol = url.getProtocol(); Provider provider = getProvider(protocol); return getTransport(provider, url); } /** * Get an instance of the transport specified in the Provider. * Instantiates the transport and returns it. * @exception NoSuchProviderException If the provider is not found. */ public Transport getTransport(Provider provider) throws NoSuchProviderException { return getTransport(provider, null); } /** * Get a Transport object that can transport a Message to the specified * address type. * @exception NoSuchProviderException If the provider is not found. */ public Transport getTransport(Address address) throws NoSuchProviderException { String provider = (String) addressMap.get(address.getType()); if (provider == null) { throw new NoSuchProviderException("No provider for address: "+ address.getType()); } return getTransport(provider); } private Transport getTransport(Provider provider, URLName urlname) throws NoSuchProviderException { if (provider == null || provider.getType() != Provider.Type.TRANSPORT) { throw new NoSuchProviderException("invalid provider"); } try { return (Transport) getService(provider, urlname); } catch (ClassCastException _ex) { throw new NoSuchProviderException("incorrect class"); } } /** * Get a closed Folder object for the given URLName. * If the requested Folder object cannot be obtained, null is returned. *

        * The "scheme" part of the URL string(Refer RFC 1738) is used to locate * the Store protocol. The rest of the URL string(that is, the * "schemepart", as per RFC 1738) is used by that Store in a protocol * dependent manner to locate and instantiate the appropriate Folder object. *

        * Note that RFC 1738 also specifies the syntax for the "schemepart" for * IP-based protocols(IMAP4, POP3, etc.). Providers of IP-based mail Stores * should implement that syntax for referring to Folders. * @param url URLName that represents the desired folder * @exception NoSuchProviderException If a provider for the given URLName * is not found. * @param MessagingException if the Folder could not be located or created. */ public Folder getFolder(URLName url) throws MessagingException { Store store = getStore(url); store.connect(); return store.getFolder(url); } private Object getService(Provider provider, URLName url) throws NoSuchProviderException { if (provider == null) { throw new NoSuchProviderException("null"); } if (url == null) { url = new URLName(provider.getProtocol(), null, -1, null, null, null); } Class providerClass = null; ClassLoader loader; if (authenticator != null) { loader = authenticator.getClass().getClassLoader(); } else { loader = getClass().getClassLoader(); } try { providerClass = loader.loadClass(provider.getClassName()); } catch (Exception e) { try { providerClass = Class.forName(provider.getClassName()); } catch (Exception e2) { if (debug) { e2.printStackTrace(); } throw new NoSuchProviderException(provider.getProtocol()); } } try { Class[] parameterTypes = { javax.mail.Session.class, javax.mail.URLName.class }; Constructor constructor = providerClass.getConstructor(parameterTypes); Object[] parameters = { this, url }; return constructor.newInstance(parameters); } catch (Exception e) { if (debug) { e.printStackTrace(); } throw new NoSuchProviderException(provider.getProtocol()); } } /** * Save a PasswordAuthentication for this(store or transport) URLName. * If pw is null the entry corresponding to the URLName * is removed. *

        * This is normally used only by the store or transport implementations to * allow authentication information to be shared among multiple uses of a * session. */ public void setPasswordAuthentication(URLName url, PasswordAuthentication pw) { if (pw == null) { authTable.remove(url); } else { authTable.put(url, pw); } } /** * Return any saved PasswordAuthentication for this(store or transport) * URLName. Normally used only by store or transport implementations. */ public PasswordAuthentication getPasswordAuthentication(URLName url) { return (PasswordAuthentication) authTable.get(url); } /** * Call back to the application to get the needed user name and password. * The application should put up a dialog something like: *

           Connecting to  mail service on host , port .
           
           
           User Name: 
           Password:
           * @param addr InetAddress of the host. may be null.
           * @param protocol protocol scheme(e.g. imap, pop3, etc.)
           * @param prompt any additional String to show as part of the prompt; may be
           * null.
           * @param defaultUserName the default username. may be null.
           */
          public PasswordAuthentication requestPasswordAuthentication(
              InetAddress address, int port, String protocol, String prompt,
              String defaultUserName)
          {
            if (authenticator != null)
              {
                return authenticator.requestPasswordAuthentication(address, port, 
                                                                   protocol, prompt,
                                                                   defaultUserName);
              }
            return null;
          }
          
          /**
           * Returns the Properties object associated with this Session.
           */
          public Properties getProperties()
          {
            return props;
          }
          
          /**
           * Returns the value of the specified property.
           * Returns null if this property does not exist.
           */
          public String getProperty(String name)
          {
            return props.getProperty(name);
          }
        
          /**
           * Set the stream to be used for debugging output for this session.
           * If out is null, System.out will be used. Note
           * that debugging output that occurs before any session is created, as a
           * result of setting the mail.debug property, will always be
           * sent to System.out.
           * @param out the PrintStream to use for debugging output
           * @since JavaMail 1.3
           */
          public void setDebugOut(PrintStream out)
          {
            if (out == null)
              {
                out = System.out;
              }
            // TODO
          }
        
          /**
           * Returns the stream to be used for debugging output. If no stream has
           * been set, System.out is returned.
           * @since JavaMail 1.3
           */
          public PrintStream getDebugOut()
          {
            // TODO
            return System.out;
          }
        
          /**
           * Adds the specified provider to the session.
           * @param provider the new provider
           * @since JavaMail 1.4
           */
          public void addProvider(Provider provider)
          {
            String protocol = provider.getProtocol();
            String className = provider.getClassName();
            providers.add(provider);
            providersByClassName.put(className, provider);
            if (!providersByProtocol.containsKey(protocol))
              {
                providersByProtocol.put(protocol, provider);
              }
          }
        
          /**
           * Sets the default transport protocol for the given address type.
           * @param addressType the type of address, e.g. "rfc822"
           * @param protocol the transport protocol to use
           * @since JavaMail 1.4
           */
          public void setProtocolForAddress(String addressType, String protocol)
          {
            addressMap.put(addressType, protocol);
          }
        
        }
        mail-1.1.2/source/javax/mail/Store.java0000664000076500007650000002020710614714012017304 0ustar  dogdog00000000000000/*
         * Store.java
         * Copyright (C) 2002 The Free Software Foundation
         * 
         * This file is part of GNU JavaMail, a library.
         * 
         * GNU JavaMail is free software; you can redistribute it and/or modify
         * it under the terms of the GNU General Public License as published by
         * the Free Software Foundation; either version 2 of the License, or
         * (at your option) any later version.
         * 
         * GNU JavaMail 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 General Public License for more details.
         * 
         * You should have received a copy of the GNU General Public License
         * along with this library; if not, write to the Free Software
         * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
         *
         * As a special exception, if you link this library with other files to
         * produce an executable, this library does not by itself cause the
         * resulting executable to be covered by the GNU General Public License.
         * This exception does not however invalidate any other reasons why the
         * executable file might be covered by the GNU General Public License.
         */
        
        package javax.mail;
        
        import java.util.ArrayList;
        import javax.mail.event.FolderEvent;
        import javax.mail.event.FolderListener;
        import javax.mail.event.StoreEvent;
        import javax.mail.event.StoreListener;
        
        /**
         * A message store that can be used to save and retrieve messages.
         *
         * @author Chris Burdess
         * @version 1.4
         */
        public abstract class Store 
          extends Service
        {
        
          private ArrayList storeListeners = null;
          private ArrayList folderListeners = null;
        
          /**
           * Constructor.
           * @param session session context for this store
           * @param url URLName to be used for this store
           */
          protected Store(Session session, URLName url)
          {
            super(session, url);
          }
        
          /**
           * Returns a folder that represents the root of the primary namespace
           * presented to the user by this store.
           * @exception IllegalStateException if the store is not connected
           */
          public abstract Folder getDefaultFolder()
            throws MessagingException;
        
          /**
           * Returns the folder with the given name.
           * 

        * The exists method can be used to determine whether the * folder actually exists. *

        * In some Stores, name can be an absolute path if it starts * with the hierarchy delimiter. Otherwise it is interpreted relative * to the root of this namespace. * @param name the folder name * @exception IllegalStateException if the store is not connected */ public abstract Folder getFolder(String name) throws MessagingException; /** * Returns the folder corresponding to the given URLName. * @param url a URLName denoting a folder * @exception IllegalStateException if this store is not connected */ public abstract Folder getFolder(URLName url) throws MessagingException; /** * Returns the personal namespaces for the authenticated user. */ public Folder[] getPersonalNamespaces() throws MessagingException { Folder[] folders = new Folder[1]; folders[0] = getDefaultFolder(); return folders; } /** * Returns the personal namespaces for the specified user. */ public Folder[] getUserNamespaces(String user) throws MessagingException { return new Folder[0]; } /** * Returns the shared namespaces. */ public Folder[] getSharedNamespaces() throws MessagingException { return new Folder[0]; } // -- Event management -- /* * Because the propagation of events of different kinds in the JavaMail * API is so haphazard, I have here sacrificed a small time advantage for * readability and consistency. * * All the various propagation methods now call a method with a name based * on the eventual listener method name prefixed by 'fire', as is the * preferred pattern for usage of the EventListenerList in Swing. * * Note that all events are currently delivered synchronously, where in * Sun's implementation a different thread is used for event delivery. * * TODO Examine the impact of this. */ // -- Store events -- /** * Adds a listener for store events on this store. */ public void addStoreListener(StoreListener l) { if (storeListeners == null) { storeListeners = new ArrayList(); } synchronized (storeListeners) { storeListeners.add(l); } } /** * Removes a store events listener. */ public void removeStoreListener(StoreListener l) { if (storeListeners != null) { synchronized (storeListeners) { storeListeners.remove(l); } } } /** * Notifies all store event listeners. */ protected void notifyStoreListeners(int type, String message) { StoreEvent event = new StoreEvent(this, type, message); fireNotification(event); } /* * Propagates a StoreEvent to all registered listeners. */ void fireNotification(StoreEvent event) { if (storeListeners != null) { StoreListener[] l = null; synchronized (storeListeners) { l = new StoreListener[storeListeners.size()]; storeListeners.toArray(l); } for (int i = 0; i < l.length; i++) { l[i].notification(event); } } } // -- Folder events -- /** * Adds a listener for folder events on any folder object obtained from this * store. */ public void addFolderListener(FolderListener l) { if (folderListeners == null) { folderListeners = new ArrayList(); } synchronized (folderListeners) { folderListeners.add(l); } } /** * Removes a folder event listener. */ public void removeFolderListener(FolderListener l) { if (folderListeners != null) { synchronized (folderListeners) { folderListeners.remove(l); } } } /** * Notifies all folder listeners. */ protected void notifyFolderListeners(int type, Folder folder) { FolderEvent event = new FolderEvent(this, folder, type); switch (type) { case FolderEvent.CREATED: fireFolderCreated(event); break; case FolderEvent.DELETED: fireFolderDeleted(event); break; } } /** * Notifies all folder listeners about the renaming of a folder. */ protected void notifyFolderRenamedListeners(Folder oldFolder, Folder newFolder) { FolderEvent event = new FolderEvent(this, oldFolder, newFolder, FolderEvent.RENAMED); fireFolderRenamed(event); } /* * Propagates a CREATED FolderEvent to all registered listeners. */ void fireFolderCreated(FolderEvent event) { if (folderListeners != null) { FolderListener[] l = null; synchronized (folderListeners) { l = new FolderListener[folderListeners.size()]; folderListeners.toArray(l); } for (int i = 0; i < l.length; i++) { l[i].folderCreated(event); } } } /* * Propagates a DELETED FolderEvent to all registered listeners. */ void fireFolderDeleted(FolderEvent event) { if (folderListeners != null) { FolderListener[] l = null; synchronized (folderListeners) { l = new FolderListener[folderListeners.size()]; folderListeners.toArray(l); } for (int i = 0; i < l.length; i++) { l[i].folderDeleted(event); } } } /* * Propagates a RENAMED FolderEvent to all registered listeners. */ void fireFolderRenamed(FolderEvent event) { if (folderListeners != null) { FolderListener[] l = null; synchronized (folderListeners) { l = new FolderListener[folderListeners.size()]; folderListeners.toArray(l); } for (int i = 0; i < l.length; i++) { l[i].folderRenamed(event); } } } } mail-1.1.2/source/javax/mail/StoreClosedException.java0000664000076500007650000000376110614714012022323 0ustar dogdog00000000000000/* * StoreClosedException.java * Copyright (C) 2002 The Free Software Foundation * * This file is part of GNU JavaMail, a library. * * GNU JavaMail is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * GNU JavaMail 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * As a special exception, if you link this library with other files to * produce an executable, this library does not by itself cause the * resulting executable to be covered by the GNU General Public License. * This exception does not however invalidate any other reasons why the * executable file might be covered by the GNU General Public License. */ package javax.mail; /** * An exception thrown when a method is invoked on a message or folder * whose owner store has been closed for some reason. *

        * The connect method may be invoked on the store object to * reconnect, but any references to existing folders and messages should be * considered invalid. * * @author Chris Burdess * @version 1.4 */ public class StoreClosedException extends MessagingException { /* * The store. */ private Store store; public StoreClosedException(Store store) { this(store, null); } public StoreClosedException(Store store, String message) { super(message); this.store = store; } /** * Returns the store. */ public Store getStore() { return store; } } mail-1.1.2/source/javax/mail/Transport.java0000664000076500007650000002622010614714012020205 0ustar dogdog00000000000000/* * Transport.java * Copyright (C) 2002 The Free Software Foundation * * This file is part of GNU JavaMail, a library. * * GNU JavaMail is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * GNU JavaMail 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * As a special exception, if you link this library with other files to * produce an executable, this library does not by itself cause the * resulting executable to be covered by the GNU General Public License. * This exception does not however invalidate any other reasons why the * executable file might be covered by the GNU General Public License. */ package javax.mail; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.Iterator; import javax.mail.event.TransportEvent; import javax.mail.event.TransportListener; /** * A message transport mechanism that can be used to deliver messages. * * @author Chris Burdess * @version 1.4 */ public abstract class Transport extends Service { /* * Transport listener list. */ private ArrayList transportListeners = null; /** * Constructor. * @param session the session context for this transport * @param url a URLName to be used for this transport */ public Transport(Session session, URLName url) { super(session, url); } /** * Sends the specified message. * The message will be sent to all recipient addresses specified in the * message, using transports appropriate to each address (specified by the * javamail.address.map resource). * @param msg the message to send * @exception SendFailedException if the message could not be sent to * some or any of the recipients */ public static void send(Message msg) throws MessagingException { msg.saveChanges(); doSend(msg, msg.getAllRecipients()); } /** * Sends the message to the specified addresses, ignoring any recipients * specified in the message itself. * @param msg the message to send * @param addresses the addresses to which to send the message * @exception SendFailedException if the message could not be sent to * some or any of the recipients */ public static void send(Message msg, Address[] addresses) throws MessagingException { msg.saveChanges(); doSend(msg, addresses); } /* * Performs the send after saveChanges() has been called. */ private static void doSend(Message msg, Address[] addresses) throws MessagingException { if (addresses == null || addresses.length == 0) { throw new SendFailedException("No recipient addresses"); } HashMap addressesByType = new HashMap(); for (int i = 0; i < addresses.length; i++) { String type = addresses[i].getType(); if (addressesByType.containsKey(type)) { ((ArrayList) addressesByType.get(type)).add(addresses[i]); } else { ArrayList addressList = new ArrayList(); addressList.add(addresses[i]); addressesByType.put(type, addressList); } } int size = addressesByType.size(); if (size == 0) { throw new SendFailedException("No recipient addresses"); } Session session = msg.session; if (session == null) { session = Session.getDefaultInstance(System.getProperties(), null); } MessagingException ex = null; boolean error = false; ArrayList validSent = new ArrayList(); ArrayList validUnsent = new ArrayList(); ArrayList invalid = new ArrayList(); for (Iterator i = addressesByType.values().iterator(); i.hasNext(); ) { ArrayList addressList = (ArrayList) i.next(); Address[] addressArray = new Address[addressList.size()]; addressList.toArray(addressArray); if (addressArray.length < 1) { break; } Transport transport = session.getTransport(addressArray[0]); if (transport == null) { invalid.addAll(Arrays.asList(addressArray)); } else { try { transport.connect(); transport.sendMessage(msg, addressArray); } catch (SendFailedException sfex) { error = true; if (ex == null) { ex = sfex; } else { ex.setNextException(sfex); } Address[] a; a = sfex.getValidSentAddresses(); if (a != null) { validSent.addAll(Arrays.asList(a)); } a = sfex.getValidUnsentAddresses(); if (a != null) { validUnsent.addAll(Arrays.asList(a)); } a = sfex.getInvalidAddresses(); if (a != null) { invalid.addAll(Arrays.asList(a)); } } catch (MessagingException mex) { error = true; if (ex == null) { ex = mex; } else { ex.setNextException(mex); } } finally { transport.close(); } } } if (error || invalid.size() != 0 || validSent.size() != 0) { Address[] validSentAddresses = null; Address[] validUnsentAddresses = null; Address[] invalidAddresses = null; if (validSent.size() > 0) { validSentAddresses = new Address[validSent.size()]; validSent.toArray(validSentAddresses); } if (validUnsent.size() > 0) { validUnsentAddresses = new Address[validUnsent.size()]; validUnsent.toArray(validUnsentAddresses); } if (invalid.size() > 0) { invalidAddresses = new Address[invalid.size()]; invalid.toArray(invalidAddresses); } throw new SendFailedException("Send failed", ex, validSentAddresses, validUnsentAddresses, invalidAddresses); } } /** * Sends the message to the specified list of addresses. * @param msg the message to be sent * @param addresses the addresses to send this message to * @exception SendFailedException if the send failed because of * invalid addresses * @exception MessagingException if the transport is not connected */ public abstract void sendMessage(Message msg, Address[] addresses) throws MessagingException; // -- Event management -- /* * Because the propagation of events of different kinds in the JavaMail * API is so haphazard, I have here sacrificed a small time advantage for * readability and consistency. * * All the various propagation methods now call a method with a name based * on the eventual listener method name prefixed by 'fire', as is the * preferred pattern for usage of the EventListenerList in Swing. * * Note that all events are currently delivered synchronously, where in * Sun's implementation a different thread is used for event delivery. * * TODO Examine the impact of this. */ // -- Transport events -- /** * Adds a listener for transport events. */ public void addTransportListener(TransportListener l) { if (transportListeners == null) { transportListeners = new ArrayList(); } synchronized (transportListeners) { transportListeners.add(l); } } /** * Removes a transport event listener. */ public void removeTransportListener(TransportListener l) { if (transportListeners != null) { synchronized (transportListeners) { transportListeners.remove(l); } } } /** * Notifies all transport listeners. */ protected void notifyTransportListeners(int type, Address[] validSent, Address[] validUnsent, Address[] invalid, Message msg) { TransportEvent event = new TransportEvent(this, type, validSent, validUnsent, invalid, msg); switch (type) { case TransportEvent.MESSAGE_DELIVERED: fireMessageDelivered(event); break; case TransportEvent.MESSAGE_NOT_DELIVERED: fireMessageNotDelivered(event); break; case TransportEvent.MESSAGE_PARTIALLY_DELIVERED: fireMessagePartiallyDelivered(event); break; } } /* * Propagates a MESSAGE_DELIVERED TransportEvent * to all registered listeners. */ void fireMessageDelivered(TransportEvent event) { if (transportListeners != null) { TransportListener[] l = null; synchronized (transportListeners) { l = new TransportListener[transportListeners.size()]; transportListeners.toArray(l); } for (int i = 0; i < l.length; i++) { l[i].messageDelivered(event); } } } /* * Propagates a MESSAGE_NOT_DELIVERED TransportEvent * to all registered listeners. */ void fireMessageNotDelivered(TransportEvent event) { if (transportListeners != null) { TransportListener[] l = null; synchronized (transportListeners) { l = new TransportListener[transportListeners.size()]; transportListeners.toArray(l); } for (int i = 0; i < l.length; i++) { l[i].messageNotDelivered(event); } } } /* * Propagates a MESSAGE_PARTIALLY_DELIVERED TransportEvent * to all registered listeners. */ void fireMessagePartiallyDelivered(TransportEvent event) { if (transportListeners != null) { TransportListener[] l = null; synchronized (transportListeners) { l = new TransportListener[transportListeners.size()]; transportListeners.toArray(l); } for (int i = 0; i < l.length; i++) { l[i].messagePartiallyDelivered(event); } } } } mail-1.1.2/source/javax/mail/UIDFolder.java0000664000076500007650000000745410614714012017776 0ustar dogdog00000000000000/* * UIDFolder.java * Copyright (C) 2002 The Free Software Foundation * * This file is part of GNU JavaMail, a library. * * GNU JavaMail is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * GNU JavaMail 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * As a special exception, if you link this library with other files to * produce an executable, this library does not by itself cause the * resulting executable to be covered by the GNU General Public License. * This exception does not however invalidate any other reasons why the * executable file might be covered by the GNU General Public License. */ package javax.mail; import java.util.NoSuchElementException; /** * A folder that supports permanent references to messages in the form of a * long integer (i.e. an IMAP folder). These UIDs survive the closure and * reopening of the message store and session context. *

        * UIDs are assigned to messages in a folder in a strictly ascending * fashion; that is, if the message number of message x is greater * than the message number of message y, its UID will also be greater * than that of y. * * @see RFC 2060 http://www.ietf.org/rfc/rfc2060.txt * @author Chris Burdess * @version 1.4 */ public interface UIDFolder { /** * A fetch profile item for fetching UIDs. */ static class FetchProfileItem extends FetchProfile.Item { /** * Indicates the the UIDs of the messages should be prefetched. */ public static final FetchProfileItem UID = new FetchProfileItem("UID"); protected FetchProfileItem(String name) { super(name); } } /** * This special value can be used as the end parameter in * getMessages(start, end) to denote the last UID * in this folder. */ long LASTUID = -1L; /** * Returns the UIDValidity value associated with this folder. *

        * A client should compare this value against a UIDValidity value * saved from a previous session to ensure that any cached UIDs are valid. */ long getUIDValidity() throws MessagingException; /** * Returns the message corresponding to the given UID, or * null if no such message exists. * @param uid the UID of the desired message */ Message getMessageByUID(long uid) throws MessagingException; /** * Returns the messages in the given range. * The special value LASTUID can be used as the end parameter * to indicate the last available UID. * @param start the start UID * @param end the end UID */ Message[] getMessagesByUID(long start, long end) throws MessagingException; /** * Returns the messages specified by the given UIDs. * If any UID is invalid, null is returned for that entry. *

        * The returned array will be of the same size as the specified UIDs. * @param uids the UIDs */ Message[] getMessagesByUID(long[] uids) throws MessagingException; /** * Returns the UID for the specified message. * @param message a message in this folder * @exception NoSuchElementException if the given message is not in this * folder */ long getUID(Message message) throws MessagingException; } mail-1.1.2/source/javax/mail/URLName.java0000664000076500007650000002543510614714012017463 0ustar dogdog00000000000000/* * URLName.java * Copyright(C) 2002 The Free Software Foundation * * This file is part of GNU JavaMail, a library. * * GNU JavaMail is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or *(at your option) any later version. * * GNU JavaMail 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * As a special exception, if you link this library with other files to * produce an executable, this library does not by itself cause the * resulting executable to be covered by the GNU General Public License. * This exception does not however invalidate any other reasons why the * executable file might be covered by the GNU General Public License. */ package javax.mail; import java.io.*; import java.net.*; /** * The name of a URL. * This class represents a URL name and also provides the basic * parsing functionality to parse most internet standard URL schemes. *

        * Note that this class differs from java.net.URL in that this class just * represents the name of a URL, it does not model the connection to a URL. * * @author Chris Burdess * @version 1.4 */ public class URLName { /** * The full version of the URL */ protected String fullURL; private String protocol; private String host; private int port = -1; private String file; private String ref; private String username; private String password; private InetAddress hostAddress; private boolean gotHostAddress = false; private int hashCode; /** * Creates a URLName object from the specified protocol, host, * port number, file, username, and password. * Specifying a port number of -1 indicates that the URL should * use the default port for the protocol. */ public URLName(String protocol, String host, int port, String file, String username, String password) { this.protocol = protocol; this.host = host; this.port = port; this.file = file; if (file != null) { int hashIndex = file.indexOf('#'); if (hashIndex != -1) { this.file = file.substring(0, hashIndex); ref = file.substring(hashIndex + 1); } } this.username = username; this.password = password; } /** * Construct a URLName from a java.net.URL object. */ public URLName(URL url) { this(url.toString()); } /** * Construct a URLName from the string. Parses out all the possible * information(protocol, host, port, file, username, password). */ public URLName(String url) { parseString(url); } /** * Returns the port number of this URLName. * Returns -1 if the port is not set. */ public int getPort() { return port; } /** * Returns the protocol of this URLName. * Returns null if this URLName has no protocol. */ public String getProtocol() { return protocol; } /** * Returns the file name of this URLName. * Returns null if this URLName has no file name. */ public String getFile() { return file; } /** * Returns the reference of this URLName. * Returns null if this URLName has no reference. */ public String getRef() { return ref; } /** * Returns the host of this URLName. * Returns null if this URLName has no host. */ public String getHost() { return host; } /** * Returns the user name of this URLName. * Returns null if this URLName has no user name. */ public String getUsername() { return username; } /** * Returns the password of this URLName. * Returns null if this URLName has no password. */ public String getPassword() { return password; } /** * Constructs a URL from the URLName. */ public URL getURL() throws MalformedURLException { return new URL(getProtocol(), getHost(), getPort(), getFile()); } // -- Utility methods -- /** * Constructs a string representation of this URLName. */ public String toString() { if (fullURL == null) { StringBuffer buffer = new StringBuffer(); if (protocol != null) { buffer.append(protocol); buffer.append(":"); } if (username != null || host != null) { buffer.append("//"); if (username != null) { buffer.append(username); if (password != null) { buffer.append(":"); buffer.append(password); } buffer.append("@"); } if (host != null) { buffer.append(host); } if (port != -1) { buffer.append(":"); buffer.append(Integer.toString(port)); } if (file != null) { buffer.append("/"); } } if (file != null) { buffer.append(file); } if (ref != null) { buffer.append("#"); buffer.append(ref); } fullURL = buffer.toString(); } return fullURL; } /** * Compares two URLNames. The result is true if and only if the argument is * not null and is a URLName object that represents the same URLName as this * object. Two URLName objects are equal if they have the same protocol and * reference the same host, the same port number on the host, the same * username and password, and the same file on the host. The fields(host, * username, password, file) are also considered the same if they are both * null. */ public boolean equals(Object other) { if (other == this) { return true; } if (!(other instanceof URLName)) { return false; } URLName url = (URLName) other; if (url.protocol == null || !url.protocol.equals(protocol)) { return false; } InetAddress address = getHostAddress(); InetAddress otherAddress = url.getHostAddress(); if (address != null && otherAddress != null) { if (!address.equals(otherAddress)) { return false; } } else if (host != null) { if (!host.equalsIgnoreCase(url.host)) { return false; } } if (username != url.username && (username==null || !username.equals(url.username))) { return false; } String fileNormalized = (file != null) ? file : ""; String otherFile = (url.file != null) ? url.file : ""; if (!fileNormalized.equals(otherFile)) { return false; } return port == url.port; } /** * Compute the hash code for this URLName. */ public int hashCode() { if (hashCode != 0) { return hashCode; } if (protocol != null) { hashCode += protocol.hashCode(); } InetAddress address = getHostAddress(); if (address != null) { hashCode += address.hashCode(); } else if (host != null) { hashCode += host.toLowerCase().hashCode(); } if (username != null) { hashCode += username.hashCode(); } if (file != null) { hashCode += file.hashCode(); } hashCode += port; return hashCode; } private synchronized InetAddress getHostAddress() { if (gotHostAddress) { return hostAddress; } if (host == null) { return null; } try { hostAddress = InetAddress.getByName(host); } catch (UnknownHostException e) { hostAddress = null; } gotHostAddress = true; return hostAddress; } /** * Method which does all of the work of parsing the string. */ protected void parseString(String url) { protocol = file = ref = host = username = password = null; port = -1; int len = url.length(); int colonIndex = url.indexOf(':'); if (colonIndex != -1) { protocol = url.substring(0, colonIndex); } if (url.regionMatches(colonIndex + 1, "//", 0, 2)) { String hostPart; int slashIndex = url.indexOf('/', colonIndex + 3); if (slashIndex != -1) { hostPart = url.substring(colonIndex + 3, slashIndex); if ((slashIndex + 1) < len) { file = url.substring(slashIndex + 1); } else { file = ""; } } else { hostPart = url.substring(colonIndex + 3); } // user:password@host? int atIndex = hostPart.lastIndexOf('@'); if (atIndex != -1) { String userPart = hostPart.substring(0, atIndex); hostPart = hostPart.substring(atIndex + 1); colonIndex = userPart.indexOf(':'); if (colonIndex != -1) { username = userPart.substring(0, colonIndex); password = userPart.substring(colonIndex + 1); } else { username = userPart; } } // host:port? if (hostPart.length() > 0 && hostPart.charAt(0) == '[') { colonIndex = hostPart.indexOf(':', hostPart.indexOf(']')); } else { colonIndex = hostPart.indexOf(':'); } if (colonIndex != -1) { String portPart = hostPart.substring(colonIndex + 1); if (portPart.length() > 0) { try { port = Integer.parseInt(portPart); } catch (NumberFormatException e) { port = -1; } } host = hostPart.substring(0, colonIndex); } else { host = hostPart; } } else if ((colonIndex + 1) < len) { file = url.substring(colonIndex + 1); } int hashIndex = (file != null) ? file.indexOf('#') : -1; if (hashIndex != -1) { ref = file.substring(hashIndex + 1); file = file.substring(0, hashIndex); } } } mail-1.1.2/source/javax/mail/util/0000775000076500007650000000000010614714024016324 5ustar dogdog00000000000000mail-1.1.2/source/javax/mail/util/ByteArrayDataSource.java0000664000076500007650000001101410614714012023036 0ustar dogdog00000000000000/* * ByteArrayDataSource.java * Copyright (C) 2005 The Free Software Foundation * * This file is part of GNU JavaMail, a library. * * GNU JavaMail is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * GNU JavaMail 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * As a special exception, if you link this library with other files to * produce an executable, this library does not by itself cause the * resulting executable to be covered by the GNU General Public License. * This exception does not however invalidate any other reasons why the * executable file might be covered by the GNU General Public License. */ package javax.mail.util; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.InputStream; import java.io.IOException; import java.io.OutputStream; import java.io.UnsupportedEncodingException; import javax.activation.DataSource; import javax.mail.internet.ContentType; import javax.mail.internet.MimeUtility; import javax.mail.internet.ParseException; /** * Data source backed by a byte array. * * @author Chris Burdess * @version 1.4 * @since JavaMail 1.4 */ public class ByteArrayDataSource implements DataSource { private byte[] data; private String type; private String name = ""; /** * Constructor with a byte array. * @param data the byte array * @param type the MIME type */ public ByteArrayDataSource(byte[] data, String type) { this.data = data; this.type = type; } /** * Constructor with an input stream. * @param is the input stream (will be read to end but not closed) * @param type the MIME type */ public ByteArrayDataSource(InputStream is, String type) throws IOException { ByteArrayOutputStream sink = new ByteArrayOutputStream(); byte[] buf = new byte[4096]; for (int len = is.read(buf); len != -1; len = is.read(buf)) sink.write(buf, 0, len); data = sink.toByteArray(); this.type = type; } /** * Constructor with a String. * The MIME type should include a charset parameter specifying the charset * to use to encode the string; otherwise, the platform default is used. * @param data the string * @param type the MIME type */ public ByteArrayDataSource(String data, String type) throws IOException { try { ContentType ct = new ContentType(type); String charset = ct.getParameter("charset"); String jcharset = (charset == null) ? MimeUtility.getDefaultJavaCharset() : MimeUtility.javaCharset(charset); if (jcharset == null) throw new UnsupportedEncodingException(charset); this.data = data.getBytes(jcharset); this.type = type; } catch (ParseException e) { IOException e2 = new IOException("can't parse MIME type"); e2.initCause(e); throw e2; } } /** * Returns an input stream for the data. */ public InputStream getInputStream() throws IOException { return new ByteArrayInputStream(data); } /** * Returns an output stream. * The output stream throws an exception if written to. */ public OutputStream getOutputStream() throws IOException { return new ErrorOutputStream(); } /** * Returns the MIME type of the data. */ public String getContentType() { return type; } /** * Returns the name of the data. */ public String getName() { return name; } /** * Sets the name of the data. * @param name the new name */ public void setName(String name) { this.name = name; } static class ErrorOutputStream extends OutputStream { public void write(int c) throws IOException { throw new IOException("writing to this stream is not allowed"); } public void write(byte[] b, int off, int len) throws IOException { throw new IOException("writing to this stream is not allowed"); } } } mail-1.1.2/source/javax/mail/util/SharedByteArrayInputStream.java0000664000076500007650000000527710614714012024424 0ustar dogdog00000000000000/* * SharedByteArrayInputStream.java * Copyright (C) 2005 The Free Software Foundation * * This file is part of GNU JavaMail, a library. * * GNU JavaMail is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * GNU JavaMail 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * As a special exception, if you link this library with other files to * produce an executable, this library does not by itself cause the * resulting executable to be covered by the GNU General Public License. * This exception does not however invalidate any other reasons why the * executable file might be covered by the GNU General Public License. */ package javax.mail.util; import java.io.ByteArrayInputStream; import java.io.InputStream; import java.io.IOException; import javax.mail.internet.SharedInputStream; /** * A byte array input stream that is shareable between multiple readers. * * @author Chris Burdess * @version 1.4 * @since JavaMail 1.4 */ public class SharedByteArrayInputStream extends ByteArrayInputStream implements SharedInputStream { private int off; /** * Constructor with a byte array. * @param buf the byte array */ public SharedByteArrayInputStream(byte[] buf) { super(buf); off = 0; } /** * Constructor with a byte array, offset and length. * @param buf the byte array * @param offset the offset at which to start * @param len the number of bytes to consider */ public SharedByteArrayInputStream(byte[] buf, int off, int len) { super(buf, off, len); this.off = off; } /** * Returns the current position in the stream. */ public long getPosition() { return (long) (pos - off); } /** * Returns a new shared input stream, representing the subset of this * stream's data from start to end. * @param start the starting offset within the stream * @param end the end offset within the stream (exclusive) */ public InputStream newStream(long start, long end) { int len = (int) (end - start); return new SharedByteArrayInputStream(buf, off + (int) start, len); } } mail-1.1.2/source/javax/mail/util/SharedFileInputStream.java0000664000076500007650000001256610614714012023400 0ustar dogdog00000000000000/* * SharedFileInputStream.java * Copyright (C) 2005 The Free Software Foundation * * This file is part of GNU JavaMail, a library. * * GNU JavaMail is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * GNU JavaMail 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * As a special exception, if you link this library with other files to * produce an executable, this library does not by itself cause the * resulting executable to be covered by the GNU General Public License. * This exception does not however invalidate any other reasons why the * executable file might be covered by the GNU General Public License. */ package javax.mail.util; import java.io.BufferedInputStream; import java.io.File; import java.io.InputStream; import java.io.IOException; import java.io.RandomAccessFile; import javax.mail.internet.SharedInputStream; /** * A buffered input stream that reads data from an underlying file and is * shareable between multiple readers. * * @author Chris Burdess * @version 1.4 * @since JavaMail 1.4 */ public class SharedFileInputStream extends BufferedInputStream implements SharedInputStream { /** * The underlying file. */ protected RandomAccessFile in; /** * The normal size of the read buffer. */ protected int bufsize; /** * The file offset of the first byte in the read buffer. */ protected long bufpos; /** * The file offset of the start of data. */ protected long start = 0; /** * The number of bytes in this stream. */ protected long datalen; /** * The open streams count; */ private final int[] openCount; /** * Constructor with file. * @param file the file */ public SharedFileInputStream(File file) throws IOException { super(null); bufsize = buf.length; in = new RandomAccessFile(file, "r"); datalen = in.length(); openCount = new int[]{1}; } /** * Constructor with path. * @param file the file path */ public SharedFileInputStream(String file) throws IOException { super(null); bufsize = buf.length; in = new RandomAccessFile(file, "r"); datalen = in.length(); openCount = new int[]{1}; } /** * Constructor with file and buffer size. * @param file the file * @param size the buffer size */ public SharedFileInputStream(File file, int size) throws IOException { super(null, size); bufsize = size; in = new RandomAccessFile(file, "r"); datalen = in.length(); openCount = new int[]{1}; } /** * Constructor with path and buffer size. * @param file the file path * @param size the buffer size */ public SharedFileInputStream(String file, int size) throws IOException { super(null, size); bufsize = size; in = new RandomAccessFile(file, "r"); datalen = in.length(); openCount = new int[]{1}; } private SharedFileInputStream(SharedFileInputStream parent, long start, long datalen) { super(null, parent.bufsize); this.openCount = parent.openCount; this.in = parent.in; this.bufsize = parent.bufsize; this.start = start; this.datalen = datalen; bufpos = start; } public int read() throws IOException { in.seek(bufpos); int ret = in.read(); if (ret != -1) bufpos++; return ret; } public int read(byte[] b, int off, int len) throws IOException { in.seek(bufpos); int ret = in.read(b, off, len); if (ret > 0) bufpos += ret; return ret; } public long skip(long n) throws IOException { long l1 = in.length(); long l2 = start + datalen; long l3 = Math.min(l1, l2); long ret = (bufpos + n > l3) ? l3 - (bufpos + n) : n; bufpos += ret; return ret; } public int available() throws IOException { long l1 = in.length(); long l2 = start + datalen; long l3 = Math.min(l1, l2); return (int) (l3 - bufpos); } public void mark(int limit) { super.mark(limit); } public void reset() throws IOException { super.reset(); } public boolean markSupported() { return super.markSupported(); } public void close() throws IOException { if (in != null) { synchronized(openCount) { if (openCount[0] > 0) { --openCount[0]; if (openCount[0] == 0) { in.close(); } } } buf = null; in = null; } } public long getPosition() { return bufpos - start; } public InputStream newStream(long start, long end) { synchronized(openCount) { ++openCount[0]; } return new SharedFileInputStream(this, start, end - start); } /** * Forces the underlying file to close. */ protected void finalize() throws Throwable { close(); } } mail-1.1.2/test/0000775000076500007650000000000010614714024012773 5ustar dogdog00000000000000mail-1.1.2/test/Makefile0000664000076500007650000000415710614714012014437 0ustar dogdog00000000000000# Test makefile. empty:= space:=$(empty) $(empty) # Set by configure. PROJECTROOT = . JAVA = jamvm JAVAC = javac JAVAC_OPTS = JAR = jar CLASSPATH = /gnu/share/classpath/glibj.zip prefix = /gnu/share/java extra = /gnu/share/java OPTIONS = -Dmail.pop3.apop=false -Dmail.debug=true -Djavax.net.debug=true \ -Dmail.smtp.host=bluezoo.org -Dmail.smtp.auth=required \ -Djava.util.logging.config.file=logging.properties all: test test_sourcedir=$(PROJECTROOT)/src test_sourcefiles=$(shell find $(test_sourcedir) -name "*.java" -print) test_classpath=$(prefix)/gnumail.jar $(prefix)/gnumail-providers.jar \ $(prefix)/activation.jar $(prefix)/inetlib.jar \ $(extra)/junit.jar #$(prefix)/jsse.jar $(prefix)/jessie.jar \ #$(prefix)/javax-security.jar $(prefix)/gnu-crypto.jar \ #$(prefix)/javax-crypto.jar test_classesdest=$(PROJECTROOT)/classes test_otherfiles= test_debugclasses=$(test_sourcefiles:.java=.class) test_classfiles=$(test_debugclasses:$(test_sourcedir)%=$(test_classesdest)%) test: test-init $(test_classfiles) test-compilation $(test_otherfiles) $(test_manifest) $(JAVA) -cp $(call PATHMK,$(CLASSPATH) $(call PATHMK,$(test_classesdest) $(call PATHMK,$(test_classpath)))) $(OPTIONS) AllTests .PHONY: test-init test-compilation test-init: echo > filelist test-compilation: $(test_classesdest) $(if $(shell cat filelist),$(JAVAC) $(JAVAC_OPTS) -d $(test_classesdest) -classpath $(call PATHMK,$(test_classesdest) $(call PATHMK,$(test_classpath))) @filelist) $(test_classesdest): mkdir $@ $(test_classesdest)/%.class: $(test_sourcedir)/%.java @echo $? >> filelist echo_test: @echo sourcedir = $(test_sourcedir) @echo sourcefiles = $(test_sourcefiles) @echo classpath = $(call PATHMK,$(test_classpath)) @echo classesdest = $(test_classesdest) @echo classfiles = $(test_classfiles) ifeq (${OS},Windows_NT) PATHMK = $(subst $(space),;,$(1)) else PATHMK = $(subst $(space),:,$(1)) endif # Ensure everything generated is cleaned. # We could probably do with automake for this. clean: -rm -rf $(PROJECTROOT)/classes filelist distclean: clean -rm -rf Makefile Makefile.in config.* mrproper: distclean -rm -rf configure # End Makefile. mail-1.1.2/test/README0000664000076500007650000000105010614714012013644 0ustar dogdog00000000000000This is a test suite for GNU JavaMail and its providers, based on junit (http://junit.sourceforge.net/). To use this test suite, you must create the following files in the current directory: transport-urls : transports to connect to store-urls : stores to connect to folder-urls : existing folders (probed read-only) non-folder-urls : nonexistent folders that will be created and deleted test.message : a test message to send and store You wil probably also want to edit the Makefile to set your java compiler, etc. The just run make. mail-1.1.2/test/src/0000775000076500007650000000000010614714024013562 5ustar dogdog00000000000000mail-1.1.2/test/src/AllTests.java0000664000076500007650000000141210614714012016153 0ustar dogdog00000000000000import junit.framework.Test; import junit.framework.TestSuite; import junit.framework.TestResult; //import junit.swingui.TestRunner; import junit.textui.TestRunner; public class AllTests extends TestSuite { public AllTests() throws Exception { addTest(SessionTest.suite()); addTest(TransportTest.suite()); addTest(StoreTest.suite()); addTest(FolderTest.suite()); addTest(NonFolderTest.suite()); addTest(MimeMessageTest.suite()); } public static void main(String[] args) { try { //TestResult result = new TestResult(); //new AllTests().run(result); TestRunner.run(new AllTests()); } catch (Exception e) { e.printStackTrace(System.err); System.exit(1); } } } mail-1.1.2/test/src/FolderTest.java0000664000076500007650000000655110614714012016504 0ustar dogdog00000000000000import javax.mail.Folder; import javax.mail.MessagingException; import javax.mail.Session; import javax.mail.Store; import javax.mail.URLName; import javax.mail.event.ConnectionEvent; import javax.mail.event.ConnectionListener; import javax.mail.event.FolderEvent; import javax.mail.event.FolderListener; import junit.framework.Test; import junit.framework.TestCase; import junit.framework.TestSuite; import junit.textui.TestRunner; import java.io.BufferedReader; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; public class FolderTest extends TestCase implements ConnectionListener { private Session session; private URLName url; private Store store; private Folder folder; private ConnectionEvent connectionEvent; private FolderEvent folderEvent; public FolderTest(String name, String url) { super(name); this.url = new URLName(url); } protected void setUp() throws Exception { session = Session.getInstance(System.getProperties()); //session.setDebug(true); store = session.getStore(url); assertNotNull(store); } void getFolder() throws Exception { String file = url.getFile(); if (file != null && file.length() > 0) { folder = store.getFolder(url); } else { folder = store.getDefaultFolder(); } assertNotNull(folder); } protected void tearDown() throws Exception { if (store!=null) { store.close(); } url = null; folder = null; store = null; session = null; } public void testOpen() throws Exception { store.connect(); getFolder(); folder.addConnectionListener(this); folder.open(Folder.READ_ONLY); assertNotNull(connectionEvent); assertEquals(connectionEvent.getType(), ConnectionEvent.OPENED); } public void testClose() throws Exception { store.connect(); getFolder(); folder.addConnectionListener(this); folder.open(Folder.READ_ONLY); folder.close(false); assertNotNull(connectionEvent); assertEquals(connectionEvent.getType(), ConnectionEvent.CLOSED); } public void closed(ConnectionEvent e) { connectionEvent = e; } public void opened(ConnectionEvent e) { connectionEvent = e; } public void disconnected(ConnectionEvent e) { connectionEvent = e; } public void folderCreated(FolderEvent e) { folderEvent = e; } public void folderDeleted(FolderEvent e) { folderEvent = e; } public void folderRenamed(FolderEvent e) { folderEvent = e; } static Test suite(String url) { TestSuite suite = new TestSuite(); suite.addTest(new FolderTest("testOpen", url)); suite.addTest(new FolderTest("testClose", url)); return suite; } public static Test suite() { TestSuite suite = new TestSuite(); try { BufferedReader r = new BufferedReader(new FileReader("folder-urls")); for (String line = r.readLine(); line!=null; line = r.readLine()) { if (!line.startsWith("#")) { suite.addTest(suite(line)); } } r.close(); } catch (FileNotFoundException e) { System.err.println("No folder URLs"); } catch (IOException e) { e.printStackTrace(System.err); } return suite; } } mail-1.1.2/test/src/MimeMessageTest.java0000664000076500007650000001225710614714012017465 0ustar dogdog00000000000000import javax.mail.Flags; import javax.mail.Folder; import javax.mail.Message; import javax.mail.MessagingException; import javax.mail.Session; import javax.mail.Store; import javax.mail.URLName; import javax.mail.internet.MimeBodyPart; import javax.mail.internet.MimeMessage; import javax.mail.internet.MimeMultipart; import junit.framework.Test; import junit.framework.TestCase; import junit.framework.TestSuite; import junit.textui.TestRunner; import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; import java.util.logging.Level; import java.util.logging.Logger; public class MimeMessageTest extends TestCase { static Logger logger = Logger.getLogger("test"); private Session session; private URLName url; private Store store; private Folder folder; private int msgnum; private MimeMessage message; public MimeMessageTest(String name, String url, int msgnum) { super(name); this.url = new URLName(url); this.msgnum = msgnum; } protected void setUp() { session = Session.getInstance(System.getProperties()); try { store = session.getStore(url); assertNotNull(store); store.connect(); getFolder(); assertNotNull(folder); folder.open(Folder.READ_ONLY); message = (MimeMessage)folder.getMessage(msgnum); } catch (MessagingException e) { logger.log(Level.SEVERE, e.getMessage(), e); fail(e.getMessage()); } } void getFolder() throws MessagingException { String file = url.getFile(); if (file != null && file.length() > 0) { folder = store.getFolder(url); } else { folder = store.getDefaultFolder(); } assertNotNull(folder); } protected void tearDown() { if (folder!=null) { try { folder.close(false); } catch (MessagingException e) { logger.log(Level.SEVERE, e.getMessage(), e); } } if (store!=null) { try { store.close(); } catch (MessagingException e) { logger.log(Level.SEVERE, e.getMessage(), e); } } url = null; message = null; folder = null; store = null; session = null; } public void testReadMessage() { try { System.out.println(url.toString()); assertNotNull(message.getFrom()); assertNotNull(message.getAllRecipients()); testContent(message.getContent()); } catch (MessagingException e) { logger.log(Level.SEVERE, e.getMessage(), e); fail(e.getMessage()); } catch (IOException e) { logger.log(Level.SEVERE, e.getMessage(), e); fail(e.getMessage()); } } void testContent(Object content) throws MessagingException, IOException { assertNotNull(content); if (content instanceof String) { System.out.println((String)content); } else if (content instanceof MimeMultipart) { MimeMultipart mp = (MimeMultipart)content; int count = mp.getCount(); assertTrue(count>0); for (int i=0; i0); for (int i=0; i0); try { Provider p = session.getProvider("imap"); assertNotNull(p); assertEquals(p.getType(), Provider.Type.STORE); assertEquals(p.getProtocol(), "imap"); } catch (NoSuchProviderException e) { fail(e.getMessage()); } } public void testGetStore() { try { Store s = session.getStore("imap"); assertNotNull(s); } catch (NoSuchProviderException e) { fail(e.getMessage()); } } public void testGetTransport() { try { Transport t = session.getTransport("smtp"); assertNotNull(t); } catch (NoSuchProviderException e) { fail(e.getMessage()); } } public static Test suite() { return new TestSuite(SessionTest.class); } } mail-1.1.2/test/src/StoreTest.java0000664000076500007650000000606510614714012016365 0ustar dogdog00000000000000import javax.mail.Folder; import javax.mail.MessagingException; import javax.mail.Session; import javax.mail.Store; import javax.mail.URLName; import javax.mail.event.ConnectionEvent; import javax.mail.event.ConnectionListener; import junit.framework.Test; import junit.framework.TestCase; import junit.framework.TestSuite; import junit.textui.TestRunner; import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; public class StoreTest extends TestCase implements ConnectionListener { private Session session; private URLName url; private Store store; private ConnectionEvent event; public StoreTest(String name, String url) { super(name); this.url = new URLName(url); } protected void setUp() { session = Session.getInstance(System.getProperties()); //session.setDebug(true); try { store = session.getStore(url); assertNotNull(store); } catch (MessagingException e) { fail(e.getMessage()); } } protected void tearDown() { if (store!=null) { try { store.close(); } catch (MessagingException e) { } } url = null; store = null; session = null; } public void testConnect() { try { store.addConnectionListener(this); store.connect(); assertNotNull(event); assertEquals(event.getType(), ConnectionEvent.OPENED); } catch (MessagingException e) { fail(e.getMessage()); } } public void testClose() { try { store.addConnectionListener(this); store.connect(); store.close(); assertNotNull(event); assertEquals(event.getType(), ConnectionEvent.CLOSED); } catch (MessagingException e) { fail(e.getMessage()); } } public void testGetDefaultFolder() { try { Folder f = store.getDefaultFolder(); assertNotNull(f); } catch (MessagingException e) { fail(e.getMessage()); } } public void testGetFolder() { try { Folder f = store.getFolder(url.getFile()); assertNotNull(f); } catch (MessagingException e) { fail(e.getMessage()); } } public void closed(ConnectionEvent e) { event = e; } public void opened(ConnectionEvent e) { event = e; } public void disconnected(ConnectionEvent e) { event = e; } static Test suite(String url) { TestSuite suite = new TestSuite(); suite.addTest(new StoreTest("testConnect", url)); suite.addTest(new StoreTest("testClose", url)); suite.addTest(new StoreTest("testGetDefaultFolder", url)); suite.addTest(new StoreTest("testGetFolder", url)); return suite; } public static Test suite() { TestSuite suite = new TestSuite(); try { BufferedReader r = new BufferedReader(new FileReader("store-urls")); for (String line = r.readLine(); line!=null; line = r.readLine()) suite.addTest(suite(line)); r.close(); } catch (IOException e) { System.err.println("No store URLs"); } return suite; } } mail-1.1.2/test/src/TransportTest.java0000664000076500007650000001071510614714012017262 0ustar dogdog00000000000000 import javax.mail.Address; import javax.mail.MessagingException; import javax.mail.Session; import javax.mail.Transport; import javax.mail.URLName; import javax.mail.event.ConnectionEvent; import javax.mail.event.ConnectionListener; import javax.mail.event.TransportEvent; import javax.mail.event.TransportListener; import javax.mail.internet.MimeMessage; import junit.framework.Test; import junit.framework.TestCase; import junit.framework.TestSuite; import junit.textui.TestRunner; import java.io.BufferedReader; import java.io.FileInputStream; import java.io.FileReader; import java.io.IOException; import java.util.logging.Level; import java.util.logging.Logger; public class TransportTest extends TestCase implements ConnectionListener, TransportListener { static Logger logger = Logger.getLogger("test"); private Session session; private URLName url; private Transport transport; private ConnectionEvent connectionEvent; private TransportEvent transportEvent; public TransportTest(String name, String url) { super(name); this.url = new URLName(url); } protected void setUp() { session = Session.getInstance(System.getProperties()); try { transport = session.getTransport(url); assertNotNull(transport); } catch (MessagingException e) { logger.log(Level.SEVERE, e.getMessage(), e); fail(e.getMessage()); } } protected void tearDown() { url = null; transport = null; session = null; } public void testConnect() { try { transport.addConnectionListener(this); transport.connect(); assertNotNull(connectionEvent); assertEquals(connectionEvent.getType(), ConnectionEvent.OPENED); } catch (MessagingException e) { System.out.println(url.toString()); e.printStackTrace(System.out); logger.log(Level.SEVERE, e.getMessage(), e); fail(e.getMessage()); } } public void testClose() { try { transport.addConnectionListener(this); transport.connect(); transport.close(); assertNotNull(connectionEvent); assertEquals(connectionEvent.getType(), ConnectionEvent.CLOSED); } catch (MessagingException e) { logger.log(Level.SEVERE, e.getMessage(), e); fail(e.getMessage()); } } public void testSendMessage() { try { FileInputStream in = new FileInputStream("test.message"); MimeMessage message = new MimeMessage(session, in); in.close(); Address[] addresses = message.getAllRecipients(); transport.connect(); transport.addTransportListener(this); transport.sendMessage(message, addresses); assertNotNull(transportEvent); } catch (MessagingException e) { logger.log(Level.SEVERE, e.getMessage(), e); fail(e.getMessage()); } catch (IOException e) { logger.log(Level.SEVERE, e.getMessage(), e); fail(e.getMessage()); } } public void closed(ConnectionEvent e) { connectionEvent = e; } public void opened(ConnectionEvent e) { connectionEvent = e; } public void disconnected(ConnectionEvent e) { connectionEvent = e; } public void messageDelivered(TransportEvent e) { transportEvent = e; } public void messageNotDelivered(TransportEvent e) { transportEvent = e; } public void messagePartiallyDelivered(TransportEvent e) { transportEvent = e; } static Test suite(String url) { TestSuite suite = new TestSuite(); suite.addTest(new TransportTest("testConnect", url)); suite.addTest(new TransportTest("testClose", url)); suite.addTest(new TransportTest("testSendMessage", url)); return suite; } public static Test suite() { TestSuite suite = new TestSuite(); try { BufferedReader r = new BufferedReader(new FileReader("transport-urls")); for (String line = r.readLine(); line!=null; line = r.readLine()) suite.addTest(suite(line)); r.close(); } catch (IOException e) { logger.log(Level.SEVERE, e.getMessage(), e); System.err.println("No transport URLs"); } return suite; } } mail-1.1.2/TODO0000664000076500007650000000251010614714012012477 0ustar dogdog00000000000000QuotaAwareStore support from IMAP provider =================================================================== 12. Add PreencodedMimeBodyPart class (6301386) ---------------------------------------------- In some cases an application will have data that has already been encoded using (for example) base64 encoding. There should be an easy way to attach such data to a message without the need to decode it and reencode it. This class provides such support. /** * A MimeBodyPart that handles data that has already been encoded. * This class is useful when constructing a message and attaching * data that has already been encoded (for example, using base64 * encoding). The data may have been encoded by the application, * or may have been stored in a file or database in encoded form. * The encoding is supplied when this object is created. The data * is attached to this object in the usual fashion, by using the * setText, setContent, or * setDataHandler methods. * * @since JavaMail 1.4 */ public class PreencodedMimeBodyPart { /** * Create a PreencodedMimeBodyPart that assumes the data is * encoded using the specified encoding. The encoding must * be a MIME supported Content-Transfer-Encoding. */ public PreencodedMimeBodyPart(String encoding) }