Go to the documentation of this file.00001
00008
00009
00010
00011
00012 #ifndef ECL_DEVICES_OFILE_POS_HPP_
00013 #define ECL_DEVICES_OFILE_POS_HPP_
00014
00015
00016
00017
00018
00019 #include <ecl/config/ecl.hpp>
00020 #if defined(ECL_IS_POSIX)
00021
00022
00023
00024
00025
00026 #include <sys/types.h>
00027 #include <sys/stat.h>
00028 #include <fcntl.h>
00029 #include <unistd.h>
00030 #include <cstdio>
00031 #include <string>
00032 #include <ecl/concepts/containers.hpp>
00033 #include <ecl/exceptions/macros.hpp>
00034 #include <ecl/exceptions/standard_exception.hpp>
00035 #include "detail/exception_handler_pos.hpp"
00036 #include "modes.hpp"
00037 #include "traits.hpp"
00038
00039
00040
00041
00042
00043 namespace ecl {
00044
00045
00046
00047
00097 class OFile {
00098 public:
00099
00100
00101
00109 OFile();
00122 OFile(const std::string &file_name, const WriteMode &mode = New) ecl_throw_decl(StandardException);
00123
00127 virtual ~OFile();
00128
00129
00130
00131
00137 virtual bool open() { return ( file != NULL ) ? true : false; }
00138
00166 virtual bool open(const std::string &file_name, const WriteMode &mode = New) ecl_throw_decl(StandardException);
00167
00185 virtual bool close() ecl_throw_decl(StandardException);
00186
00187
00188
00189
00194 virtual const std::string& filename() const { return name; }
00195
00196
00197
00198
00199
00221 virtual long write(const char &c) ecl_debug_throw_decl(StandardException);
00244 long write(const char* s, unsigned long n) ecl_debug_throw_decl(StandardException);
00245
00273 template <typename ByteArray>
00274 long write(const ByteArray &byte_array) ecl_debug_throw_decl(StandardException);
00286 virtual bool flush() ecl_debug_throw_decl(StandardException);
00287
00291 const Error& error() const { return error_handler; }
00292
00293 private:
00294
00295
00296
00297 int file_descriptor;
00298 FILE *file;
00299 std::string name;
00300 Error error_handler;
00301 };
00302
00303
00304
00305
00306
00307 template <typename ByteArray>
00308 long OFile::write(const ByteArray&byte_array) ecl_debug_throw_decl(StandardException) {
00309
00310 ecl_compile_time_concept_check(ecl::ByteContainerConcept<ByteArray>);
00311 if ( !open() ) {
00312 ecl_debug_throw(ecl::StandardException(LOC, OpenError, std::string("File ") + name + std::string(" is not open for writing.")));
00313 error_handler = OpenError;
00314 return -1;
00315 }
00316 size_t written = fwrite(&byte_array[0],byte_array.size(),1,file);
00317 if ( written == 0) {
00318 ecl_debug_throw(ecl::StandardException(LOC, WriteError, std::string("Could not write to ") + name + std::string(".")));
00319 error_handler = WriteError;
00320 return -1;
00321 }
00322 error_handler = NoError;
00323 return byte_array.size()*written;
00324 }
00325
00326
00327
00328
00329
00330
00336 template <>
00337 class is_sink<OFile> : public True {};
00338
00339 }
00340
00341
00342 #endif
00343 #endif