Subversion Repositories AndroidProjects

Rev

Blame | Last modification | View Log | RSS feed

#ifndef __PAKINTERFACE_H__
#define __PAKINTERFACE_H__

#include <map>
#include <list>
#include <string>

#define WIN32_LEAN_AND_MEAN
#include <windows.h>

class PakCollection;

class PakRecord
{
public:
        PakCollection*                  mCollection;
        std::string                             mFileName;
        FILETIME                                mFileTime;
        int                                             mStartPos;
        int                                             mSize; 
};

typedef std::map<std::string, PakRecord> PakRecordMap;

class PakCollection
{
public:
        HANDLE                                  mFileHandle;
        HANDLE                                  mMappingHandle;
        void*                                   mDataPtr;
};

typedef std::list<PakCollection> PakCollectionList;

struct PFILE
{
        PakRecord*                              mRecord;
        int                                             mPos;
        FILE*                                   mFP;
};

struct PFindData
{
        HANDLE                                  mWHandle;
        std::string                             mLastFind;
        std::string                             mFindCriteria;
};

class PakInterfaceBase
{
public:
        virtual PFILE*                  FOpen(const char* theFileName, const char* theAccess) = 0;
        virtual PFILE*                  FOpen(const wchar_t* theFileName, const wchar_t* theAccess) { return NULL; }
        virtual int                             FClose(PFILE* theFile) = 0;
        virtual int                             FSeek(PFILE* theFile, long theOffset, int theOrigin) = 0;
        virtual int                             FTell(PFILE* theFile) = 0;
        virtual size_t                  FRead(void* thePtr, int theElemSize, int theCount, PFILE* theFile) = 0;
        virtual int                             FGetC(PFILE* theFile) = 0;
        virtual int                             UnGetC(int theChar, PFILE* theFile) = 0;
        virtual char*                   FGetS(char* thePtr, int theSize, PFILE* theFile) = 0;
        virtual wchar_t*                FGetS(wchar_t* thePtr, int theSize, PFILE* theFile) { return thePtr; }
        virtual int                             FEof(PFILE* theFile) = 0;

        virtual HANDLE                  FindFirstFile(LPCTSTR lpFileName, LPWIN32_FIND_DATA lpFindFileData) = 0;       
        virtual BOOL                    FindNextFile(HANDLE hFindFile, LPWIN32_FIND_DATA lpFindFileData) = 0;
        virtual BOOL                    FindClose(HANDLE hFindFile) = 0;
};

class PakInterface : public PakInterfaceBase
{
public:
        PakCollectionList               mPakCollectionList;    
        PakRecordMap                    mPakRecordMap;

public:
        bool                                    PFindNext(PFindData* theFindData, LPWIN32_FIND_DATA lpFindFileData);

public:
        PakInterface();
        ~PakInterface();

        bool                                    AddPakFile(const std::string& theFileName);
        PFILE*                                  FOpen(const char* theFileName, const char* theAccess);
        int                                             FClose(PFILE* theFile);
        int                                             FSeek(PFILE* theFile, long theOffset, int theOrigin);
        int                                             FTell(PFILE* theFile);
        size_t                                  FRead(void* thePtr, int theElemSize, int theCount, PFILE* theFile);
        int                                             FGetC(PFILE* theFile);
        int                                             UnGetC(int theChar, PFILE* theFile);
        char*                                   FGetS(char* thePtr, int theSize, PFILE* theFile);
        int                                             FEof(PFILE* theFile);

        HANDLE                                  FindFirstFile(LPCTSTR lpFileName, LPWIN32_FIND_DATA lpFindFileData);
        BOOL                                    FindNextFile(HANDLE hFindFile, LPWIN32_FIND_DATA lpFindFileData);
        BOOL                                    FindClose(HANDLE hFindFile);
};

extern PakInterface* gPakInterface;

static HANDLE gPakFileMapping = NULL;
static PakInterfaceBase** gPakInterfaceP = NULL;

static PakInterfaceBase* GetPakPtr()
{
        if (gPakFileMapping == NULL)
        {
                char aName[256];
                sprintf(aName, "gPakInterfaceP_%d", GetCurrentProcessId());
                gPakFileMapping = ::CreateFileMappingA((HANDLE)INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, sizeof(PakInterface*), aName);
                gPakInterfaceP = (PakInterfaceBase**) MapViewOfFile(gPakFileMapping, FILE_MAP_ALL_ACCESS, 0, 0, sizeof(PakInterface*));        
        }
        return *gPakInterfaceP;
}

