root/trunk/contrib/extractor/mpq_libmpq.h @ 177

Revision 177, 3.0 kB (checked in by yumileroy, 17 years ago)

[svn] * Avoid access to bag item prototype for getting bag size, use related item
update field instead as more fast source. source mangos.
* Further reduce of DB access in guild handlers.
* Multi-locale DBC extracting - source Foks

*** Devs not responsible if all your player items drop to the ground and get eaten by ants or rabbits.. or some kind of wierd ant-rabbits..

Original author: KingPin?
Date: 2008-11-06 08:20:26-06:00

Line 
1#define _CRT_SECURE_NO_DEPRECATE
2#define _CRT_SECURE_NO_WARNINGS
3
4#ifndef MPQ_H
5#define MPQ_H
6
7#include "libmpq/mpq.h"
8#include <string.h>
9#include <ctype.h>
10#include <vector>
11#include <iostream>
12#include <deque>
13
14using namespace std;
15
16typedef unsigned int uint32;
17class MPQArchive
18{
19
20public:
21    mpq_archive mpq_a;
22
23    MPQArchive(const char* filename);
24    void close();
25
26    uint32 HashString(const char* Input, uint32 Offset) {
27        uint32 seed1 = 0x7fed7fed;
28        uint32 seed2 = 0xeeeeeeee;
29
30        for (uint32 i = 0; i < strlen(Input); i++) {
31            uint32 val = toupper(Input[i]);
32            seed1 = mpq_a.buf[Offset + val] ^ (seed1 + seed2);
33            seed2 = val + seed1 + seed2 + (seed2 << 5) + 3;
34        }
35
36        return seed1;
37    }
38    mpq_hash GetHashEntry(const char* Filename) {
39        uint32 index = HashString(Filename, 0);
40        index &= mpq_a.header->hashtablesize - 1;
41        uint32 name1 = HashString(Filename, 0x100);
42        uint32 name2 = HashString(Filename, 0x200);
43
44        for(uint32 i = index; i < mpq_a.header->hashtablesize; ++i) {
45            mpq_hash hash = mpq_a.hashtable[i];
46            if (hash.name1 == name1 && hash.name2 == name2) return hash;
47        }
48
49        mpq_hash nullhash;
50        nullhash.blockindex = 0xFFFFFFFF;
51        return nullhash;
52    }
53
54    void GetFileListTo(vector<string>& filelist) {
55        mpq_hash hash = GetHashEntry("(listfile)");
56        uint32 blockindex = hash.blockindex;
57
58        if ((blockindex == 0xFFFFFFFF) || (blockindex == 0))
59            return;
60
61        uint32 size = libmpq_file_info(&mpq_a, LIBMPQ_FILE_UNCOMPRESSED_SIZE, blockindex);
62        char *buffer = new char[size];
63
64        libmpq_file_getdata(&mpq_a, hash, blockindex, (unsigned char*)buffer);
65
66        char seps[] = "\n";
67        char *token;
68
69        token = strtok( buffer, seps );
70        uint32 counter = 0;
71        while ((token != NULL) && (counter < size)) {
72            //cout << token << endl;
73            token[strlen(token) - 1] = 0;
74            string s = token;
75            filelist.push_back(s);
76            counter += strlen(token) + 2;
77            token = strtok(NULL, seps);
78        }
79
80        delete[] buffer;
81    }
82};
83typedef std::deque<MPQArchive*> ArchiveSet;
84
85class MPQFile
86{
87    //MPQHANDLE handle;
88    bool eof;
89    char *buffer;
90    size_t pointer,size;
91
92    // disable copying
93    MPQFile(const MPQFile &f) {}
94    void operator=(const MPQFile &f) {}
95
96public:
97    MPQFile(const char* filename);    // filenames are not case sensitive
98    ~MPQFile() { close(); }
99    size_t read(void* dest, size_t bytes);
100    size_t getSize() { return size; }
101    size_t getPos() { return pointer; }
102    char* getBuffer() { return buffer; }
103    char* getPointer() { return buffer + pointer; }
104    bool isEof() { return eof; }
105    void seek(int offset);
106    void seekRelative(int offset);
107    void close();
108};
109
110inline void flipcc(char *fcc)
111{
112    char t;
113    t=fcc[0];
114    fcc[0]=fcc[3];
115    fcc[3]=t;
116    t=fcc[1];
117    fcc[1]=fcc[2];
118    fcc[2]=t;
119}
120
121#endif
Note: See TracBrowser for help on using the browser.