diff --git a/CMakeLists.txt b/CMakeLists.txt index c92ebee..1ae8d00 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -49,6 +49,7 @@ set(LIBDATACHANNEL_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/src/icetransport.cpp ${CMAKE_CURRENT_SOURCE_DIR}/src/init.cpp ${CMAKE_CURRENT_SOURCE_DIR}/src/log.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/src/message.cpp ${CMAKE_CURRENT_SOURCE_DIR}/src/peerconnection.cpp ${CMAKE_CURRENT_SOURCE_DIR}/src/rtc.cpp ${CMAKE_CURRENT_SOURCE_DIR}/src/sctptransport.cpp diff --git a/include/rtc/message.hpp b/include/rtc/message.hpp index 1928521..e79fb0b 100644 --- a/include/rtc/message.hpp +++ b/include/rtc/message.hpp @@ -1,5 +1,5 @@ /** - * Copyright (c) 2019 Paul-Louis Ageneau + * Copyright (c) 2019-2020 Paul-Louis Ageneau * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -50,7 +50,7 @@ using message_ptr = std::shared_ptr; using message_callback = std::function; using message_variant = std::variant; -constexpr auto message_size_func = [](const message_ptr &m) -> size_t { +inline size_t message_size_func(const message_ptr &m) { return m->type == Message::Binary || m->type == Message::String ? m->size() : 0; }; @@ -64,47 +64,16 @@ message_ptr make_message(Iterator begin, Iterator end, Message::Type type = Mess return message; } -inline message_ptr make_message(size_t size, Message::Type type = Message::Binary, - unsigned int stream = 0, - std::shared_ptr reliability = nullptr) { - auto message = std::make_shared(size, type); - message->stream = stream; - message->reliability = reliability; - return message; -} +message_ptr make_message(size_t size, Message::Type type = Message::Binary, unsigned int stream = 0, + std::shared_ptr reliability = nullptr); -inline message_ptr make_message(binary &&data, Message::Type type = Message::Binary, - unsigned int stream = 0, - std::shared_ptr reliability = nullptr) { - auto message = std::make_shared(std::move(data), type); - message->stream = stream; - message->reliability = reliability; - return message; -} +message_ptr make_message(binary &&data, Message::Type type = Message::Binary, + unsigned int stream = 0, + std::shared_ptr reliability = nullptr); -inline message_ptr make_message(message_variant data) { - return std::visit( // - overloaded{ - [&](binary data) { return make_message(std::move(data), Message::Binary); }, - [&](string data) { - auto b = reinterpret_cast(data.data()); - return make_message(b, b + data.size(), Message::String); - }, - }, - std::move(data)); -} +message_ptr make_message(message_variant data); -inline std::optional to_variant(Message &&message) { - switch (message.type) { - case Message::String: - return std::make_optional( - string(reinterpret_cast(message.data()), message.size())); - case Message::Binary: - return std::make_optional(std::move(message)); - default: - return nullopt; - } -} +std::optional to_variant(Message &&message); } // namespace rtc diff --git a/src/message.cpp b/src/message.cpp new file mode 100644 index 0000000..0dccc61 --- /dev/null +++ b/src/message.cpp @@ -0,0 +1,63 @@ +/** + * Copyright (c) 2019-2020 Paul-Louis Ageneau + * + * This library 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 2.1 of the License, or (at your option) any later version. + * + * This library 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 this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "message.hpp" + +namespace rtc { + +message_ptr make_message(size_t size, Message::Type type, unsigned int stream, + std::shared_ptr reliability) { + auto message = std::make_shared(size, type); + message->stream = stream; + message->reliability = reliability; + return message; +} + +message_ptr make_message(binary &&data, Message::Type type, unsigned int stream, + std::shared_ptr reliability) { + auto message = std::make_shared(std::move(data), type); + message->stream = stream; + message->reliability = reliability; + return message; +} + +message_ptr make_message(message_variant data) { + return std::visit( // + overloaded{ + [&](binary data) { return make_message(std::move(data), Message::Binary); }, + [&](string data) { + auto b = reinterpret_cast(data.data()); + return make_message(b, b + data.size(), Message::String); + }, + }, + std::move(data)); +} + +std::optional to_variant(Message &&message) { + switch (message.type) { + case Message::String: + return std::make_optional( + string(reinterpret_cast(message.data()), message.size())); + case Message::Binary: + return std::make_optional(std::move(message)); + default: + return nullopt; + } +} + +} // namespace rtc