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