00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036 #ifndef __system_platform_FileDescriptor__
00037 #define __system_platform_FileDescriptor__
00038
00039 #include <stdio.h>
00040
00041 namespace stdbase {
00042 namespace system {
00043 namespace platform {
00044
00049 class FileDescriptor
00050 {
00051 public:
00052 enum Flags
00053 {
00054 CLOSED = 0,
00055
00056 READ = 0x0001,
00057 WRITE = 0x0002,
00058 RDWRMASK= 0x0003,
00059
00060 BIN = 0x0004,
00061 TEXT = 0x0008,
00062 TYPEMASK= 0x000C,
00063
00064 CREATE = 0x0010,
00065 APPEND = 0x0020,
00066 OPNMASK = 0x0030,
00067
00068
00069
00070 CREATE_WRITE_BIN = CREATE | WRITE | BIN,
00071 CREATE_WRITE_TEXT = CREATE | WRITE | TEXT,
00072
00073 APPEND_WRITE_BIN = APPEND | WRITE | BIN,
00074 APPEND_WRITE_TEXT = APPEND | WRITE | TEXT,
00075
00076 CREATE_RDWR_BIN = CREATE | READ | WRITE | BIN,
00077 CREATE_RDWR_TEXT = CREATE | READ | WRITE | TEXT,
00078
00079 APPEND_RDWR_BIN = APPEND | WRITE | BIN,
00080 APPEND_RDWR_TEXT = APPEND | WRITE | TEXT,
00081
00082 OPEN_READ_BIN = READ | BIN,
00083 OPEN_READ_TEXT = READ | TEXT
00084
00085 };
00086
00087 struct StdOut {};
00088 struct StdErr {};
00089 struct StdIn {};
00090
00091 public:
00092 FileDescriptor() : file(0), constraints(CLOSED) {};
00093 ~FileDescriptor() { close(); }
00094
00100 inline bool isOpen();
00101
00107 inline bool open( char * name, Flags f);
00108
00112 inline bool open( StdOut );
00113
00117 inline bool open( StdErr );
00118
00122 inline bool open( StdIn );
00123
00129 inline bool close();
00130
00136 inline bool write( char * buffer, int len);
00137
00142 inline int read( char * buffer, int max);
00143
00149 inline bool flush();
00150
00155 inline bool eof();
00156
00157 private:
00158 FILE * file;
00159 Flags constraints;
00160
00161 public:
00162 static FileDescriptor stdinFileDescriptor;
00163 static FileDescriptor stdoutFileDescriptor;
00164 static FileDescriptor stderrFileDescriptor;
00165
00166 private:
00167 FileDescriptor( StdIn ) : file(0), constraints(CLOSED)
00168 { open( StdIn() ); }
00169
00170 FileDescriptor( StdOut) : file(0), constraints(CLOSED)
00171 { open( StdOut() ); }
00172
00173 FileDescriptor( StdErr ) : file(0), constraints(CLOSED)
00174 { open( StdErr() ); }
00175 };
00176
00177 bool FileDescriptor::
00178 isOpen()
00179 {
00180 return constraints != CLOSED;
00181 }
00182
00183 bool FileDescriptor::
00184 open( char * name, Flags f)
00185 {
00186 int index = 0;
00187 char extra[ 10];
00188
00189
00190 bool fail = (file != 0) ? true : false;
00191
00192 if ( (f & RDWRMASK) == READ && ! fail)
00193 {
00194 extra[index++] = 'r';
00195 }
00196 else if ( (f & RDWRMASK) == WRITE)
00197 {
00198 extra[index++] = 'w';
00199 }
00200 else
00201 {
00202 fail = true;
00203 }
00204
00205 if ( (f & TYPEMASK) == BIN && ! fail)
00206 {
00207 extra[index++] = 'b';
00208 }
00209 else if ( (f & TYPEMASK) == TEXT && ! fail)
00210 {
00211 extra[index++] = 't';
00212 }
00213 else
00214 {
00215 fail = true;
00216 }
00217
00218 if ( (f & OPNMASK) == APPEND && ! fail)
00219 {
00220 extra[index++] = 'a';
00221 }
00222 else if ( (f & OPNMASK) == CREATE && ! fail)
00223 {
00224
00225 }
00226 else
00227 {
00228 fail = true;
00229 }
00230 extra[index] = 0;
00231
00232 if ( ! fail )
00233 {
00234 file = fopen( name, extra);
00235 if ( file != 0 )
00236 {
00237 constraints = f;
00238 }
00239 }
00240 return file != 0 && ! fail;
00241 }
00242
00243 bool FileDescriptor::
00244 open( StdOut )
00245 {
00246 file = stdout;
00247 constraints = WRITE;
00248 return true;
00249 }
00250
00251 bool FileDescriptor::
00252 open( StdErr )
00253 {
00254 file = stderr;
00255 constraints = WRITE;
00256 return true;
00257 }
00258
00259 bool FileDescriptor::
00260 open( StdIn )
00261 {
00262 file = stdin;
00263 constraints = READ;
00264 return true;
00265 }
00266
00267 bool FileDescriptor::
00268 close()
00269 {
00270 if ( file == 0 )
00271 return false;
00272
00273 return fclose( file ) == 0;
00274 }
00275
00276 bool FileDescriptor::
00277 write( char * buffer, int len)
00278 {
00279 if ( file == 0 )
00280 return false;
00281
00282 return fwrite( static_cast<void*>( buffer ), 1, len, file ) > 0;
00283 }
00284
00285 int FileDescriptor::
00286 read( char * buffer, int max)
00287 {
00288 if ( file == 0)
00289 return false;
00290 return fread( static_cast<void*>(buffer), 1, max, file);
00291 }
00292
00293 bool FileDescriptor::
00294 flush()
00295 {
00296 if ( file == 0 )
00297 return false;
00298 fflush( file );
00299 return true;
00300 }
00301
00302
00303 bool FileDescriptor::
00304 eof()
00305 {
00306 if ( file == 0 )
00307 return false;
00308 return feof( file ) > 0;
00309 }
00310
00311 }
00312 }
00313 }
00314
00315 #endif // __system_platform_FileDescriptor__
00316