示例#1
0
MemHandle CPWad::Read (XString item)
{
     CDirEntry *entry = (CDirEntry *)directory[item];
     if (entry)
     {
          file.Seek (entry->Offset());
          MemHandle data = file.Read ((size_t)entry->Size());
          if (data.Size() == (size_t) entry->Size())
               return data;
     }
     return 0;
}
示例#2
0
MemHandle CPWad::Read (XString map, XString item)
{

     CDirEntry *entry = (CDirEntry *)directory[map];
     if (entry)
     {
          entry = (CDirEntry *)entry->subdir[item];
          if (entry)
          {
               file.Seek (entry->Offset());
               MemHandle data = file.Read ((size_t)entry->Size());
               if (data.Size() == (size_t) entry->Size())
               {
                    cdebug.out << "Read From PWAD " << map << " " << item << " " << data.Size() << " bytes" << endl;
                    return data;
               }
          }
     }
     cerr << "Read From PWAD " << map << " " << item << " FAILED!! " << endl;
     cdebug.out << "Read From PWAD " << map << " " << item << " FAILED!! " << endl;
     return 0;
}
示例#3
0
int CPWad::Write (MemHandle data, XString map, XString item)
{

     CDirEntry *entry = (CDirEntry *)directory[map];
     if (entry)
     {
          entry = (CDirEntry *)entry->subdir[item];
          if (entry)
          {
               file.Seek (entry->Offset());
               if (data.Size() == (size_t) entry->Size())
               {
                    int status = file.Write (data);

                    cdebug.out << "Write to PWAD " << map << " " << item << " " << data.Size() << " bytes" << endl;
                    return status;
               }
          }
     }
     cerr << "Write to PWAD " << map << " " << item << " FAILED!! " << endl;
     cdebug.out << "Write to PWAD " << map << " " << item << " FAILED!! " << endl;
     return -1;
}
示例#4
0
CPWad::CPWad (XString name)
      : file (name, O_RDWR | O_BINARY), currentmap(0)
{
     if (file.IsOpen())
     {
          // -=- read the pwad header -=-
          cout << "Opened '" << name << "'" << endl;
          cdebug.out << "Opened '" << name << "'" << endl;
          file.Read (&header, sizeof(PWAD_HEADER));
          swaplong((int *)&(header.dir_offset));
          swaplong((int *)&(header.dir_entries));
          if (memcmp ("PWAD", header.signature, 4) != 0)
          {
               cout << "Not a PWAD!" << "\n";
               cdebug.out << "Not a PWAD!" << "\n";
               Fail ();
               return;
          }
          else
          {
               cdebug.out << "File size: " << file.Size() << endl;
               cdebug.out << "Directory Offset: " << header.dir_offset << endl;
               cdebug.out << "Directory Entries: " << header.dir_entries << endl;
          }

          // -=- read the directory -=-
          file.Seek (header.dir_offset);
          MemHandle dirbuff = file.Read ((size_t)(header.dir_entries * sizeof(DIR_ENTRY)));
          if (dirbuff.Size () != (header.dir_entries * sizeof(DIR_ENTRY)))
          {
               cout << "Error Reading PWAD Directory." << endl;
               cdebug.out << "Error Reading PWAD Directory." << endl;
               Fail ();
          }
          else
          {
               cout << "Building directory...." << flush;
               swap_lump_list((void *)dirbuff.Buffer(), header.dir_entries);
               // -=- go through each dir entry and add it to our internal dir -=-
               DIR_ENTRY *entry_ptr = (DIR_ENTRY *)dirbuff.Buffer();
               
               for (int n = 0; n < header.dir_entries; n++)
               {
                    AddEntry (entry_ptr[n]);
               }
               cout << "Done." << endl;

// -=- print out directory used for debugging -=- 
               CDirEntry *de;
               CDirEntry *sde;
               de = (CDirEntry *)directory.FirstItem ();
               while (de)
               {
                    cdebug.out << de->GetKey() << "  " << de->Size() << " bytes\t  @" << de->Offset() << endl;
                    sde = (CDirEntry *)de->subdir.FirstItem ();
                    while (sde)
                    {
                         cdebug.out << "  " << sde->GetKey() << "  "  << sde->Size() << " bytes\t  @" << sde->Offset() << endl;
                         sde = (CDirEntry *)sde->Next();
                    }

                    de = (CDirEntry *)de->Next();
               }
// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
          }
     }
     else
     {
          cout << "Cannot open '" << name << "'" << endl;
          cdebug.out << "Cannot open '" << name << "'" << endl;
          Fail ();
     }
}