diff options
author | Patrick J Volkerding <volkerdi@slackware.com> | 2010-05-19 08:58:23 +0000 |
---|---|---|
committer | Eric Hameleers <alien@slackware.com> | 2018-05-31 22:43:05 +0200 |
commit | b76270bf9e6dd375e495fec92140a79a79415d27 (patch) | |
tree | 3dbed78b2279bf9f14207a16dc634b90995cbd40 /source/xap/pan | |
parent | 5a12e7c134274dba706667107d10d231517d3e05 (diff) | |
download | current-b76270bf9e6dd375e495fec92140a79a79415d27.tar.gz current-b76270bf9e6dd375e495fec92140a79a79415d27.tar.xz |
Slackware 13.1slackware-13.1
Wed May 19 08:58:23 UTC 2010
Slackware 13.1 x86_64 stable is released!
Lots of thanks are due -- see the RELEASE_NOTES and the rest of the
ChangeLog for credits. The ISOs are on their way to replication,
a 6 CD-ROM 32-bit set and a dual-sided 32-bit/64-bit x86/x86_64 DVD.
We are taking pre-orders now at store.slackware.com, and offering
a discount if you sign up for a subscription. Consider picking up
a copy to help support the project. Thanks again to the Slackware
community for testing, contributing, and generally holding us to a
high level of quality. :-)
Enjoy!
Diffstat (limited to 'source/xap/pan')
-rwxr-xr-x | source/xap/pan/pan.SlackBuild | 22 | ||||
-rw-r--r-- | source/xap/pan/pan.gcc44.diff | 50 | ||||
-rw-r--r-- | source/xap/pan/pan.gmime2.4.diff | 1271 |
3 files changed, 1339 insertions, 4 deletions
diff --git a/source/xap/pan/pan.SlackBuild b/source/xap/pan/pan.SlackBuild index 288b34a7b..4bfbcf7f5 100755 --- a/source/xap/pan/pan.SlackBuild +++ b/source/xap/pan/pan.SlackBuild @@ -1,6 +1,6 @@ #!/bin/sh -# Copyright 2006, 2007, 2008, 2009 Patrick J. Volkerding, Sebeka, MN, USA +# Copyright 2006, 2007, 2008, 2009, 2010 Patrick J. Volkerding, Sebeka, MN, USA # All rights reserved. # # Redistribution and use of this script, with or without modification, is @@ -22,9 +22,18 @@ PKGNAM=pan -VERSION=${VERSION:-0.133} -ARCH=${ARCH:-x86_64} -BUILD=${BUILD:-1} +VERSION=${VERSION:-$(echo $PKGNAM-*.tar.?z* | cut -d - -f 2 | rev | cut -f 3- -d . | rev)} +BUILD=${BUILD:-2} + +# Automatically determine the architecture we're building on: +if [ -z "$ARCH" ]; then + case "$( uname -m )" in + i?86) export ARCH=i486 ;; + arm*) export ARCH=arm ;; + # Unless $ARCH is already set, use uname -m for all other archs: + *) export ARCH=$( uname -m ) ;; + esac +fi NUMJOBS=${NUMJOBS:-" -j7 "} @@ -35,6 +44,8 @@ elif [ "$ARCH" = "s390" ]; then SLKCFLAGS="-O2" elif [ "$ARCH" = "x86_64" ]; then SLKCFLAGS="-O2 -fPIC" +else + SLKCFLAGS="-O2" fi CWD=$(pwd) @@ -48,6 +59,9 @@ rm -rf ${PKGNAM}-${VERSION} tar xvf $CWD/${PKGNAM}-$VERSION.tar.bz2 || exit 1 cd ${PKGNAM}-$VERSION || exit 1 +zcat $CWD/pan.gmime2.4.diff.gz | patch -p1 || exit 1 +zcat $CWD/pan.gcc44.diff.gz | patch -p1 || exit 1 + # Make sure ownerships and permissions are sane: chown -R root:root . find . \ diff --git a/source/xap/pan/pan.gcc44.diff b/source/xap/pan/pan.gcc44.diff new file mode 100644 index 000000000..22df125f8 --- /dev/null +++ b/source/xap/pan/pan.gcc44.diff @@ -0,0 +1,50 @@ +--- ./pan/usenet-utils/numbers.cc.orig 2008-07-04 10:01:53.000000000 -0500 ++++ ./pan/usenet-utils/numbers.cc 2010-02-03 18:06:16.000000000 -0600 +@@ -19,6 +19,7 @@ + + #include <config.h> + #include <cctype> ++#include <cstdio> + #include <pan/general/string-view.h> + #include "numbers.h" + #include <algorithm> +--- ./pan/tasks/nntp.cc.orig 2008-07-05 14:16:06.000000000 -0500 ++++ ./pan/tasks/nntp.cc 2010-02-03 18:07:19.000000000 -0600 +@@ -20,6 +20,7 @@ + #include <config.h> + #include <cassert> + #include <cstdarg> ++#include <cstdio> + #include <cstdlib> // abort, atoi, strtoul + extern "C" { + #include <glib.h> +--- ./pan/tasks/nntp-pool.cc.orig 2008-07-05 01:39:27.000000000 -0500 ++++ ./pan/tasks/nntp-pool.cc 2010-02-03 18:07:55.000000000 -0600 +@@ -19,6 +19,7 @@ + + #include <config.h> + #include <ctime> ++#include <cstdio> + #include <glib/gi18n.h> + #include <pan/general/debug.h> + #include <pan/general/log.h> +--- ./pan/general/progress.cc.orig 2007-08-01 12:00:01.000000000 -0500 ++++ ./pan/general/progress.cc 2010-02-03 18:05:38.000000000 -0600 +@@ -19,6 +19,7 @@ + + #include <config.h> + #include <cstdarg> ++#include <cstdio> + #include "progress.h" + #include "string-view.h" + +--- ./pan/general/log.cc.orig 2007-08-01 12:00:01.000000000 -0500 ++++ ./pan/general/log.cc 2010-02-03 18:05:19.000000000 -0600 +@@ -20,6 +20,7 @@ + #include <config.h> + #include <iostream> + #include <cstdarg> ++#include <cstdio> + #include "log.h" + + using namespace pan; diff --git a/source/xap/pan/pan.gmime2.4.diff b/source/xap/pan/pan.gmime2.4.diff new file mode 100644 index 000000000..4816ea6cd --- /dev/null +++ b/source/xap/pan/pan.gmime2.4.diff @@ -0,0 +1,1271 @@ +diff -ru pan-0.133.orig/configure pan-0.133/configure +--- pan-0.133.orig/configure 2008-07-29 19:02:08.000000000 -0700 ++++ pan-0.133/configure 2009-09-12 14:58:05.000000000 -0700 +@@ -2377,7 +2377,7 @@ + + PCRE_REQUIRED=5.0 + GLIB_REQUIRED=2.4.0 +-GMIME_REQUIRED=2.1.9 ++GMIME_REQUIRED=2.3.5 + GTK_REQUIRED=2.4.0 + GTKSPELL_REQUIRED=2.0.7 + +@@ -7957,12 +7957,12 @@ + pkg_cv_GMIME_CFLAGS="$GMIME_CFLAGS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ +- { (echo "$as_me:$LINENO: \$PKG_CONFIG --exists --print-errors \"gmime-2.0 >= \$GMIME_REQUIRED\"") >&5 +- ($PKG_CONFIG --exists --print-errors "gmime-2.0 >= $GMIME_REQUIRED") 2>&5 ++ { (echo "$as_me:$LINENO: \$PKG_CONFIG --exists --print-errors \"gmime-2.4 >= \$GMIME_REQUIRED\"") >&5 ++ ($PKG_CONFIG --exists --print-errors "gmime-2.4 >= $GMIME_REQUIRED") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; then +- pkg_cv_GMIME_CFLAGS=`$PKG_CONFIG --cflags "gmime-2.0 >= $GMIME_REQUIRED" 2>/dev/null` ++ pkg_cv_GMIME_CFLAGS=`$PKG_CONFIG --cflags "gmime-2.4 >= $GMIME_REQUIRED" 2>/dev/null` + else + pkg_failed=yes + fi +@@ -7973,12 +7973,12 @@ + pkg_cv_GMIME_LIBS="$GMIME_LIBS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ +- { (echo "$as_me:$LINENO: \$PKG_CONFIG --exists --print-errors \"gmime-2.0 >= \$GMIME_REQUIRED\"") >&5 +- ($PKG_CONFIG --exists --print-errors "gmime-2.0 >= $GMIME_REQUIRED") 2>&5 ++ { (echo "$as_me:$LINENO: \$PKG_CONFIG --exists --print-errors \"gmime-2.4 >= \$GMIME_REQUIRED\"") >&5 ++ ($PKG_CONFIG --exists --print-errors "gmime-2.4 >= $GMIME_REQUIRED") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; then +- pkg_cv_GMIME_LIBS=`$PKG_CONFIG --libs "gmime-2.0 >= $GMIME_REQUIRED" 2>/dev/null` ++ pkg_cv_GMIME_LIBS=`$PKG_CONFIG --libs "gmime-2.4 >= $GMIME_REQUIRED" 2>/dev/null` + else + pkg_failed=yes + fi +@@ -7996,14 +7996,14 @@ + _pkg_short_errors_supported=no + fi + if test $_pkg_short_errors_supported = yes; then +- GMIME_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors "gmime-2.0 >= $GMIME_REQUIRED" 2>&1` ++ GMIME_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors "gmime-2.4 >= $GMIME_REQUIRED" 2>&1` + else +- GMIME_PKG_ERRORS=`$PKG_CONFIG --print-errors "gmime-2.0 >= $GMIME_REQUIRED" 2>&1` ++ GMIME_PKG_ERRORS=`$PKG_CONFIG --print-errors "gmime-2.4 >= $GMIME_REQUIRED" 2>&1` + fi + # Put the nasty error message in config.log where it belongs + echo "$GMIME_PKG_ERRORS" >&5 + +- { { echo "$as_me:$LINENO: error: Package requirements (gmime-2.0 >= $GMIME_REQUIRED) were not met: ++ { { echo "$as_me:$LINENO: error: Package requirements (gmime-2.4 >= $GMIME_REQUIRED) were not met: + + $GMIME_PKG_ERRORS + +@@ -8014,7 +8014,7 @@ + and GMIME_LIBS to avoid the need to call pkg-config. + See the pkg-config man page for more details. + " >&5 +-echo "$as_me: error: Package requirements (gmime-2.0 >= $GMIME_REQUIRED) were not met: ++echo "$as_me: error: Package requirements (gmime-2.4 >= $GMIME_REQUIRED) were not met: + + $GMIME_PKG_ERRORS + +diff -ru pan-0.133.orig/configure.in pan-0.133/configure.in +--- pan-0.133.orig/configure.in 2008-07-29 19:00:01.000000000 -0700 ++++ pan-0.133/configure.in 2009-09-12 14:52:37.000000000 -0700 +@@ -18,7 +18,7 @@ + + PCRE_REQUIRED=5.0 + GLIB_REQUIRED=2.4.0 +-GMIME_REQUIRED=2.1.9 ++GMIME_REQUIRED=2.3.5 + GTK_REQUIRED=2.4.0 + GTKSPELL_REQUIRED=2.0.7 + AC_SUBST(PCRE_REQUIRED) +@@ -50,7 +50,7 @@ + + PKG_CHECK_MODULES(PCRE, libpcre >= $PCRE_REQUIRED) + AM_PATH_GLIB_2_0($GLIB_REQUIRED,,exit 1,gobject gmodule gthread) +-PKG_CHECK_MODULES(GMIME, gmime-2.0 >= $GMIME_REQUIRED) ++PKG_CHECK_MODULES(GMIME, gmime-2.4 >= $GMIME_REQUIRED) + AM_PATH_GTK_2_0($GTK_REQUIRED,,exit 1,gthread) + + +--- pan-0.133.orig/pan/general/utf8-utils.cc 2008-07-04 23:13:14.000000000 -0700 ++++ pan-0.133/pan/general/utf8-utils.cc 2009-09-12 14:38:13.000000000 -0700 +@@ -136,7 +136,7 @@ + { + std::string s = content_to_utf8 (header, fallback_charset1, fallback_charset2); + if (header.strstr ("=?")) { +- char * decoded (g_mime_utils_8bit_header_decode ((const guchar*) s.c_str())); ++ char * decoded (g_mime_utils_header_decode_text (s.c_str())); + s = clean_utf8 (decoded); + g_free (decoded); + } +@@ -147,15 +147,26 @@ + pan :: mime_part_to_utf8 (GMimePart * part, + const char * fallback_charset) + { ++ GMimeDataWrapper *content; ++ GMimeStream *stream; ++ const char *charset; ++ GByteArray *buffer; + std::string ret; + + g_return_val_if_fail (GMIME_IS_PART(part), ret); + +- size_t content_len (0); +- const char * specified_charset (g_mime_object_get_content_type_parameter (GMIME_OBJECT (part), "charset")); +- const char * content = g_mime_part_get_content (part, &content_len); +- if (content && content_len) +- ret = content_to_utf8 (StringView (content, content_len), specified_charset, fallback_charset); ++ charset = g_mime_object_get_content_type_parameter (GMIME_OBJECT (part), "charset"); ++ content = g_mime_part_get_content_object (part); ++ ++ stream = g_mime_stream_mem_new (); ++ g_mime_data_wrapper_write_to_stream (content, stream); ++//g_object_unref(content); //SKG gmime 2.4 don't unref returned data wrapper ++ ++ buffer = ((GMimeStreamMem *) stream)->buffer; ++ ++ ret = content_to_utf8 (StringView ((const char *) buffer->data, buffer->len), charset, fallback_charset); ++ ++ g_object_unref (stream); + + return ret; + } +diff -ru pan-0.133.orig/pan/gui/body-pane.cc pan-0.133/pan/gui/body-pane.cc +--- pan-0.133.orig/pan/gui/body-pane.cc 2008-07-06 07:20:54.000000000 -0700 ++++ pan-0.133/pan/gui/body-pane.cc 2009-09-12 14:41:46.000000000 -0700 +@@ -837,7 +837,7 @@ + } + + g_object_unref (mem_stream); +- g_object_unref (wrapper); ++ //g_object_unref (wrapper); //SKG gmime 2.4 don't unref returned data wrapper + } + + // flush the loader +@@ -874,7 +874,7 @@ + return; + + GMimePart * part = GMIME_PART (obj); +- const GMimeContentType * type = g_mime_object_get_content_type (GMIME_OBJECT (part)); ++ GMimeContentType * type = g_mime_object_get_content_type (GMIME_OBJECT (part)); + + // decide whether or not this part is a picture + bool is_image (g_mime_content_type_is_type (type, "image", "*")); +@@ -952,11 +952,11 @@ + GtkTextIter iter; + gtk_text_buffer_get_end_iter (_buffer, &iter); + gtk_text_buffer_insert (_buffer, &iter, pch, -1); +- g_free (pch); ++// g_free (pch); //SKG don't unref returned const char * + } + } + void +-BodyPane :: foreach_part_cb (GMimeObject* o, gpointer self) ++BodyPane :: foreach_part_cb (GMimeObject* /*parent*/, GMimeObject* o, gpointer self) + { + if (GMIME_IS_MULTIPART (o)) + g_mime_multipart_foreach (GMIME_MULTIPART (o), foreach_part_cb, self); +@@ -978,7 +978,7 @@ + const char * key, + const char * fallback_charset) + { +- const char * val (message ? g_mime_message_get_header (message, key) : ""); ++ const char * val (message ? g_mime_object_get_header ((GMimeObject *) message, key) : ""); + const std::string utf8_val (header_to_utf8 (val, fallback_charset)); + char * e (0); + if (strcmp (key, "From")) +@@ -1015,7 +1015,7 @@ + const char * key, + const char * fallback_charset) + { +- const char * val (msg ? g_mime_message_get_header (msg, key) : ""); ++ const char * val (msg ? g_mime_object_get_header ((GMimeObject *) msg, key) : ""); + return add_header_line (s, key_i18n, key, val, fallback_charset); + } + } +@@ -1037,19 +1037,19 @@ + + // conditional headers... + if (message) { +- const StringView newsgroups (g_mime_message_get_header (message, "Newsgroups")); ++ const StringView newsgroups (g_mime_object_get_header ((GMimeObject *) message, "Newsgroups")); + if (newsgroups.strchr(',')) { + l = add_header_line (s, message, _("Newsgroups"), "Newsgroups", fallback_charset); + w = std::max (w, l); + } +- const StringView followup_to (g_mime_message_get_header (message, "Followup-To")); ++ const StringView followup_to (g_mime_object_get_header ((GMimeObject *) message, "Followup-To")); + if (!followup_to.empty() && (followup_to!=newsgroups)) { + l = add_header_line (s, message, _("Followup-To"), "Followup-To", fallback_charset); + w = std::max (w, l); + } +- const StringView reply_to (g_mime_message_get_header (message, "Reply-To")); ++ const StringView reply_to (g_mime_object_get_header ((GMimeObject *) message, "Reply-To")); + if (!reply_to.empty()) { +- const StringView from (g_mime_message_get_header (message, "From")); ++ const StringView from (g_mime_object_get_header ((GMimeObject *) message, "From")); + StringView f_addr, f_name, rt_addr, rt_name; + GNKSA :: do_check_from (from, f_addr, f_name, false); + GNKSA :: do_check_from (reply_to, rt_addr, rt_name, false); +@@ -1070,7 +1070,7 @@ + + // set the x-face... + GdkPixbuf * pixbuf (0); +- const char * pch = message ? g_mime_message_get_header (message, "X-Face") : 0; ++ const char * pch = message ? g_mime_object_get_header ((GMimeObject *) message, "X-Face") : 0; + if (pch && _xface->window) + pixbuf = pan_gdk_pixbuf_create_from_x_face (gtk_widget_get_colormap(_xface), _xface->window, pch); + gtk_image_set_from_pixbuf (GTK_IMAGE(_xface), pixbuf); +@@ -1101,7 +1101,7 @@ + // maybe add the headers + const bool do_show_headers (_prefs.get_flag ("show-all-headers", false)); + if (message && do_show_headers) { +- char * headers (g_mime_message_get_headers (message)); ++ char * headers (g_mime_object_get_headers ((GMimeObject *) message)); + GtkTextIter end; + gtk_text_buffer_get_end_iter (_buffer, &end); + StringView line, v(headers); +@@ -1119,7 +1119,7 @@ + + // set the text buffer... + if (message) +- g_mime_message_foreach_part (message, foreach_part_cb, this); ++ g_mime_message_foreach (message, foreach_part_cb, this); + + // if there was a picture, scroll to it. + // otherwise scroll to the top of the body. +@@ -1514,7 +1514,7 @@ + const char * fallback_charset_1, + const char * fallback_charset_2) + { +- const StringView v (g_mime_message_get_header (msg, key)); ++ const StringView v (g_mime_object_get_header ((GMimeObject *) msg, key)); + std::string s; + if (!v.empty()) + s = header_to_utf8 (v, fallback_charset_1, fallback_charset_2); +@@ -1527,7 +1527,7 @@ + std::string body; + }; + +- void get_utf8_body_foreach_part (GMimeObject *o, gpointer user_data) ++ void get_utf8_body_foreach_part (GMimeObject * /*parent*/, GMimeObject *o, gpointer user_data) + { + if (GMIME_IS_MULTIPART(o)) + { +@@ -1538,7 +1538,7 @@ + else + { + GMimePart * part = GMIME_PART (o); +- const GMimeContentType * type = g_mime_object_get_content_type (o); ++ GMimeContentType * type = g_mime_object_get_content_type (o); + const bool is_text (g_mime_content_type_is_type (type, "text", "*")); + if (is_text) + { +@@ -1555,7 +1555,7 @@ + if (fallback_charset) + tmp.fallback_charset = fallback_charset; + if (source) +- g_mime_message_foreach_part (source, get_utf8_body_foreach_part, &tmp); ++ g_mime_message_foreach (source, get_utf8_body_foreach_part, &tmp); + return tmp.body; + } + } +@@ -1571,7 +1571,7 @@ + + // fallback character encodings + const char * group_charset (_charset.c_str()); +- const GMimeContentType * type (g_mime_object_get_content_type (GMIME_OBJECT(_message))); ++ GMimeContentType * type (g_mime_object_get_content_type (GMIME_OBJECT(_message))); + const char * message_charset (type ? g_mime_content_type_get_parameter (type, "charset") : 0); + + /// +@@ -1585,14 +1585,14 @@ + const std::string reply_to (get_header (_message, "Reply-To", message_charset, group_charset)); + if (is_reply || fup_to=="poster") { + const std::string& to (reply_to.empty() ? from : reply_to); +- g_mime_message_add_recipients_from_string (msg, (char*)GMIME_RECIPIENT_TYPE_TO, to.c_str()); ++ g_mime_message_add_recipients_from_string (msg, GMIME_RECIPIENT_TYPE_TO, to.c_str()); + } else { + const std::string& groups (fup_to.empty() ? newsgroups : fup_to); +- g_mime_message_add_header (msg, "Newsgroups", groups.c_str()); ++ g_mime_object_append_header ((GMimeObject *) msg, "Newsgroups", groups.c_str()); + } + + // Subject: +- StringView v = g_mime_message_get_header (_message, "Subject"); ++ StringView v = g_mime_object_get_header ((GMimeObject *) _message, "Subject"); + std::string h = header_to_utf8 (v, message_charset, group_charset); + std::string val (normalize_subject_re (h)); + if (val.find ("Re:") != 0) // add "Re: " if we don't have one +@@ -1601,22 +1601,22 @@ + + // attribution lines + +- const char * cpch = g_mime_message_get_header (_message, "From"); ++ const char * cpch = g_mime_object_get_header ((GMimeObject *) _message, "From"); + h = header_to_utf8 (cpch, message_charset, group_charset); +- g_mime_message_add_header (msg, "X-Draft-Attribution-Author", h.c_str()); ++ g_mime_object_append_header ((GMimeObject *) msg, "X-Draft-Attribution-Author", h.c_str()); + + cpch = g_mime_message_get_message_id (_message); + h = header_to_utf8 (cpch, message_charset, group_charset); +- g_mime_message_add_header (msg, "X-Draft-Attribution-Id", h.c_str()); ++ g_mime_object_append_header ((GMimeObject *) msg, "X-Draft-Attribution-Id", h.c_str()); + +- char * tmp = g_mime_message_get_date_string (_message); ++ char * tmp = g_mime_message_get_date_as_string (_message); + h = header_to_utf8 (tmp, message_charset, group_charset); +- g_mime_message_add_header (msg, "X-Draft-Attribution-Date", h.c_str()); ++ g_mime_object_append_header ((GMimeObject *) msg, "X-Draft-Attribution-Date", h.c_str()); + g_free (tmp); + + // references + const char * header = "References"; +- v = g_mime_message_get_header (_message, header); ++ v = g_mime_object_get_header ((GMimeObject *) _message, header); + val.assign (v.str, v.len); + if (!val.empty()) + val += ' '; +@@ -1624,7 +1624,7 @@ + val += g_mime_message_get_message_id (_message); + val += ">"; + val = GNKSA :: trim_references (val); +- g_mime_message_add_header (msg, header, val.c_str()); ++ g_mime_object_append_header ((GMimeObject *) msg, header, val.c_str()); + + /// + /// BODY +@@ -1660,17 +1660,17 @@ + // set the clone's content object with our modified body + GMimeStream * stream = g_mime_stream_mem_new (); + g_mime_stream_write_string (stream, s.c_str()); +- GMimeDataWrapper * wrapper = g_mime_data_wrapper_new_with_stream (stream, GMIME_PART_ENCODING_8BIT); ++ GMimeDataWrapper * wrapper = g_mime_data_wrapper_new_with_stream (stream, GMIME_CONTENT_ENCODING_8BIT); + GMimePart * part = g_mime_part_new (); + GMimeContentType * new_type = g_mime_content_type_new_from_string ("text/plain; charset=UTF-8"); +- g_mime_part_set_content_type (part, new_type); ++ g_mime_object_set_content_type ((GMimeObject *) part, new_type); + g_mime_part_set_content_object (part, wrapper); +- g_mime_part_set_encoding (part, GMIME_PART_ENCODING_8BIT); ++ g_mime_part_set_content_encoding (part, GMIME_CONTENT_ENCODING_8BIT); + g_mime_message_set_mime_part (msg, GMIME_OBJECT(part)); + g_object_unref (wrapper); + g_object_unref (part); + g_object_unref (stream); +-//std::cerr << LINE_ID << " here is the modified clone\n [" << g_mime_message_to_string(msg) << ']' << std::endl; ++//std::cerr << LINE_ID << " here is the modified clone\n [" << g_mime_object_to_string((GMimeObject *) msg) << ']' << std::endl; + } + + return msg; +diff -ru pan-0.133.orig/pan/gui/body-pane.h pan-0.133/pan/gui/body-pane.h +--- pan-0.133.orig/pan/gui/body-pane.h 2008-07-04 10:57:39.000000000 -0700 ++++ pan-0.133/pan/gui/body-pane.h 2009-09-08 20:40:40.000000000 -0700 +@@ -86,7 +86,7 @@ + void append_part (GMimeObject*, GtkAllocation*); + static gboolean expander_activated_idle (gpointer self); + static void expander_activated_cb (GtkExpander*, gpointer self); +- static void foreach_part_cb (GMimeObject*, gpointer self); ++ static void foreach_part_cb (GMimeObject*, GMimeObject*, gpointer self); + static void text_size_allocated (GtkWidget*, GtkAllocation*, gpointer); + static gboolean text_size_allocated_idle_cb (gpointer p); + void text_size_allocated_idle (); +diff -ru pan-0.133.orig/pan/gui/gui.cc pan-0.133/pan/gui/gui.cc +--- pan-0.133.orig/pan/gui/gui.cc 2008-07-05 00:14:56.000000000 -0700 ++++ pan-0.133/pan/gui/gui.cc 2009-09-12 14:44:06.000000000 -0700 +@@ -31,6 +31,7 @@ + #include <pan/general/file-util.h> + #include <pan/general/macros.h> + #include <pan/usenet-utils/scorefile.h> ++#include <pan/usenet-utils/mime-utils.h> + #include <pan/tasks/task-article.h> + #include <pan/tasks/task-groups.h> + #include <pan/tasks/task-xover.h> +@@ -567,7 +568,7 @@ + ArticleCache& c, const Article& a, const std::string& path): + _data(d), _queue(q), _root(r), _prefs(p), _cache(c), _article(a), _path(path) {} + +- static void foreach_part_cb (GMimeObject *o, gpointer self) ++ static void foreach_part_cb (GMimeObject * /*parent*/, GMimeObject *o, gpointer self) + { + static_cast<SaveArticlesFromNZB*>(self)->foreach_part (o); + } +@@ -591,7 +592,7 @@ + if (!tasks.empty()) + _queue.add_tasks (tasks, Queue::BOTTOM); + g_object_unref (mem_stream); +- g_object_unref (wrapper); ++// g_object_unref (wrapper); //SKG gmime 2.4 don't unref returned data wrapper + } + } + +@@ -601,7 +602,7 @@ + { + if (status == OK) { + GMimeMessage * message = _cache.get_message (_article.get_part_mids()); +- g_mime_message_foreach_part (message, foreach_part_cb, this); ++ g_mime_message_foreach (message, foreach_part_cb, this); + g_object_unref (message); + } + delete this; +@@ -1041,19 +1042,19 @@ + const char * cpch; + char * old_mid (g_strdup_printf ("<%s>", g_mime_message_get_message_id(message))); + GMimeMessage * new_message (g_mime_message_new (false)); +- g_mime_message_set_header (new_message, "Supersedes", old_mid); ++ g_mime_object_set_header ((GMimeObject *) new_message, "Supersedes", old_mid); + g_mime_message_set_sender (new_message, g_mime_message_get_sender (message)); + g_mime_message_set_subject (new_message, g_mime_message_get_subject (message)); +- g_mime_message_set_header (new_message, "Newsgroups", g_mime_message_get_header (message, "Newsgroups")); +- g_mime_message_set_header (new_message, "References", g_mime_message_get_header (message, "References")); ++ g_mime_object_set_header ((GMimeObject *) new_message, "Newsgroups", g_mime_object_get_header ((GMimeObject *) message, "Newsgroups")); ++ g_mime_object_set_header ((GMimeObject *) new_message, "References", g_mime_object_get_header ((GMimeObject *) message, "References")); + if ((cpch = g_mime_message_get_reply_to (message))) + g_mime_message_set_reply_to (new_message, cpch); +- if ((cpch = g_mime_message_get_header (message, "Followup-To"))) +- g_mime_message_set_header (new_message, "Followup-To", cpch); ++ if ((cpch = g_mime_object_get_header ((GMimeObject *) message, "Followup-To"))) ++ g_mime_object_set_header ((GMimeObject *) new_message, "Followup-To", cpch); + gboolean unused (false); +- char * body (g_mime_message_get_body (message, true, &unused)); ++ char * body (g_mime_message_get_body (message, &unused)); + GMimeStream * stream = g_mime_stream_mem_new_with_buffer (body, strlen(body)); +- GMimeDataWrapper * content_object = g_mime_data_wrapper_new_with_stream (stream, GMIME_PART_ENCODING_DEFAULT); ++ GMimeDataWrapper * content_object = g_mime_data_wrapper_new_with_stream (stream, GMIME_CONTENT_ENCODING_DEFAULT); + GMimePart * part = g_mime_part_new (); + g_mime_part_set_content_object (part, content_object); + g_mime_message_set_mime_part (new_message, GMIME_OBJECT(part)); +@@ -1111,11 +1112,11 @@ + char * cancel_message = g_strdup_printf ("cancel <%s>", g_mime_message_get_message_id(message)); + g_mime_message_set_sender (cancel, g_mime_message_get_sender (message)); + g_mime_message_set_subject (cancel, "Cancel"); +- g_mime_message_set_header (cancel, "Newsgroups", g_mime_message_get_header (message, "Newsgroups")); +- g_mime_message_set_header (cancel, "Control", cancel_message); ++ g_mime_object_set_header ((GMimeObject *) cancel, "Newsgroups", g_mime_object_get_header ((GMimeObject *) message, "Newsgroups")); ++ g_mime_object_set_header ((GMimeObject *) cancel, "Control", cancel_message); + const char * body ("Ignore\r\nArticle canceled by author using " PACKAGE_STRING "\r\n"); + GMimeStream * stream = g_mime_stream_mem_new_with_buffer (body, strlen(body)); +- GMimeDataWrapper * content_object = g_mime_data_wrapper_new_with_stream (stream, GMIME_PART_ENCODING_DEFAULT); ++ GMimeDataWrapper * content_object = g_mime_data_wrapper_new_with_stream (stream, GMIME_CONTENT_ENCODING_DEFAULT); + GMimePart * part = g_mime_part_new (); + g_mime_part_set_content_object (part, content_object); + g_mime_message_set_mime_part (cancel, GMIME_OBJECT(part)); +@@ -1194,12 +1195,12 @@ + newsgroups = group; + } + if (!newsgroups.empty()) +- g_mime_message_add_header (message, "Newsgroups", newsgroups.c_str()); ++ g_mime_object_append_header ((GMimeObject *) message, "Newsgroups", newsgroups.c_str()); + + // content type + GMimePart * part = g_mime_part_new (); +- g_mime_part_set_content_type (part, g_mime_content_type_new_from_string ("text/plain; charset=UTF-8")); +- g_mime_part_set_encoding (part, GMIME_PART_ENCODING_8BIT); ++ g_mime_object_set_content_type ((GMimeObject *) part, g_mime_content_type_new_from_string ("text/plain; charset=UTF-8")); ++ g_mime_part_set_content_encoding (part, GMIME_CONTENT_ENCODING_8BIT); + g_mime_message_set_mime_part (message, GMIME_OBJECT(part)); + g_object_unref (part); + +@@ -1754,8 +1755,8 @@ + g_snprintf (str, sizeof(str), "%s: %u/%u", _("Tasks"), running, size); + + // build the tooltip +- gulong queued, unused, stopped; +- guint64 KiB_remain; ++ long unsigned int queued, unused, stopped; //SKG MacPorts can't find function ++ uint64_t KiB_remain; //SKG using gulong and guint64 types. + double KiBps; + int hr, min, sec; + _queue.get_stats (queued, unused, stopped, +diff -ru pan-0.133.orig/pan/gui/pan.cc pan-0.133/pan/gui/pan.cc +--- pan-0.133.orig/pan/gui/pan.cc 2008-07-04 11:30:29.000000000 -0700 ++++ pan-0.133/pan/gui/pan.cc 2009-09-12 13:39:13.000000000 -0700 +@@ -211,7 +211,7 @@ + textdomain (GETTEXT_PACKAGE); + + g_thread_init (0); +- g_mime_init (GMIME_INIT_FLAG_UTF8); ++ g_mime_init (GMIME_ENABLE_RFC2047_WORKAROUNDS); + + bool gui(true), nzb(false); + std::string url; +diff -ru pan-0.133.orig/pan/gui/post-ui.cc pan-0.133/pan/gui/post-ui.cc +--- pan-0.133.orig/pan/gui/post-ui.cc 2008-07-13 06:32:11.000000000 -0700 ++++ pan-0.133/pan/gui/post-ui.cc 2009-09-12 13:04:51.000000000 -0700 +@@ -529,8 +529,8 @@ + { + std::string url, to, groups; + gboolean unused; +- char * headers (g_mime_message_get_headers (message)); +- char * body (g_mime_message_get_body (message, true, &unused)); ++ char * headers (g_mime_object_get_headers ((GMimeObject *) message)); ++ char * body (g_mime_message_get_body (message, &unused)); + StringView key, val, v(headers); + v.trim (); + while (v.pop_token (val, '\n') && val.pop_token(key,':')) { +@@ -629,7 +629,7 @@ + *** If this is email only, skip the rest of the posting... + *** we only stayed this long to get check_message() + **/ +- const StringView groups (g_mime_message_get_header (message, "Newsgroups")); ++ const StringView groups (g_mime_object_get_header ((GMimeObject *) message, "Newsgroups")); + if (groups.empty()) { + maybe_mail_message (message); + return true; +@@ -903,9 +903,9 @@ + */ + void pan_g_mime_message_set_message_id (GMimeMessage *msg, const char *mid) + { +- g_mime_message_add_header (msg, "Message-ID", mid); ++ g_mime_object_append_header ((GMimeObject *) msg, "Message-ID", mid); + char * bracketed = g_strdup_printf ("<%s>", mid); +- g_mime_header_set (GMIME_OBJECT(msg)->headers, "Message-ID", bracketed); ++ g_mime_header_list_set (GMIME_OBJECT(msg)->headers, "Message-ID", bracketed); + g_free (bracketed); + } + } +@@ -928,27 +928,27 @@ + // headers from the ui: To + const StringView to (gtk_entry_get_text (GTK_ENTRY(_to_entry))); + if (!to.empty()) +- g_mime_message_add_recipients_from_string (msg, (char*)GMIME_RECIPIENT_TYPE_TO, to.str); ++ g_mime_message_add_recipients_from_string (msg, GMIME_RECIPIENT_TYPE_TO, to.str); + + // headers from the ui: Newsgroups + const StringView groups (gtk_entry_get_text (GTK_ENTRY(_groups_entry))); + if (!groups.empty()) +- g_mime_message_set_header (msg, "Newsgroups", groups.str); ++ g_mime_object_set_header ((GMimeObject *) msg, "Newsgroups", groups.str); + + // headers from the ui: Followup-To + const StringView followupto (gtk_entry_get_text (GTK_ENTRY(_followupto_entry))); + if (!followupto.empty()) +- g_mime_message_set_header (msg, "Followup-To", followupto.str); ++ g_mime_object_set_header ((GMimeObject *) msg, "Followup-To", followupto.str); + + // headers from the ui: Reply-To + const StringView replyto (gtk_entry_get_text (GTK_ENTRY(_replyto_entry))); + if (!replyto.empty()) +- g_mime_message_set_header (msg, "Reply-To", replyto.str); ++ g_mime_object_set_header ((GMimeObject *) msg, "Reply-To", replyto.str); + + // add the 'hidden headers' + foreach_const (str2str_t, _hidden_headers, it) + if ((mode==DRAFTING) || (it->first.find ("X-Draft-")!=0)) +- g_mime_message_set_header (msg, it->first.c_str(), it->second.c_str()); ++ g_mime_object_set_header ((GMimeObject *) msg, it->first.c_str(), it->second.c_str()); + + // build headers from the 'more headers' entry field + std::map<std::string,std::string> headers; +@@ -964,14 +964,14 @@ + val.trim (); + std::string key_str (key.to_string()); + if (extra_header_is_editable (key, val)) +- g_mime_message_set_header (msg, key.to_string().c_str(), +- val.to_string().c_str()); ++ g_mime_object_set_header ((GMimeObject *) msg, key.to_string().c_str(), ++ val.to_string().c_str()); + } + g_free (pch); + + // User-Agent + if (mode==POSTING && _prefs.get_flag (USER_AGENT_PREFS_KEY, true)) +- g_mime_message_set_header (msg, "User-Agent", get_user_agent()); ++ g_mime_object_set_header ((GMimeObject *) msg, "User-Agent", get_user_agent()); + + // Message-ID + if (mode==POSTING && _prefs.get_flag (MESSAGE_ID_PREFS_KEY, false)) { +@@ -987,22 +987,22 @@ + const std::string charset ((mode==POSTING && !_charset.empty()) ? _charset : "UTF-8"); + if (charset != "UTF-8") { + // add a wrapper to convert from UTF-8 to $charset +- GMimeStream * tmp = g_mime_stream_filter_new_with_stream (stream); ++ GMimeStream * tmp = g_mime_stream_filter_new (stream); + g_object_unref (stream); + GMimeFilter * filter = g_mime_filter_charset_new ("UTF-8", charset.c_str()); + g_mime_stream_filter_add (GMIME_STREAM_FILTER(tmp), filter); + g_object_unref (filter); + stream = tmp; + } +- GMimeDataWrapper * content_object = g_mime_data_wrapper_new_with_stream (stream, GMIME_PART_ENCODING_DEFAULT); ++ GMimeDataWrapper * content_object = g_mime_data_wrapper_new_with_stream (stream, GMIME_CONTENT_ENCODING_DEFAULT); + g_object_unref (stream); + GMimePart * part = g_mime_part_new (); + pch = g_strdup_printf ("text/plain; charset=%s", charset.c_str()); + GMimeContentType * type = g_mime_content_type_new_from_string (pch); + g_free (pch); +- g_mime_part_set_content_type (part, type); // part owns type now. type isn't refcounted. ++ g_mime_object_set_content_type ((GMimeObject *) part, type); // part owns type now. type isn't refcounted. + g_mime_part_set_content_object (part, content_object); +- g_mime_part_set_encoding (part, GMIME_PART_ENCODING_8BIT); ++ g_mime_part_set_content_encoding (part, GMIME_CONTENT_ENCODING_8BIT); + g_object_unref (content_object); + g_mime_message_set_mime_part (msg, GMIME_OBJECT(part)); + g_object_unref (part); +@@ -1036,7 +1036,7 @@ + + errno = 0; + std::ofstream o (filename); +- char * pch = g_mime_message_to_string (msg); ++ char * pch = g_mime_object_to_string ((GMimeObject *) msg); + o << pch; + o.close (); + +@@ -1504,16 +1504,16 @@ + std::string s = utf8ize (g_mime_message_get_subject (message)); + gtk_entry_set_text (GTK_ENTRY(_subject_entry), s.c_str()); + +- s = utf8ize (g_mime_message_get_header (message, "Newsgroups")); ++ s = utf8ize (g_mime_object_get_header ((GMimeObject *) message, "Newsgroups")); + gtk_entry_set_text (GTK_ENTRY(_groups_entry), s.c_str()); + +- s = utf8ize (g_mime_message_get_header (message, "Followup-To")); ++ s = utf8ize (g_mime_object_get_header ((GMimeObject *) message, "Followup-To")); + gtk_entry_set_text (GTK_ENTRY(_followupto_entry), s.c_str()); + +- s = utf8ize (g_mime_message_get_header (message, "Reply-To")); ++ s = utf8ize (g_mime_object_get_header ((GMimeObject *) message, "Reply-To")); + gtk_entry_set_text (GTK_ENTRY(_replyto_entry), s.c_str()); + +- const InternetAddressList * addresses = g_mime_message_get_recipients (message, GMIME_RECIPIENT_TYPE_TO); ++ InternetAddressList * addresses = g_mime_message_get_recipients (message, GMIME_RECIPIENT_TYPE_TO); + char * pch = internet_address_list_to_string (addresses, true); + s = utf8ize (pch); + gtk_entry_set_text (GTK_ENTRY(_to_entry), s.c_str()); +@@ -1521,16 +1521,34 @@ + + // update 'other headers' + SetMessageForeachHeaderData data; +- if (message->mime_part && g_mime_header_has_raw (message->mime_part->headers)) +- g_mime_header_foreach (message->mime_part->headers, set_message_foreach_header_func, &data); +- g_mime_header_foreach (GMIME_OBJECT(message)->headers, set_message_foreach_header_func, &data); ++ const char *name, *value; ++ GMimeHeaderIter iter; ++ ++ if (message->mime_part && g_mime_header_list_has_raw (message->mime_part->headers)) { ++ if (g_mime_header_list_get_iter (message->mime_part->headers, &iter)) { ++ do { ++ value = g_mime_header_iter_get_value (&iter); ++ name = g_mime_header_iter_get_name (&iter); ++ set_message_foreach_header_func (name, value, &data); ++ } while (g_mime_header_iter_next (&iter)); ++ } ++ } ++ ++ if (g_mime_header_list_get_iter (GMIME_OBJECT (message)->headers, &iter)) { ++ do { ++ value = g_mime_header_iter_get_value (&iter); ++ name = g_mime_header_iter_get_name (&iter); ++ set_message_foreach_header_func (name, value, &data); ++ } while (g_mime_header_iter_next (&iter)); ++ } ++ + s = utf8ize (data.visible_headers); + gtk_text_buffer_set_text (_headers_buf, s.c_str(), -1); + _hidden_headers = data.hidden_headers; + + // update body + int ignored; +- char * tmp = g_mime_message_get_body (message, true, &ignored); ++ char * tmp = g_mime_message_get_body (message, &ignored); + s = utf8ize (tmp); + g_free (tmp); + if (!s.empty()) { +diff -ru pan-0.133.orig/pan/usenet-utils/message-check-test.cc pan-0.133/pan/usenet-utils/message-check-test.cc +--- pan-0.133.orig/pan/usenet-utils/message-check-test.cc 2007-08-01 09:59:59.000000000 -0700 ++++ pan-0.133/pan/usenet-utils/message-check-test.cc 2009-09-12 13:41:22.000000000 -0700 +@@ -22,6 +22,20 @@ + std::cerr << LINE_ID << " [" << i << "][" << *it << ']' << std::endl; \ + } + ++static void ++mime_part_set_content (GMimePart *part, const char *str) ++{ ++ GMimeDataWrapper *content; ++ GMimeStream *stream; ++ ++ stream = g_mime_stream_mem_new_with_buffer (str, strlen (str)); ++ content = g_mime_data_wrapper_new_with_stream (stream, GMIME_CONTENT_ENCODING_DEFAULT); ++ g_object_unref (stream); ++ ++ g_mime_part_set_content_object (part, content); ++ g_object_unref (content); ++} ++ + int main (void) + { + g_mime_init (0); +@@ -41,11 +55,11 @@ + std::string message_id = GNKSA :: generate_message_id ("rebelbase.com"); + g_mime_message_set_message_id (msg, message_id.c_str()); + g_mime_message_set_subject (msg, "MAKE MONEY FAST"); +- g_mime_message_set_header (msg, "Organization", "Lazars Android Works"); +- g_mime_message_set_header (msg, "Newsgroups", "alt.test"); ++ g_mime_object_set_header ((GMimeObject *) msg, "Organization", "Lazars Android Works"); ++ g_mime_object_set_header ((GMimeObject *) msg, "Newsgroups", "alt.test"); + GMimePart * part = g_mime_part_new_with_type ("text", "plain"); + const char * cpch = "Hello World!"; +- g_mime_part_set_content (part, cpch, strlen(cpch)); ++ mime_part_set_content (part, cpch); + g_mime_message_set_mime_part (msg, GMIME_OBJECT(part)); + // this should pass the tests + MessageCheck :: message_check (msg, attribution, groups_our_server_has, errors, goodness); +@@ -54,7 +68,7 @@ + + // all quoted + cpch = "> Hello World!\n> All quoted text."; +- g_mime_part_set_content (part, cpch, strlen(cpch)); ++ mime_part_set_content (part, cpch); + MessageCheck :: message_check (msg, attribution, groups_our_server_has, errors, goodness); + std::vector<std::string> e (errors.begin(), errors.end()); + check (errors.size() == 2) +@@ -64,7 +78,7 @@ + + // mostly quoted + cpch = "> Hello World!\n> quoted\n> text\n> foo\n> bar\nnew text"; +- g_mime_part_set_content (part, cpch, strlen(cpch)); ++ mime_part_set_content (part, cpch); + MessageCheck :: message_check (msg, attribution, groups_our_server_has, errors, goodness); + e.assign (errors.begin(), errors.end()); + check (errors.size() == 1) +@@ -73,14 +87,14 @@ + + // mostly quoted border condition: 20% of message is new content (should pass) + cpch = "> Hello World!\n> quoted\n> text\n> foo\nnew text"; +- g_mime_part_set_content (part, cpch, strlen(cpch)); ++ mime_part_set_content (part, cpch); + MessageCheck :: message_check (msg, attribution, groups_our_server_has, errors, goodness); + check (errors.empty()) + check (goodness.is_ok()) + + // sig check: too long + cpch = "Hello!\n\n-- \nThis\nSig\nIs\nToo\nLong\n"; +- g_mime_part_set_content (part, cpch, strlen(cpch)); ++ mime_part_set_content (part, cpch); + MessageCheck :: message_check (msg, attribution, groups_our_server_has, errors, goodness); + e.assign (errors.begin(), errors.end()); + check (errors.size() == 1) +@@ -95,7 +109,7 @@ + "This sig line is greater than 80 characters wide. In fact, it's 84 characters wide.\n" + "This sig line is greater than 80 characters wide. In fact, it measures 95 characters in width!\n" + "This sig line is less than 80 characters wide."; +- g_mime_part_set_content (part, cpch, strlen(cpch)); ++ mime_part_set_content (part, cpch); + MessageCheck :: message_check (msg, attribution, groups_our_server_has, errors, goodness); + e.assign (errors.begin(), errors.end()); + check (errors.size() == 1) +@@ -104,7 +118,7 @@ + + // sig check: sig marker, no sig + cpch = "Hello!\n\n-- \n"; +- g_mime_part_set_content (part, cpch, strlen(cpch)); ++ mime_part_set_content (part, cpch); + MessageCheck :: message_check (msg, attribution, groups_our_server_has, errors, goodness); + e.assign (errors.begin(), errors.end()); + check (errors.size() == 1) +@@ -113,7 +127,7 @@ + + // sig check: okay sig + cpch = "Hello!\n\n-- \nThis is a short, narrow sig.\nIt should pass.\n"; +- g_mime_part_set_content (part, cpch, strlen(cpch)); ++ mime_part_set_content (part, cpch); + MessageCheck :: message_check (msg, attribution, groups_our_server_has, errors, goodness); + check (errors.empty()) + check (goodness.is_ok()) +@@ -146,7 +160,7 @@ + "This sig line is greater than 80 characters wide. In fact, it's 84 characters wide.\n" + "This sig line is greater than 80 characters wide. In fact, it measures 95 characters in width!\n" + "This sig line is less than 80 characters wide."; +- g_mime_part_set_content (part, cpch, strlen(cpch)); ++ mime_part_set_content (part, cpch); + MessageCheck :: message_check (msg, attribution, groups_our_server_has, errors, goodness); + e.assign (errors.begin(), errors.end()); + check (errors.size() == 1) +@@ -155,7 +169,7 @@ + + // body empty + cpch = "\n\t\n \n-- \nThis is the sig."; +- g_mime_part_set_content (part, cpch, strlen(cpch)); ++ mime_part_set_content (part, cpch); + MessageCheck :: message_check (msg, attribution, groups_our_server_has, errors, goodness); + e.assign (errors.begin(), errors.end()); + check (errors.size() == 2) +@@ -163,7 +177,7 @@ + check (e[0] == "Error: Message appears to have no new content."); + check (e[1] == "Error: Message is empty."); + cpch = "Some valid message."; +- g_mime_part_set_content (part, cpch, strlen(cpch)); ++ mime_part_set_content (part, cpch); + + // empty subject + g_mime_message_set_subject (msg, ""); +@@ -175,17 +189,17 @@ + g_mime_message_set_subject (msg, "Happy Lucky Feeling"); + + // newsgroups +- g_mime_message_set_header (msg, "Newsgroups", "alt.test,unknown.group"); ++ g_mime_object_set_header ((GMimeObject *) msg, "Newsgroups", "alt.test,unknown.group"); + MessageCheck :: message_check (msg, attribution, groups_our_server_has, errors, goodness); + e.assign (errors.begin(), errors.end()); + check (errors.size() == 1) + check (goodness.is_warn()) + check (e[0] == "Warning: The posting profile's server doesn't carry newsgroup\n\t\"unknown.group\".\n\tIf the group name is correct, switch profiles in the \"From:\"\n\tline or edit the profile with \"Edit|Manage Posting Profiles\".") +- g_mime_message_set_header (msg, "Newsgroups", "alt.test"); ++ g_mime_object_set_header ((GMimeObject *) msg, "Newsgroups", "alt.test"); + + // newsgroups w/o followup +- g_mime_message_set_header (msg, "Newsgroups", "alt.test,alt.religion.kibology,alt.binaries.sounds.mp3.indie"); +- g_mime_header_remove (GMIME_OBJECT(msg)->headers, "Followup-To"); ++ g_mime_object_set_header ((GMimeObject *) msg, "Newsgroups", "alt.test,alt.religion.kibology,alt.binaries.sounds.mp3.indie"); ++ g_mime_header_list_remove (GMIME_OBJECT(msg)->headers, "Followup-To"); + MessageCheck :: message_check (msg, attribution, groups_our_server_has, errors, goodness); + e.assign (errors.begin(), errors.end()); + check (errors.size() == 1) +@@ -193,8 +207,8 @@ + check (e[0] == "Warning: Crossposting without setting Followup-To header.") + + // unknown follow-up +- g_mime_message_set_header (msg, "Newsgroups", "alt.test"); +- g_mime_message_set_header (msg, "Followup-To", "alt.test,unknown.group"); ++ g_mime_object_set_header ((GMimeObject *) msg, "Newsgroups", "alt.test"); ++ g_mime_object_set_header ((GMimeObject *) msg, "Followup-To", "alt.test,unknown.group"); + MessageCheck :: message_check (msg, attribution, groups_our_server_has, errors, goodness); + e.assign (errors.begin(), errors.end()); + check (errors.size() == 1) +@@ -203,11 +217,11 @@ + g_mime_object_remove_header (GMIME_OBJECT(msg), "Followup-To"); + + // top posting +- g_mime_message_set_header (msg, "References", "<asdf@foo.com>"); ++ g_mime_object_set_header ((GMimeObject *) msg, "References", "<asdf@foo.com>"); + cpch = "How Fascinating!\n" + "\n" + "> Blah blah blah.\n"; +- g_mime_part_set_content (part, cpch, strlen(cpch)); ++ mime_part_set_content (part, cpch); + MessageCheck :: message_check (msg, attribution, groups_our_server_has, errors, goodness); + e.assign (errors.begin(), errors.end()); + check (errors.size() == 1) +@@ -216,7 +230,7 @@ + g_mime_object_remove_header (GMIME_OBJECT(msg), "References"); + + // top posting +- g_mime_message_set_header (msg, "References", "<asdf@foo.com>"); ++ g_mime_object_set_header ((GMimeObject *) msg, "References", "<asdf@foo.com>"); + cpch = "How Fascinating!\n" + "\n" + "> Blah blah blah.\n" +@@ -224,7 +238,7 @@ + "-- \n" + "Pan shouldn't mistake this signature for\n" + "original content in the top-posting check.\n"; +- g_mime_part_set_content (part, cpch, strlen(cpch)); ++ mime_part_set_content (part, cpch); + MessageCheck :: message_check (msg, attribution, groups_our_server_has, errors, goodness); + e.assign (errors.begin(), errors.end()); + check (errors.size() == 1) +@@ -238,7 +252,7 @@ + "\n" + "--\n" + "This is my signature.\n"; +- g_mime_part_set_content (part, cpch, strlen(cpch)); ++ mime_part_set_content (part, cpch); + MessageCheck :: message_check (msg, attribution, groups_our_server_has, errors, goodness); + e.assign (errors.begin(), errors.end()); + check (errors.size() == 1) +diff -ru pan-0.133.orig/pan/usenet-utils/message-check.cc pan-0.133/pan/usenet-utils/message-check.cc +--- pan-0.133.orig/pan/usenet-utils/message-check.cc 2008-07-04 23:15:22.000000000 -0700 ++++ pan-0.133/pan/usenet-utils/message-check.cc 2009-09-12 13:42:37.000000000 -0700 +@@ -30,6 +30,7 @@ + #include "gnksa.h" + #include "message-check.h" + #include "text-massager.h" ++#include "mime-utils.h" + + using namespace pan; + +@@ -62,7 +63,7 @@ + std::string body (body_in.to_string()); + + // strip attribution +- const char * attribution = g_mime_message_get_header (message, PAN_ATTRIBUTION); ++ const char * attribution = g_mime_object_get_header ((GMimeObject *) message, PAN_ATTRIBUTION); + if (attribution && *attribution) + { + std::string::size_type attrib_start_pos = body.find (attribution); +@@ -99,7 +100,7 @@ + GMimeMessage * message) + { + // if it's not a reply, then top-posting check is moot +- if (g_mime_message_get_header (message, "References") == NULL) ++ if (g_mime_object_get_header ((GMimeObject *) message, "References") == NULL) + return; + + bool quoted_found (false); +@@ -414,7 +415,6 @@ + } + } + +- + void + MessageCheck :: message_check (const GMimeMessage * message_const, + const StringView & attribution, +@@ -432,7 +432,7 @@ + check_subject (errors, goodness, g_mime_message_get_subject (message)); + + // check the author... +- if (GNKSA::check_from (g_mime_message_get_header (message, "From"), true)) { ++ if (GNKSA::check_from (g_mime_object_get_header ((GMimeObject *) message, "From"), true)) { + errors.insert (_("Error: Bad email address.")); + goodness.raise_to_warn (); + } +@@ -440,17 +440,17 @@ + // check the body... + TextMassager tm; + gboolean is_html; +- char * body = g_mime_message_get_body (message, true, &is_html); ++ char * body = g_mime_message_get_body (message, &is_html); + if (is_html) { + errors.insert (_("Warning: Most newsgroups frown upon HTML posts.")); + goodness.raise_to_warn (); + } + check_body (errors, goodness, tm, message, body, attribution); + g_free (body); +- ++ + // check the optional followup-to... + bool followup_to_set (false); +- const char * cpch = g_mime_message_get_header (message, "Followup-To"); ++ const char * cpch = g_mime_object_get_header ((GMimeObject *) message, "Followup-To"); + if (cpch && *cpch) { + quarks_t groups; + get_nntp_rcpts (cpch, groups); +@@ -460,7 +460,7 @@ + + // check the groups... + size_t group_qty (0); +- cpch = g_mime_message_get_header (message, "Newsgroups"); ++ cpch = g_mime_object_get_header ((GMimeObject *) message, "Newsgroups"); + if (cpch && *cpch) { + quarks_t groups; + get_nntp_rcpts (cpch, groups); +@@ -469,7 +469,7 @@ + } + + // one last error check +- const InternetAddressList * list (g_mime_message_get_recipients (message, GMIME_RECIPIENT_TYPE_TO)); ++ InternetAddressList * list (g_mime_message_get_recipients (message, GMIME_RECIPIENT_TYPE_TO)); + const int n_to (internet_address_list_length (list)); + if (!group_qty && !n_to) { + errors.insert (_("Error: No Recipients.")); +diff -ru pan-0.133.orig/pan/usenet-utils/mime-utils.cc pan-0.133/pan/usenet-utils/mime-utils.cc +--- pan-0.133.orig/pan/usenet-utils/mime-utils.cc 2008-07-04 23:15:24.000000000 -0700 ++++ pan-0.133/pan/usenet-utils/mime-utils.cc 2009-09-12 14:46:25.000000000 -0700 +@@ -455,10 +455,10 @@ + part->stream = g_mime_stream_mem_new (); + if (part->type != ENC_PLAIN) { + part->filter_stream = +- g_mime_stream_filter_new_with_stream (part->stream); ++ g_mime_stream_filter_new (part->stream); + part->filter = part->type == ENC_UU +- ? g_mime_filter_basic_new_type (GMIME_FILTER_BASIC_UU_DEC) +- : g_mime_filter_yenc_new (GMIME_FILTER_YENC_DIRECTION_DECODE); ++ ? g_mime_filter_basic_new (GMIME_CONTENT_ENCODING_UUENCODE, FALSE) ++ : g_mime_filter_yenc_new (FALSE); + g_mime_stream_filter_add (GMIME_STREAM_FILTER(part->filter_stream), + part->filter); + } +@@ -722,18 +722,21 @@ + { + // if the part is a multipart, check its subparts + if (GMIME_IS_MULTIPART (*part)) { +- GList * subparts = GMIME_MULTIPART (*part)->subparts; +- while (subparts) { +- GMimeObject * subpart = (GMimeObject *) subparts->data; ++ GMimeMultipart *multipart = (GMimeMultipart *) *part; ++ int count = g_mime_multipart_get_count(multipart); ++ int i; ++ ++ for (i = 0; i < count; i++) { ++ GMimeObject * subpart = g_mime_multipart_remove_at (multipart, i); + handle_uu_and_yenc_in_text_plain (&subpart); +- subparts->data = subpart; +- subparts = subparts->next; ++ g_mime_multipart_insert (multipart, i, subpart); ++ g_object_unref (subpart); + } + return; + } + + // we assume that inlined yenc and uu are only in text/plain blocks +- const GMimeContentType * content_type = g_mime_object_get_content_type (*part); ++ GMimeContentType * content_type = g_mime_object_get_content_type (*part); + if (!g_mime_content_type_is_type (content_type, "text", "plain")) + return; + +@@ -746,8 +749,8 @@ + GMimeStream * stream = g_mime_data_wrapper_get_stream (content); + g_mime_stream_reset (stream); + GMimeStream * istream = g_mime_stream_buffer_new (stream, GMIME_STREAM_BUFFER_BLOCK_READ); +- g_object_unref (stream); +- g_object_unref (content); ++// g_object_unref (stream); //SKG if this is unrefed, when istream is unrefed below, content loses its stream ++// g_object_unref (content); //SKG gmime 2.4 don't unref returned data wrapper + + // break it into separate parts for text, uu, and yenc pieces. + temp_parts_t parts; +@@ -774,22 +777,22 @@ + g_mime_part_set_filename (subpart, filename); + + GMimeStream * subpart_stream = tmp_part->stream; +- content = g_mime_data_wrapper_new_with_stream (subpart_stream, GMIME_PART_ENCODING_DEFAULT); ++ content = g_mime_data_wrapper_new_with_stream (subpart_stream, GMIME_CONTENT_ENCODING_DEFAULT); + g_mime_part_set_content_object (subpart, content); +- g_mime_multipart_add_part (GMIME_MULTIPART (multipart), GMIME_OBJECT (subpart)); ++ g_mime_multipart_add (GMIME_MULTIPART (multipart), GMIME_OBJECT (subpart)); + + g_object_unref (content); + g_object_unref (subpart); + } + + // replace the old part with the new multipart +- g_mime_object_unref (*part); ++ g_object_unref (*part); + *part = GMIME_OBJECT (multipart); + } + + foreach (temp_parts_t, parts, it) + delete *it; +- g_mime_stream_unref (istream); ++ g_object_unref (istream); + } + } + +@@ -831,15 +834,15 @@ + GMimeStream * stream = g_mime_data_wrapper_get_stream (wrapper); + g_mime_stream_reset (stream); + g_mime_stream_cat_add_source (GMIME_STREAM_CAT (cat), stream); +- g_object_unref (stream); +- g_object_unref (wrapper); ++// g_object_unref (stream); //SKG if this is unrefed cat loses its stream ++// g_object_unref (wrapper); //SKG gmime 2.4 don't unref returned data wrapper + } + + GMimeMessage * message = messages[0]; + GMimeDataWrapper * wrapper = g_mime_part_get_content_object (GMIME_PART(message->mime_part)); + g_mime_stream_reset (cat); + g_mime_data_wrapper_set_stream (wrapper, cat); +- g_object_unref (wrapper); ++// g_object_unref (wrapper); //SKG gmime 2.4 don't unref returned data wrapper + g_object_unref (cat); + } + +@@ -1007,3 +1010,174 @@ + { + normalize_subject (subject, STRIP_MULTIPART_NUMERATOR, setme); + } ++ ++static GMimeObject * ++handle_multipart_mixed (GMimeMultipart *multipart, gboolean *is_html); ++ ++static GMimeObject * ++handle_multipart_alternative (GMimeMultipart *multipart, gboolean *is_html) ++{ ++ GMimeObject *mime_part, *text_part = NULL; ++ GMimeContentType *type; ++ int count = g_mime_multipart_get_count (multipart); ++ ++ for (int i = 0; i < count; ++i) { ++ mime_part = g_mime_multipart_get_part (multipart, i); ++ ++ type = g_mime_object_get_content_type (mime_part); ++ if (g_mime_content_type_is_type (type, "text", "*")) { ++ if (!text_part || !g_ascii_strcasecmp (type->subtype, "plain")) { ++ *is_html = !g_ascii_strcasecmp (type->subtype, "html"); ++ text_part = mime_part; ++ } ++ } ++ } ++ ++ return text_part; ++} ++ ++static GMimeObject * ++handle_multipart_mixed (GMimeMultipart *multipart, gboolean *is_html) ++{ ++ GMimeObject *mime_part, *text_part = NULL; ++ GMimeContentType *type, *first_type = NULL; ++ int count = g_mime_multipart_get_count (multipart); ++ ++ for (int i = 0; i < count; ++i) { ++ mime_part = g_mime_multipart_get_part (multipart, i); ++ ++ type = g_mime_object_get_content_type (mime_part); ++ if (GMIME_IS_MULTIPART (mime_part)) { ++ multipart = GMIME_MULTIPART (mime_part); ++ if (g_mime_content_type_is_type (type, "multipart", "alternative")) { ++ mime_part = handle_multipart_alternative (multipart, is_html); ++ if (mime_part) ++ return mime_part; ++ } else { ++ mime_part = handle_multipart_mixed (multipart, is_html); ++ if (mime_part && !text_part) ++ text_part = mime_part; ++ } ++ } else if (g_mime_content_type_is_type (type, "text", "*")) { ++ if (!g_ascii_strcasecmp (type->subtype, "plain")) { ++ /* we got what we came for */ ++ *is_html = !g_ascii_strcasecmp (type->subtype, "html"); ++ return mime_part; ++ } ++ ++ /* if we haven't yet found a text part or if it is a type we can ++ * * understand and it is the first of that type, save it */ ++ if (!text_part || (!g_ascii_strcasecmp (type->subtype, "plain") && (first_type && ++ g_ascii_strcasecmp (type->subtype, first_type->subtype) != 0))) { ++ *is_html = !g_ascii_strcasecmp (type->subtype, "html"); ++ text_part = mime_part; ++ first_type = type; ++ } ++ } ++ } ++ ++ return text_part; ++} ++ ++#define NEEDS_DECODING(encoding) ((encoding == GMIME_CONTENT_ENCODING_BASE64) || \ ++ (encoding == GMIME_CONTENT_ENCODING_UUENCODE) || \ ++ (encoding == GMIME_CONTENT_ENCODING_QUOTEDPRINTABLE)) ++ ++static const char * ++g_mime_part_get_content (const GMimePart *mime_part, size_t *len) ++{ ++ const char *retval = NULL; ++ GMimeStream *stream; ++ ++ g_return_val_if_fail (GMIME_IS_PART (mime_part), NULL); ++ ++ if (!mime_part->content || !mime_part->content->stream) { ++ g_warning ("no content set on this mime part"); ++ return NULL; ++ } ++ ++ stream = mime_part->content->stream; ++ if (!GMIME_IS_STREAM_MEM (stream) || NEEDS_DECODING (mime_part->content->encoding)) { ++ /* Decode and cache this mime part's contents... */ ++ GMimeStream *cache; ++ GByteArray *buf; ++ ++ buf = g_byte_array_new (); ++ cache = g_mime_stream_mem_new_with_byte_array (buf); ++ ++ g_mime_data_wrapper_write_to_stream (mime_part->content, cache); ++ ++ g_mime_data_wrapper_set_stream (mime_part->content, cache); ++ g_mime_data_wrapper_set_encoding (mime_part->content, GMIME_CONTENT_ENCODING_DEFAULT); ++ g_object_unref (cache); ++ ++ *len = buf->len; ++ retval = (char *) buf->data; ++ } else { ++ GByteArray *buf = GMIME_STREAM_MEM (stream)->buffer; ++ off_t end_index = (off_t) buf->len; ++ off_t start_index = 0; ++ ++ /* check boundaries */ ++ if (stream->bound_start >= 0) ++ start_index = CLAMP (stream->bound_start, 0, (off_t) buf->len); ++ if (stream->bound_end >= 0) ++ end_index = CLAMP (stream->bound_end, 0, (off_t) buf->len); ++ if (end_index < start_index) ++ end_index = start_index; ++ ++ *len = end_index - start_index; ++ retval = (char *) buf->data + start_index; ++ } ++ ++ return retval; ++} ++ ++char *g_mime_message_get_body (GMimeMessage *message, gboolean *is_html) ++{ ++ GMimeObject *mime_part = NULL; ++ GMimeContentType *type; ++ GMimeMultipart *multipart; ++ const char *content; ++ char *body = NULL; ++ size_t len = 0; ++ ++ g_return_val_if_fail (GMIME_IS_MESSAGE (message), NULL); ++ g_return_val_if_fail (is_html != NULL, NULL); ++ ++ type = g_mime_object_get_content_type (message->mime_part); ++ if (GMIME_IS_MULTIPART (message->mime_part)) { ++ /* let's see if we can find a body in the multipart */ ++ multipart = GMIME_MULTIPART (message->mime_part); ++ if (g_mime_content_type_is_type (type, "multipart", "alternative")) ++ mime_part = handle_multipart_alternative (multipart, is_html); ++ else ++ mime_part = handle_multipart_mixed (multipart, is_html); ++ } else if (g_mime_content_type_is_type (type, "text", "*")) { ++ /* this *has* to be the message body */ ++ if (g_mime_content_type_is_type (type, "text", "html")) ++ *is_html = TRUE; ++ else ++ *is_html = FALSE; ++ mime_part = message->mime_part; ++ } ++ ++ if (mime_part != NULL) { ++ content = g_mime_part_get_content (GMIME_PART (mime_part), &len); ++ body = g_strndup (content, len); ++ } ++ ++ return body; ++} ++ ++void g_mime_message_add_recipients_from_string (GMimeMessage *message, GMimeRecipientType type, const char *string) ++{ ++ InternetAddressList *addrlist; ++ if ((addrlist = internet_address_list_parse_string (string))) { ++ for (int i = 0; i < internet_address_list_length (addrlist); ++i) { ++ InternetAddress *ia = internet_address_list_get_address (addrlist, i); ++ if (INTERNET_ADDRESS_IS_MAILBOX(ia)) ++ g_mime_message_add_recipient (message, type, internet_address_get_name(ia), internet_address_mailbox_get_addr(INTERNET_ADDRESS_MAILBOX(ia))); ++ } ++ } ++} +diff -ru pan-0.133.orig/pan/usenet-utils/mime-utils.h pan-0.133/pan/usenet-utils/mime-utils.h +--- pan-0.133.orig/pan/usenet-utils/mime-utils.h 2007-08-01 09:59:59.000000000 -0700 ++++ pan-0.133/pan/usenet-utils/mime-utils.h 2009-09-12 13:20:11.000000000 -0700 +@@ -64,4 +64,8 @@ + }; + } + ++char *g_mime_message_get_body (GMimeMessage *message, gboolean *is_html); ++void g_mime_message_add_recipients_from_string (GMimeMessage *message, GMimeRecipientType type, const char *string); ++ ++ + #endif +diff -ru pan-0.133.orig/pan.spec pan-0.133/pan.spec +--- pan-0.133.orig/pan.spec 2008-07-29 19:05:05.000000000 -0700 ++++ pan-0.133/pan.spec 2009-09-12 14:58:20.000000000 -0700 +@@ -15,14 +15,14 @@ + + BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-buildroot + BuildRequires: glib2-devel >= 2.4.0 +-BuildRequires: gmime-devel >= 2.1.9 ++BuildRequires: gmime-devel >= 2.3.5 + BuildRequires: gtk2-devel >= 2.4.0 + BuildRequires: pcre-devel >= 5.0 + %{!?_without_gtkspell:BuildRequires: gtkspell-devel >= 2.0.7} + + Requires: pcre >= 5.0 + Requires: glib2 >= 2.4.0 +-Requires: gmime >= 2.1.9 ++Requires: gmime >= 2.3.5 + Requires: gtk2 >= 2.4.0 + %{!?_without_gtkspell:Requires: gtkspell >= 2.0.7} + |