Conductor----> talk_base::scoped_refptr<webrtc::PeerConnectionInterface> peer_connection_;
talk_base::scoped_refptr<webrtc::PeerConnectionFactoryInterface> peer_connection_factory_;
---------------------> talk_base::scoped_ptr<WebRtcSession> session_;
---------------------> talk_base::scoped_ptr<WebRtcSessionDescriptionFactory>webrtc_session_desc_factory_;
void Conductor::ConnectToPeer(int peer_id)
{
ASSERT(peer_id_ == -1);
ASSERT(peer_id != -1);
if (peer_connection_.get())
{
main_wnd_->MessageBox("Error",
"We only support connecting to one peer at a time", true);
return;
}
if (InitializePeerConnection())
{
peer_id_ = peer_id;
peer_connection_->CreateOffer(this, NULL);
}
else
{
main_wnd_->MessageBox("Error", "Failed to initialize PeerConnection", true);
}
}
void PeerConnection::CreateOffer(CreateSessionDescriptionObserver* observer,
const MediaConstraintsInterface* constraints)
{
if (!VERIFY(observer != NULL))
{
LOG(LS_ERROR) << "CreateOffer - observer is NULL.";
return;
}
session_->CreateOffer(observer, constraints);
}
void WebRtcSessionDescriptionFactory::CreateOffer(CreateSessionDescriptionObserver* observer,
const MediaConstraintsInterface* constraints)
{
cricket::MediaSessionOptions options;
std::string error = "CreateOffer";
if (identity_request_state_ == IDENTITY_FAILED)
{
error += kFailedDueToIdentityFailed;
LOG(LS_ERROR) << error;
PostCreateSessionDescriptionFailed(observer, error);
return;
}
if (!mediastream_signaling_->GetOptionsForOffer(constraints, &options))
{
error += " called with invalid constraints.";
LOG(LS_ERROR) << error;
PostCreateSessionDescriptionFailed(observer, error);
return;
}
if (!ValidStreams(options.streams))
{
error += " called with invalid media streams.";
LOG(LS_ERROR) << error;
PostCreateSessionDescriptionFailed(observer, error);
return;
}
if (data_channel_type_ == cricket::DCT_SCTP &&
mediastream_signaling_->HasDataChannels())
{
options.data_channel_type = cricket::DCT_SCTP;
}
CreateSessionDescriptionRequest request(CreateSessionDescriptionRequest::kOffer, observer, options);
if (identity_request_state_ == IDENTITY_WAITING)
{
create_session_description_requests_.push(request);
}
else
{
ASSERT(identity_request_state_ == IDENTITY_SUCCEEDED ||
identity_request_state_ == IDENTITY_NOT_NEEDED);
InternalCreateOffer(request);
}
}