libpurple/plugins/perl/perl-common.c

branch
soc.2013.gobjectification
changeset 34799
f029b9598b8e
parent 34798
c1cb4cd0543d
child 34800
00331d95b7d0
equal deleted inserted replaced
34798:c1cb4cd0543d 34799:f029b9598b8e
1 #include "debug.h"
2 #include "value.h"
3
1 #include "perl-common.h" 4 #include "perl-common.h"
2
3 #include "cipher.h"
4 #include "debug.h"
5 #include "savedstatuses.h"
6 5
7 extern PerlInterpreter *my_perl; 6 extern PerlInterpreter *my_perl;
8 7
9 static GHashTable *object_stashes = NULL; 8 static GHashTable *object_stashes = NULL;
10 9
378 return TRUE; 377 return TRUE;
379 } 378 }
380 #endif 379 #endif
381 380
382 void * 381 void *
383 purple_perl_data_from_sv(GType type, SV *sv) 382 purple_perl_data_from_sv(PurpleValue *value, SV *sv)
384 { 383 {
385 384
386 switch (type) { 385 switch (purple_value_get_type(value)) {
387 case G_TYPE_BOOLEAN: return (void *)SvIV(sv); 386 case PURPLE_TYPE_BOOLEAN: return (void *)SvIV(sv);
388 case G_TYPE_INT: return (void *)SvIV(sv); 387 case PURPLE_TYPE_INT: return (void *)SvIV(sv);
389 case G_TYPE_UINT: return (void *)SvUV(sv); 388 case PURPLE_TYPE_UINT: return (void *)SvUV(sv);
390 case G_TYPE_LONG: return (void *)SvIV(sv); 389 case PURPLE_TYPE_LONG: return (void *)SvIV(sv);
391 case G_TYPE_ULONG: return (void *)SvUV(sv); 390 case PURPLE_TYPE_ULONG: return (void *)SvUV(sv);
392 case G_TYPE_INT64: return (void *)SvIV(sv); 391 case PURPLE_TYPE_INT64: return (void *)SvIV(sv);
393 case G_TYPE_UINT64: return (void *)SvUV(sv); 392 case PURPLE_TYPE_UINT64: return (void *)SvUV(sv);
394 case G_TYPE_STRING: return g_strdup(SvPVutf8_nolen(sv)); 393 case PURPLE_TYPE_STRING: return g_strdup(SvPVutf8_nolen(sv));
395 case G_TYPE_POINTER: return (void *)SvIV(sv); 394 case PURPLE_TYPE_POINTER: return (void *)SvIV(sv);
396 case G_TYPE_BOXED: return (void *)SvIV(sv); 395 case PURPLE_TYPE_BOXED: return (void *)SvIV(sv);
397 396
398 default: 397 default:
399 return NULL; 398 return NULL;
400 } 399 }
401 400
402 return NULL; 401 return NULL;
403 } 402 }
404 403
405 static SV * 404 static SV *
406 purple_perl_sv_from_purple_type(const GType type, void *arg) 405 purple_perl_sv_from_subtype(const PurpleValue *value, void *arg)
407 { 406 {
408 const char *stash = "Purple"; /* ? */ 407 const char *stash = "Purple"; /* ? */
409 408
410 if (type == PURPLE_TYPE_ACCOUNT) 409 switch (purple_value_get_subtype(value)) {
411 stash = "Purple::Account"; 410 case PURPLE_SUBTYPE_ACCOUNT:
412 else if (type == PURPLE_TYPE_BUDDY_LIST) 411 stash = "Purple::Account";
413 stash = "Purple::BuddyList"; 412 break;
414 else if (type == PURPLE_TYPE_BUDDY) 413 case PURPLE_SUBTYPE_BLIST:
415 stash = "Purple::BuddyList::Buddy"; 414 stash = "Purple::BuddyList";
416 else if (type == PURPLE_TYPE_GROUP) 415 break;
417 stash = "Purple::BuddyList::Group"; 416 case PURPLE_SUBTYPE_BLIST_BUDDY:
418 else if (type == PURPLE_TYPE_CHAT) 417 stash = "Purple::BuddyList::Buddy";
419 stash = "Purple::BuddyList::Chat"; 418 break;
420 else if (type == PURPLE_TYPE_BUDDY_ICON) 419 case PURPLE_SUBTYPE_BLIST_GROUP:
421 stash = "Purple::Buddy::Icon"; 420 stash = "Purple::BuddyList::Group";
422 else if (type == PURPLE_TYPE_CONNECTION) 421 break;
423 stash = "Purple::Connection"; 422 case PURPLE_SUBTYPE_BLIST_CHAT:
424 else if (type == PURPLE_TYPE_CONVERSATION) 423 stash = "Purple::BuddyList::Chat";
425 stash = "Purple::Conversation"; 424 break;
426 else if (type == PURPLE_TYPE_PLUGIN) 425 case PURPLE_SUBTYPE_BUDDY_ICON:
427 stash = "Purple::Plugin"; 426 stash = "Purple::Buddy::Icon";
428 else if (type == PURPLE_TYPE_BLIST_NODE) 427 break;
429 stash = "Purple::BuddyList::Node"; 428 case PURPLE_SUBTYPE_CONNECTION:
430 else if (type == PURPLE_TYPE_CIPHER) 429 stash = "Purple::Connection";
431 stash = "Purple::Cipher"; 430 break;
432 else if (type == PURPLE_TYPE_STATUS) 431 case PURPLE_SUBTYPE_CONVERSATION:
433 stash = "Purple::Status"; 432 stash = "Purple::Conversation";
434 else if (type == PURPLE_TYPE_SAVEDSTATUS) 433 break;
435 stash = "Purple::SavedStatus"; 434 case PURPLE_SUBTYPE_PLUGIN:
436 else if (type == PURPLE_TYPE_LOG) 435 stash = "Purple::Plugin";
437 stash = "Purple::Log"; 436 break;
438 else if (type == PURPLE_TYPE_XFER) 437 case PURPLE_SUBTYPE_BLIST_NODE:
439 stash = "Purple::Xfer"; 438 stash = "Purple::BuddyList::Node";
440 else if (type == PURPLE_TYPE_XMLNODE) 439 break;
441 stash = "Purple::XMLNode"; 440 case PURPLE_SUBTYPE_CIPHER:
442 else if (type == PURPLE_TYPE_NOTIFY_USER_INFO) 441 stash = "Purple::Cipher";
443 stash = "Purple::NotifyUserInfo"; 442 break;
444 else if (type == PURPLE_TYPE_STORED_IMAGE) 443 case PURPLE_SUBTYPE_STATUS:
445 stash = "Purple::StoredImage"; 444 stash = "Purple::Status";
446 else if (type == PURPLE_TYPE_CERTIFICATE_POOL) 445 break;
447 stash = "Purple::Certificate::Pool"; 446 case PURPLE_SUBTYPE_SAVEDSTATUS:
447 stash = "Purple::SavedStatus";
448 break;
449 case PURPLE_SUBTYPE_LOG:
450 stash = "Purple::Log";
451 break;
452 case PURPLE_SUBTYPE_XFER:
453 stash = "Purple::Xfer";
454 break;
455 case PURPLE_SUBTYPE_XMLNODE:
456 stash = "Purple::XMLNode";
457 break;
458 case PURPLE_SUBTYPE_USERINFO:
459 stash = "Purple::NotifyUserInfo";
460 break;
461 case PURPLE_SUBTYPE_STORED_IMAGE:
462 stash = "Purple::StoredImage";
463 break;
464 case PURPLE_SUBTYPE_CERTIFICATEPOOL:
465 stash = "Purple::Certificate::Pool";
466 break;
467 case PURPLE_SUBTYPE_UNKNOWN:
468 stash = "Purple::Unknown";
469 break;
470 }
448 471
449 return sv_2mortal(purple_perl_bless_object(arg, stash)); 472 return sv_2mortal(purple_perl_bless_object(arg, stash));
450 } 473 }
451 474
452 SV * 475 SV *
453 purple_perl_sv_from_vargs(const GType type, va_list *args, void ***copy_arg) 476 purple_perl_sv_from_vargs(const PurpleValue *value, va_list *args, void ***copy_arg)
454 { 477 {
455 if (purple_value_is_outgoing(value)) { 478 if (purple_value_is_outgoing(value)) {
456 switch (purple_value_get_type(value)) { 479 switch (purple_value_get_type(value)) {
457 case PURPLE_TYPE_SUBTYPE: 480 case PURPLE_TYPE_SUBTYPE:
458 if ((*copy_arg = va_arg(*args, void **)) == NULL) 481 if ((*copy_arg = va_arg(*args, void **)) == NULL)
459 return &PL_sv_undef; 482 return &PL_sv_undef;
460 483
461 return purple_perl_sv_from_purple_type(type, *(void **)*copy_arg); 484 return purple_perl_sv_from_subtype(value, *(void **)*copy_arg);
462 485
463 case PURPLE_TYPE_BOOLEAN: 486 case PURPLE_TYPE_BOOLEAN:
464 if ((*copy_arg = (void *)va_arg(*args, gboolean *)) == NULL) 487 if ((*copy_arg = (void *)va_arg(*args, gboolean *)) == NULL)
465 return &PL_sv_undef; 488 return &PL_sv_undef;
466 489
532 switch (purple_value_get_type(value)) { 555 switch (purple_value_get_type(value)) {
533 case PURPLE_TYPE_SUBTYPE: 556 case PURPLE_TYPE_SUBTYPE:
534 if ((*copy_arg = va_arg(*args, void *)) == NULL) 557 if ((*copy_arg = va_arg(*args, void *)) == NULL)
535 return &PL_sv_undef; 558 return &PL_sv_undef;
536 559
537 return purple_perl_sv_from_purple_type(type, *copy_arg); 560 return purple_perl_sv_from_subtype(value, *copy_arg);
538 561
539 case PURPLE_TYPE_BOOLEAN: 562 case PURPLE_TYPE_BOOLEAN:
540 *copy_arg = GINT_TO_POINTER( va_arg(*args, gboolean) ); 563 *copy_arg = GINT_TO_POINTER( va_arg(*args, gboolean) );
541 564
542 return newSViv((gboolean)GPOINTER_TO_INT(*copy_arg)); 565 return newSViv((gboolean)GPOINTER_TO_INT(*copy_arg));

mercurial