00001
00002
00003
00004
00005
00006
00007
00008
00009 #include "FileReadoutFormat/DataSeparatorRecord.h"
00010
00011 #include "DaqReadoutFormat/ByteBuffer.h"
00012 #include "EventReadoutFormat/EventHeader.h"
00013 #include "EventReadoutFormat/EventReadout.h"
00014 #include "FileReadoutFormat/FileTraits.h"
00015
00016 using DybDaq::ByteBuffer;
00017 using DybDaq::DataSeparatorRecord;
00018 using DybDaq::DaqBuffer;
00019 using DybDaq::EventReadout;
00020 using DybDaq::FileTraits;
00021
00022 DataSeparatorRecord::DataSeparatorRecord(const EventReadout& block,
00023 unsigned int blockNumber,
00024 const FileTraits& traits) :
00025 FileBuffer(new char[traits.recordSize(FileTraits::kDataSeparatorRecord) * kBytesInInt],
00026 traits,
00027 FileTraits::kDataSeparatorRecord),
00028 m_block(&block),
00029 m_owner(false) {
00030 setBlockNumber(blockNumber);
00031 setBlockLength(block.header().totalSize() * kBytesInInt);
00032 }
00033
00034 DataSeparatorRecord::DataSeparatorRecord(const ByteBuffer& byteBuffer,
00035 const FileTraits& traits) :
00036 FileBuffer(byteBuffer,
00037 traits),
00038 m_block(0),
00039 m_owner(true) {
00040 }
00041
00042 DataSeparatorRecord::~DataSeparatorRecord() {
00043 if (m_owner && (0 != m_block)) {
00044 delete m_block;
00045 }
00046 }
00047
00048 bool DataSeparatorRecord::isMarked(unsigned int marker) const {
00049 return FileTraits::kDataSeparatorRecord == marker;
00050 }
00051
00052 const EventReadout& DataSeparatorRecord::block() const {
00053 return *m_block;
00054 }
00055
00056 const EventReadout* DataSeparatorRecord::extractBlock() const {
00057 m_owner = false;
00058 return m_block;
00059 }
00060
00061 unsigned int DataSeparatorRecord::blockNumber() const {
00062 return readUnsignedInt(FileTraits::kBlockNumber);
00063 }
00064
00065 unsigned int DataSeparatorRecord::blockLength() const {
00066 return readUnsignedInt(FileTraits::kBlockLength);
00067 }
00068
00069 unsigned int DataSeparatorRecord::formatComponent() const {
00070 return FileTraits::kDataSeparatorRecord;
00071 }
00072
00073 void DataSeparatorRecord::setBlock(const EventReadout* block) {
00074 if (m_owner && (0 != m_block)) {
00075 delete m_block;
00076 }
00077 m_owner = true;
00078 m_block = block;
00079 }
00080
00081 unsigned int DataSeparatorRecord::gather(OutputBufferList& outputBuffers) const {
00082 unsigned int result = bufferSize() * kBytesInInt;
00083 outputBuffers.push_back(OutputBuffer(buffer(),
00084 result));
00085
00086 result += m_block->gather(outputBuffers);
00087 return result;
00088 }
00089
00090 void DataSeparatorRecord::setBlockNumber(unsigned int blockNumber) {
00091 writeField(blockNumber,
00092 FileTraits::kBlockNumber);
00093 }
00094
00095 void DataSeparatorRecord::setBlockLength(unsigned int blockLength) {
00096 writeField(blockLength,
00097 FileTraits::kBlockLength);
00098 }
00099