summaryrefslogtreecommitdiff
path: root/source/xap/pan
diff options
context:
space:
mode:
authorPatrick J Volkerding <volkerdi@slackware.com>2010-05-19 08:58:23 +0000
committerEric Hameleers <alien@slackware.com>2018-05-31 22:43:05 +0200
commitb76270bf9e6dd375e495fec92140a79a79415d27 (patch)
tree3dbed78b2279bf9f14207a16dc634b90995cbd40 /source/xap/pan
parent5a12e7c134274dba706667107d10d231517d3e05 (diff)
downloadcurrent-b76270bf9e6dd375e495fec92140a79a79415d27.tar.gz
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-xsource/xap/pan/pan.SlackBuild22
-rw-r--r--source/xap/pan/pan.gcc44.diff50
-rw-r--r--source/xap/pan/pan.gmime2.4.diff1271
3 files changed, 1339 insertions, 4 deletions
diff --git a/source/xap/pan/pan.SlackBuild b/source/xap/pan/pan.SlackBuild
index 288b34a7..4bfbcf7f 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 00000000..22df125f
--- /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 00000000..4816ea6c
--- /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}
+