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
00037 #include "blocxx/BLOCXX_config.h"
00038 #include "blocxx/TempFileEnumerationImplBase.hpp"
00039 #include "blocxx/EnumerationException.hpp"
00040 #include "blocxx/File.hpp"
00041 #include "blocxx/FileSystem.hpp"
00042
00043 namespace BLOCXX_NAMESPACE
00044 {
00045
00046 namespace
00047 {
00048 const UInt32 TEMPFILE_ENUMERATION_SIG = 0x4f57454e;
00049 }
00050
00051 TempFileEnumerationImplBase::TempFileEnumerationImplBase()
00052 : m_size(0), m_Data()
00053 {
00054 UInt32 enumSig = TEMPFILE_ENUMERATION_SIG;
00055 m_Data.write(reinterpret_cast<const char*>(&enumSig), sizeof(enumSig));
00056 if (!m_Data.good())
00057 {
00058 BLOCXX_THROW(EnumerationException, "Failed to write signature to "
00059 "enumeration tempfile.");
00060 }
00061
00062
00063 UInt32 tmpSig;
00064 m_Data.read(reinterpret_cast<char*>(&tmpSig), sizeof(tmpSig));
00065 if (!m_Data.good())
00066 {
00067 BLOCXX_THROW(EnumerationException, "Failed to read signature from "
00068 "enumeration tempfile.");
00069 }
00070 }
00071
00072 TempFileEnumerationImplBase::TempFileEnumerationImplBase(String const& filename)
00073 : m_size(readSize(filename)), m_Data(filename)
00074 {
00075
00076
00077 UInt32 tmpSig;
00078 m_Data.read(reinterpret_cast<char*>(&tmpSig), sizeof(tmpSig));
00079 if (!m_Data.good())
00080 {
00081 BLOCXX_THROW(EnumerationException, "Failed to read signature of "
00082 "enumeration tempfile.");
00083 }
00084 if (tmpSig != TEMPFILE_ENUMERATION_SIG)
00085 {
00086 BLOCXX_THROW(EnumerationException, "Signature of enumeration tempfile is not valid.");
00087 }
00088 }
00089 TempFileEnumerationImplBase::~TempFileEnumerationImplBase()
00090 {
00091 }
00092 bool
00093 TempFileEnumerationImplBase::hasMoreElements() const
00094 {
00095
00096 return m_size > 0;
00097 }
00098 size_t
00099 TempFileEnumerationImplBase::numberOfElements() const
00100 {
00101 return m_size;
00102 }
00103 void
00104 TempFileEnumerationImplBase::clear()
00105 {
00106 m_size = 0;
00107 m_Data.reset();
00108 }
00109 String
00110 TempFileEnumerationImplBase::releaseFile()
00111 {
00112
00113
00114 m_Data.write(reinterpret_cast<char*>(&m_size), sizeof(m_size));
00115 if (!m_Data.good())
00116 {
00117 BLOCXX_THROW(EnumerationException, "Failed to write size to "
00118 "enumeration tempfile.");
00119 }
00120 String rval = m_Data.releaseFile();
00121 clear();
00122 return rval;
00123 }
00124
00125 bool
00126 TempFileEnumerationImplBase::usingTempFile() const
00127 {
00128 return m_Data.usingTempFile();
00129 }
00130
00131 size_t
00132 TempFileEnumerationImplBase::readSize(String const& filename)
00133 {
00134 size_t size;
00135
00136 File f = FileSystem::openFile(filename);
00137 if (!f)
00138 {
00139 BLOCXX_THROW(EnumerationException, "Failed to open file");
00140 }
00141
00142
00143 UInt32 fileSig;
00144 if (f.read(reinterpret_cast<char*>(&fileSig), sizeof(fileSig)) != sizeof(fileSig))
00145 {
00146 BLOCXX_THROW(EnumerationException, "Failure to read enumeration "
00147 "signature");
00148 }
00149 if (fileSig != TEMPFILE_ENUMERATION_SIG)
00150 {
00151 BLOCXX_THROW(EnumerationException, "Attempted to construct an "
00152 "enumeration from a file that does not have the correct "
00153 "signature");
00154 }
00155
00156 off_t whence = f.seek(-static_cast<off_t>(sizeof(size)), SEEK_END);
00157 if (whence == -1)
00158 {
00159 BLOCXX_THROW(EnumerationException, "Failure to seek");
00160 }
00161 if (f.read(reinterpret_cast<char*>(&size), sizeof(size), whence) != sizeof(size))
00162 {
00163 BLOCXX_THROW(EnumerationException, "Failure to read enumeration "
00164 "size");
00165 }
00166 if (f.close() == -1)
00167 {
00168 BLOCXX_THROW(EnumerationException, "Failure to close enumeration "
00169 "file");
00170 }
00171 return size;
00172 }
00173
00174 void
00175 TempFileEnumerationImplBase::throwIfEmpty() const
00176 {
00177 if (!hasMoreElements())
00178 {
00179 BLOCXX_THROW (EnumerationException, "Attempt to Extract from empty Enum");
00180 }
00181 }
00182
00183
00184 }
00185
00186
00187