00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00039 #ifndef BLOCXX_FILE_HPP_INCLUDE_GUARD_
00040 #define BLOCXX_FILE_HPP_INCLUDE_GUARD_
00041 #include "blocxx/BLOCXX_config.h"
00042 #include "blocxx/Types.hpp"
00043 #include "blocxx/FileSystem.hpp"
00044 #include "blocxx/SafeBool.hpp"
00045 #include <algorithm>
00046
00047 namespace BLOCXX_NAMESPACE
00048 {
00049
00054 class BLOCXX_COMMON_API File
00055 {
00056 public:
00057 enum ELockType
00058 {
00064 E_READ_LOCK,
00070 E_WRITE_LOCK
00071 };
00072
00076 File() : m_hdl(BLOCXX_INVALID_FILEHANDLE)
00077 {
00078 }
00083 File(const File& x);
00087 ~File();
00093 File& operator= (const File& x)
00094 {
00095 File(x).swap(*this);
00096 return *this;
00097 }
00098 void swap(File& x)
00099 {
00100 std::swap(m_hdl, x.m_hdl);
00101 }
00113 size_t read(void* bfr, size_t numberOfBytes, Int64 offset=-1L) const
00114 {
00115 return FileSystem::read(m_hdl, bfr, numberOfBytes, offset);
00116 }
00127 size_t write(const void* bfr, size_t numberOfBytes, Int64 offset=-1L)
00128 {
00129 return FileSystem::write(m_hdl, bfr, numberOfBytes, offset);
00130 }
00141 Int64 seek(Int64 offset, int whence) const
00142 {
00143 return FileSystem::seek(m_hdl, offset, whence);
00144 }
00149 Int64 tell() const
00150 {
00151 return FileSystem::tell(m_hdl);
00152 }
00156 void rewind() const
00157 {
00158 FileSystem::rewind(m_hdl);
00159 }
00163 UInt64 size() const
00164 {
00165 return FileSystem::fileSize(m_hdl);
00166 }
00171 int close()
00172 {
00173 if (m_hdl != BLOCXX_INVALID_FILEHANDLE)
00174 {
00175 int rv = FileSystem::close(m_hdl);
00176 m_hdl = BLOCXX_INVALID_FILEHANDLE;
00177 return rv;
00178 }
00179 return 0;
00180 }
00185 int flush()
00186 {
00187 return FileSystem::flush(m_hdl);
00188 }
00204 int getLock(ELockType type = E_WRITE_LOCK);
00220 int tryLock(ELockType type = E_WRITE_LOCK);
00227 int unlock();
00228
00232 BLOCXX_SAFE_BOOL_IMPL(File, FileHandle, File::m_hdl, (m_hdl != BLOCXX_INVALID_FILEHANDLE))
00233
00234
00239 bool operator==(const File& rhs)
00240 {
00241 return m_hdl == rhs.m_hdl;
00242 }
00243
00244 File(FileHandle hdl) : m_hdl(hdl)
00245 {
00246 }
00247
00248 private:
00249
00250 FileHandle m_hdl;
00251 };
00252
00253 }
00254
00255 #endif
00256