| 378 #endif |
378 #endif |
| 379 |
379 |
| 380 void * |
380 void * |
| 381 purple_perl_data_from_sv(GType type, SV *sv) |
381 purple_perl_data_from_sv(GType type, SV *sv) |
| 382 { |
382 { |
| 383 if (type == G_TYPE_BOOLEAN) |
383 |
| 384 return (void *)SvIV(sv); |
384 switch (type) { |
| 385 else if (type == G_TYPE_INT) |
385 case G_TYPE_BOOLEAN: return (void *)SvIV(sv); |
| 386 return (void *)SvIV(sv); |
386 case G_TYPE_INT: return (void *)SvIV(sv); |
| 387 else if (type == G_TYPE_UINT) |
387 case G_TYPE_UINT: return (void *)SvUV(sv); |
| 388 return (void *)SvUV(sv); |
388 case G_TYPE_LONG: return (void *)SvIV(sv); |
| 389 else if (type == G_TYPE_LONG) |
389 case G_TYPE_ULONG: return (void *)SvUV(sv); |
| 390 return (void *)SvIV(sv); |
390 case G_TYPE_INT64: return (void *)SvIV(sv); |
| 391 else if (type == G_TYPE_ULONG) |
391 case G_TYPE_UINT64: return (void *)SvUV(sv); |
| 392 return (void *)SvUV(sv); |
392 case G_TYPE_STRING: return g_strdup(SvPVutf8_nolen(sv)); |
| 393 else if (type == G_TYPE_INT64) |
393 case G_TYPE_POINTER: return (void *)SvIV(sv); |
| 394 return (void *)SvIV(sv); |
394 case G_TYPE_BOXED: return (void *)SvIV(sv); |
| 395 else if (type == G_TYPE_UINT64) |
395 |
| 396 return (void *)SvUV(sv); |
396 default: |
| 397 else if (type == G_TYPE_STRING) |
397 return NULL; |
| 398 return g_strdup(SvPVutf8_nolen(sv)); |
398 } |
| 399 else if (type == G_TYPE_POINTER) |
|
| 400 return (void *)SvIV(sv); |
|
| 401 else if (type == G_TYPE_BOXED) |
|
| 402 return (void *)SvIV(sv); |
|
| 403 |
399 |
| 404 return NULL; |
400 return NULL; |
| 405 } |
401 } |
| 406 |
402 |
| 407 static SV * |
403 static SV * |
| 408 purple_perl_sv_from_purple_type(const GType type, void *arg) |
404 purple_perl_sv_from_purple_type(const GType type, void *arg) |
| 409 { |
405 { |
| 410 const char *stash = "Purple"; /* ? */ |
406 const char *stash = "Purple"; /* ? */ |
| 411 |
407 |
| 412 switch (purple_value_get_subtype(value)) { |
408 if (type == PURPLE_TYPE_ACCOUNT) |
| 413 case PURPLE_SUBTYPE_ACCOUNT: |
409 stash = "Purple::Account"; |
| 414 stash = "Purple::Account"; |
410 else if (type == PURPLE_TYPE_BUDDY_LIST) |
| 415 break; |
411 stash = "Purple::BuddyList"; |
| 416 case PURPLE_SUBTYPE_BLIST: |
412 else if (type == PURPLE_TYPE_BUDDY) |
| 417 stash = "Purple::BuddyList"; |
413 stash = "Purple::BuddyList::Buddy"; |
| 418 break; |
414 else if (type == PURPLE_TYPE_GROUP) |
| 419 case PURPLE_SUBTYPE_BLIST_BUDDY: |
415 stash = "Purple::BuddyList::Group"; |
| 420 stash = "Purple::BuddyList::Buddy"; |
416 else if (type == PURPLE_TYPE_CHAT) |
| 421 break; |
417 stash = "Purple::BuddyList::Chat"; |
| 422 case PURPLE_SUBTYPE_BLIST_GROUP: |
418 else if (type == PURPLE_TYPE_BUDDY_ICON) |
| 423 stash = "Purple::BuddyList::Group"; |
419 stash = "Purple::Buddy::Icon"; |
| 424 break; |
420 else if (type == PURPLE_TYPE_CONNECTION) |
| 425 case PURPLE_SUBTYPE_BLIST_CHAT: |
421 stash = "Purple::Connection"; |
| 426 stash = "Purple::BuddyList::Chat"; |
422 else if (type == PURPLE_TYPE_CONVERSATION) |
| 427 break; |
423 stash = "Purple::Conversation"; |
| 428 case PURPLE_SUBTYPE_BUDDY_ICON: |
424 else if (type == PURPLE_TYPE_PLUGIN) |
| 429 stash = "Purple::Buddy::Icon"; |
425 stash = "Purple::Plugin"; |
| 430 break; |
426 else if (type == PURPLE_TYPE_BLIST_NODE) |
| 431 case PURPLE_SUBTYPE_CONNECTION: |
427 stash = "Purple::BuddyList::Node"; |
| 432 stash = "Purple::Connection"; |
428 else if (type == PURPLE_TYPE_CIPHER) |
| 433 break; |
429 stash = "Purple::Cipher"; |
| 434 case PURPLE_SUBTYPE_CONVERSATION: |
430 else if (type == PURPLE_TYPE_STATUS) /* TODO */ |
| 435 stash = "Purple::Conversation"; |
431 stash = "Purple::Status"; |
| 436 break; |
432 else if (type == PURPLE_TYPE_SAVEDSTATUS) /* TODO */ |
| 437 case PURPLE_SUBTYPE_PLUGIN: |
433 stash = "Purple::SavedStatus"; |
| 438 stash = "Purple::Plugin"; |
434 else if (type == PURPLE_TYPE_LOG) /* TODO */ |
| 439 break; |
435 stash = "Purple::Log"; |
| 440 case PURPLE_SUBTYPE_BLIST_NODE: |
436 else if (type == PURPLE_TYPE_XFER) /* TODO */ |
| 441 stash = "Purple::BuddyList::Node"; |
437 stash = "Purple::Xfer"; |
| 442 break; |
438 else if (type == PURPLE_TYPE_XMLNODE) /* TODO */ |
| 443 case PURPLE_SUBTYPE_CIPHER: |
439 stash = "Purple::XMLNode"; |
| 444 stash = "Purple::Cipher"; |
440 else if (type == PURPLE_TYPE_USERINFO) /* TODO */ |
| 445 break; |
441 stash = "Purple::NotifyUserInfo"; |
| 446 case PURPLE_SUBTYPE_STATUS: |
442 else if (type == PURPLE_TYPE_STORED_IMAGE) /* TODO */ |
| 447 stash = "Purple::Status"; |
443 stash = "Purple::StoredImage"; |
| 448 break; |
444 else if (type == PURPLE_TYPE_CERTIFICATEPOOL) /* TODO */ |
| 449 case PURPLE_SUBTYPE_SAVEDSTATUS: |
445 stash = "Purple::Certificate::Pool"; |
| 450 stash = "Purple::SavedStatus"; |
|
| 451 break; |
|
| 452 case PURPLE_SUBTYPE_LOG: |
|
| 453 stash = "Purple::Log"; |
|
| 454 break; |
|
| 455 case PURPLE_SUBTYPE_XFER: |
|
| 456 stash = "Purple::Xfer"; |
|
| 457 break; |
|
| 458 case PURPLE_SUBTYPE_XMLNODE: |
|
| 459 stash = "Purple::XMLNode"; |
|
| 460 break; |
|
| 461 case PURPLE_SUBTYPE_USERINFO: |
|
| 462 stash = "Purple::NotifyUserInfo"; |
|
| 463 break; |
|
| 464 case PURPLE_SUBTYPE_STORED_IMAGE: |
|
| 465 stash = "Purple::StoredImage"; |
|
| 466 break; |
|
| 467 case PURPLE_SUBTYPE_CERTIFICATEPOOL: |
|
| 468 stash = "Purple::Certificate::Pool"; |
|
| 469 break; |
|
| 470 case PURPLE_SUBTYPE_UNKNOWN: |
|
| 471 stash = "Purple::Unknown"; |
|
| 472 break; |
|
| 473 } |
|
| 474 |
446 |
| 475 return sv_2mortal(purple_perl_bless_object(arg, stash)); |
447 return sv_2mortal(purple_perl_bless_object(arg, stash)); |
| 476 } |
448 } |
| 477 |
449 |
| 478 SV * |
450 SV * |