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

Generated at Tue Jan 16 12:43:36 2001 for GDAL by doxygen1.2.3-20001105 written by Dimitri van Heesch, © 1997-2000