00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #ifndef BITRECORDBUFFER_H
00020 #define BITRECORDBUFFER_H
00021
00022 #include <string>
00023 #include <queue>
00024 #include <set>
00025
00026 #include <bit/buffer.h>
00027 #include <bit/record.h>
00028 #include <bit/fieldbuffer.h>
00029 #include <bit/data.h>
00030 #include <bit/except.h>
00031
00032 namespace bit
00033 {
00034
00041 class RecordBuffer : public Buffer
00042 {
00043 protected:
00044 friend class FieldBuffer;
00045
00046 RecordBuffer(size_t initial_size=0, size_t sizemax=0);
00047
00048 RecordBuffer(RecordBase::pointer record, size_t initial_size=0, size_t sizemax=0);
00049
00050 RecordBuffer(void* external_data, size_t data_octets, size_t sizemax=0, DataMode mode=COPY);
00051
00052 RecordBuffer(RecordBase::pointer record,
00053 void* external_data,
00054 size_t data_octets,
00055 size_t sizemax=0,
00056 DataMode mode=COPY
00057 );
00058
00059 public:
00060 typedef BitPointer<RecordBuffer> pointer;
00061
00062 static pointer create(size_t initial_size=0, size_t sizemax=0);
00063
00064 static pointer create(RecordBase::pointer record, size_t initial_size=0, size_t sizemax=0);
00065
00066 static pointer create(void* external_data, size_t data_octets, size_t sizemax=0, DataMode mode=COPY);
00067
00068 static pointer create(RecordBase::pointer record,
00069 void* external_data,
00070 size_t data_octets,
00071 size_t sizemax=0,
00072 DataMode mode=COPY
00073 );
00074
00075 virtual ~RecordBuffer();
00076
00077 const std::string& xml();
00078
00079 std::string xml(FieldBase::pointer i);
00080
00081 FieldBuffer field(size_t) throw (exception::no_record);
00082 FieldBuffer field(std::string) throw (exception::no_record);
00083 FieldBuffer field(FieldBase::iterator);
00084 FieldBuffer field(FieldBase::pointer);
00085
00086 FieldBuffer operator[](size_t) throw (exception::no_record);
00087 FieldBuffer operator[](std::string) throw (exception::no_record);
00088 FieldBuffer operator[](const char*) throw (exception::no_record);
00089 FieldBuffer operator[](FieldBase::iterator);
00090 FieldBuffer operator[](FieldBase::pointer);
00091
00092 virtual void set_data(const void* data, size_t size);
00093
00094 void set_record(RecordBase::pointer record) throw ();
00095 void clear_record() throw ();
00096 RecordBase::pointer record();
00097
00098 sigc::signal<void, FieldBuffer> signal_field_changed();
00099
00100 sigc::signal<void> signal_record_changed();
00101
00102 protected:
00107 RecordBase::pointer m_record;
00108
00109 std::string m_xml;
00110
00119 void on_field_changed(FieldBase::pointer field);
00120
00121 void on_record_changed();
00122
00123 private:
00124
00125 sigc::signal<void> m_signal_record_changed;
00126
00138 sigc::signal<void, FieldBuffer> m_signal_field_changed;
00139
00140
00141
00142 std::queue< FieldBase::pointer > m_signal_field_changed_queue;
00143
00144
00145
00146
00147 std::set< FieldBase::pointer > m_signal_field_changed_set;
00148
00149 bool m_signal_field_changed_emitting;
00150 };
00151
00152 }
00153
00154 #endif