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
00038 #ifndef BLOCXX_FILE_HPP_INCLUDE_GUARD_
00039 #define BLOCXX_FILE_HPP_INCLUDE_GUARD_
00040 #include "blocxx/BLOCXX_config.h"
00041 #include "blocxx/Types.hpp"
00042 #include "blocxx/FileSystem.hpp"
00043 #include <algorithm>
00044
00045 namespace BLOCXX_NAMESPACE
00046 {
00047
00052 class BLOCXX_COMMON_API File
00053 {
00054 public:
00055 enum ELockType
00056 {
00057 E_READ_LOCK,
00058 E_WRITE_LOCK
00059 };
00060
00064 File() : m_hdl(BLOCXX_INVALID_FILEHANDLE)
00065 {
00066 }
00071 File(const File& x);
00072 ~File()
00073 {
00074 close();
00075 }
00081 File& operator= (const File& x)
00082 {
00083 File(x).swap(*this);
00084 return *this;
00085 }
00086 void swap(File& x)
00087 {
00088 std::swap(m_hdl, x.m_hdl);
00089 }
00100 size_t read(void* bfr, size_t numberOfBytes, off_t offset=-1L) const
00101 {
00102 return FileSystem::read(m_hdl, bfr, numberOfBytes, offset);
00103 }
00113 size_t write(const void* bfr, size_t numberOfBytes, off_t offset=-1L)
00114 {
00115 return FileSystem::write(m_hdl, bfr, numberOfBytes, offset);
00116 }
00127 int seek(off_t offset, int whence) const
00128 {
00129 return FileSystem::seek(m_hdl, offset, whence);
00130 }
00135 off_t tell() const
00136 {
00137 return FileSystem::tell(m_hdl);
00138 }
00142 void rewind() const
00143 {
00144 FileSystem::rewind(m_hdl);
00145 }
00150 int close()
00151 {
00152 if (m_hdl != BLOCXX_INVALID_FILEHANDLE)
00153 {
00154 int rv = FileSystem::close(m_hdl);
00155 m_hdl = BLOCXX_INVALID_FILEHANDLE;
00156 return rv;
00157 }
00158 return 0;
00159 }
00164 int flush()
00165 {
00166 return FileSystem::flush(m_hdl);
00167 }
00179 int getLock(ELockType type = E_WRITE_LOCK);
00192 int tryLock(ELockType type = E_WRITE_LOCK);
00199 int unlock();
00200
00201 typedef FileHandle File::*safe_bool;
00205 operator safe_bool () const
00206 { return (m_hdl != BLOCXX_INVALID_FILEHANDLE) ? &File::m_hdl : 0; }
00207 bool operator!() const
00208 { return m_hdl == BLOCXX_INVALID_FILEHANDLE; }
00214 bool operator==(const File& rhs)
00215 {
00216 return m_hdl == rhs.m_hdl;
00217 }
00218
00219 File(FileHandle hdl) : m_hdl(hdl)
00220 {
00221 }
00222
00223 private:
00224
00225 FileHandle m_hdl;
00226 };
00227
00228 }
00229
00230 #endif