add initial project structure
Change-Id: I6a3fb080ff623b312e42d71754480a7ce00b81a0
diff --git a/src/ice_transport.h b/src/ice_transport.h
new file mode 100644
index 0000000..0bf6432
--- /dev/null
+++ b/src/ice_transport.h
@@ -0,0 +1,219 @@
+/*
+ * Copyright (C) 2004-2023 Savoir-faire Linux Inc.
+ *
+ * Author: Guillaume Roguez <guillaume.roguez@savoirfairelinux.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ */
+
+#pragma once
+
+#include "ice_options.h"
+#include "ice_socket.h"
+#include "ip_utils.h"
+
+#include <pjnath.h>
+#include <pjlib.h>
+#include <pjlib-util.h>
+
+#include <functional>
+#include <memory>
+#include <msgpack.hpp>
+#include <vector>
+
+namespace dht {
+namespace log {
+class Logger;
+}
+}
+
+namespace jami {
+
+using Logger = dht::log::Logger;
+
+namespace upnp {
+class Controller;
+}
+
+class IceTransport;
+
+using IceRecvCb = std::function<ssize_t(unsigned char* buf, size_t len)>;
+using IceCandidate = pj_ice_sess_cand;
+using onShutdownCb = std::function<void(void)>;
+
+struct ICESDP
+{
+ std::vector<IceCandidate> rem_candidates;
+ std::string rem_ufrag;
+ std::string rem_pwd;
+};
+
+struct SDP
+{
+ std::string ufrag;
+ std::string pwd;
+
+ std::vector<std::string> candidates;
+ MSGPACK_DEFINE(ufrag, pwd, candidates)
+};
+
+class IceTransport
+{
+public:
+ using Attribute = struct
+ {
+ std::string ufrag;
+ std::string pwd;
+ };
+
+ /**
+ * Constructor
+ */
+ IceTransport(std::string_view name);
+ ~IceTransport();
+
+ const std::shared_ptr<Logger>& logger() const;
+
+ void initIceInstance(const IceTransportOptions& options);
+
+ /**
+ * Get current state
+ */
+ bool isInitiator() const;
+
+ /**
+ * Start transport negotiation between local candidates and given remote
+ * to find the right candidate pair.
+ * This function doesn't block, the callback on_negodone_cb will be called
+ * with the negotiation result when operation is really done.
+ * Return false if negotiation cannot be started else true.
+ */
+ bool startIce(const Attribute& rem_attrs, std::vector<IceCandidate>&& rem_candidates);
+ bool startIce(const SDP& sdp);
+
+ /**
+ * Cancel operations
+ */
+ void cancelOperations();
+
+ /**
+ * Returns true if ICE transport has been initialized
+ * [mutex protected]
+ */
+ bool isInitialized() const;
+
+ /**
+ * Returns true if ICE negotiation has been started
+ * [mutex protected]
+ */
+ bool isStarted() const;
+
+ /**
+ * Returns true if ICE negotiation has completed with success
+ * [mutex protected]
+ */
+ bool isRunning() const;
+
+ /**
+ * Returns true if ICE transport is in failure state
+ * [mutex protected]
+ */
+ bool isFailed() const;
+
+ IpAddr getLocalAddress(unsigned comp_id) const;
+
+ IpAddr getRemoteAddress(unsigned comp_id) const;
+
+ IpAddr getDefaultLocalAddress() const { return getLocalAddress(1); }
+
+ /**
+ * Return ICE session attributes
+ */
+ const Attribute getLocalAttributes() const;
+
+ /**
+ * Return ICE session attributes
+ */
+ std::vector<std::string> getLocalCandidates(unsigned comp_id) const;
+
+ /**
+ * Return ICE session attributes
+ */
+ std::vector<std::string> getLocalCandidates(unsigned streamIdx, unsigned compId) const;
+
+ bool parseIceAttributeLine(unsigned streamIdx,
+ const std::string& line,
+ IceCandidate& cand) const;
+
+ bool getCandidateFromSDP(const std::string& line, IceCandidate& cand) const;
+
+ // I/O methods
+
+ void setOnRecv(unsigned comp_id, IceRecvCb cb);
+ void setOnShutdown(onShutdownCb&& cb);
+
+ ssize_t recv(unsigned comp_id, unsigned char* buf, size_t len, std::error_code& ec);
+ ssize_t recvfrom(unsigned comp_id, char* buf, size_t len, std::error_code& ec);
+
+ ssize_t send(unsigned comp_id, const unsigned char* buf, size_t len);
+
+ bool waitForInitialization(std::chrono::milliseconds timeout);
+
+ int waitForNegotiation(std::chrono::milliseconds timeout);
+
+ ssize_t waitForData(unsigned comp_id, std::chrono::milliseconds timeout, std::error_code& ec);
+
+ unsigned getComponentCount() const;
+
+ // Set session state
+ bool setSlaveSession();
+ bool setInitiatorSession();
+
+ bool isTCPEnabled();
+
+ ICESDP parseIceCandidates(std::string_view sdp_msg);
+
+ void setDefaultRemoteAddress(unsigned comp_id, const IpAddr& addr);
+
+ std::string link() const;
+
+private:
+ class Impl;
+ std::unique_ptr<Impl> pimpl_;
+};
+
+class IceTransportFactory
+{
+public:
+ IceTransportFactory();
+ ~IceTransportFactory();
+
+ std::shared_ptr<IceTransport> createTransport(std::string_view name);
+
+ std::unique_ptr<IceTransport> createUTransport(std::string_view name);
+
+ /**
+ * PJSIP specifics
+ */
+ pj_ice_strans_cfg getIceCfg() const { return ice_cfg_; }
+ pj_pool_factory* getPoolFactory() { return &cp_->factory; }
+ std::shared_ptr<pj_caching_pool> getPoolCaching() { return cp_; }
+
+private:
+ std::shared_ptr<pj_caching_pool> cp_;
+ pj_ice_strans_cfg ice_cfg_;
+};
+
+}; // namespace jami