// Copyright (c) 2012-2015, The CryptoNote developers, The Bytecoin developers // // This file is part of Bytecoin. // // Bytecoin is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Bytecoin is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with Bytecoin. If not, see . #include "CryptoNoteCore/BlockchainMessages.h" namespace CryptoNote { NewBlockMessage::NewBlockMessage(const Crypto::Hash& hash) : blockHash(hash) {} void NewBlockMessage::get(Crypto::Hash& hash) const { hash = blockHash; } NewAlternativeBlockMessage::NewAlternativeBlockMessage(const Crypto::Hash& hash) : blockHash(hash) {} void NewAlternativeBlockMessage::get(Crypto::Hash& hash) const { hash = blockHash; } ChainSwitchMessage::ChainSwitchMessage(std::vector&& hashes) : blocksFromCommonRoot(std::move(hashes)) {} ChainSwitchMessage::ChainSwitchMessage(const ChainSwitchMessage& other) : blocksFromCommonRoot(other.blocksFromCommonRoot) {} void ChainSwitchMessage::get(std::vector& hashes) const { hashes = blocksFromCommonRoot; } BlockchainMessage::BlockchainMessage(NewBlockMessage&& message) : type(MessageType::NEW_BLOCK_MESSAGE), newBlockMessage(std::move(message)) {} BlockchainMessage::BlockchainMessage(NewAlternativeBlockMessage&& message) : type(MessageType::NEW_ALTERNATIVE_BLOCK_MESSAGE), newAlternativeBlockMessage(std::move(message)) {} BlockchainMessage::BlockchainMessage(ChainSwitchMessage&& message) : type(MessageType::CHAIN_SWITCH_MESSAGE) { chainSwitchMessage = new ChainSwitchMessage(std::move(message)); } BlockchainMessage::BlockchainMessage(const BlockchainMessage& other) : type(other.type) { switch (type) { case MessageType::NEW_BLOCK_MESSAGE: new (&newBlockMessage) NewBlockMessage(other.newBlockMessage); break; case MessageType::NEW_ALTERNATIVE_BLOCK_MESSAGE: new (&newAlternativeBlockMessage) NewAlternativeBlockMessage(other.newAlternativeBlockMessage); break; case MessageType::CHAIN_SWITCH_MESSAGE: chainSwitchMessage = new ChainSwitchMessage(*other.chainSwitchMessage); break; } } BlockchainMessage::~BlockchainMessage() { switch (type) { case MessageType::NEW_BLOCK_MESSAGE: newBlockMessage.~NewBlockMessage(); break; case MessageType::NEW_ALTERNATIVE_BLOCK_MESSAGE: newAlternativeBlockMessage.~NewAlternativeBlockMessage(); break; case MessageType::CHAIN_SWITCH_MESSAGE: delete chainSwitchMessage; break; } } BlockchainMessage::MessageType BlockchainMessage::getType() const { return type; } bool BlockchainMessage::getNewBlockHash(Crypto::Hash& hash) const { if (type == MessageType::NEW_BLOCK_MESSAGE) { newBlockMessage.get(hash); return true; } else { return false; } } bool BlockchainMessage::getNewAlternativeBlockHash(Crypto::Hash& hash) const { if (type == MessageType::NEW_ALTERNATIVE_BLOCK_MESSAGE) { newAlternativeBlockMessage.get(hash); return true; } else { return false; } } bool BlockchainMessage::getChainSwitch(std::vector& hashes) const { if (type == MessageType::CHAIN_SWITCH_MESSAGE) { chainSwitchMessage->get(hashes); return true; } else { return false; } } }