OLD | NEW |
| (Empty) |
1 /* | |
2 * libjingle | |
3 * Copyright 2004--2008, Google Inc. | |
4 * | |
5 * Redistribution and use in source and binary forms, with or without | |
6 * modification, are permitted provided that the following conditions are met: | |
7 * | |
8 * 1. Redistributions of source code must retain the above copyright notice, | |
9 * this list of conditions and the following disclaimer. | |
10 * 2. Redistributions in binary form must reproduce the above copyright notice, | |
11 * this list of conditions and the following disclaimer in the documentation | |
12 * and/or other materials provided with the distribution. | |
13 * 3. The name of the author may not be used to endorse or promote products | |
14 * derived from this software without specific prior written permission. | |
15 * | |
16 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED | |
17 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF | |
18 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO | |
19 * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |
20 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, | |
21 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; | |
22 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, | |
23 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR | |
24 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF | |
25 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |
26 */ | |
27 | |
28 #ifndef __TUNNELSESSIONCLIENT_H__ | |
29 #define __TUNNELSESSIONCLIENT_H__ | |
30 | |
31 #include <vector> | |
32 | |
33 #include "webrtc/base/criticalsection.h" | |
34 #include "webrtc/base/stream.h" | |
35 #include "webrtc/libjingle/session/sessionclient.h" | |
36 #include "webrtc/libjingle/session/sessionmanager.h" | |
37 #include "webrtc/libjingle/xmllite/qname.h" | |
38 #include "webrtc/libjingle/xmpp/constants.h" | |
39 #include "webrtc/p2p/base/constants.h" | |
40 #include "webrtc/p2p/base/pseudotcp.h" | |
41 #include "webrtc/p2p/base/session.h" | |
42 #include "webrtc/p2p/base/sessiondescription.h" | |
43 | |
44 namespace cricket { | |
45 | |
46 class TunnelSession; | |
47 class TunnelStream; | |
48 | |
49 enum TunnelSessionRole { INITIATOR, RESPONDER }; | |
50 | |
51 /////////////////////////////////////////////////////////////////////////////// | |
52 // TunnelSessionClient | |
53 /////////////////////////////////////////////////////////////////////////////// | |
54 | |
55 // Base class is still abstract | |
56 class TunnelSessionClientBase | |
57 : public SessionClient, public rtc::MessageHandler { | |
58 public: | |
59 TunnelSessionClientBase(const buzz::Jid& jid, SessionManager* manager, | |
60 const std::string &ns); | |
61 virtual ~TunnelSessionClientBase(); | |
62 | |
63 const buzz::Jid& jid() const { return jid_; } | |
64 SessionManager* session_manager() const { return session_manager_; } | |
65 | |
66 void OnSessionCreate(Session* session, bool received); | |
67 void OnSessionDestroy(Session* session); | |
68 | |
69 // This can be called on any thread. The stream interface is | |
70 // thread-safe, but notifications must be registered on the creating | |
71 // thread. | |
72 rtc::StreamInterface* CreateTunnel(const buzz::Jid& to, | |
73 const std::string& description); | |
74 | |
75 rtc::StreamInterface* AcceptTunnel(Session* session); | |
76 void DeclineTunnel(Session* session); | |
77 | |
78 // Invoked on an incoming tunnel | |
79 virtual void OnIncomingTunnel(const buzz::Jid &jid, Session *session) = 0; | |
80 | |
81 // Invoked on an outgoing session request | |
82 virtual SessionDescription* CreateOffer( | |
83 const buzz::Jid &jid, const std::string &description) = 0; | |
84 // Invoked on a session request accept to create | |
85 // the local-side session description | |
86 virtual SessionDescription* CreateAnswer( | |
87 const SessionDescription* offer) = 0; | |
88 | |
89 protected: | |
90 | |
91 void OnMessage(rtc::Message* pmsg); | |
92 | |
93 // helper method to instantiate TunnelSession. By overriding this, | |
94 // subclasses of TunnelSessionClient are able to instantiate | |
95 // subclasses of TunnelSession instead. | |
96 virtual TunnelSession* MakeTunnelSession(Session* session, | |
97 rtc::Thread* stream_thread, | |
98 TunnelSessionRole role); | |
99 | |
100 buzz::Jid jid_; | |
101 SessionManager* session_manager_; | |
102 std::vector<TunnelSession*> sessions_; | |
103 std::string namespace_; | |
104 bool shutdown_; | |
105 }; | |
106 | |
107 class TunnelSessionClient | |
108 : public TunnelSessionClientBase, public sigslot::has_slots<> { | |
109 public: | |
110 TunnelSessionClient(const buzz::Jid& jid, SessionManager* manager); | |
111 TunnelSessionClient(const buzz::Jid& jid, SessionManager* manager, | |
112 const std::string &ns); | |
113 virtual ~TunnelSessionClient(); | |
114 | |
115 virtual bool ParseContent(SignalingProtocol protocol, | |
116 const buzz::XmlElement* elem, | |
117 ContentDescription** content, | |
118 ParseError* error); | |
119 virtual bool WriteContent(SignalingProtocol protocol, | |
120 const ContentDescription* content, | |
121 buzz::XmlElement** elem, | |
122 WriteError* error); | |
123 | |
124 // Signal arguments are this, initiator, description, session | |
125 sigslot::signal4<TunnelSessionClient*, buzz::Jid, std::string, Session*> | |
126 SignalIncomingTunnel; | |
127 | |
128 virtual void OnIncomingTunnel(const buzz::Jid &jid, | |
129 Session *session); | |
130 virtual SessionDescription* CreateOffer( | |
131 const buzz::Jid &jid, const std::string &description); | |
132 virtual SessionDescription* CreateAnswer( | |
133 const SessionDescription* offer); | |
134 }; | |
135 | |
136 /////////////////////////////////////////////////////////////////////////////// | |
137 // TunnelSession | |
138 // Note: The lifetime of TunnelSession is complicated. It needs to survive | |
139 // until the following three conditions are true: | |
140 // 1) TunnelStream has called Close (tracked via non-null stream_) | |
141 // 2) PseudoTcp has completed (tracked via non-null tcp_) | |
142 // 3) Session has been destroyed (tracked via non-null session_) | |
143 // This is accomplished by calling CheckDestroy after these indicators change. | |
144 /////////////////////////////////////////////////////////////////////////////// | |
145 /////////////////////////////////////////////////////////////////////////////// | |
146 // TunnelStream | |
147 // Note: Because TunnelStream provides a stream interface, its lifetime is | |
148 // controlled by the owner of the stream pointer. As a result, we must support | |
149 // both the TunnelSession disappearing before TunnelStream, and vice versa. | |
150 /////////////////////////////////////////////////////////////////////////////// | |
151 | |
152 class PseudoTcpChannel; | |
153 | |
154 class TunnelSession : public sigslot::has_slots<> { | |
155 public: | |
156 // Signalling thread methods | |
157 TunnelSession(TunnelSessionClientBase* client, Session* session, | |
158 rtc::Thread* stream_thread); | |
159 | |
160 virtual rtc::StreamInterface* GetStream(); | |
161 bool HasSession(Session* session); | |
162 Session* ReleaseSession(bool channel_exists); | |
163 | |
164 protected: | |
165 virtual ~TunnelSession(); | |
166 | |
167 virtual void OnSessionState(BaseSession* session, BaseSession::State state); | |
168 virtual void OnInitiate(); | |
169 virtual void OnAccept(); | |
170 virtual void OnTerminate(); | |
171 virtual void OnChannelClosed(PseudoTcpChannel* channel); | |
172 | |
173 TunnelSessionClientBase* client_; | |
174 Session* session_; | |
175 PseudoTcpChannel* channel_; | |
176 }; | |
177 | |
178 /////////////////////////////////////////////////////////////////////////////// | |
179 | |
180 } // namespace cricket | |
181 | |
182 #endif // __TUNNELSESSIONCLIENT_H__ | |
OLD | NEW |