瀏覽代碼

The process is mainly shaped. Now cleaning, readability and exceptions should come as next steps.

Eiyeron Fulmincendii 10 年之前
父節點
當前提交
5f983a10b3
共有 2 個文件被更改,包括 53 次插入10 次删除
  1. 51 8
      src/piaf/Archive.cpp
  2. 2 2
      src/piaf/Archive.h

+ 51 - 8
src/piaf/Archive.cpp

@@ -6,6 +6,7 @@
 using WalrusRPG::PIAF::Archive;
 using WalrusRPG::PIAF::FileEntry;
 using WalrusRPG::PIAF::FileType;
+using WalrusRPG::PIAF::CompressionType;
 
 namespace
 {
@@ -17,6 +18,25 @@ namespace
             result |= data[i] << (8 * (sizeof(T) - 1 - i));
         return result;
     }
+
+    // Must get a pointer on the file table.
+    void load_file_table(FileEntry *entries, char *data, uint32_t nb_files)
+    {
+        for (unsigned index = 0; index < nb_files; index++)
+        {
+            char *current_entry_data = &data[index * 24];
+            memcpy(entries[index].filename, current_entry_data, 8);
+            entries[index].file_type =
+                (FileType) read_big_endian_value<uint32_t>(&current_entry_data[8]);
+            entries[index].compression_type =
+                (CompressionType) read_big_endian_value<uint32_t>(
+                    &current_entry_data[12]);
+            entries[index].file_size =
+                read_big_endian_value<uint32_t>(&current_entry_data[16]);
+            entries[index].data_offset =
+                read_big_endian_value<uint32_t>(&current_entry_data[20]);
+        }
+    }
 }
 
 Archive::Archive(char *filepath)
@@ -47,24 +67,47 @@ Archive::Archive(char *filepath)
         // TODO throw bad header
     }
     uint32_t expected_checksum = read_big_endian_value<uint32_t>(&header_container[8]);
-    if (expected_checksum != crc32(0L, (unsigned char*)header_container, 32))
+    if (expected_checksum != crc32(0L, (unsigned char *) header_container, 32))
     {
         // TODO throw bad checksum
     }
 
     // TODO : version checking
-    version = read_big_endian_value<uint32_t>(&header_container[12]);
-
-
+    version = read_big_endian_value<uint32_t>(&header_container[16]);
+    /* if (version != CURRENT_PIAF_VERSION)
+     * {
+     *      exception up;
+     *      throw up; // haha
+     * }
+     */
+    nb_files = read_big_endian_value<uint32_t>(&header_container[20]);
 
-    // ...
-    // entries = new File_Entry[];
-    // ...
+    data_size = read_big_endian_value<uint32_t>(&header_container[24]);
+    if (data_size != filesize - 32 - 24 * nb_files)
+    {
+        // T0D0 : throw wrong size exception
+    }
+    if (nb_files != 0)
+    {
+        uint32_t expected_filetable_checksum =
+            read_big_endian_value<uint32_t>(&header_container[12]);
+        char *file_entry_data = new char[24 * nb_files];
+        if (expected_filetable_checksum !=
+            crc32(0L, (unsigned char *) file_entry_data, 24 * nb_files))
+        {
+            // TODO : checksum exception
+        }
+        fseek(file, 32, SEEK_SET);
+        fread(file_entry_data, sizeof(char), 24 * nb_files, file);
+        entries = new FileEntry[nb_files];
+        load_file_table(entries, file_entry_data, nb_files);
+        delete[] file_entry_data;
+    }
 }
 
 Archive::~Archive()
 {
-    // delete[] entries;
+    delete[] entries;
 }
 
 FileEntry Archive::get_file_entry(char *filename)

+ 2 - 2
src/piaf/Archive.h

@@ -8,7 +8,7 @@ namespace WalrusRPG
 {
     namespace PIAF
     {
-        enum FileType
+        enum FileType : uint32_t
         {
             UNKNOWN,
             MAP,
@@ -16,7 +16,7 @@ namespace WalrusRPG
             TEXT,
             TEXTURE
         };
-        enum CompressionType
+        enum CompressionType : uint32_t
         {
             UNKNWOWN,
             RAW,