00001 /********************************************************************** 00002 * $Id: cpl_vsil_win32_cpp-source.html,v 1.3 2001/07/05 13:24:08 warmerda Exp $ 00003 * 00004 * Project: CPL - Common Portability Library 00005 * Purpose: Implement VSI large file api for Win32. 00006 * Author: Frank Warmerdam, warmerdam@pobox.com 00007 * 00008 ********************************************************************** 00009 * Copyright (c) 2000, Frank Warmerdam 00010 * 00011 * Permission is hereby granted, free of charge, to any person obtaining a 00012 * copy of this software and associated documentation files (the "Software"), 00013 * to deal in the Software without restriction, including without limitation 00014 * the rights to use, copy, modify, merge, publish, distribute, sublicense, 00015 * and/or sell copies of the Software, and to permit persons to whom the 00016 * Software is furnished to do so, subject to the following conditions: 00017 * 00018 * The above copyright notice and this permission notice shall be included 00019 * in all copies or substantial portions of the Software. 00020 * 00021 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 00022 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 00023 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 00024 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 00025 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 00026 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 00027 * DEALINGS IN THE SOFTWARE. 00028 ********************************************************************** 00029 * 00030 * $Log: cpl_vsil_win32_cpp-source.html,v $ 00030 * Revision 1.3 2001/07/05 13:24:08 warmerda 00030 * *** empty log message *** 00030 * 00031 * Revision 1.4 2001/06/21 20:40:31 warmerda 00032 * *** empty log message *** 00033 * 00034 * Revision 1.3 2001/06/11 13:47:07 warmerda 00035 * initialize HighPart in VSIFTellL() 00036 * 00037 * Revision 1.2 2001/01/19 21:16:41 warmerda 00038 * expanded tabs 00039 * 00040 * Revision 1.1 2001/01/03 16:16:59 warmerda 00041 * New 00042 * 00043 */ 00044 00045 #include "cpl_vsi.h" 00046 00047 #if defined(WIN32) 00048 00049 #include <windows.h> 00050 00051 /************************************************************************/ 00052 /* VSIFOpen() */ 00053 /************************************************************************/ 00054 00055 FILE *VSIFOpenL( const char * pszFilename, const char * pszAccess ) 00056 00057 { 00058 DWORD dwDesiredAccess, dwCreationDisposition; 00059 HANDLE hFile; 00060 00061 if( strchr(pszAccess, '+') != NULL || strchr(pszAccess, 'w') != 0 ) 00062 dwDesiredAccess = GENERIC_READ | GENERIC_WRITE; 00063 else 00064 dwDesiredAccess = GENERIC_READ; 00065 00066 if( strstr(pszAccess, "w") != NULL ) 00067 dwCreationDisposition = CREATE_ALWAYS; 00068 else 00069 dwCreationDisposition = OPEN_EXISTING; 00070 00071 hFile = CreateFile( pszFilename, dwDesiredAccess, 00072 FILE_SHARE_READ | FILE_SHARE_WRITE, 00073 NULL, dwCreationDisposition, 00074 (dwDesiredAccess == GENERIC_READ) ? 00075 FILE_ATTRIBUTE_READONLY : FILE_ATTRIBUTE_NORMAL, 00076 NULL ); 00077 00078 if( hFile == INVALID_HANDLE_VALUE ) 00079 { 00080 return NULL; 00081 } 00082 else 00083 { 00084 return (FILE *) hFile; 00085 } 00086 } 00087 00088 /************************************************************************/ 00089 /* VSIFCloseL() */ 00090 /************************************************************************/ 00091 00092 int VSIFCloseL( FILE * fp ) 00093 00094 { 00095 HANDLE hFile = (HANDLE) fp; 00096 00097 return CloseHandle( hFile ) ? 0 : -1; 00098 } 00099 00100 /************************************************************************/ 00101 /* VSIFSeekL() */ 00102 /************************************************************************/ 00103 00104 int VSIFSeekL( FILE * fp, vsi_l_offset nOffset, int nWhence ) 00105 00106 { 00107 HANDLE hFile = (HANDLE) fp; 00108 GUInt32 dwMoveMethod, dwMoveHigh; 00109 GUInt32 nMoveLow; 00110 LARGE_INTEGER li; 00111 00112 switch(nWhence) 00113 { 00114 case SEEK_CUR: 00115 dwMoveMethod = FILE_CURRENT; 00116 break; 00117 case SEEK_END: 00118 dwMoveMethod = FILE_END; 00119 break; 00120 case SEEK_SET: 00121 default: 00122 dwMoveMethod = FILE_BEGIN; 00123 break; 00124 } 00125 00126 li.QuadPart = nOffset; 00127 nMoveLow = li.LowPart; 00128 dwMoveHigh = li.HighPart; 00129 00130 SetLastError( 0 ); 00131 SetFilePointer(hFile, (LONG) nMoveLow, (PLONG)&dwMoveHigh, 00132 dwMoveMethod); 00133 00134 if( GetLastError() != NO_ERROR ) 00135 { 00136 #ifdef notdef 00137 LPVOID lpMsgBuf = NULL; 00138 00139 FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER 00140 | FORMAT_MESSAGE_FROM_SYSTEM 00141 | FORMAT_MESSAGE_IGNORE_INSERTS, 00142 NULL, GetLastError(), 00143 MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), 00144 (LPTSTR) &lpMsgBuf, 0, NULL ); 00145 00146 printf( "[ERROR %d]\n %s\n", GetLastError(), (char *) lpMsgBuf ); 00147 printf( "nOffset=%u, nMoveLow=%u, dwMoveHigh=%u\n", 00148 (GUInt32) nOffset, nMoveLow, dwMoveHigh ); 00149 #endif 00150 00151 return -1; 00152 } 00153 else 00154 return 0; 00155 } 00156 00157 /************************************************************************/ 00158 /* VSIFTellL() */ 00159 /************************************************************************/ 00160 00161 vsi_l_offset VSIFTellL( FILE * fp ) 00162 00163 { 00164 HANDLE hFile = (HANDLE) fp; 00165 DWORD dwMoveHigh=0, dwMoveLow; 00166 LARGE_INTEGER li; 00167 00168 li.HighPart = 0; 00169 li.LowPart = SetFilePointer( hFile, 0, (PLONG) &(li.HighPart), 00170 FILE_CURRENT ); 00171 00172 return li.QuadPart; 00173 } 00174 00175 /************************************************************************/ 00176 /* VSIRewindL() */ 00177 /************************************************************************/ 00178 00179 void VSIRewindL( FILE * fp ) 00180 00181 { 00182 VSIFSeekL( fp, 0, SEEK_SET ); 00183 } 00184 00185 /************************************************************************/ 00186 /* VSIFFlushL() */ 00187 /************************************************************************/ 00188 00189 void VSIFFlushL( FILE * fp ) 00190 00191 { 00192 HANDLE hFile = (HANDLE) fp; 00193 00194 FlushFileBuffers( hFile ); 00195 } 00196 00197 /************************************************************************/ 00198 /* VSIFReadL() */ 00199 /************************************************************************/ 00200 00201 size_t VSIFReadL( void * pBuffer, size_t nSize, size_t nCount, FILE * fp ) 00202 00203 { 00204 HANDLE hFile = (HANDLE) fp; 00205 DWORD dwSizeRead; 00206 00207 if( !ReadFile( hFile, pBuffer, nSize * nCount, &dwSizeRead, NULL ) ) 00208 return 0; 00209 else 00210 return dwSizeRead / nSize; 00211 } 00212 00213 /************************************************************************/ 00214 /* VSIFWriteL() */ 00215 /************************************************************************/ 00216 00217 size_t VSIFWriteL( void * pBuffer, size_t nSize, size_t nCount, FILE * fp ) 00218 00219 { 00220 HANDLE hFile = (HANDLE) fp; 00221 DWORD dwSizeWritten; 00222 00223 if( !WriteFile( hFile, pBuffer, nSize * nCount, &dwSizeWritten, NULL ) ) 00224 return 0; 00225 else 00226 return dwSizeWritten / nSize; 00227 } 00228 00229 /************************************************************************/ 00230 /* VSIFEofL() */ 00231 /************************************************************************/ 00232 00233 int VSIFEofL( FILE * fp ) 00234 00235 { 00236 vsi_l_offset nCur, nEnd; 00237 00238 nCur = VSIFTell( fp ); 00239 VSIFSeekL( fp, 0, SEEK_END ); 00240 nEnd = VSIFTell( fp ); 00241 VSIFSeekL( fp, nCur, SEEK_SET ); 00242 00243 return (nCur == nEnd); 00244 } 00245 00246 #endif /* defined WIN32 */ 00247