00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #ifdef HAVE_CONFIG_H
00020 #include <config.h>
00021 #else
00022 # error Use configure; make; make install
00023 #endif
00024
00025 #include "mrss.h"
00026 #include "mrss_internal.h"
00027
00028 static mrss_error_t __mrss_set_channel (mrss_t *, va_list);
00029 static mrss_error_t __mrss_set_item (mrss_item_t *, va_list);
00030 static mrss_error_t __mrss_set_hour (mrss_hour_t *, va_list);
00031 static mrss_error_t __mrss_set_day (mrss_day_t *, va_list);
00032 static mrss_error_t __mrss_set_category (mrss_category_t *, va_list);
00033
00034 static mrss_error_t __mrss_get_channel (mrss_t *, va_list);
00035 static mrss_error_t __mrss_get_item (mrss_item_t *, va_list);
00036 static mrss_error_t __mrss_get_hour (mrss_hour_t *, va_list);
00037 static mrss_error_t __mrss_get_day (mrss_day_t *, va_list);
00038 static mrss_error_t __mrss_get_category (mrss_category_t *, va_list);
00039
00040 static mrss_error_t __mrss_new_subdata_channel (mrss_t *, mrss_element_t,
00041 mrss_generic_t);
00042 static mrss_error_t __mrss_new_subdata_item (mrss_item_t *, mrss_element_t,
00043 mrss_generic_t);
00044
00045 static mrss_error_t __mrss_remove_subdata_channel (mrss_t *, mrss_generic_t);
00046 static mrss_error_t __mrss_remove_subdata_item (mrss_item_t *,
00047 mrss_generic_t);
00048
00049 #define __MRSS_SET_STRING( x ) \
00050 if(x) free(x); \
00051 if(value && !(x=strdup(value))) return MRSS_ERR_POSIX; \
00052 else if(!value) x=NULL;
00053
00054 #define __MRSS_SET_INTEGER( x ) \
00055 x=(int)value;
00056
00057 #define __MRSS_GET_STRING( x ) \
00058 string = (char **)value; \
00059 if (!x) *string = NULL; \
00060 else if(!(*string = strdup(x))) return MRSS_ERR_POSIX;
00061
00062 #define __MRSS_GET_INTEGER( x ) \
00063 integer=(int *)value; \
00064 *integer=x;
00065
00066 mrss_error_t
00067 mrss_new (mrss_t ** data)
00068 {
00069 if (!data)
00070 return MRSS_ERR_DATA;
00071
00072 if (!*data && !(*data = (mrss_t *) malloc (sizeof (mrss_t))))
00073 return MRSS_ERR_POSIX;
00074
00075 memset (*data, 0, sizeof (mrss_t));
00076 (*data)->element = MRSS_ELEMENT_CHANNEL;
00077
00078 return MRSS_OK;
00079 }
00080
00081 mrss_error_t
00082 mrss_set (mrss_generic_t data, ...)
00083 {
00084 va_list va;
00085 mrss_error_t err;
00086 mrss_t *tmp;
00087
00088 if (!data)
00089 return MRSS_ERR_DATA;
00090
00091 va_start (va, data);
00092
00093 tmp = (mrss_t *) data;
00094 switch (tmp->element)
00095 {
00096 case MRSS_ELEMENT_CHANNEL:
00097 err = __mrss_set_channel ((mrss_t *) data, va);
00098 break;
00099
00100 case MRSS_ELEMENT_ITEM:
00101 err = __mrss_set_item ((mrss_item_t *) data, va);
00102 break;
00103
00104 case MRSS_ELEMENT_SKIPHOURS:
00105 err = __mrss_set_hour ((mrss_hour_t *) data, va);
00106 break;
00107
00108 case MRSS_ELEMENT_SKIPDAYS:
00109 err = __mrss_set_day ((mrss_day_t *) data, va);
00110 break;
00111
00112 case MRSS_ELEMENT_CATEGORY:
00113 err = __mrss_set_category ((mrss_category_t *) data, va);
00114 break;
00115
00116 default:
00117 err = MRSS_ERR_DATA;
00118 break;
00119 }
00120
00121 va_end (va);
00122 return err;
00123 }
00124
00125 static mrss_error_t
00126 __mrss_set_channel (mrss_t * data, va_list va)
00127 {
00128 mrss_flag_t flag;
00129 void *value;
00130
00131 while ((flag = va_arg (va, mrss_flag_t)))
00132 {
00133 value = va_arg (va, void *);
00134
00135 switch (flag)
00136 {
00137 case MRSS_FLAG_VERSION:
00138 if ((mrss_version_t) value != MRSS_VERSION_0_91 &&
00139 (mrss_version_t) value != MRSS_VERSION_0_92 &&
00140 (mrss_version_t) value != MRSS_VERSION_2_0)
00141 return MRSS_ERR_DATA;
00142
00143 data->version = (mrss_version_t) value;
00144 break;
00145
00146 case MRSS_FLAG_TITLE:
00147 __MRSS_SET_STRING (data->title);
00148 break;
00149
00150 case MRSS_FLAG_DESCRIPTION:
00151 __MRSS_SET_STRING (data->description);
00152 break;
00153
00154 case MRSS_FLAG_LINK:
00155 __MRSS_SET_STRING (data->link);
00156 break;
00157
00158 case MRSS_FLAG_LANGUAGE:
00159 __MRSS_SET_STRING (data->language);
00160 break;
00161
00162 case MRSS_FLAG_RATING:
00163 __MRSS_SET_STRING (data->rating);
00164 break;
00165
00166 case MRSS_FLAG_COPYRIGHT:
00167 __MRSS_SET_STRING (data->copyright);
00168 break;
00169
00170 case MRSS_FLAG_PUBDATE:
00171 __MRSS_SET_STRING (data->pubDate);
00172 break;
00173
00174 case MRSS_FLAG_LASTBUILDDATE:
00175 __MRSS_SET_STRING (data->lastBuildDate);
00176 break;
00177
00178 case MRSS_FLAG_DOCS:
00179 __MRSS_SET_STRING (data->docs);
00180 break;
00181
00182 case MRSS_FLAG_MANAGINGEDITOR:
00183 __MRSS_SET_STRING (data->managingeditor);
00184 break;
00185
00186 case MRSS_FLAG_WEBMASTER:
00187 __MRSS_SET_STRING (data->webMaster);
00188 break;
00189
00190 case MRSS_FLAG_GENERATOR:
00191 __MRSS_SET_STRING (data->generator);
00192 break;
00193
00194 case MRSS_FLAG_TTL:
00195 __MRSS_SET_INTEGER (data->ttl);
00196 break;
00197
00198 case MRSS_FLAG_IMAGE_TITLE:
00199 __MRSS_SET_STRING (data->image_title);
00200 break;
00201
00202 case MRSS_FLAG_IMAGE_URL:
00203 __MRSS_SET_STRING (data->image_url);
00204 break;
00205
00206 case MRSS_FLAG_IMAGE_LINK:
00207 __MRSS_SET_STRING (data->image_link);
00208 break;
00209
00210 case MRSS_FLAG_IMAGE_WIDTH:
00211 __MRSS_SET_INTEGER (data->image_width);
00212 break;
00213
00214 case MRSS_FLAG_IMAGE_HEIGHT:
00215 __MRSS_SET_INTEGER (data->image_height);
00216 break;
00217
00218 case MRSS_FLAG_IMAGE_DESCRIPTION:
00219 __MRSS_SET_STRING (data->image_description);
00220 break;
00221
00222 case MRSS_FLAG_TEXTINPUT_TITLE:
00223 __MRSS_SET_STRING (data->textinput_title);
00224 break;
00225
00226 case MRSS_FLAG_TEXTINPUT_DESCRIPTION:
00227 __MRSS_SET_STRING (data->textinput_description);
00228 break;
00229
00230 case MRSS_FLAG_TEXTINPUT_NAME:
00231 __MRSS_SET_STRING (data->textinput_name);
00232 break;
00233
00234 case MRSS_FLAG_TEXTINPUT_LINK:
00235 __MRSS_SET_STRING (data->textinput_link);
00236 break;
00237
00238 case MRSS_FLAG_CLOUD:
00239 __MRSS_SET_STRING (data->cloud);
00240 break;
00241
00242 case MRSS_FLAG_CLOUD_DOMAIN:
00243 __MRSS_SET_STRING (data->cloud_domain);
00244 break;
00245
00246 case MRSS_FLAG_CLOUD_PORT:
00247 __MRSS_SET_INTEGER (data->cloud_port);
00248 break;
00249
00250 case MRSS_FLAG_CLOUD_PATH:
00251 __MRSS_SET_STRING (data->cloud_path);
00252 break;
00253
00254 case MRSS_FLAG_CLOUD_REGISTERPROCEDURE:
00255 __MRSS_SET_STRING (data->cloud_registerProcedure);
00256 break;
00257
00258 case MRSS_FLAG_CLOUD_PROTOCOL:
00259 __MRSS_SET_STRING (data->cloud_protocol);
00260 break;
00261
00262 default:
00263 return MRSS_ERR_DATA;
00264 }
00265 }
00266
00267 return MRSS_OK;
00268 }
00269
00270 static mrss_error_t
00271 __mrss_set_hour (mrss_hour_t * data, va_list va)
00272 {
00273 mrss_flag_t flag;
00274 void *value;
00275
00276 while ((flag = va_arg (va, mrss_flag_t)))
00277 {
00278 value = va_arg (va, void *);
00279
00280 switch (flag)
00281 {
00282 case MRSS_FLAG_HOUR:
00283 __MRSS_SET_STRING (data->hour);
00284 break;
00285
00286 default:
00287 return MRSS_ERR_DATA;
00288 }
00289 }
00290
00291 return MRSS_OK;
00292 }
00293
00294 static mrss_error_t
00295 __mrss_set_day (mrss_day_t * data, va_list va)
00296 {
00297 mrss_flag_t flag;
00298 void *value;
00299
00300 while ((flag = va_arg (va, mrss_flag_t)))
00301 {
00302 value = va_arg (va, void *);
00303
00304 switch (flag)
00305 {
00306 case MRSS_FLAG_DAY:
00307 __MRSS_SET_STRING (data->day);
00308 break;
00309
00310 default:
00311 return MRSS_ERR_DATA;
00312 }
00313 }
00314
00315 return MRSS_OK;
00316 }
00317
00318 static mrss_error_t
00319 __mrss_set_category (mrss_category_t * data, va_list va)
00320 {
00321 mrss_flag_t flag;
00322 void *value;
00323
00324 while ((flag = va_arg (va, mrss_flag_t)))
00325 {
00326 value = va_arg (va, void *);
00327
00328 switch (flag)
00329 {
00330 case MRSS_FLAG_CATEGORY:
00331 __MRSS_SET_STRING (data->category);
00332 break;
00333
00334 case MRSS_FLAG_CATEGORY_DOMAIN:
00335 __MRSS_SET_STRING (data->domain);
00336 break;
00337
00338 default:
00339 return MRSS_ERR_DATA;
00340 }
00341 }
00342
00343 return MRSS_OK;
00344 }
00345
00346 static mrss_error_t
00347 __mrss_set_item (mrss_item_t * data, va_list va)
00348 {
00349 mrss_flag_t flag;
00350 void *value;
00351
00352 while ((flag = va_arg (va, mrss_flag_t)))
00353 {
00354 value = va_arg (va, void *);
00355
00356 switch (flag)
00357 {
00358 case MRSS_FLAG_ITEM_TITLE:
00359 __MRSS_SET_STRING (data->title);
00360 break;
00361
00362 case MRSS_FLAG_ITEM_LINK:
00363 __MRSS_SET_STRING (data->link);
00364 break;
00365
00366 case MRSS_FLAG_ITEM_DESCRIPTION:
00367 __MRSS_SET_STRING (data->description);
00368 break;
00369
00370 case MRSS_FLAG_ITEM_AUTHOR:
00371 __MRSS_SET_STRING (data->author);
00372 break;
00373
00374 case MRSS_FLAG_ITEM_COMMENTS:
00375 __MRSS_SET_STRING (data->comments);
00376 break;
00377
00378 case MRSS_FLAG_ITEM_PUBDATE:
00379 __MRSS_SET_STRING (data->pubDate);
00380 break;
00381
00382 case MRSS_FLAG_ITEM_GUID:
00383 __MRSS_SET_STRING (data->guid);
00384 break;
00385
00386 case MRSS_FLAG_ITEM_GUID_ISPERMALINK:
00387 __MRSS_SET_INTEGER (data->guid_isPermaLink);
00388 break;
00389
00390 case MRSS_FLAG_ITEM_SOURCE:
00391 __MRSS_SET_STRING (data->source);
00392 break;
00393
00394 case MRSS_FLAG_ITEM_SOURCE_URL:
00395 __MRSS_SET_STRING (data->source_url);
00396 break;
00397
00398 case MRSS_FLAG_ITEM_ENCLOSURE:
00399 __MRSS_SET_STRING (data->enclosure);
00400 break;
00401
00402 case MRSS_FLAG_ITEM_ENCLOSURE_URL:
00403 __MRSS_SET_STRING (data->enclosure_url);
00404 break;
00405
00406 case MRSS_FLAG_ITEM_ENCLOSURE_LENGTH:
00407 __MRSS_SET_INTEGER (data->enclosure_length);
00408 break;
00409
00410 case MRSS_FLAG_ITEM_ENCLOSURE_TYPE:
00411 __MRSS_SET_STRING (data->enclosure_type);
00412 break;
00413
00414 default:
00415 return MRSS_ERR_DATA;
00416 }
00417 }
00418
00419 return MRSS_OK;
00420 }
00421
00422 mrss_error_t
00423 mrss_get (mrss_generic_t data, ...)
00424 {
00425 va_list va;
00426 mrss_error_t err;
00427 mrss_t *tmp;
00428
00429 if (!data)
00430 return MRSS_ERR_DATA;
00431
00432 va_start (va, data);
00433
00434 tmp = (mrss_t *) data;
00435 switch (tmp->element)
00436 {
00437 case MRSS_ELEMENT_CHANNEL:
00438 err = __mrss_get_channel ((mrss_t *) data, va);
00439 break;
00440
00441 case MRSS_ELEMENT_ITEM:
00442 err = __mrss_get_item ((mrss_item_t *) data, va);
00443 break;
00444
00445 case MRSS_ELEMENT_SKIPHOURS:
00446 err = __mrss_get_hour ((mrss_hour_t *) data, va);
00447 break;
00448
00449 case MRSS_ELEMENT_SKIPDAYS:
00450 err = __mrss_get_day ((mrss_day_t *) data, va);
00451 break;
00452
00453 case MRSS_ELEMENT_CATEGORY:
00454 err = __mrss_get_category ((mrss_category_t *) data, va);
00455 break;
00456
00457 default:
00458 err = MRSS_ERR_DATA;
00459 break;
00460 }
00461
00462 va_end (va);
00463 return err;
00464 }
00465
00466 static mrss_error_t
00467 __mrss_get_channel (mrss_t * data, va_list va)
00468 {
00469 mrss_flag_t flag;
00470 void *value;
00471 int *integer;
00472 mrss_version_t *version;
00473 char **string;
00474
00475 while ((flag = va_arg (va, mrss_flag_t)))
00476 {
00477 value = va_arg (va, void *);
00478
00479 switch (flag)
00480 {
00481 case MRSS_FLAG_VERSION:
00482 version = value;
00483 *version = data->version;
00484 break;
00485
00486 case MRSS_FLAG_TITLE:
00487 __MRSS_GET_STRING (data->title);
00488 break;
00489
00490 case MRSS_FLAG_DESCRIPTION:
00491 __MRSS_GET_STRING (data->description);
00492 break;
00493
00494 case MRSS_FLAG_LINK:
00495 __MRSS_GET_STRING (data->link);
00496 break;
00497
00498 case MRSS_FLAG_LANGUAGE:
00499 __MRSS_GET_STRING (data->language);
00500 break;
00501
00502 case MRSS_FLAG_RATING:
00503 __MRSS_GET_STRING (data->rating);
00504 break;
00505
00506 case MRSS_FLAG_COPYRIGHT:
00507 __MRSS_GET_STRING (data->copyright);
00508 break;
00509
00510 case MRSS_FLAG_PUBDATE:
00511 __MRSS_GET_STRING (data->pubDate);
00512 break;
00513
00514 case MRSS_FLAG_LASTBUILDDATE:
00515 __MRSS_GET_STRING (data->lastBuildDate);
00516 break;
00517
00518 case MRSS_FLAG_DOCS:
00519 __MRSS_GET_STRING (data->docs);
00520 break;
00521
00522 case MRSS_FLAG_MANAGINGEDITOR:
00523 __MRSS_GET_STRING (data->managingeditor);
00524 break;
00525
00526 case MRSS_FLAG_WEBMASTER:
00527 __MRSS_GET_STRING (data->webMaster);
00528 break;
00529
00530 case MRSS_FLAG_GENERATOR:
00531 __MRSS_GET_STRING (data->generator);
00532 break;
00533
00534 case MRSS_FLAG_TTL:
00535 __MRSS_GET_INTEGER (data->ttl);
00536 break;
00537
00538 case MRSS_FLAG_IMAGE_TITLE:
00539 __MRSS_GET_STRING (data->image_title);
00540 break;
00541
00542 case MRSS_FLAG_IMAGE_URL:
00543 __MRSS_GET_STRING (data->image_url);
00544 break;
00545
00546 case MRSS_FLAG_IMAGE_LINK:
00547 __MRSS_GET_STRING (data->image_link);
00548 break;
00549
00550 case MRSS_FLAG_IMAGE_WIDTH:
00551 __MRSS_GET_INTEGER (data->image_width);
00552 break;
00553
00554 case MRSS_FLAG_IMAGE_HEIGHT:
00555 __MRSS_GET_INTEGER (data->image_height);
00556 break;
00557
00558 case MRSS_FLAG_IMAGE_DESCRIPTION:
00559 __MRSS_GET_STRING (data->image_description);
00560 break;
00561
00562 case MRSS_FLAG_TEXTINPUT_TITLE:
00563 __MRSS_GET_STRING (data->textinput_title);
00564 break;
00565
00566 case MRSS_FLAG_TEXTINPUT_DESCRIPTION:
00567 __MRSS_GET_STRING (data->textinput_description);
00568 break;
00569
00570 case MRSS_FLAG_TEXTINPUT_NAME:
00571 __MRSS_GET_STRING (data->textinput_name);
00572 break;
00573
00574 case MRSS_FLAG_TEXTINPUT_LINK:
00575 __MRSS_GET_STRING (data->textinput_link);
00576 break;
00577
00578 case MRSS_FLAG_CLOUD:
00579 __MRSS_GET_STRING (data->cloud);
00580 break;
00581
00582 case MRSS_FLAG_CLOUD_DOMAIN:
00583 __MRSS_GET_STRING (data->cloud_domain);
00584 break;
00585
00586 case MRSS_FLAG_CLOUD_PORT:
00587 __MRSS_GET_INTEGER (data->cloud_port);
00588 break;
00589
00590 case MRSS_FLAG_CLOUD_PATH:
00591 __MRSS_GET_STRING (data->cloud_path);
00592 break;
00593
00594 case MRSS_FLAG_CLOUD_REGISTERPROCEDURE:
00595 __MRSS_GET_STRING (data->cloud_registerProcedure);
00596 break;
00597
00598 case MRSS_FLAG_CLOUD_PROTOCOL:
00599 __MRSS_GET_STRING (data->cloud_protocol);
00600 break;
00601
00602 default:
00603 return MRSS_ERR_DATA;
00604 }
00605 }
00606
00607 return MRSS_OK;
00608 }
00609
00610 static mrss_error_t
00611 __mrss_get_hour (mrss_hour_t * data, va_list va)
00612 {
00613 mrss_flag_t flag;
00614 void *value;
00615 char **string;
00616
00617 while ((flag = va_arg (va, mrss_flag_t)))
00618 {
00619 value = va_arg (va, void *);
00620
00621 switch (flag)
00622 {
00623 case MRSS_FLAG_HOUR:
00624 __MRSS_GET_STRING (data->hour);
00625 break;
00626
00627 default:
00628 return MRSS_ERR_DATA;
00629 }
00630 }
00631
00632 return MRSS_OK;
00633 }
00634
00635 static mrss_error_t
00636 __mrss_get_day (mrss_day_t * data, va_list va)
00637 {
00638 mrss_flag_t flag;
00639 void *value;
00640 char **string;
00641
00642 while ((flag = va_arg (va, mrss_flag_t)))
00643 {
00644 value = va_arg (va, void *);
00645
00646 switch (flag)
00647 {
00648 case MRSS_FLAG_DAY:
00649 __MRSS_GET_STRING (data->day);
00650 break;
00651
00652 default:
00653 return MRSS_ERR_DATA;
00654 }
00655 }
00656
00657 return MRSS_OK;
00658 }
00659
00660 static mrss_error_t
00661 __mrss_get_category (mrss_category_t * data, va_list va)
00662 {
00663 mrss_flag_t flag;
00664 void *value;
00665 char **string;
00666
00667 while ((flag = va_arg (va, mrss_flag_t)))
00668 {
00669 value = va_arg (va, void *);
00670
00671 switch (flag)
00672 {
00673 case MRSS_FLAG_CATEGORY:
00674 __MRSS_GET_STRING (data->category);
00675 break;
00676
00677 case MRSS_FLAG_CATEGORY_DOMAIN:
00678 __MRSS_GET_STRING (data->domain);
00679 break;
00680
00681 default:
00682 return MRSS_ERR_DATA;
00683 }
00684 }
00685
00686 return MRSS_OK;
00687 }
00688
00689 static mrss_error_t
00690 __mrss_get_item (mrss_item_t * data, va_list va)
00691 {
00692 mrss_flag_t flag;
00693 void *value;
00694 char **string;
00695 int *integer;
00696
00697 while ((flag = va_arg (va, mrss_flag_t)))
00698 {
00699 value = va_arg (va, void *);
00700
00701 switch (flag)
00702 {
00703 case MRSS_FLAG_ITEM_TITLE:
00704 __MRSS_GET_STRING (data->title);
00705 break;
00706
00707 case MRSS_FLAG_ITEM_LINK:
00708 __MRSS_GET_STRING (data->link);
00709 break;
00710
00711 case MRSS_FLAG_ITEM_DESCRIPTION:
00712 __MRSS_GET_STRING (data->description);
00713 break;
00714
00715 case MRSS_FLAG_ITEM_AUTHOR:
00716 __MRSS_GET_STRING (data->author);
00717 break;
00718
00719 case MRSS_FLAG_ITEM_COMMENTS:
00720 __MRSS_GET_STRING (data->comments);
00721 break;
00722
00723 case MRSS_FLAG_ITEM_PUBDATE:
00724 __MRSS_GET_STRING (data->pubDate);
00725 break;
00726
00727 case MRSS_FLAG_ITEM_GUID:
00728 __MRSS_GET_STRING (data->guid);
00729 break;
00730
00731 case MRSS_FLAG_ITEM_GUID_ISPERMALINK:
00732 __MRSS_GET_INTEGER (data->guid_isPermaLink);
00733 break;
00734
00735 case MRSS_FLAG_ITEM_SOURCE:
00736 __MRSS_GET_STRING (data->source);
00737 break;
00738
00739 case MRSS_FLAG_ITEM_SOURCE_URL:
00740 __MRSS_GET_STRING (data->source_url);
00741 break;
00742
00743 case MRSS_FLAG_ITEM_ENCLOSURE:
00744 __MRSS_GET_STRING (data->enclosure);
00745 break;
00746
00747 case MRSS_FLAG_ITEM_ENCLOSURE_URL:
00748 __MRSS_GET_STRING (data->enclosure_url);
00749 break;
00750
00751 case MRSS_FLAG_ITEM_ENCLOSURE_LENGTH:
00752 __MRSS_GET_INTEGER (data->enclosure_length);
00753 break;
00754
00755 case MRSS_FLAG_ITEM_ENCLOSURE_TYPE:
00756 __MRSS_GET_STRING (data->enclosure_type);
00757 break;
00758
00759 default:
00760 return MRSS_ERR_DATA;
00761 }
00762 }
00763
00764 return MRSS_OK;
00765 }
00766
00767 mrss_error_t
00768 mrss_new_subdata (mrss_generic_t data, mrss_element_t element,
00769 mrss_generic_t new)
00770 {
00771 mrss_t *tmp;
00772
00773 if (!data || !new)
00774 return MRSS_ERR_DATA;
00775
00776 tmp = (mrss_t *) data;
00777
00778 switch (tmp->element)
00779 {
00780 case MRSS_ELEMENT_CHANNEL:
00781 return __mrss_new_subdata_channel ((mrss_t *) data, element, new);
00782 case MRSS_ELEMENT_ITEM:
00783 return __mrss_new_subdata_item ((mrss_item_t *) data, element, new);
00784 default:
00785 return MRSS_ERR_DATA;
00786 }
00787 }
00788
00789 static mrss_error_t
00790 __mrss_new_subdata_channel (mrss_t * mrss, mrss_element_t element,
00791 mrss_generic_t data)
00792 {
00793 mrss_item_t **item;
00794 mrss_hour_t **hour;
00795 mrss_day_t **day;
00796 mrss_category_t **category;
00797
00798 switch (element)
00799 {
00800 case MRSS_ELEMENT_ITEM:
00801 item = (mrss_item_t **) data;
00802
00803 if (!*item && !(*item = (mrss_item_t *) malloc (sizeof (mrss_item_t))))
00804 return MRSS_ERR_POSIX;
00805
00806 memset (*item, 0, sizeof (mrss_item_t));
00807
00808 (*item)->element = MRSS_ELEMENT_ITEM;
00809 (*item)->next = mrss->item;
00810 mrss->item = (*item);
00811
00812 break;
00813
00814 case MRSS_ELEMENT_SKIPHOURS:
00815 hour = (mrss_hour_t **) data;
00816
00817 if (!*hour && !(*hour = (mrss_hour_t *) malloc (sizeof (mrss_hour_t))))
00818 return MRSS_ERR_POSIX;
00819
00820 memset (*hour, 0, sizeof (mrss_hour_t));
00821
00822 (*hour)->element = MRSS_ELEMENT_SKIPHOURS;
00823 (*hour)->next = mrss->skipHours;
00824 mrss->skipHours = (*hour);
00825
00826 break;
00827
00828 case MRSS_ELEMENT_SKIPDAYS:
00829 day = (mrss_day_t **) data;
00830
00831 if (!*day && !(*day = (mrss_day_t *) malloc (sizeof (mrss_day_t))))
00832 return MRSS_ERR_POSIX;
00833
00834 memset (*day, 0, sizeof (mrss_day_t));
00835
00836 (*day)->element = MRSS_ELEMENT_SKIPDAYS;
00837 (*day)->next = mrss->skipDays;
00838 mrss->skipDays = (*day);
00839
00840 break;
00841
00842 case MRSS_ELEMENT_CATEGORY:
00843 category = (mrss_category_t **) data;
00844
00845 if (!*category
00846 && !(*category =
00847 (mrss_category_t *) malloc (sizeof (mrss_category_t))))
00848 return MRSS_ERR_POSIX;
00849
00850 memset (*category, 0, sizeof (mrss_category_t));
00851
00852 (*category)->element = MRSS_ELEMENT_CATEGORY;
00853 (*category)->next = mrss->category;
00854 mrss->category = (*category);
00855
00856 break;
00857
00858 default:
00859 return MRSS_ERR_DATA;
00860 }
00861
00862 return MRSS_OK;
00863 }
00864
00865 static mrss_error_t
00866 __mrss_new_subdata_item (mrss_item_t * item, mrss_element_t element,
00867 mrss_generic_t data)
00868 {
00869 mrss_category_t **category;
00870
00871 switch (element)
00872 {
00873 case MRSS_ELEMENT_CATEGORY:
00874 category = (mrss_category_t **) data;
00875
00876 if (!*category
00877 && !(*category =
00878 (mrss_category_t *) malloc (sizeof (mrss_category_t))))
00879 return MRSS_ERR_POSIX;
00880
00881 memset (*category, 0, sizeof (mrss_category_t));
00882
00883 (*category)->element = MRSS_ELEMENT_CATEGORY;
00884 (*category)->next = item->category;
00885 item->category = (*category);
00886
00887 break;
00888
00889 default:
00890 return MRSS_ERR_DATA;
00891 }
00892
00893 return MRSS_OK;
00894 }
00895
00896 mrss_error_t
00897 mrss_remove_subdata (mrss_generic_t data, mrss_generic_t subdata)
00898 {
00899 mrss_t *tmp;
00900
00901 if (!data || !subdata)
00902 return MRSS_ERR_DATA;
00903
00904 tmp = (mrss_t *) data;
00905
00906 switch (tmp->element)
00907 {
00908 case MRSS_ELEMENT_CHANNEL:
00909 return __mrss_remove_subdata_channel ((mrss_t *) data, subdata);
00910 case MRSS_ELEMENT_ITEM:
00911 return __mrss_remove_subdata_item ((mrss_item_t *) data, subdata);
00912 default:
00913 return MRSS_ERR_DATA;
00914 }
00915 }
00916
00917 static mrss_error_t
00918 __mrss_remove_subdata_channel (mrss_t * data, mrss_generic_t subdata)
00919 {
00920 mrss_hour_t *hour, *hour_tmp, *hour_old;
00921 mrss_day_t *day, *day_tmp, *day_old;
00922 mrss_category_t *category, *category_tmp, *category_old;
00923 mrss_item_t *item, *item_tmp, *item_old;
00924
00925 int found = 0;
00926
00927 mrss_t *tmp = (mrss_t *) subdata;
00928
00929 switch (tmp->element)
00930 {
00931 case MRSS_ELEMENT_ITEM:
00932 item = (mrss_item_t *) subdata;
00933
00934 item_tmp = data->item;
00935 item_old = NULL;
00936
00937 while (item_tmp)
00938 {
00939 if (item_tmp == item)
00940 {
00941 found++;
00942
00943 if (item_old)
00944 item_old->next = item_tmp->next;
00945 else
00946 data->item = item_tmp->next;
00947
00948 break;
00949 }
00950
00951 item_old = item_tmp;
00952 item_tmp = item_tmp->next;
00953 }
00954
00955 if (!found)
00956 return MRSS_ERR_DATA;
00957
00958 break;
00959
00960 case MRSS_ELEMENT_SKIPHOURS:
00961 hour = (mrss_hour_t *) subdata;
00962
00963 hour_tmp = data->skipHours;
00964 hour_old = NULL;
00965
00966 while (hour_tmp)
00967 {
00968 if (hour_tmp == hour)
00969 {
00970 found++;
00971
00972 if (hour_old)
00973 hour_old->next = hour_tmp->next;
00974 else
00975 data->skipHours = hour_tmp->next;
00976
00977 break;
00978 }
00979
00980 hour_old = hour_tmp;
00981 hour_tmp = hour_tmp->next;
00982 }
00983
00984 if (!found)
00985 return MRSS_ERR_DATA;
00986
00987 break;
00988
00989 case MRSS_ELEMENT_SKIPDAYS:
00990 day = (mrss_day_t *) subdata;
00991
00992 day_tmp = data->skipDays;
00993 day_old = NULL;
00994
00995 while (day_tmp)
00996 {
00997 if (day_tmp == day)
00998 {
00999 found++;
01000
01001 if (day_old)
01002 day_old->next = day_tmp->next;
01003 else
01004 data->skipDays = day_tmp->next;
01005
01006 break;
01007 }
01008
01009 day_old = day_tmp;
01010 day_tmp = day_tmp->next;
01011 }
01012
01013 if (!found)
01014 return MRSS_ERR_DATA;
01015
01016 break;
01017
01018 case MRSS_ELEMENT_CATEGORY:
01019 category = (mrss_category_t *) subdata;
01020
01021 category_tmp = data->category;
01022 category_old = NULL;
01023
01024 while (category_tmp)
01025 {
01026 if (category_tmp == category)
01027 {
01028 found++;
01029
01030 if (category_old)
01031 category_old->next = category_tmp->next;
01032 else
01033 data->category = category_tmp->next;
01034
01035 break;
01036 }
01037
01038 category_old = category_tmp;
01039 category_tmp = category_tmp->next;
01040 }
01041
01042 if (!found)
01043 return MRSS_ERR_DATA;
01044
01045 break;
01046
01047 default:
01048 return MRSS_ERR_DATA;
01049 }
01050
01051 return MRSS_OK;
01052 }
01053
01054 static mrss_error_t
01055 __mrss_remove_subdata_item (mrss_item_t * data, mrss_generic_t subdata)
01056 {
01057 mrss_category_t *category, *category_tmp, *category_old;
01058
01059 int found = 0;
01060
01061 mrss_t *tmp = (mrss_t *) subdata;
01062
01063 switch (tmp->element)
01064 {
01065 case MRSS_ELEMENT_CATEGORY:
01066 category = (mrss_category_t *) subdata;
01067
01068 category_tmp = data->category;
01069 category_old = NULL;
01070
01071 while (category_tmp)
01072 {
01073 if (category_tmp == category)
01074 {
01075 found++;
01076
01077 if (category_old)
01078 category_old->next = category_tmp->next;
01079 else
01080 data->category = category_tmp->next;
01081
01082 break;
01083 }
01084
01085 category_old = category_tmp;
01086 category_tmp = category_tmp->next;
01087 }
01088
01089 if (!found)
01090 return MRSS_ERR_DATA;
01091
01092 break;
01093
01094 default:
01095 return MRSS_ERR_DATA;
01096 }
01097
01098 return MRSS_OK;
01099 }
01100
01101