Browse Source

Added local and remote address accessors

Paul-Louis Ageneau 5 years ago
parent
commit
6f09bc7a17
4 changed files with 41 additions and 0 deletions
  1. 2 0
      include/rtc/peerconnection.hpp
  2. 26 0
      src/icetransport.cpp
  3. 5 0
      src/icetransport.hpp
  4. 8 0
      src/peerconnection.cpp

+ 2 - 0
include/rtc/peerconnection.hpp

@@ -67,6 +67,8 @@ public:
 	GatheringState gatheringState() const;
 	std::optional<Description> localDescription() const;
 	std::optional<Description> remoteDescription() const;
+	std::optional<string> localAddress() const;
+	std::optional<string> remoteAddress() const;
 
 	void setRemoteDescription(Description description);
 	void addRemoteCandidate(Candidate candidate);

+ 26 - 0
src/icetransport.cpp

@@ -190,6 +190,23 @@ void IceTransport::gatherLocalCandidates() {
 	}
 }
 
+std::optional<string> IceTransport::getLocalAddress() const {
+	NiceCandidate *local = nullptr;
+	NiceCandidate *remote = nullptr;
+	if (nice_agent_get_selected_pair(mNiceAgent.get(), mStreamId, 1, &local, &remote)) {
+		return std::make_optional(AddressToString(local->addr));
+	}
+	return nullopt;
+}
+std::optional<string> IceTransport::getRemoteAddress() const {
+	NiceCandidate *local = nullptr;
+	NiceCandidate *remote = nullptr;
+	if (nice_agent_get_selected_pair(mNiceAgent.get(), mStreamId, 1, &local, &remote)) {
+		return std::make_optional(AddressToString(remote->addr));
+	}
+	return nullopt;
+}
+
 bool IceTransport::send(message_ptr message) {
 	if (!message || !mStreamId)
 		return false;
@@ -230,6 +247,15 @@ void IceTransport::processStateChange(uint32_t state) {
 		changeState(static_cast<State>(state));
 }
 
+string IceTransport::AddressToString(const NiceAddress &addr) {
+	char buffer[NICE_ADDRESS_STRING_LEN];
+	nice_address_to_string(&addr, buffer);
+	unsigned int port = nice_address_get_port(&addr);
+	std::ostringstream ss;
+	ss << buffer << ":" << port;
+	return ss.str();
+}
+
 void IceTransport::CandidateCallback(NiceAgent *agent, NiceCandidate *candidate,
                                      gpointer userData) {
 	auto iceTransport = static_cast<rtc::IceTransport *>(userData);

+ 5 - 0
src/icetransport.hpp

@@ -64,6 +64,9 @@ public:
 	bool addRemoteCandidate(const Candidate &candidate);
 	void gatherLocalCandidates();
 
+	std::optional<string> getLocalAddress() const;
+	std::optional<string> getRemoteAddress() const;
+
 	bool send(message_ptr message);
 
 private:
@@ -92,6 +95,8 @@ private:
 	state_callback mStateChangeCallback;
 	gathering_state_callback mGatheringStateChangeCallback;
 
+	static string AddressToString(const NiceAddress &addr);
+
 	static void CandidateCallback(NiceAgent *agent, NiceCandidate *candidate, gpointer userData);
 	static void GatheringDoneCallback(NiceAgent *agent, guint streamId, gpointer userData);
 	static void StateChangeCallback(NiceAgent *agent, guint streamId, guint componentId,

+ 8 - 0
src/peerconnection.cpp

@@ -86,6 +86,14 @@ void PeerConnection::addRemoteCandidate(Candidate candidate) {
 	}
 }
 
+std::optional<string> PeerConnection::localAddress() const {
+	return mIceTransport ? mIceTransport->getLocalAddress() : nullopt;
+}
+
+std::optional<string> PeerConnection::remoteAddress() const {
+	return mIceTransport ? mIceTransport->getRemoteAddress() : nullopt;
+}
+
 shared_ptr<DataChannel> PeerConnection::createDataChannel(const string &label,
                                                           const string &protocol,
                                                           const Reliability &reliability) {