ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/server/server/cfperl.xs
(Generate patch)

Comparing deliantra/server/server/cfperl.xs (file contents):
Revision 1.19 by root, Mon Aug 28 07:54:11 2006 UTC vs.
Revision 1.20 by root, Mon Aug 28 14:05:24 2006 UTC

391 if (obj->self) 391 if (obj->self)
392 reattach (subclass::get_dt (), (subclass *)obj); 392 reattach (subclass::get_dt (), (subclass *)obj);
393} 393}
394 394
395object_freezer::object_freezer (const char *filename) 395object_freezer::object_freezer (const char *filename)
396: filename (filename)
397{ 396{
397 this->filename = (SV *)newSVpv (filename, 0);
398
399 char filename2 [4096];
400 snprintf (filename2, 4096, "%s~", filename);
401
402 fp = fopen (filename2, "w");
403
404 if (!fp)
405 LOG (llevError, "cannot open file '%s' for writing: %s\n", filename2, strerror (errno));
406
398 av = (AV *)newAV (); 407 av = (AV *)newAV ();
399} 408}
400 409
401object_freezer::~object_freezer () 410object_freezer::~object_freezer ()
402{ 411{
412 if (fp)
413 {
414 fclose (fp);
415
403 dSP; 416 dSP;
404 ENTER; 417 ENTER;
405 SAVETMPS; 418 SAVETMPS;
406 PUSHMARK (SP); 419 PUSHMARK (SP);
407 XPUSHs (sv_2mortal (newSVpv (filename, 0))); 420 XPUSHs (sv_2mortal ((SV *)filename));
408 XPUSHs (sv_2mortal (newRV_noinc ((SV *)av))); 421 XPUSHs (sv_2mortal (newRV_noinc ((SV *)av)));
409 PUTBACK; 422 PUTBACK;
410 call_pv ("cf::object_freezer_save", G_VOID | G_DISCARD | G_EVAL); 423 call_pv ("cf::object_freezer_save", G_VOID | G_DISCARD | G_EVAL);
411 FREETMPS; 424 FREETMPS;
412 LEAVE; 425 LEAVE;
426 }
427 else
428 SvREFCNT_dec ((SV *)filename);
413} 429}
414 430
415void object_freezer::put (FILE *fp, attachable_base *ext) 431void object_freezer::put (attachable_base *ext)
416{ 432{
417 ext->optimise (); 433 ext->optimise ();
418 434
419 if (ext->self) 435 if (ext->self)
420 { 436 {
422 av_store ((AV *)av, idx, SvREFCNT_inc ((SV *)ext->self)); 438 av_store ((AV *)av, idx, SvREFCNT_inc ((SV *)ext->self));
423 fprintf (fp, "oid %d\n", idx); 439 fprintf (fp, "oid %d\n", idx);
424 } 440 }
425} 441}
426 442
427object_thawer::object_thawer (const char *filename) 443object_thawer::object_thawer (FILE *fp, const char *filename)
428{ 444{
445 this->fp = fp;
429 av = 0; 446 av = 0;
430 447
431 if (!filename) 448 if (!filename)
432 return; 449 return;
433 450
472 reattach (type, obj); 489 reattach (type, obj);
473} 490}
474 491
475object_thawer::~object_thawer () 492object_thawer::~object_thawer ()
476{ 493{
477 if (av)
478 SvREFCNT_dec ((SV *)av); 494 if (av) SvREFCNT_dec ((AV *)av);
479} 495}
480 496
481///////////////////////////////////////////////////////////////////////////// 497/////////////////////////////////////////////////////////////////////////////
482 498
483extern "C" int cfperl_initPlugin (const char *iversion, f_plug_api gethooksptr) 499extern "C" int cfperl_initPlugin (const char *iversion, f_plug_api gethooksptr)

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines