00001 /********************************************************************** 00002 * $Id: cpl_vsil_win32_cpp-source.html,v 1.8 2002/12/21 19:13:12 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.8 2002/12/21 19:13:12 warmerda 00030 * updated 00030 * 00031 * Revision 1.8 2002/06/17 14:10:14 warmerda 00032 * no stat64 on Win32 00033 * 00034 * Revision 1.7 2002/06/17 14:00:16 warmerda 00035 * segregate VSIStatL() and VSIStatBufL. 00036 * 00037 * Revision 1.6 2002/06/12 02:11:58 warmerda 00038 * Removed unused variables. 00039 * 00040 * Revision 1.5 2001/07/18 04:00:49 warmerda 00041 * added CPL_CVSID 00042 * 00043 * Revision 1.4 2001/06/21 20:40:31 warmerda 00044 * *** empty log message *** 00045 * 00046 * Revision 1.3 2001/06/11 13:47:07 warmerda 00047 * initialize HighPart in VSIFTellL() 00048 * 00049 * Revision 1.2 2001/01/19 21:16:41 warmerda 00050 * expanded tabs 00051 * 00052 * Revision 1.1 2001/01/03 16:16:59 warmerda 00053 * New 00054 * 00055 */ 00056 00057 #include "cpl_vsi.h" 00058 00059 #if defined(WIN32) 00060 00061 CPL_CVSID("$Id: cpl_vsil_win32_cpp-source.html,v 1.8 2002/12/21 19:13:12 warmerda Exp $"); 00062 00063 #include <windows.h> 00064 00065 /************************************************************************/ 00066 /* VSIFOpen() */ 00067 /************************************************************************/ 00068 00069 FILE *VSIFOpenL( const char * pszFilename, const char * pszAccess ) 00070 00071 { 00072 DWORD dwDesiredAccess, dwCreationDisposition; 00073 HANDLE hFile; 00074 00075 if( strchr(pszAccess, '+') != NULL || strchr(pszAccess, 'w') != 0 ) 00076 dwDesiredAccess = GENERIC_READ | GENERIC_WRITE; 00077 else 00078 dwDesiredAccess = GENERIC_READ; 00079 00080 if( strstr(pszAccess, "w") != NULL ) 00081 dwCreationDisposition = CREATE_ALWAYS; 00082 else 00083 dwCreationDisposition = OPEN_EXISTING; 00084 00085 hFile = CreateFile( pszFilename, dwDesiredAccess, 00086 FILE_SHARE_READ | FILE_SHARE_WRITE, 00087 NULL, dwCreationDisposition, 00088 (dwDesiredAccess == GENERIC_READ) ? 00089 FILE_ATTRIBUTE_READONLY : FILE_ATTRIBUTE_NORMAL, 00090 NULL ); 00091 00092 if( hFile == INVALID_HANDLE_VALUE ) 00093 { 00094 return NULL; 00095 } 00096 else 00097 { 00098 return (FILE *) hFile; 00099 } 00100 } 00101 00102 /************************************************************************/ 00103 /* VSIFCloseL() */ 00104 /************************************************************************/ 00105 00106 int VSIFCloseL( FILE * fp ) 00107 00108 { 00109 HANDLE hFile = (HANDLE) fp; 00110 00111 return CloseHandle( hFile ) ? 0 : -1; 00112 } 00113 00114 /************************************************************************/ 00115 /* VSIFSeekL() */ 00116 /************************************************************************/ 00117 00118 int VSIFSeekL( FILE * fp, vsi_l_offset nOffset, int nWhence ) 00119 00120 { 00121 HANDLE hFile = (HANDLE) fp; 00122 GUInt32 dwMoveMethod, dwMoveHigh; 00123 GUInt32 nMoveLow; 00124 LARGE_INTEGER li; 00125 00126 switch(nWhence) 00127 { 00128 case SEEK_CUR: 00129 dwMoveMethod = FILE_CURRENT; 00130 break; 00131 case SEEK_END: 00132 dwMoveMethod = FILE_END; 00133 break; 00134 case SEEK_SET: 00135 default: 00136 dwMoveMethod = FILE_BEGIN; 00137 break; 00138 } 00139 00140 li.QuadPart = nOffset; 00141 nMoveLow = li.LowPart; 00142 dwMoveHigh = li.HighPart; 00143 00144 SetLastError( 0 ); 00145 SetFilePointer(hFile, (LONG) nMoveLow, (PLONG)&dwMoveHigh, 00146 dwMoveMethod); 00147 00148 if( GetLastError() != NO_ERROR ) 00149 { 00150 #ifdef notdef 00151 LPVOID lpMsgBuf = NULL; 00152 00153 FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER 00154 | FORMAT_MESSAGE_FROM_SYSTEM 00155 | FORMAT_MESSAGE_IGNORE_INSERTS, 00156 NULL, GetLastError(), 00157 MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), 00158 (LPTSTR) &lpMsgBuf, 0, NULL ); 00159 00160 printf( "[ERROR %d]\n %s\n", GetLastError(), (char *) lpMsgBuf ); 00161 printf( "nOffset=%u, nMoveLow=%u, dwMoveHigh=%u\n", 00162 (GUInt32) nOffset, nMoveLow, dwMoveHigh ); 00163 #endif 00164 00165 return -1; 00166 } 00167 else 00168 return 0; 00169 } 00170 00171 /************************************************************************/ 00172 /* VSIFTellL() */ 00173 /************************************************************************/ 00174 00175 vsi_l_offset VSIFTellL( FILE * fp ) 00176 00177 { 00178 HANDLE hFile = (HANDLE) fp; 00179 LARGE_INTEGER li; 00180 00181 li.HighPart = 0; 00182 li.LowPart = SetFilePointer( hFile, 0, (PLONG) &(li.HighPart), 00183 FILE_CURRENT ); 00184 00185 return li.QuadPart; 00186 } 00187 00188 /************************************************************************/ 00189 /* VSIRewindL() */ 00190 /************************************************************************/ 00191 00192 void VSIRewindL( FILE * fp ) 00193 00194 { 00195 VSIFSeekL( fp, 0, SEEK_SET ); 00196 } 00197 00198 /************************************************************************/ 00199 /* VSIFFlushL() */ 00200 /************************************************************************/ 00201 00202 void VSIFFlushL( FILE * fp ) 00203 00204 { 00205 HANDLE hFile = (HANDLE) fp; 00206 00207 FlushFileBuffers( hFile ); 00208 } 00209 00210 /************************************************************************/ 00211 /* VSIFReadL() */ 00212 /************************************************************************/ 00213 00214 size_t VSIFReadL( void * pBuffer, size_t nSize, size_t nCount, FILE * fp ) 00215 00216 { 00217 HANDLE hFile = (HANDLE) fp; 00218 DWORD dwSizeRead; 00219 00220 if( !ReadFile( hFile, pBuffer, nSize * nCount, &dwSizeRead, NULL ) ) 00221 return 0; 00222 else 00223 return dwSizeRead / nSize; 00224 } 00225 00226 /************************************************************************/ 00227 /* VSIFWriteL() */ 00228 /************************************************************************/ 00229 00230 size_t VSIFWriteL( void * pBuffer, size_t nSize, size_t nCount, FILE * fp ) 00231 00232 { 00233 HANDLE hFile = (HANDLE) fp; 00234 DWORD dwSizeWritten; 00235 00236 if( !WriteFile( hFile, pBuffer, nSize * nCount, &dwSizeWritten, NULL ) ) 00237 return 0; 00238 else 00239 return dwSizeWritten / nSize; 00240 } 00241 00242 /************************************************************************/ 00243 /* VSIFEofL() */ 00244 /************************************************************************/ 00245 00246 int VSIFEofL( FILE * fp ) 00247 00248 { 00249 vsi_l_offset nCur, nEnd; 00250 00251 nCur = VSIFTell( fp ); 00252 VSIFSeekL( fp, 0, SEEK_END ); 00253 nEnd = VSIFTell( fp ); 00254 VSIFSeekL( fp, nCur, SEEK_SET ); 00255 00256 return (nCur == nEnd); 00257 } 00258 00259 #endif /* defined WIN32 */ 00260