00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014 #include "plstdpch.h"
00015
00016 #include "plfilesrc.h"
00017 #include "plexcept.h"
00018
00019
00020 PLFileSource::PLFileSource
00021 ( PLIProgressNotification * pNotification
00022 )
00023 : PLDataSource (pNotification),
00024 #ifdef PL_FILE_MAPPING
00025 m_hf (INVALID_HANDLE_VALUE),
00026 m_hm (NULL),
00027 #else
00028 m_pFile (NULL),
00029 m_pBuffer (NULL),
00030 m_pReadPos (NULL),
00031 m_BytesReadFromFile(0),
00032 #endif
00033 m_pStartData (NULL),
00034 m_pCurPos (NULL)
00035 {
00036 }
00037
00038 PLFileSource::~PLFileSource
00039 ()
00040 {
00041 #ifdef PL_FILE_MAPPING
00042 if (m_hf)
00043 Close();
00044 #else
00045 if (m_pFile)
00046 Close();
00047 #endif
00048 }
00049
00050 int PLFileSource::Open
00051 ( const char * pszFName
00052 )
00053 {
00054 int FileSize;
00055
00056 #ifdef PL_FILE_MAPPING
00057 PLBYTE * pBuffer = NULL;
00058 try
00059 {
00060 m_hf = CreateFile (pszFName, GENERIC_READ, FILE_SHARE_READ, NULL,
00061 OPEN_EXISTING,
00062 FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN,
00063 NULL);
00064
00065 if (m_hf == INVALID_HANDLE_VALUE)
00066 {
00067 m_hf = NULL;
00068 switch (GetLastError())
00069 {
00070 case ERROR_PATH_NOT_FOUND:
00071
00072 return PL_ERRPATH_NOT_FOUND;
00073 case ERROR_FILE_NOT_FOUND:
00074
00075 return PL_ERRFILE_NOT_FOUND;
00076 case ERROR_ACCESS_DENIED:
00077
00078 return PL_ERRACCESS_DENIED;
00079 case ERROR_SHARING_VIOLATION:
00080
00081 return PL_ERRACCESS_DENIED;
00082 default:
00083
00084
00085 return PL_ERRFILE_NOT_FOUND;
00086 }
00087 }
00088
00089 FileSize = ::GetFileSize (m_hf, NULL);
00090
00091 m_hm = CreateFileMapping (m_hf, NULL, PAGE_READONLY, 0, 0, NULL);
00092
00093
00094 if (m_hm == NULL)
00095 {
00096 if (m_hf) CloseHandle (m_hf);
00097 m_hf = NULL;
00098 return PL_ERRACCESS_DENIED;
00099 }
00100
00101 pBuffer = (PLBYTE *) MapViewOfFile (m_hm, FILE_MAP_READ, 0, 0, 0);
00102
00103 if (pBuffer == NULL)
00104
00105 return PL_ERRACCESS_DENIED;
00106 m_pStartData = pBuffer;
00107 m_pCurPos = pBuffer;
00108
00109
00110 PLDataSource::Open (pszFName, FileSize);
00111 }
00112 catch (PLTextException)
00113 {
00114
00115 if (pBuffer) UnmapViewOfFile (pBuffer);
00116 if (m_hm) CloseHandle (m_hm);
00117 if (m_hf) CloseHandle (m_hf);
00118 throw;
00119 }
00120 return 0;
00121
00122 #else
00123
00124
00125 m_pFile = NULL;
00126 if (strcmp (pszFName, ""))
00127 m_pFile = fopen (pszFName, "rb");
00128
00129 if (m_pFile == NULL)
00130 {
00131 m_pFile = 0;
00132 return -1;
00133 }
00134
00135
00136 fseek (m_pFile, 0, SEEK_END);
00137 FileSize = ftell (m_pFile);
00138 fseek (m_pFile, 0, SEEK_SET);
00139
00140
00141 m_pBuffer = new PLBYTE[FileSize];
00142
00143 if (m_pBuffer == 0)
00144 {
00145 fclose (m_pFile);
00146 return -1;
00147 }
00148
00149 m_pReadPos = m_pBuffer;
00150 m_pCurPos = m_pBuffer;
00151 m_BytesReadFromFile = 0;
00152 PLDataSource::Open (pszFName, FileSize);
00153 fillBuffer ();
00154 return 0;
00155 #endif
00156 }
00157
00158 void PLFileSource::Close
00159 ()
00160 {
00161 #ifdef PL_FILE_MAPPING
00162 UnmapViewOfFile (m_pStartData);
00163 PLDataSource::Close ();
00164 CloseHandle (m_hm);
00165 CloseHandle (m_hf);
00166 m_hm = NULL;
00167 m_hf = NULL;
00168 #else
00169
00170 delete [] m_pBuffer;
00171 m_pBuffer = NULL;
00172 PLDataSource::Close ();
00173 fclose (m_pFile);
00174 m_pFile = NULL;
00175 #endif
00176 }
00177
00178 PLBYTE * PLFileSource::ReadNBytes
00179 ( int n
00180 )
00181 {
00182 PLDataSource::ReadNBytes(n);
00183 #ifndef PL_FILE_MAPPING
00184 if (!bytesAvailable(n))
00185 fillBuffer(n);
00186 #endif
00187 m_pCurPos += n;
00188 return m_pCurPos-n;
00189 }
00190
00192 PLBYTE * PLFileSource::GetBufferPtr
00193 ( int MinBytesInBuffer
00194 )
00195 {
00196 PLASSERT (MinBytesInBuffer < 4096);
00197 #ifndef PL_FILE_MAPPING
00198 if (!bytesAvailable(MinBytesInBuffer))
00199 fillBuffer();
00200 #endif
00201 return m_pCurPos;
00202 }
00203
00204 PLBYTE * PLFileSource::ReadEverything
00205 ()
00206 {
00207 #ifdef PL_FILE_MAPPING
00208 return m_pCurPos;
00209 #else
00210 int BytesToRead = GetFileSize()-m_BytesReadFromFile;
00211 int i = fread (m_pReadPos, 1, BytesToRead, m_pFile);
00212 PLASSERT (i==BytesToRead);
00213 m_BytesReadFromFile += BytesToRead;
00214 m_pReadPos += BytesToRead;
00215 return m_pCurPos;
00216 #endif
00217 }
00218
00219
00220 #ifndef PL_FILE_MAPPING
00221 void PLFileSource::fillBuffer
00222 ( int n
00223 )
00224 {
00225
00226 int BytesToRead = GetFileSize() - m_BytesReadFromFile;
00227 if ( BytesToRead > n )
00228 BytesToRead = n;
00229 int i = fread (m_pReadPos, 1, BytesToRead, m_pFile);
00230 PLASSERT (i==BytesToRead);
00231 m_BytesReadFromFile += BytesToRead;
00232 m_pReadPos += BytesToRead;
00233 }
00234
00235 bool PLFileSource::bytesAvailable
00236 ( int n
00237 )
00238 {
00239 if (m_pReadPos-m_pCurPos >= n)
00240 return true;
00241 else
00242 return false;
00243 }
00244 #endif
00245
00246
00247
00248
00249
00250
00251
00252
00253
00254
00255
00256
00257
00258
00259
00260
00261
00262
00263
00264
00265
00266
00267
00268
00269
00270
00271
00272
00273
00274
00275
00276
00277
00278
00279
00280
00281
00282
00283
00284
00285