Adjust functional logs

master
Ryan Lee 2016-08-18 14:14:32 +09:00
parent c9ff018699
commit acad86321d
6 changed files with 364 additions and 84 deletions

View File

@ -36,13 +36,18 @@ Control::Control(std::shared_ptr<Signal> signal)
signal_->SignalOnCommandReceived_.connect(this, &Control::OnSignalCommandReceived);
signal_->SignalOnClosed_.connect(this, &Control::OnSignalConnectionClosed);
LOGP_F( INFO ) << "Done";
}
Control::~Control() {
LOGP_F( INFO ) << "Starting";
peers_.clear();
DeleteControl();
signal_->SignalOnCommandReceived_.disconnect(this);
signal_->SignalOnClosed_.disconnect(this);
LOGP_F( INFO ) << "Done";
}
@ -57,19 +62,24 @@ bool Control::InitializeControl() {
webrtc::MediaConstraintsInterface* constraints = NULL;
if (!CreatePeerFactory(constraints)) {
LOGP(LS_ERROR) << "CreatePeerFactory failed";
LOGP_F(LERROR) << "CreatePeerFactory failed";
DeleteControl();
return false;
}
webrtc_thread_ = rtc::Thread::Current();
ASSERT( webrtc_thread_ != nullptr);
return true;
}
void Control::DeleteControl() {
LOGP_F( INFO ) << "Starting";
peer_connection_factory_ = NULL;
fake_audio_capture_module_ = NULL;
LOGP_F( INFO ) << "Done";
}
@ -82,7 +92,7 @@ void Control::SignIn(const std::string& user_id, const std::string& user_passwor
// 4. Generate 'signedin' event to PeerConnect
if (signal_.get() == NULL) {
LOGP(LS_ERROR) << "SignIn failed, no signal server";
LOGP_F( LERROR ) << "SignIn failed, no signal server";
return;
}
@ -91,6 +101,8 @@ void Control::SignIn(const std::string& user_id, const std::string& user_passwor
// Start by signing in
signal_->SignIn(user_id, user_password);
LOGP_F( INFO ) << "Done";
return;
}
@ -104,6 +116,8 @@ void Control::SignOut() {
signal_->SignOut();
DisconnectAll();
LOGP_F( INFO ) << "Done";
}
void Control::Connect(const std::string id) {
@ -113,10 +127,11 @@ void Control::Connect(const std::string id) {
// 4. Conect datachannel
if (signal_.get() == NULL) {
LOGP(LS_ERROR) << "Join failed, no signal server";
LOGP_F(LERROR) << "Join failed, no signal server";
return;
}
LOGP_F( INFO ) << "Joining channel " << id;
JoinChannel(id);
}
@ -127,6 +142,7 @@ void Control::Disconnect(const std::string id) {
// 4. Close ice connection
// 5. Erase peer
LOGP_F( INFO ) << "Queue peer disconnect " << id;
QueuePeerDisconnect(id);
}
@ -137,9 +153,10 @@ void Control::DisconnectAll() {
peer_ids.push_back(peer.second->remote_id());
}
LOGP(LS_INFO) << "DisconnectAll(): peer count is " << peer_ids.size();
LOGP_F(INFO) << "DisconnectAll(): peer count is " << peer_ids.size();
for (auto id : peer_ids) {
LOGP_F( INFO ) << "Try to disconnect peer having id " << id;
Disconnect(id);
}
}
@ -193,6 +210,7 @@ void Control::QueuePeerDisconnect(const std::string id) {
// 4. Close ice connection
// 5. Erase peer
webrtc_thread_->Post(this, MSG_DISCONNECT_PEER, data);
LOGP_F( INFO ) << "Done";
}
@ -205,8 +223,13 @@ void Control::QueuePeerDisconnect(const std::string id) {
//
void Control::OnPeerConnected(const std::string id) {
if (observer_ == nullptr) return;
if ( observer_ == nullptr ) {
LOGP_F( WARNING ) << "observer_ is null, id is " << id;
return;
}
observer_->OnPeerConnected(id);
LOGP_F( INFO ) << "Done, id is " << id;
}
//
@ -218,7 +241,10 @@ void Control::OnPeerConnected(const std::string id) {
void Control::OnPeerDisconnected(const std::string id) {
if (observer_ == nullptr) return;
if ( observer_ == nullptr ) {
LOGP_F( WARNING ) << "observer_ is null, id is " << id;
return;
}
bool erased;
std::map<std::string, Peer>::iterator it;
@ -234,11 +260,15 @@ void Control::OnPeerDisconnected(const std::string id) {
}
if (erased) {
LOGP_F( INFO ) << "Calling OnPeerDisconnected, id is " << id;
observer_->OnPeerDisconnected(id);
if (peers_.size() == 0) {
LOGP_F( INFO ) << "peers_ has been empty. id is " << id;
OnSignedOut(open_id_);
}
}
LOGP_F( INFO ) << "Done, id is " << id;
}
void Control::QueueOnPeerDisconnected(const std::string id) {
@ -246,18 +276,26 @@ void Control::QueueOnPeerDisconnected(const std::string id) {
// Call Control::OnPeerDisconnected()
webrtc_thread_->Post(this, MSG_ON_PEER_DISCONNECTED, data);
LOGP_F( INFO ) << "Done, id is " << id;
}
void Control::OnPeerChannelClosed(const std::string id) {
auto peer = peers_.find(id);
if (peer == peers_.end()) return;
if ( peer == peers_.end() ) {
LOGP_F( WARNING ) << "Peer not found, id is " << id;
return;
}
peer->second->ClosePeerConnection();
LOGP_F( INFO ) << "Done, id is " << id;
}
void Control::QueueOnPeerChannelClosed(const std::string id, int delay) {
LOGP_F( INFO ) << "id is " << id << " and delay is " << delay;
// close_peerconnection
ControlMessageData *data = new ControlMessageData(id, ref_);
@ -266,6 +304,8 @@ void Control::QueueOnPeerChannelClosed(const std::string id, int delay) {
webrtc_thread_->Post(this, MSG_ON_PEER_CHANNEL_CLOSED, data);
else
webrtc_thread_->PostDelayed(delay, this, MSG_ON_PEER_CHANNEL_CLOSED, data);
LOGP_F( INFO ) << "Done";
}
@ -274,12 +314,18 @@ void Control::QueueOnPeerChannelClosed(const std::string id, int delay) {
//
void Control::OnPeerMessage(const std::string& id, const char* buffer, const size_t size) {
if (observer_ == nullptr) return;
if ( observer_ == nullptr ) {
LOGP_F( WARNING ) << "observer_ is null, id is " << id;
return;
}
observer_->OnPeerMessage(id, buffer, size);
}
void Control::OnPeerWritable(const std::string& id) {
if (observer_ == nullptr) return;
if ( observer_ == nullptr ) {
LOGP_F( WARNING ) << "observer_ is null, id is " << id;
return;
}
observer_->OnPeerWritable(id);
}
@ -287,11 +333,15 @@ void Control::OnPeerWritable(const std::string& id) {
void Control::RegisterObserver(ControlObserver* observer, std::shared_ptr<Control> ref) {
ref_ = ref;
observer_ = observer;
LOGP_F( INFO ) << "Registered";
}
void Control::UnregisterObserver() {
observer_ = nullptr;
ref_.reset();
LOGP_F( INFO ) << "Unregistered";
}
//
@ -350,7 +400,7 @@ void Control::OnCommandReceived(const Json::Value& message) {
if (!rtc::GetStringFromJsonObject(message, "command", &command) ||
!rtc::GetValueFromJsonObject(message, "data", &data)) {
LOGP(LS_ERROR) << "Invalid message:" << message;
LOGP_F(LERROR) << "Invalid message:" << message;
return;
}
@ -390,23 +440,36 @@ void Control::OnCommandReceived(const Json::Value& message) {
void Control::OnSignalCommandReceived(const Json::Value& message) {
ControlMessageData *data = new ControlMessageData(message, ref_);
webrtc_thread_->Post(this, MSG_COMMAND_RECEIVED, data);
LOGP_F( INFO ) << "Done";
}
void Control::OnSignalConnectionClosed(websocketpp::close::status::value code) {
LOGP(LS_INFO) << "Calling OnSignalConnectionClosed() with " << code;
LOGP_F(INFO) << "Calling OnSignalConnectionClosed() with " << code;
if (code == websocketpp::close::status::normal) {
ControlMessageData *data = new ControlMessageData(open_id_, ref_);
webrtc_thread_->Post(this, MSG_SIGNAL_SERVER_CLOSED, data);
}
LOGP_F( INFO ) << "Done";
}
void Control::OnSignedOut(const std::string& id) {
LOGP(LS_INFO) << "Calling OnSignedOut() with " << id;
LOGP_F( INFO ) << "Calling OnSignedOut() with " << id;
if (signal_==nullptr || signal_->opened()) return;
if (peers_.size() != 0) return;
if ( signal_ == nullptr || signal_->opened() ) {
LOGP_F( WARNING ) << "signal_ is null or not opened";
return;
}
if (observer_!=nullptr) observer_->OnSignedOut(id);
if ( peers_.size() != 0 ) {
LOGP_F( WARNING ) << "peers_ is empty";
return;
}
if ( observer_ != nullptr ) {
observer_->OnSignedOut( id );
}
LOGP_F( INFO ) << "Done";
}
@ -415,18 +478,24 @@ void Control::OnSignedOut(const std::string& id) {
//
void Control::CreateChannel(const std::string name) {
LOGP_F( INFO ) << "channel is " << name;
Json::Value data;
data["name"] = name;
SendCommand(name, "createchannel", data);
}
void Control::JoinChannel(const std::string name) {
LOGP_F( INFO ) << "channel is " << name;
Json::Value data;
data["name"] = name;
SendCommand(name, "joinchannel", data);
}
void Control::LeaveChannel(const std::string name) {
LOGP_F( INFO ) << "channel is " << name;
Json::Value data;
data["name"] = name;
SendCommand(name, "leavechannel", data);
@ -442,6 +511,7 @@ bool Control::CreatePeerFactory(
fake_audio_capture_module_ = FakeAudioCaptureModule::Create();
if (fake_audio_capture_module_ == NULL) {
LOGP_F( LERROR ) << "Failed to create FakeAudioCaptureModule";
return false;
}
@ -450,9 +520,11 @@ bool Control::CreatePeerFactory(
fake_audio_capture_module_, NULL, NULL);
if (!peer_connection_factory_.get()) {
LOGP_F( LERROR ) << "Failed to create CreatePeerConnectionFactory";
return false;
}
LOGP_F( INFO ) << "Done";
return true;
}
@ -467,12 +539,29 @@ void Control::AddIceCandidate(const std::string& peer_id, const Json::Value& dat
int sdp_mline_index;
std::string candidate;
if (!rtc::GetStringFromJsonObject(data, "sdp_mid", &sdp_mid)) return;
if (!rtc::GetIntFromJsonObject(data, "sdp_mline_index", &sdp_mline_index)) return;
if (!rtc::GetStringFromJsonObject(data, "candidate", &candidate)) return;
if ( !rtc::GetStringFromJsonObject( data, "sdp_mid", &sdp_mid ) ) {
LOGP_F( LERROR ) << "sdp_mid not found, " << data.toStyledString();
return;
}
if ( !rtc::GetIntFromJsonObject( data, "sdp_mline_index", &sdp_mline_index ) ) {
LOGP_F( LERROR ) << "sdp_mline_index not found, " << data.toStyledString();
return;
}
if ( !rtc::GetStringFromJsonObject( data, "candidate", &candidate ) ) {
LOGP_F( LERROR ) << "candidate not found, " << data.toStyledString();
return;
}
if ( peers_.find( peer_id ) == peers_.end() ) {
LOGP_F( WARNING ) << "peer_id not found, peer_id is " << peer_id << " and " <<
"data is " << data.toStyledString();
return;
}
if (peers_.find(peer_id) == peers_.end()) return;
peers_[peer_id]->AddIceCandidate(sdp_mid, sdp_mline_index, candidate);
LOGP_F( INFO ) << "Done, peer_id is " << peer_id;
}
@ -484,18 +573,18 @@ void Control::AddIceCandidate(const std::string& peer_id, const Json::Value& dat
void Control::OnSignedIn(const Json::Value& data) {
bool result;
if (!rtc::GetBoolFromJsonObject(data, "result", &result)) {
LOGP(LS_WARNING) << "Unknown signin response";
LOGP_F(WARNING) << "Unknown signin response";
return;
}
if (!result) {
LOGP(LS_ERROR) << "Signin failed";
LOGP_F(LERROR) << "Signin failed";
return;
}
std::string session_id;
if (!rtc::GetStringFromJsonObject(data, "session_id", &session_id)) {
LOGP(LS_ERROR) << "Signin failed - no session_id";
LOGP_F(LERROR) << "Signin failed - no session_id";
return;
}
@ -506,24 +595,25 @@ void Control::OnSignedIn(const Json::Value& data) {
//
CreateChannel(open_id_);
LOGP_F( INFO ) << "Done";
}
void Control::OnChannelCreated(const Json::Value& data) {
bool result;
if (!rtc::GetBoolFromJsonObject(data, "result", &result)) {
LOGP(LS_WARNING) << "Unknown signin response";
LOGP_F(WARNING) << "Unknown signin response";
return;
}
std::string channel;
if (!rtc::GetStringFromJsonObject(data, "name", &channel)) {
LOGP(LS_ERROR) << "Create channel failed - no channel name";
LOGP_F(LERROR) << "Create channel failed - no channel name";
return;
}
if (!result) {
LOGP(LS_ERROR) << "Create channel failed";
LOGP_F(LERROR) << "Create channel failed";
std::string reason;
if (!rtc::GetStringFromJsonObject(data, "reason", &reason)) {
reason = "Unknown reason";
@ -533,26 +623,27 @@ void Control::OnChannelCreated(const Json::Value& data) {
}
observer_->OnSignedIn(channel);
LOGP_F( INFO ) << "Done";
}
void Control::OnChannelJoined(const Json::Value& data) {
bool result;
LOGP(LS_INFO) << "OnChannelJoined(" << data.toStyledString() << ")";
LOGP_F(INFO) << "OnChannelJoined(" << data.toStyledString() << ")";
if (!rtc::GetBoolFromJsonObject(data, "result", &result)) {
LOGP(LS_ERROR) << "Unknown channel join response";
LOGP_F(LERROR) << "Unknown channel join response";
return;
}
std::string channel;
if (!rtc::GetStringFromJsonObject(data, "name", &channel)) {
LOGP(LS_ERROR) << "Join channel failed - no channel name";
LOGP_F(LERROR) << "Join channel failed - no channel name";
return;
}
if (!result) {
LOGP(LS_ERROR) << "Join channel failed";
LOGP_F(LERROR) << "Join channel failed";
std::string reason;
if (!rtc::GetStringFromJsonObject(data, "reason", &reason)) {
reason = "Unknown reason";
@ -560,6 +651,8 @@ void Control::OnChannelJoined(const Json::Value& data) {
observer_->OnError(channel, reason);
return;
}
LOGP_F( INFO ) << "Done";
}
@ -580,14 +673,14 @@ void Control::CreateOffer(const Json::Value& data) {
Json::Value peers;
if (!rtc::GetValueFromJsonObject(data, "peers", &peers)) {
LOGP(LS_ERROR) << "createoffer failed - no peers value";
LOGP_F(LERROR) << "createoffer failed - no peers value";
return;
}
for (size_t i = 0; i < peers.size(); ++i) {
std::string remote_id;
if (!rtc::GetStringFromJsonArray(peers, i, &remote_id)) {
LOGP(LS_ERROR) << "Peer handshake failed - invalid peer id";
LOGP_F(LERROR) << "Peer handshake failed - invalid peer id";
return;
}
@ -596,6 +689,8 @@ void Control::CreateOffer(const Json::Value& data) {
peer->CreateOffer(NULL);
}
LOGP_F( INFO ) << "Done";
}
//
@ -605,12 +700,17 @@ void Control::CreateOffer(const Json::Value& data) {
void Control::ReceiveOfferSdp(const std::string& peer_id, const Json::Value& data) {
std::string sdp;
if (!rtc::GetStringFromJsonObject(data, "sdp", &sdp)) return;
if ( !rtc::GetStringFromJsonObject( data, "sdp", &sdp ) ) {
LOGP_F( LERROR ) << "sdp not found, peer_id is " << peer_id << " and " <<
"data is " << data.toStyledString();
return;
}
Peer peer = new rtc::RefCountedObject<PeerControl>(open_id_, peer_id, this, peer_connection_factory_);
peers_.insert(std::pair<std::string, Peer>(peer_id, peer));
peer->ReceiveOfferSdp(sdp);
LOGP_F( INFO ) << "Done";
}
@ -621,19 +721,33 @@ void Control::ReceiveOfferSdp(const std::string& peer_id, const Json::Value& dat
void Control::ReceiveAnswerSdp(const std::string& peer_id, const Json::Value& data) {
std::string sdp;
if (!rtc::GetStringFromJsonObject(data, "sdp", &sdp)) return;
if ( !rtc::GetStringFromJsonObject( data, "sdp", &sdp ) ) {
LOGP_F( LERROR ) << "sdp not found, peer_id is " << peer_id << " and " <<
"data is " << data.toStyledString();
return;
}
auto peer = peers_.find(peer_id);
if (peer == peers_.end()) return;
if ( peer == peers_.end() ) {
LOGP_F( LERROR ) << "peer_id not found, peer_id is " << peer_id << " and " <<
"data is " << data.toStyledString();
return;
}
peer->second->ReceiveAnswerSdp(sdp);
LOGP_F( INFO ) << "Done";
}
void Control::ClosePeerConnection(const std::string& peer_id, const Json::Value& data) {
auto peer = peers_.find(peer_id);
if (peer == peers_.end()) return;
if ( peer == peers_.end() ) {
LOGP_F( LERROR ) << "peer_id not found, peer_id is " << peer_id << " and " <<
"data is " << data.toStyledString();
return;
}
peers_[peer_id]->ClosePeerConnection();
LOGP_F( INFO ) << "Done";
}
@ -645,9 +759,14 @@ void Control::DisconnectPeer(const std::string id) {
// 4. Erase peer
auto peer = peers_.find(id);
if (peer == peers_.end()) return;
if ( peer == peers_.end() ) {
LOGP_F( WARNING ) << "peer not found, " << id;
return;
}
peer->second->Close();
LOGP_F( INFO ) << "Done, id is " << id;
}

View File

@ -299,6 +299,11 @@ class LogMessageVoidify {
? (void) 0 \
: LOGP(sev)
#define LOGP_F_IF(cond, sev) \
!(cond) \
? (void) 0 \
: LOGP_F(sev)
// The _V version is for when a variable is passed in. It doesn't do the
// namespace concatination.
#define LOGP_V(sev) \

View File

@ -25,32 +25,39 @@ PeerControl::PeerControl(const std::string local_id,
: local_id_(local_id),
remote_id_(remote_id),
observer_(observer),
peer_connection_factory_(peer_connection_factory){
peer_connection_factory_(peer_connection_factory),
state_(pClosed)
{
if (!CreatePeerConnection()) {
LOGP(LS_ERROR) << "CreatePeerConnection failed";
LOGP_F(LS_ERROR) << "CreatePeerConnection failed";
DeletePeerConnection();
}
webrtc::DataChannelInit init;
const std::string data_channel_name = std::string("pc_data_") + remote_id_;
if (!CreateDataChannel(data_channel_name, init)) {
LOGP(LS_ERROR) << "CreateDataChannel failed";
LOGP_F(LS_ERROR) << "CreateDataChannel failed";
DeletePeerConnection();
}
LOGP_F( INFO ) << "Done";
}
PeerControl::~PeerControl() {
ASSERT(state_ == pClosed);
DeletePeerConnection();
LOGP(LS_INFO) << "PeerControl has been deleted";
LOGP_F( INFO ) << "Done";
}
bool PeerControl::Send(const char* buffer, const size_t size) {
ASSERT( state_ == pOpened );
return local_data_channel_->Send(buffer, size);
}
bool PeerControl::SyncSend(const char* buffer, const size_t size) {
ASSERT( state_ == pOpened );
return local_data_channel_->SyncSend(buffer, size);
}
@ -59,8 +66,11 @@ bool PeerControl::IsWritable() {
}
void PeerControl::Close() {
LOGP_IF(local_data_channel_ == nullptr, WARNING) << "Closing null local_data_channel";
LOGP_IF(remote_data_channel_ == nullptr, WARNING) << "Closing null remote_data_channel";
LOGP_F_IF(state_ != pOpened, WARNING) << "Closing peer when it is not opened";
state_ = pClosing;
LOGP_F( INFO ) << "Closing data-channel of remote_id_ " << remote_id_;
if (local_data_channel_) local_data_channel_->Close();
if (remote_data_channel_) remote_data_channel_->Close();
@ -68,34 +78,55 @@ void PeerControl::Close() {
void PeerControl::CreateOffer(const webrtc::MediaConstraintsInterface* constraints) {
ASSERT( state_ == pClosed );
state_ = pOpening;
peer_connection_->CreateOffer(this, constraints);
LOGP_F( INFO ) << "Done";
}
void PeerControl::CreateAnswer(
const webrtc::MediaConstraintsInterface* constraints) {
void PeerControl::CreateAnswer(const webrtc::MediaConstraintsInterface* constraints) {
ASSERT( state_ == pClosed );
state_ = pOpening;
peer_connection_->CreateAnswer(this, constraints);
LOGP_F( INFO ) << "Done";
}
void PeerControl::ReceiveOfferSdp(const std::string& sdp) {
ASSERT( state_ == pClosed);
SetRemoteDescription(webrtc::SessionDescriptionInterface::kOffer, sdp);
CreateAnswer(NULL);
LOGP_F( INFO ) << "Done";
}
void PeerControl::ReceiveAnswerSdp(const std::string& sdp) {
ASSERT( state_ == pOpening );
SetRemoteDescription(webrtc::SessionDescriptionInterface::kAnswer, sdp);
LOGP_F( INFO ) << "Done";
}
void PeerControl::ClosePeerConnection() {
LOGP_F( INFO ) << "Closing peer-connection of remote_id_ " << remote_id_;
ASSERT( state_ == pClosing );
peer_connection_->Close();
state_ = pClosed;
LOGP_F( INFO ) << "Done";
}
void PeerControl::OnDataChannel(webrtc::DataChannelInterface* data_channel) {
LOGP_F( INFO ) << "remote_id_ is " << remote_id_;
PeerDataChannelObserver* Observer = new PeerDataChannelObserver(data_channel);
remote_data_channel_ = std::unique_ptr<PeerDataChannelObserver>(Observer);
Attach(remote_data_channel_.get());
LOGP_F( INFO ) << "Done";
}
void PeerControl::OnSignalingChange(webrtc::PeerConnectionInterface::SignalingState new_state) {
@ -138,6 +169,7 @@ void PeerControl::OnIceCandidate(const webrtc::IceCandidateInterface* candidate)
data["candidate"] = sdp;
observer_->SendCommand(remote_id_, "ice_candidate", data);
LOGP_F( INFO ) << "Done";
}
void PeerControl::OnSuccess(webrtc::SessionDescriptionInterface* desc) {
@ -163,6 +195,7 @@ void PeerControl::OnSuccess(webrtc::SessionDescriptionInterface* desc) {
data["sdp"] = sdp;
observer_->SendCommand(remote_id_, "answersdp", data);
}
LOGP_F( INFO ) << "Done";
}
void PeerControl::OnPeerOpened() {
@ -172,14 +205,25 @@ void PeerControl::OnPeerOpened() {
local_data_channel_->state() == webrtc::DataChannelInterface::DataState::kOpen &&
remote_data_channel_->state() == webrtc::DataChannelInterface::DataState::kOpen
) {
LOG_F( INFO ) << "Peers are connected, " << remote_id_ << " and " << local_id_;
ASSERT( state_ == pOpening );
state_ = pOpened;
observer_->OnPeerConnected(remote_id_);
observer_->OnPeerWritable(local_id_);
}
LOGP_F( INFO ) << "Done";
}
void PeerControl::OnPeerClosed() {
if (local_data_channel_.get() == nullptr && remote_data_channel_.get() == nullptr) {
if ( local_data_channel_.get() == nullptr ) {
LOGP_F( WARNING ) << "local_data_channel_ is null";
return;
}
if ( remote_data_channel_.get() == nullptr ) {
LOGP_F( WARNING ) << "remote_data_channel_ is null";
return;
}
@ -190,8 +234,13 @@ void PeerControl::OnPeerClosed() {
remote_data_channel_->state() == webrtc::DataChannelInterface::DataState::kClosed)) {
// Close local peerconnection
LOGP_F( INFO ) << "Data channels are closed. "
"remote_id_ is " << remote_id_ << " and "
"local_id_ is " << local_id_;
observer_->QueueOnPeerChannelClosed(remote_id_, 1000);
}
LOGP_F( INFO ) << "Done";
}
@ -201,8 +250,11 @@ void PeerControl::OnPeerMessage(const webrtc::DataBuffer& buffer) {
}
void PeerControl::OnBufferedAmountChange(const uint64_t previous_amount) {
if (!local_data_channel_->IsWritable()) return;
observer_->OnPeerWritable(remote_id_);
if ( !local_data_channel_->IsWritable() ) {
LOGP_F( LERROR ) << "local_data_channel_ is not writable";
return;
}
observer_->OnPeerWritable( remote_id_ );
}
@ -213,16 +265,20 @@ bool PeerControl::CreateDataChannel(
rtc::scoped_refptr<webrtc::DataChannelInterface> data_channel;
data_channel = peer_connection_->CreateDataChannel(label, &init);
if (data_channel.get() == NULL) {
if (data_channel.get() == nullptr) {
LOGP_F( LERROR ) << "data_channel is null";
return false;
}
local_data_channel_.reset(new PeerDataChannelObserver(data_channel));
if (local_data_channel_.get() == NULL) {
LOGP_F( LERROR ) << "local_data_channel_ is null";
return false;
}
Attach(local_data_channel_.get());
LOGP_F( INFO ) << "Done";
return true;
}
@ -233,6 +289,7 @@ void PeerControl::AddIceCandidate(const std::string& sdp_mid, int sdp_mline_inde
webrtc::CreateIceCandidate(sdp_mid, sdp_mline_index, candidate, NULL));
peer_connection_->AddIceCandidate(owned_candidate.get());
LOGP_F( INFO ) << "Done";
}
@ -253,7 +310,11 @@ bool PeerControl::CreatePeerConnection() {
peer_connection_ = peer_connection_factory_->CreatePeerConnection(
config, &constraints, NULL, NULL, this);
return peer_connection_.get() != NULL;
if ( peer_connection_.get() == nullptr ) {
LOGP_F( LERROR ) << "peer_connection is null";
return false;
}
return true;
}
void PeerControl::DeletePeerConnection() {
@ -264,6 +325,8 @@ void PeerControl::DeletePeerConnection() {
local_data_channel_ = NULL;
peer_connection_ = NULL;
peer_connection_factory_ = NULL;
LOGP_F( INFO ) << "Done";
}
void PeerControl::SetLocalDescription(const std::string& type,
@ -274,6 +337,8 @@ void PeerControl::SetLocalDescription(const std::string& type,
webrtc::MockSetSessionDescriptionObserver>());
peer_connection_->SetLocalDescription(
observer, webrtc::CreateSessionDescription(type, sdp, NULL));
LOGP_F( INFO ) << "Done";
}
void PeerControl::SetRemoteDescription(const std::string& type,
@ -284,11 +349,13 @@ void PeerControl::SetRemoteDescription(const std::string& type,
webrtc::MockSetSessionDescriptionObserver>());
peer_connection_->SetRemoteDescription(
observer, webrtc::CreateSessionDescription(type, sdp, NULL));
LOGP_F( INFO ) << "Done";
}
void PeerControl::Attach(PeerDataChannelObserver* datachannel) {
if (datachannel == nullptr) {
LOGP(WARNING) << "Attach to nullptr";
LOGP_F(WARNING) << "Attach to nullptr";
return;
}
@ -296,11 +363,12 @@ void PeerControl::Attach(PeerDataChannelObserver* datachannel) {
datachannel->SignalOnClosed_.connect(this, &PeerControl::OnPeerClosed);
datachannel->SignalOnMessage_.connect(this, &PeerControl::OnPeerMessage);
datachannel->SignalOnBufferedAmountChange_.connect(this, &PeerControl::OnBufferedAmountChange);
LOGP_F( INFO ) << "Done";
}
void PeerControl::Detach(PeerDataChannelObserver* datachannel) {
if (datachannel == nullptr) {
LOGP(WARNING) << "Detach from nullptr";
LOGP_F(WARNING) << "Detach from nullptr";
return;
}
@ -308,6 +376,7 @@ void PeerControl::Detach(PeerDataChannelObserver* datachannel) {
datachannel->SignalOnClosed_.disconnect(this);
datachannel->SignalOnMessage_.disconnect(this);
datachannel->SignalOnBufferedAmountChange_.disconnect(this);
LOGP_F( INFO ) << "Done";
}
@ -320,12 +389,14 @@ PeerDataChannelObserver::PeerDataChannelObserver(webrtc::DataChannelInterface* c
: channel_(channel) {
channel_->RegisterObserver(this);
state_ = channel_->state();
LOGP_F( INFO ) << "Done";
}
PeerDataChannelObserver::~PeerDataChannelObserver() {
channel_->Close();
state_ = channel_->state();
channel_->UnregisterObserver();
LOGP_F( INFO ) << "Done";
}
void PeerDataChannelObserver::OnBufferedAmountChange(uint64_t previous_amount) {
@ -342,9 +413,11 @@ void PeerDataChannelObserver::OnBufferedAmountChange(uint64_t previous_amount) {
void PeerDataChannelObserver::OnStateChange() {
state_ = channel_->state();
if (state_ == webrtc::DataChannelInterface::DataState::kOpen) {
LOGP_F( INFO ) << "Data channel internal state is kOpen";
SignalOnOpen_();
}
else if (state_ == webrtc::DataChannelInterface::DataState::kClosed) {
LOGP_F( INFO ) << "Data channel internal state is kClosed";
SignalOnClosed_();
}
}
@ -357,7 +430,11 @@ bool PeerDataChannelObserver::Send(const char* buffer, const size_t size) {
rtc::CopyOnWriteBuffer rtcbuffer(buffer, size);
webrtc::DataBuffer databuffer(rtcbuffer, true);
if (channel_->buffered_amount() >= max_buffer_size_) return false;
if ( channel_->buffered_amount() >= max_buffer_size_ ) {
LOGP_F( LERROR ) << "Buffer is full";
return false;
}
return channel_->Send(databuffer);
}
@ -370,6 +447,7 @@ bool PeerDataChannelObserver::SyncSend(const char* buffer, const size_t size) {
if (!send_cv_.wait_for(lock, std::chrono::milliseconds(60*1000),
[this] () { return channel_->buffered_amount() == 0; })) {
LOGP_F( LERROR ) << "Buffer is full";
return false;
}
@ -377,7 +455,7 @@ bool PeerDataChannelObserver::SyncSend(const char* buffer, const size_t size) {
}
void PeerDataChannelObserver::Close() {
LOGP(LS_INFO) << "Close data channel";
LOGP_F(LS_INFO) << "Closing data channel";
if (channel_->state() != webrtc::DataChannelInterface::kClosing) {
channel_->Close();
}
@ -393,8 +471,21 @@ uint64_t PeerDataChannelObserver::BufferedAmount() {
}
bool PeerDataChannelObserver::IsWritable() {
if (channel_ == nullptr) return false;
if (!IsOpen() || channel_->buffered_amount() > 0) return false;
if ( channel_ == nullptr ) {
LOGP_F( LERROR ) << "channel_ is null";
return false;
}
if ( !IsOpen() ) {
LOGP_F( LERROR ) << "data channel is not opened";
return false;
}
if ( channel_->buffered_amount() > 0 ) {
LOGP_F( LERROR ) << "buffer is full";
return false;
}
return true;
}

View File

@ -48,6 +48,7 @@ class PeerControl
public sigslot::has_slots<> {
public:
explicit PeerControl(const std::string local_session_id,
const std::string remote_session_id,
PeerObserver* observer,
@ -56,6 +57,13 @@ public:
~PeerControl();
enum PeerState {
pOpening,
pOpened,
pClosing,
pClosed
};
const std::string& local_id() const { return local_id_; }
const std::string& remote_id() const { return remote_id_; }
@ -127,6 +135,8 @@ protected:
std::unique_ptr<PeerDataChannelObserver> local_data_channel_;
std::unique_ptr<PeerDataChannelObserver> remote_data_channel_;
PeerState state_;
PeerObserver* observer_;
};

View File

@ -18,8 +18,8 @@ PeerConnect::PeerConnect()
PeerConnect::PeerConnect(const std::string setting) {
// Log level
#if DEBUG || _DEBUG
rtc::LogMessage::LogToDebug(rtc::LS_NONE);
pc::LogMessage::LogToDebug(pc::LS_INFO);
rtc::LogMessage::LogToDebug(rtc::WARNING);
pc::LogMessage::LogToDebug(pc::WARNING);
#else
rtc::LogMessage::LogToDebug(rtc::LS_NONE);
pc::LogMessage::LogToDebug(pc::LS_NONE);
@ -40,17 +40,22 @@ PeerConnect::PeerConnect(const std::string setting) {
signal_->SetConfig(setting_.signal_uri_);
}
}
LOGP_F( INFO ) << "Done";
}
PeerConnect::~PeerConnect() {
LOGP_F( INFO ) << "Done";
}
void PeerConnect::Run() {
rtc::ThreadManager::Instance()->CurrentThread()->Run();
LOGP_F( INFO ) << "Done";
}
void PeerConnect::Stop() {
rtc::ThreadManager::Instance()->CurrentThread()->Quit();
LOGP_F( INFO ) << "Done";
}
@ -61,7 +66,7 @@ void PeerConnect::SignIn(const std::string alias, const std::string id, const st
//
if (control_.get() != nullptr) {
LOGP(LS_WARNING) << "Already signined in.";
LOGP_F(WARNING) << "Already signined in.";
return;
}
@ -73,7 +78,7 @@ void PeerConnect::SignIn(const std::string alias, const std::string id, const st
control_->RegisterObserver(this, control_);
if (control_.get() == NULL) {
LOGP(LS_ERROR) << "Failed to create class Control.";
LOGP_F(LERROR) << "Failed to create class Control.";
return;
}
@ -82,7 +87,7 @@ void PeerConnect::SignIn(const std::string alias, const std::string id, const st
//
if (!control_->InitializeControl()) {
LOGP(LS_ERROR) << "Failed to initialize Control.";
LOGP_F(LERROR) << "Failed to initialize Control.";
control_.reset();
return;
}
@ -105,21 +110,25 @@ void PeerConnect::SignIn(const std::string alias, const std::string id, const st
//
control_->SignIn(user_id, password, open_id);
LOGP_F( INFO ) << "Done";
return;
}
void PeerConnect::SignOut() {
signout_ = true;
control_->SignOut();
LOGP_F( INFO ) << "Done";
}
void PeerConnect::Connect(const std::string id) {
control_->Connect(id);
LOGP_F( INFO ) << "Done, id is " << id;
return;
}
void PeerConnect::Disconnect(const std::string id) {
control_->Disconnect(id);
LOGP_F( INFO ) << "Done, id is " << id;
return;
}
@ -170,6 +179,7 @@ PeerConnect& PeerConnect::On(std::string event_id, std::function<void(PeerConnec
std::unique_ptr<EventHandler_2> f(new EventHandler_2(handler));
event_handler_.insert(Events::value_type(event_id, std::move(f)));
LOGP_F( INFO ) << "An event handler '" << event_id << "' has been inserted";
return *this;
}
@ -179,6 +189,7 @@ PeerConnect& PeerConnect::On(std::string event_id, std::function<void(PeerConnec
PeerConnect& PeerConnect::OnMessage(std::function<void(PeerConnect*, std::string, Buffer&)> handler) {
message_handler_ = handler;
LOGP_F( INFO ) << "A message handler has been inserted";
return *this;
}
@ -189,28 +200,47 @@ PeerConnect& PeerConnect::OnMessage(std::function<void(PeerConnect*, std::string
void PeerConnect::OnSignedIn(const std::string id) {
signout_ = false;
if (event_handler_.find("signin") == event_handler_.end()) return;
if ( event_handler_.find( "signin" ) == event_handler_.end() ) {
return;
}
CallEventHandler("signin", this, id);
LOGP_F( INFO ) << "Done";
}
void PeerConnect::OnSignedOut(const std::string id) {
if (!signout_) return;
if (event_handler_.find("signout") == event_handler_.end()) return;
if ( !signout_ ) {
LOGP_F( WARNING ) << "signout_ is false, id is " << id;
return;
}
if ( event_handler_.find( "signout" ) == event_handler_.end() ) {
return;
}
CallEventHandler("signout", this, id);
control_->UnregisterObserver();
control_.reset();
LOGP_F( INFO ) << "Done, id is " << id;
}
void PeerConnect::OnPeerConnected(const std::string id) {
if (event_handler_.find("connect") == event_handler_.end()) return;
if ( event_handler_.find( "connect" ) == event_handler_.end() ) {
return;
}
CallEventHandler("connect", this, id);
LOGP_F( INFO ) << "Done, id is " << id;
}
void PeerConnect::OnPeerDisconnected(const std::string id) {
if (event_handler_.find("disconnect") == event_handler_.end()) return;
if ( event_handler_.find( "disconnect" ) == event_handler_.end() ) {
return;
}
CallEventHandler("disconnect", this, id);
LOGP_F( INFO ) << "Done, id is " << id;
}
void PeerConnect::OnPeerMessage(const std::string id, const char* buffer, const size_t size) {
@ -219,15 +249,22 @@ void PeerConnect::OnPeerMessage(const std::string id, const char* buffer, const
}
void PeerConnect::OnPeerWritable(const std::string id) {
if (event_handler_.find("writable") == event_handler_.end()) return;
if ( event_handler_.find( "writable" ) == event_handler_.end() ) {
return;
}
CallEventHandler("writable", this, id);
LOGP_F( INFO ) << "Done, id is " << id;
}
void PeerConnect::OnError(const std::string id, const std::string& reason) {
if (event_handler_.find("error") == event_handler_.end()) return;
if ( event_handler_.find( "error" ) == event_handler_.end() ) {
return;
}
error_reason_ = reason;
CallEventHandler("error", this, id);
LOGP_F( INFO ) << "Done, id is " << id << " and reason is " << reason;
}
template<typename ...A>
@ -248,7 +285,7 @@ bool PeerConnect::ParseSetting(const std::string& setting) {
std::string value;
if (!reader.parse(setting, jsetting)) {
LOGP(LS_WARNING) << "Invalid setting: " << setting;
LOGP_F(WARNING) << "Invalid setting: " << setting;
return false;
}

View File

@ -53,7 +53,7 @@ Signal::Signal() :
client_.set_access_channels(websocketpp::log::alevel::fail);
#else
client_.clear_access_channels(websocketpp::log::elevel::all);
client_.clear_error_channels(websocketpp::log::alevel::fail);
client_.clear_error_channels(websocketpp::log::alevel::all);
#endif
// Initialize ASIO
@ -69,6 +69,8 @@ Signal::Signal() :
client_.set_fail_handler(bind(&Signal::OnFail, this, _1));
client_.set_message_handler(bind(&Signal::OnMessage, this, _1, _2));
client_.set_tls_init_handler(bind(&Signal::OnTlsInit, this, _1));
LOGP_F( INFO ) << "Done";
}
Signal::~Signal() {
@ -81,6 +83,7 @@ Signal::~Signal() {
#endif
Teardown();
LOGP_F( INFO ) << "Done";
}
@ -97,10 +100,13 @@ void Signal::SignIn(const std::string& id, const std::string& password) {
user_id_ = id;
user_password_ = password;
Connect();
LOGP_F( INFO ) << "Done";
}
void Signal::SignOut() {
if (opened()) Close();
LOGP_F( INFO ) << "Done";
}
void Signal::SendCommand(const std::string channel,
@ -108,12 +114,12 @@ void Signal::SendCommand(const std::string channel,
const Json::Value& data) {
if (commandname.empty()) {
LOGP(LS_WARNING) << "SendCommand with empty commandname";
LOGP_F(WARNING) << "SendCommand with empty commandname";
return;
}
if (!opened()) {
LOGP(LS_WARNING) << "Signal server is not opened";
LOGP_F(WARNING) << "Signal server is not opened";
return;
}
@ -123,18 +129,22 @@ void Signal::SendCommand(const std::string channel,
message["data"] = data;
if (!channel.empty()) message["channel"] = channel;
LOGP_F( LS_VERBOSE ) << "message is " << message.toStyledString();
try {
client_.send(con_hdl_, writer.write(message), websocketpp::frame::opcode::text);
}
catch (websocketpp::lib::error_code& ec) {
LOGP(LS_ERROR) << "SendCommand Error: " << ec;
LOGP_F(LERROR) << "SendCommand Error: " << ec;
}
catch (std::exception& e) {
LOGP(LS_ERROR) << "SendCommand Error: " << e.what();
LOGP_F(LERROR) << "SendCommand Error: " << e.what();
}
catch (...) {
LOGP(LS_ERROR) << "SendCommand Error: ";
LOGP_F(LERROR) << "SendCommand Error: ";
}
LOGP_F( INFO ) << "Done";
}
void Signal::SendGlobalCommand(const std::string commandname,
@ -175,6 +185,7 @@ void Signal::Connect()
this->ResetState();
client_.get_io_service().dispatch(websocketpp::lib::bind(&Signal::ConnectInternal, this));
network_thread_.reset(new websocketpp::lib::thread(websocketpp::lib::bind(&Signal::RunLoop, this)));
LOGP_F( INFO ) << "Done";
}
@ -185,6 +196,7 @@ void Signal::Close()
this,
websocketpp::close::status::normal,
"End by user"));
LOGP_F( INFO ) << "Done";
}
void Signal::SyncClose()
@ -199,12 +211,14 @@ void Signal::SyncClose()
network_thread_->join();
network_thread_.reset();
}
LOGP_F( INFO ) << "Done";
}
void Signal::Teardown()
{
// TODO: Asyncronous close with PeerConnect::Stop()
SyncClose();
LOGP_F( INFO ) << "Done";
}
@ -255,7 +269,7 @@ void Signal::ConnectInternal()
void Signal::CloseInternal(websocketpp::close::status::value const& code, std::string const& reason)
{
LOGP(LS_WARNING) << "Close by reason:" << reason;
LOGP_F(WARNING) << "Close by reason:" << reason;
if (reconn_timer_)
{
@ -264,7 +278,7 @@ void Signal::CloseInternal(websocketpp::close::status::value const& code, std::s
}
if (con_hdl_.expired())
{
LOGP(LS_ERROR) << "Error: No active session";
LOGP_F(LERROR) << "Error: No active session";
}
else
{
@ -285,7 +299,7 @@ void Signal::TimeoutReconnect(websocketpp::lib::asio::error_code const& ec)
con_state_ = con_opening;
reconn_made_++;
this->ResetState();
LOGP(LS_WARNING) << "Reconnecting..";
LOGP_F(WARNING) << "Reconnecting..";
client_.get_io_service().dispatch(websocketpp::lib::bind(&Signal::ConnectInternal, this));
}
}
@ -302,11 +316,11 @@ void Signal::OnFail(websocketpp::connection_hdl con)
{
con_hdl_.reset();
con_state_ = con_closed;
LOGP(LS_ERROR) << "Connection failed.";
LOGP_F(LERROR) << "Connection failed.";
if (reconn_made_<reconn_attempts_)
{
LOGP(LS_WARNING) << "Reconnect for attempt:" << reconn_made_;
LOGP_F(WARNING) << "Reconnect for attempt:" << reconn_made_;
unsigned delay = this->NextDelay();
reconn_timer_.reset(new asio::steady_timer(client_.get_io_service()));
websocketpp::lib::asio::error_code ec;
@ -317,7 +331,7 @@ void Signal::OnFail(websocketpp::connection_hdl con)
void Signal::OnOpen(websocketpp::connection_hdl con)
{
LOGP(LS_WARNING) << "Connected.";
LOGP_F(WARNING) << "Connected.";
con_state_ = con_opened;
con_hdl_ = con;
reconn_made_ = 0;
@ -333,7 +347,7 @@ void Signal::OnClose(websocketpp::connection_hdl con)
websocketpp::close::status::value code = websocketpp::close::status::normal;
client_type::connection_ptr conn_ptr = client_.get_con_from_hdl(con, ec);
if (ec) {
LOGP(LS_ERROR) << "OnClose get conn failed" << ec;
LOGP_F(LERROR) << "OnClose get conn failed" << ec;
}
else
{
@ -352,7 +366,7 @@ void Signal::OnClose(websocketpp::connection_hdl con)
{
if (reconn_made_<reconn_attempts_)
{
LOGP(LS_WARNING) << "Reconnect for attempt:" << reconn_made_;
LOGP_F(LS_WARNING) << "Reconnect for attempt:" << reconn_made_;
unsigned delay = this->NextDelay();
reconn_timer_.reset(new websocketpp::lib::asio::steady_timer(client_.get_io_service()));
websocketpp::lib::asio::error_code ec;
@ -361,6 +375,9 @@ void Signal::OnClose(websocketpp::connection_hdl con)
return;
}
}
LOGP_F( INFO ) << "Done";
}
@ -370,10 +387,11 @@ void Signal::OnMessage(websocketpp::connection_hdl con, client_type::message_ptr
Json::Value jmessage;
if (!reader.parse(msg->get_payload(), jmessage)) {
LOGP(WARNING) << "Received unknown message: " << msg->get_payload();
LOGP_F(WARNING) << "Received unknown message: " << msg->get_payload();
return;
}
LOGP_F( LS_VERBOSE ) << jmessage.toStyledString();
OnCommandReceived(jmessage);
}
@ -392,7 +410,7 @@ Signal::context_ptr Signal::OnTlsInit(websocketpp::connection_hdl conn)
asio::ssl::context::single_dh_use, ec);
if (ec)
{
LOGP(LS_ERROR) << "Init tls failed,reason:" << ec.message();
LOGP_F(LERROR) << "Init tls failed,reason:" << ec.message();
}
return ctx;