| 376 return TRUE; |
378 return TRUE; |
| 377 } |
379 } |
| 378 #endif |
380 #endif |
| 379 |
381 |
| 380 void * |
382 void * |
| 381 purple_perl_data_from_sv(PurpleValue *value, SV *sv) |
383 purple_perl_data_from_sv(GType type, SV *sv) |
| 382 { |
384 { |
| 383 |
385 switch (type) { |
| 384 switch (purple_value_get_type(value)) { |
386 case G_TYPE_BOOLEAN: return (void *)SvIV(sv); |
| 385 case PURPLE_TYPE_BOOLEAN: return (void *)SvIV(sv); |
387 case G_TYPE_INT: return (void *)SvIV(sv); |
| 386 case PURPLE_TYPE_INT: return (void *)SvIV(sv); |
388 case G_TYPE_UINT: return (void *)SvUV(sv); |
| 387 case PURPLE_TYPE_UINT: return (void *)SvUV(sv); |
389 case G_TYPE_LONG: return (void *)SvIV(sv); |
| 388 case PURPLE_TYPE_LONG: return (void *)SvIV(sv); |
390 case G_TYPE_ULONG: return (void *)SvUV(sv); |
| 389 case PURPLE_TYPE_ULONG: return (void *)SvUV(sv); |
391 case G_TYPE_INT64: return (void *)SvIV(sv); |
| 390 case PURPLE_TYPE_INT64: return (void *)SvIV(sv); |
392 case G_TYPE_UINT64: return (void *)SvUV(sv); |
| 391 case PURPLE_TYPE_UINT64: return (void *)SvUV(sv); |
393 case G_TYPE_STRING: return g_strdup(SvPVutf8_nolen(sv)); |
| 392 case PURPLE_TYPE_STRING: return g_strdup(SvPVutf8_nolen(sv)); |
394 case G_TYPE_POINTER: return (void *)SvIV(sv); |
| 393 case PURPLE_TYPE_POINTER: return (void *)SvIV(sv); |
395 case G_TYPE_BOXED: return (void *)SvIV(sv); |
| 394 case PURPLE_TYPE_BOXED: return (void *)SvIV(sv); |
|
| 395 |
|
| 396 default: |
|
| 397 return NULL; |
|
| 398 } |
396 } |
| 399 |
397 |
| 400 return NULL; |
398 return NULL; |
| 401 } |
399 } |
| 402 |
400 |
| 403 static SV * |
401 static SV * |
| 404 purple_perl_sv_from_subtype(const PurpleValue *value, void *arg) |
402 purple_perl_sv_from_purple_type(GType type, void *arg) |
| 405 { |
403 { |
| 406 const char *stash = "Purple"; /* ? */ |
404 const char *stash = "Purple"; /* ? */ |
| 407 |
405 |
| 408 switch (purple_value_get_subtype(value)) { |
406 if (type == PURPLE_TYPE_ACCOUNT) |
| 409 case PURPLE_SUBTYPE_ACCOUNT: |
407 stash = "Purple::Account"; |
| 410 stash = "Purple::Account"; |
408 else if (type == PURPLE_TYPE_BUDDY_LIST) |
| 411 break; |
409 stash = "Purple::BuddyList"; |
| 412 case PURPLE_SUBTYPE_BLIST: |
410 else if (type == PURPLE_TYPE_BUDDY) |
| 413 stash = "Purple::BuddyList"; |
411 stash = "Purple::BuddyList::Buddy"; |
| 414 break; |
412 else if (type == PURPLE_TYPE_GROUP) |
| 415 case PURPLE_SUBTYPE_BLIST_BUDDY: |
413 stash = "Purple::BuddyList::Group"; |
| 416 stash = "Purple::BuddyList::Buddy"; |
414 else if (type == PURPLE_TYPE_CHAT) |
| 417 break; |
415 stash = "Purple::BuddyList::Chat"; |
| 418 case PURPLE_SUBTYPE_BLIST_GROUP: |
416 else if (type == PURPLE_TYPE_BUDDY_ICON) |
| 419 stash = "Purple::BuddyList::Group"; |
417 stash = "Purple::Buddy::Icon"; |
| 420 break; |
418 else if (type == PURPLE_TYPE_CONNECTION) |
| 421 case PURPLE_SUBTYPE_BLIST_CHAT: |
419 stash = "Purple::Connection"; |
| 422 stash = "Purple::BuddyList::Chat"; |
420 else if (type == PURPLE_TYPE_CONVERSATION) |
| 423 break; |
421 stash = "Purple::Conversation"; |
| 424 case PURPLE_SUBTYPE_BUDDY_ICON: |
422 else if (type == PURPLE_TYPE_PLUGIN) |
| 425 stash = "Purple::Buddy::Icon"; |
423 stash = "Purple::Plugin"; |
| 426 break; |
424 else if (type == PURPLE_TYPE_BLIST_NODE) |
| 427 case PURPLE_SUBTYPE_CONNECTION: |
425 stash = "Purple::BuddyList::Node"; |
| 428 stash = "Purple::Connection"; |
426 else if (type == PURPLE_TYPE_CIPHER) |
| 429 break; |
427 stash = "Purple::Cipher"; |
| 430 case PURPLE_SUBTYPE_CONVERSATION: |
428 else if (type == PURPLE_TYPE_STATUS) |
| 431 stash = "Purple::Conversation"; |
429 stash = "Purple::Status"; |
| 432 break; |
430 else if (type == PURPLE_TYPE_SAVEDSTATUS) |
| 433 case PURPLE_SUBTYPE_PLUGIN: |
431 stash = "Purple::SavedStatus"; |
| 434 stash = "Purple::Plugin"; |
432 else if (type == PURPLE_TYPE_LOG) |
| 435 break; |
433 stash = "Purple::Log"; |
| 436 case PURPLE_SUBTYPE_BLIST_NODE: |
434 else if (type == PURPLE_TYPE_XFER) |
| 437 stash = "Purple::BuddyList::Node"; |
435 stash = "Purple::Xfer"; |
| 438 break; |
436 else if (type == PURPLE_TYPE_XMLNODE) |
| 439 case PURPLE_SUBTYPE_CIPHER: |
437 stash = "Purple::XMLNode"; |
| 440 stash = "Purple::Cipher"; |
438 else if (type == PURPLE_TYPE_NOTIFY_USER_INFO) |
| 441 break; |
439 stash = "Purple::NotifyUserInfo"; |
| 442 case PURPLE_SUBTYPE_STATUS: |
440 else if (type == PURPLE_TYPE_STORED_IMAGE) |
| 443 stash = "Purple::Status"; |
441 stash = "Purple::StoredImage"; |
| 444 break; |
442 else if (type == PURPLE_TYPE_CERTIFICATE_POOL) |
| 445 case PURPLE_SUBTYPE_SAVEDSTATUS: |
443 stash = "Purple::Certificate::Pool"; |
| 446 stash = "Purple::SavedStatus"; |
444 else |
| 447 break; |
445 stash = "Purple::Unknown"; |
| 448 case PURPLE_SUBTYPE_LOG: |
|
| 449 stash = "Purple::Log"; |
|
| 450 break; |
|
| 451 case PURPLE_SUBTYPE_XFER: |
|
| 452 stash = "Purple::Xfer"; |
|
| 453 break; |
|
| 454 case PURPLE_SUBTYPE_XMLNODE: |
|
| 455 stash = "Purple::XMLNode"; |
|
| 456 break; |
|
| 457 case PURPLE_SUBTYPE_USERINFO: |
|
| 458 stash = "Purple::NotifyUserInfo"; |
|
| 459 break; |
|
| 460 case PURPLE_SUBTYPE_STORED_IMAGE: |
|
| 461 stash = "Purple::StoredImage"; |
|
| 462 break; |
|
| 463 case PURPLE_SUBTYPE_CERTIFICATEPOOL: |
|
| 464 stash = "Purple::Certificate::Pool"; |
|
| 465 break; |
|
| 466 case PURPLE_SUBTYPE_UNKNOWN: |
|
| 467 stash = "Purple::Unknown"; |
|
| 468 break; |
|
| 469 } |
|
| 470 |
446 |
| 471 return sv_2mortal(purple_perl_bless_object(arg, stash)); |
447 return sv_2mortal(purple_perl_bless_object(arg, stash)); |
| 472 } |
448 } |
| 473 |
449 |
| 474 SV * |
450 SV * |
| 475 purple_perl_sv_from_vargs(const PurpleValue *value, va_list *args, void ***copy_arg) |
451 purple_perl_sv_from_vargs(GType type, va_list *args, void ***copy_arg) |
| 476 { |
452 { |
| |
453 #if 0 |
| 477 if (purple_value_is_outgoing(value)) { |
454 if (purple_value_is_outgoing(value)) { |
| 478 switch (purple_value_get_type(value)) { |
455 switch (purple_value_get_type(value)) { |
| 479 case PURPLE_TYPE_SUBTYPE: |
456 case PURPLE_TYPE_SUBTYPE: |
| 480 if ((*copy_arg = va_arg(*args, void **)) == NULL) |
457 if ((*copy_arg = va_arg(*args, void **)) == NULL) |
| 481 return &PL_sv_undef; |
458 return &PL_sv_undef; |
| 549 default: |
526 default: |
| 550 /* If this happens, things are going to get screwed up... */ |
527 /* If this happens, things are going to get screwed up... */ |
| 551 return NULL; |
528 return NULL; |
| 552 } |
529 } |
| 553 } else { |
530 } else { |
| 554 switch (purple_value_get_type(value)) { |
|
| 555 case PURPLE_TYPE_SUBTYPE: |
|
| 556 if ((*copy_arg = va_arg(*args, void *)) == NULL) |
|
| 557 return &PL_sv_undef; |
|
| 558 |
|
| 559 return purple_perl_sv_from_subtype(value, *copy_arg); |
|
| 560 |
|
| 561 case PURPLE_TYPE_BOOLEAN: |
|
| 562 *copy_arg = GINT_TO_POINTER( va_arg(*args, gboolean) ); |
|
| 563 |
|
| 564 return newSViv((gboolean)GPOINTER_TO_INT(*copy_arg)); |
|
| 565 |
|
| 566 case PURPLE_TYPE_INT: |
|
| 567 *copy_arg = GINT_TO_POINTER( va_arg(*args, int) ); |
|
| 568 |
|
| 569 return newSViv(GPOINTER_TO_INT(*copy_arg)); |
|
| 570 |
|
| 571 case PURPLE_TYPE_UINT: |
|
| 572 *copy_arg = GUINT_TO_POINTER(va_arg(*args, unsigned int)); |
|
| 573 |
|
| 574 return newSVuv(GPOINTER_TO_UINT(*copy_arg)); |
|
| 575 |
|
| 576 case PURPLE_TYPE_LONG: |
|
| 577 *copy_arg = (void *)va_arg(*args, long); |
|
| 578 |
|
| 579 return newSViv((long)*copy_arg); |
|
| 580 |
|
| 581 case PURPLE_TYPE_ULONG: |
|
| 582 *copy_arg = (void *)va_arg(*args, unsigned long); |
|
| 583 |
|
| 584 return newSVuv((unsigned long)*copy_arg); |
|
| 585 |
|
| 586 case PURPLE_TYPE_INT64: |
|
| 587 #if 0 |
|
| 588 /* XXX This yells and complains. */ |
|
| 589 *copy_arg = va_arg(*args, gint64); |
|
| 590 |
|
| 591 return newSViv(*copy_arg); |
|
| 592 #endif |
531 #endif |
| 593 break; |
532 switch (type) { |
| 594 |
533 case G_TYPE_BOOLEAN: |
| 595 case PURPLE_TYPE_UINT64: |
534 *copy_arg = GINT_TO_POINTER( va_arg(*args, gboolean) ); |
| 596 /* XXX This also yells and complains. */ |
535 |
| 597 #if 0 |
536 return newSViv((gboolean)GPOINTER_TO_INT(*copy_arg)); |
| 598 *copy_arg = (void *)va_arg(*args, guint64); |
537 |
| 599 |
538 case G_TYPE_INT: |
| 600 return newSVuv(*copy_arg); |
539 *copy_arg = GINT_TO_POINTER( va_arg(*args, int) ); |
| 601 #endif |
540 |
| 602 break; |
541 return newSViv(GPOINTER_TO_INT(*copy_arg)); |
| 603 |
542 |
| 604 case PURPLE_TYPE_STRING: |
543 case G_TYPE_UINT: |
| 605 if ((*copy_arg = (void *)va_arg(*args, char *)) == NULL) |
544 *copy_arg = GUINT_TO_POINTER(va_arg(*args, unsigned int)); |
| 606 return &PL_sv_undef; |
545 |
| 607 |
546 return newSVuv(GPOINTER_TO_UINT(*copy_arg)); |
| 608 return newSVGChar((char *)*copy_arg); |
547 |
| 609 |
548 case G_TYPE_LONG: |
| 610 case PURPLE_TYPE_POINTER: |
549 *copy_arg = (void *)va_arg(*args, long); |
| 611 if ((*copy_arg = (void *)va_arg(*args, void *)) == NULL) |
550 |
| 612 return &PL_sv_undef; |
551 return newSViv((long)*copy_arg); |
| 613 |
552 |
| 614 return newSViv((IV)*copy_arg); |
553 case G_TYPE_ULONG: |
| 615 |
554 *copy_arg = (void *)va_arg(*args, unsigned long); |
| 616 case PURPLE_TYPE_BOXED: |
555 |
| 617 /* Uh.. I dunno. Try this? */ |
556 return newSVuv((unsigned long)*copy_arg); |
| 618 if ((*copy_arg = (void *)va_arg(*args, void *)) == NULL) |
557 |
| 619 return &PL_sv_undef; |
558 case G_TYPE_INT64: |
| 620 |
559 *copy_arg = (void *)va_arg(*args, gint64); |
| 621 return sv_2mortal(purple_perl_bless_object(*copy_arg, |
560 |
| 622 purple_value_get_specific_type(value))); |
561 return newSViv((gint64)*copy_arg); |
| 623 |
562 |
| 624 default: |
563 case G_TYPE_UINT64: |
| 625 /* If this happens, things are going to get screwed up... */ |
564 *copy_arg = (void *)va_arg(*args, guint64); |
| 626 return NULL; |
565 |
| 627 } |
566 return newSVuv((guint64)*copy_arg); |
| |
567 |
| |
568 case G_TYPE_STRING: |
| |
569 if ((*copy_arg = (void *)va_arg(*args, char *)) == NULL) |
| |
570 return &PL_sv_undef; |
| |
571 |
| |
572 return newSVGChar((char *)*copy_arg); |
| |
573 |
| |
574 case G_TYPE_POINTER: |
| |
575 if ((*copy_arg = (void *)va_arg(*args, void *)) == NULL) |
| |
576 return &PL_sv_undef; |
| |
577 |
| |
578 return newSViv((IV)*copy_arg); |
| |
579 |
| |
580 default: |
| |
581 if ((*copy_arg = va_arg(*args, void *)) == NULL) |
| |
582 return &PL_sv_undef; |
| |
583 |
| |
584 return purple_perl_sv_from_purple_type(type, *copy_arg); |
| 628 } |
585 } |
| 629 |
586 |
| 630 return NULL; |
587 return NULL; |
| 631 } |
588 } |
| 632 |
589 |