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.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 

Generated at Thu Mar 28 09:47:28 2002 for GDAL by doxygen1.2.3-20001105 written by Dimitri van Heesch, © 1997-2000