cel_storage.h

Go to the documentation of this file.
00001 //----------------------------------------------------------------------------
00004 //
00005 // (C) 2003-2006 Celartem Technology Inc. All rights reserved.
00006 //----------------------------------------------------------------------------
00007 
00008 #ifndef _cel_storage_h_
00009 #define _cel_storage_h_
00010 
00011 #include "cel_iostream.h"
00012 #include "cel_filepath.h"
00013 #include "cel_time.h"
00014 
00015 namespace Celartem
00016 {
00017     class ResourceBroker;
00018     
00019     //------------------------------------------------------------------------
00025     class Storage : public Stream
00026     {
00027     public:
00033         virtual uint64_t getSize() const = 0;
00034 
00041         virtual uint64_t getPos() const = 0;
00042 
00055         virtual void reserve(uint64_t inReservationSize) = 0;
00056 
00069         virtual void setPos(uint64_t inPosition) = 0;
00070 
00084         virtual void setPosRelative(int64_t inPosition) = 0;
00085 
00098         virtual void setPosFromEnd(int64_t inPosition) = 0;
00099 
00115         virtual void setEof() = 0;
00116         
00124         virtual String getStorageId() const = 0;
00125 
00132         virtual AutoPtr<Storage> duplicate() const = 0;
00133 
00139         virtual Time getLastUpdateTime() const = 0;
00140         
00164         static AutoPtr<Storage> create(
00165             const String& inUriOrFileName,
00166             bool inLateBinding = false,
00167             ResourceBroker* inBroker = NULL);
00168     };
00169 
00170     //------------------------------------------------------------------------
00178     class StorageRollback
00179     {
00180     public:
00187         virtual void commit() = 0;
00188         
00189         virtual ~StorageRollback() {}
00190     };
00191 
00192     //------------------------------------------------------------------------
00194     //------------------------------------------------------------------------
00195     enum AccessMode
00196     {
00197         accessRead = 1,  
00198         accessWrite = 2, 
00199         accessRW = 3,    
00200     };
00201 
00202     //------------------------------------------------------------------------
00204     enum CreationMode
00205     {
00207         creationDefault = 0,
00208 
00210         openExisting = 1,
00211 
00213         openAlways = 2,
00214 
00216         createNew = 3,
00217 
00220         createAlways = 4,
00221 
00224         truncateExisting = 5
00225     };
00226 
00227     //------------------------------------------------------------------------
00259     class StorageRewinder
00260     {
00261     public:
00270         StorageRewinder(Storage *inStorage)
00271             : m_storage(inStorage), m_pos(inStorage->getPos())
00272         {
00273         }
00274 
00281         StorageRewinder()
00282             : m_storage(NULL), m_pos(0)
00283         {
00284         }
00285 
00293         void setStorage(Storage *inStorage)
00294         {
00295             releaseStorage();
00296             m_storage = inStorage;
00297             m_pos = m_storage->getPos();
00298         }
00299 
00303         void rewind()
00304         {
00305             if(m_storage)
00306                 m_storage->setPos(m_pos);
00307         }
00308 
00314         void releaseStorage()
00315         {
00316             m_storage = NULL;
00317         }
00318 
00323         ~StorageRewinder()
00324         {
00325             rewind();
00326         }
00327 
00328     private:
00330         AutoPtr<Storage> m_storage;
00331 
00333         uint64_t m_pos;
00334     };
00335 
00336     //------------------------------------------------------------------------
00341     class DiskStorage : public Storage
00342     {
00343     public:
00358         static AutoPtr<DiskStorage> create(
00359             const Path& inFileName,
00360             AccessMode inAccessMode = accessRead,
00361             CreationMode inCreationMode = creationDefault);
00362 
00370         static AutoPtr<DiskStorage> createAnonTemp();
00371 
00378         static AutoPtr<DiskStorage> createTemp(String& ioFileName);
00379 
00391         virtual void* getOSHandle() = 0;
00392         
00406         virtual void lockRegion(
00407             uint64_t inPos,
00408             uint64_t inSize,
00409             bool inWriterLock) = 0;
00410 
00422         virtual bool tryLockRegion(
00423             uint64_t inPos,
00424             uint64_t inSize,
00425             bool inWriterLock) = 0;
00426 
00436         virtual void unlockRegion(uint64_t inPos, uint64_t inSize) = 0;
00437 
00461         static AutoPtr<DiskStorage> createFromHandle(
00462             void* /* HANDLE */ inFileHandle,
00463             AccessMode inAccessMode = accessRead,
00464             CreationMode inCreationMode = creationDefault);
00465     };
00466 
00467     //------------------------------------------------------------------------
00471     struct LockStorageRegion
00472     {
00480         LockStorageRegion(uint64_t inOffset, uint64_t inLength) :
00481             offset(inOffset), length(inLength)
00482         {
00483         }
00484         
00488         LockStorageRegion() : offset(0), length(0)
00489         {
00490         }
00491         
00492         uint64_t offset; 
00493         uint64_t length; 
00494     };
00495     
00496     //------------------------------------------------------------------------
00500     class DiskStorageLock
00501     {
00502     public:
00506         enum LockMode
00507         {
00508             Shared = 0, 
00509             Exclusive = 1, 
00510         };
00511 
00523         DiskStorageLock(DiskStorage* inStorage,
00524             uint64_t inPos, uint64_t inSize, LockMode inMode = Shared)
00525         {
00526             lock(inStorage, inPos, inSize, inMode);
00527         }
00528 
00540         DiskStorageLock(DiskStorage* inStorage,
00541             const LockStorageRegion& inRegion, LockMode inMode = Shared)
00542         {
00543             lock(inStorage, inRegion.offset, inRegion.length, inMode);
00544         }
00545         
00549         DiskStorageLock()
00550         {
00551         }
00552         
00557         ~DiskStorageLock()
00558         {
00559             unlock();
00560         }
00561         
00572         void lock(DiskStorage* inStorage,
00573             const LockStorageRegion& inRegion, LockMode inMode = Shared)
00574         {
00575             lock(inStorage, inRegion.offset, inRegion.length, inMode);
00576         }
00577         
00590         void lock(DiskStorage* inStorage,
00591             uint64_t inPos, uint64_t inSize, LockMode inMode = Shared)
00592         {
00593             unlock();
00594             m_ds = inStorage;
00595             m_region = LockStorageRegion(inPos, inSize);
00596             m_ds->lockRegion(inPos, inSize, inMode ? true : false);
00597         }
00598         
00602         void unlock()
00603         {
00604             if(m_ds.isValid())
00605             {
00606                 m_ds->unlockRegion(m_region.offset, m_region.length);
00607                 m_ds = NULL;
00608             }
00609         }
00610         
00611     private:
00612         AutoPtr<DiskStorage> m_ds;
00613         LockStorageRegion m_region;
00614         
00615         DiskStorageLock(const DiskStorageLock&);
00616         DiskStorageLock& operator=(const DiskStorageLock&);
00617     };
00618 
00619     //------------------------------------------------------------------------
00624     class DiskStorageWithRollback : public DiskStorage, public StorageRollback
00625     {
00626     public:
00641         static AutoPtr<DiskStorageWithRollback> create(
00642             const Path& inFileName,
00643             AccessMode inAccessMode = accessRead,
00644             CreationMode inCreationMode = creationDefault);
00645     };
00646 
00647     //------------------------------------------------------------------------
00653     class MemoryStorage : public Storage
00654     {
00655     public:
00663         static AutoPtr<MemoryStorage> create(SimpleArray<u8>& inMemory);
00664 
00672         static AutoPtr<MemoryStorage> create();
00673 
00688         static AutoPtr<MemoryStorage> create(
00689             const void *inData, size_t inDataSize,
00690             Endian inEndian = endianHost);
00691 
00698         virtual SimpleArray<u8>& getArray() = 0;
00699         
00708         virtual void setAllocationUnit(size_t inAllocationUnitInBytes) = 0;
00709         
00716         virtual void setReadOnly(bool inReadOnly) = 0;
00717     };
00718 
00719     //------------------------------------------------------------------------
00725     class RomStorage : public Storage
00726     {
00727     public:
00737         static AutoPtr<RomStorage> create(const u8 *inMem, size_t inSize);
00738     };
00739 
00740     //------------------------------------------------------------------------
00744     class WrapperStorage : public Storage
00745     {
00746     public:
00758         static AutoPtr<WrapperStorage> create(
00759             Stream* inStream, bool forWrite);
00760     };
00761     
00762     //------------------------------------------------------------------------
00768     class StorageOffsetter : public Storage
00769     {
00770     public:
00780         static AutoPtr<StorageOffsetter> create(
00781             Storage *inStorage, uint64_t inOffset);
00782     };
00783 
00784     //------------------------------------------------------------------------
00790     class PartialStorage : public Storage
00791     {
00792     public:
00807         static AutoPtr<PartialStorage> create(
00808             Storage *inStorage,
00809             uint64_t inOffset,
00810             uint64_t inSize,
00811             bool inReadOnly);
00812     };
00813 
00814 } // namespace Celartem
00815 
00816 
00817 #endif // _cel_storage_h_

This document is automatically generated using doxygen 1.5.4 at Fri Jun 27 18:21:54 2008.