Main Page   Class Hierarchy   Compound List   File List   Compound Members   File Members   Related Pages  

cpl_vsil_win32.cpp

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 

Generated at Thu Jul 5 09:16:12 2001 for GDAL by doxygen1.2.3-20001105 written by Dimitri van Heesch, © 1997-2000