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

Last change on this file since 580 was 526, checked in by krille_n_@…, 12 years ago

Changes:

  • Update of the copyright notices to include the year 2013.
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-2013 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.