| 354 |
354 |
| 355 return TRUE; |
355 return TRUE; |
| 356 } |
356 } |
| 357 #endif |
357 #endif |
| 358 |
358 |
| |
359 void * |
| |
360 gaim_perl_data_from_sv(GaimValue *value, SV *sv) |
| |
361 { |
| |
362 STRLEN na; |
| |
363 |
| |
364 switch (gaim_value_get_type(value)) |
| |
365 { |
| |
366 case GAIM_TYPE_BOOLEAN: return (void *)SvIV(sv); |
| |
367 case GAIM_TYPE_INT: return (void *)SvIV(sv); |
| |
368 case GAIM_TYPE_UINT: return (void *)SvUV(sv); |
| |
369 case GAIM_TYPE_LONG: return (void *)SvIV(sv); |
| |
370 case GAIM_TYPE_ULONG: return (void *)SvUV(sv); |
| |
371 case GAIM_TYPE_INT64: return (void *)SvIV(sv); |
| |
372 case GAIM_TYPE_UINT64: return (void *)SvUV(sv); |
| |
373 case GAIM_TYPE_STRING: return (void *)SvPV(sv, na); |
| |
374 case GAIM_TYPE_POINTER: return (void *)SvIV(sv); |
| |
375 case GAIM_TYPE_BOXED: return (void *)SvIV(sv); |
| |
376 |
| |
377 default: |
| |
378 return NULL; |
| |
379 } |
| |
380 |
| |
381 return NULL; |
| |
382 } |
| |
383 |
| 359 static SV * |
384 static SV * |
| 360 gaim_perl_sv_from_subtype(const GaimValue *value, void *arg) |
385 gaim_perl_sv_from_subtype(const GaimValue *value, void *arg) |
| 361 { |
386 { |
| 362 const char *stash = NULL; |
387 const char *stash = NULL; |
| 363 |
388 |
| 379 |
404 |
| 380 return sv_2mortal(gaim_perl_bless_object(arg, stash)); |
405 return sv_2mortal(gaim_perl_bless_object(arg, stash)); |
| 381 } |
406 } |
| 382 |
407 |
| 383 SV * |
408 SV * |
| 384 gaim_perl_sv_from_vargs(const GaimValue *value, va_list args) |
409 gaim_perl_sv_from_vargs(const GaimValue *value, va_list *args, |
| |
410 void **copy_arg) |
| 385 { |
411 { |
| 386 if (gaim_value_is_outgoing(value)) |
412 if (gaim_value_is_outgoing(value)) |
| 387 { |
413 { |
| 388 switch (gaim_value_get_type(value)) |
414 switch (gaim_value_get_type(value)) |
| 389 { |
415 { |
| 390 case GAIM_TYPE_SUBTYPE: |
416 case GAIM_TYPE_SUBTYPE: |
| 391 return gaim_perl_sv_from_subtype(value, *va_arg(args, void **)); |
417 if ((*copy_arg = va_arg(*args, void **)) == NULL) |
| |
418 return &PL_sv_undef; |
| |
419 |
| |
420 return gaim_perl_sv_from_subtype(value, *(void **)*copy_arg); |
| 392 |
421 |
| 393 case GAIM_TYPE_BOOLEAN: |
422 case GAIM_TYPE_BOOLEAN: |
| 394 return newSViv(*va_arg(args, gboolean *)); |
423 if ((*copy_arg = va_arg(*args, gboolean *)) == NULL) |
| |
424 return &PL_sv_undef; |
| |
425 |
| |
426 return newSViv(*(gboolean *)*copy_arg); |
| 395 |
427 |
| 396 case GAIM_TYPE_INT: |
428 case GAIM_TYPE_INT: |
| 397 return newSViv(*va_arg(args, int *)); |
429 if ((*copy_arg = va_arg(*args, int *)) == NULL) |
| |
430 return &PL_sv_undef; |
| |
431 |
| |
432 return newSViv(*(int *)*copy_arg); |
| 398 |
433 |
| 399 case GAIM_TYPE_UINT: |
434 case GAIM_TYPE_UINT: |
| 400 return newSVuv(*va_arg(args, unsigned int *)); |
435 if ((*copy_arg = va_arg(*args, unsigned int *)) == NULL) |
| |
436 return &PL_sv_undef; |
| |
437 |
| |
438 return newSVuv(*(unsigned int *)*copy_arg); |
| 401 |
439 |
| 402 case GAIM_TYPE_LONG: |
440 case GAIM_TYPE_LONG: |
| 403 return newSViv(*va_arg(args, long *)); |
441 if ((*copy_arg = va_arg(*args, long *)) == NULL) |
| |
442 return &PL_sv_undef; |
| |
443 |
| |
444 return newSViv(*(long *)*copy_arg); |
| 404 |
445 |
| 405 case GAIM_TYPE_ULONG: |
446 case GAIM_TYPE_ULONG: |
| 406 return newSVuv(*va_arg(args, unsigned long *)); |
447 if ((*copy_arg = va_arg(*args, unsigned long *)) == NULL) |
| |
448 return &PL_sv_undef; |
| |
449 |
| |
450 return newSVuv(*(unsigned long *)*copy_arg); |
| 407 |
451 |
| 408 case GAIM_TYPE_INT64: |
452 case GAIM_TYPE_INT64: |
| 409 return newSViv(*va_arg(args, gint64 *)); |
453 if ((*copy_arg = va_arg(*args, gint64 *)) == NULL) |
| |
454 return &PL_sv_undef; |
| |
455 |
| |
456 return newSViv(*(gint64 *)*copy_arg); |
| 410 |
457 |
| 411 case GAIM_TYPE_UINT64: |
458 case GAIM_TYPE_UINT64: |
| 412 return newSVuv(*va_arg(args, guint64 *)); |
459 if ((*copy_arg = va_arg(*args, guint64 *)) == NULL) |
| |
460 return &PL_sv_undef; |
| |
461 |
| |
462 return newSVuv(*(guint64 *)*copy_arg); |
| 413 |
463 |
| 414 case GAIM_TYPE_STRING: |
464 case GAIM_TYPE_STRING: |
| 415 return newSVGChar(*va_arg(args, char **)); |
465 if ((*copy_arg = va_arg(*args, char **)) == NULL) |
| |
466 return &PL_sv_undef; |
| |
467 |
| |
468 return newSVGChar(*(char **)*copy_arg); |
| 416 |
469 |
| 417 case GAIM_TYPE_POINTER: |
470 case GAIM_TYPE_POINTER: |
| 418 return newSViv((IV)*va_arg(args, void **)); |
471 if ((*copy_arg = va_arg(*args, void **)) == NULL) |
| |
472 return &PL_sv_undef; |
| |
473 |
| |
474 return newSViv((IV)*(void **)*copy_arg); |
| 419 |
475 |
| 420 case GAIM_TYPE_BOXED: |
476 case GAIM_TYPE_BOXED: |
| 421 /* Uh.. I dunno. Try this? */ |
477 /* Uh.. I dunno. Try this? */ |
| |
478 if ((*copy_arg = va_arg(*args, void **)) == NULL) |
| |
479 return &PL_sv_undef; |
| |
480 |
| 422 return sv_2mortal(gaim_perl_bless_object( |
481 return sv_2mortal(gaim_perl_bless_object( |
| 423 va_arg(args, void **), |
482 *(void **)*copy_arg, |
| 424 gaim_value_get_specific_type(value))); |
483 gaim_value_get_specific_type(value))); |
| 425 |
484 |
| 426 default: |
485 default: |
| 427 /* If this happens, things are going to get screwed up... */ |
486 /* If this happens, things are going to get screwed up... */ |
| 428 return NULL; |
487 return NULL; |
| 431 else |
490 else |
| 432 { |
491 { |
| 433 switch (gaim_value_get_type(value)) |
492 switch (gaim_value_get_type(value)) |
| 434 { |
493 { |
| 435 case GAIM_TYPE_SUBTYPE: |
494 case GAIM_TYPE_SUBTYPE: |
| 436 return gaim_perl_sv_from_subtype(value, va_arg(args, void *)); |
495 if ((*copy_arg = va_arg(*args, void *)) == NULL) |
| |
496 return &PL_sv_undef; |
| |
497 |
| |
498 return gaim_perl_sv_from_subtype(value, *copy_arg); |
| 437 |
499 |
| 438 case GAIM_TYPE_BOOLEAN: |
500 case GAIM_TYPE_BOOLEAN: |
| 439 return newSViv(va_arg(args, gboolean)); |
501 *copy_arg = (void *)va_arg(*args, gboolean); |
| |
502 |
| |
503 return newSViv((gboolean)*copy_arg); |
| 440 |
504 |
| 441 case GAIM_TYPE_INT: |
505 case GAIM_TYPE_INT: |
| 442 return newSViv(va_arg(args, int)); |
506 *copy_arg = (void *)va_arg(*args, int); |
| |
507 |
| |
508 return newSViv((int)*copy_arg); |
| 443 |
509 |
| 444 case GAIM_TYPE_UINT: |
510 case GAIM_TYPE_UINT: |
| 445 return newSVuv(va_arg(args, unsigned int)); |
511 *copy_arg = (void *)va_arg(*args, unsigned int); |
| |
512 |
| |
513 return newSVuv((unsigned int)*copy_arg); |
| 446 |
514 |
| 447 case GAIM_TYPE_LONG: |
515 case GAIM_TYPE_LONG: |
| 448 return newSViv(va_arg(args, long)); |
516 *copy_arg = (void *)va_arg(*args, long); |
| |
517 |
| |
518 return newSViv((long)*copy_arg); |
| 449 |
519 |
| 450 case GAIM_TYPE_ULONG: |
520 case GAIM_TYPE_ULONG: |
| 451 return newSVuv(va_arg(args, unsigned long)); |
521 *copy_arg = (void *)va_arg(*args, unsigned long); |
| |
522 |
| |
523 return newSVuv((unsigned long)*copy_arg); |
| 452 |
524 |
| 453 case GAIM_TYPE_INT64: |
525 case GAIM_TYPE_INT64: |
| 454 return newSViv(va_arg(args, gint64)); |
526 #if 0 |
| |
527 /* XXX This yells and complains. */ |
| |
528 *copy_arg = va_arg(*args, gint64); |
| |
529 |
| |
530 return newSViv(*copy_arg); |
| |
531 #endif |
| |
532 break; |
| 455 |
533 |
| 456 case GAIM_TYPE_UINT64: |
534 case GAIM_TYPE_UINT64: |
| 457 return newSVuv(va_arg(args, guint64)); |
535 /* XXX This also yells and complains. */ |
| |
536 #if 0 |
| |
537 *copy_arg = (void *)va_arg(*args, guint64); |
| |
538 |
| |
539 return newSVuv(*copy_arg); |
| |
540 #endif |
| |
541 break; |
| 458 |
542 |
| 459 case GAIM_TYPE_STRING: |
543 case GAIM_TYPE_STRING: |
| 460 return newSVGChar(va_arg(args, char *)); |
544 if ((*copy_arg = (void *)va_arg(*args, char *)) == NULL) |
| |
545 return &PL_sv_undef; |
| |
546 |
| |
547 return newSVGChar(*copy_arg); |
| 461 |
548 |
| 462 case GAIM_TYPE_POINTER: |
549 case GAIM_TYPE_POINTER: |
| 463 return newSViv((IV)va_arg(args, void *)); |
550 if ((*copy_arg = (void *)va_arg(*args, void *)) == NULL) |
| |
551 return &PL_sv_undef; |
| |
552 |
| |
553 return newSViv((IV)*copy_arg); |
| 464 |
554 |
| 465 case GAIM_TYPE_BOXED: |
555 case GAIM_TYPE_BOXED: |
| 466 /* Uh.. I dunno. Try this? */ |
556 /* Uh.. I dunno. Try this? */ |
| 467 return sv_2mortal(gaim_perl_bless_object( |
557 if ((*copy_arg = (void *)va_arg(*args, void *)) == NULL) |
| 468 va_arg(args, void *), |
558 return &PL_sv_undef; |
| |
559 |
| |
560 return sv_2mortal(gaim_perl_bless_object(*copy_arg, |
| 469 gaim_value_get_specific_type(value))); |
561 gaim_value_get_specific_type(value))); |
| 470 |
562 |
| 471 default: |
563 default: |
| 472 /* If this happens, things are going to get screwed up... */ |
564 /* If this happens, things are going to get screwed up... */ |
| 473 return NULL; |
565 return NULL; |
| 474 } |
566 } |
| 475 } |
567 } |
| 476 } |
568 |
| |
569 return NULL; |
| |
570 } |