Repository navigation
Expand file tree
/
Copy pathsignCreator.cpp
More file actions
84 lines (71 loc) · 2.88 KB
/
Copy pathsignCreator.cpp
File metadata and controls
84 lines (71 loc) · 2.88 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
/*
=============================================================================
Signature - The program that generates the signature file
-----------------------------------------------------------------------------
File: signCreator.cpp Created: 2019/07/15
-----------------------------------------------------------------------------
Authors: Y. A. Leontev
=============================================================================
*/
/**
\file signCreator.cpp
\brief Файл содержит реализацию класса SignCreator
\author Y. A. Leontev
\date 2018.07.15
*/
#include "signCreator.h"
#include "crc32Hash.h"
//#include <boost/crc.hpp>
//#include "pcout.h"
/* ----- SignCreator::SignCreator() ------------------------------------------------- */
/// Конструктор класса
/// \param _region Регион файла
/// \param szBlock Размер блока
SignCreator::SignCreator(std::shared_ptr<mapped_region> _region,uint szBlock):
region(_region),
sizeBlock(szBlock),
checkSum(std::make_unique<Crc32Hash<uint32>>()),
eptr(nullptr){
}
/* ----- SignCreator::~SignCreator() ------------------------------------------------- */
/// Деструктор класса
SignCreator::~SignCreator(){
sig.clear();
}
/* ----- SignCreator::run() ------------------------------------------------- */
/// Метод высисления sig
void SignCreator::run(){
sig.clear();
std::size_t size = region.get()->get_size();
const unsigned char *mem = static_cast<unsigned char*>(region.get()->get_address());
try{
if (!sizeBlock) throw std::invalid_argument("size block 0 Mb");
size_t countBlock = size / sizeBlock;
sig.reserve(countBlock); /* Заранее зарезирвируем память */
if (!countBlock){
sig.emplace_back(checkSum.get()->calc(mem, size%sizeBlock));
}
else{
while (countBlock--){
sig.emplace_back(checkSum.get()->calc(mem, sizeBlock));
mem+=sizeBlock;
}
if (size%sizeBlock)
sig.emplace_back(checkSum.get()->calc(mem, size%sizeBlock));
}
}catch(...){
eptr = std::current_exception();
}
}
/* ----- SignCreator::getResult() ------------------------------------------------- */
/// Метод возвращающий константную ссылку на вектор поситанных sig
/// @return ссылка на вектор с результатами вычислений
const std::vector<uint32> & SignCreator::getResult() const{
return sig;
}
/* ----- SignCreator::getError() ------------------------------------------------- */
/// Метод возвращающий константную ссылку на exception_ptr
/// @return ссылка на exception_ptr
const std::exception_ptr & SignCreator::getError() const{
return eptr;
}