mpq_libmpq.cpp
上传用户:yayahua99
上传日期:2021-04-05
资源大小:1k
文件大小:4k
源码类别:

模拟服务器

开发平台:

Visual C++

  1. #include "mpq_libmpq.h"
  2. #include <deque>
  3. #include <stdio.h>
  4. ArchiveSet gOpenArchives;
  5. MPQArchive::MPQArchive(const char* filename)
  6. {
  7.     int result = libmpq_archive_open(&mpq_a, (unsigned char*)filename);
  8.     printf("Opening %sn", filename);
  9.     if(result) {
  10.         switch(result) {
  11.             case LIBMPQ_EFILE :                   /* error on file operation */
  12.                 printf("Error opening archive '%s': File operation Errorn", filename);
  13.                 break;
  14.             case LIBMPQ_EFILE_FORMAT :            /* bad file format */
  15.                 printf("Error opening archive '%s': Bad file formatn", filename);
  16.                 break;
  17.             case LIBMPQ_EFILE_CORRUPT :           /* file corrupt */
  18.                 printf("Error opening archive '%s': File corruptn", filename);
  19.                 break;
  20.             case LIBMPQ_EFILE_NOT_FOUND :         /* file in archive not found */
  21.                 printf("Error opening archive '%s': File in archive not foundn", filename);
  22.                 break;
  23.             case LIBMPQ_EFILE_READ :              /* Read error in archive */
  24.                 printf("Error opening archive '%s': Read error in archiven", filename);
  25.                 break;
  26.             case LIBMPQ_EALLOCMEM :               /* maybe not enough memory? :) */
  27.                 printf("Error opening archive '%s': Maybe not enough memoryn", filename);
  28.                 break;
  29.             case LIBMPQ_EFREEMEM :                /* can not free memory */
  30.                 printf("Error opening archive '%s': Cannot free memoryn", filename);
  31.                 break;
  32.             case LIBMPQ_EINV_RANGE :              /* Given filenumber is out of range */
  33.                 printf("Error opening archive '%s': Given filenumber is out of rangen", filename);
  34.                 break;
  35.             case LIBMPQ_EHASHTABLE :              /* error in reading hashtable */
  36.                 printf("Error opening archive '%s': Error in reading hashtablen", filename);
  37.                 break;
  38.             case LIBMPQ_EBLOCKTABLE :             /* error in reading blocktable */
  39.                 printf("Error opening archive '%s': Error in reading blocktablen", filename);
  40.                 break;
  41.             default:
  42.                 printf("Error opening archive '%s': Unknown errorn", filename);
  43.                 break;
  44.         }
  45.         return;
  46.     }
  47.     gOpenArchives.push_front(this);
  48. }
  49. void MPQArchive::close()
  50. {
  51.     //gOpenArchives.erase(erase(&mpq_a);
  52.     libmpq_archive_close(&mpq_a);
  53. }
  54. MPQFile::MPQFile(const char* filename):
  55.     eof(false),
  56.     buffer(0),
  57.     pointer(0),
  58.     size(0)
  59. {
  60.     for(ArchiveSet::iterator i=gOpenArchives.begin(); i!=gOpenArchives.end();++i)
  61.     {
  62.         mpq_archive &mpq_a = (*i)->mpq_a;
  63.         mpq_hash hash = (*i)->GetHashEntry(filename);
  64.         uint32 blockindex = hash.blockindex;
  65.         if (blockindex == 0xFFFFFFFF)
  66.             continue; //file not found
  67.         uint32 fileno = blockindex;
  68.         //int fileno = libmpq_file_number(&mpq_a, filename);
  69.         //if(fileno == LIBMPQ_EFILE_NOT_FOUND)
  70.         //    continue;
  71.         // Found!
  72.         size = libmpq_file_info(&mpq_a, LIBMPQ_FILE_UNCOMPRESSED_SIZE, fileno);
  73.         // HACK: in patch.mpq some files don't want to open and give 1 for filesize
  74.         if (size<=1) {
  75.             eof = true;
  76.             buffer = 0;
  77.             return;
  78.         }
  79.         buffer = new char[size];
  80.         //libmpq_file_getdata
  81.         libmpq_file_getdata(&mpq_a, hash, fileno, (unsigned char*)buffer);
  82.         return;
  83.     }
  84.     eof = true;
  85.     buffer = 0;
  86. }
  87. size_t MPQFile::read(void* dest, size_t bytes)
  88. {
  89.     if (eof) return 0;
  90.     size_t rpos = pointer + bytes;
  91.     if (rpos > size) {
  92.         bytes = size - pointer;
  93.         eof = true;
  94.     }
  95.     memcpy(dest, &(buffer[pointer]), bytes);
  96.     pointer = rpos;
  97.     return bytes;
  98. }
  99. void MPQFile::seek(int offset)
  100. {
  101.     pointer = offset;
  102.     eof = (pointer >= size);
  103. }
  104. void MPQFile::seekRelative(int offset)
  105. {
  106.     pointer += offset;
  107.     eof = (pointer >= size);
  108. }
  109. void MPQFile::close()
  110. {
  111.     if (buffer) delete[] buffer;
  112.     buffer = 0;
  113.     eof = true;
  114. }