/*
 * Returns content length of the given mime part and its descendants
 */
static guint
get_content_length(GMimeObject *mime_object, int method)
{
        guint			lsize = 0;
	GMimePart *		mime_part;
	GMimeMultipart *	mime_multipart;

        if (mime_object) {
		if (GMIME_IS_MULTIPART(mime_object)) {
		    mime_multipart = GMIME_MULTIPART(mime_object);
        	    if ((method & GMIME_LENGTH_CUMULATIVE)) {
        		GList *child = GMIME_MULTIPART (mime_multipart)->subparts;
        		while (child) {
        			lsize += get_content_length ( GMIME_OBJECT(child->data), method );
        			child = child->next;
        		}
        	    }
		} else if (GMIME_IS_PART(mime_object)) { // also MESSAGE_PARTIAL
		    mime_part = GMIME_PART(mime_object);
        	    lsize = (mime_part->content && mime_part->content->stream) ?
        	      g_mime_stream_length(mime_part->content->stream) : 0; 
        	    if ((method & GMIME_LENGTH_ENCODED) && lsize) {
        		GMimePartEncodingType	enc;

        		enc = g_mime_part_get_encoding(mime_part);
        		switch (enc) {
        		  case GMIME_PART_ENCODING_BASE64:
        		    lsize = BASE64_ENCODE_LEN(lsize);
        		    break;
        		  case GMIME_PART_ENCODING_QUOTEDPRINTABLE:
        		    lsize = QP_ENCODE_LEN(lsize);
        		    break;
        		}
        	    }
		} else if (GMIME_IS_MESSAGE_PART(mime_object)) {
		    lsize += get_content_length(GMIME_OBJECT((g_mime_message_part_get_message(GMIME_MESSAGE_PART(mime_object)))), method);
		} else if (GMIME_IS_MESSAGE(mime_object)) {
		    if (GMIME_MESSAGE(mime_object)->mime_part != NULL)
        	        lsize += get_content_length ( GMIME_OBJECT(GMIME_MESSAGE(mime_object)->mime_part), method );
		}
        }
        return lsize;
}



syntax highlighted by Code2HTML, v. 0.9.1