fix CID 1596595: Resource leaks, and CID 1596594: (CHECKED_RETURN)
[claws.git] / src / plugins / rssyl / libfeed / feeditem.c
1 /*
2  * Claws Mail -- a GTK based, lightweight, and fast e-mail client
3  * Copyright (C) 2006-2023 the Claws Mail Team and Andrej Kacian <andrej@kacian.sk>
4  *
5  * This program is free software; you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License as published by
7  * the Free Software Foundation; either version 3 of the License, or
8  * (at your option) any later version.
9  *
10  * This program is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13  * GNU General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License
16  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
17  */
18
19 #include "config.h"
20
21 #include <stdlib.h>
22 #include <glib.h>
23 #include <curl/curl.h>
24 #include <expat.h>
25
26 #include "feed.h"
27 #include "feeditem.h"
28 #include "feeditemenclosure.h"
29 #include "parser.h"
30
31 /* feed_item_new()
32  * Initializes a new empty FeedItem struct, setting its parent feed,
33  * if supplied. */
34 FeedItem *feed_item_new(Feed *feed)
35 {
36         FeedItem *item = NULL;
37
38         item = g_malloc( sizeof(FeedItem) );
39         item->url = NULL;
40         item->title = NULL;
41         item->title_format = 0;
42         item->summary = NULL;
43         item->text = NULL;
44         item->author = NULL;
45         item->id = NULL;
46         item->comments_url = NULL;
47         item->parent_id = NULL;
48         item->enclosure = NULL;
49
50         item->sourcetitle = NULL;
51         item->sourceid = NULL;
52         item->sourcedate = -1;
53
54         item->id_is_permalink = FALSE;
55         item->xhtml_content = FALSE;
56
57         item->date_published = -1;
58         item->date_modified = -1;
59         
60         if( feed != NULL )
61                 item->feed = feed;
62
63         item->data = NULL;
64
65         return item;
66 }
67
68 void feed_item_free(FeedItem *item)
69 {
70         if( item == NULL )
71                 return;
72
73         g_free(item->url);
74         g_free(item->title);
75         g_free(item->summary);
76         g_free(item->text);
77         g_free(item->author);
78         g_free(item->id);
79         g_free(item->data);
80         g_free(item->comments_url);
81         g_free(item->parent_id);
82         feed_item_enclosure_free(item->enclosure);
83
84         g_free(item->sourcetitle);
85         g_free(item->sourceid);
86
87         g_free(item);
88         item = NULL;
89 }
90
91 Feed *feed_item_get_feed(FeedItem *item)
92 {
93         g_return_val_if_fail(item != NULL, NULL);
94         return item->feed;
95 }
96
97 /* URL */
98 gchar *feed_item_get_url(FeedItem *item)
99 {
100         g_return_val_if_fail(item != NULL, NULL);
101         return item->url;
102 }
103
104 void feed_item_set_url(FeedItem *item, const gchar *url)
105 {
106         g_return_if_fail(item != NULL);
107         g_return_if_fail(url != NULL);
108
109         g_free(item->url);
110         item->url = g_strdup(url);
111 }
112
113 /* Title */
114 gchar *feed_item_get_title(FeedItem *item)
115 {
116         g_return_val_if_fail(item != NULL, NULL);
117         return item->title;
118 }
119
120 void feed_item_set_title(FeedItem *item, const gchar *title)
121 {
122         g_return_if_fail(item != NULL);
123         g_return_if_fail(title != NULL);
124
125         g_free(item->title);
126         item->title = g_strdup(title);
127 }
128
129 /* Title format */
130 gint feed_item_get_title_format(FeedItem *item)
131 {
132         g_return_val_if_fail(item != NULL, -1);
133         return item->title_format;
134 }
135
136 void feed_item_set_title_format(FeedItem *item, gint format)
137 {
138         g_return_if_fail(item != NULL);
139         g_return_if_fail(format >= 0 && format <= FEED_ITEM_TITLE_UNKNOWN);
140
141         item->title_format = format;
142 }
143
144 /* Summary */
145 gchar *feed_item_get_summary(FeedItem *item)
146 {
147         g_return_val_if_fail(item != NULL, NULL);
148         return item->summary;
149 }
150
151 void feed_item_set_summary(FeedItem *item, const gchar *summary)
152 {
153         g_return_if_fail(item != NULL);
154         g_return_if_fail(summary != NULL);
155
156         g_free(item->summary);
157         item->summary = g_strdup(summary);
158 }
159
160 /* Text */
161 gchar *feed_item_get_text(FeedItem *item)
162 {
163         g_return_val_if_fail(item != NULL, NULL);
164         return item->text;
165 }
166
167 void feed_item_set_text(FeedItem *item, const gchar *text)
168 {
169         g_return_if_fail(item != NULL);
170         g_return_if_fail(text != NULL);
171
172         g_free(item->text);
173         item->text = g_strdup(text);
174 }
175
176 /* Author */
177 gchar *feed_item_get_author(FeedItem *item)
178 {
179         g_return_val_if_fail(item != NULL, NULL);
180         return item->author;
181 }
182
183 void feed_item_set_author(FeedItem *item, const gchar *author)
184 {
185         g_return_if_fail(item != NULL);
186         g_return_if_fail(author != NULL);
187
188         g_free(item->author);
189         item->author = g_strdup(author);
190 }
191
192 /* ID */
193 gchar *feed_item_get_id(FeedItem *item)
194 {
195         g_return_val_if_fail(item != NULL, NULL);
196         return item->id;
197 }
198
199 void feed_item_set_id(FeedItem *item, const gchar *id)
200 {
201         g_return_if_fail(item != NULL);
202         g_return_if_fail(id != NULL);
203
204         g_free(item->id);
205         item->id = g_strdup(id);
206 }
207
208 /* Comments URL */
209 gchar *feed_item_get_comments_url(FeedItem *item)
210 {
211         g_return_val_if_fail(item != NULL, NULL);
212         return item->comments_url;
213 }
214
215 void feed_item_set_comments_url(FeedItem *item, const gchar *url)
216 {
217         g_return_if_fail(item != NULL);
218         g_return_if_fail(url != NULL);
219
220         g_free(item->comments_url);
221         item->comments_url = g_strdup(url);
222 }
223
224 /* Comments URL */
225 gchar *feed_item_get_parent_id(FeedItem *item)
226 {
227         g_return_val_if_fail(item != NULL, NULL);
228         return item->parent_id;
229 }
230
231 void feed_item_set_parent_id(FeedItem *item, const gchar *id)
232 {
233         g_return_if_fail(item != NULL);
234         g_return_if_fail(id != NULL);
235
236         g_free(item->parent_id);
237         item->parent_id = g_strdup(id);
238 }
239
240 /* Media enclosure */
241 FeedItemEnclosure *feed_item_get_enclosure(FeedItem *item)
242 {
243         g_return_val_if_fail(item != NULL, NULL);
244         return item->enclosure;
245 }
246
247 void feed_item_set_enclosure(FeedItem *item, FeedItemEnclosure *enclosure)
248 {
249         g_return_if_fail(item != NULL);
250         g_return_if_fail(enclosure != NULL);
251         g_return_if_fail(enclosure->url != NULL);
252         g_return_if_fail(enclosure->type != NULL);
253
254         feed_item_enclosure_free(item->enclosure);
255         item->enclosure = enclosure;
256 }
257
258 /* Source title (Atom only) */
259 gchar *feed_item_get_sourcetitle(FeedItem *item)
260 {
261         g_return_val_if_fail(item != NULL, NULL);
262         return item->sourcetitle;
263 }
264
265 void feed_item_set_sourcetitle(FeedItem *item, const gchar *sourcetitle)
266 {
267         g_return_if_fail(item != NULL);
268         g_return_if_fail(sourcetitle != NULL);
269
270         g_free(item->sourcetitle);
271         item->sourcetitle = g_strdup(sourcetitle);
272 }
273
274 /* Source ID (Atom only) */
275 gchar *feed_item_get_sourceid(FeedItem *item)
276 {
277         g_return_val_if_fail(item != NULL, NULL);
278         return item->sourceid;
279 }
280
281 void feed_item_set_sourceid(FeedItem *item, const gchar *sourceid)
282 {
283         g_return_if_fail(item != NULL);
284         g_return_if_fail(sourceid != NULL);
285
286         g_free(item->sourceid);
287         item->sourceid = g_strdup(sourceid);
288 }
289
290 /* Source date (Atom only) */
291 time_t feed_item_get_sourcedate(FeedItem *item)
292 {
293         g_return_val_if_fail(item != NULL, -1);
294         return item->sourcedate;
295 }
296
297 void feed_item_set_sourcedate(FeedItem *item, time_t date)
298 {
299         g_return_if_fail(item != NULL);
300         item->sourcedate = date;
301 }
302
303 /* Date published */
304 time_t feed_item_get_date_published(FeedItem *item)
305 {
306         g_return_val_if_fail(item != NULL, -1);
307         return item->date_published;
308 }
309
310 void feed_item_set_date_published(FeedItem *item, time_t date)
311 {
312         g_return_if_fail(item != NULL);
313         item->date_published = date;
314 }
315
316 /* Date modified */
317 time_t feed_item_get_date_modified(FeedItem *item)
318 {
319         g_return_val_if_fail(item != NULL, -1);
320         return item->date_modified;
321 }
322
323 void feed_item_set_date_modified(FeedItem *item, time_t date)
324 {
325         g_return_if_fail(item != NULL);
326         item->date_modified = date;
327 }
328
329 FeedItem *feed_item_copy(FeedItem *item)
330 {
331         FeedItem *nitem;
332
333         g_return_val_if_fail(item != NULL, NULL);
334
335         nitem = feed_item_new(NULL);
336
337         nitem->url = g_strdup(item->url);
338         nitem->title = g_strdup(item->title);
339         nitem->summary = g_strdup(item->summary);
340         nitem->text = g_strdup(item->text);
341         nitem->author = g_strdup(item->author);
342         nitem->id = g_strdup(item->id);
343         nitem->comments_url = g_strdup(item->comments_url);
344         nitem->parent_id = g_strdup(item->parent_id);
345
346         nitem->enclosure = feed_item_enclosure_copy(item->enclosure);
347
348         nitem->date_published = item->date_published;
349         nitem->date_modified = item->date_modified;
350
351         nitem->id_is_permalink = item->id_is_permalink;
352         nitem->xhtml_content = item->xhtml_content;
353
354         /* We have no way of knowing the size of object item->data is pointing
355          * to, so we can not reliably copy it to the new item. Caller will have
356          * to take care of that itself. */
357         nitem->data = NULL;
358
359         return nitem;
360 }
361
362 gboolean feed_item_id_is_permalink(FeedItem *item)
363 {
364         g_return_val_if_fail(item != NULL, FALSE);
365
366         return item->id_is_permalink;
367 }
368
369 void feed_item_set_id_permalink(FeedItem *item, gboolean permalink)
370 {
371         g_return_if_fail(item != NULL);
372
373         item->id_is_permalink = permalink;
374 }