source: xtideuniversalbios/trunk/Serial_Server/library/File.h @ 376

Last change on this file since 376 was 376, checked in by gregli@…, 12 years ago

WIDE checkin... Added copyright and license information to sorce files, as per the GPL instructions for usage.

File size: 3.0 KB
Line 
1//======================================================================
2//
3// Project:     XTIDE Universal BIOS, Serial Port Server
4//
5// File:        file.h - File access via standard "stdio.h" routines
6//
7// Routines for accessing the file system using generic routines, which
8// should work on all systems.  The issue with using these is that
9// ftell() and fseek() are limited to 2 GB files (signed 32-bit quantities)
10// and there is no standard for 64-bit quantities.  So, look for a
11// OS specific version of this file in the distribution, such as
12// win32/win32file.h which may be in use instead.
13//
14
15//
16// XTIDE Universal BIOS and Associated Tools
17// Copyright (C) 2009-2010 by Tomi Tilli, 2011-2012 by XTIDE Universal BIOS Team.
18//
19// This program is free software; you can redistribute it and/or modify
20// it under the terms of the GNU General Public License as published by
21// the Free Software Foundation; either version 2 of the License, or
22// (at your option) any later version.
23//
24// This program is distributed in the hope that it will be useful,
25// but WITHOUT ANY WARRANTY; without even the implied warranty of
26// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
27// GNU General Public License for more details.     
28// Visit http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
29//
30
31#include <stdio.h>
32
33class FileAccess
34{
35public:
36    int Create( char *p_name )
37    {
38        fp = fopen( p_name, "r" );
39
40        if( fp )
41        {
42            log( 0, "'%s' file already exists", p_name );
43            fclose( fp );
44            return( 0 );
45        }
46       
47        if( !(fp = fopen( p_name, "w" )) )
48            log( -1, "Could not create file '%s'", p_name );
49
50        name = p_name;
51       
52        return( 1 );
53    }
54
55    void Open( char *p_name )
56    {
57        fp = fopen( p_name, "r+" );
58        if( !fp )
59            log( -1, "Could not Open '%s'", p_name );
60        name = p_name;
61    }
62
63    void Close()
64    {
65        if( fp )
66            fclose( fp );
67        fp = NULL;
68    }
69
70    unsigned long SizeSectors(void)
71    {
72        long filesize;
73
74        fseek( fp, 0, SEEK_END );
75        filesize = ftell( fp );
76
77        if( filesize == 0 || filesize == -1L )
78            log( -1, "Could not get file size for '%s', file possibly larger than 2 GB", name );
79
80        if( filesize & 0x1ff )
81            log( -1, "'%s' not made up of 512 byte sectors", name );
82
83        return( filesize >> 9 );     // 512 bytes per sector
84    }
85
86    void SeekSectors( unsigned long lba )
87    {
88        if( fseek( fp, lba * 512, SEEK_SET ) )
89            log( -1, "'%s', Failed to seek to lba=%lu", name, lba );
90    }
91
92    void Read( void *buff, unsigned long len )
93    {
94        if( fread( buff, 1, 512, fp ) != 512 )
95            log( -1, "'%s', Failed to read sector", name );
96    }
97
98    void Write( void *buff, unsigned long len )
99    {
100        if( fwrite( buff, 1, 512, fp ) != 512 )
101            log( -1, "'%s', Failed to write sector", name );
102    }
103
104    FileAccess()
105    {
106        fp = NULL;
107        name = NULL;
108    }
109
110    const static unsigned long MaxSectors = 4194303;  // limited by signed 32-bit file sizes
111#define USAGE_MAXSECTORS "2048 MB (signed 32-bit file size limit)"
112
113private:
114    FILE *fp;
115    char *name;
116};
117
Note: See TracBrowser for help on using the repository browser.