Index: libmrss-0.17.2/src/mrss.h =================================================================== --- libmrss-0.17.2.orig/src/mrss.h 2007-04-02 14:42:55.000000000 +0200 +++ libmrss-0.17.2/src/mrss.h 2007-05-19 20:56:08.000000000 +0200 @@ -523,6 +523,22 @@ mrss_t ** mrss, mrss_options_t * options); +/** + * Like the previous function but you take ownership of the downloaded buffer in case of success + * \param url The url to be parsed + * \param mrss the pointer to your data struct + * \param options a pointer to a options data struct + * \param feed_content a pointer to the buffer with the document. This is not NULL terminated + * \param feed_size the size of the buffer above + * \return the error code + */ +mrss_error_t mrss_parse_url_and_transfer_buffer + (char * url, + mrss_t ** mrss, + mrss_options_t * options, + char ** feed_content, + int * feed_size); + /** * Parses a file and creates the data struct of the feed RSS url * \param file The file to be parsed Index: libmrss-0.17.2/src/mrss_parser.c =================================================================== --- libmrss-0.17.2.orig/src/mrss_parser.c 2007-05-19 20:47:08.000000000 +0200 +++ libmrss-0.17.2/src/mrss_parser.c 2007-05-19 20:56:37.000000000 +0200 @@ -1075,13 +1075,20 @@ mrss_error_t mrss_parse_url (char *url, mrss_t ** ret) { - return mrss_parse_url_with_options (url, ret, NULL); + return mrss_parse_url_and_transfer_buffer (url, ret, NULL, NULL, NULL); } mrss_error_t mrss_parse_url_with_options (char *url, mrss_t ** ret, mrss_options_t * options) { + return mrss_parse_url_and_transfer_buffer (url, ret, options, NULL, NULL); +} + +mrss_error_t +mrss_parse_url_and_transfer_buffer (char *url, mrss_t ** ret, + mrss_options_t * options, char **download_buffer, int *download_size) +{ nxml_t *doc; mrss_error_t err; char *buffer; @@ -1117,7 +1124,8 @@ if (nxml_parse_buffer (doc, buffer, size) != NXML_OK) { - free (buffer); + if (!download_buffer) + free (buffer); nxml_free (doc); return MRSS_ERR_PARSER; @@ -1127,7 +1135,8 @@ { if (!((*ret)->file = strdup (url))) { - free (buffer); + if (!download_buffer) + free (buffer); mrss_free (*ret); nxml_free (doc); @@ -1138,9 +1147,15 @@ (*ret)->size = size; } - free (buffer); + if (!download_buffer) + free (buffer); nxml_free (doc); + /* transfer ownership */ + if (download_buffer) + *download_buffer = buffer; + if (download_size) + *download_size = size; return err; }