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