diff --git a/.vscode/tasks.json b/.vscode/tasks.json new file mode 100644 index 0000000000000000000000000000000000000000..05054c5cd812079b58e2374f06a334dd79d53898 --- /dev/null +++ b/.vscode/tasks.json @@ -0,0 +1,28 @@ +{ + "tasks": [ + { + "type": "cppbuild", + "label": "C/C++: g++ build active file", + "command": "/usr/bin/g++", + "args": [ + "-fdiagnostics-color=always", + "-g", + "${file}", + "-o", + "${fileDirname}/${fileBasenameNoExtension}" + ], + "options": { + "cwd": "${fileDirname}" + }, + "problemMatcher": [ + "$gcc" + ], + "group": { + "kind": "build", + "isDefault": true + }, + "detail": "Task generated by Debugger." + } + ], + "version": "2.0.0" +} \ No newline at end of file diff --git a/include/ftl/uri.hpp b/include/ftl/uri.hpp index 78f3d280a023ca6a5b824bc667099e30c6895133..1ce68fad2ef7118c1a7d14ea7dc3b7a991ad361f 100644 --- a/include/ftl/uri.hpp +++ b/include/ftl/uri.hpp @@ -66,8 +66,12 @@ class URI { SCHEME_IPC, SCHEME_FILE, SCHEME_OTHER, - SCHEME_DEVICE, - SCHEME_GROUP + SCHEME_DEVICE, // Data source + SCHEME_GROUP, + SCHEME_CAST, // Broadcaster stream + SCHEME_MUX, // Multiplexer for streams + SCHEME_MIRROR, // Proxy for streams + SCHEME_BEYOND // Settings }; /** diff --git a/src/self.cpp b/src/self.cpp index 84671b0c325e656d8dbda156734601ad757e7fd3..627646b4ada755752a836a3bd263f66178691e8d 100644 --- a/src/self.cpp +++ b/src/self.cpp @@ -8,6 +8,8 @@ #include <ftl/protocol/self.hpp> #include "./streams/netstream.hpp" #include "./streams/filestream.hpp" +#include <ftl/protocol/muxer.hpp> +#include <ftl/protocol/broadcaster.hpp> #include <ftl/lib/nlohmann/json.hpp> #include "uuidMSGPACK.hpp" @@ -31,6 +33,8 @@ std::shared_ptr<ftl::protocol::Stream> Self::createStream(const std::string &uri case ftl::URI::SCHEME_FTL : return std::make_shared<ftl::protocol::Net>(uri, universe_.get(), true); case ftl::URI::SCHEME_FILE : case ftl::URI::SCHEME_NONE : return std::make_shared<ftl::protocol::File>(uri, true); + case ftl::URI::SCHEME_CAST : return std::make_shared<ftl::protocol::Broadcast>(); + case ftl::URI::SCHEME_MUX : return std::make_shared<ftl::protocol::Muxer>(); default : throw FTL_Error("Invalid Stream URI: " << uri); } } diff --git a/src/uri.cpp b/src/uri.cpp index 29d47bad7b30b69788fedb12d4222fbad36694db..2f43927e7507aafa858ef31ae72e321f2c713133 100644 --- a/src/uri.cpp +++ b/src/uri.cpp @@ -27,6 +27,23 @@ using ftl::URI; using ftl::uri_t; using std::string; +static const std::unordered_map<std::string, ftl::URI::scheme_t> schemeMap = { + {"tcp", URI::SCHEME_TCP}, + {"udp", URI::SCHEME_UDP}, + {"ws", URI::SCHEME_WS}, + {"wss", URI::SCHEME_WSS}, + {"ftl", URI::SCHEME_FTL}, + {"http", URI::SCHEME_HTTP}, + {"ipc", URI::SCHEME_IPC}, + {"device", URI::SCHEME_DEVICE}, + {"file", URI::SCHEME_FILE}, + {"group", URI::SCHEME_GROUP}, + {"beyond", URI::SCHEME_TCP}, + {"mux", URI::SCHEME_MUX}, + {"mirror", URI::SCHEME_MIRROR}, + {"cast", URI::SCHEME_CAST} +}; + URI::URI(uri_t puri) { _parse(puri); } @@ -105,18 +122,16 @@ void URI::_parse(uri_t puri) { m_host = std::string(uri.hostText.first, uri.hostText.afterLast - uri.hostText.first); std::string prototext = std::string(uri.scheme.first, uri.scheme.afterLast - uri.scheme.first); - if (prototext == "tcp") m_proto = SCHEME_TCP; - else if (prototext == "udp") m_proto = SCHEME_UDP; - else if (prototext == "ftl") m_proto = SCHEME_FTL; - else if (prototext == "http") m_proto = SCHEME_HTTP; - else if (prototext == "ws") m_proto = SCHEME_WS; - else if (prototext == "wss") m_proto = SCHEME_WSS; - else if (prototext == "ipc") m_proto = SCHEME_IPC; - else if (prototext == "device") m_proto = SCHEME_DEVICE; - else if (prototext == "file") m_proto = SCHEME_FILE; - else if (prototext == "group") m_proto = SCHEME_GROUP; - else - m_proto = SCHEME_OTHER; + if (prototext == "") { + m_proto = SCHEME_FILE; + } else { + auto protoIt = schemeMap.find(prototext); + if (protoIt == schemeMap.end()) { + m_proto = SCHEME_OTHER; + } else { + m_proto = protoIt->second; + } + } m_protostr = prototext; std::string porttext = std::string(uri.portText.first, uri.portText.afterLast - uri.portText.first);