libpurple/plugins/perl/perl-common.c

branch
soc.2013.gobjectification
changeset 34802
4ea5cddeefc4
parent 34800
00331d95b7d0
child 34805
aa65e5a9f2ef
equal deleted inserted replaced
34801:08c49f30e4a1 34802:4ea5cddeefc4
1 #include "perl-common.h"
2
3 #include "cipher.h"
1 #include "debug.h" 4 #include "debug.h"
2 5 #include "savedstatuses.h"
3 #include "perl-common.h"
4 6
5 extern PerlInterpreter *my_perl; 7 extern PerlInterpreter *my_perl;
6 8
7 static GHashTable *object_stashes = NULL; 9 static GHashTable *object_stashes = NULL;
8 10
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

mercurial