1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
|
upstream: mailed to bakunin_at_autistici_dot_org by Laibsch
status: committed in upstream CVS on Feb 26th 2008
comment: API addition to not manually setup the CURL connection and still
be able to get the transfered feed and save it to secondary storage. done
by zecke for the OpenMoko RSS reader.
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;
}
|