… | |
… | |
466 | av_store ((AV *)av, idx, SvREFCNT_inc ((SV *)ext->self)); |
466 | av_store ((AV *)av, idx, SvREFCNT_inc ((SV *)ext->self)); |
467 | fprintf (fp, "oid %d\n", idx); |
467 | fprintf (fp, "oid %d\n", idx); |
468 | } |
468 | } |
469 | } |
469 | } |
470 | |
470 | |
471 | object_thawer::object_thawer (FILE *fp, const char *filename) |
471 | object_thawer::object_thawer (const char *filename) |
472 | { |
472 | { |
473 | this->fp = fp; |
|
|
474 | av = 0; |
473 | av = 0; |
|
|
474 | fp = 0; |
475 | |
475 | |
476 | if (!filename) |
476 | if (!filename) |
477 | return; |
477 | return; |
478 | |
478 | |
479 | dSP; |
479 | fp = fopen (filename, "r"); |
480 | ENTER; |
480 | if (!fp) |
481 | SAVETMPS; |
|
|
482 | PUSHMARK (SP); |
|
|
483 | XPUSHs (sv_2mortal (newSVpv (filename, 0))); |
|
|
484 | PUTBACK; |
|
|
485 | |
|
|
486 | if (0 < call_pv ("cf::object_thawer_load", G_SCALAR | G_EVAL)) |
|
|
487 | { |
481 | { |
488 | SPAGAIN; |
482 | LOG (llevError, "object_thawer: unable to open '%s': %s.\n", filename, strerror (errno)); |
489 | SV *sv = POPs; |
483 | return; |
490 | if (SvROK (sv)) |
|
|
491 | av = SvREFCNT_inc (SvRV (sv)); |
|
|
492 | } |
484 | } |
493 | |
485 | |
|
|
486 | if (perl) |
|
|
487 | { |
|
|
488 | dSP; |
|
|
489 | ENTER; |
|
|
490 | SAVETMPS; |
|
|
491 | PUSHMARK (SP); |
|
|
492 | XPUSHs (sv_2mortal (newSVpv (filename, 0))); |
|
|
493 | PUTBACK; |
|
|
494 | |
|
|
495 | if (0 < call_pv ("cf::object_thawer_load", G_SCALAR | G_EVAL)) |
|
|
496 | { |
|
|
497 | SPAGAIN; |
|
|
498 | SV *sv = POPs; |
|
|
499 | if (SvROK (sv)) |
|
|
500 | av = SvREFCNT_inc (SvRV (sv)); |
|
|
501 | } |
|
|
502 | |
494 | FREETMPS; |
503 | FREETMPS; |
495 | LEAVE; |
504 | LEAVE; |
|
|
505 | } |
496 | } |
506 | } |
497 | |
507 | |
498 | void object_thawer::get (data_type type, void *obj, attachable_base *ext, int oid) |
508 | void object_thawer::get (data_type type, void *obj, attachable_base *ext, int oid) |
499 | { |
509 | { |
500 | if (!av || oid < 0) // this is actually an error of sorts |
510 | if (!av || oid < 0) // this is actually an error of sorts |
… | |
… | |
517 | reattach (type, obj); |
527 | reattach (type, obj); |
518 | } |
528 | } |
519 | |
529 | |
520 | object_thawer::~object_thawer () |
530 | object_thawer::~object_thawer () |
521 | { |
531 | { |
|
|
532 | if (fp) fclose (fp); |
522 | if (av) SvREFCNT_dec ((AV *)av); |
533 | if (av) SvREFCNT_dec ((AV *)av); |
523 | } |
534 | } |
524 | |
535 | |
525 | ///////////////////////////////////////////////////////////////////////////// |
536 | ///////////////////////////////////////////////////////////////////////////// |
526 | |
537 | |