| 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 |