adfwrapper.h
上传用户:hy_wanghao
上传日期:2007-01-08
资源大小:279k
文件大小:13k
源码类别:

Shell编程

开发平台:

Visual C++

  1. #if !defined(AFX_ADFWRAPPER_H__20001226_7276_AC4A_215B_0080AD509054__INCLUDED_)
  2. #define AFX_ADFWRAPPER_H__20001226_7276_AC4A_215B_0080AD509054__INCLUDED_
  3. #pragma once
  4. //
  5. // These classes are C++ wrappers for the ADFlib (Amiga Disk File library).
  6. // ADFlib is developed by Laurent Cl関y.
  7. //
  8. // They do not extend the functionality of ADFlib in any way,
  9. // except that they give me: nice C++ classes, dtor cleanup,
  10. // more const-ness, Windows datatypes, MBCS and UNICODE compilation.
  11. //
  12. #ifndef __ATLBASE_H__
  13.   #error adfwrappers.h requires atlbase.h to be included first
  14. #endif
  15. #ifdef _DEBUG
  16. #pragma comment(lib, "adflib\libs\adfdbg.lib")
  17. #else
  18. #pragma comment(lib, "adflib\libs\adf.lib")
  19. #endif
  20. #include "adflibincludeadflib.h"
  21. extern "C" {
  22.    #include "adflibincludeadf_util.h"
  23.    #include "adflibincludeadf_dir.h"
  24.    #include "adflibincludeWin32adf_nativ.h"
  25. }
  26. extern "C" struct Env adfEnv;
  27. class CAdfDevice;
  28. class CAdfVolume;
  29. class CAdfFile;
  30. class CAdfDirList;
  31. class CAdfDelList;
  32. class CAdf
  33. {
  34. public:
  35.    CAdf()
  36.    {
  37.       // System initialize...
  38.       adfEnvInitDefault();
  39.       // Use the dir cache blocks
  40.       BOOL boolPr = TRUE;
  41.       adfChgEnvProp(PR_USEDIRC, (void*)&boolPr);   
  42.       // Need to set callbacks to prevent Console output
  43.       adfSetEnvFct(ADFError, ADFWarning, ADFVerbose);
  44.       adfEnv.rwhAccess = ADFAccess;
  45.       adfEnv.progressBar = ADFProgress;
  46.       adfEnv.useRWAccess = TRUE;
  47.       adfEnv.useProgressBar = TRUE;
  48.       adfEnv.useDirCache = FALSE;
  49.    }
  50.    virtual ~CAdf()
  51.    {
  52.       // Shutdown ADF system
  53.       adfEnvCleanUp();
  54.    }
  55.    LPCSTR GetVersionNumber() { return adfGetVersionNumber(); };
  56.    LPCSTR GetVersionDate() { return adfGetVersionDate(); };
  57.    BOOL IsSilent() const { return m_bSilent; };
  58.    void SetSilent(BOOL bSilent) { m_bSilent = bSilent; };
  59. // Attributes
  60. private:
  61.    static BOOL m_bSilent; // Supress error/warnings?
  62.                           // Needs to be static because it's used by the callbacks.
  63. // Callbacks
  64. private:
  65.    static VOID ADFError(char *strMessage)
  66.    {
  67.       USES_CONVERSION;
  68.       if( !m_bSilent ) ::MessageBox(NULL, A2CT(strMessage), NULL, MB_OK | MB_ICONERROR);
  69.    }
  70.    static VOID ADFWarning(char *strMessage)
  71.    {
  72.       strMessage;
  73. #ifdef _DEBUG
  74.       USES_CONVERSION;
  75.       if( !m_bSilent ) ::MessageBox(NULL, A2CT(strMessage), _T("Warning"), MB_OK | MB_ICONWARNING);
  76. #endif
  77.    }
  78.    static VOID ADFVerbose(char *strMessage)
  79.    {
  80.       strMessage;
  81. #ifdef _DEBUG
  82.       USES_CONVERSION;
  83.       if( !m_bSilent ) ::MessageBox(NULL, A2CT(strMessage), _T("Verbose Warning"), MB_OK | MB_ICONINFORMATION);
  84. #endif
  85.    }
  86.    static VOID ADFAccess(SECTNUM physical, SECTNUM logical, BOOL write)
  87.    {
  88.       physical;
  89.       logical;
  90.       write;
  91.    }
  92.    static VOID ADFProgress(int perCentDone)
  93.    {
  94.       perCentDone;
  95.    }
  96. };
  97. __declspec(selectany) BOOL CAdf::m_bSilent = FALSE;
  98. class CAdfFile
  99. {
  100. friend CAdfVolume;
  101. protected:
  102.    File *m_file;
  103. public:
  104.    CAdfFile()
  105.    {
  106.       m_file = NULL;
  107.    }
  108.    virtual ~CAdfFile()
  109.    {
  110.       if( m_file!=NULL ) adfCloseFile(m_file);
  111.    }
  112.    BOOL IsOpen() const { return m_file!=NULL; };
  113.    UINT GetType() const { return m_file->fileHdr->secType; };
  114.    
  115.    BOOL IsDirectory() const { return _IsDirectory(GetType()); };
  116.    
  117.    BOOL IsLink() const { return _IsLink(GetType()); };
  118.    ULONG Read(LPVOID pv, ULONG cb)
  119.    {
  120.       return (ULONG)adfReadFile(m_file, cb, (unsigned char *)pv);
  121.    }
  122.    ULONG Write(LPCVOID pv, ULONG cb)
  123.    {
  124.       return (ULONG)adfWriteFile(m_file, cb, (unsigned char *)pv);
  125.    }
  126.    BOOL Eof()
  127.    {
  128.       return adfEndOfFile(m_file);
  129.    }
  130.    BOOL Seek(DWORD dwPos)
  131.    {
  132.       adfFileSeek(m_file, dwPos);
  133.       return TRUE; // Erh?
  134.    }
  135.    DWORD GetPos() const
  136.    {
  137.       return m_file->pos;
  138.    }
  139.    DWORD GetAccess() const
  140.    {
  141.       return m_file->fileHdr->access;
  142.    }
  143.    static void ConvertAccess(DWORD dwAccess, LPTSTR pstrAccess)
  144.    {
  145.       USES_CONVERSION;
  146.       _tcscpy( pstrAccess, A2CT(adfAccess2String(dwAccess)) );
  147.    }
  148.    FILETIME GetFileTime()
  149.    {
  150.       int y,m,d;
  151.       adfDays2Date(m_file->fileHdr->days, &y, &m, &d);
  152.       SYSTEMTIME st;
  153.       st.wYear = (WORD)y;
  154.       st.wMonth = (WORD)m;
  155.       st.wDay = (WORD)d;
  156.       st.wHour = (WORD)((m_file->fileHdr->mins / 60)+1);
  157.       st.wMinute = (WORD)((m_file->fileHdr->mins % 60)+1);
  158.       st.wSecond = (WORD)((m_file->fileHdr->ticks / 50));
  159.       FILETIME ft;
  160.       ::SystemTimeToFileTime(&st, &ft);
  161.       FILETIME ftLocal;
  162.       ::FileTimeToLocalFileTime(&ft, &ftLocal);
  163.       return ftLocal;
  164.    }
  165.    void Flush()
  166.    {
  167.       adfFlushFile(m_file);
  168.    }
  169.    void Close()
  170.    {
  171.       adfCloseFile(m_file);
  172.       m_file = NULL;
  173.    }
  174.    void GetName(LPTSTR pstrName, UINT cbChars)
  175.    {
  176.       USES_CONVERSION;
  177.       cbChars--;
  178.       _tcsncpy( pstrName, m_file->fileHdr->fileName==NULL ? _T("") : A2CT(m_file->fileHdr->fileName), cbChars);
  179.       if( m_file->fileHdr->nameLen < (int)cbChars ) cbChars = (UINT)m_file->fileHdr->nameLen;
  180.       pstrName[cbChars] = _T('');
  181.    }
  182.    DWORD GetSize() const
  183.    {
  184.       return m_file->fileHdr->byteSize;
  185.    }
  186.    DWORD GetActualSize(DWORD dwDataBlockSize=LOGICAL_BLOCK_SIZE)
  187.    {
  188.       return _CalcBlocksNeeded(GetSize(), dwDataBlockSize);
  189.    }
  190.    static DWORD _CalcBlocksNeeded(DWORD dwFileSize, DWORD dwDataBlockSize=LOGICAL_BLOCK_SIZE)
  191.    {
  192.       return (DWORD)adfFileRealSize(dwFileSize, dwDataBlockSize, NULL, NULL);
  193.    }
  194.    static BOOL _IsDirectory(DWORD dwAccess)
  195.    {
  196.       return dwAccess==ST_DIR || dwAccess==ST_LDIR;
  197.    }
  198.    static BOOL _IsLink(DWORD dwAccess)
  199.    {
  200.       return dwAccess==ST_LDIR || dwAccess==ST_LFILE || dwAccess==ST_LSOFT;
  201.    }
  202. };
  203. class CAdfDirList
  204. {
  205. friend CAdfVolume;
  206. protected:
  207.    List *m_list;
  208. public:
  209.    CAdfDirList()
  210.    {
  211.       m_list = NULL;
  212.    }
  213.    virtual ~CAdfDirList()
  214.    {
  215.       if( m_list!=NULL ) adfFreeDirList(m_list);
  216.    }
  217.    operator List *() const
  218.    {
  219.       return m_list;
  220.    };
  221. };
  222. class CAdfDelList
  223. {
  224. friend CAdfVolume;
  225. protected:
  226.    List *m_list;
  227. public:
  228.    CAdfDelList()
  229.    {
  230.       m_list = NULL;
  231.    }
  232.    virtual ~CAdfDelList()
  233.    {
  234.       if( m_list!=NULL ) adfFreeDelList(m_list);
  235.    }
  236.    operator List *() const
  237.    {
  238.       return m_list;
  239.    };
  240. };
  241. class CAdfVolume
  242. {
  243. friend CAdfDevice;
  244. protected:
  245.    Volume *m_vol;
  246. public:
  247.    CAdfVolume()
  248.    {
  249.       m_vol = NULL;
  250.    }
  251.    virtual ~CAdfVolume()
  252.    {
  253.       if( m_vol!=NULL ) adfUnMount(m_vol);
  254.    }
  255.    BOOL IsOpen() const { return m_vol!=NULL; };
  256.    void GetName(LPTSTR pstrName, UINT cbChars)
  257.    {
  258.       USES_CONVERSION;
  259.       cbChars--;
  260.       _tcsncpy( pstrName, m_vol->volName==NULL ? _T("") : A2CT(m_vol->volName), cbChars);
  261.       pstrName[cbChars] = _T('');
  262.    }
  263.    
  264.    SECTNUM GetDirectoryPtr() const { return m_vol->curDirPtr; };
  265.    
  266.    SECTNUM GetFirstBlock() const { return m_vol->firstBlock; };
  267.    
  268.    SECTNUM GetLastBlock() const { return m_vol->lastBlock; };
  269.    
  270.    SECTNUM GetRootBlock() const { return m_vol->rootBlock; };
  271.    
  272.    DWORD GetDataBlockSize() const { return m_vol->datablockSize; };
  273.    
  274.    DWORD GetFreeBlockCount() { return adfCountFreeBlocks(m_vol); };
  275.    
  276.    BOOL IsBootable() const { return m_vol->bootCode; };
  277.    
  278.    BOOL IsReadOnly() const { return m_vol->readOnly; };
  279.    
  280.    int GetDOSType() const { return (int)(m_vol->dosType); };
  281.    BOOL GetFile(LPCTSTR pstrFileName, LPCTSTR pstrAccess, CAdfFile &AmigaFile)
  282.    {
  283.       USES_CONVERSION;
  284.       
  285.       File * file = adfOpenFile(m_vol, 
  286.          T2A(const_cast<LPTSTR>(pstrFileName)), 
  287.          T2A(const_cast<LPTSTR>(pstrAccess)));
  288.       if( file==NULL ) return FALSE;
  289.       AmigaFile.m_file = file;
  290.       return TRUE;
  291.    }
  292.    BOOL CreateDirectory(SECTNUM nSector, LPCTSTR pstrName)
  293.    {
  294.       USES_CONVERSION;
  295.       return adfCreateDir(m_vol, nSector, T2A(const_cast<LPTSTR>(pstrName)))==RC_OK;
  296.    }
  297.    BOOL GetDirctory(SECTNUM nSector, CAdfDirList &DirList)
  298.    {
  299.       List *dir = adfGetDirEnt(m_vol, nSector);
  300.       if( dir==NULL ) return TRUE;   // Empty?
  301.       DirList.m_list = dir;
  302.       return TRUE;
  303.    }
  304.    
  305.    BOOL GetCurrentDirctory(CAdfDirList &DirList)
  306.    {
  307.       return GetDirctory(GetDirectoryPtr(), DirList);
  308.    }
  309.    BOOL ChangeDirectoryParent()
  310.    {
  311.       return( adfParentDir(m_vol)==RC_OK );
  312.    }
  313.    BOOL ChangeDirectory(LPCTSTR pstrPath)
  314.    {
  315.       USES_CONVERSION;
  316.       if( *pstrPath==_T('') ) return TRUE;
  317.       // In the case where only one subdir is requested we just pass
  318.       // the value.
  319.       // This is the only type ADFlib supports.
  320.       if( *pstrPath!=_T('/') ) return adfChangeDir(m_vol, T2A(const_cast<LPTSTR>(pstrPath)))==RC_OK;
  321.       // If a complete path is given, we need to do the parsing
  322.       // ourselves! So start by going to root dir..
  323.       pstrPath++;
  324.       adfToRootDir(m_vol);
  325.       // then parse remaining sub-dirs
  326.       LPTSTR p;
  327.       while( (p = _tcschr(pstrPath, _T('/')))!=NULL ) {
  328.          TCHAR szPath[MAXNAMELEN+1];
  329.          int size = p - pstrPath;
  330.          _tcsncpy( szPath, pstrPath, size);
  331.          szPath[ size ] = _T('');
  332.          if( adfChangeDir(m_vol, T2A(szPath))!=RC_OK ) return FALSE;
  333.          pstrPath = p+1;
  334.       }
  335.       if( *pstrPath!=_T('') ) {
  336.          return adfChangeDir(m_vol, T2A(const_cast<LPTSTR>(pstrPath)))==RC_OK;
  337.       }
  338.       return TRUE;
  339.    }
  340.    BOOL GetDeletedEntries(CAdfDelList &DelList)
  341.    {
  342.       List *dir = adfGetDelEnt(m_vol);
  343.       if( dir==NULL ) return TRUE;   // Empty?
  344.       DelList.m_list = dir;
  345.       return TRUE;
  346.    }
  347.    BOOL CheckDeletedFile(SECTNUM nSector, int nLevel=0)
  348.    {
  349.       return adfCheckEntry(m_vol, nSector, nLevel)==RC_OK;
  350.    }
  351.    BOOL UndeleteFile(SECTNUM nParentSector, SECTNUM nSector)
  352.    {
  353.       return adfUndelEntry(m_vol, nParentSector, nSector)==RC_OK;
  354.    }
  355.    BOOL SetFileAccess(LPCTSTR pstrName, SECTNUM nSector, DWORD dwAccess)
  356.    {
  357.       USES_CONVERSION;
  358.       return adfSetEntryAccess(m_vol,  nSector, T2A(const_cast<LPTSTR>(pstrName)), (long)dwAccess)==RC_OK;
  359.    }
  360.    BOOL SetFileComment(LPCTSTR pstrName, SECTNUM nSector, LPCTSTR pstrComment)
  361.    {
  362.       USES_CONVERSION;
  363.       return adfSetEntryComment(m_vol, nSector, T2A(const_cast<LPTSTR>(pstrName)), T2A(const_cast<LPTSTR>(pstrComment)))==RC_OK;
  364.    }
  365.    BOOL Rename(SECTNUM nOldSector, LPCTSTR pstrOldName,
  366.                SECTNUM nNewSector, LPCTSTR pstrNewName)
  367.    {
  368.       USES_CONVERSION;
  369.       return adfRenameEntry(m_vol, 
  370.                             nOldSector, T2A(const_cast<LPTSTR>(pstrOldName)), 
  371.                             nNewSector, T2A(const_cast<LPTSTR>(pstrNewName)))==RC_OK;
  372.    }
  373.    BOOL Delete(SECTNUM nParentSector, LPCTSTR pstrName)
  374.    {
  375.       USES_CONVERSION;
  376.       return adfRemoveEntry(m_vol, nParentSector, T2A(const_cast<LPTSTR>(pstrName)))==RC_OK;
  377.    }
  378. };
  379. class CAdfDevice
  380. {
  381. protected:
  382.    Device *m_dev;
  383. public:
  384.    CAdfDevice()
  385.    {
  386.       m_dev = NULL;
  387.    }
  388.    virtual ~CAdfDevice()
  389.    {
  390.       if( m_dev!=NULL ) adfUnMountDev(m_dev);
  391.    }
  392.    static BOOL _IsNativeDevice(LPCTSTR pstrDeviceName)
  393.    {
  394.       USES_CONVERSION;
  395.       nativeFunctions *nFct = (struct nativeFunctions *)adfEnv.nativeFct;
  396.       return (*nFct->adfIsDevNative)(T2A(const_cast<LPTSTR>(pstrDeviceName)));
  397.    }
  398.    BOOL IsOpen() const { return m_dev!=NULL; };
  399.    BOOL Open(LPCTSTR pstrFileName, BOOL bReadOnly=FALSE)
  400.    {
  401.       USES_CONVERSION;
  402.       m_dev = adfMountDev(T2A(const_cast<LPTSTR>(pstrFileName)), bReadOnly);
  403.       if( m_dev==NULL ) return FALSE;
  404.       switch( m_dev->devType ) {
  405.       case DEVTYPE_FLOPDD:
  406.       case DEVTYPE_FLOPHD:
  407.       case DEVTYPE_HARDDISK:
  408.       case DEVTYPE_HARDFILE:
  409.          break;
  410.       case -1:
  411.          // Invalid device read! ADFlib will crash on adfUnMountDev()
  412.          // BUG: Causes memory-leak.
  413.          m_dev = NULL;
  414.          return FALSE;
  415.       }
  416.       return TRUE;
  417.    }
  418.    
  419.    BOOL Close()
  420.    {
  421.       if( m_dev==NULL ) return TRUE;
  422.       adfUnMountDev(m_dev);
  423.       return TRUE;
  424.    }
  425.    UINT GetType() const { return m_dev->devType; };
  426.    
  427.    BOOL IsReadOnly() const { return m_dev->readOnly; };
  428.    
  429.    DWORD GetDiskSize() const { return m_dev->size; };
  430.    
  431.    DWORD GetPartitionCount() const { return m_dev->nVol; };
  432.    BOOL Mount(DWORD nPartition, BOOL bReadOnly, CAdfVolume &volume)
  433.    {
  434.       Volume *vol = adfMount(m_dev, (int)nPartition, bReadOnly);
  435.       if( vol==NULL ) return FALSE;      
  436.       volume.m_vol = vol;
  437.       return TRUE;
  438.    }
  439. };
  440. #endif // !defined(AFX_ADFWRAPPER_H__20001226_7276_AC4A_215B_0080AD509054__INCLUDED_)