+2000-09-19 Gerd Moellmann <gerd@gnu.org>
+
+ * splash.xpm: New file.
+
2000-09-11 Dave Love <fx@gnu.org>
* gnus.xbm, gnus.xpm, gnus-pointer.xpm, gnus-pointer.xbm: New
--- /dev/null
+/* XPM */
+static char * emacs1_xpm[] = {
+"271 273 18 1",
+" c None",
+". c #BF9900",
+"+ c #FFCC00",
+"@ c #000000",
+"# c #AA8800",
+"$ c #7F6600",
+"% c #3F3300",
+"& c #554400",
+"* c #1D1700",
+"= c #725B00",
+"- c #C79F00",
+"; c #957700",
+"> c #2A2200",
+", c #392D00",
+"' c #E3B500",
+") c #151100",
+"! c #6A5500",
+"~ c #8E7100",
+" ",
+" ",
+" ... ",
+" ..........++++++ ",
+" .............+++++++ ",
+" ................++++++ ",
+" ..................++++++ ",
+" ....................+++++++ ",
+" ......................+++++++ ",
+" ........................+++++++ ",
+" .........................++++++ ",
+" ..... ...........................++++++ ",
+" ........... ............................+++++++ ",
+" ............... ..............................+++++++ ",
+" .................. ........... ...............................+++++++ ",
+" .................... ............... ...............................+++++++ ",
+" ...................... .................... ................................++++++++ ",
+" ....................... ........................ .................................+++++++ ",
+" ......................... ............................ ..................................++++++++ ",
+" ........................... .............................. ...................................+++++++ ",
+" ............................. ................................ ....................................+++++++ ",
+" ............................... .................................. .......++++++.......................+++++++ ",
+" ................................ ................................... ...... +++++++ ....................+++++++ ",
+" .................................. ..................................... ..... ++++++ .................+++++++ ",
+" .................................... ...................................... ...... +++++ ................+++++++ ",
+" ............................................................................. ...... ++++++ ...............+++++++ ",
+" .............................................................................. ...... ++++++ ...............+++++++ ",
+" ................................................................................ ...... +++++ ..............+++++++ ",
+" .. .................................................................................. ....... ++++++ ..............+++++++ ",
+" .... .................................................................................... ....... ++++++ .............+++++++ ",
+" ....... ..............++++.................................................................... ...... +++++++ ............++++++++ ",
+" ......... .............++++++++................................................................... ....... +++++++ ...........++++++++ ",
+" ........... .............++++++++++++.................................................................. ....... ++++++ ...........++++++++ ",
+" .......... .............++++++++++++++.................................................................. ...... +++++++ ...........++++++++ ",
+" ........... ............++++++++++++++++++.......................++++++++++................................ ..... ++++++ ..........++++++++ ",
+" ............ ............++++++++++++++++++++....................+++++++++++++++.............................. .... +++++ ..........+++++++ ",
+" ............ ..............+++++++++++++++++++++.................+++++++++++++++++++++.......................... .. .. +++ ..........+++++++ ",
+" ............. ..............+++++++++++++++++++++++...............+++++++++++++++++++++++.......................... . .. .. ++ ..........+++++++ ",
+" ............. ...............++++++++++ +++++++++++++.............+++++++++++++++++++++++++.......................... .. ... ++ ..........+++++++ ",
+" ............. ................+++++++++ +++++++++++............++++++++++++++++++++++++++.......................... ... .... ..........++++++++ ",
+" ................ ..................+++++++ +++++++++++..........++++++++++++++++++++++++++++.......................... ... ..... ..........++++++++ ",
+" .....................................++++++ +++++++++++.........+++++++++++++++++++++++++++++.......................... .... .... ..........++++++++ ",
+" ....................................++++++ +++++++++........+++++++++++++++++++++++++++++++......................... ..... ..... ..........++++++++ ",
+" .................................+++++++ +++++++++.......+++++++ ++++++++++++++.......................... ..... .... ..........+++++++ ",
+" ................................+++++++ ++++++++......+++++ ++++++++++++.......................... ...... ..... ..........+++++++ ",
+" ...............................++++++++ ++++++++....+++++ ++++++++++.......................... ...... ..... + ..........+++++++ ",
+" +..............................++++++++ +.++++...+++++ ++++++++++........................... ....... .... +++ ..........+++++++ ",
+" +.............................++++++++ ...+++..++++++ ++++++++++........................... ...... + ..... ++++ .........++++++++ ",
+" +++...........................+++++++++ ....++++++++++ ++++++++++............................ ........++ ..... +++ .........++++++++ ",
+" +++..........................+++++++++ ....+++++++++ ++++++++++............................... ...........++ ...... ++++ .........++++++++ ",
+" +++.........................+++++++++ .... +++++++++ ++++++++++................................................++ ... ...... +++++ .........+++++++ ",
+" ++++........................+++++++++ .... +++++++ +++++++++...............................................++ .... ....... +++++ .........+++++++ ",
+" ++++.......................++++++++ ..... +++++++ +++++++++..............................................++ ..... ....... +++++ .........+++++++ ",
+" ++++++....................+++++++++ ..... + +++++ +++++++++............................................++ ...... ......... +++++ .........+++++++ ",
+" ++++++...................+++++++++ ......++ ++++ +++++++++...........................................++ ....... .......... ++++ .........+++++++ ",
+" +++++++.................+++++++++ ..... +++ +++ +++++++++.........................................+++ ......... .............. +++++ ........++++++++ ",
+" +++++++...............+++++++++ ..... ++++ ++ +++++++++........................................++ ............................... ++++ .........+++++++ ",
+" ++++++++............++++++++++ ..... ++++ + +++++++++.......................................++ ...............................+++++ .........+++++++ ",
+" ++++++++++.......+++++++++++ ......+++++ +++++++++.....................................+++ ..............................+++++ .........+++++++ ",
+" ++++++++++++++++++++++++++ .....+++++ +++++++++....................................++ ...............................+++++ ........++++++++ ",
+" +++++++++++++++++++++++++ .....+++++ +++++++++..................................+++ ..............................+++++ ........+++++++ ",
+" +++++++++++++++++++++++ ..... +++++ +++++++++...............................++++ ..............................++++++ ........+++++++ ",
+" +++++++++++++++++++++ .... +++++ +++++++++.............................+++++ .............................+++++++ ........+++++++ ",
+" +++++++++++++++++++ .... ++++++ +++++++++...........................++++++ ..............................++++++ .......++++++++ ",
+" +++++++++++++++++ .... ++++++ +++++++++.........................++++++ .............................+++++++ ........+++++++ ",
+" +++++++++++++++ ..... +++++ ... +++++++++.......................+++++++ .............................+++++++ ........+++++++ ",
+" +++++++++++ .... +++++ ...... +++++++++....................+++++++++ ............................++++++++ ....... +++++++ ",
+" +++ .... +++++ ....... +++++++++..................+++++++++ ..........................+++++++++ .......+++++++ ",
+" .....++++++ .......... +++++++++++.............+++++++++++ .........................++++++++++ .......+++++++ ",
+" .... +++++ ............ ++++++++++++++....+++++++++++++++ .......................++++++++++ ....... +++++++ ",
+" .... +++++ ............. ++++++++++++++++++++++++++++++ .....................++++++++++++ ....... ++++++ ",
+" .....+++++ ............... ++++++++++++++++++++++++++++ ...................++++++++++++ ....... ++++++ ",
+" .... +++++ . ................ ++++++++++++++++++++++++++ +................+++++++++++++ .......+++++++ ",
+" .... +++++ .... ................. ++++++++++++++++++++++++ ++..............+++++++++++++ ...... +++++++ ",
+" .....+++++ ..... ................... ++++++++++++++++++++++ +++++.........+++++++++++++++ ....... ++++++ ",
+" .... +++++ ..... .................... +++++++++++++++++++ ++++++++..++++++++++++++++++ ....... ++++++ ",
+" .... +++++ ..... .................... ++++++++++++++++ +++++++++++++++++++++++++++ ...... +++++++ ",
+" .....+++++ ....... ...................... +++++++++++ ++++++++++++++++++++++++++ ...... ++++++ ",
+" .... ++++ ....... ....................... ++++++++++++++++++++++++ ...... ++++++ ",
+" .... +++++ ....... ....................... ++++++++++++++++++++++ ....... ++++++ ",
+" .....+++++ ........ +++ ......................... ++++++++++++++++++++ ...... +++++++ ",
+" .... ++++ ........ ++++ ......................... ++++++++++++++++++ ...... ++++++ ",
+" .... +++++ ........ +++++ ....................... +++++++++++++++ ...... ++++++ ",
+" ..... ++++ .........+++++ +..................... ++++++++++++ ..... ++++++ ",
+" .... ++++ ..........+++++ ++.................... +++++++ ...... ++++++ ",
+" .....+++++ ..........++++++ +++++.................. ...... ++++++ ",
+" .... ++++ ...........+++++ +++++++.................. ...... ++++++ ",
+" .....++++ ...........+++++ +++++++.................. ...... +++++ ",
+" .....++++ ...........++++++ +++++++++................. ...... ++++++ ",
+" .....++++ ...........++++++ +++++++++++................ ...... ++++++ ",
+" .....++++ ............+++++++ ++++++++++............... ...... ++++++ ",
+" ......++++ ............+++++++ +++++++++............... ...... +++++ ",
+" .....++++ ............+++++++ ++++++++.............. ...... ++++++ ",
+" ......+++ ............+++++++++ +++++++.............. ...... +++++ ",
+" ......+++ .............+++++++++ +++++++............. ...... +++++ ",
+" ........+ .............+++++++++ ++++++............. ..... ++++++ ",
+" ........+ ..............+++++++++ +++++............. ...... +++++ ",
+" ........+ ...............+++++++++ +++++............. ..... +++++ ",
+" ........... ...............+++++++++ +++++............ ..... ++++++ ",
+" ............... ..................++++++++ ++++............ ...... +++++ ",
+" ......................................++++++++ ++++........... ..... +++++ ",
+" .....................................++++++++ +++........... ..... ++++ ",
+" ....................................+++++++++ ++++.......... .... +++++ ",
+" ...................................+++++++++ +++.......... ..... +++++ ",
+" ...................................+++++++++ +++.......... ..... +++++ ",
+" .................................+++++++++ +++.......... ..... ++++ ",
+" ................................+++++++++ ++.......... .... +++++ ",
+" ................................+++++++++ ++.......... + ..... +++++ ",
+" ..............................++++++++++ +.......... +++ ..... +++++ ",
+" .............................++++++++++ +.........+ +++ ..... ++++ ",
+" ............................++++++++++ +.........+ +++ .... +++++ ",
+" ...........................+++++++++ +.........+ ++++ ..... +++++ ",
+" .........................++++++++++ +........++ ++++ .. ..... ++++++ ",
+" ......................+++++++++++ +........++ +++++ ... ...... +++++ ",
+" +...................++++++++++++ +........+ +++++ ... ...... +++++ ",
+" ++................+++++++++++++ +.......++ ++++++ .... ..... ++++++ ",
+" +++............++++++++++++++ +......+++ ++++++ .... ...... ++++++ ",
+" ++++.........+++++++++++++++ +......+++ ++++++ ..... ...... ++++++ ",
+" ++++++..+++++++++++++++++++ +.....+++ ++++++ .... ...... ++++++ ",
+" +++++++++++++++++++++++++ +.....+++ +++++++ ..... ...... ++++++ ",
+" ++++++++++++++++++++++++ +.....+++ ++++++ ..... ...... +++++++ ",
+" +++++++++++++++++++++ +....++++ +++++++ ...... ...... +++++++ ",
+" ++++++++++++++++++ +....+++ ++++++ ....... ....... ++++++ ",
+" ++++++++++++++ +...++++ ++++++ ....... ...... +++++++ ",
+" +++++++++++ ++..++++ +++++++ ....... ...... +++++++ ",
+" ++++ +++++++ ++++++ ....... ...... ++++++ ",
+" ++++++ ++++++ ....... ....... ++++++ ",
+" ++++++ ++++++ ...... ...... +++++++ ",
+" +++++ ++++++ ....... ...... +++++++ ",
+" +++++ +++++ ...... ...... ++++++ ",
+" +++++ ++++++ ...... ...... ++++++ ",
+" +++++ +++++ ...... ...... ++++++ ",
+" ++++ ++++++ ...... ...... ++++++ ",
+" ++ +++++ ...... ...... ++++++ ",
+" ++++++ ...... ...... ++++++ ",
+" +++++ ..... ...... +++++ ",
+" ++++++ ...... ...... ++++++ ",
+" ++++++ ..... ...... ++++++ ",
+" +++++ ...... ....... ++++++ ",
+" ++++++ ..... ....... ++++++ ",
+" +++++ ...... ...... +++++++ ",
+" ++++++ ...... ...... ++++++ ",
+" . +++++ ...... ...... ++++++ ",
+" . ++++++ ...... ....... ++++++ ",
+" . +++++ ...... .......+++++++ ",
+" .. ++++++ ...... ...... +++++++ ",
+" ... ++++++ ...... ...... ++++++ ",
+" ... ++++++ ...... ....... ++++++ ",
+" .... ++++++ ...... .......+++++++ ",
+" .... +++++++ ...... .......+++++++ ",
+" .... + + +++++++ ...... ...... +++++++ ",
+" .....+ +++ +++++++ ...... ...... ++++++ ",
+" ......+ +++++ ++++++++ ....... ...... ++++++ ",
+" ......+ +++++ ++++++++ ....... ....... ++++++ ",
+" .......+ +++++++ +++++++++ ....... .......+++++++ ",
+" .......++ ++++++++ .. ++++++++++ ....... ...... +++++++ ",
+" ........++ +++++++++....++++++++++ ........ ...... ++++++ ",
+" ........+ +++++++++......+++++++++........ ...... ++++++ ",
+" .........+ +++++++++......++++++++ ........ ...... ++++++ ",
+" .........++ +++++++++.......+++++++......... ...... ++++++ ",
+" .........++ ++++++++.........+++++......... ...... +++++++ ",
+" .........+++ ++++++++........................ ...... +++++++ ",
+" .........+++ ++++++++....................... ...... ++++++ ",
+" ..........+++ ++++++++....................... ...... ++++++ ",
+" .........++++ +++++++++....................... ...... ++++++ ",
+" .........+++++ ++++++++....................... ....... ++++++ ",
+" ..........++++ +++++++++...................... ....... ++++++ ",
+" .........+++++ +++++++++...................... ...... +++++++ ",
+" .........+++++ ++++++++....................... ...... +++++++ ",
+" .........+++++ +++++++++...................... ....... +++++++ ",
+" .........+++++ ++++++++....................... ....... +++++++ ",
+" .........+++++ ++++++++....................... ....... +++++++ ",
+" .........+++++ ++++++++....................... ....... +++++++ ",
+" ..........+++++ ++++++++....................... ....... ++++++ ",
+" .........+++++ +++++++........................ ...... ++++++ ",
+" .........+++++ ++++++++....................... ...... +++++++ ",
+" @@@ ..........++++ +++++++......... .............. ..... ++++++ ",
+" @@@@@@ .........+++++ +++++++ ........ ............ ..... ++++++ ",
+" @@@@@@@@ .........+++++ +++++++........ .......... .... +++++ ",
+" @@@@@@@@@@@@ @@@@ @@@@@@@@@@ @@@@@@@@ ..........++++ +++++++ ....... ....... .... +++++ ",
+" @@@@@@@@@@@@ @@@@@ @@@@@@@@@@ @@@@@ .........+++++ ++++++ ........ ..... ... +++ ",
+" @@@@@@@ @@@@@@ @@@@@ @@@@@ .........+++++ +++++++ ....... ... +++ ",
+" @@@@@ @@@@@@ @@ @@@@@ .........+++++ +++++++........ .. ++ ",
+" @@@@@ @@@@@@ @@ @@@@@ ..........+++++ +++++++ ....... . ++ @@@ ",
+" @@@@@ @@@@@@@ @@@ @@@@@ .........+++++ +++++++....... + @@@@ ",
+" @@@@@@ @@@@@@@@ @@@ @@@@@ .........+++++ ++++++ ....... + @@@@ ",
+" @@@@@ @@@@@@@@ @@ @@@@@ ..........+++++ +++++++ ...... @@@@@ ",
+" @@@@@ @@@ @@@@@ @@ @@@@ @@@@@ .....#$%%@@&&# @@@*&=-++....... @@ @@@ @@@@@ @@@@ ",
+" @@@@@ @@@ @@@@@ @@@ @@@@@@@@@@ @@@@@ ....;>@@@@@@@@@@ @@@@@@@@@@@, ....... @@@@@ @@@@@@@ @@@@@@@ @@@@@@@@@ @@@@@@@ @@@@@@@@@@ ",
+" @@@@@@ @@ @@@@@ @@@ @@@@@ @@@@@ @@@@@ ....&@@@@@@@&,@@@@ @@@@@ &,@@@@@@%..... @@@@@@@ @@@@@@@@@@ @@@@@@@@@@ @@@@@ @@@@@ @@@@@@@@@@@@@@@ @@@@@@ @@@@@@ ",
+" @@@@@ @@@ @@@@@ @@ @@@@ @@@@ @@@@@ ....%@@@@@,-++#@@@@@ @@@@@ +++'&@@@@@%.... @@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@ @@@@ @@@@@ @@@@@@@@@@@@@@@@ @@@@@ @@@@@ ",
+" @@@@@ @@@ @@@@@ @@ @@@@ @@@@@ @@@@@ ...%@@@@@&++++ @@@@@ @@@@@ +++++&@@@@@%... @@@@@@@ @@@@@@@@ @@@@@@ @@@@ @@@@@ @@@@@@ @@@@@ @@@@@ ",
+" @@@@@@ @@ @@@@@ @@@ @@@@@ @@@@ @@@@@ ...$@@@@@)++++ @@@@@@ @@@@@ +++++'@@@@@@;. @@@@@@ @@@@@@ @@@@@@ @@@@ @@@@@ @@@@@@ @@@@@ @@@@@ ",
+" @@@@@ @@ @@@@@ @@@ @@@@ @@@@@ @@@@@ ....)@@@@@-++++ @@@@@ @@@@@ ++++++ @@@@@>. @@@@@@ @@@@@@ @@@@@@ @@@@@ @@@@@ @@@@@@ @@@@@@ @@@@@@ ",
+" @@@@@ @@@ @@@@@ @@ @@@@@ @@@@@ @@@@@ ...!@@@@@*++++ @@@@@ @@@@@ ++++++ ;@@@@@@ @@@@@@ @@@@@@ @@@@@ @@@@@ @@@@@ @@@@@@ @@@@@ @@@@@ ",
+" @@@@@ @@@ @@@@@ @@ @@@@@ @@@@@ @@@@@ ....%@@@@@&+++ @@@@@@ +++++ .@@@@@@ @@@@@@ @@@@@@ @@@@@ @@@@@ @@@@@ @@@@@@ @@@@@ @@@@@ ",
+" @@@@@@ @@ @@@@@ @@@ @@@@@ @@@@@@ @@@@@ .....@@@@@@~+++ @@@@@@ ++++ ..)@@@@@ @@@@@@ @@@@@@ @@@@@ @@@@@@ @@@@@ @@@@@@ @@@@@@ @@@@@@ ",
+" @@@@@ @@@ @@@@@ @@@ @@@@@@@@@@@@@@@@@@@@@ @@@@@ ....;@@@@@@#++ @@@@@@ +++++ ..%@@@@@@ @@@@@@ @@@@@@ @@@@@ @@@@@@@@@@@@@@@@@@@@@ @@@@@@ @@@@@@ @@@@@@ ",
+" @@@@@ @@@ @@@@@ @@ @@@@@@@@@@@@@@@@@@@@@@ @@@@@ .....$@@@@@@#+ @@@@@@ ++++ ..%@@@@@@ @@@@@@ @@@@@@ @@@@@ @@@@@@@@@@@@@@@@@@@@@ @@@@@@ @@@@@@ @@@@@@ ",
+" @@@@@ @@ @@@@@ @@ @@@@@@ @@@@@%.....$@@@@@@#+ @@@@@@ ++++ ...%@@@@@@ @@@@@@ @@@@@@ @@@@@ @@@@@ @@@@@@ @@@@@@ @@@@@@ ",
+" @@@@@@ @@@ @@@@@ @@@ @@@@@@ @@@@@%.....$@@@@@@~ @@@@@@ +++ ...%@@@@@@ @@@@@@ @@@@@@ @@@@@ @@@@@ @@@@@@ @@@@@@ @@@@@@ ",
+" @@@@@ @@@ @@@@@ @@@ @@@@@ @@@@@%.....$@@@@@@ @@@@@@ ++++ ...%@@@@@ @@@@@@ @@@@@@ @@@@@ @@@@@@ @@@@@@ @@@@@@ @@@@@@ ",
+" @@@@@@@@ @@@@@@@@ @@@@@ @@@@@%......@@@@@@ @@@@@@ ++++ ...@@@@@@ @@@@@@ @@@@@@ @@@@@ @@@@@@ @@@@@@ @@@@@@ @@@@@@ ",
+" @@@@@@@@ @@@@@@@@ @@@@@ @@@@@%......,@@@@@@ @@@@@@ +++ ...#@@@@@@ @@@@@@ @@@@@@ @@@@@ @@@@@ @@@@@@ @@@@@ @@@@@ ",
+" @@@@@@@@ @@@@@@@ @@@@@@ @@@@@%.....+~@@@@@@ @@@@@ +++ ...$@@@@@@ @@@@@@ @@@@@@ @@@@@ @@@@@@ @@@@@@ @@@@@@ @@@@@@ ",
+" @@@@@@@ @@@@@@@ @@@@@@ @@@@@%.....+'@@@@@@@ @@@@@@'++ ...>@@@@@ @@@@@@ @@@@@@ @@@@@ @@@@@ @@@@@@ @@@@@ @@@@@ ",
+" @@@@@@ @@@@@@ @@@@@@ @@ @@@@@%....+++~@@@@@@@ @ @@@@@&+ ..$@@@@@ @@@@@@ @@@@@@ @@@@@ @@@@@@ @ @@@@@@ @@@@@ @@@@@ ",
+" @@@@@@ @@@@@@ @@@@@@@ @@@@ $@@@@@%...+++++ @@@@@@@ @@@ @@@@@& ..$)@@@@ @@@@@@ @@@@@@ @@@@@ @@@@@@@ @@@ @@@@@@@ @@@@@ @@@@@ ",
+" @@@@@ @@@@@ @@@@@@@@@@@@@@@@@ %@@@@@@!$+++++ @@@@@@@@@@@@@@@@ @@@@@ $%@@@@@ @@@@@@ @@@@@@ @@@@@ @@@@@@@@@@@@@@@@@ @@@@@@@@@@@@ @@@@@ @@@@@ ",
+" @@@@ @@@@@ @@@@@@@@@@@@@ @@@@@@@@@@@@#+++ @@@@@@@@@@@@@ @@@@@@@@@@@@@ @@@@@@@@@@@ @@@@@@@@@@@ @@@@@@@@@@@ @@@@@@@@@@@@@ @@@@@@@@@@ @@@@@@@@@@@@ ",
+" @@@@ @@@@ @@@@@@@@ @@@@@@@@@@@@#++ @@@@@@@ @@@@@@@ @@@@@@@@@@@ @@@@@@@@@@@ @@@@@@@@@@@ @@@@@@@@ @@@@@@ @@@@@@@@ ",
+" .........+++++ $$. ",
+" ..........+++++ ... ",
+" ..........+++++ .. ",
+" .........+++++ . ",
+" ..........++++ ",
+" ..........+++++ ",
+" ..........+++++ ",
+" ..........++++ ",
+" ..........+++++ ",
+" @@@@@@@@@@@@ @@@@@@@@@@ @@@@@@@@@@@.$@@@@@@@@@@@@@ @@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@ ",
+" @@@@@@@@@@@@@@@@@@ @@@@@@@@@@ @@@@@@@@@@@.$@@@@@@@@@@@@@ @@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@ ",
+" @@@@@@@@ @@@@@ @@@@@@@ @@@@%%%.;%%=@@@@@@@ @@@ @@@@@@ @@@ ",
+" @@@@@@ @@@@ @@@@@@@@ @@@!......++&@@@@@ @@@ @@@@@ @@@ ",
+" @@@@@@ @@@ @@@@@@@@@ @@@$.....+++&@@@@@ @@@ @@@@@ @@@ ",
+" @@@@@@ @@@ @@@@@@@@@ .@@@$.....+++&@@@@@ @@@ @@@@@ @@ ",
+" @@@@@@ @@@ @@@ @@@@@@ ..@@@$....++++&@@@@@ @@@ @@@@@ @@ ",
+" @@@@@@ @@@ @@@ @@@@@@ ...@@@$...+++++ @@@@@ @@@ @@@@@ ",
+" @@@@@@ @@@ @@@ @@@@@@ ...@@@$...++++ @@@@@ @@@ @@@@@ @@ @@@@ @ @@@@ ",
+" @@@@@@ @@@ @@@@@@ ....@@@$..+++++ @@@@@ @@@ @@@@@ @@@@ @@@@@@@@ @@@@@@@ @@@@@@@@@@@@ @@@@@@@@@ @@@@@@@@@@@@ ",
+" @@@@@@ @@@ @@@@@@ .....@@@$.+++++ @@@@@ @@@ @@@@@ @@ @@@@@@@ @@@@@@@@@@@ @@@@@@@@@@@ @@@@@ @@@@@@@ @@@@@@ @@@@ @@@@@ @@@@@ ",
+" @@@@@@ @@@ @@@@@@ .....@@@$.++++ @@@@@ @@@ @@@@@ @@ @@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@ @@@@@ @@@@@@ @@@@@ @@@@@ @@@@@ @@@ ",
+" @@@@@@ @@@ @@@@@@ ......@@@$+++++ @@@@@ @@@ @@@@@ @@ @@@@@@ @@@@@@@@@ @@@@@@ @@@@@ @@@@@ @@@@@ @@@@@ @@@@ @@@ ",
+" @@@@@@@ @@@ @@@@@@ ......@@@#++++ @@@@@ @@@ @@@@@ @@ @@@@@ @@@@@@ @@@@@ @@@@@@ @@@@@ @@@@@ @@@@@ @@@@@ @@@ ",
+" @@@@@@@ @@@ @@@@@@)......@@@#+++ @@@@@ @@@ @@@@@@@@@@@@@@@ @@@@@ @@@@@ @@@@@@ @@@@@@ @@@@@@ @@@@@ @@@@@ @@@@@ @@@ ",
+" @@@@@@@ @@@ @@@@@@!.....@@@#+++ @@@@@ @@@ @@@@@@@@@@@@@@@ @@@@@ @@@@@ @@@@@@ @@@@@@ @@@@@ @@@@ @@@@@@ ",
+" @@@@@@@ @@@@@@@@@@@@@@ @@@ @@@@@@@#....@@@#++ @@@@@ @@@ @@@@@@@@@@@@@@@ @@@@@ @@@@@ @@@@@@ @@@@@@ @@@@@@ @@@@@@@ ",
+" @@@@@@@ @@@@@@@@@@@@@@ @@@ @@@@@@>....@@@#+ @@@@@ @@@ @@@@@ @@ @@@@@ @@@@@ @@@@@@ @@@@@@ @@@@@@ @@@@@@@ ",
+" @@@@@@ @@@@@@@ @@@ @@@@@@!...@@@#+ @@@@@ @@@ @@@@@ @@ @@@@@ @@@@@ @@@@@@ @@@@@@@@@@ @@@@@@ @@@@@@@@@ ",
+" @@@@@@ @@@@@ @@@ @@@@@@@#.+@@@# @@@@@ @@@ @@@@@ @@ @@@@@ @@@@@ @@@@@@ @@@@@@@ @@@@@@ @@@@@@ @@@@@@@@@ ",
+" @@@@@@ @@@@@ @@@ @@@@@@>++@@@ @@@@@ @@@ @@@@@ @@ @@@@@ @@@@@ @@@@@@ @@@@@ @@@@@@ @@@@@@ @@@@@@@@@@ ",
+" @@@@@@ @@@@@ @@@ >@@@@@@~+@@@ @@@@@ @@@ @@@@@ @@@@@ @@@@@ @@@@@@ @@@@@ @@@@@@ @@@@@@ @@@@@@@@@ ",
+" @@@@@@ @@@@@ @@@ .;@@@@@@@'@@@ @@@@@ @@@ @@@@@ @@@@@ @@@@@ @@@@@@ @@@@@ @@@@@@ @@@@@@ @@@@@@@@ ",
+" @@@@@@ @@@@@ @@@ ..&@@@@@@,@@@ @@@@@@ @@@ @@@@@ @@@@@ @@@@@ @@@@@@ @@@@@ @@@@@@ @@@@@@ @@@@@@ ",
+" @@@@@@ @@@@@ @@@ ...)@@@@@@@@@ @@@@@@ @@ @@@@@ @@@ @@@@@ @@@@@ @@@@@@ @@@@@@ @@@@@@ @@@@@@ @@@@@@ ",
+" @@@@@@ @@@@@ @@@ ....;@@@@@@@@@ @@@@@@ @@@ @@@@@ @@@ @@@@@ @@@@@ @@@@@@ @@@@@@ @@@@@@ @@@@@@ @@ @@@@@@ ",
+" @@@@@@ @@@@@ @@@ .....=@@@@@@@@ @@@@@@ @@@ @@@@@ @@@ @@@@@ @@@@@ @@@@@@ @@@@@@ @@@@@@ @@@@@@@ @@ @@@@@ ",
+" @@@@@@ @@@@@ @@@ .....++*@@@@@@@ @@@@@@@ @@@ @@@@@ @@@ @@@@@ @@@@@ @@@@@@ @@@@@@ @@@@@@ @@@@@@ @ @@ @@@@@ ",
+" @@@@@@@ @@@@@ @@@ .....++#@@@@@@@ @@@@@@@ @@@@ @@@@@ @@@ @@@@@ @@@@@ @@@@@@ @@@@@@ @@@@@@@@ @@@@@@@ @@@ @@@ @@@@ ",
+" @@@@@@@@@@ @@@@@ @@@@ ....++++&@@@@@@ @@@@@@@@@@@@@@@@@@ @@@@@@ @@@@ @@@@@@ @@@@@@ @@@@@@ @@@@@@@@@@@ @@@@@@ @@@@@@@@@@@@@@@@ @@@@ @@@@@ ",
+" @@@@@@@@@@@@@@@@@ @@@@@@@@@@ ....+++++ @@@@@ @@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@ @@@@@@@@@@ @@@@@@@@@@@ @@@@@@@@@ @@@@@@@@ @@@@@@@@@@@@@ @@@@@@@@@@@@@ ",
+" @@@@@@@@@@@ @@@@@@@@@@ ....+++++ @@@@@ @@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@ @@@@@@@@@@ @@@@@@@@@@@ @@@@@@ @@@@@@@@ @@@@@@@@ @@@@@@@@@ ",
+" ...+++++ ",
+" ...+++++ ",
+" ...++++ ",
+" ...+++++ ",
+" .. ++++ ",
+" ..++++ ",
+" .. ++++ ",
+" . ++++ ",
+" +++ ",
+" . +++ ",
+" +++ ",
+" ++ ",
+" ++ ",
+" ++ ",
+" + ",
+" ",
+" + ",
+" ",
+" ",
+" ",
+" "};
2000-09-19 Gerd Moellmann <gerd@gnu.org>
+ * gnus/: Update to emacs-21-branch of the Gnus CVS repository.
+ * gnus/binhex.el, gnus/flow-fill.el, gnus/format-spec.el
+ * gnus/gnus-ml.el, gnus/gnus-mlspl.el, gnus/ietf-drums.el,
+ * gnus/imap.el, gnus/mail-parse.el, gnus/mail-prsvr.el,
+ * gnus/mail-source.el, gnus/mailcap.el, gnus/mm-bodies.el,
+ * gnus/mm-decode.el, gnus/mm-encode.el, gnus/mm-partial.el,
+ * gnus/mm-util.el, gnus/mm-uu.el, gnus/mm-view.el,
+ * gnus/mml.el, gnus/nnimap.el, gnus/nnslashdot.el,
+ * gnus/nnultimate.el, gnus/nnwarchive.el, gnus/qp.el,
+ * gnus/rfc1843.el, gnus/rfc2045.el, gnus/rfc2047.el,
+ * gnus/rfc2104.el, gnus/rfc2231.el, gnus/time-date.el,
+ * gnus/utf7.el, gnsu/uudecode.el, gnus/webmail.el: New files.
+
* startup.el (fancy-splash-text): New variable.
(fancy-splash-delay, fancy-splash-image): New user-options.
(fancy-splash-insert, fancy-splash-head, fancy-splash-tail)
-2000-06-19 Gerd Moellmann <gerd@gnu.org>
+2000-09-14 Dave Love <fx@gnu.org>
- * gnus-uu.el (gnus-uu-default-view-rules): Don't use `xv'.
+ * gnus.el (gnus-charset):
+ * mm-decode.el (mime-display):
+ * imap.el (imap) <defgroup>: Add :version.
+
+2000-09-13 Gerd Moellmann <gerd@gnu.org>
+
+ * parse-time.el: Fix author's mail address.
+
+ * earcon.el, flow-fill.el, gnus-cite.el, gnus-gl.el, gnus-ml.el:
+ * gnus-mlspl.el, gnus-nocem.el, gnus-range.el, gnus-salt.el:
+ * gnus-setup.el, gnus-soup.el, gnus-undo.el, gnus-vm.el:
+ * messcompat.el, nnbabyl.el, nndir.el, nneething.el:
+ * nngateway.el, nnheaderxm.el, nnkiboze.el, nnlistserv.el:
+ * nnmbox.el, nnmh.el, nnoo.el, nnsoup.el, nnspool.el, rfc2045.el:
+ * rfc2231.el, uudecode.el: Fix copyright notice.
+
+ * nnweb.el (toplevel): To make the file bootstrap in Emacs,
+ require `w3' at load-time only if not running in batch mode.
+
+2000-09-13 Dave Love <fx@gnu.org>
+
+ * gnus-ems.el (gnus-ems-redefine): Don't alias
+ gnus-summary-set-display-table.
+
+ * message.el (message-user-agent): Don't wrap ignore-errors around
+ it.
+
+ * mm-encode.el (mm-insert-multipart-headers): Avoid redundant
+ `format'.
+ (mm-content-transfer-encoding): Don't use cadar.
+
+ * uudecode.el (uudecode-decoder-program)
+ (uudecode-decoder-switches): Customize.
+
+ * gnus-score.el (gnus-home-score-file): Improve custom type.
+
+ * gnus-cus.el (gnus-custom-mode): Conditionally set local
+ variables for Emacs 21.
+ (gnus-group-customize): Disable undo while laying out the buffer.
+
+2000-09-13 ShengHuo ZHU <zsh@cs.rochester.edu>
+
+ * gnus-util.el (gnus-write-active-file): Bind
+ coding-system-for-write.
+
+ * nnmail.el (nnmail-get-new-mail): Don't test nnmail-spool-file.
+
+ * gnus-cache.el (gnus-jog-cache): Temporarily disable mail-sources.
+ * gnus-kill.el (gnus-batch-score): Ditto.
+ * gnus-move.el (gnus-change-server): Ditto.
+ * nnkiboze.el (nnkiboze-generate-groups): Ditto.
+
+2000-09-12 Simon Josefsson <simon@josefsson.org>
+
+ * gnus-sum.el (gnus-update-read-articles): Undo
+ `gnus-request-set-mark' operation.
+
+2000-09-11 Dave Love <fx@gnu.org>
+
+ * Changelog: Use iso-2022 coding.
+
+ * gnus-msg.el (gnus-msg-mail): New function.
+ (gnus-user-agent): New mail agent.
+
+2000-09-10 Dave Love <fx@gnu.org>
+
+ * message.el: Require mail-abbrevs for XEmacs for a problem with
+ keybinding despite the autoloads for it.
+
+2000-09-08 Simon Josefsson <simon@josefsson.org>
+
+ * imap.el (imap-kerberos4-open): Erase more (fixes race condition?).
+
+ * nnimap.el (nnimap-request-update-info-internal): Remove tick
+ marks from dormant articles. (See nnimap-request-set-mark.)
+ (nnimap-retrieve-headers-progress): Demule.
+ (nnimap-open-server): Call nnoo-change-server twice, once for
+ getting the nnimap-server-buffer and once for letting n-c-s set
+ the variables in that buffer.
+
+2000-09-08 David Edmondson <dme@dme.org>
+
+ * gnus.el (gnus-short-group-name): Guess separator.
+
+2000-09-06 Francis Litterio <franl-removethis@world.omitthis.std.com>
+
+ * gnus-group.el (gnus-group-insert-group-line): Fix.
+
+2000-09-04 Dave Love <fx@gnu.org>
+
+ * mm-decode.el (mime-display) <defgroup>: Add `multimedia' group.
+ (mm-get-image): Avoid the losing `make-glyph' from W3.
+
+2000-09-03 Simon Josefsson <simon@josefsson.org>
+
+ * gnus-sum.el (gnus-summary-delete-article): Check server.
+
+2000-09-01 Simon Josefsson <simon@josefsson.org>
+
+ * imap.el (imap-parse-flag-list): Rewrite.
+
+ * nnimap.el (nnimap-retrieve-headers-from-file): Ignore errors.
+
+ * imap.el (imap-parse-flag-list): Hack.
+
+2000-08-29 Dave Love <fx@gnu.org>
+
+ * gnus-mlspl.el (gnus-group-split-fancy): Eschew mapcon.
+
+ * gnus-agent.el (gnus-agent-union): new function.
+ (gnus-agent-fetch-headers): Use it.
+
+ * gnus.el (gnus-group-startup-message): Specify foreground and
+ background for xpm image. Centre image vertically.
+ From Katsumi Yamaoka <yamaoka@jpl.org> with mods.
+
+2000-08-25 ShengHuo ZHU <zsh@cs.rochester.edu>
+
+ * message.el (message-send-mail): Narrow-to-headers.
+
+2000-08-24 Dave Love <fx@gnu.org>
+
+ * gnus-art.el (gnus-insert-mime-button): Fix help-echo for Emacs
+ 21.
+
+2000-08-21 Dave Love <fx@gnu.org>
+
+ * nnimap.el (nnimap-request-newgroups): Eschew member-if.
+
+2000-08-21 ShengHuo ZHU <zsh@cs.rochester.edu>
+
+ * gnus-topic.el (gnus-topic-hide-topic): Use find-topology if
+ permanent is used.
+ (gnus-topic-show-topic): Read topic when to show permanent hidden
+ topic.
+ (gnus-topic-remove-topic): Revert to the old behavior, not using
+ hide.
+
+2000-08-21 Dave Love <fx@gnu.org>
+
+ * gnus-ems.el (gnus-add-minor-mode): Add &rest arg.
+ (gnus-xemacs): Use featurep.
+
+ * mm-util.el (mm-read-charset): Maybe use builtin.
+ (mm-replace-chars-in-string): Maybe use subst-char-in-string.
+ (mm-multibyte-p, mm-with-unibyte-current-buffer)
+ (mm-with-unibyte): Use featurep, not string-match.
+ (mm-with-unibyte-buffer): Simplify.
+ (mm-quote-arg): Maybe use shell-quote-argument.
+
+ * mml.el (mml-make-string): Deleted (unused).
+
+ * gnus.el (gnus-mode-line-buffer-identification): Supply
+ definition for Emacs 21.
+
+ * gnus-salt.el: Small doc fixes.
+ (gnus-pick-mode, gnus-binary-mode): Supply a toggle-func arg to
+ gnus-add-minor-mode.
+
+ * gnus-topic.el (gnus-topic-mode): Supply a toggle-func arg to
+ gnus-add-minor-mode.
+
+2000-08-20 Simon Josefsson <simon@josefsson.org>
+
+ * nnimap.el (nnimap-before-find-minmax-bugworkaround): New
+ function, thanks to Lloyd Zusman for debugging.
+ (nnimap-request-group):
+ (nnimap-request-list):
+ (nnimap-retrieve-groups):
+ (nnimap-request-newgroups): Use it.
+
+ * nnimap.el (nnimap-request-article-part): Less verbose.
+
+2000-08-18 Dave Love <fx@gnu.org>
+
+ * gnus-score.el (gnus-score-find-score-files-function): Fix doc,
+ custom type.
+
+ * nnheader.el (nnheader-replace-chars-in-string): Use
+ subst-char-in-string if available.
+
+ * gnus-art.el (gnus-read-save-file-name, gnus-plain-save-name)
+ (gnus-request-article-this-buffer): Use expand-file-name.
+ (gnus-mime-view-part-as-type): Simplify interactive spec.
+ (gnus-mime-button-map): Define it all in defvar.
+
+2000-08-17 Dave Love <fx@gnu.org>
+
+ * gnus-group.el (gnus-group-running-xemacs): Deleted.
+
+ * gnus-demon.el (gnus-demon): Bind use-dialog-box and
+ last-nonmenu-event.
+
+ * uudecode.el (char-int): Use defalias, not fset.
+
+ * score-mode.el: Don't require easymenu. Require mm-util.
+ (score-mode-coding-system): Use mm-auto-save-coding-system.
+
+ * nneething.el (nneething-create-mapping): Don't use cadar & al.
+ (nneething-file-name): Use expand-file-name, not concat.
+
+2000-08-16 ShengHuo ZHU <zsh@cs.rochester.edu>
+
+ * nnslashdot.el (nnslashdot-threaded-retrieve-headers):
+ Failure proof for email addresses.
+ (nnslashdot-sane-retrieve-headers): Ditto.
+
+2000-08-14 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * message.el (message-send-mail): Only insert courtesy message
+ when text/plain.
+
+2000-08-14 Jesper Harder <jesper_harder@hotmail.com>
+
+ * message.el (message-cancel-news): Copy the From header from the
+ original article.
+
+2000-08-14 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * gnus-async.el (gnus-asynchronous): Removed.
+
+2000-08-14 ShengHuo ZHU <zsh@cs.rochester.edu>
+
+ * mail-source.el (mail-source-fetch-maildir): Use MMDF mail
+ format.
+
+2000-08-14 Rod Whitby <list.ding@rwhitby.net>
+
+ * nnmail.el (nnmail-expiry-target-group): Fixed.
+
+2000-08-14 Rod Whitby <list.ding@rwhitby.net>
+
+ * nnmail.el (nnmail-expiry-target-group): Fix the call to
+ gnus-request-accept-article so that body encoding is *not* done.
+ Encoding is not done on incoming mail, so why should it be done on
+ expired mail?
+
+
+2000-08-14 Rod Whitby <list.ding@rwhitby.net>
+
+ * nnml.el (nnml-request-expire-articles): Fix the calls to
+ nnml-request-article (the filename was being passed instead of the
+ article number) and nnmail-expiry-target-group
+ (nnml-current-directory is changed by nnml-request-accept-article,
+ causing it to be incorrect for the next article to be expired).
+
+2000-08-14 Rod Whitby <list.ding@rwhitby.net>
+
+ * gnus-sum.el (gnus-summary-expire-articles): Fix the handling of
+ expiry-target group parameters.
+
+2000-08-13 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * gnus-topic.el (gnus-topic-select-group): Touch the dribble
+ buffer.
+ (gnus-topic-hide-topic): Take a PERMANENT parameter.
+ (gnus-topic-show-topic): Ditto.
+
+ * gnus-dup.el (gnus-dup-suppress-articles): Do auto-expiry.
+
+2000-08-12 John H. Palmieri <palmieri@math.washington.edu>
+
+ * mail-source.el (mail-source-incoming-file-prefix): New
+ variable.
+
+2000-08-12 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * gnus-start.el (gnus-check-first-time-used): Clean up a bit.
+
+ * mailcap.el (mailcap-maybe-eval): Be even more warning.
+
+2000-08-11 Florian Weimer <fw@deneb.enyo.de>
+
+ * message.el (message-syntax-checks): New check quotin-style:
+ Text must be written below quoted text.
+ (message-check-news-body-syntax): Check it.
+
+2000-08-11 Simon Josefsson <simon@josefsson.org>
+
+ * imap.el (imap-authenticator-alist): Fix typo.
+ (imap-gssapi-open): Copy krb4 fixes for modern imtest's, thanks to
+ Jonas Oberg for debugging.
+
+2000-08-11 Simon Josefsson <simon@josefsson.org>
+
+ * gnus-async.el (gnus-asynchronous): Disable by default.
+
+2000-08-10 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * mm-view.el (mm-inline-text): Bind fill-column.
+
+ * nnvirtual.el (nnvirtual-request-expire-articles): Return the
+ list of unexpired articles.
+
+ * gnus-group.el (gnus-group-expire-articles-1): Return the list of
+ un-expired articles.
+
+ * gnus-sum.el (gnus-summary-reparent-thread): Narrow to the
+ headers.
+
+ * gnus-topic.el (gnus-topic-kill-group): Move up one line so that
+ we update the right topic..
+
+ * mm-decode.el (mm-display-external): Put point at start.
+
+2000-08-10 Kai Gro\e,A_\e(Bjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE>
+
+ * nnmail.el (nnmail-expiry-target): More explicit documentation.
+
+ * gnus-cus.el (gnus-group-parameters): Add parameter `expiry-wait'.
+
+2000-08-09 Simon Josefsson <simon@josefsson.org>
+
+ * imap.el (imap-parse-body):
+ (imap-parse-string-list): Add bug workarounds for Stalker
+ Communigate Pro 3.0 server.
+ (imap-body-lines): Remove bogus comment.
+
+ * imap.el (imap-range-to-message-set): Move from nnimap.el.
+
+ * nnimap.el (nnimap-retrieve-which-headers):
+ (nnimap-retrieve-headers-from-server):
+ (nnimap-request-set-mark):
+ (nnimap-request-expire-articles): Use `i-r-t-m-set' instead.
+
+2000-08-08 ShengHuo ZHU <zsh@cs.rochester.edu>
+
+ * message.el (message-dont-reply-to-names):
+ rmail-dont-reply-to-names may not be defined.
+
+2000-08-07 ShengHuo ZHU <zsh@cs.rochester.edu>
+
+ * gnus-group.el (gnus-group-iterate): Uncompiled function should
+ not use pop.
+
+2000-07-19 Dave Love <fx@gnu.org>
+
+ * gnus-ems.el: Defalias some dummy funcs to `ignore'.
+ (gnus-x-splash): Use expand-file-name. Remove redundant facep
+ check.
+ (gnus-article-display-xface): Special-case for dark backgrounds.
+
+2000-07-19 Kim-Minh Kaplan <kmkaplan@galaxy.fr>
+
+ * imap.el (imap-calculate-literal-size-first): New variable.
+ (imap-local-variables): Add it.
+ (imap-kerberos4-open): Set it.
+ (imap-send-command): Use it.
+
+2000-07-17 ShengHuo ZHU <zsh@cs.rochester.edu>
+
+ * mailcap.el (mailcap-mimetypes-parsed-p): New variable.
+ (mailcap-parse-mimetypes): Use it.
+ (mailcap-extension-to-mime): Parse mimetype.
+ (mailcap-mime-types): Ditto.
+ * mml.el (mml-minibuffer-read-type): Ditto.
+
+2000-07-16 ShengHuo ZHU <zsh@cs.rochester.edu>
+
+ * nndoc.el (nndoc-type-alist): Add outlook.
+ (nndoc-outlook-type-p): New function.
+ (nndoc-outlook-article-begin): Ditto.
+
+2000-07-16 Daiki Ueno <ueno@unixuser.org>
+
+ * gnus-sum.el (gnus-restore-hidden-threads-configuration): Save
+ excursion.
+
+2000-07-15 Simon Josefsson <simon@josefsson.org>
+
+ * gnus-cus.el (gnus-group-parameters, banner): Type is regexp.
+
+ * imap.el (imap):
+ (imap-kerberos4-program):
+ (imap-gssapi-program):
+ (imap-ssl-program): Customization.
+ (imap-shell-program):
+ (imap-shell-host): New variables.
+ (imap-streams):
+ (imap-stream-alist): Add shell.
+ (imap-shell-p):
+ (imap-shell-open): New functions.
+ (imap-open): Don't call authenticator if preauth.
+ (imap-authenticate): Return t if already authenticated.
+
+2000-07-14 Simon Josefsson <simon@josefsson.org>
+
+ * gnus.el (gnus-invalid-group-regexp): New variable.
+ (gnus-read-group): Use it.
+
+2000-07-14 ShengHuo ZHU <zsh@cs.rochester.edu>
+
+ * gnus-agent.el (gnus-agent-fetch-group-1): mark-below,
+ expunge-below and orphan-score are "group variables".
+
+2000-07-13 Simon Josefsson <jas@pdc.kth.se>
+
+ * gnus-srvr.el (gnus-browse-read-group): Don't pass fully
+ qualified group names to `gnus-group-read-ephemeral-group'.
+
+2000-07-12 ShengHuo ZHU <zsh@cs.rochester.edu>
+
+ * gnus-sum.el: `W t' is toggle-header in info.
+
+2000-07-12 ShengHuo ZHU <zsh@cs.rochester.edu>
+
+ * gnus-art.el (article-de-base64-unreadable): Typo.
+
+2000-07-12 Simon Josefsson <jas@pdc.kth.se>
+
+ * gnus-agent.el (require): Require timer.
+
+2000-07-11 ShengHuo ZHU <zsh@cs.rochester.edu>
+
+ * message.el (message-bounce): Call mime-to-mml.
+
+2000-07-11 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * nnslashdot.el (nnslashdot-request-close): New function.
+
+2000-07-05 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * nnslashdot.el (nnslashdot-threaded-retrieve-headers): Get the
+ right line number for the article.
+
+2000-07-11 ShengHuo ZHU <zsh@cs.rochester.edu>
+
+ * nnslashdot.el (nnslashdot-threaded-retrieve-headers): Save point.
+ * webmail.el (webmail-fetch): Bind
+ url-http-silence-on-insecure-redirection.
+
+2000-07-10 ShengHuo ZHU <zsh@cs.rochester.edu>
+
+ * nnslashdot.el (nnslashdot-threaded-retrieve-headers): Use
+ unibyte.
+ (nnslashdot-sane-retrieve-headers): Ditto.
+ (nnslashdot-request-article): Ditto.
+
+2000-07-10 William M. Perry <wmperry@aventail.com>
+
+ * mailcap.el (mailcap-parse-mimetype-file):
+
+2000-07-08 ShengHuo ZHU <zsh@cs.rochester.edu>
+
+ * nnweb.el (nnweb-insert): Stricter test.
+ * webmail.el (webmail-refresh-redirect): Ditto.
+
+2000-07-06 ShengHuo ZHU <zsh@cs.rochester.edu>
+
+ * mm-decode.el (mm-dissect-multipart): Match the EOL of boundary.
+
+2000-07-05 ShengHuo ZHU <zsh@cs.rochester.edu>
+
+ * nnheader.el (nnheader-insert-nov): Remove EOLs of all fields.
+
+2000-07-05 Dave Love <fx@gnu.org>
+
+ * utf7.el: Doc and header fixes.
+
+ * gnus-sum.el: Doc fixes.
+
+ * gnus-util.el (gnus-point-at-eol, gnus-point-at-bol): Use
+ defalias, not fset.
+
+ * flow-fill.el (fill-flowed-point-at-eol)
+ (fill-flowed-point-at-bol): Use defalias, not fset.
+
+ * gnus-art.el: Don't alias article-mime-decode-quoted-printable.
+ (gnus-Plain-save-name): Delete -- apparently bogus.
+
+2000-07-03 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * nnsoup.el: Use expand-file-name throughout.
+
+2000-07-03 Kjetil Torgrim Homme <kjetilho@ifi.uio.no>
+
+ * nnmail.el (nnmail-read-incoming-hook): New example.
+
+2000-07-03 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * mm-view.el (mm-inline-text): Check whether the text has already
+ been decoded.
+
+2000-07-04 ShengHuo ZHU <zsh@cs.rochester.edu>
+
+ * nnslashdot.el (nnslashdot-sid-strip): To strip or not to strip?
+
+2000-07-03 Stainless Steel Rat <ratinox@peorth.gweep.net>
+
+ * gnus-sum.el (gnus-recenter): Fix horizontal recenter.
+
+2000-07-03 Simon Josefsson <simon@josefsson.org>
+
+ * gnus-sum.el (gnus-update-marks): Don't propagate download and
+ unsend flags.
+
+2000-07-03 Simon Josefsson <jas@pdc.kth.se>
+
+ * nnimap.el (nnimap-open-connection): Don't look up virtual server
+ name in authinfo (.authinfo now support ports, no need for the
+ hack).
+ (nnimap-split-find-rule): Fix.
+ (nnimap-open-connection): Look for nnimap-server-address in authinfo.
+
+2000-07-03 Paul Stodghill <stodghil@CS.Cornell.EDU>
+
+ * message.el (message-unquote-tokens): Remove all quotes.
+
+2000-07-03 Julien Gilles <julien.gilles@bcv01y01.vz.cit.alcatel.fr>
+
+ * gnus-ml.el: New file.
+
+2000-07-02 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * nnultimate.el (nnultimate-request-close): New function.
+
+ * gnus-start.el (gnus-clear-system): Clear nnmail-split-history.
+
+2000-07-02 Lars Magne Ingebrigtsen <lmi@quimbies.gnus.org>
+
+ * gnus.el: Gnus v5.8.7 is released.
+
+2000-05-19 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * mm-decode.el (mm-insert-part): Characters doubly decoded.
+
+2000-07-01 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * message.el (message-do-fcc): Encode MIME.
+
+2000-06-28 Simon Josefsson <simon@josefsson.org>
+
+ * nnimap.el (nnimap-split-rule): Update doc with extended syntax.
+ (nnimap-assoc-match): New function.
+ (nnimap-split-find-rule): Support extended syntax.
+
+2000-06-28 Simon Josefsson <simon@josefsson.org>
+
+ * nnimap.el (nnimap-open-connection): Use port stuff.
+
+ * gnus-util.el (gnus-netrc-machine): Add defaultport parameter,
+ document port and defaultport.
+
+2000-06-27 Paul Stodghill <stodghil@CS.Cornell.EDU>
+
+ * gnus-agent.el (gnus-agent-synchronize): Kill flags buffer.
+
+2000-06-26 Dave Love <fx@gnu.org>
+
+ * mm-decode.el (mm-image-fit-p): Use `image-size' in Emacs.
+
+ * message.el: Remove unnecessary `require'ments. Defvar
+ gnus-list-identifiers when compiling. Don't try to autoload
+ variable `gnus-list-identifiers'. Autoload
+ gnus-group-name-charset.
+ (message-fetch-field): Don't assume `format' removes text
+ properties.
+ (message-strip-list-identifiers, message-reply, message-followup):
+ Require gnus-sum.
+ (message-mode): Tidy XEmacs conditionals.
+ (message-replace-chars-in-string): Use subst-char-in-string when
+ available.
+
+ * gnus-art.el (gnus-article-edit-exit): Don't assume `format'
+ removes text properties.
+
+ * gnus-srvr.el (gnus-browse-group-name): Likewise.
+
+ * gnus-msg.el (gnus-copy-article-buffer): Likewise.
+
+ * gnus-score.el (gnus-summary-score-entry): Likewise.
+
+2000-06-26 Katsumi Yamaoka <yamaoka@jpl.org>
+
+ * nnimap.el (nnimap-request-post): Fix parenthesis.
+
+2000-06-26 Paul Stodghill <stodghil@CS.Cornell.EDU>
+
+ * message.el (message-unquote-tokens): New function.
+
+ * gnus-msg.el (gnus-inews-do-gcc): Unquote gcc tokens.
+
+ * nnimap.el (nnimap-request-post): Ditto.
+
+2000-06-21 Simon Josefsson <jas@pdc.kth.se>
+
+ * gnus.el (gnus-asynchronous): Removed (defined in gnus-async.el).
+
+ * nnimap.el (nnimap-callback): Update for IMAP4rev1 servers (see
+ patch commited 2000-04-02).
+
+2000-06-20 Simon Josefsson <jas@pdc.kth.se>
+
+ * imap.el (imap-mailbox-examine-1): New function.
+ (imap-message-copyuid-1):
+ (imap-message-appenduid-1): Use it, instead of
+ `imap-mailbox-examine' which would utf-7 encode mailbox name
+ twice.
+
+2000-06-19 Dave Love <fx@gnu.org>
+
+ * mm-uu.el Don't require message. Require cl when compiling.
+
+2000-06-17 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * gnus-sum.el (gnus-summary-local-variables): gnus-orphan-score is
+ a local variable.
+ * gnus-sum.el (gnus-orphan-score): Move here.
+
+2000-06-10 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * message.el (message-forward): Remove show-mml condition.
+ (message-forward-ignored-headers): Remove X-Gnus headers.
+
+2000-06-08 Simon Josefsson <simon@josefsson.org>
+
+ * gnus-cus.el (gnus-extra-group-parameters): Add uidvalidity.
+
+2000-06-08 Urban Engberg <ue@ccieurope.com>
+
+ * gnus-demon.el (gnus-demon-scan-mail): Bind nnmail-fetched-sources.
+
+2000-06-08 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * message.el (message-syntax-checks): Add type.
+
+2000-06-07 Dave Love <fx@gnu.org>
+
+ * mm-view.el (mm-inline-image-emacs): Don't specify string for
+ put-image.
+ (mm-inline-image): Defalias, not fset.
+
+ * gnus.el (gnus-group-startup-message): Don't specify string for
+ insert-image.
+
+ * gnus-ems.el (gnus-add-minor-mode): Make it an alias if
+ add-minor-mode is available.
+ (gnus-article-display-xface): Don't specify string for
+ insert-image.
+
+2000-06-06 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * gnus-topic.el (gnus-topic-remove-topic): Set hidden.
+ (gnus-topic-insert-topic-line): Use shownp.
+ (gnus-topic-hide-topic): Don't use hidden.
+ (gnus-topic-show-topic): Don't use hidden.
+
+2000-06-06 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * gnus-cache.el (gnus-cache-possibly-enter-article): Bind coding
+ system.
+ * gnus-soup.el (gnus-soup-write-prefixes): Ditto.
+ * gnus-start.el (gnus-slave-save-newsrc): Ditto.
+ * gnus-util.el (gnus-output-to-rmail): Ditto.
+ (gnus-output-to-mail): Ditto.
+ (gnus-write-buffer): Ditto.
+ * gnus-uu.el (gnus-uu-save-article): Ditto.
+
+2000-06-04 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * message.el (message-read-from-minibuffer): Typo.
+
+2000-06-03 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * gnus-art.el (article-decode-charset): Override non-MIME forward
+ charset.
+
+2000-06-02 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * mml.el (mml-quote-region): Correct the regexp.
+ * gnus-msg.el (gnus-summary-reply): mml-quote it.
+
+2000-06-02 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * message.el (message-forward): Insert raw text.
+ * mml.el (mml-parse-1): Get raw text in unibyte mode.
+ (mml-generate-mime-1): Insert raw text in unibyte mode.
+
+2000-06-01 Florian Weimer <fw@deneb.cygnus.argh.org>
+
+ * mm-bodies.el (mm-body-encoding): Always encoded if
+ `mm-use-ultra-safe-encoding' is set.
+
+2000-05-31 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * mml.el (ange-ftp-name-format): Typo.
+
+2000-05-30 Simon Josefsson <jas@pdc.kth.se>
+
+ * gnus-start.el (gnus-get-unread-articles): If
+ `gnus-activate-group' and/or `gnus-check-server' return nil, don't
+ try to do anything on that server.
+
+2000-05-25 Simon Josefsson <jas@pdc.kth.se>
+
+ * gnus-group.el (gnus-group-nnimap-edit-acl): Help text updated
+ from latest draft.
+
+2000-05-08 Simon Josefsson <jas@pdc.kth.se>
+
+ * gnus-group.el (gnus-group-expire-articles-1): Make sure server
+ is open.
+
+2000-05-24 Dave Love <fx@gnu.org>
+
+ * mml.el (mml-parse-file-name): Fix ange-ftp part.
+
+2000-05-22 Didier Verna <didier@lrde.epita.fr>
+
+ * gnus.el (gnus-redefine-select-method-widget): new function, call
+ it once. Add an "other" entry for unknown but editable backend
+ name symbols.
+ * gnus-start.el (gnus-declare-backend): use it.
+
+2000-05-19 Dave Love <fx@gnu.org>
+
+ * gnus-art.el (gnus-article-next-page): Revert last change.
+
+2000-05-19 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * gnus-agent.el (gnus-agent-open-history): Open history in binary mode.
+
+2000-05-19 Dave Love <fx@gnu.org>
+
+ * gnus-art.el (gnus-mime-externalize-part): Bind mm-inlined-types,
+ not mm-inline-large-images.
+
+2000-05-19 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * mml.el (mml-parse-1): Don't test multiple-charsets within mml tag.
+
+2000-05-18 Dave Love <fx@gnu.org>
+
+ * gnus-art.el: Use defalias, not fset.
+ (gnus-article-x-face-command): Don't test for xbm.
+ (gnus-article-next-page): Redisplay before testing point in window.
+
+2000-05-17 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * gnus-group.el (gnus-group-mode-map): Add M-SPACE.
+ * mml.el (mml-mode-map): Comment out mml-narrow-to-part.
+
+2000-05-17 Jim Davidson <jdavidson@acm.org>
+
+ * gnus-sum.el (gnus-summary-save-article-rmail): Use
+ gnus-summary-save-in-rmail.
+ * message.el (message-output): Ditto.
+
+2000-05-18 Katsumi Yamaoka <yamaoka@jpl.org>
+
+ * gnus-art.el (gnus-emphasize-whitespace-regexp): Doc fix.
+
+2000-05-17 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * rfc2047.el (rfc2047-encode-message-header): Encode if the method
+ is a charset.
+ * message.el (message-send-news): Check group name charset.
+ * gnus-msg.el (gnus-post-news): Decode group name.
+ (gnus-inews-do-gcc): Encode group name.
+
+2000-05-17 Karl Kleinpaste <karl@charcoal.com>
+
+ * gnus-art.el (gnus-emphasize-whitespace-regexp): New variable.
+ * gnus-util.el (gnus-put-text-property-excluding-newlines): Use it.
+
+2000-05-17 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * gnus-group.el (gnus-group-mark-line-p): New function.
+ (gnus-group-goto-group): New parameter.
+ (gnus-group-remove-mark): Use it.
+ * gnus-topic.el (gnus-topic-move-group): Ditto.
+ (gnus-topic-remove-group): Ditto.
+
+2000-05-17 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * gnus-group.el (gnus-group-list-dormant): New function.
+
+2000-05-17 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * gnus-agent.el (gnus-agent-synchronize): Use
+ nnheader-insert-file-contents.
+ (gnus-agent-save-active-1): Ditto.
+ (gnus-agent-write-active): Ditto.
+ (gnus-agent-expire): Ditto.
+ * gnus-cache.el (gnus-cache-read-active): Ditto.
+ * gnus-start.el (gnus-master-read-slave-newsrc): Ditto.
+ * gnus-sum.el (gnus-summary-import-article): Ditto.
+
+ * gnus-agent.el (gnus-agent-write-servers): Bind coding-system.
+ (gnus-agent-save-group-info): Ditto.
+ (gnus-agent-save-alist): Ditto.
+ * gnus-util.el (gnus-make-directory): Ditto.
+
+ * gnus-agent.el (gnus-agent-save-group-info): Disable multibyte.
+
+2000-05-16 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * mml.el (mml-generate-mime-preprocess-function): New variable.
+ (mml-generate-mime-postprocess-function): New variable.
+ (mml-generate-mime-1): Use them.
+
+2000-05-16 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * gnus-group.el (gnus-group-apropos): Group name charset.
+ * gnus-sum.el (gnus-set-mode-line): Ditto.
+ * gnus-group.el (gnus-group-decoded-name): New function.
+ (gnus-group-edit-group): Use it.
+ * gnus-cus.el (gnus-group-customize): Use it.
+
+2000-05-16 Karl Kleinpaste <karl@charcoal.com>
+
+ * gnus-util.el (gnus-put-text-property-excluding-newlines): Improve.
+
+2000-05-16 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * gnus-group.el (gnus-group-name-charset-method-alist): New variable.
+ (gnus-group-name-charset-group-alist): Ditto.
+ (gnus-group-name-charset): New function.
+ (gnus-group-name-decode): New function.
+ (gnus-group-insert-group-line): Use them.
+ (gnus-group-prepare-flat-list-dead): Ditto.
+ (gnus-group-list-active): Ditto.
+ (gnus-group-describe-all-groups): Ditto.
+ (gnus-group-prepare-flat-list-dead-predicate): Ditto.
+ * gnus-srvr.el: (gnus-browse-foreign-server): Decode group name and
+ add gnus-group property.
+ (gnus-browse-group-name): Read gnus-group property.
+
+2000-05-16 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * nnfolder.el (nnfolder-possibly-change-group): Use
+ file-name-coding-system instead of pathname-coding-system.
+ * nnmail.el (nnmail-find-file): Ditto.
+ (nnmail-write-region): Ditto.
+ * nnmh.el (nnmh-retrieve-headers): Ditto.
+ (nnmh-request-article): Ditto.
+ (nnmh-request-group): Ditto.
+ (nnmh-request-list): Ditto.
+ (nnmh-possibly-change-directory): Ditto.
+ (nnmh-active-number): Ditto.
+ * nnml.el (nnml-possibly-change-directory): Ditto.
+ (nnml-request-list): Ditto.
+ (nnml-request-article): Ditto.
+ (nnml-retrieve-headers): Ditto.
+
+2000-05-16 Simon Josefsson <jas@pdc.kth.se>
+
+ * nnimap.el (nnimap-request-accept-article): Don't unselect
+ mailbox if no mailbox is selected.
+
+2000-05-15 Per Abrahamsen <abraham@dina.kvl.dk>
+
+ * gnus-art.el (gnus-button-url-regexp): Revert earlier change.
+ Recognize domain names starting with `www.' as starting an URL.
+
+2000-05-15 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * mail-source.el (mail-source-fetch-maildir): Insert "From ".
+ (mail-source-keyword-map): Add "subdirs" for maildir.
+
+2000-05-14 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * nnmail.el (nnmail-scan-directory-mail-source-once): New variable.
+ (nnmail-get-new-mail): Use it.
+ * gnus-start.el (gnus-get-unread-articles): Ditto.
+
+2000-05-14 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * gnus-sum.el (gnus-summary-edit-article): Better support for
+ nndraft:drafts.
+ * nndraft.el (nndraft-request-replace-article): New function,
+ bind nnmail-file-coding-system.
+
+2000-05-14 Dave Love <fx@gnu.org>
+
+ * nnheader.el: Replace uses of `fset' with `defalias'.
+ (jka-compr-compression-info-list): Only defvar when compiling.
+
+2000-05-14 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * webmail.el (webmail-netaddress-article): Refresh redirect.
+
+2000-05-13 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * mm-view.el (mm-inline-text): w3 might not recognize utf-8.
+
+2000-05-13 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * webmail.el: Translate to SP.
+
+2000-05-13 Robin S. Socha <robin@socha.net>
+
+ * message.el (message-bounce): Doc typo.
+
+2000-05-13 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * gnus-soup.el (gnus-soup-encoding-type): u is USENET news format.
+ (gnus-soup-store): Ditto.
+ (gnus-soup-send-packet): Ditto.
+ * nnsoup.el (nnsoup-replies-format-type): Ditto.
+ (nnsoup-dissect-buffer): Ditto.
+ (nnsoup-narrow-to-article): Ditto.
+ (nnsoup-make-active): Ditto
+
+2000-05-13 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * message.el (message-mode): Two parameters for local-variable-p.
+
+2000-05-13 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * message.el (message-strip-list-identifiers): New function.
+ (message-reply): Use it and use message-strip-subject-re.
+ (message-followup): Ditto.
+ * gnus-art.el (article-hide-list-identifiers): Remove more.
+ * gnus-sum.el (gnus-summary-remove-list-identifiers): Ditto.
+
+2000-05-13 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * gnus-uu.el (gnus-uu-digest-mail-forward): Bind
+ mail-parset-charset and use non-numeric argument.
+
+2000-05-12 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * mml.el (mml-buffer-list): New variable.
+ (mml-generate-new-buffer): New function.
+ (mml-destroy-buffers): Ditto.
+ (mml-insert-mime): Use them.
+ * gnus-msg.el (gnus-setup-message): mml-buffer leaks.
+ * gnus-sum.el (gnus-summary-edit-article): Ditto.
+ * message.el (message-mode): Ditto.
+ * gnus-uu.el (gnus-uu-digest-headers): Keep MIME headers.
+ (gnus-uu-save-article): Support show-as-mml.
+ * message.el (message-forward): Ditto.
+
+2000-05-12 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * nndoc.el (nndoc-type-alist): mime-digest head-begin.
+ (nndoc-mime-digest-type-p): Locate article head precisely.
+ * mml.el (mml-generate-default-type): New variable.
+ (mml-generate-mime-1): Use it.
+ (mml-insert-mime-headers): Use it.
+ * gnus-uu.el (gnus-uu-digest-buffer): New variable.
+ (gnus-uu-digest-mail-forward): Use it and call message-forward
+ with argument digest.
+ (gnus-uu-save-article): Support message-forward-as-mime.
+ * message.el (message-forward): Add parameter digest.
+ * mm-decode.el (mm-dissect-default-type): New variable.
+ (mm-dissect-buffer): Use it.
+
+2000-05-11 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * mml.el (mml-parse-singlepart-with-multiple-charsets): Set space,
+ newline and paragraph to nil when got a non-ascii character. Test
+ paragraph before newline.
+
+2000-05-10 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * qp.el (quoted-printable-encode-region): Bind tab-width to 1. Set
+ limit to 76.
+
+2000-05-10 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * nnslashdot.el (nnslashdot-sid-strip): New function.
+ (nnslashdot-threaded-retrieve-headers): New format.
+ (nnslashdot-sane-retrieve-headers): Ditto.
+ (nnslashdot-request-article): Ditto.
+ (nnslashdot-threaded-retrieve-headers): Thread properly.
+ (nnslashdot-request-article): Be more lenient.
+ (nnslashdot-threaded-retrieve-headers): Regexp search.
+
+2000-05-09 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * gnus-sum.el (gnus-with-article): Define it before use it.
+
+2000-05-09 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * message.el (message-supersede): Use mime-to-mml.
+ * mm-decode.el (mm-insert-part): Test the buffer if no encoding.
+
+2000-05-09 Katsumi Yamaoka <yamaoka@jpl.org>
+
+ * gnus-group.el (gnus-group-list-cached): Don't use
+ `subst-char-in-string'.
2000-05-08 Dave Love <fx@gnu.org>
- * pop3.el: Import changes from current Gnus.
- (pop3-open-server): Bind coding systems before creating buffer and
- fix creating its name.
- (pop3-string-to-list): Function deleted. Change callers to use
- split-string.
+ * pop3.el (pop3-open-server): Fix creating name of trace buffer.
+
+2000-05-08 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * mm-decode.el (mm-interactively-view-part): Append %s if the
+ method is a single word.
+ * nnwarchive.el (nnwarchive-type-definition): Typo.
+
+2000-05-07 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * gnus-group.el (gnus-group-prepare-flat-list-dead-predicate): New
+ function.
+ (gnus-group-prepare-flat-predicate): Use it.
+ (gnus-group-list-cached): List dead groups.
+
+2000-05-07 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * gnus-art.el (article-decode-charset): Don't decode message with
+ format.
+
+2000-05-07 Florian Weimer <fw@deneb.cygnus.argh.org>
+
+ * mailcap.el (mailcap-maybe-eval): Honor user request not to
+ evaluate the Lisp code.
+
+2000-05-06 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * gnus-art.el (article-wash-html): New function.
+ (gnus-article-wash-html): Bind.
+ (gnus-article-make-menu-bar): Menu item.
+ * gnus-sum.el (gnus-summary-wash-map): Bind 'h'.
+ (gnus-summary-make-menu-bar): Menu item.
+ * gnus.el: Autoload.
+
+2000-05-06 Florian Weimer <fw@deneb.cygnus.argh.org>
+
+ * gnus-uu.el (gnus-uu-unshar-warning): New variable.
+ (gnus-uu-unshar-article): Use it.
+
+ * mailcap.el (mailcap-maybe-eval-warning): New variable.
+ (mailcap-maybe-eval): Use it.
+
+ * gnus-msg.el (gnus-group-posting-charset-alist): Speling mistake
+ in docstring.
+
+ * mml.el (mml-generate-mime-1): Small comment.
+
+2000-05-05 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * gnus-art.el (article-de-base64-unreadable): New function.
+ (gnus-article-de-base64-unreadable): Bind.
+ (gnus-article-make-menu-bar): Menu item.
+ * gnus-sum.el (gnus-summary-wash-map): Bind '6' and 'Z'.
+ (gnus-summary-make-menu-bar): Menu item.
+ * gnus.el: Autoload.
+
+2000-05-05 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * gnus-sum.el (gnus-summary-show-article): Remove en/disable multibyte.
+ (gnus-summary-select-article): Add en/disable multibyte.
+
+2000-05-05 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * gnus-sum.el (gnus-summary-edit-article): Enable multibyte.
+ (gnus-summary-edit-article): New feature: editing raw articles.
+
+2000-05-05 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * rfc2047.el (rfc2047-encode-region): Insert a space before encoding.
+ Emacs MULE can not encode adjacent iso-2022-jp and cn-gb-2312.
+ * gnus-msg.el (gnus-summary-mail-forward): Use unibyte buffer.
+ Emacs MULE can not copy some 8bit characters in multibyte buffers.
+ * mm-decode.el (mm-insert-part): Ditto.
+
+2000-05-04 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * nndoc.el (nndoc-type-alist): Extend forward regexp.
+ (nndoc-forward-type-p): Ditto.
+
+2000-05-04 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * mm-util.el (mm-with-unibyte-current-buffer): Set the default
+ value of enable-multibyte-characters.
+
+2000-05-04 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * gnus-sum.el (gnus-summary-show-article): En/disable multibyte.
+
+2000-05-03 Dave Love <fx@gnu.org>
+
+ * gnus-ems.el (gnus-article-xface-ring-internal)
+ (gnus-article-xface-ring-size): New variable.
+ (gnus-article-display-xface): Use them to cache data. Don't try
+ to use XPM. Set up binary coding for PBM's sake.
+
+2000-05-03 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * gnus-msg.el (gnus-inews-do-gcc): Set mail-parse-charset.
+ * gnus-int.el (gnus-request-accept-article): Ditto.
+ (gnus-request-replace-article): Ditto.
+ * mm-util.el (mm-mime-mule-charset-alist): Add a fake mule-charset.
+
+2000-05-03 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * rfc2047.el (rfc2047-encode): Test the validity of coding-system.
+
+2000-05-03 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * rfc2047.el (rfc2047-encode-message-header): Encode field by
+ field.
+ * mml.el (mml-to-mime): Use message-default-charset.
+ (mml-preview): Narrow to headers.
+ * message.el (message-send-mail): Use message-default-charset.
+ (message-send-news): Narrow to headers;
+ use message-default-charset.
+
+2000-05-03 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * mm-bodies.el (mm-decode-content-transfer-encoding): A better junk
+ detect.
+ * mml.el (mml-parse-singlepart-with-multiple-charsets): Save
+ restriction.
+ (mml-parse-1): Warning message.
+ (mml-preview): Disable multibyte.
+
+2000-05-03 Dave Love <fx@gnu.org>
+
+ * gnus.el (gnus-group-startup-message): Add newline before image.
+
+2000-05-02 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * rfc2047.el (rfc2047-encode-message-header): Check the coding-system.
+ * message.el (message-send-mail): Use unibyte-buffer.
+ (message-send-mail): Ditto.
+
+2000-05-01 Lars Magne Ingebrigtsen <lmi@quimbies.gnus.org>
+
+ * gnus.el: Gnus v5.8.6 is released.
+
+2000-05-01 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * mml.el (mml-parse-1): Set no-markup-p and warn to nil.
+
+2000-04-28 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * rfc2047.el (rfc2047-q-encoding-alist): Encode HTAB.
+
+2000-04-28 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * message.el (message-send-mail-partially): Use forward-line.
+
+2000-04-28 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * gnus-art.el (gnus-mime-button-menu): Use call-interactively.
+
+2000-04-28 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * mml.el (mml-generate-mime-1): Ignore 0x1b.
+ (mml-insert-mime): No markup only for text/plain.
+ (mime-to-mml): Remove MIME headers.
+
+2000-04-28 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * mml.el (mml-preview): Set gnus-newsgroup-charset.
+ * rfc2047.el (rfc2047-encode-message-header): Encode non-ascii
+ as 8-bit.
+
+2000-04-28 Dave Love <fx@gnu.org>
+
+ * gnus.el (gnus-group-startup-message): Maybe use image in Emacs
+ 21.
+
+ * mailcap.el (mailcap-parse-mailcaps): Revert last change to
+ search order. Use parse-colon-path and remove some redundancy.
+ Doc fix.
+ (mailcap-parse-mimetypes): Code consistently with
+ mailcap-parse-mailcaps. Doc fix.
+
+ * gnus-start.el (gnus-unload): Iterate over `features', not
+ `load-history'.
+
+2000-04-28 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * mml.el (mml-parse-1): Don't create blank parts.
+ (mml-read-part): Fix mml tag.
+ (mml-insert-mime): Convert message/rfc822.
+ (mml-insert-mml-markup): Add mmlp parameter.
+
+2000-04-28 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * message.el (message-send-mail-partially): Remove CTE.
+
+2000-04-28 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * mm-view.el (mm-inline-image): Fset it.
+
+2000-04-28 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * nndoc.el (nndoc-type-alist): Change forward regexp.
+
+2000-04-27 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * message.el (message-send-mail-partially-limit): Change the
+ default value.
+
+2000-04-27 Erik Toubro Nielsen <erik@ifad.dk>
+
+ * gnus-util.el (gnus-extract-address-components): Name might be
+ "".
+
+2000-04-27 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * gnus-msg.el (gnus-summary-mail-forward): Use ARG.
+ (gnus-summary-post-forward): Ditto.
+ * message.el (message-forward-show-mml): New variable.
+ (message-forward): Use it.
+ * mml.el (mml-parse-1): Add tag mml.
+ (mml-read-part): Ditto.
+ (mml-generate-mime): Support reentance.
+ (mml-generate-mime-1): Support mml tag.
+
+2000-04-27 Dave Love <fx@gnu.org>
+
+ * gnus-art.el: Don't bother to require custom, browse-url.
+ (gnus-article-x-face-command): Include gnus-article-display-xface.
+
+ * gnus-ems.el: Assume only (X)Emacs 20+. Simplify XEmacs checks.
+ Use defalias, not fset.
+ (gnus-article-display-xface): New function.
+
+ * mm-view.el (mm-inline-image-emacs): Use put-image, remove-images.
+
+ * mm-decode.el: Small doc fixes. Require cl when compiling.
+ (mm-xemacs-p): Deleted.
+ (mm-get-image-emacs, mm-get-image-xemacs): Deleted.
+ (mm-get-image): Amalgamate Emacs and XEmacs code here; for Emacs,
+ use create-image and don't special-case xbm.
+ (mm-valid-image-format-p): Use display-graphic-p.
+
+2000-04-27 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * message.el (message-send-mail-partially-limit): New variable.
+ (message-send-mail-partially): New function.
+ (message-send-mail): Use it.
+ * mm-bodies.el (mm-decode-content-transfer-encoding): Remove
+ all blank lines inside of base64.
+ * mm-partial.el (mm-inline-partial): Add an option. Remove tail
+ blank lines.
+
+2000-04-27 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * mml.el (mml-insert-tag): Match more special characters.
+
+2000-04-27 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * gnus-msg.el (gnus-bug): Avoid attaching the external buffer.
+
+2000-04-27 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * mm-decode.el (mm-inline-media-tests): Add message/partial.
+ (mm-inlined-types): Ditto.
+ * mm-partial.el: New file.
+
+2000-04-27 Dave Love <fx@gnu.org>
+
+ * mailcap.el (mailcap-mime-data): Fix octet-stream syntax -- might
+ matter in Emacs 21.
+
+2000-04-26 Florian Weimer <fw@deneb.cygnus.argh.org>
+
+ * mm-bodies.el (mm-encode-body): Remove reference to
+ mm-default-charset in comment.
+
+2000-04-24 Bj\e,Av\e(Brn Torkelsson <torkel@hpc2n.umu.se>
+
+ * rfc2047.el (rfc2047-encode-message-header): Fixing typo.
+
+2000-04-26 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * gnus-draft.el (gnus-draft-send): Move gnus-draft-setup inside of
+ let.
+
+2000-04-26 Pavel Janik ml. <Pavel.Janik@inet.cz>
+
+ * gnus-draft.el (gnus-draft-setup): Fix comments.
+
+2000-04-26 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * nnmbox.el (nnmbox-create-mbox): Use nnmbox-file-coding-system,
+ if nnmbox-file-coding-system-for-write is nil.
+
+2000-04-26 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * gnus-msg.el (gnus-configure-posting-styles): Just remove the
+ header if nil.
+
+2000-04-26 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * mm-view.el (mm-inline-text): Insert directly if decoded.
+ * mml.el (autoload): Typo.
+
+2000-04-26 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * mml.el (mml-preview): Set up posting-charset.
+ * gnus-msg.el (gnus-group-posting-charset-alist): Add koi8-r.
+
+2000-04-25 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * webmail.el: Fix yahoo mail.
+
+2000-04-25 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * rfc2047.el (rfc2047-dissect-region): Don't include LWS ahead of
+ word if not necessary.
+ (rfc2047-encode-region): Put space between encoded words.
+
+2000-04-24 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * gnus-util.el (gnus-netrc-machine): Another default to nntp.
+
+2000-04-24 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * gnus-draft.el (gnus-draft-setup): Restore mml only when
+ required.
+ (gnus-draft-edit-message): Require restoration.
+
+2000-04-24 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * gnus-score.el (gnus-score-headers): Copy gnus-newsgrou-scored
+ back.
+
+2000-04-24 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * gnus-art.el (gnus-treat-article): Make sure that the summary
+ buffer is live.
+
+2000-04-24 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * mailcap.el (mailcap-parse-mailcaps): Reorder.
+ (mailcap-parse-mailcap): Backwards parsing.
+ (mailcap-possible-viewers): Remove nreverse.
+ (mailcap-mime-info): Ditto.
+ (mailcap-add-mailcap-entry): Keep alternative viewer.
+
+2000-04-24 Lars Magne Ingebrigtsen <lmi@quimbies.gnus.org>
+
+ * gnus.el: Gnus v5.8.5 is released.
+
+2000-04-24 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * rfc2047.el (rfc2047-header-encoding-alist): Doc fix.
+
+ * gnus-util.el (gnus-netrc-machine): Default to nntp.
+
+ * mml.el (mml-generate-mime-1): Force 8bit on message/rfc822.
+
+2000-04-24 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * mm-view.el (mm-inline-message): Disable prepare-hook.
+
+2000-04-23 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * gnus.el: Fix copyright statements.
+
+ * gnus-sum.el (gnus-alter-articles-to-read-function): New
+ variable.
+ (gnus-articles-to-read): Use it.
+
+ * message.el (message-get-reply-headers): Bind free variable.
+
+2000-04-23 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * message.el (message-get-reply-headers): Fix to-address.
+
+2000-04-23 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * webmail.el: Hotmail fix. Add a debug function.
+
+2000-04-23 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * gnus-sum.el (t): M-down and M-up.
+
+2000-04-22 Kai Gro\e,A_\e(Bjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE>
+
+ * gnus-sum.el: Doc fix.
+
+2000-04-22 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * nnwarchive.el (nnwarchive-egroups-article): Remove < and >.
+
+2000-04-22 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * nnweb.el (nnweb-dejanews-create-mapping): Remove the context
+ string.
+ (nnweb-request-group): Don't scan twice.
+ (nnweb-request-scan): Don't nix out the hashtb.
+
+ * message.el (message-get-reply-headers): Return a value.
+
+2000-04-22 David Aspinwall <aspinwall@TimesTen.com>
+
+ * gnus-art.el (gnus-button-url-regexp): New value to match naked
+ urls.
+
+2000-04-22 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * gnus-cache.el (gnus-summary-insert-cached-articles): Reverse the
+ order messages are inserted.
+
+ * mml.el (mml-generate-mime-1): rfc2047-encode the heads of
+ message/rfc822 parts.
+
+ * gnus-art.el (gnus-article-read-summary-keys): Check for
+ numerical values.
+
+ * message.el (message-get-headers): Made into own function.
+ (message-reply): Use it.
+ (message-get-reply-headers): Renamed.
+ (message-widen-reply): New command.
+
+2000-04-21 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * nntp.el (nntp-retrieve-data): Report the error and return nil.
+
+2000-04-21 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * mm-bodies.el (mm-decode-content-transfer-encoding): Don't remove
+ non-base64 text at the end if not found.
+
+2000-03-01 Simon Josefsson <jas@pdc.kth.se>
+
+ * gnus-sum.el (gnus-read-move-group-name):
+ (gnus-summary-move-article): Use `gnus-group-method' to find out
+ what method the manually entered group belong to.
+ `gnus-group-name-to-method' doesn't return any method parameters
+ and `gnus-find-method-for-group' uses `gnus-group-name-to-method'
+ for new groups so they wouldn't work.
+
+2000-04-22 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * gnus-msg.el (gnus-configure-posting-styles): Allow nil values to
+ override.
+
+2000-04-21 Kai Gro\e,A_\e(Bjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE>
+
+ * nnmail.el (nnmail-cache-insert): Does some stuff that is
+ probably good to do, or something. I dunno. I just write these
+ ChangeLog entries, and my name is Lars.
+
+1999-12-06 Hrvoje Niksic <hniksic@iskon.hr>
+
+ * message.el (message-caesar-region): Use translate-region.
+
+2000-04-21 Mike Fabian <mike.fabian@gmx.de>
+
+ * gnus-group.el (gnus-group-catchup-current): Doc fix.
+
+2000-04-21 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * gnus-art.el (gnus-article-setup-buffer): Don't kill local
+ variables, because that makes Emacs flash.
+
+ * gnus-group.el (gnus-group-insert-group-line): Don't call
+ gnus-group-add-icon unconditionally.
+
+ * gnus-group.el (gnus-group-glyph-directory): Don't depend on
+ xmas.
+ (gnus-group-glyph-directory): Removed.
+
+2000-04-21 Jaap-Henk Hoepman <hoepman@cs.utwente.nl>
+
+ * gnus-msg.el (gnus-inews-insert-archive-gcc): Don't do stuff if
+ gnus-newsgroup-name is "".
+
+2000-04-21 Florian Weimer <fw@deneb.cygnus.argh.org>
+
+ * mm-util.el (mm-mime-mule-charset-alist): Add support for UTF-8
+ in conjunction with MULE-UCS.
+
+1999-12-13 Per Abrahamsen <abraham@dina.kvl.dk>
+
+ * rfc2047.el (rfc2047-fold-region): Don't use the same break twice.
+
+1999-12-21 Jan Vroonhof <vroonhof@math.ethz.ch>
+
+ * message.el (message-shorten-references): Only cater to broken
+ INN for news. This caters for broken smtpd.
+
+2000-04-21 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * mailcap.el (mailcap-mime-info): Use the first match; not the
+ last.
+
+ * gnus-agent.el (gnus-category-kill): Save the category list.
+
+2000-04-21 Chris Brierley <brierley@pobox.com>
+
+ * gnus-sum.el (gnus-summary-move-article): Do something or other.
+
+2000-04-21 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * gnus-group.el (gnus-group-add-icon): Fixed indentation.
+
+2000-04-21 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * gnus-group.el (gnus-group-add-icon): Fixed indentation.
+
+2000-04-21 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * gnus-group.el (gnus-group-prepare-flat-predicate): New function.
+ (gnus-group-list-cached): Use it.
+
+2000-04-21 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * gnus.el: Update all the copyright notices.
+
+2000-04-21 Vladimir Volovich <vvv@vvv.vsu.ru>
+
+ * mm-bodies.el (mm-decode-content-transfer-encoding): Remove
+ non-base64 text at the end.
+
+2000-04-21 Katsumi Yamaoka <yamaoka@jpl.org>
+
+ * mm-bodies.el (mm-body-charset-encoding-alist): defcustomized.
+
+2000-04-21 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * nnheader.el: Don't autoload cancel-function-timers.
+
+ * message.el (message-fetch-field): Fold case.
+
+2000-04-21 <Kai.Grossjohann@CS.Uni-Dortmund.DE>
+
+ * message.el (message-forward-before-signature): New variable.
+
+2000-04-21 Alexandre Oliva <oliva@lsd.ic.unicamp.br>
+
+ * gnus-mlspl.el: Fix stuff.
+
+2000-04-21 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * gnus-sum.el (gnus-summary-update-article-line): Don't hide
+ subjects when unthreaded.
+
+2000-04-21 David S. Goldberg <dsg@mitre.org>
+
+ * gnus-art.el (gnus-boring-article-headers): Work on long CCs as
+ well.
+
+2000-04-21 Rui Zhu <sprache@iname.com>
+
+ * gnus-art.el (gnus-article-mode): Fix variable name.
+
+2000-04-21 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * mm-view.el: Fix autoload.
+
+ * flow-fill.el (flow-fill): Fix provide.
+
+ * gnus-draft.el (gnus-draft-send): Bind message-setup-hook to
+ nil.
+
+2000-04-21 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * gnus-win.el (gnus-configure-windows): Revert to switch-to-buffer.
+
+2000-04-21 Katsumi Yamaoka <yamaoka@jpl.org>
+
+ * gnus-util.el (gnus-netrc-machine): Didn't work.
+
+2000-04-20 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * gnus-draft.el (gnus-draft-setup): Restore to mml.
+
+2000-04-21 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * flow-fill.el: Renamed from fill-flowed.
+
+ * message.el (message-forward-ignored-headers): Default to
+ removing CTE.
+
+2000-04-21 <Kai.Grossjohann@CS.Uni-Dortmund.DE>
+
+ * message.el (message-mode): Don't fill headers.
+
+2000-04-21 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * message.el (message-pipe-buffer-body): Use shell
+
+2000-02-21 Yoshiki Hayashi <yoshiki@xemacs.org>
+
+ * nnvirtual.el (nnvirtual-request-article):
+ Bind gnus-override-method to nil.
+ (nnvirtual-request-update-mark): Don't update mark when
+ article is not there.
+
+2000-04-20 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * mm-uu.el (mm-uu-dissect): Check forwarded message.
+
+2000-04-20 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * gnus-util.el (gnus-parse-netrc): Allow "port".
+ (gnus-netrc-machine): Take a port param.
+ (gnus-netrc-machine):
+
+ * gnus-art.el (gnus-request-article-this-buffer): Allow
+ re-selecting referenced articles.
+
+ * message.el (message-cancel-news): Allow editing.
+ (message-cancel-message): Add newline.
+
+2000-04-20 William M. Perry <wmperry@aventail.com>
+
+ * mm-view.el (mm-inline-image-emacs): New function.
+
+2000-04-20 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * mail-source.el (mail-source-delete-incoming): Change default in
+ cvs.
+
+2000-04-20 Kim-Minh Kaplan <kmkaplan@vocatex.fr>
+
+ * gnus-art.el (gnus-mime-view-part-as-type-internal): New
+ function.
+
+2000-04-20 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * nnml.el (nnml-request-expire-articles): Use it.
+
+ * nnmail.el (nnmail-expiry-target): New variable.
+ (nnmail-expiry-target-group): New function.
+
+2000-04-20 Emerick Rogul <emerick@cs.bu.edu>
+
+ * message.el (message-forward): Add non-MIME separators.
+
+2000-04-20 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * message.el (message-generate-headers): Respect the syntax check
+ spec.
+
+ * gnus-sum.el (gnus-remove-thread-1): Show thread.
+ (gnus-remove-thread): Don't show all threads.
+
+2000-04-20 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
+
+ * gnus.el: Pterodactyl Gnus v5.8.4 is released.
+
+2000-04-19 Dave Love <fx@gnu.org>
+
+ * mailcap.el (mailcap-parse-mimetypes): Add ...mime.types.
+
+2000-04-18 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * nnwarchive.el (nnwarchive-type-definition): New egroups html.
+ (nnwarchive-egroups-*): Ditto.
+ (nnwarchive-url): Unibyte buffer and single line cookie.
+
+2000-04-14 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * mm-util.el (mm-char-or-char-int-p): New alias.
+ * nnweb.el (nnweb-decode-entities): Check the validity of numeric
+ entities.
+
+1999-11-30 Daiki Ueno <ueno@unixuser.org>
+
+ * lisp/imap.el (imap-body-lines): Check Content-Type: of the
+ article case insensitively.
+
+2000-04-10 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * mail-source.el (mail-source-fetch-webmail): Use the default
+ password provided in mail-sources; use webmail:subtype:user as
+ the key.
+
+2000-04-10 John Wiegley <johnw@gnu.org>
+
+ * mail-source.el (mail-source-fetch-webmail): Use
+ mail-source-password-cache.
+
+2000-04-09 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * webmail.el: Add netscape mail and fix HotMail mail.
+
+2000-04-08 Simon Josefsson <jas@pdc.kth.se>
+
+ * imap.el (imap-kerberos4-open): Work with recent `imtest's.
+
+2000-04-02 Simon Josefsson <jas@pdc.kth.se>
+
+ * nnimap.el (nnimap-request-article): Use BODY.PEEK[] instead of
+ RFC822.PEEK if server support IMAP4rev1.
+ (nnimap-request-body): Use BODY.PEEK[TEXT] instead of
+ RFC822.TEXT.PEEK if server support IMAP4rev1.
+ (nnimap-request-head): Use BODY.PEEK[HEADER] instead of
+ RFC822.HEADER if server support IMAP4rev1.
+ (nnimap-request-article-part): Support bodydetail in response
+ data.
+
+2000-03-11 Simon Josefsson <jas@pdc.kth.se>
+
+ * fill-flowed.el: New file.
+
+ * mm-decode.el (mm-dissect-singlepart): Create a MIME handle for
+ text/plain parts with `format' parameters.
+
+ * mm-view.el (autoload): Autoload fill-flowed.
+ (mm-inline-text): For "plain" parts with a format=flowed
+ parameter, call `fill-flowed'.
+
+2000-03-21 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * nnslashdot.el (nnslashdot-request-list): Fudge new-style
+ slashdot ids.
+
+2000-03-20 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * nnslashdot.el (nnslashdot-request-list): Use the new slashdot
+ format.
+
+2000-03-16 Simon Josefsson <jas@pdc.kth.se>
+
+ * imap.el: GSSAPI support, support kerberos 4 with Cyrus v1.6.x
+ `imtest' too.
+ (imap-kerberos4-program): Renamed from `imap-imtest-program'.
+ (imap-gssapi-program): New variable.
+ (imap-streams): Add gssapi.
+ (imap-stream-alist): Ditto.
+ (imap-authenticators): Ditto.
+ (imap-authenticator-alist): Ditto.
+ (imap-kerberos4-stream-p): Rename from `imap-kerberos4s-p'.
+ (imap-kerberos4-open): Loop over imtest programs, support Cyrus
+ 1.6.x `imtest' syntax.
+ (imap-gssapi-stream-p): New function.
+ (imap-gssapi-open): Ditto.
+ (imap-gssapi-auth-p): Ditto.
+ (imap-gssapi-auth): Ditto.
+ (imap-kerberos4-auth-p): Renamed from `imap-kerberos4a-p'.
+ (imap-send-command): Use buffer-local `imap-client-eol' value.
+
+ * nnimap.el (nnimap-retrieve-headers-progress): Fold continuation
+ lines and turn TAB into SPC before parsing.
+
+2000-03-15 Simon Josefsson <jas@pdc.kth.se>
+
+ * nnheader.el (nnheader-group-pathname): Make sure to return a
+ directory.
+ * nnmail.el (nnmail-group-pathname): Ditto.
+
+2000-02-08 Per Abrahamsen <abraham@dina.kvl.dk>
+
+ * nnmail.el (nnmail-fix-eudora-headers): Fix `In-Reply-To' too, it
+ might split in the middle of a message-id.
+
+2000-03-13 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * gnus-srvr.el (gnus-server-kill-server): Offer to kill all the
+ groups from the server.
+
+ * gnus-sum.el (gnus-summary-save-parts): Fix interactive spec.
+ (gnus-summary-toggle-header): Update the wash status.
+
+ * gnus-uu.el ((gnus-uu-extract-map "X" gnus-summary-mode-map)):
+ Moved here.
+
+ * gnus-agent.el (gnus-agent-save-group-info): Respect old
+ setting.
+
+ * nnmail.el (nnmail-get-active): Use it.
+ (nnmail-parse-active): New function.
+
+ * mm-view.el (mm-inline-text): Support the new version of
+ vcard.el.
+
+ * gnus-sum.el (gnus-summary-move-article): Only delete article
+ when moving junk.
+ (gnus-deaden-summary): Bury the buffer.
+
+ * nnmail.el (nnmail-group-pathname): Ditto.
+
+ * nnheader.el (nnheader-group-pathname): Use expand-file-name.
+
+2000-03-13 Christoph Rohland <hans-christoph.rohland@sap.com>
+
+ * rfc2047.el (rfc2047-encode-message-header): Encode no matter
+ whether Mule.
+
+2000-03-10 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * message.el (message-send-mail): Protect against unloaded Gnus.
+
+ * gnus-topic.el (gnus-topic-update-topic-line): Don't update the
+ parent.
+ (gnus-topic-update-topic-line): Yes, do.
+ (gnus-topic-goto-missing-group): Tally the correct number of
+ unread articles before inserting the topic line.
+
+2000-03-01 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * nnultimate.el (nnultimate-retrieve-headers): Ignore errors.
+
+2000-02-13 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * mm-decode.el (mm-dissect-buffer): Ditto.
+
+ * gnus-art.el (article-decode-charset): Strip CTE.
+
+ * ietf-drums.el (ietf-drums-strip): New function.
+
+ * gnus-sum.el (gnus-summary-move-article): Don't use the prefix
+ when prompting in read-only groups.
+
+2000-02-23 Simon Josefsson <jas@pdc.kth.se>
+
+ * imap.el (imap-send-command): Change EOL-chars when
+ `imap-client-eol' differs from default, not only for kerberos4.
+ (imap-mailbox-status): Get encoded mailbox's status.
+
+2000-02-19 Simon Josefsson <jas@pdc.kth.se>
+
+ * mail-source.el (mail-source-fetch-imap): Copy `imap-password'
+ into `mail-source-password-cache'.
+
+2000-02-17 Florian Weimer <fw@deneb.cygnus.argh.org>
+
+ * mm-util.el (mm-mime-charset): Check for presence of
+ `coding-system-get' and `get-charset-property' (recent XEmacs has
+ the former, but not the latter).
+
+2000-01-28 Dave Love <fx@gnu.org>
+
+ * message.el (message-check-news-header-syntax): Fix typo
+ `newsgroyps'.
+ (message-talkative-question): Put temp buffer in fundamental-mode.
+ (message-recover): Use fundamental-mode in the right buffer.
+
+ * nnmail.el (nnmail-split-history): Use fundamental-mode in the
+ right buffer.
+
+2000-01-26 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * qp.el (quoted-printable-decode-region): Add charset parameter.
+ (quoted-printable-decode-string): Ditto.
+
+ * gnus-art.el (article-de-quoted-unreadable): Use it.
+
+2000-01-21 Simon Josefsson <jas@pdc.kth.se>
+
+ * nnimap.el (nnimap-split-predicate): New variable.
+ (nnimap-split-articles): Use it.
+
+2000-01-20 Simon Josefsson <jas@pdc.kth.se>
+
+ * utf7.el: Change email address.
+
+2000-01-18 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * gnus-group.el (gnus-group-catchup): Purge split history.
+
+2000-01-14 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * nnmail.el (nnmail-generate-active): Support extended group name.
+ (nnmail-get-active): Ditto.
+
+2000-01-13 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * gnus-agent.el (gnus-agent-write-active): Since no prefix in
+ group names, don't remove anything.
+
+2000-01-13 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * webmail.el (webmail-my-deja-open): My-deja changes.
+
+2000-01-13 Simon Josefsson <jas@pdc.kth.se>
+
+ * nnimap.el (nnimap-retrieve-headers-progress): Create xref field.
+
+2000-01-10 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * gnus-agent.el (gnus-agent-fetch-headers): Translate full path.
+
+2000-01-09 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * gnus.el (gnus-other-frame): Fix typo.
+
+1999-06-25 Andreas Jaeger <aj@arthur.rhein-neckar.de>
+
+ * gnus-cus.el (gnus-group-customize): Fix typo.
+
+2000-01-08 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * nnweb.el (nnweb-insert): Simplified.
+
+2000-01-06 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * gnus-art.el (gnus-article-mode-map): "e" is
+ gnus-summary-edit-article.
+
+2000-01-06 Jari Aalto <jari.aalto@poboxes.com>
+
+ * mailcap.el (mailcap-mime-extensions): Add .diff.
+
+2000-01-06 Kim-Minh Kaplan <kmkaplan@vocatex.fr>
+
+ * mm-decode.el (mm-mailcap-command): handle "%%" and the case where
+ there is no "%s" in the method.
+
+2000-01-08 Kim-Minh Kaplan <kmkaplan@vocatex.fr>
+
+ * gnus-sum.el (gnus-summary-select-article): Return 'old.
+
+2000-01-06 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * nnfolder.el (nnfolder-read-folder): Use nnfolder-save-buffer.
+
+ * gnus.el: Really always pop up a new frame.
+
+ * parse-time.el (parse-time-rules): Allow 100-110 to be
+ 2000-2010.
+
+ * time-date.el (date-to-time): Don't use timezone.
+
+2000-01-06 Dave Love <fx@gnu.org>
+
+ * time-date.el: Add keywords.
+ (date-to-time): Add autoload cookie. Canonicalize with
+ timezone-make-date-arpa-standard.
+ (time-to-seconds): Avoid caddr.
+ (safe-date-to-time): Add autoload cookie.
+
+2000-01-05 BrYan P. Johnson <beej@mindspring.net>
+
+ * gnus-group.el (gnus-group-line-format-alist): Added %E for
+ eyecandy.
+ (gnus-group-insert-group-line): Now groks %E and inserts icon in
+ group line using gnus-group-add-icon.
+ (gnus-group-icons): Added customize group.
+ (gnus-group-icon-list): Added variable.
+ (gnus-group-glyph-directory): Added variable.
+ (gnus-group-icon-cache): Added variable.
+ (gnus-group-running-xemacs): Added variable.
+ (gnus-group-add-icon): Added function. Add an icon to the current
+ line according to gnus-group-icon-list.
+ (gnus-group-icon-create-glyph): Added function.
+
+2000-01-05 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * gnus-sum.el (gnus-summary-select-article): Return whether we
+ selected something new.
+ (gnus-summary-search-article): Start searching at the window
+ point.
+
+ * gnus-group.el (gnus-fetch-group): Complete over
+ gnus-active-hashtb.
+
+2000-01-05 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
+
+ * gnus.el: Pterodactyl Gnus v5.8.3 is released.
+
+2000-01-05 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * gnus-sum.el (gnus-preserve-marks): New variable.
+ (gnus-summary-move-article): Use it.
+ (gnus-group-charset-alist): Added more entries.
+
+2000-01-03 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * mm-decode.el (mm-inline-override-types): Removed duplicate.
+
+ * gnus-uu.el (gnus-uu-mark-over): Use gnus-summary-default-score
+ as the default score.
+
+ * gnus-score.el (gnus-score-delta-default): Changed name.
+
+2000-01-04 Simon Josefsson <jas@pdc.kth.se>
+
+ * imap.el (imap-parse-literal):
+ (imap-parse-flag-list): Don't care about props.
+ (imap-parse-string): Handle quoted characters.
+
+2000-01-02 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * gnus-sum.el (gnus-summary-goto-unread): Doc fix.
+ (gnus-summary-mark-article): Doc fix.
+ (gnus-summary-mark-forward): Doc fix.
+ (t): Changed keystroke for gnus-summary-customize-parameters.
+
+ * gnus-art.el (gnus-article-mode-map): Use gnus-article-edit for
+ "e".
+ (gnus-article-mode-map): No, don't.
+
+ * gnus-sum.el (gnus-summary-next-subject): Don't show the thread
+ of the final article.
+
+ * mm-decode.el (mm-interactively-view-part): Error on no method.
+
+2000-01-02 Stefan Monnier <monnier+gnu/emacs@tequila.cs.yale.edu>
+
+ * gnus-score.el (gnus-score-insert-help): Something.
+
+ * gnus-art.el (gnus-button-alist): Exclude < from <URL:
+
+ * gnus-win.el (gnus-configure-frame): Ditto.
+
+ * gnus-mh.el (gnus-summary-save-in-folder): Use
+ with-current-buffer.
+
+2000-01-02 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * nnwarchive.el: Changed file perms.
+
+1999-12-19 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * gnus-group.el (gnus-group-delete-groups): New command.
+ (gnus-group-delete-group): Extra no-prompt parameters.
+
+1999-12-14 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * nnslashdot.el (nnslashdot-request-article): Translate <br> into
+ <p>.
+
+1999-12-28 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * webmail.el (webmail-hotmail-article): Don't insert message id.
+
+1999-12-28 Kai.Grossjohann@CS.Uni-Dortmund.DE (Kai Gro\e,A_\e(Bjohann)
+
+ * nnimap.el (nnimap-split-fancy): New variable.
+ (nnimap-split-fancy): New function.
+
+1999-12-28 Simon Josefsson <jas@pdc.kth.se>
+
+ (nnimap-split-rule): Document symbol value.
+
+1999-12-28 Simon Josefsson <jas@pdc.kth.se>
+
+ * nnimap.el (nnimap-retrieve-headers-progress): Let
+ `nnheader-parse-head' parse article.
+ (nnimap-retrieve-headers-from-server): Don't request ENVELOPE,
+ request headers needed by `nnheader-parse-head'.
+
+1999-12-23 Florian Weimer <fw@s.netic.de>
+
+ * gnus-msg.el (gnus-group-posting-charset-alist): Correct default
+ value (crosspostings are handled), improve documentation.
+
+ * nnultimate.el: Declare file coding system as iso-8859-1.
+
+ * message.el: Dito.
+
+ * gnus-cite.el: Dito.
+
+ * gnus-spec.el: Dito.
+
+1999-12-21 Florian Weimer <fw@s.netic.de>
+
+ * gnus-msg.el (gnus-group-posting-charset-alist): New layout.
+ (gnus-setup-message): No longer make `message-posting-charset'
+ buffer-local.
+ (gnus-setup-posting-charset): Reflect the new layout of
+ `gnus-group-posting-charset-alist' and `message-posting-charset'.
+
+ * message.el (message-send-mail): Bind `message-this-is-mail' and
+ `message-posting-charset'.
+ (message-send-news): Dito, and honour new layout of
+ `message-posting-charset'.
+ (message-encode-message-body): Ignore `message-posting-charset'.
+
+ * mm-bodies.el (mm-body-encoding): Consider
+ `message-posting-charset' when deciding whether to use 8bit.
+
+ * rfc2047.el (rfc2047-encode-message-header): Back out change.
+ (rfc2047-encodable-p): Now solely for headers; use
+ `message-posting-charset'.
+
+1999-12-20 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * nnwarchive.el (nnwarchive-type-definition): Set default value.
+
+1999-12-19 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * nnagent.el (nnagent-server-opened): Optional.
+ (nnagent-status-message): Optional.
+
+1999-12-19 Simon Josefsson <jas@pdc.kth.se>
+
+ * gnus-cite.el (gnus-article-toggle-cited-text): Restore beg and
+ end (referenced by instructions in
+ `gnus-cited-opened-text-button-line-format-alist').
+
+1999-12-18 Simon Josefsson <jas@pdc.kth.se>
+
+ * imap.el (imap-starttls-open): Typo.
+
+1999-12-18 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * mm-util.el (mm-charset-after): Non-MULE case.
+ * mail-prsvr.el (mail-parse-mule-charset): New variable.
+ * rfc2047.el (rfc2047-dissect-region): Bind it.
+
+1999-12-18 Florian Weimer <fw@s.netic.de>
+
+ * mml.el (mml-generate-multipart-alist): Correct default value.
+
+ * mm-encode.el (mm-use-ultra-safe-encoding): New variable.
+ (mm-safer-encoding): New function.
+ (mm-content-transfer-encoding): Use both.
+
+ * mm-bodies.el (mm-body-encoding): Use mm-use-ultra-safe-encoding.
+ * qp.el (quoted-printable-encode-region): Dito.
+
+1999-12-18 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * webmail.el (webmail-hotmail-article): Snarf the raw file.
+
+1999-12-18 Victor S. Miller <victor@idaccr.org>
+
+ * webmail.el (webmail-hotmail-list): raw=0.
+
+1999-12-18 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * gnus-agent.el (gnus-agent-enter-history): Back-compatible in
+ group name.
+
+1999-12-18 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * gnus-agent.el (gnus-agent-expire): Convert to symbol if stringp.
+
+1999-12-18 Simon Josefsson <jas@pdc.kth.se>
+
+ * imap.el: Don't autoload digest-md5.
+ (imap-starttls-open): Bind coding-system-for-{read,write}.
+ (imap-starttls-p): Check if we can find starttls.el.
+ (imap-digest-md5-p): Check if we can find digest-md5.el.
+
+1999-11-30 Daiki Ueno <ueno@ueda.info.waseda.ac.jp>
+
+ * imap.el: Require `digest-md5' when compiling; add autoload
+ settings for `digest-md5-parse-digest-challenge',
+ `digest-md5-digest-response', `starttls-open-stream' and
+ `starttls-negotiate'.
+ (imap-authenticators): Add `digest-md5'.
+ (imap-authenticator-alist): Setup for `digest-md5'.
+ (imap-digest-md5-p): New function.
+ (imap-digest-md5-auth): New function.
+ (imap-stream-alist): Add STARTTLS entry.
+ (imap-starttls-p): New function.
+ (imap-starttls-open): New function.
+
+1999-12-18 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * gnus-agent.el (gnus-agent-enter-history): Bad group name.
+
+1999-12-17 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * rfc2047.el (rfc2047-dissect-region): Use mapcar instead of
+ string-to-x function.
+
+1999-12-17 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * rfc2047.el (rfc2047-fold-region): Fold a line more than once.
+
+1999-12-17 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * webmail.el: Enhance hotmail-snarf.
+
+1999-12-17 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * rfc2047.el (rfc2047-dissect-region): Rewrite.
+
+1999-12-16 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * webmail.el (webmail-hotmail-list): Search no-error.
+
+1999-12-15 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * nnwarchive.el: Support nov-is-evil.
+ * gnus-bcklg.el (gnus-backlog-request-article): Buffer is optional.
+ Set it if non-nil.
+ * gnus-agent.el (gnus-agent-fetch-articles): Use it.
+
+1999-12-15 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * nnagent.el (nnagent-server-opened): Redefine.
+ (nnagent-status-message): Ditto.
+
+1999-12-14 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * rfc1843.el (rfc1843-decode-region): Use
+ buffer-substring-no-properties.
+ * gnus-art.el (article-decode-HZ): New function.
+
+1999-12-14 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * nnheader.el (nnheader-translate-file-chars): Only in full path.
+
+1999-12-14 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * mm-util.el (mm-find-charset-region): mail-parse-charset is a
+ MIME charset not a MULE charset.
+
+1999-12-14 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * gnus-ems.el: Translate more ugly characters.
+ * nnheader.el (nnheader-translate-file-chars): Don't translate
+ the second ':'.
+
+1999-12-14 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * gnus-art.el (gnus-request-article-this-buffer): Use all refer
+ method if cannot find the article.
+
+1999-12-14 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * gnus-art.el (gnus-request-article-this-buffer): Don't use refer
+ method if overrided.
+
+1999-12-13 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * mail-source.el (mail-source-fetch-webmail): Parameter
+ dontexpunge.
+
+1999-12-13 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * webmail.el: Support my-deja. Better error report.
+
+1999-12-13 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * nnslashdot.el (nnslashdot-date-to-date): Error proof when input
+ is bad.
+ * gnus-sum.el (gnus-list-of-unread-articles): When (car read)
+ is not 1.
+
+1999-12-13 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * nnslashdot.el (nnslashdot-request-article): A space.
+
+1999-12-13 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * nnagent.el: Support different backend with same name.
+
+1999-12-13 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * nnslashdot.el (nnslashdot-threaded-retrieve-headers): Support
+ archived group.
+ (nnslashdot-sane-retrieve-headers): Ditto.
+ (nnslashdot-request-article): Ditto.
+
+1999-12-13 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * nnweb.el (nnweb-insert): Narrow to point.
+
+1999-12-13 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * nnweb.el (nnweb-insert): Follow refresh url.
+ * nnslashdot.el: Use it.
+
+1999-12-13 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * nnweb.el (nnweb-decode-entities): Decode numerical entities.
+ (nnweb-decode-entities-string): New function.
+
+ * nnwarchive.el (nnwarchive-decode-entities-string): Rename to
+ nnweb-* and move to nnweb.el.
+ * nnwarchive.el: Use nnweb-decode-entities, etc.
+ * webmail.el: Ditto.
+
+ * nnslashdot.el: Use nnweb-decode-entities-string.
+ (nnslashdot-decode-entities): Remove.
+
+1999-12-13 Eric Marsden <emarsden@mail.dotcom.fr>
+
+ * nnslashdot.el: Decode entities.
+
+1999-12-12 Dave Love <fx@gnu.org>
+
+ * gnus-agent.el (gnus-category-edit-groups)
+ (gnus-category-edit-score, gnus-category-edit-predicate): Replace
+ expansion of setf, fixed.
+
+1999-12-12 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * gnus-agent.el: Revoke last Dave Love's patch, because of
+ incompatibility of XEmacs.
+
+1999-12-12 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * mm-uu.el: Change headers.
+ * rfc1843.el: Ditto.
+ * uudecode.el: Ditto.
+
+1999-12-07 Dave Love <fx@gnu.org>
+
+ * gnus-agent.el (gnus-category-edit-predicate)
+ (gnus-category-edit-score, gnus-category-edit-score): Expand setf
+ inside backquote to avoid it at runtime.
+
+1999-12-07 Dave Love <fx@gnu.org>
+
+ * binhex.el: Require cl when compiling.
+
+1999-12-04 Dave Love <fx@gnu.org>
+
+ * gnus-cus.el (gnus-group-parameters): Allow nil for banner.
+
+1999-12-04 Dave Love <fx@gnu.org>
+
+ * mm-util.el (mm-delete-duplicates): New function.
+ (mm-write-region): Use it.
+
+ * mml.el (mml-minibuffer-read-type): Use mm-delete-duplicates.
+
+ * mailcap.el (mailcap-mime-types): Require mm-util. Use
+ mm-delete-duplicates.
+
+ * imap.el (imap-open, imap-debug): Avoid mapc.
+
+ * nnvirtual.el (nnvirtual-create-mapping): Likewise.
+
+ * gnus-sum.el (gnus-summary-exit-no-update): Avoid copy-list.
+ (gnus-multi-decode-encoded-word-string): Avoid mapc.
+
+ * gnus-start.el (gnus-site-init-file): Avoid ignore-errors at
+ runtime.
+
+ * gnus.el (gnus-select-method): Likewise.
+
+ * nnheader.el (nnheader-nov-read-integer): Likewise.
+
+ * mm-view.el (mm-inline-message): Require cl when compiling.
+ Avoid ignore-errors at runtime.
+ (mm-inline-text): Avoid mapc.
+
+1999-12-12 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * gnus-art.el (article-decode-charset): Widen is bad.
+
+1999-12-12 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * mm-util.el (mm-charset-after): `charset-after' may not be defined.
+
+1999-12-12 Florian Weimer <fw@s.netic.de>
+
+ * rfc2047.el (rfc2047-encodable-p): New parameter header used to
+ indicate that only US-ASCII is permitted.
+ (rfc2047-encode-message-header): Use it. Now, Gnus should never
+ use unencoded 8-bit characters in message headers.
+
+1999-12-12 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * ietf-drums.el (ietf-drums-narrow-to-header): Make it work with
+ CRLF.
+
+1999-12-11 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * webmail.el: Require url-cookie.
+
+1999-12-11 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * nnwarchive.el (nnwarchive-make-caesar-translation-table): A
+ new function to make modified caesar table.
+ (nnwarchive-from-r13): Use it.
+ (nnwarchive-mail-archive-article): Improved.
+
+1999-12-11 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * webmail.el (webmail-url): Use mm-with-unibyte-current-buffer.
+
+1999-12-10 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * nnweb.el (nnweb-request-article): Return cons.
+
+1999-12-10 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * gnus-sum.el (gnus-summary-setup-default-charset): Typo.
+
+1999-12-10 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * mm-util.el (mm-with-unibyte): New macro.
+ * nnweb.el (nnweb-init): Use it.
+
+1999-12-09 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * mm-util.el (mm-charset-after): New function.
+ (mm-find-mime-charset-region): Set charsets after
+ delete-duplicates and use find-coding-systems-region.
+ (mm-find-charset-region): Remove composition.
+
+ * mm-bodies.el (mm-encode-body): Use mm-charset-after.
+
+ * mml.el (mml-parse-singlepart-with-multiple-charsets): Ditto.
+
+1999-12-09 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * mm-util.el (mm-find-mime-charset-region): Revoke last change.
+ * mml.el (mml-confirmation-set): New variable.
+ (mml-parse-1): Ask user to confirm.
+
+1999-12-09 Simon Josefsson <jas@pdc.kth.se>
+
+ * gnus-start.el (gnus-get-unread-articles): Make sure all methods
+ are scanned when we have directory mail-sources (the mail source
+ is modified in that case, so we must scan it for all
+ groups/methods).
+
+1999-12-09 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * nnml.el (nnml-request-move-article): Save nnml-current-directory
+ and nnml-article-file-alist.
+
+1999-12-09 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * gnus-group.el (gnus-group-get-new-news-this-group): Binding
+ nnmail-fetched-sources.
+
+1999-12-09 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * mm-util.el (mm-find-charset-region): Use the last charset.
+
+1999-12-08 Per Abrahamsen <abraham@dina.kvl.dk>
+
+ * gnus.el (gnus-select-method): Made the option list prettier.
+
+1999-12-08 Florian Weimer <fw@s.netic.de>
+
+ * gnus-msg.el (gnus-group-posting-charset-alist): Use iso-8859-1
+ for the `de' newsgroups hierarchy, as it is common practice there.
+
+
+1999-12-07 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * nnwarchive.el (nnwarchive-mail-archive-article): Fix
+ buffer-string arguments. Fix references.
+
+1999-12-07 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * gnus-agent.el (gnus-agent-confirmation-function): New variable.
+ (gnus-agent-batch-fetch): Use it.
+ (gnus-agent-fetch-session): Use it.
+
+1999-12-07 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * mm-util.el (mm-find-mime-charset-region): Delete nil.
+
+1999-12-07 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * mm-util.el (mm-find-charset-region): Don't capitalize. Delete
+ nil.
+
+1999-12-07 Per Abrahamsen <abraham@dina.kvl.dk>
+
+ * nnslashdot.el (nnslashdot-request-list): There were two
+ top-level body-forms. Put a `progn' around them.
+
+ * gnus.el (gnus-select-method): Use `condition-case'
+ instead of `ignore-errors', since cl may not be loaded when the
+ form is evaluated.
+
+1999-12-06 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * nnwarchive.el: Support www.mail-archive.com.
+
+1999-12-06 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * nnmail.el (nnmail-get-new-mail): Remove fetched sources before
+ do anything.
+
+1999-12-06 Simon Josefsson <jas@pdc.kth.se>
+
+ * utf7.el: New file, written by Jon K Hellan.
+
+ * imap.el (imap-use-utf7): Renamed from `imap-utf7-p', change
+ default to t.
+
+1999-12-06 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * nnslashdot.el (nnslashdot-request-delete-group): New function.
+
+ * gnus-sum.el (gnus-summary-refer-article): Work for lists with
+ current.
+ (gnus-refer-article-methods): New function.
+ (gnus-summary-refer-article): Use it.
+
+1999-11-13 Simon Josefsson <jas@pdc.kth.se>
+
+ * nnimap.el (nnimap-retrieve-groups): Return active format.
+
+ * nnimap.el (nnimap-replace-in-string): Removed.
+ (nnimap-request-list):
+ (nnimap-retrieve-groups):
+ (nnimap-request-newgroups): Quote group instead of escaping SPC.
+
+1999-12-05 Simon Josefsson <jas@pdc.kth.se>
+
+ * imap.el: Use format-spec for ssl program.
+ * imap.el (imap-ssl-arguments): Removed.
+ (imap-ssl-open-{1,2}): Removed.
+
+1999-12-04 Per Abrahamsen <abraham@dina.kvl.dk>
+
+ * gnus-start.el (gnus-site-init-file): Use `condition-case'
+ instead of `ignore-errors', since cl may not be loaded when the
+ form is evaluated.
+
+1999-12-04 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * mm-bodies.el (mm-8bit-char-regexps): Removed.
+ (mm-7bit-chars): New variable.
+ (mm-body-7-or-8): Use it in both cases.
+
+1999-12-04 Michael Welsh Duggan <md5i@cs.cmu.edu>
+
+ * gnus-start.el (gnus-site-init-file): Don't use cl macros in
+ defcustom definitions.
+
+1999-12-04 Simon Josefsson <jas@pdc.kth.se>
+
+ * mm-decode.el (mm-display-part): Let mm-display-external return
+ inline or external.
+ (mm-display-external): For copiousoutput methods, insert output in
+ buffer.
+
+1999-12-04 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * nntp.el (nntp-retrieve-headers-with-xover): Goto the end of
+ buffer.
+
+1999-12-04 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * gnus-audio.el: An M too far.
+
+ * gnus-msg.el (gnus-setup-message): One backtick too many.
+
+ * gnus-art.el (gnus-mime-view-part-as-type): mailcap-mime-types is
+ a function, not a variable.
+
+1999-12-04 Max Froumentin <masmef@maths.bath.ac.uk>
+
+ * gnus-score.el (gnus-score-body): Widen before requesting.
+
+1999-12-04 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * gnus-group.el (gnus-group-prepare-flat): Comment fix.
+
+1999-12-04 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * mail-source.el (mail-source-fetch-webmail): Bind
+ mail-source-string.
+
+1999-12-04 Matt Swift <swift@alum.mit.edu>
+
+ * gnus-uu.el (gnus-uu-mark-by-regexp): Doc fix.
+ (gnus-uu-unmark-by-regexp): Ditto.
+
+ * gnus-group.el (gnus-group-catchup-current): Would bug out on
+ dead groups.
+
+1999-12-04 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * gnus-msg.el (gnus-setup-message): Allow the charset setting to
+ do their real thing.
+
+ * nnmh.el (nnmh-be-safe): Doc fix.
+
+ * gnus-sum.el (gnus-summary-exit): Write cache active file.
+
+ * nntp.el (nntp-retrieve-headers-with-xover): Make sure the entire
+ status line has arrived before we count it.
+
+ * mailcap.el (mailcap-mime-data): Removed save-file from audio/*.
+
+ * gnus-sum.el (gnus-thread-header): Fixed after indent.
+ Whitespace problems.
+
+ * gnus-win.el (gnus-configure-windows): Error fix.
+
+ * gnus-demon.el (gnus-demon-add-nntp-close-connection): Add the
+ right function.
+
+ * gnus.el: Fixed all the doc strings to match the FSF convetions.
+ Indent all functions. Fix all comments to match the comment
+ conventions. Double-space after full stop.
+
+1999-12-04 YAMAMOTO Kouji <kouji@pobox.com>
+
+ * nnmail.el (nnmail-split-it): I redefined nnmail-split-fancy's
+ value to divide received mails into my favorite groups and I met
+ an error. It takes place if the length of a element "VALUE" in
+ nnmail-split-fancy is less than two.
+
+1999-10-10 Robert Bihlmeyer <robbe@orcus.priv.at>
+
+ * mml.el (mml-insert-part): New function.
+
+1999-12-02 Dave Love <fx@gnu.org>
+
+ * mm-decode.el: Customize.
+
+1999-12-03 Dave Love <fx@gnu.org>
+
+ * nnslashdot.el, nnultimate.el: Don't lose at compile time when
+ the W3 stuff isn't available.
+
+1999-12-03 Dave Love <fx@gnu.org>
+
+ * imap.el, mailcap.el, nnvirtual.el, rfc2104.el: Don't require cl
+ at runtime.
+
+1999-12-04 Dan Christensen <jdc@jhu.edu>
+
+ * gnus-score.el (gnus-score-headers): Fix orphan scoring.
+
+1999-12-01 Andrew Innes <andrewi@gnu.org>
+
+ * nnmbox.el (nnmbox-read-mbox): Count messages correctly, and
+ don't be fooled by "From nobody" lines added by respooling.
+
+ * pop3.el (pop3-movemail): Write crashbox in binary.
+ (pop3-get-message-count): New function.
+
+ * mail-source.el (mail-source-primary-source): New variable.
+ (mail-source-report-new-mail-interval): New variable.
+ (mail-source-idle-time-delay): New variable.
+ (mail-source-new-mail-available): New internal variable.
+ (mail-source-fetch-pop): Clear new mail flag, when mail from
+ primary source has been fetched.
+ (mail-source-check-pop): New function.
+ (mail-source-new-mail-p): New function.
+ (mail-source-start-idle-timer): New function.
+ (mail-source-report-new-mail): New function.
+ (mail-source-report-new-mail): New internal variable.
+ (mail-source-report-new-mail-timer): New internal variable.
+ (mail-source-report-new-mail-idle-timer): New internal variables.
+
+1999-12-04 Andreas Schwab <schwab@suse.de>
+
+ * gnus-cus.el (gnus-group-customize): Customize fix.
+
+1999-12-04 Andrea Arcangeli <andrea@suse.de>
+
+ * message.el (message-send-mail-with-sendmail): Use
+ message-make-address.
+
+1999-12-03 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
+
+ * gnus.el: Pterodactyl Gnus v5.8.2 is released.
+
+1999-12-03 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
+
+ * gnus.el: Pterodactyl Gnus v5.8.1 is released.
+
+1999-11-11 Hrvoje Niksic <hniksic@iskon.hr>
+
+ * mml.el (mml-insert-tag): Don't close the tag.
+ (mml-insert-empty-tag): New function.
+ (mml-attach-file): Use mml-insert-empty-tag instead of
+ mml-insert-tag.
+ (mml-attach-buffer): Ditto.
+ (mml-attach-external): Ditto.
+ (mml-insert-multipart): Ditto.
+
+1999-12-03 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * nnfolder.el (nnfolder-request-article): Return -1 if not find
+ the article number.
+
+1999-12-03 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * gnus.el (gnus-find-method-for-group): The method of a new group
+ is not the native one.
+
+1999-12-03 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * gnus-art.el (gnus-button-embedded-url): Always call browse-url.
+
+1999-12-02 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * nnultimate.el (nnultimate-retrieve-headers): Use
+ mm-with-unibyte-current-buffer.
+ (nnultimate-request-article): Ditto.
+
+1999-12-02 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * nntp.el (nntp-retrieve-groups): Set to process buffer.
+
+1999-12-02 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * mm-util.el (mm-with-unibyte-current-buffer): New macro.
+ * nnweb.el (nnweb-retrieve-headers): Use it.
+ (nnweb-request-article): Use it.
+
+ * nnweb.el (nnweb-dejanews-create-mapping): Set a default date in
+ case matching failed.
+
+1999-12-02 John Wiegley <jwiegley@inprise.com>
+
+ * mail-source.el (mail-source-keyword-map): Add backslash to
+ Delete-flag.
+
+1999-12-02 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * gnus-sum.el (gnus-group-charset-alist): Default nnweb groups to
+ Latin-1.
+ (gnus-group-charset-alist): No, don't.
+
+ * nnweb.el (nnweb-init): Make the buffer unibyte.
+
+1999-12-01 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * mail-source.el (mail-source-set-common-1): Fix to get the
+ default value.
+
+1999-12-02 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * nnslashdot.el (nnslashdot-read-groups): Unibyte.
+
+ * nnultimate.el (nnultimate-request-list): Use unibyte.
+
+ * gnus-uu.el (gnus-uu-grab-articles): Bind
+ gnus-display-mime-function to nil.
+
+ * message.el (message-send-mail-with-sendmail): Use the
+ user-mail-address variable.
+
+ * gnus-art.el (gnus-ignored-headers): More headers.
+
+ * message.el (message-shorten-1): Use list.
+
+1999-12-01 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * gnus-msg.el (gnus-configure-posting-styles): Ignore nil
+ signatures.
+
+ * nnweb.el (nnweb-dejanews-create-mapping): Get the data.
+ (nnweb-dejanews-create-mapping): Do the properish date.
+
+1999-12-01 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * mail-source.el (mail-source-common-keyword-map): New variable.
+ (mail-source-bind-common): New macro.
+ (mail-source-fetch): Support plugged mail source.
+ * gnus-int.el (gnus-request-scan): Use them.
+
+1999-12-01 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * mm-view.el (mm-inline-message): Check whether charset is a
+ string.
+
+ * nnslashdot.el (nnslashdot-request-post): Insert <p>'s.
+
+ * message.el (message-mode-map): Changed keystroke for
+ message-yank-buffer.
+
+1999-11-26 Hrvoje Niksic <hniksic@iskon.hr>
+
+ * message.el (message-shorten-references): Cut references to 31
+ elements, then either fold them or shorten them to 988 characters.
+ (message-shorten-1): New function.
+ (message-cater-to-broken-inn): New variable.
+
+1999-12-01 Eric Marsden <emarsden@mail.dotcom.fr>
+
+ * nnslashdot.el (nnslashdot-lose): New function.
+
+1999-12-01 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * mm-view.el (mm-inline-message): Not the right type of charset is
+ being fetched here. Let the group charset rule.
+ (mm-inline-message): Ignore us-ascii.
+
+1999-11-24 Carsten Leonhardt <leo@arioch.oche.de>
+
+ * mail-source.el (mail-source-fetch-maildir): work around the
+ ommitted "file-regular-p" in efs/ange-ftp
+
+1999-12-01 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * mml.el (mml-generate-mime-1): Don't insert extra empty line.
+ (mml-generate-mime-1): Use the encoding param.
+
+ * gnus-sum.el (gnus-summary-show-article): Don't bind gnus-visual.
+
+ * gnus-cache.el (gnus-cache-possibly-enter-article): Require
+ gnus-art before binding its variables.
+
+ * gnus-art.el (gnus-article-prepare-display): Run the prepare
+ after the MIME.
+
+1999-12-01 Rupa Schomaker <rupa-list@rupa.com>
+
+ * message.el (message-clone-locals): Use it.
+
+ * gnus-msg.el (gnus-configure-posting-styles): Make
+ user-mail-address local.
+
+1999-11-20 Simon Josefsson <jas@pdc.kth.se>
+
+ * gnus-start.el (gnus-get-unread-articles): Scan each method only
+ once.
+
+1999-12-01 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * message.el (message-generate-new-buffer-clone-locals): Use varstr.
+ (message-clone-locals): Ditto.
+
+ * gnus-sum.el (gnus-summary-enter-digest-group): Have the digest
+ group inherit reply-to or from.
+
+1999-12-01 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * gnus-sum.el (gnus-summary-show-article): Support numbered ARG
+ for charset.
+ (gnus-summary-show-article-charset-alist): New variable.
+
+ * mm-bodies.el (mm-decode-string): Support gnus-all and
+ gnus-unknown.
+ (mm-decode-body): Ditto.
+ * rfc2047.el (rfc2047-decode): Ditto.
+
+1999-12-01 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * mail-source.el (mail-source-delete-incoming): Change default to
+ t.
+
+1999-12-01 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
+
+ * gnus.el: Pterodactyl Gnus v0.99 is released.
+
+1999-12-01 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * gnus-sum.el (gnus-summary-refer-article): Wrong interactive
+ spec.
+
+ * gnus-msg.el (gnus-configure-posting-styles): Eval `eval'.
+ (gnus-configure-posting-styles): No, don't.
+ (gnus-configure-posting-styles): Allow overriding files.
+
+ * gnus-art.el (gnus-header-button-alist): Use browse-url
+ directly.
+
+ * mm-decode.el (mm-inline-media-tests): Check feature vcard.
+
+ * gnus-msg.el (gnus-summary-yank-message): New command and
+ keystroke.
+
+ * message.el (message-yank-buffer): New command.
+ (message-buffers): New function.
+
+ * gnus-sum.el (gnus-summary-catchup-and-goto-next-group): Select
+ next group in a more normal fasion.
+
+ * mml.el (mml-boundary-function): New variable.
+ (mml-compute-boundary): Use it.
+
+ * nnmh.el (nnmh-active-number): Skip past files that have buffers
+ that exist for them.
+
+ * gnus-async.el (gnus-async-prefetch-next): Cancel timers.
+ (gnus-async-timer): New variable.
+
+1999-11-30 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * nnultimate.el (nnultimate-request-list): Be more lenient with
+ root addresses.
+
+1999-11-28 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * gnus-art.el (gnus-treatment-function-alist): Do
+ gnus-treat-capitalize-sentences.
+
+1999-11-30 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * webmail.el (webmail-hotmail-article): Hotmail changes the
+ format.
+
+1999-11-29 Simon Josefsson <jas@pdc.kth.se>
+
+ * mm-decode.el (mm-display-external): For `copiousoutput' methods,
+ switch to buffer after calling program.
+ (mm-display-external): Use `shell-command-switch' instead of "-c".
+
+1999-11-27 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * nnultimate.el (nnultimate-possibly-change-server): Don't always
+ read groups file.
+
+ * nnslashdot.el (nnslashdot-request-article): Convert <br><br> to
+ <p>.
+
+1999-11-24 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * message.el (message-mode): Doc fix.
+
+1999-11-24 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * gnus-art.el (article-emphasize): Check group variable.
+ * rfc1843.el (rfc1843-decode-article-body): Ditto.
+
+1999-11-24 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * mm-decode.el (mm-save-part-to-file): Inhibit jka-compr for any
+ type.
+
+1999-11-23 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * webmail.el: Support www.netaddress.com, i.e. usa.net.
+
+1999-11-23 Hrvoje Niksic <hniksic@iskon.hr>
+
+ * mml.el (mml-quote-region): Insert ! after the hash.
+
+1999-11-23 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * gnus-group.el (gnus-group-warchive-address-history): Change to
+ nil.
+
+1999-11-23 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * webmail.el: Support mail.yahoo.com.
+
+ * mail-source.el (mail-source-fetch-webmail): Add password check.
+ (mail-source-keyword-map): Use `subtype'.
+
+1999-11-22 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * mail-source.el (mail-source-keyword-map): Add webmail.
+ (mail-source-fetcher-alist): Ditto.
+ (mail-source-fetch-webmail): New function.
+ * webmail.el: New file.
+
+1999-11-21 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * nnwarchive.el (nnwarchive-request-group): Print 0 if it is nil.
+
+1999-11-21 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * mailcap.el (mailcap-parse-mailcap): Don't skip double semicolon.
+
+1999-11-20 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * nnultimate.el (nnultimate-request-list): Add fetch-time slot.
+ (nnultimate-prune-days): New function.
+ (nnultimate-create-mapping): Use it.
+ (nnultimate-request-group): Only fetch the groups list if it has
+ not been done before.
+ (nnultimate-retrieve-headers): Don't write groups.
+ (nnultimate-create-mapping): Off-by-one error.
+
+1999-11-19 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * nnslashdot.el (nnslashdot-sane-retrieve-headers): Fix to match
+ threaded subjects.
+
+1999-11-20 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * nnwarchive.el: Lots of changes make agent happy.
+
+1999-11-19 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * gnus-start.el (gnus-get-unread-articles): Assert group is in
+ hashtb.
+
+1999-11-19 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * mm-decode.el (mm-display-external): Write region with binary
+ mode.
+
+1999-11-18 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * nnweb.el (nnweb-dejanews-create-mapping): Bind `text'.
+
+1999-11-18 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * mm-uu.el (mm-uu-dissect): Use fake charset `gnus-decoded'.
+ (mm-uu-test): Now it is in restricted region.
+
+ * gnus-art.el (article-decode-charset): Don't mm-uu-test.
+
+ * mm-view.el (mm-view-message): Fix buffer leak.
+ (mm-inline-message): Support 'gnus-decoded.
+
+ * mm-bodies.el (mm-decode-body): Ditto.
+
+ * rfc2047.el (rfc2047-decode-region): Ditto.
+
+1999-11-18 Matthias Andree <ma@dt.e-technik.uni-dortmund.de>
+
+ * imap.el (require): Added autoload for base64-encode-string.
+
+1999-11-17 Per Abrahamsen <abraham@dina.kvl.dk>
+
+ * gnus.el (gnus-refer-article-method): Made list value
+ customizable.
+
+1999-11-17 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * gnus-sum.el (gnus-summary-recenter): set-window-start with
+ NOFORCE in Emacs case.
+
+1999-11-17 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * gnus-art.el (gnus-request-article-this-buffer): Set
+ gnus-newsgroup-name.
+
+1999-11-17 Simon Josefsson <jas@pdc.kth.se>
+
+ * gnus-start.el (gnus-get-unread-articles): Check server before
+ scanning.
+
+1999-11-16 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * gnus.el (gnus-valid-select-methods): nnslashdot is news.
+
+ * nnslashdot.el (nnslashdot-login-name): New variable.
+ (nnslashdot-password): Ditto.
+ (nnslashdot-request-post): New function.
+
+ * gnus-art.el (gnus-treat-buttonize): More testing.
+
+ * mm-encode.el: Another CVS test.
+
+ * gnus-art.el (gnus-treat-emphasize): Change default.
+ (gnus-treat-buttonize): Ditto.
+ (gnus-treat-buttonize): This is a test.
+
+ * gnus-sum.el (gnus-build-old-threads): Bind mail-parse-charset.
+ (gnus-build-sparse-threads): Ditto.
+ (gnus-build-all-threads): Ditto.
+
+ * nnheader.el (make-full-mail-header): Make into a subst.
+
+ * gnus.el (gnus-refer-article-method): Doc fix.
+
+ * gnus-sum.el: Do not accept a prefix.
+ (gnus-summary-refer-article): Accept a list of select methods.
+
+1999-11-11 Matt Pharr <mmp@graphics.stanford.edu>
+
+ * message.el (message-forward): Pay attention to prefix argument
+ again and forward all headers when it is set, regardless of the
+ value of message-forward-ignored-headers.
+
+1999-11-15 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * gnus-ems.el: Check for cygwin32.
+
+1999-11-14 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * mm-decode.el (mm-display-external): Use 'non-viewer.
+
+1999-11-14 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * nntp.el (nntp-retrieve-groups): Erase nntp-sever-buffer before
+ nntp-inhibit-erase.
+
+1999-11-13 Simon Josefsson <jas@pdc.kth.se>
+
+ * gnus-start.el (gnus-get-unread-articles): Use
+ nnfoo-retrieve-groups to find new news, if available.
+ (gnus-read-active-file-2): New function.
+ (gnus-get-unread-articles): Use it.
+ (gnus-read-active-file-1): Ditto.
+
+1999-11-13 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * mm-util.el (mm-find-mime-charset-region): Make sure
+ find-coding-systems-for-charsets is fbound.
+
+ * gnus-ems.el: Typo fix.
+
+1999-11-13 Florian Weimer <fw@s.netic.de>
+
+ * mm-util.el (mm-find-mime-charset-region): Use UTF-8 if
+ it's available and makes sense.
+
+1999-11-12 Fabrice POPINEAU <Fabrice.Popineau@supelec.fr>
+
+ * gnus-score.el (gnus-score-save): Translate score file.
+
+1999-11-13 Simon Josefsson <jas@pdc.kth.se>
+
+ * mail-source.el (mail-source-keyword-map): For IMAP mail source,
+ added fetchflag and dontexpunge keywords.
+ (mail-source-fetch-imap): Use them.
+
+1999-11-12 Per Abrahamsen <abraham@dina.kvl.dk>
+
+ * gnus-start.el (gnus-level-subscribed, gnus-level-unsubscribed,
+ gnus-level-zombie, gnus-level-killed): Changed from `defcustom' to
+ `defconst'.
+
+ * gnus-cus.el (gnus-group-parameters): Changed from `defcustom' to
+ `defconst'.
+ Mention that it is both for group and topic parameters.
+ (gnus-extra-topic-parameters): New constant, including `subscribe'
+ parameter.
+ (gnus-extra-group-parameters): New constant.
+ (gnus-group-customize): Use them.
+
+ * gnus.el (gnus-select-method): Added default value and tag.
+ (gnus-refer-article-method): Added `DejaNews' customization option.
+
+1999-11-12 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * gnus-int.el (gnus-server-opened): Ignore denied servers.
+
+ * gnus-ems.el (gnus-mule-max-width-function): New backquote
+ syntax.
+
+ * nndoc.el (nndoc-mime-digest-type-p): Reinstated.
+
+ * nnslashdot.el (nnslashdot-group-number): Changed default.
+
+ * nnweb.el (nnweb-dejanews-create-mapping): Work with new deja.
+ (nnweb-dejanews-wash-article): Removed.
+ (nnweb-type-definition): Fetch by id.
+
+ * gnus-msg.el (gnus-configure-posting-styles): Don't insert unless
+ we mean it.
+
+ * nnslashdot.el (nnslashdot-group-number): Doc fix.
+ (nnslashdot-request-list): Use Ultramode as well.
+ (nnslashdot-date-to-date): Be more lenient.
+ (nnslashdot-threaded): New function.
+
+1999-11-11 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * gnus-art.el (gnus-mime-internalize-part): Doc fix.
+
+1999-11-11 Steinar Bang <sb@metis.no>
+
+ * nnweb.el (nnweb-type-definition): /=dnc
+
+1999-11-11 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * nnultimate.el (nnultimate-retrieve-headers): Work with american
+ dates.
+ (nnultimate-retrieve-headers): Wrong ordering.
+
+1999-11-11 Matt Pharr <mmp@graphics.stanford.edu>
+
+ * message.el (message-forward-as-mime): New variable.
+
+1999-11-11 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * gnus-util.el (gnus-dd-mmm): Beware buggy dates.
+
+1999-11-10 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * mail-source.el (mail-source-movemail-and-remove): New function.
+ (mail-source-keyword-map): Add `function' for `maildir'.
+ (mail-source-fetch-maildir): Use it.
+
+1999-11-10 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * nnwarchive.el: New file.
+ * gnus-group.el (gnus-group-make-warchive-group): New function.
+ * gnus.el (gnus-valid-select-methods): Add `nnwarchive'.
+
+1999-11-10 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * nnultimate.el (nnultimate-retrieve-headers): Work for multi-page
+ subjects.
+
+1999-11-10 Rajappa Iyer <rajappa@mindspring.com>
+
+ * gnus-salt.el (gnus-pick-article-or-thread): Don't move point.
+
+1999-11-10 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * nnultimate.el (nnultimate-open-server): Do address.
+ (nnultimate-forum-table-p): New function.
+
+ * nnweb.el (nnweb-insert-html): Renamed.
+ (nnweb-insert): New function.
+
+ * nnultimate.el (nnultimate-insert-html): New function.
+
+ * nnslashdot.el (nnslashdot-retrieve-headers): Don't do anything
+ if nov is evil.
+ (nnslashdot-retrieve-headers): use the sane version instead.
+
+1999-11-09 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * nnslashdot.el (nnslashdot-request-article): Fold case.
+
+ * nnultimate.el: New file.
+
+ * nnslashdot.el (nnslashdot-retrieve-headers): Skip the article
+ unless wanted.
+
+ * gnus-start.el (gnus-active-to-gnus-format): Catch errors.
+ (gnus-read-active-file-1): Separated into own function.
+ (gnus-read-active-file): Catch quits.
+
+ * nnslashdot.el (nnslashdot-request-article): Search better on
+ first article.
+ (nnslashdot-request-list): Fold case.
+ (nnslashdot-retrieve-headers): Ditto.
+
+1999-11-08 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * gnus.el: Autoload gnus-subscribe-topics.
+
+1999-11-07 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * gnus-agent.el (gnus-agent-save-group-info): Remove backslash
+ before dot.
+ * gnus-util.el (gnus-write-active-file): Ditto.
+
+1999-11-07 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * nnheader.el (nnheader-replace-duplicate-chars-in-string): New
+ function.
+ * gnus-cache.el (gnus-cache-file-name): Use it.
+ * gnus-agent.el (gnus-agent-group-path): Use it.
+ * nnmail.el (nnmail-group-pathname): Use it.
+
+1999-11-07 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * gnus-start.el (gnus-active-to-gnus-format): Don't insert backslash
+ if cooked.
+ * gnus-util.el (gnus-write-active-file): Write cooked active file.
+ * gnus-agent.el (gnus-agent-save-group-info): Ditto.
+ * gnus.el (gnus-short-group-name): "..." proof.
+
+1999-11-07 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * gnus-srvr.el (gnus-browse-foreign-server): Keep using `read' to
+ support nnslashdot.
+
+1999-11-08 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * nnslashdot.el (nnslashdot-retrieve-headers): Don't fetch too
+ many articles.
+ (nnslashdot-generate-active): New function.
+ (nnslashdot-request-newgroups): Use it.
+
+ * gnus-start.el (gnus-active-to-gnus-format): Intern strings group
+ names.
+
+ * nnslashdot.el (nnslashdot-request-newgroups): New function.
+ (nnslashdot-request-list): Not moderated.
+
+1999-11-07 Simon Josefsson <jas@pdc.kth.se>
+
+ * nnimap.el (nnimap-open-server): Remove error signal if
+ nnimap-server-buffer is nil (the check should've been `boundp').
+
+ * imap.el (imap-log):
+ * nnimap.el (nnimap-debug): Disable debugging by default.
+
+1999-11-07 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * gnus-start.el (gnus-subscribe-newsgroup-method): Doc fix.
+
+ * gnus-topic.el (gnus-subscribe-topic): New function.
+
+ * nnslashdot.el (nnslashdot-request-list): Give out extended group
+ names.
+
+ * gnus-start.el (gnus-ignored-newsgroups): Disregard bogus chars
+ if starting with a quote.
+
+1999-11-07 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * gnus-srvr.el (gnus-browse-foreign-server): Support backslash in
+ group name.
+
+1999-11-07 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * nnslashdot.el: New file.
+
+ * nnheader.el (nnheader-insert-header): New function.
+
+ * gnus-art.el (gnus-mime-internalize-part): Bind
+ mm-inlined-types.
+
+ * nndraft.el (nndraft-request-expire-articles): Do all the backup
+ files.
+
+1999-10-29 David S. Goldberg <dsg@mitre.org>
+
+ * emacs-mime.texi (Customization): Document mm-inline-override-types
+
+1999-10-29 David S. Goldberg <dsg@mitre.org>
+
+ * emacs-mime.texi (Customization): Document mm-inline-override-types
+
+1999-10-29 David S. Goldberg <dsg@mitre.org>
+
+ * emacs-mime.texi (Customization): Document mm-inline-override-types
+
+1999-11-07 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * gnus-topic.el (gnus-topic-goto-missing-topic): Work even in
+ empty buffers.
+
+1999-11-06 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * gnus-art.el (gnus-article-mode-map): Use the summary article
+ edit.
+
+1999-11-06 Jens-Ulrik Petersen <Jens-Ulrik.Petersen@nokia.com>
+
+ * gnus-group.el (gnus-group-read-ephemeral-group): Doc fix.
+
+1999-11-06 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * gnus-uu.el (gnus-uu-mark-thread): Don't move point around.
+
+1999-10-07 Katsumi Yamaoka <yamaoka@jpl.org>
+
+ * gnus-art.el (gnus-treat-predicate): Examine whether the argument
+ is list or not before condition.
+
+1999-10-07 Yoshiki Hayashi <t90553@mail.ecc.u-tokyo.ac.jp>
+
+ * gnus-art.el (gnus-treat-predicate): Work for (typep "something").
+
+1999-11-06 Kevin the Bandicoot <user42@zip.com.au>
+
+ * gnus-art.el (gnus-emphasis-alist): New value.
+
+1999-11-06 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * gnus-srvr.el (gnus-browse-foreign-server): Use both `read' and
+ `buffer-substring'.
+
+1999-11-06 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * gnus-art.el (article-date-ut): Keep the updated timer.
+ (gnus-emphasis-underline-italic): Doc fix.
+
+ * gnus-msg.el (gnus-post-method): Doc fix.
+ (gnus-post-method): Change default.
+
+1999-11-06 Francisco Solsona <flsc@hp.fciencias.unam.mx>
+
+ * message.el (message-newline-and-reformat): Improvements.
+
+1999-11-06 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * message.el (message-newline-and-reformat): Don't insert too many
+ newlines.
+ (message-newline-and-reformat): Work even if not sc.
+
+ * mm-view.el (mm-inline-message): Insert a delimiter at the end.
+
+ * mm-decode.el (mm-inline-media-tests): Only if diff mode.
+
+1999-11-06 Toby Speight <Toby.Speight@streapadair.freeserve.co.uk>
+
+ * mm-view.el (mm-display-patch-inline): New function.
+
+1999-11-06 Robert Bihlmeyer <robbe@orcus.priv.at>
+
+ * mm-view.el (mm-display-patch-inline): New function.
+
+1999-11-06 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * gnus-sum.el (gnus-read-move-group-name): Subscribe to the
+ group.
+
+ * message.el (message-forward): Narrow to the right header.
+
+ * gnus-sum.el (gnus-summary-limit-to-age): Protect against bogus
+ dates.
+
+ * gnus-msg.el (gnus-configure-posting-styles): Use the
+ user-full-name function.
+
+ * mm-bodies.el (mm-body-encoding): Use the choosing function.
+ (mm-body-charset-encoding-alist): Default to nil.
+
+ * message.el (message-elide-ellipsis): Fix typo.
+ (message-elide-region): Ditto.
+ (message-elide-region): Don't insert a newline first.
+
+1999-11-05 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * gnus-sum.el (gnus-cut-thread): Also cut for numberp
+ gnus-fetch-old-headers.
+ (gnus-cut-threads): Ditto.
+ (gnus-summary-initial-limit): Ditto.
+ (gnus-summary-limit-children): Ditto.
+
+ * gnus-msg.el (gnus-configure-posting-styles): Allow `header'
+ matches.
+
+1999-11-06 Simon Josefsson <jas@pdc.kth.se>
+
+ * gnus-art.el (article-decode-encoded-words):
+ (gnus-mime-display-single): Don't assume gnus-summary-buffer is
+ live.
+
+ * gnus.el (gnus-read-method): Add methods from
+ `gnus-opened-servers' to completion. Map entered method/address
+ into existing methods if possible.
+
+ * gnus-group.el (gnus-group-make-group): Simplify method.
+
+ * gnus-srvr.el (gnus-browse-unsubscribe-group): Simplify method.
+
+ * mml.el (mml-preview): Remove mail-header-separator before
+ encoding.
+
+1999-11-05 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * message.el (message-read-from-minibuffer): New function.
+
+1999-11-05 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
+
+ * gnus.el: Pterodactyl Gnus v0.98 is released.
+
+1999-11-05 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * gnus-agent.el (gnus-agent-expire): Remove bad line in NOV.
+
+1999-11-04 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * mml.el (mml-generate-mime-1): Read attached binary file in
+ binary mode.
+
+1999-11-03 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * gnus-sum.el (gnus-summary-toggle-header): Fix arg bug.
+
+1999-11-03 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * mailcap.el (mailcap-viewer-lessp): Fix bug.
+
+1999-11-02 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * gnus-sum.el (gnus-summary-search-article): Fix loop search bug.
+
+1999-10-31 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * gnus-art.el (gnus-article-mime-match-handle-first): New function.
+ (gnus-article-mime-match-handle-function): New variable.
+ (gnus-article-view-part): Make `b' customizable.
+
+1999-10-29 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * gnus-sum.el (gnus-article-get-xrefs): Test eobp.
+
+1999-09-27 Hrvoje Niksic <hniksic@srce.hr>
+
+ * mm-decode.el (mm-attachment-override-types): Exclude text/plain.
+
+1999-10-27 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * mm-decode.el (mm-dissect-buffer): CTE may come without CTL.
+
+1999-10-26 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * gnus-srvr.el (gnus-browse-foreign-server): Use
+ `buffer-substring' instead of `read'.
+
+1999-10-23 Simon Josefsson <jas@pdc.kth.se>
+
+ * nnimap.el, imap.el, rfc2104.el: New files.
+
+ * gnus.el (gnus-valid-select-methods): Add nnimap.
+
+ * gnus-group.el (gnus-group-group-map): Add
+ gnus-group-nnimap-edit-acl, gnus-group-nnimap-expunge.
+ (gnus-group-nnimap-expunge): New function.
+ (gnus-group-nnimap-edit-acl): New function.
+
+ * gnus-agent.el (gnus-agent-group-mode-map): Add
+ gnus-agent-synchronize.
+ (gnus-agent-synchronize): New function.
+ (gnus-agent-fetch-group-1): Check if server is open.
+
+ * nnagent.el (nnagent-request-set-mark): Save marks.
+
+ * mail-source.el (mail-source-keyword-map): New imap mail-source.
+ (mail-source-fetcher-alist): Map to imap fetcher function.
+ (mail-source-fetch-imap): New function.
+
+ * gnus-art.el (article-hide-pgp): Hide all headers, not just
+ Hash:.
+
+1999-10-22 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * gnus-topic.el (gnus-topic-sort-topics-1): New function.
+ (gnus-topic-sort-topics): New function.
+ (gnus-topic-make-menu-bar): Add sort-topics.
+ (gnus-topic-move): New function.
+ (gnus-topic-move-group): Move the topic if no group selected.
+
+1999-10-13 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * gnus-art.el (gnus-article-setup-buffer): Fix buffer leak.
+
+1999-10-13 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * mm-view.el (mm-inline-message): Fix leaving group bug.
+
+1999-10-07 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * gnus-msg.el (gnus-post-method): Use normal method if current is
+ not available.
+
+1999-10-07 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * nnmail.el (nnmail-insert-xref): Dealing with empty articles.
+ (nnmail-insert-lines): Ditto.
+
+1999-10-07 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * nnfolder.el (nnfolder-insert-newsgroup-line): Insert a blank
+ line.
+
+ * message.el (message-unsent-separator): One more separator.
+
+1999-10-06 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * nnfolder.el (nnfolder-request-move-article): For empty article,
+ search till (point-max).
+ (nnfolder-retrieve-headers): Ditto.
+ (nnfolder-request-accept-article): Ditto.
+ (nnfolder-save-mail): Ditto.
+ (nnfolder-insert-newsgroup-line): Ditto.
+
+1999-10-05 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * qp.el (quoted-printable-encode-region): Check eobp.
+
+1999-10-03 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * nntp.el (nntp-retrieve-headers-with-xover): Fix hanging problem.
+
+1999-10-02 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * nntp.el (nntp-send-xover-command): Wait for nothing if not
+ wait-for-reply.
+
+1999-09-29 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * mm-uu.el (mm-uu-forward-begin-line): Change the regexp.
+ (mm-uu-forward-end-line): Ditto.
+
+1999-09-29 Didier Verna <verna@inf.enst.fr>
+
+ * binhex.el (binhex-decode-region): don't consider the value of
+ `enable-multibyte-characters' in XEmacs.
+
+ * gnus-start.el (gnus-read-descriptions-file): ditto.
+
+ * mm-util.el (mm-multibyte-p): ditto.
+ (mm-with-unibyte-buffer): ditto.
+ (mm-find-charset-region): use `mm-multibyte-p'.
+
+ * mm-bodies.el (mm-decode-body): ditto.
+ (mm-decode-string): ditto.
+
+1999-09-29 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * mm-util.el (mm-binary-coding-system): Try binary first.
+
+1999-09-14 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * rfc1843.el (rfc1843-decode-article-body): Don't decode twice.
+
+1999-09-10 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * gnus-art.el (article-make-date-line): Add time-zone in iso8601
+ format.
+ (article-date-ut): Find correct insert position.
+
+1999-09-03 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * mm-uu.el (mm-uu-dissect): Do not dissect quoted-printable
+ forwarded message.
+
+1999-09-27 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * gnus-topic.el (gnus-topic-find-groups): Work for unactivated
+ groups.
+
+ * message.el (message-resend): Use message mode when prompting.
+
+ * gnus-art.el (article-hide-headers): Mark wash.
+ (article-emphasize): Ditto.
+
+1999-09-27 Vladimir Volovich <vvv@vvv.vsu.ru>
+
+ * message.el (message-newline-and-reformat): Work for SC.
+
+1999-09-27 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * gnus-msg.el (gnus-group-posting-charset-alist): 2047 in de.*.
+
+ * gnus-sum.el (gnus-newsgroup-ignored-charsets): Add x-unknown.
+
+1999-10-20 David S. Goldberg <dsg@mitre.org>
+
+ * mm-decode.el mm-inline-override-types: New variable
+
+ * mm-decode.el (mm-inline-override-p): New function
+
+ * mm-decode.el (mm-inlined-p): Use it
+
+1999-10-20 David S. Goldberg <dsg@mitre.org>
+
+ * mm-decode.el mm-inline-override-types: New variable
+
+ * mm-decode.el (mm-inline-override-p): New function
+
+ * mm-decode.el (mm-inlined-p): Use it
+
+1999-09-27 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
+
+ * gnus.el: Pterodactyl Gnus v0.97 is released.
+
+1999-09-01 Brendan Kehoe <brendan@zen.org>
+
+ * gnus-sum.el (gnus-summary-catchup-and-goto-next-group): Use
+ gnus-summary-next-group, not gnus-summary-next-article. Only give
+ 3 args.
+
+1999-09-25 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * gnus-agent.el (gnus-agent-fetch-group-1): Look in the group
+ buffer for params.
+
+ * message.el (message-forward-ignored-headers): New variable.
+
+ * gnus-art.el (gnus-article-prepare-display): Nix out
+ gnus-article-wash-types.
+
+ * gnus-agent.el (gnus-agent-create-buffer): New function.
+ (gnus-agent-fetch-group-1): Use it.
+ (gnus-agent-start-fetch): Ditto.
+
+ * gnus-sum.el (gnus-summary-exit): Don't use
+ `gnus-use-adaptive-scoring'.
+
+ * mail-source.el (mail-source-fetch-pop): Only store password when
+ successful.
+
+ * gnus-nocem.el (gnus-nocem-scan-groups): Message better.
+
+1999-09-24 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * message.el (message-reply): Use it.
+ (message-dont-reply-to-names): New variable.
+
+ * nntp.el (nntp-open-telnet): Don't erase-buffer.
+
+ * mm-util.el (mm-preferred-coding-system): Typo fix.
+
+ * message.el (message-bounce): Work for non-MIME.
+
+ * gnus.el (gnus-short-group-name): Short the right parts of the
+ name.
+
+1999-09-24 Johan Kullstam <kullstam@ne.mediaone.net>
+
+ * mm-encode.el (mm-qp-or-base64): New version.
+
+1999-09-10 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * gnus-art.el (article-make-date-line): Fix time-zone bug.
+
+1999-09-09 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * gnus-art.el (gnus-article-add-buttons): Don't delete markers out
+ of restricted region.
+ (gnus-mime-display-single): Set beg at correct point.
+
+1999-09-09 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * nnmail.el (nnmail-process-maildir-mail-format): Typo.
+
+1999-09-09 Jens-Ulrik Petersen <jens-ulrik.petersen@nokia.com>
+
+ * gnus-msg.el (gnus-configure-posting-styles): Let
+ `gnus-posting-styles' have its say in posting-style: local
+ variable `styles' is already bound to `gnus-posting-styles' so
+ don't rebind it to nil.
+
+1999-09-24 Robert Bihlmeyer <robbe@orcus.priv.at>
+
+ * gnus-score.el (gnus-summary-increase-score): Allow editing of
+ Message-ID.
+
+1999-09-08 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * mm-encode.el (mm-encode-content-transfer-encoding): Fold
+ quoted-printable-encode-region.
+
+ * qp.el (quoted-printable-encode-region): Assume charset
+ encoded. Fold every line in the region.
+
+1999-09-02 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * gnus-srvr.el (gnus-browse-foreign-server): Read the first line
+ of active file.
+
+1999-09-01 Didier Verna <verna@inf.enst.fr>
+
+ * message.el (message-mode): allows whitespaces between multiple
+ instances of the fill character ">".
+
+1999-09-24 Kim-Minh Kaplan <kmkaplan@vocatex.fr>
+
+ * mm-encode.el (mm-qp-or-base64): Fix.
+
+1999-09-01 Katsumi Yamaoka <yamaoka@jpl.org>
+
+ * message.el (message-send): Too much and.
+
+1999-09-24 Andreas Schwab <schwab@suse.de>
+
+ * gnus-art.el (gnus-mime-view-part-as-type): Renamed.
+
+1999-08-28 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * gnus-score.el (gnus-score-headers): Work for nil scores.
+
+1999-08-27 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * gnus-cache.el (gnus-cache-write-active): Write full names.
+
+ * gnus-util.el (gnus-write-active-file): Accept full name.
+
+ * mm-decode.el (mm-inlinable-p): Use string-match on the types.
+ (mm-assoc-string-match): New function.
+ (mm-display-inline): Use it.
+
+ * gnus-group.el (gnus-group-set-info): Work for nil group params.
+
+ * gnus-msg.el (gnus-configure-posting-styles): Allow eval.
+
+1999-08-27 Florian Weimer <fw@s.netic.de>
+
+ * mml.el (mml-generate-multipart-alist): New variable.
+
+1999-08-27 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * gnus-art.el (gnus-treat-predicate): Work for (not 5).
+
+1999-08-27 Peter von der Ahe <pahe@daimi.au.dk>
+
+ * message.el (message-send): More helpful error message if sending
+ fails
+
+1999-09-06 Robert Bihlmeyer <robbe@orcus.priv.at>
+
+ * gnus-score.el (gnus-summary-increase-score): "Lars" was broken
+ in newer emacsen, where ?r isn't equal 114.
+
+1999-08-27 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
+
+ * gnus.el: Pterodactyl Gnus v0.96 is released.
+
+1999-08-17 Simon Josefsson <jas@pdc.kth.se>
+
+ * gnus-start.el (gnus-groups-to-gnus-format): Only use agent
+ to get active info if method is covered by agent, otherwise
+ active info is lost.
+
+1999-08-17 Simon Josefsson <jas@pdc.kth.se>
+
+ * gnus-sum.el (gnus-summary-move-article): Report backend errors.
+
+1999-08-09 Dave Love <fx@gnu.org>
+
+ * mm-util.el: Use `defalias', not `fset' for dummy functions.
+
+1999-08-09 Simon Josefsson <jas@pdc.kth.se>
+
+ * gnus-art.el (gnus-ignored-headers): Remove "X-Pgp-*"
+ (already matched by "^X-Pgp"), removed duplicate
+ X-Mailing-List, added several new junk headers.
+
+1999-08-01 Simon Josefsson <jas@pdc.kth.se>
+
+ * gnus-art.el (article-decode-charset): Don't assume
+ gnus-summary-buffer is live.
+
+1999-08-27 Florian Weimer <fw@s.netic.de>
+
+ * gnus-score.el (gnus-home-score-file): Work with absolute path
+ names.
+
+1999-07-17 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * gnus-sum.el (gnus-articles-to-read): Return cached articles if
+ nothing else in the group.
+
+1999-07-16 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * gnus-bcklg.el (gnus-backlog-enter-article): Check the size of
+ the article.
+
+1999-07-15 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * mm-uu.el (mm-uu-dissect): Fix for base64 message.
+
+1999-07-15 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * mm-uu.el (mm-uu-forward-end-line): Support forwarded message
+ from mutt.
+
+1999-07-14 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * mm-bodies.el (mm-decode-content-transfer-encoding): Delete
+ whitespace.
+
+1999-07-14 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * mm-util.el (mm-text-coding-system-for-write): New variable.
+ (mm-append-to-file): New function.
+ (mm-write-region): New function.
+
+ * gnus-art.el (gnus-output-to-file): Use it.
+ * gnus-util.el (gnus-output-to-rmail): Ditto.
+ (gnus-output-to-mail): Ditto.
+ * gnus-uu.el (gnus-uu-binhex-article): Ditto.
+
+1999-07-14 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * nnmail.el (nnmail-find-file): Use mm-auto-mode-alist.
+
+ * nnheader.el (nnheader-insert-file-contents): Revert and use
+ mm-insert-file-contents.
+ (nnheader-find-file-noselect): Use mm-auto-mode-alist.
+ (nnheader-auto-mode-alist): Removed.
+
+ * mm-util.el (mm-inhibit-file-name-handlers): New variable.
+ (mm-insert-file-contents): Add a new parameter for inserting
+ compressed file literally.
+
+ * mml.el (mml-generate-mime-1): Insert non-text literally.
+
+ * gnus.el: Change most mm-insert-file-contents back to nnheader.
+
+1999-07-13 Hrvoje Niksic <hniksic@srce.hr>
+
+ * gnus-art.el (gnus-unbuttonized-mime-types): Fix docstring.
+
+1999-08-27 Oleg S. Tihonov <ost@benetnash.ffke-campus.mipt.ru>
+
+ * gnus-sum.el (gnus-group-charset-alist): Default fido7 to
+ koi8-r.
+
+1999-07-11 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * mml.el (mml-insert-mime): Decode text.
+ (mml-to-mime): Narrow to headers-or-head.
+
+1999-07-11 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * mm-view.el (mm-inline-text): Check
+ w3-meta-content-type-charset-regexp.
+
+1999-07-10 Simon Josefsson <jas@pdc.kth.se>
+
+ * gnus-agent.el (gnus-agent-fetch-group-1): Search topics for
+ predicate.
+
+1999-07-10 Alexandre Oliva <oliva@dcc.unicamp.br>
+
+ * gnus-mlspl.el: Documentation fixes.
+
+1999-08-27 Rui Zhu <sprache@iname.com>
+
+ * gnus-sum.el (gnus-summary-limit-to-age): Prompt better.
+
+1999-08-27 Michael Cook <cook@sightpath.com>
+
+ * gnus-art.el (gnus-article-setup-buffer): Kill all local
+ variables.
+
+1999-08-27 Hrvoje Niksic <hniksic@srce.hr>
+
+ * nnmail.el (nnmail-get-new-mail): "Done".
+
+1999-08-27 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * gnus-group.el (gnus-group-kill-all-zombies): Only prompt when
+ interactive.
+
+1999-07-12 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * gnus-art.el (article-decode-charset): Fix broken CT.
+
+1999-07-12 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * gnus-agent.el (gnus-agent-fetch-group-1): Recreate agent
+ overview buffer if it is killed.
+
+1999-08-27 Eric Marsden <emarsden@mail.dotcom.fr>
+
+ * gnus-art.el (article-babel): New version.
+
+1999-08-27 Jon Kv <jonkv@ida.liu.se>
+
+ * nnfolder.el (nnfolder-request-list-newsgroups): Faster expiry.
+
+1999-07-10 Mike McEwan <mike@lotusland.demon.co.uk>
+
+ * gnus.texi (More Threading): Document new variable
+ `gnus-sort-gathered-threads-function'.
+
+1999-07-10 Mike McEwan <mike@lotusland.demon.co.uk>
+
+ * gnus.texi (More Threading): Document new variable
+ `gnus-sort-gathered-threads-function'.
+
+1999-07-11 Andreas Jaeger <aj@arthur.rhein-neckar.de>
+
+ * gnus-uu.el (gnus-uu-digest-mail-forward): Delete file after
+ usage.
+
+1999-07-10 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * mm-util.el (mm-running-xemacs): Removed.
+ (mm-coding-system-p): New function.
+ (mm-binary-coding-system): Safe guess.
+ (mm-text-coding-system): Ditto.
+ (mm-auto-save-coding-system): Ditto.
+
+1999-07-11 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * mm-encode.el (mm-qp-or-base64): Also consider control chars.
+ (mm-qp-or-base64): Reversed logic.
+
+ * mm-decode.el (mm-save-part-to-file): Let coding system be
+ binary.
+
+1999-07-15 Mike McEwan <mike@lotusland.demon.co.uk>
+
+ * gnus-agent.el (gnus-agent-fetch-group-1): Allow 'agent-score' to
+ be set in topic parameters.
+
+1999-07-10 Mike McEwan <mike@lotusland.demon.co.uk>
+
+ * gnus-sum.el (gnus-sort-gathered-threads-function): New variable.
+ (gnus-sort-gathered-threads): Allow the user to specify the
+ function to use when sorting gathered threads.
+
+ * gnus-agent.el (gnus-agent-get-undownloaded-list): Don't
+ mark cached articles as `undownloaded'.
+
+1999-07-20 Peter von der Ahe <peter@ahe.dk>
+
+ * gnus-sum.el (gnus-summary-exit): Allow gnus-use-adaptive-scoring
+ to have buffer local values.
+
+1999-07-25 Matt Pharr <mmp@graphics.stanford.edu>
+
+ * gnus-group.el (gnus-group-make-doc-group): Notice when user
+ types 'g' for 'guess group type.
+
+1999-07-30 Simon Josefsson <jas@pdc.kth.se>
+
+ * nnmail.el (nnmail-remove-list-identifiers): Remove whitespace
+ after each regexp in nnmail-list-identifiers, not just after last
+ one.
+
+ * gnus-sum.el (gnus-list-identifiers): New variable.
+ (gnus-summary-remove-list-identifiers): New function.
+ (gnus-select-newsgroup): Use it.
+ (gnus-summary-wash-hide-map): Bind
+ `gnus-article-hide-list-identifiers' to W W l.
+ (gnus-summary-make-menu-bar): Add list-identifiers command.
+
+ * gnus-art.el (gnus-treat-strip-list-identifiers): New variable.
+ (gnus-treatment-function-alist): Add variable.
+ (article-hide-list-identifiers): New function.
+ (mapcar): Add function.
+ (gnus-article-hide): Use it.
+
+1999-07-10 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
+
+ * gnus.el: Pterodactyl Gnus v0.95 is released.
+
+1999-07-09 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * mm-decode.el (mm-mailcap-command): New function.
+ (mm-display-external): Use it.
+
+ * gnus-art.el (article-make-date-line): Work for India.
+
+ * mm-encode.el (mm-qp-or-base64): Typo.
+
+ * gnus-topic.el (gnus-topic-goto-topic): Made into command.
+
+1999-07-09 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
+
+ * gnus.el: Pterodactyl Gnus v0.94 is released.
+
+1999-07-09 Stainless Steel Rat <ratinox@peorth.gweep.net>
+
+ * pop3.el: New version.
+
+1999-07-09 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * mm-encode.el (mm-qp-or-base64): New function.
+ (mm-content-transfer-encoding): Use it.
+
+ * gnus-util.el (gnus-parse-netrc): Allow quoted names.
+
+1999-07-08 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * mm-decode.el (mm-display-external): Fix typo and use 'non-viewer.
+
+ * mailcap.el (mailcap-mailcap-entry-passes-test): Add needsterminal.
+
+1999-07-09 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * gnus-art.el (gnus-mime-view-part-as-media): New command and
+ keystroke.
+
+ * mailcap.el (mailcap-mime-types): New function.
+
+ * nnmh.el (nnmh-request-group): Update nnmh-group-alist.
+
+ * message.el (message-goto-eoh): Really go to the end.
+
+1999-07-09 Puneet Goel <puneet@computer.org>
+
+ * message.el (message-make-date): Do the right thing in with
+ sub-hour time zones.
+
+1999-07-09 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * gnus-group.el (gnus-group-make-menu-bar): Removed double bug
+ report.
+
+1999-07-08 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * nnfolder.el (nnfolder-request-rename-group): Create directory.
+
+1999-07-08 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * mailcap.el (mailcap-parse-mailcap): Skip \;.
+ (mailcap-parse-mailcap-extras): Fix "nonterminal;" and empty name,
+ and use t as default value.
+
+1999-07-07 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * gnus-sum.el (gnus-get-newsgroup-headers): Don't assume
+ gnus-summary-buffer is live.
+
+1999-07-09 Robert Pluim <rpluim@nortelnetworks.com>
+
+ * mm-util.el (mm-enable-multibyte): Check whether var bound.
+
+1999-07-09 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * message.el (message-bounce): Do MIME bounces MIMEy.
+
+ * gnus-sum.el (gnus-summary-read-group-1): Update mark positions.
+
+1999-07-08 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * mailcap.el (mailcap-mime-extensions): Changed patch to
+ text/x-patch.
+
+ * mm-decode.el (mm-display-external): Wrong placement of paren.
+
+1999-07-07 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
+
+ * gnus.el: Pterodactyl Gnus v0.93 is released.
+
+1999-07-08 Alexandre Oliva <oliva@dcc.unicamp.br>
+
+ * gnus-cus.el (gnus-group-parameters): New entries for
+ gnus-group-split.
+
+ * gnus-mlspl.el: Renamed functions and variables so as to
+ start with gnus-group-split.
+ * gnus.el: Adjust autoload entries.
+
+1999-11-30 ??:??:?? Alexandre Oliva <oliva@dcc.unicamp.br>
+
+ * gnus-mlspl.el: Removed trailing t from comment and provide.
+ Renamed functions and variables to start with gnus-mlsplit.
+ Added autoload comments.
+ * gnus.el: Added autoload entries.
+
+1999-07-06 Alexandre Oliva <oliva@dcc.unicamp.br>
+
+ * nnmail.el (nnmail-split-it): Search the regexp multiple times,
+ so that matches excluded by RESTRICTs do not cause the whole split
+ to be ignored. This also fixes a long-standing bug in which a
+ split with \N substitutions wouldn't cause cross-posting as
+ expected.
+
+ * nnmail.el (nnmail-split-fancy): Document RESTRICT clauses.
+ (nnmail-split-it): Implement them.
+
+ * nnmail.el (nnmail-split-fancy): Document ! splits.
+
+1999-07-07 Stainless Steel Rat <ratinox@peorth.gweep.net>
+
+ * pop3.el: New version.
+
+1999-07-05 Simon Josefsson
+
+ * gnus-srvr.el (gnus-browse-foreign-server): Use read.
+
+1999-07-07 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * gnus-art.el (gnus-mime-display-alternative): Do treatment.
+
+1999-07-06 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * gnus-util.el (gnus-write-active-file): Use real name.
+
+ * gnus-agent.el (gnus-agent-expire): Update active file
+ method by method.
+
+1999-07-06 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * nndraft.el (nndraft-request-article): Use difference
+ coding-systems for queue and drafts.
+
+ * gnus-sum.el (gnus-summary-setup-default-charset): Special-case
+ nndraft:drafts.
+
+ * mm-util.el (mm-auto-save-coding-system): New coding system.
+
+ * message.el (message-draft-coding-system): Use it.
+
+1999-07-06 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * mm-uu.el: More customizable and less aggressive.
+
+1999-07-07 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * gnus-start.el (gnus-groups-to-gnus-format): Only gnus-active
+ when plugged.
+
+ * mml.el (mml-generate-mime-1): Don't insert nofile files.
+ (mml-insert-mml-markup): Accept a nofile.
+ (mml-insert-mime): Insert nofile.
+
+ * gnus-art.el (gnus-treat-strip-blank-lines): Removed.
+
+ * mm-decode.el (mm-handle-media-type): New function.
+ (mm-handle-media-supertype): New function.
+ (mm-handle-media-subtype): New function.
+ Use new functions throughout. "/"))
+
+1999-05-18 Katsumi Yamaoka <yamaoka@jpl.org>
+
+ * gnus-art.el (gnus-treat-predicate): Typo.
+
+1999-07-07 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * gnus-score.el (gnus-summary-score-entry): Made un-interactive.
+
+1999-07-06 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * gnus-art.el (article-date-ut): UT! Default it!
+
+1999-07-06 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
+
+ * gnus.el: Pterodactyl Gnus v0.92 is released.
+
+1999-07-06 Johannes Weinert <Johannes.Weinert@Informatik.Uni-Oldenburg.DE>
+
+ * gnus-sum.el (gnus-summary-catchup-and-exit): Doc fix.
+
+1999-07-06 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * nntp.el (nntp-retrieve-groups): Don't do anything when not
+ connected.
+
+ * gnus-start.el (gnus-active-to-gnus-format): Only save active
+ when plugged.
+
+ * mm-view.el (mm-inline-message): Ignore remove-spec.
+
+ * gnus-agent.el (gnus-agent-write-active): Check whether orig sym
+ is bound.
+
+ * gnus-msg.el (gnus-summary-mail-forward): Rename From_ lines.
+
+ * nndoc.el (nndoc-guess-type): Remove blank lines at the start.
+
+ * nnfolder.el (nnfolder-read-folder): Remove blank lines at the
+ start.
+
+ * message.el (message-fill-yanked-message): Remove `t' arg.
+
+ * gnus-group.el (gnus-group-kill-group): Message killing of
+ groups.
+
+ * mm-util.el (mm-preferred-coding-system): New function.
+ (mm-mime-charset): Use it.
+
+ * mml.el (mml-generate-mime-1): Charset-encode message parts.
+
+1999-07-06 Alexandre Oliva <oliva@dcc.unicamp.br>
+
+ * gnus-mlsplt.el: New file.
+
+1999-07-06 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * mm-decode.el (mm-inline-Media-tests): Changed from forms to
+ functions.
+ (mm-attachment-override-p): Take a handle instead of a type.
+ (mm-inlined-p): Ditto.
+ (mm-automatic-display-p): Ditto,
+ (mm-inlinable-p): Ditto.
+
+ * nndraft.el (nndraft-request-expire-articles): Delete backup
+ files.
+
+ * mailcap.el (mailcap-parse-mailcap): Regexp-quote stuff.
+
+ * gnus-sum.el (gnus-summary-limit-to-extra): Typo.
+
+1999-07-06 Alexandre Oliva <oliva@dcc.unicamp.br>
+
+ * nnmail.el (nnmail-split-it): Allow .*.
+
+1999-07-05 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * mm-decode.el (mm-inline-large-images-p): Renamed.
+
+ * gnus-art.el (article-date-ut): Always look in the current buffer
+ for the Date header.
+
+ * mml.el (mml-validate): New command.
+
+ * mailcap.el (mailcap-possible-viewers): Revert to string-match
+ since we are dealing with regexps.
+
+1999-07-04 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
+
+ * gnus.el: Pterodactyl Gnus v0.91 is released.
+
+1999-07-04 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * gnus-agent.el (gnus-agent-save-active-1): New function.
+ (gnus-agent-save-active): use it.
+ (gnus-agent-save-groups): Ditto.
+
+ * gnus-cache.el (gnus-cache-write-active): Use it.
+
+ * gnus-agent.el (gnus-agent-write-active): Use it.
+
+ * gnus-util.el (gnus-write-active-file): New function.
+
+ * gnus-agent.el (gnus-agent-write-active): New function to keep
+ lower boundaries and canceled groups.
+ (gnus-agent-save-groups): Use it.
+ (gnus-agent-save-active): Use it.
+ (gnus-agent-save-group-info): Only write active files.
+ (gnus-agent-expire): Update active file.
+
+ * mm-decode.el (mm-inlinable-part-p): Removed.
+ (mm-user-display-methods): Default to nil.
+ (mm-user-display-methods): Removed.
+ (add-mime-display-method): Removed.
+ (mm-automatic-display): Renamed.
+ (mm-automatic-display-p): Use it.
+ (mm-inlined-types): New variable.
+ (mm-inlined-p): New function.
+
+ * message.el (message-reply): Bind message-this-is-mail.
+
+1999-07-03 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * mm-encode.el (mm-encode-buffer): Check whether we have 7bit.
+
+ * message.el (message-check-news-header-syntax): Protect against
+ nil froms.
+
+ * mm-util.el (mm-auto-mode-alist): New.
+
+ * mml.el (mml-generate-mime-1): Ditto.
+
+ * gnus.el: Use mm-insert-file-contents throughout instead of
+ nnheader.
+
+ * mm-util.el (mm-insert-file-contents): New function.
+
+1999-07-03 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
+
+ * gnus.el: Pterodactyl Gnus v0.90 is released.
+
+1999-07-03 Sven Fischer <herpes@kawo2.rwth-aachen.de>
+
+ * mailcap.el (mailcap-possible-viewers): Use string=.
+
+1999-07-01 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * mm-uu.el (mm-uu-forward-begin-line): New variable.
+ (mm-uu-forward-end-line): New variable.
+ (mm-uu-begin-line): Handle forwarded message.
+ (mm-uu-identifier-alist): Ditto.
+ (mm-uu-dissect): Ditto.
+
+1999-07-02 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * nnheader.el (nnheader-file-coding-system): Use raw-text.
+ * gnus-agent.el (gnus-agent-file-coding-system): Ditto.
+ * gnus-cache.el (gnus-cache-coding-system): Ditto.
+
+ * nnfolder.el (nnfolder-file-coding-system): Use mm-text-coding-system.
+ (nnfolder-file-coding-system-for-write): New variable.
+ (nnfolder-active-file-coding-system): New variable.
+ (nnfolder-active-file-coding-system-for-write): New variable.
+ (nnfolder-save-active): New function.
+ (nnfolder-save-buffer): Use them.
+ (nnfolder-possibly-change-group): Ditto.
+ (nnfolder-request-list-newsgroups): Ditto.
+ (nnfolder-request-create-group): Ditto.
+ (nnfolder-request-expire-articles): Ditto.
+ (nnfolder-request-move-article): Ditto.
+ (nnfolder-request-accept-article): Ditto.
+ (nnfolder-request-delete-group): Ditto.
+ (nnfolder-request-rename-group): Ditto.
+ (nnfolder-possibly-change-folder): Ditto.
+ (nnfolder-read-folder): Ditto.
+ (nnfolder-request-list): Remove pathname-coding-system.
+ (nnfolder-possibly-change-group): Use nnmail-pathname-coding-system.
+
+ * nnmail.el (nnmail-file-coding-system): Use raw-text.
+ (nnmail-file-coding-system-1): Removed.
+ (nnmail-find-file): Use nnmail-pathname-coding-system.
+ (nnmail-write-region): Ditto.
+
+ * nnmbox.el (nnmbox-file-coding-system): New variable.
+ (nnmbox-file-coding-system-for-write): New variable.
+ (nnmbox-active-file-coding-system): New variable.
+ (nnmbox-active-file-coding-system-for-write): New variable.
+ (nnmbox-save-buffer): New function.
+ (nnmbox-save-active): New function.
+ (nnmbox-request-scan): Use them.
+ (nnmbox-request-expire-articles): Ditto.
+ (nnmbox-request-move-article): Ditto.
+ (nnmbox-request-accept-article): Ditto.
+ (nnmbox-request-replace-article): Ditto.
+ (nnmbox-request-delete-group): Ditto.
+ (nnmbox-request-rename-group): Ditto.
+ (nnmbox-request-create-group): Ditto.
+
+ * mm-util.el (mm-text-coding-system): raw-text or -dos.
+ (mm-running-ntemacs): Removed.
+
+ * nnml.el (nnml-file-coding-system): Use nnmail-file-coding-system.
+
+1999-07-02 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * nnfolder.el (nnfolder-read-folder): Use nnheader-file-coding-system.
+
+1999-07-01 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * qp.el (quoted-printable-encoding-characters): Support lower case.
+
+1999-07-01 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * rfc2047.el (rfc2047-encode): Fold before B-encoding.
+ (rfc2047-b-encode-region): Encode line by line.
+
+1999-07-03 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * mm-util.el (mm-find-mime-charset-region): Fix.
+
+1999-06-30 KOSEKI Yoshinori <kose@yk.NetLaputa.ne.jp>
+
+ * mm-util.el (mm-mime-mule-charset-alist): Fix iso-2022-jp(-2) bug.
+ (mm-find-mime-charset-region): Ditto.
+
+1999-07-03 Simon Josefsson <jas@pdc.kth.se>
+
+ * gnus-sum.el (gnus-summary-move-article): Fix something or
+ other.
+
+1999-06-29 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * gnus-sum.el (gnus-newsgroup-ephemeral-charset): New variable.
+ (gnus-newsgroup-ephemeral-ignored-charsets): New variable.
+ (gnus-summary-enter-digest-group): Use them.
+ (gnus-summary-setup-default-charset): Ditto.
+
+1999-06-15 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * gnus-msg.el (gnus-configure-posting-styles): Fix bug when
+ gnus-newsgroup-name is nil.
+
+1999-06-15 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * rfc2047.el (rfc2047-encode): Chop the tail newline.
+
+1999-06-15 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * gnus-art.el (article-emphasize): Use correct
+ gnus-article-emphasis-alist.
+
+1999-06-15 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * mm-view.el (mm-inline-text): Fix text/html bug.
+
+1999-06-28 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
+
+ * gnus.el: Pterodactyl Gnus v0.89 is released.
+
+1999-06-24 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * nnmail.el (nnmail-file-coding-system-1): For NTEmacs in Windows.
+ * message.el (message-draft-coding-system): Ditto.
+ * mm-util.el (mm-running-ntemacs): Ditto.
+
+1999-06-23 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * mm-view.el (mm-inline-text): Ignore error in w3-region.
+
+1999-06-23 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * mml.el: require mm-decode.
+
+1999-06-23 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * gnus-art.el (gnus-display-mime): Treat as head only if necessary.
+
+1999-06-23 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * mm-view.el (mm-inline-image): Fix image undisplayer.
+
+1999-06-22 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * mml.el (mml-insert-multipart): Error in compeling-read.
+ (mml-insert-tag): Match tags.
+
+1999-06-19 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * gnus-cache.el (gnus-cache-braid-nov): Fix coding-system bug.
+ (gnus-cache-braid-heads): Ditto.
+ (gnus-cache-retrieve-headers): Ditto.
+
+1999-06-16 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * gnus-draft.el (gnus-draft-send): Fix encoding bug.
+
+1999-06-16 Katsumi Yamaoka <yamaoka@jpl.org>
+
+ * gnus-art.el (gnus-article-read-summary-keys): Convert key events
+ to string under XEmacs.
+
+1999-06-28 Petersen Jens-Ulrik <jens-ulrik.petersen@nokia.com>
+
+ * gnus-start.el (gnus-find-new-newsgroups): Doc fix.
+
+1999-06-22 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * mm-view.el (mm-inline-message): Fix message view bug.
+ * gnus-art.el (gnus-article-prepare): Ditto.
+
+1999-06-16 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * gnus-cache.el (gnus-cache-possibly-enter-article): Fetch headers.
+
+1999-06-15 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
+
+ * gnus.el: Pterodactyl Gnus v0.88 is released.
+
+1999-06-15 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * gnus-sum.el (gnus-summary-save-parts): Destroy handles after
+ usage.
+
+ * nnmail.el (nnmail-get-new-mail): Save info.
+
+1999-06-14 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
+
+ * gnus.el: Pterodactyl Gnus v0.87 is released.
+
+1999-06-14 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * mail-source.el (mail-source-fetch-file): Use prescript-delay.
+ (mail-source-run-script): New function.
+ (mail-source-fetch-pop): Use it.
+
+1999-06-13 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * gnus-art.el (gnus-article-setup-highlight-words): Moved here.
+
+1999-06-13 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
+
+ * gnus.el: Pterodactyl Gnus v0.86 is released.
+
+1999-06-13 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * gnus-art.el (gnus-treat-translate): New variable.
+ (gnus-treat-predicate): Accept a list of regexps.
+ (gnus-article-treat-custom): Allow a list of regexps.
+
+1999-06-09 Markus Rost <markus.rost@mathematik.uni-regensburg.de>
+
+ * gnus/gnus-group.el (gnus-permanently-visible-groups): Fix custom
+ type.
+
+1999-06-13 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * gnus-art.el (article-babel): Narrow a bit.
+
+ * gnus-agent.el (gnus-agent-get-undownloaded-list): Was too slow.
+
+1999-06-12 Simon Josefsson <jas@pdc.kth.se>
+
+ (gnus-agent-get-undownloaded-list): Operate on all articles, not
+ only unread ones.
+ (gnus-agent-fetch-headers): Fetch headers from unread and marked
+ articles, not only unread ones.
+
+1999-06-13 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * gnus-sum.el (gnus-summary-limit-to-extra): New command and
+ keystroke.
+
+ * gnus-art.el (gnus-article-x-face-command): Ditto.
+
+ * gnus-uu.el (gnus-uu-default-view-rules): Default to "display".
+
+ * gnus.el (gnus-method-simplify): Accept server names.
+
+1999-06-13 Per Abrahamsen <abraham@dina.kvl.dk>
+
+ * gnus-art.el (article-babel-prompt): New function.
+ (article-babel): New command.
+
+1999-06-13 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * gnus-art.el (gnus-article-part-wrapper): Go to part.
+
+ * mml.el (mml-generate-mime-1): Don't insert literally.
+
+ * gnus-util.el (gnus-parse-netrc): Skip lines with #'s.
+ (gnus-netrc-syntax-table): Removed.
+ (gnus-parse-netrc): Don't use syntax table; just use whitespace.
+
+1999-05-05 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * mm-view.el (mm-inline-text): Fix charset for text/html.
+
+1999-05-05 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * message.el (message-draft-coding-system): Use emacs-mule-dos.
+
+1999-06-12 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * nnmail.el (nnmail-split-incoming): Return the number of split
+ mails.
+ (nnmail-process-babyl-mail-format): Ditto.
+ (nnmail-process-unix-mail-format): Ditto.
+ (nnmail-process-mmdf-mail-format): Ditto.
+ (nnmail-process-maildir-mail-format): Ditto.
+
+ * mail-source.el (mail-source-callback): Return the number from
+ the callback.
+
+ * message.el (message-send-mail): Generate Lines.
+
+ * mail-source.el (mail-source-call-script): New function.
+ (mail-source-call-script): New function.
+
+1999-05-02 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * gnus-sum.el (gnus-summary-setup-highlight-words): New function.
+ (gnus-select-newsgroup): Use it.
+ (gnus-group-highlight-words-alist): New variable.
+ (gnus-newsgroup-emphasis-alist): New variable.
+ (gnus-summary-local-variables): Use it.
+ * gnus-art.el (article-emphasize): Use it.
+ (gnus-emphasis-highlight-words): New face.
+ * gnus-cus.el (gnus-group-parameters): New parameter.
+
+1999-05-02 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * gnus-cache.el (gnus-cache-possibly-enter-article): Remove
+ parameter `headers'.
+ (gnus-cache-enter-article): Ditto.
+ (gnus-cache-update-article): Ditto.
+ * gnus-sum.el (gnus-summary-move-article): Ditto.
+ (gnus-summary-mark-article-as-unread): Ditto.
+ (gnus-summary-mark-article): Ditto.
+
+1999-06-12 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * gnus-msg.el (gnus-message-insert-stylings): Removed.
+ (gnus-posting-style-alist): Removed.
+ (gnus-message-style-insertions): Ditto.
+ (gnus-configure-posting-styles): Reimplementation.
+
+ * mail-source.el (mail-source-fetch): Error the message.
+
+ * gnus-msg.el (gnus-inews-do-gcc): Do mml and encoding.
+
+1999-06-12 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
+
+ * gnus.el: Pterodactyl Gnus v0.85 is released.
+
+1999-04-20 Michael Cook <cook@sightpath.com>
+
+ * gnus-cite.el (gnus-cite-attribution-prefix): Tweak for MS
+ Outlook citation regex.
+
+1999-06-12 Lars Magne Ingebrigtsen <pinard@iro.umontreal.ca>
+
+ * nndoc.el (nndoc-mime-parts-type-p): Accept space before
+ semicolon.
+
+1999-05-24 Simon Josefsson <jas@pdc.kth.se>
+
+ * gnus-range.el (gnus-remove-from-range): Document range1
+ modification, protect range2.
+
+1999-05-24 Simon Josefsson <jas@pdc.kth.se>
+
+ * gnus-sum.el (gnus-update-marks): Protect lists from
+ gnus-remove-from-range, don't sort twice.
+
+1999-05-21 Simon Josefsson <jas@pdc.kth.se>
+
+ * gnus-start.el (gnus-read-descriptions-file): Protect if no
+ function in backend.
+
+1999-05-15 Simon Josefsson <jas@pdc.kth.se>
+
+ * gnus-sum.el (gnus-valid-move-group-p): Check for a
+ request-accept-article function in the backend instead of using
+ the 'respool capability.
+
+1999-04-18 Hrvoje Niksic <hniksic@srce.hr>
+
+ * mm-bodies.el (mm-decode-content-transfer-encoding): Handle
+ spurious whitespace at eob.
+
+1999-06-12 Adrian Aichner <aichner@ecf.teradyne.com>
+
+ * nnmail.el (nnmail-get-new-mail): Check right variable.
+
+1999-06-12 Karl Kleinpaste <karl@justresearch.com>
+
+ * mailcap.el (mailcap-mime-data): Fix rfc822.
+
+1999-06-12 TOZAWA Akihiko <miles@is.s.u-tokyo.ac.jp>
+
+ * nndoc.el (nndoc-nsmail-type-p): New function.
+ (nndoc-type-alist): Recognize nsmail.
+
+1999-05-12 Mike McEwan <mike@lotusland.demon.co.uk>
+
+ * gnus-art.el (gnus-treatment-function-alist): Display `x-face'
+ *before* `article-hide-headers' deletes the information.
+
+1999-05-22 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * gnus-sum.el (gnus-summary-save-parts): New command and
+ keystroke.
+ (gnus-summary-save-parts-1): New function.
+ (gnus-summary-iterate): Buggy.
+
+ * mm-decode.el (mm-save-part-to-file): Made into own function.
+
+1999-05-11 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * gnus-group.el (gnus-group-set-info): Resist nils.
+
+1999-05-04 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * mailcap.el (mailcap-mime-data): Ditto.
+
+ * gnus-uu.el (gnus-uu-default-view-rules): Ditto.
+
+ * gnus-art.el (gnus-article-x-face-command): Default to ee.
+
+1999-05-02 Gareth Jones <gdj1@gdjones.demon.co.uk>
+
+ * gnus-art.el (article-make-date-line): Put X-Sent below Date if
+ gnus-article-date-lapsed-new-header is t.
+
+1999-05-01 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
+
+ * gnus.el: Pterodactyl Gnus v0.84 is released.
+
+1999-05-02 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * gnus-msg.el (gnus-bug-message): Mime change.
+
+1999-04-22 Simon Josefsson <jas@pdc.kth.se>
+
+ * gnus-sum.el (gnus-update-marks): Process null mark lists.
+
+1999-04-21 Hrvoje Niksic <hniksic@srce.hr>
+
+ * mm-bodies.el (mm-decode-content-transfer-encoding): Recognize
+ `x-uue'.
+
+1999-03-04 Aaron M. Ucko <amu@mit.edu>
+
+ * mail-source.el (mail-source-fetch-pop): Only prompt for password
+ when authentication is 'password.
+
+1999-05-02 <pinard@iro.umontreal.ca>
+
+ * gnus-win.el (gnus-configure-windows): Accept a setting.
+
+1999-04-21 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * mm-util.el (mm-quote-arg): Moved here.
+
+ * mm-decode.el (mm-quote-arg): Quote more chars.
+
+1999-04-18 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * nnheader.el (nnheader-parse-head): Message-ID in In-Reply-To
+ with newlines would create buggy .nov files.
+
+ * gnus-art.el (gnus-article-date-lapsed-new-header): Default to nil.
+
+ * qp.el (quoted-printable-encode-region): Encode whitespace at the
+ end of lines.
+
+ * message.el (message-mode): Doc fix.
+
+ * gnus-art.el (article-hide-headers): Delete the hidden headers.
+
+ * gnus-msg.el (gnus-setup-posting-charset): Default group to "".
+
+ * gnus-art.el (article-date-ut): Rewrite.
+
+ * mm-decode.el (mm-preferred-alternative-precedence): Reverse the
+ order.
+
+ * gnus-msg.el (gnus-message-insert-stylings): Remove duplicate
+ headers.
+
+ * gnus-art.el (gnus-article-date-lapsed-new-header): Doc fix.
+
+1999-04-18 Didier Verna <verna@inf.enst.fr>
+
+ * gnus-art.el (gnus-article-date-lapsed-new-header): new variable.
+ (article-date-ut): use it.
+
+1999-04-18 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * mail-source.el (mail-source-fetch-pop): Call script
+ asynchronously.
+
+1999-04-18 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
+
+ * gnus.el: Pterodactyl Gnus v0.83 is released.
+
+1999-04-18 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * gnus-draft.el (gnus-draft-mode): Use mml minor mode.
+
+ * gnus-cite.el (gnus-dissect-cited-text): Off-by-one error.
+
+ * gnus-uu.el (gnus-uu-mark-thread): Save hidden threads.
+
+ * gnus-art.el (gnus-mime-inline-part): Don't do a charset param.
+
+ * gnus-msg.el (gnus-bug): Use application/x-emacs-lisp.
+
+ * message.el (message-generate-headers): Accept continuation
+ headers.
+
+1999-04-18 Renaud Rioboo <Renaud.Rioboo@lip6.fr>
+
+ * gnus-demon.el (gnus-demon-time-to-step): Not strings.
+
+1999-04-18 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * gnus-art.el (gnus-treatment-function-alist): use
+ maybe-hide-headers.
+
+ * message.el (message-inhibit-body-encoding): Typo.
+ (message-resend): Inhibit encoding.
+
+ * gnus-sum.el (gnus-summary-toggle-header): Decode rfc2047.
+
+ * gnus-art.el (article-remove-cr): Use re-search.
+
+ * rfc2231.el (rfc2231-parse-string): Allow broken elm MIME
+ headers.
+
+ * mm-decode.el (mm-quote-arg): Quote '.
+
+ * gnus-ems.el (gnus-x-splash): Would place splash wrongly.
+
+ * mm-decode.el (mm-insert-part): Use multibyte for text.
+
+ * gnus-start.el (gnus-read-newsrc-file): New variable.
+ (gnus-read-newsrc-file): Use it.
+
+1999-04-17 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * nnvirtual.el (nnvirtual-request-expire-articles): New function.
+
+ * gnus-group.el (gnus-group-expire-articles-1): Made into own
+ function.
+
+1999-04-17 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
+
+ * gnus.el: Pterodactyl Gnus v0.82 is released.
+
+1999-04-15 Hrvoje Niksic <hniksic@srce.hr>
+
+ * gnus-sum.el (gnus-group-charset-alist): Include Croatian groups
+ for iso8859-2.
+
+1999-04-17 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * mm-util.el (mm-charset-synonym-alist): Remove iso-2022-jp-2 from
+ synonym alist.
+
+1999-04-17 Adam P. Jenkins <ajenkins@netway.com>
+
+ * gnus-sum.el (gnus-summary-local-variables): Mark as global.
+
+1999-04-17 Ettore Perazzoli <ettore@comm2000.it>
+
+ * mail-source.el (mail-source-fetch): Ask before bugging out.
+
+1999-03-19 Hrvoje Niksic <hniksic@srce.hr>
+
+ * uudecode.el (uudecode-decode-region-external): Don't assume
+ uudecode-temporary-file-directory ends with a slash.
+
+1999-03-18 Simon Josefsson <jas@pdc.kth.se>
+
+ * gnus-sum.el (gnus-update-marks):
+ (gnus-update-read-articles):
+ (gnus-summary-expire-articles): Check server.
+
+1999-03-16 Simon Josefsson <jas@pdc.kth.se>
+
+ * mml.el (mml-preview): New function.
+
+1999-04-17 William M. Perry <wmperry@aventail.com>
+
+ * mail-source.el (mail-source-fetch-file): Return the right
+ value.
+
+1999-04-17 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * mml.el (mml-insert-parameter): New function.
+ (mml-insert-parameter-string): New function.
+
+ * nnmail.el (nnmail-get-new-mail): Say how many new articles.
+
+ * gnus-art.el (gnus-mime-multipart-functions): New variable.
+ (gnus-mime-display-part): Use it.
+
+ * mm-decode.el (mm-alternative-precedence): Removed.
+ (mm-discouraged-alternatives): New variable.
+ (mm-preferred-alternative-precedence): New function.
+
+ * nnmail.el (nnmail-get-new-mail): Use mail-sources.
+
+ * mail-source.el (mail-sources): New variable.
+
+ * gnus-art.el (article-remove-cr): Remove several trailing CRs.
+
+ * mm-decode.el (mm-valid-image-format-p): New function.
+ (mm-inline-media-tests): Use it.
+ (mm-valid-and-fit-image-p): New function.
+
+ * gnus-agent.el (gnus-agent-fetch-groups): Error when unplugged.
+ (gnus-agent-fetch-group): Ditto.
+
+1999-04-12 Didier Verna <verna@inf.enst.fr>
+
+ * nnmail.el (nnmail-article-group): in case of a group name
+ containing "\\n" constructs, be sure to pass the expanded value to
+ nn*-save-mail.
+
+1999-04-17 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
+
+ * gnus.el: Pterodactyl Gnus v0.81 is released.
+
+1999-04-16 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * gnus-sum.el (gnus-get-split-value): Reverse result.
+
+1999-04-03 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * gnus-start.el (gnus-always-read-dribble-file): Doc fix.
+
+1999-04-02 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * mml.el (mml-insert-tag): Insert concluding part.
+
+ * message.el (message-send-mail): Encode later.
+ (message-send-news): Ditto.
+
+ * nnfolder.el: Don't use mail delim.
+
+1999-03-28 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * gnus-cus.el (gnus-group-customize): Put point at min.
+
+ * mm-view.el (mm-inline-text): Allow toggling html.
+
+1999-03-28 William M. Perry <wmperry@aventail.com>
+
+ * mail-source.el: Added prescript and postscript to file.
+
+1999-03-28 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * nnmail.el: Reverted.
+
+ * gnus-msg.el (gnus-setup-posting-charset): Didn't work.
+ (gnus-setup-posting-charset): Did work.
+
+1999-03-28 Jae-you Chung <jay@pllab.kaist.ac.kr>
+
+ * gnus.el (gnus-short-group-name): Use
+ gnus-group-uncollapsed-levels.
+
+1999-03-28 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * gnus-cite.el (gnus-dissect-cited-text): Don't remove overlays.
+
+1999-03-26 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * gnus-art.el (gnus-treat-strip-headers-in-body): New variable.
+ (article-strip-headers-from-body): New command and keystroke.
+
+1999-03-14 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * mail-source.el (mail-source-fetch-pop): Check for symbol first.
+
+ * nnheader.el (nnheader-insert-file-contents): Bind
+ enable-local-eval to nil.
+ (nnheader-find-file-noselect): Ditto.
+
+ * nnmail.el (nnmail-article-group): Don't remove long lines.
+ (nnmail-remove-long-lines): New function.
+ (nnmail-split-header-length-limit): Removed.
+
+ * mml.el (mml-generate-mime-1): Use unibyte buffers.
+
+ * gnus-group.el (gnus-group-kill-all-zombies): Query user.
+
+1999-03-06 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * gnus-sum.el (gnus-summary-generic-mark): New function.
+
+ * nnmail.el (nnmail-split-header-length-limit): Increased.
+ (nnmail-article-group): Allow nil.
+
+ * gnus-cite.el (gnus-cite-parse-wrapper): Inhibit point-motion.
+
+ * nndoc.el (nndoc-generate-mime-parts-head): Insert real headers
+ first.
+
+ * mml.el (mml-minibuffer-read-type): Include types from
+ mailcap-mime-data.
+
+ * nndraft.el (nndraft-request-article): Would clobber Japanese.
+
+1999-03-05 Hrvoje Niksic <hniksic@srce.hr>
+
+ * mml.el (mml-insert-tag): New function.
+ (mml-read-file): Renamed to mml-minibuffer-read-file to avoid
+ confusion with functions like `mml-read-tag'.
+ (mml-read-type): Ditto with `mml-minibuffer-read-type'.
+ (mml-minibuffer-read-description): Ditto with
+ `mml-minibuffer-read-description'.
+ (mml-attach-buffer): New function.
+ (mml-mode-map): New entry for /.
+ (mml-minibuffer-read-type): Accept DEFAULT.
+
+ * mml.el (mml-quote-region): Narrow the region.
+
+ * message.el (message-mode-menu): message-mime-attach-file is now
+ mml-attach-file.
+
+1999-03-05 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * gnus-art.el (gnus-treatment-function-alist): Do emphasis earlier.
+
+1999-03-05 Robert Bihlmeyer <robbe@orcus.priv.at>
+
+ * mml.el (mml-attach-buffer): New command.
+
+1999-02-27 Simon Josefsson <jas@pdc.kth.se>
-1999-12-19 Dave Love <fx@gnu.org>
+ * gnus-sum.el (gnus-update-marks): Call gnus-remove-from-range
+ with a proper range. Compress range.
- * mail/pop3.el (pop3-movemail-file-coding-system): Doc fix.
- (pop3-movemail): Replace binding of
- pop3-movemail-file-coding-system.
+ * gnus-range.el (gnus-remove-from-range): Protect arguments.
-1999-10-23 Dave Love <fx@gnu.org>
+1999-03-05 Lars Magne Ingebrigtsen <larsi@gnus.org>
- * nnvirtual.el (nnvirtual-create-mapping): Don't use mapc.
+ * mm-decode.el (mm-get-image): Create a temporary file for xbms.
-1999-10-19 Dave Love <fx@gnu.org>
+1999-03-04 Lars Magne Ingebrigtsen <larsi@gnus.org>
- * pop3.el: Merge changes from version `1.3s' which we weren't sent.
+ * gnus-picon.el (gnus-picons-x-face-file-name): Removed.
+ (gnus-picons-convert-x-face): Removed.
+ (gnus-picons-article-display-x-face): Removed.
+ (gnus-picons-x-face-sentinel): Ditto.
+ (gnus-picons-display-x-face): Ditto.
-1999-10-15 Stefan Monnier <monnier@cs.yale.edu>
+1999-03-04 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
- * gnus-start.el (gnus-slave-save-newsrc):
- * gnus-uu.el (gnus-uu-tmp-dir, gnus-uu-decode-binhex)
- (gnus-uu-decode-binhex-view, gnus-uu-digest-mail-forward)
- (gnus-uu-initialize):
- * nnmail.el (nnmail-make-complex-temp-name, nnmail-get-new-mail):
- Use make-temp-file.
+ * gnus.el: Pterodactyl Gnus v0.80 is released.
-1999-09-07 Eli Zaretskii <eliz@gnu.org>
+1999-03-02 Lars Magne Ingebrigtsen <larsi@gnus.org>
- * nnsoup.el (nnsoup-tmp-directory): Use temporary-file-directory.
+ * gnus-art.el (gnus-mm-display-part): Narrow to the part itself.
- * gnus-uu.el (gnus-uu-tmp-dir): Use temporary-file-directory.
+ * gnus-sum.el (gnus-with-article): Moved here.
-1999-08-24 Andreas Schwab <schwab@gnu.org>
+ * mail-source.el (mail-source-fetch-pop): Ask for password even
+ when program.
- * gnus-art.el (gnus-emphasis-underline-italic): Doc fix.
+1999-02-28 Lars Magne Ingebrigtsen <larsi@gnus.org>
-1999-07-01 Karl Heuer <kwzh@gnu.org>
+ * gnus-msg.el (gnus-bug): Add description.
- * gnus-uu.el (gnus-uu-decode-save-view): Fix typo.
+ * mml.el (mml-insert-mml-markup): Insert disposition.
-1999-06-12 Markus Rost <markus.rost@mathematik.uni-regensburg.de>
+ * message.el (message-send-mail): Always encode mail headers.
- * gnus-group.el (gnus-permanently-visible-groups): Fix custom type.
+1999-02-28 Lars Magne Ingebrigtsen <larsi@gnus.org>
-1999-04-08 Richard Stallman <rms@gnu.org>
+ * gnus-art.el (gnus-treat-article): Only run the highlight stuff
+ when requested.
- * pop3.el (pop3-read-passwd): Use read-passwd if that is defined.
+ * nnmail.el (nnmail-current-spool): Removed.
- * nnmail.el (nnmail-read-passwd): Use read-passwd if that is defined.
+ * gnus-salt.el (gnus-tree-inhibit): New varible.
-1999-04-07 Richard Stallman <rms@gnu.org>
+ * gnus.el (mm-util): Required.
- * gnus-mh.el (gnus-summary-save-in-folder): Use mh-lib-progs.
+1999-02-27 paul stevenson <spaul@mail.phy.ornl.gov>
-1999-04-06 Richard Stallman <rms@gnu.org>
+ * gnus-sum.el (gnus-summary-toggle-header): Narrow to head first.
- * nnlistserv.el: When compiling, ignore errors in nnweb.
+1999-02-27 Lars Magne Ingebrigtsen <larsi@gnus.org>
-1999-02-19 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
+ * mail-source.el (mail-source-bind): Doc fix.
- * gnus.el: Gnus v5.6.46 is released.
+1999-02-26 Lars Magne Ingebrigtsen <larsi@gnus.org>
-1999-02-19 Lars Magne Ingebrigtsen <larsi@gnus.org>
+ * message.el (message-mode): Doc fix.
- * gnus-mule.el (""): Default to iso-latin-1.
+ * mm-encode.el (mm-content-transfer-encoding-defaults): Use 8bit
+ encoding.
-1999-01-16 Tom Breton <tob@world.std.com>
+ * gnus.el (gnus-methods-equal-p): Moved here.
- * gnus-agent.el (gnus-agent-expire): Fix.
+ * mail-source.el: pop at 110.
-1999-01-16 Remek Trzaska <remek@npac.syr.edu>
+ * pop3.el (pop3-movemail): Use write-region instead of
+ append-to-file to avoid excessive messaging.
- * gnus-ems.el (): Recognize cygwin.
+1999-02-27 lantz moore <lmoore@contigo.com>
-1998-12-02 Lars Magne Ingebrigtsen <larsi@gnus.org>
+ * nnmail.el (nnmail-get-new-mail): honor suffix for spool-files of
+ type directory.
- * nnfolder.el (nnfolder-save-mail): Handle From lines in
- headers.
+1999-03-04 Robert Bihlmeyer <robbe@orcus.priv.at>
-1998-11-21 Lars Magne Ingebrigtsen <larsi@gnus.org>
+ * gnus-art.el (article-hide-boring-headers): Field names must not
+ contain whitespace.
- * message.el (message-ignored-supersedes-headers): Remove
- NNTP-Posting-Date.
+1999-02-26 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
-1998-11-19 Lars Magne Ingebrigtsen <larsi@gnus.org>
+ * gnus.el: Pterodactyl Gnus v0.79 is released.
- * gnus-uu.el (gnus-quote-arg-for-sh-or-csh): Quote semicolon.
+1999-02-26 Lars Magne Ingebrigtsen <larsi@gnus.org>
-1998-11-19 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
+ * gnus-cite.el (gnus-cite-toggle): Don't remove highlighting.
- * gnus.el: Gnus v5.6.45 is released.
+ * mml.el (mml-mode): Don't use add-minor-mode.
-1998-11-08 Andrew Innes <andrewi@harlequin.co.uk>
+ * message.el (messgage-inhibit-body-encoding): New variable.
+ (message-encode-message-body): Use it.
- * nntp.el (nntp-request-group): Allow for error codes.
+1999-02-26 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
-1998-10-12 Andrew Innes <andrewi@harlequin.co.uk>
+ * gnus.el: Pterodactyl Gnus v0.78 is released.
- * gnus/nntp.el (nntp-possibly-change-group): Allow for unexpected
- responses to GROUP command, since this may be called from a timer
- with quit inhibited.
+1999-02-26 Lars Magne Ingebrigtsen <larsi@gnus.org>
-1998-10-11 Lars Magne Ingebrigtsen <larsi@gnus.org>
+ * message.el (message-mode): Switch on MML mode.
- * gnus-agent.el (gnus-agent-expire): Check (car expired).
+ * mml.el: Included commands and functions.
+ (mml-mode-map): New keymap.
-1998-10-02 Lars Magne Ingebrigtsen <larsi@gnus.org>
+ * message.el: Removed the insertion commands and functions.
- * gnus-cache.el (gnus-cache-generate-active): Ignore directories
- that start with a dot.
+ * gnus-ems.el (gnus-mule-cite-add-face): Removed.
-1998-10-01 Lars Magne Ingebrigtsen <larsi@gnus.org>
+ * gnus-sum.el (gnus-summary-sort-by-chars): New command and
+ keystroke.
- * nnmail.el (nnmail-article-group): Expand properly.
+ * gnus-art.el (gnus-narrow-to-page): Revert.
- * gnus-group.el (gnus-group-apropos): Also do non-active groups.
+ * gnus-cite.el (gnus-cite-delete-overlays): New function.
+ (gnus-cite-parse-maybe): Always reparse.
-1998-09-29 Lars Magne Ingebrigtsen <larsi@gnus.org>
+ * message.el (message-encode-message-body): Don't insert
+ "multipart warning".
- * gnus-async.el (gnus-make-async-article-function): Don't use
- push.
+ * gnus-art.el (gnus-article-treat-head-custom): New variable.
-1998-09-24 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
+1999-02-25 Miles Bader <miles@ccs.mt.nec.co.jp>
- * gnus.el: Gnus v5.6.44 is released.
+ * mail-source.el (mail-source-fetch-pop): Return 1 for success.
-1998-09-23 Markus Rost <markus.rost@mathematik.uni-regensburg.de>
+ * nnmail.el: Require mm-util.
- * gnus.el: Extend autoloads.
+1999-02-26 Justin Sheehy <justin@linus.mitre.org>
-1998-09-15 Lars Magne Ingebrigtsen <larsi@gnus.org>
+ * nnmail.el (nnmail-get-new-mail): Only get mail for the one
+ group.
- * gnus-draft.el (gnus-draft-send): Bind required headers to nil.
- (gnus-draft-send): No.
+1999-02-26 SeokChan LEE <chan@smoky-blue.com>
-1998-09-14 Lars Magne Ingebrigtsen <larsi@gnus.org>
+ * mm-bodies.el (mm-body-charset-encoding-alist): Add euc-kr.
- * message.el (message-fix-before-sending): Comment out invisible
- text things.
+1999-02-21 Simon Josefsson <jas@pdc.kth.se>
-1998-09-14 Tatsuya Ichikawa <ichikawa@hv.epson.co.jp>
+ * gnus-msg.el (gnus-extended-version): Better regexp.
- * gnus-agent.el (gnus-agent-file-coding-system): Renamed.
+1999-02-25 Didier Verna <verna@inf.enst.fr>
-1998-09-13 Mike McEwan <mike@lotusland.demon.co.uk>
+ * nnmail.el (nnmail-split-it): new syntax: `(! FUNC SPLIT)'. FUNC
+ is called with the result of SPLIT and should return a new split.
- * gnus-agent.el (gnus-agent-expire): Stop expiry barfing on killed
- groups.
+ * gnus.texi: update the doc.
-1998-09-13 Lars Magne Ingebrigtsen <larsi@gnus.org>
+1999-02-23 Didier Verna <verna@inf.enst.fr>
- * gnus-agent.el (gnus-agent-save-group-info): Create proper active
- lines.
+ * gnus-picon.el (gnus-picons-display-bar-p): when picons are
+ displayed in the article buffer, output bars if
+ `gnus-picons-display-article-move-p'.
-1998-09-10 Lars Magne Ingebrigtsen <larsi@gnus.org>
+1999-02-20 Aaron M. Ucko <amu@mit.edu>
- * gnus-draft.el (gnus-draft-edit-message): Save the buffer.
+ * mail-source.el (mail-source-fetch-pop): Typo.
-1998-09-06 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
+1999-02-26 Lars Magne Ingebrigtsen <larsi@gnus.org>
- * gnus.el: Gnus v5.6.43 is released.
+ * gnus-sum.el (gnus-summary-toggle-header): Save restriction.
-1998-09-06 Lars Magne Ingebrigtsen <larsi@gnus.org>
+1999-02-23 Lars Magne Ingebrigtsen <larsi@gnus.org>
- * gnus-sum.el (gnus-remove-thread): Unhide threads before
- removing.
- (gnus-data-compute-positions): Ditto.
+ * gnus-cite.el (gnus-cite-parse-wrapper): Always parse.
-1998-08-31 Shuhei KOBAYASHI <shuhei-k@jaist.ac.jp>
+1999-02-21 Lars Magne Ingebrigtsen <larsi@gnus.org>
- * nnmail.el (nnmail-date-to-time): Parse time locally if no
- timezone.
+ * mml.el (mml-insert-buffer): New function.
-1998-08-31 Lars Magne Ingebrigtsen <larsi@gnus.org>
+ * message.el (message-forward): Insert the buffer in the buffer.
- * gnus-srvr.el (gnus-browse-foreign-server): Protect against
- out-of-range articles.
+1999-02-21 Shenghuo ZHU <zsh@cs.rochester.edu>
- * gnus-msg.el (gnus-summary-reply): Don't inhibit posting styles.
+ * mm-view.el (mm-inline-message): Insert part in narrowed region.
-1998-08-30 Lars Magne Ingebrigtsen <larsi@gnus.org>
+1999-02-20 Shenghuo ZHU <zsh@cs.rochester.edu>
- * gnus-score.el (gnus-summary-increase-score): Temporary third
- majuscle.
+ * gnus-sum.el (gnus-summary-toggle-header): Save restriction.
-1998-08-30 Dan Christensen <jdc@playmate.mat.jhu.edu>
+1999-02-20 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
- * gnus-score.el (gnus-summary-increase-score): Score thread on
- Message-ID.
+ * gnus.el: Pterodactyl Gnus v0.77 is released.
-1998-08-29 Simon Josefsson <jas@pdc.kth.se>
+1999-02-20 Lars Magne Ingebrigtsen <larsi@gnus.org>
- * gnus-sum.el (gnus-summary-mark-article-as-read):
- (gnus-summary-mark-article-as-unread):
- (gnus-summary-mark-article): Call gnus-request-update-mark.
+ * gnus-art.el (gnus-displaying-mime): New variable.
+ (article-narrow-to-head): New function.
-1998-08-29 Mike McEwan <mike@lotusland.demon.co.uk>
+ * mail-source.el (mail-source-fetch-pop): Include pre/postscript.
+ Default to pop instead of pop3.
- * gnus-agent.el (gnus-agent-fetch-headers): Cater for when there's
- no .agentview, all articles have been expired, or everything bar a
- few downloaded arts have been expired.
- (gnus-agent-expire): Mark *all* expired articles as read.
+1999-02-19 Lars Magne Ingebrigtsen <larsi@gnus.org>
-1998-08-29 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
+ * gnus-art.el (article-hide-pgp): Goto body.
- * gnus.el: Gnus v5.6.42 is released.
+ * gnus-uu.el (gnus-uu-digest-mail-forward): Don't kill buffer.
-1998-08-29 Simon Josefsson <jas@pdc.kth.se>
+ * gnus-cite.el: Don't use goto-line.
- * gnus-sum.el (gnus-summary-make-menu-bar): Typo.
+ * gnus-art.el (gnus-article-treat-html): Removed.
+ (gnus-treat-article): Save restriction.
-1998-08-29 Tatsuya Ichikawa <ichikawa@hv.epson.co.jp>
+1999-02-17 Per Abrahamsen <abraham@dina.kvl.dk>
- * gnus-agent.el: Use nnheader-insert-file-contents.
+ * message.el (message-send-mail): Don't untabify.
+ (message-mode): Don't use tabs for indentation.
-1998-08-29 Lars Magne Ingebrigtsen <larsi@gnus.org>
+1999-02-19 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * message.el (message-send-mail): Don't untabify.
+
+ * nnml.el (nnml-save-mail): Typo fix.
- * nnvirtual.el (nnvirtual-request-group): Update the right group.
+1999-02-19 Per Abrahamsen <abraham@dina.kvl.dk>
-1998-08-27 Lars Magne Ingebrigtsen <larsi@gnus.org>
+ * message.el (message-cite-function): Add
+ `message-cite-original-without-signature' customization option.
- * gnus-sum.el (gnus-data-compute-positions): Didn't work on hidden
- threads.
+1999-02-18 Per Abrahamsen <abraham@dina.kvl.dk>
- * nnvirtual.el (nnvirtual-request-group): Work when always
- updating.
- (nnvirtual-always-rescan): Default to t.
+ * nnmail.el (nnmail-fix-eudora-headers): Mark as option to
+ `nnmail-prepare-incoming-header-hook'.
-1998-08-27 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
+1999-02-19 Justin Sheehy <justin@linus.mitre.org>
- * gnus.el: Gnus v5.6.41 is released.
+ * gnus-util.el (gnus-make-sort-function-1): Typo fix.
-1998-08-27 Mike McEwan <mike@lotusland.demon.co.uk>
+1999-02-19 Lars Magne Ingebrigtsen <larsi@gnus.org>
- * gnus-agent.el (gnus-agent-fetch-group-1): Leave the calculation
- of `articles' to `gnus-agent-fetch-headers'.
- (gnus-agent-fetch-headers): We only want headers that are after
- the last entry in `gnus-group-alist'.
+ * gnus-group.el (gnus-group-get-new-news): Require nnmail.
-1998-08-27 Lars Magne Ingebrigtsen <larsi@gnus.org>
+1999-02-18 Michael Cook <cook@sightpath.com>
- * Makefile.in (warn): New.
+ * Recognize Microsoft Outlook's cite attribution conventions.
- * gnus.el: Removed unreferenced bound variables all over.
+1999-02-19 James H. Cloos, Jr. <cloos@jhcloos.com>
- * gnus-group.el (gnus-update-group-mark-positions): Removed topic.
+ * gnus-sum.el: Bind M.
- * gnus-cus.el (gnus-group-customize): No part.
+1999-02-19 Neil Crellin <neilc@wallaby.cc>
- * gnus-agent.el (gnus-category-line-format-alist): Renamed specs.
- (gnus-category-insert-line): Use it.
+ * mail-source.el (mail-source-fetch-pop): Bind pop3-port.
-1998-08-27 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
+1999-02-15 Didier Verna <verna@inf.enst.fr>
- * gnus.el: Gnus v5.6.40 is released.
+ * gnus-picon.el (gnus-group-display-picons): ensures that
+ `article-goto-body' really goes to the article body.
-1998-08-27 Lars Magne Ingebrigtsen <larsi@gnus.org>
+1999-02-19 Lars Magne Ingebrigtsen <larsi@gnus.org>
- * gnus-agent.el (gnus-agent-mode): Only toggle plugged in group
- mode.
+ * mm-view.el (mm-inline-text): Bind url-standalone-mode.
-1998-08-27 Lars Balker Rasmussen <gnort@daimi.aau.dk>
+ * gnus-msg.el (gnus-summary-mail-forward): Create unique names.
- * message.el (message-supersede): Check the right headers.
+ * mm-view.el (mm-view-message): Enable multibyte.
-1998-08-26 Lars Magne Ingebrigtsen <larsi@gnus.org>
+1999-02-11 Lars Magne Ingebrigtsen <larsi@gnus.org>
- * gnus-sum.el (gnus-sort-threads): Changed level.
+ * nnmail.el (nnmail-get-new-mail): Message later.
-1998-08-26 Mike McEwan <mike@lotusland.demon.co.uk>
+ * mm-util.el (mm-find-charset-region): Revert to checking
+ multibyte.
- * gnus-sum.el (gnus-build-all-threads): `save-excursion' and
- `set-buffer' back to `gnus-summary-buffer' in order to access
- buffer-local variables.
+1999-02-11 Matt Pharr <mmp@graphics.stanford.edu>
-1998-08-26 Lars Magne Ingebrigtsen <larsi@gnus.org>
+ * gnus-msg.el (gnus-bug): Encode environment info as a MIME
+ attachment.
- * gnus-sum.el (gnus-data-compute-positions): More and faster.
+1999-02-11 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
-1998-08-26 Matt Pharr <mmp@Graphics.Stanford.EDU>
+ * gnus.el: Pterodactyl Gnus v0.76 is released.
- * message.el (message-wash-subject): Remove more.
+1999-02-06 Felix Lee <flee@cygnus.com>
-1998-08-25 Tatsuya Ichikawa <ichikawa@hv.epson.co.jp>
+ * gnus.el (gnus-group-change-level-function): Typo.
- * gnus-cache.el (gnus-cache-overview-coding-system): New
- variable.
+1999-02-11 Lars Magne Ingebrigtsen <larsi@gnus.org>
-1998-08-25 Albert L. Ting <alt@artisan.com>
+ * gnus-sum.el (gnus-nov-skip-field): Removed.
+ (gnus-nov-field): Ditto.
+ (gnus-nov-parse-extra): Ditto.
+ (gnus-nov-read-integer): Ditto.
- * gnus-group.el (gnus-fetch-group-other-frame): New command.
+1999-02-05 Katsumi Yamaoka <yamaoka@jpl.org>
-1998-08-25 Lars Magne Ingebrigtsen <larsi@gnus.org>
+ * nnheader.el (nnheader-nov-read-message-id): New macro.
+ (nnheader-parse-nov): Use it.
- * gnus-uu.el (gnus-uu-grab-articles): Check for pseudos.
+ * gnus-sum.el (gnus-nov-read-message-id): New macro.
+ (gnus-nov-parse-line): Use it; use `(eobp)' instead of
+ `(eq (char-after) ?\n)'.
- * gnus-art.el (gnus-ignored-headers): More headers.
+1999-02-11 Lars Magne Ingebrigtsen <larsi@gnus.org>
- * gnus-sum.el (gnus-summary-move-article): Update the right
- group.
+ * gnus.el (gnus-other-frame): Always pop up a new frame.
-1998-08-23 Lars Magne Ingebrigtsen <larsi@gnus.org>
+1999-02-10 Shenghuo ZHU <zsh@cs.rochester.edu>
- * gnus-art.el (gnus-ignored-headers): More headers.
+ * gnus-range.el (gnus-range-add): Rewrite.
+
+1999-02-02 Carsten Leonhardt <leo@arioch.oche.de>
+
+ * nnmail.el (nnmail-split-incoming): Added detection of maildir
+ format.
+ (nnmail-process-maildir-mail-format): New function.
+
+ * mail-source.el (mail-source-fetch-maildir): New function.
+ (mail-source-keyword-map): Add default for maildir method.
+ (mail-source-fetcher-alist): Changed "qmail" to "maildir".
+
+1999-02-10 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * mail-source.el (mail-source-fetcher-alist): Remove apop.
+
+ * nndoc.el (nndoc-type-alist): Remove MIME-digest.
+ (nndoc-mime-digest-type-p): Removed.
+
+1999-02-09 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * gnus-art.el (gnus-article-read-summary-keys): Set the point
+ where it is supposed to be.
+ (gnus-treat-play-sounds): New variable.
+
+ * gnus-sum.el (gnus-newsgroup-ignored-charsets): New variable.
+
+ * gnus-art.el (article-display-x-face): Narrow to head.
+ (gnus-article-washed-types): New variable.
+ (article-hide-pgp): Is not a toggle.
+ (gnus-article-hide-text-type): Save types.
+ (article-decode-charset): Use it.
-1998-08-23 Mike McEwan <mike@lotusland.demon.co.uk>
+ * nnmail.el (nnmail-get-new-mail): Ignore procmail.
- * gnus-agent.el (gnus-agent-copy-nov-line): Return to beginning of
- line before next read.
- (gnus-agent-braid-nov): Remove redundant `let'.
+ * message.el (message-forward-start-separator): Removed.
+ (message-forward-end-separator): Removed.
+ (message-signature-before-forwarded-message): Removed.
+ (message-included-forward-headers): Removed.
+ (message-check-news-body-syntax): Don't check forward.
+ (message-forward): Use MIME.
-1998-08-22 Lars Magne Ingebrigtsen <larsi@gnus.org>
+ * nnvirtual.el (nnvirtual-request-article): Bind
+ gnus-article-decode-hook to nil.
- * gnus-art.el (article-display-x-face): Allow multiple X-Faces
- under XEmacs.
+1999-02-06 Lars Magne Ingebrigtsen <larsi@gnus.org>
-1998-08-22 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
+ * mml.el (mml-parse-singlepart-with-multiple-charsets): Check for
+ us-ascii.
- * gnus.el: Gnus v5.6.39 is released.
+1999-02-04 Lars Magne Ingebrigtsen <larsi@gnus.org>
-1998-08-22 Lars Magne Ingebrigtsen <larsi@gnus.org>
+ * format-spec.el (format-spec): Be more robust.
- * gnus-art.el (gnus-ignored-headers): Added more headers.
+ * message.el (message-encode-message-body): Default
+ mail-parse-charset to mail-parse-charset.
-1998-08-21 Lars Magne Ingebrigtsen <larsi@gnus.org>
+ * gnus-sum.el (gnus-summary-edit-article-done): Don't encode.
+ (gnus-summary-edit-article): Bind mail-parse-charset.
- * nnweb.el (nnweb-type): Doc fix.
+ * mml.el (mml-read-tag): Ignore white space after end of tag.
- * gnus-sum.el (gnus-summary-set-process-mark): Move to the right
+ * message.el (message-goto-body): Also work in separatorless
+ articles.
+
+ * mml.el (mml-translate-from-mime): New function.
+ (mml-insert-mime): Ditto.
+ (mml-to-mime): New function.
+ (mime-to-mml): New name.
+
+ * gnus-sum.el (gnus-summary-edit-article): Always select raw
article.
-1998-08-20 Lars Magne Ingebrigtsen <larsi@gnus.org>
+ * gnus-group.el (gnus-group-catchup-current): Unmark groups.
- * nnmail.el (nnmail-spool-file): Allow lists of files.
+ * gnus-sum.el (gnus-summary-setup-default-charset): Don't
+ special-case nndraft groups.
-1998-08-20 Per Starback <starback@update.uu.se>
+1999-02-03 Lars Magne Ingebrigtsen <larsi@gnus.org>
- * gnus/gnus-start.el (gnus-check-first-time-used): Change current
- buffer before creating help group.
+ * gnus-sum.el (gnus-get-newsgroup-headers): Bind charset.
+ (gnus-get-newsgroup-headers): Already bound.
-1998-08-20 Lars Magne Ingebrigtsen <larsi@gnus.org>
+ * message.el (message-encode-message-body): Use posting charset.
- * gnus-msg.el (gnus-message-style-insertions): New variable.
- (gnus-message-insert-stylings): New function.
- (gnus-configure-posting-styles): Use them.
+ * mm-bodies.el (mm-encode-body): Use MIME charsets.
+ (mm-body-encoding): Do CTE.
+ (mm-body-7-or-8): New function.
- * gnus-topic.el (gnus-topic-mode): Don't alter summary-exit-hook.
+ * mm-util.el (mm-mime-charset): Always fall back on alist.
+ (mm-mime-mule-charset-alist): Include katakana-jisx0201.
+ (mm-mime-mule-charset-alist): Add arabic-*-column.
+ (mm-find-mime-charset-region): New function.
- * gnus-sum.el (gnus-select-newsgroup): Don't update group.
+ * format-spec.el (format-spec-make): New function.
- * gnus-msg.el (gnus-setup-message): Bind message-mode-hook.
- (gnus-inhibit-posting-styles): New variable.
- (gnus-summary-reply): Use it.
- (gnus-configure-posting-styles): Ditto.
+ * mail-source.el (format-spec): Required.
+ (mail-source-fetch-with-program): Removed.
+ (mail-source-fetch-with-program): New function.
- * gnus-group.el (gnus-group-suspend): Don't kill dribble buffer.
+ * format-spec.el: New file.
-1998-08-20 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
+1999-02-03 Tatsuya Ichikawa <ichikawa@hv.epson.co.jp>
- * gnus.el: Gnus v5.6.38 is released.
+ * mail-source.el (mail-source-fetch-with-program): Take optional
+ parameter.
-1998-08-20 Lars Magne Ingebrigtsen <larsi@gnus.org>
+1999-02-03 Lars Magne Ingebrigtsen <larsi@gnus.org>
- * message.el (message-mail): Doc fix.
+ * gnus-start.el: Ignore some groups.
+ (gnus-setup-news): Bind nnmail-fetched-sources.
-1998-08-19 Bill Pringlemeir <bpringle@my-dejanews.com>
+ * message.el (message-send-mail): Remove all tabs.
- * messcompat.el (message-send-mail-function): Initialized from
- send-mail-function.
+ * mm-util.el (mm-find-charset-region): Just check whether
+ find-charset-region is defined.
-1998-08-19 Martin Larose <larosem@IRO.UMontreal.CA>
+1999-02-02 Lars Magne Ingebrigtsen <larsi@gnus.org>
- * message.el (message-send-coding-system): New variable.
+ * gnus-group.el (gnus-group-get-new-news): Use
+ nnmail-fetched-sources.
-1998-08-19 Lars Magne Ingebrigtsen <larsi@gnus.org>
+ * nnmail.el (nnmail-fetched-sources): New variable.
+ (nnmail-get-new-mail): Use it.
- * gnus-msg.el (gnus-configure-posting-styles): Reinstated most of
- old code.
+ * mail-source.el (mail-source-fetched-sources): New variable.
+ (mail-source-fetch): Use it.
- * gnus-start.el (gnus-save-newsrc-file): Use coding system.
+1999-02-02 Mark W. Eichin <eichin@thok.org>
-1980-06-08 Mike McEwan <mike@lotusland.demon.co.uk>
+ * gnus.el (gnus-getenv-nntpserver): if the file that
+ gnus-nntpserver-file names has a trailing newline, the
+ string-match will always match, and thus the file will never be
+ read. (^ matches start of "line", \\` matches start of "buffer",
+ which is what was intended...)
- * gnus-agent.el (gnus-agent-braid-nov): Go to right place.
+1999-02-02 Kim-Minh Kaplan <kmkaplan@western.fr>
-1980-06-08 Shuhei KOBAYASHI <shuhei-k@jaist.ac.jp>
+ * gnus-picon.el (gnus-picons-parse-filenames): Quote group names.
- * gnus-group.el (gnus-group-suspend): Fix.
+1999-01-28 Katsumi Yamaoka <yamaoka@jpl.org>
-1998-08-18 Lars Magne Ingebrigtsen <larsi@gnus.org>
+ * gnus-start.el (gnus-read-active-file): Eliminate duplicated
+ select methods.
- * gnus-cite.el (gnus-cited-opened-text-button-line-format-alist):
- New n spec.
+1999-01-27 Simon Josefsson <jas@pdc.kth.se>
- * gnus-group.el (gnus-group-suspend): Use mapcar.
+ * gnus-range.el (gnus-remove-from-range): Sort second argument.
-1998-08-17 Lars Magne Ingebrigtsen <larsi@gnus.org>
+1999-02-02 Scott Hofmann <shofmann@mindspring.com>
- * gnus-ems.el (gnus-add-minor-mode): Set mode var.
+ * nntp.el: Use mail-source-read-passwd instead of nnmail-read-passwd.
- * gnus-start.el (gnus-slave-mode): New function.
+1999-02-01 Shenghuo ZHU <zsh@cs.rochester.edu>
- * gnus-msg.el (gnus-post-method): Work with current in nndraft.
+ * gnus-cus.el (gnus-group-parameters): Charset as symbol, and fix
+ a typo.
+ * gnus-sum.el (gnus-summary-setup-default-charset): Set nndraft's
+ charset to nil.
+ * gnus-agent.el (gnus-agent-queue-setup): Remove charset setting.
+ * gnus-start.el (gnus-start-draft-setup): Ditto.
-1998-08-16 Lars Magne Ingebrigtsen <larsi@gnus.org>
+1999-02-02 Lars Magne Ingebrigtsen <larsi@gnus.org>
- * gnus-art.el (gnus-request-article-this-buffer): Allow recursive
- selection of nneething groups.
+ * mail-source.el (mail-source-fetch-directory): Use the predicate.
+ (mail-source-value): Don't do variables.
- * nneething.el (nneething-address): Renamed from directory.
+ * nnmail.el (nnmail-get-new-mail): Set the predicate.
-1998-08-16 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
+ * gnus-sum.el (gnus-summary-toggle-header): Fix, and bound to t.
- * gnus.el: Gnus v5.6.37 is released.
+1999-02-01 Michael Cook <cook@sightpath.com>
-1998-08-16 Lars Magne Ingebrigtsen <larsi@gnus.org>
+ * Defenestrate spurious ?a.
- * gnus.el: Autoload gnus-summary-wide-reply.
+1999-02-02 Lars Magne Ingebrigtsen <larsi@gnus.org>
- * gnus-sum.el (gnus-get-newsgroup-headers): Return the value of
- In-Reply-To.
+ * mail-source.el (mail-source-fetch-pop): Instead use
+ :authentication.
- * gnus-msg.el (gnus-setup-message): Posting styles have to be
- configured in message-mode-hook.
+1999-02-01 Tatsuya Ichikawa <t-ichi@po.shiojiri.ne.jp>
- * nntp.el (nntp-connection-timeout): Restored.
- (nntp-open-connection): Use it.
+ * lisp/mail-source.el : Support APOP authentication scheme.
-1998-08-15 Lars Magne Ingebrigtsen <larsi@gnus.org>
+1999-02-02 Tatsuya Ichikawa <t-ichi@niagara.shiojiri.ne.jp>
- * gnus-group.el (gnus-group-make-useful-group): Doc fix.
+ * pop3.el (pop3-movemail): Return t.
- * gnus-art.el (gnus-article-push-button): Place point where you
- click.
+1999-02-02 Lars Magne Ingebrigtsen <larsi@gnus.org>
-1998-08-15 Mike McEwan <mike@lotusland.demon.co.uk>
+ * rfc2047.el (rfc2047-fold-region): New function.
+ (rfc2047-encode-message-header): Use it.
- * gnus-agent.el (gnus-agent-save-group-info): Update "groups" file
- if `nntp-server-list-active-group' is nil.
+1999-02-02 Hallvard B. Furuseth <h.b.furuseth@usit.uio.no>
-1998-08-15 Lars Magne Ingebrigtsen <larsi@gnus.org>
+ * gnus-sum.el (gnus-group-charset-alist): Add more.
- * gnus-score.el (gnus-summary-increase-score): Swap t and r.
+1999-02-01 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
- * gnus-sum.el (gnus-remove-thread): Didn't work with sparse
- threads.
+ * gnus.el: Pterodactyl Gnus v0.75 is released.
-1998-08-14 Fran\e,Ag\e(Bois Pinard <pinard@iro.umontreal.ca>
+1999-02-01 Lars Magne Ingebrigtsen <larsi@gnus.org>
- * nndoc.el (nndoc-generate-mime-parts-head): Use original Subject,
- Message-ID, and References in fully blown articles.
+ * gnus-art.el (article-display-x-face): Don't narrow to head.
-1998-08-14 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
+1999-02-01 Michael Cook <cook@sightpath.com>
- * gnus.el: Gnus v5.6.36 is released.
+ * gnus-cite.el (gnus-cited-lines-visible): Accept a cons.
-1998-08-14 Lars Magne Ingebrigtsen <larsi@gnus.org>
+1999-02-01 Lars Magne Ingebrigtsen <larsi@gnus.org>
- * gnus.el (load): Push onto list.
+ * mail-source.el (mail-source-fetch-directory): Ignore
+ directories.
- * gnus-group.el (gnus-group-get-new-news-this-group): Store active
- info.
+ * gnus-cus.el (gnus-group-parameters): Addition.
-1998-08-14 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
+ * gnus-art.el (article-strip-banner): Do symbolic banners.
+ (article-strip-banner): New keystroke.
- * gnus.el: Gnus v5.6.35 is released.
+1999-02-01 Michael Cook <cook@sightpath.com>
-1998-08-14 Lars Magne Ingebrigtsen <larsi@gnus.org>
+ * gnus-art.el (article-strip-banner): New command.
- * gnus-srvr.el (gnus-server-scan-server): Error better.
+1999-02-01 Lars Magne Ingebrigtsen <larsi@gnus.org>
- * nndir.el: Make independent of nnmh.
- Revert.
+ * gnus-art.el (gnus-treat-strip-banners): New variable.
- * message.el (message-remove-text-with-property): New function.
- (message-fix-before-sending): Check for invisible text.
+1999-01-28 Katsumi Yamaoka <yamaoka@jpl.org>
- * gnus.el (load): Create the Gnus buffer even when no splash.
+ * mail-source.el (mail-source-read-passwd): Use `read-passwd' if it
+ has been exist.
- * gnus-msg.el (gnus-setup-message): Add buffer to list.
+1999-01-28 Shenghuo ZHU <zsh@cs.rochester.edu>
- * gnus-win.el (gnus-remove-some-windows): Use new buffer system.
- (gnus-delete-windows-in-gnusey-frames): Ditto.
+ * message.el (message-draft-coding-system): Check coding-system.
+ * mm-util.el (mm-text-coding-system): Ditto.
- * gnus.el (gnus-add-buffer): New function.
+1999-01-28 Katsumi Yamaoka <yamaoka@jpl.org>
-1998-08-13 Lars Magne Ingebrigtsen <larsi@gnus.org>
+ * mail-source.el (mail-source-fetch-pop): Save excursion.
- * gnus-xmas.el (gnus-buffer-list): Removed.
+1999-01-28 Lars Magne Ingebrigtsen <larsi@gnus.org>
- * gnus.el (gnus-buffers): New variable.
- (gnus-get-buffer-create): New function; used throughout.
- (gnus-buffers): New function.
+ * mail-source.el (mail-source-movemail-args): Not constant.
+ (mail-source-movemail-args): Removed.
+ (mail-source-fetch-with-program): New function.
+ (mail-source-fetch-pop): Use program and function.
+ (mail-source-movemail-program): Removed.
- * gnus-msg.el (gnus-configure-posting-styles): Go to eoh
- reliably.
+ * gnus-art.el (gnus-treat-date-iso8601): New variable.
+ (gnus-treat-date-user-defined): New variable.
- * message.el (message-goto-eoh): New command.
+1999-01-28 Per Abrahamsen <abraham@dina.kvl.dk>
-1998-08-13 Simon Josefsson <jas@pdc.kth.se>
+ * nnmail.el (nnmail-fix-eudora-headers): New function.
- * gnus-msg.el (gnus-setup-message): use message-setup-hook
- instead
- (gnus-configure-posting-styles): new posting-style 'body
- (gnus-configure-posting-styles): insert headers immediately
+1999-01-28 Lars Magne Ingebrigtsen <larsi@gnus.org>
-1998-08-13 Lars Magne Ingebrigtsen <larsi@gnus.org>
+ * mm-bodies.el (mm-encode-body): Use mail-parse-charset.
- * gnus-score.el (gnus-summary-increase-score): Change thread to
- "r".
+1999-01-27 Lars Magne Ingebrigtsen <larsi@gnus.org>
- * gnus-sum.el (gnus-summary-scroll-down): New command and
- keystroke.
+ * gnus-art.el (gnus-treatment-function-alist): Do
+ gnus-article-add-buttons-to-head later.
+ (gnus-treat-capitalize-sentences): New variable.
+ (article-capitalize-sentences): New command and keystroke.
- * gnus-agent.el (gnus-agent-expire): Check that directories
- exist.
+ * gnus-group.el (gnus-group-catchup-current): Do group.
-1998-08-12 Simon Josefsson <jas@pdc.kth.se>
+ * message.el (message-default-charset): Add group.
- * gnus-cache.el (gnus-uncacheable-groups): doc change
- (gnus-cacheable-groups): new variable
- (gnus-cache-possibly-enter-article): use it
+1999-01-27 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
-1998-08-12 Lars Magne Ingebrigtsen <larsi@gnus.org>
+ * gnus.el: Pterodactyl Gnus v0.74 is released.
- * nntp.el (nntp-encode-text): Too much text.
+1999-01-27 Lars Magne Ingebrigtsen <larsi@gnus.org>
-1998-08-12 Matt Pharr <mmp@Graphics.Stanford.EDU>
+ * gnus-art.el (article-fill-long-lines): Renamed.
+ (article-fill-long-lines): New keystroke.
- * message.el (message-make-forward-subject-function): New
- variable.
- (message-wash-forwarded-subjects): Ditto.
+1999-01-26 Lars Magne Ingebrigtsen <larsi@gnus.org>
-1998-08-12 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
+ * gnus-msg.el (gnus-setup-posting-charset): Check for group.
- * gnus.el: Gnus v5.6.34 is released.
+ * gnus-group.el (gnus-group-catchup-current): Skip groups now
+ displayed.
+ (gnus-group-catchup-current): Be more robus.
-1998-08-12 Lars Magne Ingebrigtsen <larsi@gnus.org>
+ * gnus-sum.el (gnus-summary-select-article): Reselect for showing
+ headers.
- * gnus-msg.el (gnus-post-method): Don't use `current' in drafts.
+1999-01-25 Dave Love <fx@gnu.org>
- * gnus-score.el (gnus-summary-increase-score): Changed T to h and
- downcase.
+ * message.el (message-mode-menu): Add message-mime-attach-file.
+ (message-mode): Doc fix.
-1998-08-11 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
+1999-01-26 Lars Magne Ingebrigtsen <larsi@gnus.org>
- * gnus.el: Gnus v5.6.33 is released.
+ * nnmail.el (nnmail-check-duplication): Insert the mail source
+ string.
-1998-08-11 Lars Magne Ingebrigtsen <larsi@gnus.org>
+ * mail-source.el (mail-source-fetch-pop): Bind mail-source-string.
+ (mail-source-fetch-directory): Ditto.
+ (mail-source-fetch-file): Ditto.
+ (mail-source-string): New variable.
- * gnus-group.el (gnus-group-apropos): Check symbol value.
+ * gnus-start.el (gnus-get-unread-articles): Nix out groups over
+ the level.
- * gnus-cite.el (gnus-cited-closed-text-button-line-format):
- Changed.
+ * rfc2047.el (rfc2047-encodable-p): Convert to MIME charsets
+ before handling.
-1998-08-11 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
+ * mm-util.el (mm-mime-charset): Use the parameters.
+ (mm-mime-charset): Removed region paremeters.
- * gnus.el: Gnus v5.6.32 is released.
+ * nnmail.el (nnmail-get-new-mail): Don't message the entire
+ source.
-1998-08-11 Lars Magne Ingebrigtsen <larsi@gnus.org>
+1999-01-25 Lloyd Zusman <ljz@asfast.com>
- * nndoc.el (nndoc-type-alist): Do MIME digests before multiparts.
+ * nnmail.el (nnmail-get-split-group): Quote right.
- * gnus.el (gnus-predefined-server-alist): Expand vars.
+1999-01-25 Lars Magne Ingebrigtsen <larsi@gnus.org>
-1998-08-09 Dave Love <d.love@dl.ac.uk>
+ * mail-source.el (mail-source-movemail): Would kill an arbitrary
+ buffer.
- * gnus-art.el (article-display-x-face): Don't try (and fail) to
- display multiple faces.
+1999-01-24 Lars Magne Ingebrigtsen <larsi@gnus.org>
-1998-08-11 Lars Magne Ingebrigtsen <larsi@gnus.org>
+ * gnus-group.el (gnus-clear-inboxes-moved): Removed.
+ (gnus-group-mode): Don't hook.
- * gnus-art.el (gnus-header-newsgroups-face): Don't bold so much.
+ * mail-source.el (mail-source-bind): Doc fix.
+ (mail-source-bind): Take only one param.
- * gnus-group.el (gnus-group-rename-group): Remove old group name
- from list of killed groups.
+ * gnus-art.el (gnus-treat-highlight-signature): typep.
- * gnus-int.el (gnus-get-function): Error better.
+ * mail-source.el (mail-source-movemail): Ignore empty file.
+ (mail-source-callback): Check before deleting.
- * gnus-art.el (gnus-article-narrow-to-signature): Inhibit motion
- hooks.
- (article-hide-pgp): Delete text instead of hiding it.
+ * message.el (message-mime-attach-file): Include name.
- * gnus-group.el (gnus-group-find-new-groups): Ditto.
+1999-01-23 Lars Magne Ingebrigtsen <larsi@gnus.org>
- * gnus-start.el (gnus-find-new-newsgroups): Accept C-u C-u as a
- total query.
+ * mm-util.el (mm-read-charset): Return a symbol.
-1998-08-10 Lars Magne Ingebrigtsen <larsi@gnus.org>
+ * mm-view.el (mm-inline-text): Insert signature separator.
- * gnus-art.el (gnus-article-prepare): Place point at the beginning
- of the body.
+ * gnus-art.el (gnus-treat-predicate): New function.
+ (gnus-treat-article): Allow all types to be checked.
- * gnus-cite.el (gnus-cite-attribution-face): Changed to italic.
+ * gnus-util.el (gnus-or): New function.
+ (gnus-and): Ditto.
- * gnus-art.el (gnus-article-edit-article): Delete "annotation"
- text.
- (gnus-insert-prev-page-button): Mark as annotation.
- (gnus-insert-next-page-button): Ditto.
+ * gnus-art.el (gnus-mime-display-single): Use override.
- * gnus-cite.el (gnus-cited-closed-text-button-line-format): New
- variable.
- (gnus-cited-closed-text-button-line-format-alist): Ditto.
- (gnus-article-toggle-cited-text): Toggle between different
- symbols.
+ * mm-decode.el (mm-attachment-override-types): New variable.
+ (mm-attachment-override-p): New function.
-1998-08-09 Lars Magne Ingebrigtsen <larsi@gnus.org>
+ * gnus-picon.el (gnus-group-display-picons): Don't go backward.
- * gnus.el (gnus-version): Remove backend info.
+1999-01-23 Andrew J. Cosgriff <ajc@bing.wattle.id.au>
-1998-08-09 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
+ * mm-view.el (mm-inline-text): Do vcards.
- * gnus.el: Gnus v5.6.31 is released.
+1999-01-23 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
-1998-08-09 Fran\e,Ag\e(Bois Pinard <pinard@iro.umontreal.ca>
+ * gnus.el: Pterodactyl Gnus v0.73 is released.
- * nndoc.el: Split MIME multipart messages, maybe recursively.
- (nndoc-mime-parts-type-p, nndoc-transform-mime-parts,
- nndoc-generate-mime-parts-head, nndoc-dissect-mime-parts,
- nndoc-dissect-mime-parts-sub): New functions.
+1999-01-23 Lars Magne Ingebrigtsen <larsi@gnus.org>
- * nndoc.el: Quoting boundaries is optional, for multipart digests.
+ * nnmail.el (nnmail-spool-file): Changed to use mail-source.
+ (nnmail-crash-box, nnmail-use-procmail, nnmail-procmail-directory,
+ nnmail-procmail-suffix, nnmail-resplit-incoming): Removed.
+ (nnmail-movemail-program): Removed.
+ (nnmail-movemail-args): Removed.
+ (nnmail-pop-password-required): Ditto.
+ (nnmail-tmp-directory): Ditto.
+ (nnmail-delete-incoming): Removed.
+ (nnmail-pop-password, nnmail-moved-inboxes,
+ nnmail-internal-password, nnmail-move-inbox): Removed.
+ (nnmail-read-passwd): Ditto.
+ (nnmail-get-spool-files): Removed.
+ (nnmail-resplit-incoming): Reinstated.
-1998-08-09 Lars Magne Ingebrigtsen <larsi@gnus.org>
+ * mail-source.el: New file.
- * gnus-agent.el (gnus-agent-save-group-info): Check whether file
- exists.
+1999-01-23 James H. Cloos, Jr. <cloos@jhcloos.com>
- * message.el (message-goto-signature): Return nil if no sig.
- (message-delete-not-region): Delete properly if no sig.
+ * gnus-art.el (gnus-article-mode-map): Bind backspace.
-1998-08-09 Simon Josefsson <jas@pdc.kth.se>
+1999-01-23 Lars Magne Ingebrigtsen <larsi@gnus.org>
- * gnus-srvr.el (gnus-browse-make-menu-bar): select did read
+ * gnus-art.el (article-make-date-line): Fix iso8601 display.
-1998-08-09 Lars Magne Ingebrigtsen <larsi@gnus.org>
+1999-01-20 Lars Magne Ingebrigtsen <larsi@gnus.org>
- * gnus-sum.el (t): Added keystroke for W W C.
+ * gnus-art.el (gnus-treat-display-smileys): Check xpm.
- * gnus-cite.el (gnus-article-hide-citation-maybe): hiden->hidden.
+ * gnus-picon.el (gnus-group-display-picons): Goto body.
-1998-08-09 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
+ * gnus.el: Indented all functions; broke long lines; changed all
+ instances of illegal/legal to invalid/valid. Yes, I'm bored.
- * gnus.el: Gnus v5.6.30 is released.
+1999-01-20 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
-1998-08-09 Lars Magne Ingebrigtsen <larsi@gnus.org>
+ * gnus.el: Pterodactyl Gnus v0.72 is released.
- * message.el (message-cite-original-without-signature): Peel off
- blank lines.
+1999-01-20 Lars Magne Ingebrigtsen <larsi@gnus.org>
- * gnus-art.el (gnus-article-maybe-highlight): Doc fix.
+ * gnus.el: Cleaned up trailing whitespace.
- * gnus-sum.el (gnus-data-enter-list): Threw away all new list data
- at the beginning of the buffer.
+ * mm-util.el (mm-read-charset): Work.
-1998-08-07 Gareth Jones <gdj1@gdjones.demon.co.uk>
+1999-01-17 Matt Armstrong <mattdav+matt@best.com>
- * gnus-score.el (gnus-summary-increase-score): Don't downcase
- before lookin in char-to-header.
+ * gnus-score.el (gnus-score-find-bnews): Match regexp on the
+ nnheader-translate-file-chars'd group name.
-1998-08-07 Lars Magne Ingebrigtsen <larsi@gnus.org>
+1999-01-20 Lars Magne Ingebrigtsen <larsi@gnus.org>
- * gnus.el (gnus-predefined-server-alist): Too many parentheses.
+ * message.el (message-encode-message-body): Fold case.
-1998-08-06 Lars Magne Ingebrigtsen <larsi@gnus.org>
+1999-01-20 Lars Magne Ingebrigtsen <larsi@gnus.org>
- * gnus.el (gnus-continuum-version): Include quassia.
+ * mailcap.el (mailcap-add): New function.
- * gnus-sum.el (gnus-data-enter-list): Check before entering list.
+1999-01-18 Lars Magne Ingebrigtsen <larsi@gnus.org>
-1998-08-06 Francois Felix Ingrand <felix@dial.oleane.com>
+ * gnus-art.el (article-goto-body-goes-to-point-min-p): New variable.
+ (article-goto-body): Use it.
+ (gnus-treat-article): Ditto.
- * gnus-salt.el (gnus-generate-vertical-tree): Don't go too far to
- the left.
+ * gnus-agent.el (gnus-agent-get-undownloaded-list): Remove the
+ downloaded articles from the downloadeble list.
-1998-08-06 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
+1999-01-16 Lars Magne Ingebrigtsen <larsi@gnus.org>
- * gnus.el: Gnus v5.6.29 is released.
+ * message.el (message-encode-message-body): Bind
+ mail-parse-charset.
-1998-08-06 Lars Magne Ingebrigtsen <larsi@gnus.org>
+ * mm-util.el (mm-charset-synonym-alist): New variable.
+ (mm-charset-to-coding-system): Use it.
+ (mm-charset-coding-system-alist): Removed.
+ (mm-charset-to-coding-system): Don't use it.
+ (mm-find-charset-region): Use mail-parse-charset.
- * gnus-agent.el (gnus-agent-expire): Check whether (caar
- gnus-agent-article-alist) is nil.
+ * gnus-art.el (gnus-treatment-function-alist): Use
+ gnus-article-display-picons.
+ (gnus-treat-display-xface): Only do if we have xface feature.
+ (gnus-part-display-hook): New function.
+ (gnus-treat-article): Use it.
+ (gnus-treat-article): Use gnus-visual.
- * gnus.el (gnus-read-method): Allow selecting predefined servers.
+ * gnus-msg.el (gnus-setup-posting-charset): Check elem.
- * gnus-topic.el (gnus-topic-update-topic-line): Compute right
- number when inserting missing topic lines.
+ * gnus-art.el (gnus-mm-display-part): Fix the MIME button after
+ displaying.
- * gnus-start.el (gnus-get-unread-articles): Check that the group
- is alive.
+ * mm-decode.el (mm-insert-part): Use insert-buffer-substring.
- * gnus-score.el (gnus-score-load-score-alist): Better error
- messaging.
+ * gnus-score.el (gnus-score-find-bnews): Protect against invalid
+ regexp file names.
-1998-08-04 Kurt Swanson <ksw@dna.lth.se>
+1999-01-16 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
- * gnus-salt.el (gnus-pick-mouse-pick-region): Fix picking bug due
- to use of gnus-read-event-char.
+ * gnus.el: Pterodactyl Gnus v0.71 is released.
-1998-07-28 Dave Love <d.love@dl.ac.uk>
+1999-01-16 Lars Magne Ingebrigtsen <larsi@gnus.org>
- * gnus-group.el (gnus-group-fetch-faq): Don't mung dots in group
- name.
+ * mm-view.el (mm-inline-image): Don't add a dot.
-1998-07-27 Dave Love <d.love@dl.ac.uk>
+ * gnus-art.el (gnus-treat-article): New function.
- * gnus-topic.el (gnus-topic-mode-map): Provide Emacs tty
- alternatives to [tab], [(meta tab)].
+ * gnus.el (gnus-article-display-hook): Removed.
-1998-08-06 Lars Magne Ingebrigtsen <larsi@gnus.org>
+ * gnus-art.el (gnus-article-treat-custom): New variable.
- * gnus-start.el (gnus-startup-file-coding-system): New variable.
- (gnus-read-init-file): Use it.
- (gnus-read-newsrc-el-file): Ditto.
+ * gnus-start.el (gnus-ignored-newsgroups-has-to-p): Removed.
- * gnus-sum.el (gnus-thread-ignore-subject): Changed default.
+ * gnus-msg.el (gnus-setup-posting-charset): Allow variables and
+ functions.
-1998-08-06 Richard Stallman <rms@gnu.org>
+ * message.el (message-posting-charset): New variable.
+ (message-send-mail): Use it.
- * message.el (sendmail): Required.
+ * gnus-msg.el (gnus-group-posting-charset-alist): Moved here.
+ (gnus-setup-posting-charset): New function.
+ (gnus-setup-message): Use it.
-1998-08-06 Lars Magne Ingebrigtsen <larsi@gnus.org>
+ * message.el (message-encode-message-body): Just look for
+ Content-Type before inserting a new one.
- * gnus-sum.el (gnus-auto-select-same): Dix fix.
+1999-01-15 Lars Magne Ingebrigtsen <larsi@gnus.org>
-1998-08-04 Mike McEwan <mike@lotusland.demon.co.uk>
+ * rfc2047.el (rfc2047-default-charset): Removed.
- * gnus-sum.el (gnus-select-newsgroup): Set
- `gnus-newsgroup-unselected' when selecting specific articles via
- SELECT-ARTICLE - there may be more headers to fetch if
- `gnus-fetch-old-headers' is non-nil.
- (gnus-summary-read-group): pass SELECT-ARTICLE to
- `gnus-summary-read-group-1' and reset to nil when going to next group.
- (gnus-summary-read-group): Change `select-article' to
- `select-articles' for consistency.
+ * mail-prsvr.el: New file.
+ (mail-parse-charset): New variable.
-1998-08-04 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
+ * gnus-sum.el (gnus-newsgroup-charset): Changed name.
+ Changed name.
- * gnus.el: Gnus v5.6.28 is released.
+ * gnus.el (gnus-charset): New group.
-1998-08-03 Lars Magne Ingebrigtsen <larsi@gnus.org>
+ * nnmail.el (nnmail-pathname-coding-system): Default to binary.
- * nndoc.el (nndoc-set-delims): Removed article-end.
- (nndoc-dissect-buffer): Use eobp.
+ * gnus-sum.el (gnus-default-charset): Default to nil.
+ (gnus-newsgroup-iso-8859-1-forced-regexp): Removed.
+ (gnus-newsgroup-iso-8859-1-forced): Removed.
-1998-08-03 Trung Tran-Duc <trung.tranduc@prague.ixoskillspam.cz>
+ * mm-util.el (mm-known-charsets): Removed.
+ (mm-default-coding-system): Removed.
+ (mm-default-charset): Removed.
+ (mm-read-charset): New function.
- * nntp.el (nntp-open-connection): Bind coding-system-for-write.
+ * message.el (message-default-charset): Removed.
-1998-07-31 Lars Magne Ingebrigtsen <larsi@gnus.org>
+ * rfc2047.el (rfc2047-default-charset): Default to nil.
- * gnus-group.el (gnus-group-read-ephemeral-group): Make the server
- unique.
+ * mm-util.el (mm-charset-iso-8859-1-forced): Removed.
-1998-07-28 Fran\e,Ag\e(Bois Pinard <pinard@iro.umontreal.ca>
+1999-01-15 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
- * gnus-uu.el (gnus-uu-reginize-string): Consider the number of
- parts as part of the fixed subject, instead of a wild quantity.
+ * gnus.el: Pterodactyl Gnus v0.70 is released.
-1998-07-30 Lars Magne Ingebrigtsen <larsi@gnus.org>
+1999-01-15 Lars Magne Ingebrigtsen <larsi@gnus.org>
- * gnus-cache.el (gnus-summary-insert-cached-articles): Sort
- articles.
+ * mm-decode.el (mm-save-part): Use mm-get-part.
+ (mm-insert-part): New function.
+ (mm-get-part): Use it.
+ (mm-get-image): Ditto.
+ (mm-display-external): Ditto.
- * nndir.el (nndir): Use nnml functions.
+ * mm-view.el (mm-inline-text): Ditto.
-1998-07-27 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
+ * gnus-move.el (gnus-move-group-to-server): Protect against nil
+ ranges.
- * gnus.el: Gnus v5.6.27 is released.
+ * mm-decode.el (mm-display-external): Save the buffer.
+ (mm-remove-part): Kill it.
-1998-07-27 Lars Magne Ingebrigtsen <larsi@gnus.org>
+ * qp.el (quoted-printable-decode-region): Do the right thing at eobp.
- * gnus-topic.el (gnus-topic-update-unreads): New function.
+ * nnagent.el (nnagent-request-set-mark): Defined stub.
- * gnus-sum.el (gnus-summary-limit): Update mode line.
+1999-01-14 Lars Magne Ingebrigtsen <larsi@gnus.org>
- * gnus-soup.el (gnus-soup-add-article): Update mode line.
+ * gnus-score.el (gnus-score-load-score-alist): Bind
+ coding-system-for-read.
- * gnus-group.el (gnus-group-make-menu-bar): Bug.
+ * gnus-sum.el (gnus-summary-exit): Do adaptive scoring before
+ prepare-exit-hook.
- * gnus-art.el (gnus-article-make-menu-bar): Menu.
+ * mm-view.el (mm-setup-w3): Require w3.
- * gnus-sum.el (gnus-summary-make-menu-bar): Bug reports.
+1999-01-13 Kiyokazu SUTO <suto@merry.xmath.ous.ac.jp>
- * gnus-topic.el (gnus-topic-mode-map): h -> H.
+ * lisp/nnspool.el (nnspool-retrieve-headers): Protect against empty
+ body.
-1998-07-19 16:59 Simon Josefsson <jas@pdc.kth.se>
+1999-01-14 Lars Magne Ingebrigtsen <larsi@gnus.org>
- * gnus-util.el (gnus-netrc-syntax-table): @ is whitespace
+ * mm-encode.el: Ditto.
-1998-07-17 Gordon Matzigkeit <gord@fig.org>
+ * mm-bodies.el (mm-decode-content-transfer-encoding): Message the
+ error.
- * gnus-uu.el (gnus-uu-reginize-string): Simplify by looking
- from back to front for part numbers, rather than skipping
- leading ``version numbers.''
+ * mailcap.el (mailcap-mime-data): SAFER ps.
- (gnus-uu-part-number): Make consistent with
- gnus-uu-reginize-string.
+ * message.el (message-encode-message-body): Always insert a
+ Content-Type header.
-1998-07-26 Lars Magne Ingebrigtsen <larsi@gnus.org>
+ * mm-decode.el (mm-inline-media-tests): Default all text/* to be
+ shown inline.
- * gnus-art.el (gnus-request-article-this-buffer): Pass along
- header.
+ * mm-view.el (mm-inline-text): Handle all sorts of text.
- * gnus-sum.el (gnus-summary-update-article): Don't pass along
- iheader to regeneration routine.
+ * mailcap.el (mailcap-mime-data): non-viewer for viewers that
+ don't view.
-1998-07-27 KOSEKI Yoshinori <kose@yk.NetLaputa.ne.jp>
+ * mm-decode.el (mm-display-external): Use it.
- * nnmail.el (nnmail-move-inbox): Clear nnmail-internal-password,
- when supplied Password is incorrect.
+ * gnus-art.el (gnus-visible-headers): Added bcc, gcc, fcc.
-1998-07-25 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
+ * mm-decode.el (mm-save-part): Removed double code.
- * gnus.el: Gnus v5.6.26 is released.
+1999-01-12 Dave Love <fx@gnu.org>
-1998-07-25 Lars Magne Ingebrigtsen <larsi@gnus.org>
+ * mm-decode.el (mm-save-part): Avoid doubly-compressed
+ application/octet-stream .gz & al files with jka-compr.
- * gnus-salt.el (gnus-pick-mouse-pick-region): Use
- gnus-read-event-char.
+1999-01-12 Dave Love <fx@gnu.org>
-1998-07-25 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
+ * gnus-ems.el (gnus-down-mouse-3): New variable.
+ * gnus-art.el (gnus-mime-button-map): Use it.
+ (gnus-mime-button-menu): Set the clicked-on buffer initially.
- * gnus.el: Gnus v5.6.25 is released.
+1999-01-13 Lars Magne Ingebrigtsen <larsi@gnus.org>
-1998-07-25 Lars Magne Ingebrigtsen <larsi@gnus.org>
+ * mailcap.el (mailcap-mime-data): Added ImageMagic and ee.
- * gnus-group.el (gnus-group-read-ephemeral-group): Ditto.
+1999-01-12 Lars Magne Ingebrigtsen <larsi@gnus.org>
- * gnus-sum.el (gnus-summary-read-group-1): Ditto.
+ * gnus-picon.el (gnus-picons-kill-buffer): Don't kill article
+ buffers.
- * gnus-group.el (gnus-group-read-group): Accept article list.
+ * gnus-sum.el (gnus-summary-exit): Destroy all MIME.
-1998-07-24 Lars Magne Ingebrigtsen <larsi@gnus.org>
+ * gnus-cache.el (gnus-cache-read-active): Reversed check.
- * gnus-msg.el (gnus-configure-posting-styles): Quote some.
+1999-01-12 Matt Armstrong <matta@geoworks.com>
- * message.el (message-ignored-supersedes-headers): Added X-Trace
- and X-Complaints-To.
+ * mml.el (mml-parameter-string): Strip directory component.
- * nnmail.el (gnus-util): Required.
+1999-01-12 Lars Magne Ingebrigtsen <larsi@gnus.org>
-1998-07-21 Lars Magne Ingebrigtsen <larsi@gnus.org>
+ * gnus.el (gnus-use-demon): Removed.
- * gnus.el (gnus-news-group-p): Bogosity in params.
+1999-01-12 Katsumi Yamaoka <yamaoka@jpl.org>
-1998-07-21 Robert Bihlmeyer <robbe@orcus.priv.at>
+ * nnmail.el (nnmail-article-group): Don't infloop.
- * gnus-util.el (gnus-globalify-regexp): New function.
+1999-01-11 Colin Rafferty <colin@xemacs.org>
-1998-07-18 Lars Magne Ingebrigtsen <larsi@gnus.org>
+ * gnus-art.el (article-update-date-lapsed): Made it work with
+ picons, and make it update on all visible frames.
+ (article-date-ut): Get summary-buffer's current-headers.
- * gnus-sum.el (gnus-list-of-unread-articles): Peel off articles
- outside active range.
+1999-01-12 Lars Magne Ingebrigtsen <larsi@gnus.org>
-1998-07-15 Lars Magne Ingebrigtsen <larsi@gnus.org>
+ * gnus-picon.el (gnus-picons-setup-buffer): Don't set major mode.
+ (gnus-picons-setup-p): New variable.
- * nnvirtual.el (nnvirtual-request-type): Handle non-numerical
- articles.
+1999-01-11 Lars Magne Ingebrigtsen <larsi@gnus.org>
- * gnus.el (gnus-news-group-p): Do something sensible with negative
- articlies.
+ * nnmail.el (nnmail-split-header-length-limit): Lowered to 512.
-1998-07-15 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+1999-01-04 Lars Magne Ingebrigtsen <larsi@gnus.org>
- * gnus-salt.el (gnus-tree-minimize-window): Allow numbers.
+ * gnus-sum.el (gnus-summary-exit-no-update): Don't use run-hooks.
+ (gnus-summary-exit-no-update): Use mapcar.
-1998-07-15 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+1999-01-02 Simon Josefsson <jas@pdc.kth.se>
- * gnus-agent.el (gnus-agent-expire): Ignored ticks.
+ * gnus-agent.el (gnus-category-write): Make directory.
-1998-07-15 Hallvard B. Furuseth <h.b.furuseth@usit.uio.no>
+1998-09-26 Simon Josefsson <jas@pdc.kth.se>
- * nntp.el (nntp-send-authinfo): Message better and stuff.
+ * gnus-sum.el (gnus-update-read-articles):
+ (gnus-update-marks): Request backend update of mark.
-1998-07-15 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+1999-01-03 Lars Magne Ingebrigtsen <larsi@gnus.org>
- * gnus.el (gnus-message-archive-group): Allow sexp.
+ * mm-bodies.el (mm-body-encoding): Use mm-find.
-1998-07-15 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+1999-01-03 Kim-Minh Kaplan <kmkaplan@western.fr>
- * gnus-sum.el (gnus-select-newsgroup): Accept select-articles
- para,
+ * gnus-picon.el (gnus-article-display-picons): Fix.
-1998-07-13 Mike McEwan <mike@lotusland.demon.co.uk>
+1999-01-03 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
- * gnus-sum.el (gnus-select-newsgroup): Don't call the Agent to
- mark articles as read until *all* headers have been retrieved.
+ * gnus.el: Pterodactyl Gnus v0.69 is released.
-1998-07-15 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+1999-01-03 Lars Magne Ingebrigtsen <larsi@gnus.org>
- * nndir.el (nndir): Use nnml to request article.
+ * gnus-picon.el (gnus-picons-setup-buffer): Run the hook.
-1998-07-11 SL Baur <steve@altair.xemacs.org>
+ * gnus-agent.el (gnus-agent-remove-group): New command and
+ keystroke.
- * gnus-topic.el (gnus-topic-mode-map): Use modern key syntax.
+ * rfc2047.el (rfc2047-decode-region): Check for us-ascii.
-1998-07-12 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+1999-01-02 Simon Josefsson <jas@pdc.kth.se>
- * gnus-score.el (gnus-current-home-score-file): New function.
+ * gnus-agent.el (gnus-agent-write-servers): Make directory.
-1998-07-11 Mike McEwan <mike@lotusland.demon.co.uk>
+1998-12-26 Lars Magne Ingebrigtsen <larsi@gnus.org>
- * gnus-agent.el (gnus-agent-fetch-headers): Note last fetched
- headers per sesion to aid expiry in `headers only' groups.
+ * mm-view.el (mm-inline-text): Bind current id.
- * gnus-agent.el (gnus-agent-expire): Update group info to add
- expired articles to list of read articles and prevent
- re-fetching.
+ * mm-decode.el (mm-handle-id): New macro.
+ (mm-make-handle): Accept id.
+ (mm-dissect-singlepart): Use it.
-1998-07-12 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+1998-12-23 Matt Pharr <mmp@graphics.stanford.edu>
- * nnmail.el (nnmail-active-file-coding-system): Changed to
- binary.
+ * message.el (message-cite-original-without-signature): Use
+ message-signature-separator when searching for signature in
+ message-cite-original-without-signature.
-1998-07-12 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+1998-12-24 Simon Josefsson <jas@pdc.kth.se>
- * gnus-score.el (gnus-score-load-file): Specify which alist to
- decay.
+ * gnus.el (gnus-server-to-method): Check named methods.
-1998-07-12 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+1998-12-24 Lars Magne Ingebrigtsen <larsi@gnus.org>
- * gnus-start.el (gnus-startup-file-coding-system): New variable.
- (gnus-read-newsrc-el-file): Use it.
+ * mm-view.el (mm-view-message): Goto point-min.
-1998-07-11 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
+ * nnmail.el (nnmail-article-group): Don't delete lines, only
+ shorten them.
- * gnus.el: Gnus v5.6.24 is released.
+ * gnus-msg.el (gnus-configure-posting-styles): Also do nil
+ values.
-1998-07-10 Hallvard B. Furuseth <h.b.furuseth@usit.uio.no>
+ * nnheader.el (nnheader-temp-directory): New variable.
+ (nnheader-temp-directory): Removed.
- * gnus-util.el (gnus-parse-netrc): Allow "default" values.
+1998-12-22 Jack Vinson <jvinson@chevax.ecs.umass.edu>
-1998-07-10 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+ * mailcap.el (mailcap-parse-mailcaps): Add "~/.mailcaps" to the
+ list of files to check for mailcap entries under windows-nt.
- * nntp.el (nntp-server-opened-hook): Doc change.
+1998-12-24 Lars Magne Ingebrigtsen <larsi@gnus.org>
-1998-07-10 Fran\e,Ag\e(Bois Pinard <pinard@iro.umontreal.ca>
+ * gnus-art.el (gnus-article-maybe-hide-headers): Check whether the
+ summary buffer exists.
- * gnus-sum.el (gnus-summary-respool-trace): New command and
- keystroke.
+1998-12-22 Aaron M. Ucko <amu@mit.edu>
-1998-07-10 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+ * nnsoup.el (nnsoup-store-reply): Remove code to deal with
+ irrelevant Sun sendmail bug.
+ (nnsoup-store-reply): Stop mucking with mail-header-separator.
- * gnus-util.el (gnus-prin1): Bind print-escape-multibyte to nil.
+ * message.el (message-send-news): Bind mail-header-separator to
+ "" when asking backend to post.
-1998-07-06 Simon Josefsson <jas@pdc.kth.se>
+1998-12-22 Karl Kleinpaste <karl@justresearch.com>
- * gnus-range.el (gnus-sorted-complement): Fix comments.
+ * mm-uu.el (mm-dissect-disposition): New variable.
+ (mm-uu-dissect): Use it.
-1998-07-02 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+1998-12-21 Lars Magne Ingebrigtsen <larsi@gnus.org>
- * gnus-sum.el (gnus-summary-iterate): New macro.
+ * mm-view.el (mm-inline-text): Bind url-current-object.
- * message.el (message-pop-to-buffer): Clone locals.
+1998-12-06 Simon Josefsson <jas@pdc.kth.se>
- * gnus-msg.el (gnus-posting-styles): Reinstated.
- (gnus-posting-style-alist): Ditto.
+ * gnus-range.el (gnus-remove-from-range): Rewrite.
-1998-07-01 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+1998-12-09 SL Baur <steve@altair.xemacs.org>
- * gnus-int.el (gnus-get-function): Set funct to nil.
+ * gnus-picon.el (annotations): Remove bogus require 'xpm.
-1998-07-01 Simon Josefsson <jas@pdc.kth.se>
+1998-12-18 Hrvoje Niksic <hniksic@srce.hr>
- * gnus-int.el (gnus-get-function): returned non-nil when
- function wasn't bound, if noerror=t
+ * message.el (message-encode-message-body): Insert `MIME-Version'
+ instead of `Mime-Version'.
-1998-07-01 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+1998-12-04 Hrvoje Niksic <hniksic@srce.hr>
- * gnus-topic.el (gnus-topic-mode-map): Bind TAB and M-TAB.
+ * message.el (message-insert-mime-part): Add the attachment
+ disposition.
+ (message-insert-mime-part): Make TYPE and DESCRIPTION optional.
+ (message-mime-query-type): New function.
+ (message-mime-query-description): Ditto.
+ (message-mime-query-file): Ditto.
+ (message-insert-mime-part): Use them.
+ (message-mime-insert-external): Use the new stuff.
- * gnus-sum.el (gnus-build-sparse-threads): Make sure no dates are
- nil.
- (gnus-summary-limit-mark-excluded-as-read): Use the intersection.
+1998-12-19 Lars Magne Ingebrigtsen <larsi@gnus.org>
- * gnus-msg.el (gnus-setup-message): Clone all local variables from
- the summary buffer.
+ * nnmail.el (nnmail-split-header-length-limit): New variable.
-1998-07-01 Richard Stallman <rms@santafe.edu>
+ * mm-decode.el (mm-dissect-buffer): Check syntax.
- * message.el (message-cite-original): Use mail-citation-hook.
- (message-cite-function): Ditto.
+ * rfc2231.el (rfc2231-parse-string): Remove check for syntax.
-1998-07-01 Rajappa Iyer <rsi@lucent.com>
+ * rfc2047.el (rfc2047-encodable-p): Use mm-find-charset-region.
+ (rfc2047-dissect-region): Ditto.
- * gnus-salt.el (gnus-pick-mode-map): Changed keymap.
+1998-12-17 Lars Magne Ingebrigtsen <larsi@gnus.org>
-1998-07-01 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
+ * mm-view.el (mm-view-message): Decode charset.
- * gnus.el: Gnus v5.6.23 is released.
+1998-12-16 Lars Magne Ingebrigtsen <larsi@gnus.org>
-1998-07-01 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+ * rfc2231.el (rfc2231-parse-string): Ignore syntactically invalid
+ CT headers.
- * nntp.el (nntp-record-command): Give more precise time info.
- (nntp-next-result-arrived-p): Look for the end of error lines.
+1998-12-16 Shenghuo ZHU <zsh@cs.rochester.edu>
-1998-07-01 Fran\e,Ag\e(Bois Pinard <pinard@iro.umontreal.ca>
+ * mm-bodies.el (mm-decode-content-transfer-encoding): Use
+ mm-uu-*-function.
+ * mm-uu.el (mm-uu-dissect): Use x-uuencode.
- * gnus-util.el (gnus-delete-if): Would do the opposite.
+1998-12-16 Lars Magne Ingebrigtsen <larsi@gnus.org>
-1998-07-01 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+ * message.el (message-send-mail): Do MML first.
+ (message-send-news): Ditto.
- * gnus-sum.el (gnus-build-sparse-threads): Didn't work at all.
+1998-12-15 Lars Magne Ingebrigtsen <larsi@gnus.org>
-1998-06-30 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+ * gnus-picon.el (gnus-picons-face): New face.
+ (gnus-picons-try-face): Use it.
- * nntp.el (nntp-send-authinfo): Store the user name.
- (nntp-authinfo-user): New variable.
+1998-12-15 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
- * gnus-sum.el (gnus-summary-limit-mark-excluded-as-read): Would
- mark some articles as unread.
+ * gnus.el: Pterodactyl Gnus v0.68 is released.
- * gnus-agent.el (gnus-agent-expire): Don't sort lines.
+1998-12-15 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
-1998-06-30 Mike McEwan <mike@lotusland.demon.co.uk>
+ * gnus.el: Pterodactyl Gnus v0.67 is released.
- * gnus-agent.el (gnus-agent-expire): Use a fresh hash table.
+1998-12-15 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
-1998-06-29 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
+ * gnus.el: Pterodactyl Gnus v0.66 is released.
- * gnus.el: Gnus v5.6.22 is released.
+1998-12-13 Lars Magne Ingebrigtsen <larsi@gnus.org>
-1998-06-29 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+ * gnus-art.el (gnus-insert-mime-button): Decode description.
- * gnus-salt.el (gnus-pick-mode-map): Remove gnus-mouse.
+1998-12-05 Shenghuo ZHU <zsh@cs.rochester.edu>
- * gnus-sum.el (gnus-dependencies-add-header): `debug' left in.
- Eh. Eh.
+ * gnus-art.el (article-decode-encoded-words): Rollback to 0.55.
+ (gnus-decode-header-methods): Ditto.
+ (gnus-decode-with-mail-decode-encoded-word-region): Ditto.
- * gnus-salt.el (gnus-summary-pick-line-format): Missing %.-
+1998-12-13 Lars Magne Ingebrigtsen <larsi@gnus.org>
- * gnus-topic.el (gnus-topic-rename): Fix error message.
+ * mml.el (mml-insert-mime-headers): Encode description.
-1998-06-28 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+ * nnfolder.el (nnfolder-request-expire-articles): Go to the date
+ line.
- * gnus-spec.el (gnus-face-face-function): Double quoting removed.
+ * gnus-sum.el (gnus-default-charset): Doc fix.
-1998-06-28 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
+1998-12-09 Shenghuo ZHU <zsh@cs.rochester.edu>
- * gnus.el: Gnus v5.6.21 is released.
+ * mm-decode.el (mm-display-part): Forward a line.
-1998-06-28 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+1998-12-09 Shenghuo ZHU <zsh@cs.rochester.edu>
- * gnus-sum.el (gnus-summary-edit-article-done): Copy the buffer to
- a temp buffer before replacing.
+ * mm-util.el (mm-running-ntemacs): New variable.
+ (mm-text-coding-system): Ditto.
+ * nnmail.el (nnmail-incoming-coding-system): Ditto.
+ (nnmail-split-incoming): Use nnmail-incoming-coding-system.
- * gnus-msg.el (gnus-post-news): Treat broken-reply-to in
- followups.
+1998-12-13 Lars Magne Ingebrigtsen <larsi@gnus.org>
- * gnus-sum.el (gnus-summary-goto-subject): Position point.
+ * gnus-picon.el (gnus-picons-network-display-internal): Don't set
+ buffer.
-1998-06-27 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+ * message.el (message-insert-headers): New command and keystroke.
- * gnus-demon.el (gnus-util): Required.
+1998-12-07 Lars Magne Ingebrigtsen <larsi@gnus.org>
- * gnus-score.el (gnus-score-body): Message fix.
+ * mm-decode.el (mm-inline-media-tests): Recognize x-xbitmap.
+ (mm-get-image): Ditto.
- * gnus-group.el (gnus-group-highlight-line): Use it.
+ * mm-bodies.el (mm-decode-content-transfer-encoding): Only for
+ base64, uudecode and binhex.
- * gnus-util.el
- (gnus-put-text-properties-excluding-characters-with-faces): New
- function.
+1998-12-06 Shenghuo ZHU <zsh@cs.rochester.edu>
-1998-06-27 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
+ * mm-bodies.el (mm-decode-content-transfer-encoding): Replace CRLF
+ in text/plain.
+ * mm-uu.el (mm-uu-dissect): Use inline.
- * gnus.el: Gnus v5.6.20 is released.
+1998-12-07 Lars Magne Ingebrigtsen <larsi@gnus.org>
-1998-06-27 Arne Georg Gleditsch <argggh@ifi.uio.no>
+ * mm-view.el (mm-view-message): New function.
- * gnus-sum.el (gnus-parent-headers): Check better for headers.
+ * mm-encode.el (mm-content-transfer-encoding-defaults): Changed to
+ qp.
-1998-06-27 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+1998-12-07 Karl Kleinpaste <karl@justresearch.com>
- * message.el (message-check-news-body-syntax): Buggy checksum
- check.
+ * mm-encode.el (mm-content-transfer-encoding-defaults): Add an
+ entry for message/rfc822 as 8bit.
-1998-06-27 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
+1998-12-07 Lars Magne Ingebrigtsen <larsi@gnus.org>
- * gnus.el: Gnus v5.6.19 is released.
+ * mailcap.el (mailcap-mime-extensions): Add patch.
-1998-06-27 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
+1998-12-05 Dale Hagglund <rdh@best.com>
- * gnus.el: Gnus v5.6.18 is released.
+ * gnus-sum.el (gnus-summary-display-buttonized): Use prefix
+ argument to force all multipart/* to look like multipart/mixed.
-1998-06-27 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+ * gnus-art.el (gnus-mime-display-multipart-as-mixed): New
+ variable.
+ (gnus-mime-display-part): Use it.
- * gnus-soup.el (gnus-soup-save-areas): Made interactive.
+1998-12-07 Lars Magne Ingebrigtsen <larsi@gnus.org>
- * nnfolder.el (nnfolder-request-replace-article): Check all X-From
- headers.
+ * gnus-draft.el (gnus-draft-send): Only disable checks for
+ non-interactive use.
+ (gnus-draft-send-message): Use it.
- * gnus-sum.el (gnus-update-marks): Don't nix out cache lists.
+1998-12-06 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
- * nngateway.el (nngateway-mail2news-header-transformation):
- Changed semantics.
+ * gnus.el: Pterodactyl Gnus v0.65 is released.
- * message.el (message-check-news-body-syntax): Don't look at
- buffer size to see whether text has been added.
+1998-12-06 Lars Magne Ingebrigtsen <larsi@gnus.org>
-1998-06-26 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
+ * gnus-art.el (gnus-article-prepare-display): Don't init w3.
- * gnus.el: Gnus v5.6.16 is released.
+ * mm-view.el (mm-inline-text): Bind url-standalone-mode here.
-1998-06-26 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+1998-12-05 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
- * gnus-util.el (gnus-delete-assq): Removed.
- (gnus-delete-assoc): Ditto.
+ * gnus.el: Pterodactyl Gnus v0.64 is released.
- * gnus.el: Use throughout.
+1998-12-05 Lars Magne Ingebrigtsen <larsi@gnus.org>
- * gnus-util.el (gnus-pull): New macro.
+ * mm-view.el (mm-setup-w3): Don't load.
-1998-06-26 Simon Josefsson <jas@pdc.kth.se>
+ * gnus-msg.el (gnus-setup-message): Set group name.
+ (gnus-group-mail): Avoid leaking local vars.
- * gnus-sum.el (gnus-get-newsgroup-headers): parse Chars: headers
+ * message.el (message-attach-file): Renamed.
+ (message-mime-attach-file): Renamed again.
-1998-06-26 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+1998-12-05 Hrvoje Niksic <hniksic@srce.hr>
- * gnus-sum.el (gnus-update-marks): Use it.
+ * gnus-art.el (article-decode-encoded-words): Bind
+ rfc2047-default-charset here.
- * gnus-util.el (gnus-delete-alist): New function.
+ * gnus-art.el (gnus-insert-mime-button): Nix slashes in file name.
- * gnus-sum.el (gnus-update-marks): Don't save list of cached
- articles.
+1998-12-05 Lars Magne Ingebrigtsen <larsi@gnus.org>
- * message.el (message-mode-menu): Include kill-buffer.
+ * gnus-picon.el (gnus-picons-setup-buffer): Run picons hook.
+ (gnus-picons-setup-hook): New hook.
- * nnmail.el (nnmail-purge-split-history): Use it.
+1998-12-05 Per Abrahamsen <abraham@dina.kvl.dk>
- * gnus-util.el (gnus-delete-if): New function.
+ * mailcap.el (mailcap-mime-data): Remove "*" from documentation
+ string.
+ (mailcap-mime-extensions): Ditto. Made first sentense fit a
+ line.
- * nnmail.el (nnmail-article-group): Use gnus-remove-duplicates.
+1998-12-05 Lars Magne Ingebrigtsen <larsi@gnus.org>
-1998-06-26 Richard Stallman <rms@santafe.edu>
+ * gnus-art.el (gnus-article-prepare-display): Setup w3.
+ (gnus-mime-view-part): Ditto.
+ (gnus-mime-inline-part): Dotii.
+ (gnus-mime-externalize-part): Daddo.
+ (gnus-mime-internalize-part): Tutti frutti.
+ (gnus-widget-press-button): Da da do.
- * gnus-util.el (gnus-remove-duplicates): New function.
+ * mm-view.el (mm-setup-w3): Require url-vars.
-1998-06-26 Kevin Christian <Kevin.Christian@symbios.com>
+1998-12-04 Shenghuo ZHU <zsh@cs.rochester.edu>
- * gnus-score.el (gnus-score-string): Do updating of scores after
- fuzzies.
+ * message.el (message-draft-coding-system): Fix for XEmacs-NT.
+ * mm-util.el (mm-find-charset-region): Ditto.
-1998-06-26 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+1998-12-05 Lars Magne Ingebrigtsen <larsi@gnus.org>
- * message.el (message-mode): Don't do the intern dance.
+ * message.el (message-send): Don't encode here.
+ (message-send-mail): But here.
+ (message-send-news): And here.
-1998-06-26 Richard Stallman <rms@santafe.edu>
+1998-12-04 Lars Magne Ingebrigtsen <larsi@gnus.org>
- * message.el (message-mode): Adaptive fill changes.
+ * gnus-msg.el (gnus-message-insert-stylings): Don't insert twice.
-1998-06-26 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+1998-12-04 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
- * gnus-sum.el (gnus-summary-mode-line-format-alist): Allow article
- score.
+ * gnus.el: Pterodactyl Gnus v0.63 is released.
- * gnus-score.el (gnus-score-load-file): Would ignore all score
- files without un-advanced rules.
+1998-12-04 Lars Magne Ingebrigtsen <larsi@gnus.org>
- * gnus-ems.el ((fboundp 'split-string)): Use it where it exists.
+ * mml.el (mml-base-boundary): Shorten.
-1998-06-26 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
+ * message.el (message-insert-mime-part): Use default.
- * gnus.el: Gnus v5.6.15 is released.
+ * gnus-art.el (gnus-insert-mime-button): Bind gnus-tmp-type-long.
-1998-06-26 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+1998-12-03 Per Abrahamsen <abraham@dina.kvl.dk>
- * nnfolder.el (nnfolder-request-replace-article): Delete old
- delimiter.
+ * gnus-art.el (gnus-mime-display-alternative): Use (*) for radio
+ buttons, not [*].
- * gnus-msg.el (gnus-summary-reply): Use it.
+1998-12-04 Hrvoje Niksic <hniksic@srce.hr>
- * message.el (message-reply): Removed parameter.
- (message-wide-reply): Ditto.
+ * gnus-art.el (gnus-insert-mime-button): Do proper help-echo.
- * gnus-msg.el (gnus-msg-treat-broken-reply-to): New function.
+1998-12-04 Hrvoje Niksic <hniksic@srce.hr>
- * gnus-art.el (gnus-check-group-server): New function.
- (gnus-request-article-this-buffer): Don't try to waken the server
- before needing to.
+ * gnus-art.el (gnus-insert-mime-button): Fix.
-1998-06-25 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+1998-12-03 Hrvoje Niksic <hniksic@srce.hr>
- * gnus-sum.el (gnus-summary-delete-article): Sort the articles
- before deleting.
+ * message.el (message-insert-mime-part): Nicify prompts.
+ (message-insert-mime-part): Really delete duplicates.
+ (message-insert-mime-part): Check against common errors.
+ (message-insert-mime-part): Fix docstring.
- * nngateway.el (nngateway-request-post): Return success.
+1998-12-04 Lars Magne Ingebrigtsen <larsi@gnus.org>
- * nnheader.el (nnheader-insert-file-contents): Bind more hooks.
+ * gnus-art.el (gnus-mime-internalize-part): Bugged out.
- * gnus-sum.el (gnus-summary-limit-to-age): Reverse logic.
+1998-12-03 Hrvoje Niksic <hniksic@srce.hr>
- * gnus-score.el (gnus-summary-score-entry): Removed interactive
- spec.
- ((gnus-summary-score-map "V" gnus-summary-mode-map)): Removed
- keystroke.
+ * gnus-art.el (gnus-mime-button-line-format): Nicify.
+ (gnus-insert-mime-button): Modify accordingly.
- * gnus-art.el (gnus-article-show-summary): Position point.
+1998-12-04 Lars Magne Ingebrigtsen <larsi@gnus.org>
- * gnus-cache.el (gnus-cache-update-article): Change group first.
+ * gnus-art.el (gnus-display-mime): Set window point.
- * gnus.el (gnus-short-group-name): Collapse more.
+ * mm-decode.el (mm-display-external): Only decode when not
+ saving.
+ (mm-alternative-precedence): Prefer multiparts.
+ (mm-inline-media-tests): Inline multiparts.
-1998-06-25 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
+ * gnus-picon.el (gnus-picons-next-job-internal): Do bar if asked.
+ Ignore errors when requiring url.
- * gnus.el: Gnus v5.6.14 is released.
+ * mml.el (mml-quote-region): New command.
-1998-06-25 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+ * message.el (message-cite-original): Use it.
+ (message-cite-original-without-signature): Ditto.
- * gnus-sum.el (gnus-rebuild-thread): Accept a line argument.
- (gnus-rebuild-thread): Would skip around a lot when `P'-ing past
- the beginning.
+1998-12-03 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
- * gnus-msg.el (gnus-post-method): Present all known servers if
- `C-u 0'.
+ * gnus.el: Pterodactyl Gnus v0.62 is released.
- * gnus-salt.el (gnus-pick-mode-map): Reinstated keymap.
+1998-12-03 Lars Magne Ingebrigtsen <larsi@gnus.org>
- * gnus-sum.el (gnus-build-sparse-threads): Put the proper date
- in.
+ * gnus-art.el (gnus-mime-view-all-parts): Work with multiparts.
-1998-06-24 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
+1998-12-03 Hrvoje Niksic <hniksic@srce.hr>
- * gnus.el: Gnus v5.6.13 is released.
+ * mm-view.el (mm-inline-text): Use `point-min-marker' and
+ `point-max-marker'.
-1998-06-24 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+1998-12-03 Lars Magne Ingebrigtsen <larsi@gnus.org>
- * gnus-topic.el (gnus-topic-rename): Disallow "nil".
+ * mailcap.el (mailcap-mime-extensions): Use image/xpm for xpms.
-1998-06-24 Vladimir Alexiev <vladimir@cs.ualberta.ca>
+ * gnus-art.el (gnus-mime-display-single): Check for attachment
+ before other tests.
- * nnvirtual.el (nnvirtual-update-xref-header): Regexp-quote group
- name.
+1998-12-03 Didier Verna <verna@inf.enst.fr>
+
+ * gnus-msg.el (gnus-configure-posting-styles): find a
+ posting-style entry in the group parameters, if any, and honor it
+ at the end.
+
+1998-12-03 Felix Lee <flee@teleport.com>
+
+ * nntp.el (nntp-after-change-function): Fix.
+
+1998-12-03 Mike McEwan <mike@lotusland.demon.co.uk>
-1998-06-24 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+ * mml.el (mml-generate-mime-1): Insert literally.
- * gnus-sum.el (gnus-build-sparse-threads): Give all the sparse
- articles the date of the current child.
+1998-12-03 Lars Magne Ingebrigtsen <larsi@gnus.org>
- * gnus-topic.el (gnus-group-topic-parameters): Didn't compute.
+ * mml.el (mml-insert-mime-headers): Removed debug.
-1998-06-24 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
+1998-12-02 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * gnus-sum.el (gnus-summary-show-article): Destroy parts when
+ prefixed.
- * gnus.el: Gnus v5.6.12 is released.
+ * mm-encode.el (mm-content-transfer-encoding-defaults): Default
+ application/emacs-lisp to 8bit.
-1998-06-10 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
+1998-12-03 Dale Hagglund <rdh@best.com>
- * message.el (message-mail-other-window): Bind message-this-is-mail.
- (message-mail-other-frame): Likewise.
- (message-news-other-window): Bind message-this-is-news.
- (message-news-other-frame): Likewise.
+ * mm-decode.el (mm-quote-arg): Add quoting of '()', '<>', and '|'.
-1998-06-09 Sam Steingold <sds@goems.com>
+1998-12-02 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
- * gnus-uu.el (gnus-uu-default-view-rules): make sed kill ^M only
- at the end of line.
+ * gnus.el: Pterodactyl Gnus v0.61 is released.
-1998-06-05 Hrvoje Niksic <hniksic@srce.hr>
+1998-12-02 Lars Magne Ingebrigtsen <larsi@gnus.org>
- * nnmail.el (nnmail-get-split-group): Don't regexp-quote
- nnmail-procmail-suffix.
+ * mml.el (mml-parse-1): Skipped parts.
+ (mml-insert-mime-headers): Nil is a list.
+ (mml-generate-mime-1): Don't insert literally.
+ (mml-read-tag): Drop text props.
+ (mml-read-part): Ditto.
+ (mml-parse-singlepart-with-multiple-charsets): Ditto.
-1998-06-24 Kim-Minh Kaplan <kaplan@sky.fr>
+1998-12-02 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
- * gnus-sum.el (gnus-build-get-header): Fix obarray.
+ * gnus.el: Pterodactyl Gnus v0.60 is released.
-1998-06-24 Castor <castor@my-dejanews.com>
+1998-12-02 Lars Magne Ingebrigtsen <larsi@gnus.org>
- * nntp.el (nntp-open-ssl-stream):
+ * mml.el (mml-parse-1): Don't throw contents away.
-1998-06-24 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+1998-12-02 Hrvoje Niksic <hniksic@srce.hr>
- * gnus-sum.el (gnus-nov-parse-line): Cleaned up.
- (gnus-build-all-threads): Put things in the wrong obarray.
+ * mml.el (mml-compute-boundary-1): Regexp-quote the boundary.
-1998-06-24 Decklin Foster <djarum@base.org>
+1998-12-02 Lars Magne Ingebrigtsen <larsi@gnus.org>
- * nngateway.el (nngateway-mail2news-header-transformation): New
+ * mml.el (mml-parse-singlepart-with-multiple-charsets): New
function.
+ (mml-parse-1): Use it.
+
+1998-12-01 Shenghuo ZHU <zsh@cs.rochester.edu>
-1998-06-24 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+ * gnus-art.el (gnus-decode-with-mail-decode-encoded-word-region):
+ Use gnus-newsgroup-default-charset.
+ (article-decode-encoded-words): Remove charset codes.
+ * gnus-sum.el (gnus-newsgroup-default-charset): Use
+ gnus-default-charset.
- * message.el (message-shorten-references): New function.
- (message-header-format-alist): Use it.
+1998-12-02 Lars Magne Ingebrigtsen <larsi@gnus.org>
- * gnus-start.el (gnus-always-read-dribble-file): Customized.
+ * message.el (message-send-mail): Don't encode here.
+ (message-send-news): Nor here.
+ (message-send): ... but here instead.
- * message.el (message-generate-new-buffers): Dox fox.
+ * gnus-picon.el (gnus-picons-display-article-move-p): Changed
+ default to nil.
+ (gnus-article-display-picons): Replace From line.
+ (gnus-group-display-picons): Replace Newsgroups line.
+ (gnus-picons-display-glyph): Set baseline.
+ (gnus-group-display-picons): Piconize the entire Newsgroups line.
+ (gnus-picons-xbm-face): Revert to old, standard colors.
-1998-06-23 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+ * message.el (message-fetch-field): Remove text props.
- * gnus-topic.el (gnus-topic-prepare-topic): Respect visible topic
- param.
- (gnus-topic-hierarchical-parameters): New function.
+ * gnus-art.el (gnus-article-normalized-header-length): New
+ variable.
+ (article-normalize-headers): New command and keystroke.
-1998-06-02 Didier Verna <verna@inf.enst.fr>
+ * gnus-picon.el (gnus-picons-xbm-face): Changed colors.
- * gnus-picon.el (gnus-get-buffer-name): use get-buffer-create
- instead of get-buffer
+1998-12-02 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
-1998-06-03 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+ * gnus.el: Pterodactyl Gnus v0.59 is released.
- * nnkiboze.el (nnkiboze-request-delete-group): Delete .newsrc
- file.
+1998-12-02 Lars Magne Ingebrigtsen <larsi@gnus.org>
- * nnmail.el (nnmail-article-group): Nuke looong lines.
+ * mml.el (mml-insert-mime-headers): Beep at multiple charsets.
- * gnus-art.el (gnus-button-alist): Buggy default.
+ * gnus-art.el (gnus-mime-copy-part): Set buffer-file-name.
-1998-06-03 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
+1998-11-30 Hrvoje Niksic <hniksic@srce.hr>
- * gnus.el: Gnus v5.6.11 is released.
+ * mml.el (mml-generate-mime-1): Handle unquoting end-tags.
-1998-06-03 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+1998-12-02 Lars Magne Ingebrigtsen <larsi@gnus.org>
- * gnus.el: Checked doc string syntax throughout.
+ * mm-decode.el (mm-all-images-fit): New variable.
+ (mm-image-fit-p): Use it.
- * message.el (message-subject-re-regexp): Renamed.
+ * gnus-art.el (gnus-mime-display-single): Use it.
+ (gnus-mime-internalize-part): New command and keystroke.
-1998-06-03 Simon Josefsson <jas@pdc.kth.se>
+ * mm-decode.el (mm-user-automatic-external-display): New
+ variable.
+ (mm-automatic-external-display-p): New function.
- * message.el (message-ignored-subject-re): New variable.
+ * gnus-picon.el (gnus-picons-xbm-face): Default to sensible
+ colors.
-1998-06-03 Sam Steingold <sds@usa.net>
+1998-12-01 Lars Magne Ingebrigtsen <larsi@gnus.org>
- * gnus-msg.el (gnus-bug-create-help-buffer): New variable.
- (gnus-bug): Use it.
+ * gnus-sum.el (gnus-summary-repair-multipart): Reselect article.
-1998-05-07 Hrvoje Niksic <hniksic@srce.hr>
+ * gnus-art.el (gnus-with-article): Work in the original article
+ buffer.
+ (gnus-with-article): Work in read-only groups.
- * nnmail.el: (nnmail-get-split-group): Use `regexp-quote'
- when file name is a part of pattern.
+1998-12-01 Shenghuo ZHU <zsh@cs.rochester.edu>
- * nnmail.el (nnmail-crosspost-link-function): Ditto.
+ * mm-bodies.el (mm-decode-string): Return original string if not
+ decode.
- * gnus-ems.el: Use `symbol-name' instead of `(format "%s" ...)'.
+1998-11-30 Shenghuo ZHU <zsh@cs.rochester.edu>
- * gnus-score.el (gnus-score-load-file): Use `regexp-quote'
- when file name is a part of pattern.
+ * mm-uu.el (mm-uu-dissect): Use mm-make-handle.
-1998-05-06 Hrvoje Niksic <hniksic@srce.hr>
+1998-12-01 Francois Pinard <pinard@iro.umontreal.ca>
- * gnus-cache.el (gnus-cache-generate-active): Use `regexp-quote'
- when file name is a part of pattern.
+ * nndoc.el (nndoc-mime-parts-type-p): Do related.
-1998-06-03 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+1998-12-01 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
- * nnfolder.el (nnfolder-delete-mail): Changed parameters.
- (nnfolder-request-replace-article): Rename X-From-Line.
+ * gnus.el: Pterodactyl Gnus v0.58 is released.
-1998-06-03 Dan Christensen <jdc@chow.mat.jhu.edu>
+1998-11-30 Hrvoje Niksic <hniksic@srce.hr>
- * nnfolder.el (nnfolder-adjust-min-active): Work.
+ * mm-decode.el (mm-get-image): Return a glyph, not an image
+ specifier.
-1998-06-01 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+1998-11-29 Hrvoje Niksic <hniksic@srce.hr>
- * gnus-sum.el (gnus-summary-limit-to-age): Reversed time and
- almost collapsed space!
+ * rfc2047.el (rfc2047-decode): Bind mm-default-charset.
- * nnmail.el (nnmail-days-to-time): Computed wrong time.
+1998-12-01 Lars Magne Ingebrigtsen <larsi@gnus.org>
-1998-06-01 Kim-Minh Kaplan <KimMinh.Kaplan@utopia.eunet.fr>
+ * mail-parse.el (rfc2045): Required.
- * gnus-sum.el (gnus-dependencies-add-header): Break loops.
+1998-12-01 William M. Perry <wmperry@aventail.com>
-1998-06-01 Fabrice POPINEAU <popineau@esemetz.ese-metz.fr>
+ * mm-view.el (mm-inline-text): Remove props.
- * gnus-cache.el (gnus-cache-generate-active): Regexp-quote.
+1998-12-01 Lars Magne Ingebrigtsen <larsi@gnus.org>
-1998-06-01 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
+ * mm-view.el (mm-setup-w3): Protect url-misc.
- * gnus.el: Gnus v5.6.10 is released.
+ * message.el (message-ignored-resent-headers): Remove
+ Gnus-Warning.
-1998-06-01 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+ * mml.el (mml-insert-mime-headers): Use encoding.
+ (mml-parameter-string): Ditto.
- * gnus-art.el (gnus-button-alist): Recognize bare mailto buttons
- for Gnus.
+ * rfc2045.el: New file.
+ (rfc2045-encode-string): New function.
- * nntp.el: Replaced all `message' calls.
+1998-11-30 Lars Magne Ingebrigtsen <larsi@gnus.org>
-1998-06-01 Wolfgang Rupprecht <wolfgang@dailyplanet.wsrcc.com>
+ * mail-parse.el (mail-header-encode-parameter): New function.
- * nntp.el (nntp-encode-text): Removed spurious forward-line.
+ * rfc2231.el (rfc2231-encode-string): New function.
-1998-05-23 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+1998-11-30 Shenghuo ZHU <zsh@cs.rochester.edu>
- * gnus-agent.el (gnus-agent-fetch-session): Would infloop if
- opening failed.
+ * mm-bodies.el (mm-decode-string): New function.
+ * mm-view.el (mm-inline-text): Use mm-decode-string.
-1998-05-19 Yoshiki Hayashi <g740685@komaba.ecc.u-tokyo.ac.jp>
+1998-11-30 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
- * nnheader.el (nnheader-translate-file-chars): Don't change
- string.
+ * gnus.el: Pterodactyl Gnus v0.57 is released.
-1998-05-19 P. E. Jareth Hein <jareth@camelot-soft.com>
+1998-11-23 Felix Lee <flee@cygnus.com>
- * gnus-util.el (gnus-dd-mmm): New version.
+ * nntp.el (nntp-async-needs-kluge): new setting.
+ (nntp-async-timer): new var.
+ (nntp-async-process-list): new var.
+ (nntp-async-kluge): new function.
+ (nntp-async-timer-handler): new function.
+ (nntp-async-wait): new function.
+ (nntp-async-stop): new function.
+ (nntp-after-change-function): renamed, and split apart.
+ (nntp-async-trigger): new function.
+ (nntp-do-callback): new function.
+ (nntp-accept-process-output): add optional timeout arg.
-1998-05-19 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+ * gnus-async.el (gnus-async-request-fetched-article): fixed.
+ (gnus-async-wait-for-article): new function.
+ (gnus-async-with-semaphore): s/asynch/async/.
- * gnus.el: Changed address.
+1998-11-30 Lars Magne Ingebrigtsen <larsi@gnus.org>
-1998-05-12 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+ * gnus-art.el (gnus-with-article): Don't encode.
+ (gnus-insert-mime-button): Fall back on filename from C-D.
+ (gnus-mime-display-single): Have dots right on text/plain
+ attachments.
- * gnus-agent.el (gnus-agent-expire): Delete more.
+ * mm-decode.el (mm-dissect-buffer): Respect Content-Disposition in
+ broken parts.
-1998-05-10 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+ * gnus-art.el (gnus-with-article): Flush cache and backlog.
- * gnus-group.el (gnus-group-read-ephemeral-group): Don't add
- `address'.
+ * mm-bodies.el (mm-decode-content-transfer-encoding): Also do
+ binhex.
-1998-05-03 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+ * gnus-sum.el (gnus-summary-reparent-thread): Use new macro.
+ (gnus-summary-repair-multipart): New command and keystroke.
- * nnmail.el (nnmail-within-headers-p): Renamed.
+ * gnus-art.el (gnus-with-article-buffer): New macro.
- * message.el (message-cancel-news): If a Sender header doesn't
- exist, compare From against `message-make-from'.
+1998-11-29 Shenghuo ZHU <zsh@cs.rochester.edu>
-1998-05-03 Lars Balker Rasmussen <lbr@image.dk>
+ * gnus-art.el (gnus-mime-inline-part): Do not get part when
+ undisplay the part.
- * gnus-agent.el (gnus-agent-save-group-info): Fix
- re-search-forward params.
+1998-11-30 Lars Magne Ingebrigtsen <larsi@gnus.org>
-1998-05-03 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+ * gnus-util.el (gnus-make-sort-function-1): Allow lambdas.
- * gnus-agent.el (gnus-agent-expire): Check for the size.
+ * mml.el (mml-read-part): Partition right.
-1998-05-02 Dan Christensen <jdc@chow.mat.jhu.edu>
+ * mm-decode.el (mm-handle-set-cache): New macro.
+ (mm-handle-cache): Ditto.
+ (mm-make-handle): Ditto.
+ (mm-dissect-singlepart): Use it.
+ (mm-get-image): Use the cache.
- * nnfolder.el (nnfolder-goto-article): New version.
- (nnfolder-read-folder): Fix.
+1998-11-29 Lars Magne Ingebrigtsen <larsi@gnus.org>
- * nnmail.el (nnmail-within-headers): New function.
+ * gnus-art.el (gnus-mime-display-mixed): Rewrite.
+ (gnus-mime-display-single): Don't insert lines between parts.
-1998-05-02 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+1998-11-29 Shenghuo ZHU <zsh@cs.rochester.edu>
- * nnfolder.el (nnfolder-goto-article): Thinkotypo search arguments.
+ * nnmail.el (nnmail-file-coding-system-1): New variable.
+ * nnfolder.el (nnfolder-file-coding-system): Ditto.
+ (nnfolder-read-folder): Use nnfolder-file-coding-system.
+ * nnml.el (nnml-file-coding-system): New variable.
+ (nnml-request-article): Use nnml-file-coding-system.
- * nnheader.el (nnheader-find-file-noselect): Also bind
- `find-file-hooks' to nil.
+1998-11-29 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
- * nnmail.el (nnmail-process-unix-mail-format): Don't use
- `find-file-noselect'.
+ * gnus.el: Pterodactyl Gnus v0.56 is released.
- * gnus-group.el (gnus-group-make-menu-bar): Typo.
+1998-11-29 Lars Magne Ingebrigtsen <larsi@gnus.org>
-1998-05-01 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
+ * gnus-art.el (gnus-mime-display-part): New function.
+ (gnus-mime-display-mixed): Use it.
- * gnus.el: Gnus v5.6.9 is released.
+ * mm-view.el (mm-setup-w3): Don't register.
-1998-05-01 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+ * message.el (message-cite-original): Cite parts.
- * nnfolder.el (nnfolder-goto-article): Would infloop.
+1998-11-28 Lars Magne Ingebrigtsen <larsi@gnus.org>
-1998-05-01 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
+ * mml.el (mml-parameter-string): New function.
+ (mml-insert-mime-headers): Separated into new function.
- * gnus.el: Gnus v5.6.8 is released.
+1998-11-28 Hrvoje Niksic <hniksic@srce.hr>
-1998-05-01 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+ * mml.el (mml-make-boundary): Use `make-string'.
- * nntp.el (nntp-request-newgroups): Use format-time-string.
+1998-11-27 Hrvoje Niksic <hniksic@srce.hr>
- * message.el (message-fetch-field): Inhibit point-motion hooks.
+ * binhex.el (binhex-insert-char): Ditto.
-1998-05-01 Wes Hardaker <wjhardaker@ucdavis.edu>
+ * uudecode.el (uudecode-insert-char): Code correctly.
- * gnus-score.el (gnus-adaptive-word-no-group-words): New variable.
+1998-11-28 Lars Magne Ingebrigtsen <larsi@gnus.org>
-1998-05-01 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+ * mml.el (mml-generate-mime): Don't generate multiparts for
+ empties.
- * gnus-agent.el (gnus-agent-expire): Put point at the start of the
- buffer.
+ * gnus-art.el (gnus-display-mime): Save excursion.
- * gnus-soup.el (gnus-soup-parse-areas): Check whether the file
- exists.
+ * message.el (message-remove-first-header): New function.
+ (message-encode-message-body): Use it.
- * gnus-draft.el (gnus-draft-send): Use meta-information.
+1998-11-27 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
- * nnagent.el (nnagent-request-post): Store meta-information.
+ * gnus.el: Pterodactyl Gnus v0.55 is released.
- * gnus-agent.el (gnus-agent-meta-information-header): New variable.
- (gnus-agent-insert-meta-information): New function.
+1998-11-27 Lars Magne Ingebrigtsen <larsi@gnus.org>
-1998-05-01 Paul Franklin <paul@cs.washington.edu>
+ * mm-view.el (mm-setup-w3): New function.
- * message.el (message-generate-headers): Insert Sender when
- required.
+ * mm-decode.el (mm-content-id-get-contents): New function.
+ (mm-content-id-get-type): Ditto.
+ (mm-content-id-get-encoding): Ditto.
+ (mm-get-handle-by-content-id): Removed.
-1998-05-01 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+1998-11-25 Colin Rafferty <colin@xemacs.org>
- * gnus-util.el (gnus-dd-mmm): Accept "" dates.
+ * message.el (message-generate-new-buffers): Fix tag.
- * gnus-cite.el (gnus-article-hide-citation): Don't remove button
- when hiding.
+1998-11-25 Lars Magne Ingebrigtsen <larsi@gnus.org>
- * gnus-msg.el (gnus-post-method): Allow ARG to override
- `current'.
+ * message.el (message-buffer-name): Check for unique first.
- * gnus-sum.el (gnus-remove-thread): Remove the dummy root
- properly.
+ * gnus-art.el (gnus-unbuttonized-mime-type-p): use
+ gnus-inhibit-mime-unbuttonizing.
- * nnfolder.el (nnfolder-goto-article): New function.
- (nnfolder-retrieve-headers): Use it.
- (nnfolder-request-article): Ditto.
+ * gnus-sum.el (t): Bind M-t.
+ (gnus-inhibit-unbuttonizing): New variable.
+ (gnus-summary-toggle-display-buttonized): New command.
-1998-04-29 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
+ * gnus-art.el (gnus-display-mime): Select article window.
+ (article-strip-trailing-space): New command and keystroke.
- * gnus.el: Gnus v5.6.7 is released.
+ * nneething.el (nneething-include-files): New variable.
+ (nneething-create-mapping): Use it.
-1998-04-29 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+ * nntp.el (nntp-possibly-change-group): Use nntp-send-command.
- * gnus-sum.el (gnus-summary-update-info): Bind
- gnuis-newsgroup-scored later.
- (gnus-summary-prepare-threads): Check some more before inserting
- dummy roots.
+ * nnvirtual.el (nnvirtual-request-update-mark): Only yodate
+ ayto-expirable marks.
- * gnus-cache.el (gnus-cache-enter-article): Update marks
- properly.
+1998-11-24 Lars Magne Ingebrigtsen <larsi@gnus.org>
- * gnus-xmas.el (gnus-xmas-draft-menu-add): New function.
+ * gnus-art.el (gnus-mime-view-all-parts): Set buffer.
- * nntp.el (nntp-connection-timeout): Removed.
+ * gnus-sum.el (gnus-summary-display-buttonized): Don't pass on
+ ARG.
- * gnus-move.el (gnus-move-group-to-server): Delete nils.
+ * gnus-art.el (gnus-article-mode-line-format): Doc fix.
- * nntp.el (nntp-close-server): Close more connections.
+1998-11-24 Shenghuo ZHU <zsh@cs.rochester.edu>
- * gnus-art.el (gnus-button-alist): Accept white space after colons
- in <URL:news:> things.
+ * mm-util.el (mm-binary-coding-system): New variable.
+ (mm-with-unibyte-buffer): Use mm-binary-coding-system.
+ * mm-decode.el (mm-display-external): Ditto.
-1998-04-29 Kurt Swanson <kurt@dna.lth.se>
+1998-11-24 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
- * gnus-art.el (article-update-date-lapsed): Bind
- `deactivate-mark'.
+ * gnus.el: Pterodactyl Gnus v0.54 is released.
- * gnus-salt.el (gnus-pick-mode-map): Moved keys around to avoid
- shadowing.
+1998-11-24 Katsumi Yamaoka <yamaoka@jpl.org>
- * gnus-art.el (gnus-article-read-summary-keys): New version.
+ * gnus-sum.el (gnus-newsgroup-default-charset-alist): Note fj.
- * gnus-sum.el (gnus-summary-make-menu-bar): New for article mode.
+1998-11-24 Lars Magne Ingebrigtsen <larsi@gnus.org>
- * gnus-msg.el (gnus-post-method): `current' custom.
+ * mm-decode.el (mm-save-part): Unquote.
-1998-04-29 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+1998-11-24 Matt Armstrong <matta@geoworks.com>
- * gnus-sum.el (gnus-summary-set-local-parameters): Ignore
- quit-config.
- (gnus-select-newsgroup): Use the value of gnus-fetch-old-headers.
+ * mm-decode.el (mm-save-part): Bind coding system for write.
- * message.el (message-post-method): Doc fix.
+1998-11-24 Lars Magne Ingebrigtsen <larsi@gnus.org>
- * gnus.el (gnus-directory): dox fix.
+ * gnus-art.el (gnus-article-mode-line-format): New default.
+ (gnus-article-mime-part-status): New function.
-1998-04-28 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+ * message.el (message-send-news): Check the body syntax before
+ encoding.
- * gnus-group.el (gnus-group-timestamp): Really get timestamp.
+ * gnus-art.el (gnus-unbuttonized-mime-type): New function.
+ (gnus-mime-display-single): Use it.
+ (gnus-mime-display-alternative): Ditto.
- * gnus.el (gnus-group-parameter-value): Use explicit iteration.
+ * mm-decode.el: Check for whether we are running under a term.
-1998-04-28 Hallvard B. Furuseth <h.b.furuseth@usit.uio.no>
+1998-11-22 Lars Magne Ingebrigtsen <larsi@gnus.org>
- * gnus-util.el (gnus-alive-p): Check for binding.
+ * mm-decode.el (mm-preferred-alternative): Default to first
+ alternative.
+ (mm-preferred-alternative): No, we dont.
-1998-04-28 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+1998-11-24 Shenghuo ZHU <zsh@cs.rochester.edu>
- * gnus-sum.el (gnus-parent-headers): Don't infloop on nil
- References.
+ * mm-decode.el (mm-display-external): Use binary instead of
+ no-conversion.
+ * gnus-agent.el (gnus-agent-file-coding-system): Ditto.
+ * nnheader.el (nnheader-file-coding-system): Ditto.
+ * mm-util.el (mm-with-unibyte-buffer): Use binary instead of nil.
- * gnus-art.el (gnus-article-mode): Don't kill local vars.
+1998-11-23 Shenghuo ZHU <zsh@cs.rochester.edu>
- * score-mode.el (score-mode-syntax-table): Change syntax.
+ * gnus-sum.el (gnus-newsgroup-setup-default-charset): Use group
+ name without method.
-1998-04-27 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
+1998-11-23 Shenghuo ZHU <zsh@cs.rochester.edu>
- * gnus.el: Gnus v5.6.6 is released.
+ * gnus-sum.el (gnus-newsgroup-default-charset): Rename
+ coding-system -> default-charset.
+ (gnus-newsgroup-default-charset-alist): Ditto.
+ (gnus-summary-local-variables): Ditto.
+ (gnus-set-global-variables): Ditto.
+ (gnus-get-newsgroup-headers): Ditto.
+ (gnus-summary-from-or-to-or-newsgroups): Ditto.
+ (gnus-get-newsgroup-headers-xover): Ditto.
+ (gnus-newsgroup-setup-default-charset): Ditto.
+ (article-decode-mime-words): Ditto.
+ (article-decode-charset): Ditto.
+ (article-decode-encoded-words): Ditto.
+ (article-de-quoted-unreadable): Ditto.
+ (gnus-mime-view-all-parts): Ditto.
+ (gnus-mime-externalize-part): Ditto.
+ (gnus-mm-display-part): Ditto.
+ (gnus-mime-display-single): Ditto.
+ (gnus-mime-display-alternative): Ditto.
+
+1998-11-23 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * rfc2047.el (rfc2047-decode-region): Do not decode nil charset.
+ * gnus-art.el (article-decode-charset): Overlay
+ rfc2047-default-charset.
+ * message.el (message-draft-coding-system): New variable.
+ (message-set-auto-save-file-name): Use message-draft-coding-system.
+ * nndraft.el (nndraft-request-article): Ditto.
+ * gnus-start.el (gnus-start-draft-setup): Set charset nil.
+ * gnus-agent.el (gnus-agent-queue-setup): Ditto.
+
+1998-11-22 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * mm-uu.el (mm-uu-test): New function.
+ (mm-uu-dissect): Inherit charset and cte from head.
+ * gnus-art.el (article-decode-charset): Use mm-uu-test.
+
+1998-11-21 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
+
+ * gnus.el: Pterodactyl Gnus v0.53 is released.
-1998-04-27 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+1998-11-21 Lars Magne Ingebrigtsen <larsi@gnus.org>
- * gnus-art.el (gnus-request-article-this-buffer): Viewing pseudos
- in nneething groups bugged.
+ * mm-decode.el (mm-get-image): New function.
+ (mm-image-fit-p): New function.
- * gnus-sum.el (gnus-summary-prepare-threads): Dummy roots and
- dormants and stuff.
+ * gnus-util.el (gnus-annotation-in-region-p): New definition.
-1998-04-26 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+ * gnus-art.el (gnus-article-insert-newline): New function.
+ (article-goto-body): New function.
- * gnus-cache.el (gnus-cache-file-name): Use FULL.
+1998-11-20 Lars Magne Ingebrigtsen <larsi@gnus.org>
- * nnheader.el (nnheader-translate-file-chars): Allow FULL
- parameter.
+ * gnus-art.el (gnus-mime-display-single): Insert blank line before
+ buttons.
- * gnus-cache.el (gnus-cache-file-name): Translate all colons.
+ * gnus-sum.el (gnus-summary-display-buttonized): New command and
+ keystroke.
-1998-04-26 Justin Sheehy <justin@linus.mitre.org>
+ * gnus-art.el (gnus-mime-display-single): Don't insert a blank
+ line between parts.
- * nntp.el (nntp-rlogin-parameters): Doc fix.
+ * message.el (message-remove-header): Go to end if wanted.
-1998-04-26 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+1998-11-20 Karl Kleinpaste <karl@justresearch.com>
- * gnus-art.el (gnus-summary-save-in-mail): Not a command.
+ * gnus-art.el (gnus-mime-display-alternative): Avoid window
+ movement with save-window-excursion.
-1998-04-26 James Troup <J.J.Troup@scm.brad.ac.uk>
+1998-11-20 Shenghuo ZHU <zsh@cs.rochester.edu>
- * gnus-sum.el (gnus-summary-expire-articles-now): Work.
+ * gnus-art.el (gnus-mime-inline-part): Use argument as charset.
-1998-04-26 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+1998-11-20 Shenghuo ZHU <zsh@cs.rochester.edu>
- * gnus-sum.el (gnus-build-sparse-threads): Break loops.
- (gnus-summary-print-article): Save excursion to try to preserve
- local/bound variable messup.
+ * mm-bodies.el (mm-decode-body): Remove buffer-file-coding-system.
- * gnus-salt.el (gnus-tree-read-summary-keys): Put point in article
- buffer.
+1998-11-20 Shenghuo ZHU <zsh@cs.rochester.edu>
- * gnus-undo.el (gnus-undo): New group.
- (gnus-undo-limit): New variable.
- (gnus-undo-register-1): Use it.
+ * gnus-sum.el (gnus-summary-from-or-to-or-newsgroups): Use
+ gnus-newsgroup-coding-system.
+ (gnus-get-newsgroup-headers): Ditto.
+ (gnus-get-newsgroup-headers-xover): Ditto.
+ (gnus-set-global-variables): Ditto.
+ * gnus-art.el (article-decode-mime-words): Ditto.
+ (article-decode-charset): Ditto.
+ (article-decode-encoded-words): Ditto.
+ (article-de-quoted-unreadable): Ditto.
+ (gnus-mime-view-all-parts): Ditto.
+ (gnus-mime-externalize-part): Ditto.
+ (gnus-mm-display-part): Ditto.
+ (gnus-mime-display-alternative): Ditto.
+ (gnus-mime-display-single): Ditto.
+ * mm-view.el (mm-inline-text): Use default coding system.
- * gnus-sum.el (gnus-summary-update-info): Don't nix out scores.
+1998-11-20 Shenghuo ZHU <zsh@cs.rochester.edu>
- * gnus-start.el (gnus-active-to-gnus-format): Removed "." from
- quoting.
+ * gnus-sum.el (gnus-newsgroup-coding-system-alist): New variable.
+ (gnus-newsgroup-iso-8859-1-forced-regexp): New variable.
+ (gnus-newsgroup-coding-system): New local variable.
+ (gnus-newsgroup-iso-8859-1-forced): New local variable.
+ (gnus-summary-local-variables): Add two new local variables.
+ (gnus-newsgroup-setup-coding-system): New function.
+ (gnus-select-newsgroup): Setup coding system.
+ * mm-util.el (mm-charset-iso-8859-1-forced): New variable.
+ (mm-charset-to-coding-system): Use mm-charset-iso-8859-1-forced.
+ * gnus-cus.el (gnus-group-parameters): Customizable
+ iso-8859-1-forced.
- * gnus.el (gnus-cache-directory): Moved here.
- (gnus-predefined-server-alist): Use.
+1998-11-20 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
- * message.el (message-autosave-directory): Put back in.
- (message-set-auto-save-file-name): Use if Gnus isn't running.
+ * gnus.el: Pterodactyl Gnus v0.52 is released.
- * gnus-util.el (gnus-alive-p): Moved here.
+1998-11-20 Lars Magne Ingebrigtsen <larsi@gnus.org>
- * message.el (message-autosave-directory): Removed.
- (message-set-auto-save-file-name): Don't use it.
+ * rfc2047.el (rfc2047-encode-message-header): Encode the default
+ encoding.
- * gnus.el: Use gnus-buffer-exists-p throughout.
+ * gnus-art.el (gnus-mime-display-single): Insert buttons for
+ undisplayed text types.
- * gnus-uu.el (gnus-uu-save-article): Use gnus-kill-buffer.
+ * mm-decode.el (mm-automatic-display-p): Only prefer inlinable
+ types.
- * message.el (message-make-in-reply-to): Check more for strange
- From lines.
+1998-11-19 Felix Lee <flee@cygnus.com>
- * gnus-art.el (gnus-article-mode): Don't nix out vars.
+ * nntp.el (nntp-after-change-function-callback): recover from C-g.
-1998-04-26 Frank Bennett <bennett@rumple.soas.ac.uk>
+1998-11-19 Felix Lee <flee@cygnus.com>
- * nnmail.el (nnmail-move-inbox): Push error'ed mailboxes onto the
- list.
+ * gnus-async.el (gnus-asynch-obarray): rename to
+ gnus-async-hashtb, and don't buffer-local it.
-1998-04-26 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+ (gnus-async-article-callback): new function.
+ (gnus-make-async-article-function): use it.
- * gnus-score.el (gnus-score-save): Use it.
+ (gnus-async-current-prefetch-group): new var.
+ (gnus-async-current-prefetch-article): new var.
+ (gnus-async-request-fetched-article): are we fetching it already?
- * score-mode.el (score-mode-syntax-table): New table.
+ (gnus-async-delete-prefected-entry): s/prefected/prefetched/
- * nnmbox.el: Commentary fix.
+1998-11-20 Lars Magne Ingebrigtsen <larsi@gnus.org>
-1998-04-26 Richard Stallman <rms@santafe.edu>
+ * gnus-sum.el (gnus-summary-show-article): Require.
- * message.el (message-mode): New adaptive fill defaults.
+ * message.el: Provide before hooks.
+ (message-send-news): Do MIME before headers.
-1998-04-26 Jim Radford <radford@robby.caltech.edu>
+ * gnus-art.el (gnus-article-check-buffer): New function.
+ (gnus-article-read-summary-keys): Use it.
- * gnus-start.el (gnus-active-to-gnus-format): Groups that start
- with dots.
+ * mm-decode.el (mm-user-automatic-display): Display all inline
+ images.
-1998-04-11 Richard Stallman <rms@sucrose.gnu.org>
+ * gnus-art.el (gnus-mime-display-single): Don't buttonize so
+ much.
+ (gnus-unbuttonized-mime-types): New variable.
- * gnus/gnus-art.el (gnus-emphasis-alist): Use nth, not caddr.
+1998-11-19 Lars Magne Ingebrigtsen <larsi@gnus.org>
-1998-04-25 Kim-Minh Kaplan <KimMinh.Kaplan@utopia.eunet.fr>
+ * gnus-sum.el (gnus-inhibit-user-auto-expire): Changed to t.
- * gnus-sum.el (gnus-build-sparse-threads): Handle loops.
+ * mm-decode.el (mm-quote-arg): Quote semicolons.
-1998-04-25 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+ * gnus-art.el (gnus-mime-display-single): Don't display
+ attachments.
+ (gnus-mime-externalize-part): New command and keystroke.
- * gnus.el (gnus-valid-select-methods): nngateway is post-mail.
+ * mm-decode.el (mm-dissect-buffer): Pass on the description info.
+ (mm-alternative-precedence): Changed order.
-1998-04-24 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
+1998-11-07 Simon Josefsson <jas@pdc.kth.se>
- * gnus.el: Gnus v5.6.5 is released.
+ * gnus.el (gnus-method-simplify): New function.
+ (gnus-native-method-p): New function.
+ (gnus-secondary-method-p): Use gnus-method-equal.
-1998-04-24 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+ * gnus-start.el (gnus-group-change-level): Shorten select method.
- * gnus-msg.el (gnus-post-method): Doc fix.
- (gnus-post-method): Reversed semantics.
+1998-11-19 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
-1998-04-01 Jan Vroonhof <vroonhof@math.ethz.ch>
+ * gnus.el: Pterodactyl Gnus v0.51 is released.
- * gnus-msg.el (gnus-post-method): Customized. Added 'native
- option. In the function, added support for new value.
+1998-11-19 Lars Magne Ingebrigtsen <larsi@gnus.org>
-1998-04-24 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+ * gnus.el: Applied patches from 5.6.45.
- * nnmbox.el (nnmbox-request-create-group): New function.
+ * gnus-score.el (gnus-score-find-trace): Print complete file
+ paths.
+ (gnus-score-find-trace): Truncate lines.
-1998-04-12 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+ * gnus.el (gnus-message-archive-group): Allow function.
- * gnus-agent.el (gnus-agent-save-group-info): Only do those that
- are covered.
+ * message.el (message-encode-message-body): Remove Mime-Version
+ before inserting.
-1998-04-07 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+ * gnus-cus.el (gnus-group-customize): Optional topic.
- * nntp.el (nntp-authinfo-file): Doc fix.
+ * gnus-sum.el (gnus-summary-customize-parameters): New command and
+ keystroke.
-1998-03-31 Ken Raeburn <raeburn@cygnus.com>
+1998-11-18 Shenghuo ZHU <zsh@cs.rochester.edu>
- * nnml.el (nnml-request-expire-articles): Sort active-articles,
- then only expire the intersection of that set with the requested
- articles.
+ * message.el (message-encode-message-body): Rewrite.
-1998-04-01 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+1998-11-18 Lars Magne Ingebrigtsen <larsi@gnus.org>
- * message.el (message-supersede): Check Sender.
- (message-cancel-news): Fix Sender check.
+ * mml.el (mml-base-boundary): New variable.
+ (mml-make-boundary): New function.
-1998-03-29 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+ * gnus-cache.el (gnus-cache-coding-system): New variable.
+ (gnus-cache-request-article): Use it.
- * nnkiboze.el (nnkiboze-generate-group): Would mess up newsrs
- hashtb.
- (nnkiboze-enter-nov): Created bogus Xrefs headers.
+ * message.el (message-insert-mime-part): Delete duplicates.
- * gnus-agent.el (gnus-agent-save-group-info): New function.
+1998-11-18 Shenghuo ZHU <zsh@cs.rochester.edu>
- * gnus-start.el (gnus-get-unread-articles): Use it.
+ * gnus-art.el (gnus-mime-display-alternative): Set end of
+ multipart and display even when nothing is preferred.
- * message.el (message-expand-group): Allow completion from in the
- middle of strings.
- (message-font-lock-keywords): Work when mail-header-separator is
- "".
+1998-11-18 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
-1998-03-29 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
+ * gnus.el: Pterodactyl Gnus v0.50 is released.
- * gnus.el: Gnus v5.6.4 is released.
+1998-11-18 Lars Magne Ingebrigtsen <larsi@gnus.org>
-1998-03-29 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+ * mm-decode.el (mm-inline-media-tests): Check that device-type is
+ fbound.
- * nnkiboze.el (nnkiboze-request-delete-group): Would bug out when
- deleting files.
+ * gnus-sum.el (gnus-summary-sort): Didn't do reverse.
-1998-03-28 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+1998-11-07 Simon Josefsson <jas@pdc.kth.se>
- * nntp.el (nntp-encode-text): Use `nntp-end-of-line'.
+ * gnus.el (gnus-similar-server-opened): Compare backend.
-1998-03-26 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+1998-11-08 Simon Josefsson <jas@pdc.kth.se>
- * gnus-agent.el (gnus-agent-expire): Check size of history file.
+ * gnus-topic.el (gnus-topic-expire-articles): New function.
+ (gnus-topic-mode-map): Bind it.
- * message.el (message-mode): Doc fix.
+ * gnus.texi (Topic Commands): New expiry command. Reordered.
-1998-03-23 Mike McEwan <mike@lotusland.demon.co.uk>
+1998-11-10 Miles Bader <miles@ccs.mt.nec.co.jp>
- * gnus-score.el (gnus-score-default-type): Doc fix.
+ * gnus-sum.el
+ (gnus-auto-expirable-marks): New variable.
+ (gnus-inhibit-user-auto-expire): New variable.
+ (gnus-summary-mark-article-as-read, gnus-summary-mark-article):
+ When looking to see if we should expire instead, check
+ gnus-auto-expirable-marks instead of using a hard-wired list.
+ (gnus-summary-mark-as-read-forward,
+ gnus-summary-mark-as-read-backward):
+ Pass gnus-inhibit-user-auto-expire for the no-expire argument to
+ gnus-summary-mark-forward, instead of `t'.
-1998-03-23 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+1998-11-18 Lars Magne Ingebrigtsen <larsi@gnus.org>
- * gnus-int.el (gnus-request-body): Do the same as HEAD.
+ * mml.el (mml-compute-boundary): New function.
+ (mml-compute-boundary-1): New function.
+ (mml-generate-mime-1): Use it.
- * gnus-art.el (gnus-article-edit-article-hook): Removed.
+1998-11-18 Hrvoje Niksic <hniksic@srce.hr>
-1998-03-23 jari aalto <jari.aalto@poboxes.com>
+ * mml.el (mml-generate-mime-1): Always precede closing boundary
+ with newline.
- * gnus-art.el (gnus-article-edit-article-hook): New hook.
+1998-11-18 Lars Magne Ingebrigtsen <larsi@gnus.org>
-1998-03-19 Jan Vroonhof <vroonhof@math.ethz.ch>
+ * mml.el (mml-generate-mime-1): Do right boundaries when several
+ multiparts.
- * nntp.el (nntp-open-rlogin): Wrap in save-excursion
+ * mm-decode.el (mm-user-automatic-display): Default to inline
+ jpeg.
-1998-03-19 Joe Buehler <jhpb@hekimian.com>
+ * mml.el (mml-generate-mime-1): Encode non-text parts.
- * gnus-util.el (gnus-date-iso8601): Use simple string.
+1998-11-18 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
-1998-03-19 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
+ * gnus.el: Pterodactyl Gnus v0.49 is released.
- * gnus.el: Gnus v5.6.3 is released.
+1998-11-18 Lars Magne Ingebrigtsen <larsi@gnus.org>
-1998-03-19 Wes Hardaker <wjhardaker@ucdavis.edu>
+ * mm-view.el (mm-inline-text): Require w3-vars.
- * gnus-win.el (gnus-delete-windows-in-gnusey-frames): Make sure
- there are no nil buffers.
+ * gnus-setup.el (gnus-use-tm): Removed.
-1998-03-17 Per Abrahamsen <abraham@dina.kvl.dk>
+ * gnus-art.el (gnus-article-goto-part): Don't beep.
+ (gnus-article-view-part): Check return value.
+ (gnus-mime-display-alternative): Don't display when there is
+ nothing to display.
- * gnus-uu.el (gnus-uu-digest-headers): Add `Content-Type' and
- `Content-Transfer-Encoding'.
+ * mml.el (mml-generate-mime-1): Don't use a unibyte buffer.
+ (mml-generate-mime-1): Use unibyte for binaries.
-1998-03-18 Per Abrahamsen <abraham@dina.kvl.dk>
+ * gnus-art.el (gnus-display-mime): Call
+ gnus-article-mime-part-function.
+ (gnus-mime-part-function): New function.
+ (gnus-article-mime-part-function): New function.
- * message.el (message-header-lines): Added `:format'.
+ * mml.el (mml-generate-mime-1): Don't insert so many newlines.
-1998-03-18 Simon Josefsson <jas@pdc.kth.se>
+1998-11-16 Lars Magne Ingebrigtsen <larsi@gnus.org>
- * nndoc.el: dummy request-accept-article
+ * mml.el (mml-generate-mime-1): Do it in unibyte buffers.
-1998-03-19 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+ * message.el (message-font-lock-keywords): Highlight MML.
+ (message-mml-face): New font.
- * gnus-sum.el (gnus-summary-next-subject): Expand threads.
+1998-11-16 Shenghuo ZHU <zsh@cs.rochester.edu>
- * gnus-agent.el (gnus-agent-group-mode-hook,
- gnus-agent-summary-mode-hook): New variables.
- (gnus-agent-mode): Run them.
+ * gnus-art.el (gnus-display-mime): Clean up even when no handles.
+ (gnus-mm-display-part): Do not select-window if the article window
+ is not found.
-1998-03-14 SL Baur <steve@altair.xemacs.org>
+1998-11-16 Shenghuo ZHU <zsh@cs.rochester.edu>
- * gnus-xmas.el (gnus-xmas-group-startup-message): Tell gnus-start
- we've already drawn the pretty Gnu graphic.
+ * gnus-sum.el (gnus-summary-move-article): Use no-encode for B m.
-1998-03-19 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+1998-11-16 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
- * gnus-msg.el: Would use nil group names.
+ * gnus.el: Pterodactyl Gnus v0.48 is released.
- * nntp.el (nntp-send-authinfo): Send authinfo to "force"d
- servers.
+1998-11-15 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * mm-bodies.el (mm-encode-body): Disbabled for nonmule.
- * gnus-util.el (gnus-parse-netrc): Accept the "force" token.
+ * mm-util.el (mm-find-charset-region): Bogus change for non-Mule.
- * message.el (message-cancel-news): Compare Sender header, not
- From header.
+ * message.el (message-cite-original-without-signature): Ditto.
+ (message-cite-original): Quote parts.
-1998-03-17 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+1998-11-15 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
- * gnus-art.el (article-hide-headers): Fold case.
+ * gnus.el: Pterodactyl Gnus v0.47 is released.
-1998-03-14 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+1998-11-15 Lars Magne Ingebrigtsen <larsi@gnus.org>
- * gnus-util.el (gnus-horizontal-recenter): New window-end may
- return nil.
+ * message.el (message-encode-message-body): Insert MIME warning.
-1998-03-13 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+ * mml.el (mml-read-tag): Look for #tag.
- * gnus-agent.el (gnus-agent-fetch-session): Check whether server
- is up before fetching.
+ * mm-util.el (mm-find-charset-region): Check whether
+ enable-multibyte-characters is bound.
- * gnus-win.el (gnus-window-frame-focus): New variable.
- (gnus-configure-windows): Use it.
+1998-11-15 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
- * gnus-sum.el (gnus-summary-catchup-and-exit): Don't select next
- when in an ephemeral group.
+ * gnus.el: Pterodactyl Gnus v0.46 is released.
- * gnus-agent.el (gnus-agent-expire): Message end.
- (gnus-agent-expire-all): New variable.
- (gnus-agent-expire): Use it.
+1998-11-15 Lars Magne Ingebrigtsen <larsi@gnus.org>
-1998-03-13 Shenghuo ZHU <zsh@cs.rochester.edu>
+ * message.el (message-encode-message-body): Insert headers at the
+ right spot.
- * gnus-agent.el (gnus-agent-high-scored-p): Wrong value.
+1998-11-15 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
-1998-03-13 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+ * gnus.el: Pterodactyl Gnus v0.45 is released.
- * nnvirtual.el (nnvirtual-request-group): Force updating of info.
+1998-11-15 Lars Magne Ingebrigtsen <larsi@gnus.org>
-1998-03-08 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+ * nndraft.el (nndraft-save-mime-part): Removed.
+ (nndraft-get-mime-part): Ditto.
- * nnmail.el (nnmail-delete-incoming): Changed default.
+ * message.el (message-format-mime-old): Removed.
+ (message-encode-message-body): Removed.
+ (message-encode-message-body): Renamed.
-1998-03-08 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
+1998-11-14 Lars Magne Ingebrigtsen <larsi@gnus.org>
- * gnus.el: Gnus v5.6.2 is released.
+ * gnus-sum.el (gnus-get-newsgroup-headers): Translate \r's.
-1998-03-08 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+ * message.el (message-format-mime): Check message-mime-part.
- * gnus-picon.el (gnus-get-buffer-name): Look in the assoc for the
+ * mm-encode.el (mm-mime-file-types): Removed.
+ (mm-default-file-encoding): New definition.
+
+1998-11-14 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * mm-view.el (mm-inline-image): Use mm-insert-inline.
+ * gnus-art.el (gnus-mm-display-part): Go to correct position.
+
+1998-11-14 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
+
+ * gnus.el: Pterodactyl Gnus v0.44 is released.
+
+1998-11-14 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * message.el (message-format-mime): New function.
+
+ * nndraft.el (nndraft-save-mime-part): New function.
+ (nndraft-get-mime-part): New function.
+
+ * mm-encode.el (mm-default-file-encoding): New function.
+ (mm-content-transfer-encoding): New function.
+ (mm-encode-buffer): New function.
+
+ * message.el: New command.
+ (message-mime-part): New variable.
+ (message-insert-mime-part): New command.
+
+ * mm-encode.el (mm-encode-content-transfer-encoding): New
+ function.
+
+ * mm-util.el (mm-content-transfer-encoding-defaults): New
variable.
+ (mm-mime-file-types): Taken from TM.
- * nntp.el (nntp-wait-for): Check more for dead connections.
+1998-11-14 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
- * gnus-eform.el (gnus-edit-form-buffer): Moved back here.
+ * gnus.el: Pterodactyl Gnus v0.43 is released.
- * gnus-win.el (gnus-window-to-buffer-helper): Return nil when
- buffers don't exist.
+1998-11-07 Karl Kleinpaste <karl@jprc.com>
- * nndraft.el (nndraft-request-restore-buffer): Remove Xref header,
- not Xrefs.
+ * gnus-cus.el (gnus-score-customize): Add "Extra" element.
+ * gnus-score.el (gnus-score-default-header): Ditto.
+ (gnus-header-index): Ditto.
+ (gnus-summary-increase-score): Ditto, & process "extra" requests.
+ (gnus-summary-header): Handle extra headers.
+ (gnus-summary-score-entry): Ditto, & provide new score element.
+ (gnus-summary-score-effect): Ditto.
+ (gnus-score-string): Avoid "extra" string sort, & modify match in
+ "extra" case.
+ * gnus-sum.el (gnus-make-score-map): Add "extra" element.
-1998-03-08 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
+1998-11-13 Lars Magne Ingebrigtsen <larsi@gnus.org>
- * gnus.el: Gnus v5.6.1 is released.
+ * message.el (message-resend): Bind message-required-mail-headers
+ to nil.
-1998-03-07 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+ * mm-view.el (mm-inline-text): Bind w3-strict-width.
- * gnus.el (gnus-edit-form-buffer): Moved here.
+ * nngateway.el (require): Require cl.
- * gnus-agent.el (gnus-agent-expire-old): Removed.
- (gnus-agent-expire-directory): Ditto.
- (gnus-agent-expire-group): Even more ditto.
+ * gnus-art.el (gnus-button-alist): Exclude more chars from news:
+ things.
-1998-03-07 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
+1998-11-11 Shenghuo ZHU <zsh@cs.rochester.edu>
- * gnus.el: Quassia Gnus v0.37 is released.
+ * gnus-agent.el (gnus-agent-fetch-headers): Create directory even
+ when no articles.
-1998-03-07 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+1998-11-13 Lars Magne Ingebrigtsen <larsi@gnus.org>
- * gnus-agent.el (gnus-agent-expire-days): New variable.
- (gnus-agent-expire): New function.
+ * message.el (message-ignored-resent-headers): Remove X-Gnus.
-1998-03-07 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
+1998-11-10 Colin Rafferty <colin@xemacs.org>
- * gnus.el: Quassia Gnus v0.36 is released.
+ * gnus-sum.el (gnus-ignored-from-addresses): Only quote
+ user-mail-address if non-nil.
-1998-03-07 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+1998-11-13 Lars Magne Ingebrigtsen <larsi@gnus.org>
- * nntp.el (nntp-wait-for): Reversed logic.
+ * gnus-util.el (gnus-make-sort-function): Do `reverse'.
+ (gnus-make-sort-function-1): Ditto.
-1998-03-07 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
+ * gnus-art.el (gnus-mm-display-part): Switch to mm in right
+ window.
- * gnus.el: Quassia Gnus v0.35 is released.
+1998-11-12 Lars Magne Ingebrigtsen <larsi@gnus.org>
-1998-03-07 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+ * mm-util.el (mm-with-unibyte-buffer): Ditto.
- * gnus-picon.el (gnus-picons-x-face-sentinel): Check whether
- gnus-picons-x-face-file-name exists.
+ * binhex.el (binhex-decode-region): Quote.
- * gnus-art.el (gnus-article-read-summary-keys): Move window point
- in the summary buffer.
+1998-11-10 Lars Magne Ingebrigtsen <larsi@gnus.org>
- * nndoc.el (nndoc-type-alist): Allow spaces around separator.
+ * gnus-art.el (article-decode-charset): Don't downcase charset.
- * gnus-sum.el (gnus-summary-edit-parameters): Interactive.
+ * gnus-sum.el (gnus-get-newsgroup-headers-xover): Translate CR's.
-1998-03-07 Wes Hardaker <wjhardaker@ucdavis.edu>
+1998-11-08 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
- * gnus-art.el (gnus-article-prepare): Mark articles as
- downloadable.
+ * gnus.el: Pterodactyl Gnus v0.42 is released.
-1998-03-04 Ken Raeburn <raeburn@cygnus.com>
+1998-11-08 Shenghuo ZHU <zsh@cs.rochester.edu>
- * gnus-int.el (gnus-get-function): New version, caches symbol
- names.
+ * gnus-art.el (gnus-display-mime): Add id for alternative part.
-1998-03-06 Ken Raeburn <raeburn@cygnus.com>
+1998-11-08 Simon Josefsson <jas@pdc.kth.se>
- * nnml.el (nnml-article-to-file): Build pathname using
- expand-file-name. (Thanks, Colin Rafferty, for catching
- this.)
+ * nntp.el (nntp-send-mode-reader): Revert.
-1998-02-28 Ken Raeburn <raeburn@cygnus.com>
+1998-11-08 Shenghuo ZHU <zsh@cs.rochester.edu>
- * nnml.el (nnml-article-to-file): Don't add extra "/" when
- building pathname.
+ * gnus-agent.el (gnus-agent-fetch-articles): Use with-temp-buffer.
- * nnheader.el (nnheader-file-to-number): Check value of
- nnheader-numerical-short-files instead of checking if jka-compr is
- loaded.
+1998-11-07 Shenghuo ZHU <zsh@cs.rochester.edu>
-1998-03-03 Dave Love <d.love@dl.ac.uk>
+ * message.el (message-make-date): Fix for negative time zones.
- * nnheader.el (nnheader-parse-head): Fix in-reply-to code. Return
- nil consistently if not found.
+1998-11-08 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
-1998-03-07 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+ * gnus.el: Pterodactyl Gnus v0.41 is released.
- * nntp.el: Check whether the connection died.
+1998-11-08 Hrvoje Niksic <hniksic@srce.hr>
-1998-03-01 Kim-Minh Kaplan <KimMinh.Kaplan@utopia.eunet.fr>
+ * mm-decode.el (mm-dissect-multipart): Quote regexp.
- * gnus.texi (Easy Picons): Removed references to
- `gnus-group-display-picons'.
- (Hard Picons): Ditto.
+1998-10-29 Sudish Joseph <sj@eng.mindspring.net>
-1998-03-02 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+ * gnus.el (gnus-short-group-name): When shortening foreign select
+ methods, do not scan for plusses beyond the first colon.
- * gnus-sum.el (gnus-summary-exit-no-update): Run
- gnus-summary-prepare-exit-hook here as well.
+1998-11-07 Mike McEwan <mike@lotusland.demon.co.uk>
-1998-02-28 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+ * gnus-agent.el (gnus-agent-save-group-info): Cater for group info
+ lines where `group' is the last thing on the line.
- * nntp.el (nntp-authinforc-file): Changed default.
- (nntp-authinfo-file): Changed name.
- (nntp-record-commands): New variable.
- (nntp-record-command): New function.
+1998-11-08 Lars Magne Ingebrigtsen <larsi@gnus.org>
- * gnus-agent.el (gnus-agent-group-path): Use real name of group.
+ * gnus-art.el (gnus-article-view-part): Do alternative.
+ (gnus-mime-display-alternative): Insert marker.
- * gnus-sum.el (gnus-summary-insert-subject): Don't allow nil
- articles.
- (gnus-summary-read-group): Respect backward movement.
+1998-11-07 Lars Magne Ingebrigtsen <larsi@gnus.org>
-1998-03-01 Kim-Minh Kaplan <KimMinh.Kaplan@utopia.eunet.fr>
+ * mm-decode.el (mm-dissect-multipart): Quote regexp.
- * gnus-win.el (gnus-window-to-buffer): change "*Picons*" to
- `gnus-picons-buffer'.
- (gnus-window-to-buffer-helper): Support dynamic picon buffer
- name (i.e a symbol that names a function to be called).
- (gnus-configure-frame): Use it.
- (gnus-delete-windows-in-gnusey-frames): Use it.
- (gnus-all-windows-visible-p): Use it.
- (gnus-remove-some-windows): Use it.
+ * nnmail.el (nnmail-expired-article-p): Protect against bogus
+ dates.
- * gnus-picon.el (gnus-get-buffer-name): Use it.
- (gnus-picons-kill-buffer): New function.
- (gnus-picons-setup-buffer): New function.
- (gnus-picons-set-buffer): Use them.
- (gnus-picons-display-x-face): Put back the `buf' binding: it is
- needed when `gnus-picons-display-where' is not set to article.
- Also move the X-Face to the left, near the address. It seems more
- logical.
+ * gnus-cus.el (gnus-topic): Required.
-1998-02-28 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
+ * nnheader.el (nnheader-parse-nov): Parse extra.
+ (nnheader-nov-parse-extra): New macro.
- * gnus.el: Quassia Gnus v0.34 is released.
+1998-10-31 Lars Magne Ingebrigtsen <larsi@gnus.org>
-1998-02-28 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
+ * gnus-art.el (gnus-article-view-part): Internal move.
- * gnus.el: Quassia Gnus v0.33 is released.
+1998-10-28 Per Abrahamsen <abraham@dina.kvl.dk>
-1998-02-28 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+ * gnus-cus-new.el (gnus-custom-topic): New free variable.
+ (gnus-group-customize): Support editing topic parameters.
- * gnus-picon.el (gnus-picons-display-x-face): `buf' -- unbound
- var.
+1998-10-29 Karl Kleinpaste <karl@jprc.com>
-1998-02-28 Fran\e,Ag\e(Bois Pinard <pinard@iro.umontreal.ca>
+ * gnus-sum.el (gnus-summary-from-or-to-or-newsgroups): Add
+ indicators.
- * gnus: configure'd.
+1998-10-29 Lars Magne Ingebrigtsen <larsi@gnus.org>
-1998-02-28 Nelson Jose dos Santos Ferreira <Nelson.Ferreira@inesc.pt>
+ * gnus-art.el (gnus-mm-display-part): Return.
+ (gnus-article-view-part): Only go if external.
+ (gnus-article-dumbquotes-map): Do 205.
- * nnsoup.el (nnsoup-store-reply): Fix double sep error.
+ * mm-decode.el (mm-display-part): Return what was done.
-1998-02-28 Lasse Rasinen <lrasinen@iki.fi>
+ * message.el (message-buffer-naming-style): New variable.
+ (message-generate-new-buffers): Extended.
+ (message-buffer-naming-style): Removed.
+ (message-buffer-name): Use it.
+ (message-do-send-housekeeping): Rename new styling.
- * gnus-start.el (gnus-ask-server-for-new-groups): Message more.
+ * gnus-sum.el (gnus-summary-recenter): Allow
+ gnus-auto-center-summary to be a number.
-1998-02-27 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+1998-11-04 Shenghuo ZHU <zsh@cs.rochester.edu>
- * message.el (message-resend): Allow arbitrary Also's.
+ * pop3.el (pop3-open-server): Use "binary" instead of
+ "no-conversion".
-1998-02-27 Dave Love <d.love@dl.ac.uk>
+1998-11-01 Shenghuo ZHU <zsh@cs.rochester.edu>
- * gnus-sum.el (gnus-simplify-subject-functions): Fix
- customization, doc.
+ * gnus-srvr.el (gnus-browse-foreign-server): Set
+ gnus-browse-current-method to the result of gnus-server-to-method.
-1998-02-25 Dave Love <d.love@dl.ac.uk>
+1998-10-29 Shenghuo ZHU <zsh@cs.rochester.edu>
- * gnus-art.el (gnus-article-x-face-command): Replace leading `{'.
+ * gnus-util.el (gnus-pull): Another optional argument.
+ * nnweb.el (nnweb-request-delete-group): Delete from
+ nnweb-group-alist and update active file.
-1998-02-23 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+1998-10-29 Shenghuo ZHU <zsh@cs.rochester.edu>
- * gnus-agent.el (gnus-plugged): New command and keystroke.
+ * gnus-group.el (gnus-group-make-group): Accept group of new
+ method.
- * gnus-ems.el (gnus-ems-redefine): Define
- 'gnus-summary-set-display-table as a function that takes no
- params.
+1998-10-28 Shenghuo ZHU <zsh@cs.rochester.edu>
- * gnus.el (gnus-interactive): Don't use gnus-sum macros.
- (gnus-valid-select-methods): Include nnlistserv.
+ * gnus-agent.el (gnus-agent-fetch-group-1): Update dribble.
- * gnus.el: Autoloaded things to make byte-comp silent.
+1998-10-27 Shenghuo ZHU <zsh@cs.rochester.edu>
-1998-02-23 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
+ * mm-view.el (mm-inline-text): Postion of html portion.
- * gnus.el: Quassia Gnus v0.32 is released.
+1998-10-29 Lars Magne Ingebrigtsen <larsi@gnus.org>
-1998-02-23 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+ * nntp.el (nntp-list-active-group): Waited for short strings.
+ (nntp-send-mode-reader): Ditto.
+ (nntp-open-connection): Ditto.
- * gnus-cite.el (gnus-article-hide-citation-maybe): Wrong
- interactive specs.
- (gnus-cite-toggle): Maybe parse.
+ * gnus-int.el (gnus-request-group-articles): New function.
-1998-02-23 Rui-Tao Dong ~{6-HpLN~} <rdong@internetmci.com>
+ * nntp.el (nntp-request-listgroup): New function.
+ (nntp-request-group-articles): Renamed.
- * nnweb.el (nnweb-type-definition): Fixed.
+1998-10-27 Karl Kleinpaste <karl@jprc.com>
-1998-02-22 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+ * nnheader.el (nnheader-parse-nov): Supply extra.
- * gnus-agent.el (gnus-agent-group-path): Translate right chars.
- (gnus-agent-toggle-plugged): Allow proper closing.
+1998-10-26 Lars Magne Ingebrigtsen <larsi@gnus.org>
- * gnus-srvr.el (gnus-browse-read-group): Allow entering
- non-ephemeral groups.
+ * gnus-art.el (gnus-button-push): Don't go to
+ gnus-article-buffer.
-1998-02-22 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
+ * mm-view.el (mm-inline-image): Add a newline.
- * gnus.el: Quassia Gnus v0.31 is released.
+ * gnus-start.el (gnus-check-first-time-used): Check more.
-1998-02-22 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+1998-10-26 Francois Felix Ingrand <felix@laas.fr>
- * gnus-sum.el (gnus-summary-highlight): Give undownloaded marks a
- better face.
+ * gnus-start.el (gnus-check-first-time-used): Check current.
- * gnus-score.el (gnus-score-set): Take optional "warn".
- (gnus-summary-score-entry): Use it.
+1998-10-26 Lars Magne Ingebrigtsen <larsi@gnus.org>
- * gnus.el: Removed spurious * in defcustoms.
+ * mm-util.el (mm-find-charset-region): New function.
- * gnus-score.el (gnus-score-load-file): Reverse logic.
+ * ietf-drums.el (ietf-drums-narrow-to-header): Work when no header.
- * gnus-cite.el (gnus-article-hide-citation): Use markers to make
- things work when wrapping.
+ * gnus-art.el (gnus-mime-button-menu): Fix.
- * gnus-sum.el (gnus-summary-exit): Stop prefetch.
+1998-10-26 Michael Welsh Duggan <md5i@cs.cmu.edu>
-1998-02-21 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+ * gnus-art.el (gnus-mime-button-menu): New definition.
- * gnus-sum.el (gnus-get-newsgroup-headers): Buggy regexp.
+1998-10-26 Lars Magne Ingebrigtsen <larsi@gnus.org>
-1998-02-21 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
+ * gnus-art.el (article-decode-charset): Downcase charset.
+ (article-decode-charset): Pass on type.
+ (article-decode-charset): Check nil charsets.
+ (article-remove-cr): Translate CR to LF.
+ (gnus-ignored-mime-types): Default to nil.
- * gnus.el: Quassia Gnus v0.30 is released.
+ * nnheader.el (nnheader-insert-nov): Work when not Xref.
-1998-02-21 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+ * gnus-sum.el (gnus-ignored-from-addresses): Default to
+ user-mail-address.
+ (gnus-nov-parse-extra): Didn't return right thing.
- * gnus-sum.el (gnus-summary-mark-article): Don't do anything if
- the mark doesn't change.
+1998-10-26 Shenghuo ZHU <zsh@cs.rochester.edu>
- * gnus-art.el (gnus-article-prepare): Don't enter article into
- cache.
+ * mm-decode.el (mm-copy-Yo-buffer): Make it works when no header.
- * gnus-sum.el (gnus-summary-reparent-thread): Don't mark as read.
- (gnus-summary-mark-article): Don't do cache things here.
+1998-10-25 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
- * gnus-util.el (gnus-parse-netrc): Skip past macdefs.
+ * gnus.el: Pterodactyl Gnus v0.40 is released.
-1998-02-20 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+1998-10-25 Lars Magne Ingebrigtsen <larsi@gnus.org>
- * gnus-srvr.el (gnus-browse-unsubscribe-group): Wouldn't allow
- unsubscription.
+ * gnus-sum.el (gnus-summary-mark-forward): Show thread.
- * gnus-sum.el (gnus-summary-insert-subject): Allow inserting
- articles outside limits.
+ * gnus-start.el (gnus-check-first-time-used): Ignore dribble.
- * gnus-start.el (gnus-dribble-enter): Update mode line.
+ * gnus-agent.el (gnus-agent-fetch-group-1): Bind name.
- * gnus-srvr.el (gnus-browse-unsubscribe-group): Allow
- unsubscription.
+ * nnml.el (nnml-possibly-create-directory): Check before making.
- * gnus-picon.el (gnus-article-display-picons): Check that the
- extents are live first.
+1998-10-25 Kai Grossjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE>
-1998-02-19 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+ * nnheader.el (nnheader-insert-nov): Don't infloop.
- * gnus-group.el (gnus-useful-groups): Include gnus-bug.
+1998-10-25 Lars Magne Ingebrigtsen <larsi@gnus.org>
-1998-02-19 Jens-Ulrik Holger Petersen <petersen@kurims.kyoto-u.ac.jp>
+ * gnus-sum.el (gnus-set-mode-line): Check that the spec has been
+ set up.
- * gnus.el (gnus-group-history): Defined twice.
+1998-10-25 Joerg Lenneis <lenneis@statrix2.wu-wien.ac.at>
-1998-02-19 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+ * nneething.el (nneething-file-name): New definition.
- * gnus-sum.el (gnus-get-newsgroup-headers): Just use the header
+1998-10-25 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * gnus-art.el (gnus-treatment-function-alist): Fix.
+ (gnus-summary-save-in-rmail): Use gnus-output-to-rmail.
+
+ * nndoc.el (nndoc-dissect-mime-parts-sub): Recognize first part.
+
+1998-10-25 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
+
+ * gnus.el: Pterodactyl Gnus v0.39 is released.
+
+1998-10-25 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * gnus-art.el (gnus-ignored-mime-types): New variable.
+ (gnus-mime-display-single): Use it.
+ (gnus-treatment-function-alist): New variable.
+
+ * gnus.el (gnus-mime): New group.
+
+ * gnus-art.el (gnus-mime-display-alternative): Don't destroy
+ things for other parts.
+ (gnus-mime-display-alternative): Place point.
+
+ * gnus.el: autoload gnus-uu-post-news.
+
+ * mailcap.el (mailcap-mailcap-entry-passes-test): Also check
+ needsterm/DISPLAY.
+
+ * mm-decode.el (mm-display-part): Default to inline text/.*
+ parts.
+
+ * mm-bodies.el (mm-decode-content-transfer-encoding): Default to
+ 8bit.
+
+ * gnus-art.el (gnus-mime-copy-part): Use normal-mode.
+ (gnus-mime-display-single): Inline all text parts.
+ (gnus-article-narrow-to-signature): Removed mime:: stubs.
+
+1998-10-24 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * nnml.el (nnml-possibly-create-directory): Rewrite.
+ (nnml-request-create-group): Change to right server.
+
+ * gnus-sum.el (gnus-set-mode-line): Use truncate-string-to-width.
+
+ * gnus.el: rmail-output-to-rmail-file autoload.
+
+ * gnus-util.el (gnus-output-to-rmail): Didn't work if not in
+ Gnus.
+
+ * nnheader.el (nnheader-parse-head): Checked wrong variable.
+
+ * gnus-sum.el (gnus-summary-update-mark): Ignore nil'd marks.
+
+1998-10-21 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * gnus-art.el (gnus-mime-display-mixed): Multipart in
+ mixed part.
+
+1998-10-21 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * gnus-sum.el (gnus-summary-exit): Use mm-destroy-parts.
+
+ * gnus-sum.el (gnus-summary-exit-no-update): Ditto.
+
+1998-10-20 Shenghuo ZHU <zsh@cs.rochester.edu>
+
+ * mm-uu.el (mm-uu-dissect): Create pseudo multipart head.
+
+1998-10-24 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * gnus-sum.el (gnus-valid-move-group-p): Make sure group has a
value.
- (gnus-summary-exit): Set global vars.
-1998-02-17 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+ * gnus-art.el (gnus-article-hidden-text-p): Return nil when not
+ hidden.
+
+ * gnus-spec.el (gnus-update-format-specifications): Use the
+ article mode line spec.
- * gnus-sum.el (gnus-summary-stop-page-breaking): Mark page as no
- longer broken.
- (gnus-summary-exit): Purge the real name.
+ * gnus-art.el (gnus-insert-mime-button): Put right type.
+ (gnus-insert-prev-page-button): Ditto.
+ (gnus-insert-next-page-button): Dutti.
-1998-02-17 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
+ * pop3.el: New version installed.
- * gnus.el: Quassia Gnus v0.29 is released.
+1998-10-24 Shenghuo ZHU <zsh@cs.rochester.edu>
-1998-02-17 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+ * mm-uu.el (mm-uu-dissect): Delete the begining spurious newline
+ and display last part.
- * nnmail.el (nnmail-purge-split-history): List of alists, not
- alist.
+1998-10-24 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
-1998-02-16 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
+ * gnus.el: Pterodactyl Gnus v0.38 is released.
- * gnus.el: Quassia Gnus v0.28 is released.
+1998-10-24 Lars Magne Ingebrigtsen <larsi@gnus.org>
-1998-02-16 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+ * gnus-art.el (article-mime-decode-quoted-printable-buffer):
+ Removed.
+ (article-de-quoted-unreadable): Narrow to default.
- * message.el (message-dont-send): Make sure the article really is
- saved.
+ * qp.el (quoted-printable-encode-region): Encode before QP-ing.
- * nnmail.el (nnmail-purge-split-history): Alist; not a list of
- alists.
+ * gnus-art.el (article-decode-charset): Decode even when broken
+ MIME.
-1998-02-16 Hrvoje Niksic <hniksic@srce.hr>
+ * gnus-sum.el (gnus-summary-from-or-to-or-newsgroups): Return
+ name.
- * message.el (message-kill-to-signature): Do the right thing when
- there is no signature.
+ * gnus-msg.el (gnus-copy-article-buffer): Delete headers.
-1998-02-16 Hrvoje Niksic <hniksic@srce.hr>
+ * gnus-cache.el (gnus-cache-possibly-enter-article): Use
+ nnheader.
- * message.el (message-elide-elipsis): Add type and group.
- (message-elide-region): Docfix.
+ * nnmail.el (nnmail-extra-headers): New variable.
-1998-02-16 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+ * nnheader.el (nnheader-insert-nov): Insert extra.
- * gnus-util.el (gnus-run-hooks): Use unwind-protect instead of
- save-excursion.
+ * gnus.el (gnus-summary-line-format): Doc fix.
-1998-02-16 Per Abrahamsen <abraham@dina.kvl.dk>
+ * gnus-sum.el (gnus-get-newsgroup-headers): Parse extra.
+ (gnus-nov-parse-line): Ditto.
+ (gnus-nov-parse-extra): New macro.
+ (gnus-header): New function.
+ (gnus-update-summary-mark-positions): Change.
+ (gnus-ignored-from-addresses): New variable.
+ (gnus-summary-insert-from-or-to): New function.
- * nntp.el (nntp-authinforc-file): Customized.
+ * gnus.el (gnus-extra-headers): New variable.
-1998-02-16 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+ * nnheader.el (make-mail-header): Expand.
+ (mail-header-extra): New macro.
+ (mail-header-set-extra): Ditto.
+ (make-full-mail-header): Expand.
- * gnus-nocem.el (gnus-nocem-unwanted-article-p): Don't look if the
- hashtable doesn't exist.
+1998-10-24 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
- * gnus-start.el (gnus-ask-server-for-new-groups): Make sure the
- killed groups hashtable exists.
+ * gnus.el: Pterodactyl Gnus v0.37 is released.
-1998-02-15 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+1998-10-24 Lars Magne Ingebrigtsen <larsi@gnus.org>
- * nntp.el (nntp-authinforc-file): Changed name and default.
- (nntp-send-authinfo): Use it.
+ * mm-bodies.el (mm-decode-body): Check for multibyticity.
-1998-02-15 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
+ * mm-util.el (mm-enable-multibyte): Don't always switch multibyte
+ on.
- * gnus.el: Quassia Gnus v0.27 is released.
+1998-10-22 Didier Verna <verna@inf.enst.fr>
-1998-02-15 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+ * gnus-spec.el (gnus-balloon-face-function): new function
+ (gnus-parse-format): understand the %< %> specifiers
+ (gnus-parse-complex-format): ditto.
- * gnus.el (gnus-ephemeral-servers): New variable.
- * gnus-srvr.el (gnus-server-prepare): Use it.
- * gnus-group.el (gnus-group-read-ephemeral-group): Ditto.
+1998-10-24 Lars Magne Ingebrigtsen <larsi@gnus.org>
-1998-02-15 Kurt Swanson <kurt@dna.lth.se>
+ * gnus.el: Changed following-char to char-after throughout.
- * gnus-art.el (gnus-article-read-summary-keys): Go to top on
- some.
+1998-10-22 Lars Magne Ingebrigtsen <larsi@gnus.org>
-1998-02-15 SeokChan LEE <chan@xfer.kren.nm.kr>
+ * mm-decode.el (mm-display-external): Protect more and message.
- * message.el (message-ignored-supersedes-headers): Fix.
+1998-10-21 Shenghuo ZHU <zsh@cs.rochester.edu>
-1998-02-15 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+ * gnus-art.el (gnus-mime-display-mixed): Multipart in
+ mixed part.
- * gnus-salt.el (gnus-tree-close): Start killing buffer again.
+1998-10-21 Shenghuo ZHU <zsh@cs.rochester.edu>
- * gnus-sum.el (gnus-mark-article-as-read): Return t.
+ * gnus-sum.el (gnus-summary-exit): Use mm-destroy-parts.
- * gnus-art.el (gnus-article-edit-mode): Run text mode hook.
+ * gnus-sum.el (gnus-summary-exit-no-update): Ditto.
-1998-02-15 Roland Roberts <rroberts@muller.com>
+1998-10-20 Shenghuo ZHU <zsh@cs.rochester.edu>
- * gnus-sum.el (gnus-nov-parse-line): Would bug out on bogus
- References headers.
+ * mm-uu.el (mm-uu-dissect): Create pseudo multipart head.
-1998-02-15 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+1998-10-21 Hrvoje Niksic <hniksic@srce.hr>
- * gnus-art.el (gnus-article-current-summary): New variable.
- (gnus-article-mode): Make it local.
+ * mailcap.el (mailcap-save-binary-file): Use unwind-protect.
- * gnus-score.el (gnus-summary-increase-score): Find the right
- global score file.
+ * mm-decode.el (mm-display-external): Set undisplayer to mm
+ buffer, not the current buffer; use unwind-protect.
- * gnus-start.el (gnus-setup-news): Don't find new newsgroups
- unless plugged.
+1998-10-21 Lars Magne Ingebrigtsen <larsi@gnus.org>
- * message.el (message-mode): Set font-lock things before running
- mode hook.
+ * gnus-sum.el (gnus-summary-exit): Destroy parts.
+ (gnus-summary-exit-no-update): Ditto.
- * gnus-agent.el (gnus-agent-group-path): Respect long file names.
+1998-10-21 Lars Magne Ingebrigtsen <larsi@gnus.org>
-1998-02-14 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+ * mm-decode.el (mm-inline-media-tests): Look for w3.
- * gnus-sum.el (gnus-summary-goto-last-article): Force jumping to
- articles outside limit.
+ * mailcap.el (mailcap-mime-data): Inline html.
- * gnus-agent.el (gnus-agent-toggle-plugged): un/plug before hook.
+1998-10-20 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
-1998-02-14 Kim-Minh Kaplan <KimMinh.Kaplan@utopia.eunet.fr>
+ * gnus.el: Pterodactyl Gnus v0.36 is released.
- * gnus-xmas.el (gnus-xmas-article-display-xface): t t would make
- faces disappear.
+1998-10-20 Lars Magne Ingebrigtsen <larsi@gnus.org>
-1998-02-14 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+ * gnus-art.el (article-translate-strings):
+ (gnus-article-dumbquotes-map): Don't dot.
- * nntp.el (nntp-netrc-file): New variable.
+ * pop3.el (pop3-open-server): Set point right.
-1998-02-14 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
+ * mm-decode.el (mm-dissect-multipart): Dissect hierarchically.
+ (mm-dissect-buffer): Ditto.
+ (mm-destroy-part): Ignore non-handles.
+ (mm-remove-part): Ditto.
+ (mm-destroy-parts): New function.
+ (mm-remove-parts): Ditto.
- * gnus.el: Quassia Gnus v0.26 is released.
+ * gnus-art.el (gnus-mm-display-part): Don't move point.
-1998-02-14 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+1998-10-20 Shenghuo ZHU <zsh@cs.rochester.edu>
- * gnus-agent.el (gnus-agent-directory): Translate file chars.
+ * mm-uu.el : New file.
- * gnus-sum.el (gnus-summary-print-article): Don't display all
- headers.
- (gnus-summary-edit-parameters): New command and keystroke.
+ * gnus-art.el (gnus-display-mime): Dissect uu stuffs.
- * gnus-group.el (gnus-group-rename-group): Mark dribble.
+ * mm-bodies.el (mm-decode-content-transfer-encoding): Encoding as
+ a function.
-1998-02-14 Fred Oberhauser <foberhauser@psipenta.de>
+1998-10-20 Lars Magne Ingebrigtsen <larsi@gnus.org>
- * nnmail.el (nnmail-process-babyl-mail-format): Fix point
- movement.
+ * mm-decode.el (mm-display-external): Check before selecting.
-1998-02-14 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+1998-09-26 Shenghuo ZHU <zsh@cs.rochester.edu>
- * gnus.el (gnus-group-get-parameter): Dix fix.
+ * gnus-sum.el (gnus-multi-decode-encoded-word-string): Rewrite.
-1998-02-14 Kim-Minh Kaplan <KimMinh.Kaplan@utopia.eunet.fr>
+ * gnus-sum.el (gnus-decode-encoded-word-methods): New variable.
- * gnus-picon.el: Updated documentation.
+ * gnus-sum.el (gnus-decode-encoded-word-methods-cache): New
+ variable.
-1998-02-14 Joev Dubach <dubach@dcepea.harvard.edu>
+ * gnus-sum.el (gnus-encoded-word-method-alist): Deleted.
- * nntp.el (nntp-send-authinfo-from-file): Doc fix.
+ * gnus-art.el (gnus-decode-header-methods): New variable.
-1998-01-11 Ken Raeburn <raeburn@cygnus.com>
+ * gnus-art.el (gnus-decode-header-methods-cache): New variable.
- * nnagent.el (nnagent-request-update-info): New no-op fn.
+ * gnus-art.el (gnus-multi-decode-header): New function.
-1998-02-14 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+1998-10-20 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
- * gnus-srvr.el (gnus-browse-unsubscribe-group): Wouldn't allow
- subscription of visited groups.
+ * gnus.el: Pterodactyl Gnus v0.35 is released.
- * gnus-util.el (gnus-run-hooks): New function.
- Use it everywhere.
+1998-10-20 Lars Magne Ingebrigtsen <larsi@gnus.org>
- * nntp.el (nntp-authinfo-password): New variable.
- (nntp-send-authinfo): Cache authinfo password.
+ * uudecode.el (uudecode-decode-region-external): Insert
+ literally.
- * gnus-sum.el (gnus-summary-mark-article-as-unread): Don't do
- anything if the mark doesn't change.
+ * mm-bodies.el (mm-decode-body): Optional encoding.
-1998-01-17 Simon Josefsson <jas@pdc.kth.se>
+1998-10-20 Lars Magne Ingebrigtsen <larsi@gnus.org>
- * gnus-sum.el (gnus-summary-work-articles): change buffer
- before looking at marked articles
- (gnus-summary-work-articles): better check of marked articles
+ * gnus-ems.el (gnus-mouse-3): New variable.
-1998-02-14 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+ * binhex.el (binhex-decode-region-external): Don't use -internally.
- * nntp.el (nntp-send-authinfo): Use new .netrc functionality.
+1998-10-16 Simon Josefsson <jas@pdc.kth.se>
- * gnus-util.el (gnus-netrc-syntax-table): New variable.
- (gnus-parse-netrc): New function.
- (gnus-netrc-machine): Ditto.
- (gnus-netrc-get): Ditto.
+ * mailcap.el (mailcap-parse-mailcaps): Only open regular
+ files.
- * gnus-draft.el (gnus-draft-make-menu-bar): Added deletion.
+1998-09-27 Simon Josefsson <jas@pdc.kth.se>
- * gnus.el (gnus-expert-user): Dix fox.
+ * gnus-group.el (gnus-add-marked-articles): Request backend update
+ of flags.
- * nnmail.el (nnmail-article-group): Remove duplicates from split.
+1998-09-26 Simon Josefsson <jas@pdc.kth.se>
- * message.el (message-check-news-header-syntax): Check more on
- Message-ID.
+ * gnus-sum.el (gnus-update-read-articles):
+ (gnus-update-marks): Request backend update of mark.
- * nnmh.el: Don't call nnmail-activate.
+1998-09-26 Simon Josefsson <jas@pdc.kth.se>
- * gnus.el: User-variabelize all custom vars.
+ * gnus.texi (Optional Backend Functions): New item,
+ nnchoke-request-set-mark.
-1998-02-13 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
+1998-09-26 Simon Josefsson <jas@pdc.kth.se>
- * gnus.el: Quassia Gnus v0.25 is released.
+ * gnus-range.el (gnus-remove-from-range): Don't add stuff in
+ list to range.
-1998-02-13 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+1998-10-20 Simon Josefsson <jas@pdc.kth.se>
- * nndoc.el (nndoc-type-alist): Allow blank lines to separate
- headers from bodies.
+ * gnus-sum.el (gnus-summary-exit-no-update): Don't expire.
- * gnus-art.el (gnus-article-edit): Restore Date header.
+1998-10-14 SL Baur <steve@altair.xemacs.org>
- * gnus-async.el (gnus-asynch-obarray): New variable.
- (gnus-async-prefetched-article-entry): Use it.
- (gnus-async-set-buffer): Use it.
+ * gnus-sum.el: Move gnus-save-hidden-threads above where it is
+ first used.
- * nnmh.el (nnmh-active-number): Create parent dirs.
+1998-10-10 SL Baur <steve@altair.xemacs.org>
- * nntp.el (nntp-last-command): New variable.
- (nntp-handle-authinfo): New function.
+ * mm-view.el: Require mm-decode for macros.
- * gnus-sum.el (gnus-summary-exit): Call purging function.
+ * mm-decode.el (mm-handle-type): Move macro declarations above the
+ place where they are used.
-1998-02-13 Fran\e,Ag\e(Bois Pinard <pinard@iro.umontreal.ca>
+1998-10-18 Kurt Swanson <ksw@dna.lth.se>
- * nnmail.el (nnmail-get-new-mail): Don't clear split-history.
- (nnmail-purge-split-history): New function.
+ * gnus-msg.el (gnus-summary-mail-forward): Erase old forward
+ buffer.
-1998-02-13 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+1998-10-20 Katsumi Yamaoka <yamaoka@ga.sony.co.jp>
- * nntp.el (nntp-telnet-shell-prompt): Renamed.
+ * nnagent.el (nnagent-open-server): Error message.
-1998-02-13 Sam Falkner <samf@channelpoint.com>
+1998-10-20 Joerg Lenneis <lenneis@statrix2.wu-wien.ac.at>
- * nntp.el (nntp-open-telnet-envuser): New variable.
+ * nnheader.el (nnheader-article-p): Recognize lower-case headers.
-1998-02-13 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+1998-10-19 Hrvoje Niksic <hniksic@srce.hr>
- * message.el (message-send-mail-function): Added smtpmail-send-it.
+ * score-mode.el (gnus-score-mode-map): Ditto.
-1998-02-11 Dave Love <d.love@dl.ac.uk>
+ * message.el (message-mode-map): Ditto.
- * gnus-art.el (gnus-button-url): Don't lose in Emacs 20 with
- browse-url-browser-function an alist, not a function.
- (gnus-button-embedded-url): Likewise.
+ * gnus-uu.el (gnus-uu-post-news): Ditto.
-1998-02-13 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+ * gnus-kill.el (gnus-kill-file-mode-map): Ditto.
- * gnus-cite.el (gnus-cite-localize): New function.
- (gnus-cite-close): Renamed.
- (gnus-cite-parse-maybe): Use it.
+ * gnus-eform.el (gnus-edit-form-mode-map): Ditto.
- * gnus-sum.el (gnus-summary-move-article): Move back to summary
- buffer.
+ * gnus-art.el (gnus-article-edit-mode-map): Use
+ `set-keymap-parent' rather than `copy-keymap'.
- * nnfolder.el (nnfolder-request-accept-article): Save excursion.
- (nnfolder-request-move-article): Ditto.
+1998-10-18 Hrvoje Niksic <hniksic@srce.hr>
- * nntp.el (nntp-find-connection): Don't message.
+ * gnus-art.el (gnus-mime-button-commands): New variable.
+ (gnus-mime-button-map): Initialize it from
+ `gnus-mime-button-commands'.
+ (gnus-mime-button-menu): New function.
+ (gnus-insert-mime-button): Use `gnus-mime-button-map'.
-1998-02-13 MORIOKA Tomohiko <steve@xemacs.org>
+1998-10-11 Hrvoje Niksic <hniksic@srce.hr>
- * message.el (message-send-mail-with-qmail): Fix.
+ * message.el (message-insert-to): Make `nobody' and `poster'
+ synonymous to `never' and `always' in Mail-Copies-To.
+ (message-reply): Ditto.
+ (message-followup): Ditto.
-1998-02-13 Per Abrahamsen <abraham@dina.kvl.dk>
+1998-10-20 Lars Magne Ingebrigtsen <larsi@gnus.org>
- * gnus-draft.el (gnus-draft-make-menu-bar): Added missing commands.
+ * mailcap.el (mailcap-mime-data): Save sound.
-1998-01-06 Per Abrahamsen <abraham@dina.kvl.dk>
+1998-09-24 Hrvoje Niksic <hniksic@srce.hr>
- * gnus/gnus-cus.el (gnus-score-parameters): Make `files' and
- `exclude-files' widgets inline.
+ * message.el (message-ignored-supersedes-headers): Include
+ `NNTP-Posting-Date'.
-1998-02-13 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+1998-10-19 Jonas Steverud <d4jonas@dtek.chalmers.se>
- * gnus-sum.el (gnus-article-mark): Dox dox.
+ * gnus-art.el (gnus-article-dumbquotes-table): New variable.
-1998-02-11 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
+1998-10-19 Lars Magne Ingebrigtsen <larsi@gnus.org>
- * gnus.el: Quassia Gnus v0.24 is released.
+ * mm-bodies.el (mm-decode-content-transfer-encoding): Use
+ uudecode.
-1998-02-10 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+1998-10-18 Lars Magne Ingebrigtsen <larsi@gnus.org>
- * gnus-agent.el (gnus-agent-fetch-session): Reversed reversal.
+ * mm-decode.el (mm-display-external): Don't switch on save.
- * gnus-topic.el (gnus-topic-rename): Check whether the new name
- exists.
+1998-10-18 Andy Piper <andyp@parallax.co.uk>
-1998-02-10 dave edmondson <dme@sco.com>
+ * nnmail.el (nnmail-movemail-args): New variable.
- * message.el (message-font-lock-keywords): Allow : as a citation
- ending.
+1998-10-18 Lars Magne Ingebrigtsen <larsi@gnus.org>
-1998-02-10 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+ * gnus-art.el (article-translate-strings):
- * message.el (message-send): Removed dead code.
+1998-10-18 Lars Magne Ingebrigtsen <larsi@gnus.org>
-1998-02-09 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+ * gnus-art.el (gnus-article-view-part): Use it.
+ (gnus-mm-display-part): New function.
+ (article-de-quoted-unreadable): Yse mm-default-coding-system.
- * message.el (message-fill-header): Fill to column 990.
+ * mm-decode.el (mm-handle-displayed-p): New function.
- * gnus-score.el (gnus-score-load-file): Exclude all excluded
- files.
+ * gnus-art.el (gnus-mime-copy-part): Create better names.
+ (gnus-mime-button-line-format): Include dots spec.
-1998-02-09 jari aalto <jari.aalto@poboxes.com>
+1998-10-15 Matt Pharr <mmp@graphics.stanford.edu>
- * gnus-art.el (gnus-article-time-format): Extended variable.
+ * gnus-msg.el (gnus-summary-mail-forward): Erase contents of old
+ forward buffer first.
-1998-02-09 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+1998-10-17 Lars Magne Ingebrigtsen <larsi@gnus.org>
- * gnus-art.el (article-make-date-line): Make 8601 Dates.
- (article-date-iso8601): New command and keystroke.
+ * gnus-util.el (gnus-set-window-start): New function.
-1998-02-08 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+ * message.el (message-send): Don't check changed.
- * message.el (message-ignored-mail-headers): Remove Xrefs.
+1998-10-12 Lars Magne Ingebrigtsen <larsi@gnus.org>
- * nndoc.el (nndoc-open-document-hook): New variable.
+ * gnus-art.el (gnus-article-setup-buffer): Set params.
-1998-02-08 Istvan Marko <istvan@cmdmail.amd.com>
+ * mm-decode.el (mm-user-display-methods): Inline
+ "message/delivery-status".
- * gnus-agent.el (gnus-unplugged): Typo fix.
+1998-10-11 Lars Magne Ingebrigtsen <larsi@gnus.org>
-1998-02-08 Kurt Swanson <kurt@dna.lth.se>
+ * message.el (message-auto-save-directory): Rename.
+ (message-mode): Dof fix.
- * gnus-score.el (gnus-score-thread-simplify): New variable.
+ * gnus-art.el (gnus-summary-save-in-pipe): Default to "cat".
+ (gnus-summary-save-in-pipe): No, check gnus-last-shell-command.
-1998-02-08 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+ * nndoc.el (nndoc-mime-parts-type-p): Be a bit more forgiving.
- * gnus-uu.el (gnus-uu-post-encode-mime): Call mmencode with
- correct params.
+ * message.el (message-make-date): Avoid locale.
-1998-02-08 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
+ * gnus-art.el (gnus-article-edit-done): Allow update before doing
+ cache.
- * gnus.el: Quassia Gnus v0.23 is released.
+ * mm-decode.el (mm-display-inline): Goto point-min.
-1998-02-08 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+ * gnus-art.el (gnus-article-prepare-display): Not read-only.
- * gnus-group.el (gnus-update-group-mark-positions): Bind `topic'.
+ * mm-decode.el (mm-display-external): Reverse before sorting.
- * message.el (message-expand-group): Added doc string.
+ * gnus-draft.el (gnus-draft-send): Allow mail.
- * nntp.el (nntp-wait-for): Don't change limit until after
- accepting output.
+1999-11-30 -SL Baur <steve@altair.xemacs.org>
-1998-02-08 Richard Hoskins <rmh@interlaced.net>
+ * message.el (message-check): Move message-check macro above where
+ it is first used.
- * message.el (message-kill-to-signature): Don't kill the
- delimiter.
+ * gnus-art.el (article-hide-pgp): Hide the PGP 5/GNUPG Hash: line.
-1998-02-08 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+1998-10-11 Lloyd Zusman <ljz@asfast.com>
- * gnus-sum.el (gnus-summary-prepared-hook): New hook.
- (gnus-summary-read-group-1): Use it.
+ * gnus-sum.el (gnus-summary-make-menu-bar): Fix.
- * message.el (message-cite-original-without-signature): New
- function.
- (message-cite-function): Added to custom.
+1998-10-11 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
-1998-01-13 Per Abrahamsen <abraham@dina.kvl.dk>
+ * gnus.el: Pterodactyl Gnus v0.34 is released.
- * gnus/message.el (message-cite-original): Don't quote signature.
+1998-10-11 Lars Magne Ingebrigtsen <larsi@gnus.org>
-1998-02-08 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+ * mm-decode.el (mm-inline-media-tests): delivery-status.
- * gnus-group.el (gnus-group-unsubscribe-group): Protest against
- empty group names.
+ * mm-view.el (mm-inline-text): Provide default.
-1998-02-02 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+1998-10-11 Lloyd Zusman <ljz@asfast.com>
- * gnus-draft.el (gnus-draft-setup): Associate with drafts group.
+ * mailcap.el (mailcap-possible-viewers): Fix nils.
- * message.el (message-header-format-alist): Fill references.
+1998-10-11 Lars Magne Ingebrigtsen <larsi@gnus.org>
- * gnus-agent.el (gnus-category-read): Changed default.
- (gnus-agent-handle-level): New variable.
- (gnus-agent-fetch-session): Use it.
+ * gnus-art.el (gnus-article-edit-exit): Don't do updates.
+ (article-update-date-lapsed): Record the buffer.
+ (article-update-date-lapsed): Do all windows that display article
+ buffers.
- * gnus-art.el (article-strip-all-blank-lines): New command and
- keystroke.
+ * nnml.el (nnml-generate-nov-databases-1): Ditto.
-1998-02-01 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+ * gnus-score.el (gnus-score-score-files-1): Ignore dotted files.
- * gnus-msg.el (gnus-inews-reject-message): Removed function.
- (gnus-sent-message-ids-file): Removed.
- (gnus-sent-message-ids-length): Ditto.
+ * gnus-art.el (gnus-insert-mime-button): Mark buttons as
+ annoations.
- * gnus-xmas.el (gnus-xmas-summary-set-display-table): Ditto.
+ * gnus-msg.el (gnus-summary-mail-forward): Decode properly.
- * gnus-sum.el (gnus-simplify-subject-fuzzy): Respect
- `gnus-simplify-ignored-prefixes'.
- (gnus-summary-set-display-table): Keep TAB.
+1998-10-11 Lars Magne Ingebrigtsen <larsi@gnus.org>
-1998-01-15 <Use-Author-Address-Header@[127.1]>
+ * gnus-agent.el (gnus-category-add): Change default category to
+ 'false.
- * gnus-art.el (gnus-request-article-this-buffer): Put it into the
- backlog.
+ * nnvirtual.el (nnvirtual-update-read-and-marked): Don't nix out
+ scores.
-1998-01-12 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+ * gnus-draft.el (gnus-draft-send): Check server more.
- * gnus-sum.el (gnus-get-newsgroup-headers): Use the longest ID.
+ * gnus-art.el (gnus-article-view-part): New command and keystroke.
+ (gnus-article-goto-part): New function.
- * nnheader.el (nnheader-parse-head): Ditto.
+ * mm-view.el (mm-inline-text): Insert richtext properly.
-1998-01-08 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+ * gnus-art.el (gnus-insert-mime-button): Store handle in alist.
- * gnus-start.el (gnus-1): Use gnus-alive-p.
+1998-10-03 Lars Magne Ingebrigtsen <larsi@gnus.org>
-1998-01-06 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+ * parse-time.el (parse-time-rules): Accept dates far into the past
+ and the future, and parse single-digit numbers as years.
- * gnus-art.el (gnus-article-prepare): Bind coding systems.
+1998-10-02 Lars Magne Ingebrigtsen <larsi@gnus.org>
-1998-01-06 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
+ * mm-decode.el (mm-display-external): Chop off directories.
- * gnus.el: Quassia Gnus v0.22 is released.
+1998-10-01 Lars Magne Ingebrigtsen <larsi@gnus.org>
-1998-01-06 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+ * uudecode.el (uu-decode-region-external): Use
+ insert-file-contents-literally.
- * message.el (message-kill-to-signature): Don't use mark.
+ * gnus-cache.el (gnus-cache-generate-active): Translate _ to :.
-1998-01-06 Russ Allbery <rra@stanford.edu>
+1998-10-01 Shenghuo ZHU <zsh@cs.rochester.edu>
- * message.el (message-kill-to-signature): New command and keystroke.
+ * uudecode.el: New file.
-1998-01-06 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+ * mm-bodies.el (mm-decode-content-transfer-encoding): Do
+ x-uuencode.
- * gnus-sum.el (gnus-summary-print-article): New defaults for
- headers and stuff.
+1998-10-01 Lars Magne Ingebrigtsen <larsi@gnus.org>
- * gnus-agent.el (gnus-agent-batch): New command.
+ * gnus-art.el (gnus-mime-display-alternative): Set faces.
- * nnoo.el (nnoo-execute): Copy vars from parent into child.
- (nnoo-parent-function): Ditto.
+ * message.el (message-fetch-field): Unfold properly.
- * gnus-draft.el (gnus-draft-setup): Removed message.
+ * mm-bodies.el (mm-decode-content-transfer-encoding): Replace CRLF
+ in text/plain.
- * gnus-start.el (gnus-read-descriptions-file): Naked muleism.
+1998-09-30 Lars Magne Ingebrigtsen <larsi@gnus.org>
-1998-01-05 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+ * gnus-sum.el (gnus-summary-first-unread-subject): New command.
+ (gnus-auto-select-first): Removed.
+ (gnus-auto-select-first): Extended.
+ (gnus-summary-read-group-1): Use new value.
- * nnml.el (nnml-generate-nov-databases-1): Fix lower bound on
- empty groups.
+1998-09-29 Lars Magne Ingebrigtsen <larsi@gnus.org>
-1998-01-04 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
+ * message.el (message-fix-before-sending): Space.
- * gnus.el: Quassia Gnus v0.21 is released.
+ * nnmail.el (nnmail-find-file): Don't erase.
-1998-01-04 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
+1998-10-01 Shenghuo ZHU <zsh@cs.rochester.edu>
- * gnus.el: Quassia Gnus v0.20 is released.
+ * gnus-agent.el (gnus-agent-fetch-headers): Do not decode headers.
-1997-12-10 Per Abrahamsen <abraham@dina.kvl.dk>
+1998-10-01 Shenghuo ZHU <zsh@cs.rochester.edu>
- * gnus/gnus-msg.el (gnus-inews-insert-mime-headers): Added
- documentation.
- (gnus-inews-insert-mime-headers): Made it work with Emacs MULE.
- (gnus-inews-insert-mime-headers): Added as option to
- `message-header-hook'.
+ * gnus-soup.el (gnus-soup-add-article): Do not decode headers.
-1997-12-22 Per Abrahamsen <abraham@dina.kvl.dk>
+1998-10-01 Shenghuo ZHU <zsh@cs.rochester.edu>
- * gnus/gnus-art.el (gnus-button-alist): Assume msg-id after "in
- message".
+ * gnus-soup.el (gnus-soup-pack-packet): Pack only if necesary.
-1997-12-22 Simon Josefsson <jas@faun.nada.kth.se>
+1998-09-26 Shenghuo ZHU <zsh@cs.rochester.edu>
- * nnmail.el (nnmail-get-new-mail): Make nnmail-tmp-directory
+ * mm-util.el (mm-with-unibyte-buffer): Make it work in XEmacs
+ 20.4.
-1997-12-28 Per Abrahamsen <abraham@dina.kvl.dk>
+1998-09-29 Lars Magne Ingebrigtsen <larsi@gnus.org>
- * gnus/gnus-group.el (gnus-group-fetch-faq): Convert `.' in group
- name to `/'.
+ * gnus-art.el (gnus-mime-view-all-parts): New command and
+ keystroke.
-1998-01-04 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+ * mm-decode.el (mm-display-external): Translate slashes.
- * nndraft.el (nndraft-request-associate-buffer): Open the damn
- server first. Sheesh.
+ * nnmail.el (nnmail-find-file): Restrict auto-mode-alist.
- * gnus-draft.el (gnus-draft-send): Bind message-send-hook to nil.
+ * nndraft.el (nndraft-retrieve-headers): Don't copy so much.
- * gnus-sum.el (gnus-summary-catchup): Don't nix out downloadable.
- (gnus-summary-highlight): Highlight down/un as unread.
+ * mm-decode.el (mm-quote-arg): Quote spaces.
+ (mm-display-external): Quote args.
-1998-01-04 Kim-Minh Kaplan <KimMinh.Kaplan@utopia.eunet.fr>
+1998-09-25 Lars Magne Ingebrigtsen <larsi@gnus.org>
- * gnus-start.el (gnus-strip-killed-list): Fix syntax.
+ * mm-decode.el (mm-inlinable-part-p): New function.
-1998-01-04 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+1998-09-26 Simon Josefsson <jas@pdc.kth.se>
- * nnsoup.el (nnsoup-store-reply): Bind mail-header-separator to
- "".
+ * mm-util.el (mm-disable-multibyte): New function.
- * gnus-xmas.el (gnus-xmas-agent-server-menu-add): New.
+1998-09-24 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
- * nnoo.el (nnoo-change-server): Get the right values.
+ * gnus.el: Pterodactyl Gnus v0.33 is released.
-1998-01-04 Aki Vehtari <Aki.Vehtari@hut.fi>
+1998-09-24 Lars Magne Ingebrigtsen <larsi@gnus.org>
- * gnus-art.el (gnus-signature-limit): Add default values for
- choices suggested by Per Abrahamsen <abraham@dina.kvl.dk>.
- (gnus-prompt-before-saving): Add :value t for sexp tag.
- (gnus-split-methods): Add default values for choices.
+ * gnus-art.el (gnus-insert-mime-button): Get buffer size.
- * gnus-score.el (gnus-home-score-file): Add non-nil default for
- function.
- (gnus-home-adapt-file): Ditto.
+ * mm-decode.el (mm-display-external): Don't switch for externals.
+ (mm-dissect-multipart): Don't include end-sep.
- * gnus-sum.el (gnus-move-split-methods): Add default values for
- choices.
+ * mm-util.el (mm-get-coding-system-list): New function.
+ (mm-coding-system-list): New variable.
- * nnmail.el (nnmail-list-identifiers): Add default values for
- choices suggested by Per Abrahamsen <abraham@dina.kvl.dk>.
+1998-09-24 ZHU Shenghuo <zsh@cs.rochester.edu>
-1998-01-04 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
+ * gnus-cus.el (gnus-group-parameters): Add charset as a parameter
- * gnus.el: Quassia Gnus v0.19 is released.
+1998-09-24 ZHU Shenghuo <zsh@cs.rochester.edu>
-1998-01-04 Felix Lee <flee@teleport.com>
+ * gnus-cus.el (gnus-group-customize): Use variable as cons not as
+ group
- * nntp.el (nntp-open-rlogin): Use a list of parameters.
+1998-09-24 ZHU Shenghuo <zsh@cs.rochester.edu>
-1998-01-04 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+ * mm-decode.el (mm-interactively-view-part): Typo.
- * gnus-agent.el (gnus-agent-fetch-groups): New command.
+1998-09-24 ZHU Shenghuo <zsh@cs.rochester.edu>
- * gnus-sum.el (gnus-summary-print-article): Changed order of
- parameters.
+ * mm-decode.el (mm-dissect-multipart): Display last part when the
+ article has no close-delimiter
-1998-01-04 Michael R. Cook <mcook@cognex.com>
+1998-09-24 ZHU Shenghuo <zsh@cs.rochester.edu>
- * gnus-sum.el (gnus-summary-print-article): Use process/prefix.
+ * mm-decode.el (mm-dissect-buffer): Display parts which have no
+ content-type.
-1998-01-04 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+1998-09-24 ZHU Shenghuo <zsh@cs.rochester.edu>
- * gnus-uu.el: Changed spurious defconsts to defvars.
+ * gnus-art.el (gnus-display-mime): Typo.
- * nnmail.el (nnmail-get-spool-files): Quote group name.
+1998-09-24 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
- * gnus-agent.el (gnus-agent-fetch-group-1): Fetch ticked articles.
- (gnus-agent-fetch-group-1): Never mind.
+ * gnus.el: Pterodactyl Gnus v0.32 is released.
-1997-12-20 Pete Ware <ware@cis.ohio-state.edu>
+1998-09-24 Lars Magne Ingebrigtsen <larsi@gnus.org>
- * message.el (message-rename-buffer): Check for nil dirs.
+ * gnus-kill.el (gnus-batch-score): Protect against errors.
-1997-12-19 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+ * gnus-art.el: Protect against broken headers.
- * nnml.el (nnml-request-create-group): Check for files.
+ * mm-decode.el (mm-display-external): Respect needsterm.
+ (mm-display-external): Create buffer for external commands.
-1997-12-19 Hrvoje Niksic <hniksic@srce.hr>
+1998-09-24 Lars Magne Ingebrigtsen <larsi@gnus.org>
- * message.el (message-mode): Fixed font-lock.
+ * mailcap.el (mailcap-mime-info): Return the proper viewer.
-1997-12-19 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+ * mm-decode.el (mm-display-external): Use file name.
- * gnus-cache.el (gnus-cache-read-active): Check for empty files.
+1998-09-22 Markus Rost <markus.rost@mathematik.uni-regensburg.de>
-1997-12-14 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+ * gnus-util.el (gnus-output-to-rmail): adjust to
+ `rmail-output-to-rmail-file'
- * gnus-uu.el (gnus-uu-save-article): Quote all lines beginning
- with a dash.
+1998-09-23 Lars Magne Ingebrigtsen <larsi@gnus.org>
-1997-12-10 SL Baur <steve@altair.xemacs.org>
+ * gnus-util.el (gnus-output-to-rmail): Reinstated function.
- * gnus-start.el (gnus-read-descriptions-file): Really bind and gag
- Mule.
+ * gnus-sum.el (gnus-select-newsgroup): Set global variables before
+ headers.
-1997-12-05 Danny Siu <dsiu@adobe.com>
+ * gnus-art.el (article-decode-charset): Fold case.
- * nndoc.el (nndoc-babyl-body-begin): quote the regexp for the
- string "*** EOOH ***" properly.
- (nndoc-babyl-head-begin): Same as above.
+1998-09-17 Simon Josefsson <jas@pdc.kth.se>
-1997-12-14 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+ * mailcap.el (mailcap-save-binary-file): Goto point-min.
- * gnus-uu.el (gnus-uu-pre-uudecode-hook): New hook.
+1998-09-23 Aaron M. Ucko <amu@mit.edu>
- * gnus-sum.el (gnus-summary-read-group-1): Set mode line after
- configuring.
+ * nnmail.el (nnmail-check-duplication): Enter into duplicate list
+ after being stored.
-1997-12-14 Wes Hardaker <wjhardaker@ucdavis.edu>
+1998-09-15 Kurt Swanson <ksw@dna.lth.se>
- * gnus-score.el (gnus-adaptive-word-minimum): New variable.
- (gnus-score-adaptive): Use it.
+ * gnus-salt.el (gnus-pick-setup-message): Return from whence ye
+ come.
-1997-12-14 Roland B. Roberts <roberts@panix.com>
+1998-09-23 Lars Magne Ingebrigtsen <larsi@gnus.org>
- * gnus-group.el: Fixed hardcoded levels.
+ * gnus-ems.el (gnus-widget-button-keymap): New variable.
-1997-12-06 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
+1998-09-20 ZHU Shenghuo <zsh@cs.rochester.edu>
- * gnus.el: Quassia Gnus v0.18 is released.
+ * gnus-art.el (gnus-mime-inline-part): remove part if necessary
-1997-12-06 Kim-Minh Kaplan <KimMinh.Kaplan@Utopia.EUnet.fr>
+1998-09-23 Matt Armstrong <matta@geoworks.com>
- * gnus-picon.el (gnus-picons-remove): Race condition.
+ * gnus-art.el (article-decode-charset): Narrow to the correct
+ region.
-1997-12-06 Christian von Roques <roques@scalar.pond.sub.org>
+ * mm-bodies.el: Fix autoload.
- * gnus-start.el (gnus-read-descriptions-file): Fix
- enable-multibyte-characters.
+1998-09-22 Lee Willis <lee@gbdirect.co.uk>
-1997-12-05 Dave Love <d.love@dl.ac.uk>
+ * gnus-art.el (gnus-mime-button-line-format): Doc fix.
- * gnus-nocem.el (gnus-nocem-message-wanted-p): Fix paren typpo.
- (gnus-nocem-issuers): Allow sexp alternative in :type for alists.
+1998-09-22 Lars Magne Ingebrigtsen <larsi@gnus.org>
-1997-12-05 Dave Love <d.love@dl.ac.uk>
+ * rfc2047.el (rfc2047-decode): Use rfc2047-default-charset.
- * gnus-art.el (gnus-visible-headers): Add X-sent:.
+1998-09-19 Lars Magne Ingebrigtsen <larsi@gnus.org>
-1997-12-06 Lars Balker Rasmussen <lbr@mjolner.dk>
+ * gnus-art.el (gnus-insert-mime-button): Specify keymap.
+ (gnus-article-add-button): Ditto.
- * gnus-art.el (article-make-date-line): Don't add extra newlines.
+ * gnus-sum.el (gnus-summary-insert-pseudos): Use mm.
-1997-11-27 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+ * gnus-art.el (gnus-article-prepare-display): Make article mode.
+ (gnus-article-prepare-display): Bind url-standalone-mode.
- * nnmail.el (nnmail-file-coding-system): Use `raw-text' in
- default.
+ * mm-decode.el (mm-remove-part): Also delete directory.
+ (mm-display-external): Create a private sub-dir.
- * nnheader.el (nnheader-file-coding-system): Use `raw-text' in
- default.
+ * mailcap.el (mailcap-binary-suffixes): New variable.
+ (mailcap-command-p): Use it.
-1997-12-06 Kim-Minh Kaplan <KimMinh.Kaplan@utopia.eunet.fr>
+1998-09-16 Lars Magne Ingebrigtsen <larsi@gnus.org>
- * nnml.el (nnml-parse-head): Out-of-bounds fix.
+ * nnmbox.el (nnmbox-request-group): Change server.
+ (nnmbox-possibly-change-newsgroup): Enable multibyte.
- * nndraft.el (nndraft-request-associate-buffer): Get proper file
- name.
+ * message.el (message-encode-message-body): Don't stomp MIME
+ headers.
-1997-12-06 Gary D. Foster <Gary.Foster@Corp.Sun.COM>
+ * gnus-sum.el (gnus-summary-edit-article-done): Don't encode
+ unless useful.
+ (gnus-summary-exit): Check for a live article buffer.
+ (gnus-summary-exit-no-update): Ditto.
- * gnus-group.el: Added backspace.
+ * gnus-int.el (gnus-request-replace-article): Accept no-encode
+ param.
-1997-11-27 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+ * gnus-sum.el (gnus-article-decoded-p): New variable.
- * gnus-agent.el (gnus-summary-set-agent-mark): Remove marks
- properly.
+ * mm-decode.el (mm-display-external): Use no-conv.
-1997-11-27 Christoph Wedler <wedler@fmi.uni-passau.de>
+ * rfc2047.el (rfc2047-q-encode-region): Bound properly.
+ (rfc2047-charset-encoding-alist): Use B encoding for koi8-r.
- * smiley.el (smiley-buffer): Provide `help-echo'.
+ * gnus-art.el (gnus-article-mode-map): Bind button2 to
+ mouse-click.
-1997-11-27 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+1998-09-15 Lars Magne Ingebrigtsen <larsi@gnus.org>
- * gnus-util.el (gnus-output-to-rmail): Always save buffer.
+ * gnus-agent.el (gnus-agent-expire): Protect against nil infos.
- * nntp.el (nntp-close-server): Don't sleep for me, Argentina.
- (nntp-request-close): You neither.
+1998-09-14 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
-1997-11-19 Per Abrahamsen <abraham@dina.kvl.dk>
+ * gnus.el: Pterodactyl Gnus v0.31 is released.
- * message.el (message-header-lines): New widget.
- (message-default-headers): Use it.
- (message-default-mail-headers): Use it.
- (message-default-news-headers): Use it.
+1998-09-14 Lars Magne Ingebrigtsen <larsi@gnus.org>
-1997-11-24 Andreas Jaeger <aj@arthur.rhein-neckar.de>
+ * gnus-sum.el (gnus-summary-exit): Destroy MIME.
- * gnus-start.el (gnus-read-descriptions-file): Add missing quote.
+ * mm-decode.el (mm-display-part): Accept no-default.
-1997-11-26 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+ * gnus-art.el (gnus-insert-mime-button): buffer-size doesn't take
+ a parameter.
- * nnweb.el (nnweb-type-definition): Rescued dejanewsold.
+ * gnus-sum.el (gnus-summary-insert-line): Don't exclude faces.
+ (gnus-summary-prepare-threads): Ditto.
- * gnus-mh.el (gnus-summary-save-in-folder): Reverted to old
- version.
+ * gnus.el (gnus-article-mode-map): Make sparse keymap.
- * gnus-sum.el (gnus-kill-or-deaden-summary): Save excursion.
+ * gnus-art.el (gnus-mime-button-line-format-alist): Allow a %d spec.
+ (gnus-mime-button-line-format): Doc fix.
+ (gnus-insert-mime-button): Use it.
+ (gnus-article-add-button): Use widget-convert-button.
- * gnus.el: Only require gnus-load in Emacsen 19.
+ * gnus.el ((featurep 'gnus-xmas)): Defalias gnus-decode-rfc1522 to
+ ignore.
- * gnus-start.el (gnus-setup-news): Always push archive server.
+ * mm-decode.el (mm-alternative-precedence): Ditto.
- * gnus-sum.el (gnus-read-header): Would bug out on sparse
- articles.
+1998-09-14 Conrad Sauerwald <conrad@stack.nl>
-1997-11-26 Kurt Swanson <kurt@dna.lth.se>
+ * mm-decode.el (mm-user-automatic-display): Use enriched.
- * gnus-ems.el (gnus-mule-cite-add-face): Work.
+1998-09-14 Paul Fisher <rao@gnu.org>
-1997-11-26 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
+ * mm-decode.el (mm-dissect-multipart): Have the part start on the
+ right place.
- * gnus.el: Quassia Gnus v0.17 is released.
+1998-09-14 Lars Magne Ingebrigtsen <larsi@gnus.org>
-1997-11-26 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+ * gnus-msg.el (gnus-inews-add-send-actions): Mark silently.
- * gnus-sum.el (gnus-summary-move-article): Don't work on canceled
- articles.
+ * gnus-art.el (article-update-date-lapsed): Only update header if
+ buffer is dispalyed in frame.
+ (gnus-article-prepare-display): New function.
+ (gnus-article-prepare): Use it.
- * gnus-start.el (gnus-subscribe-hierarchical-interactive): Use
- `read-char-exclusive'.
+1998-09-14 Lars Magne Ingebrigtsen <larsi@gnus.org>
- * gnus-sum.el (gnus-summary-mode): Localize
- gnus-summary-dummy-line-format.
+ * gnus-art.el (gnus-mime-inline-part): New command and keystroke.
- * nnml.el (nnml-open-nov): Check that the file exists before
- inserting it.
+ * mm-view.el (mm-insert-inline): New function.
- * gnus-art.el (article-date-ut): Insert a newline if needed.
+ * mm-decode.el (mm-pipe-part): Bugged.
- * gnus-score.el (gnus-score-edit-current-scores): Protect against
- nil score files.
+ * gnus-agent.el (gnus-agent-send-mail): Don't encode.
- * gnus-start.el (gnus-newsrc-parse-options): Be more correct --
- match only hierarchies.
- (gnus-gnus-to-quick-newsrc-format): Changed warning.
+ * mm-bodies.el (mm-encode-body): Move over the body.
-1997-11-26 Greg Klanderman <greg@alphatech.com>
+ * nnmbox.el (nnmbox-read-mbox): Enable multibyte.
- * messagexmas.el (message-xmas-maybe-fontify): New definition.
+ * rfc2047.el (rfc2047-q-encode-region): Would bug out.
-1997-11-26 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+1998-09-13 Francois Pinard <pinard@iro.umontreal.ca>
- * gnus-start.el (gnus-setup-news): Protect against nil
- gnus-message-archive-method.
+ * nndoc.el: Make nndoc-dissection-alist simpler for MIME, adjust all
+ related functions. Handle message/rfc822 parts. Display subject on
+ multipart summary lines. Display name on sub-parts when available.
-1997-11-26 Christoph Wedler <wedler@fmi.uni-passau.de>
+1998-09-14 Hallvard B. Furuseth <h.b.furuseth@usit.uio.no>
- * gnus-art.el (gnus-article-edit-done): Update headers "Lines:",
- "Content-Length:" and "X-Content-Length:" when present.
+ * mailcap.el (mailcap-command-p): New version.
-1997-11-26 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+1998-09-13 Mike McEwan <mike@lotusland.demon.co.uk>
- * nnmail.el (nnmail-process-unix-mail-format): Pop to the right
- buffer on error.
- (nnmail-process-mmdf-mail-format): Ditto.
+ * gnus-agent.el (gnus-agent-expire): Stop expiry barfing on killed
+ groups.
-1997-11-26 Joe Reiss <jreiss@sprynet.com>
+1998-09-13 Lars Magne Ingebrigtsen <larsi@gnus.org>
- * gnus-art.el (gnus-summary-save-in-rmail): Return the name of the
- file.
+ * message.el (message-make-date): Remove weekday name.
-1997-11-26 Alastair Burt <alastair.burt@dfki.de>
+ * mm-decode.el (mm-dissect-buffer): Protect against broken
+ headers.
- * smiley.el: Balloon help, etc.
+ * mailcap.el (mailcap-command-in-path-p): New function.
+ (mailcap-command-p): Renamed.
-1997-11-26 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+1998-09-13 Hallvard B. Furuseth <h.b.furuseth@usit.uio.no>
- * gnus-util.el (gnus-kill-all-overlays): Remove check for XEmacs.
+ * rfc2047.el (eval): Autoload.
-1997-09-30 Dave Love <d.love@dl.ac.uk>
+1998-09-13 Lars Magne Ingebrigtsen <larsi@gnus.org>
- * message.el: Don't require rmail.
+ * gnus-sum.el (gnus-decode-encoded-word-functions): New variable.
+ (gnus-multi-decode-encoded-word-string): New function.
+ (gnus-encoded-word-method-alist): New variable.
+ (gnus-decode-encoded-word-functions): Removed.
-1997-11-26 Kurt Swanson <kurt@dna.lth.se>
+1998-09-13 Shenghuo ZHU <zsh@cs.rochester.edu>
- * gnus-group.el (gnus-group-setup-buffer): set-buffer.
+ * gnus-int.el (gnus-request-replace-article): Replace
+ message-narrow-to-headers with message-narrow-to-head
-1997-11-26 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+1998-09-13 Lars Magne Ingebrigtsen <larsi@gnus.org>
- * gnus-score.el (gnus-score-load-file): Don't create empty score
- files when doing decays.
+ * drums.el (drums-quote-string): Reversed match.
-1997-11-26 Renaud Rioboo <rioboo@calfor.lip6.fr>
+ * message.el (message-make-date): Use weekday name.
- * nnmail.el (nnmail-move-inbox): Only bind default-directory when
- calling external function.
+1998-09-11 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
-1997-11-26 IWAMURO Motonori <iwa@mmp.fujitsu.co.jp>
+ * gnus.el: Pterodactyl Gnus v0.30 is released.
- * gnus-kill.el (gnus-batch-score): Newsrc thinko.
+1998-09-13 Lars Magne Ingebrigtsen <larsi@gnus.org>
-1997-11-26 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+ * gnus-art.el (article-decode-encoded-words): Use it.
+ (gnus-decode-header-function): New variable.
- * nnheader.el (nnheader-parse-head): Would break on Message-ID's
- that spanned several lines.
+ * gnus-sum.el (gnus-nov-parse-line): Use it.
+ (gnus-decode-encoded-word-function): New variable.
- * gnus-util.el (gnus-date-iso8601): Didn't pick out the date
- header.
+ * gnus-msg.el (gnus-copy-article-buffer): Decode the right
+ buffer.
- * gnus-demon.el (gnus-demon-scan-mail): Clean inboxes.
+ * gnus-art.el (gnus-insert-mime-button): Use widget.
+ (gnus-widget-press-button): New function.
+ (gnus-article-prev-button): Removed.
+ (gnus-article-next-button): Ditto.
+ (gnus-article-add-button): Ditto.
-1997-11-25 Christoph Wedler <wedler@fmi.uni-passau.de>
+ * gnus.el (gnus-article-mode-map): Inherit from widget.
+ (gnus-article-mode-map): No, don't.
- * gnus-picon.el (gnus-picons-x-face-sentinel): Would bug out in
- headers with two X-Face lines.
+ * mm-decode.el (mm-dissect-buffer): Store Content-ID things.
+ (mm-content-id-alist): New variable.
+ (mm-get-content-id): New function.
-1997-11-26 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+ * gnus-art.el (gnus-request-article-this-buffer): Only decode
+ articles if we are fetching to the article buffer.
- * gnus-sum.el (gnus-summary-update-info): Would use wrong group
- name.
+1998-09-13 Shenghuo ZHU <zsh@cs.rochester.edu>
-1997-11-26 Hrvoje Niksic <hniksic@srce.hr>
+ * gnus-sum.el (gnus-summary-move-article): Don't decode accepting
+ articles.
- * gnus-spec.el (gnus-compile): Avoid multiple `c*addr's.
- (gnus-compile): Require `bytecomp'.
+1998-09-13 Lars Magne Ingebrigtsen <larsi@gnus.org>
-1997-11-25 Hrvoje Niksic <hniksic@srce.hr>
+ * mm-util.el (mm-mime-charset): Try to use safe-charsets.
+ (mm-default-mime-charset): New variable.
- * gnus-util.el (gnus-prin1): Bind `print-readably' to t.
+ * rfc2047.el (rfc2047-dissect-region): Dissect using tspecials.
- * gnus-xmas.el (gnus-xmas-kill-all-overlays): New function.
- (gnus-xmas-define): Use it.
+ * drums.el (drums-quote-string): Reversed test.
- * gnus-art.el (gnus-stop-date-timer): Use `nnheader-cancel-timer'.
+1998-09-12 Lars Magne Ingebrigtsen <larsi@gnus.org>
- * message.el (message-header-lines): Specify format.
+ * mm-util.el (mm-insert-rfc822-headers): Possibly not quote
+ string.
- * gnus-xmas.el (gnus-xmas-move-overlay): Use BUFFER.
- (gnus-byte-code): Use `indirect-function'.
+ * drums.el (drums-quote-string): New function.
- * gnus-cite.el (gnus-cite-add-face): Would assign free variable.
+ * rfc2047.el (rfc2047-encode-message-header): Goto point-min.
+ (rfc2047-b-encode-region): Chop lines.
+ (rfc2047-q-encode-region): Ditto.
-1997-11-26 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+1998-09-12 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
- * gnus-art.el (gnus-stop-date-timer): Cancel instead of delete.
- (gnus-start-date-timer): Use the numerical prefix.
+ * gnus.el: Pterodactyl Gnus v0.29 is released.
-1997-11-25 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+1998-09-12 Istvan Marko <imarko@pacificnet.net>
- * gnus-draft.el (gnus-group-send-drafts): Activate group first.
+ * mm-decode.el (mm-save-part): Message right.
-1997-11-25 Dan Christensen <jdc@chow.mat.jhu.edu>
+1998-09-12 Lars Magne Ingebrigtsen <larsi@gnus.org>
- * gnus-group.el (gnus-group-process-prefix): Skip topics.
+ * drums.el (drums-parse-address): Returned a list instead of a
+ string.
+ (drums-remove-whitespace): Skip comments.
+ (drums-parse-addresses): Didn't work.
-1997-11-25 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+1998-09-12 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
- * gnus-move.el (gnus-move-group-to-server): Protect agains
- nil-ness.
+ * gnus.el: Pterodactyl Gnus v0.28 is released.
-1997-11-25 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
+1998-09-12 Lars Magne Ingebrigtsen <larsi@gnus.org>
- * gnus.el: Quassia Gnus v0.16 is released.
+ * gnus-art.el (gnus-mime-button-map): Use the article keymap as a
+ starting point.
+ (article-decode-encoded-words): Rename.
-1997-11-25 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+ * message.el (message-narrow-to-headers-or-head): New function.
- * gnus-sum.el (gnus-read-header): Remove thread entry before
- rebuilding.
+ * gnus-int.el (gnus-request-accept-article): Narrow to the right
+ region.
- * gnus-cite.el (gnus-cite-add-face): Keep track of all overlays.
+ * message.el (message-send-news): Encode body after checking
+ syntax.
- * gnus-art.el (article-update-date-lapsed): New function.
- (gnus-start-date-timer): New command.
- (article-date-ut): Put the face in the right place.
- (article-date-ut): Would move around.
+ * gnus-art.el (gnus-mime-button-line-format): Allow descriptions.
- * gnus-group.el (gnus-group-read-ephemeral-group): Accept server
- names.
+ * mm-decode.el (mm-save-part): Use Content-Disposition filename.
- * gnus-srvr.el (gnus-browse-foreign-server): Use proper server
- names.
+ * gnus-art.el (gnus-display-mime): Respect disposition.
- * gnus.el (gnus-group-prefixed-name): Give the right result for
- native groups.
+ * mm-decode.el (mm-preferred-alternative): Respect disposition.
- * nnheader.el (nnheader-directory-files): New function.
+ * gnus-art.el (article-strip-multiple-blank-lines): Don't delete
+ text with annotations.
- * nnmh.el (nnmh-request-list-1): Reversed check.
+ * message.el (message-make-date): Fix sign for negative time
+ zones.
- * nnfolder.el (nnfolder-delete-mail): Would skip backwards one
- line too much.
+ * mm-view.el (mm-inline-image): Insert a space at the end of the
+ image.
-1997-11-25 SeokChan LEE <chan@xfer.kren.nm.kr>
+ * mail-parse.el: New file.
- * message.el (message-ignored-supersedes-headers): Typo.
+ * rfc2231.el: New file.
-1997-11-24 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
+ * drums.el (drums-content-type-get): Removed.
+ (drums-parse-content-type): Ditto.
- * gnus.el: Quassia Gnus v0.15 is released.
+ * mailcap.el (mailcap-mime-data): Use symbols instead of strings.
-1997-11-24 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+1998-09-11 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
- * gnus-ems.el: Also check major version names.
+ * gnus.el: Pterodactyl Gnus v0.27 is released.
-1997-10-05 SL Baur <steve@altair.xemacs.org>
+1998-09-11 Lars Magne Ingebrigtsen- <larsi@gnus.org>
- * message.el (require 'rmail): Put guard around.
- * nnbabyl.el (require 'rmail): Ditto.
+ * mm-decode.el (mm-alternative-precedence): New variable.
+ (mm-preferred-alternative): New function.
-1997-11-24 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+ * gnus-art.el (gnus-mime-copy-part): New command.
- * message.el (message-reply): Respect Mail-Copies-To even when
- `to-address'.
+ * mm-decode.el (mm-get-part): New function.
-1997-11-24 Thor Kristoffersen <thor@unik.no>
+ * mm-view.el: New file.
- * nntp.el (nntp-request-close): Sleep one second.
+ * mm-decode.el (mm-dissect-buffer): Downcase cte.
+ (mm-display-part): Default to mailcap-save-binary-file.
-1997-11-24 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+1998-09-11 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
- * gnus-sum.el (gnus-summary-read-group-1): Update marks when not
- entering group.
+ * gnus.el: Pterodactyl Gnus v0.26 is released.
- * gnus-start.el (gnus-setup-news): Get correct value of archive
- server.
+1998-09-11 Lars Magne Ingebrigtsen <larsi@gnus.org>
-1997-10-08 Robert Bihlmeyer <robbe@orcus.priv.at>
+ * mm-decode.el (mm-interactively-view-part): New function.
- * message.el (message-make-organization): Don't let the
- environment variable override a user-set organization.
+ * gnus-art.el (gnus-mime-view-part): New command.
-1997-11-24 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+ * mm-decode.el (mm-last-shell-command): New variable.
- * nnml.el (nnml-open-nov): Don't use find-file.
+ * mailcap.el (mailcap-mime-info): Allow returning all matches.
- * gnus-sum.el (gnus-last-newsgroup-variables-set): New variable.
- (gnus-set-global-variables): Don't do to much; gets run off of
- pre-command-hook.
- Got rid of gnus-set-global-variables throughout.
- (gnus-summary-exit): Update adaptive scoring here.
- (gnus-summary-isearch-article): Widen.
+ * mm-decode.el (mm-save-part): New function.
- * nnml.el (nnml-parse-head): Work in empty buffers.
+ * gnus-art.el (article-decode-charset): Protect against buggy
+ content-types.
+ (gnus-mime-pipe-part): New command.
+ (gnus-mime-save-part): New command.
+ (gnus-mime-button-map): New keymap.
+ (gnus-mime-button-line-format): New variable.
+ (gnus-insert-mime-button): New function.
+ (gnus-display-mime): Use it.
-1997-10-14 Hrvoje Niksic <hniksic@srce.hr>
+ * gnus-util.el (gnus-dd-mmm): Removed length spec.
- * gnus-xmas.el (gnus-xmas-group-startup-message): Check for image
- formats correctly.
- (gnus-xmas-modeline-glyph): Ditto.
+ * mm-decode.el (mm-inline-text): Decode charsets.
-1997-11-24 Hrvoje Niksic <hniksic@srce.hr>
+ * gnus-art.el (gnus-article-save): Comment fix.
- * gnus-spec.el (gnus-compile): Work under XEmacs.
+ * gnus-int.el (gnus-start-news-server): When in batch, don't
+ prompt.
-1997-11-24 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+ * gnus-cache.el (gnus-cache-possibly-enter-article): Don't
+ decode.
- * nnoo.el (nnoo-change-server): Push the right parent packend onto
- the alist.
+ * mm-decode.el (mm-inline-media-tests): Add audio.
+ (mm-inline-audio): New function.
-1997-11-23 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
+1998-09-11 Katsumi Yamaoka <yamaoka@ga.sony.co.jp>
- * gnus.el: Quassia Gnus v0.14 is released.
+ * gnus-art.el (article-make-date-line): Didn't work.
-1997-11-23 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+ * parse-time.el (parse-time-string): One too many nils.
- * gnus-start.el (gnus-read-descriptions-file): Make sure Mule is
- bound. And gagged.
+1998-09-11 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
- * message.el (message-send-mail-with-mh): Use
- `mh-new-draft-name'.
+ * gnus.el: Pterodactyl Gnus v0.25 is released.
- * nnfolder.el (nnfolder-read-folder): Save new buffers.
+1998-09-11 Lars Magne Ingebrigtsen <larsi@gnus.org>
- * gnus-sum.el (gnus-summary-make-menu-bar): Removed "write to
- file".
+ * gnus-art.el (article-remove-trailing-blank-lines): Don't remove
+ annotations.
- * gnus-util.el (gnus-byte-code): Use indirect-function.
+ * gnus.el ((featurep 'gnus-xmas)): New
+ 'gnus-annotation-in-region-p alias.
- * nntp.el (nntp-open-telnet): Also accept 201.
+1998-09-10 Lars Magne Ingebrigtsen <larsi@gnus.org>
- * gnus-sum.el (gnus-summary-reparent-thread): Update thread.
+ * mm-util.el (mm-with-unibyte-buffer): New function.
- * gnus-score.el (gnus-all-score-files): Don't do anything unless
- GROUP.
+ * gnus-uu.el (gnus-quote-arg-for-sh-or-csh): Renamed.
- * nnmail.el (nnmail-split-it): Save-excursion.
- (nnmail-group-pathname): Translate file chars.
+ * mm-decode.el (mm-inline-media-tests): New variable.
-1997-11-23 Gunnar Horrigmo <horrigmo@online.no>
+ * gnus-sum.el (gnus-summary-exit): Destroy handles.
- * gnus-sum.el (gnus-summary-exit): Don't skip if group
- disappeared.
+ * gnus-art.el (gnus-article-mime-handles): New variable.
-1997-11-23 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+ * drums.el (drums-narrow-to-header): New function.
- * nnfolder.el (nnfolder-normalize-buffer): New function.
- (nnfolder-save-mail): Use it.
- (nnfolder-request-replace-article): Ditto.
+ * gnus-art.el (article-decode-charset): Use it.
-1997-11-19 Per Abrahamsen <abraham@dina.kvl.dk>
+ * drums.el (drums-content-type-get): New function.
- * message.el (message-header-lines): New widget.
- (message-default-headers): Use it.
- (message-default-mail-headers): Use it.
- (message-default-news-headers): Use it.
+ * mm-util.el (mm-content-type-charset): Removed.
-1997-11-23 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+ * drums.el (drums-syntax-table): @ is word.
+ (drums-parse-content-type): New function.
- * gnus-win.el (gnus-remove-some-windows): Also delete dead summary
- windows.
+ * parse-time.el (parse-time-rules): Parse "Wed, 29 Apr 98 0:26:01
+ EDT" times.
- * gnus-score.el (gnus-score-adaptive): Check whether functions are
- bound.
+ * gnus-util.el (gnus-date-get-time): Use safe date.
-1997-11-23 Hallvard B. Furuseth <h.b.furuseth@usit.uio.no>
+ * gnus-sum.el (gnus-show-mime): Removed.
+ (gnus-summary-toggle-mime): Removed.
- * gnus-sum.el (gnus-summary-limit-include-thread): Interactive
- fix.
+ * gnus-art.el (gnus-strict-mime): Removed.
+ (gnus-article-prepare): Don't do MIME.
+ (gnus-decode-encoded-word-method): Removed.
+ (gnus-show-mime-method): Removed.
-1997-11-23 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+1998-09-10 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
- * gnus-sum.el (gnus-summary-reparent-thread): Insert Message-ID in
- proper place.
+ * gnus.el: Pterodactyl Gnus v0.24 is released.
-1997-11-22 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+1998-09-10 Lars Magne Ingebrigtsen <larsi@gnus.org>
- * gnus-cus.el (gnus-group-parameters): Add visible.
+ * gnus-sum.el (gnus-summary-show-article): Don't decode chars if
+ PREFIX.
-1997-11-22 Kim-Minh Kaplan <kkaplan@lpthe.jussieu.fr>
+ * parse-time.el (parse-time-rules): Accept times that look like
+ "h:mm".
- * message.el (message-setup): Add a newline, if necessary.
+ * message.el (message-make-date): Use zone properly.
-1997-11-22 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+ * gnus.el: Autoload gnus-batch.
- * gnus-mh.el (gnus-summary-save-in-folder): Fix for default.
+ * gnus-art.el (article-de-quoted-unreadable): Do not do
+ gnus-article-decode-rfc1522.
-1997-11-22 Didier Verna <verna@inf.enst.fr>
+ * gnus-msg.el (gnus-inews-do-gcc): Use it.
- * gnus-sum.el (gnus-summary-remove-bookmark): Interactive spec.
+ * gnus-int.el (gnus-request-accept-article): Accept a no-encode
+ param.
-1997-11-17 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+ * message.el (message-encode-message-body): Check for us-ascii.
- * gnus-art.el (article-display-x-face): Fold case.
+ * gnus-msg.el (gnus-extended-version): Move Gnus version comments
+ to the left.
-1997-11-13 Kenichi Handa <handa@etl.go.jp>
+1998-09-09 Lars Magne Ingebrigtsen <larsi@gnus.org>
- * gnus/gnus-start.el (gnus-read-descriptions-file): Decode
- description if necessary.
+ * gnus-art.el (article-decode-charset): Rename.
- * gnus/nntp.el (nntp-coding-system-for-read): Set default value to
- binary.
- (nntp-coding-system-for-write): Likewise.
+1998-09-09 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
-1997-11-13 seokchan lee <chan@xfer.kren.nm.kr>
+ * gnus.el: Pterodactyl Gnus v0.23 is released.
- * message.el (message-ignored-supersedes-headers): Ignore more
- headers.
+1998-09-09 Lars Magne Ingebrigtsen <larsi@gnus.org>
-1997-11-13 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+ * gnus-util.el (gnus-parent-id): Ditto.
+ (gnus-put-text-property-excluding-newlines): Ditto.
- * message.el (message-separator-face): Lightened up.
- (message-header-other-face): Ditto.
+ * gnus-sum.el (gnus-dependencies-add-header): Make into subst.
-1997-11-13 jari aalto <jari.aalto@poboxes.com>
+1998-09-08 Karl Kleinpaste <karl@jprc.com>
- * nnmail.el (nnmail-process-mmdf-mail-format): Pop to buffer.
+ * message.el (message-generate-headers): Generate User-Agent
+ instead of X-Mailer & X-Newsreader.
-1997-11-13 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+ * gnus-msg.el (gnus-extended-version): Reformat for USEFOR
+ User-Agent header format.
- * gnus-start.el (gnus-start-draft-setup): Always create group.
+1998-09-09 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
- * gnus-agent.el (gnus-agent-fetch-headers): Translate file chars.
+ * gnus.el: Pterodactyl Gnus v0.22 is released.
-1997-11-06 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
+1998-09-09 Lars Magne Ingebrigtsen <larsi@gnus.org>
- * gnus.el: Quassia Gnus v0.13 is released.
+ * mm-util.el (mm-multibyte-p): Typo.
-1997-11-06 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+1998-09-09 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
- * nnlistserv.el: New backend.
+ * gnus.el: Pterodactyl Gnus v0.21 is released.
-1997-11-06 Stefan Waldherr <swa@cs.cmu.edu>
+1998-09-08 Hrvoje Niksic <hniksic@srce.hr>
- * nnweb.el (nnweb-dejanewsold-search): New function.
+ * gnus-art.el (article-treat-dumbquotes): Handle \224 correctly.
-1997-11-06 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+1998-09-09 Lars Magne Ingebrigtsen <larsi@gnus.org>
- * gnus-topic.el (gnus-topic-change-level): Really delete multiple
- instances.
+ * mm-util.el (mm-multibyte-p): New function.
-1997-11-05 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+1998-09-08 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
- * gnus-topic.el (gnus-topic-update-topic-line): Possibly fix nil
- numbers.
+ * gnus.el: Pterodactyl Gnus v0.20 is released.
- * gnus-sum.el (gnus-summary-show-article): New command and
- keystroke.
+1998-09-08 Lars Magne Ingebrigtsen <larsi@gnus.org>
-1997-11-04 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+ * rfc2047.el (rfc2047-decode-region): Only decode when in
+ multibyte.
- * gnus-score.el (gnus-score-adaptive): Use the home score file.
+ * nnheader.el (nnheader-pathname-coding-system): Changed to binary.
-1997-10-25 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+ * gnus-int.el (gnus-request-replace-article): Encode.
+ (gnus-request-accept-article): Encode.
- * gnus-art.el (gnus-article-save): Hide headers in the right
- buffer.
+ * gnus-art.el (gnus-request-article-this-buffer): Decode charsets
+ here.
- * gnus-picon.el (gnus-picons-xbm-face): New face.
+ * gnus.el (gnus-article-display-hook): Take the charset functions
+ out.
-1997-10-25 Lars Balker Rasmussen <lbr@mjolner.dk>
+ * time-date.el (safe-date-to-time): New function.
- * gnus-art.el (gnus-article-fill-paragraph): New command and
- keystroke.
+ * gnus-util.el (gnus-dd-mmm): Protect against bogus dates.
-1997-10-16 Colin Rafferty <craffert@ml.com>
+1998-09-08 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
- * message.el (message-make-fqdn): Made certain that user-mail is
- not nil.
+ * gnus.el: Pterodactyl Gnus v0.19 is released.
-1997-10-25 David S. Goldberg <dsg@linus.mitre.org>
+1998-09-08 Lars Magne Ingebrigtsen <larsi@gnus.org>
- * gnus-art.el (article-hide-boring-headers): Use many-to.
+ * mm-util.el (mm-mime-charset): New function.
-1997-10-24 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+ * gnus-draft.el (gnus-draft-edit-message): Delete article.
- * gnus-picon.el (gnus-picons-display-pairs): Don't add two bars.
- (gnus-picons-try-face): Set the foreground color on the bar.
- (gnus-picons-group-exluded-groups): New variable.
- (gnus-group-display-picons): Use it.
+1998-09-08 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
-1997-10-13 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+ * gnus.el: Pterodactyl Gnus v0.18 is released.
- * gnus-agent.el (gnus-agent-group-path): Translate file chars.
- (gnus-agent-batch-fetch): New command.
- (gnus-agent-fetch-group): Message.
+1998-09-08 Lars Magne Ingebrigtsen <larsi@gnus.org>
-1997-10-12 ISO-2022-JP <ichikawa@hv.epson.co.jp>
+ * message.el (message-send-and-exit): Return t on success.
+ (message-make-date): Make a proper time zone.
- * gnus-agent.el (gnus-agent-article-file-coding-system): New
- variable.
+ * gnus-draft.el (gnus-draft-send): Only remove article if the
+ sending is successful.
-1997-10-12 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+ * drums.el (drums-get-comment): Return the last comment.
+ (drums-parse-address): Parse old-style From headers.
- * dgnushack.el (lpath): Reversed.
+1998-09-07 SL Baur <steve@altair.xemacs.org>
- * gnus-msg.el (gnus-summary-cancel-article): Use sym prefix.
+ * gnus-sum.el (gnus-data-compute-positions): Move below
+ `gnus-save-hidden-threads' so the former is correctly detected as
+ a macro.
- * gnus-art.el (article-translate-characters): New function.
- (article-treat-dumbquotes): New command and keystroke.
+1998-09-06 Dave Love <fx@gnu.org>
-1997-10-05 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+ * gnus/nnweb.el (require): Wrap requirement of w3 and url in
+ ignore-errors too, eval'd when compile. Require w3 stuff at load
+ time for nicer failure if it's not available.
- * gnus-art.el (gnus-button-alist): No ' and " in News:.
+1998-09-08 Lars Magne Ingebrigtsen <larsi@gnus.org>
- * gnus-msg.el (gnus-inews-insert-archive-gcc): Comp warn.
+ * time-date.el (time-to-seconds): Renamed.
-1997-10-04 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
+ * parse-time.el (parse-time-string): Downcase before handling.
+ (parse-time-rules): Times without seconds have 0 seconds.
- * gnus.el: Quassia Gnus v0.12 is released.
+ * rfc2047.el (rfc2047-encode-region): New version.
+ (rfc2047-dissect-region): New function.
-1997-10-04 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+1998-09-07 Lars Magne Ingebrigtsen <larsi@gnus.org>
- * gnus.el (gnus-plugged): Moved here.
+ * message.el (message-make-date): Use symbolic zone.
- * nnmail.el (nnmail-delete-incoming): Changed default to nil.
+1998-09-07 Lars Magne Ingebrigtsen <larsi@gnus.org>
- * gnus-int.el (gnus-request-scan): Don't do anything if
- unplugged.
+ * time-date.el (parse-time): Always use parse-time.
-1997-10-03 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+ * parse-time.el (parse-time-syntax): Use vectors.
- * gnus-art.el (gnus-ignored-headers): Doc fix.
+1998-09-06 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
- * gnus-demon.el (gnus-demon-add-nntp-close-connection): New
- function.
- (gnus-demon-nntp-close-connection): Ditto.
+ * gnus.el: Pterodactyl Gnus v0.17 is released.
- * nntp.el (nntp-last-command-time): New variable.
- (nntp-retrieve-data): Use it.
+1998-09-06 Lars Magne Ingebrigtsen <larsi@gnus.org>
- * message.el (message-news-p): Messages with Posted-To aren't
- news.
- (message-mode): Heed message-yank-prefix when filling.
+ * time-date.el: Renamed from "date".
- * nndraft.el (nndraft-request-restore-buffer): Remove Xrefs and
- Lines headers.
+ * gnus.el: Removed all timezone dependencies.
- * nntp.el (nntp-encode-text): Encode according to RFC977.
+ * score-mode.el: Removed.
+ (gnus-score-edit-insert-date): Use date.
-1997-10-01 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+ * date.el (float-to-time): New function.
- * gnus-msg.el (gnus-inews-insert-archive-gcc): gcc-self didn't
- work if `gnus-message-archive-method' was nil.
+ * nnspool.el (nnspool-seconds-since-epoch): Removed.
- * nnmail.el (nnmail-article-group): Allow \\1 substitution.
+ * date.el (time-to-float): New function.
-1997-09-27 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+ * message.el (message-make-date): Use format-time-string.
+ (message-make-expires): Use make-date.
- * gnus-salt.el (gnus-pick-mouse-pick-region): Use it.
+ * gnus-util.el (gnus-dd-mmm): Use date.
+ (gnus-sortable-date): Ditto.
- * gnus-xmas.el (gnus-xmas-window-edges): New function.
+ * message.el (message-make-date): Take an optional time.
- * gnus-score.el (gnus-score-edit-current-scores): Don't select
- window.
+ * gnus: Applied patches from 5.6.43.
-1997-09-27 Hallvard B. Furuseth <h.b.furuseth@usit.uio.no>
+ * date.el (if): Use parse-time.
- * messcompat.el ((boundp 'mail-mode-hook)): Check.
+ * gnus-score.el (gnus-summary-score-entry): Make into a command
+ again.
-1997-09-27 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+ * gnus-group.el (gnus-group-get-new-news-this-group): Only call if
+ gnus-agent.
- * nndraft.el (nndraft-possibly-change-group): Always open server.
+ * gnus.el (gnus-agent-meta-information-header): Moved here.
- * gnus-sum.el (gnus-summary-pop-article): Force.
+1998-09-05 Mike McEwan <mike@lotusland.demon.co.uk>
- * gnus-art.el (gnus-article-prepare): Push the article onto the
- history.
+ * gnus-agent.el (gnus-agent-scoreable-headers): New variable.
+ (gnus-agent-fetch-group-1): Score article headers using normal
+ group score files if the download score rule of a category/group
+ is `file'.
+ (gnus-agent-fetch-group-1): Don't parse the entire .overview when
+ deciding what articles to download.
+ (gnus-agent-fetch-group-1): Don't push headers through scoring and
+ predicate processing if predicate is `true' or `false'.
- * gnus-sum.el (gnus-summary-pop-article): Pop to the right
- article.
+1998-09-06 Lars Magne Ingebrigtsen <larsi@gnus.org>
- * gnus-demon.el (gnus-demon-scan-news): Save excursion.
+ * gnus-score.el (gnus-score-load-score-alist): Bind coding system.
-1997-09-27 Hallvard B. Furuseth <h.b.furuseth@usit.uio.no>
+ * gnus-art.el (gnus-article-setup-buffer): Enable multibyte.
- * gnus-cache.el (gnus-summary-limit-include-cached): New command
- and keystroke.
+ * score-mode.el (score-mode-coding-system): New variable.
+ (gnus-score-edit-exit): Use it.
-1997-09-27 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+1998-09-04 Jason R Mastaler <jason@4b.org>
- * gnus-uu.el (gnus-uu-invert-processable): Make interactive.
+ * drums.el: Corrected typo.
-1997-09-27 Kim-Minh Kaplan <kimminh.kaplan@utopia.eunet.fr>
+1998-09-06 Hallvard B. Furuseth <h.b.furuseth@usit.uio.no>
- * gnus-picon.el: Doc fixes.
+ * mm-bodies.el (mm-body-encoding): Faster version.
-1997-09-23 Hrvoje Niksic <hniksic@srce.hr>
+1998-09-06 Lars Magne Ingebrigtsen <larsi@gnus.org>
- * gnus.el: Removed definition of `custom-face-lookup'.
+ * gnus-art.el (gnus-article-decode-charset): Only decode text
+ things.
-1997-09-27 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+ * message.el (message-output): Use rmail.
- * nndraft.el: Would block nnmh.
+ * rfc2047.el (rfc2047-encoded-word-regexp): Allow spaces in the
+ word part.
- * gnus-sum.el (gnus-mark-article-as-unread): Don't allow marking
- negative articles.
+ * mm-util.el (mm-charset-to-coding-system): Use
+ rfc2047-default-charset.
+ (mm-known-charsets): New variable.
- * gnus-group.el (gnus-fetch-group): Use `gnus-no-server'.
+ * message.el (message-caesar-region): Bugged out.
- * gnus-agent.el (gnus-agent-with-fetch): Moved.
+1998-09-06 Mike McEwan <mike@lotusland.demon.co.uk>
- * gnus-sum.el (gnus-nov-read-integer): Really skip to next field.
+ * gnus-agent.el (gnus-agent-fetch-group-1): Allow lists when
+ specifying `agent-predicate' in a group's parameters.
-1997-09-27 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
+1998-09-05 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
- * gnus.el: Quassia Gnus v0.11 is released.
+ * gnus.el: Pterodactyl Gnus v0.16 is released.
-1997-09-27 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+1998-09-05 Lars Magne Ingebrigtsen <larsi@gnus.org>
- * message.el (message-send): Post without asking.
- (message-mode): Modify paragraphs-start and paragraph-separate.
- (message-newline-and-reformat): New command and keystroke.
+ * nnmail.el (nnmail-expired-article-p): Use predicate.
-1997-09-25 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+ * date.el (time-less-p): Renamed.
- * nnmail.el (nnmail-activate): Init server buffer.
+ * gnus-art.el (gnus-article-decode-charset): Really fetch headers
+ from the headers.
-1997-09-24 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+ * rfc2047.el (rfc2047-decode-region): Use the mm decoding
+ functions.
- * gnus-draft.el (gnus-draft-setup): Inexplicable binding problem
- worked around.
+ * gnus-group.el (gnus-group-sort-selected-flat): Didn't work at
+ all.
+ (gnus-group-sort-selected-groups-by-alphabet): Changed interface
+ to all functions.
- * nnsoup.el (nnsoup-always-save): Renamed.
+1998-09-05 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
-1997-09-24 Nelson Jose dos Santos Ferreira <Nelson.Ferreira@inesc.pt>
+ * gnus.el: Pterodactyl Gnus v0.15 is released.
- * nnsoup.el (nnsoup-commit-reply-now): New variable.
- (nnsoup-store-reply): Use it.
+1998-09-05 Lars Magne Ingebrigtsen <larsi@gnus.org>
-1997-09-24 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+ * date.el: New file.
- * gnus-ems.el (gnus-deactivate-mark): New alias.
+ * gnus-util.el (gnus-encode-date): Removed.
+ (gnus-time-less): Ditto.
-1997-09-23 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+ * nnmail.el (nnmail-date-to-time): Removed.
+ (nnmail-time-less): Ditto.
+ (nnmail-days-to-time): Ditto.
+ (nnmail-time-since): Ditto.
- * gnus.el: Win-away!
+ * drums.el: New file.
- * gnus-msg.el (gnus-setup-message): Don't trust make-symbol.
+1998-09-04 Lars Magne Ingebrigtsen <larsi@gnus.org>
-1997-09-23 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
+ * message.el (message-encode-message-body): Encode headers with
+ body encoding.
- * gnus.el: Quassia Gnus v0.10 is released.
+ * rfc2047.el (rfc2047-default-charset): Renamed.
+ (rfc2047-encodable-p): Use it.
-1997-09-23 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+1998-09-03 Lars Magne Ingebrigtsen <larsi@gnus.org>
- * gnus-sum.el (gnus-read-all-headers): New function.
- (gnus-select-newsgroup): Use it.
- (gnus-summary-refer-thread): Ditto.
- (gnus-refer-thread-limit): New variable.
- (gnus-summary-refer-thread): Use it.
+ * gnus-msg.el (gnus-post-method): Peel off real info from opened
+ servers.
- * gnus-nocem.el (gnus-nocem-message-wanted-p): New function.
- (gnus-nocem-check-article): Use it.
- (gnus-nocem-issuers): Dox ofx.
+ * gnus-util.el (gnus-output-to-rmail): Removed.
- * dgnushack.el (dgnushack-compile): Check for cus-edit.
+ * gnus-art.el (gnus-summary-save-in-rmail): Use
+ gnus-output-to-rmailrmail-output-to-rmail-file.
- * message.el (message-included-forward-headers): Include Mime
- headers.
- (message-send): Allow posting without confirming from Agent.
+ * rfc2047.el (rfc2047-decode-region): Fold case.
+ (rfc2047-decode): Use decode-string.
-1997-09-22 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+ * mm-util.el: Provide mm-char-int.
- * dgnushack.el (byte-compile-warnings): Don't warn about obsolete
- variables.
+1998-09-03 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
- * gnus-sum.el (gnus-summary-refer-thread): New command and
- keystroke.
- (gnus-summary-limit-include-thread): New command and keystroke.
- (gnus-summary-articles-in-thread): New function.
- (gnus-articles-in-thread): Renamed.
+ * gnus.el: Pterodactyl Gnus v0.14 is released.
-1997-09-21 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
+1998-09-03 Lars Magne Ingebrigtsen <larsi@gnus.org>
- * gnus.el: Quassia Gnus v0.9 is released.
+ * mm-bodies.el (mm-body-encoding): Go through the buffer to make
+ sure we have 7bit.
-1997-09-21 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+1998-09-02 Lars Magne Ingebrigtsen <larsi@gnus.org>
- * gnus.el (gnus-splash-face): ForestGreen everywhere.
+ * gnus-msg.el (gnus-post-method): Use opened servers, and remove
+ ducplicates.
+ (gnus-inews-insert-mime-headers): Removed.
- * gnus-sum.el (gnus-simplify-subject-fully): Use new variable.
- (gnus-general-simplify-subject): Ditto.
+ * message.el (message-caesar-region): Protect against MULE chars.
-1997-09-21 Kurt Swanson <kurt@dna.lth.se>
+1998-09-02 Hallvard B. Furuseth <h.b.furuseth@usit.uio.no>
- * gnus-sum.el (gnus-simplify-subject-functions): New variable.
- (gnus-simplify-whitespace): New function.
+ * mm-util.el (if): fset the right function.
- * gnus-util.el (gnus-map-function): New function.
+1998-09-02 Lars Magne Ingebrigtsen <larsi@gnus.org>
-1997-09-21 Michelangelo Grigni <mic@mathcs.emory.edu>
+ * gnus-art.el (gnus-article-decode-charset): Use real
+ read-coding-system.
- * gnus-score.el (gnus-score-regexp-bad-p): New function.
+1998-09-01 Lars Magne Ingebrigtsen <larsi@gnus.org>
-1997-09-21 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+ * mm-bodies.el (mm-decode-body): Protect against malformed
+ base64.
+ (mm-decode-body): Check that buffer-file-coding-system is
+ non-nil.
- * gnus-score.el (gnus-summary-lower-score): Use sym pref.
- (gnus-summary-increase-score): Use it.
+1998-09-01 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
- * gnus.el (gnus-current-prefix-symbol): New variable.
- (gnus-current-prefix-symbols): New variable.
+ * gnus.el: Pterodactyl Gnus v0.13 is released.
- * gnus-score.el (gnus-summary-increase-score): Take symbolic
- prefix.
+1998-09-01 Lars Magne Ingebrigtsen <larsi@gnus.org>
- * gnus.el (gnus-interactive): Removed.
- (gnus-interactive): Renamed from gnus-interactive-1.
- (gnus-symbolic-argument): New command.
+ * gnus-util.el (gnus-strip-whitespace): Already defined.
+ Removed.
- * gnus-draft.el (gnus-draft-send-message): Disable message
- checks.
- (gnus-draft-send): Ditto.
- (gnus-draft-setup): Don't save buffer.
+ * gnus-art.el (gnus-article-decode-charset): Strip whitespace.
- * dgnushack.el (dgnushack-compile): Warn people about Custom.
+ * gnus-util.el (gnus-strip-whitespace): New function.
- * gnus-group.el (gnus-group-iterate): Use gensymmed variables.
+ * mm-util.el (mm-content-type-charset): Downcase.
- * pop3.el (pop3-md5): `with-temp-buffer' doesn't exist in Emacs
- 19.34.
+1998-09-01 Lars Magne Ingebrigtsen <larsi@gnus.org>
- * nneething.el (nneething-directory): Defvarred.
+ * gnus-art.el (gnus-article-decode-charset): Accept a prefix.
+ (gnus-article-decode-charset): Don't fetch all headers.
- * message.el: Autoloaded nndraft things.
- (message-set-auto-save-file-name): Use it.
+ * mm-util.el (mm-read-coding-system): New function.
- * dgnushack.el (dgnushack-compile): Warn about things.
+ * mm-bodies.el (mm-decode-body): Check the right charset.
- * gnus-art.el: Autoload w3-region.
+ * gnus-sum.el (gnus-summary-mode-line-format): Ditto.
- * gnus-vm.el (gnus-summary-save-in-vm): Simplified.
+ * gnus-art.el (gnus-article-mode-line-format): Use short group
+ format.
- * gnus.el: Changed `compiled-function-p' to `byte-code-function-p'
- throughout.
+1998-09-01 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
- * gnus-sum.el (gnus-summary-edit-article): Supply additional
- param.
+ * gnus.el: Pterodactyl Gnus v0.12 is released.
- * gnus-group.el (gnus-group-iterate): Undo bogus change.
+1998-09-01 Lars Magne Ingebrigtsen <larsi@gnus.org>
- * gnus-agent.el (gnus-agentize): Just call gnus-open-agent
- directly.
+ * mm-bodies.el (mm-decode-body): Don't do charset unless MULE.
- * gnus.el (gnus-interactive): New macro.
- (gnus-interactive-1): New function.
+ * gnus-art.el (gnus-article-decode-charset): Supply cte.
+ (gnus-article-decode-charset): Always run.
- * gnus-sum.el (gnus-fetch-old-headers): Allow `invisible'.
- (gnus-cut-thread): Use it.
- (gnus-cut-threads): Ditto.
- (gnus-summary-initial-limit): Ditto.
- (gnus-summary-limit-children): Ditto.
+ * mm-bodies.el (mm-decode-body): Decode cte.
- * gnus-art.el (gnus-article-edit-done): Accept a prefix arg.
- (gnus-boring-article-headers): Allow `long-to' param.
- (article-hide-boring-headers): Use it.
+1998-09-01 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
- * gnus-sum.el (gnus-summary-edit-article-done): Accept a
- no-highlight param.
+ * gnus.el: Pterodactyl Gnus v0.11 is released.
- * nntp.el (nntp-rlogin-program): New variable.
- (nntp-open-rlogin): Use it.
+1998-08-31 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * message.el (message-encode-message-body): Ditto.
- * nnvirtual.el (nnvirtual-request-post): New function.
+ * gnus-art.el (gnus-article-decode-mime-words): New command and
+ keystroke.
+ (gnus-article-decode-charset): Ditto.
+ (gnus-article-decode-charset): Only work under MULE.
- * gnus-msg.el (gnus-message-group-art): New variable.
+ * mm-util.el (mm-content-type-charset): New function.
- * gnus-draft.el (gnus-draft-setup): Don't use message-setup.
+ * nnmail.el (nnmail-delete-incoming): Changed to nil.
- * nndraft.el (nndraft): Allow editing articles.
+ * message.el (message-send-mail): Insert MIME headers.
+ (message-check-news-body-syntax): Don't warn for escape sequences.
+ (message-check-news-body-syntax): Insert MIME headers.
- * gnus-ems.el (gnus-x-splash): Ditto.
+ * mm-bodies.el (mm-body-encoding): New function.
- * gnus.el (gnus-splash-face): Darker face.
+ * message.el (message-encode-message-body): New function.
- * gnus-draft.el (gnus-draft-setup): Clobbered variables.
+ * mm-bodies.el: New file.
-1997-09-20 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
+ * mm-util.el (mm-narrow-to-head): New function.
- * gnus.el: Quassia Gnus v0.8 is released.
+ * rfc2047.el (rfc2047-encode): Use it.
-1997-09-20 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+ * mm-util.el: Provide mm-encode-coding-region.
- * gnus-start.el (gnus-setup-news-hook): New hook.
+ * gnus-sum.el (gnus-summary-mode): Enable multibyte.
- * gnus-agent.el (gnus-agentize): Really set up queue group.
- (gnus-open-agent): Setup queue here.
+ * gnus-util.el (gnus-set-work-buffer): Enable multibyte.
-1997-09-20 Matt Simmons <simmonmt@acm.org>
+ * mm-util.el (mm-enable-multibyte): New function.
- * message.el (message-set-auto-save-file-name): Make things work
- without drafts.
+ * message.el (message-set-work-buffer): Set multibyte.
-1997-09-20 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+ * gnus.el (gnus-continuum-version): Be valid forever and ever.
- * nnmh.el (nnmh-request-list-1): Check for links to ".".
+ * gnus-util.el (gnus-point-at-eol): Removed.
+ (gnus-point-at-bol): Ditto.
- * nndraft.el (nndraft-possibly-change-group): New function.
+1998-08-31 Didier Verna <verna@inf.enst.fr>
- * gnus-agent.el (gnus-agent-queue-setup): New function.
+ * gnus-msg.el (gnus-group-mail): make it behave like
+ gnus-group-post-news with regards to the prefix (this enables the
+ use of posting styles).
-1997-09-18 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
+1998-08-31 Lars Magne Ingebrigtsen <larsi@gnus.org>
- * gnus.el: Quassia Gnus v0.7 is released.
+ * gnus.el (gnus-article-display-hook): Added
+ gnus-article-decode-rfc1522 to hook.
-1997-09-18 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+1998-08-31 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
- * gnus-msg.el (gnus-setup-message): Slap a progn around forms.
+ * gnus.el: Pterodactyl Gnus v0.10 is released.
- * nndraft.el (nndraft-articles): Make sure directory exists.
+1998-08-31 Lars Magne Ingebrigtsen <larsi@gnus.org>
- * message.el (message-mode): Don't delete article.
+ * nnfolder.el (nnfolder-delete-mail): Narrow to mail and allow
+ hook to be run.
- * nnmh.el (nnmh-request-accept-article): Don't save when
- noinsert.
+1998-08-30 Lars Magne Ingebrigtsen <larsi@gnus.org>
-1997-09-17 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+ * rfc2047.el (rfc2047-encodable-p): Use find-charset-region.
- * nndraft.el (nndraft-directory): Changed defaults.
+ * mm-util.el (mm-charsets-in-region): Removed.
- * gnus-agent.el (gnus-agent-fetch-session): Bind command method.
+ * rfc2047.el: Renamed file.
-1997-09-17 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
+ * gnus-msg.el (gnus-copy-article-buffer): Multibyte.
- * gnus.el: Quassia Gnus v0.6 is released.
+ * message.el (message-mode): Set multibyte.
-1997-08-17 SL Baur <steve@altair.xemacs.org>
+ * mm-util.el (mm-charsets-in-region): Copied here.
- * dgnushack.el (dgnushack-compile): Ignore .el files beginning
- with an `=' character.
+ * gnus-util.el: Removed gnus-truncate-string.
-1997-09-17 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+ * gnus-art.el (gnus-article-decode-mime-words): Use 1522.
- * gnus-sum.el (gnus-build-sparse-threads): Allow display of looped
- References.
+ * rfc1522.el (rfc1522-unencoded-charsets): New variable.
+ (rfc1522-encodable-p): New function.
+ (rfc1522-encode-message-header): Use it.
- * gnus-agent.el (gnus-agent-fetch-group-1): Separated out into
- function.
+1998-08-30 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
- * message.el (message-delete-not-region): New command and
- keystroke.
+ * gnus.el: Pterodactyl Gnus v0.9 is released.
-1997-09-16 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+1998-08-30 Lars Magne Ingebrigtsen <larsi@gnus.org>
- * nndraft.el (nndraft-directory): Changed value.
+ * mm-util.el: Shadow encode-coding-string.
- * message.el (message-kill-buffer): Disassociate draft.
- (message-mode): Use kill hook to disassociate.
- (message-disassociate-draft): Double-check.
+ * rfc1522.el (rfc1522-narrow-to-field): Copied here.
- * gnus-agent.el (gnus-agentize): Don't set twice.
+ * mm-util.el: New file.
- * gnus-art.el (gnus-article-prepare): Go to the right line before
- marking.
+ * mm-decode.el: Somewhat depleted.
+ * mm-encode.el: Ditto.
- * gnus-start.el: Renamed the drafts group.
+ * rfc1522.el: New file.
- * gnus-agent.el (gnus-agent-lib-file): Changed name of directory.
+ * mm-util.el (mm-replace-chars-in-string): Copied here.
- * gnus-draft.el (gnus-draft-mode): Simplify.
+ * mm-encode.el (mm-q-encode-region): New function.
-1997-09-16 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
+ * qp.el (quoted-printable-encode-region): Take an optional CLASS
+ param.
- * gnus.el: Quassia Gnus v0.5 is released.
+ * mm-encode.el (mm-encode-word-region): Downcase.
-1997-09-15 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+1998-08-30 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
- * gnus-sum.el (gnus-alter-header-function): New variable.
- (gnus-nov-parse-line): Use it.
- (gnus-get-newsgroup-headers): Ditto.
+ * gnus.el: Pterodactyl Gnus v0.8 is released.
- * gnus-draft.el (gnus-group-send-drafts): Don't send when
- unplugged.
+1998-08-30 Lars Magne Ingebrigtsen <larsi@gnus.org>
- * gnus-sum.el (gnus-summary-read-group): Don't show-all when
- skipping groups.
+ * message.el (message-send-mail): Encode headers.
- * gnus-start.el (gnus-start-draft-setup): Changed name.
+ * qp.el (quoted-printable-encode-region): Encode 8-bit words.
+ (quoted-printable-encode-region): Upcase.
-1997-09-15 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
+ * message.el (message-default-charset): New variable.
- * gnus.el: Quassia Gnus v0.4 is released.
+ * qp.el (quoted-printable-encode-region): Optional param FOLD.
-1997-09-15 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+ * message.el (message-narrow-to-field): Changed name.
- * gnus-sum.el (gnus-summary-goto-article): Accept Message-ID's.
+ * mm-encode.el: New file.
-1997-09-14 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+ * message.el (message-narrow-to-header): New function.
- * gnus-sum.el (gnus-group-make-articles-read): No params.
+ * gnus-art.el (gnus-article-decode-mime-words): Place point in the
+ right buffer.
- * nndraft.el (nndraft-status-string): Fix.
+1998-08-30 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
- * gnus-draft.el (gnus-group-send-drafts): New command.
+ * gnus.el: Pterodactyl Gnus v0.7 is released.
- * gnus-sum.el (gnus-compute-read-articles): Separated.
- (gnus-update-read-articles): Allow computation.
+1998-08-30 Lars Magne Ingebrigtsen <larsi@gnus.org>
- * nndraft.el (nndraft-articles): New function.
+ * gnus.el: Remove autoload for
+ gnus-article-mime-decode-quoted-printable.
- * message.el (message-send): Disabled test.
+ * mm-decode.el (mm-charset-to-coding-system): Allow iso-8859-1 to
+ be decoded in non-MULE Emacsen.
-1997-09-14 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
+1998-08-30 Lars Magne Ingebrigtsen <larsi@gnus.org>
- * gnus.el: Quassia Gnus v0.3 is released.
+ * mm-decode.el: Check for coding-system-list.
-1997-09-14 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+1998-08-30 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
- * gnus-agent.el (gnus-agent-short-article): New variables.
+ * gnus.el: Pterodactyl Gnus v0.6 is released.
- * message.el (message-set-auto-save-file-name): Use drafts.
+1998-08-30 Lars Magne Ingebrigtsen <larsi@gnus.org>
- * nndraft.el (nndraft-request-expire-articles): Use it.
+ * nnheader.el (fboundp): Protect code-coding-string.
- * nnmh.el (nnmh-deletable-article-p): Change.
- (nnmh-allow-delete-final): New variable.
+ * gnus-art.el (gnus-article-mode): Check that set-buffer-multibyte
+ is available.
- * gnus-msg.el (gnus-summary-send-draft): Removed.
+1998-08-30 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
- * gnus.el (gnus-article-mark-lists): Save unsendable marks.
+ * gnus.el: Pterodactyl Gnus v0.5 is released.
- * gnus-sum.el (gnus-newsgroup-unsendable): New variable.
+1998-08-30 Lars Magne Ingebrigtsen <larsi@gnus.org>
- * gnus-draft.el: New file.
+ * gnus-art.el (gnus-article-mode): Make article buffer multibyte.
+ (gnus-hack-decode-rfc1522): Removed.
- * gnus-sum.el (gnus-unsendable-mark): New variable.
+ * mm-decode.el (mm-charset-coding-system-alist): Check better.
- * nndraft.el (nndraft-execute-nnmh-command): Cleanup.
+1998-08-30 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
- * message.el (message-send-news): Use `gnus-request-post'.
+ * gnus.el: Gnus v0.4 is released.
- * gnus-agent.el (gnus-agentize): New command.
+1998-08-29 Lars Magne Ingebrigtsen <larsi@gnus.org>
- * gnus-bcklg.el (gnus-backlog-remove-article): Remove the ident
- from the list.
+ * gnus-art.el (gnus-article-decode-mime-words): New command and
+ keystroke.
-1997-09-14 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
+ * qp.el (quoted-printable-decode-region): Don't use hexl.
- * gnus.el: Quassia Gnus v0.2 is released.
+ * gnus-sum.el (gnus-parse-headers-hook): Default to nil.
+ (gnus-structured-field-decoder): Removed.
+ (gnus-unstructured-field-decoder): Ditto.
-1997-09-14 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+ * mm-decode.el: New file.
- * gnus-score.el (gnus-score-headers): Make sure the summary buffer
- exists.
+ * qp.el: New file.
-1997-09-13 Greg Stark <gsstark@mit.edu>
+ * gnus-art.el (article-mime-decode-quoted-printable): Removed.
- * gnus-ems.el (gnus-x-splash): New function.
+ * gnus-ems.el (fboundp): Removed gnus-split-string.
-1997-09-13 Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+ * gnus.el (gnus-splash-face): Doc fix.
- * gnus-start.el (gnus-1): Use it.
+ * gnus-ems.el (fboundp): Don't bind mail-file-babyl-p.
- * gnus-ems.el (gnus-decode-coding-string): New alias.
+ * gnus-art.el (article-mime-decode-quoted-printable): Don't use
+ hexl.
- * message.el (message-unix-mail-delimiter): Dox fox.
+ * nnheader.el (nnheader-temp-write): Removed.
- * nnmh.el (nnmh-request-list-1): Don't use coding system.
+1998-08-29 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
- * gnus-sum.el (gnus-summary-catchup): Reverse logic.
+ * gnus.el: Gnus v0.3 is released.
-1997-09-13 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
+1998-08-29 Lars Magne Ingebrigtsen <larsi@menja.ifi.uio.no>
- * gnus.el: Quassia Gnus v0.1 is released.
+ * gnus.el: Gnus v0.2 is released.
;; Local Variables:
-;; coding: iso-2022-7bit-unix
+;; coding: iso-2022-7bit
;; End:
--- /dev/null
+;;; binhex.el -- elisp native binhex decode
+;; Copyright (c) 1998 Free Software Foundation, Inc.
+
+;; Author: Shenghuo Zhu <zsh@cs.rochester.edu>
+;; Create Date: Oct 1, 1998
+;; Keywords: binhex news
+
+;; This file is part of GNU Emacs.
+
+;; GNU Emacs 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 Emacs 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 Emacs; see the file COPYING. If not, write to the
+;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;; Boston, MA 02111-1307, USA.
+
+;;; Commentary:
+
+;;; Code:
+
+(eval-when-compile (require 'cl))
+
+(if (not (fboundp 'char-int))
+ (fset 'char-int 'identity))
+
+(defvar binhex-decoder-program "hexbin"
+ "*Non-nil value should be a string that names a uu decoder.
+The program should expect to read binhex data on its standard
+input and write the converted data to its standard output.")
+
+(defvar binhex-decoder-switches '("-d")
+ "*List of command line flags passed to the command named by binhex-decoder-program.")
+
+(defconst binhex-alphabet-decoding-alist
+ '(( ?\! . 0) ( ?\" . 1) ( ?\# . 2) ( ?\$ . 3) ( ?\% . 4) ( ?\& . 5)
+ ( ?\' . 6) ( ?\( . 7) ( ?\) . 8) ( ?\* . 9) ( ?\+ . 10) ( ?\, . 11)
+ ( ?\- . 12) ( ?0 . 13) ( ?1 . 14) ( ?2 . 15) ( ?3 . 16) ( ?4 . 17)
+ ( ?5 . 18) ( ?6 . 19) ( ?8 . 20) ( ?9 . 21) ( ?@ . 22) ( ?A . 23)
+ ( ?B . 24) ( ?C . 25) ( ?D . 26) ( ?E . 27) ( ?F . 28) ( ?G . 29)
+ ( ?H . 30) ( ?I . 31) ( ?J . 32) ( ?K . 33) ( ?L . 34) ( ?M . 35)
+ ( ?N . 36) ( ?P . 37) ( ?Q . 38) ( ?R . 39) ( ?S . 40) ( ?T . 41)
+ ( ?U . 42) ( ?V . 43) ( ?X . 44) ( ?Y . 45) ( ?Z . 46) ( ?\[ . 47)
+ ( ?\` . 48) ( ?a . 49) ( ?b . 50) ( ?c . 51) ( ?d . 52) ( ?e . 53)
+ ( ?f . 54) ( ?h . 55) ( ?i . 56) ( ?j . 57) ( ?k . 58) ( ?l . 59)
+ ( ?m . 60) ( ?p . 61) ( ?q . 62) ( ?r . 63)))
+
+(defun binhex-char-map (char)
+ (cdr (assq char binhex-alphabet-decoding-alist)))
+
+;;;###autoload
+(defconst binhex-begin-line
+ "^:...............................................................$")
+(defconst binhex-body-line
+ "^[^:]...............................................................$")
+(defconst binhex-end-line ":$")
+
+(defvar binhex-temporary-file-directory
+ (cond ((fboundp 'temp-directory) (temp-directory))
+ ((boundp 'temporary-file-directory) temporary-file-directory)
+ ("/tmp/")))
+
+(if (string-match "XEmacs" emacs-version)
+ (defalias 'binhex-insert-char 'insert-char)
+ (defun binhex-insert-char (char &optional count ignored buffer)
+ (if (or (null buffer) (eq buffer (current-buffer)))
+ (insert-char char count)
+ (with-current-buffer buffer
+ (insert-char char count)))))
+
+(defvar binhex-crc-table
+ [0 4129 8258 12387 16516 20645 24774 28903
+ 33032 37161 41290 45419 49548 53677 57806 61935
+ 4657 528 12915 8786 21173 17044 29431 25302
+ 37689 33560 45947 41818 54205 50076 62463 58334
+ 9314 13379 1056 5121 25830 29895 17572 21637
+ 42346 46411 34088 38153 58862 62927 50604 54669
+ 13907 9842 5649 1584 30423 26358 22165 18100
+ 46939 42874 38681 34616 63455 59390 55197 51132
+ 18628 22757 26758 30887 2112 6241 10242 14371
+ 51660 55789 59790 63919 35144 39273 43274 47403
+ 23285 19156 31415 27286 6769 2640 14899 10770
+ 56317 52188 64447 60318 39801 35672 47931 43802
+ 27814 31879 19684 23749 11298 15363 3168 7233
+ 60846 64911 52716 56781 44330 48395 36200 40265
+ 32407 28342 24277 20212 15891 11826 7761 3696
+ 65439 61374 57309 53244 48923 44858 40793 36728
+ 37256 33193 45514 41451 53516 49453 61774 57711
+ 4224 161 12482 8419 20484 16421 28742 24679
+ 33721 37784 41979 46042 49981 54044 58239 62302
+ 689 4752 8947 13010 16949 21012 25207 29270
+ 46570 42443 38312 34185 62830 58703 54572 50445
+ 13538 9411 5280 1153 29798 25671 21540 17413
+ 42971 47098 34713 38840 59231 63358 50973 55100
+ 9939 14066 1681 5808 26199 30326 17941 22068
+ 55628 51565 63758 59695 39368 35305 47498 43435
+ 22596 18533 30726 26663 6336 2273 14466 10403
+ 52093 56156 60223 64286 35833 39896 43963 48026
+ 19061 23124 27191 31254 2801 6864 10931 14994
+ 64814 60687 56684 52557 48554 44427 40424 36297
+ 31782 27655 23652 19525 15522 11395 7392 3265
+ 61215 65342 53085 57212 44955 49082 36825 40952
+ 28183 32310 20053 24180 11923 16050 3793 7920])
+
+(defun binhex-update-crc (crc char &optional count)
+ (if (null count) (setq count 1))
+ (while (> count 0)
+ (setq crc (logxor (logand (lsh crc 8) 65280)
+ (aref binhex-crc-table
+ (logxor (logand (lsh crc -8) 255)
+ char)))
+ count (1- count)))
+ crc)
+
+(defun binhex-verify-crc (buffer start end)
+ (with-current-buffer buffer
+ (let ((pos start) (crc 0) (last (- end 2)))
+ (while (< pos last)
+ (setq crc (binhex-update-crc crc (char-after pos))
+ pos (1+ pos)))
+ (if (= crc (binhex-string-big-endian (buffer-substring last end)))
+ nil
+ (error "CRC error")))))
+
+(defun binhex-string-big-endian (string)
+ (let ((ret 0) (i 0) (len (length string)))
+ (while (< i len)
+ (setq ret (+ (lsh ret 8) (char-int (aref string i)))
+ i (1+ i)))
+ ret))
+
+(defun binhex-string-little-endian (string)
+ (let ((ret 0) (i 0) (shift 0) (len (length string)))
+ (while (< i len)
+ (setq ret (+ ret (lsh (char-int (aref string i)) shift))
+ i (1+ i)
+ shift (+ shift 8)))
+ ret))
+
+(defun binhex-header (buffer)
+ (with-current-buffer buffer
+ (let ((pos (point-min)) len)
+ (vector
+ (prog1
+ (setq len (char-int (char-after pos)))
+ (setq pos (1+ pos)))
+ (buffer-substring pos (setq pos (+ pos len)))
+ (prog1
+ (setq len (char-int (char-after pos)))
+ (setq pos (1+ pos)))
+ (buffer-substring pos (setq pos (+ pos 4)))
+ (buffer-substring pos (setq pos (+ pos 4)))
+ (binhex-string-big-endian
+ (buffer-substring pos (setq pos (+ pos 2))))
+ (binhex-string-big-endian
+ (buffer-substring pos (setq pos (+ pos 4))))
+ (binhex-string-big-endian
+ (buffer-substring pos (setq pos (+ pos 4))))))))
+
+(defvar binhex-last-char)
+(defvar binhex-repeat)
+
+(defun binhex-push-char (char &optional count ignored buffer)
+ (cond
+ (binhex-repeat
+ (if (eq char 0)
+ (binhex-insert-char (setq binhex-last-char 144) 1
+ ignored buffer)
+ (binhex-insert-char binhex-last-char (- char 1)
+ ignored buffer)
+ (setq binhex-last-char nil))
+ (setq binhex-repeat nil))
+ ((= char 144)
+ (setq binhex-repeat t))
+ (t
+ (binhex-insert-char (setq binhex-last-char char) 1 ignored buffer))))
+
+(defun binhex-decode-region (start end &optional header-only)
+ "Binhex decode region between START and END.
+If HEADER-ONLY is non-nil only decode header and return filename."
+ (interactive "r")
+ (let ((work-buffer nil)
+ (counter 0)
+ (bits 0) (tmp t)
+ (lim 0) inputpos
+ (non-data-chars " \t\n\r:")
+ file-name-length data-fork-start
+ header
+ binhex-last-char binhex-repeat)
+ (unwind-protect
+ (save-excursion
+ (goto-char start)
+ (when (re-search-forward binhex-begin-line end t)
+ (if (and (not (string-match "XEmacs\\|Lucid" emacs-version))
+ (boundp 'enable-multibyte-characters))
+ (let ((multibyte
+ (default-value 'enable-multibyte-characters)))
+ (setq-default enable-multibyte-characters nil)
+ (setq work-buffer (generate-new-buffer " *binhex-work*"))
+ (setq-default enable-multibyte-characters multibyte))
+ (setq work-buffer (generate-new-buffer " *binhex-work*")))
+ (buffer-disable-undo work-buffer)
+ (beginning-of-line)
+ (setq bits 0 counter 0)
+ (while tmp
+ (skip-chars-forward non-data-chars end)
+ (setq inputpos (point))
+ (end-of-line)
+ (setq lim (point))
+ (while (and (< inputpos lim)
+ (setq tmp (binhex-char-map (char-after inputpos))))
+ (setq bits (+ bits tmp)
+ counter (1+ counter)
+ inputpos (1+ inputpos))
+ (cond ((= counter 4)
+ (binhex-push-char (lsh bits -16) 1 nil work-buffer)
+ (binhex-push-char (logand (lsh bits -8) 255) 1 nil
+ work-buffer)
+ (binhex-push-char (logand bits 255) 1 nil
+ work-buffer)
+ (setq bits 0 counter 0))
+ (t (setq bits (lsh bits 6)))))
+ (if (null file-name-length)
+ (with-current-buffer work-buffer
+ (setq file-name-length (char-after (point-min))
+ data-fork-start (+ (point-min)
+ file-name-length 22))))
+ (if (and (null header)
+ (with-current-buffer work-buffer
+ (>= (buffer-size) data-fork-start)))
+ (progn
+ (binhex-verify-crc work-buffer
+ 1 data-fork-start)
+ (setq header (binhex-header work-buffer))
+ (if header-only (setq tmp nil counter 0))))
+ (setq tmp (and tmp (not (eq inputpos end)))))
+ (cond
+ ((= counter 3)
+ (binhex-push-char (logand (lsh bits -16) 255) 1 nil
+ work-buffer)
+ (binhex-push-char (logand (lsh bits -8) 255) 1 nil
+ work-buffer))
+ ((= counter 2)
+ (binhex-push-char (logand (lsh bits -10) 255) 1 nil
+ work-buffer))))
+ (if header-only nil
+ (binhex-verify-crc work-buffer
+ data-fork-start
+ (+ data-fork-start (aref header 6) 2))
+ (or (markerp end) (setq end (set-marker (make-marker) end)))
+ (goto-char start)
+ (insert-buffer-substring work-buffer
+ data-fork-start (+ data-fork-start
+ (aref header 6)))
+ (delete-region (point) end)))
+ (and work-buffer (kill-buffer work-buffer)))
+ (if header (aref header 1))))
+
+(defun binhex-decode-region-external (start end)
+ "Binhex decode region between START and END using external decoder."
+ (interactive "r")
+ (let ((cbuf (current-buffer)) firstline work-buffer status
+ (file-name (concat binhex-temporary-file-directory
+ (binhex-decode-region start end t)
+ ".data")))
+ (save-excursion
+ (goto-char start)
+ (when (re-search-forward binhex-begin-line nil t)
+ (let ((cdir default-directory) default-process-coding-system)
+ (unwind-protect
+ (progn
+ (set-buffer (setq work-buffer
+ (generate-new-buffer " *binhex-work*")))
+ (buffer-disable-undo work-buffer)
+ (insert-buffer-substring cbuf firstline end)
+ (cd binhex-temporary-file-directory)
+ (apply 'call-process-region
+ (point-min)
+ (point-max)
+ binhex-decoder-program
+ nil
+ nil
+ nil
+ binhex-decoder-switches))
+ (cd cdir) (set-buffer cbuf)))
+ (if (and file-name (file-exists-p file-name))
+ (progn
+ (goto-char start)
+ (delete-region start end)
+ (let (format-alist)
+ (insert-file-contents-literally file-name)))
+ (error "Can not binhex")))
+ (and work-buffer (kill-buffer work-buffer))
+ (ignore-errors
+ (if file-name (delete-file file-name))))))
+
+(provide 'binhex)
+
+;;; binhex.el ends here
--- /dev/null
+;;; flow-fill.el --- interprete RFC2646 "flowed" text
+
+;; Copyright (C) 2000 Free Software Foundation, Inc.
+
+;; Author: Simon Josefsson <jas@pdc.kth.se>
+;; Keywords: mail
+
+;; This file is part of GNU Emacs.
+
+;; GNU Emacs 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 Emacs 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 Emacs; see the file COPYING. If not, write to the
+;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;; Boston, MA 02111-1307, USA.
+
+;;; Commentary:
+
+;; This implement decoding of RFC2646 formatted text, including the
+;; quoted-depth wins rules.
+
+;; Theory of operation: search for lines ending with SPC, save quote
+;; length of line, remove SPC and concatenate line with the following
+;; line if quote length of following line matches current line.
+
+;; When no further concatenations are possible, we've found a
+;; paragraph and we let `fill-region' fill the long line into several
+;; lines with the quote prefix as `fill-prefix'.
+
+;; Todo: encoding
+
+;; History:
+
+;; 2000-02-17 posted on ding mailing list
+;; 2000-02-19 use `point-at-{b,e}ol' in XEmacs
+;; 2000-03-11 no compile warnings for point-at-bol stuff
+;; 2000-03-26 commited to gnus cvs
+
+;;; Code:
+
+(eval-and-compile
+ (defalias 'fill-flowed-point-at-bol
+ (if (fboundp 'point-at-bol)
+ 'point-at-bol
+ 'line-beginning-position))
+
+ (defalias 'fill-flowed-point-at-eol
+ (if (fboundp 'point-at-eol)
+ 'point-at-eol
+ 'line-end-position)))
+
+(defun fill-flowed (&optional buffer)
+ (save-excursion
+ (set-buffer (or (current-buffer) buffer))
+ (goto-char (point-min))
+ (while (re-search-forward " $" nil t)
+ (when (save-excursion
+ (beginning-of-line)
+ (looking-at "^\\(>*\\)\\( ?\\)"))
+ (let ((quote (match-string 1)))
+ (if (string= quote "")
+ (setq quote nil))
+ (when (and quote (string= (match-string 2) ""))
+ (save-excursion
+ ;; insert SP after quote for pleasant reading of quoted lines
+ (beginning-of-line)
+ (when (> (skip-chars-forward ">") 0)
+ (insert " "))))
+ (while (and (save-excursion
+ (backward-char 3)
+ (looking-at "[^-][^-] "))
+ (save-excursion
+ (unless (eobp)
+ (forward-char 1)
+ (if quote
+ (looking-at (format "^\\(%s\\)\\([^>]\\)" quote))
+ (looking-at "^ ?")))))
+ (save-excursion
+ (replace-match (if (string= (match-string 2) " ")
+ "" "\\2")))
+ (backward-delete-char -1)
+ (end-of-line))
+ (let ((fill-prefix (when quote (concat quote " "))))
+ (fill-region (fill-flowed-point-at-bol)
+ (fill-flowed-point-at-eol)
+ 'left 'nosqueeze)))))))
+
+(provide 'flow-fill)
+
+;;; flow-fill.el ends here
--- /dev/null
+;;; format-spec.el --- functions for formatting arbitrary formatting strings
+;; Copyright (C) 1999, 2000 Free Software Foundation, Inc.
+
+;; Author: Lars Magne Ingebrigtsen <larsi@gnus.org>
+;; Keywords: tools
+
+;; This file is part of GNU Emacs.
+
+;; GNU Emacs 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 Emacs 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 Emacs; see the file COPYING. If not, write to the
+;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;; Boston, MA 02111-1307, USA.
+
+;;; Commentary:
+
+;;; Code:
+
+(eval-when-compile (require 'cl))
+
+(defun format-spec (format specification)
+ "Return a string based on FORMAT and SPECIFICATION.
+FORMAT is a string containing `format'-like specs like \"bash %u %k\",
+while SPECIFICATION is an alist mapping from format spec characters
+to values."
+ (with-temp-buffer
+ (insert format)
+ (goto-char (point-min))
+ (while (search-forward "%" nil t)
+ (cond
+ ;; Quoted percent sign.
+ ((eq (char-after) ?%)
+ (delete-char 1))
+ ;; Valid format spec.
+ ((looking-at "\\([-0-9.]*\\)\\([a-zA-Z]\\)")
+ (let* ((num (match-string 1))
+ (spec (string-to-char (match-string 2)))
+ (val (cdr (assq spec specification))))
+ (delete-region (1- (match-beginning 0)) (match-end 0))
+ (unless val
+ (error "Invalid format character: %s" spec))
+ (insert (format (concat "%" num "s") val))))
+ ;; Signal an error on bogus format strings.
+ (t
+ (error "Invalid format string"))))
+ (buffer-string)))
+
+(defun format-spec-make (&rest pairs)
+ "Return an alist suitable for use in `format-spec' based on PAIRS.
+PAIRS is a list where every other element is a character and a value,
+starting with a character."
+ (let (alist)
+ (while pairs
+ (unless (cdr pairs)
+ (error "Invalid list of pairs"))
+ (push (cons (car pairs) (cadr pairs)) alist)
+ (setq pairs (cddr pairs)))
+ (nreverse alist)))
+
+(provide 'format-spec)
+
+;;; format-spec.el ends here
+++ /dev/null
-;;; gnus-load.el --- automatically extracted custom dependencies
-;;
-;;; Code:
-
-(put 'nnmail 'custom-loads '("nnmail"))
-(put 'gnus-article-emphasis 'custom-loads '("gnus-art"))
-(put 'gnus-article-headers 'custom-loads '("gnus-sum" "gnus-art"))
-(put 'nnmail-procmail 'custom-loads '("nnmail"))
-(put 'gnus-score-kill 'custom-loads '("gnus-kill"))
-(put 'gnus-visual 'custom-loads '("smiley" "gnus" "gnus-picon" "gnus-art" "earcon"))
-(put 'gnus-score-expire 'custom-loads '("gnus-score" "gnus-kill"))
-(put 'gnus-summary-maneuvering 'custom-loads '("gnus-sum"))
-(put 'gnus-start 'custom-loads '("gnus" "gnus-util" "gnus-start" "gnus-int" "gnus-group"))
-(put 'gnus-extract-view 'custom-loads '("gnus-uu" "gnus-sum"))
-(put 'gnus-various 'custom-loads '("gnus-sum"))
-(put 'gnus-article-washing 'custom-loads '("gnus-art"))
-(put 'gnus-score-files 'custom-loads '("gnus-score"))
-(put 'message-news 'custom-loads '("message"))
-(put 'gnus-thread 'custom-loads '("gnus-sum"))
-(put 'languages 'custom-loads '("cus-edit"))
-(put 'development 'custom-loads '("cus-edit"))
-(put 'gnus-treading 'custom-loads '("gnus-sum"))
-(put 'nnmail-various 'custom-loads '("nnmail"))
-(put 'extensions 'custom-loads '("wid-edit"))
-(put 'message-various 'custom-loads '("message"))
-(put 'gnus-summary-exit 'custom-loads '("gnus-sum"))
-(put 'news 'custom-loads '("message" "gnus"))
-(put 'gnus 'custom-loads '("nnmail" "gnus" "gnus-win" "gnus-uu" "gnus-eform" "gnus-dup" "gnus-demon" "gnus-cache" "gnus-async" "gnus-art"))
-(put 'gnus-summary-visual 'custom-loads '("gnus-sum"))
-(put 'gnus-group-listing 'custom-loads '("gnus-group"))
-(put 'gnus-score 'custom-loads '("gnus" "gnus-nocem"))
-(put 'gnus-group-select 'custom-loads '("gnus-sum"))
-(put 'message-buffers 'custom-loads '("message"))
-(put 'gnus-threading 'custom-loads '("gnus-sum"))
-(put 'gnus-score-decay 'custom-loads '("gnus-score"))
-(put 'help 'custom-loads '("cus-edit"))
-(put 'gnus-nocem 'custom-loads '("gnus-nocem"))
-(put 'gnus-cite 'custom-loads '("gnus-cite"))
-(put 'gnus-demon 'custom-loads '("gnus-demon"))
-(put 'gnus-message 'custom-loads '("message"))
-(put 'gnus-score-default 'custom-loads '("gnus-sum" "gnus-score"))
-(put 'nnmail-duplicate 'custom-loads '("nnmail"))
-(put 'message-interface 'custom-loads '("message"))
-(put 'nnmail-files 'custom-loads '("nnmail"))
-(put 'gnus-edit-form 'custom-loads '("gnus-eform"))
-(put 'emacs 'custom-loads '("cus-edit"))
-(put 'gnus-summary-mail 'custom-loads '("gnus-sum"))
-(put 'gnus-topic 'custom-loads '("gnus-topic"))
-(put 'wp 'custom-loads '("cus-edit"))
-(put 'gnus-summary-choose 'custom-loads '("gnus-sum"))
-(put 'widget-browse 'custom-loads '("wid-browse"))
-(put 'external 'custom-loads '("cus-edit"))
-(put 'message-headers 'custom-loads '("message"))
-(put 'message-forwarding 'custom-loads '("message"))
-(put 'message-faces 'custom-loads '("message"))
-(put 'environment 'custom-loads '("cus-edit"))
-(put 'gnus-article-mime 'custom-loads '("gnus-sum" "gnus-art"))
-(put 'gnus-duplicate 'custom-loads '("gnus-dup"))
-(put 'nnmail-retrieve 'custom-loads '("nnmail"))
-(put 'widgets 'custom-loads '("wid-edit" "wid-browse"))
-(put 'earcon 'custom-loads '("earcon"))
-(put 'hypermedia 'custom-loads '("wid-edit"))
-(put 'gnus-group-levels 'custom-loads '("gnus-group"))
-(put 'gnus-summary-format 'custom-loads '("gnus-sum"))
-(put 'gnus-files 'custom-loads '("nnmail" "gnus"))
-(put 'gnus-windows 'custom-loads '("gnus-win"))
-(put 'gnus-article-buttons 'custom-loads '("gnus-art"))
-(put 'gnus-summary 'custom-loads '("gnus" "gnus-sum"))
-(put 'gnus-article-hiding 'custom-loads '("gnus-sum" "gnus-art"))
-(put 'gnus-group 'custom-loads '("gnus" "gnus-topic"))
-(put 'gnus-article-various 'custom-loads '("gnus-sum" "gnus-art"))
-(put 'gnus-summary-marks 'custom-loads '("gnus-sum"))
-(put 'gnus-article-saving 'custom-loads '("gnus-art"))
-(put 'nnmail-expire 'custom-loads '("nnmail"))
-(put 'message-mail 'custom-loads '("message"))
-(put 'faces 'custom-loads '("wid-edit" "cus-edit" "message" "gnus"))
-(put 'gnus-summary-various 'custom-loads '("gnus-sum"))
-(put 'applications 'custom-loads '("cus-edit"))
-(put 'gnus-extract-archive 'custom-loads '("gnus-uu"))
-(put 'message 'custom-loads '("message"))
-(put 'message-sending 'custom-loads '("message"))
-(put 'editing 'custom-loads '("cus-edit"))
-(put 'gnus-score-adapt 'custom-loads '("gnus-score"))
-(put 'message-insertion 'custom-loads '("message"))
-(put 'gnus-extract-post 'custom-loads '("gnus-uu"))
-(put 'mail 'custom-loads '("message" "gnus"))
-(put 'gnus-summary-sort 'custom-loads '("gnus-sum"))
-(put 'customize 'custom-loads '("wid-edit" "custom" "cus-face" "cus-edit"))
-(put 'nnmail-split 'custom-loads '("nnmail"))
-(put 'gnus-asynchronous 'custom-loads '("gnus-async"))
-(put 'gnus-article-highlight 'custom-loads '("gnus-art"))
-(put 'gnus-extract 'custom-loads '("gnus-uu"))
-(put 'gnus-article 'custom-loads '("gnus-cite" "gnus-art"))
-(put 'gnus-group-foreign 'custom-loads '("gnus-group"))
-(put 'programming 'custom-loads '("cus-edit"))
-(put 'nnmail-prepare 'custom-loads '("nnmail"))
-(put 'picons 'custom-loads '("gnus-picon"))
-(put 'gnus-article-signature 'custom-loads '("gnus-art"))
-(put 'gnus-group-various 'custom-loads '("gnus-group"))
-
-(provide 'gnus-load)
-
-;;; gnus-load.el ends here
--- /dev/null
+;;; gnus-ml.el --- Mailing list minor mode for Gnus
+
+;; Copyright (C) 2000 Free Software Foundation, Inc.
+
+;; Author: Julien Gilles <jgilles@free.fr>
+;; Keywords: news
+
+;; This file is part of GNU Emacs.
+
+;; GNU Emacs 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 Emacs 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 Emacs; see the file COPYING. If not, write to the
+;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;; Boston, MA 02111-1307, USA.
+
+;;; Commentary:
+
+;; implement (small subset of) RFC 2369
+
+;;; Code:
+
+(require 'gnus)
+(eval-when-compile (require 'cl))
+
+;;; Mailing list minor mode
+
+(defvar gnus-mailing-list-mode nil
+ "Minor mode for providing mailing-list commands.")
+
+(defvar gnus-mailing-list-mode-map nil)
+
+(unless gnus-mailing-list-mode-map
+ (setq gnus-mailing-list-mode-map (make-sparse-keymap))
+
+ (gnus-define-keys gnus-mailing-list-mode-map
+ "\C-nh" gnus-mailing-list-help
+ "\C-ns" gnus-mailing-list-subscribe
+ "\C-nu" gnus-mailing-list-unsubscribe
+ "\C-np" gnus-mailing-list-post
+ "\C-no" gnus-mailing-list-owner
+ "\C-na" gnus-mailing-list-archive
+ ))
+
+(defun gnus-mailing-list-make-menu-bar ()
+ (unless (boundp 'gnus-mailing-list-menu)
+ (easy-menu-define
+ gnus-mailing-list-menu gnus-mailing-list-mode-map ""
+ '("Mailing-Lists"
+ ["Get help" gnus-mailing-list-help t]
+ ["Subscribe" gnus-mailing-list-subscribe t]
+ ["Unsubscribe" gnus-mailing-list-unsubscribe t]
+ ["Post a message" gnus-mailing-list-post t]
+ ["Mail to owner" gnus-mailing-list-owner t]
+ ["Browse archive" gnus-mailing-list-archive t]))))
+
+(defun turn-on-gnus-mailing-list-mode ()
+ (when (gnus-group-get-parameter group 'to-list)
+ (gnus-mailing-list-mode 1)))
+
+(defun gnus-mailing-list-mode (&optional arg)
+ "Minor mode for providing mailing-list commands.
+
+\\{gnus-mailing-list-mode-map}"
+ (interactive "P")
+ (when (eq major-mode 'gnus-summary-mode)
+ (when (set (make-local-variable 'gnus-mailing-list-mode)
+ (if (null arg) (not gnus-mailing-list-mode)
+ (> (prefix-numeric-value arg) 0)))
+ ;; Set up the menu.
+ (when (gnus-visual-p 'mailing-list-menu 'menu)
+ (gnus-mailing-list-make-menu-bar))
+ (gnus-add-minor-mode 'gnus-mailing-list-mode " Mailing-List" gnus-mailing-list-mode-map)
+ (gnus-run-hooks 'gnus-mailing-list-mode-hook))))
+
+;;; Commands
+
+(defun gnus-mailing-list-help ()
+ "Get help from mailing list server."
+ (interactive)
+ (cond (list-help (gnus-mailing-list-message list-help))
+ (t (display-message 'no-log "no list-help in this group"))))
+
+(defun gnus-mailing-list-subscribe ()
+ "Subscribe"
+ (interactive)
+ (cond (list-subscribe (gnus-mailing-list-message list-subscribe))
+ (t (display-message 'no-log "no list-subscribe in this group"))))
+
+
+(defun gnus-mailing-list-unsubscribe ()
+ "Unsubscribe"
+ (interactive)
+ (cond (list-unsubscribe (gnus-mailing-list-message list-unsubscribe))
+ (t (display-message 'no-log "no list-unsubscribe in this group"))))
+
+(defun gnus-mailing-list-post ()
+ "Post message (really useful ?)"
+ (interactive)
+ (cond (list-post (gnus-mailing-list-message list-post))
+ (t (display-message 'no-log "no list-post in this group")))
+ )
+
+(defun gnus-mailing-list-owner ()
+ "Mail to the owner"
+ (interactive)
+ (cond (list-owner (gnus-mailing-list-message list-owner))
+ (t (display-message 'no-log "no list-owner in this group")))
+ )
+
+(defun gnus-mailing-list-archive ()
+ "Browse archive"
+ (interactive)
+ (cond (list-archive (gnus-mailing-list-message list-archive))
+ (t (display-message 'no-log "no list-owner in this group")))
+ )
+
+;;; Utility functions
+
+(defun gnus-xmas-mailing-list-menu-add ()
+ (gnus-xmas-menu-add mailing-list
+ gnus-mailing-list-menu))
+
+(add-hook 'gnus-mailing-list-mode-hook 'gnus-xmas-mailing-list-menu-add)
+
+(defun gnus-mailing-list-message (address)
+ ""
+ (let ((mailto "")
+ (to ())
+ (subject "None")
+ (body "")
+ )
+ (cond
+ ((string-match "<mailto:\\([^>]*\\)>" address)
+ (let ((args (match-string 1 address)))
+ (cond ; with param
+ ((string-match "\\(.*\\)\\?\\(.*\\)" args)
+ (setq mailto (match-string 1 args))
+ (let ((param (match-string 2 args)))
+ (if (string-match "subject=\\([^&]*\\)" param)
+ (setq subject (match-string 1 param)))
+ (if (string-match "body=\\([^&]*\\)" param)
+ (setq body (match-string 1 param)))
+ (if (string-match "to=\\([^&]*\\)" param)
+ (push (match-string 1 param) to))
+ ))
+ (t (setq mailto args))))) ; without param
+
+ ; other case <http://... to be done.
+ (t nil))
+ (gnus-setup-message 'message (message-mail mailto subject))
+ (insert body)
+ ))
+
+(provide 'gnus-ml)
+
+;;; gnus-ml.el ends here
--- /dev/null
+;;; gnus-mlspl.el --- a group params-based mail splitting mechanism
+
+;; Copyright (C) 1998, 1999, 2000 Free Software Foundation, Inc.
+
+;; Author: Alexandre Oliva <oliva@lsd.ic.unicamp.br>
+;; Keywords: news, mail
+
+;; This file is part of GNU Emacs.
+
+;; GNU Emacs 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 Emacs 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 Emacs; see the file COPYING. If not, write to the
+;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;; Boston, MA 02111-1307, USA.
+
+(require 'gnus)
+(require 'gnus-sum)
+(require 'gnus-group)
+(require 'nnmail)
+
+(defvar gnus-group-split-updated-hook nil
+ "Hook called just after nnmail-split-fancy is updated by gnus-group-split-update.")
+
+(defvar gnus-group-split-default-catch-all-group "mail.misc"
+ "Group used by gnus-group-split and gnus-group-split-update as default catch-all group.")
+
+;;;###autoload
+(defun gnus-group-split-setup (&optional auto-update catch-all)
+ "Set up the split for nnmail-split-fancy.
+Sets things up so that nnmail-split-fancy is used for mail
+splitting, and defines the variable nnmail-split-fancy according with
+group parameters.
+
+If AUTO-UPDATE is non-nil (prefix argument accepted, if called
+interactively), it makes sure nnmail-split-fancy is re-computed before
+getting new mail, by adding gnus-group-split-update to
+nnmail-pre-get-new-mail-hook."
+ (interactive "P")
+ (setq nnmail-split-methods 'nnmail-split-fancy)
+ (when catch-all
+ (setq gnus-group-split-default-catch-all-group catch-all))
+ (gnus-group-split-update)
+ (when auto-update
+ (add-hook 'nnmail-pre-get-new-mail-hook 'gnus-group-split-update)))
+
+;;;###autoload
+(defun gnus-group-split-update (&optional catch-all)
+ "Computes nnmail-split-fancy from group params.
+It does this by calling \(gnus-group-split-fancy nil nil DEFAULTGROUP)."
+ (interactive)
+ (setq nnmail-split-fancy
+ (gnus-group-split-fancy
+ nil nil (or catch-all gnus-group-split-default-catch-all-group)))
+ (run-hooks 'gnus-group-split-updated-hook))
+
+;;;###autoload
+(defun gnus-group-split ()
+ "Uses information from group parameters in order to split mail.
+See gnus-group-split-fancy for more information.
+
+If no group is defined as catch-all, the value of
+gnus-group-split-default-catch-all-group is used.
+
+gnus-group-split is a valid value for nnmail-split-methods."
+ (let (nnmail-split-fancy)
+ (gnus-group-split-update
+ gnus-group-split-default-catch-all-group)
+ (nnmail-split-fancy)))
+
+;;;###autoload
+(defun gnus-group-split-fancy
+ (&optional groups no-crosspost catch-all)
+ "Uses information from group parameters in order to split mail. It
+can be embedded into nnmail-split-fancy lists with the SPLIT
+
+\(: gnus-group-split-fancy GROUPS NO-CROSSPOST CATCH-ALL\)
+
+GROUPS may be a regular expression or a list of group names, that will
+be used to select candidate groups. If it is ommited or nil, all
+existing groups are considered.
+
+if NO-CROSSPOST is ommitted or nil, a & split will be returned,
+otherwise, a | split, that does not allow crossposting, will be
+returned.
+
+if CATCH-ALL is not nil, and there is no selected group whose
+SPLIT-REGEXP matches the empty string, nor is there a selected group
+whose SPLIT-SPEC is 'catch-all, this group name will be appended to
+the returned SPLIT list, as the last element in a '| SPLIT.
+
+For each selected group, a SPLIT is composed like this: if SPLIT-SPEC
+is specified, this split is returned as-is (unless it is nil: in this
+case, the group is ignored). Otherwise, if TO-ADDRESS, TO-LIST and/or
+EXTRA-ALIASES are specified, a regexp that matches any of them is
+constructed (extra-aliases may be a list). Additionally, if
+SPLIT-REGEXP is specified, the regexp will be extended so that it
+matches this regexp too, and if SPLIT-EXCLUDE is specified, RESTRICT
+clauses will be generated.
+
+For example, given the following group parameters:
+
+nnml:mail.bar:
+\((to-address . \"bar@femail.com\")
+ (split-regexp . \".*@femail\\\\.com\"))
+nnml:mail.foo:
+\((to-list . \"foo@nowhere.gov\")
+ (extra-aliases \"foo@localhost\" \"foo-redist@home\")
+ (split-exclude \"bugs-foo\" \"rambling-foo\")
+ (admin-address . \"foo-request@nowhere.gov\"))
+nnml:mail.others:
+\((split-spec . catch-all))
+
+Calling (gnus-group-split-fancy nil nil \"mail.misc\") returns:
+
+\(| (& (any \"\\\\(bar@femail\\\\.com\\\\|.*@femail\\\\.com\\\\)\"
+ \"mail.bar\")
+ (any \"\\\\(foo@nowhere\\\\.gov\\\\|foo@localhost\\\\|foo-redist@home\\\\)\"
+ - \"bugs-foo\" - \"rambling-foo\" \"mail.foo\"))
+ \"mail.others\")"
+ (let* ((newsrc (cdr gnus-newsrc-alist))
+ split)
+ (dolist (info newsrc)
+ (let ((group (gnus-info-group info))
+ (params (gnus-info-params info)))
+ ;; For all GROUPs that match the specified GROUPS
+ (when (or (not groups)
+ (and (listp groups)
+ (memq group groups))
+ (and (stringp groups)
+ (string-match groups group)))
+ (let ((split-spec (assoc 'split-spec params)) group-clean)
+ ;; Remove backend from group name
+ (setq group-clean (string-match ":" group))
+ (setq group-clean
+ (if group-clean
+ (substring group (1+ group-clean))
+ group))
+ (if split-spec
+ (when (setq split-spec (cdr split-spec))
+ (if (eq split-spec 'catch-all)
+ ;; Emit catch-all only when requested
+ (when catch-all
+ (setq catch-all group-clean))
+ ;; Append split-spec to the main split
+ (push split-spec split)))
+ ;; Let's deduce split-spec from other params
+ (let ((to-address (cdr (assoc 'to-address params)))
+ (to-list (cdr (assoc 'to-list params)))
+ (extra-aliases (cdr (assoc 'extra-aliases params)))
+ (split-regexp (cdr (assoc 'split-regexp params)))
+ (split-exclude (cdr (assoc 'split-exclude params))))
+ (when (or to-address to-list extra-aliases split-regexp)
+ ;; regexp-quote to-address, to-list and extra-aliases
+ ;; and add them all to split-regexp
+ (setq split-regexp
+ (concat
+ "\\("
+ (mapconcat
+ 'identity
+ (append
+ (and to-address (list (regexp-quote to-address)))
+ (and to-list (list (regexp-quote to-list)))
+ (and extra-aliases
+ (if (listp extra-aliases)
+ (mapcar 'regexp-quote extra-aliases)
+ (list extra-aliases)))
+ (and split-regexp (list split-regexp)))
+ "\\|")
+ "\\)"))
+ ;; Now create the new SPLIT
+ (push (append
+ (list 'any split-regexp)
+ ;; Generate RESTRICTs for SPLIT-EXCLUDEs.
+ (if (listp split-exclude)
+ (let ((seq split-exclude)
+ res)
+ (while seq
+ (push (cons '- (pop seq))
+ res))
+ (apply #'nconc (nreverse res)))
+ (list '- split-exclude))
+ (list group-clean))
+ split)
+ ;; If it matches the empty string, it is a catch-all
+ (when (string-match split-regexp "")
+ (setq catch-all nil)))))))))
+ ;; Add catch-all if not crossposting
+ (if (and catch-all no-crosspost)
+ (push split catch-all))
+ ;; Move it to the tail, while arranging that SPLITs appear in the
+ ;; same order as groups.
+ (setq split (reverse split))
+ ;; Decide whether to accept cross-postings or not.
+ (push (if no-crosspost '| '&) split)
+ ;; Even if we can cross-post, catch-all should not get
+ ;; cross-posts.
+ (if (and catch-all (not no-crosspost))
+ (setq split (list '| split catch-all)))
+ split))
+
+(provide 'gnus-mlspl)
+++ /dev/null
-;;; gnus-mule.el --- Provide multilingual environment to GNUS
-
-;; Copyright (C) 1995,1997 Free Software Foundation, Inc.
-;; Copyright (C) 1995 Electrotechnical Laboratory, JAPAN.
-
-;; Keywords: gnus, mule
-
-;; This file is part of GNU Emacs.
-
-;; GNU Emacs 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 Emacs 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 Emacs; see the file COPYING. If not, write to the
-;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-;; Boston, MA 02111-1307, USA.
-
-;;; Commentary:
-
-;; This package enables Gnus to code convert automatically
-;; accoding to a coding system specified for each news group.
-;; If you want to specify some coding system for a specific news
-;; group, add the fllowing line in your .emacs:
-;; (gnus-mule-add-group "xxx.yyy.zzz" 'some-coding-system)
-
-;; By default, only few news groups are registered as the target of
-;; code conversion. So, each regional users had better set an
-;; appropriate coding system for as below:
-;; (gnus-mule-add-group "" 'iso-2022-jp) ;; the case for Japanese
-
-(require 'nntp)
-
-(defvar gnus-newsgroup-coding-systems nil
- "Assoc list of news groups vs corresponding coding systems.
-Each element is has the form (PATTERN CODING-FOR-READ . CODING-FOR-POST),
-where,
-PATTERN is a regular expression matching news group names,
-CODING-FOR-READ is a coding system of articles of the news groups, and
-CODING-FOR-POST is a coding system to be encoded for posting articles
-to the news groups.")
-
-;;;###autoload
-(defun gnus-mule-add-group (name coding-system)
- "Specify that articles of news group NAME are encoded in CODING-SYSTEM.
-All news groups deeper than NAME are also the target.
-If CODING-SYSTEM is a cons, the car and cdr part are regarded as
-coding-system for reading and writing respectively."
- (if (not (consp coding-system))
- (setq coding-system (cons coding-system coding-system)))
- (setq name (concat "^" (regexp-quote name)))
- (let ((group (assoc name gnus-newsgroup-coding-systems)))
- (if group
- (setcdr group coding-system)
- (setq gnus-newsgroup-coding-systems
- (cons (cons name coding-system) gnus-newsgroup-coding-systems)))))
-
-(defun gnus-mule-get-coding-system (group)
- "Return the coding system for news group GROUP."
- (let ((groups gnus-newsgroup-coding-systems)
- (len -1)
- coding-system)
- ;; Find an entry which matches GROUP the best (i.e. longest).
- (while groups
- (if (and (string-match (car (car groups)) group)
- (> (match-end 0) len))
- (setq len (match-end 0)
- coding-system (cdr (car groups))))
- (setq groups (cdr groups)))
- coding-system))
-
-;; Flag to indicate if article buffer is already decoded or not.")
-(defvar gnus-mule-article-decoded nil)
-;; Coding system for reading articles of the current news group.
-(defvar gnus-mule-coding-system nil)
-;;(make-variable-buffer-local 'gnus-mule-coding-system)
-(defvar gnus-mule-subject nil)
-(defvar gnus-mule-decoded-subject nil)
-(defvar gnus-mule-original-subject nil)
-
-;; Encode (if ENCODING is t) or decode (if ENCODING is nil) the
-;; region from START to END by CODING-SYSTEM.
-(defun gnus-mule-code-convert1 (start end coding-system encoding)
- (if (< start end)
- (save-excursion
- (if encoding
- (encode-coding-region start end coding-system)
- (decode-coding-region start end coding-system)))))
-
-;; Encode (if ENCODING is t) or decode (if ENCODING is nil) the
-;; current buffer by CODING-SYSTEM. Try not to move positions of
-;; (window-start) and (point).
-(defun gnus-mule-code-convert (coding-system encoding)
- (if coding-system
- (let ((win (get-buffer-window (current-buffer))))
- (if win
- ;; We should keep (point) and (window-start).
- (save-window-excursion
- (select-window win)
- (if encoding
- ;; Simple way to assure point is on valid character boundary.
- (beginning-of-line))
- (gnus-mule-code-convert1 (point-min) (window-start)
- coding-system encoding)
- (gnus-mule-code-convert1 (window-start) (point)
- coding-system encoding)
- (gnus-mule-code-convert1 (point) (point-max)
- coding-system encoding)
- (if (not (pos-visible-in-window-p))
- ;; point went out of window, move to the bottom of window.
- (move-to-window-line -1)))
- ;; No window for the buffer, no need to worry about (point)
- ;; and (windos-start).
- (gnus-mule-code-convert1 (point-min) (point-max)
- coding-system encoding))
- )))
-
-;; Set `gnus-mule-coding-system' to the coding system articles of the
-;; current news group is encoded. This function is set in
-;; `gnus-parse-headers-hook'.
-(defun gnus-mule-select-coding-system ()
- (if (gnus-buffer-live-p gnus-summary-buffer)
- (save-excursion
- (set-buffer gnus-summary-buffer)
- (let ((coding-system
- (gnus-mule-get-coding-system gnus-newsgroup-name)))
- (setq gnus-mule-coding-system
- (if (and coding-system (coding-system-p (car coding-system)))
- (car coding-system)))))
- 'binary))
-
-;; Decode the current article. This function is set in
-;; `gnus-show-traditional-method'.
-(defun gnus-mule-decode-article ()
- (gnus-mule-code-convert gnus-mule-coding-system nil)
- (setq gnus-mule-article-decoded t))
-
-(defun gnus-mule-toggle-article-format ()
- "Toggle decoding/encoding of the current article buffer."
- (interactive)
- (let ((buf (get-buffer gnus-article-buffer)))
- (if (and gnus-mule-coding-system buf)
- (save-excursion
- (set-buffer buf)
- (let ((modif (buffer-modified-p))
- buffer-read-only)
- (gnus-mule-code-convert gnus-mule-coding-system
- gnus-mule-article-decoded)
- (setq gnus-mule-article-decoded (not gnus-mule-article-decoded))
- (set-buffer-modified-p modif))))))
-
-;; Encode a news article before sending it.
-(defun gnus-mule-message-send-news-function ()
- (let ((groups (message-fetch-field "newsgroups"))
- (idx 0)
- coding-system coding-system-list group-list)
- (if (not groups)
- ;; We are not sending the current buffer via news.
- nil
- (while (string-match "[^ ,]+" groups idx)
- (setq idx (match-end 0))
- (setq coding-system
- (cdr (gnus-mule-get-coding-system
- (substring groups (match-beginning 0) idx))))
- (if (not (memq coding-system coding-system-list))
- (setq coding-system-list (cons coding-system coding-system-list))))
- (if (> (length coding-system-list) 1)
- (setq coding-system (read-coding-system "Coding system: ")))
- (if coding-system
- (encode-coding-region (point-min) (point-max) coding-system)))))
-
-;; Encode a mail message before sending it.
-(defun gnus-mule-message-send-mail-function ()
- (let ((coding (if enable-multibyte-characters
- (select-message-coding-system))))
- (if coding
- (encode-coding-region (point-min) (point-max) coding))))
-
-;;;###autoload
-(defun gnus-mule-initialize ()
- "Do several settings for GNUS to enable automatic code conversion."
- ;; Convenient key definitions
- (define-key gnus-article-mode-map "z" 'gnus-mule-toggle-article-format)
- (define-key gnus-summary-mode-map "z" 'gnus-mule-toggle-article-format)
- ;; Hook definition
- (add-hook 'gnus-parse-headers-hook 'gnus-mule-select-coding-system)
- (add-hook 'message-send-news-hook
- 'gnus-mule-message-send-news-function)
- (add-hook 'message-send-mail-hook
- 'gnus-mule-message-send-mail-function)
- (setq nnheader-file-coding-system 'binary
- nnmail-file-coding-system 'binary)
- )
-
-(gnus-mule-add-group "" 'iso-latin-1)
-(gnus-mule-add-group "fj" 'iso-2022-7bit)
-(gnus-mule-add-group "tnn" 'iso-2022-7bit)
-(gnus-mule-add-group "japan" 'iso-2022-7bit)
-(gnus-mule-add-group "pin" 'iso-2022-7bit)
-(gnus-mule-add-group "han" 'euc-kr)
-(gnus-mule-add-group "alt.chinese.text" 'chinese-hz)
-(gnus-mule-add-group "alt.hk" 'chinese-hz)
-(gnus-mule-add-group "alt.chinese.text.big5" 'chinese-big5)
-(gnus-mule-add-group "soc.culture.vietnamese" '(nil . vietnamese-viqr))
-(gnus-mule-add-group "relcom" 'cyrillic-koi8)
-(gnus-mule-add-group "tw." 'chinese-big5)
-
-(provide 'gnus-mule)
-
-;; gnus-mule.el ends here
--- /dev/null
+;;; ietf-drums.el --- Functions for parsing RFC822bis headers
+;; Copyright (C) 1998, 1999, 2000
+;; Free Software Foundation, Inc.
+
+;; Author: Lars Magne Ingebrigtsen <larsi@gnus.org>
+;; This file is part of GNU Emacs.
+
+;; GNU Emacs 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 Emacs 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 Emacs; see the file COPYING. If not, write to the
+;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;; Boston, MA 02111-1307, USA.
+
+;;; Commentary:
+
+;; DRUMS is an IETF Working Group that works (or worked) on the
+;; successor to RFC822, "Standard For The Format Of Arpa Internet Text
+;; Messages". This library is based on
+;; draft-ietf-drums-msg-fmt-05.txt, released on 1998-08-05.
+
+;;; Code:
+
+(require 'time-date)
+(require 'mm-util)
+
+(defvar ietf-drums-no-ws-ctl-token "\001-\010\013\014\016-\037\177"
+ "US-ASCII control characters excluding CR, LF and white space.")
+(defvar ietf-drums-text-token "\001-\011\013\014\016-\177"
+ "US-ASCII characters exlcuding CR and LF.")
+(defvar ietf-drums-specials-token "()<>[]:;@\\,.\""
+ "Special characters.")
+(defvar ietf-drums-quote-token "\\"
+ "Quote character.")
+(defvar ietf-drums-wsp-token " \t"
+ "White space.")
+(defvar ietf-drums-fws-regexp
+ (concat "[" ietf-drums-wsp-token "]*\n[" ietf-drums-wsp-token "]+")
+ "Folding white space.")
+(defvar ietf-drums-atext-token "-^a-zA-Z0-9!#$%&'*+/=?_`{|}~"
+ "Textual token.")
+(defvar ietf-drums-dot-atext-token "-^a-zA-Z0-9!#$%&'*+/=?_`{|}~."
+ "Textual token including full stop.")
+(defvar ietf-drums-qtext-token
+ (concat ietf-drums-no-ws-ctl-token "\041\043-\133\135-\177")
+ "Non-white-space control characaters, plus the rest of ASCII excluding backslash and doublequote.")
+(defvar ietf-drums-tspecials "][()<>@,;:\\\"/?="
+ "Tspecials.")
+
+(defvar ietf-drums-syntax-table
+ (let ((table (copy-syntax-table emacs-lisp-mode-syntax-table)))
+ (modify-syntax-entry ?\\ "/" table)
+ (modify-syntax-entry ?< "(" table)
+ (modify-syntax-entry ?> ")" table)
+ (modify-syntax-entry ?@ "w" table)
+ (modify-syntax-entry ?/ "w" table)
+ (modify-syntax-entry ?= " " table)
+ (modify-syntax-entry ?* " " table)
+ (modify-syntax-entry ?\; " " table)
+ (modify-syntax-entry ?\' " " table)
+ table))
+
+(defun ietf-drums-token-to-list (token)
+ "Translate TOKEN into a list of characters."
+ (let ((i 0)
+ b e c out range)
+ (while (< i (length token))
+ (setq c (mm-char-int (aref token i)))
+ (incf i)
+ (cond
+ ((eq c (mm-char-int ?-))
+ (if b
+ (setq range t)
+ (push c out)))
+ (range
+ (while (<= b c)
+ (push (mm-make-char 'ascii b) out)
+ (incf b))
+ (setq range nil))
+ ((= i (length token))
+ (push (mm-make-char 'ascii c) out))
+ (t
+ (when b
+ (push (mm-make-char 'ascii b) out))
+ (setq b c))))
+ (nreverse out)))
+
+(defsubst ietf-drums-init (string)
+ (set-syntax-table ietf-drums-syntax-table)
+ (insert string)
+ (ietf-drums-unfold-fws)
+ (goto-char (point-min)))
+
+(defun ietf-drums-remove-comments (string)
+ "Remove comments from STRING."
+ (with-temp-buffer
+ (let (c)
+ (ietf-drums-init string)
+ (while (not (eobp))
+ (setq c (char-after))
+ (cond
+ ((eq c ?\")
+ (forward-sexp 1))
+ ((eq c ?\()
+ (delete-region (point) (progn (forward-sexp 1) (point))))
+ (t
+ (forward-char 1))))
+ (buffer-string))))
+
+(defun ietf-drums-remove-whitespace (string)
+ "Remove whitespace from STRING."
+ (with-temp-buffer
+ (ietf-drums-init string)
+ (let (c)
+ (while (not (eobp))
+ (setq c (char-after))
+ (cond
+ ((eq c ?\")
+ (forward-sexp 1))
+ ((eq c ?\()
+ (forward-sexp 1))
+ ((memq c '(? ?\t ?\n))
+ (delete-char 1))
+ (t
+ (forward-char 1))))
+ (buffer-string))))
+
+(defun ietf-drums-get-comment (string)
+ "Return the first comment in STRING."
+ (with-temp-buffer
+ (ietf-drums-init string)
+ (let (result c)
+ (while (not (eobp))
+ (setq c (char-after))
+ (cond
+ ((eq c ?\")
+ (forward-sexp 1))
+ ((eq c ?\()
+ (setq result
+ (buffer-substring
+ (1+ (point))
+ (progn (forward-sexp 1) (1- (point))))))
+ (t
+ (forward-char 1))))
+ result)))
+
+(defun ietf-drums-strip (string)
+ "Remove comments and whitespace from STRING."
+ (ietf-drums-remove-whitespace (ietf-drums-remove-comments string)))
+
+(defun ietf-drums-parse-address (string)
+ "Parse STRING and return a MAILBOX / DISPLAY-NAME pair."
+ (with-temp-buffer
+ (let (display-name mailbox c display-string)
+ (ietf-drums-init string)
+ (while (not (eobp))
+ (setq c (char-after))
+ (cond
+ ((or (eq c ? )
+ (eq c ?\t))
+ (forward-char 1))
+ ((eq c ?\()
+ (forward-sexp 1))
+ ((eq c ?\")
+ (push (buffer-substring
+ (1+ (point)) (progn (forward-sexp 1) (1- (point))))
+ display-name))
+ ((looking-at (concat "[" ietf-drums-atext-token "@" "]"))
+ (push (buffer-substring (point) (progn (forward-sexp 1) (point)))
+ display-name))
+ ((eq c ?<)
+ (setq mailbox
+ (ietf-drums-remove-whitespace
+ (ietf-drums-remove-comments
+ (buffer-substring
+ (1+ (point))
+ (progn (forward-sexp 1) (1- (point))))))))
+ (t (error "Unknown symbol: %c" c))))
+ ;; If we found no display-name, then we look for comments.
+ (if display-name
+ (setq display-string
+ (mapconcat 'identity (reverse display-name) " "))
+ (setq display-string (ietf-drums-get-comment string)))
+ (if (not mailbox)
+ (when (string-match "@" display-string)
+ (cons
+ (mapconcat 'identity (nreverse display-name) "")
+ (ietf-drums-get-comment string)))
+ (cons mailbox display-string)))))
+
+(defun ietf-drums-parse-addresses (string)
+ "Parse STRING and return a list of MAILBOX / DISPLAY-NAME pairs."
+ (with-temp-buffer
+ (ietf-drums-init string)
+ (let ((beg (point))
+ pairs c)
+ (while (not (eobp))
+ (setq c (char-after))
+ (cond
+ ((memq c '(?\" ?< ?\())
+ (forward-sexp 1))
+ ((eq c ?,)
+ (push (ietf-drums-parse-address (buffer-substring beg (point)))
+ pairs)
+ (forward-char 1)
+ (setq beg (point)))
+ (t
+ (forward-char 1))))
+ (push (ietf-drums-parse-address (buffer-substring beg (point)))
+ pairs)
+ (nreverse pairs))))
+
+(defun ietf-drums-unfold-fws ()
+ "Unfold folding white space in the current buffer."
+ (goto-char (point-min))
+ (while (re-search-forward ietf-drums-fws-regexp nil t)
+ (replace-match " " t t))
+ (goto-char (point-min)))
+
+(defun ietf-drums-parse-date (string)
+ "Return an Emacs time spec from STRING."
+ (apply 'encode-time (parse-time-string string)))
+
+(defun ietf-drums-narrow-to-header ()
+ "Narrow to the header section in the current buffer."
+ (narrow-to-region
+ (goto-char (point-min))
+ (if (re-search-forward "^\r?$" nil 1)
+ (match-beginning 0)
+ (point-max)))
+ (goto-char (point-min)))
+
+(defun ietf-drums-quote-string (string)
+ "Quote string if it needs quoting to be displayed in a header."
+ (if (string-match (concat "[^" ietf-drums-atext-token "]") string)
+ (concat "\"" string "\"")
+ string))
+
+(provide 'ietf-drums)
+
+;;; ietf-drums.el ends here
--- /dev/null
+;;; imap.el --- imap library
+;; Copyright (C) 1998, 1999, 2000
+;; Free Software Foundation, Inc.
+
+;; Author: Simon Josefsson <jas@pdc.kth.se>
+;; Keywords: mail
+
+;; This file is part of GNU Emacs.
+
+;; GNU Emacs 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 Emacs 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 Emacs; see the file COPYING. If not, write to the
+;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;; Boston, MA 02111-1307, USA.
+
+;;; Commentary:
+
+;; imap.el is a elisp library providing an interface for talking to
+;; IMAP servers.
+;;
+;; imap.el is roughly divided in two parts, one that parses IMAP
+;; responses from the server and storing data into buffer-local
+;; variables, and one for utility functions which send commands to
+;; server, waits for an answer, and return information. The latter
+;; part is layered on top of the previous.
+;;
+;; The imap.el API consist of the following functions, other functions
+;; in this file should not be called directly and the result of doing
+;; so are at best undefined.
+;;
+;; Global commands:
+;;
+;; imap-open, imap-opened, imap-authenticate, imap-close,
+;; imap-capability, imap-namespace, imap-error-text
+;;
+;; Mailbox commands:
+;;
+;; imap-mailbox-get, imap-mailbox-map, imap-current-mailbox,
+;; imap-current-mailbox-p, imap-search, imap-mailbox-select,
+;; imap-mailbox-examine, imap-mailbox-unselect, imap-mailbox-expunge
+;; imap-mailbox-close, imap-mailbox-create, imap-mailbox-delete
+;; imap-mailbox-rename, imap-mailbox-lsub, imap-mailbox-list
+;; imap-mailbox-subscribe, imap-mailbox-unsubscribe, imap-mailbox-status
+;; imap-mailbox-acl-get, imap-mailbox-acl-set, imap-mailbox-acl-delete
+;;
+;; Message commands:
+;;
+;; imap-fetch-asynch, imap-fetch,
+;; imap-current-message, imap-list-to-message-set,
+;; imap-message-get, imap-message-map
+;; imap-message-envelope-date, imap-message-envelope-subject,
+;; imap-message-envelope-from, imap-message-envelope-sender,
+;; imap-message-envelope-reply-to, imap-message-envelope-to,
+;; imap-message-envelope-cc, imap-message-envelope-bcc
+;; imap-message-envelope-in-reply-to, imap-message-envelope-message-id
+;; imap-message-body, imap-message-flag-permanent-p
+;; imap-message-flags-set, imap-message-flags-del
+;; imap-message-flags-add, imap-message-copyuid
+;; imap-message-copy, imap-message-appenduid
+;; imap-message-append, imap-envelope-from
+;; imap-body-lines
+;;
+;; It is my hope that theese commands should be pretty self
+;; explanatory for someone that know IMAP. All functions have
+;; additional documentation on how to invoke them.
+;;
+;; imap.el support RFC1730/2060 (IMAP4/IMAP4rev1), implemented IMAP
+;; extensions are RFC2195 (CRAM-MD5), RFC2086 (ACL), RFC2342
+;; (NAMESPACE), RFC2359 (UIDPLUS), the IMAP-part of RFC2595 (STARTTLS)
+;; (with use of external library starttls.el and program starttls) and
+;; the GSSAPI / kerberos V4 sections of RFC1731 (with use of external
+;; program `imtest'). It also take advantage the UNSELECT extension
+;; in Cyrus IMAPD.
+;;
+;; Without the work of John McClary Prevost and Jim Radford this library
+;; would not have seen the light of day. Many thanks.
+;;
+;; This is a transcript of short interactive session for demonstration
+;; purposes.
+;;
+;; (imap-open "my.mail.server")
+;; => " *imap* my.mail.server:0"
+;;
+;; The rest are invoked with current buffer as the buffer returned by
+;; `imap-open'. It is possible to do all without this, but it would
+;; look ugly here since `buffer' is always the last argument for all
+;; imap.el API functions.
+;;
+;; (imap-authenticate "myusername" "mypassword")
+;; => auth
+;;
+;; (imap-mailbox-lsub "*")
+;; => ("INBOX.sentmail" "INBOX.private" "INBOX.draft" "INBOX.spam")
+;;
+;; (imap-mailbox-list "INBOX.n%")
+;; => ("INBOX.namedroppers" "INBOX.nnimap" "INBOX.ntbugtraq")
+;;
+;; (imap-mailbox-select "INBOX.nnimap")
+;; => "INBOX.nnimap"
+;;
+;; (imap-mailbox-get 'exists)
+;; => 166
+;;
+;; (imap-mailbox-get 'uidvalidity)
+;; => "908992622"
+;;
+;; (imap-search "FLAGGED SINCE 18-DEC-98")
+;; => (235 236)
+;;
+;; (imap-fetch 235 "RFC822.PEEK" 'RFC822)
+;; => "X-Sieve: cmu-sieve 1.3^M\nX-Username: <jas@pdc.kth.se>^M\r...."
+;;
+;; Todo:
+;;
+;; o Parse UIDs as strings? We need to overcome the 28 bit limit somehow.
+;; o Don't use `read' at all (important places already fixed)
+;; o Accept list of articles instead of message set string in most
+;; imap-message-* functions.
+;;
+;; Revision history:
+;;
+;; - 19991218 added starttls/digest-md5 patch,
+;; by Daiki Ueno <ueno@ueda.info.waseda.ac.jp>
+;; NB! you need SLIM for starttls.el and digest-md5.el
+;; - 19991023 commited to pgnus
+;;
+
+;;; Code:
+
+(eval-when-compile (require 'cl))
+(eval-and-compile
+ (autoload 'open-ssl-stream "ssl")
+ (autoload 'base64-decode-string "base64")
+ (autoload 'base64-encode-string "base64")
+ (autoload 'starttls-open-stream "starttls")
+ (autoload 'starttls-negotiate "starttls")
+ (autoload 'digest-md5-parse-digest-challenge "digest-md5")
+ (autoload 'digest-md5-digest-response "digest-md5")
+ (autoload 'digest-md5-digest-uri "digest-md5")
+ (autoload 'digest-md5-challenge "digest-md5")
+ (autoload 'rfc2104-hash "rfc2104")
+ (autoload 'md5 "md5")
+ (autoload 'utf7-encode "utf7")
+ (autoload 'utf7-decode "utf7")
+ (autoload 'format-spec "format-spec")
+ (autoload 'format-spec-make "format-spec"))
+
+;; User variables.
+
+(defgroup imap nil
+ "Low-level IMAP issues."
+ :version "21.1"
+ :group 'mail)
+
+(defcustom imap-kerberos4-program '("imtest -m kerberos_v4 -u %l -p %p %s"
+ "imtest -kp %s %p")
+ "List of strings containing commands for Kerberos 4 authentication.
+%s is replaced with server hostname, %p with port to connect to, and
+%l with the value of `imap-default-user'. The program should accept
+IMAP commands on stdin and return responses to stdout. Each entry in
+the list is tried until a successful connection is made."
+ :group 'imap
+ :type '(repeat string))
+
+(defcustom imap-gssapi-program '("imtest -m gssapi -u %l -p %p %s")
+ "List of strings containing commands for GSSAPI (krb5) authentication.
+%s is replaced with server hostname, %p with port to connect to, and
+%l with the value of `imap-default-user'. The program should accept
+IMAP commands on stdin and return responses to stdout. Each entry in
+the list is tried until a successful connection is made."
+ :group 'imap
+ :type '(repeat string))
+
+(defcustom imap-ssl-program '("openssl s_client -ssl3 -connect %s:%p"
+ "openssl s_client -ssl2 -connect %s:%p"
+ "s_client -ssl3 -connect %s:%p"
+ "s_client -ssl2 -connect %s:%p")
+ "A string, or list of strings, containing commands for SSL connections.
+Within a string, %s is replaced with the server address and %p with
+port number on server. The program should accept IMAP commands on
+stdin and return responses to stdout. Each entry in the list is tried
+until a successful connection is made."
+ :group 'imap
+ :type '(choice string
+ (repeat string)))
+
+(defcustom imap-shell-program '("ssh %s imapd"
+ "rsh %s imapd"
+ "ssh %g ssh %s imapd"
+ "rsh %g rsh %s imapd")
+ "A list of strings, containing commands for IMAP connection.
+Within a string, %s is replaced with the server address, %p with port
+number on server, %g with `imap-shell-host', and %l with
+`imap-default-user'. The program should read IMAP commands from stdin
+and write IMAP response to stdout. Each entry in the list is tried
+until a successful connection is made."
+ :group 'imap
+ :type '(repeat string))
+
+(defvar imap-shell-host "gateway"
+ "Hostname of rlogin proxy.")
+
+(defvar imap-default-user (user-login-name)
+ "Default username to use.")
+
+(defvar imap-error nil
+ "Error codes from the last command.")
+
+;; Various variables.
+
+(defvar imap-fetch-data-hook nil
+ "Hooks called after receiving each FETCH response.")
+
+(defvar imap-streams '(gssapi kerberos4 starttls ssl network shell)
+ "Priority of streams to consider when opening connection to server.")
+
+(defvar imap-stream-alist
+ '((gssapi imap-gssapi-stream-p imap-gssapi-open)
+ (kerberos4 imap-kerberos4-stream-p imap-kerberos4-open)
+ (ssl imap-ssl-p imap-ssl-open)
+ (network imap-network-p imap-network-open)
+ (shell imap-shell-p imap-shell-open)
+ (starttls imap-starttls-p imap-starttls-open))
+ "Definition of network streams.
+
+(NAME CHECK OPEN)
+
+NAME names the stream, CHECK is a function returning non-nil if the
+server support the stream and OPEN is a function for opening the
+stream.")
+
+(defvar imap-authenticators '(gssapi
+ kerberos4
+ digest-md5
+ cram-md5
+ login
+ anonymous)
+ "Priority of authenticators to consider when authenticating to server.")
+
+(defvar imap-authenticator-alist
+ '((gssapi imap-gssapi-auth-p imap-gssapi-auth)
+ (kerberos4 imap-kerberos4-auth-p imap-kerberos4-auth)
+ (cram-md5 imap-cram-md5-p imap-cram-md5-auth)
+ (login imap-login-p imap-login-auth)
+ (anonymous imap-anonymous-p imap-anonymous-auth)
+ (digest-md5 imap-digest-md5-p imap-digest-md5-auth))
+ "Definition of authenticators.
+
+(NAME CHECK AUTHENTICATE)
+
+NAME names the authenticator. CHECK is a function returning non-nil if
+the server support the authenticator and AUTHENTICATE is a function
+for doing the actuall authentification.")
+
+(defvar imap-use-utf7 t
+ "If non-nil, do utf7 encoding/decoding of mailbox names.
+Since the UTF7 decoding currently only decodes into ISO-8859-1
+characters, you may disable this decoding if you need to access UTF7
+encoded mailboxes which doesn't translate into ISO-8859-1.")
+
+;; Internal constants. Change theese and die.
+
+(defconst imap-default-port 143)
+(defconst imap-default-ssl-port 993)
+(defconst imap-default-stream 'network)
+(defconst imap-coding-system-for-read 'binary)
+(defconst imap-coding-system-for-write 'binary)
+(defconst imap-local-variables '(imap-server
+ imap-port
+ imap-client-eol
+ imap-server-eol
+ imap-auth
+ imap-stream
+ imap-username
+ imap-password
+ imap-current-mailbox
+ imap-current-target-mailbox
+ imap-message-data
+ imap-capability
+ imap-namespace
+ imap-state
+ imap-reached-tag
+ imap-failed-tags
+ imap-tag
+ imap-process
+ imap-calculate-literal-size-first
+ imap-mailbox-data))
+
+;; Internal variables.
+
+(defvar imap-stream nil)
+(defvar imap-auth nil)
+(defvar imap-server nil)
+(defvar imap-port nil)
+(defvar imap-username nil)
+(defvar imap-password nil)
+(defvar imap-calculate-literal-size-first nil)
+(defvar imap-state 'closed
+ "IMAP state.
+Valid states are `closed', `initial', `nonauth', `auth', `selected'
+and `examine'.")
+
+(defvar imap-server-eol "\r\n"
+ "The EOL string sent from the server.")
+
+(defvar imap-client-eol "\r\n"
+ "The EOL string we send to the server.")
+
+(defvar imap-current-mailbox nil
+ "Current mailbox name.")
+
+(defvar imap-current-target-mailbox nil
+ "Current target mailbox for COPY and APPEND commands.")
+
+(defvar imap-mailbox-data nil
+ "Obarray with mailbox data.")
+
+(defvar imap-mailbox-prime 997
+ "Length of imap-mailbox-data.")
+
+(defvar imap-current-message nil
+ "Current message number.")
+
+(defvar imap-message-data nil
+ "Obarray with message data.")
+
+(defvar imap-message-prime 997
+ "Length of imap-message-data.")
+
+(defvar imap-capability nil
+ "Capability for server.")
+
+(defvar imap-namespace nil
+ "Namespace for current server.")
+
+(defvar imap-reached-tag 0
+ "Lower limit on command tags that have been parsed.")
+
+(defvar imap-failed-tags nil
+ "Alist of tags that failed.
+Each element is a list with four elements; tag (a integer), response
+state (a symbol, `OK', `NO' or `BAD'), response code (a string), and
+human readable response text (a string).")
+
+(defvar imap-tag 0
+ "Command tag number.")
+
+(defvar imap-process nil
+ "Process.")
+
+(defvar imap-continuation nil
+ "Non-nil indicates that the server emitted a continuation request.
+The actually value is really the text on the continuation line.")
+
+(defvar imap-log nil
+ "Name of buffer for imap session trace.
+For example: (setq imap-log \"*imap-log*\")")
+
+(defvar imap-debug nil ;"*imap-debug*"
+ "Name of buffer for random debug spew.
+For example: (setq imap-debug \"*imap-debug*\")")
+
+\f
+;; Utility functions:
+
+(defsubst imap-disable-multibyte ()
+ "Enable multibyte in the current buffer."
+ (when (fboundp 'set-buffer-multibyte)
+ (set-buffer-multibyte nil)))
+
+(defun imap-read-passwd (prompt &rest args)
+ "Read a password using PROMPT.
+If ARGS, PROMPT is used as an argument to `format'."
+ (let ((prompt (if args
+ (apply 'format prompt args)
+ prompt)))
+ (funcall (if (or (fboundp 'read-passwd)
+ (and (load "subr" t)
+ (fboundp 'read-passwd))
+ (and (load "passwd" t)
+ (fboundp 'read-passwd)))
+ 'read-passwd
+ (autoload 'ange-ftp-read-passwd "ange-ftp")
+ 'ange-ftp-read-passwd)
+ prompt)))
+
+(defsubst imap-utf7-encode (string)
+ (if imap-use-utf7
+ (and string
+ (condition-case ()
+ (utf7-encode string t)
+ (error (message
+ "imap: Could not UTF7 encode `%s', using it unencoded..."
+ string)
+ string)))
+ string))
+
+(defsubst imap-utf7-decode (string)
+ (if imap-use-utf7
+ (and string
+ (condition-case ()
+ (utf7-decode string t)
+ (error (message
+ "imap: Could not UTF7 decode `%s', using it undecoded..."
+ string)
+ string)))
+ string))
+
+(defsubst imap-ok-p (status)
+ (if (eq status 'OK)
+ t
+ (setq imap-error status)
+ nil))
+
+(defun imap-error-text (&optional buffer)
+ (with-current-buffer (or buffer (current-buffer))
+ (nth 3 (car imap-failed-tags))))
+
+\f
+;; Server functions; stream stuff:
+
+(defun imap-kerberos4-stream-p (buffer)
+ (imap-capability 'AUTH=KERBEROS_V4 buffer))
+
+(defun imap-kerberos4-open (name buffer server port)
+ (let ((cmds imap-kerberos4-program)
+ cmd done)
+ (while (and (not done) (setq cmd (pop cmds)))
+ (message "Opening Kerberos 4 IMAP connection with `%s'..." cmd)
+ (erase-buffer)
+ (let* ((port (or port imap-default-port))
+ (coding-system-for-read imap-coding-system-for-read)
+ (coding-system-for-write imap-coding-system-for-write)
+ (process (start-process
+ name buffer shell-file-name shell-command-switch
+ (format-spec
+ cmd
+ (format-spec-make
+ ?s server
+ ?p (number-to-string port)
+ ?l imap-default-user))))
+ response)
+ (when process
+ (with-current-buffer buffer
+ (setq imap-client-eol "\n"
+ imap-calculate-literal-size-first t)
+ (while (and (memq (process-status process) '(open run))
+ (goto-char (point-min))
+ ;; cyrus 1.6.x (13? < x <= 22) queries capabilities
+ (or (while (looking-at "^C:")
+ (forward-line))
+ t)
+ ;; cyrus 1.6 imtest print "S: " before server greeting
+ (or (not (looking-at "S: "))
+ (forward-char 3)
+ t)
+ (not (and (imap-parse-greeting)
+ ;; success in imtest < 1.6:
+ (or (re-search-forward
+ "^__\\(.*\\)__\n" nil t)
+ ;; success in imtest 1.6:
+ (re-search-forward
+ "^\\(Authenticat.*\\)" nil t))
+ (setq response (match-string 1)))))
+ (accept-process-output process 1)
+ (sit-for 1))
+ (and imap-log
+ (with-current-buffer (get-buffer-create imap-log)
+ (imap-disable-multibyte)
+ (buffer-disable-undo)
+ (goto-char (point-max))
+ (insert-buffer-substring buffer)))
+ (erase-buffer)
+ (message "Kerberos 4 IMAP connection: %s" (or response "failed"))
+ (if (and response (let ((case-fold-search nil))
+ (not (string-match "failed" response))))
+ (setq done process)
+ (if (memq (process-status process) '(open run))
+ (imap-send-command-wait "LOGOUT"))
+ (delete-process process)
+ nil)))))
+ done))
+
+(defun imap-gssapi-stream-p (buffer)
+ (imap-capability 'AUTH=GSSAPI buffer))
+
+(defun imap-gssapi-open (name buffer server port)
+ (let ((cmds imap-gssapi-program)
+ cmd done)
+ (while (and (not done) (setq cmd (pop cmds)))
+ (message "Opening GSSAPI IMAP connection with `%s'..." cmd)
+ (let* ((port (or port imap-default-port))
+ (coding-system-for-read imap-coding-system-for-read)
+ (coding-system-for-write imap-coding-system-for-write)
+ (process (start-process
+ name buffer shell-file-name shell-command-switch
+ (format-spec
+ cmd
+ (format-spec-make
+ ?s server
+ ?p (number-to-string port)
+ ?l imap-default-user))))
+ response)
+ (when process
+ (with-current-buffer buffer
+ (setq imap-client-eol "\n")
+ (while (and (memq (process-status process) '(open run))
+ (goto-char (point-min))
+ ;; cyrus 1.6.x (13? < x <= 22) queries capabilities
+ (or (while (looking-at "^C:")
+ (forward-line))
+ t)
+ ;; cyrus 1.6 imtest print "S: " before server greeting
+ (or (not (looking-at "S: "))
+ (forward-char 3)
+ t)
+ (not (and (imap-parse-greeting)
+ ;; success in imtest 1.6:
+ (re-search-forward
+ "^\\(Authenticat.*\\)" nil t)
+ (setq response (match-string 1)))))
+ (accept-process-output process 1)
+ (sit-for 1))
+ (and imap-log
+ (with-current-buffer (get-buffer-create imap-log)
+ (imap-disable-multibyte)
+ (buffer-disable-undo)
+ (goto-char (point-max))
+ (insert-buffer-substring buffer)))
+ (erase-buffer)
+ (message "GSSAPI IMAP connection: %s" (or response "failed"))
+ (if (and response (let ((case-fold-search nil))
+ (not (string-match "failed" response))))
+ (setq done process)
+ (if (memq (process-status process) '(open run))
+ (imap-send-command-wait "LOGOUT"))
+ (delete-process process)
+ nil)))))
+ done))
+
+(defun imap-ssl-p (buffer)
+ nil)
+
+(defun imap-ssl-open (name buffer server port)
+ "Open a SSL connection to server."
+ (let ((cmds (if (listp imap-ssl-program) imap-ssl-program
+ (list imap-ssl-program)))
+ cmd done)
+ (while (and (not done) (setq cmd (pop cmds)))
+ (message "imap: Opening SSL connection with `%s'..." cmd)
+ (let* ((port (or port imap-default-ssl-port))
+ (coding-system-for-read imap-coding-system-for-read)
+ (coding-system-for-write imap-coding-system-for-write)
+ (ssl-program-name shell-file-name)
+ (ssl-program-arguments
+ (list shell-command-switch
+ (format-spec cmd (format-spec-make
+ ?s server
+ ?p (number-to-string port)))))
+ process)
+ (when (setq process (ignore-errors (open-ssl-stream
+ name buffer server port)))
+ (with-current-buffer buffer
+ (goto-char (point-min))
+ (while (and (memq (process-status process) '(open run))
+ (goto-char (point-max))
+ (forward-line -1)
+ (not (imap-parse-greeting)))
+ (accept-process-output process 1)
+ (sit-for 1))
+ (and imap-log
+ (with-current-buffer (get-buffer-create imap-log)
+ (imap-disable-multibyte)
+ (buffer-disable-undo)
+ (goto-char (point-max))
+ (insert-buffer-substring buffer)))
+ (erase-buffer)
+ (when (memq (process-status process) '(open run))
+ (setq done process))))))
+ (if done
+ (progn
+ (message "imap: Opening SSL connection with `%s'...done" cmd)
+ done)
+ (message "imap: Failed opening SSL connection")
+ nil)))
+
+(defun imap-network-p (buffer)
+ t)
+
+(defun imap-network-open (name buffer server port)
+ (let* ((port (or port imap-default-port))
+ (coding-system-for-read imap-coding-system-for-read)
+ (coding-system-for-write imap-coding-system-for-write)
+ (process (open-network-stream name buffer server port)))
+ (when process
+ (while (and (memq (process-status process) '(open run))
+ (goto-char (point-min))
+ (not (imap-parse-greeting)))
+ (accept-process-output process 1)
+ (sit-for 1))
+ (and imap-log
+ (with-current-buffer (get-buffer-create imap-log)
+ (imap-disable-multibyte)
+ (buffer-disable-undo)
+ (goto-char (point-max))
+ (insert-buffer-substring buffer)))
+ (when (memq (process-status process) '(open run))
+ process))))
+
+(defun imap-shell-p (buffer)
+ nil)
+
+(defun imap-shell-open (name buffer server port)
+ (let ((cmds imap-shell-program)
+ cmd done)
+ (while (and (not done) (setq cmd (pop cmds)))
+ (message "imap: Opening IMAP connection with `%s'..." cmd)
+ (setq imap-client-eol "\n")
+ (let* ((port (or port imap-default-port))
+ (coding-system-for-read imap-coding-system-for-read)
+ (coding-system-for-write imap-coding-system-for-write)
+ (process (start-process
+ name buffer shell-file-name shell-command-switch
+ (format-spec
+ cmd
+ (format-spec-make
+ ?s server
+ ?g imap-shell-host
+ ?p (number-to-string port)
+ ?l imap-default-user)))))
+ (when process
+ (while (and (memq (process-status process) '(open run))
+ (goto-char (point-min))
+ (not (imap-parse-greeting)))
+ (accept-process-output process 1)
+ (sit-for 1))
+ (erase-buffer)
+ (and imap-log
+ (with-current-buffer (get-buffer-create imap-log)
+ (imap-disable-multibyte)
+ (buffer-disable-undo)
+ (goto-char (point-max))
+ (insert-buffer-substring buffer)))
+ (when (memq (process-status process) '(open run))
+ (setq done process)))))
+ (if done
+ (progn
+ (message "imap: Opening IMAP connection with `%s'...done" cmd)
+ done)
+ (message "imap: Failed opening IMAP connection")
+ nil)))
+
+(defun imap-starttls-p (buffer)
+ (and (condition-case ()
+ (require 'starttls)
+ (error nil))
+ (imap-capability 'STARTTLS buffer)))
+
+(defun imap-starttls-open (name buffer server port)
+ (let* ((port (or port imap-default-port))
+ (coding-system-for-read imap-coding-system-for-read)
+ (coding-system-for-write imap-coding-system-for-write)
+ (process (starttls-open-stream name buffer server port)))
+ (when process
+ (while (and (memq (process-status process) '(open run))
+ (goto-char (point-min))
+ (not (imap-parse-greeting)))
+ (accept-process-output process 1)
+ (sit-for 1))
+ (and imap-log
+ (with-current-buffer (get-buffer-create imap-log)
+ (buffer-disable-undo)
+ (goto-char (point-max))
+ (insert-buffer-substring buffer)))
+ (let ((imap-process process))
+ (unwind-protect
+ (progn
+ (set-process-filter imap-process 'imap-arrival-filter)
+ (when (and (eq imap-stream 'starttls)
+ (imap-ok-p (imap-send-command-wait "STARTTLS")))
+ (starttls-negotiate imap-process)))
+ (set-process-filter imap-process nil)))
+ (when (memq (process-status process) '(open run))
+ process))))
+
+;; Server functions; authenticator stuff:
+
+(defun imap-interactive-login (buffer loginfunc)
+ "Login to server in BUFFER.
+LOGINFUNC is passed a username and a password, it should return t if
+it where sucessful authenticating itself to the server, nil otherwise.
+Returns t if login was successful, nil otherwise."
+ (with-current-buffer buffer
+ (make-variable-buffer-local 'imap-username)
+ (make-variable-buffer-local 'imap-password)
+ (let (user passwd ret)
+ ;; (condition-case ()
+ (while (or (not user) (not passwd))
+ (setq user (or imap-username
+ (read-from-minibuffer
+ (concat "IMAP username for " imap-server ": ")
+ (or user imap-default-user))))
+ (setq passwd (or imap-password
+ (imap-read-passwd
+ (concat "IMAP password for " user "@"
+ imap-server ": "))))
+ (when (and user passwd)
+ (if (funcall loginfunc user passwd)
+ (progn
+ (setq ret t
+ imap-username user)
+ (if (and (not imap-password)
+ (y-or-n-p "Store password for this session? "))
+ (setq imap-password passwd)))
+ (message "Login failed...")
+ (setq passwd nil)
+ (sit-for 1))))
+ ;; (quit (with-current-buffer buffer
+ ;; (setq user nil
+ ;; passwd nil)))
+ ;; (error (with-current-buffer buffer
+ ;; (setq user nil
+ ;; passwd nil))))
+ ret)))
+
+(defun imap-gssapi-auth-p (buffer)
+ (imap-capability 'AUTH=GSSAPI buffer))
+
+(defun imap-gssapi-auth (buffer)
+ (eq imap-stream 'gssapi))
+
+(defun imap-kerberos4-auth-p (buffer)
+ (imap-capability 'AUTH=KERBEROS_V4 buffer))
+
+(defun imap-kerberos4-auth (buffer)
+ (eq imap-stream 'kerberos4))
+
+(defun imap-cram-md5-p (buffer)
+ (imap-capability 'AUTH=CRAM-MD5 buffer))
+
+(defun imap-cram-md5-auth (buffer)
+ "Login to server using the AUTH CRAM-MD5 method."
+ (imap-interactive-login
+ buffer
+ (lambda (user passwd)
+ (imap-ok-p
+ (imap-send-command-wait
+ (list
+ "AUTHENTICATE CRAM-MD5"
+ (lambda (challenge)
+ (let* ((decoded (base64-decode-string challenge))
+ (hash (rfc2104-hash 'md5 64 16 passwd decoded))
+ (response (concat user " " hash))
+ (encoded (base64-encode-string response)))
+ encoded))))))))
+
+(defun imap-login-p (buffer)
+ (not (imap-capability 'X-LOGIN-CMD-DISABLED buffer)))
+
+(defun imap-login-auth (buffer)
+ "Login to server using the LOGIN command."
+ (imap-interactive-login buffer
+ (lambda (user passwd)
+ (imap-ok-p (imap-send-command-wait
+ (concat "LOGIN \"" user "\" \""
+ passwd "\""))))))
+
+(defun imap-anonymous-p (buffer)
+ t)
+
+(defun imap-anonymous-auth (buffer)
+ (with-current-buffer buffer
+ (imap-ok-p (imap-send-command-wait
+ (concat "LOGIN anonymous \"" (concat (user-login-name) "@"
+ (system-name)) "\"")))))
+
+(defun imap-digest-md5-p (buffer)
+ (and (condition-case ()
+ (require 'digest-md5)
+ (error nil))
+ (imap-capability 'AUTH=DIGEST-MD5 buffer)))
+
+(defun imap-digest-md5-auth (buffer)
+ "Login to server using the AUTH DIGEST-MD5 method."
+ (imap-interactive-login
+ buffer
+ (lambda (user passwd)
+ (let ((tag
+ (imap-send-command
+ (list
+ "AUTHENTICATE DIGEST-MD5"
+ (lambda (challenge)
+ (digest-md5-parse-digest-challenge
+ (base64-decode-string challenge))
+ (let* ((digest-uri
+ (digest-md5-digest-uri
+ "imap" (digest-md5-challenge 'realm)))
+ (response
+ (digest-md5-digest-response
+ user passwd digest-uri)))
+ (base64-encode-string response 'no-line-break))))
+ )))
+ (if (not (eq (imap-wait-for-tag tag) 'INCOMPLETE))
+ nil
+ (setq imap-continuation nil)
+ (imap-send-command-1 "")
+ (imap-ok-p (imap-wait-for-tag tag)))))))
+
+;; Server functions:
+
+(defun imap-open-1 (buffer)
+ (with-current-buffer buffer
+ (erase-buffer)
+ (setq imap-current-mailbox nil
+ imap-current-message nil
+ imap-state 'initial
+ imap-process (condition-case ()
+ (funcall (nth 2 (assq imap-stream
+ imap-stream-alist))
+ "imap" buffer imap-server imap-port)
+ ((error quit) nil)))
+ (when imap-process
+ (set-process-filter imap-process 'imap-arrival-filter)
+ (set-process-sentinel imap-process 'imap-sentinel)
+ (while (and (eq imap-state 'initial)
+ (memq (process-status imap-process) '(open run)))
+ (message "Waiting for response from %s..." imap-server)
+ (accept-process-output imap-process 1))
+ (message "Waiting for response from %s...done" imap-server)
+ (and (memq (process-status imap-process) '(open run))
+ imap-process))))
+
+(defun imap-open (server &optional port stream auth buffer)
+ "Open a IMAP connection to host SERVER at PORT returning a buffer.
+If PORT is unspecified, a default value is used (143 except
+for SSL which use 993).
+STREAM indicates the stream to use, see `imap-streams' for available
+streams. If nil, it choices the best stream the server is capable of.
+AUTH indicates authenticator to use, see `imap-authenticators' for
+available authenticators. If nil, it choices the best stream the
+server is capable of.
+BUFFER can be a buffer or a name of a buffer, which is created if
+necessery. If nil, the buffer name is generated."
+ (setq buffer (or buffer (format " *imap* %s:%d" server (or port 0))))
+ (with-current-buffer (get-buffer-create buffer)
+ (if (imap-opened buffer)
+ (imap-close buffer))
+ (mapcar 'make-variable-buffer-local imap-local-variables)
+ (imap-disable-multibyte)
+ (buffer-disable-undo)
+ (setq imap-server (or server imap-server))
+ (setq imap-port (or port imap-port))
+ (setq imap-auth (or auth imap-auth))
+ (setq imap-stream (or stream imap-stream))
+ (when (let ((imap-stream (or imap-stream imap-default-stream)))
+ (imap-open-1 buffer))
+ ;; Choose stream.
+ (let (stream-changed)
+ (when (null imap-stream)
+ (let ((streams imap-streams))
+ (while (setq stream (pop streams))
+ (if (funcall (nth 1 (assq stream imap-stream-alist)) buffer)
+ (setq stream-changed (not (eq (or imap-stream
+ imap-default-stream)
+ stream))
+ imap-stream stream
+ streams nil)))
+ (unless imap-stream
+ (error "Couldn't figure out a stream for server"))))
+ (when stream-changed
+ (message "Reconnecting with %s..." imap-stream)
+ (imap-close buffer)
+ (imap-open-1 buffer)
+ (setq imap-capability nil)))
+ (if (imap-opened buffer)
+ ;; Choose authenticator
+ (when (and (null imap-auth) (not (eq imap-state 'auth)))
+ (let ((auths imap-authenticators))
+ (while (setq auth (pop auths))
+ (if (funcall (nth 1 (assq auth imap-authenticator-alist))
+ buffer)
+ (setq imap-auth auth
+ auths nil)))
+ (unless imap-auth
+ (error "Couldn't figure out authenticator for server"))))))
+ (when (imap-opened buffer)
+ (setq imap-mailbox-data (make-vector imap-mailbox-prime 0))
+ buffer)))
+
+(defun imap-opened (&optional buffer)
+ "Return non-nil if connection to imap server in BUFFER is open.
+If BUFFER is nil then the current buffer is used."
+ (and (setq buffer (get-buffer (or buffer (current-buffer))))
+ (buffer-live-p buffer)
+ (with-current-buffer buffer
+ (and imap-process
+ (memq (process-status imap-process) '(open run))))))
+
+(defun imap-authenticate (&optional user passwd buffer)
+ "Authenticate to server in BUFFER, using current buffer if nil.
+It uses the authenticator specified when opening the server. If the
+authenticator requires username/passwords, they are queried from the
+user and optionally stored in the buffer. If USER and/or PASSWD is
+specified, the user will not be questioned and the username and/or
+password is remembered in the buffer."
+ (with-current-buffer (or buffer (current-buffer))
+ (if (not (eq imap-state 'nonauth))
+ (or (eq imap-state 'auth)
+ (eq imap-state 'select)
+ (eq imap-state 'examine))
+ (make-variable-buffer-local 'imap-username)
+ (make-variable-buffer-local 'imap-password)
+ (if user (setq imap-username user))
+ (if passwd (setq imap-password passwd))
+ (if (funcall (nth 2 (assq imap-auth imap-authenticator-alist)) buffer)
+ (setq imap-state 'auth)))))
+
+(defun imap-close (&optional buffer)
+ "Close connection to server in BUFFER.
+If BUFFER is nil, the current buffer is used."
+ (with-current-buffer (or buffer (current-buffer))
+ (and (imap-opened)
+ (not (imap-ok-p (imap-send-command-wait "LOGOUT")))
+ (message "Server %s didn't let me log out" imap-server))
+ (when (and imap-process
+ (memq (process-status imap-process) '(open run)))
+ (delete-process imap-process))
+ (setq imap-current-mailbox nil
+ imap-current-message nil
+ imap-process nil)
+ (erase-buffer)
+ t))
+
+(defun imap-capability (&optional identifier buffer)
+ "Return a list of identifiers which server in BUFFER support.
+If IDENTIFIER, return non-nil if it's among the servers capabilities.
+If BUFFER is nil, the current buffer is assumed."
+ (with-current-buffer (or buffer (current-buffer))
+ (unless imap-capability
+ (unless (imap-ok-p (imap-send-command-wait "CAPABILITY"))
+ (setq imap-capability '(IMAP2))))
+ (if identifier
+ (memq (intern (upcase (symbol-name identifier))) imap-capability)
+ imap-capability)))
+
+(defun imap-namespace (&optional buffer)
+ "Return a namespace hierarchy at server in BUFFER.
+If BUFFER is nil, the current buffer is assumed."
+ (with-current-buffer (or buffer (current-buffer))
+ (unless imap-namespace
+ (when (imap-capability 'NAMESPACE)
+ (imap-send-command-wait "NAMESPACE")))
+ imap-namespace))
+
+(defun imap-send-command-wait (command &optional buffer)
+ (imap-wait-for-tag (imap-send-command command buffer) buffer))
+
+\f
+;; Mailbox functions:
+
+(defun imap-mailbox-put (propname value &optional mailbox buffer)
+ (with-current-buffer (or buffer (current-buffer))
+ (if imap-mailbox-data
+ (put (intern (or mailbox imap-current-mailbox) imap-mailbox-data)
+ propname value)
+ (error "Imap-mailbox-data is nil, prop %s value %s mailbox %s buffer %s"
+ propname value mailbox (current-buffer)))
+ t))
+
+(defsubst imap-mailbox-get-1 (propname &optional mailbox)
+ (get (intern-soft (or mailbox imap-current-mailbox) imap-mailbox-data)
+ propname))
+
+(defun imap-mailbox-get (propname &optional mailbox buffer)
+ (let ((mailbox (imap-utf7-encode mailbox)))
+ (with-current-buffer (or buffer (current-buffer))
+ (imap-mailbox-get-1 propname (or mailbox imap-current-mailbox)))))
+
+(defun imap-mailbox-map-1 (func &optional mailbox-decoder buffer)
+ (with-current-buffer (or buffer (current-buffer))
+ (let (result)
+ (mapatoms
+ (lambda (s)
+ (push (funcall func (if mailbox-decoder
+ (funcall mailbox-decoder (symbol-name s))
+ (symbol-name s))) result))
+ imap-mailbox-data)
+ result)))
+
+(defun imap-mailbox-map (func &optional buffer)
+ "Map a function across each mailbox in `imap-mailbox-data', returning a list.
+Function should take a mailbox name (a string) as
+the only argument."
+ (imap-mailbox-map-1 func 'imap-utf7-decode buffer))
+
+(defun imap-current-mailbox (&optional buffer)
+ (with-current-buffer (or buffer (current-buffer))
+ (imap-utf7-decode imap-current-mailbox)))
+
+(defun imap-current-mailbox-p-1 (mailbox &optional examine)
+ (and (string= mailbox imap-current-mailbox)
+ (or (and examine
+ (eq imap-state 'examine))
+ (and (not examine)
+ (eq imap-state 'selected)))))
+
+(defun imap-current-mailbox-p (mailbox &optional examine buffer)
+ (with-current-buffer (or buffer (current-buffer))
+ (imap-current-mailbox-p-1 (imap-utf7-encode mailbox) examine)))
+
+(defun imap-mailbox-select-1 (mailbox &optional examine)
+ "Select MAILBOX on server in BUFFER.
+If EXAMINE is non-nil, do a read-only select."
+ (if (imap-current-mailbox-p-1 mailbox examine)
+ imap-current-mailbox
+ (setq imap-current-mailbox mailbox)
+ (if (imap-ok-p (imap-send-command-wait
+ (concat (if examine "EXAMINE" "SELECT") " \""
+ mailbox "\"")))
+ (progn
+ (setq imap-message-data (make-vector imap-message-prime 0)
+ imap-state (if examine 'examine 'selected))
+ imap-current-mailbox)
+ ;; Failed SELECT/EXAMINE unselects current mailbox
+ (setq imap-current-mailbox nil))))
+
+(defun imap-mailbox-select (mailbox &optional examine buffer)
+ (with-current-buffer (or buffer (current-buffer))
+ (imap-utf7-decode
+ (imap-mailbox-select-1 (imap-utf7-encode mailbox) examine))))
+
+(defun imap-mailbox-examine-1 (mailbox &optional buffer)
+ (with-current-buffer (or buffer (current-buffer))
+ (imap-mailbox-select-1 mailbox 'exmine)))
+
+(defun imap-mailbox-examine (mailbox &optional buffer)
+ "Examine MAILBOX on server in BUFFER."
+ (imap-mailbox-select mailbox 'exmine buffer))
+
+(defun imap-mailbox-unselect (&optional buffer)
+ "Close current folder in BUFFER, without expunging articles."
+ (with-current-buffer (or buffer (current-buffer))
+ (when (or (eq imap-state 'auth)
+ (and (imap-capability 'UNSELECT)
+ (imap-ok-p (imap-send-command-wait "UNSELECT")))
+ (and (imap-ok-p
+ (imap-send-command-wait (concat "EXAMINE \""
+ imap-current-mailbox
+ "\"")))
+ (imap-ok-p (imap-send-command-wait "CLOSE"))))
+ (setq imap-current-mailbox nil
+ imap-message-data nil
+ imap-state 'auth)
+ t)))
+
+(defun imap-mailbox-expunge (&optional buffer)
+ "Expunge articles in current folder in BUFFER.
+If BUFFER is nil the current buffer is assumed."
+ (with-current-buffer (or buffer (current-buffer))
+ (when (and imap-current-mailbox (not (eq imap-state 'examine)))
+ (imap-ok-p (imap-send-command-wait "EXPUNGE")))))
+
+(defun imap-mailbox-close (&optional buffer)
+ "Expunge articles and close current folder in BUFFER.
+If BUFFER is nil the current buffer is assumed."
+ (with-current-buffer (or buffer (current-buffer))
+ (when (and imap-current-mailbox
+ (imap-ok-p (imap-send-command-wait "CLOSE")))
+ (setq imap-current-mailbox nil
+ imap-message-data nil
+ imap-state 'auth)
+ t)))
+
+(defun imap-mailbox-create-1 (mailbox)
+ (imap-ok-p (imap-send-command-wait (list "CREATE \"" mailbox "\""))))
+
+(defun imap-mailbox-create (mailbox &optional buffer)
+ "Create MAILBOX on server in BUFFER.
+If BUFFER is nil the current buffer is assumed."
+ (with-current-buffer (or buffer (current-buffer))
+ (imap-mailbox-create-1 (imap-utf7-encode mailbox))))
+
+(defun imap-mailbox-delete (mailbox &optional buffer)
+ "Delete MAILBOX on server in BUFFER.
+If BUFFER is nil the current buffer is assumed."
+ (let ((mailbox (imap-utf7-encode mailbox)))
+ (with-current-buffer (or buffer (current-buffer))
+ (imap-ok-p
+ (imap-send-command-wait (list "DELETE \"" mailbox "\""))))))
+
+(defun imap-mailbox-rename (oldname newname &optional buffer)
+ "Rename mailbox OLDNAME to NEWNAME on server in BUFFER.
+If BUFFER is nil the current buffer is assumed."
+ (let ((oldname (imap-utf7-encode oldname))
+ (newname (imap-utf7-encode newname)))
+ (with-current-buffer (or buffer (current-buffer))
+ (imap-ok-p
+ (imap-send-command-wait (list "RENAME \"" oldname "\" "
+ "\"" newname "\""))))))
+
+(defun imap-mailbox-lsub (&optional root reference add-delimiter buffer)
+ "Return a list of subscribed mailboxes on server in BUFFER.
+If ROOT is non-nil, only list matching mailboxes. If ADD-DELIMITER is
+non-nil, a hierarchy delimiter is added to root. REFERENCE is a
+implementation-specific string that has to be passed to lsub command."
+ (with-current-buffer (or buffer (current-buffer))
+ ;; Make sure we know the hierarchy separator for root's hierarchy
+ (when (and add-delimiter (null (imap-mailbox-get-1 'delimiter root)))
+ (imap-send-command-wait (concat "LIST \"" reference "\" \""
+ (imap-utf7-encode root) "\"")))
+ ;; clear list data (NB not delimiter and other stuff)
+ (imap-mailbox-map-1 (lambda (mailbox)
+ (imap-mailbox-put 'lsub nil mailbox)))
+ (when (imap-ok-p
+ (imap-send-command-wait
+ (concat "LSUB \"" reference "\" \"" (imap-utf7-encode root)
+ (and add-delimiter (imap-mailbox-get-1 'delimiter root))
+ "%\"")))
+ (let (out)
+ (imap-mailbox-map-1 (lambda (mailbox)
+ (when (imap-mailbox-get-1 'lsub mailbox)
+ (push (imap-utf7-decode mailbox) out))))
+ (nreverse out)))))
+
+(defun imap-mailbox-list (root &optional reference add-delimiter buffer)
+ "Return a list of mailboxes matching ROOT on server in BUFFER.
+If ADD-DELIMITER is non-nil, a hierarchy delimiter is added to
+root. REFERENCE is a implementation-specific string that has to be
+passed to list command."
+ (with-current-buffer (or buffer (current-buffer))
+ ;; Make sure we know the hierarchy separator for root's hierarchy
+ (when (and add-delimiter (null (imap-mailbox-get-1 'delimiter root)))
+ (imap-send-command-wait (concat "LIST \"" reference "\" \""
+ (imap-utf7-encode root) "\"")))
+ ;; clear list data (NB not delimiter and other stuff)
+ (imap-mailbox-map-1 (lambda (mailbox)
+ (imap-mailbox-put 'list nil mailbox)))
+ (when (imap-ok-p
+ (imap-send-command-wait
+ (concat "LIST \"" reference "\" \"" (imap-utf7-encode root)
+ (and add-delimiter (imap-mailbox-get-1 'delimiter root))
+ "%\"")))
+ (let (out)
+ (imap-mailbox-map-1 (lambda (mailbox)
+ (when (imap-mailbox-get-1 'list mailbox)
+ (push (imap-utf7-decode mailbox) out))))
+ (nreverse out)))))
+
+(defun imap-mailbox-subscribe (mailbox &optional buffer)
+ "Send the SUBSCRIBE command on the mailbox to server in BUFFER.
+Returns non-nil if successful."
+ (with-current-buffer (or buffer (current-buffer))
+ (imap-ok-p (imap-send-command-wait (concat "SUBSCRIBE \""
+ (imap-utf7-encode mailbox)
+ "\"")))))
+
+(defun imap-mailbox-unsubscribe (mailbox &optional buffer)
+ "Send the SUBSCRIBE command on the mailbox to server in BUFFER.
+Returns non-nil if successful."
+ (with-current-buffer (or buffer (current-buffer))
+ (imap-ok-p (imap-send-command-wait (concat "UNSUBSCRIBE "
+ (imap-utf7-encode mailbox)
+ "\"")))))
+
+(defun imap-mailbox-status (mailbox items &optional buffer)
+ "Get status items ITEM in MAILBOX from server in BUFFER.
+ITEMS can be a symbol or a list of symbols, valid symbols are one of
+the STATUS data items -- ie 'messages, 'recent, 'uidnext, 'uidvalidity
+or 'unseen. If ITEMS is a list of symbols, a list of values is
+returned, if ITEMS is a symbol only it's value is returned."
+ (with-current-buffer (or buffer (current-buffer))
+ (when (imap-ok-p
+ (imap-send-command-wait (list "STATUS \""
+ (imap-utf7-encode mailbox)
+ "\" "
+ (format "%s"
+ (if (listp items)
+ items
+ (list items))))))
+ (if (listp items)
+ (mapcar (lambda (item)
+ (imap-mailbox-get item mailbox))
+ items)
+ (imap-mailbox-get items mailbox)))))
+
+(defun imap-mailbox-acl-get (&optional mailbox buffer)
+ "Get ACL on mailbox from server in BUFFER."
+ (let ((mailbox (imap-utf7-encode mailbox)))
+ (with-current-buffer (or buffer (current-buffer))
+ (when (imap-ok-p
+ (imap-send-command-wait (list "GETACL \""
+ (or mailbox imap-current-mailbox)
+ "\"")))
+ (imap-mailbox-get-1 'acl (or mailbox imap-current-mailbox))))))
+
+(defun imap-mailbox-acl-set (identifier rights &optional mailbox buffer)
+ "Change/set ACL for IDENTIFIER to RIGHTS in MAILBOX from server in BUFFER."
+ (let ((mailbox (imap-utf7-encode mailbox)))
+ (with-current-buffer (or buffer (current-buffer))
+ (imap-ok-p
+ (imap-send-command-wait (list "SETACL \""
+ (or mailbox imap-current-mailbox)
+ "\" "
+ identifier
+ " "
+ rights))))))
+
+(defun imap-mailbox-acl-delete (identifier &optional mailbox buffer)
+ "Removes any <identifier,rights> pair for IDENTIFIER in MAILBOX from server in BUFFER."
+ (let ((mailbox (imap-utf7-encode mailbox)))
+ (with-current-buffer (or buffer (current-buffer))
+ (imap-ok-p
+ (imap-send-command-wait (list "DELETEACL \""
+ (or mailbox imap-current-mailbox)
+ "\" "
+ identifier))))))
+
+\f
+;; Message functions:
+
+(defun imap-current-message (&optional buffer)
+ (with-current-buffer (or buffer (current-buffer))
+ imap-current-message))
+
+(defun imap-list-to-message-set (list)
+ (mapconcat (lambda (item)
+ (number-to-string item))
+ (if (listp list)
+ list
+ (list list))
+ ","))
+
+(defun imap-range-to-message-set (range)
+ (mapconcat
+ (lambda (item)
+ (if (consp item)
+ (format "%d:%d"
+ (car item) (cdr item))
+ (format "%d" item)))
+ (if (and (listp range) (not (listp (cdr range))))
+ (list range) ;; make (1 . 2) into ((1 . 2))
+ range)
+ ","))
+
+(defun imap-fetch-asynch (uids props &optional nouidfetch buffer)
+ (with-current-buffer (or buffer (current-buffer))
+ (imap-send-command (format "%sFETCH %s %s" (if nouidfetch "" "UID ")
+ (if (listp uids)
+ (imap-list-to-message-set uids)
+ uids)
+ props))))
+
+(defun imap-fetch (uids props &optional receive nouidfetch buffer)
+ "Fetch properties PROPS from message set UIDS from server in BUFFER.
+UIDS can be a string, number or a list of numbers. If RECEIVE
+is non-nil return theese properties."
+ (with-current-buffer (or buffer (current-buffer))
+ (when (imap-ok-p (imap-send-command-wait
+ (format "%sFETCH %s %s" (if nouidfetch "" "UID ")
+ (if (listp uids)
+ (imap-list-to-message-set uids)
+ uids)
+ props)))
+ (if (or (null receive) (stringp uids))
+ t
+ (if (listp uids)
+ (mapcar (lambda (uid)
+ (if (listp receive)
+ (mapcar (lambda (prop)
+ (imap-message-get uid prop))
+ receive)
+ (imap-message-get uid receive)))
+ uids)
+ (imap-message-get uids receive))))))
+
+(defun imap-message-put (uid propname value &optional buffer)
+ (with-current-buffer (or buffer (current-buffer))
+ (if imap-message-data
+ (put (intern (number-to-string uid) imap-message-data)
+ propname value)
+ (error "Imap-message-data is nil, uid %s prop %s value %s buffer %s"
+ uid propname value (current-buffer)))
+ t))
+
+(defun imap-message-get (uid propname &optional buffer)
+ (with-current-buffer (or buffer (current-buffer))
+ (get (intern-soft (number-to-string uid) imap-message-data)
+ propname)))
+
+(defun imap-message-map (func propname &optional buffer)
+ "Map a function across each mailbox in `imap-message-data', returning a list."
+ (with-current-buffer (or buffer (current-buffer))
+ (let (result)
+ (mapatoms
+ (lambda (s)
+ (push (funcall func (get s 'UID) (get s propname)) result))
+ imap-message-data)
+ result)))
+
+(defmacro imap-message-envelope-date (uid &optional buffer)
+ `(with-current-buffer (or ,buffer (current-buffer))
+ (elt (imap-message-get ,uid 'ENVELOPE) 0)))
+
+(defmacro imap-message-envelope-subject (uid &optional buffer)
+ `(with-current-buffer (or ,buffer (current-buffer))
+ (elt (imap-message-get ,uid 'ENVELOPE) 1)))
+
+(defmacro imap-message-envelope-from (uid &optional buffer)
+ `(with-current-buffer (or ,buffer (current-buffer))
+ (elt (imap-message-get ,uid 'ENVELOPE) 2)))
+
+(defmacro imap-message-envelope-sender (uid &optional buffer)
+ `(with-current-buffer (or ,buffer (current-buffer))
+ (elt (imap-message-get ,uid 'ENVELOPE) 3)))
+
+(defmacro imap-message-envelope-reply-to (uid &optional buffer)
+ `(with-current-buffer (or ,buffer (current-buffer))
+ (elt (imap-message-get ,uid 'ENVELOPE) 4)))
+
+(defmacro imap-message-envelope-to (uid &optional buffer)
+ `(with-current-buffer (or ,buffer (current-buffer))
+ (elt (imap-message-get ,uid 'ENVELOPE) 5)))
+
+(defmacro imap-message-envelope-cc (uid &optional buffer)
+ `(with-current-buffer (or ,buffer (current-buffer))
+ (elt (imap-message-get ,uid 'ENVELOPE) 6)))
+
+(defmacro imap-message-envelope-bcc (uid &optional buffer)
+ `(with-current-buffer (or ,buffer (current-buffer))
+ (elt (imap-message-get ,uid 'ENVELOPE) 7)))
+
+(defmacro imap-message-envelope-in-reply-to (uid &optional buffer)
+ `(with-current-buffer (or ,buffer (current-buffer))
+ (elt (imap-message-get ,uid 'ENVELOPE) 8)))
+
+(defmacro imap-message-envelope-message-id (uid &optional buffer)
+ `(with-current-buffer (or ,buffer (current-buffer))
+ (elt (imap-message-get ,uid 'ENVELOPE) 9)))
+
+(defmacro imap-message-body (uid &optional buffer)
+ `(with-current-buffer (or ,buffer (current-buffer))
+ (imap-message-get ,uid 'BODY)))
+
+(defun imap-search (predicate &optional buffer)
+ (with-current-buffer (or buffer (current-buffer))
+ (imap-mailbox-put 'search 'dummy)
+ (when (imap-ok-p (imap-send-command-wait (concat "UID SEARCH " predicate)))
+ (if (eq (imap-mailbox-get-1 'search imap-current-mailbox) 'dummy)
+ (error "Missing SEARCH response to a SEARCH command")
+ (imap-mailbox-get-1 'search imap-current-mailbox)))))
+
+(defun imap-message-flag-permanent-p (flag &optional mailbox buffer)
+ "Return t iff FLAG can be permanently (between IMAP sessions) saved on articles, in MAILBOX on server in BUFFER."
+ (with-current-buffer (or buffer (current-buffer))
+ (or (member "\\*" (imap-mailbox-get 'permanentflags mailbox))
+ (member flag (imap-mailbox-get 'permanentflags mailbox)))))
+
+(defun imap-message-flags-set (articles flags &optional silent buffer)
+ (when (and articles flags)
+ (with-current-buffer (or buffer (current-buffer))
+ (imap-ok-p (imap-send-command-wait
+ (concat "UID STORE " articles
+ " FLAGS" (if silent ".SILENT") " (" flags ")"))))))
+
+(defun imap-message-flags-del (articles flags &optional silent buffer)
+ (when (and articles flags)
+ (with-current-buffer (or buffer (current-buffer))
+ (imap-ok-p (imap-send-command-wait
+ (concat "UID STORE " articles
+ " -FLAGS" (if silent ".SILENT") " (" flags ")"))))))
+
+(defun imap-message-flags-add (articles flags &optional silent buffer)
+ (when (and articles flags)
+ (with-current-buffer (or buffer (current-buffer))
+ (imap-ok-p (imap-send-command-wait
+ (concat "UID STORE " articles
+ " +FLAGS" (if silent ".SILENT") " (" flags ")"))))))
+
+(defun imap-message-copyuid-1 (mailbox)
+ (if (imap-capability 'UIDPLUS)
+ (list (nth 0 (imap-mailbox-get-1 'copyuid mailbox))
+ (string-to-number (nth 2 (imap-mailbox-get-1 'copyuid mailbox))))
+ (let ((old-mailbox imap-current-mailbox)
+ (state imap-state)
+ (imap-message-data (make-vector 2 0)))
+ (when (imap-mailbox-examine-1 mailbox)
+ (prog1
+ (and (imap-fetch "*" "UID")
+ (list (imap-mailbox-get-1 'uidvalidity mailbox)
+ (apply 'max (imap-message-map
+ (lambda (uid prop) uid) 'UID))))
+ (if old-mailbox
+ (imap-mailbox-select old-mailbox (eq state 'examine))
+ (imap-mailbox-unselect)))))))
+
+(defun imap-message-copyuid (mailbox &optional buffer)
+ (with-current-buffer (or buffer (current-buffer))
+ (imap-message-copyuid-1 (imap-utf7-decode mailbox))))
+
+(defun imap-message-copy (articles mailbox
+ &optional dont-create no-copyuid buffer)
+ "Copy ARTICLES (a string message set) to MAILBOX on server in
+BUFFER, creating mailbox if it doesn't exist. If dont-create is
+non-nil, it will not create a mailbox. On success, return a list with
+the UIDVALIDITY of the mailbox the article(s) was copied to as the
+first element, rest of list contain the saved articles' UIDs."
+ (when articles
+ (with-current-buffer (or buffer (current-buffer))
+ (let ((mailbox (imap-utf7-encode mailbox)))
+ (if (let ((cmd (concat "UID COPY " articles " \"" mailbox "\""))
+ (imap-current-target-mailbox mailbox))
+ (if (imap-ok-p (imap-send-command-wait cmd))
+ t
+ (when (and (not dont-create)
+ (imap-mailbox-get-1 'trycreate mailbox))
+ (imap-mailbox-create-1 mailbox)
+ (imap-ok-p (imap-send-command-wait cmd)))))
+ (or no-copyuid
+ (imap-message-copyuid-1 mailbox)))))))
+
+(defun imap-message-appenduid-1 (mailbox)
+ (if (imap-capability 'UIDPLUS)
+ (imap-mailbox-get-1 'appenduid mailbox)
+ (let ((old-mailbox imap-current-mailbox)
+ (state imap-state)
+ (imap-message-data (make-vector 2 0)))
+ (when (imap-mailbox-examine-1 mailbox)
+ (prog1
+ (and (imap-fetch "*" "UID")
+ (list (imap-mailbox-get-1 'uidvalidity mailbox)
+ (apply 'max (imap-message-map
+ (lambda (uid prop) uid) 'UID))))
+ (if old-mailbox
+ (imap-mailbox-select old-mailbox (eq state 'examine))
+ (imap-mailbox-unselect)))))))
+
+(defun imap-message-appenduid (mailbox &optional buffer)
+ (with-current-buffer (or buffer (current-buffer))
+ (imap-message-appenduid-1 (imap-utf7-encode mailbox))))
+
+(defun imap-message-append (mailbox article &optional flags date-time buffer)
+ "Append ARTICLE (a buffer) to MAILBOX on server in BUFFER.
+FLAGS and DATE-TIME is currently not used. Return a cons holding
+uidvalidity of MAILBOX and UID the newly created article got, or nil
+on failure."
+ (let ((mailbox (imap-utf7-encode mailbox)))
+ (with-current-buffer (or buffer (current-buffer))
+ (and (let ((imap-current-target-mailbox mailbox))
+ (imap-ok-p
+ (imap-send-command-wait
+ (list "APPEND \"" mailbox "\" " article))))
+ (imap-message-appenduid-1 mailbox)))))
+
+(defun imap-body-lines (body)
+ "Return number of lines in article by looking at the mime bodystructure BODY."
+ (if (listp body)
+ (if (stringp (car body))
+ (cond ((and (string= (upcase (car body)) "TEXT")
+ (numberp (nth 7 body)))
+ (nth 7 body))
+ ((and (string= (upcase (car body)) "MESSAGE")
+ (numberp (nth 9 body)))
+ (nth 9 body))
+ (t 0))
+ (apply '+ (mapcar 'imap-body-lines body)))
+ 0))
+
+(defun imap-envelope-from (from)
+ "Return a from string line."
+ (and from
+ (concat (aref from 0)
+ (if (aref from 0) " <")
+ (aref from 2)
+ "@"
+ (aref from 3)
+ (if (aref from 0) ">"))))
+
+\f
+;; Internal functions.
+
+(defun imap-send-command-1 (cmdstr)
+ (setq cmdstr (concat cmdstr imap-client-eol))
+ (and imap-log
+ (with-current-buffer (get-buffer-create imap-log)
+ (imap-disable-multibyte)
+ (buffer-disable-undo)
+ (goto-char (point-max))
+ (insert cmdstr)))
+ (process-send-string imap-process cmdstr))
+
+(defun imap-send-command (command &optional buffer)
+ (with-current-buffer (or buffer (current-buffer))
+ (if (not (listp command)) (setq command (list command)))
+ (let ((tag (setq imap-tag (1+ imap-tag)))
+ cmd cmdstr)
+ (setq cmdstr (concat (number-to-string imap-tag) " "))
+ (while (setq cmd (pop command))
+ (cond ((stringp cmd)
+ (setq cmdstr (concat cmdstr cmd)))
+ ((bufferp cmd)
+ (let ((eol imap-client-eol)
+ (calcfirst imap-calculate-literal-size-first)
+ size)
+ (with-current-buffer cmd
+ (if calcfirst
+ (setq size (buffer-size)))
+ (when (not (equal eol "\r\n"))
+ ;; XXX modifies buffer!
+ (goto-char (point-min))
+ (while (search-forward "\r\n" nil t)
+ (replace-match eol)))
+ (if (not calcfirst)
+ (setq size (buffer-size))))
+ (setq cmdstr
+ (concat cmdstr (format "{%d}" size))))
+ (unwind-protect
+ (progn
+ (imap-send-command-1 cmdstr)
+ (setq cmdstr nil)
+ (if (not (eq (imap-wait-for-tag tag) 'INCOMPLETE))
+ (setq command nil);; abort command if no cont-req
+ (let ((process imap-process)
+ (stream imap-stream)
+ (eol imap-client-eol))
+ (with-current-buffer cmd
+ (and imap-log
+ (with-current-buffer (get-buffer-create
+ imap-log)
+ (imap-disable-multibyte)
+ (buffer-disable-undo)
+ (goto-char (point-max))
+ (insert-buffer-substring cmd)))
+ (process-send-region process (point-min)
+ (point-max)))
+ (process-send-string process imap-client-eol))))
+ (setq imap-continuation nil)))
+ ((functionp cmd)
+ (imap-send-command-1 cmdstr)
+ (setq cmdstr nil)
+ (unwind-protect
+ (if (not (eq (imap-wait-for-tag tag) 'INCOMPLETE))
+ (setq command nil);; abort command if no cont-req
+ (setq command (cons (funcall cmd imap-continuation)
+ command)))
+ (setq imap-continuation nil)))
+ (t
+ (error "Unknown command type"))))
+ (if cmdstr
+ (imap-send-command-1 cmdstr))
+ tag)))
+
+(defun imap-wait-for-tag (tag &optional buffer)
+ (with-current-buffer (or buffer (current-buffer))
+ (while (and (null imap-continuation)
+ (< imap-reached-tag tag))
+ (or (and (not (memq (process-status imap-process) '(open run)))
+ (sit-for 1))
+ (accept-process-output imap-process 1)))
+ (or (assq tag imap-failed-tags)
+ (if imap-continuation
+ 'INCOMPLETE
+ 'OK))))
+
+(defun imap-sentinel (process string)
+ (delete-process process))
+
+(defun imap-find-next-line ()
+ "Return point at end of current line, taking into account literals.
+Return nil if no complete line has arrived."
+ (when (re-search-forward (concat imap-server-eol "\\|{\\([0-9]+\\)}"
+ imap-server-eol)
+ nil t)
+ (if (match-string 1)
+ (if (< (point-max) (+ (point) (string-to-number (match-string 1))))
+ nil
+ (goto-char (+ (point) (string-to-number (match-string 1))))
+ (imap-find-next-line))
+ (point))))
+
+(defun imap-arrival-filter (proc string)
+ "IMAP process filter."
+ (with-current-buffer (process-buffer proc)
+ (goto-char (point-max))
+ (insert string)
+ (and imap-log
+ (with-current-buffer (get-buffer-create imap-log)
+ (imap-disable-multibyte)
+ (buffer-disable-undo)
+ (goto-char (point-max))
+ (insert string)))
+ (let (end)
+ (goto-char (point-min))
+ (while (setq end (imap-find-next-line))
+ (save-restriction
+ (narrow-to-region (point-min) end)
+ (delete-backward-char (length imap-server-eol))
+ (goto-char (point-min))
+ (unwind-protect
+ (cond ((eq imap-state 'initial)
+ (imap-parse-greeting))
+ ((or (eq imap-state 'auth)
+ (eq imap-state 'nonauth)
+ (eq imap-state 'selected)
+ (eq imap-state 'examine))
+ (imap-parse-response))
+ (t
+ (message "Unknown state %s in arrival filter"
+ imap-state)))
+ (delete-region (point-min) (point-max))))))))
+
+\f
+;; Imap parser.
+
+(defsubst imap-forward ()
+ (or (eobp) (forward-char)))
+
+;; number = 1*DIGIT
+;; ; Unsigned 32-bit integer
+;; ; (0 <= n < 4,294,967,296)
+
+(defsubst imap-parse-number ()
+ (when (looking-at "[0-9]+")
+ (prog1
+ (string-to-number (match-string 0))
+ (goto-char (match-end 0)))))
+
+;; literal = "{" number "}" CRLF *CHAR8
+;; ; Number represents the number of CHAR8s
+
+(defsubst imap-parse-literal ()
+ (when (looking-at "{\\([0-9]+\\)}\r\n")
+ (let ((pos (match-end 0))
+ (len (string-to-number (match-string 1))))
+ (if (< (point-max) (+ pos len))
+ nil
+ (goto-char (+ pos len))
+ (buffer-substring pos (+ pos len))))))
+
+;; string = quoted / literal
+;;
+;; quoted = DQUOTE *QUOTED-CHAR DQUOTE
+;;
+;; QUOTED-CHAR = <any TEXT-CHAR except quoted-specials> /
+;; "\" quoted-specials
+;;
+;; quoted-specials = DQUOTE / "\"
+;;
+;; TEXT-CHAR = <any CHAR except CR and LF>
+
+(defsubst imap-parse-string ()
+ (cond ((eq (char-after) ?\")
+ (forward-char 1)
+ (let ((p (point)) (name ""))
+ (skip-chars-forward "^\"\\\\")
+ (setq name (buffer-substring p (point)))
+ (while (eq (char-after) ?\\)
+ (setq p (1+ (point)))
+ (forward-char 2)
+ (skip-chars-forward "^\"\\\\")
+ (setq name (concat name (buffer-substring p (point)))))
+ (forward-char 1)
+ name))
+ ((eq (char-after) ?{)
+ (imap-parse-literal))))
+
+;; nil = "NIL"
+
+(defsubst imap-parse-nil ()
+ (if (looking-at "NIL")
+ (goto-char (match-end 0))))
+
+;; nstring = string / nil
+
+(defsubst imap-parse-nstring ()
+ (or (imap-parse-string)
+ (and (imap-parse-nil)
+ nil)))
+
+;; astring = atom / string
+;;
+;; atom = 1*ATOM-CHAR
+;;
+;; ATOM-CHAR = <any CHAR except atom-specials>
+;;
+;; atom-specials = "(" / ")" / "{" / SP / CTL / list-wildcards /
+;; quoted-specials
+;;
+;; list-wildcards = "%" / "*"
+;;
+;; quoted-specials = DQUOTE / "\"
+
+(defsubst imap-parse-astring ()
+ (or (imap-parse-string)
+ (buffer-substring (point)
+ (if (re-search-forward "[(){ \r\n%*\"\\]" nil t)
+ (goto-char (1- (match-end 0)))
+ (end-of-line)
+ (point)))))
+
+;; address = "(" addr-name SP addr-adl SP addr-mailbox SP
+;; addr-host ")"
+;;
+;; addr-adl = nstring
+;; ; Holds route from [RFC-822] route-addr if
+;; ; non-NIL
+;;
+;; addr-host = nstring
+;; ; NIL indicates [RFC-822] group syntax.
+;; ; Otherwise, holds [RFC-822] domain name
+;;
+;; addr-mailbox = nstring
+;; ; NIL indicates end of [RFC-822] group; if
+;; ; non-NIL and addr-host is NIL, holds
+;; ; [RFC-822] group name.
+;; ; Otherwise, holds [RFC-822] local-part
+;; ; after removing [RFC-822] quoting
+;;
+;; addr-name = nstring
+;; ; If non-NIL, holds phrase from [RFC-822]
+;; ; mailbox after removing [RFC-822] quoting
+;;
+
+(defsubst imap-parse-address ()
+ (let (address)
+ (when (eq (char-after) ?\()
+ (imap-forward)
+ (setq address (vector (prog1 (imap-parse-nstring)
+ (imap-forward))
+ (prog1 (imap-parse-nstring)
+ (imap-forward))
+ (prog1 (imap-parse-nstring)
+ (imap-forward))
+ (imap-parse-nstring)))
+ (when (eq (char-after) ?\))
+ (imap-forward)
+ address))))
+
+;; address-list = "(" 1*address ")" / nil
+;;
+;; nil = "NIL"
+
+(defsubst imap-parse-address-list ()
+ (if (eq (char-after) ?\()
+ (let (address addresses)
+ (imap-forward)
+ (while (and (not (eq (char-after) ?\)))
+ ;; next line for MS Exchange bug
+ (progn (and (eq (char-after) ? ) (imap-forward)) t)
+ (setq address (imap-parse-address)))
+ (setq addresses (cons address addresses)))
+ (when (eq (char-after) ?\))
+ (imap-forward)
+ (nreverse addresses)))
+ (assert (imap-parse-nil))))
+
+;; mailbox = "INBOX" / astring
+;; ; INBOX is case-insensitive. All case variants of
+;; ; INBOX (e.g. "iNbOx") MUST be interpreted as INBOX
+;; ; not as an astring. An astring which consists of
+;; ; the case-insensitive sequence "I" "N" "B" "O" "X"
+;; ; is considered to be INBOX and not an astring.
+;; ; Refer to section 5.1 for further
+;; ; semantic details of mailbox names.
+
+(defsubst imap-parse-mailbox ()
+ (let ((mailbox (imap-parse-astring)))
+ (if (string-equal "INBOX" (upcase mailbox))
+ "INBOX"
+ mailbox)))
+
+;; greeting = "*" SP (resp-cond-auth / resp-cond-bye) CRLF
+;;
+;; resp-cond-auth = ("OK" / "PREAUTH") SP resp-text
+;; ; Authentication condition
+;;
+;; resp-cond-bye = "BYE" SP resp-text
+
+(defun imap-parse-greeting ()
+ "Parse a IMAP greeting."
+ (cond ((looking-at "\\* OK ")
+ (setq imap-state 'nonauth))
+ ((looking-at "\\* PREAUTH ")
+ (setq imap-state 'auth))
+ ((looking-at "\\* BYE ")
+ (setq imap-state 'closed))))
+
+;; response = *(continue-req / response-data) response-done
+;;
+;; continue-req = "+" SP (resp-text / base64) CRLF
+;;
+;; response-data = "*" SP (resp-cond-state / resp-cond-bye /
+;; mailbox-data / message-data / capability-data) CRLF
+;;
+;; response-done = response-tagged / response-fatal
+;;
+;; response-fatal = "*" SP resp-cond-bye CRLF
+;; ; Server closes connection immediately
+;;
+;; response-tagged = tag SP resp-cond-state CRLF
+;;
+;; resp-cond-state = ("OK" / "NO" / "BAD") SP resp-text
+;; ; Status condition
+;;
+;; resp-cond-bye = "BYE" SP resp-text
+;;
+;; mailbox-data = "FLAGS" SP flag-list /
+;; "LIST" SP mailbox-list /
+;; "LSUB" SP mailbox-list /
+;; "SEARCH" *(SP nz-number) /
+;; "STATUS" SP mailbox SP "("
+;; [status-att SP number *(SP status-att SP number)] ")" /
+;; number SP "EXISTS" /
+;; number SP "RECENT"
+;;
+;; message-data = nz-number SP ("EXPUNGE" / ("FETCH" SP msg-att))
+;;
+;; capability-data = "CAPABILITY" *(SP capability) SP "IMAP4rev1"
+;; *(SP capability)
+;; ; IMAP4rev1 servers which offer RFC 1730
+;; ; compatibility MUST list "IMAP4" as the first
+;; ; capability.
+
+(defun imap-parse-response ()
+ "Parse a IMAP command response."
+ (let (token)
+ (case (setq token (read (current-buffer)))
+ (+ (setq imap-continuation
+ (or (buffer-substring (min (point-max) (1+ (point)))
+ (point-max))
+ t)))
+ (* (case (prog1 (setq token (read (current-buffer)))
+ (imap-forward))
+ (OK (imap-parse-resp-text))
+ (NO (imap-parse-resp-text))
+ (BAD (imap-parse-resp-text))
+ (BYE (imap-parse-resp-text))
+ (FLAGS (imap-mailbox-put 'flags (imap-parse-flag-list)))
+ (LIST (imap-parse-data-list 'list))
+ (LSUB (imap-parse-data-list 'lsub))
+ (SEARCH (imap-mailbox-put
+ 'search
+ (read (concat "(" (buffer-substring (point) (point-max)) ")"))))
+ (STATUS (imap-parse-status))
+ (CAPABILITY (setq imap-capability
+ (read (concat "(" (upcase (buffer-substring
+ (point) (point-max)))
+ ")"))))
+ (ACL (imap-parse-acl))
+ (t (case (prog1 (read (current-buffer))
+ (imap-forward))
+ (EXISTS (imap-mailbox-put 'exists token))
+ (RECENT (imap-mailbox-put 'recent token))
+ (EXPUNGE t)
+ (FETCH (imap-parse-fetch token))
+ (t (message "Garbage: %s" (buffer-string)))))))
+ (t (let (status)
+ (if (not (integerp token))
+ (message "Garbage: %s" (buffer-string))
+ (case (prog1 (setq status (read (current-buffer)))
+ (imap-forward))
+ (OK (progn
+ (setq imap-reached-tag (max imap-reached-tag token))
+ (imap-parse-resp-text)))
+ (NO (progn
+ (setq imap-reached-tag (max imap-reached-tag token))
+ (save-excursion
+ (imap-parse-resp-text))
+ (let (code text)
+ (when (eq (char-after) ?\[)
+ (setq code (buffer-substring (point)
+ (search-forward "]")))
+ (imap-forward))
+ (setq text (buffer-substring (point) (point-max)))
+ (push (list token status code text)
+ imap-failed-tags))))
+ (BAD (progn
+ (setq imap-reached-tag (max imap-reached-tag token))
+ (save-excursion
+ (imap-parse-resp-text))
+ (let (code text)
+ (when (eq (char-after) ?\[)
+ (setq code (buffer-substring (point)
+ (search-forward "]")))
+ (imap-forward))
+ (setq text (buffer-substring (point) (point-max)))
+ (push (list token status code text) imap-failed-tags)
+ (error "Internal error, tag %s status %s code %s text %s"
+ token status code text))))
+ (t (message "Garbage: %s" (buffer-string))))))))))
+
+;; resp-text = ["[" resp-text-code "]" SP] text
+;;
+;; text = 1*TEXT-CHAR
+;;
+;; TEXT-CHAR = <any CHAR except CR and LF>
+
+(defun imap-parse-resp-text ()
+ (imap-parse-resp-text-code))
+
+;; resp-text-code = "ALERT" /
+;; "BADCHARSET [SP "(" astring *(SP astring) ")" ] /
+;; "NEWNAME" SP string SP string /
+;; "PARSE" /
+;; "PERMANENTFLAGS" SP "("
+;; [flag-perm *(SP flag-perm)] ")" /
+;; "READ-ONLY" /
+;; "READ-WRITE" /
+;; "TRYCREATE" /
+;; "UIDNEXT" SP nz-number /
+;; "UIDVALIDITY" SP nz-number /
+;; "UNSEEN" SP nz-number /
+;; resp-text-atom [SP 1*<any TEXT-CHAR except "]">]
+;;
+;; resp_code_apnd = "APPENDUID" SPACE nz_number SPACE uniqueid
+;;
+;; resp_code_copy = "COPYUID" SPACE nz_number SPACE set SPACE set
+;;
+;; set = sequence-num / (sequence-num ":" sequence-num) /
+;; (set "," set)
+;; ; Identifies a set of messages. For message
+;; ; sequence numbers, these are consecutive
+;; ; numbers from 1 to the number of messages in
+;; ; the mailbox
+;; ; Comma delimits individual numbers, colon
+;; ; delimits between two numbers inclusive.
+;; ; Example: 2,4:7,9,12:* is 2,4,5,6,7,9,12,13,
+;; ; 14,15 for a mailbox with 15 messages.
+;;
+;; sequence-num = nz-number / "*"
+;; ; * is the largest number in use. For message
+;; ; sequence numbers, it is the number of messages
+;; ; in the mailbox. For unique identifiers, it is
+;; ; the unique identifier of the last message in
+;; ; the mailbox.
+;;
+;; flag-perm = flag / "\*"
+;;
+;; flag = "\Answered" / "\Flagged" / "\Deleted" /
+;; "\Seen" / "\Draft" / flag-keyword / flag-extension
+;; ; Does not include "\Recent"
+;;
+;; flag-extension = "\" atom
+;; ; Future expansion. Client implementations
+;; ; MUST accept flag-extension flags. Server
+;; ; implementations MUST NOT generate
+;; ; flag-extension flags except as defined by
+;; ; future standard or standards-track
+;; ; revisions of this specification.
+;;
+;; flag-keyword = atom
+;;
+;; resp-text-atom = 1*<any ATOM-CHAR except "]">
+
+(defun imap-parse-resp-text-code ()
+ (when (eq (char-after) ?\[)
+ (imap-forward)
+ (cond ((search-forward "PERMANENTFLAGS " nil t)
+ (imap-mailbox-put 'permanentflags (imap-parse-flag-list)))
+ ((search-forward "UIDNEXT " nil t)
+ (imap-mailbox-put 'uidnext (read (current-buffer))))
+ ((search-forward "UNSEEN " nil t)
+ (imap-mailbox-put 'unseen (read (current-buffer))))
+ ((looking-at "UIDVALIDITY \\([0-9]+\\)")
+ (imap-mailbox-put 'uidvalidity (match-string 1)))
+ ((search-forward "READ-ONLY" nil t)
+ (imap-mailbox-put 'read-only t))
+ ((search-forward "NEWNAME " nil t)
+ (let (oldname newname)
+ (setq oldname (imap-parse-string))
+ (imap-forward)
+ (setq newname (imap-parse-string))
+ (imap-mailbox-put 'newname newname oldname)))
+ ((search-forward "TRYCREATE" nil t)
+ (imap-mailbox-put 'trycreate t imap-current-target-mailbox))
+ ((looking-at "APPENDUID \\([0-9]+\\) \\([0-9]+\\)")
+ (imap-mailbox-put 'appenduid
+ (list (match-string 1)
+ (string-to-number (match-string 2)))
+ imap-current-target-mailbox))
+ ((looking-at "COPYUID \\([0-9]+\\) \\([0-9,:]+\\) \\([0-9,:]+\\)")
+ (imap-mailbox-put 'copyuid (list (match-string 1)
+ (match-string 2)
+ (match-string 3))
+ imap-current-target-mailbox))
+ ((search-forward "ALERT] " nil t)
+ (message "Imap server %s information: %s" imap-server
+ (buffer-substring (point) (point-max)))))))
+
+;; mailbox-list = "(" [mbx-list-flags] ")" SP
+;; (DQUOTE QUOTED-CHAR DQUOTE / nil) SP mailbox
+;;
+;; mbx-list-flags = *(mbx-list-oflag SP) mbx-list-sflag
+;; *(SP mbx-list-oflag) /
+;; mbx-list-oflag *(SP mbx-list-oflag)
+;;
+;; mbx-list-oflag = "\Noinferiors" / flag-extension
+;; ; Other flags; multiple possible per LIST response
+;;
+;; mbx-list-sflag = "\Noselect" / "\Marked" / "\Unmarked"
+;; ; Selectability flags; only one per LIST response
+;;
+;; QUOTED-CHAR = <any TEXT-CHAR except quoted-specials> /
+;; "\" quoted-specials
+;;
+;; quoted-specials = DQUOTE / "\"
+
+(defun imap-parse-data-list (type)
+ (let (flags delimiter mailbox)
+ (setq flags (imap-parse-flag-list))
+ (when (looking-at " NIL\\| \"\\\\?\\(.\\)\"")
+ (setq delimiter (match-string 1))
+ (goto-char (1+ (match-end 0)))
+ (when (setq mailbox (imap-parse-mailbox))
+ (imap-mailbox-put type t mailbox)
+ (imap-mailbox-put 'list-flags flags mailbox)
+ (imap-mailbox-put 'delimiter delimiter mailbox)))))
+
+;; msg_att ::= "(" 1#("ENVELOPE" SPACE envelope /
+;; "FLAGS" SPACE "(" #(flag / "\Recent") ")" /
+;; "INTERNALDATE" SPACE date_time /
+;; "RFC822" [".HEADER" / ".TEXT"] SPACE nstring /
+;; "RFC822.SIZE" SPACE number /
+;; "BODY" ["STRUCTURE"] SPACE body /
+;; "BODY" section ["<" number ">"] SPACE nstring /
+;; "UID" SPACE uniqueid) ")"
+;;
+;; date_time ::= <"> date_day_fixed "-" date_month "-" date_year
+;; SPACE time SPACE zone <">
+;;
+;; section ::= "[" [section_text / (nz_number *["." nz_number]
+;; ["." (section_text / "MIME")])] "]"
+;;
+;; section_text ::= "HEADER" / "HEADER.FIELDS" [".NOT"]
+;; SPACE header_list / "TEXT"
+;;
+;; header_fld_name ::= astring
+;;
+;; header_list ::= "(" 1#header_fld_name ")"
+
+(defsubst imap-parse-header-list ()
+ (when (eq (char-after) ?\()
+ (let (strlist)
+ (while (not (eq (char-after) ?\)))
+ (imap-forward)
+ (push (imap-parse-astring) strlist))
+ (imap-forward)
+ (nreverse strlist))))
+
+(defsubst imap-parse-fetch-body-section ()
+ (let ((section
+ (buffer-substring (point) (1- (re-search-forward "[] ]" nil t)))))
+ (if (eq (char-before) ? )
+ (prog1
+ (mapconcat 'identity (cons section (imap-parse-header-list)) " ")
+ (search-forward "]" nil t))
+ section)))
+
+(defun imap-parse-fetch (response)
+ (when (eq (char-after) ?\()
+ (let (uid flags envelope internaldate rfc822 rfc822header rfc822text
+ rfc822size body bodydetail bodystructure)
+ (while (not (eq (char-after) ?\)))
+ (imap-forward)
+ (let ((token (read (current-buffer))))
+ (imap-forward)
+ (cond ((eq token 'UID)
+ (setq uid (ignore-errors (read (current-buffer)))))
+ ((eq token 'FLAGS)
+ (setq flags (imap-parse-flag-list)))
+ ((eq token 'ENVELOPE)
+ (setq envelope (imap-parse-envelope)))
+ ((eq token 'INTERNALDATE)
+ (setq internaldate (imap-parse-string)))
+ ((eq token 'RFC822)
+ (setq rfc822 (imap-parse-nstring)))
+ ((eq token 'RFC822.HEADER)
+ (setq rfc822header (imap-parse-nstring)))
+ ((eq token 'RFC822.TEXT)
+ (setq rfc822text (imap-parse-nstring)))
+ ((eq token 'RFC822.SIZE)
+ (setq rfc822size (read (current-buffer))))
+ ((eq token 'BODY)
+ (if (eq (char-before) ?\[)
+ (push (list
+ (upcase (imap-parse-fetch-body-section))
+ (and (eq (char-after) ?<)
+ (buffer-substring (1+ (point))
+ (search-forward ">" nil t)))
+ (progn (imap-forward)
+ (imap-parse-nstring)))
+ bodydetail)
+ (setq body (imap-parse-body))))
+ ((eq token 'BODYSTRUCTURE)
+ (setq bodystructure (imap-parse-body))))))
+ (when uid
+ (setq imap-current-message uid)
+ (imap-message-put uid 'UID uid)
+ (and flags (imap-message-put uid 'FLAGS flags))
+ (and envelope (imap-message-put uid 'ENVELOPE envelope))
+ (and internaldate (imap-message-put uid 'INTERNALDATE internaldate))
+ (and rfc822 (imap-message-put uid 'RFC822 rfc822))
+ (and rfc822header (imap-message-put uid 'RFC822.HEADER rfc822header))
+ (and rfc822text (imap-message-put uid 'RFC822.TEXT rfc822text))
+ (and rfc822size (imap-message-put uid 'RFC822.SIZE rfc822size))
+ (and body (imap-message-put uid 'BODY body))
+ (and bodydetail (imap-message-put uid 'BODYDETAIL bodydetail))
+ (and bodystructure (imap-message-put uid 'BODYSTRUCTURE bodystructure))
+ (run-hooks 'imap-fetch-data-hook)))))
+
+;; mailbox-data = ...
+;; "STATUS" SP mailbox SP "("
+;; [status-att SP number
+;; *(SP status-att SP number)] ")"
+;; ...
+;;
+;; status-att = "MESSAGES" / "RECENT" / "UIDNEXT" / "UIDVALIDITY" /
+;; "UNSEEN"
+
+(defun imap-parse-status ()
+ (let ((mailbox (imap-parse-mailbox)))
+ (when (and mailbox (search-forward "(" nil t))
+ (while (not (eq (char-after) ?\)))
+ (let ((token (read (current-buffer))))
+ (cond ((eq token 'MESSAGES)
+ (imap-mailbox-put 'messages (read (current-buffer)) mailbox))
+ ((eq token 'RECENT)
+ (imap-mailbox-put 'recent (read (current-buffer)) mailbox))
+ ((eq token 'UIDNEXT)
+ (imap-mailbox-put 'uidnext (read (current-buffer)) mailbox))
+ ((eq token 'UIDVALIDITY)
+ (and (looking-at " \\([0-9]+\\)")
+ (imap-mailbox-put 'uidvalidity (match-string 1) mailbox)
+ (goto-char (match-end 1))))
+ ((eq token 'UNSEEN)
+ (imap-mailbox-put 'unseen (read (current-buffer)) mailbox))
+ (t
+ (message "Unknown status data %s in mailbox %s ignored"
+ token mailbox))))))))
+
+;; acl_data ::= "ACL" SPACE mailbox *(SPACE identifier SPACE
+;; rights)
+;;
+;; identifier ::= astring
+;;
+;; rights ::= astring
+
+(defun imap-parse-acl ()
+ (let ((mailbox (imap-parse-mailbox))
+ identifier rights acl)
+ (while (eq (char-after) ?\ )
+ (imap-forward)
+ (setq identifier (imap-parse-astring))
+ (imap-forward)
+ (setq rights (imap-parse-astring))
+ (setq acl (append acl (list (cons identifier rights)))))
+ (imap-mailbox-put 'acl acl mailbox)))
+
+;; flag-list = "(" [flag *(SP flag)] ")"
+;;
+;; flag = "\Answered" / "\Flagged" / "\Deleted" /
+;; "\Seen" / "\Draft" / flag-keyword / flag-extension
+;; ; Does not include "\Recent"
+;;
+;; flag-keyword = atom
+;;
+;; flag-extension = "\" atom
+;; ; Future expansion. Client implementations
+;; ; MUST accept flag-extension flags. Server
+;; ; implementations MUST NOT generate
+;; ; flag-extension flags except as defined by
+;; ; future standard or standards-track
+;; ; revisions of this specification.
+
+(defun imap-parse-flag-list ()
+ (let (flag-list start)
+ (when (eq (char-after) ?\()
+ (imap-forward)
+ (while (and (not (eq (char-before) ?\)))
+ (setq start (point))
+ (> (skip-chars-forward "^ )" (gnus-point-at-eol)) 0))
+ (push (buffer-substring start (point)) flag-list)
+ (imap-forward))
+ (nreverse flag-list))))
+
+;; envelope = "(" env-date SP env-subject SP env-from SP env-sender SP
+;; env-reply-to SP env-to SP env-cc SP env-bcc SP
+;; env-in-reply-to SP env-message-id ")"
+;;
+;; env-bcc = "(" 1*address ")" / nil
+;;
+;; env-cc = "(" 1*address ")" / nil
+;;
+;; env-date = nstring
+;;
+;; env-from = "(" 1*address ")" / nil
+;;
+;; env-in-reply-to = nstring
+;;
+;; env-message-id = nstring
+;;
+;; env-reply-to = "(" 1*address ")" / nil
+;;
+;; env-sender = "(" 1*address ")" / nil
+;;
+;; env-subject = nstring
+;;
+;; env-to = "(" 1*address ")" / nil
+
+(defun imap-parse-envelope ()
+ (when (eq (char-after) ?\()
+ (imap-forward)
+ (vector (prog1 (imap-parse-nstring);; date
+ (imap-forward))
+ (prog1 (imap-parse-nstring);; subject
+ (imap-forward))
+ (prog1 (imap-parse-address-list);; from
+ (imap-forward))
+ (prog1 (imap-parse-address-list);; sender
+ (imap-forward))
+ (prog1 (imap-parse-address-list);; reply-to
+ (imap-forward))
+ (prog1 (imap-parse-address-list);; to
+ (imap-forward))
+ (prog1 (imap-parse-address-list);; cc
+ (imap-forward))
+ (prog1 (imap-parse-address-list);; bcc
+ (imap-forward))
+ (prog1 (imap-parse-nstring);; in-reply-to
+ (imap-forward))
+ (prog1 (imap-parse-nstring);; message-id
+ (imap-forward)))))
+
+;; body-fld-param = "(" string SP string *(SP string SP string) ")" / nil
+
+(defsubst imap-parse-string-list ()
+ (cond ((eq (char-after) ?\();; body-fld-param
+ (let (strlist str)
+ (imap-forward)
+ (while (setq str (imap-parse-string))
+ (push str strlist)
+ ;; buggy stalker communigate pro 3.0 doesn't print SPC
+ ;; between body-fld-param's sometimes
+ (or (eq (char-after) ?\")
+ (imap-forward)))
+ (nreverse strlist)))
+ ((imap-parse-nil)
+ nil)))
+
+;; body-extension = nstring / number /
+;; "(" body-extension *(SP body-extension) ")"
+;; ; Future expansion. Client implementations
+;; ; MUST accept body-extension fields. Server
+;; ; implementations MUST NOT generate
+;; ; body-extension fields except as defined by
+;; ; future standard or standards-track
+;; ; revisions of this specification.
+
+(defun imap-parse-body-extension ()
+ (if (eq (char-after) ?\()
+ (let (b-e)
+ (imap-forward)
+ (push (imap-parse-body-extension) b-e)
+ (while (eq (char-after) ?\ )
+ (imap-forward)
+ (push (imap-parse-body-extension) b-e))
+ (assert (eq (char-after) ?\)))
+ (imap-forward)
+ (nreverse b-e))
+ (or (imap-parse-number)
+ (imap-parse-nstring))))
+
+;; body-ext-1part = body-fld-md5 [SP body-fld-dsp [SP body-fld-lang
+;; *(SP body-extension)]]
+;; ; MUST NOT be returned on non-extensible
+;; ; "BODY" fetch
+;;
+;; body-ext-mpart = body-fld-param [SP body-fld-dsp [SP body-fld-lang
+;; *(SP body-extension)]]
+;; ; MUST NOT be returned on non-extensible
+;; ; "BODY" fetch
+
+(defsubst imap-parse-body-ext ()
+ (let (ext)
+ (when (eq (char-after) ?\ );; body-fld-dsp
+ (imap-forward)
+ (let (dsp)
+ (if (eq (char-after) ?\()
+ (progn
+ (imap-forward)
+ (push (imap-parse-string) dsp)
+ (imap-forward)
+ (push (imap-parse-string-list) dsp)
+ (imap-forward))
+ (assert (imap-parse-nil)))
+ (push (nreverse dsp) ext))
+ (when (eq (char-after) ?\ );; body-fld-lang
+ (imap-forward)
+ (if (eq (char-after) ?\()
+ (push (imap-parse-string-list) ext)
+ (push (imap-parse-nstring) ext))
+ (while (eq (char-after) ?\ );; body-extension
+ (imap-forward)
+ (setq ext (append (imap-parse-body-extension) ext)))))
+ ext))
+
+;; body = "(" body-type-1part / body-type-mpart ")"
+;;
+;; body-ext-1part = body-fld-md5 [SP body-fld-dsp [SP body-fld-lang
+;; *(SP body-extension)]]
+;; ; MUST NOT be returned on non-extensible
+;; ; "BODY" fetch
+;;
+;; body-ext-mpart = body-fld-param [SP body-fld-dsp [SP body-fld-lang
+;; *(SP body-extension)]]
+;; ; MUST NOT be returned on non-extensible
+;; ; "BODY" fetch
+;;
+;; body-fields = body-fld-param SP body-fld-id SP body-fld-desc SP
+;; body-fld-enc SP body-fld-octets
+;;
+;; body-fld-desc = nstring
+;;
+;; body-fld-dsp = "(" string SP body-fld-param ")" / nil
+;;
+;; body-fld-enc = (DQUOTE ("7BIT" / "8BIT" / "BINARY" / "BASE64"/
+;; "QUOTED-PRINTABLE") DQUOTE) / string
+;;
+;; body-fld-id = nstring
+;;
+;; body-fld-lang = nstring / "(" string *(SP string) ")"
+;;
+;; body-fld-lines = number
+;;
+;; body-fld-md5 = nstring
+;;
+;; body-fld-octets = number
+;;
+;; body-fld-param = "(" string SP string *(SP string SP string) ")" / nil
+;;
+;; body-type-1part = (body-type-basic / body-type-msg / body-type-text)
+;; [SP body-ext-1part]
+;;
+;; body-type-basic = media-basic SP body-fields
+;; ; MESSAGE subtype MUST NOT be "RFC822"
+;;
+;; body-type-msg = media-message SP body-fields SP envelope
+;; SP body SP body-fld-lines
+;;
+;; body-type-text = media-text SP body-fields SP body-fld-lines
+;;
+;; body-type-mpart = 1*body SP media-subtype
+;; [SP body-ext-mpart]
+;;
+;; media-basic = ((DQUOTE ("APPLICATION" / "AUDIO" / "IMAGE" /
+;; "MESSAGE" / "VIDEO") DQUOTE) / string) SP media-subtype
+;; ; Defined in [MIME-IMT]
+;;
+;; media-message = DQUOTE "MESSAGE" DQUOTE SP DQUOTE "RFC822" DQUOTE
+;; ; Defined in [MIME-IMT]
+;;
+;; media-subtype = string
+;; ; Defined in [MIME-IMT]
+;;
+;; media-text = DQUOTE "TEXT" DQUOTE SP media-subtype
+;; ; Defined in [MIME-IMT]
+
+(defun imap-parse-body ()
+ (let (body)
+ (when (eq (char-after) ?\()
+ (imap-forward)
+ (if (eq (char-after) ?\()
+ (let (subbody)
+ (while (and (eq (char-after) ?\()
+ (setq subbody (imap-parse-body)))
+ ;; buggy stalker communigate pro 3.0 insert a SPC between
+ ;; parts in multiparts
+ (when (and (eq (char-after) ?\ )
+ (eq (char-after (1+ (point))) ?\())
+ (imap-forward))
+ (push subbody body))
+ (imap-forward)
+ (push (imap-parse-string) body);; media-subtype
+ (when (eq (char-after) ?\ );; body-ext-mpart:
+ (imap-forward)
+ (if (eq (char-after) ?\();; body-fld-param
+ (push (imap-parse-string-list) body)
+ (push (and (imap-parse-nil) nil) body))
+ (setq body
+ (append (imap-parse-body-ext) body)));; body-ext-...
+ (assert (eq (char-after) ?\)))
+ (imap-forward)
+ (nreverse body))
+
+ (push (imap-parse-string) body);; media-type
+ (imap-forward)
+ (push (imap-parse-string) body);; media-subtype
+ (imap-forward)
+ ;; next line for Sun SIMS bug
+ (and (eq (char-after) ? ) (imap-forward))
+ (if (eq (char-after) ?\();; body-fld-param
+ (push (imap-parse-string-list) body)
+ (push (and (imap-parse-nil) nil) body))
+ (imap-forward)
+ (push (imap-parse-nstring) body);; body-fld-id
+ (imap-forward)
+ (push (imap-parse-nstring) body);; body-fld-desc
+ (imap-forward)
+ (push (imap-parse-string) body);; body-fld-enc
+ (imap-forward)
+ (push (imap-parse-number) body);; body-fld-octets
+
+ ;; ok, we're done parsing the required parts, what comes now is one
+ ;; of three things:
+ ;;
+ ;; envelope (then we're parsing body-type-msg)
+ ;; body-fld-lines (then we're parsing body-type-text)
+ ;; body-ext-1part (then we're parsing body-type-basic)
+ ;;
+ ;; the problem is that the two first are in turn optionally followed
+ ;; by the third. So we parse the first two here (if there are any)...
+
+ (when (eq (char-after) ?\ )
+ (imap-forward)
+ (let (lines)
+ (cond ((eq (char-after) ?\();; body-type-msg:
+ (push (imap-parse-envelope) body);; envelope
+ (imap-forward)
+ (push (imap-parse-body) body);; body
+ ;; buggy stalker communigate pro 3.0 doesn't print
+ ;; number of lines in message/rfc822 attachment
+ (if (eq (char-after) ?\))
+ (push 0 body)
+ (imap-forward)
+ (push (imap-parse-number) body))) ;; body-fld-lines
+ ((setq lines (imap-parse-number)) ;; body-type-text:
+ (push lines body)) ;; body-fld-lines
+ (t
+ (backward-char))))) ;; no match...
+
+ ;; ...and then parse the third one here...
+
+ (when (eq (char-after) ?\ );; body-ext-1part:
+ (imap-forward)
+ (push (imap-parse-nstring) body);; body-fld-md5
+ (setq body (append (imap-parse-body-ext) body)));; body-ext-1part..
+
+ (assert (eq (char-after) ?\)))
+ (imap-forward)
+ (nreverse body)))))
+
+(when imap-debug ; (untrace-all)
+ (require 'trace)
+ (buffer-disable-undo (get-buffer-create imap-debug))
+ (mapcar (lambda (f) (trace-function-background f imap-debug))
+ '(
+ imap-read-passwd
+ imap-utf7-encode
+ imap-utf7-decode
+ imap-error-text
+ imap-kerberos4s-p
+ imap-kerberos4-open
+ imap-ssl-p
+ imap-ssl-open
+ imap-network-p
+ imap-network-open
+ imap-interactive-login
+ imap-kerberos4a-p
+ imap-kerberos4-auth
+ imap-cram-md5-p
+ imap-cram-md5-auth
+ imap-login-p
+ imap-login-auth
+ imap-anonymous-p
+ imap-anonymous-auth
+ imap-open-1
+ imap-open
+ imap-opened
+ imap-authenticate
+ imap-close
+ imap-capability
+ imap-namespace
+ imap-send-command-wait
+ imap-mailbox-put
+ imap-mailbox-get
+ imap-mailbox-map-1
+ imap-mailbox-map
+ imap-current-mailbox
+ imap-current-mailbox-p-1
+ imap-current-mailbox-p
+ imap-mailbox-select-1
+ imap-mailbox-select
+ imap-mailbox-examine-1
+ imap-mailbox-examine
+ imap-mailbox-unselect
+ imap-mailbox-expunge
+ imap-mailbox-close
+ imap-mailbox-create-1
+ imap-mailbox-create
+ imap-mailbox-delete
+ imap-mailbox-rename
+ imap-mailbox-lsub
+ imap-mailbox-list
+ imap-mailbox-subscribe
+ imap-mailbox-unsubscribe
+ imap-mailbox-status
+ imap-mailbox-acl-get
+ imap-mailbox-acl-set
+ imap-mailbox-acl-delete
+ imap-current-message
+ imap-list-to-message-set
+ imap-fetch-asynch
+ imap-fetch
+ imap-message-put
+ imap-message-get
+ imap-message-map
+ imap-search
+ imap-message-flag-permanent-p
+ imap-message-flags-set
+ imap-message-flags-del
+ imap-message-flags-add
+ imap-message-copyuid-1
+ imap-message-copyuid
+ imap-message-copy
+ imap-message-appenduid-1
+ imap-message-appenduid
+ imap-message-append
+ imap-body-lines
+ imap-envelope-from
+ imap-send-command-1
+ imap-send-command
+ imap-wait-for-tag
+ imap-sentinel
+ imap-find-next-line
+ imap-arrival-filter
+ imap-parse-greeting
+ imap-parse-response
+ imap-parse-resp-text
+ imap-parse-resp-text-code
+ imap-parse-data-list
+ imap-parse-fetch
+ imap-parse-status
+ imap-parse-acl
+ imap-parse-flag-list
+ imap-parse-envelope
+ imap-parse-body-extension
+ imap-parse-body
+ )))
+
+(provide 'imap)
+
+;;; imap.el ends here
--- /dev/null
+;;; mail-parse.el --- Interface functions for parsing mail
+;; Copyright (C) 1998, 1999, 2000
+;; Free Software Foundation, Inc.
+
+;; Author: Lars Magne Ingebrigtsen <larsi@gnus.org>
+;; This file is part of GNU Emacs.
+
+;; GNU Emacs 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 Emacs 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 Emacs; see the file COPYING. If not, write to the
+;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;; Boston, MA 02111-1307, USA.
+
+;;; Commentary:
+
+;; This file contains wrapper functions for a wide range of mail
+;; parsing functions. The idea is that there are low-level libraries
+;; that impement according to various specs (RFC2231, DRUMS, USEFOR),
+;; but that programmers that want to parse some header (say,
+;; Content-Type) will want to use the latest spec.
+;;
+;; So while each low-level library (rfc2231.el, for instance) decodes
+;; faithfully according to that (proposed) standard, this library is
+;; the interface library. If some later RFC supersedes RFC2231, one
+;; would just have to write a new low-level library, adjust the
+;; aliases in this library, and the users and programmers won't notice
+;; any changes.
+
+;;; Code:
+
+(require 'mail-prsvr)
+(require 'ietf-drums)
+(require 'rfc2231)
+(require 'rfc2047)
+(require 'rfc2045)
+
+(defalias 'mail-header-parse-content-type 'rfc2231-parse-string)
+(defalias 'mail-header-parse-content-disposition 'rfc2231-parse-string)
+(defalias 'mail-content-type-get 'rfc2231-get-value)
+(defalias 'mail-header-encode-parameter 'rfc2045-encode-string)
+
+(defalias 'mail-header-remove-comments 'ietf-drums-remove-comments)
+(defalias 'mail-header-remove-whitespace 'ietf-drums-remove-whitespace)
+(defalias 'mail-header-strip 'ietf-drums-strip)
+(defalias 'mail-header-get-comment 'ietf-drums-get-comment)
+(defalias 'mail-header-parse-address 'ietf-drums-parse-address)
+(defalias 'mail-header-parse-addresses 'ietf-drums-parse-addresses)
+(defalias 'mail-header-parse-date 'ietf-drums-parse-date)
+(defalias 'mail-narrow-to-head 'ietf-drums-narrow-to-header)
+(defalias 'mail-quote-string 'ietf-drums-quote-string)
+
+(defalias 'mail-header-narrow-to-field 'rfc2047-narrow-to-field)
+(defalias 'mail-encode-encoded-word-region 'rfc2047-encode-region)
+(defalias 'mail-encode-encoded-word-buffer 'rfc2047-encode-message-header)
+(defalias 'mail-encode-encoded-word-string 'rfc2047-encode-string)
+(defalias 'mail-decode-encoded-word-region 'rfc2047-decode-region)
+(defalias 'mail-decode-encoded-word-string 'rfc2047-decode-string)
+
+(provide 'mail-parse)
+
+;;; mail-parse.el ends here
--- /dev/null
+;;; mail-prsvr.el --- Interface variables for parsing mail
+;; Copyright (C) 1999, 2000 Free Software Foundation, Inc.
+
+;; Author: Lars Magne Ingebrigtsen <larsi@gnus.org>
+;; This file is part of GNU Emacs.
+
+;; GNU Emacs 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 Emacs 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 Emacs; see the file COPYING. If not, write to the
+;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;; Boston, MA 02111-1307, USA.
+
+;;; Commentary:
+
+;;; Code:
+
+(defvar mail-parse-charset nil
+ "Default charset used by low-level libraries.
+This variable should never be set. Instead, it should be bound by
+functions that wish to call mail-parse functions and let them know
+what the desired charset is to be.")
+
+(defvar mail-parse-mule-charset nil
+ "Default MULE charset used by low-level libraries.
+This variable should never be set.")
+
+(defvar mail-parse-ignored-charsets nil
+ "Ignored charsets used by low-level libraries.
+This variable should never be set. Instead, it should be bound by
+functions that wish to call mail-parse functions and let them know
+what the desired charsets is to be ignored.")
+
+(provide 'mail-prsvr)
+
+;;; mail-prsvr.el ends here
--- /dev/null
+;;; mail-source.el --- functions for fetching mail
+;; Copyright (C) 1999, 2000 Free Software Foundation, Inc.
+
+;; Author: Lars Magne Ingebrigtsen <larsi@gnus.org>
+;; Keywords: news, mail
+
+;; This file is part of GNU Emacs.
+
+;; GNU Emacs 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 Emacs 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 Emacs; see the file COPYING. If not, write to the
+;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;; Boston, MA 02111-1307, USA.
+
+;;; Commentary:
+
+;;; Code:
+
+(eval-when-compile (require 'cl))
+(eval-and-compile
+ (autoload 'pop3-movemail "pop3")
+ (autoload 'pop3-get-message-count "pop3"))
+(require 'format-spec)
+
+(defgroup mail-source nil
+ "The mail-fetching library."
+ :group 'gnus)
+
+(defcustom mail-sources nil
+ "*Where the mail backends will look for incoming mail.
+This variable is a list of mail source specifiers."
+ :group 'mail-source
+ :type 'sexp)
+
+(defcustom mail-source-primary-source nil
+ "*Primary source for incoming mail.
+If non-nil, this maildrop will be checked periodically for new mail."
+ :group 'mail-source
+ :type 'sexp)
+
+(defcustom mail-source-crash-box "~/.emacs-mail-crash-box"
+ "File where mail will be stored while processing it."
+ :group 'mail-source
+ :type 'file)
+
+(defcustom mail-source-directory "~/Mail/"
+ "Directory where files (if any) will be stored."
+ :group 'mail-source
+ :type 'directory)
+
+(defcustom mail-source-default-file-modes 384
+ "Set the mode bits of all new mail files to this integer."
+ :group 'mail-source
+ :type 'integer)
+
+(defcustom mail-source-delete-incoming nil
+ "*If non-nil, delete incoming files after handling."
+ :group 'mail-source
+ :type 'boolean)
+
+(defcustom mail-source-incoming-file-prefix "Incoming"
+ "Prefix for file name for storing incoming mail"
+ :group 'mail-source
+ :type 'string)
+
+(defcustom mail-source-report-new-mail-interval 5
+ "Interval in minutes between checks for new mail."
+ :group 'mail-source
+ :type 'number)
+
+(defcustom mail-source-idle-time-delay 5
+ "Number of idle seconds to wait before checking for new mail."
+ :group 'mail-source
+ :type 'number)
+
+;;; Internal variables.
+
+(defvar mail-source-string ""
+ "A dynamically bound string that says what the current mail source is.")
+
+(defvar mail-source-new-mail-available nil
+ "Flag indicating when new mail is available.")
+
+(eval-and-compile
+ (defvar mail-source-common-keyword-map
+ '((:plugged))
+ "Mapping from keywords to default values.
+Common keywords should be listed here.")
+
+ (defvar mail-source-keyword-map
+ '((file
+ (:prescript)
+ (:prescript-delay)
+ (:postscript)
+ (:path (or (getenv "MAIL")
+ (concat "/usr/spool/mail/" (user-login-name)))))
+ (directory
+ (:path)
+ (:suffix ".spool")
+ (:predicate identity))
+ (pop
+ (:prescript)
+ (:prescript-delay)
+ (:postscript)
+ (:server (getenv "MAILHOST"))
+ (:port 110)
+ (:user (or (user-login-name) (getenv "LOGNAME") (getenv "USER")))
+ (:program)
+ (:function)
+ (:password)
+ (:authentication password))
+ (maildir
+ (:path (or (getenv "MAILDIR") "~/Maildir/"))
+ (:subdirs ("new" "cur"))
+ (:function))
+ (imap
+ (:server (getenv "MAILHOST"))
+ (:port)
+ (:stream)
+ (:authentication)
+ (:user (or (user-login-name) (getenv "LOGNAME") (getenv "USER")))
+ (:password)
+ (:mailbox "INBOX")
+ (:predicate "UNSEEN UNDELETED")
+ (:fetchflag "\\Deleted")
+ (:dontexpunge))
+ (webmail
+ (:subtype hotmail)
+ (:user (or (user-login-name) (getenv "LOGNAME") (getenv "USER")))
+ (:password)
+ (:dontexpunge)
+ (:authentication password)))
+ "Mapping from keywords to default values.
+All keywords that can be used must be listed here."))
+
+(defvar mail-source-fetcher-alist
+ '((file mail-source-fetch-file)
+ (directory mail-source-fetch-directory)
+ (pop mail-source-fetch-pop)
+ (maildir mail-source-fetch-maildir)
+ (imap mail-source-fetch-imap)
+ (webmail mail-source-fetch-webmail))
+ "A mapping from source type to fetcher function.")
+
+(defvar mail-source-password-cache nil)
+
+(defvar mail-source-plugged t)
+
+;;; Functions
+
+(eval-and-compile
+ (defun mail-source-strip-keyword (keyword)
+ "Strip the leading colon off the KEYWORD."
+ (intern (substring (symbol-name keyword) 1))))
+
+(eval-and-compile
+ (defun mail-source-bind-1 (type)
+ (let* ((defaults (cdr (assq type mail-source-keyword-map)))
+ default bind)
+ (while (setq default (pop defaults))
+ (push (list (mail-source-strip-keyword (car default))
+ nil)
+ bind))
+ bind)))
+
+(defmacro mail-source-bind (type-source &rest body)
+ "Return a `let' form that binds all variables in source TYPE.
+TYPE-SOURCE is a list where the first element is the TYPE, and
+the second variable is the SOURCE.
+At run time, the mail source specifier SOURCE will be inspected,
+and the variables will be set according to it. Variables not
+specified will be given default values.
+
+After this is done, BODY will be executed in the scope
+of the `let' form.
+
+The variables bound and their default values are described by
+the `mail-source-keyword-map' variable."
+ `(let ,(mail-source-bind-1 (car type-source))
+ (mail-source-set-1 ,(cadr type-source))
+ ,@body))
+
+(put 'mail-source-bind 'lisp-indent-function 1)
+(put 'mail-source-bind 'edebug-form-spec '(form body))
+
+(defun mail-source-set-1 (source)
+ (let* ((type (pop source))
+ (defaults (cdr (assq type mail-source-keyword-map)))
+ default value keyword)
+ (while (setq default (pop defaults))
+ (set (mail-source-strip-keyword (setq keyword (car default)))
+ (if (setq value (plist-get source keyword))
+ (mail-source-value value)
+ (mail-source-value (cadr default)))))))
+
+(eval-and-compile
+ (defun mail-source-bind-common-1 ()
+ (let* ((defaults mail-source-common-keyword-map)
+ default bind)
+ (while (setq default (pop defaults))
+ (push (list (mail-source-strip-keyword (car default))
+ nil)
+ bind))
+ bind)))
+
+(defun mail-source-set-common-1 (source)
+ (let* ((type (pop source))
+ (defaults mail-source-common-keyword-map)
+ (defaults-1 (cdr (assq type mail-source-keyword-map)))
+ default value keyword)
+ (while (setq default (pop defaults))
+ (set (mail-source-strip-keyword (setq keyword (car default)))
+ (if (setq value (plist-get source keyword))
+ (mail-source-value value)
+ (if (setq value (assq keyword defaults-1))
+ (mail-source-value (cadr value))
+ (mail-source-value (cadr default))))))))
+
+(defmacro mail-source-bind-common (source &rest body)
+ "Return a `let' form that binds all common variables.
+See `mail-source-bind'."
+ `(let ,(mail-source-bind-common-1)
+ (mail-source-set-common-1 source)
+ ,@body))
+
+(put 'mail-source-bind-common 'lisp-indent-function 1)
+(put 'mail-source-bind-common 'edebug-form-spec '(form body))
+
+(defun mail-source-value (value)
+ "Return the value of VALUE."
+ (cond
+ ;; String
+ ((stringp value)
+ value)
+ ;; Function
+ ((and (listp value)
+ (functionp (car value)))
+ (eval value))
+ ;; Just return the value.
+ (t
+ value)))
+
+(defun mail-source-fetch (source callback)
+ "Fetch mail from SOURCE and call CALLBACK zero or more times.
+CALLBACK will be called with the name of the file where (some of)
+the mail from SOURCE is put.
+Return the number of files that were found."
+ (mail-source-bind-common source
+ (if (or mail-source-plugged plugged)
+ (save-excursion
+ (let ((function (cadr (assq (car source) mail-source-fetcher-alist)))
+ (found 0))
+ (unless function
+ (error "%S is an invalid mail source specification" source))
+ ;; If there's anything in the crash box, we do it first.
+ (when (file-exists-p mail-source-crash-box)
+ (message "Processing mail from %s..." mail-source-crash-box)
+ (setq found (mail-source-callback
+ callback mail-source-crash-box)))
+ (+ found
+ (condition-case err
+ (funcall function source callback)
+ (error
+ (unless (yes-or-no-p
+ (format "Mail source error (%s). Continue? " err))
+ (error "Cannot get new mail."))
+ 0))))))))
+
+(defun mail-source-make-complex-temp-name (prefix)
+ (let ((newname (make-temp-name prefix))
+ (newprefix prefix))
+ (while (file-exists-p newname)
+ (setq newprefix (concat newprefix "x"))
+ (setq newname (make-temp-name newprefix)))
+ newname))
+
+(defun mail-source-callback (callback info)
+ "Call CALLBACK on the mail file, and then remove the mail file.
+Pass INFO on to CALLBACK."
+ (if (or (not (file-exists-p mail-source-crash-box))
+ (zerop (nth 7 (file-attributes mail-source-crash-box))))
+ (progn
+ (when (file-exists-p mail-source-crash-box)
+ (delete-file mail-source-crash-box))
+ 0)
+ (prog1
+ (funcall callback mail-source-crash-box info)
+ (when (file-exists-p mail-source-crash-box)
+ ;; Delete or move the incoming mail out of the way.
+ (if mail-source-delete-incoming
+ (delete-file mail-source-crash-box)
+ (let ((incoming
+ (mail-source-make-complex-temp-name
+ (expand-file-name
+ mail-source-incoming-file-prefix
+ mail-source-directory))))
+ (unless (file-exists-p (file-name-directory incoming))
+ (make-directory (file-name-directory incoming) t))
+ (rename-file mail-source-crash-box incoming t)))))))
+
+(defun mail-source-movemail (from to)
+ "Move FROM to TO using movemail."
+ (if (not (file-writable-p to))
+ (error "Can't write to crash box %s. Not moving mail" to)
+ (let ((to (file-truename (expand-file-name to)))
+ errors result)
+ (setq to (file-truename to)
+ from (file-truename from))
+ ;; Set TO if have not already done so, and rename or copy
+ ;; the file FROM to TO if and as appropriate.
+ (cond
+ ((file-exists-p to)
+ ;; The crash box exists already.
+ t)
+ ((not (file-exists-p from))
+ ;; There is no inbox.
+ (setq to nil))
+ ((zerop (nth 7 (file-attributes from)))
+ ;; Empty file.
+ (setq to nil))
+ (t
+ ;; If getting from mail spool directory, use movemail to move
+ ;; rather than just renaming, so as to interlock with the
+ ;; mailer.
+ (unwind-protect
+ (save-excursion
+ (setq errors (generate-new-buffer " *mail source loss*"))
+ (let ((default-directory "/"))
+ (setq result
+ (apply
+ 'call-process
+ (append
+ (list
+ (expand-file-name "movemail" exec-directory)
+ nil errors nil from to)))))
+ (when (file-exists-p to)
+ (set-file-modes to mail-source-default-file-modes))
+ (if (and (not (buffer-modified-p errors))
+ (zerop result))
+ ;; No output => movemail won.
+ t
+ (set-buffer errors)
+ ;; There may be a warning about older revisions. We
+ ;; ignore that.
+ (goto-char (point-min))
+ (if (search-forward "older revision" nil t)
+ t
+ ;; Probably a real error.
+ (subst-char-in-region (point-min) (point-max) ?\n ?\ )
+ (goto-char (point-max))
+ (skip-chars-backward " \t")
+ (delete-region (point) (point-max))
+ (goto-char (point-min))
+ (when (looking-at "movemail: ")
+ (delete-region (point-min) (match-end 0)))
+ (unless (yes-or-no-p
+ (format "movemail: %s (%d return). Continue? "
+ (buffer-string) result))
+ (error "%s" (buffer-string)))
+ (setq to nil)))))))
+ (when (and errors
+ (buffer-name errors))
+ (kill-buffer errors))
+ ;; Return whether we moved successfully or not.
+ to)))
+
+(defun mail-source-movemail-and-remove (from to)
+ "Move FROM to TO using movemail, then remove FROM if empty."
+ (or (not (mail-source-movemail from to))
+ (not (zerop (nth 7 (file-attributes from))))
+ (delete-file from)))
+
+(defvar mail-source-read-passwd nil)
+(defun mail-source-read-passwd (prompt &rest args)
+ "Read a password using PROMPT.
+If ARGS, PROMPT is used as an argument to `format'."
+ (let ((prompt
+ (if args
+ (apply 'format prompt args)
+ prompt)))
+ (unless mail-source-read-passwd
+ (if (or (fboundp 'read-passwd) (load "passwd" t))
+ (setq mail-source-read-passwd 'read-passwd)
+ (unless (fboundp 'ange-ftp-read-passwd)
+ (autoload 'ange-ftp-read-passwd "ange-ftp"))
+ (setq mail-source-read-passwd 'ange-ftp-read-passwd)))
+ (funcall mail-source-read-passwd prompt)))
+
+(defun mail-source-fetch-with-program (program)
+ (zerop (call-process shell-file-name nil nil nil
+ shell-command-switch program)))
+
+(defun mail-source-run-script (script spec &optional delay)
+ (when script
+ (if (and (symbolp script) (fboundp script))
+ (funcall script)
+ (mail-source-call-script
+ (format-spec script spec))))
+ (when delay
+ (sleep-for delay)))
+
+(defun mail-source-call-script (script)
+ (let ((background nil))
+ (when (string-match "& *$" script)
+ (setq script (substring script 0 (match-beginning 0))
+ background 0))
+ (call-process shell-file-name nil background nil
+ shell-command-switch script)))
+
+;;;
+;;; Different fetchers
+;;;
+
+(defun mail-source-fetch-file (source callback)
+ "Fetcher for single-file sources."
+ (mail-source-bind (file source)
+ (mail-source-run-script
+ prescript (format-spec-make ?t mail-source-crash-box)
+ prescript-delay)
+ (let ((mail-source-string (format "file:%s" path)))
+ (if (mail-source-movemail path mail-source-crash-box)
+ (prog1
+ (mail-source-callback callback path)
+ (mail-source-run-script
+ postscript (format-spec-make ?t mail-source-crash-box)))
+ 0))))
+
+(defun mail-source-fetch-directory (source callback)
+ "Fetcher for directory sources."
+ (mail-source-bind (directory source)
+ (let ((found 0)
+ (mail-source-string (format "directory:%s" path)))
+ (dolist (file (directory-files
+ path t (concat (regexp-quote suffix) "$")))
+ (when (and (file-regular-p file)
+ (funcall predicate file)
+ (mail-source-movemail file mail-source-crash-box))
+ (incf found (mail-source-callback callback file))))
+ found)))
+
+(defun mail-source-fetch-pop (source callback)
+ "Fetcher for single-file sources."
+ (mail-source-bind (pop source)
+ (mail-source-run-script
+ prescript
+ (format-spec-make ?p password ?t mail-source-crash-box
+ ?s server ?P port ?u user)
+ prescript-delay)
+ (let ((from (format "%s:%s:%s" server user port))
+ (mail-source-string (format "pop:%s@%s" user server))
+ result)
+ (when (eq authentication 'password)
+ (setq password
+ (or password
+ (cdr (assoc from mail-source-password-cache))
+ (mail-source-read-passwd
+ (format "Password for %s at %s: " user server)))))
+ (when server
+ (setenv "MAILHOST" server))
+ (setq result
+ (cond
+ (program
+ (mail-source-fetch-with-program
+ (format-spec
+ program
+ (format-spec-make ?p password ?t mail-source-crash-box
+ ?s server ?P port ?u user))))
+ (function
+ (funcall function mail-source-crash-box))
+ ;; The default is to use pop3.el.
+ (t
+ (let ((pop3-password password)
+ (pop3-maildrop user)
+ (pop3-mailhost server)
+ (pop3-port port)
+ (pop3-authentication-scheme
+ (if (eq authentication 'apop) 'apop 'pass)))
+ (save-excursion (pop3-movemail mail-source-crash-box))))))
+ (if result
+ (progn
+ (when (eq authentication 'password)
+ (unless (assoc from mail-source-password-cache)
+ (push (cons from password) mail-source-password-cache)))
+ (prog1
+ (mail-source-callback callback server)
+ ;; Update display-time's mail flag, if relevant.
+ (if (equal source mail-source-primary-source)
+ (setq mail-source-new-mail-available nil))
+ (mail-source-run-script
+ postscript
+ (format-spec-make ?p password ?t mail-source-crash-box
+ ?s server ?P port ?u user))))
+ ;; We nix out the password in case the error
+ ;; was because of a wrong password being given.
+ (setq mail-source-password-cache
+ (delq (assoc from mail-source-password-cache)
+ mail-source-password-cache))
+ 0))))
+
+(defun mail-source-check-pop (source)
+ "Check whether there is new mail."
+ (mail-source-bind (pop source)
+ (let ((from (format "%s:%s:%s" server user port))
+ (mail-source-string (format "pop:%s@%s" user server))
+ result)
+ (when (eq authentication 'password)
+ (setq password
+ (or password
+ (cdr (assoc from mail-source-password-cache))
+ (mail-source-read-passwd
+ (format "Password for %s at %s: " user server))))
+ (unless (assoc from mail-source-password-cache)
+ (push (cons from password) mail-source-password-cache)))
+ (when server
+ (setenv "MAILHOST" server))
+ (setq result
+ (cond
+ ;; No easy way to check whether mail is waiting for these.
+ (program)
+ (function)
+ ;; The default is to use pop3.el.
+ (t
+ (let ((pop3-password password)
+ (pop3-maildrop user)
+ (pop3-mailhost server)
+ (pop3-port port)
+ (pop3-authentication-scheme
+ (if (eq authentication 'apop) 'apop 'pass)))
+ (save-excursion (pop3-get-message-count))))))
+ (if result
+ ;; Inform display-time that we have new mail.
+ (setq mail-source-new-mail-available (> result 0))
+ ;; We nix out the password in case the error
+ ;; was because of a wrong password being given.
+ (setq mail-source-password-cache
+ (delq (assoc from mail-source-password-cache)
+ mail-source-password-cache)))
+ result)))
+
+(defun mail-source-new-mail-p ()
+ "Handler for `display-time' to indicate when new mail is available."
+ ;; Only report flag setting; flag is updated on a different schedule.
+ mail-source-new-mail-available)
+
+
+(defvar mail-source-report-new-mail nil)
+(defvar mail-source-report-new-mail-timer nil)
+(defvar mail-source-report-new-mail-idle-timer nil)
+
+(eval-when-compile (require 'timer))
+
+(defun mail-source-start-idle-timer ()
+ ;; Start our idle timer if necessary, so we delay the check until the
+ ;; user isn't typing.
+ (unless mail-source-report-new-mail-idle-timer
+ (setq mail-source-report-new-mail-idle-timer
+ (run-with-idle-timer
+ mail-source-idle-time-delay
+ nil
+ (lambda ()
+ (setq mail-source-report-new-mail-idle-timer nil)
+ (mail-source-check-pop mail-source-primary-source))))
+ ;; Since idle timers created when Emacs is already in the idle
+ ;; state don't get activated until Emacs _next_ becomes idle, we
+ ;; need to force our timer to be considered active now. We do
+ ;; this by being naughty and poking the timer internals directly
+ ;; (element 0 of the vector is nil if the timer is active).
+ (aset mail-source-report-new-mail-idle-timer 0 nil)))
+
+(defun mail-source-report-new-mail (arg)
+ "Toggle whether to report when new mail is available.
+This only works when `display-time' is enabled."
+ (interactive "P")
+ (if (not mail-source-primary-source)
+ (error "Need to set `mail-source-primary-source' to check for new mail."))
+ (let ((on (if (null arg)
+ (not mail-source-report-new-mail)
+ (> (prefix-numeric-value arg) 0))))
+ (setq mail-source-report-new-mail on)
+ (and mail-source-report-new-mail-timer
+ (cancel-timer mail-source-report-new-mail-timer))
+ (and mail-source-report-new-mail-idle-timer
+ (cancel-timer mail-source-report-new-mail-idle-timer))
+ (setq mail-source-report-new-mail-timer nil)
+ (setq mail-source-report-new-mail-idle-timer nil)
+ (if on
+ (progn
+ (require 'time)
+ (setq display-time-mail-function #'mail-source-new-mail-p)
+ ;; Set up the main timer.
+ (setq mail-source-report-new-mail-timer
+ (run-at-time t (* 60 mail-source-report-new-mail-interval)
+ #'mail-source-start-idle-timer))
+ ;; When you get new mail, clear "Mail" from the mode line.
+ (add-hook 'nnmail-post-get-new-mail-hook
+ 'display-time-event-handler)
+ (message "Mail check enabled"))
+ (setq display-time-mail-function nil)
+ (remove-hook 'nnmail-post-get-new-mail-hook
+ 'display-time-event-handler)
+ (message "Mail check disabled"))))
+
+(defun mail-source-fetch-maildir (source callback)
+ "Fetcher for maildir sources."
+ (mail-source-bind (maildir source)
+ (let ((found 0)
+ mail-source-string)
+ (unless (string-match "/$" path)
+ (setq path (concat path "/")))
+ (dolist (subdir subdirs)
+ (when (file-directory-p (concat path subdir))
+ (setq mail-source-string (format "maildir:%s%s" path subdir))
+ (dolist (file (directory-files (concat path subdir) t))
+ (when (and (not (file-directory-p file))
+ (not (if function
+ (funcall function file mail-source-crash-box)
+ (let ((coding-system-for-write
+ mm-text-coding-system)
+ (coding-system-for-read
+ mm-text-coding-system))
+ (with-temp-file mail-source-crash-box
+ (insert-file-contents file)
+ (goto-char (point-min))
+;;; ;; Unix mail format
+;;; (unless (looking-at "\n*From ")
+;;; (insert "From maildir "
+;;; (current-time-string) "\n"))
+;;; (while (re-search-forward "^From " nil t)
+;;; (replace-match ">From "))
+ ;; MMDF mail format
+ (insert "\001\001\001\001\n")
+ (goto-char (point-max))
+ (insert "\n\n"))
+ (delete-file file)))))
+ (incf found (mail-source-callback callback file))))))
+ found)))
+
+(eval-and-compile
+ (autoload 'imap-open "imap")
+ (autoload 'imap-authenticate "imap")
+ (autoload 'imap-mailbox-select "imap")
+ (autoload 'imap-mailbox-unselect "imap")
+ (autoload 'imap-mailbox-close "imap")
+ (autoload 'imap-search "imap")
+ (autoload 'imap-fetch "imap")
+ (autoload 'imap-close "imap")
+ (autoload 'imap-error-text "imap")
+ (autoload 'imap-message-flags-add "imap")
+ (autoload 'imap-list-to-message-set "imap")
+ (autoload 'nnheader-ms-strip-cr "nnheader"))
+
+(defun mail-source-fetch-imap (source callback)
+ "Fetcher for imap sources."
+ (mail-source-bind (imap source)
+ (let ((from (format "%s:%s:%s" server user port))
+ (found 0)
+ (buf (get-buffer-create (generate-new-buffer-name " *imap source*")))
+ (mail-source-string (format "imap:%s:%s" server mailbox))
+ remove)
+ (if (and (imap-open server port stream authentication buf)
+ (imap-authenticate
+ user (or (cdr (assoc from mail-source-password-cache))
+ password) buf)
+ (imap-mailbox-select mailbox nil buf))
+ (let (str (coding-system-for-write 'binary))
+ (with-temp-file mail-source-crash-box
+ ;; remember password
+ (with-current-buffer buf
+ (when (or imap-password
+ (assoc from mail-source-password-cache))
+ (push (cons from imap-password) mail-source-password-cache)))
+ ;; if predicate is nil, use all uids
+ (dolist (uid (imap-search (or predicate "1:*") buf))
+ (when (setq str (imap-fetch uid "RFC822.PEEK" 'RFC822 nil buf))
+ (push uid remove)
+ (insert "From imap " (current-time-string) "\n")
+ (save-excursion
+ (insert str "\n\n"))
+ (while (re-search-forward "^From " nil t)
+ (replace-match ">From "))
+ (goto-char (point-max))))
+ (nnheader-ms-strip-cr))
+ (incf found (mail-source-callback callback server))
+ (when (and remove fetchflag)
+ (imap-message-flags-add
+ (imap-list-to-message-set remove) fetchflag nil buf))
+ (if dontexpunge
+ (imap-mailbox-unselect buf)
+ (imap-mailbox-close buf))
+ (imap-close buf))
+ (imap-close buf)
+ ;; We nix out the password in case the error
+ ;; was because of a wrong password being given.
+ (setq mail-source-password-cache
+ (delq (assoc from mail-source-password-cache)
+ mail-source-password-cache))
+ (error (imap-error-text buf)))
+ (kill-buffer buf)
+ found)))
+
+(eval-and-compile
+ (autoload 'webmail-fetch "webmail"))
+
+(defun mail-source-fetch-webmail (source callback)
+ "Fetch for webmail source."
+ (mail-source-bind (webmail source)
+ (let ((mail-source-string (format "webmail:%s:%s" subtype user))
+ (webmail-newmail-only dontexpunge)
+ (webmail-move-to-trash-can (not dontexpunge)))
+ (when (eq authentication 'password)
+ (setq password
+ (or password
+ (cdr (assoc (format "webmail:%s:%s" subtype user)
+ mail-source-password-cache))
+ (mail-source-read-passwd
+ (format "Password for %s at %s: " user subtype))))
+ (when (and password
+ (not (assoc (format "webmail:%s:%s" subtype user)
+ mail-source-password-cache)))
+ (push (cons (format "webmail:%s:%s" subtype user) password)
+ mail-source-password-cache)))
+ (webmail-fetch mail-source-crash-box subtype user password)
+ (mail-source-callback callback (symbol-name subtype)))))
+
+(provide 'mail-source)
+
+;;; mail-source.el ends here
--- /dev/null
+;;; mailcap.el --- Functions for displaying MIME parts
+;; Copyright (C) 1998, 1999, 2000 Free Software Foundation, Inc.
+
+;; Author: William M. Perry <wmperry@aventail.com>
+;; Lars Magne Ingebrigtsen <larsi@gnus.org>
+;; Keywords: news, mail
+
+;; This file is part of GNU Emacs.
+
+;; GNU Emacs 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 Emacs 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 Emacs; see the file COPYING. If not, write to the
+;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;; Boston, MA 02111-1307, USA.
+
+;;; Commentary:
+
+;;; Code:
+
+(eval-when-compile (require 'cl))
+(require 'mail-parse)
+(require 'mm-util)
+
+(defvar mailcap-parse-args-syntax-table
+ (let ((table (copy-syntax-table emacs-lisp-mode-syntax-table)))
+ (modify-syntax-entry ?' "\"" table)
+ (modify-syntax-entry ?` "\"" table)
+ (modify-syntax-entry ?{ "(" table)
+ (modify-syntax-entry ?} ")" table)
+ table)
+ "A syntax table for parsing sgml attributes.")
+
+(defvar mailcap-mime-data
+ '(("application"
+ ("x-x509-ca-cert"
+ (viewer . ssl-view-site-cert)
+ (test . (fboundp 'ssl-view-site-cert))
+ (type . "application/x-x509-ca-cert"))
+ ("x-x509-user-cert"
+ (viewer . ssl-view-user-cert)
+ (test . (fboundp 'ssl-view-user-cert))
+ (type . "application/x-x509-user-cert"))
+ ("octet-stream"
+ (viewer . mailcap-save-binary-file)
+ (non-viewer . t)
+ (type . "application/octet-stream"))
+ ("dvi"
+ (viewer . "open %s")
+ (type . "application/dvi")
+ (test . (eq (mm-device-type) 'ns)))
+ ("dvi"
+ (viewer . "xdvi %s")
+ (test . (eq (mm-device-type) 'x))
+ ("needsx11")
+ (type . "application/dvi"))
+ ("dvi"
+ (viewer . "dvitty %s")
+ (test . (not (getenv "DISPLAY")))
+ (type . "application/dvi"))
+ ("emacs-lisp"
+ (viewer . mailcap-maybe-eval)
+ (type . "application/emacs-lisp"))
+ ("x-tar"
+ (viewer . mailcap-save-binary-file)
+ (non-viewer . t)
+ (type . "application/x-tar"))
+ ("x-latex"
+ (viewer . tex-mode)
+ (test . (fboundp 'tex-mode))
+ (type . "application/x-latex"))
+ ("x-tex"
+ (viewer . tex-mode)
+ (test . (fboundp 'tex-mode))
+ (type . "application/x-tex"))
+ ("latex"
+ (viewer . tex-mode)
+ (test . (fboundp 'tex-mode))
+ (type . "application/latex"))
+ ("tex"
+ (viewer . tex-mode)
+ (test . (fboundp 'tex-mode))
+ (type . "application/tex"))
+ ("texinfo"
+ (viewer . texinfo-mode)
+ (test . (fboundp 'texinfo-mode))
+ (type . "application/tex"))
+ ("zip"
+ (viewer . mailcap-save-binary-file)
+ (non-viewer . t)
+ (type . "application/zip")
+ ("copiousoutput"))
+ ("pdf"
+ (viewer . "acroread %s")
+ (type . "application/pdf"))
+ ("postscript"
+ (viewer . "open %s")
+ (type . "application/postscript")
+ (test . (eq (mm-device-type) 'ns)))
+ ("postscript"
+ (viewer . "ghostview -dSAFER %s")
+ (type . "application/postscript")
+ (test . (eq (mm-device-type) 'x))
+ ("needsx11"))
+ ("postscript"
+ (viewer . "ps2ascii %s")
+ (type . "application/postscript")
+ (test . (not (getenv "DISPLAY")))
+ ("copiousoutput")))
+ ("audio"
+ ("x-mpeg"
+ (viewer . "maplay %s")
+ (type . "audio/x-mpeg"))
+ (".*"
+ (viewer . "showaudio")
+ (type . "audio/*")))
+ ("message"
+ ("rfc-*822"
+ (viewer . mm-view-message)
+ (test . (and (featurep 'gnus)
+ (gnus-alive-p)))
+ (type . "message/rfc822"))
+ ("rfc-*822"
+ (viewer . vm-mode)
+ (test . (fboundp 'vm-mode))
+ (type . "message/rfc822"))
+ ("rfc-*822"
+ (viewer . w3-mode)
+ (test . (fboundp 'w3-mode))
+ (type . "message/rfc822"))
+ ("rfc-*822"
+ (viewer . view-mode)
+ (test . (fboundp 'view-mode))
+ (type . "message/rfc822"))
+ ("rfc-*822"
+ (viewer . fundamental-mode)
+ (type . "message/rfc822")))
+ ("image"
+ ("x-xwd"
+ (viewer . "xwud -in %s")
+ (type . "image/x-xwd")
+ ("compose" . "xwd -frame > %s")
+ (test . (eq (mm-device-type) 'x))
+ ("needsx11"))
+ ("x11-dump"
+ (viewer . "xwud -in %s")
+ (type . "image/x-xwd")
+ ("compose" . "xwd -frame > %s")
+ (test . (eq (mm-device-type) 'x))
+ ("needsx11"))
+ ("windowdump"
+ (viewer . "xwud -in %s")
+ (type . "image/x-xwd")
+ ("compose" . "xwd -frame > %s")
+ (test . (eq (mm-device-type) 'x))
+ ("needsx11"))
+ (".*"
+ (viewer . "aopen %s")
+ (type . "image/*")
+ (test . (eq (mm-device-type) 'ns)))
+ (".*"
+ (viewer . "display %s")
+ (type . "image/*")
+ (test . (eq (mm-device-type) 'x))
+ ("needsx11"))
+ (".*"
+ (viewer . "ee %s")
+ (type . "image/*")
+ (test . (eq (mm-device-type) 'x))
+ ("needsx11")))
+ ("text"
+ ("plain"
+ (viewer . w3-mode)
+ (test . (fboundp 'w3-mode))
+ (type . "text/plain"))
+ ("plain"
+ (viewer . view-mode)
+ (test . (fboundp 'view-mode))
+ (type . "text/plain"))
+ ("plain"
+ (viewer . fundamental-mode)
+ (type . "text/plain"))
+ ("enriched"
+ (viewer . enriched-decode-region)
+ (test . (fboundp 'enriched-decode))
+ (type . "text/enriched"))
+ ("html"
+ (viewer . mm-w3-prepare-buffer)
+ (test . (fboundp 'w3-prepare-buffer))
+ (type . "text/html")))
+ ("video"
+ ("mpeg"
+ (viewer . "mpeg_play %s")
+ (type . "video/mpeg")
+ (test . (eq (mm-device-type) 'x))
+ ("needsx11")))
+ ("x-world"
+ ("x-vrml"
+ (viewer . "webspace -remote %s -URL %u")
+ (type . "x-world/x-vrml")
+ ("description"
+ "VRML document")))
+ ("archive"
+ ("tar"
+ (viewer . tar-mode)
+ (type . "archive/tar")
+ (test . (fboundp 'tar-mode)))))
+ "The mailcap structure is an assoc list of assoc lists.
+1st assoc list is keyed on the major content-type
+2nd assoc list is keyed on the minor content-type (which can be a regexp)
+
+Which looks like:
+-----------------
+ ((\"application\"
+ (\"postscript\" . <info>))
+ (\"text\"
+ (\"plain\" . <info>)))
+
+Where <info> is another assoc list of the various information
+related to the mailcap RFC. This is keyed on the lowercase
+attribute name (viewer, test, etc). This looks like:
+ ((viewer . viewerinfo)
+ (test . testinfo)
+ (xxxx . \"string\"))
+
+Where viewerinfo specifies how the content-type is viewed. Can be
+a string, in which case it is run through a shell, with
+appropriate parameters, or a symbol, in which case the symbol is
+funcall'd, with the buffer as an argument.
+
+testinfo is a list of strings, or nil. If nil, it means the
+viewer specified is always valid. If it is a list of strings,
+these are used to determine whether a viewer passes the 'test' or
+not.")
+
+(defvar mailcap-download-directory nil
+ "*Where downloaded files should go by default.")
+
+(defvar mailcap-temporary-directory
+ (cond ((fboundp 'temp-directory) (temp-directory))
+ ((boundp 'temporary-file-directory) temporary-file-directory)
+ ("/tmp/"))
+ "*Where temporary files go.")
+
+;;;
+;;; Utility functions
+;;;
+
+(defun mailcap-generate-unique-filename (&optional fmt)
+ "Generate a unique filename in mailcap-temporary-directory."
+ (if (not fmt)
+ (let ((base (format "mailcap-tmp.%d" (user-real-uid)))
+ (fname "")
+ (x 0))
+ (setq fname (format "%s%d" base x))
+ (while (file-exists-p
+ (expand-file-name fname mailcap-temporary-directory))
+ (setq x (1+ x)
+ fname (concat base (int-to-string x))))
+ (expand-file-name fname mailcap-temporary-directory))
+ (let ((base (concat "mm" (int-to-string (user-real-uid))))
+ (fname "")
+ (x 0))
+ (setq fname (format fmt (concat base (int-to-string x))))
+ (while (file-exists-p
+ (expand-file-name fname mailcap-temporary-directory))
+ (setq x (1+ x)
+ fname (format fmt (concat base (int-to-string x)))))
+ (expand-file-name fname mailcap-temporary-directory))))
+
+(defun mailcap-save-binary-file ()
+ (goto-char (point-min))
+ (unwind-protect
+ (let ((file (read-file-name
+ "Filename to save as: "
+ (or mailcap-download-directory "~/")))
+ (require-final-newline nil))
+ (write-region (point-min) (point-max) file))
+ (kill-buffer (current-buffer))))
+
+(defvar mailcap-maybe-eval-warning
+ "*** WARNING ***
+
+This MIME part contains untrusted and possibly harmful content.
+If you evaluate the Emacs Lisp code contained in it, a lot of nasty
+things can happen. Please examine the code very carefully before you
+instruct Emacs to evaluate it. You can browse the buffer containing
+the code using \\[scroll-other-window].
+
+If you are unsure what to do, please answer \"no\"."
+ "Text of warning message displayed by `mailcap-maybe-eval'.
+Make sure that this text consists only of few text lines. Otherwise,
+Gnus might fail to display all of it.")
+
+(defun mailcap-maybe-eval ()
+ "Maybe evaluate a buffer of emacs lisp code."
+ (let ((lisp-buffer (current-buffer)))
+ (goto-char (point-min))
+ (when
+ (save-window-excursion
+ (delete-other-windows)
+ (let ((buffer (get-buffer-create (generate-new-buffer-name
+ "*Warning*"))))
+ (unwind-protect
+ (with-current-buffer buffer
+ (insert (substitute-command-keys
+ mailcap-maybe-eval-warning))
+ (goto-char (point-min))
+ (display-buffer buffer)
+ (yes-or-no-p "This is potentially dangerous emacs-lisp code, evaluate it? "))
+ (kill-buffer buffer))))
+ (eval-buffer (current-buffer)))
+ (when (buffer-live-p lisp-buffer)
+ (with-current-buffer lisp-buffer
+ (emacs-lisp-mode)))))
+
+
+;;;
+;;; The mailcap parser
+;;;
+
+(defun mailcap-replace-regexp (regexp to-string)
+ ;; Quiet replace-regexp.
+ (goto-char (point-min))
+ (while (re-search-forward regexp nil t)
+ (replace-match to-string t nil)))
+
+(defvar mailcap-parsed-p nil)
+
+(defun mailcap-parse-mailcaps (&optional path force)
+ "Parse out all the mailcaps specified in a path string PATH.
+Components of PATH are separated by the `path-separator' character
+appropriate for this system. If FORCE, re-parse even if already
+parsed. If PATH is omitted, use the value of environment variable
+MAILCAPS if set; otherwise (on Unix) use the path from RFC 1524, plus
+/usr/local/etc/mailcap."
+ (interactive (list nil t))
+ (when (or (not mailcap-parsed-p)
+ force)
+ (cond
+ (path nil)
+ ((getenv "MAILCAPS") (setq path (getenv "MAILCAPS")))
+ ((memq system-type '(ms-dos ms-windows windows-nt))
+ (setq path '("~/.mailcap" "~/mail.cap" "~/etc/mail.cap")))
+ (t (setq path
+ ;; This is per RFC 1524, specifically
+ ;; with /usr before /usr/local.
+ '("~/.mailcap" "/etc/mailcap" "/usr/etc/mailcap"
+ "/usr/local/etc/mailcap"))))
+ (let ((fnames (reverse
+ (if (stringp path)
+ (parse-colon-path path)
+ path)))
+ fname)
+ (while fnames
+ (setq fname (car fnames))
+ (if (and (file-readable-p fname)
+ (file-regular-p fname))
+ (mailcap-parse-mailcap fname))
+ (setq fnames (cdr fnames))))
+ (setq mailcap-parsed-p t)))
+
+(defun mailcap-parse-mailcap (fname)
+ ;; Parse out the mailcap file specified by FNAME
+ (let (major ; The major mime type (image/audio/etc)
+ minor ; The minor mime type (gif, basic, etc)
+ save-pos ; Misc saved positions used in parsing
+ viewer ; How to view this mime type
+ info ; Misc info about this mime type
+ )
+ (with-temp-buffer
+ (insert-file-contents fname)
+ (set-syntax-table mailcap-parse-args-syntax-table)
+ (mailcap-replace-regexp "#.*" "") ; Remove all comments
+ (mailcap-replace-regexp "\\\\[ \t]*\n" " ") ; And collapse spaces
+ (mailcap-replace-regexp "\n+" "\n") ; And blank lines
+ (goto-char (point-max))
+ (skip-chars-backward " \t\n")
+ (delete-region (point) (point-max))
+ (while (not (bobp))
+ (skip-chars-backward " \t\n")
+ (beginning-of-line)
+ (setq save-pos (point)
+ info nil)
+ (skip-chars-forward "^/; \t\n")
+ (downcase-region save-pos (point))
+ (setq major (buffer-substring save-pos (point)))
+ (skip-chars-forward " \t")
+ (setq minor "")
+ (when (eq (char-after) ?/)
+ (forward-char)
+ (skip-chars-forward " \t")
+ (setq save-pos (point))
+ (skip-chars-forward "^; \t\n")
+ (downcase-region save-pos (point))
+ (setq minor
+ (cond
+ ((eq ?* (or (char-after save-pos) 0)) ".*")
+ ((= (point) save-pos) ".*")
+ (t (regexp-quote (buffer-substring save-pos (point)))))))
+ (skip-chars-forward " \t")
+ ;;; Got the major/minor chunks, now for the viewers/etc
+ ;;; The first item _must_ be a viewer, according to the
+ ;;; RFC for mailcap files (#1343)
+ (setq viewer "")
+ (when (eq (char-after) ?\;)
+ (forward-char)
+ (skip-chars-forward " \t")
+ (setq save-pos (point))
+ (skip-chars-forward "^;\n")
+ ;; skip \;
+ (while (eq (char-before) ?\\)
+ (backward-delete-char 1)
+ (forward-char)
+ (skip-chars-forward "^;\n"))
+ (if (eq (or (char-after save-pos) 0) ?')
+ (setq viewer (progn
+ (narrow-to-region (1+ save-pos) (point))
+ (goto-char (point-min))
+ (prog1
+ (read (current-buffer))
+ (goto-char (point-max))
+ (widen))))
+ (setq viewer (buffer-substring save-pos (point)))))
+ (setq save-pos (point))
+ (end-of-line)
+ (unless (equal viewer "")
+ (setq info (nconc (list (cons 'viewer viewer)
+ (cons 'type (concat major "/"
+ (if (string= minor ".*")
+ "*" minor))))
+ (mailcap-parse-mailcap-extras save-pos (point))))
+ (mailcap-mailcap-entry-passes-test info)
+ (mailcap-add-mailcap-entry major minor info))
+ (beginning-of-line)))))
+
+(defun mailcap-parse-mailcap-extras (st nd)
+ ;; Grab all the extra stuff from a mailcap entry
+ (let (
+ name ; From name=
+ value ; its value
+ results ; Assoc list of results
+ name-pos ; Start of XXXX= position
+ val-pos ; Start of value position
+ done ; Found end of \'d ;s?
+ )
+ (save-restriction
+ (narrow-to-region st nd)
+ (goto-char (point-min))
+ (skip-chars-forward " \n\t;")
+ (while (not (eobp))
+ (setq done nil)
+ (setq name-pos (point))
+ (skip-chars-forward "^ \n\t=;")
+ (downcase-region name-pos (point))
+ (setq name (buffer-substring name-pos (point)))
+ (skip-chars-forward " \t\n")
+ (if (not (eq (char-after (point)) ?=)) ; There is no value
+ (setq value t)
+ (skip-chars-forward " \t\n=")
+ (setq val-pos (point))
+ (if (memq (char-after val-pos) '(?\" ?'))
+ (progn
+ (setq val-pos (1+ val-pos))
+ (condition-case nil
+ (progn
+ (forward-sexp 1)
+ (backward-char 1))
+ (error (goto-char (point-max)))))
+ (while (not done)
+ (skip-chars-forward "^;")
+ (if (eq (char-after (1- (point))) ?\\ )
+ (progn
+ (subst-char-in-region (1- (point)) (point) ?\\ ? )
+ (skip-chars-forward ";"))
+ (setq done t))))
+ (setq value (buffer-substring val-pos (point))))
+ (setq results (cons (cons name value) results))
+ (skip-chars-forward " \";\n\t"))
+ results)))
+
+(defun mailcap-mailcap-entry-passes-test (info)
+ ;; Return t iff a mailcap entry passes its test clause or no test
+ ;; clause is present.
+ (let (status ; Call-process-regions return value
+ (test (assq 'test info)) ; The test clause
+ )
+ (setq status (and test (split-string (cdr test) " ")))
+ (if (and (or (assoc "needsterm" info)
+ (assoc "needsterminal" info)
+ (assoc "needsx11" info))
+ (not (getenv "DISPLAY")))
+ (setq status nil)
+ (cond
+ ((and (equal (nth 0 status) "test")
+ (equal (nth 1 status) "-n")
+ (or (equal (nth 2 status) "$DISPLAY")
+ (equal (nth 2 status) "\"$DISPLAY\"")))
+ (setq status (if (getenv "DISPLAY") t nil)))
+ ((and (equal (nth 0 status) "test")
+ (equal (nth 1 status) "-z")
+ (or (equal (nth 2 status) "$DISPLAY")
+ (equal (nth 2 status) "\"$DISPLAY\"")))
+ (setq status (if (getenv "DISPLAY") nil t)))
+ (test nil)
+ (t nil)))
+ (and test (listp test) (setcdr test status))))
+
+;;;
+;;; The action routines.
+;;;
+
+(defun mailcap-possible-viewers (major minor)
+ ;; Return a list of possible viewers from MAJOR for minor type MINOR
+ (let ((exact '())
+ (wildcard '()))
+ (while major
+ (cond
+ ((equal (car (car major)) minor)
+ (setq exact (cons (cdr (car major)) exact)))
+ ((and minor (string-match (car (car major)) minor))
+ (setq wildcard (cons (cdr (car major)) wildcard))))
+ (setq major (cdr major)))
+ (nconc exact wildcard)))
+
+(defun mailcap-unescape-mime-test (test type-info)
+ (let (save-pos save-chr subst)
+ (cond
+ ((symbolp test) test)
+ ((and (listp test) (symbolp (car test))) test)
+ ((or (stringp test)
+ (and (listp test) (stringp (car test))
+ (setq test (mapconcat 'identity test " "))))
+ (with-temp-buffer
+ (insert test)
+ (goto-char (point-min))
+ (while (not (eobp))
+ (skip-chars-forward "^%")
+ (if (/= (- (point)
+ (progn (skip-chars-backward "\\\\")
+ (point)))
+ 0) ; It is an escaped %
+ (progn
+ (delete-char 1)
+ (skip-chars-forward "%."))
+ (setq save-pos (point))
+ (skip-chars-forward "%")
+ (setq save-chr (char-after (point)))
+ (cond
+ ((null save-chr) nil)
+ ((= save-chr ?t)
+ (delete-region save-pos (progn (forward-char 1) (point)))
+ (insert (or (cdr (assq 'type type-info)) "\"\"")))
+ ((= save-chr ?M)
+ (delete-region save-pos (progn (forward-char 1) (point)))
+ (insert "\"\""))
+ ((= save-chr ?n)
+ (delete-region save-pos (progn (forward-char 1) (point)))
+ (insert "\"\""))
+ ((= save-chr ?F)
+ (delete-region save-pos (progn (forward-char 1) (point)))
+ (insert "\"\""))
+ ((= save-chr ?{)
+ (forward-char 1)
+ (skip-chars-forward "^}")
+ (downcase-region (+ 2 save-pos) (point))
+ (setq subst (buffer-substring (+ 2 save-pos) (point)))
+ (delete-region save-pos (1+ (point)))
+ (insert (or (cdr (assoc subst type-info)) "\"\"")))
+ (t nil))))
+ (buffer-string)))
+ (t (error "Bad value to mailcap-unescape-mime-test. %s" test)))))
+
+(defvar mailcap-viewer-test-cache nil)
+
+(defun mailcap-viewer-passes-test (viewer-info type-info)
+ ;; Return non-nil iff the viewer specified by VIEWER-INFO passes its
+ ;; test clause (if any).
+ (let* ((test-info (assq 'test viewer-info))
+ (test (cdr test-info))
+ (otest test)
+ (viewer (cdr (assoc 'viewer viewer-info)))
+ (default-directory (expand-file-name "~/"))
+ status parsed-test cache result)
+ (if (setq cache (assoc test mailcap-viewer-test-cache))
+ (cadr cache)
+ (setq
+ result
+ (cond
+ ((not test-info) t) ; No test clause
+ ((not test) nil) ; Already failed test
+ ((eq test t) t) ; Already passed test
+ ((and (symbolp test) ; Lisp function as test
+ (fboundp test))
+ (funcall test type-info))
+ ((and (symbolp test) ; Lisp variable as test
+ (boundp test))
+ (symbol-value test))
+ ((and (listp test) ; List to be eval'd
+ (symbolp (car test)))
+ (eval test))
+ (t
+ (setq test (mailcap-unescape-mime-test test type-info)
+ test (list shell-file-name nil nil nil
+ shell-command-switch test)
+ status (apply 'call-process test))
+ (= 0 status))))
+ (push (list otest result) mailcap-viewer-test-cache)
+ result)))
+
+(defun mailcap-add-mailcap-entry (major minor info)
+ (let ((old-major (assoc major mailcap-mime-data)))
+ (if (null old-major) ; New major area
+ (setq mailcap-mime-data
+ (cons (cons major (list (cons minor info)))
+ mailcap-mime-data))
+ (let ((cur-minor (assoc minor old-major)))
+ (cond
+ ((or (null cur-minor) ; New minor area, or
+ (assq 'test info)) ; Has a test, insert at beginning
+ (setcdr old-major (cons (cons minor info) (cdr old-major))))
+ ((and (not (assq 'test info)) ; No test info, replace completely
+ (not (assq 'test cur-minor))
+ (equal (assq 'viewer info) ; Keep alternative viewer
+ (assq 'viewer cur-minor)))
+ (setcdr cur-minor info))
+ (t
+ (setcdr old-major (cons (cons minor info) (cdr old-major))))))
+ )))
+
+(defun mailcap-add (type viewer &optional test)
+ "Add VIEWER as a handler for TYPE.
+If TEST is not given, it defaults to t."
+ (let ((tl (split-string type "/")))
+ (when (or (not (car tl))
+ (not (cadr tl)))
+ (error "%s is not a valid MIME type" type))
+ (mailcap-add-mailcap-entry
+ (car tl) (cadr tl)
+ `((viewer . ,viewer)
+ (test . ,(if test test t))
+ (type . ,type)))))
+
+;;;
+;;; The main whabbo
+;;;
+
+(defun mailcap-viewer-lessp (x y)
+ ;; Return t iff viewer X is more desirable than viewer Y
+ (let ((x-wild (string-match "[*?]" (or (cdr-safe (assq 'type x)) "")))
+ (y-wild (string-match "[*?]" (or (cdr-safe (assq 'type y)) "")))
+ (x-lisp (not (stringp (or (cdr-safe (assq 'viewer x)) ""))))
+ (y-lisp (not (stringp (or (cdr-safe (assq 'viewer y)) "")))))
+ (cond
+ ((and x-wild (not y-wild))
+ nil)
+ ((and (not x-wild) y-wild)
+ t)
+ ((and (not y-lisp) x-lisp)
+ t)
+ (t nil))))
+
+(defun mailcap-mime-info (string &optional request)
+ "Get the MIME viewer command for STRING, return nil if none found.
+Expects a complete content-type header line as its argument.
+
+Second argument REQUEST specifies what information to return. If it is
+nil or the empty string, the viewer (second field of the mailcap
+entry) will be returned. If it is a string, then the mailcap field
+corresponding to that string will be returned (print, description,
+whatever). If a number, then all the information for this specific
+viewer is returned. If `all', then all possible viewers for
+this type is returned."
+ (let (
+ major ; Major encoding (text, etc)
+ minor ; Minor encoding (html, etc)
+ info ; Other info
+ save-pos ; Misc. position during parse
+ major-info ; (assoc major mailcap-mime-data)
+ minor-info ; (assoc minor major-info)
+ test ; current test proc.
+ viewers ; Possible viewers
+ passed ; Viewers that passed the test
+ viewer ; The one and only viewer
+ ctl)
+ (save-excursion
+ (setq ctl (mail-header-parse-content-type (or string "text/plain")))
+ (setq major (split-string (car ctl) "/"))
+ (setq minor (cadr major)
+ major (car major))
+ (when (setq major-info (cdr (assoc major mailcap-mime-data)))
+ (when (setq viewers (mailcap-possible-viewers major-info minor))
+ (setq info (mapcar (lambda (a) (cons (symbol-name (car a))
+ (cdr a)))
+ (cdr ctl)))
+ (while viewers
+ (if (mailcap-viewer-passes-test (car viewers) info)
+ (setq passed (cons (car viewers) passed)))
+ (setq viewers (cdr viewers)))
+ (setq passed (sort passed 'mailcap-viewer-lessp))
+ (setq viewer (car passed))))
+ (when (and (stringp (cdr (assq 'viewer viewer)))
+ passed)
+ (setq viewer (car passed)))
+ (cond
+ ((and (null viewer) (not (equal major "default")) request)
+ (mailcap-mime-info "default" request))
+ ((or (null request) (equal request ""))
+ (mailcap-unescape-mime-test (cdr (assq 'viewer viewer)) info))
+ ((stringp request)
+ (if (or (eq request 'test) (eq request 'viewer))
+ (mailcap-unescape-mime-test
+ (cdr-safe (assoc request viewer)) info)))
+ ((eq request 'all)
+ passed)
+ (t
+ ;; MUST make a copy *sigh*, else we modify mailcap-mime-data
+ (setq viewer (copy-sequence viewer))
+ (let ((view (assq 'viewer viewer))
+ (test (assq 'test viewer)))
+ (if view (setcdr view (mailcap-unescape-mime-test (cdr view) info)))
+ (if test (setcdr test (mailcap-unescape-mime-test (cdr test) info))))
+ viewer)))))
+
+;;;
+;;; Experimental MIME-types parsing
+;;;
+
+(defvar mailcap-mime-extensions
+ '(("" . "text/plain")
+ (".abs" . "audio/x-mpeg")
+ (".aif" . "audio/aiff")
+ (".aifc" . "audio/aiff")
+ (".aiff" . "audio/aiff")
+ (".ano" . "application/x-annotator")
+ (".au" . "audio/ulaw")
+ (".avi" . "video/x-msvideo")
+ (".bcpio" . "application/x-bcpio")
+ (".bin" . "application/octet-stream")
+ (".cdf" . "application/x-netcdr")
+ (".cpio" . "application/x-cpio")
+ (".csh" . "application/x-csh")
+ (".css" . "text/css")
+ (".dvi" . "application/x-dvi")
+ (".diff" . "text/x-patch")
+ (".el" . "application/emacs-lisp")
+ (".eps" . "application/postscript")
+ (".etx" . "text/x-setext")
+ (".exe" . "application/octet-stream")
+ (".fax" . "image/x-fax")
+ (".gif" . "image/gif")
+ (".hdf" . "application/x-hdf")
+ (".hqx" . "application/mac-binhex40")
+ (".htm" . "text/html")
+ (".html" . "text/html")
+ (".icon" . "image/x-icon")
+ (".ief" . "image/ief")
+ (".jpg" . "image/jpeg")
+ (".macp" . "image/x-macpaint")
+ (".man" . "application/x-troff-man")
+ (".me" . "application/x-troff-me")
+ (".mif" . "application/mif")
+ (".mov" . "video/quicktime")
+ (".movie" . "video/x-sgi-movie")
+ (".mp2" . "audio/x-mpeg")
+ (".mp3" . "audio/x-mpeg")
+ (".mp2a" . "audio/x-mpeg2")
+ (".mpa" . "audio/x-mpeg")
+ (".mpa2" . "audio/x-mpeg2")
+ (".mpe" . "video/mpeg")
+ (".mpeg" . "video/mpeg")
+ (".mpega" . "audio/x-mpeg")
+ (".mpegv" . "video/mpeg")
+ (".mpg" . "video/mpeg")
+ (".mpv" . "video/mpeg")
+ (".ms" . "application/x-troff-ms")
+ (".nc" . "application/x-netcdf")
+ (".nc" . "application/x-netcdf")
+ (".oda" . "application/oda")
+ (".patch" . "text/x-patch")
+ (".pbm" . "image/x-portable-bitmap")
+ (".pdf" . "application/pdf")
+ (".pgm" . "image/portable-graymap")
+ (".pict" . "image/pict")
+ (".png" . "image/png")
+ (".pnm" . "image/x-portable-anymap")
+ (".ppm" . "image/portable-pixmap")
+ (".ps" . "application/postscript")
+ (".qt" . "video/quicktime")
+ (".ras" . "image/x-raster")
+ (".rgb" . "image/x-rgb")
+ (".rtf" . "application/rtf")
+ (".rtx" . "text/richtext")
+ (".sh" . "application/x-sh")
+ (".sit" . "application/x-stuffit")
+ (".snd" . "audio/basic")
+ (".src" . "application/x-wais-source")
+ (".tar" . "archive/tar")
+ (".tcl" . "application/x-tcl")
+ (".tcl" . "application/x-tcl")
+ (".tex" . "application/x-tex")
+ (".texi" . "application/texinfo")
+ (".tga" . "image/x-targa")
+ (".tif" . "image/tiff")
+ (".tiff" . "image/tiff")
+ (".tr" . "application/x-troff")
+ (".troff" . "application/x-troff")
+ (".tsv" . "text/tab-separated-values")
+ (".txt" . "text/plain")
+ (".vbs" . "video/mpeg")
+ (".vox" . "audio/basic")
+ (".vrml" . "x-world/x-vrml")
+ (".wav" . "audio/x-wav")
+ (".wrl" . "x-world/x-vrml")
+ (".xbm" . "image/xbm")
+ (".xpm" . "image/xpm")
+ (".xwd" . "image/windowdump")
+ (".zip" . "application/zip")
+ (".ai" . "application/postscript")
+ (".jpe" . "image/jpeg")
+ (".jpeg" . "image/jpeg"))
+ "An assoc list of file extensions and corresponding MIME content-types.")
+
+(defvar mailcap-mimetypes-parsed-p nil)
+
+(defun mailcap-parse-mimetypes (&optional path force)
+ "Parse out all the mimetypes specified in a unix-style path string PATH.
+Components of PATH are separated by the `path-separator' character
+appropriate for this system. If PATH is omitted, use the value of
+environment variable MIMETYPES if set; otherwise use a default path.
+If FORCE, re-parse even if already parsed."
+ (interactive (list nil t))
+ (when (or (not mailcap-mimetypes-parsed-p)
+ force)
+ (cond
+ (path nil)
+ ((getenv "MIMETYPES") (setq path (getenv "MIMETYPES")))
+ ((memq system-type '(ms-dos ms-windows windows-nt))
+ (setq path '("~/mime.typ" "~/etc/mime.typ")))
+ (t (setq path
+ ;; mime.types seems to be the normal name, definitely so
+ ;; on current GNUish systems. The search order follows
+ ;; that for mailcap.
+ '("~/.mime.types"
+ "/etc/mime.types"
+ "/usr/etc/mime.types"
+ "/usr/local/etc/mime.types"
+ "/usr/local/www/conf/mime.types"
+ "~/.mime-types"
+ "/etc/mime-types"
+ "/usr/etc/mime-types"
+ "/usr/local/etc/mime-types"
+ "/usr/local/www/conf/mime-types"))))
+ (let ((fnames (reverse (if (stringp path)
+ (parse-colon-path path)
+ path)))
+ fname)
+ (while fnames
+ (setq fname (car fnames))
+ (if (and (file-readable-p fname))
+ (mailcap-parse-mimetype-file fname))
+ (setq fnames (cdr fnames))))
+ (setq mailcap-mimetypes-parsed-p t)))
+
+(defun mailcap-parse-mimetype-file (fname)
+ ;; Parse out a mime-types file
+ (let (type ; The MIME type for this line
+ extns ; The extensions for this line
+ save-pos ; Misc. saved buffer positions
+ )
+ (with-temp-buffer
+ (insert-file-contents fname)
+ (mailcap-replace-regexp "#.*" "")
+ (mailcap-replace-regexp "\n+" "\n")
+ (mailcap-replace-regexp "[ \t]+$" "")
+ (goto-char (point-max))
+ (skip-chars-backward " \t\n")
+ (delete-region (point) (point-max))
+ (goto-char (point-min))
+ (while (not (eobp))
+ (skip-chars-forward " \t\n")
+ (setq save-pos (point))
+ (skip-chars-forward "^ \t\n")
+ (downcase-region save-pos (point))
+ (setq type (buffer-substring save-pos (point)))
+ (while (not (eolp))
+ (skip-chars-forward " \t")
+ (setq save-pos (point))
+ (skip-chars-forward "^ \t\n")
+ (setq extns (cons (buffer-substring save-pos (point)) extns)))
+ (while extns
+ (setq mailcap-mime-extensions
+ (cons
+ (cons (if (= (string-to-char (car extns)) ?.)
+ (car extns)
+ (concat "." (car extns))) type)
+ mailcap-mime-extensions)
+ extns (cdr extns)))))))
+
+(defun mailcap-extension-to-mime (extn)
+ "Return the MIME content type of the file extensions EXTN."
+ (mailcap-parse-mimetypes)
+ (if (and (stringp extn)
+ (not (eq (string-to-char extn) ?.)))
+ (setq extn (concat "." extn)))
+ (cdr (assoc (downcase extn) mailcap-mime-extensions)))
+
+(defvar mailcap-binary-suffixes
+ (if (memq system-type '(ms-dos windows-nt))
+ '(".exe" ".com" ".bat" ".cmd" ".btm" "")
+ '("")))
+
+(defun mailcap-command-p (command)
+ "Say whether COMMAND is in the exec path.
+The path of COMMAND will be returned iff COMMAND is a command."
+ (let ((path (if (file-name-absolute-p command) '(nil) exec-path))
+ file dir)
+ (catch 'found
+ (while (setq dir (pop path))
+ (let ((suffixes mailcap-binary-suffixes))
+ (while suffixes
+ (when (and (file-executable-p
+ (setq file (expand-file-name
+ (concat command (pop suffixes))
+ dir)))
+ (not (file-directory-p file)))
+ (throw 'found file))))))))
+
+(defun mailcap-mime-types ()
+ "Return a list of MIME media types."
+ (mailcap-parse-mimetypes)
+ (mm-delete-duplicates (mapcar 'cdr mailcap-mime-extensions)))
+
+(provide 'mailcap)
+
+;;; mailcap.el ends here
--- /dev/null
+;;; mm-bodies.el --- Functions for decoding MIME things
+;; Copyright (C) 1998, 1999, 2000 Free Software Foundation, Inc.
+
+;; Author: Lars Magne Ingebrigtsen <larsi@gnus.org>
+;; MORIOKA Tomohiko <morioka@jaist.ac.jp>
+;; This file is part of GNU Emacs.
+
+;; GNU Emacs 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 Emacs 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 Emacs; see the file COPYING. If not, write to the
+;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;; Boston, MA 02111-1307, USA.
+
+;;; Commentary:
+
+;;; Code:
+
+(eval-and-compile
+ (or (fboundp 'base64-decode-region)
+ (require 'base64))
+ (autoload 'binhex-decode-region "binhex"))
+
+(require 'mm-util)
+(require 'rfc2047)
+(require 'qp)
+(require 'uudecode)
+
+;; 8bit treatment gets any char except: 0x32 - 0x7f, CR, LF, TAB, BEL,
+;; BS, vertical TAB, form feed, and ^_
+(defvar mm-7bit-chars "\x20-\x7f\r\n\t\x7\x8\xb\xc\x1f")
+
+(defcustom mm-body-charset-encoding-alist
+ '((iso-2022-jp . 7bit)
+ (iso-2022-jp-2 . 7bit))
+ "Alist of MIME charsets to encodings.
+Valid encodings are `7bit', `8bit', `quoted-printable' and `base64'."
+ :type '(repeat (cons (symbol :tag "charset")
+ (choice :tag "encoding"
+ (const 7bit)
+ (const 8bit)
+ (const quoted-printable)
+ (const base64))))
+ :group 'mime)
+
+(defun mm-encode-body ()
+ "Encode a body.
+Should be called narrowed to the body that is to be encoded.
+If there is more than one non-ASCII MULE charset, then list of found
+MULE charsets are returned.
+If successful, the MIME charset is returned.
+If no encoding was done, nil is returned."
+ (if (not (featurep 'mule))
+ ;; In the non-Mule case, we search for non-ASCII chars and
+ ;; return the value of `mail-parse-charset' if any are found.
+ (save-excursion
+ (goto-char (point-min))
+ (if (re-search-forward "[^\x0-\x7f]" nil t)
+ (or mail-parse-charset
+ (mm-read-charset "Charset used in the article: "))
+ ;; The logic in `mml-generate-mime-1' confirms that it's OK
+ ;; to return nil here.
+ nil))
+ (save-excursion
+ (goto-char (point-min))
+ (let ((charsets (mm-find-mime-charset-region (point-min) (point-max)))
+ charset)
+ (cond
+ ;; No encoding.
+ ((null charsets)
+ nil)
+ ;; Too many charsets.
+ ((> (length charsets) 1)
+ charsets)
+ ;; We encode.
+ (t
+ (let ((charset (car charsets))
+ start)
+ (when (or t
+ ;; We always decode.
+ (not (mm-coding-system-equal
+ charset buffer-file-coding-system)))
+ (while (not (eobp))
+ (if (eq (mm-charset-after) 'ascii)
+ (when start
+ (save-restriction
+ (narrow-to-region start (point))
+ (mm-encode-coding-region start (point) charset)
+ (goto-char (point-max)))
+ (setq start nil))
+ (unless start
+ (setq start (point))))
+ (forward-char 1))
+ (when start
+ (mm-encode-coding-region start (point) charset)
+ (setq start nil)))
+ charset)))))))
+
+(defun mm-body-encoding (charset &optional encoding)
+ "Do Content-Transfer-Encoding and return the encoding of the current buffer."
+ (let ((bits (mm-body-7-or-8)))
+ (cond
+ ((and (not mm-use-ultra-safe-encoding) (eq bits '7bit))
+ bits)
+ ((and (not mm-use-ultra-safe-encoding)
+ (or (eq t (cdr message-posting-charset))
+ (memq charset (cdr message-posting-charset))
+ (eq charset mail-parse-charset)))
+ bits)
+ (t
+ (let ((encoding (or encoding
+ (cdr (assq charset mm-body-charset-encoding-alist))
+ (mm-qp-or-base64))))
+ (when mm-use-ultra-safe-encoding
+ (setq encoding (mm-safer-encoding encoding)))
+ (mm-encode-content-transfer-encoding encoding "text/plain")
+ encoding)))))
+
+(defun mm-body-7-or-8 ()
+ "Say whether the body is 7bit or 8bit."
+ (cond
+ ((not (featurep 'mule))
+ (if (save-excursion
+ (goto-char (point-min))
+ (skip-chars-forward mm-7bit-chars)
+ (eobp))
+ '7bit
+ '8bit))
+ (t
+ ;; Mule version
+ (if (and (null (delq 'ascii
+ (mm-find-charset-region (point-min) (point-max))))
+ ;;!!!The following is necessary because the function
+ ;;!!!above seems to return the wrong result under
+ ;;!!!Emacs 20.3. Sometimes.
+ (save-excursion
+ (goto-char (point-min))
+ (skip-chars-forward mm-7bit-chars)
+ (eobp)))
+ '7bit
+ '8bit))))
+
+;;;
+;;; Functions for decoding
+;;;
+
+(defun mm-decode-content-transfer-encoding (encoding &optional type)
+ (prog1
+ (condition-case error
+ (cond
+ ((eq encoding 'quoted-printable)
+ (quoted-printable-decode-region (point-min) (point-max)))
+ ((eq encoding 'base64)
+ (base64-decode-region
+ (point-min)
+ ;; Some mailers insert whitespace
+ ;; junk at the end which
+ ;; base64-decode-region dislikes.
+ ;; Also remove possible junk which could
+ ;; have been added by mailing list software.
+ (save-excursion
+ (goto-char (point-min))
+ (while (re-search-forward "^[\t ]*\r?\n" nil t)
+ (delete-region (match-beginning 0) (match-end 0)))
+ (goto-char (point-max))
+ (when (re-search-backward "^[A-Za-z0-9+/]+=*[\t ]*$" nil t)
+ (forward-line)
+ (delete-region (point) (point-max)))
+ (point-max))))
+ ((memq encoding '(7bit 8bit binary))
+ ;; Do nothing.
+ )
+ ((null encoding)
+ ;; Do nothing.
+ )
+ ((memq encoding '(x-uuencode x-uue))
+ (funcall mm-uu-decode-function (point-min) (point-max)))
+ ((eq encoding 'x-binhex)
+ (funcall mm-uu-binhex-decode-function (point-min) (point-max)))
+ ((functionp encoding)
+ (funcall encoding (point-min) (point-max)))
+ (t
+ (message "Unknown encoding %s; defaulting to 8bit" encoding)))
+ (error
+ (message "Error while decoding: %s" error)
+ nil))
+ (when (and
+ (memq encoding '(base64 x-uuencode x-uue x-binhex))
+ (equal type "text/plain"))
+ (goto-char (point-min))
+ (while (search-forward "\r\n" nil t)
+ (replace-match "\n" t t)))))
+
+(defun mm-decode-body (charset &optional encoding type)
+ "Decode the current article that has been encoded with ENCODING.
+The characters in CHARSET should then be decoded."
+ (if (stringp charset)
+ (setq charset (intern (downcase charset))))
+ (if (or (not charset)
+ (eq 'gnus-all mail-parse-ignored-charsets)
+ (memq 'gnus-all mail-parse-ignored-charsets)
+ (memq charset mail-parse-ignored-charsets))
+ (setq charset mail-parse-charset))
+ (save-excursion
+ (when encoding
+ (mm-decode-content-transfer-encoding encoding type))
+ (when (featurep 'mule)
+ (let ((mule-charset (mm-charset-to-coding-system charset)))
+ (if (and (not mule-charset)
+ (listp mail-parse-ignored-charsets)
+ (memq 'gnus-unknown mail-parse-ignored-charsets))
+ (setq mule-charset
+ (mm-charset-to-coding-system mail-parse-charset)))
+ (when (and charset mule-charset
+ ;; buffer-file-coding-system
+ ;;Article buffer is nil coding system
+ ;;in XEmacs
+ (mm-multibyte-p)
+ (or (not (eq mule-charset 'ascii))
+ (setq mule-charset mail-parse-charset))
+ (not (eq mule-charset 'gnus-decoded)))
+ (mm-decode-coding-region (point-min) (point-max) mule-charset))))))
+
+(defun mm-decode-string (string charset)
+ "Decode STRING with CHARSET."
+ (when (stringp charset)
+ (setq charset (intern (downcase charset))))
+ (when (or (not charset)
+ (eq 'gnus-all mail-parse-ignored-charsets)
+ (memq 'gnus-all mail-parse-ignored-charsets)
+ (memq charset mail-parse-ignored-charsets))
+ (setq charset mail-parse-charset))
+ (or
+ (when (featurep 'mule)
+ (let ((mule-charset (mm-charset-to-coding-system charset)))
+ (if (and (not mule-charset)
+ (listp mail-parse-ignored-charsets)
+ (memq 'gnus-unknown mail-parse-ignored-charsets))
+ (setq mule-charset
+ (mm-charset-to-coding-system mail-parse-charset)))
+ (when (and charset mule-charset
+ (mm-multibyte-p)
+ (or (not (eq mule-charset 'ascii))
+ (setq mule-charset mail-parse-charset)))
+ (mm-decode-coding-string string mule-charset))))
+ string))
+
+(provide 'mm-bodies)
+
+;; mm-bodies.el ends here
--- /dev/null
+;;; mm-decode.el --- Functions for decoding MIME things
+;; Copyright (C) 1998, 1999, 2000 Free Software Foundation, Inc.
+
+;; Author: Lars Magne Ingebrigtsen <larsi@gnus.org>
+;; MORIOKA Tomohiko <morioka@jaist.ac.jp>
+;; This file is part of GNU Emacs.
+
+;; GNU Emacs 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 Emacs 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 Emacs; see the file COPYING. If not, write to the
+;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;; Boston, MA 02111-1307, USA.
+
+;;; Commentary:
+
+;;; Code:
+
+(require 'mail-parse)
+(require 'mailcap)
+(require 'mm-bodies)
+(eval-when-compile (require 'cl))
+
+(eval-and-compile
+ (autoload 'mm-inline-partial "mm-partial"))
+
+(defgroup mime-display ()
+ "Display of MIME in mail and news articles."
+ :link '(custom-manual "(emacs-mime)Customization")
+ :version "21.1"
+ :group 'mail
+ :group 'news
+ :group 'multimedia)
+
+;;; Convenience macros.
+
+(defmacro mm-handle-buffer (handle)
+ `(nth 0 ,handle))
+(defmacro mm-handle-type (handle)
+ `(nth 1 ,handle))
+(defsubst mm-handle-media-type (handle)
+ (if (stringp (car handle))
+ (car handle)
+ (car (mm-handle-type handle))))
+(defsubst mm-handle-media-supertype (handle)
+ (car (split-string (mm-handle-media-type handle) "/")))
+(defsubst mm-handle-media-subtype (handle)
+ (cadr (split-string (mm-handle-media-type handle) "/")))
+(defmacro mm-handle-encoding (handle)
+ `(nth 2 ,handle))
+(defmacro mm-handle-undisplayer (handle)
+ `(nth 3 ,handle))
+(defmacro mm-handle-set-undisplayer (handle function)
+ `(setcar (nthcdr 3 ,handle) ,function))
+(defmacro mm-handle-disposition (handle)
+ `(nth 4 ,handle))
+(defmacro mm-handle-description (handle)
+ `(nth 5 ,handle))
+(defmacro mm-handle-cache (handle)
+ `(nth 6 ,handle))
+(defmacro mm-handle-set-cache (handle contents)
+ `(setcar (nthcdr 6 ,handle) ,contents))
+(defmacro mm-handle-id (handle)
+ `(nth 7 ,handle))
+(defmacro mm-make-handle (&optional buffer type encoding undisplayer
+ disposition description cache
+ id)
+ `(list ,buffer ,type ,encoding ,undisplayer
+ ,disposition ,description ,cache ,id))
+
+(defcustom mm-inline-media-tests
+ '(("image/jpeg"
+ mm-inline-image
+ (lambda (handle)
+ (mm-valid-and-fit-image-p 'jpeg handle)))
+ ("image/png"
+ mm-inline-image
+ (lambda (handle)
+ (mm-valid-and-fit-image-p 'png handle)))
+ ("image/gif"
+ mm-inline-image
+ (lambda (handle)
+ (mm-valid-and-fit-image-p 'gif handle)))
+ ("image/tiff"
+ mm-inline-image
+ (lambda (handle)
+ (mm-valid-and-fit-image-p 'tiff handle)) )
+ ("image/xbm"
+ mm-inline-image
+ (lambda (handle)
+ (mm-valid-and-fit-image-p 'xbm handle)))
+ ("image/x-xbitmap"
+ mm-inline-image
+ (lambda (handle)
+ (mm-valid-and-fit-image-p 'xbm handle)))
+ ("image/xpm"
+ mm-inline-image
+ (lambda (handle)
+ (mm-valid-and-fit-image-p 'xpm handle)))
+ ("image/x-pixmap"
+ mm-inline-image
+ (lambda (handle)
+ (mm-valid-and-fit-image-p 'xpm handle)))
+ ("image/bmp"
+ mm-inline-image
+ (lambda (handle)
+ (mm-valid-and-fit-image-p 'bmp handle)))
+ ("text/plain" mm-inline-text identity)
+ ("text/enriched" mm-inline-text identity)
+ ("text/richtext" mm-inline-text identity)
+ ("text/x-patch" mm-display-patch-inline
+ (lambda (handle)
+ (locate-library "diff-mode")))
+ ("text/html"
+ mm-inline-text
+ (lambda (handle)
+ (locate-library "w3")))
+ ("text/x-vcard"
+ mm-inline-text
+ (lambda (handle)
+ (or (featurep 'vcard)
+ (locate-library "vcard"))))
+ ("message/delivery-status" mm-inline-text identity)
+ ("message/rfc822" mm-inline-message identity)
+ ("message/partial" mm-inline-partial identity)
+ ("text/.*" mm-inline-text identity)
+ ("audio/wav" mm-inline-audio
+ (lambda (handle)
+ (and (or (featurep 'nas-sound) (featurep 'native-sound))
+ (device-sound-enabled-p))))
+ ("audio/au"
+ mm-inline-audio
+ (lambda (handle)
+ (and (or (featurep 'nas-sound) (featurep 'native-sound))
+ (device-sound-enabled-p))))
+ ("application/pgp-signature" ignore identity)
+ ("multipart/alternative" ignore identity)
+ ("multipart/mixed" ignore identity)
+ ("multipart/related" ignore identity))
+ "Alist of media types/tests saying whether types can be displayed inline."
+ :type '(repeat (list (string :tag "MIME type")
+ (function :tag "Display function")
+ (function :tag "Display test")))
+ :group 'mime-display)
+
+(defcustom mm-inlined-types
+ '("image/.*" "text/.*" "message/delivery-status" "message/rfc822"
+ "message/partial"
+ "application/pgp-signature")
+ "List of media types that are to be displayed inline."
+ :type '(repeat string)
+ :group 'mime-display)
+
+(defcustom mm-automatic-display
+ '("text/plain" "text/enriched" "text/richtext" "text/html"
+ "text/x-vcard" "image/.*" "message/delivery-status" "multipart/.*"
+ "message/rfc822" "text/x-patch" "application/pgp-signature")
+ "A list of MIME types to be displayed automatically."
+ :type '(repeat string)
+ :group 'mime-display)
+
+(defcustom mm-attachment-override-types '("text/x-vcard")
+ "Types to have \"attachment\" ignored if they can be displayed inline."
+ :type '(repeat string)
+ :group 'mime-display)
+
+(defcustom mm-inline-override-types nil
+ "Types to be treated as attachments even if they can be displayed inline."
+ :type '(repeat string)
+ :group 'mime-display)
+
+(defcustom mm-automatic-external-display nil
+ "List of MIME type regexps that will be displayed externally automatically."
+ :type '(repeat string)
+ :group 'mime-display)
+
+(defcustom mm-discouraged-alternatives nil
+ "List of MIME types that are discouraged when viewing multipart/alternative.
+Viewing agents are supposed to view the last possible part of a message,
+as that is supposed to be the richest. However, users may prefer other
+types instead, and this list says what types are most unwanted. If,
+for instance, text/html parts are very unwanted, and text/richtext are
+somewhat unwanted, then the value of this variable should be set
+to:
+
+ (\"text/html\" \"text/richtext\")"
+ :type '(repeat string)
+ :group 'mime-display)
+
+(defvar mm-tmp-directory
+ (cond ((fboundp 'temp-directory) (temp-directory))
+ ((boundp 'temporary-file-directory) temporary-file-directory)
+ ("/tmp/"))
+ "Where mm will store its temporary files.")
+
+(defcustom mm-inline-large-images nil
+ "If non-nil, then all images fit in the buffer."
+ :type 'boolean
+ :group 'mime-display)
+
+;;; Internal variables.
+
+(defvar mm-dissection-list nil)
+(defvar mm-last-shell-command "")
+(defvar mm-content-id-alist nil)
+
+;; According to RFC2046, in particular, in a digest, the default
+;; Content-Type value for a body part is changed from "text/plain" to
+;; "message/rfc822".
+(defvar mm-dissect-default-type "text/plain")
+
+;;; The functions.
+
+(defun mm-dissect-buffer (&optional no-strict-mime)
+ "Dissect the current buffer and return a list of MIME handles."
+ (save-excursion
+ (let (ct ctl type subtype cte cd description id result)
+ (save-restriction
+ (mail-narrow-to-head)
+ (when (or no-strict-mime
+ (mail-fetch-field "mime-version"))
+ (setq ct (mail-fetch-field "content-type")
+ ctl (ignore-errors (mail-header-parse-content-type ct))
+ cte (mail-fetch-field "content-transfer-encoding")
+ cd (mail-fetch-field "content-disposition")
+ description (mail-fetch-field "content-description")
+ id (mail-fetch-field "content-id"))))
+ (when cte
+ (setq cte (mail-header-strip cte)))
+ (if (or (not ctl)
+ (not (string-match "/" (car ctl))))
+ (mm-dissect-singlepart
+ (list mm-dissect-default-type)
+ (and cte (intern (downcase (mail-header-remove-whitespace
+ (mail-header-remove-comments
+ cte)))))
+ no-strict-mime
+ (and cd (ignore-errors (mail-header-parse-content-disposition cd)))
+ description)
+ (setq type (split-string (car ctl) "/"))
+ (setq subtype (cadr type)
+ type (pop type))
+ (setq
+ result
+ (cond
+ ((equal type "multipart")
+ (let ((mm-dissect-default-type (if (equal subtype "digest")
+ "message/rfc822"
+ "text/plain")))
+ (cons (car ctl) (mm-dissect-multipart ctl))))
+ (t
+ (mm-dissect-singlepart
+ ctl
+ (and cte (intern (downcase (mail-header-remove-whitespace
+ (mail-header-remove-comments
+ cte)))))
+ no-strict-mime
+ (and cd (ignore-errors (mail-header-parse-content-disposition cd)))
+ description id))))
+ (when id
+ (when (string-match " *<\\(.*\\)> *" id)
+ (setq id (match-string 1 id)))
+ (push (cons id result) mm-content-id-alist))
+ result))))
+
+(defun mm-dissect-singlepart (ctl cte &optional force cdl description id)
+ (when (or force
+ (if (equal "text/plain" (car ctl))
+ (assoc 'format ctl)
+ t))
+ (let ((res (mm-make-handle
+ (mm-copy-to-buffer) ctl cte nil cdl description nil id)))
+ (push (car res) mm-dissection-list)
+ res)))
+
+(defun mm-remove-all-parts ()
+ "Remove all MIME handles."
+ (interactive)
+ (mapcar 'mm-remove-part mm-dissection-list)
+ (setq mm-dissection-list nil))
+
+(defun mm-dissect-multipart (ctl)
+ (goto-char (point-min))
+ (let* ((boundary (concat "\n--" (mail-content-type-get ctl 'boundary)))
+ (close-delimiter (concat (regexp-quote boundary) "--[ \t]*$"))
+ start parts
+ (end (save-excursion
+ (goto-char (point-max))
+ (if (re-search-backward close-delimiter nil t)
+ (match-beginning 0)
+ (point-max)))))
+ (setq boundary (concat (regexp-quote boundary) "[ \t]*$"))
+ (while (re-search-forward boundary end t)
+ (goto-char (match-beginning 0))
+ (when start
+ (save-excursion
+ (save-restriction
+ (narrow-to-region start (point))
+ (setq parts (nconc (list (mm-dissect-buffer t)) parts)))))
+ (forward-line 2)
+ (setq start (point)))
+ (when start
+ (save-excursion
+ (save-restriction
+ (narrow-to-region start end)
+ (setq parts (nconc (list (mm-dissect-buffer t)) parts)))))
+ (nreverse parts)))
+
+(defun mm-copy-to-buffer ()
+ "Copy the contents of the current buffer to a fresh buffer."
+ (save-excursion
+ (let ((obuf (current-buffer))
+ beg)
+ (goto-char (point-min))
+ (search-forward-regexp "^\n" nil t)
+ (setq beg (point))
+ (set-buffer (generate-new-buffer " *mm*"))
+ (insert-buffer-substring obuf beg)
+ (current-buffer))))
+
+(defun mm-display-part (handle &optional no-default)
+ "Display the MIME part represented by HANDLE.
+Returns nil if the part is removed; inline if displayed inline;
+external if displayed external."
+ (save-excursion
+ (mailcap-parse-mailcaps)
+ (if (mm-handle-displayed-p handle)
+ (mm-remove-part handle)
+ (let* ((type (mm-handle-media-type handle))
+ (method (mailcap-mime-info type)))
+ (if (mm-inlined-p handle)
+ (progn
+ (forward-line 1)
+ (mm-display-inline handle)
+ 'inline)
+ (when (or method
+ (not no-default))
+ (if (and (not method)
+ (equal "text" (car (split-string type))))
+ (progn
+ (forward-line 1)
+ (mm-insert-inline handle (mm-get-part handle))
+ 'inline)
+ (mm-display-external
+ handle (or method 'mailcap-save-binary-file)))))))))
+
+(defun mm-display-external (handle method)
+ "Display HANDLE using METHOD."
+ (let ((outbuf (current-buffer)))
+ (mm-with-unibyte-buffer
+ (if (functionp method)
+ (let ((cur (current-buffer)))
+ (if (eq method 'mailcap-save-binary-file)
+ (progn
+ (set-buffer (generate-new-buffer "*mm*"))
+ (setq method nil))
+ (mm-insert-part handle)
+ (let ((win (get-buffer-window cur t)))
+ (when win
+ (select-window win)))
+ (switch-to-buffer (generate-new-buffer "*mm*")))
+ (buffer-disable-undo)
+ (mm-set-buffer-file-coding-system mm-binary-coding-system)
+ (insert-buffer-substring cur)
+ (goto-char (point-min))
+ (message "Viewing with %s" method)
+ (let ((mm (current-buffer))
+ (non-viewer (assq 'non-viewer
+ (mailcap-mime-info
+ (mm-handle-media-type handle) t))))
+ (unwind-protect
+ (if method
+ (funcall method)
+ (mm-save-part handle))
+ (when (and (not non-viewer)
+ method)
+ (mm-handle-set-undisplayer handle mm)))))
+ ;; The function is a string to be executed.
+ (mm-insert-part handle)
+ (let* ((dir (make-temp-name (expand-file-name "emm." mm-tmp-directory)))
+ (filename (mail-content-type-get
+ (mm-handle-disposition handle) 'filename))
+ (mime-info (mailcap-mime-info
+ (mm-handle-media-type handle) t))
+ (needsterm (or (assoc "needsterm" mime-info)
+ (assoc "needsterminal" mime-info)))
+ (copiousoutput (assoc "copiousoutput" mime-info))
+ file buffer)
+ ;; We create a private sub-directory where we store our files.
+ (make-directory dir)
+ (set-file-modes dir 448)
+ (if filename
+ (setq file (expand-file-name (file-name-nondirectory filename)
+ dir))
+ (setq file (make-temp-name (expand-file-name "mm." dir))))
+ (let ((coding-system-for-write mm-binary-coding-system))
+ (write-region (point-min) (point-max) file nil 'nomesg))
+ (message "Viewing with %s" method)
+ (cond (needsterm
+ (unwind-protect
+ (start-process "*display*" nil
+ "xterm"
+ "-e" shell-file-name
+ shell-command-switch
+ (mm-mailcap-command
+ method file (mm-handle-type handle)))
+ (mm-handle-set-undisplayer handle (cons file buffer)))
+ (message "Displaying %s..." (format method file))
+ 'external)
+ (copiousoutput
+ (with-current-buffer outbuf
+ (forward-line 1)
+ (mm-insert-inline
+ handle
+ (unwind-protect
+ (progn
+ (call-process shell-file-name nil
+ (setq buffer
+ (generate-new-buffer "*mm*"))
+ nil
+ shell-command-switch
+ (mm-mailcap-command
+ method file (mm-handle-type handle)))
+ (if (buffer-live-p buffer)
+ (save-excursion
+ (set-buffer buffer)
+ (buffer-string))))
+ (progn
+ (ignore-errors (delete-file file))
+ (ignore-errors (delete-directory
+ (file-name-directory file)))
+ (ignore-errors (kill-buffer buffer))))))
+ 'inline)
+ (t
+ (unwind-protect
+ (start-process "*display*"
+ (setq buffer
+ (generate-new-buffer "*mm*"))
+ shell-file-name
+ shell-command-switch
+ (mm-mailcap-command
+ method file (mm-handle-type handle)))
+ (mm-handle-set-undisplayer handle (cons file buffer)))
+ (message "Displaying %s..." (format method file))
+ 'external)))))))
+
+(defun mm-mailcap-command (method file type-list)
+ (let ((ctl (cdr type-list))
+ (beg 0)
+ (uses-stdin t)
+ out sub total)
+ (while (string-match "%{\\([^}]+\\)}\\|%s\\|%t\\|%%" method beg)
+ (push (substring method beg (match-beginning 0)) out)
+ (setq beg (match-end 0)
+ total (match-string 0 method)
+ sub (match-string 1 method))
+ (cond
+ ((string= total "%%")
+ (push "%" out))
+ ((string= total "%s")
+ (setq uses-stdin nil)
+ (push (mm-quote-arg file) out))
+ ((string= total "%t")
+ (push (mm-quote-arg (car type-list)) out))
+ (t
+ (push (mm-quote-arg (or (cdr (assq (intern sub) ctl)) "")) out))))
+ (push (substring method beg (length method)) out)
+ (if uses-stdin
+ (progn
+ (push "<" out)
+ (push (mm-quote-arg file) out)))
+ (mapconcat 'identity (nreverse out) "")))
+
+(defun mm-remove-parts (handles)
+ "Remove the displayed MIME parts represented by HANDLES."
+ (if (and (listp handles)
+ (bufferp (car handles)))
+ (mm-remove-part handles)
+ (let (handle)
+ (while (setq handle (pop handles))
+ (cond
+ ((stringp handle)
+ ;; Do nothing.
+ )
+ ((and (listp handle)
+ (stringp (car handle)))
+ (mm-remove-parts (cdr handle)))
+ (t
+ (mm-remove-part handle)))))))
+
+(defun mm-destroy-parts (handles)
+ "Remove the displayed MIME parts represented by HANDLES."
+ (if (and (listp handles)
+ (bufferp (car handles)))
+ (mm-destroy-part handles)
+ (let (handle)
+ (while (setq handle (pop handles))
+ (cond
+ ((stringp handle)
+ ;; Do nothing.
+ )
+ ((and (listp handle)
+ (stringp (car handle)))
+ (mm-destroy-parts (cdr handle)))
+ (t
+ (mm-destroy-part handle)))))))
+
+(defun mm-remove-part (handle)
+ "Remove the displayed MIME part represented by HANDLE."
+ (when (listp handle)
+ (let ((object (mm-handle-undisplayer handle)))
+ (ignore-errors
+ (cond
+ ;; Internally displayed part.
+ ((mm-annotationp object)
+ (delete-annotation object))
+ ((or (functionp object)
+ (and (listp object)
+ (eq (car object) 'lambda)))
+ (funcall object))
+ ;; Externally displayed part.
+ ((consp object)
+ (ignore-errors (delete-file (car object)))
+ (ignore-errors (delete-directory (file-name-directory (car object))))
+ (ignore-errors (kill-buffer (cdr object))))
+ ((bufferp object)
+ (when (buffer-live-p object)
+ (kill-buffer object)))))
+ (mm-handle-set-undisplayer handle nil))))
+
+(defun mm-display-inline (handle)
+ (let* ((type (mm-handle-media-type handle))
+ (function (cadr (mm-assoc-string-match mm-inline-media-tests type))))
+ (funcall function handle)
+ (goto-char (point-min))))
+
+(defun mm-assoc-string-match (alist type)
+ (dolist (elem alist)
+ (when (string-match (car elem) type)
+ (return elem))))
+
+(defun mm-inlinable-p (handle)
+ "Say whether HANDLE can be displayed inline."
+ (let ((alist mm-inline-media-tests)
+ (type (mm-handle-media-type handle))
+ test)
+ (while alist
+ (when (string-match (caar alist) type)
+ (setq test (caddar alist)
+ alist nil)
+ (setq test (funcall test handle)))
+ (pop alist))
+ test))
+
+(defun mm-automatic-display-p (handle)
+ "Say whether the user wants HANDLE to be displayed automatically."
+ (let ((methods mm-automatic-display)
+ (type (mm-handle-media-type handle))
+ method result)
+ (while (setq method (pop methods))
+ (when (and (not (mm-inline-override-p handle))
+ (string-match method type)
+ (mm-inlinable-p handle))
+ (setq result t
+ methods nil)))
+ result))
+
+(defun mm-inlined-p (handle)
+ "Say whether the user wants HANDLE to be displayed automatically."
+ (let ((methods mm-inlined-types)
+ (type (mm-handle-media-type handle))
+ method result)
+ (while (setq method (pop methods))
+ (when (and (not (mm-inline-override-p handle))
+ (string-match method type)
+ (mm-inlinable-p handle))
+ (setq result t
+ methods nil)))
+ result))
+
+(defun mm-attachment-override-p (handle)
+ "Say whether HANDLE should have attachment behavior overridden."
+ (let ((types mm-attachment-override-types)
+ (type (mm-handle-media-type handle))
+ ty)
+ (catch 'found
+ (while (setq ty (pop types))
+ (when (and (string-match ty type)
+ (mm-inlinable-p handle))
+ (throw 'found t))))))
+
+(defun mm-inline-override-p (handle)
+ "Say whether HANDLE should have inline behavior overridden."
+ (let ((types mm-inline-override-types)
+ (type (mm-handle-media-type handle))
+ ty)
+ (catch 'found
+ (while (setq ty (pop types))
+ (when (string-match ty type)
+ (throw 'found t))))))
+
+(defun mm-automatic-external-display-p (type)
+ "Return the user-defined method for TYPE."
+ (let ((methods mm-automatic-external-display)
+ method result)
+ (while (setq method (pop methods))
+ (when (string-match method type)
+ (setq result t
+ methods nil)))
+ result))
+
+(defun mm-destroy-part (handle)
+ "Destroy the data structures connected to HANDLE."
+ (when (listp handle)
+ (mm-remove-part handle)
+ (when (buffer-live-p (mm-handle-buffer handle))
+ (kill-buffer (mm-handle-buffer handle)))))
+
+(defun mm-handle-displayed-p (handle)
+ "Say whether HANDLE is displayed or not."
+ (mm-handle-undisplayer handle))
+
+;;;
+;;; Functions for outputting parts
+;;;
+
+(defun mm-get-part (handle)
+ "Return the contents of HANDLE as a string."
+ (mm-with-unibyte-buffer
+ (mm-insert-part handle)
+ (buffer-string)))
+
+(defun mm-insert-part (handle)
+ "Insert the contents of HANDLE in the current buffer."
+ (let ((cur (current-buffer)))
+ (save-excursion
+ (if (member (mm-handle-media-supertype handle) '("text" "message"))
+ (with-temp-buffer
+ (insert-buffer-substring (mm-handle-buffer handle))
+ (mm-decode-content-transfer-encoding
+ (mm-handle-encoding handle)
+ (mm-handle-media-type handle))
+ (let ((temp (current-buffer)))
+ (set-buffer cur)
+ (insert-buffer-substring temp)))
+ (mm-with-unibyte-buffer
+ (insert-buffer-substring (mm-handle-buffer handle))
+ (mm-decode-content-transfer-encoding
+ (mm-handle-encoding handle)
+ (mm-handle-media-type handle))
+ (let ((temp (current-buffer)))
+ (set-buffer cur)
+ (insert-buffer-substring temp)))))))
+
+(defvar mm-default-directory nil)
+
+(defun mm-save-part (handle)
+ "Write HANDLE to a file."
+ (let* ((name (mail-content-type-get (mm-handle-type handle) 'name))
+ (filename (mail-content-type-get
+ (mm-handle-disposition handle) 'filename))
+ file)
+ (when filename
+ (setq filename (file-name-nondirectory filename)))
+ (setq file
+ (read-file-name "Save MIME part to: "
+ (expand-file-name
+ (or filename name "")
+ (or mm-default-directory default-directory))))
+ (setq mm-default-directory (file-name-directory file))
+ (when (or (not (file-exists-p file))
+ (yes-or-no-p (format "File %s already exists; overwrite? "
+ file)))
+ (mm-save-part-to-file handle file))))
+
+(defun mm-save-part-to-file (handle file)
+ (mm-with-unibyte-buffer
+ (mm-insert-part handle)
+ (let ((coding-system-for-write 'binary)
+ ;; Don't re-compress .gz & al. Arguably we should make
+ ;; `file-name-handler-alist' nil, but that would chop
+ ;; ange-ftp, which is reasonable to use here.
+ (inhibit-file-name-operation 'write-region)
+ (inhibit-file-name-handlers
+ (cons 'jka-compr-handler inhibit-file-name-handlers)))
+ (write-region (point-min) (point-max) file))))
+
+(defun mm-pipe-part (handle)
+ "Pipe HANDLE to a process."
+ (let* ((name (mail-content-type-get (mm-handle-type handle) 'name))
+ (command
+ (read-string "Shell command on MIME part: " mm-last-shell-command)))
+ (mm-with-unibyte-buffer
+ (mm-insert-part handle)
+ (shell-command-on-region (point-min) (point-max) command nil))))
+
+(defun mm-interactively-view-part (handle)
+ "Display HANDLE using METHOD."
+ (let* ((type (mm-handle-media-type handle))
+ (methods
+ (mapcar (lambda (i) (list (cdr (assoc 'viewer i))))
+ (mailcap-mime-info type 'all)))
+ (method (completing-read "Viewer: " methods)))
+ (when (string= method "")
+ (error "No method given"))
+ (if (string-match "^[^% \t]+$" method)
+ (setq method (concat method " %s")))
+ (mm-display-external (copy-sequence handle) method)))
+
+(defun mm-preferred-alternative (handles &optional preferred)
+ "Say which of HANDLES are preferred."
+ (let ((prec (if preferred (list preferred)
+ (mm-preferred-alternative-precedence handles)))
+ p h result type handle)
+ (while (setq p (pop prec))
+ (setq h handles)
+ (while h
+ (setq handle (car h))
+ (setq type (mm-handle-media-type handle))
+ (when (and (equal p type)
+ (mm-automatic-display-p handle)
+ (or (stringp (car handle))
+ (not (mm-handle-disposition handle))
+ (equal (car (mm-handle-disposition handle))
+ "inline")))
+ (setq result handle
+ h nil
+ prec nil))
+ (pop h)))
+ result))
+
+(defun mm-preferred-alternative-precedence (handles)
+ "Return the precedence based on HANDLES and `mm-discouraged-alternatives'."
+ (let ((seq (nreverse (mapcar #'mm-handle-media-type
+ handles))))
+ (dolist (disc (reverse mm-discouraged-alternatives))
+ (dolist (elem (copy-sequence seq))
+ (when (string-match disc elem)
+ (setq seq (nconc (delete elem seq) (list elem))))))
+ seq))
+
+(defun mm-get-content-id (id)
+ "Return the handle(s) referred to by ID."
+ (cdr (assoc id mm-content-id-alist)))
+
+(defun mm-get-image (handle)
+ "Return an image instance based on HANDLE."
+ (let ((type (mm-handle-media-subtype handle))
+ spec)
+ ;; Allow some common translations.
+ (setq type
+ (cond
+ ((equal type "x-pixmap")
+ "xpm")
+ ((equal type "x-xbitmap")
+ "xbm")
+ (t type)))
+ (or (mm-handle-cache handle)
+ (mm-with-unibyte-buffer
+ (mm-insert-part handle)
+ (prog1
+ (setq spec
+ (ignore-errors
+ ;; Avoid testing `make-glyph' since W3 may define
+ ;; a bogus version of it.
+ (if (fboundp 'create-image)
+ (create-image (buffer-string) (intern type) 'data-p)
+ (cond
+ ((equal type "xbm")
+ ;; xbm images require special handling, since
+ ;; the only way to create glyphs from these
+ ;; (without a ton of work) is to write them
+ ;; out to a file, and then create a file
+ ;; specifier.
+ (let ((file (make-temp-name
+ (expand-file-name "emm.xbm"
+ mm-tmp-directory))))
+ (unwind-protect
+ (progn
+ (write-region (point-min) (point-max) file)
+ (make-glyph (list (cons 'x file))))
+ (ignore-errors
+ (delete-file file)))))
+ (t
+ (make-glyph
+ (vector (intern type) :data (buffer-string))))))))
+ (mm-handle-set-cache handle spec))))))
+
+(defun mm-image-fit-p (handle)
+ "Say whether the image in HANDLE will fit the current window."
+ (let ((image (mm-get-image handle)))
+ (if (fboundp 'glyph-width)
+ ;; XEmacs' glyphs can actually tell us about their width, so
+ ;; lets be nice and smart about them.
+ (or mm-inline-large-images
+ (and (< (glyph-width image) (window-pixel-width))
+ (< (glyph-height image) (window-pixel-height))))
+ (let* ((size (image-size image))
+ (w (car size))
+ (h (cdr size)))
+ (or mm-inline-large-images
+ (and (< h (1- (window-height))) ; Don't include mode line.
+ (< w (window-width))))))))
+
+(defun mm-valid-image-format-p (format)
+ "Say whether FORMAT can be displayed natively by Emacs."
+ (cond
+ ;; Handle XEmacs
+ ((fboundp 'valid-image-instantiator-format-p)
+ (valid-image-instantiator-format-p format))
+ ;; Handle Emacs 21
+ ((fboundp 'image-type-available-p)
+ (and (display-graphic-p)
+ (image-type-available-p format)))
+ ;; Nobody else can do images yet.
+ (t
+ nil)))
+
+(defun mm-valid-and-fit-image-p (format handle)
+ "Say whether FORMAT can be displayed natively and HANDLE fits the window."
+ (and window-system
+ (mm-valid-image-format-p format)
+ (mm-image-fit-p handle)))
+
+(provide 'mm-decode)
+
+;;; mm-decode.el ends here
--- /dev/null
+;;; mm-encode.el --- Functions for encoding MIME things
+;; Copyright (C) 1998, 1999, 2000 Free Software Foundation, Inc.
+
+;; Author: Lars Magne Ingebrigtsen <larsi@gnus.org>
+;; MORIOKA Tomohiko <morioka@jaist.ac.jp>
+;; This file is part of GNU Emacs.
+
+;; GNU Emacs 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 Emacs 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 Emacs; see the file COPYING. If not, write to the
+;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;; Boston, MA 02111-1307, USA.
+
+;;; Commentary:
+
+;;; Code:
+
+(require 'mail-parse)
+(require 'mailcap)
+
+(defvar mm-content-transfer-encoding-defaults
+ '(("text/x-patch" 8bit)
+ ("text/.*" qp-or-base64)
+ ("message/rfc822" 8bit)
+ ("application/emacs-lisp" 8bit)
+ ("application/x-patch" 8bit)
+ (".*" qp-or-base64))
+ "Alist of regexps that match MIME types and their encodings.
+If the encoding is `qp-or-base64', then either quoted-printable
+or base64 will be used, depending on what is more efficient.")
+
+(defvar mm-use-ultra-safe-encoding nil
+ "If non-nil, use encodings aimed at Procrustean bed survival.
+
+This means that textual parts are encoded as quoted-printable if they
+contain lines longer than 76 characters or starting with \"From \" in
+the body. Non-7bit encodings (8bit, binary) are generally disallowed.
+This is to reduce the probability that a broken MTA or MDA changes the
+message.
+
+This variable should never be set directly, but bound before a call to
+`mml-generate-mime' or similar functions.")
+
+(defun mm-insert-rfc822-headers (charset encoding)
+ "Insert text/plain headers with CHARSET and ENCODING."
+ (insert "MIME-Version: 1.0\n")
+ (insert "Content-Type: text/plain; charset="
+ (mail-quote-string (downcase (symbol-name charset))) "\n")
+ (insert "Content-Transfer-Encoding: "
+ (downcase (symbol-name encoding)) "\n"))
+
+(defun mm-insert-multipart-headers ()
+ "Insert multipart/mixed headers."
+ (let ((boundary "=-=-="))
+ (insert "MIME-Version: 1.0\n")
+ (insert "Content-Type: multipart/mixed; boundary=\"" boundary "\"\n")
+ boundary))
+
+(defun mm-default-file-encoding (file)
+ "Return a default encoding for FILE."
+ (if (not (string-match "\\.[^.]+$" file))
+ "application/octet-stream"
+ (mailcap-extension-to-mime (match-string 0 file))))
+
+(defun mm-safer-encoding (encoding)
+ "Return a safer but similar encoding."
+ (cond
+ ((memq encoding '(7bit 8bit quoted-printable)) 'quoted-printable)
+ ;; The remaing encodings are binary and base64 (and perhaps some
+ ;; non-standard ones), which are both turned into base64.
+ (t 'base64)))
+
+(defun mm-encode-content-transfer-encoding (encoding &optional type)
+ (cond
+ ((eq encoding 'quoted-printable)
+ (quoted-printable-encode-region (point-min) (point-max) t))
+ ((eq encoding 'base64)
+ (when (equal type "text/plain")
+ (goto-char (point-min))
+ (while (search-forward "\n" nil t)
+ (replace-match "\r\n" t t)))
+ (condition-case error
+ (base64-encode-region (point-min) (point-max))
+ (error
+ (message "Error while decoding: %s" error)
+ nil)))
+ ((memq encoding '(7bit 8bit binary))
+ ;; Do nothing.
+ )
+ ((null encoding)
+ ;; Do nothing.
+ )
+ ((functionp encoding)
+ (ignore-errors (funcall encoding (point-min) (point-max))))
+ (t
+ (message "Unknown encoding %s; defaulting to 8bit" encoding))))
+
+(defun mm-encode-buffer (type)
+ "Encode the buffer which contains data of TYPE.
+The encoding used is returned."
+ (let* ((mime-type (if (stringp type) type (car type)))
+ (encoding
+ (or (and (listp type)
+ (cadr (assq 'encoding type)))
+ (mm-content-transfer-encoding mime-type)))
+ (bits (mm-body-7-or-8)))
+ ;; We force buffers that are 7bit to be unencoded, no matter
+ ;; what the preferred encoding is.
+ (when (eq bits '7bit)
+ (setq encoding bits))
+ (mm-encode-content-transfer-encoding encoding mime-type)
+ encoding))
+
+(defun mm-insert-headers (type encoding &optional file)
+ "Insert headers for TYPE."
+ (insert "Content-Type: " type)
+ (when file
+ (insert ";\n\tname=\"" (file-name-nondirectory file) "\""))
+ (insert "\n")
+ (insert (format "Content-Transfer-Encoding: %s\n" encoding))
+ (insert "Content-Disposition: inline")
+ (when file
+ (insert ";\n\tfilename=\"" (file-name-nondirectory file) "\""))
+ (insert "\n")
+ (insert "\n"))
+
+(defun mm-content-transfer-encoding (type)
+ "Return a CTE suitable for TYPE to encode the current buffer."
+ (let ((rules mm-content-transfer-encoding-defaults))
+ (catch 'found
+ (while rules
+ (when (string-match (caar rules) type)
+ (throw 'found
+ (let ((encoding
+ (if (eq (cadr (car rules)) 'qp-or-base64)
+ (mm-qp-or-base64)
+ (cadr (car rules)))))
+ (if mm-use-ultra-safe-encoding
+ (mm-safer-encoding encoding)
+ encoding))))
+ (pop rules)))))
+
+(defun mm-qp-or-base64 ()
+ (save-excursion
+ (let ((limit (min (point-max) (+ 2000 (point-min))))
+ (n8bit 0))
+ (goto-char (point-min))
+ (skip-chars-forward "\x20-\x7f\r\n\t" limit)
+ (while (< (point) limit)
+ (incf n8bit)
+ (forward-char 1)
+ (skip-chars-forward "\x20-\x7f\r\n\t" limit))
+ (if (< (* 6 n8bit) (- limit (point-min)))
+ 'quoted-printable
+ 'base64))))
+
+(provide 'mm-encode)
+
+;;; mm-encode.el ends here
--- /dev/null
+;;; mm-partial.el --- showing message/partial
+;; Copyright (C) 2000 Free Software Foundation, Inc.
+
+;; Author: Shenghuo Zhu <zsh@cs.rochester.edu>
+;; Keywords: message partial
+
+;; This file is part of GNU Emacs.
+
+;; GNU Emacs 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 Emacs 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 Emacs; see the file COPYING. If not, write to the
+;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;; Boston, MA 02111-1307, USA.
+
+;;; Commentary:
+
+;;; Code:
+
+(eval-when-compile
+ (require 'cl))
+
+(require 'gnus-sum)
+(require 'mm-util)
+(require 'mm-decode)
+
+(defun mm-partial-find-parts (id &optional art)
+ (let ((headers (save-excursion
+ (set-buffer gnus-summary-buffer)
+ gnus-newsgroup-headers))
+ phandles header)
+ (while (setq header (pop headers))
+ (unless (eq (aref header 0) art)
+ (mm-with-unibyte-buffer
+ (gnus-request-article-this-buffer (aref header 0)
+ gnus-newsgroup-name)
+ (when (search-forward id nil t)
+ (let ((nhandles (mm-dissect-buffer)) nid)
+ (if (consp (car nhandles))
+ (mm-destroy-parts nhandles)
+ (setq nid (cdr (assq 'id
+ (cdr (mm-handle-type nhandles)))))
+ (if (not (equal id nid))
+ (mm-destroy-parts nhandles)
+ (push nhandles phandles))))))))
+ phandles))
+
+;;;###autoload
+(defun mm-inline-partial (handle &optional no-display)
+ "Show the partial part of HANDLE.
+This function replaces the buffer of HANDLE with a buffer contains
+the entire message.
+If NO-DISPLAY is nil, display it. Otherwise, do nothing after replacing."
+ (let ((id (cdr (assq 'id (cdr (mm-handle-type handle)))))
+ phandles
+ (b (point)) (n 1) total
+ phandle nn ntotal
+ gnus-displaying-mime handles buffer)
+ (unless (mm-handle-cache handle)
+ (unless id
+ (error "Can not find message/partial id."))
+ (setq phandles
+ (sort (cons handle
+ (mm-partial-find-parts
+ id
+ (save-excursion
+ (set-buffer gnus-summary-buffer)
+ (gnus-summary-article-number))))
+ #'(lambda (a b)
+ (let ((anumber (string-to-number
+ (cdr (assq 'number
+ (cdr (mm-handle-type a))))))
+ (bnumber (string-to-number
+ (cdr (assq 'number
+ (cdr (mm-handle-type b)))))))
+ (< anumber bnumber)))))
+ (setq gnus-article-mime-handles
+ (append (if (listp (car gnus-article-mime-handles))
+ gnus-article-mime-handles
+ (list gnus-article-mime-handles))
+ phandles))
+ (save-excursion
+ (set-buffer (generate-new-buffer "*mm*"))
+ (while (setq phandle (pop phandles))
+ (setq nn (string-to-number
+ (cdr (assq 'number
+ (cdr (mm-handle-type phandle))))))
+ (setq ntotal (string-to-number
+ (cdr (assq 'total
+ (cdr (mm-handle-type phandle))))))
+ (if ntotal
+ (if total
+ (unless (eq total ntotal)
+ (error "The numbers of total are different."))
+ (setq total ntotal)))
+ (unless (< nn n)
+ (unless (eq nn n)
+ (error "Missing part %d" n))
+ (mm-insert-part phandle)
+ (goto-char (point-max))
+ (when (not (eq 0 (skip-chars-backward "\r\n")))
+ ;; remove tail blank spaces except one
+ (if (looking-at "\r?\n")
+ (goto-char (match-end 0)))
+ (delete-region (point) (point-max)))
+ (setq n (+ n 1))))
+ (unless total
+ (error "Don't known the total number of"))
+ (if (<= n total)
+ (error "Missing part %d" n))
+ (kill-buffer (mm-handle-buffer handle))
+ (setcar handle (current-buffer))
+ (mm-handle-set-cache handle t)))
+ (unless no-display
+ (save-excursion
+ (save-restriction
+ (narrow-to-region b b)
+ (mm-insert-part handle)
+ (let (gnus-article-mime-handles)
+ (run-hooks 'gnus-article-decode-hook)
+ (gnus-article-prepare-display)
+ (setq handles gnus-article-mime-handles))
+ (when handles
+ ;; It is in article buffer.
+ (setq gnus-article-mime-handles
+ (nconc (if (listp (car gnus-article-mime-handles))
+ gnus-article-mime-handles
+ (list gnus-article-mime-handles))
+ (if (listp (car handles))
+ handles (list handles)))))
+ (mm-handle-set-undisplayer
+ handle
+ `(lambda ()
+ (let (buffer-read-only)
+ (condition-case nil
+ ;; This is only valid on XEmacs.
+ (mapcar (lambda (prop)
+ (remove-specifier
+ (face-property 'default prop) (current-buffer)))
+ '(background background-pixmap foreground))
+ (error nil))
+ (delete-region ,(point-min-marker) ,(point-max-marker))))))))))
+
+;; mm-partial.el ends here
--- /dev/null
+;;; mm-util.el --- Utility functions for MIME things
+;; Copyright (C) 1998, 1999, 2000 Free Software Foundation, Inc.
+
+;; Author: Lars Magne Ingebrigtsen <larsi@gnus.org>
+;; MORIOKA Tomohiko <morioka@jaist.ac.jp>
+;; This file is part of GNU Emacs.
+
+;; GNU Emacs 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 Emacs 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 Emacs; see the file COPYING. If not, write to the
+;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;; Boston, MA 02111-1307, USA.
+
+;;; Commentary:
+
+;;; Code:
+
+(require 'mail-prsvr)
+
+(defvar mm-mime-mule-charset-alist
+ '((us-ascii ascii)
+ (iso-8859-1 latin-iso8859-1)
+ (iso-8859-2 latin-iso8859-2)
+ (iso-8859-3 latin-iso8859-3)
+ (iso-8859-4 latin-iso8859-4)
+ (iso-8859-5 cyrillic-iso8859-5)
+ ;; Non-mule (X)Emacs uses the last mule-charset for 8bit characters.
+ ;; The fake mule-charset, gnus-koi8-r, tells Gnus that the default
+ ;; charset is koi8-r, not iso-8859-5.
+ (koi8-r cyrillic-iso8859-5 gnus-koi8-r)
+ (iso-8859-6 arabic-iso8859-6)
+ (iso-8859-7 greek-iso8859-7)
+ (iso-8859-8 hebrew-iso8859-8)
+ (iso-8859-9 latin-iso8859-9)
+ (viscii vietnamese-viscii-lower)
+ (iso-2022-jp latin-jisx0201 japanese-jisx0208 japanese-jisx0208-1978)
+ (euc-kr korean-ksc5601)
+ (cn-gb-2312 chinese-gb2312)
+ (cn-big5 chinese-big5-1 chinese-big5-2)
+ (tibetan tibetan)
+ (thai-tis620 thai-tis620)
+ (iso-2022-7bit ethiopic arabic-1-column arabic-2-column)
+ (iso-2022-jp-2 latin-iso8859-1 greek-iso8859-7
+ latin-jisx0201 japanese-jisx0208-1978
+ chinese-gb2312 japanese-jisx0208
+ korean-ksc5601 japanese-jisx0212
+ katakana-jisx0201)
+ (iso-2022-int-1 latin-iso8859-1 greek-iso8859-7
+ latin-jisx0201 japanese-jisx0208-1978
+ chinese-gb2312 japanese-jisx0208
+ korean-ksc5601 japanese-jisx0212
+ chinese-cns11643-1 chinese-cns11643-2)
+ (iso-2022-int-1 latin-iso8859-1 latin-iso8859-2
+ cyrillic-iso8859-5 greek-iso8859-7
+ latin-jisx0201 japanese-jisx0208-1978
+ chinese-gb2312 japanese-jisx0208
+ korean-ksc5601 japanese-jisx0212
+ chinese-cns11643-1 chinese-cns11643-2
+ chinese-cns11643-3 chinese-cns11643-4
+ chinese-cns11643-5 chinese-cns11643-6
+ chinese-cns11643-7)
+ (utf-8 unicode-a unicode-b unicode-c unicode-d unicode-e))
+ "Alist of MIME-charset/MULE-charsets.")
+
+(eval-and-compile
+ (mapcar
+ (lambda (elem)
+ (let ((nfunc (intern (format "mm-%s" (car elem)))))
+ (if (fboundp (car elem))
+ (defalias nfunc (car elem))
+ (defalias nfunc (cdr elem)))))
+ '((decode-coding-string . (lambda (s a) s))
+ (encode-coding-string . (lambda (s a) s))
+ (encode-coding-region . ignore)
+ (coding-system-list . ignore)
+ (decode-coding-region . ignore)
+ (char-int . identity)
+ (device-type . ignore)
+ (coding-system-equal . equal)
+ (annotationp . ignore)
+ (set-buffer-file-coding-system . ignore)
+ (make-char
+ . (lambda (charset int)
+ (int-to-char int)))
+ (read-coding-system
+ . (lambda (prompt)
+ "Prompt the user for a coding system."
+ (completing-read
+ prompt (mapcar (lambda (s) (list (symbol-name (car s))))
+ mm-mime-mule-charset-alist))))
+ (read-charset
+ . (lambda (prompt)
+ "Return a charset."
+ (intern
+ (completing-read
+ prompt
+ (mapcar (lambda (e) (list (symbol-name (car e))))
+ mm-mime-mule-charset-alist)
+ nil t)))))))
+
+(eval-and-compile
+ (defalias 'mm-char-or-char-int-p
+ (cond
+ ((fboundp 'char-or-char-int-p) 'char-or-char-int-p)
+ ((fboundp 'char-valid-p) 'char-valid-p)
+ (t 'identity))))
+
+(defvar mm-coding-system-list nil)
+(defun mm-get-coding-system-list ()
+ "Get the coding system list."
+ (or mm-coding-system-list
+ (setq mm-coding-system-list (mm-coding-system-list))))
+
+(defvar mm-charset-synonym-alist
+ '((big5 . cn-big5)
+ (gb2312 . cn-gb-2312)
+ (x-ctext . ctext))
+ "A mapping from invalid charset names to the real charset names.")
+
+(defun mm-coding-system-p (sym)
+ "Return non-nil if SYM is a coding system."
+ (or (and (fboundp 'coding-system-p) (coding-system-p sym))
+ (memq sym (mm-get-coding-system-list))))
+
+(defvar mm-binary-coding-system
+ (cond
+ ((mm-coding-system-p 'binary) 'binary)
+ ((mm-coding-system-p 'no-conversion) 'no-conversion)
+ (t nil))
+ "100% binary coding system.")
+
+(defvar mm-text-coding-system
+ (or (if (memq system-type '(windows-nt ms-dos ms-windows))
+ (and (mm-coding-system-p 'raw-text-dos) 'raw-text-dos)
+ (and (mm-coding-system-p 'raw-text) 'raw-text))
+ mm-binary-coding-system)
+ "Text-safe coding system (For removing ^M).")
+
+(defvar mm-text-coding-system-for-write nil
+ "Text coding system for write.")
+
+(defvar mm-auto-save-coding-system
+ (cond
+ ((mm-coding-system-p 'emacs-mule)
+ (if (memq system-type '(windows-nt ms-dos ms-windows))
+ (if (mm-coding-system-p 'emacs-mule-dos)
+ 'emacs-mule-dos mm-binary-coding-system)
+ 'emacs-mule))
+ ((mm-coding-system-p 'escape-quoted) 'escape-quoted)
+ (t mm-binary-coding-system))
+ "Coding system of auto save file.")
+
+;;; Internal variables:
+
+;;; Functions:
+
+(defun mm-mule-charset-to-mime-charset (charset)
+ "Return the MIME charset corresponding to MULE CHARSET."
+ (let ((alist mm-mime-mule-charset-alist)
+ out)
+ (while alist
+ (when (memq charset (cdar alist))
+ (setq out (caar alist)
+ alist nil))
+ (pop alist))
+ out))
+
+(defun mm-charset-to-coding-system (charset &optional lbt)
+ "Return coding-system corresponding to CHARSET.
+CHARSET is a symbol naming a MIME charset.
+If optional argument LBT (`unix', `dos' or `mac') is specified, it is
+used as the line break code type of the coding system."
+ (when (stringp charset)
+ (setq charset (intern (downcase charset))))
+ (setq charset
+ (or (cdr (assq charset mm-charset-synonym-alist))
+ charset))
+ (when lbt
+ (setq charset (intern (format "%s-%s" charset lbt))))
+ (cond
+ ;; Running in a non-MULE environment.
+ ((null (mm-get-coding-system-list))
+ charset)
+ ;; ascii
+ ((eq charset 'us-ascii)
+ 'ascii)
+ ;; Check to see whether we can handle this charset.
+ ((memq charset (mm-get-coding-system-list))
+ charset)
+ ;; Nope.
+ (t
+ nil)))
+
+(if (fboundp 'subst-char-in-string)
+ (defsubst mm-replace-chars-in-string (string from to)
+ (subst-char-in-string from to string))
+ (defun mm-replace-chars-in-string (string from to)
+ "Replace characters in STRING from FROM to TO."
+ (let ((string (substring string 0)) ;Copy string.
+ (len (length string))
+ (idx 0))
+ ;; Replace all occurrences of FROM with TO.
+ (while (< idx len)
+ (when (= (aref string idx) from)
+ (aset string idx to))
+ (setq idx (1+ idx)))
+ string)))
+
+(defsubst mm-enable-multibyte ()
+ "Enable multibyte in the current buffer."
+ (when (and (fboundp 'set-buffer-multibyte)
+ (boundp 'enable-multibyte-characters)
+ (default-value 'enable-multibyte-characters))
+ (set-buffer-multibyte t)))
+
+(defsubst mm-disable-multibyte ()
+ "Disable multibyte in the current buffer."
+ (when (fboundp 'set-buffer-multibyte)
+ (set-buffer-multibyte nil)))
+
+(defun mm-preferred-coding-system (charset)
+ ;; A typo in some Emacs versions.
+ (or (get-charset-property charset 'prefered-coding-system)
+ (get-charset-property charset 'preferred-coding-system)))
+
+(defun mm-charset-after (&optional pos)
+ "Return charset of a character in current buffer at position POS.
+If POS is nil, it defauls to the current point.
+If POS is out of range, the value is nil.
+If the charset is `composition', return the actual one."
+ (let ((charset (cond
+ ((fboundp 'charset-after)
+ (charset-after pos))
+ ((fboundp 'char-charset)
+ (char-charset (char-after pos)))
+ ((< (mm-char-int (char-after pos)) 128)
+ 'ascii)
+ (mail-parse-mule-charset ;; cached mule-charset
+ mail-parse-mule-charset)
+ ((boundp 'current-language-environment)
+ (let ((entry (assoc current-language-environment
+ language-info-alist)))
+ (setq mail-parse-mule-charset
+ (or (car (last (assq 'charset entry)))
+ 'latin-iso8859-1))))
+ (t ;; figure out the charset
+ (setq mail-parse-mule-charset
+ (or (car (last (assq mail-parse-charset
+ mm-mime-mule-charset-alist)))
+ 'latin-iso8859-1))))))
+ (if (eq charset 'composition)
+ (let ((p (or pos (point))))
+ (cadr (find-charset-region p (1+ p))))
+ charset)))
+
+(defun mm-mime-charset (charset)
+ "Return the MIME charset corresponding to the MULE CHARSET."
+ (if (and (fboundp 'coding-system-get) (fboundp 'get-charset-property))
+ ;; This exists in Emacs 20.
+ (or
+ (and (mm-preferred-coding-system charset)
+ (coding-system-get
+ (mm-preferred-coding-system charset) 'mime-charset))
+ (and (eq charset 'ascii)
+ 'us-ascii)
+ (mm-preferred-coding-system charset)
+ (mm-mule-charset-to-mime-charset charset))
+ ;; This is for XEmacs.
+ (mm-mule-charset-to-mime-charset charset)))
+
+(defun mm-delete-duplicates (list)
+ "Simple substitute for CL `delete-duplicates', testing with `equal'."
+ (let (result head)
+ (while list
+ (setq head (car list))
+ (setq list (delete head list))
+ (setq result (cons head result)))
+ (nreverse result)))
+
+(defun mm-find-mime-charset-region (b e)
+ "Return the MIME charsets needed to encode the region between B and E."
+ (let ((charsets (mapcar 'mm-mime-charset
+ (delq 'ascii
+ (mm-find-charset-region b e)))))
+ (when (memq 'iso-2022-jp-2 charsets)
+ (setq charsets (delq 'iso-2022-jp charsets)))
+ (setq charsets (mm-delete-duplicates charsets))
+ (if (and (> (length charsets) 1)
+ (fboundp 'find-coding-systems-region)
+ (memq 'utf-8 (find-coding-systems-region b e)))
+ '(utf-8)
+ charsets)))
+
+(defsubst mm-multibyte-p ()
+ "Say whether multibyte is enabled."
+ (or (featurep 'xemacs)
+ (and (boundp 'enable-multibyte-characters)
+ enable-multibyte-characters)))
+
+(defmacro mm-with-unibyte-buffer (&rest forms)
+ "Create a temporary buffer, and evaluate FORMS there like `progn'.
+See also `with-temp-file' and `with-output-to-string'."
+ (let ((temp-buffer (make-symbol "temp-buffer"))
+ (multibyte (make-symbol "multibyte")))
+ `(if (or (string-match "XEmacs\\|Lucid" emacs-version)
+ (not (boundp 'enable-multibyte-characters)))
+ (with-temp-buffer ,@forms)
+ (let ((,multibyte (default-value 'enable-multibyte-characters))
+ ,temp-buffer)
+ (unwind-protect
+ (progn
+ (setq-default enable-multibyte-characters nil)
+ (setq ,temp-buffer
+ (get-buffer-create (generate-new-buffer-name " *temp*")))
+ (unwind-protect
+ (with-current-buffer ,temp-buffer
+ (let ((buffer-file-coding-system mm-binary-coding-system)
+ (coding-system-for-read mm-binary-coding-system)
+ (coding-system-for-write mm-binary-coding-system))
+ ,@forms))
+ (and (buffer-name ,temp-buffer)
+ (kill-buffer ,temp-buffer))))
+ (setq-default enable-multibyte-characters ,multibyte))))))
+(put 'mm-with-unibyte-buffer 'lisp-indent-function 0)
+(put 'mm-with-unibyte-buffer 'edebug-form-spec '(body))
+
+(defmacro mm-with-unibyte-current-buffer (&rest forms)
+ "Evaluate FORMS there like `progn' in current buffer."
+ (let ((multibyte (make-symbol "multibyte")))
+ `(if (or (featurep 'xemacs)
+ (not (fboundp 'set-buffer-multibyte)))
+ (progn
+ ,@forms)
+ (let ((,multibyte (default-value 'enable-multibyte-characters)))
+ (unwind-protect
+ (let ((buffer-file-coding-system mm-binary-coding-system)
+ (coding-system-for-read mm-binary-coding-system)
+ (coding-system-for-write mm-binary-coding-system))
+ (set-buffer-multibyte nil)
+ (setq-default enable-multibyte-characters nil)
+ ,@forms)
+ (setq-default enable-multibyte-characters ,multibyte)
+ (set-buffer-multibyte ,multibyte))))))
+(put 'mm-with-unibyte-current-buffer 'lisp-indent-function 0)
+(put 'mm-with-unibyte-current-buffer 'edebug-form-spec '(body))
+
+(defmacro mm-with-unibyte (&rest forms)
+ "Set default `enable-multibyte-characters' to `nil', eval the FORMS."
+ (let ((multibyte (make-symbol "multibyte")))
+ `(if (or (featurep 'xemacs)
+ (not (boundp 'enable-multibyte-characters)))
+ (progn ,@forms)
+ (let ((,multibyte (default-value 'enable-multibyte-characters)))
+ (unwind-protect
+ (progn
+ (setq-default enable-multibyte-characters nil)
+ ,@forms)
+ (setq-default enable-multibyte-characters ,multibyte))))))
+(put 'mm-with-unibyte 'lisp-indent-function 0)
+(put 'mm-with-unibyte 'edebug-form-spec '(body))
+
+(defun mm-find-charset-region (b e)
+ "Return a list of charsets in the region."
+ (cond
+ ((and (mm-multibyte-p)
+ (fboundp 'find-charset-region))
+ ;; Remove composition since the base charsets have been included.
+ (delq 'composition (find-charset-region b e)))
+ ((not (boundp 'current-language-environment))
+ (save-excursion
+ (save-restriction
+ (narrow-to-region b e)
+ (goto-char (point-min))
+ (skip-chars-forward "\0-\177")
+ (if (eobp)
+ '(ascii)
+ (delq nil (list 'ascii
+ (or (car (last (assq mail-parse-charset
+ mm-mime-mule-charset-alist)))
+ 'latin-iso8859-1)))))))
+ (t
+ ;; We are in a unibyte buffer, so we futz around a bit.
+ (save-excursion
+ (save-restriction
+ (narrow-to-region b e)
+ (goto-char (point-min))
+ (let ((entry (assoc current-language-environment
+ language-info-alist)))
+ (skip-chars-forward "\0-\177")
+ (if (eobp)
+ '(ascii)
+ (delq nil (list 'ascii
+ (or (car (last (assq 'charset entry)))
+ 'latin-iso8859-1))))))))))
+
+(if (fboundp 'shell-quote-argument)
+ (defalias 'mm-quote-arg 'shell-quote-argument)
+ (defun mm-quote-arg (arg)
+ "Return a version of ARG that is safe to evaluate in a shell."
+ (let ((pos 0) new-pos accum)
+ ;; *** bug: we don't handle newline characters properly
+ (while (setq new-pos (string-match "[]*[;!'`\"$\\& \t{} |()<>]" arg pos))
+ (push (substring arg pos new-pos) accum)
+ (push "\\" accum)
+ (push (list (aref arg new-pos)) accum)
+ (setq pos (1+ new-pos)))
+ (if (= pos 0)
+ arg
+ (apply 'concat (nconc (nreverse accum) (list (substring arg pos))))))))
+
+(defun mm-auto-mode-alist ()
+ "Return an `auto-mode-alist' with only the .gz (etc) thingies."
+ (let ((alist auto-mode-alist)
+ out)
+ (while alist
+ (when (listp (cdar alist))
+ (push (car alist) out))
+ (pop alist))
+ (nreverse out)))
+
+(defvar mm-inhibit-file-name-handlers
+ '(jka-compr-handler)
+ "A list of handlers doing (un)compression (etc) thingies.")
+
+(defun mm-insert-file-contents (filename &optional visit beg end replace
+ inhibit)
+ "Like `insert-file-contents', q.v., but only reads in the file.
+A buffer may be modified in several ways after reading into the buffer due
+to advanced Emacs features, such as file-name-handlers, format decoding,
+find-file-hooks, etc.
+If INHIBIT is non-nil, inhibit mm-inhibit-file-name-handlers.
+ This function ensures that none of these modifications will take place."
+ (let ((format-alist nil)
+ (auto-mode-alist (if inhibit nil (mm-auto-mode-alist)))
+ (default-major-mode 'fundamental-mode)
+ (enable-local-variables nil)
+ (after-insert-file-functions nil)
+ (enable-local-eval nil)
+ (find-file-hooks nil)
+ (inhibit-file-name-operation (if inhibit
+ 'insert-file-contents
+ inhibit-file-name-operation))
+ (inhibit-file-name-handlers
+ (if inhibit
+ (append mm-inhibit-file-name-handlers
+ inhibit-file-name-handlers)
+ inhibit-file-name-handlers)))
+ (insert-file-contents filename visit beg end replace)))
+
+(defun mm-append-to-file (start end filename &optional codesys inhibit)
+ "Append the contents of the region to the end of file FILENAME.
+When called from a function, expects three arguments,
+START, END and FILENAME. START and END are buffer positions
+saying what text to write.
+Optional fourth argument specifies the coding system to use when
+encoding the file.
+If INHIBIT is non-nil, inhibit mm-inhibit-file-name-handlers."
+ (let ((coding-system-for-write
+ (or codesys mm-text-coding-system-for-write
+ mm-text-coding-system))
+ (inhibit-file-name-operation (if inhibit
+ 'append-to-file
+ inhibit-file-name-operation))
+ (inhibit-file-name-handlers
+ (if inhibit
+ (append mm-inhibit-file-name-handlers
+ inhibit-file-name-handlers)
+ inhibit-file-name-handlers)))
+ (append-to-file start end filename)))
+
+(defun mm-write-region (start end filename &optional append visit lockname
+ coding-system inhibit)
+
+ "Like `write-region'.
+If INHIBIT is non-nil, inhibit mm-inhibit-file-name-handlers."
+ (let ((coding-system-for-write
+ (or coding-system mm-text-coding-system-for-write
+ mm-text-coding-system))
+ (inhibit-file-name-operation (if inhibit
+ 'write-region
+ inhibit-file-name-operation))
+ (inhibit-file-name-handlers
+ (if inhibit
+ (append mm-inhibit-file-name-handlers
+ inhibit-file-name-handlers)
+ inhibit-file-name-handlers)))
+ (write-region start end filename append visit lockname)))
+
+(provide 'mm-util)
+
+;;; mm-util.el ends here
--- /dev/null
+;;; mm-uu.el -- Return uu stuffs as mm handles
+;; Copyright (c) 1998, 1999, 2000 Free Software Foundation, Inc.
+
+;; Author: Shenghuo Zhu <zsh@cs.rochester.edu>
+;; Keywords: postscript uudecode binhex shar forward news
+
+;; This file is part of GNU Emacs.
+
+;; GNU Emacs 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 Emacs 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 Emacs; see the file COPYING. If not, write to the
+;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;; Boston, MA 02111-1307, USA.
+
+;;; Commentary:
+
+
+;;; Code:
+
+(eval-when-compile (require 'cl))
+(require 'mail-parse)
+(require 'nnheader)
+(require 'mm-decode)
+(require 'mailcap)
+
+(eval-and-compile
+ (autoload 'binhex-decode-region "binhex")
+ (autoload 'binhex-decode-region-external "binhex")
+ (autoload 'uudecode-decode-region "uudecode")
+ (autoload 'uudecode-decode-region-external "uudecode"))
+
+(defun mm-uu-copy-to-buffer (from to)
+ "Copy the contents of the current buffer to a fresh buffer."
+ (save-excursion
+ (let ((obuf (current-buffer)))
+ (set-buffer (generate-new-buffer " *mm-uu*"))
+ (insert-buffer-substring obuf from to)
+ (current-buffer))))
+
+;;; postscript
+
+(defconst mm-uu-postscript-begin-line "^%!PS-")
+(defconst mm-uu-postscript-end-line "^%%EOF$")
+
+(defconst mm-uu-uu-begin-line "^begin[ \t]+[0-7][0-7][0-7][ \t]+")
+(defconst mm-uu-uu-end-line "^end[ \t]*$")
+
+(defcustom mm-uu-decode-function 'uudecode-decode-region
+ "*Function to uudecode.
+Internal function is done in elisp by default, therefore decoding may
+appear to be horribly slow . You can make Gnus use the external Unix
+decoder, such as uudecode."
+ :type '(choice (item :tag "internal" uudecode-decode-region)
+ (item :tag "external" uudecode-decode-region-external))
+ :group 'gnus-article-mime)
+
+(defconst mm-uu-binhex-begin-line
+ "^:...............................................................$")
+(defconst mm-uu-binhex-end-line ":$")
+
+(defcustom mm-uu-binhex-decode-function 'binhex-decode-region
+ "*Function to binhex decode.
+Internal function is done in elisp by default, therefore decoding may
+appear to be horribly slow . You can make Gnus use the external Unix
+decoder, such as hexbin."
+ :type '(choice (item :tag "internal" binhex-decode-region)
+ (item :tag "external" binhex-decode-region-external))
+ :group 'gnus-article-mime)
+
+(defconst mm-uu-shar-begin-line "^#! */bin/sh")
+(defconst mm-uu-shar-end-line "^exit 0\\|^$")
+
+;;; Thanks to Edward J. Sabol <sabol@alderaan.gsfc.nasa.gov> and
+;;; Peter von der Ah\'e <pahe@daimi.au.dk>
+(defconst mm-uu-forward-begin-line "^-+ \\(Start of \\)?Forwarded message")
+(defconst mm-uu-forward-end-line "^-+ End \\(of \\)?forwarded message")
+
+(defvar mm-uu-begin-line nil)
+
+(defconst mm-uu-identifier-alist
+ '((?% . postscript) (?b . uu) (?: . binhex) (?# . shar)
+ (?- . forward)))
+
+(defvar mm-dissect-disposition "inline"
+ "The default disposition of uu parts.
+This can be either \"inline\" or \"attachment\".")
+
+(defun mm-uu-configure-p (key val)
+ (member (cons key val) mm-uu-configure-list))
+
+(defun mm-uu-configure (&optional symbol value)
+ (if symbol (set-default symbol value))
+ (setq mm-uu-begin-line nil)
+ (mapcar '(lambda (type)
+ (if (mm-uu-configure-p type 'disabled)
+ nil
+ (setq mm-uu-begin-line
+ (concat mm-uu-begin-line
+ (if mm-uu-begin-line "\\|")
+ (symbol-value
+ (intern (concat "mm-uu-" (symbol-name type)
+ "-begin-line")))))))
+ '(uu postscript binhex shar forward)))
+
+(defcustom mm-uu-configure-list nil
+ "A list of mm-uu configuration.
+To disable dissecting shar codes, for instance, add
+`(shar . disabled)' to this list."
+ :type '(repeat (cons
+ (choice (item postscript)
+ (item uu)
+ (item binhex)
+ (item shar)
+ (item forward))
+ (choice (item disabled))))
+ :group 'gnus-article-mime
+ :set 'mm-uu-configure)
+
+(mm-uu-configure)
+
+;;;### autoload
+
+(defun mm-uu-dissect ()
+ "Dissect the current buffer and return a list of uu handles."
+ (let (text-start start-char end-char
+ type file-name end-line result text-plain-type
+ start-char-1 end-char-1
+ (case-fold-search t))
+ (save-excursion
+ (save-restriction
+ (mail-narrow-to-head)
+ (goto-char (point-max)))
+ (forward-line)
+ ;;; gnus-decoded is a fake charset, which means no further
+ ;;; decoding.
+ (setq text-start (point)
+ text-plain-type '("text/plain" (charset . gnus-decoded)))
+ (while (re-search-forward mm-uu-begin-line nil t)
+ (setq start-char (match-beginning 0))
+ (setq type (cdr (assq (aref (match-string 0) 0)
+ mm-uu-identifier-alist)))
+ (setq file-name
+ (if (and (eq type 'uu)
+ (looking-at "\\(.+\\)$"))
+ (and (match-string 1)
+ (let ((nnheader-file-name-translation-alist
+ '((?/ . ?,) (? . ?_) (?* . ?_) (?$ . ?_))))
+ (nnheader-translate-file-chars (match-string 1))))))
+ (forward-line);; in case of failure
+ (setq start-char-1 (point))
+ (setq end-line (symbol-value
+ (intern (concat "mm-uu-" (symbol-name type)
+ "-end-line"))))
+ (when (and (re-search-forward end-line nil t)
+ (not (eq (match-beginning 0) (match-end 0))))
+ (setq end-char-1 (match-beginning 0))
+ (forward-line)
+ (setq end-char (point))
+ (when (cond
+ ((eq type 'binhex)
+ (setq file-name
+ (ignore-errors
+ (binhex-decode-region start-char end-char t))))
+ ((eq type 'forward)
+ (save-excursion
+ (goto-char start-char-1)
+ (looking-at "[\r\n]*[a-zA-Z][a-zA-Z0-9-]*:")))
+ (t t))
+ (if (> start-char text-start)
+ (push
+ (mm-make-handle (mm-uu-copy-to-buffer text-start start-char)
+ text-plain-type)
+ result))
+ (push
+ (cond
+ ((eq type 'postscript)
+ (mm-make-handle (mm-uu-copy-to-buffer start-char end-char)
+ '("application/postscript")))
+ ((eq type 'forward)
+ (mm-make-handle (mm-uu-copy-to-buffer start-char-1 end-char-1)
+ '("message/rfc822" (charset . gnus-decoded))))
+ ((eq type 'uu)
+ (mm-make-handle (mm-uu-copy-to-buffer start-char end-char)
+ (list (or (and file-name
+ (string-match "\\.[^\\.]+$"
+ file-name)
+ (mailcap-extension-to-mime
+ (match-string 0 file-name)))
+ "application/octet-stream"))
+ 'x-uuencode nil
+ (if (and file-name (not (equal file-name "")))
+ (list mm-dissect-disposition
+ (cons 'filename file-name)))))
+ ((eq type 'binhex)
+ (mm-make-handle (mm-uu-copy-to-buffer start-char end-char)
+ (list (or (and file-name
+ (string-match "\\.[^\\.]+$" file-name)
+ (mailcap-extension-to-mime
+ (match-string 0 file-name)))
+ "application/octet-stream"))
+ 'x-binhex nil
+ (if (and file-name (not (equal file-name "")))
+ (list mm-dissect-disposition
+ (cons 'filename file-name)))))
+ ((eq type 'shar)
+ (mm-make-handle (mm-uu-copy-to-buffer start-char end-char)
+ '("application/x-shar"))))
+ result)
+ (setq text-start end-char))))
+ (when result
+ (if (> (point-max) (1+ text-start))
+ (push
+ (mm-make-handle (mm-uu-copy-to-buffer text-start (point-max))
+ text-plain-type)
+ result))
+ (setq result (cons "multipart/mixed" (nreverse result))))
+ result)))
+
+;;;### autoload
+(defun mm-uu-test ()
+ "Check whether the current buffer contains uu stuffs."
+ (save-excursion
+ (goto-char (point-min))
+ (let (type end-line result
+ (case-fold-search t))
+ (while (and mm-uu-begin-line
+ (not result) (re-search-forward mm-uu-begin-line nil t))
+ (forward-line)
+ (setq type (cdr (assq (aref (match-string 0) 0)
+ mm-uu-identifier-alist)))
+ (setq end-line (symbol-value
+ (intern (concat "mm-uu-" (symbol-name type)
+ "-end-line"))))
+ (if (and (re-search-forward end-line nil t)
+ (not (eq (match-beginning 0) (match-end 0))))
+ (setq result t)))
+ result)))
+
+(provide 'mm-uu)
+
+;;; mm-uu.el ends here
--- /dev/null
+;;; mm-view.el --- Functions for viewing MIME objects
+;; Copyright (C) 1998, 1999, 2000 Free Software Foundation, Inc.
+
+;; Author: Lars Magne Ingebrigtsen <larsi@gnus.org>
+;; This file is part of GNU Emacs.
+
+;; GNU Emacs 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 Emacs 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 Emacs; see the file COPYING. If not, write to the
+;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;; Boston, MA 02111-1307, USA.
+
+;;; Commentary:
+
+;;; Code:
+
+(eval-when-compile (require 'cl))
+(require 'mail-parse)
+(require 'mailcap)
+(require 'mm-bodies)
+(require 'mm-decode)
+
+(eval-and-compile
+ (autoload 'gnus-article-prepare-display "gnus-art")
+ (autoload 'vcard-parse-string "vcard")
+ (autoload 'vcard-format-string "vcard")
+ (autoload 'fill-flowed "flow-fill")
+ (autoload 'diff-mode "diff-mode"))
+
+;;;
+;;; Functions for displaying various formats inline
+;;;
+(defun mm-inline-image-emacs (handle)
+ (let ((b (point-marker))
+ buffer-read-only)
+ (insert "\n")
+ (put-image (mm-get-image handle) b)
+ (mm-handle-set-undisplayer
+ handle
+ `(lambda () (remove-images ,b (1+ ,b))))))
+
+(defun mm-inline-image-xemacs (handle)
+ (let ((b (point))
+ (annot (make-annotation (mm-get-image handle) nil 'text))
+ buffer-read-only)
+ (insert "\n")
+ (mm-handle-set-undisplayer
+ handle
+ `(lambda ()
+ (let (buffer-read-only)
+ (delete-annotation ,annot)
+ (delete-region ,(set-marker (make-marker) b)
+ ,(set-marker (make-marker) (point))))))
+ (set-extent-property annot 'mm t)
+ (set-extent-property annot 'duplicable t)))
+
+(eval-and-compile
+ (if (string-match "XEmacs" (emacs-version))
+ (defalias 'mm-inline-image 'mm-inline-image-xemacs)
+ (defalias 'mm-inline-image 'mm-inline-image-emacs)))
+
+(defvar mm-w3-setup nil)
+(defun mm-setup-w3 ()
+ (unless mm-w3-setup
+ (require 'w3)
+ (w3-do-setup)
+ (require 'url)
+ (require 'w3-vars)
+ (require 'url-vars)
+ (setq mm-w3-setup t)))
+
+(defun mm-inline-text (handle)
+ (let ((type (mm-handle-media-subtype handle))
+ text buffer-read-only)
+ (cond
+ ((equal type "html")
+ (mm-setup-w3)
+ (setq text (mm-get-part handle))
+ (let ((b (point))
+ (url-standalone-mode t)
+ (url-current-object
+ (url-generic-parse-url (format "cid:%s" (mm-handle-id handle))))
+ (width (window-width))
+ (charset (mail-content-type-get
+ (mm-handle-type handle) 'charset)))
+ (save-excursion
+ (insert text)
+ (save-restriction
+ (narrow-to-region b (point))
+ (goto-char (point-min))
+ (if (or (and (boundp 'w3-meta-content-type-charset-regexp)
+ (re-search-forward
+ w3-meta-content-type-charset-regexp nil t))
+ (and (boundp 'w3-meta-charset-content-type-regexp)
+ (re-search-forward
+ w3-meta-charset-content-type-regexp nil t)))
+ (setq charset (or (w3-coding-system-for-mime-charset
+ (buffer-substring-no-properties
+ (match-beginning 2)
+ (match-end 2)))
+ charset)))
+ (delete-region (point-min) (point-max))
+ (insert (mm-decode-string text charset))
+ (save-window-excursion
+ (save-restriction
+ (let ((w3-strict-width width)
+ ;; Don't let w3 set the global version of
+ ;; this variable.
+ (fill-column fill-column)
+ (url-standalone-mode t))
+ (condition-case var
+ (w3-region (point-min) (point-max))
+ (error)))))
+ (mm-handle-set-undisplayer
+ handle
+ `(lambda ()
+ (let (buffer-read-only)
+ (if (functionp 'remove-specifier)
+ (mapcar (lambda (prop)
+ (remove-specifier
+ (face-property 'default prop)
+ (current-buffer)))
+ '(background background-pixmap foreground)))
+ (delete-region ,(point-min-marker)
+ ,(point-max-marker)))))))))
+ ((or (equal type "enriched")
+ (equal type "richtext"))
+ (save-excursion
+ (mm-with-unibyte-buffer
+ (mm-insert-part handle)
+ (save-window-excursion
+ (enriched-decode (point-min) (point-max))
+ (setq text (buffer-string)))))
+ (mm-insert-inline handle text))
+ ((equal type "x-vcard")
+ (mm-insert-inline
+ handle
+ (concat "\n-- \n"
+ (if (fboundp 'vcard-pretty-print)
+ (vcard-pretty-print (mm-get-part handle))
+ (vcard-format-string
+ (vcard-parse-string (mm-get-part handle)
+ 'vcard-standard-filter))))))
+ (t
+ (let ((b (point))
+ (charset (mail-content-type-get
+ (mm-handle-type handle) 'charset)))
+ (if (or (eq charset 'gnus-decoded)
+ ;; This is probably not entirely correct, but
+ ;; makes rfc822 parts with embedded multiparts work.
+ (eq mail-parse-charset 'gnus-decoded))
+ (mm-insert-part handle)
+ (insert (mm-decode-string (mm-get-part handle) charset)))
+ (when (and (equal type "plain")
+ (equal (cdr (assoc 'format (mm-handle-type handle)))
+ "flowed"))
+ (save-restriction
+ (narrow-to-region b (point))
+ (goto-char b)
+ (fill-flowed)
+ (goto-char (point-max))))
+ (save-restriction
+ (narrow-to-region b (point))
+ (set-text-properties (point-min) (point-max) nil)
+ (mm-handle-set-undisplayer
+ handle
+ `(lambda ()
+ (let (buffer-read-only)
+ (delete-region ,(point-min-marker)
+ ,(point-max-marker)))))))))))
+
+(defun mm-insert-inline (handle text)
+ "Insert TEXT inline from HANDLE."
+ (let ((b (point)))
+ (insert text)
+ (mm-handle-set-undisplayer
+ handle
+ `(lambda ()
+ (let (buffer-read-only)
+ (delete-region ,(set-marker (make-marker) b)
+ ,(set-marker (make-marker) (point))))))))
+
+(defun mm-inline-audio (handle)
+ (message "Not implemented"))
+
+(defun mm-view-sound-file ()
+ (message "Not implemented"))
+
+(defun mm-w3-prepare-buffer ()
+ (require 'w3)
+ (let ((url-standalone-mode t))
+ (w3-prepare-buffer)))
+
+(defun mm-view-message ()
+ (mm-enable-multibyte)
+ (let (handles)
+ (let (gnus-article-mime-handles)
+ ;; Double decode problem may happen. See mm-inline-message.
+ (run-hooks 'gnus-article-decode-hook)
+ (gnus-article-prepare-display)
+ (setq handles gnus-article-mime-handles))
+ (when handles
+ (setq gnus-article-mime-handles
+ (nconc gnus-article-mime-handles
+ (if (listp (car handles))
+ handles (list handles))))))
+ (fundamental-mode)
+ (goto-char (point-min)))
+
+(defun mm-inline-message (handle)
+ (let ((b (point))
+ (charset (mail-content-type-get
+ (mm-handle-type handle) 'charset))
+ gnus-displaying-mime handles)
+ (when (and charset
+ (stringp charset))
+ (setq charset (intern (downcase charset)))
+ (when (eq charset 'us-ascii)
+ (setq charset nil)))
+ (save-excursion
+ (save-restriction
+ (narrow-to-region b b)
+ (mm-insert-part handle)
+ (let (gnus-article-mime-handles
+ ;; disable prepare hook
+ gnus-article-prepare-hook
+ (gnus-newsgroup-charset
+ (or charset gnus-newsgroup-charset)))
+ (run-hooks 'gnus-article-decode-hook)
+ (gnus-article-prepare-display)
+ (setq handles gnus-article-mime-handles))
+ (goto-char (point-max))
+ (unless (bolp)
+ (insert "\n"))
+ (insert "----------\n\n")
+ (when handles
+ (setq gnus-article-mime-handles
+ (nconc gnus-article-mime-handles
+ (if (listp (car handles))
+ handles (list handles)))))
+ (mm-handle-set-undisplayer
+ handle
+ `(lambda ()
+ (let (buffer-read-only)
+ (condition-case nil
+ ;; This is only valid on XEmacs.
+ (mapcar (lambda (prop)
+ (remove-specifier
+ (face-property 'default prop) (current-buffer)))
+ '(background background-pixmap foreground))
+ (error nil))
+ (delete-region ,(point-min-marker) ,(point-max-marker)))))))))
+
+(defun mm-display-patch-inline (handle)
+ (let (text)
+ (with-temp-buffer
+ (mm-insert-part handle)
+ (diff-mode)
+ (font-lock-fontify-buffer)
+ (when (fboundp 'extent-list)
+ (map-extents (lambda (ext ignored)
+ (set-extent-property ext 'duplicable t)
+ nil)
+ nil nil nil nil nil 'text-prop))
+ (setq text (buffer-string)))
+ (mm-insert-inline handle text)))
+
+(provide 'mm-view)
+
+;; mm-view.el ends here
--- /dev/null
+;;; mml.el --- A package for parsing and validating MML documents
+;; Copyright (C) 1998, 1999, 2000 Free Software Foundation, Inc.
+
+;; Author: Lars Magne Ingebrigtsen <larsi@gnus.org>
+;; This file is part of GNU Emacs.
+
+;; GNU Emacs 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 Emacs 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 Emacs; see the file COPYING. If not, write to the
+;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;; Boston, MA 02111-1307, USA.
+
+;;; Commentary:
+
+;;; Code:
+
+(require 'mm-util)
+(require 'mm-bodies)
+(require 'mm-encode)
+(require 'mm-decode)
+(eval-when-compile 'cl)
+
+(eval-and-compile
+ (autoload 'message-make-message-id "message")
+ (autoload 'gnus-setup-posting-charset "gnus-msg")
+ (autoload 'message-fetch-field "message")
+ (autoload 'message-posting-charset "message"))
+
+(defvar mml-generate-multipart-alist nil
+ "*Alist of multipart generation functions.
+Each entry has the form (NAME . FUNCTION), where
+NAME is a string containing the name of the part (without the
+leading \"/multipart/\"),
+FUNCTION is a Lisp function which is called to generate the part.
+
+The Lisp function has to supply the appropriate MIME headers and the
+contents of this part.")
+
+(defvar mml-syntax-table
+ (let ((table (copy-syntax-table emacs-lisp-mode-syntax-table)))
+ (modify-syntax-entry ?\\ "/" table)
+ (modify-syntax-entry ?< "(" table)
+ (modify-syntax-entry ?> ")" table)
+ (modify-syntax-entry ?@ "w" table)
+ (modify-syntax-entry ?/ "w" table)
+ (modify-syntax-entry ?= " " table)
+ (modify-syntax-entry ?* " " table)
+ (modify-syntax-entry ?\; " " table)
+ (modify-syntax-entry ?\' " " table)
+ table))
+
+(defvar mml-boundary-function 'mml-make-boundary
+ "A function called to suggest a boundary.
+The function may be called several times, and should try to make a new
+suggestion each time. The function is called with one parameter,
+which is a number that says how many times the function has been
+called for this message.")
+
+(defvar mml-confirmation-set nil
+ "A list of symbols, each of which disables some warning.
+`unknown-encoding': always send messages contain characters with
+unknown encoding; `use-ascii': always use ASCII for those characters
+with unknown encoding; `multipart': always send messages with more than
+one charsets.")
+
+(defvar mml-generate-mime-preprocess-function nil
+ "A function called before generating a mime part.
+The function is called with one parameter, which is the part to be
+generated.")
+
+(defvar mml-generate-mime-postprocess-function nil
+ "A function called after generating a mime part.
+The function is called with one parameter, which is the generated part.")
+
+(defvar mml-generate-default-type "text/plain")
+
+(defvar mml-buffer-list nil)
+
+(defun mml-generate-new-buffer (name)
+ (let ((buf (generate-new-buffer name)))
+ (push buf mml-buffer-list)
+ buf))
+
+(defun mml-destroy-buffers ()
+ (let (kill-buffer-hook)
+ (mapcar 'kill-buffer mml-buffer-list)
+ (setq mml-buffer-list nil)))
+
+(defun mml-parse ()
+ "Parse the current buffer as an MML document."
+ (goto-char (point-min))
+ (let ((table (syntax-table)))
+ (unwind-protect
+ (progn
+ (set-syntax-table mml-syntax-table)
+ (mml-parse-1))
+ (set-syntax-table table))))
+
+(defun mml-parse-1 ()
+ "Parse the current buffer as an MML document."
+ (let (struct tag point contents charsets warn use-ascii no-markup-p raw)
+ (while (and (not (eobp))
+ (not (looking-at "<#/multipart")))
+ (cond
+ ((looking-at "<#multipart")
+ (push (nconc (mml-read-tag) (mml-parse-1)) struct))
+ ((looking-at "<#external")
+ (push (nconc (mml-read-tag) (list (cons 'contents (mml-read-part))))
+ struct))
+ (t
+ (if (or (looking-at "<#part") (looking-at "<#mml"))
+ (setq tag (mml-read-tag)
+ no-markup-p nil
+ warn nil)
+ (setq tag (list 'part '(type . "text/plain"))
+ no-markup-p t
+ warn t))
+ (setq raw (cdr (assq 'raw tag))
+ point (point)
+ contents (if raw
+ (mm-with-unibyte-current-buffer
+ (mml-read-part (eq 'mml (car tag))))
+ (mml-read-part (eq 'mml (car tag))))
+ charsets (if raw nil
+ (mm-find-mime-charset-region point (point))))
+ (when (and (not raw) (memq nil charsets))
+ (if (or (memq 'unknown-encoding mml-confirmation-set)
+ (y-or-n-p
+ "Warning: You message contains characters with unknown encoding. Really send?"))
+ (if (setq use-ascii
+ (or (memq 'use-ascii mml-confirmation-set)
+ (y-or-n-p "Use ASCII as charset?")))
+ (setq charsets (delq nil charsets))
+ (setq warn nil))
+ (error "Edit your message to remove those characters")))
+ (if (or raw
+ (eq 'mml (car tag))
+ (< (length charsets) 2))
+ (if (or (not no-markup-p)
+ (string-match "[^ \t\r\n]" contents))
+ ;; Don't create blank parts.
+ (push (nconc tag (list (cons 'contents contents)))
+ struct))
+ (let ((nstruct (mml-parse-singlepart-with-multiple-charsets
+ tag point (point) use-ascii)))
+ (when (and warn
+ (not (memq 'multipart mml-confirmation-set))
+ (not
+ (y-or-n-p
+ (format
+ "Warning: Your message contains more than %d parts. Really send? "
+ (length nstruct)))))
+ (error "Edit your message to use only one charset"))
+ (setq struct (nconc nstruct struct)))))))
+ (unless (eobp)
+ (forward-line 1))
+ (nreverse struct)))
+
+(defun mml-parse-singlepart-with-multiple-charsets
+ (orig-tag beg end &optional use-ascii)
+ (save-excursion
+ (save-restriction
+ (narrow-to-region beg end)
+ (goto-char (point-min))
+ (let ((current (or (mm-mime-charset (mm-charset-after))
+ (and use-ascii 'us-ascii)))
+ charset struct space newline paragraph)
+ (while (not (eobp))
+ (setq charset (mm-mime-charset (mm-charset-after)))
+ (cond
+ ;; The charset remains the same.
+ ((eq charset 'us-ascii))
+ ((or (and use-ascii (not charset))
+ (eq charset current))
+ (setq space nil
+ newline nil
+ paragraph nil))
+ ;; The initial charset was ascii.
+ ((eq current 'us-ascii)
+ (setq current charset
+ space nil
+ newline nil
+ paragraph nil))
+ ;; We have a change in charsets.
+ (t
+ (push (append
+ orig-tag
+ (list (cons 'contents
+ (buffer-substring-no-properties
+ beg (or paragraph newline space (point))))))
+ struct)
+ (setq beg (or paragraph newline space (point))
+ current charset
+ space nil
+ newline nil
+ paragraph nil)))
+ ;; Compute places where it might be nice to break the part.
+ (cond
+ ((memq (following-char) '(? ?\t))
+ (setq space (1+ (point))))
+ ((and (eq (following-char) ?\n)
+ (not (bobp))
+ (eq (char-after (1- (point))) ?\n))
+ (setq paragraph (point)))
+ ((eq (following-char) ?\n)
+ (setq newline (1+ (point)))))
+ (forward-char 1))
+ ;; Do the final part.
+ (unless (= beg (point))
+ (push (append orig-tag
+ (list (cons 'contents
+ (buffer-substring-no-properties
+ beg (point)))))
+ struct))
+ struct))))
+
+(defun mml-read-tag ()
+ "Read a tag and return the contents."
+ (let (contents name elem val)
+ (forward-char 2)
+ (setq name (buffer-substring-no-properties
+ (point) (progn (forward-sexp 1) (point))))
+ (skip-chars-forward " \t\n")
+ (while (not (looking-at ">"))
+ (setq elem (buffer-substring-no-properties
+ (point) (progn (forward-sexp 1) (point))))
+ (skip-chars-forward "= \t\n")
+ (setq val (buffer-substring-no-properties
+ (point) (progn (forward-sexp 1) (point))))
+ (when (string-match "^\"\\(.*\\)\"$" val)
+ (setq val (match-string 1 val)))
+ (push (cons (intern elem) val) contents)
+ (skip-chars-forward " \t\n"))
+ (forward-char 1)
+ (skip-chars-forward " \t\n")
+ (cons (intern name) (nreverse contents))))
+
+(defun mml-read-part (&optional mml)
+ "Return the buffer up till the next part, multipart or closing part or multipart.
+If MML is non-nil, return the buffer up till the correspondent mml tag."
+ (let ((beg (point)) (count 1))
+ ;; If the tag ended at the end of the line, we go to the next line.
+ (when (looking-at "[ \t]*\n")
+ (forward-line 1))
+ (if mml
+ (progn
+ (while (and (> count 0) (not (eobp)))
+ (if (re-search-forward "<#\\(/\\)?mml." nil t)
+ (setq count (+ count (if (match-beginning 1) -1 1)))
+ (goto-char (point-max))))
+ (buffer-substring-no-properties beg (if (> count 0)
+ (point)
+ (match-beginning 0))))
+ (if (re-search-forward
+ "<#\\(/\\)?\\(multipart\\|part\\|external\\|mml\\)." nil t)
+ (prog1
+ (buffer-substring-no-properties beg (match-beginning 0))
+ (if (or (not (match-beginning 1))
+ (equal (match-string 2) "multipart"))
+ (goto-char (match-beginning 0))
+ (when (looking-at "[ \t]*\n")
+ (forward-line 1))))
+ (buffer-substring-no-properties beg (goto-char (point-max)))))))
+
+(defvar mml-boundary nil)
+(defvar mml-base-boundary "-=-=")
+(defvar mml-multipart-number 0)
+
+(defun mml-generate-mime ()
+ "Generate a MIME message based on the current MML document."
+ (let ((cont (mml-parse))
+ (mml-multipart-number mml-multipart-number))
+ (if (not cont)
+ nil
+ (with-temp-buffer
+ (if (and (consp (car cont))
+ (= (length cont) 1))
+ (mml-generate-mime-1 (car cont))
+ (mml-generate-mime-1 (nconc (list 'multipart '(type . "mixed"))
+ cont)))
+ (buffer-string)))))
+
+(defun mml-generate-mime-1 (cont)
+ (save-restriction
+ (narrow-to-region (point) (point))
+ (if mml-generate-mime-preprocess-function
+ (funcall mml-generate-mime-preprocess-function cont))
+ (cond
+ ((or (eq (car cont) 'part) (eq (car cont) 'mml))
+ (let ((raw (cdr (assq 'raw cont)))
+ coded encoding charset filename type)
+ (setq type (or (cdr (assq 'type cont)) "text/plain"))
+ (if (and (not raw)
+ (member (car (split-string type "/")) '("text" "message")))
+ (with-temp-buffer
+ (cond
+ ((cdr (assq 'buffer cont))
+ (insert-buffer-substring (cdr (assq 'buffer cont))))
+ ((and (setq filename (cdr (assq 'filename cont)))
+ (not (equal (cdr (assq 'nofile cont)) "yes")))
+ (mm-insert-file-contents filename))
+ ((eq 'mml (car cont))
+ (insert (cdr (assq 'contents cont))))
+ (t
+ (save-restriction
+ (narrow-to-region (point) (point))
+ (insert (cdr (assq 'contents cont)))
+ ;; Remove quotes from quoted tags.
+ (goto-char (point-min))
+ (while (re-search-forward
+ "<#!+/?\\(part\\|multipart\\|external\\|mml\\)" nil t)
+ (delete-region (+ (match-beginning 0) 2)
+ (+ (match-beginning 0) 3))))))
+ (cond
+ ((eq (car cont) 'mml)
+ (let ((mml-boundary (funcall mml-boundary-function
+ (incf mml-multipart-number)))
+ (mml-generate-default-type "text/plain"))
+ (mml-to-mime))
+ (let ((mm-7bit-chars (concat mm-7bit-chars "\x1b")))
+ ;; ignore 0x1b, it is part of iso-2022-jp
+ (setq encoding (mm-body-7-or-8))))
+ ((string= (car (split-string type "/")) "message")
+ (let ((mm-7bit-chars (concat mm-7bit-chars "\x1b")))
+ ;; ignore 0x1b, it is part of iso-2022-jp
+ (setq encoding (mm-body-7-or-8))))
+ (t
+ (setq charset (mm-encode-body))
+ (setq encoding (mm-body-encoding
+ charset (cdr (assq 'encoding cont))))))
+ (setq coded (buffer-string)))
+ (mm-with-unibyte-buffer
+ (cond
+ ((cdr (assq 'buffer cont))
+ (insert-buffer-substring (cdr (assq 'buffer cont))))
+ ((and (setq filename (cdr (assq 'filename cont)))
+ (not (equal (cdr (assq 'nofile cont)) "yes")))
+ (let ((coding-system-for-read mm-binary-coding-system))
+ (mm-insert-file-contents filename nil nil nil nil t)))
+ (t
+ (insert (cdr (assq 'contents cont)))))
+ (setq encoding (mm-encode-buffer type)
+ coded (buffer-string))))
+ (mml-insert-mime-headers cont type charset encoding)
+ (insert "\n")
+ (mm-with-unibyte-current-buffer
+ (insert coded))))
+ ((eq (car cont) 'external)
+ (insert "Content-Type: message/external-body")
+ (let ((parameters (mml-parameter-string
+ cont '(expiration size permission)))
+ (name (cdr (assq 'name cont))))
+ (when name
+ (setq name (mml-parse-file-name name))
+ (if (stringp name)
+ (mml-insert-parameter
+ (mail-header-encode-parameter "name" name)
+ "access-type=local-file")
+ (mml-insert-parameter
+ (mail-header-encode-parameter
+ "name" (file-name-nondirectory (nth 2 name)))
+ (mail-header-encode-parameter "site" (nth 1 name))
+ (mail-header-encode-parameter
+ "directory" (file-name-directory (nth 2 name))))
+ (mml-insert-parameter
+ (concat "access-type="
+ (if (member (nth 0 name) '("ftp@" "anonymous@"))
+ "anon-ftp"
+ "ftp")))))
+ (when parameters
+ (mml-insert-parameter-string
+ cont '(expiration size permission))))
+ (insert "\n\n")
+ (insert "Content-Type: " (cdr (assq 'type cont)) "\n")
+ (insert "Content-ID: " (message-make-message-id) "\n")
+ (insert "Content-Transfer-Encoding: "
+ (or (cdr (assq 'encoding cont)) "binary"))
+ (insert "\n\n")
+ (insert (or (cdr (assq 'contents cont))))
+ (insert "\n"))
+ ((eq (car cont) 'multipart)
+ (let* ((type (or (cdr (assq 'type cont)) "mixed"))
+ (mml-generate-default-type (if (equal type "digest")
+ "message/rfc822"
+ "text/plain"))
+ (handler (assoc type mml-generate-multipart-alist)))
+ (if handler
+ (funcall (cdr handler) cont)
+ ;; No specific handler. Use default one.
+ (let ((mml-boundary (mml-compute-boundary cont)))
+ (insert (format "Content-Type: multipart/%s; boundary=\"%s\"\n"
+ type mml-boundary))
+ ;; Skip `multipart' and `type' elements.
+ (setq cont (cddr cont))
+ (while cont
+ (insert "\n--" mml-boundary "\n")
+ (mml-generate-mime-1 (pop cont)))
+ (insert "\n--" mml-boundary "--\n")))))
+ (t
+ (error "Invalid element: %S" cont)))
+ (if mml-generate-mime-postprocess-function
+ (funcall mml-generate-mime-postprocess-function cont))))
+
+(defun mml-compute-boundary (cont)
+ "Return a unique boundary that does not exist in CONT."
+ (let ((mml-boundary (funcall mml-boundary-function
+ (incf mml-multipart-number))))
+ ;; This function tries again and again until it has found
+ ;; a unique boundary.
+ (while (not (catch 'not-unique
+ (mml-compute-boundary-1 cont))))
+ mml-boundary))
+
+(defun mml-compute-boundary-1 (cont)
+ (let (filename)
+ (cond
+ ((eq (car cont) 'part)
+ (with-temp-buffer
+ (cond
+ ((cdr (assq 'buffer cont))
+ (insert-buffer-substring (cdr (assq 'buffer cont))))
+ ((and (setq filename (cdr (assq 'filename cont)))
+ (not (equal (cdr (assq 'nofile cont)) "yes")))
+ (mm-insert-file-contents filename))
+ (t
+ (insert (cdr (assq 'contents cont)))))
+ (goto-char (point-min))
+ (when (re-search-forward (concat "^--" (regexp-quote mml-boundary))
+ nil t)
+ (setq mml-boundary (funcall mml-boundary-function
+ (incf mml-multipart-number)))
+ (throw 'not-unique nil))))
+ ((eq (car cont) 'multipart)
+ (mapcar 'mml-compute-boundary-1 (cddr cont))))
+ t))
+
+(defun mml-make-boundary (number)
+ (concat (make-string (% number 60) ?=)
+ (if (> number 17)
+ (format "%x" number)
+ "")
+ mml-base-boundary))
+
+(defun mml-insert-mime-headers (cont type charset encoding)
+ (let (parameters disposition description)
+ (setq parameters
+ (mml-parameter-string
+ cont '(name access-type expiration size permission)))
+ (when (or charset
+ parameters
+ (not (equal type mml-generate-default-type)))
+ (when (consp charset)
+ (error
+ "Can't encode a part with several charsets."))
+ (insert "Content-Type: " type)
+ (when charset
+ (insert "; " (mail-header-encode-parameter
+ "charset" (symbol-name charset))))
+ (when parameters
+ (mml-insert-parameter-string
+ cont '(name access-type expiration size permission)))
+ (insert "\n"))
+ (setq parameters
+ (mml-parameter-string
+ cont '(filename creation-date modification-date read-date)))
+ (when (or (setq disposition (cdr (assq 'disposition cont)))
+ parameters)
+ (insert "Content-Disposition: " (or disposition "inline"))
+ (when parameters
+ (mml-insert-parameter-string
+ cont '(filename creation-date modification-date read-date)))
+ (insert "\n"))
+ (unless (eq encoding '7bit)
+ (insert (format "Content-Transfer-Encoding: %s\n" encoding)))
+ (when (setq description (cdr (assq 'description cont)))
+ (insert "Content-Description: "
+ (mail-encode-encoded-word-string description) "\n"))))
+
+(defun mml-parameter-string (cont types)
+ (let ((string "")
+ value type)
+ (while (setq type (pop types))
+ (when (setq value (cdr (assq type cont)))
+ ;; Strip directory component from the filename parameter.
+ (when (eq type 'filename)
+ (setq value (file-name-nondirectory value)))
+ (setq string (concat string "; "
+ (mail-header-encode-parameter
+ (symbol-name type) value)))))
+ (when (not (zerop (length string)))
+ string)))
+
+(defun mml-insert-parameter-string (cont types)
+ (let (value type)
+ (while (setq type (pop types))
+ (when (setq value (cdr (assq type cont)))
+ ;; Strip directory component from the filename parameter.
+ (when (eq type 'filename)
+ (setq value (file-name-nondirectory value)))
+ (mml-insert-parameter
+ (mail-header-encode-parameter
+ (symbol-name type) value))))))
+
+(defvar ange-ftp-name-format)
+(defvar efs-path-regexp)
+(defun mml-parse-file-name (path)
+ (if (if (boundp 'efs-path-regexp)
+ (string-match efs-path-regexp path)
+ (if (boundp 'ange-ftp-name-format)
+ (string-match (car ange-ftp-name-format) path)))
+ (list (match-string 1 path) (match-string 2 path)
+ (substring path (1+ (match-end 2))))
+ path))
+
+(defun mml-insert-buffer (buffer)
+ "Insert BUFFER at point and quote any MML markup."
+ (save-restriction
+ (narrow-to-region (point) (point))
+ (insert-buffer-substring buffer)
+ (mml-quote-region (point-min) (point-max))
+ (goto-char (point-max))))
+
+;;;
+;;; Transforming MIME to MML
+;;;
+
+(defun mime-to-mml ()
+ "Translate the current buffer (which should be a message) into MML."
+ ;; First decode the head.
+ (save-restriction
+ (message-narrow-to-head)
+ (mail-decode-encoded-word-region (point-min) (point-max)))
+ (let ((handles (mm-dissect-buffer t)))
+ (goto-char (point-min))
+ (search-forward "\n\n" nil t)
+ (delete-region (point) (point-max))
+ (if (stringp (car handles))
+ (mml-insert-mime handles)
+ (mml-insert-mime handles t))
+ (mm-destroy-parts handles))
+ (save-restriction
+ (message-narrow-to-head)
+ ;; Remove them, they are confusing.
+ (message-remove-header "Content-Type")
+ (message-remove-header "MIME-Version")
+ (message-remove-header "Content-Transfer-Encoding")))
+
+(defun mml-to-mime ()
+ "Translate the current buffer from MML to MIME."
+ (message-encode-message-body)
+ (save-restriction
+ (message-narrow-to-headers-or-head)
+ (let ((mail-parse-charset message-default-charset))
+ (mail-encode-encoded-word-buffer))))
+
+(defun mml-insert-mime (handle &optional no-markup)
+ (let (textp buffer mmlp)
+ ;; Determine type and stuff.
+ (unless (stringp (car handle))
+ (unless (setq textp (equal (mm-handle-media-supertype handle) "text"))
+ (save-excursion
+ (set-buffer (setq buffer (mml-generate-new-buffer " *mml*")))
+ (mm-insert-part handle)
+ (if (setq mmlp (equal (mm-handle-media-type handle)
+ "message/rfc822"))
+ (mime-to-mml)))))
+ (if mmlp
+ (mml-insert-mml-markup handle nil t t)
+ (unless (and no-markup
+ (equal (mm-handle-media-type handle) "text/plain"))
+ (mml-insert-mml-markup handle buffer textp)))
+ (cond
+ (mmlp
+ (insert-buffer buffer)
+ (goto-char (point-max))
+ (insert "<#/mml>\n"))
+ ((stringp (car handle))
+ (mapcar 'mml-insert-mime (cdr handle))
+ (insert "<#/multipart>\n"))
+ (textp
+ (let ((text (mm-get-part handle))
+ (charset (mail-content-type-get
+ (mm-handle-type handle) 'charset)))
+ (insert (mm-decode-string text charset)))
+ (goto-char (point-max)))
+ (t
+ (insert "<#/part>\n")))))
+
+(defun mml-insert-mml-markup (handle &optional buffer nofile mmlp)
+ "Take a MIME handle and insert an MML tag."
+ (if (stringp (car handle))
+ (insert "<#multipart type=" (mm-handle-media-subtype handle)
+ ">\n")
+ (if mmlp
+ (insert "<#mml type=" (mm-handle-media-type handle))
+ (insert "<#part type=" (mm-handle-media-type handle)))
+ (dolist (elem (append (cdr (mm-handle-type handle))
+ (cdr (mm-handle-disposition handle))))
+ (insert " " (symbol-name (car elem)) "=\"" (cdr elem) "\""))
+ (when (mm-handle-disposition handle)
+ (insert " disposition=" (car (mm-handle-disposition handle))))
+ (when buffer
+ (insert " buffer=\"" (buffer-name buffer) "\""))
+ (when nofile
+ (insert " nofile=yes"))
+ (when (mm-handle-description handle)
+ (insert " description=\"" (mm-handle-description handle) "\""))
+ (insert ">\n")))
+
+(defun mml-insert-parameter (&rest parameters)
+ "Insert PARAMETERS in a nice way."
+ (dolist (param parameters)
+ (insert ";")
+ (let ((point (point)))
+ (insert " " param)
+ (when (> (current-column) 71)
+ (goto-char point)
+ (insert "\n ")
+ (end-of-line)))))
+
+;;;
+;;; Mode for inserting and editing MML forms
+;;;
+
+(defvar mml-mode-map
+ (let ((map (make-sparse-keymap))
+ (main (make-sparse-keymap)))
+ (define-key map "f" 'mml-attach-file)
+ (define-key map "b" 'mml-attach-buffer)
+ (define-key map "e" 'mml-attach-external)
+ (define-key map "q" 'mml-quote-region)
+ (define-key map "m" 'mml-insert-multipart)
+ (define-key map "p" 'mml-insert-part)
+ (define-key map "v" 'mml-validate)
+ (define-key map "P" 'mml-preview)
+ ;;(define-key map "n" 'mml-narrow-to-part)
+ (define-key main "\M-m" map)
+ main))
+
+(easy-menu-define
+ mml-menu mml-mode-map ""
+ '("MML"
+ ("Attach"
+ ["File" mml-attach-file t]
+ ["Buffer" mml-attach-buffer t]
+ ["External" mml-attach-external t])
+ ("Insert"
+ ["Multipart" mml-insert-multipart t]
+ ["Part" mml-insert-part t])
+ ;;["Narrow" mml-narrow-to-part t]
+ ["Quote" mml-quote-region t]
+ ["Validate" mml-validate t]
+ ["Preview" mml-preview t]))
+
+(defvar mml-mode nil
+ "Minor mode for editing MML.")
+
+(defun mml-mode (&optional arg)
+ "Minor mode for editing MML.
+
+\\{mml-mode-map}"
+ (interactive "P")
+ (if (not (set (make-local-variable 'mml-mode)
+ (if (null arg) (not mml-mode)
+ (> (prefix-numeric-value arg) 0))))
+ nil
+ (set (make-local-variable 'mml-mode) t)
+ (unless (assq 'mml-mode minor-mode-alist)
+ (push `(mml-mode " MML") minor-mode-alist))
+ (unless (assq 'mml-mode minor-mode-map-alist)
+ (push (cons 'mml-mode mml-mode-map)
+ minor-mode-map-alist)))
+ (run-hooks 'mml-mode-hook))
+
+;;;
+;;; Helper functions for reading MIME stuff from the minibuffer and
+;;; inserting stuff to the buffer.
+;;;
+
+(defun mml-minibuffer-read-file (prompt)
+ (let ((file (read-file-name prompt nil nil t)))
+ ;; Prevent some common errors. This is inspired by similar code in
+ ;; VM.
+ (when (file-directory-p file)
+ (error "%s is a directory, cannot attach" file))
+ (unless (file-exists-p file)
+ (error "No such file: %s" file))
+ (unless (file-readable-p file)
+ (error "Permission denied: %s" file))
+ file))
+
+(defun mml-minibuffer-read-type (name &optional default)
+ (mailcap-parse-mimetypes)
+ (let* ((default (or default
+ (mm-default-file-encoding name)
+ ;; Perhaps here we should check what the file
+ ;; looks like, and offer text/plain if it looks
+ ;; like text/plain.
+ "application/octet-stream"))
+ (string (completing-read
+ (format "Content type (default %s): " default)
+ (mapcar
+ 'list
+ (mm-delete-duplicates
+ (nconc
+ (mapcar 'cdr mailcap-mime-extensions)
+ (apply
+ 'nconc
+ (mapcar
+ (lambda (l)
+ (delq nil
+ (mapcar
+ (lambda (m)
+ (let ((type (cdr (assq 'type (cdr m)))))
+ (if (equal (cadr (split-string type "/"))
+ "*")
+ nil
+ type)))
+ (cdr l))))
+ mailcap-mime-data))))))))
+ (if (not (equal string ""))
+ string
+ default)))
+
+(defun mml-minibuffer-read-description ()
+ (let ((description (read-string "One line description: ")))
+ (when (string-match "\\`[ \t]*\\'" description)
+ (setq description nil))
+ description))
+
+(defun mml-quote-region (beg end)
+ "Quote the MML tags in the region."
+ (interactive "r")
+ (save-excursion
+ (save-restriction
+ ;; Temporarily narrow the region to defend from changes
+ ;; invalidating END.
+ (narrow-to-region beg end)
+ (goto-char (point-min))
+ ;; Quote parts.
+ (while (re-search-forward
+ "<#!*/?\\(multipart\\|part\\|external\\|mml\\)" nil t)
+ ;; Insert ! after the #.
+ (goto-char (+ (match-beginning 0) 2))
+ (insert "!")))))
+
+(defun mml-insert-tag (name &rest plist)
+ "Insert an MML tag described by NAME and PLIST."
+ (when (symbolp name)
+ (setq name (symbol-name name)))
+ (insert "<#" name)
+ (while plist
+ (let ((key (pop plist))
+ (value (pop plist)))
+ (when value
+ ;; Quote VALUE if it contains suspicious characters.
+ (when (string-match "[\"'\\~/*;() \t\n]" value)
+ (setq value (prin1-to-string value)))
+ (insert (format " %s=%s" key value)))))
+ (insert ">\n"))
+
+(defun mml-insert-empty-tag (name &rest plist)
+ "Insert an empty MML tag described by NAME and PLIST."
+ (when (symbolp name)
+ (setq name (symbol-name name)))
+ (apply #'mml-insert-tag name plist)
+ (insert "<#/" name ">\n"))
+
+;;; Attachment functions.
+
+(defun mml-attach-file (file &optional type description)
+ "Attach a file to the outgoing MIME message.
+The file is not inserted or encoded until you send the message with
+`\\[message-send-and-exit]' or `\\[message-send]'.
+
+FILE is the name of the file to attach. TYPE is its content-type, a
+string of the form \"type/subtype\". DESCRIPTION is a one-line
+description of the attachment."
+ (interactive
+ (let* ((file (mml-minibuffer-read-file "Attach file: "))
+ (type (mml-minibuffer-read-type file))
+ (description (mml-minibuffer-read-description)))
+ (list file type description)))
+ (mml-insert-empty-tag 'part 'type type 'filename file
+ 'disposition "attachment" 'description description))
+
+(defun mml-attach-buffer (buffer &optional type description)
+ "Attach a buffer to the outgoing MIME message.
+See `mml-attach-file' for details of operation."
+ (interactive
+ (let* ((buffer (read-buffer "Attach buffer: "))
+ (type (mml-minibuffer-read-type buffer "text/plain"))
+ (description (mml-minibuffer-read-description)))
+ (list buffer type description)))
+ (mml-insert-empty-tag 'part 'type type 'buffer buffer
+ 'disposition "attachment" 'description description))
+
+(defun mml-attach-external (file &optional type description)
+ "Attach an external file into the buffer.
+FILE is an ange-ftp/efs specification of the part location.
+TYPE is the MIME type to use."
+ (interactive
+ (let* ((file (mml-minibuffer-read-file "Attach external file: "))
+ (type (mml-minibuffer-read-type file))
+ (description (mml-minibuffer-read-description)))
+ (list file type description)))
+ (mml-insert-empty-tag 'external 'type type 'name file
+ 'disposition "attachment" 'description description))
+
+(defun mml-insert-multipart (&optional type)
+ (interactive (list (completing-read "Multipart type (default mixed): "
+ '(("mixed") ("alternative") ("digest") ("parallel")
+ ("signed") ("encrypted"))
+ nil nil "mixed")))
+ (or type
+ (setq type "mixed"))
+ (mml-insert-empty-tag "multipart" 'type type)
+ (forward-line -1))
+
+(defun mml-insert-part (&optional type)
+ (interactive
+ (list (mml-minibuffer-read-type "")))
+ (mml-insert-tag 'part 'type type 'disposition "inline")
+ (forward-line -1))
+
+(defun mml-preview (&optional raw)
+ "Display current buffer with Gnus, in a new buffer.
+If RAW, don't highlight the article."
+ (interactive "P")
+ (let ((buf (current-buffer))
+ (message-posting-charset (or (gnus-setup-posting-charset
+ (save-restriction
+ (message-narrow-to-headers-or-head)
+ (message-fetch-field "Newsgroups")))
+ message-posting-charset)))
+ (switch-to-buffer (get-buffer-create
+ (concat (if raw "*Raw MIME preview of "
+ "*MIME preview of ") (buffer-name))))
+ (erase-buffer)
+ (insert-buffer buf)
+ (if (re-search-forward
+ (concat "^" (regexp-quote mail-header-separator) "\n") nil t)
+ (replace-match "\n"))
+ (mml-to-mime)
+ (if raw
+ (mm-disable-multibyte)
+ (let ((gnus-newsgroup-charset (car message-posting-charset)))
+ (run-hooks 'gnus-article-decode-hook)
+ (let ((gnus-newsgroup-name "dummy"))
+ (gnus-article-prepare-display))))
+ (fundamental-mode)
+ (setq buffer-read-only t)
+ (goto-char (point-min))))
+
+(defun mml-validate ()
+ "Validate the current MML document."
+ (interactive)
+ (mml-parse))
+
+(provide 'mml)
+
+;;; mml.el ends here
--- /dev/null
+;;; nnimap.el --- imap backend for Gnus
+;; Copyright (C) 1998, 1999, 2000 Free Software Foundation, Inc.
+
+;; Author: Simon Josefsson <jas@pdc.kth.se>
+;; Jim Radford <radford@robby.caltech.edu>
+;; Keywords: mail
+
+;; This file is part of GNU Emacs.
+
+;; GNU Emacs 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 Emacs 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 Emacs; see the file COPYING. If not, write to the
+;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;; Boston, MA 02111-1307, USA.
+
+;;; Commentary:
+
+;; Todo, major things:
+;;
+;; o Fix Gnus to view correct number of unread/total articles in group buffer
+;; o Fix Gnus to handle leading '.' in group names (fixed?)
+;; o Finish disconnected mode (moving articles between mailboxes unplugged)
+;; o Sieve
+;; o MIME (partial article fetches)
+;; o Split to other backends, different split rules for different
+;; servers/inboxes
+;;
+;; Todo, minor things:
+;;
+;; o Don't require half of Gnus -- backends should be standalone
+;; o Verify that we don't use IMAP4rev1 specific things (RFC2060 App B)
+;; o Dont uid fetch 1,* in nnimap-retrive-groups (slow)
+;; o Split up big fetches (1,* header especially) in smaller chunks
+;; o What do I do with gnus-newsgroup-*?
+;; o Tell Gnus about new groups (how can we tell?)
+;; o Respooling (fix Gnus?) (unnecessery?)
+;; o Add support for the following: (if applicable)
+;; request-list-newsgroups, request-regenerate
+;; list-active-group,
+;; request-associate-buffer, request-restore-buffer,
+;; o Do The Right Thing when UIDVALIDITY changes (what's the right thing?)
+;; o Support RFC2221 (Login referrals)
+;; o IMAP2BIS compatibility? (RFC2061)
+;; o ACAP stuff (perhaps a different project, would be nice to ACAPify
+;; .newsrc.eld)
+;; o What about Gnus's article editing, can we support it? NO!
+;; o Use \Draft to support the draft group??
+;; o Duplicate suppression
+
+;;; Code:
+
+(eval-and-compile
+ (require 'imap))
+
+(require 'nnoo)
+(require 'nnmail)
+(require 'nnheader)
+(require 'mm-util)
+(require 'gnus)
+(require 'gnus-range)
+(require 'gnus-start)
+(require 'gnus-int)
+
+(nnoo-declare nnimap)
+
+(defconst nnimap-version "nnimap 0.131")
+
+(defvoo nnimap-address nil
+ "Address of physical IMAP server. If nil, use the virtual server's name.")
+
+(defvoo nnimap-server-port nil
+ "Port number on physical IMAP server.
+If nil, defaults to 993 for SSL connections and 143 otherwise.")
+
+;; Splitting variables
+
+(defvar nnimap-split-crosspost t
+ "If non-nil, do crossposting if several split methods match the mail.
+If nil, the first match found will be used.")
+
+(defvar nnimap-split-inbox nil
+ "*Name of mailbox to split mail from.
+
+Mail is read from this mailbox and split according to rules in
+`nnimap-split-rules'.
+
+This can be a string or a list of strings.")
+
+(defvar nnimap-split-rule nil
+ "*Mail will be split according to theese rules.
+
+Mail is read from mailbox(es) specified in `nnimap-split-inbox'.
+
+If you'd like, for instance, one mail group for mail from the
+\"gnus-imap\" mailing list, one group for junk mail and leave
+everything else in the incoming mailbox, you could do something like
+this:
+
+(setq nnimap-split-rule '((\"INBOX.gnus-imap\" \"From:.*gnus-imap\")
+ (\"INBOX.junk\" \"Subject:.*buy\")))
+
+As you can see, `nnimap-split-rule' is a list of lists, where the first
+element in each \"rule\" is the name of the IMAP mailbox, and the
+second is a regexp that nnimap will try to match on the header to find
+a fit.
+
+The second element can also be a function. In that case, it will be
+called narrowed to the headers with the first element of the rule as
+the argument. It should return a non-nil value if it thinks that the
+mail belongs in that group.
+
+This variable can also have a function as its value, the function will
+be called with the headers narrowed and should return a group where it
+thinks the article should be splitted to. See `nnimap-split-fancy'.
+
+To allow for different split rules on different virtual servers, and
+even different split rules in different inboxes on the same server,
+the syntax of this variable have been extended along the lines of:
+
+(setq nnimap-split-rule
+ '((\"my1server\" (\".*\" ((\"ding\" \"ding@gnus.org\")
+ (\"junk\" \"From:.*Simon\")))
+ (\"my2server\" (\"INBOX\" nnimap-split-fancy))
+ (\"my[34]server\" (\".*\" ((\"private\" \"To:.*Simon\")
+ (\"junk\" my-junk-func)))))
+
+The virtual server name is in fact a regexp, so that the same rules
+may apply to several servers. In the example, the servers
+\"my3server\" and \"my4server\" both use the same rules. Similarly,
+the inbox string is also a regexp. The actual splitting rules are as
+before, either a function, or a list with group/regexp or
+group/function elements.")
+
+(defvar nnimap-split-predicate "UNSEEN UNDELETED"
+ "The predicate used to find articles to split.
+If you use another IMAP client to peek on articles but always would
+like nnimap to split them once it's started, you could change this to
+\"UNDELETED\". Other available predicates are available in
+RFC2060 section 6.4.4.")
+
+(defvar nnimap-split-fancy nil
+ "Like `nnmail-split-fancy', which see.")
+
+;; Authorization / Privacy variables
+
+(defvoo nnimap-auth-method nil
+ "Obsolete.")
+
+(defvoo nnimap-stream nil
+ "How nnimap will connect to the server.
+
+The default, nil, will try to use the \"best\" method the server can
+handle.
+
+Change this if
+
+1) you want to connect with SSL. The SSL integration with IMAP is
+ brain-dead so you'll have to tell it specifically.
+
+2) your server is more capable than your environment -- i.e. your
+ server accept Kerberos login's but you haven't installed the
+ `imtest' program or your machine isn't configured for Kerberos.
+
+Possible choices: kerberos4, ssl, network")
+
+(defvoo nnimap-authenticator nil
+ "How nnimap authenticate itself to the server.
+
+The default, nil, will try to use the \"best\" method the server can
+handle.
+
+There is only one reason for fiddling with this variable, and that is
+if your server is more capable than your environment -- i.e. you
+connect to a server that accept Kerberos login's but you haven't
+installed the `imtest' program or your machine isn't configured for
+Kerberos.
+
+Possible choices: kerberos4, cram-md5, login, anonymous.")
+
+(defvoo nnimap-directory (nnheader-concat gnus-directory "overview/")
+ "Directory to keep NOV cache files for nnimap groups.
+See also `nnimap-nov-file-name'.")
+
+(defvoo nnimap-nov-file-name "nnimap."
+ "NOV cache base filename.
+The group name and `nnimap-nov-file-name-suffix' will be appended. A
+typical complete file name would be
+~/News/overview/nnimap.pdc.INBOX.ding.nov, or
+~/News/overview/nnimap/pdc/INBOX/ding/nov if
+`nnmail-use-long-file-names' is nil")
+
+(defvoo nnimap-nov-file-name-suffix ".novcache"
+ "Suffix for NOV cache base filename.")
+
+(defvoo nnimap-nov-is-evil nil
+ "If non-nil, nnimap will never generate or use a local nov database for this backend.
+Using nov databases will speed up header fetching considerably.
+Unlike other backends, you do not need to take special care if you
+flip this variable.")
+
+(defvoo nnimap-expunge-on-close 'always ; 'ask, 'never
+ "Whether to expunge a group when it is closed.
+When a IMAP group with articles marked for deletion is closed, this
+variable determine if nnimap should actually remove the articles or
+not.
+
+If always, nnimap always perform a expunge when closing the group.
+If never, nnimap never expunges articles marked for deletion.
+If ask, nnimap will ask you if you wish to expunge marked articles.
+
+When setting this variable to `never', you can only expunge articles
+by using `G x' (gnus-group-nnimap-expunge) from the Group buffer.")
+
+(defvoo nnimap-list-pattern "*"
+ "A string LIMIT or list of strings with mailbox wildcards used to limit available groups.
+See below for available wildcards.
+
+The LIMIT string can be a cons cell (REFERENCE . LIMIT), where
+REFERENCE will be passed as the first parameter to LIST/LSUB. The
+semantics of this are server specific, on the University of Washington
+server you can specify a directory.
+
+Example:
+ '(\"INBOX\" \"mail/*\" (\"~friend/mail/\" . \"list/*\"))
+
+There are two wildcards * and %. * matches everything, % matches
+everything in the current hierarchy.")
+
+(defvoo nnimap-news-groups nil
+ "IMAP support a news-like mode, also known as bulletin board mode, where replies is sent via IMAP instead of SMTP.
+
+This variable should contain a regexp matching groups where you wish
+replies to be stored to the mailbox directly.
+
+Example:
+ '(\"^[^I][^N][^B][^O][^X].*$\")
+
+This will match all groups not beginning with \"INBOX\".
+
+Note that there is nothing technically different between mail-like and
+news-like mailboxes. If you wish to have a group with todo items or
+similar which you wouldn't want to set up a mailing list for, you can
+use this to make replies go directly to the group.")
+
+(defvoo nnimap-server-address nil
+ "Obsolete. Use `nnimap-address'.")
+
+(defcustom nnimap-authinfo-file "~/.authinfo"
+ "Authorization information for IMAP servers. In .netrc format."
+ :type
+ '(choice file
+ (repeat :tag "Entries"
+ :menu-tag "Inline"
+ (list :format "%v"
+ :value ("" ("login" . "") ("password" . ""))
+ (string :tag "Host")
+ (checklist :inline t
+ (cons :format "%v"
+ (const :format "" "login")
+ (string :format "Login: %v"))
+ (cons :format "%v"
+ (const :format "" "password")
+ (string :format "Password: %v")))))))
+
+(defcustom nnimap-prune-cache t
+ "If non-nil, nnimap check whether articles still exist on server before using data stored in NOV cache."
+ :type 'boolean)
+
+(defvar nnimap-request-list-method 'imap-mailbox-list
+ "Method to use to request a list of all folders from the server.
+If this is 'imap-mailbox-lsub, then use a server-side subscription list to
+restrict visible folders.")
+
+;; Internal variables:
+
+(defvar nnimap-debug nil
+ "Name of buffer to record debugging info.
+For example: (setq nnimap-debug \"*nnimap-debug*\")")
+(defvar nnimap-current-move-server nil)
+(defvar nnimap-current-move-group nil)
+(defvar nnimap-current-move-article nil)
+(defvar nnimap-length)
+(defvar nnimap-progress-chars '(?| ?/ ?- ?\\))
+(defvar nnimap-progress-how-often 20)
+(defvar nnimap-counter)
+(defvar nnimap-callback-callback-function nil
+ "Gnus callback the nnimap asynchronous callback should call.")
+(defvar nnimap-callback-buffer nil
+ "Which buffer the asynchronous article prefetch callback should work in.")
+(defvar nnimap-server-buffer-alist nil) ;; Map server name to buffers.
+(defvar nnimap-current-server nil) ;; Current server
+(defvar nnimap-server-buffer nil) ;; Current servers' buffer
+
+\f
+
+(nnoo-define-basics nnimap)
+
+;; Utility functions:
+
+(defsubst nnimap-get-server-buffer (server)
+ "Return buffer for SERVER, if nil use current server."
+ (cadr (assoc (or server nnimap-current-server) nnimap-server-buffer-alist)))
+
+(defun nnimap-possibly-change-server (server)
+ "Return buffer for SERVER, changing the current server as a side-effect.
+If SERVER is nil, uses the current server."
+ (setq nnimap-current-server (or server nnimap-current-server)
+ nnimap-server-buffer (nnimap-get-server-buffer nnimap-current-server)))
+
+(defun nnimap-verify-uidvalidity (group server)
+ "Verify stored uidvalidity match current one in GROUP on SERVER."
+ (let* ((gnusgroup (gnus-group-prefixed-name
+ group (gnus-server-to-method
+ (format "nnimap:%s" server))))
+ (new-uidvalidity (imap-mailbox-get 'uidvalidity))
+ (old-uidvalidity (gnus-group-get-parameter gnusgroup 'uidvalidity)))
+ (if old-uidvalidity
+ (if (not (equal old-uidvalidity new-uidvalidity))
+ nil ;; uidvalidity clash
+ (gnus-group-set-parameter gnusgroup 'uidvalidity new-uidvalidity)
+ t)
+ (gnus-group-add-parameter gnusgroup (cons 'uidvalidity new-uidvalidity))
+ t)))
+
+(defun nnimap-before-find-minmax-bugworkaround ()
+ "Function called before iterating through mailboxes with
+`nnimap-find-minmax-uid'."
+ ;; XXX this is for UoW imapd problem, it doesn't notice new mail in
+ ;; currently selected mailbox without a re-select/examine.
+ (or (null (imap-current-mailbox nnimap-server-buffer))
+ (imap-mailbox-unselect nnimap-server-buffer)))
+
+(defun nnimap-find-minmax-uid (group &optional examine)
+ "Find lowest and highest active article nummber in GROUP.
+If EXAMINE is non-nil the group is selected read-only."
+ (with-current-buffer nnimap-server-buffer
+ (when (imap-mailbox-select group examine)
+ (let (minuid maxuid)
+ (when (> (imap-mailbox-get 'exists) 0)
+ (imap-fetch "1,*" "UID" nil 'nouidfetch)
+ (imap-message-map (lambda (uid Uid)
+ (setq minuid (if minuid (min minuid uid) uid)
+ maxuid (if maxuid (max maxuid uid) uid)))
+ 'UID))
+ (list (imap-mailbox-get 'exists) minuid maxuid)))))
+
+(defun nnimap-possibly-change-group (group &optional server)
+ "Make GROUP the current group, and SERVER the current server."
+ (when (nnimap-possibly-change-server server)
+ (with-current-buffer nnimap-server-buffer
+ (if (or (null group) (imap-current-mailbox-p group))
+ imap-current-mailbox
+ (if (imap-mailbox-select group)
+ (if (or (nnimap-verify-uidvalidity
+ group (or server nnimap-current-server))
+ (zerop (imap-mailbox-get 'exists group))
+ (yes-or-no-p
+ (format
+ "nnimap: Group %s is not uidvalid. Continue? " group)))
+ imap-current-mailbox
+ (imap-mailbox-unselect)
+ (error "nnimap: Group %s is not uid-valid." group))
+ (nnheader-report 'nnimap (imap-error-text)))))))
+
+(defun nnimap-replace-whitespace (string)
+ "Return STRING with all whitespace replaced with space."
+ (when string
+ (while (string-match "[\r\n\t]+" string)
+ (setq string (replace-match " " t t string)))
+ string))
+
+;; Required backend functions
+
+(defun nnimap-retrieve-headers-progress ()
+ "Hook to insert NOV line for current article into `nntp-server-buffer'."
+ (and (numberp nnmail-large-newsgroup)
+ (zerop (% (incf nnimap-counter) nnimap-progress-how-often))
+ (> nnimap-length nnmail-large-newsgroup)
+ (nnheader-message 6 "nnimap: Retrieving headers... %c"
+ (nth (/ (% nnimap-counter
+ (* (length nnimap-progress-chars)
+ nnimap-progress-how-often))
+ nnimap-progress-how-often)
+ nnimap-progress-chars)))
+ (with-current-buffer nntp-server-buffer
+ (let (headers lines chars uid mbx)
+ (with-current-buffer nnimap-server-buffer
+ (setq uid imap-current-message
+ mbx imap-current-mailbox
+ headers (nnimap-demule
+ (if (imap-capability 'IMAP4rev1)
+ ;; xxx don't just use car? alist doesn't contain
+ ;; anything else now, but it might...
+ (nth 2 (car (imap-message-get uid 'BODYDETAIL)))
+ (imap-message-get uid 'RFC822.HEADER)))
+ lines (imap-body-lines (imap-message-body imap-current-message))
+ chars (imap-message-get imap-current-message 'RFC822.SIZE)))
+ (nnheader-insert-nov
+ (with-temp-buffer
+ (buffer-disable-undo)
+ (insert headers)
+ (nnheader-ms-strip-cr)
+ (nnheader-fold-continuation-lines)
+ (subst-char-in-region (point-min) (point-max) ?\t ? )
+ (let ((head (nnheader-parse-head 'naked)))
+ (mail-header-set-number head uid)
+ (mail-header-set-chars head chars)
+ (mail-header-set-lines head lines)
+ (mail-header-set-xref
+ head (format "%s %s:%d" (system-name) mbx uid))
+ head))))))
+
+(defun nnimap-retrieve-which-headers (articles fetch-old)
+ "Get a range of articles to fetch based on ARTICLES and FETCH-OLD."
+ (with-current-buffer nnimap-server-buffer
+ (if (numberp (car-safe articles))
+ (imap-search
+ (concat "UID "
+ (imap-range-to-message-set
+ (gnus-compress-sequence
+ (append (gnus-uncompress-sequence
+ (and fetch-old
+ (cons (if (numberp fetch-old)
+ (max 1 (- (car articles) fetch-old))
+ 1)
+ (1- (car articles)))))
+ articles)))))
+ (mapcar (lambda (msgid)
+ (imap-search
+ (format "HEADER Message-Id %s" msgid)))
+ articles))))
+
+(defun nnimap-group-overview-filename (group server)
+ "Make pathname for GROUP on SERVER."
+ (let ((dir (file-name-as-directory (expand-file-name nnimap-directory)))
+ (file (nnheader-translate-file-chars
+ (concat nnimap-nov-file-name
+ (if (equal server "")
+ "unnamed"
+ server) "." group nnimap-nov-file-name-suffix) t)))
+ (if (or nnmail-use-long-file-names
+ (file-exists-p (concat dir file)))
+ (concat dir file)
+ (concat dir (mm-encode-coding-string
+ (nnheader-replace-chars-in-string file ?. ?/)
+ nnmail-pathname-coding-system)))))
+
+(defun nnimap-retrieve-headers-from-file (group server)
+ (with-current-buffer nntp-server-buffer
+ (let ((nov (nnimap-group-overview-filename group server)))
+ (when (file-exists-p nov)
+ (mm-insert-file-contents nov)
+ (set-buffer-modified-p nil)
+ (let ((min (ignore-errors (goto-char (point-min))
+ (read (current-buffer))))
+ (max (ignore-errors (goto-char (point-max))
+ (forward-line -1)
+ (read (current-buffer)))))
+ (if (and (numberp min) (numberp max))
+ (cons min max)
+ ;; junk, remove it, it's saved later
+ (erase-buffer)
+ nil))))))
+
+(defun nnimap-retrieve-headers-from-server (articles group server)
+ (with-current-buffer nnimap-server-buffer
+ (let ((imap-fetch-data-hook '(nnimap-retrieve-headers-progress))
+ (nnimap-length (gnus-range-length articles))
+ (nnimap-counter 0))
+ (imap-fetch (imap-range-to-message-set articles)
+ (concat "(UID RFC822.SIZE BODY "
+ (let ((headers
+ (append '(Subject From Date Message-Id
+ References In-Reply-To Xref)
+ (copy-sequence
+ nnmail-extra-headers))))
+ (if (imap-capability 'IMAP4rev1)
+ (format "BODY.PEEK[HEADER.FIELDS %s])" headers)
+ (format "RFC822.HEADER.LINES %s)" headers)))))
+ (and (numberp nnmail-large-newsgroup)
+ (> nnimap-length nnmail-large-newsgroup)
+ (nnheader-message 6 "nnimap: Retrieving headers...done")))))
+
+(defun nnimap-use-nov-p (group server)
+ (or gnus-nov-is-evil nnimap-nov-is-evil
+ (unless (and (gnus-make-directory
+ (file-name-directory
+ (nnimap-group-overview-filename group server)))
+ (file-writable-p
+ (nnimap-group-overview-filename group server)))
+ (message "nnimap: Nov cache not writable, %s"
+ (nnimap-group-overview-filename group server)))))
+
+(deffoo nnimap-retrieve-headers (articles &optional group server fetch-old)
+ (when (nnimap-possibly-change-group group server)
+ (with-current-buffer nntp-server-buffer
+ (erase-buffer)
+ (if (nnimap-use-nov-p group server)
+ (nnimap-retrieve-headers-from-server
+ (gnus-compress-sequence articles) group server)
+ (let (uids cached low high)
+ (when (setq uids (nnimap-retrieve-which-headers articles fetch-old)
+ low (car uids)
+ high (car (last uids)))
+ (if (setq cached (nnimap-retrieve-headers-from-file group server))
+ (progn
+ ;; fetch articles with uids before cache block
+ (when (< low (car cached))
+ (goto-char (point-min))
+ (nnimap-retrieve-headers-from-server
+ (cons low (1- (car cached))) group server))
+ ;; fetch articles with uids after cache block
+ (when (> high (cdr cached))
+ (goto-char (point-max))
+ (nnimap-retrieve-headers-from-server
+ (cons (1+ (cdr cached)) high) group server))
+ (when nnimap-prune-cache
+ ;; remove nov's for articles which has expired on server
+ (goto-char (point-min))
+ (dolist (uid (gnus-set-difference articles uids))
+ (when (re-search-forward (format "^%d\t" uid) nil t)
+ (gnus-delete-line)))))
+ ;; nothing cached, fetch whole range from server
+ (nnimap-retrieve-headers-from-server
+ (cons low high) group server))
+ (when (buffer-modified-p)
+ (nnmail-write-region
+ 1 (point-max) (nnimap-group-overview-filename group server)
+ nil 'nomesg))
+ (nnheader-nov-delete-outside-range low high))))
+ 'nov)))
+
+(defun nnimap-open-connection (server)
+ (if (not (imap-open nnimap-address nnimap-server-port nnimap-stream
+ nnimap-authenticator nnimap-server-buffer))
+ (nnheader-report 'nnimap "Can't open connection to server %s" server)
+ (unless (or (imap-capability 'IMAP4 nnimap-server-buffer)
+ (imap-capability 'IMAP4rev1 nnimap-server-buffer))
+ (imap-close nnimap-server-buffer)
+ (nnheader-report 'nnimap "Server %s is not IMAP4 compliant" server))
+ (let* ((list (gnus-parse-netrc nnimap-authinfo-file))
+ (port (if nnimap-server-port
+ (int-to-string nnimap-server-port)
+ "imap"))
+ (alist (gnus-netrc-machine list (or nnimap-server-address
+ nnimap-address server)
+ port "imap"))
+ (user (gnus-netrc-get alist "login"))
+ (passwd (gnus-netrc-get alist "password")))
+ (if (imap-authenticate user passwd nnimap-server-buffer)
+ (prog1
+ (push (list server nnimap-server-buffer)
+ nnimap-server-buffer-alist)
+ (nnimap-possibly-change-server server))
+ (imap-close nnimap-server-buffer)
+ (kill-buffer nnimap-server-buffer)
+ (nnheader-report 'nnimap "Could not authenticate to %s" server)))))
+
+(deffoo nnimap-open-server (server &optional defs)
+ (nnheader-init-server-buffer)
+ (if (nnimap-server-opened server)
+ t
+ (unless (assq 'nnimap-server-buffer defs)
+ (push (list 'nnimap-server-buffer (concat " *nnimap* " server)) defs))
+ ;; translate `nnimap-server-address' to `nnimap-address' in defs
+ ;; for people that configured nnimap with a very old version
+ (unless (assq 'nnimap-address defs)
+ (if (assq 'nnimap-server-address defs)
+ (push (list 'nnimap-address
+ (cadr (assq 'nnimap-server-address defs))) defs)
+ (push (list 'nnimap-address server) defs)))
+ (nnoo-change-server 'nnimap server defs)
+ (with-current-buffer (get-buffer-create nnimap-server-buffer)
+ (nnoo-change-server 'nnimap server defs))
+ (or (and nnimap-server-buffer
+ (imap-opened nnimap-server-buffer))
+ (nnimap-open-connection server))))
+
+(deffoo nnimap-server-opened (&optional server)
+ "Whether SERVER is opened.
+If SERVER is the current virtual server, and the connection to the
+physical server is alive, this function return a non-nil value. If
+SERVER is nil, it is treated as the current server."
+ ;; clean up autologouts??
+ (and (or server nnimap-current-server)
+ (nnoo-server-opened 'nnimap (or server nnimap-current-server))
+ (imap-opened (nnimap-get-server-buffer server))))
+
+(deffoo nnimap-close-server (&optional server)
+ "Close connection to server and free all resources connected to it.
+Return nil if the server couldn't be closed for some reason."
+ (let ((server (or server nnimap-current-server)))
+ (when (or (nnimap-server-opened server)
+ (imap-opened (nnimap-get-server-buffer server)))
+ (imap-close (nnimap-get-server-buffer server))
+ (kill-buffer (nnimap-get-server-buffer server))
+ (setq nnimap-server-buffer nil
+ nnimap-current-server nil
+ nnimap-server-buffer-alist
+ (delq server nnimap-server-buffer-alist)))
+ (nnoo-close-server 'nnimap server)))
+
+(deffoo nnimap-request-close ()
+ "Close connection to all servers and free all resources that the backend have reserved.
+All buffers that have been created by that
+backend should be killed. (Not the nntp-server-buffer, though.) This
+function is generally only called when Gnus is shutting down."
+ (mapcar (lambda (server) (nnimap-close-server (car server)))
+ nnimap-server-buffer-alist)
+ (setq nnimap-server-buffer-alist nil))
+
+(deffoo nnimap-status-message (&optional server)
+ "This function returns the last error message from server."
+ (when (nnimap-possibly-change-server server)
+ (nnoo-status-message 'nnimap server)))
+
+(defun nnimap-demule (string)
+ (funcall (if (and (fboundp 'string-as-multibyte)
+ (subrp (symbol-function 'string-as-multibyte)))
+ 'string-as-multibyte
+ 'identity)
+ (or string "")))
+
+(defun nnimap-callback ()
+ (remove-hook 'imap-fetch-data-hook 'nnimap-callback)
+ (with-current-buffer nnimap-callback-buffer
+ (insert
+ (with-current-buffer nnimap-server-buffer
+ (nnimap-demule
+ (if (imap-capability 'IMAP4rev1)
+ ;; xxx don't just use car? alist doesn't contain
+ ;; anything else now, but it might...
+ (nth 2 (car (imap-message-get (imap-current-message) 'BODYDETAIL)))
+ (imap-message-get (imap-current-message) 'RFC822)))))
+ (nnheader-ms-strip-cr)
+ (funcall nnimap-callback-callback-function t)))
+
+(defun nnimap-request-article-part (article part prop &optional
+ group server to-buffer detail)
+ (when (nnimap-possibly-change-group group server)
+ (let ((article (if (stringp article)
+ (car-safe (imap-search
+ (format "HEADER Message-Id %s" article)
+ nnimap-server-buffer))
+ article)))
+ (when article
+ (gnus-message 10 "nnimap: Fetching (part of) article %d..." article)
+ (if (not nnheader-callback-function)
+ (with-current-buffer (or to-buffer nntp-server-buffer)
+ (erase-buffer)
+ (let ((data (imap-fetch article part prop nil
+ nnimap-server-buffer)))
+ (insert (nnimap-demule (if detail
+ (nth 2 (car data))
+ data))))
+ (nnheader-ms-strip-cr)
+ (gnus-message 10 "nnimap: Fetching (part of) article %d...done"
+ article)
+ (if (bobp)
+ (nnheader-report 'nnimap "No such article: %s"
+ (imap-error-text nnimap-server-buffer))
+ (cons group article)))
+ (add-hook 'imap-fetch-data-hook 'nnimap-callback)
+ (setq nnimap-callback-callback-function nnheader-callback-function
+ nnimap-callback-buffer nntp-server-buffer)
+ (imap-fetch-asynch article part nil nnimap-server-buffer)
+ (cons group article))))))
+
+(deffoo nnimap-asynchronous-p ()
+ t)
+
+(deffoo nnimap-request-article (article &optional group server to-buffer)
+ (if (imap-capability 'IMAP4rev1 nnimap-server-buffer)
+ (nnimap-request-article-part
+ article "BODY.PEEK[]" 'BODYDETAIL group server to-buffer 'detail)
+ (nnimap-request-article-part
+ article "RFC822.PEEK" 'RFC822 group server to-buffer)))
+
+(deffoo nnimap-request-head (article &optional group server to-buffer)
+ (if (imap-capability 'IMAP4rev1 nnimap-server-buffer)
+ (nnimap-request-article-part
+ article "BODY.PEEK[HEADER]" 'BODYDETAIL group server to-buffer 'detail)
+ (nnimap-request-article-part
+ article "RFC822.HEADER" 'RFC822.HEADER group server to-buffer)))
+
+(deffoo nnimap-request-body (article &optional group server to-buffer)
+ (if (imap-capability 'IMAP4rev1 nnimap-server-buffer)
+ (nnimap-request-article-part
+ article "BODY.PEEK[TEXT]" 'BODYDETAIL group server to-buffer 'detail)
+ (nnimap-request-article-part
+ article "RFC822.TEXT.PEEK" 'RFC822.TEXT group server to-buffer)))
+
+(deffoo nnimap-request-group (group &optional server fast)
+ (nnimap-request-update-info-internal
+ group
+ (gnus-get-info (gnus-group-prefixed-name
+ group (gnus-server-to-method (format "nnimap:%s" server))))
+ server)
+ (when (nnimap-possibly-change-group group server)
+ (nnimap-before-find-minmax-bugworkaround)
+ (let (info)
+ (cond (fast group)
+ ((null (setq info (nnimap-find-minmax-uid group t)))
+ (nnheader-report 'nnimap "Could not get active info for %s"
+ group))
+ (t
+ (nnheader-insert "211 %d %d %d %s\n" (or (nth 0 info) 0)
+ (max 1 (or (nth 1 info) 1))
+ (or (nth 2 info) 0) group)
+ (nnheader-report 'nnimap "Group %s selected" group)
+ t)))))
+
+(defun nnimap-close-group (group &optional server)
+ (with-current-buffer nnimap-server-buffer
+ (when (and (imap-opened)
+ (nnimap-possibly-change-group group server))
+ (case nnimap-expunge-on-close
+ ('always (imap-mailbox-expunge)
+ (imap-mailbox-close))
+ ('ask (if (and (imap-search "DELETED")
+ (gnus-y-or-n-p (format
+ "Expunge articles in group `%s'? "
+ imap-current-mailbox)))
+ (progn (imap-mailbox-expunge)
+ (imap-mailbox-close))
+ (imap-mailbox-unselect)))
+ (t (imap-mailbox-unselect)))
+ (not imap-current-mailbox))))
+
+(defun nnimap-pattern-to-list-arguments (pattern)
+ (mapcar (lambda (p)
+ (cons (car-safe p) (or (cdr-safe p) p)))
+ (if (and (listp pattern)
+ (listp (cdr pattern)))
+ pattern
+ (list pattern))))
+
+(deffoo nnimap-request-list (&optional server)
+ (when (nnimap-possibly-change-server server)
+ (with-current-buffer nntp-server-buffer
+ (erase-buffer))
+ (gnus-message 5 "nnimap: Generating active list%s..."
+ (if (> (length server) 0) (concat " for " server) ""))
+ (nnimap-before-find-minmax-bugworkaround)
+ (with-current-buffer nnimap-server-buffer
+ (dolist (pattern (nnimap-pattern-to-list-arguments nnimap-list-pattern))
+ (dolist (mbx (funcall nnimap-request-list-method
+ (cdr pattern) (car pattern)))
+ (or (member "\\NoSelect" (imap-mailbox-get 'list-flags mbx))
+ (let ((info (nnimap-find-minmax-uid mbx 'examine)))
+ (when info
+ (with-current-buffer nntp-server-buffer
+ (insert (format "\"%s\" %d %d y\n"
+ mbx (or (nth 2 info) 0)
+ (max 1 (or (nth 1 info) 1)))))))))))
+ (gnus-message 5 "nnimap: Generating active list%s...done"
+ (if (> (length server) 0) (concat " for " server) ""))
+ t))
+
+(deffoo nnimap-request-post (&optional server)
+ (let ((success t))
+ (dolist (mbx (message-unquote-tokens
+ (message-tokenize-header
+ (message-fetch-field "Newsgroups") ", ")) success)
+ (let ((to-newsgroup (gnus-group-prefixed-name mbx gnus-command-method)))
+ (or (gnus-active to-newsgroup)
+ (gnus-activate-group to-newsgroup)
+ (if (gnus-y-or-n-p (format "No such group: %s. Create it? "
+ to-newsgroup))
+ (or (and (gnus-request-create-group
+ to-newsgroup gnus-command-method)
+ (gnus-activate-group to-newsgroup nil nil
+ gnus-command-method))
+ (error "Couldn't create group %s" to-newsgroup)))
+ (error "No such group: %s" to-newsgroup))
+ (unless (nnimap-request-accept-article mbx (nth 1 gnus-command-method))
+ (setq success nil))))))
+
+;; Optional backend functions
+
+(deffoo nnimap-retrieve-groups (groups &optional server)
+ (when (nnimap-possibly-change-server server)
+ (gnus-message 5 "nnimap: Checking mailboxes...")
+ (with-current-buffer nntp-server-buffer
+ (erase-buffer)
+ (nnimap-before-find-minmax-bugworkaround)
+ (dolist (group groups)
+ (gnus-message 7 "nnimap: Checking mailbox %s" group)
+ (or (member "\\NoSelect"
+ (imap-mailbox-get 'list-flags group nnimap-server-buffer))
+ (let ((info (nnimap-find-minmax-uid group 'examine)))
+ (insert (format "\"%s\" %d %d y\n" group
+ (or (nth 2 info) 0)
+ (max 1 (or (nth 1 info) 1))))))))
+ (gnus-message 5 "nnimap: Checking mailboxes...done")
+ 'active))
+
+(deffoo nnimap-request-update-info-internal (group info &optional server)
+ (when (nnimap-possibly-change-group group server)
+ (when info;; xxx what does this mean? should we create a info?
+ (with-current-buffer nnimap-server-buffer
+ (gnus-message 5 "nnimap: Updating info for %s..."
+ (gnus-info-group info))
+
+ (when (nnimap-mark-permanent-p 'read)
+ (let (seen unseen)
+ ;; read info could contain articles marked unread by other
+ ;; imap clients! we correct this
+ (setq seen (gnus-uncompress-range (gnus-info-read info))
+ unseen (imap-search "UNSEEN UNDELETED")
+ seen (gnus-set-difference seen unseen)
+ ;; seen might lack articles marked as read by other
+ ;; imap clients! we correct this
+ seen (append seen (imap-search "SEEN"))
+ ;; remove dupes
+ seen (sort seen '<)
+ seen (gnus-compress-sequence seen t)
+ ;; we can't return '(1) since this isn't a "list of ranges",
+ ;; and we can't return '((1)) since g-list-of-unread-articles
+ ;; is buggy so we return '((1 . 1)).
+ seen (if (and (integerp (car seen))
+ (null (cdr seen)))
+ (list (cons (car seen) (car seen)))
+ seen))
+ (gnus-info-set-read info seen)))
+
+ (mapcar (lambda (pred)
+ (when (and (nnimap-mark-permanent-p (cdr pred))
+ (member (nnimap-mark-to-flag (cdr pred))
+ (imap-mailbox-get 'flags)))
+ (gnus-info-set-marks
+ info
+ (nnimap-update-alist-soft
+ (cdr pred)
+ (gnus-compress-sequence
+ (imap-search (nnimap-mark-to-predicate (cdr pred))))
+ (gnus-info-marks info))
+ t)))
+ gnus-article-mark-lists)
+
+ ;; nnimap mark dormant article as ticked too (for other clients)
+ ;; so we remove that mark for gnus since we support dormant
+ (gnus-info-set-marks
+ info
+ (nnimap-update-alist-soft
+ 'tick
+ (gnus-remove-from-range
+ (cdr-safe (assoc 'tick (gnus-info-marks info)))
+ (cdr-safe (assoc 'dormant (gnus-info-marks info))))
+ (gnus-info-marks info))
+ t)
+
+ (gnus-message 5 "nnimap: Updating info for %s...done"
+ (gnus-info-group info))
+
+ info))))
+
+(deffoo nnimap-request-type (group &optional article)
+ (if (and nnimap-news-groups (string-match nnimap-news-groups group))
+ 'news
+ 'mail))
+
+(deffoo nnimap-request-set-mark (group actions &optional server)
+ (when (nnimap-possibly-change-group group server)
+ (with-current-buffer nnimap-server-buffer
+ (let (action)
+ (gnus-message 7 "nnimap: Setting marks in %s..." group)
+ (while (setq action (pop actions))
+ (let ((range (nth 0 action))
+ (what (nth 1 action))
+ (cmdmarks (nth 2 action))
+ marks)
+ ;; cache flags are pointless on the server
+ (setq cmdmarks (delq 'cache cmdmarks))
+ ;; flag dormant articles as ticked
+ (if (memq 'dormant cmdmarks)
+ (setq cmdmarks (cons 'tick cmdmarks)))
+ ;; remove stuff we are forbidden to store
+ (mapcar (lambda (mark)
+ (if (imap-message-flag-permanent-p
+ (nnimap-mark-to-flag mark))
+ (setq marks (cons mark marks))))
+ cmdmarks)
+ (when (and range marks)
+ (cond ((eq what 'del)
+ (imap-message-flags-del
+ (imap-range-to-message-set range)
+ (nnimap-mark-to-flag marks nil t)))
+ ((eq what 'add)
+ (imap-message-flags-add
+ (imap-range-to-message-set range)
+ (nnimap-mark-to-flag marks nil t)))
+ ((eq what 'set)
+ (imap-message-flags-set
+ (imap-range-to-message-set range)
+ (nnimap-mark-to-flag marks nil t)))))))
+ (gnus-message 7 "nnimap: Setting marks in %s...done" group))))
+ nil)
+
+(defun nnimap-split-fancy ()
+ "Like nnmail-split-fancy, but uses nnimap-split-fancy."
+ (let ((nnmail-split-fancy nnimap-split-fancy))
+ (nnmail-split-fancy)))
+
+(defun nnimap-split-to-groups (rules)
+ ;; tries to match all rules in nnimap-split-rule against content of
+ ;; nntp-server-buffer, returns a list of groups that matched.
+ (with-current-buffer nntp-server-buffer
+ ;; Fold continuation lines.
+ (goto-char (point-min))
+ (while (re-search-forward "\\(\r?\n[ \t]+\\)+" nil t)
+ (replace-match " " t t))
+ (if (functionp rules)
+ (funcall rules)
+ (let (to-groups regrepp)
+ (catch 'split-done
+ (dolist (rule rules to-groups)
+ (let ((group (car rule))
+ (regexp (cadr rule)))
+ (goto-char (point-min))
+ (when (and (if (stringp regexp)
+ (progn
+ (setq regrepp (string-match "\\\\[0-9&]" group))
+ (re-search-forward regexp nil t))
+ (funcall regexp group))
+ ;; Don't enter the article into the same group twice.
+ (not (assoc group to-groups)))
+ (push (if regrepp
+ (nnmail-expand-newtext group)
+ group)
+ to-groups)
+ (or nnimap-split-crosspost
+ (throw 'split-done to-groups))))))))))
+
+(defun nnimap-assoc-match (key alist)
+ (let (element)
+ (while (and alist (not element))
+ (if (string-match (car (car alist)) key)
+ (setq element (car alist)))
+ (setq alist (cdr alist)))
+ element))
+
+(defun nnimap-split-find-rule (server inbox)
+ (if (and (listp nnimap-split-rule) (listp (car nnimap-split-rule))
+ (list (cdar nnimap-split-rule)) (listp (cadar nnimap-split-rule)))
+ ;; extended format
+ (cadr (nnimap-assoc-match inbox (cdr (nnimap-assoc-match
+ server nnimap-split-rule))))
+ nnimap-split-rule))
+
+(defun nnimap-split-find-inbox (server)
+ (if (listp nnimap-split-inbox)
+ nnimap-split-inbox
+ (list nnimap-split-inbox)))
+
+(defun nnimap-split-articles (&optional group server)
+ (when (nnimap-possibly-change-server server)
+ (with-current-buffer nnimap-server-buffer
+ (let (rule inbox removeorig (inboxes (nnimap-split-find-inbox server)))
+ ;; iterate over inboxes
+ (while (and (setq inbox (pop inboxes))
+ (nnimap-possibly-change-group inbox));; SELECT
+ ;; find split rule for this server / inbox
+ (when (setq rule (nnimap-split-find-rule server inbox))
+ ;; iterate over articles
+ (dolist (article (imap-search nnimap-split-predicate))
+ (when (nnimap-request-head article)
+ ;; copy article to right group(s)
+ (setq removeorig nil)
+ (dolist (to-group (nnimap-split-to-groups rule))
+ (if (imap-message-copy (number-to-string article)
+ to-group nil 'nocopyuid)
+ (progn
+ (message "IMAP split moved %s:%s:%d to %s" server inbox
+ article to-group)
+ (setq removeorig t)
+ ;; Add the group-art list to the history list.
+ (push (list (cons to-group 0)) nnmail-split-history))
+ (message "IMAP split failed to move %s:%s:%d to %s" server
+ inbox article to-group)))
+ ;; remove article if it was successfully copied somewhere
+ (and removeorig
+ (imap-message-flags-add (format "%d" article)
+ "\\Seen \\Deleted")))))
+ (when (imap-mailbox-select inbox);; just in case
+ ;; todo: UID EXPUNGE (if available) to remove splitted articles
+ (imap-mailbox-expunge)
+ (imap-mailbox-close)))
+ t))))
+
+(deffoo nnimap-request-scan (&optional group server)
+ (nnimap-split-articles group server))
+
+(deffoo nnimap-request-newgroups (date &optional server)
+ (when (nnimap-possibly-change-server server)
+ (with-current-buffer nntp-server-buffer
+ (gnus-message 5 "nnimap: Listing subscribed mailboxes%s%s..."
+ (if (> (length server) 0) " on " "") server)
+ (erase-buffer)
+ (nnimap-before-find-minmax-bugworkaround)
+ (dolist (pattern (nnimap-pattern-to-list-arguments
+ nnimap-list-pattern))
+ (dolist (mbx (imap-mailbox-lsub "*" (car pattern) nil
+ nnimap-server-buffer))
+ (or (catch 'found
+ (dolist (mailbox (imap-mailbox-get 'list-flags mbx
+ nnimap-server-buffer))
+ (if (string= (downcase mailbox) "\\noselect")
+ (throw 'found t)))
+ nil)
+ (let ((info (nnimap-find-minmax-uid mbx 'examine)))
+ (when info
+ (insert (format "\"%s\" %d %d y\n"
+ mbx (or (nth 2 info) 0)
+ (max 1 (or (nth 1 info) 1)))))))))
+ (gnus-message 5 "nnimap: Listing subscribed mailboxes%s%s...done"
+ (if (> (length server) 0) " on " "") server))
+ t))
+
+(deffoo nnimap-request-create-group (group &optional server args)
+ (when (nnimap-possibly-change-server server)
+ (or (imap-mailbox-status group 'uidvalidity nnimap-server-buffer)
+ (imap-mailbox-create group nnimap-server-buffer))))
+
+(defun nnimap-time-substract (time1 time2)
+ "Return TIME for TIME1 - TIME2."
+ (let* ((ms (- (car time1) (car time2)))
+ (ls (- (nth 1 time1) (nth 1 time2))))
+ (if (< ls 0)
+ (list (- ms 1) (+ (expt 2 16) ls))
+ (list ms ls))))
+
+(defun nnimap-date-days-ago (daysago)
+ "Return date, in format \"3-Aug-1998\", for DAYSAGO days ago."
+ (let ((date (format-time-string "%d-%b-%Y"
+ (nnimap-time-substract
+ (current-time)
+ (days-to-time daysago)))))
+ (if (eq ?0 (string-to-char date))
+ (substring date 1)
+ date)))
+
+(defun nnimap-request-expire-articles-progress ()
+ (gnus-message 5 "nnimap: Marking article %d for deletion..."
+ imap-current-message))
+
+;; Notice that we don't actually delete anything, we just mark them deleted.
+(deffoo nnimap-request-expire-articles (articles group &optional server force)
+ (let ((artseq (gnus-compress-sequence articles)))
+ (when (and artseq (nnimap-possibly-change-group group server))
+ (with-current-buffer nnimap-server-buffer
+ (if force
+ (and (imap-message-flags-add
+ (imap-range-to-message-set artseq) "\\Deleted")
+ (setq articles nil))
+ (let ((days (or (and nnmail-expiry-wait-function
+ (funcall nnmail-expiry-wait-function group))
+ nnmail-expiry-wait)))
+ (cond ((eq days 'immediate)
+ (and (imap-message-flags-add
+ (imap-range-to-message-set artseq) "\\Deleted")
+ (setq articles nil)))
+ ((numberp days)
+ (let ((oldarts (imap-search
+ (format "UID %s NOT SINCE %s"
+ (imap-range-to-message-set artseq)
+ (nnimap-date-days-ago days))))
+ (imap-fetch-data-hook
+ '(nnimap-request-expire-articles-progress)))
+ (and oldarts
+ (imap-message-flags-add
+ (imap-range-to-message-set
+ (gnus-compress-sequence oldarts))
+ "\\Deleted")
+ (setq articles (gnus-set-difference
+ articles oldarts)))))))))))
+ ;; return articles not deleted
+ articles)
+
+(deffoo nnimap-request-move-article (article group server
+ accept-form &optional last)
+ (when (nnimap-possibly-change-server server)
+ (save-excursion
+ (let ((buf (get-buffer-create " *nnimap move*"))
+ (nnimap-current-move-article article)
+ (nnimap-current-move-group group)
+ (nnimap-current-move-server nnimap-current-server)
+ result)
+ (and (nnimap-request-article article group server)
+ (save-excursion
+ (set-buffer buf)
+ (buffer-disable-undo (current-buffer))
+ (insert-buffer-substring nntp-server-buffer)
+ (setq result (eval accept-form))
+ (kill-buffer buf)
+ result)
+ (nnimap-request-expire-articles (list article) group server t))
+ result))))
+
+(deffoo nnimap-request-accept-article (group &optional server last)
+ (when (nnimap-possibly-change-server server)
+ (let (uid)
+ (if (setq uid
+ (if (string= nnimap-current-server nnimap-current-move-server)
+ ;; moving article within same server, speed it up...
+ (and (nnimap-possibly-change-group
+ nnimap-current-move-group)
+ (imap-message-copy (number-to-string
+ nnimap-current-move-article)
+ group 'dontcreate nil
+ nnimap-server-buffer))
+ ;; turn into rfc822 format (\r\n eol's)
+ (with-current-buffer (current-buffer)
+ (goto-char (point-min))
+ (while (search-forward "\n" nil t)
+ (replace-match "\r\n")))
+ ;; this 'or' is for Cyrus server bug
+ (or (null (imap-current-mailbox nnimap-server-buffer))
+ (imap-mailbox-unselect nnimap-server-buffer))
+ (imap-message-append group (current-buffer) nil nil
+ nnimap-server-buffer)))
+ (cons group (nth 1 uid))
+ (nnheader-report 'nnimap (imap-error-text nnimap-server-buffer))))))
+
+(deffoo nnimap-request-delete-group (group force &optional server)
+ (when (nnimap-possibly-change-server server)
+ (with-current-buffer nnimap-server-buffer
+ (if force
+ (or (null (imap-mailbox-status group 'uidvalidity))
+ (imap-mailbox-delete group))
+ ;; UNSUBSCRIBE?
+ t))))
+
+(deffoo nnimap-request-rename-group (group new-name &optional server)
+ (when (nnimap-possibly-change-server server)
+ (imap-mailbox-rename group new-name nnimap-server-buffer)))
+
+(defun nnimap-expunge (mailbox server)
+ (when (nnimap-possibly-change-group mailbox server)
+ (imap-mailbox-expunge nnimap-server-buffer)))
+
+(defun nnimap-acl-get (mailbox server)
+ (when (nnimap-possibly-change-server server)
+ (imap-mailbox-acl-get mailbox nnimap-server-buffer)))
+
+(defun nnimap-acl-edit (mailbox method old-acls new-acls)
+ (when (nnimap-possibly-change-server (cadr method))
+ (unless (imap-capability 'ACL nnimap-server-buffer)
+ (error "Your server does not support ACL editing"))
+ (with-current-buffer nnimap-server-buffer
+ ;; delete all removed identifiers
+ (mapcar (lambda (old-acl)
+ (unless (assoc (car old-acl) new-acls)
+ (or (imap-mailbox-acl-delete (car old-acl) mailbox)
+ (error "Can't delete ACL for %s" (car old-acl)))))
+ old-acls)
+ ;; set all changed acl's
+ (mapcar (lambda (new-acl)
+ (let ((new-rights (cdr new-acl))
+ (old-rights (cdr (assoc (car new-acl) old-acls))))
+ (unless (and old-rights new-rights
+ (string= old-rights new-rights))
+ (or (imap-mailbox-acl-set (car new-acl) new-rights mailbox)
+ (error "Can't set ACL for %s to %s" (car new-acl)
+ new-rights)))))
+ new-acls)
+ t)))
+
+\f
+;;; Internal functions
+
+;;
+;; This is confusing.
+;;
+;; mark => read, tick, draft, reply etc
+;; flag => "\\Seen", "\\Flagged", "\\Draft", "gnus-expire" etc
+;; predicate => "SEEN", "FLAGGED", "DRAFT", "KEYWORD gnus-expire" etc
+;;
+;; Mark should not really contain 'read since it's not a "mark" in the Gnus
+;; world, but we cheat. Mark == gnus-article-mark-lists + '(read . read).
+;;
+
+(defconst nnimap-mark-to-predicate-alist
+ (mapcar
+ (lambda (pair) ; cdr is the mark
+ (or (assoc (cdr pair)
+ '((read . "SEEN")
+ (tick . "FLAGGED")
+ (draft . "DRAFT")
+ (reply . "ANSWERED")))
+ (cons (cdr pair)
+ (format "KEYWORD gnus-%s" (symbol-name (cdr pair))))))
+ (cons '(read . read) gnus-article-mark-lists)))
+
+(defun nnimap-mark-to-predicate (pred)
+ "Convert a Gnus mark (a symbol such as read, tick, expire) to a IMAP predicate.
+This is a string such as \"SEEN\", \"FLAGGED\", \"KEYWORD gnus-expire\",
+to be used within a IMAP SEARCH query."
+ (cdr (assq pred nnimap-mark-to-predicate-alist)))
+
+(defconst nnimap-mark-to-flag-alist
+ (mapcar
+ (lambda (pair)
+ (or (assoc (cdr pair)
+ '((read . "\\Seen")
+ (tick . "\\Flagged")
+ (draft . "\\Draft")
+ (reply . "\\Answered")))
+ (cons (cdr pair)
+ (format "gnus-%s" (symbol-name (cdr pair))))))
+ (cons '(read . read) gnus-article-mark-lists)))
+
+(defun nnimap-mark-to-flag-1 (preds)
+ (if (and (not (null preds)) (listp preds))
+ (cons (nnimap-mark-to-flag (car preds))
+ (nnimap-mark-to-flag (cdr preds)))
+ (cdr (assoc preds nnimap-mark-to-flag-alist))))
+
+(defun nnimap-mark-to-flag (preds &optional always-list make-string)
+ "Convert a Gnus mark (a symbol such as read, tick, expire) to a IMAP flag.
+This is a string such as \"\\Seen\", \"\\Flagged\", \"gnus-expire\", to
+be used in a STORE FLAGS command."
+ (let ((result (nnimap-mark-to-flag-1 preds)))
+ (setq result (if (and (or make-string always-list)
+ (not (listp result)))
+ (list result)
+ result))
+ (if make-string
+ (mapconcat (lambda (flag)
+ (if (listp flag)
+ (mapconcat 'identity flag " ")
+ flag))
+ result " ")
+ result)))
+
+(defun nnimap-mark-permanent-p (mark &optional group)
+ "Return t iff MARK can be permanently (between IMAP sessions) saved on articles, in GROUP."
+ (imap-message-flag-permanent-p (nnimap-mark-to-flag mark)))
+
+(defun nnimap-remassoc (key alist)
+ "Delete by side effect any elements of LIST whose car is `equal' to KEY.
+The modified LIST is returned. If the first member
+of LIST has a car that is `equal' to KEY, there is no way to remove it
+by side effect; therefore, write `(setq foo (remassoc key foo))' to be
+sure of changing the value of `foo'."
+ (when alist
+ (if (equal key (caar alist))
+ (cdr alist)
+ (setcdr alist (nnimap-remassoc key (cdr alist)))
+ alist)))
+
+(defun nnimap-update-alist-soft (key value alist)
+ (if value
+ (cons (cons key value) (nnimap-remassoc key alist))
+ (nnimap-remassoc key alist)))
+
+(when nnimap-debug
+ (require 'trace)
+ (buffer-disable-undo (get-buffer-create nnimap-debug))
+ (mapcar (lambda (f) (trace-function-background f nnimap-debug))
+ '(
+ nnimap-possibly-change-server
+ nnimap-verify-uidvalidity
+ nnimap-find-minmax-uid
+ nnimap-before-find-minmax-bugworkaround
+ nnimap-possibly-change-group
+ ;;nnimap-replace-whitespace
+ nnimap-retrieve-headers-progress
+ nnimap-retrieve-which-headers
+ nnimap-group-overview-filename
+ nnimap-retrieve-headers-from-file
+ nnimap-retrieve-headers-from-server
+ nnimap-retrieve-headers
+ nnimap-open-connection
+ nnimap-open-server
+ nnimap-server-opened
+ nnimap-close-server
+ nnimap-request-close
+ nnimap-status-message
+ ;;nnimap-demule
+ nnimap-request-article-part
+ nnimap-request-article
+ nnimap-request-head
+ nnimap-request-body
+ nnimap-request-group
+ nnimap-close-group
+ nnimap-pattern-to-list-arguments
+ nnimap-request-list
+ nnimap-request-post
+ nnimap-retrieve-groups
+ nnimap-request-update-info-internal
+ nnimap-request-type
+ nnimap-request-set-mark
+ nnimap-split-to-groups
+ nnimap-split-find-rule
+ nnimap-split-find-inbox
+ nnimap-split-articles
+ nnimap-request-scan
+ nnimap-request-newgroups
+ nnimap-request-create-group
+ nnimap-time-substract
+ nnimap-date-days-ago
+ nnimap-request-expire-articles-progress
+ nnimap-request-expire-articles
+ nnimap-request-move-article
+ nnimap-request-accept-article
+ nnimap-request-delete-group
+ nnimap-request-rename-group
+ gnus-group-nnimap-expunge
+ gnus-group-nnimap-edit-acl
+ gnus-group-nnimap-edit-acl-done
+ nnimap-group-mode-hook
+ nnimap-mark-to-predicate
+ nnimap-mark-to-flag-1
+ nnimap-mark-to-flag
+ nnimap-mark-permanent-p
+ nnimap-remassoc
+ nnimap-update-alist-soft
+ )))
+
+(provide 'nnimap)
+
+;;; nnimap.el ends here
--- /dev/null
+;;; nnslashdot.el --- interfacing with Slashdot
+;; Copyright (C) 1999, 2000 Free Software Foundation, Inc.
+
+;; Author: Lars Magne Ingebrigtsen <larsi@gnus.org>
+;; Keywords: news
+
+;; This file is part of GNU Emacs.
+
+;; GNU Emacs 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 Emacs 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 Emacs; see the file COPYING. If not, write to the
+;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;; Boston, MA 02111-1307, USA.
+
+;;; Commentary:
+
+;; Note: You need to have `url' and `w3' installed for this
+;; backend to work.
+
+;;; Code:
+
+(eval-when-compile (require 'cl))
+
+(require 'nnoo)
+(require 'message)
+(require 'gnus-util)
+(require 'gnus)
+(require 'nnmail)
+(require 'mm-util)
+(eval-when-compile
+ (ignore-errors
+ (require 'nnweb)))
+;; Report failure to find w3 at load time if appropriate.
+(eval '(require 'nnweb))
+
+(nnoo-declare nnslashdot)
+
+(defvoo nnslashdot-directory (nnheader-concat gnus-directory "slashdot/")
+ "Where nnslashdot will save its files.")
+
+(defvoo nnslashdot-active-url "http://slashdot.org/search.pl?section=&min=%d"
+ "Where nnslashdot will fetch the active file from.")
+
+(defvoo nnslashdot-comments-url "http://slashdot.org/comments.pl?sid=%s&threshold=%d&commentsort=%d&mode=flat&startat=%d"
+ "Where nnslashdot will fetch comments from.")
+
+(defvoo nnslashdot-article-url
+ "http://slashdot.org/article.pl?sid=%s&mode=nocomment"
+ "Where nnslashdot will fetch the article from.")
+
+(defvoo nnslashdot-threshold -1
+ "The article threshold.")
+
+(defvoo nnslashdot-threaded t
+ "Whether the nnslashdot groups should be threaded or not.")
+
+(defvoo nnslashdot-group-number 0
+ "The number of non-fresh groups to keep updated.")
+
+(defvoo nnslashdot-login-name ""
+ "The login name to use when posting.")
+
+(defvoo nnslashdot-password ""
+ "The password to use when posting.")
+
+;;; Internal variables
+
+(defvar nnslashdot-groups nil)
+(defvar nnslashdot-buffer nil)
+(defvar nnslashdot-headers nil)
+
+;;; Interface functions
+
+(nnoo-define-basics nnslashdot)
+
+(deffoo nnslashdot-retrieve-headers (articles &optional group server fetch-old)
+ (nnslashdot-possibly-change-server group server)
+ (condition-case why
+ (unless gnus-nov-is-evil
+ (if nnslashdot-threaded
+ (nnslashdot-threaded-retrieve-headers articles group)
+ (nnslashdot-sane-retrieve-headers articles group)))
+ (search-failed (nnslashdot-lose why))))
+
+(deffoo nnslashdot-threaded-retrieve-headers (articles group)
+ (let ((last (car (last articles)))
+ (did nil)
+ (start 1)
+ (sid (caddr (assoc group nnslashdot-groups)))
+ (first-comments t)
+ (startats '(1))
+ headers article subject score from date lines parent point s)
+ (save-excursion
+ (set-buffer nnslashdot-buffer)
+ (let ((case-fold-search t))
+ (erase-buffer)
+ (when (= start 1)
+ (nnweb-insert (format nnslashdot-article-url
+ (nnslashdot-sid-strip sid)) t)
+ (goto-char (point-min))
+ (search-forward "Posted by ")
+ (when (looking-at "<a[^>]+>\\([^<]+\\)")
+ (setq from (nnweb-decode-entities-string (match-string 1))))
+ (search-forward " on ")
+ (setq date (nnslashdot-date-to-date
+ (buffer-substring (point) (1- (search-forward "<")))))
+ (setq lines (/ (- (point)
+ (progn (forward-line 1) (point)))
+ 60))
+ (push
+ (cons
+ 1
+ (make-full-mail-header
+ 1 group from date
+ (concat "<" (nnslashdot-sid-strip sid) "%1@slashdot>")
+ "" 0 lines nil nil))
+ headers))
+ (while (and (setq start (pop startats))
+ (< start last))
+ (setq point (goto-char (point-max)))
+ (nnweb-insert
+ (format nnslashdot-comments-url
+ (nnslashdot-sid-strip sid)
+ nnslashdot-threshold 0 start)
+ t)
+ (when first-comments
+ (setq first-comments nil)
+ (goto-char (point-max))
+ (while (re-search-backward "startat=\\([0-9]+\\)" nil t)
+ (setq s (string-to-number (match-string 1)))
+ (unless (memq s startats)
+ (push s startats)))
+ (setq startats (sort startats '<)))
+ (goto-char point)
+ (while (re-search-forward
+ "<a name=\"\\([0-9]+\\)\"><\\(b\\|H4\\)>\\([^<]+\\)</\\(b\\|H4\\)>.*score:\\([^)]+\\))"
+ nil t)
+ (setq article (string-to-number (match-string 1))
+ subject (match-string 3)
+ score (match-string 5))
+ (when (string-match "^Re: *" subject)
+ (setq subject (concat "Re: " (substring subject (match-end 0)))))
+ (setq subject (nnweb-decode-entities-string subject))
+ (forward-line 1)
+ (if (looking-at
+ "by <a[^>]+>\\([^<]+\\)</a>[ \t\n]*.*(\\([^)]+\\))")
+ (progn
+ (goto-char (- (match-end 0) 5))
+ (setq from (concat
+ (nnweb-decode-entities-string (match-string 1))
+ " <" (match-string 2) ">")))
+ (setq from "")
+ (when (looking-at "by \\(.+\\) on ")
+ (goto-char (- (match-end 0) 5))
+ (setq from (nnweb-decode-entities-string (match-string 1)))))
+ (search-forward " on ")
+ (setq date
+ (nnslashdot-date-to-date
+ (buffer-substring (point) (progn (end-of-line) (point)))))
+ (setq lines (/ (abs (- (search-forward "<td ")
+ (search-forward "</td>")))
+ 70))
+ (forward-line 4)
+ (setq parent
+ (if (looking-at ".*cid=\\([0-9]+\\)")
+ (match-string 1)
+ nil))
+ (setq did t)
+ (push
+ (cons
+ (1+ article)
+ (make-full-mail-header
+ (1+ article)
+ (concat subject " (" score ")")
+ from date
+ (concat "<" (nnslashdot-sid-strip sid) "%"
+ (number-to-string (1+ article))
+ "@slashdot>")
+ (if parent
+ (concat "<" (nnslashdot-sid-strip sid) "%"
+ (number-to-string (1+ (string-to-number parent)))
+ "@slashdot>")
+ "")
+ 0 lines nil nil))
+ headers)))))
+ (setq nnslashdot-headers (sort headers 'car-less-than-car))
+ (save-excursion
+ (set-buffer nntp-server-buffer)
+ (erase-buffer)
+ (mm-with-unibyte-current-buffer
+ (dolist (header nnslashdot-headers)
+ (nnheader-insert-nov (cdr header)))))
+ 'nov))
+
+(deffoo nnslashdot-sane-retrieve-headers (articles group)
+ (let ((last (car (last articles)))
+ (did nil)
+ (start (max (1- (car articles)) 1))
+ (sid (caddr (assoc group nnslashdot-groups)))
+ headers article subject score from date lines parent point)
+ (save-excursion
+ (set-buffer nnslashdot-buffer)
+ (erase-buffer)
+ (when (= start 1)
+ (nnweb-insert (format nnslashdot-article-url
+ (nnslashdot-sid-strip sid)) t)
+ (goto-char (point-min))
+ (search-forward "Posted by ")
+ (when (looking-at "<a[^>]+>\\([^<]+\\)")
+ (setq from (nnweb-decode-entities-string (match-string 1))))
+ (search-forward " on ")
+ (setq date (nnslashdot-date-to-date
+ (buffer-substring (point) (1- (search-forward "<")))))
+ (forward-line 2)
+ (setq lines (count-lines (point)
+ (re-search-forward
+ "A href=\"\\(http://slashdot.org\\)?/article")))
+ (push
+ (cons
+ 1
+ (make-full-mail-header
+ 1 group from date (concat "<" (nnslashdot-sid-strip sid)
+ "%1@slashdot>")
+ "" 0 lines nil nil))
+ headers))
+ (while (or (not article)
+ (and did
+ (< article last)))
+ (when article
+ (setq start (1+ article)))
+ (setq point (goto-char (point-max)))
+ (nnweb-insert
+ (format nnslashdot-comments-url (nnslashdot-sid-strip sid)
+ nnslashdot-threshold 4 start)
+ t)
+ (goto-char point)
+ (while (re-search-forward
+ "<a name=\"\\([0-9]+\\)\"><\\(b\\|H4\\)>\\([^<]+\\)</\\(b\\|H4\\)>.*score:\\([^)]+\\))"
+ nil t)
+ (setq article (string-to-number (match-string 1))
+ subject (match-string 3)
+ score (match-string 5))
+ (when (string-match "^Re: *" subject)
+ (setq subject (concat "Re: " (substring subject (match-end 0)))))
+ (setq subject (nnweb-decode-entities-string subject))
+ (forward-line 1)
+ (if (looking-at
+ "by <a[^>]+>\\([^<]+\\)</a>[ \t\n]*.*(\\([^)]+\\))")
+ (progn
+ (goto-char (- (match-end 0) 5))
+ (setq from (concat
+ (nnweb-decode-entities-string (match-string 1))
+ " <" (match-string 2) ">")))
+ (setq from "")
+ (when (looking-at "by \\(.+\\) on ")
+ (goto-char (- (match-end 0) 5))
+ (setq from (nnweb-decode-entities-string (match-string 1)))))
+ (search-forward " on ")
+ (setq date
+ (nnslashdot-date-to-date
+ (buffer-substring (point) (progn (end-of-line) (point)))))
+ (setq lines (/ (abs (- (search-forward "<td ")
+ (search-forward "</td>")))
+ 70))
+ (forward-line 2)
+ (setq parent
+ (if (looking-at ".*cid=\\([0-9]+\\)")
+ (match-string 1)
+ nil))
+ (setq did t)
+ (push
+ (cons
+ (1+ article)
+ (make-full-mail-header
+ (1+ article) (concat subject " (" score ")")
+ from date
+ (concat "<" (nnslashdot-sid-strip sid) "%"
+ (number-to-string (1+ article))
+ "@slashdot>")
+ (if parent
+ (concat "<" (nnslashdot-sid-strip sid) "%"
+ (number-to-string (1+ (string-to-number parent)))
+ "@slashdot>")
+ "")
+ 0 lines nil nil))
+ headers))))
+ (setq nnslashdot-headers
+ (sort headers (lambda (s1 s2) (< (car s1) (car s2)))))
+ (save-excursion
+ (set-buffer nntp-server-buffer)
+ (erase-buffer)
+ (mm-with-unibyte-current-buffer
+ (dolist (header nnslashdot-headers)
+ (nnheader-insert-nov (cdr header)))))
+ 'nov))
+
+(deffoo nnslashdot-request-group (group &optional server dont-check)
+ (nnslashdot-possibly-change-server nil server)
+ (let ((elem (assoc group nnslashdot-groups)))
+ (cond
+ ((not elem)
+ (nnheader-report 'nnslashdot "Group does not exist"))
+ (t
+ (nnheader-report 'nnslashdot "Opened group %s" group)
+ (nnheader-insert
+ "211 %d %d %d %s\n" (cadr elem) 1 (cadr elem)
+ (prin1-to-string group))))))
+
+(deffoo nnslashdot-close-group (group &optional server)
+ (nnslashdot-possibly-change-server group server)
+ (when (gnus-buffer-live-p nnslashdot-buffer)
+ (save-excursion
+ (set-buffer nnslashdot-buffer)
+ (kill-buffer nnslashdot-buffer)))
+ t)
+
+(deffoo nnslashdot-request-article (article &optional group server buffer)
+ (nnslashdot-possibly-change-server group server)
+ (let (contents)
+ (condition-case why
+ (save-excursion
+ (set-buffer nnslashdot-buffer)
+ (let ((case-fold-search t))
+ (goto-char (point-min))
+ (when (and (stringp article)
+ (string-match "%\\([0-9]+\\)@" article))
+ (setq article (string-to-number (match-string 1 article))))
+ (when (numberp article)
+ (if (= article 1)
+ (progn
+ (re-search-forward "Posted by *<[^>]+>[^>]*<[^>]+> *on ")
+ (search-forward "<BR>")
+ (setq contents
+ (buffer-substring
+ (point)
+ (progn
+ (re-search-forward
+ "<p>.*A href=\"\\(http://slashdot.org\\)?/article")
+ (match-beginning 0)))))
+ (search-forward (format "<a name=\"%d\">" (1- article)))
+ (setq contents
+ (buffer-substring
+ (re-search-forward "<td[^>]+>")
+ (search-forward "</td>")))))))
+ (search-failed (nnslashdot-lose why)))
+
+ (when contents
+ (save-excursion
+ (set-buffer (or buffer nntp-server-buffer))
+ (erase-buffer)
+ (mm-with-unibyte-current-buffer
+ (insert contents)
+ (goto-char (point-min))
+ (while (re-search-forward "\\(<br>\r?\\)+" nil t)
+ (replace-match "<p>" t t))
+ (goto-char (point-min))
+ (insert "Content-Type: text/html\nMIME-Version: 1.0\n")
+ (insert "Newsgroups: " (caddr (assoc group nnslashdot-groups))
+ "\n")
+ (let ((header (cdr (assq article nnslashdot-headers))))
+ (nnheader-insert-header header))
+ (nnheader-report 'nnslashdot "Fetched article %s" article))
+ (cons group article)))))
+
+(deffoo nnslashdot-close-server (&optional server)
+ (when (and (nnslashdot-server-opened server)
+ (gnus-buffer-live-p nnslashdot-buffer))
+ (save-excursion
+ (set-buffer nnslashdot-buffer)
+ (kill-buffer nnslashdot-buffer)))
+ (nnoo-close-server 'nnslashdot server))
+
+(deffoo nnslashdot-request-list (&optional server)
+ (nnslashdot-possibly-change-server nil server)
+ (let ((number 0)
+ sid elem description articles gname)
+ (condition-case why
+ ;; First we do the Ultramode to get info on all the latest groups.
+ (progn
+ (mm-with-unibyte-buffer
+ (nnweb-insert "http://slashdot.org/slashdot.xml" t)
+ (goto-char (point-min))
+ (while (search-forward "<story>" nil t)
+ (narrow-to-region (point) (search-forward "</story>"))
+ (goto-char (point-min))
+ (re-search-forward "<title>\\([^<]+\\)</title>")
+ (setq description
+ (nnweb-decode-entities-string (match-string 1)))
+ (re-search-forward "<url>\\([^<]+\\)</url>")
+ (setq sid (match-string 1))
+ (string-match "/\\([0-9/]+\\)\\(.shtml\\|$\\)" sid)
+ (setq sid (concat "00/" (match-string 1 sid)))
+ (re-search-forward "<comments>\\([^<]+\\)</comments>")
+ (setq articles (string-to-number (match-string 1)))
+ (setq gname (concat description " (" sid ")"))
+ (if (setq elem (assoc gname nnslashdot-groups))
+ (setcar (cdr elem) articles)
+ (push (list gname articles sid) nnslashdot-groups))
+ (goto-char (point-max))
+ (widen)))
+ ;; Then do the older groups.
+ (while (> (- nnslashdot-group-number number) 0)
+ (mm-with-unibyte-buffer
+ (let ((case-fold-search t))
+ (nnweb-insert (format nnslashdot-active-url number) t)
+ (goto-char (point-min))
+ (while (re-search-forward
+ "article.pl\\?sid=\\([^&]+\\).*<b>\\([^<]+\\)</b>"
+ nil t)
+ (setq sid (match-string 1)
+ description
+ (nnweb-decode-entities-string (match-string 2)))
+ (forward-line 1)
+ (when (re-search-forward "<b>\\([0-9]+\\)</b>" nil t)
+ (setq articles (string-to-number (match-string 1))))
+ (setq gname (concat description " (" sid ")"))
+ (if (setq elem (assoc gname nnslashdot-groups))
+ (setcar (cdr elem) articles)
+ (push (list gname articles sid) nnslashdot-groups)))))
+ (incf number 30)))
+ (search-failed (nnslashdot-lose why)))
+ (nnslashdot-write-groups)
+ (nnslashdot-generate-active)
+ t))
+
+(deffoo nnslashdot-request-newgroups (date &optional server)
+ (nnslashdot-possibly-change-server nil server)
+ (nnslashdot-generate-active)
+ t)
+
+(deffoo nnslashdot-request-post (&optional server)
+ (nnslashdot-possibly-change-server nil server)
+ (let ((sid (nnslashdot-sid-strip (message-fetch-field "newsgroups")))
+ (subject (message-fetch-field "subject"))
+ (references (car (last (split-string
+ (message-fetch-field "references")))))
+ body quoted pid)
+ (string-match "%\\([0-9]+\\)@slashdot" references)
+ (setq pid (match-string 1 references))
+ (message-goto-body)
+ (narrow-to-region (point) (progn (message-goto-signature) (point)))
+ (goto-char (point-min))
+ (while (not (eobp))
+ (if (looking-at "> ")
+ (progn
+ (delete-region (point) (+ (point) 2))
+ (unless quoted
+ (insert "<blockquote>\n"))
+ (setq quoted t))
+ (when quoted
+ (insert "</blockquote>\n")
+ (setq quoted nil)))
+ (forward-line 1))
+ (goto-char (point-min))
+ (while (re-search-forward "^ *\n" nil t)
+ (replace-match "<p>\n"))
+ (widen)
+ (when (message-goto-signature)
+ (forward-line -1)
+ (insert "<p>\n")
+ (while (not (eobp))
+ (end-of-line)
+ (insert "<br>")
+ (forward-line 1)))
+ (message-goto-body)
+ (setq body (buffer-substring (point) (point-max)))
+ (erase-buffer)
+ (nnweb-fetch-form
+ "http://slashdot.org/comments.pl"
+ `(("sid" . ,sid)
+ ("pid" . ,pid)
+ ("rlogin" . "userlogin")
+ ("unickname" . ,nnslashdot-login-name)
+ ("upasswd" . ,nnslashdot-password)
+ ("postersubj" . ,subject)
+ ("op" . "Submit")
+ ("postercomment" . ,body)
+ ("posttype" . "html")))))
+
+(deffoo nnslashdot-request-delete-group (group &optional force server)
+ (nnslashdot-possibly-change-server group server)
+ (setq nnslashdot-groups (delq (assoc group nnslashdot-groups)
+ nnslashdot-groups))
+ (nnslashdot-write-groups))
+
+(deffoo nnslashdot-request-close ()
+ (setq nnslashdot-headers nil
+ nnslashdot-groups nil))
+
+(nnoo-define-skeleton nnslashdot)
+
+;;; Internal functions
+
+(defun nnslashdot-possibly-change-server (&optional group server)
+ (nnslashdot-init server)
+ (when (and server
+ (not (nnslashdot-server-opened server)))
+ (nnslashdot-open-server server))
+ (unless nnslashdot-groups
+ (nnslashdot-read-groups)))
+
+(defun nnslashdot-read-groups ()
+ (let ((file (expand-file-name "groups" nnslashdot-directory)))
+ (when (file-exists-p file)
+ (mm-with-unibyte-buffer
+ (insert-file-contents file)
+ (goto-char (point-min))
+ (setq nnslashdot-groups (read (current-buffer)))))))
+
+(defun nnslashdot-write-groups ()
+ (with-temp-file (expand-file-name "groups" nnslashdot-directory)
+ (prin1 nnslashdot-groups (current-buffer))))
+
+(defun nnslashdot-init (server)
+ "Initialize buffers and such."
+ (unless (file-exists-p nnslashdot-directory)
+ (gnus-make-directory nnslashdot-directory))
+ (unless (gnus-buffer-live-p nnslashdot-buffer)
+ (setq nnslashdot-buffer
+ (save-excursion
+ (nnheader-set-temp-buffer
+ (format " *nnslashdot %s*" server))))))
+
+(defun nnslashdot-date-to-date (sdate)
+ (condition-case err
+ (let ((elem (delete "" (split-string sdate))))
+ (concat (substring (nth 0 elem) 0 3) " "
+ (substring (nth 1 elem) 0 3) " "
+ (substring (nth 2 elem) 0 2) " "
+ (substring (nth 3 elem) 1 6) " "
+ (format-time-string "%Y") " "
+ (nth 4 elem)))
+ (error "")))
+
+(defun nnslashdot-generate-active ()
+ (save-excursion
+ (set-buffer nntp-server-buffer)
+ (erase-buffer)
+ (dolist (elem nnslashdot-groups)
+ (insert (prin1-to-string (car elem))
+ " " (number-to-string (cadr elem)) " 1 y\n"))))
+
+(defun nnslashdot-lose (why)
+ (error "Slashdot HTML has changed; please get a new version of nnslashdot"))
+
+;(defun nnslashdot-sid-strip (sid)
+; (if (string-match "^00/" sid)
+; (substring sid (match-end 0))
+; sid))
+
+(defalias 'nnslashdot-sid-strip 'identity)
+
+(provide 'nnslashdot)
+
+;;; nnslashdot.el ends here
--- /dev/null
+;;; nnultimate.el --- interfacing with the Ultimate Bulletin Board system
+;; Copyright (C) 1999, 2000 Free Software Foundation, Inc.
+
+;; Author: Lars Magne Ingebrigtsen <larsi@gnus.org>
+;; Keywords: news
+
+;; This file is part of GNU Emacs.
+
+;; GNU Emacs 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 Emacs 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 Emacs; see the file COPYING. If not, write to the
+;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;; Boston, MA 02111-1307, USA.
+
+;;; Commentary:
+
+;; Note: You need to have `url' and `w3' installed for this
+;; backend to work.
+
+;;; Code:
+
+(eval-when-compile (require 'cl))
+
+(require 'nnoo)
+(require 'message)
+(require 'gnus-util)
+(require 'gnus)
+(require 'nnmail)
+(require 'mm-util)
+(eval-when-compile
+ (ignore-errors
+ (require 'nnweb)))
+;; Report failure to find w3 at load time if appropriate.
+(eval '(require 'nnweb))
+
+(nnoo-declare nnultimate)
+
+(defvoo nnultimate-directory (nnheader-concat gnus-directory "ultimate/")
+ "Where nnultimate will save its files.")
+
+(defvoo nnultimate-address ""
+ "The address of the Ultimate bulletin board.")
+
+;;; Internal variables
+
+(defvar nnultimate-groups-alist nil)
+(defvoo nnultimate-groups nil)
+(defvoo nnultimate-headers nil)
+(defvoo nnultimate-articles nil)
+
+;;; Interface functions
+
+(nnoo-define-basics nnultimate)
+
+(deffoo nnultimate-retrieve-headers (articles &optional group server fetch-old)
+ (nnultimate-possibly-change-server group server)
+ (unless gnus-nov-is-evil
+ (let* ((last (car (last articles)))
+ (did nil)
+ (start 1)
+ (entry (assoc group nnultimate-groups))
+ (sid (nth 2 entry))
+ (topics (nth 4 entry))
+ (mapping (nth 5 entry))
+ (old-total (or (nth 6 entry) 1))
+ (furl "forumdisplay.cgi?action=topics&number=%d&DaysPrune=1000")
+ (furls (list (concat nnultimate-address (format furl sid))))
+ headers article subject score from date lines parent point
+ contents tinfo fetchers map elem a href garticles topic old-max
+ inc datel table string current-page total-contents pages
+ farticles forum-contents parse furl-fetched mmap farticle)
+ (setq map mapping)
+ (while (and (setq article (car articles))
+ map)
+ (while (and map
+ (or (> article (caar map))
+ (< (cadar map) (caar map))))
+ (pop map))
+ (when (setq mmap (car map))
+ (setq farticle -1)
+ (while (and article
+ (<= article (nth 1 mmap)))
+ ;; Do we already have a fetcher for this topic?
+ (if (setq elem (assq (nth 2 mmap) fetchers))
+ ;; Yes, so we just add the spec to the end.
+ (nconc elem (list (cons article
+ (+ (nth 3 mmap) (incf farticle)))))
+ ;; No, so we add a new one.
+ (push (list (nth 2 mmap)
+ (cons article
+ (+ (nth 3 mmap) (incf farticle))))
+ fetchers))
+ (pop articles)
+ (setq article (car articles)))))
+ ;; Now we have the mapping from/to Gnus/nnultimate article numbers,
+ ;; so we start fetching the topics that we need to satisfy the
+ ;; request.
+ (if (not fetchers)
+ (save-excursion
+ (set-buffer nntp-server-buffer)
+ (erase-buffer))
+ (setq nnultimate-articles nil)
+ (mm-with-unibyte-buffer
+ (dolist (elem fetchers)
+ (setq pages 1
+ current-page 1
+ total-contents nil)
+ (while (<= current-page pages)
+ (erase-buffer)
+ (setq subject (nth 2 (assq (car elem) topics)))
+ (setq href (nth 3 (assq (car elem) topics)))
+ (if (= current-page 1)
+ (nnweb-insert href)
+ (string-match "\\.html$" href)
+ (nnweb-insert (concat (substring href 0 (match-beginning 0))
+ "-" (number-to-string current-page)
+ (match-string 0 href))))
+ (goto-char (point-min))
+ (setq contents
+ (ignore-errors (w3-parse-buffer (current-buffer))))
+ (setq table (nnultimate-find-forum-table contents))
+ (setq string (mapconcat 'identity (nnweb-text table) ""))
+ (when (string-match "topic is \\([0-9]\\) pages" string)
+ (setq pages (string-to-number (match-string 1 string)))
+ (setcdr table nil)
+ (setq table (nnultimate-find-forum-table contents)))
+ (setq contents (cdr (nth 2 (car (nth 2 table)))))
+ (setq total-contents (nconc total-contents contents))
+ (incf current-page))
+ ;;(setq total-contents (nreverse total-contents))
+ (dolist (art (cdr elem))
+ (if (not (nth (1- (cdr art)) total-contents))
+ () ;(debug)
+ (push (list (car art)
+ (nth (1- (cdr art)) total-contents)
+ subject)
+ nnultimate-articles)))))
+ (setq nnultimate-articles
+ (sort nnultimate-articles 'car-less-than-car))
+ ;; Now we have all the articles, conveniently in an alist
+ ;; where the key is the Gnus article number.
+ (dolist (articlef nnultimate-articles)
+ (setq article (nth 0 articlef)
+ contents (nth 1 articlef)
+ subject (nth 2 articlef))
+ (setq from (mapconcat 'identity
+ (nnweb-text (car (nth 2 contents)))
+ " ")
+ datel (nnweb-text (nth 2 (car (cdr (nth 2 contents))))))
+ (while datel
+ (when (string-match "Posted" (car datel))
+ (setq date (substring (car datel) (match-end 0))
+ datel nil))
+ (pop datel))
+ (setq date (delete "" (split-string date "[- \n\t\r    ]")))
+ (if (or (member "AM" date)
+ (member "PM" date))
+ (setq date (format "%s %s %s %s"
+ (car (rassq (string-to-number (nth 0 date))
+ parse-time-months))
+ (nth 1 date) (nth 2 date) (nth 3 date)))
+ (setq date (format "%s %s %s %s"
+ (car (rassq (string-to-number (nth 1 date))
+ parse-time-months))
+ (nth 0 date) (nth 2 date) (nth 3 date))))
+ (push
+ (cons
+ article
+ (make-full-mail-header
+ article subject
+ from (or date "")
+ (concat "<" (number-to-string sid) "%"
+ (number-to-string article)
+ "@ultimate>")
+ "" 0
+ (/ (length (mapconcat
+ 'identity
+ (nnweb-text
+ (cdr (nth 2 (nth 1 (nth 2 contents)))))
+ ""))
+ 70)
+ nil nil))
+ headers))
+ (setq nnultimate-headers (sort headers 'car-less-than-car))
+ (save-excursion
+ (set-buffer nntp-server-buffer)
+ (mm-with-unibyte-current-buffer
+ (erase-buffer)
+ (dolist (header nnultimate-headers)
+ (nnheader-insert-nov (cdr header))))))
+ 'nov)))
+
+(deffoo nnultimate-request-group (group &optional server dont-check)
+ (nnultimate-possibly-change-server nil server)
+ (when (not nnultimate-groups)
+ (nnultimate-request-list))
+ (unless dont-check
+ (nnultimate-create-mapping group))
+ (let ((elem (assoc group nnultimate-groups)))
+ (cond
+ ((not elem)
+ (nnheader-report 'nnultimate "Group does not exist"))
+ (t
+ (nnheader-report 'nnultimate "Opened group %s" group)
+ (nnheader-insert
+ "211 %d %d %d %s\n" (cadr elem) 1 (cadr elem)
+ (prin1-to-string group))))))
+
+(deffoo nnultimate-request-close ()
+ (setq nnultimate-groups-alist nil
+ nnultimate-groups nil))
+
+(deffoo nnultimate-request-article (article &optional group server buffer)
+ (nnultimate-possibly-change-server group server)
+ (let ((contents (cdr (assq article nnultimate-articles))))
+ (setq contents (cddr (nth 2 (nth 1 (nth 2 (car contents))))))
+ (when contents
+ (save-excursion
+ (set-buffer (or buffer nntp-server-buffer))
+ (erase-buffer)
+ (nnweb-insert-html (cons 'p (cons nil (list contents))))
+ (goto-char (point-min))
+ (insert "Content-Type: text/html\nMIME-Version: 1.0\n")
+ (let ((header (cdr (assq article nnultimate-headers))))
+ (mm-with-unibyte-current-buffer
+ (nnheader-insert-header header)))
+ (nnheader-report 'nnultimate "Fetched article %s" article)
+ (cons group article)))))
+
+(deffoo nnultimate-request-list (&optional server)
+ (nnultimate-possibly-change-server nil server)
+ (mm-with-unibyte-buffer
+ (nnweb-insert
+ (if (string-match "/$" nnultimate-address)
+ (concat nnultimate-address "Ultimate.cgi")
+ nnultimate-address))
+ (let ((contents (nth 2 (car (nth 2
+ (nnultimate-find-forum-table
+ (w3-parse-buffer (current-buffer)))))))
+ sid elem description articles a href group forum
+ a1 a2)
+ (dolist (row contents)
+ (setq row (nth 2 row))
+ (when (setq a (nnweb-parse-find 'a row))
+ (setq group (car (last (nnweb-text a)))
+ href (cdr (assq 'href (nth 1 a))))
+ (setq description (car (last (nnweb-text (nth 1 row)))))
+ (setq a1 (car (last (nnweb-text (nth 2 row)))))
+ (setq a2 (car (last (nnweb-text (nth 3 row)))))
+ (when (string-match "^[0-9]+$" a1)
+ (setq articles (string-to-number a1)))
+ (when (and a2 (string-match "^[0-9]+$" a2))
+ (setq articles (max articles (string-to-number a2))))
+ (when href
+ (string-match "number=\\([0-9]+\\)" href)
+ (setq forum (string-to-number (match-string 1 href)))
+ (if (setq elem (assoc group nnultimate-groups))
+ (setcar (cdr elem) articles)
+ (push (list group articles forum description nil nil nil nil)
+ nnultimate-groups))))))
+ (nnultimate-write-groups)
+ (nnultimate-generate-active)
+ t))
+
+(deffoo nnultimate-request-newgroups (date &optional server)
+ (nnultimate-possibly-change-server nil server)
+ (nnultimate-generate-active)
+ t)
+
+(nnoo-define-skeleton nnultimate)
+
+;;; Internal functions
+
+(defun nnultimate-prune-days (group time)
+ "Compute the number of days to fetch info for."
+ (let ((old-time (nth 7 (assoc group nnultimate-groups))))
+ (if (null old-time)
+ 1000
+ (- (time-to-days time) (time-to-days old-time)))))
+
+(defun nnultimate-create-mapping (group)
+ (let* ((entry (assoc group nnultimate-groups))
+ (sid (nth 2 entry))
+ (topics (nth 4 entry))
+ (mapping (nth 5 entry))
+ (old-total (or (nth 6 entry) 1))
+ (current-time (current-time))
+ (furl
+ (concat "forumdisplay.cgi?action=topics&number=%d&DaysPrune="
+ (number-to-string
+ (nnultimate-prune-days group current-time))))
+ (furls (list (concat nnultimate-address (format furl sid))))
+ contents forum-contents furl-fetched a subject href
+ garticles topic tinfo old-max inc parse)
+ (mm-with-unibyte-buffer
+ (while furls
+ (erase-buffer)
+ (nnweb-insert (pop furls))
+ (goto-char (point-min))
+ (setq parse (w3-parse-buffer (current-buffer)))
+ (setq contents
+ (cdr (nth 2 (car (nth 2 (nnultimate-find-forum-table
+ parse))))))
+ (setq forum-contents (nconc contents forum-contents))
+ (unless furl-fetched
+ (setq furl-fetched t)
+ ;; On the first time through this loop, we find all the
+ ;; forum URLs.
+ (dolist (a (nnweb-parse-find-all 'a parse))
+ (let ((href (cdr (assq 'href (nth 1 a)))))
+ (when (and href
+ (string-match "forumdisplay.*startpoint" href))
+ (push href furls))))
+ (setq furls (nreverse furls))))
+ ;; The main idea here is to map Gnus article numbers to
+ ;; nnultimate article numbers. Say there are three topics in
+ ;; this forum, the first with 4 articles, the seconds with 2,
+ ;; and the third with 1. Then this will translate into 7 Gnus
+ ;; article numbers, where 1-4 comes from the first topic, 5-6
+ ;; from the second and 7 from the third. Now, then next time
+ ;; the group is entered, there's 2 new articles in topic one
+ ;; and 1 in topic three. Then Gnus article number 8-9 be 5-6
+ ;; in topic one and 10 will be the 2 in topic three.
+ (dolist (row (reverse forum-contents))
+ (setq row (nth 2 row))
+ (when (setq a (nnweb-parse-find 'a row))
+ (setq subject (car (last (nnweb-text a)))
+ href (cdr (assq 'href (nth 1 a))))
+ (let ((artlist (nreverse (nnweb-text row)))
+ art)
+ (while (and (not art)
+ artlist)
+ (when (string-match "^[0-9]+$" (car artlist))
+ (setq art (1+ (string-to-number (car artlist)))))
+ (pop artlist))
+ (setq garticles art))
+ (when garticles
+ (string-match "/\\([0-9]+\\).html" href)
+ (setq topic (string-to-number (match-string 1 href)))
+ (if (setq tinfo (assq topic topics))
+ (progn
+ (setq old-max (cadr tinfo))
+ (setcar (cdr tinfo) garticles))
+ (setq old-max 0)
+ (push (list topic garticles subject href) topics)
+ (setcar (nthcdr 4 entry) topics))
+ (when (not (= old-max garticles))
+ (setq inc (- garticles old-max))
+ (setq mapping (nconc mapping
+ (list
+ (list
+ old-total (1- (incf old-total inc))
+ topic (1+ old-max)))))
+ (incf old-max inc)
+ (setcar (nthcdr 5 entry) mapping)
+ (setcar (nthcdr 6 entry) old-total))))))
+ (setcar (nthcdr 7 entry) current-time)
+ (setcar (nthcdr 1 entry) (1- old-total))
+ (nnultimate-write-groups)
+ mapping))
+
+(defun nnultimate-possibly-change-server (&optional group server)
+ (nnultimate-init server)
+ (when (and server
+ (not (nnultimate-server-opened server)))
+ (nnultimate-open-server server))
+ (unless nnultimate-groups-alist
+ (nnultimate-read-groups)
+ (setq nnultimate-groups (cdr (assoc nnultimate-address
+ nnultimate-groups-alist)))))
+
+(deffoo nnultimate-open-server (server &optional defs connectionless)
+ (nnheader-init-server-buffer)
+ (if (nnultimate-server-opened server)
+ t
+ (unless (assq 'nnultimate-address defs)
+ (setq defs (append defs (list (list 'nnultimate-address server)))))
+ (nnoo-change-server 'nnultimate server defs)))
+
+(defun nnultimate-read-groups ()
+ (setq nnultimate-groups-alist nil)
+ (let ((file (expand-file-name "groups" nnultimate-directory)))
+ (when (file-exists-p file)
+ (mm-with-unibyte-buffer
+ (insert-file-contents file)
+ (goto-char (point-min))
+ (setq nnultimate-groups-alist (read (current-buffer)))))))
+
+(defun nnultimate-write-groups ()
+ (setq nnultimate-groups-alist
+ (delq (assoc nnultimate-address nnultimate-groups-alist)
+ nnultimate-groups-alist))
+ (push (cons nnultimate-address nnultimate-groups)
+ nnultimate-groups-alist)
+ (with-temp-file (expand-file-name "groups" nnultimate-directory)
+ (prin1 nnultimate-groups-alist (current-buffer))))
+
+(defun nnultimate-init (server)
+ "Initialize buffers and such."
+ (unless (file-exists-p nnultimate-directory)
+ (gnus-make-directory nnultimate-directory)))
+
+(defun nnultimate-generate-active ()
+ (save-excursion
+ (set-buffer nntp-server-buffer)
+ (erase-buffer)
+ (dolist (elem nnultimate-groups)
+ (insert (prin1-to-string (car elem))
+ " " (number-to-string (cadr elem)) " 1 y\n"))))
+
+(defun nnultimate-find-forum-table (contents)
+ (catch 'found
+ (nnultimate-find-forum-table-1 contents)))
+
+(defun nnultimate-find-forum-table-1 (contents)
+ (dolist (element contents)
+ (unless (stringp element)
+ (when (and (eq (car element) 'table)
+ (nnultimate-forum-table-p element))
+ (throw 'found element))
+ (when (nth 2 element)
+ (nnultimate-find-forum-table-1 (nth 2 element))))))
+
+(defun nnultimate-forum-table-p (parse)
+ (when (not (apply 'gnus-or
+ (mapcar
+ (lambda (p)
+ (nnweb-parse-find 'table p))
+ (nth 2 parse))))
+ (let ((href (cdr (assq 'href (nth 1 (nnweb-parse-find 'a parse 20)))))
+ case-fold-search)
+ (when (and href (string-match
+ "postings\\|forumdisplay\\|Forum[0-9]+/HTML\\|getbio"
+ href))
+ t))))
+
+(provide 'nnultimate)
+
+;; Local Variables:
+;; coding: iso-8859-1
+;; End:
+
+;;; nnultimate.el ends here
--- /dev/null
+;;; nnwarchive.el --- interfacing with web archives
+;; Copyright (C) 1999, 2000 Free Software Foundation, Inc.
+
+;; Author: Shenghuo Zhu <zsh@cs.rochester.edu>
+;; Keywords: news egroups mail-archive
+
+;; This file is part of GNU Emacs.
+
+;; GNU Emacs 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 Emacs 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 Emacs; see the file COPYING. If not, write to the
+;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;; Boston, MA 02111-1307, USA.
+
+;;; Commentary:
+
+;; Note: You need to have `url' (w3 0.46) or greater version
+;; installed for this backend to work.
+
+;; Todo:
+;; 1. To support more web archives.
+;; 2. Generalize webmail to other MHonArc archive.
+
+;;; Code:
+
+(eval-when-compile (require 'cl))
+
+(require 'nnoo)
+(require 'message)
+(require 'gnus-util)
+(require 'gnus)
+(require 'gnus-bcklg)
+(require 'nnmail)
+(require 'mm-util)
+(require 'mail-source)
+(eval-when-compile
+ (ignore-errors
+ (require 'w3)
+ (require 'url)
+ (require 'w3-forms)
+ (require 'nnweb)))
+;; Report failure to find w3 at load time if appropriate.
+(eval '(progn
+ (require 'w3)
+ (require 'url)
+ (require 'w3-forms)
+ (require 'nnweb)))
+
+(nnoo-declare nnwarchive)
+
+(defvar nnwarchive-type-definition
+ '((egroups
+ (address . "www.egroups.com")
+ (open-url
+ "http://www.egroups.com/login.cgi?&login_email=%s&login_password=%s"
+ nnwarchive-login nnwarchive-passwd)
+ (list-url
+ "http://www.egroups.com/mygroups")
+ (list-dissect . nnwarchive-egroups-list)
+ (list-groups . nnwarchive-egroups-list-groups)
+ (xover-url
+ "http://www.egroups.com/messages/%s/%d" group aux)
+ (xover-last-url
+ "http://www.egroups.com/messages/%s/" group)
+ (xover-page-size . 13)
+ (xover-dissect . nnwarchive-egroups-xover)
+ (article-url
+ "http://www.egroups.com/message/%s/%d?source=1" group article)
+ (article-dissect . nnwarchive-egroups-article)
+ (authentication . t)
+ (article-offset . 0)
+ (xover-files . nnwarchive-egroups-xover-files))
+ (mail-archive
+ (address . "www.mail-archive.com")
+ (open-url)
+ (list-url
+ "http://www.mail-archive.com/lists.html")
+ (list-dissect . nnwarchive-mail-archive-list)
+ (list-groups . nnwarchive-mail-archive-list-groups)
+ (xover-url
+ "http://www.mail-archive.com/%s/mail%d.html" group aux)
+ (xover-last-url
+ "http://www.mail-archive.com/%s/maillist.html" group)
+ (xover-page-size)
+ (xover-dissect . nnwarchive-mail-archive-xover)
+ (article-url
+ "http://www.mail-archive.com/%s/msg%05d.html" group article1)
+ (article-dissect . nnwarchive-mail-archive-article)
+ (xover-files . nnwarchive-mail-archive-xover-files)
+ (authentication)
+ (article-offset . 1))))
+
+(defvar nnwarchive-default-type 'egroups)
+
+(defvoo nnwarchive-directory (nnheader-concat gnus-directory "warchive/")
+ "Where nnwarchive will save its files.")
+
+(defvoo nnwarchive-type nil
+ "The type of nnwarchive.")
+
+(defvoo nnwarchive-address ""
+ "The address of nnwarchive.")
+
+(defvoo nnwarchive-login nil
+ "Your login name for the group.")
+
+(defvoo nnwarchive-passwd nil
+ "Your password for the group.")
+
+(defvoo nnwarchive-groups nil)
+
+(defvoo nnwarchive-headers-cache nil)
+
+(defvoo nnwarchive-authentication nil)
+
+(defvoo nnwarchive-nov-is-evil nil)
+
+(defconst nnwarchive-version "nnwarchive 1.0")
+
+;;; Internal variables
+
+(defvoo nnwarchive-open-url nil)
+(defvoo nnwarchive-open-dissect nil)
+
+(defvoo nnwarchive-list-url nil)
+(defvoo nnwarchive-list-dissect nil)
+(defvoo nnwarchive-list-groups nil)
+
+(defvoo nnwarchive-xover-files nil)
+(defvoo nnwarchive-xover-url nil)
+(defvoo nnwarchive-xover-last-url nil)
+(defvoo nnwarchive-xover-dissect nil)
+(defvoo nnwarchive-xover-page-size nil)
+
+(defvoo nnwarchive-article-url nil)
+(defvoo nnwarchive-article-dissect nil)
+(defvoo nnwarchive-xover-files nil)
+(defvoo nnwarchive-article-offset 0)
+
+(defvoo nnwarchive-buffer nil)
+
+(defvoo nnwarchive-keep-backlog 300)
+(defvar nnwarchive-backlog-articles nil)
+(defvar nnwarchive-backlog-hashtb nil)
+
+(defvoo nnwarchive-headers nil)
+
+
+;;; Interface functions
+
+(nnoo-define-basics nnwarchive)
+
+(defun nnwarchive-set-default (type)
+ (let ((defs (cdr (assq type nnwarchive-type-definition)))
+ def)
+ (dolist (def defs)
+ (set (intern (concat "nnwarchive-" (symbol-name (car def))))
+ (cdr def)))))
+
+(defmacro nnwarchive-backlog (&rest form)
+ `(let ((gnus-keep-backlog nnwarchive-keep-backlog)
+ (gnus-backlog-buffer
+ (format " *nnwarchive backlog %s*" nnwarchive-address))
+ (gnus-backlog-articles nnwarchive-backlog-articles)
+ (gnus-backlog-hashtb nnwarchive-backlog-hashtb))
+ (unwind-protect
+ (progn ,@form)
+ (setq nnwarchive-backlog-articles gnus-backlog-articles
+ nnwarchive-backlog-hashtb gnus-backlog-hashtb))))
+(put 'nnwarchive-backlog 'lisp-indent-function 0)
+(put 'nnwarchive-backlog 'edebug-form-spec '(form body))
+
+(defun nnwarchive-backlog-enter-article (group number buffer)
+ (nnwarchive-backlog
+ (gnus-backlog-enter-article group number buffer)))
+
+(defun nnwarchive-get-article (article &optional group server buffer)
+ (if (numberp article)
+ (if (nnwarchive-backlog
+ (gnus-backlog-request-article group article
+ (or buffer nntp-server-buffer)))
+ (cons group article)
+ (let (contents)
+ (save-excursion
+ (set-buffer nnwarchive-buffer)
+ (goto-char (point-min))
+ (let ((article1 (- article nnwarchive-article-offset)))
+ (nnwarchive-url nnwarchive-article-url))
+ (setq contents (funcall nnwarchive-article-dissect group article)))
+ (when contents
+ (save-excursion
+ (set-buffer (or buffer nntp-server-buffer))
+ (erase-buffer)
+ (insert contents)
+ (nnwarchive-backlog-enter-article group article (current-buffer))
+ (nnheader-report 'nnwarchive "Fetched article %s" article)
+ (cons group article)))))
+ nil))
+
+(deffoo nnwarchive-retrieve-headers (articles &optional group server fetch-old)
+ (nnwarchive-possibly-change-server group server)
+ (if (or gnus-nov-is-evil nnwarchive-nov-is-evil)
+ (with-temp-buffer
+ (with-current-buffer nntp-server-buffer
+ (erase-buffer))
+ (let ((buf (current-buffer)) b e)
+ (dolist (art articles)
+ (nnwarchive-get-article art group server buf)
+ (setq b (goto-char (point-min)))
+ (if (search-forward "\n\n" nil t)
+ (forward-char -1)
+ (goto-char (point-max)))
+ (setq e (point))
+ (with-current-buffer nntp-server-buffer
+ (insert (format "221 %d Article retrieved.\n" art))
+ (insert-buffer-substring buf b e)
+ (insert ".\n"))))
+ 'headers)
+ (setq nnwarchive-headers (cdr (assoc group nnwarchive-headers-cache)))
+ (save-excursion
+ (set-buffer nnwarchive-buffer)
+ (erase-buffer)
+ (funcall nnwarchive-xover-files group articles))
+ (save-excursion
+ (set-buffer nntp-server-buffer)
+ (erase-buffer)
+ (let (header)
+ (dolist (art articles)
+ (if (setq header (assq art nnwarchive-headers))
+ (nnheader-insert-nov (cdr header))))))
+ (let ((elem (assoc group nnwarchive-headers-cache)))
+ (if elem
+ (setcdr elem nnwarchive-headers)
+ (push (cons group nnwarchive-headers) nnwarchive-headers-cache)))
+ 'nov))
+
+(deffoo nnwarchive-request-group (group &optional server dont-check)
+ (nnwarchive-possibly-change-server nil server)
+ (when (and (not dont-check) nnwarchive-list-groups)
+ (funcall nnwarchive-list-groups (list group))
+ (nnwarchive-write-groups))
+ (let ((elem (assoc group nnwarchive-groups)))
+ (cond
+ ((not elem)
+ (nnheader-report 'nnwarchive "Group does not exist"))
+ (t
+ (nnheader-report 'nnwarchive "Opened group %s" group)
+ (nnheader-insert
+ "211 %d %d %d %s\n" (or (cadr elem) 0) 1 (or (cadr elem) 0)
+ (prin1-to-string group))
+ t))))
+
+(deffoo nnwarchive-request-article (article &optional group server buffer)
+ (nnwarchive-possibly-change-server group server)
+ (nnwarchive-get-article article group server buffer))
+
+(deffoo nnwarchive-close-server (&optional server)
+ (when (and (nnwarchive-server-opened server)
+ (gnus-buffer-live-p nnwarchive-buffer))
+ (save-excursion
+ (set-buffer nnwarchive-buffer)
+ (kill-buffer nnwarchive-buffer)))
+ (nnwarchive-backlog
+ (gnus-backlog-shutdown))
+ (nnoo-close-server 'nnwarchive server))
+
+(deffoo nnwarchive-request-list (&optional server)
+ (nnwarchive-possibly-change-server nil server)
+ (save-excursion
+ (set-buffer nnwarchive-buffer)
+ (erase-buffer)
+ (if nnwarchive-list-url
+ (nnwarchive-url nnwarchive-list-url))
+ (if nnwarchive-list-dissect
+ (funcall nnwarchive-list-dissect))
+ (nnwarchive-write-groups)
+ (nnwarchive-generate-active))
+ t)
+
+(deffoo nnwarchive-open-server (server &optional defs connectionless)
+ (nnoo-change-server 'nnwarchive server defs)
+ (nnwarchive-init server)
+ (when nnwarchive-authentication
+ (setq nnwarchive-login
+ (or nnwarchive-login
+ (read-string
+ (format "Login at %s: " server)
+ user-mail-address)))
+ (setq nnwarchive-passwd
+ (or nnwarchive-passwd
+ (mail-source-read-passwd
+ (format "Password for %s at %s: "
+ nnwarchive-login server)))))
+ (unless nnwarchive-groups
+ (nnwarchive-read-groups))
+ (save-excursion
+ (set-buffer nnwarchive-buffer)
+ (erase-buffer)
+ (if nnwarchive-open-url
+ (nnwarchive-url nnwarchive-open-url))
+ (if nnwarchive-open-dissect
+ (funcall nnwarchive-open-dissect)))
+ t)
+
+(nnoo-define-skeleton nnwarchive)
+
+;;; Internal functions
+
+(defun nnwarchive-possibly-change-server (&optional group server)
+ (nnwarchive-init server)
+ (when (and server
+ (not (nnwarchive-server-opened server)))
+ (nnwarchive-open-server server)))
+
+(defun nnwarchive-read-groups ()
+ (let ((file (expand-file-name (concat "groups-" nnwarchive-address)
+ nnwarchive-directory)))
+ (when (file-exists-p file)
+ (with-temp-buffer
+ (insert-file-contents file)
+ (goto-char (point-min))
+ (setq nnwarchive-groups (read (current-buffer)))))))
+
+(defun nnwarchive-write-groups ()
+ (with-temp-file (expand-file-name (concat "groups-" nnwarchive-address)
+ nnwarchive-directory)
+ (prin1 nnwarchive-groups (current-buffer))))
+
+(defun nnwarchive-init (server)
+ "Initialize buffers and such."
+ (let ((type (intern server)) (defs nnwarchive-type-definition) def)
+ (cond
+ ((equal server "")
+ (setq type nnwarchive-default-type))
+ ((assq type nnwarchive-type-definition) t)
+ (t
+ (setq type nil)
+ (while (setq def (pop defs))
+ (when (equal (cdr (assq 'address (cdr def))) server)
+ (setq defs nil)
+ (setq type (car def))))
+ (unless type
+ (error "Undefined server %s" server))))
+ (setq nnwarchive-type type))
+ (unless (file-exists-p nnwarchive-directory)
+ (gnus-make-directory nnwarchive-directory))
+ (unless (gnus-buffer-live-p nnwarchive-buffer)
+ (setq nnwarchive-buffer
+ (save-excursion
+ (nnheader-set-temp-buffer
+ (format " *nnwarchive %s %s*" nnwarchive-type server)))))
+ (nnwarchive-set-default nnwarchive-type))
+
+(defun nnwarchive-encode-www-form-urlencoded (pairs)
+ "Return PAIRS encoded for forms."
+ (mapconcat
+ (function
+ (lambda (data)
+ (concat (w3-form-encode-xwfu (car data)) "="
+ (w3-form-encode-xwfu (cdr data)))))
+ pairs "&"))
+
+(defun nnwarchive-fetch-form (url pairs)
+ (let ((url-request-data (nnwarchive-encode-www-form-urlencoded pairs))
+ (url-request-method "POST")
+ (url-request-extra-headers
+ '(("Content-type" . "application/x-www-form-urlencoded"))))
+ (nnweb-insert url))
+ t)
+
+(defun nnwarchive-eval (expr)
+ (cond
+ ((consp expr)
+ (cons (nnwarchive-eval (car expr)) (nnwarchive-eval (cdr expr))))
+ ((symbolp expr)
+ (eval expr))
+ (t
+ expr)))
+
+(defun nnwarchive-url (xurl)
+ (mm-with-unibyte-current-buffer
+ (let ((url-confirmation-func 'identity)
+ (url-cookie-multiple-line nil))
+ (cond
+ ((eq (car xurl) 'post)
+ (pop xurl)
+ (nnwarchive-fetch-form (car xurl) (nnwarchive-eval (cdr xurl))))
+ (t
+ (nnweb-insert (apply 'format (nnwarchive-eval xurl))))))))
+
+(defun nnwarchive-generate-active ()
+ (save-excursion
+ (set-buffer nntp-server-buffer)
+ (erase-buffer)
+ (dolist (elem nnwarchive-groups)
+ (insert (prin1-to-string (car elem))
+ " " (number-to-string (or (cadr elem) 0)) " 1 y\n"))))
+
+(defun nnwarchive-paged (articles)
+ (let (art narts next)
+ (while (setq art (pop articles))
+ (when (and (>= art (or next 0))
+ (not (assq art nnwarchive-headers)))
+ (push art narts)
+ (setq next (+ art nnwarchive-xover-page-size))))
+ narts))
+
+;; egroups
+
+(defun nnwarchive-egroups-list-groups (groups)
+ (save-excursion
+ (let (articles)
+ (set-buffer nnwarchive-buffer)
+ (dolist (group groups)
+ (erase-buffer)
+ (nnwarchive-url nnwarchive-xover-last-url)
+ (goto-char (point-min))
+ (when (re-search-forward "of \\([0-9]+\\)[ \t\n\r]*</title>" nil t)
+ (setq articles (string-to-number (match-string 1))))
+ (let ((elem (assoc group nnwarchive-groups)))
+ (if elem
+ (setcar (cdr elem) articles)
+ (push (list group articles "") nnwarchive-groups)))
+ (setq nnwarchive-headers (cdr (assoc group nnwarchive-headers-cache)))
+ (nnwarchive-egroups-xover group)
+ (let ((elem (assoc group nnwarchive-headers-cache)))
+ (if elem
+ (setcdr elem nnwarchive-headers)
+ (push (cons group nnwarchive-headers) nnwarchive-headers-cache)))))))
+
+(defun nnwarchive-egroups-list ()
+ (let ((case-fold-search t)
+ group description elem articles)
+ (goto-char (point-min))
+ (while
+ (re-search-forward "href=\"/group/\\([^/\"\> ]+\\)" nil t)
+ (setq group (match-string 1)
+ description (match-string 2))
+ (if (setq elem (assoc group nnwarchive-groups))
+ (setcar (cdr elem) 0)
+ (push (list group articles description) nnwarchive-groups))))
+ t)
+
+(defun nnwarchive-egroups-xover (group)
+ (let (article subject from date)
+ (goto-char (point-min))
+ (while (re-search-forward
+ "<a href=\"/group/\\([^/]+\\)/\\([0-9]+\\)[^>]+>\\([^<]+\\)<"
+ nil t)
+ (setq group (match-string 1)
+ article (string-to-number (match-string 2))
+ subject (match-string 3))
+ (forward-line 1)
+ (unless (assq article nnwarchive-headers)
+ (if (looking-at "<td[^>]+><font[^>]+>\\([^<]+\\)</font>")
+ (setq from (match-string 1)))
+ (forward-line 1)
+ (if (looking-at "<td[^>]+><font[^>]+>\\([^<]+\\)</font>")
+ (setq date (identity (match-string 1))))
+ (push (cons
+ article
+ (make-full-mail-header
+ article
+ (nnweb-decode-entities-string subject)
+ (nnweb-decode-entities-string from)
+ date
+ (concat "<" group "%"
+ (number-to-string article)
+ "@egroup.com>")
+ ""
+ 0 0 "")) nnwarchive-headers))))
+ nnwarchive-headers)
+
+(defun nnwarchive-egroups-article (group articles)
+ (goto-char (point-min))
+ (if (search-forward "<pre>" nil t)
+ (delete-region (point-min) (point)))
+ (goto-char (point-max))
+ (if (search-backward "</pre>" nil t)
+ (delete-region (point) (point-max)))
+ (goto-char (point-min))
+ (while (re-search-forward "<a[^>]+>\\([^<]+\\)</a>" nil t)
+ (replace-match "\\1"))
+ (nnweb-decode-entities)
+ (buffer-string))
+
+(defun nnwarchive-egroups-xover-files (group articles)
+ (let (aux auxs)
+ (setq auxs (nnwarchive-paged (sort articles '<)))
+ (while (setq aux (pop auxs))
+ (goto-char (point-max))
+ (nnwarchive-url nnwarchive-xover-url))
+ (if nnwarchive-xover-dissect
+ (nnwarchive-egroups-xover group))))
+
+;; mail-archive
+
+(defun nnwarchive-mail-archive-list-groups (groups)
+ (save-excursion
+ (let (articles)
+ (set-buffer nnwarchive-buffer)
+ (dolist (group groups)
+ (erase-buffer)
+ (nnwarchive-url nnwarchive-xover-last-url)
+ (goto-char (point-min))
+ (when (re-search-forward "msg\\([0-9]+\\)\\.html" nil t)
+ (setq articles (1+ (string-to-number (match-string 1)))))
+ (let ((elem (assoc group nnwarchive-groups)))
+ (if elem
+ (setcar (cdr elem) articles)
+ (push (list group articles "") nnwarchive-groups)))
+ (setq nnwarchive-headers (cdr (assoc group nnwarchive-headers-cache)))
+ (nnwarchive-mail-archive-xover group)
+ (let ((elem (assoc group nnwarchive-headers-cache)))
+ (if elem
+ (setcdr elem nnwarchive-headers)
+ (push (cons group nnwarchive-headers)
+ nnwarchive-headers-cache)))))))
+
+(defun nnwarchive-mail-archive-list ()
+ (let ((case-fold-search t)
+ group description elem articles)
+ (goto-char (point-min))
+ (while (re-search-forward "<a href=\"\\([^/]+\\)/\">\\([^>]+\\)<" nil t)
+ (setq group (match-string 1)
+ description (match-string 2))
+ (forward-line 1)
+ (setq articles 0)
+ (if (setq elem (assoc group nnwarchive-groups))
+ (setcar (cdr elem) articles)
+ (push (list group articles description) nnwarchive-groups))))
+ t)
+
+(defun nnwarchive-mail-archive-xover (group)
+ (let (article subject from date)
+ (goto-char (point-min))
+ (while (re-search-forward
+ "<A[^>]*HREF=\"msg\\([0-9]+\\)\\.html[^>]+>\\([^<]+\\)<"
+ nil t)
+ (setq article (1+ (string-to-number (match-string 1)))
+ subject (match-string 2))
+ (forward-line 1)
+ (unless (assq article nnwarchive-headers)
+ (if (looking-at "<UL><LI><EM>From</EM>:\\([^&]+\\)<\\([^&]+\\)>")
+ (progn
+ (setq from (match-string 1)
+ date (identity (match-string 2))))
+ (setq from "" date ""))
+ (push (cons
+ article
+ (make-full-mail-header
+ article
+ (nnweb-decode-entities-string subject)
+ (nnweb-decode-entities-string from)
+ date
+ (format "<%05d%%%s>\n" (1- article) group)
+ ""
+ 0 0 "")) nnwarchive-headers))))
+ nnwarchive-headers)
+
+(defun nnwarchive-mail-archive-xover-files (group articles)
+ (unless nnwarchive-headers
+ (erase-buffer)
+ (nnwarchive-url nnwarchive-xover-last-url)
+ (goto-char (point-min))
+ (nnwarchive-mail-archive-xover group))
+ (let ((minart (apply 'min articles))
+ (min (apply 'min (mapcar 'car nnwarchive-headers)))
+ (aux 2))
+ (while (> min minart)
+ (erase-buffer)
+ (nnwarchive-url nnwarchive-xover-url)
+ (nnwarchive-mail-archive-xover group)
+ (setq min (apply 'min (mapcar 'car nnwarchive-headers))))))
+
+(defvar nnwarchive-caesar-translation-table nil
+ "Modified rot13 table. tr/@A-Z[a-z/N-Z[@A-Mn-za-m/.")
+
+(defun nnwarchive-make-caesar-translation-table ()
+ "Create modified rot13 table. tr/@A-Z[a-z/N-Z[@A-Mn-za-m/."
+ (let ((i -1)
+ (table (make-string 256 0))
+ (a (mm-char-int ?a))
+ (A (mm-char-int ?A)))
+ (while (< (incf i) 256)
+ (aset table i i))
+ (concat
+ (substring table 0 (1- A))
+ (substring table (+ A 13) (+ A 27))
+ (substring table (1- A) (+ A 13))
+ (substring table (+ A 27) a)
+ (substring table (+ a 13) (+ a 26))
+ (substring table a (+ a 13))
+ (substring table (+ a 26) 255))))
+
+(defun nnwarchive-from-r13 (from-r13)
+ (when from-r13
+ (with-temp-buffer
+ (insert from-r13)
+ (let ((message-caesar-translation-table
+ (or nnwarchive-caesar-translation-table
+ (setq nnwarchive-caesar-translation-table
+ (nnwarchive-make-caesar-translation-table)))))
+ (message-caesar-region (point-min) (point-max))
+ (buffer-string)))))
+
+(defun nnwarchive-mail-archive-article (group article)
+ (let (p refs url mime e
+ from subject date id
+ done
+ (case-fold-serch t))
+ (save-restriction
+ (goto-char (point-min))
+ (when (search-forward "X-Head-End" nil t)
+ (beginning-of-line)
+ (narrow-to-region (point-min) (point))
+ (nnweb-decode-entities)
+ (goto-char (point-min))
+ (while (search-forward "<!--X-" nil t)
+ (replace-match ""))
+ (goto-char (point-min))
+ (while (search-forward " -->" nil t)
+ (replace-match ""))
+ (setq from
+ (or (mail-fetch-field "from")
+ (nnwarchive-from-r13
+ (mail-fetch-field "from-r13"))))
+ (setq date (mail-fetch-field "date"))
+ (setq id (mail-fetch-field "message-id"))
+ (setq subject (mail-fetch-field "subject"))
+ (goto-char (point-max))
+ (widen))
+ (when (search-forward "<ul>" nil t)
+ (forward-line)
+ (delete-region (point-min) (point))
+ (search-forward "</ul>" nil t)
+ (end-of-line)
+ (narrow-to-region (point-min) (point))
+ (nnweb-remove-markup)
+ (nnweb-decode-entities)
+ (goto-char (point-min))
+ (delete-blank-lines)
+ (when from
+ (message-remove-header "from")
+ (goto-char (point-max))
+ (insert "From: " from "\n"))
+ (when subject
+ (message-remove-header "subject")
+ (goto-char (point-max))
+ (insert "Subject: " subject "\n"))
+ (when id
+ (goto-char (point-max))
+ (insert "X-Message-ID: <" id ">\n"))
+ (when date
+ (message-remove-header "date")
+ (goto-char (point-max))
+ (insert "Date: " date "\n"))
+ (goto-char (point-max))
+ (widen)
+ (insert "\n"))
+ (setq p (point))
+ (when (search-forward "X-Body-of-Message" nil t)
+ (forward-line)
+ (delete-region p (point))
+ (search-forward "X-Body-of-Message-End" nil t)
+ (beginning-of-line)
+ (save-restriction
+ (narrow-to-region p (point))
+ (goto-char (point-min))
+ (if (> (skip-chars-forward "\040\n\r\t") 0)
+ (delete-region (point-min) (point)))
+ (while (not (eobp))
+ (cond
+ ((looking-at "<PRE>\r?\n?")
+ (delete-region (match-beginning 0) (match-end 0))
+ (setq p (point))
+ (when (search-forward "</PRE>" nil t)
+ (delete-region (match-beginning 0) (match-end 0))
+ (save-restriction
+ (narrow-to-region p (point))
+ (nnweb-remove-markup)
+ (nnweb-decode-entities)
+ (goto-char (point-max)))))
+ ((looking-at "<P><A HREF=\"\\([^\"]+\\)")
+ (setq url (match-string 1))
+ (delete-region (match-beginning 0)
+ (progn (forward-line) (point)))
+ ;; I hate to download the url encode it, then immediately
+ ;; decode it.
+ ;; FixMe: Find a better solution to attach the URL.
+ ;; Maybe do some hack in external part of mml-generate-mim-1.
+ (insert "<#part>"
+ "\n--\nExternal: \n"
+ (format "<URL:http://www.mail-archive.com/%s/%s>"
+ group url)
+ "\n--\n"
+ "<#/part>")
+ (setq mime t))
+ (t
+ (setq p (point))
+ (insert "<#part type=\"text/html\" disposition=inline>")
+ (goto-char
+ (if (re-search-forward
+ "[\040\n\r\t]*<PRE>\\|[\040\n\r\t]*<P><A HREF=\""
+ nil t)
+ (match-beginning 0)
+ (point-max)))
+ (insert "<#/part>")
+ (setq mime t)))
+ (setq p (point))
+ (if (> (skip-chars-forward "\040\n\r\t") 0)
+ (delete-region p (point))))
+ (goto-char (point-max))))
+ (setq p (point))
+ (when (search-forward "X-References-End" nil t)
+ (setq e (point))
+ (beginning-of-line)
+ (search-backward "X-References" p t)
+ (while (re-search-forward "msg\\([0-9]+\\)\\.html" e t)
+ (push (concat "<" (match-string 1) "%" group ">") refs)))
+ (delete-region p (point-max))
+ (goto-char (point-min))
+ (insert (format "Message-ID: <%05d%%%s>\n" (1- article) group))
+ (when refs
+ (insert "References:")
+ (while refs
+ (insert " " (pop refs)))
+ (insert "\n"))
+ (when mime
+ (unless (looking-at "$")
+ (search-forward "\n\n" nil t)
+ (forward-line -1))
+ (narrow-to-region (point) (point-max))
+ (insert "MIME-Version: 1.0\n"
+ (prog1
+ (mml-generate-mime)
+ (delete-region (point-min) (point-max))))
+ (widen)))
+ (buffer-string)))
+
+(provide 'nnwarchive)
+
+;;; nnwarchive.el ends here
--- /dev/null
+;;; qp.el --- Quoted-Printable functions
+;; Copyright (C) 1998, 1999, 2000 Free Software Foundation, Inc.
+
+;; Author: Lars Magne Ingebrigtsen <larsi@gnus.org>
+;; This file is part of GNU Emacs.
+
+;; GNU Emacs 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 Emacs 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 Emacs; see the file COPYING. If not, write to the
+;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;; Boston, MA 02111-1307, USA.
+
+;;; Commentary:
+
+;;; Code:
+
+(require 'mm-util)
+
+(defvar quoted-printable-encoding-characters
+ (mapcar 'identity "0123456789ABCDEFabcdef"))
+
+(defun quoted-printable-decode-region (from to &optional charset)
+ "Decode quoted-printable in the region between FROM and TO.
+If CHARSET is non-nil, decode the region with charset."
+ (interactive "r")
+ (save-excursion
+ (save-restriction
+ (let (start)
+ (narrow-to-region from to)
+ (goto-char from)
+ (while (not (eobp))
+ (cond
+ ((eq (char-after) ?=)
+ (delete-char 1)
+ (unless start
+ (setq start (point)))
+ (cond
+ ;; End of the line.
+ ((eq (char-after) ?\n)
+ (delete-char 1))
+ ;; Encoded character.
+ ((and
+ (memq (char-after) quoted-printable-encoding-characters)
+ (memq (char-after (1+ (point)))
+ quoted-printable-encoding-characters))
+ (insert
+ (string-to-number
+ (buffer-substring (point) (+ 2 (point)))
+ 16))
+ (delete-char 2))
+ ;; Quoted equal sign.
+ ((eq (char-after) ?=)
+ (forward-char 1))
+ ;; End of buffer.
+ ((eobp))
+ ;; Invalid.
+ (t
+ (message "Malformed MIME quoted-printable message"))))
+ ((and charset start (not (eq (mm-charset-after) 'ascii)))
+ (mm-decode-coding-region start (point) charset)
+ (setq start nil)
+ (forward-char 1))
+ (t
+ (forward-char 1))))
+ (if (and charset start)
+ (mm-decode-coding-region start (point) charset))))))
+
+(defun quoted-printable-decode-string (string &optional charset)
+ "Decode the quoted-printable-encoded STRING and return the results.
+If CHARSET is non-nil, decode the region with charset."
+ (with-temp-buffer
+ (insert string)
+ (quoted-printable-decode-region (point-min) (point-max) charset)
+ (buffer-string)))
+
+(defun quoted-printable-encode-region (from to &optional fold class)
+ "QP-encode the region between FROM and TO.
+
+If FOLD fold long lines. If CLASS, translate the characters
+matched by that regexp.
+
+If `mm-use-ultra-safe-encoding' is set, fold unconditionally and
+encode lines starting with \"From\"."
+ (interactive "r")
+ (save-excursion
+ (save-restriction
+ (narrow-to-region from to)
+ ;; (mm-encode-body)
+ ;; Encode all the non-ascii and control characters.
+ (goto-char (point-min))
+ (while (and (skip-chars-forward
+ (or class "^\000-\007\013\015-\037\200-\377="))
+ (not (eobp)))
+ (insert
+ (prog1
+ (upcase (format "=%02x" (char-after)))
+ (delete-char 1))))
+ ;; Encode white space at the end of lines.
+ (goto-char (point-min))
+ (while (re-search-forward "[ \t]+$" nil t)
+ (goto-char (match-beginning 0))
+ (while (not (eolp))
+ (insert
+ (prog1
+ (upcase (format "=%02x" (char-after)))
+ (delete-char 1)))))
+ (when (or fold mm-use-ultra-safe-encoding)
+ ;; Fold long lines.
+ (let ((tab-width 1)) ;; HTAB is one character.
+ (goto-char (point-min))
+ (while (not (eobp))
+ ;; In ultra-safe mode, encode "From " at the beginning of a
+ ;; line.
+ (when mm-use-ultra-safe-encoding
+ (beginning-of-line)
+ (when (looking-at "From ")
+ (replace-match "From=20" nil t)))
+ (end-of-line)
+ (while (> (current-column) 76) ;; tab-width must be 1.
+ (beginning-of-line)
+ (forward-char 75);; 75 chars plus an "="
+ (search-backward "=" (- (point) 2) t)
+ (insert "=\n")
+ (end-of-line))
+ (unless (eobp)
+ (forward-line))))))))
+
+(defun quoted-printable-encode-string (string)
+ "QP-encode STRING and return the results."
+ (mm-with-unibyte-buffer
+ (insert string)
+ (quoted-printable-encode-region (point-min) (point-max))
+ (buffer-string)))
+
+(provide 'qp)
+
+;; qp.el ends here
--- /dev/null
+;;; rfc1843.el --- HZ (rfc1843) decoding
+;; Copyright (c) 1998, 1999, 2000 Free Software Foundation, Inc.
+
+;; Author: Shenghuo Zhu <zsh@cs.rochester.edu>
+;; Keywords: news HZ HZ+ mail i18n
+
+;; This file is a part of GNU Emacs.
+
+;; GNU Emacs 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 Emacs 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 Emacs; see the file COPYING. If not, write to the
+;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;; Boston, MA 02111-1307, USA.
+
+;;; Commentary:
+
+;; Usage:
+;; (require 'rfc1843)
+;; (rfc1843-gnus-setup)
+;;
+;; Test:
+;; (rfc1843-decode-string "~{<:Ky2;S{#,NpJ)l6HK!#~}")
+
+;;; Code:
+
+(require 'mm-util)
+
+(defvar rfc1843-word-regexp
+ "~\\({\\([\041-\167][\041-\176]\\| \\)+\\)\\(~}\\|$\\)")
+
+(defvar rfc1843-word-regexp-strictly
+ "~\\({\\([\041-\167][\041-\176]\\)+\\)\\(~}\\|$\\)")
+
+(defvar rfc1843-hzp-word-regexp
+ "~\\({\\([\041-\167][\041-\176]\\| \\)+\\|\
+[<>]\\([\041-\175][\041-\176]\\| \\)+\\)\\(~}\\|$\\)")
+
+(defvar rfc1843-hzp-word-regexp-strictly
+ "~\\({\\([\041-\167][\041-\176]\\)+\\|\
+[<>]\\([\041-\175][\041-\176]\\)+\\)\\(~}\\|$\\)")
+
+(defcustom rfc1843-decode-loosely nil
+ "Loosely check HZ encoding if non-nil.
+When it is set non-nil, only buffers or strings with strictly
+HZ-encoded are decoded."
+ :type 'boolean
+ :group 'gnus)
+
+(defcustom rfc1843-decode-hzp t
+ "HZ+ decoding support if non-nil.
+HZ+ specification (also known as HZP) is to provide a standardized
+7-bit representation of mixed Big5, GB, and ASCII text for convenient
+e-mail transmission, news posting, etc.
+The document of HZ+ 0.78 specification can be found at
+ftp://ftp.math.psu.edu/pub/simpson/chinese/hzp/hzp.doc"
+ :type 'boolean
+ :group 'gnus)
+
+(defcustom rfc1843-newsgroups-regexp "chinese\\|hz"
+ "Regexp of newsgroups in which might be HZ encoded."
+ :type 'string
+ :group 'gnus)
+
+(defun rfc1843-decode-region (from to)
+ "Decode HZ in the region between FROM and TO."
+ (interactive "r")
+ (let (str firstc)
+ (save-excursion
+ (goto-char from)
+ (if (or rfc1843-decode-loosely
+ (re-search-forward (if rfc1843-decode-hzp
+ rfc1843-hzp-word-regexp-strictly
+ rfc1843-word-regexp-strictly) to t))
+ (save-restriction
+ (narrow-to-region from to)
+ (goto-char (point-min))
+ (while (re-search-forward (if rfc1843-decode-hzp
+ rfc1843-hzp-word-regexp
+ rfc1843-word-regexp) (point-max) t)
+ ;;; Text with extents may cause XEmacs crash
+ (setq str (buffer-substring-no-properties
+ (match-beginning 1)
+ (match-end 1)))
+ (setq firstc (aref str 0))
+ (insert (mm-decode-coding-string
+ (rfc1843-decode
+ (prog1
+ (substring str 1)
+ (delete-region (match-beginning 0) (match-end 0)))
+ firstc)
+ (if (eq firstc ?{) 'cn-gb-2312 'cn-big5))))
+ (goto-char (point-min))
+ (while (search-forward "~" (point-max) t)
+ (cond ((eq (char-after) ?\n)
+ (delete-char -1)
+ (delete-char 1))
+ ((eq (char-after) ?~)
+ (delete-char 1)))))))))
+
+(defun rfc1843-decode-string (string)
+ "Decode HZ STRING and return the results."
+ (let ((m (mm-multibyte-p)))
+ (with-temp-buffer
+ (when m
+ (mm-enable-multibyte))
+ (insert string)
+ (inline
+ (rfc1843-decode-region (point-min) (point-max)))
+ (buffer-string))))
+
+(defun rfc1843-decode (word &optional firstc)
+ "Decode HZ WORD and return it."
+ (let ((i -1) (s (substring word 0)) v)
+ (if (or (not firstc) (eq firstc ?{))
+ (while (< (incf i) (length s))
+ (if (eq (setq v (aref s i)) ? ) nil
+ (aset s i (+ 128 v))))
+ (while (< (incf i) (length s))
+ (if (eq (setq v (aref s i)) ? ) nil
+ (setq v (+ (* 94 v) (aref s (1+ i)) -3135))
+ (aset s i (+ (/ v 157) (if (eq firstc ?<) 201 161)))
+ (setq v (% v 157))
+ (aset s (incf i) (+ v (if (< v 63) 64 98))))))
+ s))
+
+(defun rfc1843-decode-article-body ()
+ "Decode HZ encoded text in the article body."
+ (if (string-match (concat "\\<\\(" rfc1843-newsgroups-regexp "\\)\\>")
+ (or gnus-newsgroup-name ""))
+ (save-excursion
+ (save-restriction
+ (message-narrow-to-head)
+ (let* ((inhibit-point-motion-hooks t)
+ (case-fold-search t)
+ (ct (message-fetch-field "Content-Type" t))
+ (ctl (and ct (ignore-errors
+ (mail-header-parse-content-type ct)))))
+ (if (and ctl (not (string-match "/" (car ctl))))
+ (setq ctl nil))
+ (goto-char (point-max))
+ (widen)
+ (forward-line 1)
+ (narrow-to-region (point) (point-max))
+ (when (or (not ctl)
+ (equal (car ctl) "text/plain"))
+ (rfc1843-decode-region (point) (point-max))))))))
+
+(defvar rfc1843-old-gnus-decode-header-function nil)
+(defvar gnus-decode-header-methods)
+(defvar gnus-decode-encoded-word-methods)
+
+(defun rfc1843-gnus-setup ()
+ "Setup HZ decoding for Gnus."
+ (require 'gnus-art)
+ (require 'gnus-sum)
+ (add-hook 'gnus-article-decode-hook 'rfc1843-decode-article-body t)
+ (setq gnus-decode-encoded-word-function
+ 'gnus-multi-decode-encoded-word-string
+ gnus-decode-header-function
+ 'gnus-multi-decode-header
+ gnus-decode-encoded-word-methods
+ (nconc gnus-decode-encoded-word-methods
+ (list
+ (cons (concat "\\<\\(" rfc1843-newsgroups-regexp "\\)\\>")
+ 'rfc1843-decode-string)))
+ gnus-decode-header-methods
+ (nconc gnus-decode-header-methods
+ (list
+ (cons (concat "\\<\\(" rfc1843-newsgroups-regexp "\\)\\>")
+ 'rfc1843-decode-region)))))
+
+(provide 'rfc1843)
+
+;;; rfc1843.el ends here
--- /dev/null
+;;; rfc2045.el --- Functions for decoding rfc2045 headers
+
+;; Copyright (C) 1998, 1999, 2000 Free Software Foundation, Inc.
+
+;; Author: Lars Magne Ingebrigtsen <larsi@gnus.org>
+;; This file is part of GNU Emacs.
+
+;; GNU Emacs 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 Emacs 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 Emacs; see the file COPYING. If not, write to the
+;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;; Boston, MA 02111-1307, USA.
+
+;;; Commentary:
+
+;;; Code:
+
+(require 'ietf-drums)
+
+(defun rfc2045-encode-string (param value)
+ "Return and PARAM=VALUE string encoded according to RFC2045."
+ (if (or (string-match (concat "[" ietf-drums-no-ws-ctl-token "]") value)
+ (string-match (concat "[" ietf-drums-tspecials "]") value)
+ (string-match "[ \n\t]" value)
+ (not (string-match (concat "[" ietf-drums-text-token "]") value)))
+ (concat param "=" (format "%S" value))
+ (concat param "=" value)))
+
+(provide 'rfc2045)
+
+;;; rfc2045.el ends here
--- /dev/null
+;;; rfc2047.el --- Functions for encoding and decoding rfc2047 messages
+;; Copyright (C) 1998, 1999, 2000 Free Software Foundation, Inc.
+
+;; Author: Lars Magne Ingebrigtsen <larsi@gnus.org>
+;; MORIOKA Tomohiko <morioka@jaist.ac.jp>
+;; This file is part of GNU Emacs.
+
+;; GNU Emacs 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 Emacs 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 Emacs; see the file COPYING. If not, write to the
+;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;; Boston, MA 02111-1307, USA.
+
+;;; Commentary:
+
+;;; Code:
+
+(eval-and-compile
+ (eval
+ '(unless (fboundp 'base64-decode-string)
+ (require 'base64))))
+
+(require 'qp)
+(require 'mm-util)
+(require 'ietf-drums)
+(require 'mail-prsvr)
+
+(defvar rfc2047-header-encoding-alist
+ '(("Newsgroups" . nil)
+ ("Message-ID" . nil)
+ (t . mime))
+ "*Header/encoding method alist.
+The list is traversed sequentially. The keys can either be
+header regexps or `t'.
+
+The values can be:
+
+1) nil, in which case no encoding is done;
+2) `mime', in which case the header will be encoded according to RFC2047;
+3) a charset, in which case it will be encoded as that charset;
+4) `default', in which case the field will be encoded as the rest
+ of the article.")
+
+(defvar rfc2047-charset-encoding-alist
+ '((us-ascii . nil)
+ (iso-8859-1 . Q)
+ (iso-8859-2 . Q)
+ (iso-8859-3 . Q)
+ (iso-8859-4 . Q)
+ (iso-8859-5 . B)
+ (koi8-r . B)
+ (iso-8859-7 . Q)
+ (iso-8859-8 . Q)
+ (iso-8859-9 . Q)
+ (iso-2022-jp . B)
+ (iso-2022-kr . B)
+ (gb2312 . B)
+ (cn-gb . B)
+ (cn-gb-2312 . B)
+ (euc-kr . B)
+ (iso-2022-jp-2 . B)
+ (iso-2022-int-1 . B))
+ "Alist of MIME charsets to RFC2047 encodings.
+Valid encodings are nil, `Q' and `B'.")
+
+(defvar rfc2047-encoding-function-alist
+ '((Q . rfc2047-q-encode-region)
+ (B . rfc2047-b-encode-region)
+ (nil . ignore))
+ "Alist of RFC2047 encodings to encoding functions.")
+
+(defvar rfc2047-q-encoding-alist
+ '(("\\(From\\|Cc\\|To\\|Bcc\||Reply-To\\):" . "-A-Za-z0-9!*+/=_")
+ ("." . "^\000-\007\011\013\015-\037\200-\377=_?"))
+ "Alist of header regexps and valid Q characters.")
+
+;;;
+;;; Functions for encoding RFC2047 messages
+;;;
+
+(defun rfc2047-narrow-to-field ()
+ "Narrow the buffer to the header on the current line."
+ (beginning-of-line)
+ (narrow-to-region
+ (point)
+ (progn
+ (forward-line 1)
+ (if (re-search-forward "^[^ \n\t]" nil t)
+ (progn
+ (beginning-of-line)
+ (point))
+ (point-max))))
+ (goto-char (point-min)))
+
+(defun rfc2047-encode-message-header ()
+ "Encode the message header according to `rfc2047-header-encoding-alist'.
+Should be called narrowed to the head of the message."
+ (interactive "*")
+ (save-excursion
+ (goto-char (point-min))
+ (let (alist elem method)
+ (while (not (eobp))
+ (save-restriction
+ (rfc2047-narrow-to-field)
+ (if (not (rfc2047-encodable-p))
+ (if (and (eq (mm-body-7-or-8) '8bit)
+ (mm-multibyte-p)
+ (mm-coding-system-p
+ (car message-posting-charset)))
+ ;; 8 bit must be decoded.
+ ;; Is message-posting-charset a coding system?
+ (mm-encode-coding-region
+ (point-min) (point-max)
+ (car message-posting-charset)))
+ ;; We found something that may perhaps be encoded.
+ (setq method nil
+ alist rfc2047-header-encoding-alist)
+ (while (setq elem (pop alist))
+ (when (or (and (stringp (car elem))
+ (looking-at (car elem)))
+ (eq (car elem) t))
+ (setq alist nil
+ method (cdr elem))))
+ (cond
+ ((eq method 'mime)
+ (rfc2047-encode-region (point-min) (point-max))
+ (rfc2047-fold-region (point-min) (point-max)))
+ ((eq method 'default)
+ (if (and (featurep 'mule)
+ mail-parse-charset)
+ (mm-encode-coding-region (point-min) (point-max)
+ mail-parse-charset)))
+ ((mm-coding-system-p method)
+ (if (featurep 'mule)
+ (mm-encode-coding-region (point-min) (point-max) method)))
+ ;; Hm.
+ (t)))
+ (goto-char (point-max)))))))
+
+(defun rfc2047-encodable-p (&optional header)
+ "Say whether the current (narrowed) buffer contains characters that need encoding in headers."
+ (let ((charsets
+ (mapcar
+ 'mm-mime-charset
+ (mm-find-charset-region (point-min) (point-max))))
+ (cs (list 'us-ascii (car message-posting-charset)))
+ found)
+ (while charsets
+ (unless (memq (pop charsets) cs)
+ (setq found t)))
+ found))
+
+(defun rfc2047-dissect-region (b e)
+ "Dissect the region between B and E into words."
+ (let ((all-specials (concat ietf-drums-tspecials " \t\n\r"))
+ (special-list (mapcar 'identity ietf-drums-tspecials))
+ (blank-list '(? ?\t ?\n ?\r))
+ words current cs state mail-parse-mule-charset)
+ (save-restriction
+ (narrow-to-region b e)
+ (goto-char (point-min))
+ (skip-chars-forward all-specials)
+ (setq b (point))
+ (while (not (eobp))
+ (cond
+ ((not state)
+ (setq state 'word)
+ (if (not (eq (setq cs (mm-charset-after)) 'ascii))
+ (setq current cs))
+ (setq b (point)))
+ ((eq state 'blank)
+ (cond
+ ((memq (char-after) special-list)
+ (setq state nil))
+ ((memq (char-after) blank-list))
+ (t
+ (setq state 'word)
+ (unless b
+ (setq b (point)))
+ (if (not (eq (setq cs (mm-charset-after)) 'ascii))
+ (setq current cs)))))
+ ((eq state 'word)
+ (cond
+ ((memq (char-after) special-list)
+ (setq state nil)
+ (push (list b (point) current) words)
+ (setq current nil))
+ ((memq (char-after) blank-list)
+ (setq state 'blank)
+ (if (not current)
+ (setq b nil)
+ (push (list b (point) current) words)
+ (setq b (point))
+ (setq current nil)))
+ ((or (eq (setq cs (mm-charset-after)) 'ascii)
+ (if current
+ (eq current cs)
+ (setq current cs))))
+ (t
+ (push (list b (point) current) words)
+ (setq current cs)
+ (setq b (point))))))
+ (if state
+ (forward-char)
+ (skip-chars-forward all-specials)))
+ (if (eq state 'word)
+ (push (list b (point) current) words)))
+ words))
+
+(defun rfc2047-encode-region (b e)
+ "Encode all encodable words in REGION."
+ (let ((words (rfc2047-dissect-region b e))
+ beg end current word)
+ (while (setq word (pop words))
+ (if (equal (nth 2 word) current)
+ (setq beg (nth 0 word))
+ (when current
+ (if (and (eq beg (nth 1 word)) (nth 2 word))
+ (progn
+ ;; There might be a bug in Emacs Mule.
+ ;; A space must be inserted before encoding.
+ (goto-char beg)
+ (insert " ")
+ (rfc2047-encode (1+ beg) (1+ end) current))
+ (rfc2047-encode beg end current)))
+ (setq current (nth 2 word)
+ beg (nth 0 word)
+ end (nth 1 word))))
+ (when current
+ (rfc2047-encode beg end current))))
+
+(defun rfc2047-encode-string (string)
+ "Encode words in STRING."
+ (with-temp-buffer
+ (insert string)
+ (rfc2047-encode-region (point-min) (point-max))
+ (buffer-string)))
+
+(defun rfc2047-encode (b e charset)
+ "Encode the word in the region with CHARSET."
+ (let* ((mime-charset (mm-mime-charset charset))
+ (encoding (or (cdr (assq mime-charset
+ rfc2047-charset-encoding-alist))
+ 'B))
+ (start (concat
+ "=?" (downcase (symbol-name mime-charset)) "?"
+ (downcase (symbol-name encoding)) "?"))
+ (first t))
+ (save-restriction
+ (narrow-to-region b e)
+ (when (eq encoding 'B)
+ ;; break into lines before encoding
+ (goto-char (point-min))
+ (while (not (eobp))
+ (goto-char (min (point-max) (+ 15 (point))))
+ (unless (eobp)
+ (insert "\n"))))
+ (if (and (mm-multibyte-p)
+ (mm-coding-system-p mime-charset))
+ (mm-encode-coding-region (point-min) (point-max) mime-charset))
+ (funcall (cdr (assq encoding rfc2047-encoding-function-alist))
+ (point-min) (point-max))
+ (goto-char (point-min))
+ (while (not (eobp))
+ (unless first
+ (insert " "))
+ (setq first nil)
+ (insert start)
+ (end-of-line)
+ (insert "?=")
+ (forward-line 1)))))
+
+(defun rfc2047-fold-region (b e)
+ "Fold the long lines in the region."
+ (save-restriction
+ (narrow-to-region b e)
+ (goto-char (point-min))
+ (let ((break nil))
+ (while (not (eobp))
+ (cond
+ ((memq (char-after) '(? ?\t))
+ (setq break (point)))
+ ((and (not break)
+ (looking-at "=\\?"))
+ (setq break (point)))
+ ((and break
+ (looking-at "\\?=")
+ (> (- (point) (save-excursion (beginning-of-line) (point))) 76))
+ (goto-char break)
+ (setq break nil)
+ (insert "\n ")))
+ (unless (eobp)
+ (forward-char 1))))))
+
+(defun rfc2047-b-encode-region (b e)
+ "Encode the header contained in REGION with the B encoding."
+ (save-restriction
+ (narrow-to-region (goto-char b) e)
+ (while (not (eobp))
+ (base64-encode-region (point) (progn (end-of-line) (point)) t)
+ (if (and (bolp) (eolp))
+ (delete-backward-char 1))
+ (forward-line))))
+
+(defun rfc2047-q-encode-region (b e)
+ "Encode the header contained in REGION with the Q encoding."
+ (save-excursion
+ (save-restriction
+ (narrow-to-region (goto-char b) e)
+ (let ((alist rfc2047-q-encoding-alist))
+ (while alist
+ (when (looking-at (caar alist))
+ (quoted-printable-encode-region b e nil (cdar alist))
+ (subst-char-in-region (point-min) (point-max) ? ?_)
+ (setq alist nil))
+ (pop alist))
+ (goto-char (point-min))
+ (while (not (eobp))
+ (goto-char (min (point-max) (+ 64 (point))))
+ (search-backward "=" (- (point) 2) t)
+ (unless (eobp)
+ (insert "\n")))))))
+
+;;;
+;;; Functions for decoding RFC2047 messages
+;;;
+
+(defvar rfc2047-encoded-word-regexp
+ "=\\?\\([^][\000-\040()<>@,\;:\\\"/?.=]+\\)\\?\\(B\\|Q\\)\\?\\([!->@-~ +]+\\)\\?=")
+
+(defun rfc2047-decode-region (start end)
+ "Decode MIME-encoded words in region between START and END."
+ (interactive "r")
+ (let ((case-fold-search t)
+ b e)
+ (save-excursion
+ (save-restriction
+ (narrow-to-region start end)
+ (goto-char (point-min))
+ ;; Remove whitespace between encoded words.
+ (while (re-search-forward
+ (concat "\\(" rfc2047-encoded-word-regexp "\\)"
+ "\\(\n?[ \t]\\)+"
+ "\\(" rfc2047-encoded-word-regexp "\\)")
+ nil t)
+ (delete-region (goto-char (match-end 1)) (match-beginning 6)))
+ ;; Decode the encoded words.
+ (setq b (goto-char (point-min)))
+ (while (re-search-forward rfc2047-encoded-word-regexp nil t)
+ (setq e (match-beginning 0))
+ (insert (rfc2047-parse-and-decode
+ (prog1
+ (match-string 0)
+ (delete-region (match-beginning 0) (match-end 0)))))
+ (when (and (mm-multibyte-p)
+ mail-parse-charset
+ (not (eq mail-parse-charset 'gnus-decoded)))
+ (mm-decode-coding-region b e mail-parse-charset))
+ (setq b (point)))
+ (when (and (mm-multibyte-p)
+ mail-parse-charset
+ (not (eq mail-parse-charset 'us-ascii))
+ (not (eq mail-parse-charset 'gnus-decoded)))
+ (mm-decode-coding-region b (point-max) mail-parse-charset))))))
+
+(defun rfc2047-decode-string (string)
+ "Decode the quoted-printable-encoded STRING and return the results."
+ (let ((m (mm-multibyte-p)))
+ (with-temp-buffer
+ (when m
+ (mm-enable-multibyte))
+ (insert string)
+ (inline
+ (rfc2047-decode-region (point-min) (point-max)))
+ (buffer-string))))
+
+(defun rfc2047-parse-and-decode (word)
+ "Decode WORD and return it if it is an encoded word.
+Return WORD if not."
+ (if (not (string-match rfc2047-encoded-word-regexp word))
+ word
+ (or
+ (condition-case nil
+ (rfc2047-decode
+ (match-string 1 word)
+ (upcase (match-string 2 word))
+ (match-string 3 word))
+ (error word))
+ word)))
+
+(defun rfc2047-decode (charset encoding string)
+ "Decode STRING that uses CHARSET with ENCODING.
+Valid ENCODINGs are \"B\" and \"Q\".
+If your Emacs implementation can't decode CHARSET, it returns nil."
+ (if (stringp charset)
+ (setq charset (intern (downcase charset))))
+ (if (or (not charset)
+ (eq 'gnus-all mail-parse-ignored-charsets)
+ (memq 'gnus-all mail-parse-ignored-charsets)
+ (memq charset mail-parse-ignored-charsets))
+ (setq charset mail-parse-charset))
+ (let ((cs (mm-charset-to-coding-system charset)))
+ (if (and (not cs) charset
+ (listp mail-parse-ignored-charsets)
+ (memq 'gnus-unknown mail-parse-ignored-charsets))
+ (setq cs (mm-charset-to-coding-system mail-parse-charset)))
+ (when cs
+ (when (and (eq cs 'ascii)
+ mail-parse-charset)
+ (setq cs mail-parse-charset))
+ (mm-decode-coding-string
+ (cond
+ ((equal "B" encoding)
+ (base64-decode-string string))
+ ((equal "Q" encoding)
+ (quoted-printable-decode-string
+ (mm-replace-chars-in-string string ?_ ? )))
+ (t (error "Invalid encoding: %s" encoding)))
+ cs))))
+
+(provide 'rfc2047)
+
+;;; rfc2047.el ends here
--- /dev/null
+;;; rfc2104.el --- RFC2104 Hashed Message Authentication Codes
+;; Copyright (C) 1998,1999 Free Software Foundation, Inc.
+
+;; Author: Simon Josefsson <jas@pdc.kth.se>
+;; Keywords: mail
+
+;; This file is part of GNU Emacs.
+
+;; GNU Emacs 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 Emacs 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 Emacs; see the file COPYING. If not, write to the
+;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;; Boston, MA 02111-1307, USA.
+
+;;; Commentary:
+
+;;; This is a quick'n'dirty, low performance, implementation of RFC2104.
+;;;
+;;; Example:
+;;;
+;;; (require 'md5)
+;;; (rfc2104-hash 'md5 64 16 "Jefe" "what do ya want for nothing?")
+;;; "750c783e6ab0b503eaa86e310a5db738"
+;;;
+;;; 64 is block length of hash function (64 for MD5 and SHA), 16 is
+;;; resulting hash length (16 for MD5, 20 for SHA).
+;;;
+;;; Tested with Emacs 20.2 and XEmacs 20.3.
+
+;;; Release history:
+;;;
+;;; 1998-08-16 initial release posted to gnu.emacs.sources
+;;; 1998-08-17 use append instead of char-list-to-string
+;;; 1998-08-26 don't require hexl
+;;; 1998-09-25 renamed from hmac.el to rfc2104.el, also renamed functions
+;;; 1999-10-23 included in pgnus
+
+(eval-when-compile (require 'cl))
+
+;; Magic character for inner HMAC round. 0x36 == 54 == '6'
+(defconst rfc2104-ipad ?\x36)
+
+;; Magic character for outer HMAC round. 0x5C == 92 == '\'
+(defconst rfc2104-opad ?\x5C)
+
+;; Not so magic character for padding the key. 0x00
+(defconst rfc2104-zero ?\x00)
+
+;; Alist for converting hex to decimal.
+(defconst rfc2104-hex-alist
+ '((?0 . 0) (?a . 10) (?A . 10)
+ (?1 . 1) (?b . 11) (?B . 11)
+ (?2 . 2) (?c . 12) (?C . 12)
+ (?3 . 3) (?d . 13) (?D . 13)
+ (?4 . 4) (?e . 14) (?E . 14)
+ (?5 . 5) (?f . 15) (?F . 15)
+ (?6 . 6)
+ (?7 . 7)
+ (?8 . 8)
+ (?9 . 9)))
+
+(defun rfc2104-hex-to-int (str)
+ (if str
+ (if (listp str)
+ (+ (* 16 (rfc2104-hex-to-int (cdr str)))
+ (cdr (assoc (car str) rfc2104-hex-alist)))
+ (rfc2104-hex-to-int (reverse (append str nil))))
+ 0))
+
+(defun rfc2104-hash (hash block-length hash-length key text)
+ (let* (;; if key is longer than B, reset it to HASH(key)
+ (key (if (> (length key) block-length)
+ (funcall hash key) key))
+ (k_ipad (append key nil))
+ (k_opad (append key nil)))
+ ;; zero pad k_ipad/k_opad
+ (while (< (length k_ipad) block-length)
+ (setq k_ipad (append k_ipad (list rfc2104-zero))))
+ (while (< (length k_opad) block-length)
+ (setq k_opad (append k_opad (list rfc2104-zero))))
+ ;; XOR key with ipad/opad into k_ipad/k_opad
+ (setq k_ipad (mapcar (lambda (c) (logxor c rfc2104-ipad)) k_ipad))
+ (setq k_opad (mapcar (lambda (c) (logxor c rfc2104-opad)) k_opad))
+ ;; perform inner hash
+ (let ((first-round (funcall hash (concat k_ipad text)))
+ de-hexed)
+ (while (< 0 (length first-round))
+ (push (rfc2104-hex-to-int (substring first-round -2)) de-hexed)
+ (setq first-round (substring first-round 0 -2)))
+ ;; perform outer hash
+ (funcall hash (concat k_opad de-hexed)))))
+
+(provide 'rfc2104)
+
+;;; rfc2104.el ends here
--- /dev/null
+;;; rfc2231.el --- Functions for decoding rfc2231 headers
+
+;; Copyright (C) 1998, 1999, 2000 Free Software Foundation, Inc.
+
+;; Author: Lars Magne Ingebrigtsen <larsi@gnus.org>
+;; This file is part of GNU Emacs.
+
+;; GNU Emacs 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 Emacs 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 Emacs; see the file COPYING. If not, write to the
+;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;; Boston, MA 02111-1307, USA.
+
+;;; Commentary:
+
+;;; Code:
+
+(require 'ietf-drums)
+
+(defun rfc2231-get-value (ct attribute)
+ "Return the value of ATTRIBUTE from CT."
+ (cdr (assq attribute (cdr ct))))
+
+(defun rfc2231-parse-string (string)
+ "Parse STRING and return a list.
+The list will be on the form
+ `(name (attribute . value) (attribute . value)...)"
+ (with-temp-buffer
+ (let ((ttoken (ietf-drums-token-to-list ietf-drums-text-token))
+ (stoken (ietf-drums-token-to-list ietf-drums-tspecials))
+ (ntoken (ietf-drums-token-to-list "0-9"))
+ (prev-value "")
+ display-name mailbox c display-string parameters
+ attribute value type subtype number encoded
+ prev-attribute)
+ (ietf-drums-init (mail-header-remove-whitespace
+ (mail-header-remove-comments string)))
+ (let ((table (copy-syntax-table ietf-drums-syntax-table)))
+ (modify-syntax-entry ?\' "w" table)
+ ;; The following isn't valid, but one should be liberal
+ ;; in what one receives.
+ (modify-syntax-entry ?\: "w" table)
+ (set-syntax-table table))
+ (setq c (char-after))
+ (when (and (memq c ttoken)
+ (not (memq c stoken)))
+ (setq type (downcase (buffer-substring
+ (point) (progn (forward-sexp 1) (point)))))
+ ;; Do the params
+ (while (not (eobp))
+ (setq c (char-after))
+ (unless (eq c ?\;)
+ (error "Invalid header: %s" string))
+ (forward-char 1)
+ ;; If c in nil, then this is an invalid header, but
+ ;; since elm generates invalid headers on this form,
+ ;; we allow it.
+ (when (setq c (char-after))
+ (if (and (memq c ttoken)
+ (not (memq c stoken)))
+ (setq attribute
+ (intern
+ (downcase
+ (buffer-substring
+ (point) (progn (forward-sexp 1) (point))))))
+ (error "Invalid header: %s" string))
+ (setq c (char-after))
+ (setq encoded nil)
+ (when (eq c ?*)
+ (forward-char 1)
+ (setq c (char-after))
+ (when (memq c ntoken)
+ (setq number
+ (string-to-number
+ (buffer-substring
+ (point) (progn (forward-sexp 1) (point)))))
+ (setq c (char-after))
+ (when (eq c ?*)
+ (setq encoded t)
+ (forward-char 1)
+ (setq c (char-after)))))
+ ;; See if we have any previous continuations.
+ (when (and prev-attribute
+ (not (eq prev-attribute attribute)))
+ (push (cons prev-attribute prev-value) parameters)
+ (setq prev-attribute nil
+ prev-value ""))
+ (unless (eq c ?=)
+ (error "Invalid header: %s" string))
+ (forward-char 1)
+ (setq c (char-after))
+ (cond
+ ((eq c ?\")
+ (setq value
+ (buffer-substring (1+ (point))
+ (progn (forward-sexp 1) (1- (point))))))
+ ((and (memq c ttoken)
+ (not (memq c stoken)))
+ (setq value (buffer-substring
+ (point) (progn (forward-sexp 1) (point)))))
+ (t
+ (error "Invalid header: %s" string)))
+ (when encoded
+ (setq value (rfc2231-decode-encoded-string value)))
+ (if number
+ (setq prev-attribute attribute
+ prev-value (concat prev-value value))
+ (push (cons attribute value) parameters))))
+
+ ;; Take care of any final continuations.
+ (when prev-attribute
+ (push (cons prev-attribute prev-value) parameters))
+
+ (when type
+ `(,type ,@(nreverse parameters)))))))
+
+(defun rfc2231-decode-encoded-string (string)
+ "Decode an RFC2231-encoded string.
+These look like \"us-ascii'en-us'This%20is%20%2A%2A%2Afun%2A%2A%2A\"."
+ (with-temp-buffer
+ (let ((elems (split-string string "'")))
+ ;; The encoded string may contain zero to two single-quote
+ ;; marks. This should give us the encoded word stripped
+ ;; of any preceding values.
+ (insert (car (last elems)))
+ (goto-char (point-min))
+ (while (search-forward "%" nil t)
+ (insert
+ (prog1
+ (string-to-number (buffer-substring (point) (+ (point) 2)) 16)
+ (delete-region (1- (point)) (+ (point) 2)))))
+ ;; Encode using the charset, if any.
+ (when (and (< (length elems) 1)
+ (not (equal (intern (car elems)) 'us-ascii)))
+ (mm-decode-coding-region (point-min) (point-max)
+ (intern (car elems))))
+ (buffer-string))))
+
+(defun rfc2231-encode-string (param value)
+ "Return and PARAM=VALUE string encoded according to RFC2231."
+ (let ((control (ietf-drums-token-to-list ietf-drums-no-ws-ctl-token))
+ (tspecial (ietf-drums-token-to-list ietf-drums-tspecials))
+ (special (ietf-drums-token-to-list "*'%\n\t"))
+ (ascii (ietf-drums-token-to-list ietf-drums-text-token))
+ (num -1)
+ spacep encodep charsetp charset broken)
+ (with-temp-buffer
+ (insert value)
+ (goto-char (point-min))
+ (while (not (eobp))
+ (cond
+ ((or (memq (following-char) control)
+ (memq (following-char) tspecial)
+ (memq (following-char) special))
+ (setq encodep t))
+ ((eq (following-char) ? )
+ (setq spacep t))
+ ((not (memq (following-char) ascii))
+ (setq charsetp t)))
+ (forward-char 1))
+ (when charsetp
+ (setq charset (mm-encode-body)))
+ (cond
+ ((or encodep charsetp)
+ (goto-char (point-min))
+ (while (not (eobp))
+ (when (> (current-column) 60)
+ (insert "\n")
+ (setq broken t))
+ (if (or (not (memq (following-char) ascii))
+ (memq (following-char) control)
+ (memq (following-char) tspecial)
+ (memq (following-char) special)
+ (eq (following-char) ? ))
+ (progn
+ (insert "%" (format "%02x" (following-char)))
+ (delete-char 1))
+ (forward-char 1)))
+ (goto-char (point-min))
+ (insert (or charset "ascii") "''")
+ (goto-char (point-min))
+ (if (not broken)
+ (insert param "*=")
+ (while (not (eobp))
+ (insert param "*" (format "%d" (incf num)) "*=")
+ (forward-line 1))))
+ (spacep
+ (goto-char (point-min))
+ (insert param "=\"")
+ (goto-char (point-max))
+ (insert "\""))
+ (t
+ (goto-char (point-min))
+ (insert param "=")))
+ (buffer-string))))
+
+(provide 'rfc2231)
+
+;;; rfc2231.el ends here
--- /dev/null
+;;; time-date.el --- Date and time handling functions
+;; Copyright (C) 1998, 1999, 2000 Free Software Foundation, Inc.
+
+;; Author: Lars Magne Ingebrigtsen <larsi@gnus.org>
+;; Masanobu Umeda <umerin@mse.kyutech.ac.jp>
+;; Keywords: mail news util
+
+;; This file is part of GNU Emacs.
+
+;; GNU Emacs 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 Emacs 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 Emacs; see the file COPYING. If not, write to the
+;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;; Boston, MA 02111-1307, USA.
+
+;;; Commentary:
+
+;;; Code:
+
+(require 'parse-time)
+
+;;;###autoload
+(defun date-to-time (date)
+ "Convert DATE into time."
+ (condition-case ()
+ (apply 'encode-time (parse-time-string date))
+ (error (error "Invalid date: %s" date))))
+
+(defun time-to-seconds (time)
+ "Convert TIME to a floating point number."
+ (+ (* (car time) 65536.0)
+ (cadr time)
+ (/ (or (nth 2 time) 0) 1000000.0)))
+
+(defun seconds-to-time (seconds)
+ "Convert SECONDS (a floating point number) to an Emacs time structure."
+ (list (floor seconds 65536)
+ (floor (mod seconds 65536))
+ (floor (* (- seconds (ffloor seconds)) 1000000))))
+
+(defun time-less-p (t1 t2)
+ "Say whether time T1 is less than time T2."
+ (or (< (car t1) (car t2))
+ (and (= (car t1) (car t2))
+ (< (nth 1 t1) (nth 1 t2)))))
+
+(defun days-to-time (days)
+ "Convert DAYS into time."
+ (let* ((seconds (* 1.0 days 60 60 24))
+ (rest (expt 2 16))
+ (ms (condition-case nil (floor (/ seconds rest))
+ (range-error (expt 2 16)))))
+ (list ms (condition-case nil (round (- seconds (* ms rest)))
+ (range-error (expt 2 16))))))
+
+(defun time-since (time)
+ "Return the time since TIME, which is either an internal time or a date."
+ (when (stringp time)
+ ;; Convert date strings to internal time.
+ (setq time (date-to-time time)))
+ (let* ((current (current-time))
+ (rest (when (< (nth 1 current) (nth 1 time))
+ (expt 2 16))))
+ (list (- (+ (car current) (if rest -1 0)) (car time))
+ (- (+ (or rest 0) (nth 1 current)) (nth 1 time)))))
+
+(defun subtract-time (t1 t2)
+ "Subtract two internal times."
+ (let ((borrow (< (cadr t1) (cadr t2))))
+ (list (- (car t1) (car t2) (if borrow 1 0))
+ (- (+ (if borrow 65536 0) (cadr t1)) (cadr t2)))))
+
+(defun date-to-day (date)
+ "Return the number of days between year 1 and DATE."
+ (time-to-days (date-to-time date)))
+
+(defun days-between (date1 date2)
+ "Return the number of days between DATE1 and DATE2."
+ (- (date-to-day date1) (date-to-day date2)))
+
+(defun date-leap-year-p (year)
+ "Return t if YEAR is a leap year."
+ (or (and (zerop (% year 4))
+ (not (zerop (% year 100))))
+ (zerop (% year 400))))
+
+(defun time-to-day-in-year (time)
+ "Return the day number within the year of the date month/day/year."
+ (let* ((tim (decode-time time))
+ (month (nth 4 tim))
+ (day (nth 3 tim))
+ (year (nth 5 tim))
+ (day-of-year (+ day (* 31 (1- month)))))
+ (when (> month 2)
+ (setq day-of-year (- day-of-year (/ (+ 23 (* 4 month)) 10)))
+ (when (date-leap-year-p year)
+ (setq day-of-year (1+ day-of-year))))
+ day-of-year))
+
+(defun time-to-days (time)
+ "The number of days between the Gregorian date 0001-12-31bce and TIME.
+The Gregorian date Sunday, December 31, 1bce is imaginary."
+ (let* ((tim (decode-time time))
+ (month (nth 4 tim))
+ (day (nth 3 tim))
+ (year (nth 5 tim)))
+ (+ (time-to-day-in-year time) ; Days this year
+ (* 365 (1- year)) ; + Days in prior years
+ (/ (1- year) 4) ; + Julian leap years
+ (- (/ (1- year) 100)) ; - century years
+ (/ (1- year) 400)))) ; + Gregorian leap years
+
+;;;###autoload
+(defun safe-date-to-time (date)
+ "Parse DATE and return a time structure.
+If DATE is malformed, a zero time will be returned."
+ (condition-case ()
+ (date-to-time date)
+ (error '(0 0))))
+
+(provide 'time-date)
+
+;;; time-date.el ends here
--- /dev/null
+;;; utf7.el --- UTF-7 encoding/decoding for Emacs
+;; Copyright (C) 1999, 2000 Free Software Foundation, Inc.
+
+;; Author: Jon K Hellan <hellan@acm.org>
+;; Keywords: mail
+
+;; This file is part of GNU Emacs.
+
+;; GNU Emacs 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 Emacs 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 Emacs; see the file COPYING. If not, write to
+;; the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;; Boston, MA 02111-1307, USA.
+
+;;; Commentary:
+;;; UTF-7 - A Mail-Safe Transformation Format of Unicode - RFC 2152
+;;; This is a transformation format of Unicode that contains only 7-bit
+;;; ASCII octets and is intended to be readable by humans in the limiting
+;;; case that the document consists of characters from the US-ASCII
+;;; repertoire.
+;;; In short, runs of characters outside US-ASCII are encoded as base64
+;;; inside delimiters.
+;;; A variation of UTF-7 is specified in IMAP 4rev1 (RFC 2060) as the way
+;;; to represent characters outside US-ASCII in mailbox names in IMAP.
+;;; This library supports both variants, but the IMAP variation was the
+;;; reason I wrote it.
+;;; The routines convert UTF-7 -> UTF-16 (16 bit encoding of Unicode)
+;;; -> current character set, and vice versa.
+;;; However, until Emacs supports Unicode, the only Emacs character set
+;;; supported here is ISO-8859.1, which can trivially be converted to/from
+;;; Unicode.
+;;; When decoding results in a character outside the Emacs character set,
+;;; an error is thrown. It is up to the application to recover.
+
+;;; Code:
+
+(require 'base64)
+
+(defvar utf7-direct-encoding-chars " -%'-*,-[]-}"
+ "Character ranges which do not need escaping in UTF-7.")
+
+(defvar utf7-imap-direct-encoding-chars
+ (concat utf7-direct-encoding-chars "+\\~")
+ "Character ranges which do not need escaping in the IMAP variant of UTF-7.")
+
+(defsubst utf7-imap-get-pad-length (len modulus)
+ "Return required length of padding for IMAP modified base64 fragment."
+ (mod (- len) modulus))
+
+(defun utf7-encode-internal (&optional for-imap)
+ "Encode text in (temporary) buffer as UTF-7.
+Use IMAP modification if FOR-IMAP is non-nil."
+ (let ((start (point-min))
+ (end (point-max)))
+ (narrow-to-region start end)
+ (goto-char start)
+ (let ((esc-char (if for-imap ?& ?+))
+ (direct-encoding-chars
+ (if for-imap utf7-imap-direct-encoding-chars
+ utf7-direct-encoding-chars)))
+ (while (not (eobp))
+ (skip-chars-forward direct-encoding-chars)
+ (unless (eobp)
+ (insert esc-char)
+ (let ((p (point))
+ (fc (following-char))
+ (run-length
+ (skip-chars-forward (concat "^" direct-encoding-chars))))
+ (if (and (= fc esc-char)
+ (= run-length 1)) ; Lone esc-char?
+ (delete-backward-char 1) ; Now there's one too many
+ (utf7-fragment-encode p (point) for-imap))
+ (insert "-")))))))
+
+(defun utf7-fragment-encode (start end &optional for-imap)
+ "Encode text from START to END in buffer as UTF-7 escape fragment.
+Use IMAP modification if FOR-IMAP is non-nil."
+ (save-restriction
+ (narrow-to-region start end)
+ (funcall (utf7-get-u16char-converter 'to-utf-16))
+ (base64-encode-region start (point-max))
+ (goto-char start)
+ (let ((pm (point-max)))
+ (when for-imap
+ (while (search-forward "/" nil t)
+ (replace-match ",")))
+ (skip-chars-forward "^= \t\n" pm)
+ (delete-region (point) pm))))
+
+(defun utf7-decode-internal (&optional for-imap)
+ "Decode UTF-7 text in (temporary) buffer.
+Use IMAP modification if FOR-IMAP is non-nil."
+ (let ((start (point-min))
+ (end (point-max)))
+ (goto-char start)
+ (let* ((esc-pattern (concat "^" (char-to-string (if for-imap ?& ?+))))
+ (base64-chars (concat "A-Za-z0-9+"
+ (char-to-string (if for-imap ?, ?/)))))
+ (while (not (eobp))
+ (skip-chars-forward esc-pattern)
+ (unless (eobp)
+ (forward-char)
+ (let ((p (point))
+ (run-length (skip-chars-forward base64-chars)))
+ (when (and (not (eobp)) (= (following-char) ?-))
+ (delete-char 1))
+ (unless (= run-length 0) ; Encoded lone esc-char?
+ (save-excursion
+ (utf7-fragment-decode p (point) for-imap)
+ (goto-char p)
+ (delete-backward-char 1)))))))))
+
+(defun utf7-fragment-decode (start end &optional for-imap)
+ "Decode base64 encoded fragment from START to END of UTF-7 text in buffer.
+Use IMAP modification if FOR-IMAP is non-nil."
+ (save-restriction
+ (narrow-to-region start end)
+ (when for-imap
+ (goto-char start)
+ (while (search-forward "," nil 'move-to-end) (replace-match "/")))
+ (let ((pl (utf7-imap-get-pad-length (- end start) 4)))
+ (insert (make-string pl ?=))
+ (base64-decode-region start (+ end pl)))
+ (funcall (utf7-get-u16char-converter 'from-utf-16))))
+
+(defun utf7-get-u16char-converter (which-way)
+ "Return a function to convert between UTF-16 and current character set."
+ ;; Add test to check if we are really Latin-1.
+ ;; Support other character sets once Emacs groks Unicode.
+ (if (eq which-way 'to-utf-16)
+ 'utf7-latin1-u16-char-converter
+ 'utf7-u16-latin1-char-converter))
+
+(defun utf7-latin1-u16-char-converter ()
+ "Convert latin 1 (ISO-8859.1) characters to 16 bit Unicode.
+Characters are converted to raw byte pairs in narrowed buffer."
+ (goto-char (point-min))
+ (while (not (eobp))
+ (insert 0)
+ (forward-char)))
+
+(defun utf7-u16-latin1-char-converter ()
+ "Convert 16 bit Unicode characters to latin 1 (ISO-8859.1).
+Characters are in raw byte pairs in narrowed buffer."
+ (goto-char (point-min))
+ (while (not (eobp))
+ (if (= 0 (following-char))
+ (delete-char 1)
+ (error "Unable to convert from Unicode"))
+ (forward-char)))
+
+(defun utf7-encode (string &optional for-imap)
+ "Encode UTF-7 STRING. Use IMAP modification if FOR-IMAP is non-nil."
+ (let ((default-enable-multibyte-characters nil))
+ (with-temp-buffer
+ (insert string)
+ (utf7-encode-internal for-imap)
+ (buffer-string))))
+
+(defun utf7-decode (string &optional for-imap)
+ "Decode UTF-7 STRING. Use IMAP modification if FOR-IMAP is non-nil."
+ (let ((default-enable-multibyte-characters nil))
+ (with-temp-buffer
+ (insert string)
+ (utf7-decode-internal for-imap)
+ (buffer-string))))
+
+(provide 'utf7)
+
+;;; utf7.el ends here
--- /dev/null
+;;; uudecode.el -- elisp native uudecode
+
+;; Copyright (c) 1998, 1999, 2000 Free Software Foundation, Inc.
+
+;; Author: Shenghuo Zhu <zsh@cs.rochester.edu>
+;; Keywords: uudecode news
+
+;; This file is a part of GNU Emacs.
+
+;; GNU Emacs 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 Emacs 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 Emacs; see the file COPYING. If not, write to the
+;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;; Boston, MA 02111-1307, USA.
+
+;;; Commentary:
+
+;; Lots of codes are stolen from mm-decode.el, gnus-uu.el and
+;; base64.el
+
+;;; Code:
+
+(if (not (fboundp 'char-int))
+ (defalias 'char-int 'identity))
+
+(defcustom uudecode-decoder-program "uudecode"
+ "*Non-nil value should be a string that names a uu decoder.
+The program should expect to read uu data on its standard
+input and write the converted data to its standard output."
+ :type 'string
+ :group 'gnus-extract)
+
+(defcustom uudecode-decoder-switches nil
+ "*List of command line flags passed to `uudecode-decoder-program'."
+ :group 'gnus-extract
+ :type '(repeat string))
+
+(defconst uudecode-alphabet "\040-\140")
+
+(defconst uudecode-begin-line "^begin[ \t]+[0-7][0-7][0-7][ \t]+\\(.*\\)$")
+(defconst uudecode-end-line "^end[ \t]*$")
+
+(defconst uudecode-body-line
+ (let ((i 61) (str "^M"))
+ (while (> (setq i (1- i)) 0)
+ (setq str (concat str "[^a-z]")))
+ (concat str ".?$")))
+
+(defvar uudecode-temporary-file-directory
+ (cond ((fboundp 'temp-directory) (temp-directory))
+ ((boundp 'temporary-file-directory) temporary-file-directory)
+ ("/tmp")))
+
+;;;###autoload
+(defun uudecode-decode-region-external (start end &optional file-name)
+ "Uudecode region between START and END with external decoder.
+
+If FILE-NAME is non-nil, save the result to FILE-NAME."
+ (interactive "r\nP")
+ (let ((cbuf (current-buffer)) tempfile firstline work-buffer status)
+ (save-excursion
+ (goto-char start)
+ (when (re-search-forward uudecode-begin-line nil t)
+ (forward-line 1)
+ (setq firstline (point))
+ (cond ((null file-name))
+ ((stringp file-name))
+ (t
+ (setq file-name (read-file-name "File to Name:"
+ nil nil nil
+ (match-string 1)))))
+ (setq tempfile (if file-name
+ (expand-file-name file-name)
+ (make-temp-name
+ ;; /tmp/uu...
+ (expand-file-name
+ "uu" uudecode-temporary-file-directory))))
+ (let ((cdir default-directory) default-process-coding-system)
+ (unwind-protect
+ (progn
+ (set-buffer (setq work-buffer
+ (generate-new-buffer " *uudecode-work*")))
+ (buffer-disable-undo work-buffer)
+ (insert "begin 600 " (file-name-nondirectory tempfile) "\n")
+ (insert-buffer-substring cbuf firstline end)
+ (cd (file-name-directory tempfile))
+ (apply 'call-process-region
+ (point-min)
+ (point-max)
+ uudecode-decoder-program
+ nil
+ nil
+ nil
+ uudecode-decoder-switches))
+ (cd cdir) (set-buffer cbuf)))
+ (if (file-exists-p tempfile)
+ (unless file-name
+ (goto-char start)
+ (delete-region start end)
+ (let (format-alist)
+ (insert-file-contents-literally tempfile)))
+ (message "Can not uudecode")))
+ (and work-buffer (kill-buffer work-buffer))
+ (ignore-errors (or file-name (delete-file tempfile))))))
+
+(if (string-match "XEmacs" emacs-version)
+ (defalias 'uudecode-insert-char 'insert-char)
+ (defun uudecode-insert-char (char &optional count ignored buffer)
+ (if (or (null buffer) (eq buffer (current-buffer)))
+ (insert-char char count)
+ (with-current-buffer buffer
+ (insert-char char count)))))
+
+;;;###autoload
+
+(defun uudecode-decode-region (start end &optional file-name)
+ "Uudecode region between START and END.
+If FILE-NAME is non-nil, save the result to FILE-NAME."
+ (interactive "r\nP")
+ (let ((work-buffer nil)
+ (done nil)
+ (counter 0)
+ (remain 0)
+ (bits 0)
+ (lim 0) inputpos
+ (non-data-chars (concat "^" uudecode-alphabet)))
+ (unwind-protect
+ (save-excursion
+ (goto-char start)
+ (when (re-search-forward uudecode-begin-line nil t)
+ (cond ((null file-name))
+ ((stringp file-name))
+ (t
+ (setq file-name (expand-file-name
+ (read-file-name "File to Name:"
+ nil nil nil
+ (match-string 1))))))
+ (setq work-buffer (generate-new-buffer " *uudecode-work*"))
+ (buffer-disable-undo work-buffer)
+ (forward-line 1)
+ (skip-chars-forward non-data-chars end)
+ (while (not done)
+ (setq inputpos (point))
+ (setq remain 0 bits 0 counter 0)
+ (cond
+ ((> (skip-chars-forward uudecode-alphabet end) 0)
+ (setq lim (point))
+ (setq remain
+ (logand (- (char-int (char-after inputpos)) 32) 63))
+ (setq inputpos (1+ inputpos))
+ (if (= remain 0) (setq done t))
+ (while (and (< inputpos lim) (> remain 0))
+ (setq bits (+ bits
+ (logand
+ (-
+ (char-int (char-after inputpos)) 32) 63)))
+ (if (/= counter 0) (setq remain (1- remain)))
+ (setq counter (1+ counter)
+ inputpos (1+ inputpos))
+ (cond ((= counter 4)
+ (uudecode-insert-char
+ (lsh bits -16) 1 nil work-buffer)
+ (uudecode-insert-char
+ (logand (lsh bits -8) 255) 1 nil work-buffer)
+ (uudecode-insert-char (logand bits 255) 1 nil
+ work-buffer)
+ (setq bits 0 counter 0))
+ (t (setq bits (lsh bits 6)))))))
+ (cond
+ (done)
+ ((> 0 remain)
+ (error "uucode line ends unexpectly")
+ (setq done t))
+ ((and (= (point) end) (not done))
+ ;;(error "uucode ends unexpectly")
+ (setq done t))
+ ((= counter 3)
+ (uudecode-insert-char (logand (lsh bits -16) 255) 1 nil
+ work-buffer)
+ (uudecode-insert-char (logand (lsh bits -8) 255) 1 nil
+ work-buffer))
+ ((= counter 2)
+ (uudecode-insert-char (logand (lsh bits -10) 255) 1 nil
+ work-buffer)))
+ (skip-chars-forward non-data-chars end))
+ (if file-name
+ (save-excursion
+ (set-buffer work-buffer)
+ (write-file file-name))
+ (or (markerp end) (setq end (set-marker (make-marker) end)))
+ (goto-char start)
+ (insert-buffer-substring work-buffer)
+ (delete-region (point) end))))
+ (and work-buffer (kill-buffer work-buffer)))))
+
+(provide 'uudecode)
+
+;;; uudecode.el ends here
--- /dev/null
+;;; webmail.el --- interfacing with web mail
+;; Copyright (C) 1999, 2000 Free Software Foundation, Inc.
+
+;; Author: Shenghuo Zhu <zsh@cs.rochester.edu>
+;; Keywords: hotmail netaddress my-deja netscape
+
+;; This file is part of GNU Emacs.
+
+;; GNU Emacs 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 Emacs 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 Emacs; see the file COPYING. If not, write to the
+;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;; Boston, MA 02111-1307, USA.
+
+;;; Commentary:
+
+;; Note: Now mail.yahoo.com provides POP3 service, the webmail
+;; fetching is not going to be supported.
+
+;; Note: You need to have `url' and `w3' installed for this backend to
+;; work. `w3' must be 4.0pre46+one-line-cookie patch or standalone
+;; `url'.
+
+;; Todo: To support more web mail servers.
+
+;; Known bugs:
+;; 1. Net@ddress may corrupt `X-Face'.
+
+;; Warning:
+;; Webmail is an experimental function, which means NO WARRANTY.
+
+;;; Code:
+
+(eval-when-compile (require 'cl))
+
+(require 'nnoo)
+(require 'message)
+(require 'gnus-util)
+(require 'gnus)
+(require 'nnmail)
+(require 'mm-util)
+(require 'mml)
+(eval-when-compile
+ (ignore-errors
+ (require 'w3)
+ (require 'url)
+ (require 'url-cookie)
+ (require 'w3-forms)
+ (require 'nnweb)))
+;; Report failure to find w3 at load time if appropriate.
+(eval '(progn
+ (require 'w3)
+ (require 'url)
+ (require 'url-cookie)
+ (require 'w3-forms)
+ (require 'nnweb)))
+
+;;;
+
+(defvar webmail-type-definition
+ '((hotmail
+ ;; Hotmail hate other HTTP user agents and use one line cookie
+ (paranoid agent cookie post)
+ (address . "www.hotmail.com")
+ (open-url "http://www.hotmail.com/")
+ (open-snarf . webmail-hotmail-open)
+ ;; W3 hate redirect POST
+ (login-url
+ "http://%s/cgi-bin/dologin?login=%s&passwd=%s&enter=Sign+in&sec=no&curmbox=ACTIVE&_lang=&js=yes&id=2&tw=-10000&beta="
+ webmail-aux user password)
+ ;;(login-snarf . webmail-hotmail-login)
+ ;;(list-url "%s" webmail-aux)
+ (list-snarf . webmail-hotmail-list)
+ (article-snarf . webmail-hotmail-article)
+ (trash-url
+ "%s&login=%s&f=33792&curmbox=ACTIVE&_lang=&foo=inbox&js=&page=&%s=on&_HMaction=MoveTo&tobox=trAsH&nullbox="
+ webmail-aux user id))
+ (yahoo
+ (paranoid agent cookie post)
+ (address . "mail.yahoo.com")
+ (open-url "http://mail.yahoo.com/")
+ (open-snarf . webmail-yahoo-open)
+ (login-url;; yahoo will not accept GET
+ content
+ ("%s" webmail-aux)
+ ".tries=&.src=ym&.last=&promo=&.intl=&.bypass=&.partner=&.chkP=Y&.done=&login=%s&passwd=%s"
+ user password)
+ (login-snarf . webmail-yahoo-login)
+ (list-url "%s&rb=Inbox&YN=1" webmail-aux)
+ (list-snarf . webmail-yahoo-list)
+ (article-snarf . webmail-yahoo-article)
+ (trash-url
+ "%s/ym/ShowFolder?YY=52107&inc=50&order=down&sort=date&pos=0&box=Inbox&DEL=Delete&destBox=&Mid=%s&destBox2="
+ webmail-aux id))
+ (netaddress
+ (paranoid cookie post)
+ (address . "www.netaddress.com")
+ (open-url "http://www.netaddress.com/")
+ (open-snarf . webmail-netaddress-open)
+ (login-url
+ content
+ ("%s" webmail-aux)
+ "LoginState=2&SuccessfulLogin=%%2Ftpl&NewServerName=www.netaddress.com&JavaScript=JavaScript1.2&DomainID=4&NA31site=classic.netaddress.com&NA31port=80&UserID=%s&passwd=%s"
+ user password)
+ (login-snarf . webmail-netaddress-login)
+ (list-url
+ "http://www.netaddress.com/tpl/Mail/%s/List?FolderID=-4&SortUseCase=True"
+ webmail-session)
+ (list-snarf . webmail-netaddress-list)
+ (article-url "http://www.netaddress.com/")
+ (article-snarf . webmail-netaddress-article)
+ (trash-url
+ "http://www.netaddress.com/tpl/Message/%s/Move?FolderID=-4&Q=%s&N=&Sort=Date&F=-1"
+ webmail-session id))
+ (netscape
+ (paranoid cookie post agent)
+ (address . "webmail.netscape.com")
+ (open-url "http://ureg.netscape.com/iiop/UReg2/login/login?U2_LA=en&U2_BACK_FROM_CJ=true&U2_CS=iso-8859-1&U2_ENDURL=http://webmail.netscape.com/tpl/Subscribe/Step1&U2_NEW_ENDURL=http://webmail.netscape.com/tpl/Subscribe/Step1&U2_EXITURL=http://home.netscape.com/&U2_SOURCE=Webmail")
+ (open-snarf . webmail-netscape-open)
+ (login-url
+ content
+ ("http://ureg.netscape.com/iiop/UReg2/login/loginform")
+ "%s&U2_USERNAME=%s&U2_PASSWORD=%s"
+ webmail-aux user password)
+ (login-snarf . webmail-netaddress-login)
+ (list-url
+ "http://webmail.netscape.com/tpl/Mail/%s/List?FolderID=-4&SortUseCase=True"
+ webmail-session)
+ (list-snarf . webmail-netaddress-list)
+ (article-url "http://webmail.netscape.com/")
+ (article-snarf . webmail-netscape-article)
+ (trash-url
+ "http://webmail.netscape.com/tpl/Message/%s/Move?FolderID=-4&Q=%s&N=&Sort=Date&F=-1"
+ webmail-session id))
+ (my-deja
+ (paranoid cookie post)
+ (address . "www.my-deja.com")
+ (open-url "http://www.my-deja.com/")
+ (open-snarf . webmail-my-deja-open)
+ (login-url
+ content
+ ("%s" webmail-aux)
+ "member_name=%s&pw=%s&go=&priv_opt_MyDeja99="
+ user password)
+ (list-url "http://www.deja.com/rg_gotomail.xp")
+ (list-snarf . webmail-my-deja-list)
+ (article-snarf . webmail-my-deja-article)
+ (trash-url
+ "%s/gmm_multiplex.femail?%%2Fgmm_domovemesg_top.femail=Move+to%%3A&folder_top=%s%%3Azzz%%3A%%7E6trash%%3AF%%3A0&docid=%s"
+ webmail-aux user id))))
+
+(defvar webmail-variables
+ '(address article-snarf article-url list-snarf list-url
+ login-url login-snarf open-url open-snarf site articles
+ post-process paranoid trash-url))
+
+(defconst webmail-version "webmail 1.0")
+
+(defvar webmail-newmail-only nil
+ "Only fetch new mails.")
+
+(defvar webmail-move-to-trash-can t
+ "Move mail to trash can after fetch it.")
+
+;;; Internal variables
+
+(defvar webmail-address nil)
+(defvar webmail-paranoid nil)
+(defvar webmail-aux nil)
+(defvar webmail-session nil)
+(defvar webmail-article-snarf nil)
+(defvar webmail-article-url nil)
+(defvar webmail-list-snarf nil)
+(defvar webmail-list-url nil)
+(defvar webmail-login-url nil)
+(defvar webmail-login-snarf nil)
+(defvar webmail-open-snarf nil)
+(defvar webmail-open-url nil)
+(defvar webmail-trash-url nil)
+(defvar webmail-articles nil)
+(defvar webmail-post-process nil)
+
+(defvar webmail-buffer nil)
+(defvar webmail-buffer-list nil)
+
+(defvar webmail-type nil)
+
+(defvar webmail-error-function nil)
+
+(defvar webmail-debug-file "~/.emacs-webmail-debug")
+
+;;; Interface functions
+
+(defun webmail-debug (str)
+ (with-temp-buffer
+ (insert "\n---------------- A bug at " str " ------------------\n")
+ (mapcar #'(lambda (sym)
+ (if (boundp sym)
+ (pp `(setq ,sym ',(eval sym)) (current-buffer))))
+ '(webmail-type user))
+ (insert "---------------- webmail buffer ------------------\n\n")
+ (insert-buffer-substring webmail-buffer)
+ (insert "\n---------------- end of buffer ------------------\n\n")
+ (append-to-file (point-min) (point-max) webmail-debug-file)))
+
+(defun webmail-error (str)
+ (if webmail-error-function
+ (funcall webmail-error-function str))
+ (message "%s HTML has changed; please get a new version of webmail (%s)"
+ webmail-type str)
+ (error "%s HTML has changed; please get a new version of webmail (%s)"
+ webmail-type str))
+
+(defun webmail-setdefault (type)
+ (let ((type-def (cdr (assq type webmail-type-definition)))
+ (vars webmail-variables)
+ pair)
+ (setq webmail-type type)
+ (dolist (var vars)
+ (if (setq pair (assq var type-def))
+ (set (intern (concat "webmail-" (symbol-name var))) (cdr pair))
+ (set (intern (concat "webmail-" (symbol-name var))) nil)))))
+
+(defun webmail-encode-www-form-urlencoded (pairs)
+ "Return PAIRS encoded for forms."
+ (mapconcat
+ (function
+ (lambda (data)
+ (concat (w3-form-encode-xwfu (car data)) "="
+ (w3-form-encode-xwfu (cdr data)))))
+ pairs "&"))
+
+(defun webmail-fetch-simple (url content)
+ (let ((url-request-data content)
+ (url-request-method "POST")
+ (url-request-extra-headers
+ '(("Content-type" . "application/x-www-form-urlencoded"))))
+ (nnweb-insert url))
+ t)
+
+(defun webmail-fetch-form (url pairs)
+ (let ((url-request-data (webmail-encode-www-form-urlencoded pairs))
+ (url-request-method "POST")
+ (url-request-extra-headers
+ '(("Content-type" . "application/x-www-form-urlencoded"))))
+ (nnweb-insert url))
+ t)
+
+(defun webmail-eval (expr)
+ (cond
+ ((consp expr)
+ (cons (webmail-eval (car expr)) (webmail-eval (cdr expr))))
+ ((symbolp expr)
+ (eval expr))
+ (t
+ expr)))
+
+(defun webmail-url (xurl)
+ (mm-with-unibyte-current-buffer
+ (cond
+ ((eq (car xurl) 'content)
+ (pop xurl)
+ (webmail-fetch-simple (if (stringp (car xurl))
+ (car xurl)
+ (apply 'format (webmail-eval (car xurl))))
+ (apply 'format (webmail-eval (cdr xurl)))))
+ ((eq (car xurl) 'post)
+ (pop xurl)
+ (webmail-fetch-form (car xurl) (webmail-eval (cdr xurl))))
+ (t
+ (nnweb-insert (apply 'format (webmail-eval xurl)))))))
+
+(defun webmail-init ()
+ "Initialize buffers and such."
+ (if (gnus-buffer-live-p webmail-buffer)
+ (set-buffer webmail-buffer)
+ (setq webmail-buffer
+ (mm-with-unibyte
+ (nnheader-set-temp-buffer " *webmail*")))))
+
+(defvar url-package-name)
+(defvar url-package-version)
+(defvar url-cookie-multiple-line)
+(defvar url-confirmation-func)
+
+;; Hack W3 POST redirect. See `url-parse-mime-headers'.
+;;
+;; Netscape uses "GET" as redirect method when orignal method is POST
+;; and status is 302, .i.e no security risks by default without
+;; confirmation.
+;;
+;; Some web servers (at least Apache used by yahoo) return status 302
+;; instead of 303, though they mean 303.
+
+(defun webmail-url-confirmation-func (prompt)
+ (cond
+ ((equal prompt (concat "Honor redirection with non-GET method "
+ "(possible security risks)? "))
+ nil)
+ ((equal prompt "Continue (with method of GET)? ")
+ t)
+ (t (error prompt))))
+
+(defun webmail-refresh-redirect ()
+ "Redirect refresh url in META."
+ (goto-char (point-min))
+ (while (re-search-forward
+ "<meta[ \t\r\n]*http-equiv=\"Refresh\"[^>]*URL=\\([^\"]+\\)\""
+ nil t)
+ (let ((url (match-string 1)))
+ (erase-buffer)
+ (mm-with-unibyte-current-buffer
+ (nnweb-insert url)))
+ (goto-char (point-min))))
+
+(defun webmail-fetch (file subtype user password)
+ (save-excursion
+ (webmail-setdefault subtype)
+ (let ((url-package-name (if (memq 'agent webmail-paranoid)
+ "Mozilla"
+ url-package-name))
+ (url-package-version (if (memq 'agent webmail-paranoid)
+ "4.0"
+ url-package-version))
+ (url-cookie-multiple-line (if (memq 'cookie webmail-paranoid)
+ nil
+ url-cookie-multiple-line))
+ (url-confirmation-func (if (memq 'post webmail-paranoid)
+ 'webmail-url-confirmation-func
+ url-confirmation-func))
+ (url-http-silence-on-insecure-redirection t)
+ url-cookie-storage url-cookie-secure-storage
+ url-cookie-confirmation
+ item id (n 0))
+ (webmail-init)
+ (setq webmail-articles nil)
+ (when webmail-open-url
+ (erase-buffer)
+ (webmail-url webmail-open-url))
+ (if webmail-open-snarf (funcall webmail-open-snarf))
+ (when webmail-login-url
+ (erase-buffer)
+ (webmail-url webmail-login-url))
+ (if webmail-login-snarf
+ (funcall webmail-login-snarf))
+ (when webmail-list-url
+ (erase-buffer)
+ (webmail-url webmail-list-url))
+ (if webmail-list-snarf
+ (funcall webmail-list-snarf))
+ (while (setq item (pop webmail-articles))
+ (message "Fetching mail #%d..." (setq n (1+ n)))
+ (erase-buffer)
+ (mm-with-unibyte-current-buffer
+ (nnweb-insert (cdr item)))
+ (setq id (car item))
+ (if webmail-article-snarf
+ (funcall webmail-article-snarf file id))
+ (when (and webmail-trash-url webmail-move-to-trash-can)
+ (message "Move mail #%d to trash can..." n)
+ (condition-case err
+ (progn
+ (webmail-url webmail-trash-url)
+ (let (buf)
+ (while (setq buf (pop webmail-buffer-list))
+ (kill-buffer buf))))
+ (error
+ (let (buf)
+ (while (setq buf (pop webmail-buffer-list))
+ (kill-buffer buf)))
+ (error err))))))
+ (if webmail-post-process
+ (funcall webmail-post-process))))
+
+(defun webmail-encode-8bit ()
+ (goto-char (point-min))
+ (skip-chars-forward "^\200-\377")
+ (while (not (eobp))
+ (insert (format "&%d;" (mm-char-int (char-after))))
+ (delete-char 1)
+ (skip-chars-forward "^\200-\377")))
+
+;;; hotmail
+
+(defun webmail-hotmail-open ()
+ (goto-char (point-min))
+ (if (re-search-forward
+ "action=\"https?://\\([^/]+\\)/cgi-bin/dologin" nil t)
+ (setq webmail-aux (match-string 1))
+ (webmail-error "open@1")))
+
+(defun webmail-hotmail-login ()
+ (let (site)
+ (goto-char (point-min))
+ (if (re-search-forward
+ "https?://\\([^/]+hotmail\\.msn\\.com\\)/cgi-bin/" nil t)
+ (setq site (match-string 1))
+ (webmail-error "login@1"))
+ (goto-char (point-min))
+ (if (re-search-forward
+ "\\(/cgi-bin/HoTMaiL\\?[^\"]*a=b[^\"]*\\)" nil t)
+ (setq webmail-aux (concat "http://" site (match-string 1)))
+ (webmail-error "login@2"))))
+
+(defun webmail-hotmail-list ()
+ (let (site url newp)
+ (goto-char (point-min))
+ (if (re-search-forward "[0-9]+ new" nil t)
+ (message "Found %s" (match-string 0))
+ (webmail-error "maybe your w3 version is too old"))
+ (goto-char (point-min))
+ (if (re-search-forward
+ "https?://\\([^/]+hotmail\\.msn\\.com\\)/cgi-bin/" nil t)
+ (setq site (match-string 1))
+ (webmail-error "list@1"))
+ (goto-char (point-min))
+ (if (re-search-forward "disk=\\([^&]+\\)&" nil t)
+ (setq webmail-aux
+ (concat "http://" site "/cgi-bin/HoTMaiL?disk="
+ (match-string 1)))
+ (webmail-error "list@2"))
+ (goto-char (point-max))
+ (while (re-search-backward
+ "newmail\\.gif\\|href=\"\\(/cgi-bin/getmsg\\?[^\"]+\\)\""
+ nil t)
+ (if (setq url (match-string 1))
+ (progn
+ (if (or newp (not webmail-newmail-only))
+ (let (id)
+ (if (string-match "msg=\\([^&]+\\)" url)
+ (setq id (match-string 1 url)))
+ (push (cons id (concat "http://" site url "&raw=0"))
+ webmail-articles)))
+ (setq newp nil))
+ (setq newp t)))))
+
+;; Thank victor@idaccr.org (Victor S. Miller) for raw=0
+
+(defun webmail-hotmail-article (file id)
+ (goto-char (point-min))
+ (if (not (search-forward "<pre>" nil t))
+ (webmail-error "article@3"))
+ (skip-chars-forward "\n\r\t ")
+ (delete-region (point-min) (point))
+ (if (not (search-forward "</pre>" nil t))
+ (webmail-error "article@3.1"))
+ (delete-region (match-beginning 0) (point-max))
+ (nnweb-remove-markup)
+ (let ((w3-html-entities (cons '(nbsp . 32) w3-html-entities)))
+ (nnweb-decode-entities))
+ (goto-char (point-min))
+ (while (re-search-forward "\r\n?" nil t)
+ (replace-match "\n"))
+ (goto-char (point-min))
+ (insert "\n\n")
+ (if (not (looking-at "\n*From "))
+ (insert "From nobody " (current-time-string) "\n")
+ (forward-line))
+ (insert "X-Gnus-Webmail: " (symbol-value 'user)
+ "@" (symbol-name webmail-type) "\n")
+ (mm-append-to-file (point-min) (point-max) file))
+
+(defun webmail-hotmail-article-old (file id)
+ (let (p attachment count mime hotmail-direct)
+ (save-restriction
+ (webmail-encode-8bit)
+ (goto-char (point-min))
+ (if (not (search-forward "<DIV>" nil t))
+ (if (not (search-forward "Reply All" nil t))
+ (webmail-error "article@1")
+ (setq hotmail-direct t))
+ (goto-char (match-beginning 0)))
+ (narrow-to-region (point-min) (point))
+ (if (not (search-backward "<table" nil t 2))
+ (webmail-error "article@1.1"))
+ (delete-region (point-min) (match-beginning 0))
+ (while (search-forward "<a href=" nil t)
+ (setq p (match-beginning 0))
+ (search-forward "</a>" nil t)
+ (delete-region p (match-end 0)))
+ (nnweb-remove-markup)
+ (let ((w3-html-entities (cons '(nbsp . 32) w3-html-entities)))
+ (nnweb-decode-entities))
+ (goto-char (point-min))
+ (delete-blank-lines)
+ (goto-char (point-min))
+ (when (search-forward "\n\n" nil t)
+ (backward-char)
+ (delete-region (point) (point-max)))
+ (goto-char (point-max))
+ (widen)
+ (insert "\n")
+ (setq p (point))
+ (while (re-search-forward
+ "<tt>\\|<div>\\|\\(http://[^/]+/cgi-bin/getmsg/\\([^\?]+\\)\?[^\"]*\\)\""
+ nil t)
+ (if (setq attachment (match-string 1))
+ (let ((filename (match-string 2))
+ bufname);; Attachment
+ (delete-region p (match-end 0))
+ (save-excursion
+ (set-buffer (generate-new-buffer " *webmail-att*"))
+ (nnweb-insert attachment)
+ (push (current-buffer) webmail-buffer-list)
+ (setq bufname (buffer-name)))
+ (setq mime t)
+ (insert "<#part type="
+ (or (and filename
+ (string-match "\\.[^\\.]+$" filename)
+ (mailcap-extension-to-mime
+ (match-string 0 filename)))
+ "application/octet-stream"))
+ (insert " buffer=\"" bufname "\"")
+ (insert " filename=\"" filename "\"")
+ (insert " disposition=\"inline\"")
+ (insert "><#/part>\n")
+ (setq p (point)))
+ (delete-region p (match-end 0))
+ (if hotmail-direct
+ (if (not (search-forward "</tt>" nil t))
+ (webmail-error "article@1.2")
+ (delete-region (match-beginning 0) (match-end 0)))
+ (setq count 1)
+ (while (and (> count 0)
+ (re-search-forward "</div>\\|\\(<div>\\)" nil t))
+ (if (match-string 1)
+ (setq count (1+ count))
+ (if (= (setq count (1- count)) 0)
+ (delete-region (match-beginning 0)
+ (match-end 0))))))
+ (narrow-to-region p (point))
+ (goto-char (point-min))
+ (cond
+ ((looking-at "<pre>")
+ (goto-char (match-end 0))
+ (if (looking-at "$") (forward-char))
+ (delete-region (point-min) (point))
+ (nnweb-remove-markup)
+ (let ((w3-html-entities (cons '(nbsp . 32) w3-html-entities)))
+ (nnweb-decode-entities))
+ nil)
+ (t
+ (setq mime t)
+ (insert "<#part type=\"text/html\" disposition=inline>")
+ (goto-char (point-max))
+ (insert "<#/part>")))
+ (goto-char (point-max))
+ (setq p (point))
+ (widen)))
+ (delete-region p (point-max))
+ (goto-char (point-min))
+ ;; Some blank line to seperate mails.
+ (insert "\n\nFrom nobody " (current-time-string) "\n")
+ (insert "X-Gnus-Webmail: " (symbol-value 'user)
+ "@" (symbol-name webmail-type) "\n")
+ (if id
+ (insert (format "X-Message-ID: <%s@hotmail.com>\n" id)))
+ (unless (looking-at "$")
+ (if (search-forward "\n\n" nil t)
+ (forward-line -1)
+ (webmail-error "article@2")))
+ (narrow-to-region (point) (point-max))
+ (if mime
+ (insert "MIME-Version: 1.0\n"
+ (prog1
+ (mml-generate-mime)
+ (delete-region (point-min) (point-max)))))
+ (goto-char (point-min))
+ (widen)
+ (let (case-fold-search)
+ (while (re-search-forward "^From " nil t)
+ (beginning-of-line)
+ (insert ">"))))
+ (mm-append-to-file (point-min) (point-max) file)))
+
+;;; yahoo
+
+(defun webmail-yahoo-open ()
+ (goto-char (point-min))
+ (if (re-search-forward "action=\"\\([^\"]+\\)\"" nil t)
+ (setq webmail-aux (match-string 1))
+ (webmail-error "open@1")))
+
+(defun webmail-yahoo-login ()
+ (goto-char (point-min))
+ (if (re-search-forward "http://[^/]+[0-9]\\.mail\\.yahoo\\.com/" nil t)
+ (setq webmail-aux (match-string 0))
+ (webmail-error "login@1"))
+ (if (re-search-forward "YY=[0-9]+" nil t)
+ (setq webmail-aux (concat webmail-aux "ym/ShowFolder?"
+ (match-string 0)))
+ (webmail-error "login@2")))
+
+(defun webmail-yahoo-list ()
+ (let (url (newp t) (tofetch 0))
+ (goto-char (point-min))
+ (when (re-search-forward
+ "showing [0-9]+-\\([0-9]+\\) of \\([0-9]+\\)" nil t)
+ ;;(setq listed (match-string 1))
+ (message "Found %s mail(s)" (match-string 2)))
+ (if (string-match "http://[^/]+" webmail-aux)
+ (setq webmail-aux (match-string 0 webmail-aux))
+ (webmail-error "list@1"))
+ (goto-char (point-min))
+ (while (re-search-forward
+ "bgcolor=\"#eeeeee\"\\|href=\"\\(/ym/ShowLetter\\?MsgId=\\([^&]+\\)&[^\"]*\\)\""
+ nil t)
+ (if (setq url (match-string 1))
+ (progn
+ (when (or newp (not webmail-newmail-only))
+ (push (cons (match-string 2) (concat webmail-aux url "&toc=1"))
+ webmail-articles)
+ (setq tofetch (1+ tofetch)))
+ (setq newp t))
+ (setq newp nil)))
+ (setq webmail-articles (nreverse webmail-articles))
+ (message "Fetching %d mail(s)" tofetch)))
+
+(defun webmail-yahoo-article (file id)
+ (let (p attachment)
+ (save-restriction
+ (goto-char (point-min))
+ (if (not (search-forward "value=\"Done\"" nil t))
+ (webmail-error "article@1"))
+ (if (not (search-forward "<table" nil t))
+ (webmail-error "article@2"))
+ (delete-region (point-min) (match-beginning 0))
+ (if (not (search-forward "</table>" nil t))
+ (webmail-error "article@3"))
+ (narrow-to-region (point-min) (match-end 0))
+ (while (search-forward "<a href=" nil t)
+ (setq p (match-beginning 0))
+ (search-forward "</a>" nil t)
+ (delete-region p (match-end 0)))
+ (nnweb-remove-markup)
+ (let ((w3-html-entities (cons '(nbsp . 32) w3-html-entities)))
+ (nnweb-decode-entities))
+ (goto-char (point-min))
+ (delete-blank-lines)
+ (goto-char (point-max))
+ (widen)
+ (insert "\n")
+ (setq p (point))
+ (while (re-search-forward "[^\"]*/ShowLetter/[^\?]+\?[^\"]*" nil t)
+ (setq attachment (match-string 0))
+ (let (bufname ct ctl cd description)
+ (if (not (search-forward "<table" nil t))
+ (webmail-error "article@4"))
+ (delete-region p (match-beginning 0))
+ (if (not (search-forward "</table>" nil t))
+ (webmail-error "article@5"))
+ (narrow-to-region p (match-end 0))
+ (nnweb-remove-markup)
+ (let ((w3-html-entities (cons '(nbsp . 32) w3-html-entities)))
+ (nnweb-decode-entities))
+ (goto-char (point-min))
+ (delete-blank-lines)
+ (setq ct (mail-fetch-field "content-type")
+ ctl (ignore-errors (mail-header-parse-content-type ct))
+ ;;cte (mail-fetch-field "content-transfer-encoding")
+ cd (mail-fetch-field "content-disposition")
+ description (mail-fetch-field "content-description")
+ id (mail-fetch-field "content-id"))
+ (delete-region (point-min) (point-max))
+ (widen)
+ (save-excursion
+ (set-buffer (generate-new-buffer " *webmail-att*"))
+ (nnweb-insert (concat webmail-aux attachment))
+ (push (current-buffer) webmail-buffer-list)
+ (setq bufname (buffer-name)))
+ (insert "<#part")
+ (if (and ctl (not (equal (car ctl) "text/")))
+ (insert " type=\"" (car ctl) "\""))
+ (insert " buffer=\"" bufname "\"")
+ (if cd
+ (insert " disposition=\"" cd "\""))
+ (if description
+ (insert " description=\"" description "\""))
+ (insert "><#/part>\n")
+ (setq p (point))))
+ (delete-region p (point-max))
+ (goto-char (point-min))
+ ;; Some blank line to seperate mails.
+ (insert "\n\nFrom nobody " (current-time-string) "\n")
+ (insert "X-Gnus-Webmail: " (symbol-value 'user)
+ "@" (symbol-name webmail-type) "\n")
+ (if id
+ (insert (format "X-Message-ID: <%s@yahoo.com>\n" id)))
+ (unless (looking-at "$")
+ (if (search-forward "\n\n" nil t)
+ (forward-line -1)
+ (webmail-error "article@2")))
+ (narrow-to-region (point) (point-max))
+ (insert "MIME-Version: 1.0\n"
+ (prog1
+ (mml-generate-mime)
+ (delete-region (point-min) (point-max))))
+ (goto-char (point-min))
+ (widen)
+ (let (case-fold-search)
+ (while (re-search-forward "^From " nil t)
+ (beginning-of-line)
+ (insert ">"))))
+ (mm-append-to-file (point-min) (point-max) file)))
+
+;;; netaddress
+
+(defun webmail-netscape-open ()
+ (goto-char (point-min))
+ (if (re-search-forward "login/hint\\?\\([^\"]+\\)\"" nil t)
+ (setq webmail-aux (match-string 1))
+ (webmail-error "open@1")))
+
+(defun webmail-netaddress-open ()
+ (goto-char (point-min))
+ (if (re-search-forward "action=\"\\([^\"]+\\)\"" nil t)
+ (setq webmail-aux (concat (car webmail-open-url) (match-string 1)))
+ (webmail-error "open@1")))
+
+(defun webmail-netaddress-login ()
+ (webmail-refresh-redirect)
+ (goto-char (point-min))
+ (if (re-search-forward "tpl/[^/]+/\\([^/]+\\)" nil t)
+ (setq webmail-session (match-string 1))
+ (webmail-error "login@1")))
+
+(defun webmail-netaddress-list ()
+ (webmail-refresh-redirect)
+ (let (item id)
+ (goto-char (point-min))
+ (when (re-search-forward
+ "(\\([0-9]+\\) unread, \\([0-9]+\\) total)" nil t)
+ (message "Found %s mail(s), %s unread"
+ (match-string 2) (match-string 1)))
+ (goto-char (point-min))
+ (while (re-search-forward
+ "MR\\[i\\]\\.R='\\([^']*\\)'\\|MR\\[i\\]\\.Q='\\([^']+\\)'" nil t)
+ (if (setq id (match-string 2))
+ (setq item
+ (cons id
+ (format "%s/tpl/Message/%s/Read?Q=%s&FolderID=-4&SortUseCase=True&Sort=Date&Headers=True"
+ (car webmail-article-url)
+ webmail-session id)))
+ (if (or (not webmail-newmail-only)
+ (equal (match-string 1) "True"))
+ (push item webmail-articles))))
+ (setq webmail-articles (nreverse webmail-articles))))
+
+(defun webmail-netaddress-single-part ()
+ (goto-char (point-min))
+ (cond
+ ((looking-at "[\t\040\r\n]*<font face=[^>]+>[\t\040\r\n]*")
+ ;; text/plain
+ (replace-match "")
+ (while (re-search-forward "[\t\040\r\n]+" nil t)
+ (replace-match " "))
+ (goto-char (point-min))
+ (while (re-search-forward "<br>" nil t)
+ (replace-match "\n"))
+ (nnweb-remove-markup)
+ (let ((w3-html-entities (cons '(nbsp . 32) w3-html-entities)))
+ (nnweb-decode-entities))
+ nil)
+ (t
+ (insert "<#part type=\"text/html\" disposition=inline>")
+ (goto-char (point-max))
+ (insert "<#/part>")
+ t)))
+
+(defun webmail-netaddress-article (file id)
+ (webmail-refresh-redirect)
+ (let (p p1 attachment count mime type)
+ (save-restriction
+ (webmail-encode-8bit)
+ (goto-char (point-min))
+ (if (not (search-forward "Trash" nil t))
+ (webmail-error "article@1"))
+ (if (not (search-forward "<form>" nil t))
+ (webmail-error "article@2"))
+ (delete-region (point-min) (match-beginning 0))
+ (if (not (search-forward "</form>" nil t))
+ (webmail-error "article@3"))
+ (narrow-to-region (point-min) (match-end 0))
+ (goto-char (point-min))
+ (while (re-search-forward "[\040\t\r\n]+" nil t)
+ (replace-match " "))
+ (goto-char (point-min))
+ (while (search-forward "<b>" nil t)
+ (replace-match "\n"))
+ (nnweb-remove-markup)
+ (let ((w3-html-entities (cons '(nbsp . 32) w3-html-entities)))
+ (nnweb-decode-entities))
+ (goto-char (point-min))
+ (delete-blank-lines)
+ (goto-char (point-min))
+ (while (re-search-forward "^\040+\\|\040+$" nil t)
+ (replace-match ""))
+ (goto-char (point-min))
+ (while (re-search-forward "\040+" nil t)
+ (replace-match " "))
+ (goto-char (point-max))
+ (widen)
+ (insert "\n\n")
+ (setq p (point))
+ (unless (search-forward "<!-- Data -->" nil t)
+ (webmail-error "article@4"))
+ (forward-line 14)
+ (delete-region p (point))
+ (goto-char (point-max))
+ (unless (re-search-backward
+ "[\040\t]*<br>[\040\t\r\n]*<br>[\040\t\r\n]*<form" p t)
+ (webmail-error "article@5"))
+ (delete-region (point) (point-max))
+ (goto-char p)
+ (while (search-forward
+ "<TABLE border=\"0\" WIDTH=\"98%\" cellpadding=0 cellspacing=0>"
+ nil t 2)
+ (setq mime t)
+ (unless (search-forward "</TABLE>" nil t)
+ (webmail-error "article@6"))
+ (setq p1 (point))
+ (if (search-backward "<IMG " p t)
+ (progn
+ (unless (re-search-forward "HREF=\"\\(/tpl/Attachment/[^/]+/\\([^/]+/[^\?]+\\)[^\"]+\\)\"" p1 t)
+ (webmail-error "article@7"))
+ (setq attachment (match-string 1))
+ (setq type (match-string 2))
+ (unless (search-forward "</TABLE>" nil t)
+ (webmail-error "article@8"))
+ (delete-region p (point))
+ (let (bufname);; Attachment
+ (save-excursion
+ (set-buffer (generate-new-buffer " *webmail-att*"))
+ (nnweb-insert (concat (car webmail-open-url) attachment))
+ (push (current-buffer) webmail-buffer-list)
+ (setq bufname (buffer-name)))
+ (insert "<#part type=" type)
+ (insert " buffer=\"" bufname "\"")
+ (insert " disposition=\"inline\"")
+ (insert "><#/part>\n")
+ (setq p (point))))
+ (delete-region p p1)
+ (narrow-to-region
+ p
+ (if (search-forward
+ "<TABLE border=\"0\" WIDTH=\"98%\" cellpadding=0 cellspacing=0>"
+ nil t)
+ (match-beginning 0)
+ (point-max)))
+ (webmail-netaddress-single-part)
+ (goto-char (point-max))
+ (setq p (point))
+ (widen)))
+ (unless mime
+ (narrow-to-region p (point-max))
+ (setq mime (webmail-netaddress-single-part))
+ (widen))
+ (goto-char (point-min))
+ ;; Some blank line to seperate mails.
+ (insert "\n\nFrom nobody " (current-time-string) "\n")
+ (insert "X-Gnus-Webmail: " (symbol-value 'user)
+ "@" (symbol-name webmail-type) "\n")
+ (if id
+ (insert (format "X-Message-ID: <%s@%s>\n" id webmail-address)))
+ (unless (looking-at "$")
+ (if (search-forward "\n\n" nil t)
+ (forward-line -1)
+ (webmail-error "article@2")))
+ (when mime
+ (narrow-to-region (point-min) (point))
+ (goto-char (point-min))
+ (while (not (eobp))
+ (if (looking-at "MIME-Version\\|Content-Type")
+ (delete-region (point)
+ (progn
+ (forward-line 1)
+ (if (re-search-forward "^[^ \t]" nil t)
+ (goto-char (match-beginning 0))
+ (point-max))))
+ (forward-line 1)))
+ (goto-char (point-max))
+ (widen)
+ (narrow-to-region (point) (point-max))
+ (insert "MIME-Version: 1.0\n"
+ (prog1
+ (mml-generate-mime)
+ (delete-region (point-min) (point-max))))
+ (goto-char (point-min))
+ (widen))
+ (let (case-fold-search)
+ (while (re-search-forward "^From " nil t)
+ (beginning-of-line)
+ (insert ">"))))
+ (mm-append-to-file (point-min) (point-max) file)))
+
+(defun webmail-netscape-article (file id)
+ (let (p p1 attachment count mime type)
+ (save-restriction
+ (webmail-encode-8bit)
+ (goto-char (point-min))
+ (if (not (search-forward "Trash" nil t))
+ (webmail-error "article@1"))
+ (if (not (search-forward "<form>" nil t))
+ (webmail-error "article@2"))
+ (delete-region (point-min) (match-beginning 0))
+ (if (not (search-forward "</form>" nil t))
+ (webmail-error "article@3"))
+ (narrow-to-region (point-min) (match-end 0))
+ (goto-char (point-min))
+ (while (re-search-forward "[\040\t\r\n]+" nil t)
+ (replace-match " "))
+ (goto-char (point-min))
+ (while (re-search-forward "<a href=[^>]*>[^<]*</a>" nil t)
+ (replace-match ""))
+ (goto-char (point-min))
+ (while (search-forward "<b>" nil t)
+ (replace-match "\n"))
+ (nnweb-remove-markup)
+ (let ((w3-html-entities (cons '(nbsp . 32) w3-html-entities)))
+ (nnweb-decode-entities))
+ (goto-char (point-min))
+ (delete-blank-lines)
+ (goto-char (point-min))
+ (while (re-search-forward "^\040+\\|\040+$" nil t)
+ (replace-match ""))
+ (goto-char (point-min))
+ (while (re-search-forward "\040+" nil t)
+ (replace-match " "))
+ (goto-char (point-max))
+ (widen)
+ (insert "\n\n")
+ (setq p (point))
+ (unless (search-forward "<!-- Data -->" nil t)
+ (webmail-error "article@4"))
+ (forward-line 14)
+ (delete-region p (point))
+ (goto-char (point-max))
+ (unless (re-search-backward
+ "<form name=\"Transfer2\"" p t)
+ (webmail-error "article@5"))
+ (delete-region (point) (point-max))
+ (goto-char p)
+ (while (search-forward
+ "<TABLE border=\"0\" WIDTH=\"98%\" cellpadding=0 cellspacing=0>"
+ nil t 2)
+ (setq mime t)
+ (unless (search-forward "</TABLE>" nil t)
+ (webmail-error "article@6"))
+ (setq p1 (point))
+ (if (search-backward "<IMG " p t)
+ (progn
+ (unless (re-search-forward "HREF=\"\\(/tpl/Attachment/[^/]+/\\([^/]+/[^\?]+\\)[^\"]+\\)\"" p1 t)
+ (webmail-error "article@7"))
+ (setq attachment (match-string 1))
+ (setq type (match-string 2))
+ (unless (search-forward "</TABLE>" nil t)
+ (webmail-error "article@8"))
+ (delete-region p (point))
+ (let (bufname);; Attachment
+ (save-excursion
+ (set-buffer (generate-new-buffer " *webmail-att*"))
+ (nnweb-insert (concat (car webmail-open-url) attachment))
+ (push (current-buffer) webmail-buffer-list)
+ (setq bufname (buffer-name)))
+ (insert "<#part type=" type)
+ (insert " buffer=\"" bufname "\"")
+ (insert " disposition=\"inline\"")
+ (insert "><#/part>\n")
+ (setq p (point))))
+ (delete-region p p1)
+ (narrow-to-region
+ p
+ (if (search-forward
+ "<TABLE border=\"0\" WIDTH=\"98%\" cellpadding=0 cellspacing=0>"
+ nil t)
+ (match-beginning 0)
+ (point-max)))
+ (webmail-netaddress-single-part)
+ (goto-char (point-max))
+ (setq p (point))
+ (widen)))
+ (unless mime
+ (narrow-to-region p (point-max))
+ (setq mime (webmail-netaddress-single-part))
+ (widen))
+ (goto-char (point-min))
+ ;; Some blank line to seperate mails.
+ (insert "\n\nFrom nobody " (current-time-string) "\n")
+ (insert "X-Gnus-Webmail: " (symbol-value 'user)
+ "@" (symbol-name webmail-type) "\n")
+ (if id
+ (insert (format "X-Message-ID: <%s@%s>\n" id webmail-address)))
+ (unless (looking-at "$")
+ (if (search-forward "\n\n" nil t)
+ (forward-line -1)
+ (webmail-error "article@2")))
+ (when mime
+ (narrow-to-region (point-min) (point))
+ (goto-char (point-min))
+ (while (not (eobp))
+ (if (looking-at "MIME-Version\\|Content-Type")
+ (delete-region (point)
+ (progn
+ (forward-line 1)
+ (if (re-search-forward "^[^ \t]" nil t)
+ (goto-char (match-beginning 0))
+ (point-max))))
+ (forward-line 1)))
+ (goto-char (point-max))
+ (widen)
+ (narrow-to-region (point) (point-max))
+ (insert "MIME-Version: 1.0\n"
+ (prog1
+ (mml-generate-mime)
+ (delete-region (point-min) (point-max))))
+ (goto-char (point-min))
+ (widen))
+ (let (case-fold-search)
+ (while (re-search-forward "^From " nil t)
+ (beginning-of-line)
+ (insert ">"))))
+ (mm-append-to-file (point-min) (point-max) file)))
+
+;;; my-deja
+
+(defun webmail-my-deja-open ()
+ (webmail-refresh-redirect)
+ (goto-char (point-min))
+ (if (re-search-forward "action=\"\\([^\"]+login_confirm\\.xp[^\"]*\\)\""
+ nil t)
+ (setq webmail-aux (match-string 1))
+ (webmail-error "open@1")))
+
+(defun webmail-my-deja-list ()
+ (let (item id newp)
+ (goto-char (point-min))
+ (when (re-search-forward
+ "(\\([0-9]+\\) message(s), \\([0-9]+\\) new, \\([0-9]+\\) k )"
+ nil t)
+ (message "Found %s mail(s), %s unread, total size %s K"
+ (match-string 1) (match-string 2) (match-string 3)))
+ (goto-char (point-min))
+ (while (re-search-forward
+ "• \\|\\(http:[^\"]+\\)/display_seemesg\\.femail\\?docid=\\([^&\"]+\\)"
+ nil t)
+ (if (setq id (match-string 2))
+ (when (or newp (not webmail-newmail-only))
+ (push
+ (cons id (format "%s/gmm_multiplex.femail?docid=%s&femail_page_name=display_page&bool_next_on_disp_pg=true&bool_prev_on_disp_pg=false&display_all_headers=false&%%2Fgmm_save.femail=Download&femail_page_name=display_page&bool_next_on_disp_pg=true&bool_prev_on_disp_pg=false&display_all_headers=false"
+ (match-string 1) id))
+ webmail-articles)
+ (setq webmail-aux (match-string 1))
+ (setq newp nil))
+ (setq newp t)))
+ (setq webmail-articles (nreverse webmail-articles))))
+
+(defun webmail-my-deja-article (file id)
+ (let (url)
+ (goto-char (point-min))
+ (unless (re-search-forward "\\(http:[^\"]+/attachment/entire_message.txt[^\"]+\\)" nil t)
+ (webmail-error "article@1"))
+ (setq url (match-string 1))
+ (erase-buffer)
+ (mm-with-unibyte-current-buffer
+ (nnweb-insert url))
+ (goto-char (point-min))
+ (while (search-forward "\r\n" nil t)
+ (replace-match "\n"))
+ (goto-char (point-min))
+ (insert "\n\nFrom nobody " (current-time-string) "\n")
+ (insert "X-Gnus-Webmail: " (symbol-value 'user)
+ "@" (symbol-name webmail-type) "\n")
+ (mm-append-to-file (point-min) (point-max) file)))
+
+(provide 'webmail)
+
+;;; webmail.el ends here