Mercurial > pidgin
comparison libgaim/xmlnode.c @ 15350:682908b965cf
[gaim-migrate @ 18143]
A really great raw XMPP plugin.
committer: Tailor Script <tailor@pidgin.im>
| author | Sean Egan <seanegan@gmail.com> |
|---|---|
| date | Wed, 17 Jan 2007 08:58:26 +0000 |
| parents | c65def04fb44 |
| children |
comparison
equal
deleted
inserted
replaced
| 15349:635cc5247696 | 15350:682908b965cf |
|---|---|
| 439 return xml_with_declaration; | 439 return xml_with_declaration; |
| 440 } | 440 } |
| 441 | 441 |
| 442 struct _xmlnode_parser_data { | 442 struct _xmlnode_parser_data { |
| 443 xmlnode *current; | 443 xmlnode *current; |
| 444 gboolean error; | |
| 444 }; | 445 }; |
| 445 | 446 |
| 446 static void | 447 static void |
| 447 xmlnode_parser_element_start_libxml(void *user_data, | 448 xmlnode_parser_element_start_libxml(void *user_data, |
| 448 const xmlChar *element_name, const xmlChar *prefix, const xmlChar *xmlns, | 449 const xmlChar *element_name, const xmlChar *prefix, const xmlChar *xmlns, |
| 451 { | 452 { |
| 452 struct _xmlnode_parser_data *xpd = user_data; | 453 struct _xmlnode_parser_data *xpd = user_data; |
| 453 xmlnode *node; | 454 xmlnode *node; |
| 454 int i; | 455 int i; |
| 455 | 456 |
| 456 if(!element_name) { | 457 if(!element_name || xpd->error) { |
| 457 return; | 458 return; |
| 458 } else { | 459 } else { |
| 459 if(xpd->current) | 460 if(xpd->current) |
| 460 node = xmlnode_new_child(xpd->current, (const char*) element_name); | 461 node = xmlnode_new_child(xpd->current, (const char*) element_name); |
| 461 else | 462 else |
| 484 xmlnode_parser_element_end_libxml(void *user_data, const xmlChar *element_name, | 485 xmlnode_parser_element_end_libxml(void *user_data, const xmlChar *element_name, |
| 485 const xmlChar *prefix, const xmlChar *xmlns) | 486 const xmlChar *prefix, const xmlChar *xmlns) |
| 486 { | 487 { |
| 487 struct _xmlnode_parser_data *xpd = user_data; | 488 struct _xmlnode_parser_data *xpd = user_data; |
| 488 | 489 |
| 489 if(!element_name || !xpd->current) | 490 if(!element_name || !xpd->current || xpd->error) |
| 490 return; | 491 return; |
| 491 | 492 |
| 492 if(xpd->current->parent) { | 493 if(xpd->current->parent) { |
| 493 if(!xmlStrcmp((xmlChar*) xpd->current->name, element_name)) | 494 if(!xmlStrcmp((xmlChar*) xpd->current->name, element_name)) |
| 494 xpd->current = xpd->current->parent; | 495 xpd->current = xpd->current->parent; |
| 498 static void | 499 static void |
| 499 xmlnode_parser_element_text_libxml(void *user_data, const xmlChar *text, int text_len) | 500 xmlnode_parser_element_text_libxml(void *user_data, const xmlChar *text, int text_len) |
| 500 { | 501 { |
| 501 struct _xmlnode_parser_data *xpd = user_data; | 502 struct _xmlnode_parser_data *xpd = user_data; |
| 502 | 503 |
| 503 if(!xpd->current) | 504 if(!xpd->current || xpd->error) |
| 504 return; | 505 return; |
| 505 | 506 |
| 506 if(!text || !text_len) | 507 if(!text || !text_len) |
| 507 return; | 508 return; |
| 508 | 509 |
| 509 xmlnode_insert_data(xpd->current, (const char*) text, text_len); | 510 xmlnode_insert_data(xpd->current, (const char*) text, text_len); |
| 511 } | |
| 512 | |
| 513 static void | |
| 514 xmlnode_parser_error_libxml(void *user_data, const char *msg, ...) | |
| 515 { | |
| 516 struct _xmlnode_parser_data *xpd = user_data; | |
| 517 xpd->error = TRUE; | |
| 510 } | 518 } |
| 511 | 519 |
| 512 static xmlSAXHandler xmlnode_parser_libxml = { | 520 static xmlSAXHandler xmlnode_parser_libxml = { |
| 513 .internalSubset = NULL, | 521 .internalSubset = NULL, |
| 514 .isStandalone = NULL, | 522 .isStandalone = NULL, |
| 530 .characters = xmlnode_parser_element_text_libxml, | 538 .characters = xmlnode_parser_element_text_libxml, |
| 531 .ignorableWhitespace = NULL, | 539 .ignorableWhitespace = NULL, |
| 532 .processingInstruction = NULL, | 540 .processingInstruction = NULL, |
| 533 .comment = NULL, | 541 .comment = NULL, |
| 534 .warning = NULL, | 542 .warning = NULL, |
| 535 .error = NULL, | 543 .error = xmlnode_parser_error_libxml, |
| 536 .fatalError = NULL, | 544 .fatalError = NULL, |
| 537 .getParameterEntity = NULL, | 545 .getParameterEntity = NULL, |
| 538 .cdataBlock = NULL, | 546 .cdataBlock = NULL, |
| 539 .externalSubset = NULL, | 547 .externalSubset = NULL, |
| 540 .initialized = XML_SAX2_MAGIC, | 548 .initialized = XML_SAX2_MAGIC, |
| 562 if(xpd->current) | 570 if(xpd->current) |
| 563 xmlnode_free(xpd->current); | 571 xmlnode_free(xpd->current); |
| 564 xpd->current = NULL; | 572 xpd->current = NULL; |
| 565 } | 573 } |
| 566 ret = xpd->current; | 574 ret = xpd->current; |
| 575 if (xpd->error) { | |
| 576 ret = NULL; | |
| 577 if (xpd->current) | |
| 578 xmlnode_free(xpd->current); | |
| 579 } | |
| 580 | |
| 567 g_free(xpd); | 581 g_free(xpd); |
| 568 return ret; | 582 return ret; |
| 569 } | 583 } |
| 570 | 584 |
| 571 xmlnode * | 585 xmlnode * |
