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

Generated at Sat Dec 21 14:01:57 2002 for GDAL by doxygen1.2.3-20001105 written by Dimitri van Heesch, © 1997-2000