The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.

MODULE = MIME::Fast		PACKAGE = MIME::Fast::Message	PREFIX=g_mime_message_

# new(pretty_headers)
MIME::Fast::Message
g_mime_message_new(Class, pretty_headers = FALSE)
        char *		Class
        gboolean	pretty_headers
    CODE:
        RETVAL = g_mime_message_new(pretty_headers);
	if (gmime_debug)
          warn("g_mime_message_NEW: 0x%x\n", RETVAL);
        plist = g_list_prepend(plist, RETVAL);
    OUTPUT:
        RETVAL

# destroy(message)
void
DESTROY(message)
        MIME::Fast::Message	message
    CODE:
        if (gmime_debug)
          warn("g_mime_message_DESTROY: 0x%x %s", message,
            g_list_find(plist,message) ? "(true destroy)" : "(only attempt)");
        if (g_list_find(plist,message)) {
          g_mime_object_unref (GMIME_OBJECT (message));
          plist = g_list_remove(plist, message);
	}

# recipient
void
g_mime_message_add_recipient(message, type, name, address)
        MIME::Fast::Message	message
        char *		type
        const char *	name
        const char *	address

void
g_mime_message_add_recipients_from_string(message, type, recipients)
 	MIME::Fast::Message	message
        char *		type
        const char *	recipients

AV *
g_mime_message_get_recipients(message, type)
        MIME::Fast::Message	message
        const char *	type
    PREINIT:
        InternetAddressList *		rcpt;
        AV * 		retav;
    CODE:
        retav = newAV();
        rcpt = g_mime_message_get_recipients(message, type);
        while (rcpt) {
          SV * address = newSViv(0);
          sv_setref_pv(address, "MIME::Fast::InternetAddress", (MIME__Fast__InternetAddress)(rcpt->address));
          av_push(retav, address);
          rcpt = rcpt->next;
        }
        RETVAL = retav;
    OUTPUT:
        RETVAL


void
interface_m_set(message, value)
        MIME::Fast::Message	message
	char *			value
    INTERFACE_MACRO:
	XSINTERFACE_FUNC
	XSINTERFACE_FUNC_MIMEFAST_MESSAGE_SET
    INTERFACE:
	set_subject
	set_message_id
	set_reply_to
	set_sender

const char *
interface_m_get(message)
        MIME::Fast::Message	message
    INTERFACE_MACRO:
	XSINTERFACE_FUNC
	XSINTERFACE_FUNC_MIMEFAST_MESSAGE_SET
    INTERFACE:
	get_subject
	get_message_id
	get_reply_to
	get_sender
        
 # date
void
g_mime_message_set_date(message, date, gmt_offset)
        MIME::Fast::Message	message
        time_t		date
        int		gmt_offset

void
g_mime_message_set_date_from_string(message, str)
        MIME::Fast::Message	message
        const char *	str
    PREINIT:
	time_t		date;
	int		offset = 0;
    CODE:
	date = g_mime_utils_header_decode_date (str, &offset);
	g_mime_message_set_date (message, date, offset);


 #
 # returns scalar string or array (date, gmt_offset)
 #
void
g_mime_message_get_date(message)
        MIME::Fast::Message	message
    PREINIT:
        time_t		date;
        int		gmt_offset;
        I32		gimme = GIMME_V;
	char *		str;
    PPCODE:
        if (gimme == G_SCALAR) {
          str = g_mime_message_get_date_string(message);
	  if (str) {
            XPUSHs(sv_2mortal(newSVpv(str,0)));
	    g_free (str);
	  }
        } else if (gimme == G_ARRAY) {
          g_mime_message_get_date(message, &date, &gmt_offset);
          XPUSHs(sv_2mortal(newSVnv(date)));
          XPUSHs(sv_2mortal(newSViv(gmt_offset)));
        }

# the other headers
void
g_mime_message_set_header(message, field, value)
        MIME::Fast::Message	message
        const char *	field
        const char *	value
    CODE:
        g_mime_message_set_header(message, field, value);
        // message_set_header(message, field, value);
    	

void
g_mime_message_remove_header(message, field)
        MIME::Fast::Message	message
        const char *	field
    CODE:
        g_mime_object_remove_header(GMIME_OBJECT (message), field);

 # add arbitrary header
void
g_mime_message_add_header(message, field, value)
        MIME::Fast::Message	message
        const char *	field
        const char *	value

# CODE:
#	message_set_header(message, field, value);

const char *
g_mime_message_get_header(message, field)
        MIME::Fast::Message	message
        const char *	field

