File.hpp

Go to the documentation of this file.
00001 /*******************************************************************************
00002 * Copyright (C) 2004 Vintela, Inc. All rights reserved.
00003 * Copyright (C) 2005 Novell, Inc. All rights reserved.
00004 *
00005 * Redistribution and use in source and binary forms, with or without
00006 * modification, are permitted provided that the following conditions are met:
00007 *
00008 *  - Redistributions of source code must retain the above copyright notice,
00009 *    this list of conditions and the following disclaimer.
00010 *
00011 *  - Redistributions in binary form must reproduce the above copyright notice,
00012 *    this list of conditions and the following disclaimer in the documentation
00013 *    and/or other materials provided with the distribution.
00014 *
00015 *  - Neither the name of Vintela, Inc., Novell, Inc., nor the names of its
00016 *    contributors may be used to endorse or promote products derived from this
00017 *    software without specific prior written permission.
00018 *
00019 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS''
00020 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
00021 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
00022 * ARE DISCLAIMED. IN NO EVENT SHALL Vintela, Inc., Novell, Inc., OR THE 
00023 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 
00024 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 
00025 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 
00026 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 
00027 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 
00028 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 
00029 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
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> // for std::swap
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 } // end namespace BLOCXX_NAMESPACE
00229 
00230 #endif

Generated on Fri Jun 16 15:39:08 2006 for blocxx by  doxygen 1.4.6