static PFILE* p_fopen(const char* theFileName, const char* theAccess)
{
        if (GetPakPtr() != NULL)
                return (*gPakInterfaceP)->FOpen(theFileName, theAccess);       
        FILE* aFP = fopen(theFileName, theAccess);
        if (aFP == NULL)
                return NULL;
        PFILE* aPFile = new PFILE();
        aPFile->mRecord = NULL;
        aPFile->mPos = 0;
        aPFile->mFP = aFP;
        return aPFile;
}

static PFILE* p_fopen(const wchar_t* theFileName, const wchar_t* theAccess)
{
        if (GetPakPtr() != NULL)
                return (*gPakInterfaceP)->FOpen(theFileName, theAccess);       
        FILE* aFP = _wfopen(theFileName, theAccess);
        if (aFP == NULL)
                return NULL;
        PFILE* aPFile = new PFILE();
        aPFile->mRecord = NULL;
        aPFile->mPos = 0;
        aPFile->mFP = aFP;
        return aPFile;
}

static int p_fclose(PFILE* theFile)
{
        if (GetPakPtr() != NULL)
                return (*gPakInterfaceP)->FClose(theFile);
        int aResult = fclose(theFile->mFP);
        delete theFile;
        return aResult;
}

static int p_fseek(PFILE* theFile, long theOffset, int theOrigin)
{
        if (GetPakPtr() != NULL)
                return (*gPakInterfaceP)->FSeek(theFile, theOffset, theOrigin);
        return fseek(theFile->mFP, theOffset, theOrigin);
}

static int p_ftell(PFILE* theFile)
{
        if (GetPakPtr() != NULL)
                return (*gPakInterfaceP)->FTell(theFile);
        return ftell(theFile->mFP);
}

static size_t p_fread(void* thePtr, int theSize, int theCount, PFILE* theFile)
{
        if (GetPakPtr() != NULL)
                return (*gPakInterfaceP)->FRead(thePtr, theSize, theCount, theFile);
        return fread(thePtr, theSize, theCount, theFile->mFP);
}

static size_t p_fwrite(const void* thePtr, int theSize, int theCount, PFILE* theFile)
{      
        if (theFile->mFP == NULL)
                return 0;
        return fwrite(thePtr, theSize, theCount, theFile->mFP);
}

static int p_fgetc(PFILE* theFile)
{
        if (GetPakPtr() != NULL)
                return (*gPakInterfaceP)->FGetC(theFile);
        return fgetc(theFile->mFP);
}

static int p_ungetc(int theChar, PFILE* theFile)
{
        if (GetPakPtr() != NULL)
                return (*gPakInterfaceP)->UnGetC(theChar, theFile);
        return ungetc(theChar, theFile->mFP);
}

static char* p_fgets(char* thePtr, int theSize, PFILE* theFile)
{
        if (GetPakPtr() != NULL)
                return (*gPakInterfaceP)->FGetS(thePtr, theSize, theFile);
        return fgets(thePtr, theSize, theFile->mFP);
}

static wchar_t* p_fgets(wchar_t* thePtr, int theSize, PFILE* theFile)
{
        if (GetPakPtr() != NULL)
                return (*gPakInterfaceP)->FGetS(thePtr, theSize, theFile);
        return fgetws(thePtr, theSize, theFile->mFP);
}

static int p_feof(PFILE* theFile)
{
        if (GetPakPtr() != NULL)
                return (*gPakInterfaceP)->FEof(theFile);
        return feof(theFile->mFP);
}

static HANDLE p_FindFirstFile(LPCTSTR lpFileName, LPWIN32_FIND_DATA lpFindFileData)
{
        if (GetPakPtr() != NULL)
                return (*gPakInterfaceP)->FindFirstFile(lpFileName, lpFindFileData);
        return FindFirstFile(lpFileName, lpFindFileData);
}

static BOOL p_FindNextFile(HANDLE hFindFile, LPWIN32_FIND_DATA lpFindFileData)
{
        if (GetPakPtr() != NULL)
                return (*gPakInterfaceP)->FindNextFile(hFindFile, lpFindFileData);
        return FindNextFile(hFindFile, lpFindFileData);
}

static BOOL p_FindClose(HANDLE hFindFile)
{
        if (GetPakPtr() != NULL)
                return (*gPakInterfaceP)->FindClose(hFindFile);
        return FindClose(hFindFile);
}


#endif //__PAKINTERFACE_H__