Main Page | Modules | Namespace List | Class Hierarchy | Alphabetical List | Class List | File List | Class Members | File Members | Related Pages

ctfilesystem2.h

Go to the documentation of this file.
00001 /*************************************************************************** 00002 $RCSfile: ctfilesystem2.h,v $ 00003 ------------------- 00004 cvs : $Id: ctfilesystem2.h,v 1.5 2003/04/24 01:43:29 aquamaniac Exp $ 00005 begin : Fri Aug 09 2002 00006 copyright : (C) 2002 by Martin Preuss 00007 email : martin@libchipcard.de 00008 00009 *************************************************************************** 00010 * * 00011 * This library is free software; you can redistribute it and/or * 00012 * modify it under the terms of the GNU Lesser General Public * 00013 * License as published by the Free Software Foundation; either * 00014 * version 2.1 of the License, or (at your option) any later version. * 00015 * * 00016 * This library is distributed in the hope that it will be useful, * 00017 * but WITHOUT ANY WARRANTY; without even the implied warranty of * 00018 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * 00019 * Lesser General Public License for more details. * 00020 * * 00021 * You should have received a copy of the GNU Lesser General Public * 00022 * License along with this library; if not, write to the Free Software * 00023 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, * 00024 * MA 02111-1307 USA * 00025 * * 00026 ***************************************************************************/ 00027 00028 00029 #ifndef CTFILESYSTEM2_H 00030 #define CTFILESYSTEM2_H 00031 00032 #ifdef CT_USE_ENCRYPTION 00033 /* FIXME: This is needed for GCC 3.2, because unistd.h and openssl/des.h have 00034 * different declarations concerning the exceptions to be thrown 00035 * without this you can not compile libchipcard on RedHat 8 systems. 00036 */ 00037 # define PERL5 00038 # include <openssl/des.h> 00039 # undef PERL5 00040 #endif 00041 00042 00043 #define CTFILESYSTEM_VERSION_MAJOR 1 00044 #define CTFILESYSTEM_VERSION_MINOR 0 00045 00050 #define CTFILESYSTEM_BASEBLOCKSIZE 32 00051 00058 #define CTFILESYSTEM_MAXSIZE (64*1024) 00059 00060 00061 #define CTFILESYSTEM_FAT_LENGTH 256 00062 00063 00064 #include <chipcard/ctmemorycard.h> 00065 #include <chipcard/ctdatacache.h> 00066 00067 00114 #ifndef DOXYGEN 00115 00118 class CHIPCARD_API CTBlockMedium: public CTMemoryCard { 00119 public: 00120 CTBlockMedium(const CTCard &c); 00121 virtual ~CTBlockMedium(); 00122 00123 virtual CTError readBlocks(int bn, int n, string &bl); 00124 virtual CTError writeBlocks(int bn, int n, const string &bl); 00125 virtual CTError mountMedium(); 00126 virtual CTError unmountMedium(); 00127 }; 00128 #endif 00129 00130 00131 00132 #ifndef DOXYGEN 00133 00136 class CHIPCARD_API CTCachedBlockMedium: public CTBlockMedium { 00137 private: 00138 CTDataCache<CTFILESYSTEM_MAXSIZE,32> _cache; 00139 public: 00140 CTCachedBlockMedium(const CTCard &c); 00141 virtual ~CTCachedBlockMedium(); 00142 00143 virtual CTError readBlocks(int bn, int n, string &bl); 00144 virtual CTError writeBlocks(int bn, int n, const string &bl); 00145 virtual int flush(int maxb=0x800000) throw (class CTError); 00146 virtual void purge(); 00147 virtual CTError mountMedium(); 00148 virtual CTError unmountMedium(); 00149 }; 00150 #endif 00151 00152 00153 #ifndef DOXYGEN 00154 00158 class CHIPCARD_API CTCryptedBlockMedium: public CTCachedBlockMedium { 00159 private: 00160 des_cblock _desKey1; 00161 des_cblock _desKey2; 00162 bool _desKeyIsValid; 00163 00164 protected: 00165 CTError crypt(bool encrypt, const string &src, string &dest); 00166 00167 public: 00168 CTCryptedBlockMedium(const CTCard &c); 00169 virtual ~CTCryptedBlockMedium(); 00170 00171 virtual CTError readBlocks(int bn, int n, string &bl, 00172 bool cr=false); 00173 virtual CTError writeBlocks(int bn, int n, const string &bl, 00174 bool cr=false); 00175 virtual CTError setPassword(const string &pw); 00176 virtual void clearPassword(); 00177 }; 00178 #endif 00179 00180 00181 00182 /* __________________________________________________________________________ 00183 * AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 00184 * CTSuperBlock 00185 * YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY 00186 */ 00187 00188 00189 #define CTFS_SUPERBLOCK_FLAG_CRYPTED 0x0001 00190 #define CTFS_SUPERBLOCK_FLAG_READONLY 0x0002 00191 00192 00199 class CHIPCARD_API CTSuperBlock { 00200 private: 00201 bool _changed; 00202 string _mediumName; 00203 int _blockSize; 00204 int _blocks; 00205 int _mediumSize; 00206 unsigned char _versionMajor; 00207 unsigned char _versionMinor; 00208 unsigned int _flags; 00209 int _reservedBlocks; 00210 int _firstDirBlock; 00211 string _userName; 00212 00213 CTError _fromString(const string &s); 00214 00215 public: 00220 CTSuperBlock(); 00224 CTSuperBlock(const string &block); 00225 00229 CTSuperBlock(unsigned int mediumSize); 00230 ~CTSuperBlock(); 00232 00242 const string mediumName() const { return _mediumName;}; 00243 00249 int mediumSize() { return _mediumSize;}; 00250 00256 unsigned char versionMajor() const { return _versionMajor;}; 00257 00264 unsigned char versionMinor() const { return _versionMinor;}; 00265 00269 bool isCrypted() const { return _flags & CTFS_SUPERBLOCK_FLAG_CRYPTED;}; 00270 00276 bool isReadOnly() const { return _flags & CTFS_SUPERBLOCK_FLAG_READONLY;}; 00278 00288 int blockSize() const { return _blockSize;}; 00289 00295 int blocks() const { return _blocks;}; 00297 00308 int reservedBlocks() const { return _reservedBlocks;}; 00309 00313 int firstDirBlock() const { return _firstDirBlock;}; 00314 00318 const string userName() const { return _userName;}; 00319 00323 bool changed() const { return _changed;}; 00325 00333 void setMediumName(const string &n) { _mediumName=n; _changed=true;}; 00334 00338 void setBlockSize(int n) { _blockSize=n; _changed=true;}; 00339 00343 void setBlocks(int n) { _blocks=n; _changed=true;}; 00344 00348 void setReservedBlocks(int i) { _reservedBlocks=i;}; 00349 00353 void setMediumSize(int n) { _mediumSize=n; _changed=true;}; 00354 00358 void setVersion(int mj, int mn) { 00359 _versionMajor=mj; 00360 _versionMinor=mn; 00361 _changed=true;}; 00362 00366 void setIsCrypted(bool b) { 00367 if (b) 00368 _flags|=CTFS_SUPERBLOCK_FLAG_CRYPTED; 00369 else 00370 _flags&=~CTFS_SUPERBLOCK_FLAG_CRYPTED; 00371 _changed=true;}; 00372 00376 void setIsReadOnly(bool b) { 00377 if (b) 00378 _flags|=CTFS_SUPERBLOCK_FLAG_READONLY; 00379 else 00380 _flags&=~CTFS_SUPERBLOCK_FLAG_READONLY; 00381 _changed=true;}; 00382 00386 void setFirstDirBlock(int i) { _firstDirBlock=i; _changed=true;}; 00387 00391 void setUserName(const string &n) { _userName=n; _changed=true;}; 00392 00396 void setChanged(bool b) { _changed=b;}; 00398 00406 string toString(); 00407 00411 string dump(); 00413 }; 00414 00415 00416 00417 00418 00419 /* __________________________________________________________________________ 00420 * AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 00421 * CTBlockManager 00422 * YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY 00423 */ 00424 00425 00426 #ifndef DOXYGEN 00427 00431 class CHIPCARD_API CTBlockManager { 00432 private: 00433 unsigned char _fat[CTFILESYSTEM_FAT_LENGTH]; 00434 int _blocks; 00435 bool _changed; 00436 00437 public: 00438 CTBlockManager(); 00439 CTBlockManager(int blocks, const string &fat=""); 00440 ~CTBlockManager(); 00441 00442 bool changed() const { return _changed;}; 00443 void setChanged(bool b) { _changed=b;}; 00444 00445 int allocateBlock(int bl=-1); 00446 void freeBlock(int bl); 00447 void freeChain(int bn); 00448 int blocks(int bl=-1); 00449 int freeBlocks(); 00450 int blockAt(int first, int idx); 00451 00452 int nextBlock(int bl); 00453 int previousBlock(int bl); 00454 int lastBlock(int bl); 00455 00456 string toString(); 00457 }; 00458 #endif // DOXYGEN 00459 00460 00461 /* __________________________________________________________________________ 00462 * AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 00463 * CTDataBlockMedium 00464 * YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY 00465 */ 00466 00467 00468 #ifndef DOXYGEN 00469 00474 class CHIPCARD_API CTDataBlockMedium: public CTCryptedBlockMedium { 00475 friend class CTFileBase; 00476 00477 private: 00478 int _firstDataBlock; 00479 CTSuperBlock _superBlock; 00480 CTBlockManager _blockManager; 00481 bool _isMounted; 00482 00483 CTError _createMedium(unsigned int mediumSize, 00484 const string &mediumname, 00485 const string &userName, 00486 const string &passwd); 00487 CTError _readFAT(); 00488 CTError _writeFAT(); 00489 CTError _readSuperBlock(); 00490 CTError _writeSuperBlock(); 00491 00492 protected: 00493 CTDataBlockMedium(const CTCard &c); 00494 public: 00495 virtual ~CTDataBlockMedium(); 00496 00497 virtual CTError readBlock(int bn, string &bl); 00498 virtual CTError writeBlock(int bn, const string &bl); 00499 virtual CTError allocateBlock(int &bn); 00500 virtual CTError freeBlock(int bn); 00501 virtual CTError freeChain(int bn); 00502 virtual CTError nextBlock(int &bn); 00503 const CTSuperBlock &superBlock() const { return _superBlock;}; 00504 virtual int blocks(int bl=-1); 00505 virtual int freeBlocks(); 00506 virtual int blockAt(int first, int idx); 00507 virtual int blockSize() const; 00508 virtual int firstDirBlock(); 00509 virtual CTError mountMedium(const string &username="", 00510 const string &passwd=""); 00511 virtual CTError unmountMedium(); 00512 virtual CTError createMedium(unsigned int mediumSize, 00513 const string &mediumname, 00514 const string &userName, 00515 const string &passwd); 00516 bool isReadOnly() const { return _superBlock.isReadOnly();}; 00517 void setReadOnly(bool b) { _superBlock.setIsReadOnly(b);}; 00518 virtual int flush(int maxb=0x800000) throw (class CTError); 00519 virtual void purge(); 00520 }; 00521 #endif // DOXYGEN 00522 00523 00524 00525 00526 00527 /* __________________________________________________________________________ 00528 * AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 00529 * CTDataFile 00530 * YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY 00531 */ 00532 00533 00534 #ifndef DOXYGEN 00535 00539 class CHIPCARD_API CTDataFile { 00540 friend class CTDirectoryBase; 00541 friend class CTFileBase; 00542 private: 00543 string _buffer; 00544 int _block; 00545 int _pos; 00546 bool _dirty; 00547 bool _valid; 00548 int _allocatedSize; 00549 00550 int _firstBlock; 00551 CTPointer<CTDataBlockMedium> _medium; 00552 00553 CTError _readBlock(); 00554 CTError _writeBlock(); 00555 00556 protected: 00557 CTDataFile(); 00558 CTDataFile(CTPointer<CTDataBlockMedium> medium, 00559 int firstBlock=0); 00560 public: 00561 ~CTDataFile(); 00562 00563 CTError seek(int where); 00564 int position(); 00565 unsigned char readChar(); 00566 string readString(int len); 00567 CTError writeChar(unsigned char c); 00568 CTError writeString(const string &s); 00569 CTError flush(); 00570 CTError truncate(); 00571 int firstBlock() const { return _firstBlock;}; 00572 00573 int blocks(); 00574 int allocatedSize(); 00575 CTError appendBlock(); 00576 00577 }; 00578 #endif // DOXYGEN 00579 00580 00581 00582 00583 00584 /* __________________________________________________________________________ 00585 * AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 00586 * CTDirEntry 00587 * YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY 00588 */ 00589 00590 00597 class CHIPCARD_API CTDirEntry { 00598 private: 00599 bool _changed; 00600 string _name; 00601 unsigned int _attributes; 00602 unsigned int _size; 00603 int _firstBlock; 00604 int _parent; 00605 00606 int _indexInParent; 00607 00608 CTError _fromString(const string &s); 00609 00610 public: 00614 enum Attributes { 00618 Attr_USED =0x0001, 00622 Attr_READ =0x0002, 00623 00627 Attr_WRITE =0x0004, 00628 00632 Attr_DIR =0x0008, 00633 00637 Attr_HIDDEN=0x0010 00638 }; 00639 00650 CTDirEntry(); 00651 00655 CTDirEntry(int parent, 00656 const string &name, 00657 unsigned int attribs=Attr_USED, 00658 unsigned int size=0, 00659 int firstblock=-1); 00660 00664 CTDirEntry(const string &s); 00665 00669 CTDirEntry(int parent, int indexInParent=-1); 00670 ~CTDirEntry(); 00672 00681 const string &name() const { return _name;}; 00682 00687 unsigned int attributes() const { return _attributes;}; 00688 00694 int size() const { return _size;}; 00696 00708 bool changed() const { return _changed;}; 00713 int firstBlock() const { return _firstBlock;}; 00714 00715 00722 int parent() const { return _parent;}; 00723 00730 int indexInParent() const { return _indexInParent;}; 00732 00740 void setAttributes(unsigned int i) { _attributes=i; _changed=true;}; 00741 00745 void setSize(unsigned int i) { _size=i; _changed=true;}; 00749 void setName(const string &s) { _name=s; _changed=true;}; 00753 void setFirstBlock(int i) { _firstBlock=i; _changed=true;}; 00757 void setParent(int i) { _parent=i; _changed=true;}; 00761 void setIndexInParent(int i) { _indexInParent=i;}; 00765 void setChanged(bool b) { _changed=b;}; 00767 00775 string toString(); 00779 string dump(); 00781 00782 }; 00783 00784 00785 00786 00787 00788 #ifndef DOXYGEN 00789 00793 class CHIPCARD_API CTDirectoryBase: public CTDataFile { 00794 private: 00795 CTDirEntry _entry; 00796 int _currEntry; 00797 00798 CTError _readEntry(CTDirEntry &de, int idx); 00799 int _findFreeEntry(); 00800 int _findOrAddFreeEntry(); 00801 00802 public: 00803 CTDirectoryBase(); 00804 CTDirectoryBase(CTPointer<CTDataBlockMedium> medium, 00805 int firstBlock=0); 00806 ~CTDirectoryBase(); 00807 00808 CTError firstEntry(CTDirEntry &de); 00809 CTError nextEntry(CTDirEntry &de); 00810 CTDirEntry findEntry(const string &name); 00811 00818 CTError writeEntry(CTDirEntry &de); 00819 00820 }; 00821 #endif 00822 00823 00824 00825 00826 00827 00828 #ifndef DOXYGEN 00829 00833 class CHIPCARD_API CTFileBase { 00834 friend class CTFile; 00835 friend class CTDirectory; 00836 private: 00837 CTPointer<CTDataBlockMedium> _medium; 00838 string _path; 00839 CTDirEntry _entry; 00840 bool _isOpen; 00841 CTDataFile _data; 00842 00843 string _normalizeName(string n); 00844 CTError _createEntry(const string &n, 00845 unsigned int attribs, 00846 CTDirEntry &fileEntry); 00847 00848 protected: 00849 const CTDirEntry &dirEntry() const { return _entry;}; 00850 CTDirEntry path2Entry(const string &path); 00851 CTError writeEntry(CTDirEntry &entry); 00852 00853 CTFileBase(); 00854 public: 00855 CTFileBase(CTPointer<CTDataBlockMedium> medium, 00856 const string &path); 00857 virtual ~CTFileBase(); 00858 00859 bool isOpen() const { return _isOpen;}; 00860 00861 virtual CTError openFile(); 00862 virtual CTError closeFile(); 00863 virtual CTError createFile(unsigned int attribs= 00864 CTDirEntry::Attr_USED | 00865 CTDirEntry::Attr_READ | 00866 CTDirEntry::Attr_WRITE); 00867 virtual CTError removeFile(); 00868 virtual CTError statFile(CTDirEntry &ent); 00869 CTError renameFile(const string &n); 00870 00871 CTError truncate(); 00872 CTError seek(int where); 00873 int position(); 00874 int size(); 00875 unsigned char readChar(); 00876 string readString(int len); 00877 CTError writeChar(unsigned char c); 00878 CTError writeString(const string &s); 00879 CTError flush(); 00880 }; 00881 #endif // DOXYGEN 00882 00883 00884 00895 class CHIPCARD_API CTCardFS: public CTDataBlockMedium { 00896 private: 00897 public: 00912 CTCardFS(const CTCard &c); 00913 virtual ~CTCardFS(); 00915 00941 virtual CTError mountMedium(const string &username="", 00942 const string &passwd=""); 00943 00950 virtual CTError unmountMedium() { 00951 return CTDataBlockMedium::unmountMedium();}; 00952 00966 virtual CTError createMedium(unsigned int mediumSize, 00967 const string &mediumName, 00968 const string &userName, 00969 const string &passwd); 00971 00985 virtual int blocks() { return CTDataBlockMedium::blocks(-1);}; 00986 00994 virtual int freeBlocks() { return CTDataBlockMedium::freeBlocks();}; 00995 01039 virtual int blockSize() const { return CTDataBlockMedium::blockSize();}; 01040 01049 const CTSuperBlock &superBlock() const { 01050 return CTDataBlockMedium::superBlock();}; 01051 01058 bool isReadOnly() const { return CTDataBlockMedium::isReadOnly();}; 01059 01066 void setReadOnly(bool b) { CTDataBlockMedium::setReadOnly(b);}; 01068 01095 virtual int flush(int maxb=0x800000) throw (class CTError) { 01096 return CTDataBlockMedium::flush(maxb);}; 01097 01104 virtual void purge() { CTDataBlockMedium::purge();}; 01106 }; 01107 01108 01109 01114 class CHIPCARD_API CTFile: private CTFileBase { 01115 CTFileBase _fb; 01116 01117 public: 01122 01123 CTFile(); 01124 01130 CTFile(CTPointer<CTCardFS> medium, 01131 const string &path); 01132 ~CTFile(); 01134 01146 CTError openFile() { return CTFileBase::openFile();}; 01147 01153 CTError closeFile() { return CTFileBase::closeFile();}; 01159 CTError createFile(unsigned int attribs= 01160 CTDirEntry::Attr_USED | 01161 CTDirEntry::Attr_READ | 01162 CTDirEntry::Attr_WRITE){ 01163 return CTFileBase::createFile(attribs|CTDirEntry::Attr_USED); 01164 }; 01166 01179 CTError removeFile() { return CTFileBase::removeFile();}; 01180 01187 CTError renameFile(const string &n) { return CTFileBase::renameFile(n);}; 01188 01195 CTError statFile(CTDirEntry &ent) { return CTFileBase::statFile(ent);}; 01196 01201 CTError truncateFile() { return CTFileBase::truncate();};; 01203 01219 CTError seek(int where) { return CTFileBase::seek(where);}; 01220 01226 int position() { return CTFileBase::position();}; 01228 01241 unsigned char readChar() { return CTFileBase::readChar();}; 01242 01249 string readString(int len); 01250 01258 CTError writeChar(unsigned char c) { return CTFileBase::writeChar(c);}; 01259 01264 CTError writeString(const string &s) {return CTFileBase::writeString(s);}; 01265 01272 CTError flush() { return CTFileBase::flush();}; 01274 }; 01275 01276 01277 01278 01279 01285 class CHIPCARD_API CTDirectory: private CTFileBase { 01286 01287 public: 01288 CTDirectory(); 01289 CTDirectory(CTPointer<CTCardFS> medium, 01290 const string &path); 01291 ~CTDirectory(); 01292 01293 CTError openDirectory(); 01294 CTError closeDirectory() { return CTFileBase::closeFile();}; 01295 CTError createDirectory(unsigned int attribs= 01296 CTDirEntry::Attr_USED | 01297 CTDirEntry::Attr_READ | 01298 CTDirEntry::Attr_WRITE){ 01299 return CTFileBase::createFile(attribs|CTDirEntry::Attr_DIR); 01300 }; 01301 01302 CTError removeDirectory(); 01303 CTError renameDirectory(const string &n) { 01304 return CTFileBase::renameFile(n); 01305 }; 01306 01307 CTError firstEntry(CTDirEntry &de); 01308 CTError nextEntry(CTDirEntry &de); 01309 CTError entry(CTDirEntry &de,int idx); 01310 01311 }; 01312 01313 01314 01315 #endif 01316 01317 01318

Generated on Wed Jul 28 14:56:49 2004 for libchipcard by doxygen 1.3.7