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 *