home *** CD-ROM | disk | FTP | other *** search
/ Chip 2002 June / Chip_2002-06_cd1.bin / zkuste / wincom / download / mltwcx.1.0.0.8-src.cab / mltwcx-src / ArchiverManager.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  2000-12-16  |  1.9 KB  |  90 lines

  1. #include "stdafx.h"
  2. #include "ArchiverManager.h"
  3.  
  4. CArchiverManager::CArchiverManager()
  5. {
  6.     m_pad=NULL;
  7.     m_iArchiverCount=0;
  8. }
  9.  
  10. CArchiveDescription *CArchiverManager::FindArchiveDescriptionForExt(char *ext,int &iPrevIdx)
  11. {
  12.     for(int i=iPrevIdx;i<m_iArchiverCount;i++)
  13.     {
  14.         LPCSTR lp=m_pad[i].String(EXTENSION_IDX);
  15.         if(lp)
  16.             for(int l=0;l=lstrlen(lp);lp+=l+1)
  17.                 if(!stricmp(lp,ext))
  18.                 {
  19.                     iPrevIdx=i;
  20.                     return &m_pad[i];
  21.                 }
  22.     }
  23.     iPrevIdx=0;
  24.     return NULL;
  25. }
  26.  
  27. BOOL CArchiverManager::CheckArchiveID(char *szArcPath,CArchiveDescription *pad)
  28. {
  29.     BOOL bRet=FALSE;
  30.     HANDLE hFile=CreateFile(szArcPath,GENERIC_READ,FILE_SHARE_WRITE,0,OPEN_EXISTING,0,0);
  31.     if(hFile != INVALID_HANDLE_VALUE)
  32.     {
  33.         if(SetFilePointer(hFile,pad->IDPos(),0,pad->IDAtEnd()?FILE_END:FILE_BEGIN)!=0xffffffff)
  34.         {
  35.             LPBYTE lpBuff=new BYTE[pad->IDSize()];
  36.             if(lpBuff)
  37.             {
  38.                 DWORD dwReaded=0;
  39.  
  40.                 if(ReadFile(hFile,lpBuff,pad->IDSize(),&dwReaded,0) && dwReaded==pad->IDSize())
  41.                 {
  42.                     if(!memcmp(lpBuff,pad->GetID(),pad->IDSize()))
  43.                         bRet=TRUE;
  44.                 }
  45.                 delete[] lpBuff;
  46.             }
  47.         }
  48.         CloseHandle(hFile);
  49.     }
  50.     return bRet;
  51. }
  52.  
  53. CArchiverEngine *CArchiverManager::OpenArchive(tOpenArchiveData* ArchiveData,BOOL bCreate)
  54. {
  55.     char szExt[_MAX_EXT];
  56.     _splitpath(ArchiveData->ArcName,0,0,0,szExt);
  57.     int iPrevIdx=0;
  58.     CArchiveDescription *pad=NULL;
  59.     
  60.     while(pad=FindArchiveDescriptionForExt(szExt+1,iPrevIdx))
  61.     {
  62.         if(bCreate || CheckArchiveID(ArchiveData->ArcName,pad))
  63.             break;
  64.         iPrevIdx++;
  65.     }
  66.     
  67.     CArchiverEngine *engine=NULL;
  68.     if(pad)
  69.     {
  70.         engine=new CArchiverEngine(pad,ArchiveData,bCreate);
  71.         ArchiveData->OpenResult=0;
  72.     }
  73.     else
  74.         ArchiveData->OpenResult=E_BAD_ARCHIVE;
  75.  
  76.     return engine;
  77. }
  78.  
  79. int CArchiverManager::CloseArchive(CArchiverEngine *ae)
  80. {
  81.     if(!ae)
  82.         return E_ECLOSE;
  83.  
  84.     if(!ae->OnClose())
  85.         return E_ECLOSE;
  86.  
  87.     delete ae;
  88.     return 0;
  89. }
  90.