Browse Source

Added offer/answer differenciation in description

Paul-Louis Ageneau 6 years ago
parent
commit
aa0ef3a123
7 changed files with 28 additions and 15 deletions
  1. 4 1
      include/rtc/description.hpp
  2. 3 2
      include/rtc/rtc.h
  3. 8 3
      src/description.cpp
  4. 2 2
      src/icetransport.cpp
  5. 1 1
      src/icetransport.hpp
  6. 2 2
      src/peerconnection.cpp
  7. 8 4
      src/rtc.cpp

+ 4 - 1
include/rtc/description.hpp

@@ -31,10 +31,12 @@ namespace rtc {
 
 
 class Description {
 class Description {
 public:
 public:
+	enum class Type { Offer, Answer };
 	enum class Role { Passive, Active, ActPass };
 	enum class Role { Passive, Active, ActPass };
 
 
-	Description(const string &sdp, Role role = Role::ActPass);
+	Description(const string &sdp, Type type = Type::Offer, Role role = Role::ActPass);
 
 
+	Type type() const;
 	Role role() const;
 	Role role() const;
 	std::optional<string> fingerprint() const;
 	std::optional<string> fingerprint() const;
 	std::optional<uint16_t> sctpPort() const;
 	std::optional<uint16_t> sctpPort() const;
@@ -46,6 +48,7 @@ public:
 	operator string() const;
 	operator string() const;
 
 
 private:
 private:
+	Type mType;
 	Role mRole;
 	Role mRole;
 	string mSessionId;
 	string mSessionId;
 	string mMid;
 	string mMid;

+ 3 - 2
include/rtc/rtc.h

@@ -26,10 +26,11 @@ void rtcDeletePeerConnection(int pc);
 int rtcCreateDataChannel(int pc, const char *label);
 int rtcCreateDataChannel(int pc, const char *label);
 void rtcDeleteDataChannel(int dc);
 void rtcDeleteDataChannel(int dc);
 void rtcSetDataChannelCallback(int pc, void (*dataChannelCallback)(int, void *));
 void rtcSetDataChannelCallback(int pc, void (*dataChannelCallback)(int, void *));
-void rtcSetLocalDescriptionCallback(int pc, void (*descriptionCallback)(const char *, void *));
+void rtcSetLocalDescriptionCallback(int pc, void (*descriptionCallback)(const char *, const char *,
+                                                                        void *));
 void rtcSetLocalCandidateCallback(int pc,
 void rtcSetLocalCandidateCallback(int pc,
                                   void (*candidateCallback)(const char *, const char *, void *));
                                   void (*candidateCallback)(const char *, const char *, void *));
-void rtcSetRemoteDescription(int pc, const char *sdp);
+void rtcSetRemoteDescription(int pc, const char *sdp, const char *type);
 void rtcAddRemoteCandidate(int pc, const char *candidate, const char *mid);
 void rtcAddRemoteCandidate(int pc, const char *candidate, const char *mid);
 int rtcGetDataChannelLabel(int dc, char *data, int size);
 int rtcGetDataChannelLabel(int dc, char *data, int size);
 void rtcSetOpenCallback(int dc, void (*openCallback)(void *));
 void rtcSetOpenCallback(int dc, void (*openCallback)(void *));

+ 8 - 3
src/description.cpp

@@ -44,8 +44,11 @@ inline void trim_end(string &str) {
 
 
 namespace rtc {
 namespace rtc {
 
 
-Description::Description(const string &sdp, Role role)
-    : mRole(role), mMid("0"), mIceUfrag("0"), mIcePwd("0"), mTrickle(true) {
+Description::Description(const string &sdp, Type type, Role role)
+    : mType(type), mRole(role), mMid("0"), mIceUfrag("0"), mIcePwd("0"), mTrickle(true) {
+	if (mType == Type::Answer && mRole == Role::ActPass)
+		mRole = Role::Passive; // ActPass is illegal for an answer, so default to passive
+
 	auto seed = std::chrono::system_clock::now().time_since_epoch().count();
 	auto seed = std::chrono::system_clock::now().time_since_epoch().count();
 	std::default_random_engine generator(seed);
 	std::default_random_engine generator(seed);
 	std::uniform_int_distribution<uint32_t> uniform;
 	std::uniform_int_distribution<uint32_t> uniform;
@@ -60,7 +63,7 @@ Description::Description(const string &sdp, Role role)
 			if (setup == "active")
 			if (setup == "active")
 				mRole = Role::Active;
 				mRole = Role::Active;
 			else if (setup == "passive")
 			else if (setup == "passive")
-				mRole = Role::Active;
+				mRole = Role::Passive;
 			else
 			else
 				mRole = Role::ActPass;
 				mRole = Role::ActPass;
 		} else if (hasprefix(line, "a=mid:")) {
 		} else if (hasprefix(line, "a=mid:")) {
@@ -83,6 +86,8 @@ Description::Description(const string &sdp, Role role)
 	}
 	}
 }
 }
 
 
+Description::Type Description::type() const { return mType; }
+
 Description::Role Description::role() const { return mRole; }
 Description::Role Description::role() const { return mRole; }
 
 
 std::optional<string> Description::fingerprint() const { return mFingerprint; }
 std::optional<string> Description::fingerprint() const { return mFingerprint; }

+ 2 - 2
src/icetransport.cpp

@@ -130,10 +130,10 @@ Description::Role IceTransport::role() const { return mRole; }
 
 
 IceTransport::State IceTransport::state() const { return mState; }
 IceTransport::State IceTransport::state() const { return mState; }
 
 
-Description IceTransport::getLocalDescription() const {
+Description IceTransport::getLocalDescription(Description::Type type) const {
 	std::unique_ptr<gchar[], void (*)(void *)> sdp(nice_agent_generate_local_sdp(mNiceAgent.get()),
 	std::unique_ptr<gchar[], void (*)(void *)> sdp(nice_agent_generate_local_sdp(mNiceAgent.get()),
 	                                               g_free);
 	                                               g_free);
-	return Description(string(sdp.get()), mRole);
+	return Description(string(sdp.get()), type, mRole);
 }
 }
 
 
 void IceTransport::setRemoteDescription(const Description &description) {
 void IceTransport::setRemoteDescription(const Description &description) {

+ 1 - 1
src/icetransport.hpp

@@ -56,7 +56,7 @@ public:
 
 
 	Description::Role role() const;
 	Description::Role role() const;
 	State state() const;
 	State state() const;
-	Description getLocalDescription() const;
+	Description getLocalDescription(Description::Type type) const;
 	void setRemoteDescription(const Description &description);
 	void setRemoteDescription(const Description &description);
 	void gatherLocalCandidates();
 	void gatherLocalCandidates();
 	bool addRemoteCandidate(const Candidate &candidate);
 	bool addRemoteCandidate(const Candidate &candidate);

+ 2 - 2
src/peerconnection.cpp

@@ -48,7 +48,7 @@ void PeerConnection::setRemoteDescription(Description description) {
 	if (!mIceTransport) {
 	if (!mIceTransport) {
 		initIceTransport(Description::Role::ActPass);
 		initIceTransport(Description::Role::ActPass);
 		mIceTransport->setRemoteDescription(description);
 		mIceTransport->setRemoteDescription(description);
-		processLocalDescription(mIceTransport->getLocalDescription());
+		processLocalDescription(mIceTransport->getLocalDescription(Description::Type::Answer));
 		mIceTransport->gatherLocalCandidates();
 		mIceTransport->gatherLocalCandidates();
 	} else {
 	} else {
 		mIceTransport->setRemoteDescription(description);
 		mIceTransport->setRemoteDescription(description);
@@ -86,7 +86,7 @@ shared_ptr<DataChannel> PeerConnection::createDataChannel(const string &label,
 
 
 	if (!mIceTransport) {
 	if (!mIceTransport) {
 		initIceTransport(Description::Role::Active);
 		initIceTransport(Description::Role::Active);
-		processLocalDescription(mIceTransport->getLocalDescription());
+		processLocalDescription(mIceTransport->getLocalDescription(Description::Type::Offer));
 		mIceTransport->gatherLocalCandidates();
 		mIceTransport->gatherLocalCandidates();
 	} else if (mSctpTransport && mSctpTransport->isReady()) {
 	} else if (mSctpTransport && mSctpTransport->isReady()) {
 		channel->open(mSctpTransport);
 		channel->open(mSctpTransport);

+ 8 - 4
src/rtc.cpp

@@ -75,7 +75,8 @@ void rtcSetDataChannelCallback(int pc, void (*dataChannelCallback)(int, void *))
 	});
 	});
 }
 }
 
 
-void rtcSetLocalDescriptionCallback(int pc, void (*descriptionCallback)(const char *, void *)) {
+void rtcSetLocalDescriptionCallback(int pc, void (*descriptionCallback)(const char *, const char *,
+                                                                        void *)) {
 	auto it = peerConnectionMap.find(pc);
 	auto it = peerConnectionMap.find(pc);
 	if (it == peerConnectionMap.end())
 	if (it == peerConnectionMap.end())
 		return;
 		return;
@@ -84,7 +85,8 @@ void rtcSetLocalDescriptionCallback(int pc, void (*descriptionCallback)(const ch
 		void *userPointer = nullptr;
 		void *userPointer = nullptr;
 		if (auto jt = userPointerMap.find(pc); jt != userPointerMap.end())
 		if (auto jt = userPointerMap.find(pc); jt != userPointerMap.end())
 			userPointer = jt->second;
 			userPointer = jt->second;
-		descriptionCallback(string(description).c_str(), userPointer);
+		string type = description.type() == Description::Type::Answer ? "answer" : "offer";
+		descriptionCallback(string(description).c_str(), type.c_str(), userPointer);
 	});
 	});
 }
 }
 
 
@@ -108,12 +110,14 @@ void rtcSetLocalCandidateCallback(int pc,
 	    });
 	    });
 }
 }
 
 
-void rtcSetRemoteDescription(int pc, const char *sdp) {
+void rtcSetRemoteDescription(int pc, const char *sdp, const char *type) {
 	auto it = peerConnectionMap.find(pc);
 	auto it = peerConnectionMap.find(pc);
 	if (it == peerConnectionMap.end())
 	if (it == peerConnectionMap.end())
 		return;
 		return;
 
 
-	it->second->setRemoteDescription(Description(string(sdp)));
+	auto t =
+	    type && string(type) == "answer" ? Description::Type::Answer : Description::Type::Offer;
+	it->second->setRemoteDescription(Description(string(sdp), t));
 }
 }
 
 
 void rtcAddRemoteCandidate(int pc, const char *candidate, const char *mid) {
 void rtcAddRemoteCandidate(int pc, const char *candidate, const char *mid) {