00001
00004
00005
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* 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 }
00815
00816
00817 #endif // _cel_storage_h_