mirror of
https://github.com/UltraCoderRU/libwebrtc.git
synced 2026-01-28 11:15:13 +00:00
Do not build the samples since they are not included anymore
This commit is contained in:
parent
2617dd15d7
commit
59375cab38
22 changed files with 0 additions and 1227 deletions
|
|
@ -41,7 +41,6 @@ set(LIBWEBRTC_VERSION
|
|||
#
|
||||
|
||||
option(BUILD_TESTS "Build test binaries" OFF)
|
||||
option(BUILD_SAMPLES "Build samples binaries" OFF)
|
||||
set(NINJA_ARGS "" CACHE STRING "Ninja arguments to pass before compiling WebRTC")
|
||||
|
||||
#
|
||||
|
|
|
|||
|
|
@ -1 +0,0 @@
|
|||
add_subdirectory(PeerConnection)
|
||||
|
|
@ -1,75 +0,0 @@
|
|||
project(PeerConnection)
|
||||
|
||||
set(THREADS_PREFER_PTHREAD_FLAG ON)
|
||||
find_package(Threads REQUIRED)
|
||||
|
||||
if(UNIX AND NOT APPLE)
|
||||
find_package(X11 REQUIRED)
|
||||
endif(UNIX AND NOT APPLE)
|
||||
|
||||
if(APPLE)
|
||||
find_library(AUDIOTOOLBOX_LIBRARY AudioToolbox)
|
||||
find_library(COREAUDIO_LIBRARY CoreAudio)
|
||||
find_library(COREFOUNDATION_LIBRARY CoreFoundation)
|
||||
find_library(COREGRAPHICS_LIBRARY CoreGraphics)
|
||||
find_library(FOUNDATION_LIBRARY Foundation)
|
||||
endif(APPLE)
|
||||
|
||||
set(PEERCONNECTION_SOURCE_FILES
|
||||
main.cpp
|
||||
Core.cpp
|
||||
CreateSessionObserver.cpp
|
||||
DataChannelObserver.cpp
|
||||
Peer.cpp
|
||||
PeerConnectionObserver.cpp
|
||||
SetLocalSessionDescriptionObserver.cpp
|
||||
SetRemoteSessionDescriptionObserver.cpp
|
||||
)
|
||||
|
||||
set(PEERCONNECTION_HEADER_FILES
|
||||
Console.h
|
||||
Core.h
|
||||
CreateSessionObserver.h
|
||||
DataChannelObserver.h
|
||||
IPeer.h
|
||||
Peer.h
|
||||
PeerConnectionObserver.h
|
||||
SetLocalSessionDescriptionObserver.h
|
||||
SetRemoteSessionDescriptionObserver.h
|
||||
)
|
||||
|
||||
include_directories(${CMAKE_BINARY_DIR}/src)
|
||||
|
||||
if(WIN32)
|
||||
add_definitions(-DWEBRTC_WIN -DNOMINMAX)
|
||||
set(PEERCONNECTION_SOURCE_FILES ${PEERCONNECTION_SOURCE_FILES}
|
||||
Win32Console.cpp)
|
||||
else(WIN32)
|
||||
add_definitions(-DWEBRTC_POSIX -std=gnu++0x -D_GLIBCXX_USE_CXX11_ABI=0)
|
||||
set(PEERCONNECTION_SOURCE_FILES ${PEERCONNECTION_SOURCE_FILES}
|
||||
UnixConsole.cpp)
|
||||
endif(WIN32)
|
||||
|
||||
add_executable(PeerConnection
|
||||
${PEERCONNECTION_SOURCE_FILES}
|
||||
${PEERCONNECTION_HEADER_FILES})
|
||||
|
||||
set(PEERCONNECTION_LIBRARIES webrtc Threads::Threads)
|
||||
|
||||
if(WIN32)
|
||||
set(PEERCONNECTION_LIBRARIES ${PEERCONNECTION_LIBRARIES} msdmo.lib wmcodecdspuuid.lib dmoguids.lib ole32.lib secur32.lib)
|
||||
elseif(UNIX AND NOT APPLE)
|
||||
set(PEERCONNECTION_LIBRARIES ${PEERCONNECTION_LIBRARIES}
|
||||
${X11_LIBRARIES}
|
||||
${CMAKE_DL_LIBS})
|
||||
elseif(APPLE)
|
||||
set(PEERCONNECTION_LIBRARIES ${PEERCONNECTION_LIBRARIES}
|
||||
${AUDIOTOOLBOX_LIBRARY} ${COREAUDIO_LIBRARY} ${COREFOUNDATION_LIBRARY}
|
||||
${COREGRAPHICS_LIBRARY} ${FOUNDATION_LIBRARY})
|
||||
endif(WIN32)
|
||||
|
||||
add_library(webrtc STATIC IMPORTED)
|
||||
set_property(TARGET webrtc PROPERTY IMPORTED_LOCATION "${CMAKE_BINARY_DIR}/libwebrtc/${LIBWEBRTC_LIBRARY_NAME}")
|
||||
|
||||
target_link_libraries(PeerConnection ${PEERCONNECTION_LIBRARIES})
|
||||
add_dependencies(PeerConnection libwebrtc)
|
||||
|
|
@ -1,20 +0,0 @@
|
|||
//
|
||||
// Created by ax on 25/09/16.
|
||||
//
|
||||
|
||||
#ifndef LIBWEBRTC_UNIXCONSOLE_H
|
||||
#define LIBWEBRTC_UNIXCONSOLE_H
|
||||
|
||||
class Console {
|
||||
public:
|
||||
static bool Init();
|
||||
static bool Update(std::string &input);
|
||||
static void Cleanup();
|
||||
static void Reset(int num);
|
||||
static void Print(const std::string &line, ...);
|
||||
static void Show();
|
||||
static void Hide();
|
||||
static void Back();
|
||||
};
|
||||
|
||||
#endif //LIBWEBRTC_UNIXCONSOLE_H
|
||||
|
|
@ -1,87 +0,0 @@
|
|||
//
|
||||
// Created by ax on 24/09/16.
|
||||
//
|
||||
|
||||
#include "webrtc/base/ssladapter.h"
|
||||
#ifdef WIN32
|
||||
#include "webrtc/base/win32socketinit.h"
|
||||
#include "webrtc/base/win32socketserver.h"
|
||||
#include <Windows.h>
|
||||
#endif
|
||||
#include "Core.h"
|
||||
|
||||
rtc::Thread *Core::_signalingThread = NULL;
|
||||
rtc::Thread *Core::_workerThread = NULL;
|
||||
webrtc::PeerConnectionFactoryInterface *Core::_peerConnectionFactory = NULL;
|
||||
|
||||
bool Core::Init() {
|
||||
#if 0
|
||||
rtc::EnsureWinsockInit();
|
||||
rtc::Win32Thread w32_thread;
|
||||
rtc::ThreadManager::Instance()->SetCurrentThread(&w32_thread);
|
||||
#endif
|
||||
|
||||
rtc::InitializeSSL();
|
||||
rtc::InitRandom(rtc::Time());
|
||||
rtc::ThreadManager::Instance()->WrapCurrentThread();
|
||||
|
||||
_signalingThread = new rtc::Thread();
|
||||
_workerThread = new rtc::Thread();
|
||||
|
||||
_signalingThread->SetName("signaling_thread", NULL);
|
||||
_workerThread->SetName("worker_thread", NULL);
|
||||
|
||||
if (!_signalingThread->Start() || !_workerThread->Start()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
_peerConnectionFactory =
|
||||
webrtc::CreatePeerConnectionFactory(_signalingThread,
|
||||
_workerThread,
|
||||
NULL, NULL, NULL).release();
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool Core::Update() {
|
||||
return rtc::Thread::Current()->ProcessMessages(0);
|
||||
}
|
||||
|
||||
bool Core::Cleanup() {
|
||||
_peerConnectionFactory->Release();
|
||||
_peerConnectionFactory = NULL;
|
||||
|
||||
_signalingThread->Stop();
|
||||
_workerThread->Stop();
|
||||
|
||||
delete _signalingThread;
|
||||
delete _workerThread;
|
||||
|
||||
_signalingThread = NULL;
|
||||
_workerThread = NULL;
|
||||
|
||||
return rtc::CleanupSSL();
|
||||
}
|
||||
|
||||
rtc::Thread *Core::GetSignalingThread() {
|
||||
return _signalingThread;
|
||||
}
|
||||
|
||||
rtc::Thread *Core::GetWorkerThread() {
|
||||
return _workerThread;
|
||||
}
|
||||
|
||||
webrtc::PeerConnectionFactoryInterface *Core::GetPeerConnectionFactory() {
|
||||
return _peerConnectionFactory;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
@ -1,28 +0,0 @@
|
|||
//
|
||||
// Created by ax on 24/09/16.
|
||||
//
|
||||
|
||||
#ifndef LIBWEBRTC_CORE_H
|
||||
#define LIBWEBRTC_CORE_H
|
||||
|
||||
#include "webrtc/api/peerconnectioninterface.h"
|
||||
#include "webrtc/base/thread.h"
|
||||
|
||||
class Core {
|
||||
public:
|
||||
static bool Init();
|
||||
static bool Update();
|
||||
static bool Cleanup();
|
||||
|
||||
static rtc::Thread *GetSignalingThread();
|
||||
static rtc::Thread *GetWorkerThread();
|
||||
static webrtc::PeerConnectionFactoryInterface *GetPeerConnectionFactory();
|
||||
|
||||
private:
|
||||
static rtc::Thread *_signalingThread;
|
||||
static rtc::Thread *_workerThread;
|
||||
static webrtc::PeerConnectionFactoryInterface *_peerConnectionFactory;
|
||||
};
|
||||
|
||||
|
||||
#endif //LIBWEBRTC_CORE_H
|
||||
|
|
@ -1,23 +0,0 @@
|
|||
//
|
||||
// Created by ax on 25/09/16.
|
||||
//
|
||||
|
||||
#include "CreateSessionObserver.h"
|
||||
#include "Console.h"
|
||||
#include "SetLocalSessionDescriptionObserver.h"
|
||||
|
||||
using namespace webrtc;
|
||||
|
||||
CreateSessionObserver::CreateSessionObserver(IPeer *peer): _peer(peer) {
|
||||
}
|
||||
|
||||
void CreateSessionObserver::OnSuccess(SessionDescriptionInterface* desc) {
|
||||
rtc::scoped_refptr<SetLocalSessionDescriptionObserver> observer =
|
||||
new rtc::RefCountedObject<SetLocalSessionDescriptionObserver>(desc);
|
||||
|
||||
_peer->SetLocalSessionDescription(desc, observer);
|
||||
}
|
||||
|
||||
void CreateSessionObserver::OnFailure(const std::string& error) {
|
||||
Console::Print("[CreateSessionObserver::OnFailure] %s", error.c_str());
|
||||
}
|
||||
|
|
@ -1,26 +0,0 @@
|
|||
//
|
||||
// Created by ax on 25/09/16.
|
||||
//
|
||||
|
||||
#ifndef LIBWEBRTC_CREATEOFFEROBSERVER_H
|
||||
#define LIBWEBRTC_CREATEOFFEROBSERVER_H
|
||||
|
||||
#include <webrtc/api/jsep.h>
|
||||
#include "IPeer.h"
|
||||
|
||||
class CreateSessionObserver: public webrtc::CreateSessionDescriptionObserver {
|
||||
public:
|
||||
CreateSessionObserver(IPeer *peer);
|
||||
|
||||
void OnSuccess(webrtc::SessionDescriptionInterface* desc);
|
||||
void OnFailure(const std::string& error);
|
||||
|
||||
private:
|
||||
IPeer *_peer;
|
||||
|
||||
protected:
|
||||
~CreateSessionObserver() {}
|
||||
};
|
||||
|
||||
|
||||
#endif //LIBWEBRTC_CREATEOFFEROBSERVER_H
|
||||
|
|
@ -1,31 +0,0 @@
|
|||
//
|
||||
// Created by ax on 25/09/16.
|
||||
//
|
||||
|
||||
#include "DataChannelObserver.h"
|
||||
#include "Console.h"
|
||||
|
||||
|
||||
DataChannelObserver::DataChannelObserver(
|
||||
webrtc::DataChannelInterface *dataChannel): _dataChannel(dataChannel) {
|
||||
}
|
||||
|
||||
void DataChannelObserver::OnStateChange() {
|
||||
Console::Print("[DataChannelObserver::OnStateChange] %s",
|
||||
webrtc::DataChannelInterface::DataStateString(_dataChannel->state()));
|
||||
}
|
||||
|
||||
void DataChannelObserver::OnMessage(const webrtc::DataBuffer& buffer) {
|
||||
size_t len = buffer.size();
|
||||
const unsigned char *data = buffer.data.cdata();
|
||||
char *message = new char[len + 1];
|
||||
|
||||
memcpy(message, data, len);
|
||||
message[len] = '\0';
|
||||
|
||||
Console::Print("<Remote> %s", message);
|
||||
delete[] message;
|
||||
}
|
||||
|
||||
void DataChannelObserver::OnBufferedAmountChange(uint64_t previous_amount) {
|
||||
}
|
||||
|
|
@ -1,22 +0,0 @@
|
|||
//
|
||||
// Created by ax on 25/09/16.
|
||||
//
|
||||
|
||||
#ifndef LIBWEBRTC_DATACHANNELOBSERVER_H
|
||||
#define LIBWEBRTC_DATACHANNELOBSERVER_H
|
||||
|
||||
#include <webrtc/api/datachannelinterface.h>
|
||||
|
||||
class DataChannelObserver: public webrtc::DataChannelObserver {
|
||||
public:
|
||||
DataChannelObserver(webrtc::DataChannelInterface *dataChannel);
|
||||
|
||||
void OnStateChange();
|
||||
void OnMessage(const webrtc::DataBuffer& buffer);
|
||||
void OnBufferedAmountChange(uint64_t previous_amount);
|
||||
|
||||
private:
|
||||
webrtc::DataChannelInterface *_dataChannel;
|
||||
};
|
||||
|
||||
#endif //LIBWEBRTC_DATACHANNELOBSERVER_H
|
||||
|
|
@ -1,27 +0,0 @@
|
|||
//
|
||||
// Created by ax on 26/09/16.
|
||||
//
|
||||
|
||||
#ifndef LIBWEBRTC_IPEER_H
|
||||
#define LIBWEBRTC_IPEER_H
|
||||
|
||||
#include "webrtc/api/peerconnectioninterface.h"
|
||||
|
||||
class IPeer {
|
||||
public:
|
||||
virtual void CreateOffer(webrtc::CreateSessionDescriptionObserver *createSDPObserver) = 0;
|
||||
virtual void CreateAnswer(webrtc::CreateSessionDescriptionObserver *createSDPObserver) = 0;
|
||||
|
||||
virtual bool AddIceCandidate(webrtc::IceCandidateInterface *candidate) = 0;
|
||||
|
||||
virtual void SetLocalSessionDescription(webrtc::SessionDescriptionInterface* desc,
|
||||
webrtc::SetSessionDescriptionObserver *setSDPObserver) = 0;
|
||||
virtual void SetRemoteSessionDescription(webrtc::SessionDescriptionInterface* desc,
|
||||
webrtc::SetSessionDescriptionObserver *setSDPObserver) = 0;
|
||||
|
||||
virtual bool IsConnected() = 0;
|
||||
virtual void SetDataChannel(webrtc::DataChannelInterface *dataChannel) = 0;
|
||||
virtual void SendMessage(const std::string& message) = 0;
|
||||
};
|
||||
|
||||
#endif //LIBWEBRTC_IPEER_H
|
||||
|
|
@ -1,115 +0,0 @@
|
|||
//
|
||||
// Created by ax on 24/09/16.
|
||||
//
|
||||
|
||||
#include <iostream>
|
||||
#include <third_party/jsoncpp/source/include/json/writer.h>
|
||||
|
||||
#include "Core.h"
|
||||
#include "DataChannelObserver.h"
|
||||
#include "Peer.h"
|
||||
#include "PeerConnectionObserver.h"
|
||||
|
||||
using webrtc::DataChannelInit;
|
||||
using webrtc::PeerConnectionInterface;
|
||||
using webrtc::MediaConstraintsInterface;
|
||||
using webrtc::SessionDescriptionInterface;
|
||||
|
||||
using webrtc::MediaStreamInterface;
|
||||
using webrtc::DataChannelInterface;
|
||||
using webrtc::IceCandidateInterface;
|
||||
|
||||
Peer::Peer() {
|
||||
PeerConnectionInterface::RTCConfiguration config;
|
||||
PeerConnectionInterface::IceServer googleIceServer;
|
||||
|
||||
googleIceServer.uri = "stun:stun.l.google.com:19302";
|
||||
googleIceServer.urls.push_back("stun:stun.l.google.com:19302");
|
||||
googleIceServer.urls.push_back("stun:stun1.l.google.com:19302");
|
||||
googleIceServer.urls.push_back("stun:stun2.l.google.com:19302");
|
||||
googleIceServer.urls.push_back("stun:stun3.l.google.com:19302");
|
||||
googleIceServer.urls.push_back("stun:stun4.l.google.com:19302");
|
||||
|
||||
config.servers.push_back(googleIceServer);
|
||||
|
||||
_dataChannel = NULL;
|
||||
_dataChannelObserver = NULL;
|
||||
_peerConnectionObserver = new PeerConnectionObserver(this);
|
||||
_peerConnection = Core::GetPeerConnectionFactory()->
|
||||
CreatePeerConnection(config, &_mediaConstraints,
|
||||
NULL, NULL, _peerConnectionObserver);
|
||||
|
||||
_mediaConstraints.AddOptional(
|
||||
MediaConstraintsInterface::kEnableDtlsSrtp,
|
||||
MediaConstraintsInterface::kValueTrue);
|
||||
|
||||
_mediaConstraints.AddMandatory(
|
||||
MediaConstraintsInterface::kOfferToReceiveAudio,
|
||||
MediaConstraintsInterface::kValueFalse);
|
||||
|
||||
_mediaConstraints.AddMandatory(
|
||||
MediaConstraintsInterface::kOfferToReceiveVideo,
|
||||
MediaConstraintsInterface::kValueFalse);
|
||||
}
|
||||
|
||||
Peer::~Peer() {
|
||||
if (_dataChannel) {
|
||||
_dataChannel->Close();
|
||||
_dataChannel->UnregisterObserver();
|
||||
_dataChannel = NULL;
|
||||
}
|
||||
|
||||
_peerConnection->Close();
|
||||
_peerConnection = NULL;
|
||||
|
||||
if (_dataChannelObserver) {
|
||||
_dataChannelObserver = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
void Peer::CreateOffer(webrtc::CreateSessionDescriptionObserver *createSDPObserver) {
|
||||
DataChannelInit init;
|
||||
|
||||
init.reliable = true;
|
||||
_dataChannel = _peerConnection->CreateDataChannel("MyDataChannel", &init);
|
||||
_dataChannelObserver = new DataChannelObserver(_dataChannel);
|
||||
_dataChannel->RegisterObserver(_dataChannelObserver);
|
||||
|
||||
_peerConnection->CreateOffer(createSDPObserver, &_mediaConstraints);
|
||||
}
|
||||
|
||||
void Peer::CreateAnswer(webrtc::CreateSessionDescriptionObserver *createSDPObserver) {
|
||||
_peerConnection->CreateAnswer(createSDPObserver, &_mediaConstraints);
|
||||
}
|
||||
|
||||
bool Peer::AddIceCandidate(webrtc::IceCandidateInterface *candidate) {
|
||||
return _peerConnection->AddIceCandidate(candidate);
|
||||
}
|
||||
|
||||
void Peer::SetLocalSessionDescription(SessionDescriptionInterface* desc,
|
||||
webrtc::SetSessionDescriptionObserver *obs) {
|
||||
_peerConnection->SetLocalDescription(obs, desc);
|
||||
}
|
||||
|
||||
void Peer::SetRemoteSessionDescription(SessionDescriptionInterface* desc,
|
||||
webrtc::SetSessionDescriptionObserver *obs) {
|
||||
_peerConnection->SetRemoteDescription(obs, desc);
|
||||
}
|
||||
|
||||
bool Peer::IsConnected() {
|
||||
if (!_dataChannel) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return _dataChannel->state() == webrtc::DataChannelInterface::kOpen;
|
||||
}
|
||||
|
||||
void Peer::SetDataChannel(webrtc::DataChannelInterface *dataChannel) {
|
||||
_dataChannel = dataChannel;
|
||||
}
|
||||
|
||||
void Peer::SendMessage(const std::string& message) {
|
||||
webrtc::DataBuffer buffer(message);
|
||||
|
||||
_dataChannel->Send(buffer);
|
||||
}
|
||||
|
|
@ -1,41 +0,0 @@
|
|||
//
|
||||
// Created by ax on 24/09/16.
|
||||
//
|
||||
|
||||
#ifndef LIBWEBRTC_PEER_H
|
||||
#define LIBWEBRTC_PEER_H
|
||||
|
||||
#include <third_party/jsoncpp/source/include/json/value.h>
|
||||
#include "webrtc/api/test/fakeconstraints.h"
|
||||
#include "webrtc/api/peerconnectioninterface.h"
|
||||
|
||||
#include "IPeer.h"
|
||||
|
||||
class Peer: public IPeer {
|
||||
public:
|
||||
Peer();
|
||||
~Peer();
|
||||
|
||||
void CreateOffer(webrtc::CreateSessionDescriptionObserver *createSDPObserver);
|
||||
void CreateAnswer(webrtc::CreateSessionDescriptionObserver *createSDPObserver);
|
||||
|
||||
bool AddIceCandidate(webrtc::IceCandidateInterface *candidate);
|
||||
|
||||
void SetLocalSessionDescription(webrtc::SessionDescriptionInterface* desc,
|
||||
webrtc::SetSessionDescriptionObserver *setSDPObserver);
|
||||
void SetRemoteSessionDescription(webrtc::SessionDescriptionInterface* desc,
|
||||
webrtc::SetSessionDescriptionObserver *setSDPObserver);
|
||||
|
||||
bool IsConnected();
|
||||
void SetDataChannel(webrtc::DataChannelInterface *dataChannel);
|
||||
void SendMessage(const std::string& message);
|
||||
|
||||
private:
|
||||
rtc::scoped_refptr<webrtc::PeerConnectionInterface> _peerConnection;
|
||||
webrtc::PeerConnectionObserver *_peerConnectionObserver;
|
||||
webrtc::FakeConstraints _mediaConstraints;
|
||||
rtc::scoped_refptr<webrtc::DataChannelInterface> _dataChannel;
|
||||
webrtc::DataChannelObserver *_dataChannelObserver;
|
||||
};
|
||||
|
||||
#endif //LIBWEBRTC_PEER_H
|
||||
|
|
@ -1,92 +0,0 @@
|
|||
//
|
||||
// Created by ax on 25/09/16.
|
||||
//
|
||||
|
||||
#include <third_party/jsoncpp/source/include/json/writer.h>
|
||||
#include "DataChannelObserver.h"
|
||||
#include "PeerConnectionObserver.h"
|
||||
#include "Console.h"
|
||||
|
||||
using webrtc::PeerConnectionInterface;
|
||||
using webrtc::MediaStreamInterface;
|
||||
using webrtc::DataChannelInterface;
|
||||
using webrtc::IceCandidateInterface;
|
||||
|
||||
PeerConnectionObserver::PeerConnectionObserver(IPeer *peer):
|
||||
_peer(peer), _dataChannelObserver(NULL) {
|
||||
}
|
||||
|
||||
void PeerConnectionObserver::OnSignalingChange(
|
||||
PeerConnectionInterface::SignalingState new_state) {
|
||||
Console::Print("[PeerConnectionObserver::OnSignalingChange] new signaling state: %d",
|
||||
new_state);
|
||||
}
|
||||
|
||||
void PeerConnectionObserver::OnAddStream(rtc::scoped_refptr<MediaStreamInterface> stream) {
|
||||
Console::Print("[PeerConnectionObserver::OnAddStream]");
|
||||
}
|
||||
|
||||
void PeerConnectionObserver::OnRemoveStream(rtc::scoped_refptr<MediaStreamInterface> stream) {
|
||||
Console::Print("[PeerConnectionObserver::OnRemoveStream]");
|
||||
}
|
||||
|
||||
void PeerConnectionObserver::OnDataChannel(
|
||||
rtc::scoped_refptr<DataChannelInterface> data_channel) {
|
||||
Console::Print("[PeerConnectionObserver::OnDataChannel] %s", data_channel->label().c_str());
|
||||
_dataChannelObserver = new DataChannelObserver(data_channel);
|
||||
data_channel->RegisterObserver(_dataChannelObserver);
|
||||
_peer->SetDataChannel(data_channel);
|
||||
}
|
||||
|
||||
void PeerConnectionObserver::OnRenegotiationNeeded() {
|
||||
}
|
||||
|
||||
void PeerConnectionObserver::OnIceConnectionChange(
|
||||
PeerConnectionInterface::IceConnectionState new_state) {
|
||||
if (new_state == PeerConnectionInterface::kIceConnectionCompleted) {
|
||||
Console::Print("Connected!");
|
||||
} else if (new_state > PeerConnectionInterface::kIceConnectionCompleted) {
|
||||
Console::Print("Disconnected.");
|
||||
}
|
||||
}
|
||||
|
||||
void PeerConnectionObserver::OnIceGatheringChange(
|
||||
PeerConnectionInterface::IceGatheringState new_state) {
|
||||
if (new_state == PeerConnectionInterface::kIceGatheringGathering) {
|
||||
Console::Print("Gathering ICE candidates, please wait.");
|
||||
return;
|
||||
}
|
||||
|
||||
if (new_state != PeerConnectionInterface::kIceGatheringComplete) {
|
||||
return;
|
||||
}
|
||||
|
||||
Json::FastWriter writer;
|
||||
writer.write(_iceCandidates);
|
||||
|
||||
Console::Print("Done, paste this array of ICE candidates once requested." \
|
||||
"\n\n%s", writer.write(_iceCandidates).c_str());
|
||||
}
|
||||
|
||||
void PeerConnectionObserver::OnIceCandidate(const IceCandidateInterface* candidate) {
|
||||
Json::Value jmessage;
|
||||
|
||||
jmessage["sdpMid"] = candidate->sdp_mid();
|
||||
jmessage["sdpMLineIndex"] = candidate->sdp_mline_index();
|
||||
std::string sdp;
|
||||
if (!candidate->ToString(&sdp)) {
|
||||
Console::Print("[PeerConnectionObserver::OnIceCandidate] Failed to serialize candidate");
|
||||
return;
|
||||
}
|
||||
jmessage["candidate"] = sdp;
|
||||
_iceCandidates.append(jmessage);
|
||||
}
|
||||
|
||||
void PeerConnectionObserver::OnIceCandidatesRemoved(
|
||||
const std::vector<cricket::Candidate>& candidates) {
|
||||
Console::Print("[PeerConnectionObserver::OnIceCandidatesRemoved]");
|
||||
|
||||
}
|
||||
|
||||
void PeerConnectionObserver::OnIceConnectionReceivingChange(bool receiving) {
|
||||
}
|
||||
|
|
@ -1,44 +0,0 @@
|
|||
//
|
||||
// Created by ax on 25/09/16.
|
||||
//
|
||||
|
||||
#ifndef LIBWEBRTC_PEERCONNECTIONOBSERVER_H
|
||||
#define LIBWEBRTC_PEERCONNECTIONOBSERVER_H
|
||||
|
||||
#include <third_party/jsoncpp/source/include/json/value.h>
|
||||
#include <webrtc/api/peerconnectioninterface.h>
|
||||
#include "IPeer.h"
|
||||
|
||||
class PeerConnectionObserver: public webrtc::PeerConnectionObserver {
|
||||
public:
|
||||
PeerConnectionObserver(IPeer *peer);
|
||||
|
||||
void OnSignalingChange(
|
||||
webrtc::PeerConnectionInterface::SignalingState new_state);
|
||||
|
||||
void OnAddStream(rtc::scoped_refptr<webrtc::MediaStreamInterface> stream);
|
||||
void OnRemoveStream(rtc::scoped_refptr<webrtc::MediaStreamInterface> stream);
|
||||
|
||||
void OnDataChannel(
|
||||
rtc::scoped_refptr<webrtc::DataChannelInterface> data_channel);
|
||||
|
||||
void OnRenegotiationNeeded();
|
||||
|
||||
void OnIceConnectionChange(
|
||||
webrtc::PeerConnectionInterface::IceConnectionState new_state);
|
||||
void OnIceGatheringChange(
|
||||
webrtc::PeerConnectionInterface::IceGatheringState new_state);
|
||||
|
||||
void OnIceCandidate(const webrtc::IceCandidateInterface* candidate);
|
||||
void OnIceCandidatesRemoved(
|
||||
const std::vector<cricket::Candidate>& candidates);
|
||||
void OnIceConnectionReceivingChange(bool receiving);
|
||||
|
||||
private:
|
||||
IPeer *_peer;
|
||||
webrtc::DataChannelObserver *_dataChannelObserver;
|
||||
Json::Value _iceCandidates;
|
||||
};
|
||||
|
||||
|
||||
#endif //LIBWEBRTC_PEERCONNECTIONOBSERVER_H
|
||||
|
|
@ -1,30 +0,0 @@
|
|||
//
|
||||
// Created by ax on 25/09/16.
|
||||
//
|
||||
|
||||
#include <third_party/jsoncpp/source/include/json/writer.h>
|
||||
#include "SetLocalSessionDescriptionObserver.h"
|
||||
#include "Console.h"
|
||||
|
||||
SetLocalSessionDescriptionObserver::SetLocalSessionDescriptionObserver(
|
||||
webrtc::SessionDescriptionInterface* desc): _desc(desc) {
|
||||
}
|
||||
|
||||
void SetLocalSessionDescriptionObserver::OnSuccess() {
|
||||
std::string sdp;
|
||||
|
||||
_desc->ToString(&sdp);
|
||||
|
||||
Json::FastWriter writer;
|
||||
Json::Value jmessage;
|
||||
jmessage["type"] = _desc->type();
|
||||
jmessage["sdp"] = sdp;
|
||||
|
||||
Console::Print("Here is the SDP, paste it to the remote client and paste " \
|
||||
"their answer here.\n\n%s", writer.write(jmessage).c_str());
|
||||
}
|
||||
|
||||
void SetLocalSessionDescriptionObserver::OnFailure(const std::string& error) {
|
||||
Console::Print("[SetLocalSessionDescriptionObserver::OnFailure] %s",
|
||||
error.c_str());
|
||||
}
|
||||
|
|
@ -1,27 +0,0 @@
|
|||
//
|
||||
// Created by ax on 25/09/16.
|
||||
//
|
||||
|
||||
#ifndef LIBWEBRTC_SETLOCALSESSIONDESCRIPTIONOBSERVER_H
|
||||
#define LIBWEBRTC_SETLOCALSESSIONDESCRIPTIONOBSERVER_H
|
||||
|
||||
|
||||
#include <webrtc/api/jsep.h>
|
||||
|
||||
class SetLocalSessionDescriptionObserver:
|
||||
public webrtc::SetSessionDescriptionObserver {
|
||||
public:
|
||||
SetLocalSessionDescriptionObserver(webrtc::SessionDescriptionInterface* desc);
|
||||
|
||||
void OnSuccess();
|
||||
void OnFailure(const std::string& error);
|
||||
|
||||
private:
|
||||
webrtc::SessionDescriptionInterface* _desc;
|
||||
|
||||
protected:
|
||||
~SetLocalSessionDescriptionObserver() {}
|
||||
};
|
||||
|
||||
|
||||
#endif //LIBWEBRTC_SETLOCALSESSIONDESCRIPTIONOBSERVER_H
|
||||
|
|
@ -1,27 +0,0 @@
|
|||
//
|
||||
// Created by ax on 25/09/16.
|
||||
//
|
||||
|
||||
#include "SetRemoteSessionDescriptionObserver.h"
|
||||
#include "CreateSessionObserver.h"
|
||||
#include "Console.h"
|
||||
|
||||
|
||||
SetRemoteSessionDescriptionObserver::SetRemoteSessionDescriptionObserver(
|
||||
IPeer *peer, webrtc::SessionDescriptionInterface* desc):
|
||||
_peer(peer), _desc(desc) {
|
||||
}
|
||||
|
||||
void SetRemoteSessionDescriptionObserver::OnSuccess() {
|
||||
if (_desc->type() == webrtc::SessionDescriptionInterface::kOffer) {
|
||||
rtc::scoped_refptr<CreateSessionObserver> createAnswerObserver =
|
||||
new rtc::RefCountedObject<CreateSessionObserver>(_peer);
|
||||
|
||||
_peer->CreateAnswer(createAnswerObserver);
|
||||
}
|
||||
}
|
||||
|
||||
void SetRemoteSessionDescriptionObserver::OnFailure(const std::string& error) {
|
||||
Console::Print("[SetRemoteSessionDescriptionObserver::OnFailure] %s",
|
||||
error.c_str());
|
||||
}
|
||||
|
|
@ -1,28 +0,0 @@
|
|||
//
|
||||
// Created by ax on 25/09/16.
|
||||
//
|
||||
|
||||
#ifndef LIBWEBRTC_SETREMOTESESSIONDESCRIPTIONOBSERVER_H
|
||||
#define LIBWEBRTC_SETREMOTESESSIONDESCRIPTIONOBSERVER_H
|
||||
|
||||
#include <webrtc/api/jsep.h>
|
||||
#include "IPeer.h"
|
||||
|
||||
class SetRemoteSessionDescriptionObserver:
|
||||
public webrtc::SetSessionDescriptionObserver {
|
||||
public:
|
||||
SetRemoteSessionDescriptionObserver(IPeer *peer, webrtc::SessionDescriptionInterface* desc);
|
||||
|
||||
void OnSuccess();
|
||||
void OnFailure(const std::string& error);
|
||||
|
||||
private:
|
||||
IPeer *_peer;
|
||||
webrtc::SessionDescriptionInterface* _desc;
|
||||
|
||||
protected:
|
||||
~SetRemoteSessionDescriptionObserver() {}
|
||||
};
|
||||
|
||||
|
||||
#endif //LIBWEBRTC_SETREMOTESESSIONDESCRIPTIONOBSERVER_H
|
||||
|
|
@ -1,153 +0,0 @@
|
|||
//
|
||||
// Created by ax on 25/09/16.
|
||||
//
|
||||
|
||||
#include <csignal>
|
||||
#include <cstdarg>
|
||||
#include <cstdlib>
|
||||
#include <cstring>
|
||||
#include <iostream>
|
||||
#include <fcntl.h>
|
||||
#include <termios.h>
|
||||
#include <unistd.h>
|
||||
#include "Console.h"
|
||||
|
||||
static int ttyErase;
|
||||
static int ttyEof;
|
||||
static struct termios ttyTc;
|
||||
|
||||
static size_t cursor;
|
||||
static std::string buffer;
|
||||
|
||||
bool Console::Init() {
|
||||
struct termios tc;
|
||||
const char* term = getenv("TERM");
|
||||
|
||||
signal(SIGTTIN, SIG_IGN);
|
||||
signal(SIGTTOU, SIG_IGN);
|
||||
signal(SIGCONT, Console::Reset);
|
||||
fcntl(STDIN_FILENO, F_SETFL, fcntl(STDIN_FILENO, F_GETFL, 0) | O_NONBLOCK );
|
||||
|
||||
if (!(isatty(STDIN_FILENO) &&
|
||||
!(term && (!strcmp(term, "raw") || !strcmp(term, "dumb"))))) {
|
||||
std::cerr << "Input is not a tty." << std::endl;
|
||||
return false;
|
||||
}
|
||||
|
||||
tcgetattr (STDIN_FILENO, &ttyTc);
|
||||
ttyErase = ttyTc.c_cc[VERASE];
|
||||
ttyEof = ttyTc.c_cc[VEOF];
|
||||
|
||||
tc = ttyTc;
|
||||
tc.c_lflag &= ~(ECHO | ICANON);
|
||||
tc.c_iflag &= ~(ISTRIP | INPCK);
|
||||
tc.c_cc[VMIN] = 1;
|
||||
tc.c_cc[VTIME] = 0;
|
||||
tcsetattr (STDIN_FILENO, TCSADRAIN, &tc);
|
||||
|
||||
cursor = 0;
|
||||
buffer.clear();
|
||||
return true;
|
||||
}
|
||||
|
||||
bool Console::Update(std::string &input) {
|
||||
char key;
|
||||
ssize_t avail = read(STDIN_FILENO, &key, 1);
|
||||
|
||||
input.clear();
|
||||
if (avail == -1) {
|
||||
return true;
|
||||
}
|
||||
|
||||
if (key == ttyEof) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (((key == ttyErase) || (key == 127) || (key == 8)) && cursor > 0)
|
||||
{
|
||||
buffer.erase(--cursor, 1);
|
||||
Console::Back();
|
||||
return true;
|
||||
}
|
||||
|
||||
if (key == '\n') {
|
||||
input = buffer;
|
||||
cursor = 0;
|
||||
buffer.clear();
|
||||
|
||||
write(STDOUT_FILENO, &key, 1);
|
||||
key = '>';
|
||||
write(STDOUT_FILENO, &key, 1);
|
||||
key = ' ';
|
||||
write(STDOUT_FILENO, &key, 1);
|
||||
return true;
|
||||
}
|
||||
|
||||
if (key < ' ') {
|
||||
return true;
|
||||
}
|
||||
|
||||
cursor++;
|
||||
buffer.append(1, key);
|
||||
write(STDOUT_FILENO, &key, 1);
|
||||
return true;
|
||||
}
|
||||
|
||||
void Console::Cleanup() {
|
||||
tcsetattr (STDIN_FILENO, TCSADRAIN, &ttyTc);
|
||||
fcntl(STDIN_FILENO, F_SETFL, fcntl(STDIN_FILENO, F_GETFL, 0) & ~O_NONBLOCK);
|
||||
}
|
||||
|
||||
void Console::Reset(int num) {
|
||||
Console::Init();
|
||||
}
|
||||
|
||||
void Console::Show() {
|
||||
char key;
|
||||
|
||||
key = '>';
|
||||
write(STDOUT_FILENO, &key, 1);
|
||||
key = ' ';
|
||||
write(STDOUT_FILENO, &key, 1);
|
||||
|
||||
|
||||
for (size_t i = 0; i < cursor; i++) {
|
||||
key = buffer.at(i);
|
||||
write(STDOUT_FILENO, &key, 1);
|
||||
}
|
||||
}
|
||||
|
||||
void Console::Hide() {
|
||||
for (int i = 0; i < cursor + 2; i++) {
|
||||
Console::Back();
|
||||
}
|
||||
}
|
||||
|
||||
void Console::Print(const std::string &fmt, ...) {
|
||||
va_list argptr;
|
||||
char string[1024];
|
||||
|
||||
if (!fmt.length()) {
|
||||
return;
|
||||
}
|
||||
|
||||
va_start(argptr, fmt);
|
||||
vsnprintf(string, sizeof(string), fmt.c_str(), argptr);
|
||||
va_end(argptr);
|
||||
|
||||
Console::Hide();
|
||||
std::cout << string << std::endl;
|
||||
Console::Show();
|
||||
}
|
||||
|
||||
void Console::Back()
|
||||
{
|
||||
char key;
|
||||
|
||||
key = '\b';
|
||||
write(STDOUT_FILENO, &key, 1);
|
||||
key = ' ';
|
||||
write(STDOUT_FILENO, &key, 1);
|
||||
key = '\b';
|
||||
write(STDOUT_FILENO, &key, 1);
|
||||
}
|
||||
|
|
@ -1,195 +0,0 @@
|
|||
#include <iostream>
|
||||
#include <cstdarg>
|
||||
#include <Windows.h>
|
||||
#include "Console.h"
|
||||
|
||||
#define MAX_EDIT_LINE 32768
|
||||
|
||||
static HANDLE hOUT;
|
||||
static HANDLE hIN;
|
||||
|
||||
static DWORD dMode;
|
||||
static WORD wAttrib;
|
||||
static CONSOLE_CURSOR_INFO cursorInfo;
|
||||
|
||||
static size_t cursor;
|
||||
static std::string buffer;
|
||||
|
||||
bool Console::Init() {
|
||||
CONSOLE_CURSOR_INFO curs;
|
||||
CONSOLE_SCREEN_BUFFER_INFO info;
|
||||
|
||||
hIN = GetStdHandle(STD_INPUT_HANDLE);
|
||||
if (hIN == INVALID_HANDLE_VALUE) {
|
||||
return false;
|
||||
}
|
||||
|
||||
hOUT = GetStdHandle(STD_OUTPUT_HANDLE);
|
||||
if (hOUT == INVALID_HANDLE_VALUE) {
|
||||
return false;
|
||||
}
|
||||
|
||||
GetConsoleMode(hIN, &dMode);
|
||||
SetConsoleMode(hIN, dMode & ~ENABLE_MOUSE_INPUT);
|
||||
|
||||
FlushConsoleInputBuffer(hIN);
|
||||
|
||||
GetConsoleScreenBufferInfo(hOUT, &info);
|
||||
wAttrib = info.wAttributes;
|
||||
|
||||
GetConsoleCursorInfo(hOUT, &cursorInfo);
|
||||
curs.dwSize = 1;
|
||||
curs.bVisible = FALSE;
|
||||
SetConsoleCursorInfo(hOUT, &curs);
|
||||
|
||||
cursor = 0;
|
||||
buffer.clear();
|
||||
return true;
|
||||
}
|
||||
|
||||
bool Console::Update(std::string &input) {
|
||||
INPUT_RECORD *buff;
|
||||
DWORD count;
|
||||
DWORD events;
|
||||
char key;
|
||||
int newline = -1;
|
||||
int i;
|
||||
|
||||
input.clear();
|
||||
if (!GetNumberOfConsoleInputEvents(hIN, &events)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
if (events < 1) {
|
||||
return true;
|
||||
}
|
||||
|
||||
buff = new INPUT_RECORD[events];
|
||||
if (!ReadConsoleInput(hIN, buff, events, &count)) {
|
||||
delete[] buff;
|
||||
return true;
|
||||
}
|
||||
|
||||
if (count < 1) {
|
||||
delete[] buff;
|
||||
return true;
|
||||
}
|
||||
|
||||
FlushConsoleInputBuffer(hIN);
|
||||
|
||||
for (i = 0; i < count; i++) {
|
||||
if (buff[i].EventType != KEY_EVENT) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (!buff[i].Event.KeyEvent.bKeyDown) {
|
||||
continue;
|
||||
}
|
||||
|
||||
key = buff[i].Event.KeyEvent.wVirtualKeyCode;
|
||||
|
||||
if (key == VK_RETURN) {
|
||||
newline = i;
|
||||
break;
|
||||
} else if (key == VK_BACK) {
|
||||
buffer.erase(--cursor, 1);
|
||||
}
|
||||
|
||||
char c = buff[i].Event.KeyEvent.uChar.AsciiChar;
|
||||
|
||||
if (c) {
|
||||
cursor++;
|
||||
buffer.append(1, c);
|
||||
}
|
||||
}
|
||||
|
||||
delete[] buff;
|
||||
Console::Show();
|
||||
|
||||
if (newline < 0) {
|
||||
return true;
|
||||
}
|
||||
newline = 0;
|
||||
|
||||
if (!buffer.length())
|
||||
{
|
||||
std::cout << std::endl;
|
||||
return true;
|
||||
}
|
||||
|
||||
std::cout << buffer.c_str() << std::endl;
|
||||
|
||||
input = buffer;
|
||||
cursor = 0;
|
||||
buffer.clear();
|
||||
return true;
|
||||
}
|
||||
|
||||
void Console::Cleanup() {
|
||||
SetConsoleMode(hIN, dMode);
|
||||
SetConsoleCursorInfo(hOUT, &cursorInfo);
|
||||
CloseHandle(hOUT);
|
||||
CloseHandle(hIN);
|
||||
}
|
||||
|
||||
void Console::Reset(int num) {
|
||||
Console::Init();
|
||||
}
|
||||
|
||||
void Console::Show() {
|
||||
int i;
|
||||
CONSOLE_SCREEN_BUFFER_INFO binfo;
|
||||
COORD writeSize = { MAX_EDIT_LINE, 1 };
|
||||
COORD writePos = { 0, 0 };
|
||||
SMALL_RECT writeArea = { 0, 0, 0, 0 };
|
||||
CHAR_INFO line[MAX_EDIT_LINE];
|
||||
|
||||
GetConsoleScreenBufferInfo(hOUT, &binfo);
|
||||
|
||||
if (binfo.dwCursorPosition.X != 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
writeArea.Left = 0;
|
||||
writeArea.Top = binfo.dwCursorPosition.Y;
|
||||
writeArea.Bottom = binfo.dwCursorPosition.Y;
|
||||
writeArea.Right = MAX_EDIT_LINE;
|
||||
|
||||
for (i = 0; i < MAX_EDIT_LINE; i++) {
|
||||
if (i < buffer.length())
|
||||
line[i].Char.AsciiChar = buffer.at(i);
|
||||
else
|
||||
line[i].Char.AsciiChar = ' ';
|
||||
|
||||
line[i].Attributes = wAttrib;
|
||||
}
|
||||
|
||||
if (buffer.length() > binfo.srWindow.Right) {
|
||||
WriteConsoleOutput(hOUT, line + (buffer.length() - binfo.srWindow.Right),
|
||||
writeSize, writePos, &writeArea);
|
||||
} else {
|
||||
WriteConsoleOutput(hOUT, line, writeSize, writePos, &writeArea);
|
||||
}
|
||||
}
|
||||
|
||||
void Console::Hide() {
|
||||
}
|
||||
|
||||
void Console::Print(const std::string &fmt, ...) {
|
||||
va_list argptr;
|
||||
char string[1024];
|
||||
|
||||
if (!fmt.length()) {
|
||||
return;
|
||||
}
|
||||
|
||||
va_start(argptr, fmt);
|
||||
vsnprintf(string, sizeof(string), fmt.c_str(), argptr);
|
||||
va_end(argptr);
|
||||
|
||||
std::cout << string << std::endl;
|
||||
Console::Show();
|
||||
}
|
||||
|
||||
void Console::Back() {
|
||||
}
|
||||
|
|
@ -1,134 +0,0 @@
|
|||
#include <iostream>
|
||||
#include <third_party/jsoncpp/source/include/json/reader.h>
|
||||
#include "Core.h"
|
||||
#include "CreateSessionObserver.h"
|
||||
#include "DataChannelObserver.h"
|
||||
#include "Peer.h"
|
||||
#include "SetRemoteSessionDescriptionObserver.h"
|
||||
#include "Console.h"
|
||||
|
||||
static IPeer *peer = NULL;
|
||||
|
||||
void HandleSDP(Json::Value object) {
|
||||
std::string type = object["type"].asString();
|
||||
std::string sdp = object["sdp"].asString();
|
||||
|
||||
webrtc::SdpParseError error;
|
||||
webrtc::SessionDescriptionInterface* desc(
|
||||
webrtc::CreateSessionDescription(type, sdp, &error));
|
||||
|
||||
if (!desc) {
|
||||
Console::Print("Can't parse the SDP: %s", error.description.c_str());
|
||||
return;
|
||||
}
|
||||
|
||||
rtc::scoped_refptr<SetRemoteSessionDescriptionObserver> observer =
|
||||
new rtc::RefCountedObject<SetRemoteSessionDescriptionObserver>(peer, desc);
|
||||
|
||||
peer->SetRemoteSessionDescription(desc, observer);
|
||||
}
|
||||
|
||||
void HandleICECandidate(Json::Value object) {
|
||||
std::string sdp_mid = object["sdpMid"].asString();
|
||||
int sdp_mlineindex = object["sdpMLineIndex"].asInt();
|
||||
std::string sdp = object["candidate"].asString();
|
||||
|
||||
webrtc::SdpParseError error;
|
||||
std::unique_ptr<webrtc::IceCandidateInterface> candidate(
|
||||
webrtc::CreateIceCandidate(sdp_mid, sdp_mlineindex, sdp, &error));
|
||||
|
||||
if (!candidate.get()) {
|
||||
Console::Print("Can't parse the ICE candidate: %s", error.description.c_str());
|
||||
return;
|
||||
}
|
||||
|
||||
if (!peer->AddIceCandidate(candidate.get())) {
|
||||
Console::Print("Failed to add the ICE candidate.");
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
void HandleObject(Json::Value object) {
|
||||
if (object.isMember("type") && object["type"].isString() &&
|
||||
object.isMember("sdp") && object["sdp"].isString()) {
|
||||
HandleSDP(object);
|
||||
return;
|
||||
}
|
||||
|
||||
if (object.isMember("candidate") && object["candidate"].isString() &&
|
||||
object.isMember("sdpMLineIndex") && object["sdpMLineIndex"].isNumeric() &&
|
||||
object.isMember("sdpMid") && object["sdpMid"].isString()) {
|
||||
HandleICECandidate(object);
|
||||
return;
|
||||
}
|
||||
|
||||
Console::Print("Unknown object.");
|
||||
}
|
||||
|
||||
void HandleCommand(const std::string& input) {
|
||||
Json::Reader reader;
|
||||
Json::Value jmessage;
|
||||
|
||||
if (peer->IsConnected()) {
|
||||
peer->SendMessage(input);
|
||||
return;
|
||||
}
|
||||
|
||||
if (!reader.parse(input, jmessage)) {
|
||||
Console::Print("Invalid JSON string.");
|
||||
return;
|
||||
}
|
||||
|
||||
if (jmessage.isArray()) {
|
||||
for (Json::ValueIterator it = jmessage.begin();
|
||||
it != jmessage.end(); it++) {
|
||||
if (!(*it).isObject()) {
|
||||
continue;
|
||||
}
|
||||
|
||||
HandleObject(*it);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
if (jmessage.isObject()) {
|
||||
HandleObject(jmessage);
|
||||
return;
|
||||
}
|
||||
|
||||
Console::Print("Must be an array or object.");
|
||||
}
|
||||
|
||||
int main(int argc, char **argv) {
|
||||
std::string input;
|
||||
|
||||
if (!Console::Init()) {
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
|
||||
Core::Init();
|
||||
|
||||
peer = new Peer();
|
||||
|
||||
if (argc == 1) {
|
||||
rtc::scoped_refptr<CreateSessionObserver> createOfferObserver =
|
||||
new rtc::RefCountedObject<CreateSessionObserver>(peer);
|
||||
|
||||
peer->CreateOffer(createOfferObserver);
|
||||
} else {
|
||||
Console::Print("Recipient mode. Paste the offer made by the emitter.\n");
|
||||
}
|
||||
|
||||
while (Console::Update(input)) {
|
||||
if (input.length()) {
|
||||
HandleCommand(input);
|
||||
}
|
||||
Core::Update();
|
||||
}
|
||||
|
||||
delete peer;
|
||||
|
||||
Core::Cleanup();
|
||||
Console::Cleanup();
|
||||
return EXIT_SUCCESS;
|
||||
}
|
||||
Loading…
Add table
Reference in a new issue