00001
00002
00003
00004
00005
00006 #include "fsLocalFile.h"
00007 #include "fsURL.h"
00008
00009 fsLocalFile::fsLocalFile()
00010 {
00011 m_hFile = INVALID_HANDLE_VALUE;
00012 m_enRST = RST_PRESENT;
00013 }
00014
00015 fsLocalFile::~fsLocalFile()
00016 {
00017 CloseHandle ();
00018 m_hFile = NULL;
00019 }
00020
00021 fsInternetResult fsLocalFile::Open(LPCSTR pszFilePath, UINT64 uStartPos)
00022 {
00023 CloseHandle ();
00024
00025 fsString strPath;
00026 if (m_strServer != "")
00027 {
00028
00029 strPath = "\\\\";
00030 strPath += m_strServer;
00031 }
00032 strPath += pszFilePath;
00033
00034 m_hFile = CreateFile (strPath, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING,
00035 0, NULL);
00036
00037 if (m_hFile == INVALID_HANDLE_VALUE)
00038 return fsWinErrorToIR ();
00039
00040 DWORD dw1, dw2;
00041 dw1 = ::GetFileSize (m_hFile, &dw2);
00042 m_uFileSize = dw1 | UINT64 (dw2) << 32;
00043
00044 if (uStartPos)
00045 {
00046 LONG lOffsetHi = 0;
00047 UINT64 uOffset = uStartPos;
00048 DWORD dwMethod = FILE_BEGIN;
00049
00050 while (uOffset > DWORD (-1))
00051 {
00052 SetFilePointer (m_hFile, -1, &lOffsetHi, dwMethod);
00053 if (GetLastError ())
00054 return IR_RANGESNOTAVAIL;
00055
00056 uOffset -= DWORD (-1);
00057 dwMethod = FILE_CURRENT;
00058 lOffsetHi = 0;
00059 }
00060 if (uOffset != SetFilePointer (m_hFile, DWORD (uOffset), &lOffsetHi, dwMethod))
00061 return IR_RANGESNOTAVAIL;
00062 }
00063
00064 return IR_SUCCESS;
00065 }
00066
00067 fsInternetResult fsLocalFile::Read(LPBYTE pBuffer, DWORD dwSize, DWORD *pdwRead)
00068 {
00069 if (FALSE == ReadFile (m_hFile, pBuffer, dwSize, pdwRead, NULL))
00070 return fsWinErrorToIR ();
00071
00072 return IR_SUCCESS;
00073 }
00074
00075 void fsLocalFile::Initialize(LPCSTR pszServer)
00076 {
00077 m_strServer = pszServer;
00078 }
00079
00080 void fsLocalFile::CloseHandle()
00081 {
00082 if (m_hFile != INVALID_HANDLE_VALUE)
00083 {
00084 ::CloseHandle (m_hFile);
00085 m_hFile = INVALID_HANDLE_VALUE;
00086 }
00087 }
00088
00089 fsInternetResult fsLocalFile::QuerySize(LPCSTR pszFilePath)
00090 {
00091 HANDLE hFile = CreateFile (pszFilePath, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING,
00092 0, NULL);
00093
00094 if (hFile == INVALID_HANDLE_VALUE)
00095 return fsWinErrorToIR ();
00096
00097 DWORD dw1, dw2;
00098 dw1 = ::GetFileSize (hFile, &dw2);
00099 m_uFileSize = dw1 | UINT64 (dw2) << 32;
00100
00101 ::CloseHandle (hFile);
00102
00103 return IR_SUCCESS;
00104 }
00105
00106 fsInternetResult fsLocalFile::OpenEx(LPCSTR pszFilePath, UINT64 uStartPos, UINT64 , UINT64 uUploadTotalSize)
00107 {
00108 if (uUploadTotalSize != _UI64_MAX)
00109 return IR_ERROR;
00110 return Open (pszFilePath, uStartPos);
00111 }
00112
00113 fsInternetResult fsLocalFile::Write(LPBYTE , DWORD , DWORD* )
00114 {
00115 return IR_ERROR;
00116 }