10e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org/* 20e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * libjingle 30e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * Copyright 2004--2005, Google Inc. 40e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * 50e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * Redistribution and use in source and binary forms, with or without 60e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * modification, are permitted provided that the following conditions are met: 70e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * 80e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * 1. Redistributions of source code must retain the above copyright notice, 90e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * this list of conditions and the following disclaimer. 100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * 2. Redistributions in binary form must reproduce the above copyright notice, 110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * this list of conditions and the following disclaimer in the documentation 120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * and/or other materials provided with the distribution. 130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * 3. The name of the author may not be used to endorse or promote products 140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * derived from this software without specific prior written permission. 150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * 160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED 170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO 190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org */ 270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 28cf81adffe15fa8ea0f333432e41f6d504148f18abuildbot@webrtc.org#include "talk/p2p/base/transport.h" 29cf81adffe15fa8ea0f333432e41f6d504148f18abuildbot@webrtc.org#include "talk/p2p/base/transportchannelimpl.h" 300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include "talk/p2p/base/transportchannelproxy.h" 312a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org#include "webrtc/base/common.h" 322a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org#include "webrtc/base/logging.h" 332a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org#include "webrtc/base/thread.h" 340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgnamespace cricket { 360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgenum { 380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org MSG_UPDATESTATE, 390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}; 400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTransportChannelProxy::TransportChannelProxy(const std::string& content_name, 420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const std::string& name, 430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org int component) 440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org : TransportChannel(content_name, component), 450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org name_(name), 460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org impl_(NULL) { 472a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org worker_thread_ = rtc::Thread::Current(); 480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTransportChannelProxy::~TransportChannelProxy() { 510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Clearing any pending signal. 520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org worker_thread_->Clear(this); 530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (impl_) 540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org impl_->GetTransport()->DestroyChannel(impl_->component()); 550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgvoid TransportChannelProxy::SetImplementation(TransportChannelImpl* impl) { 582a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org ASSERT(rtc::Thread::Current() == worker_thread_); 595528070a0c76057a000b877fc56ca4180ad2087bmallinath@webrtc.org 605528070a0c76057a000b877fc56ca4180ad2087bmallinath@webrtc.org if (impl == impl_) { 615528070a0c76057a000b877fc56ca4180ad2087bmallinath@webrtc.org // Ignore if the |impl| has already been set. 625528070a0c76057a000b877fc56ca4180ad2087bmallinath@webrtc.org LOG(LS_WARNING) << "Ignored TransportChannelProxy::SetImplementation call " 635528070a0c76057a000b877fc56ca4180ad2087bmallinath@webrtc.org << "with a same impl as the existing one."; 645528070a0c76057a000b877fc56ca4180ad2087bmallinath@webrtc.org return; 655528070a0c76057a000b877fc56ca4180ad2087bmallinath@webrtc.org } 660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Destroy any existing impl_. 680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (impl_) { 690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org impl_->GetTransport()->DestroyChannel(impl_->component()); 700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Adopt the supplied impl, and connect to its signals. 730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org impl_ = impl; 740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (impl_) { 760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org impl_->SignalReadableState.connect( 770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org this, &TransportChannelProxy::OnReadableState); 780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org impl_->SignalWritableState.connect( 790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org this, &TransportChannelProxy::OnWritableState); 800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org impl_->SignalReadPacket.connect( 810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org this, &TransportChannelProxy::OnReadPacket); 820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org impl_->SignalReadyToSend.connect( 830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org this, &TransportChannelProxy::OnReadyToSend); 840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org impl_->SignalRouteChange.connect( 850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org this, &TransportChannelProxy::OnRouteChange); 860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org for (OptionList::iterator it = pending_options_.begin(); 870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org it != pending_options_.end(); 880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ++it) { 890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org impl_->SetOption(it->first, it->second); 900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Push down the SRTP ciphers, if any were set. 930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (!pending_srtp_ciphers_.empty()) { 940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org impl_->SetSrtpCiphers(pending_srtp_ciphers_); 950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org pending_options_.clear(); 970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Post ourselves a message to see if we need to fire state callbacks. 1000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org worker_thread_->Post(this, MSG_UPDATESTATE); 1010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 1020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 103391247d05a663265807c400947ab6eb01ae3d690mallinath@webrtc.orgint TransportChannelProxy::SendPacket(const char* data, size_t len, 1042a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org const rtc::PacketOptions& options, 105391247d05a663265807c400947ab6eb01ae3d690mallinath@webrtc.org int flags) { 1062a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org ASSERT(rtc::Thread::Current() == worker_thread_); 1070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Fail if we don't have an impl yet. 1080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (!impl_) { 1090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return -1; 1100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 111f5e5b3a9ce372d0e3cc594bf0036dda64a57d81dmallinath@webrtc.org return impl_->SendPacket(data, len, options, flags); 1120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 1130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1142a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.orgint TransportChannelProxy::SetOption(rtc::Socket::Option opt, int value) { 1152a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org ASSERT(rtc::Thread::Current() == worker_thread_); 1160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (!impl_) { 1170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org pending_options_.push_back(OptionPair(opt, value)); 1180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return 0; 1190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 1200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return impl_->SetOption(opt, value); 1210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 1220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgint TransportChannelProxy::GetError() { 1242a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org ASSERT(rtc::Thread::Current() == worker_thread_); 1250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (!impl_) { 1260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return 0; 1270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 1280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return impl_->GetError(); 1290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 1300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgbool TransportChannelProxy::GetStats(ConnectionInfos* infos) { 1322a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org ASSERT(rtc::Thread::Current() == worker_thread_); 1330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (!impl_) { 1340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return false; 1350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 1360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return impl_->GetStats(infos); 1370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 1380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgbool TransportChannelProxy::IsDtlsActive() const { 1402a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org ASSERT(rtc::Thread::Current() == worker_thread_); 1410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (!impl_) { 1420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return false; 1430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 1440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return impl_->IsDtlsActive(); 1450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 1460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1472a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.orgbool TransportChannelProxy::GetSslRole(rtc::SSLRole* role) const { 1482a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org ASSERT(rtc::Thread::Current() == worker_thread_); 149a487db2aeda23ade81f0b2e5fd4d50f874d06a9csergeyu@chromium.org if (!impl_) { 150a487db2aeda23ade81f0b2e5fd4d50f874d06a9csergeyu@chromium.org return false; 151a487db2aeda23ade81f0b2e5fd4d50f874d06a9csergeyu@chromium.org } 152a487db2aeda23ade81f0b2e5fd4d50f874d06a9csergeyu@chromium.org return impl_->GetSslRole(role); 153a487db2aeda23ade81f0b2e5fd4d50f874d06a9csergeyu@chromium.org} 154a487db2aeda23ade81f0b2e5fd4d50f874d06a9csergeyu@chromium.org 1552a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.orgbool TransportChannelProxy::SetSslRole(rtc::SSLRole role) { 1562a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org ASSERT(rtc::Thread::Current() == worker_thread_); 157a487db2aeda23ade81f0b2e5fd4d50f874d06a9csergeyu@chromium.org if (!impl_) { 158a487db2aeda23ade81f0b2e5fd4d50f874d06a9csergeyu@chromium.org return false; 159a487db2aeda23ade81f0b2e5fd4d50f874d06a9csergeyu@chromium.org } 160a487db2aeda23ade81f0b2e5fd4d50f874d06a9csergeyu@chromium.org return impl_->SetSslRole(role); 161a487db2aeda23ade81f0b2e5fd4d50f874d06a9csergeyu@chromium.org} 162a487db2aeda23ade81f0b2e5fd4d50f874d06a9csergeyu@chromium.org 1630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgbool TransportChannelProxy::SetSrtpCiphers(const std::vector<std::string>& 1640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ciphers) { 1652a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org ASSERT(rtc::Thread::Current() == worker_thread_); 1660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org pending_srtp_ciphers_ = ciphers; // Cache so we can send later, but always 1670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // set so it stays consistent. 1680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (impl_) { 1690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return impl_->SetSrtpCiphers(ciphers); 1700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 1710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return true; 1720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 1730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgbool TransportChannelProxy::GetSrtpCipher(std::string* cipher) { 1752a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org ASSERT(rtc::Thread::Current() == worker_thread_); 1760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (!impl_) { 1770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return false; 1780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 1790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return impl_->GetSrtpCipher(cipher); 1800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 1810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 18262fe97f10a7a3200c9724851f6a18537ed270cddwu@webrtc.orgbool TransportChannelProxy::GetLocalIdentity( 1832a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::SSLIdentity** identity) const { 1842a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org ASSERT(rtc::Thread::Current() == worker_thread_); 18562fe97f10a7a3200c9724851f6a18537ed270cddwu@webrtc.org if (!impl_) { 18662fe97f10a7a3200c9724851f6a18537ed270cddwu@webrtc.org return false; 18762fe97f10a7a3200c9724851f6a18537ed270cddwu@webrtc.org } 18862fe97f10a7a3200c9724851f6a18537ed270cddwu@webrtc.org return impl_->GetLocalIdentity(identity); 18962fe97f10a7a3200c9724851f6a18537ed270cddwu@webrtc.org} 19062fe97f10a7a3200c9724851f6a18537ed270cddwu@webrtc.org 19162fe97f10a7a3200c9724851f6a18537ed270cddwu@webrtc.orgbool TransportChannelProxy::GetRemoteCertificate( 1922a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::SSLCertificate** cert) const { 1932a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org ASSERT(rtc::Thread::Current() == worker_thread_); 19462fe97f10a7a3200c9724851f6a18537ed270cddwu@webrtc.org if (!impl_) { 19562fe97f10a7a3200c9724851f6a18537ed270cddwu@webrtc.org return false; 19662fe97f10a7a3200c9724851f6a18537ed270cddwu@webrtc.org } 19762fe97f10a7a3200c9724851f6a18537ed270cddwu@webrtc.org return impl_->GetRemoteCertificate(cert); 19862fe97f10a7a3200c9724851f6a18537ed270cddwu@webrtc.org} 19962fe97f10a7a3200c9724851f6a18537ed270cddwu@webrtc.org 2000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgbool TransportChannelProxy::ExportKeyingMaterial(const std::string& label, 2010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const uint8* context, 2020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org size_t context_len, 2030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org bool use_context, 2040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org uint8* result, 2050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org size_t result_len) { 2062a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org ASSERT(rtc::Thread::Current() == worker_thread_); 2070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (!impl_) { 2080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return false; 2090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 2100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return impl_->ExportKeyingMaterial(label, context, context_len, use_context, 2110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org result, result_len); 2120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 2130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 214e560834da4ee5a5f38a96a8cb9290c5ce1096989mallinath@webrtc.orgIceRole TransportChannelProxy::GetIceRole() const { 2152a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org ASSERT(rtc::Thread::Current() == worker_thread_); 2160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (!impl_) { 217e560834da4ee5a5f38a96a8cb9290c5ce1096989mallinath@webrtc.org return ICEROLE_UNKNOWN; 2180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 219e560834da4ee5a5f38a96a8cb9290c5ce1096989mallinath@webrtc.org return impl_->GetIceRole(); 2200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 2210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 2220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgvoid TransportChannelProxy::OnReadableState(TransportChannel* channel) { 2232a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org ASSERT(rtc::Thread::Current() == worker_thread_); 2240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT(channel == impl_); 2250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org set_readable(impl_->readable()); 2260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Note: SignalReadableState fired by set_readable. 2270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 2280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 2290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgvoid TransportChannelProxy::OnWritableState(TransportChannel* channel) { 2302a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org ASSERT(rtc::Thread::Current() == worker_thread_); 2310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT(channel == impl_); 2320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org set_writable(impl_->writable()); 2330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Note: SignalWritableState fired by set_readable. 2340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 2350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 236f89a403cd8db88001322bbb0765c4636fd123700wu@webrtc.orgvoid TransportChannelProxy::OnReadPacket( 237f89a403cd8db88001322bbb0765c4636fd123700wu@webrtc.org TransportChannel* channel, const char* data, size_t size, 2382a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org const rtc::PacketTime& packet_time, int flags) { 2392a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org ASSERT(rtc::Thread::Current() == worker_thread_); 2400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT(channel == impl_); 241f89a403cd8db88001322bbb0765c4636fd123700wu@webrtc.org SignalReadPacket(this, data, size, packet_time, flags); 2420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 2430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 2440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgvoid TransportChannelProxy::OnReadyToSend(TransportChannel* channel) { 2452a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org ASSERT(rtc::Thread::Current() == worker_thread_); 2460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT(channel == impl_); 2470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org SignalReadyToSend(this); 2480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 2490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 2500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgvoid TransportChannelProxy::OnRouteChange(TransportChannel* channel, 2510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const Candidate& candidate) { 2522a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org ASSERT(rtc::Thread::Current() == worker_thread_); 2530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT(channel == impl_); 2540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org SignalRouteChange(this, candidate); 2550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 2560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 2572a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.orgvoid TransportChannelProxy::OnMessage(rtc::Message* msg) { 2582a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org ASSERT(rtc::Thread::Current() == worker_thread_); 2590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (msg->message_id == MSG_UPDATESTATE) { 2600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // If impl_ is already readable or writable, push up those signals. 2610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org set_readable(impl_ ? impl_->readable() : false); 2620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org set_writable(impl_ ? impl_->writable() : false); 2630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 2640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 2650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 2660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} // namespace cricket 267