Go to the documentation of this file.00001 
00010 
00011 
00012 
00013 
00014 #ifndef ECL_DEVICES_SHARED_FILE_POS_HPP_
00015 #define ECL_DEVICES_SHARED_FILE_POS_HPP_
00016 
00017 
00018 
00019 
00020 
00021 #include <ecl/config/ecl.hpp>
00022 #if defined(ECL_IS_POSIX)
00023 
00024 
00025 
00026 
00027 
00028 #include <map>
00029 #include <string>
00030 #include <ecl/exceptions/standard_exception.hpp>
00031 #include <ecl/threads/mutex.hpp>
00032 #include "detail/character_buffer.hpp"
00033 #include "ofile.hpp"
00034 #include "traits.hpp"
00035 
00036 
00037 
00038 
00039 
00040 namespace ecl {
00041 
00042 
00043 
00044 
00045 
00046 class SharedFile;
00047 
00048 
00049 
00050 
00051 
00052 namespace devices {
00053 
00054 
00055 
00056 
00063 class SharedFileCommon {
00064 public:
00065     SharedFileCommon() : error_handler(NoError) {};
00074     SharedFileCommon(const std::string &name, ecl::WriteMode mode) ecl_throw_decl(StandardException);
00075     virtual ~SharedFileCommon() {}
00076 
00077     friend class ecl::SharedFile;
00078     friend class SharedFileManager;
00079 
00080 private:
00081     unsigned int count;
00082     ecl::Mutex mutex;
00083     OFile file;
00084         Error error_handler;
00085 };
00086 
00087 class SharedFileManager {
00088 public:
00089         static SharedFileCommon* RegisterSharedFile(const std::string &name, ecl::WriteMode mode = New) ecl_throw_decl(StandardException);
00090         static bool DeRegisterSharedFile(const std::string &name) ecl_throw_decl(StandardException);
00091 private:
00092         static ecl::Mutex mutex;
00093         static std::map<std::string,SharedFileCommon*> opened_files;
00094 };
00095 
00096 } 
00097 
00098 
00099 
00100 
00117 class SharedFile {
00118 public:
00119         
00120 
00121 
00129         SharedFile() {};
00143         SharedFile(const std::string &name, WriteMode mode = New) ecl_throw_decl(StandardException);
00149         virtual ~SharedFile();
00150 
00165         bool open(const std::string &name, WriteMode mode = New) ecl_throw_decl(StandardException);
00166 
00167         
00168 
00169 
00177         unsigned int count() { return shared_instance->count; }
00178 
00179         
00180 
00181 
00187         bool open() { return shared_instance->file.open(); }
00202         long write(const char &c) ecl_debug_throw_decl(StandardException);
00218         long write(const char* s, unsigned long n) ecl_debug_throw_decl(StandardException);
00227         bool flush() ecl_debug_throw_decl(StandardException);
00228 
00229         const Error& error() const { return shared_instance->error_handler; }
00230 
00231 private:
00232         devices::SharedFileCommon* shared_instance;
00233         devices::CharBuffer buffer;
00234 };
00235 
00236 
00237 
00238 
00244 template <>
00245 class is_sink<SharedFile> : public True {};
00246 
00247 } 
00248 
00249 #endif 
00250 #endif