91 lines
2.3 KiB
C++
91 lines
2.3 KiB
C++
#include "LogStorageStreamAgent.hh"
|
|
|
|
namespace logging {
|
|
|
|
LogStorageStreamAgent::LogStorageStreamAgent( StorageReadInterface & _storage ) : storage(_storage), log_parameters(*this), reading_records_block(*this) {}
|
|
|
|
|
|
communication::IMessageHandler * LogStorageStreamAgent::get_context_of( StreamingContex context ) {
|
|
|
|
communication::IMessageHandler * mh;
|
|
|
|
switch (context) {
|
|
case LOG_STORAGE_PARAMETES: {
|
|
mh = &log_parameters;
|
|
} break;
|
|
case READ_RECORDS_BLOCK: {
|
|
mh = &reading_records_block;
|
|
} break;
|
|
default: {
|
|
mh = nullptr;
|
|
} break;
|
|
}
|
|
|
|
return mh;
|
|
|
|
}
|
|
|
|
void LogStorageStreamAgent::LogParameters::handler( communication::IMessageLink * link ) {
|
|
|
|
using driver::IRxLink;
|
|
using driver::ITxLink;
|
|
|
|
uint16_t n = agent.storage.blocks_count();
|
|
uint16_t l = agent.storage.block_size();
|
|
|
|
uint32_t power_on = agent.storage.power_on();
|
|
uint64_t time = std::time( nullptr );
|
|
|
|
ITxLink & outdata(link->createMessage( sizeof(uint16_t) * 2 + sizeof(uint32_t) + sizeof(uint64_t) ) );
|
|
|
|
outdata << n;
|
|
outdata << l;
|
|
|
|
outdata << power_on;
|
|
outdata << time;
|
|
|
|
}
|
|
|
|
void LogStorageStreamAgent::ReadingRecordsBlock::handler( communication::IMessageLink * link ) {
|
|
|
|
using driver::IRxLink;
|
|
using driver::ITxLink;
|
|
|
|
IRxLink & indata( link->getData() );
|
|
|
|
StorageManager::BlockId requested_block;
|
|
|
|
if( indata >> requested_block ) {
|
|
|
|
std::pair<StorageManager::prefetch_result, StorageManager::DataBlock> prefetch_result = agent.storage.prefetch_block( requested_block );
|
|
|
|
if( prefetch_result.first == StorageManager::COMPLETE ) {
|
|
|
|
Responce responce_head;
|
|
|
|
responce_head.operation_result = prefetch_result.first;
|
|
responce_head.length = prefetch_result.second.second;
|
|
|
|
ITxLink & outdata( link->createMessage( sizeof(Responce) + prefetch_result.second.second ) );
|
|
|
|
outdata << responce_head;
|
|
outdata.send( prefetch_result.second.first, prefetch_result.second.second );
|
|
|
|
} else {
|
|
|
|
Responce responce;
|
|
|
|
responce.operation_result = prefetch_result.first;
|
|
responce.length = 0;
|
|
|
|
ITxLink & outdata( link->createMessage( sizeof(Responce) ) );
|
|
|
|
outdata << responce;
|
|
|
|
}
|
|
}
|
|
}
|
|
|
|
}
|
|
|