# mime_part
void
g_mime_message_set_mime_part(message, mime_part)
        MIME::Fast::Message	message
        MIME::Fast::Object	mime_part
    CODE:
        g_mime_message_set_mime_part(message, GMIME_OBJECT (mime_part));
        plist = g_list_remove(plist, mime_part);

## UTILITY FUNCTIONS

SV *
g_mime_message_get_body(message, want_plain = 1, is_html = 0)
    CASE: items == 1
        MIME::Fast::Message	message
    PREINIT:
        gboolean	want_plain = 1;
        gboolean	is_html;
	char *		textdata;
    CODE:
        textdata = g_mime_message_get_body(message, want_plain, &is_html);
	if (textdata == NULL)
	  XSRETURN_UNDEF;
        RETVAL = newSVpv(textdata, 0);
	g_free (textdata);
    OUTPUT:
        RETVAL
    CASE: items == 2
        MIME::Fast::Message	message
        gboolean	want_plain
    PREINIT:
        gboolean	is_html;
	char *		textdata;
    CODE:
        textdata = g_mime_message_get_body(message, want_plain, &is_html);
	if (textdata == NULL)
	  XSRETURN_UNDEF;
        RETVAL = newSVpv(textdata, 0);
	g_free (textdata);
    OUTPUT:
        RETVAL
    CASE: items == 3
        MIME::Fast::Message	message
        gboolean	want_plain
        gboolean	&is_html
    PREINIT:
	char *		textdata;
    CODE:
        textdata = g_mime_message_get_body(message, want_plain, &is_html);
	if (textdata == NULL)
	  XSRETURN_UNDEF;
        RETVAL = newSVpv(textdata, 0);
	g_free (textdata);
    OUTPUT:
        is_html
        RETVAL
        

SV *
g_mime_message_get_headers(message)
        MIME::Fast::Message	message
    PREINIT:
	char *		textdata;
    CODE:
	textdata = g_mime_message_get_headers(message);
	if (textdata == NULL)
	  XSRETURN_UNDEF;
        RETVAL = newSVpv(textdata, 0);
	g_free (textdata);
    OUTPUT:
        RETVAL

# callback function
void
g_mime_message_foreach_part(message, callback, svdata)
        MIME::Fast::Message	message
        SV *			callback
        SV *			svdata
    PREINIT:
	struct _user_data_sv    *data;

    CODE:
	data = g_new0 (struct _user_data_sv, 1);
	data->svuser_data = newSVsv(svdata);
	data->svfunc = newSVsv(callback);
        g_mime_message_foreach_part(message, call_sub_foreach, data);
	g_free (data);

## "OBJECTS" FUNCTION

 # returns Part or MultiPart
SV *
get_mime_part(message)
        MIME::Fast::Message	message
    PREINIT:
    	GMimeObject *	mime_object;
    CODE:
        if (message->mime_part != NULL) {
	  RETVAL = newSViv(4);
          mime_object = GMIME_OBJECT(message->mime_part);
          if (GMIME_IS_MULTIPART(mime_object))
	    sv_setref_pv(RETVAL, "MIME::Fast::MultiPart", (MIME__Fast__MultiPart)mime_object);
	  else if (GMIME_IS_MESSAGE_PARTIAL(mime_object))
	    sv_setref_pv(RETVAL, "MIME::Fast::MessagePartial", (MIME__Fast__MessagePartial)mime_object);
#if GMIME_CHECK_VERSION_UNSUPPORTED
	  else if (GMIME_IS_MESSAGE_MDN(mime_object))
	    sv_setref_pv(RETVAL, "MIME::Fast::MessageMDN", (MIME__Fast__MessageMDN)mime_object);
	  else if (GMIME_IS_MESSAGE_DELIVERY(mime_object))
	    sv_setref_pv(RETVAL, "MIME::Fast::MessageDelivery", (MIME__Fast__MessageDelivery)mime_object);
#endif
	  else if (GMIME_IS_PART(mime_object))
	    sv_setref_pv(RETVAL, "MIME::Fast::Part", (MIME__Fast__Part)mime_object);
	  else if (GMIME_IS_MESSAGE_PART(mime_object))
	    sv_setref_pv(RETVAL, "MIME::Fast::MessagePart", (MIME__Fast__MessagePart)mime_object);
	  else
	    die("get_mime_part: unknown type of object: 0x%x", mime_object);
          plist = g_list_prepend(plist, RETVAL);
	  g_mime_object_ref( mime_object );
          if (gmime_debug)
            warn("function message->mime_part returns (not in plist): 0x%x", RETVAL);
	} else {
	  RETVAL = &PL_sv_undef;
	}
    OUTPUT:
        RETVAL