home *** CD-ROM | disk | FTP | other *** search
- #include "stdafx.h"
- #include "ArchiverManager.h"
-
- CArchiverManager::CArchiverManager()
- {
- m_pad=NULL;
- m_iArchiverCount=0;
- }
-
- CArchiveDescription *CArchiverManager::FindArchiveDescriptionForExt(char *ext,int &iPrevIdx)
- {
- for(int i=iPrevIdx;i<m_iArchiverCount;i++)
- {
- LPCSTR lp=m_pad[i].String(EXTENSION_IDX);
- if(lp)
- for(int l=0;l=lstrlen(lp);lp+=l+1)
- if(!stricmp(lp,ext))
- {
- iPrevIdx=i;
- return &m_pad[i];
- }
- }
- iPrevIdx=0;
- return NULL;
- }
-
- BOOL CArchiverManager::CheckArchiveID(char *szArcPath,CArchiveDescription *pad)
- {
- BOOL bRet=FALSE;
- HANDLE hFile=CreateFile(szArcPath,GENERIC_READ,FILE_SHARE_WRITE,0,OPEN_EXISTING,0,0);
- if(hFile != INVALID_HANDLE_VALUE)
- {
- if(SetFilePointer(hFile,pad->IDPos(),0,pad->IDAtEnd()?FILE_END:FILE_BEGIN)!=0xffffffff)
- {
- LPBYTE lpBuff=new BYTE[pad->IDSize()];
- if(lpBuff)
- {
- DWORD dwReaded=0;
-
- if(ReadFile(hFile,lpBuff,pad->IDSize(),&dwReaded,0) && dwReaded==pad->IDSize())
- {
- if(!memcmp(lpBuff,pad->GetID(),pad->IDSize()))
- bRet=TRUE;
- }
- delete[] lpBuff;
- }
- }
- CloseHandle(hFile);
- }
- return bRet;
- }
-
- CArchiverEngine *CArchiverManager::OpenArchive(tOpenArchiveData* ArchiveData,BOOL bCreate)
- {
- char szExt[_MAX_EXT];
- _splitpath(ArchiveData->ArcName,0,0,0,szExt);
- int iPrevIdx=0;
- CArchiveDescription *pad=NULL;
-
- while(pad=FindArchiveDescriptionForExt(szExt+1,iPrevIdx))
- {
- if(bCreate || CheckArchiveID(ArchiveData->ArcName,pad))
- break;
- iPrevIdx++;
- }
-
- CArchiverEngine *engine=NULL;
- if(pad)
- {
- engine=new CArchiverEngine(pad,ArchiveData,bCreate);
- ArchiveData->OpenResult=0;
- }
- else
- ArchiveData->OpenResult=E_BAD_ARCHIVE;
-
- return engine;
- }
-
- int CArchiverManager::CloseArchive(CArchiverEngine *ae)
- {
- if(!ae)
- return E_ECLOSE;
-
- if(!ae->OnClose())
- return E_ECLOSE;
-
- delete ae;
- return 0;
- }
-