#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 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; } } } }