xref: /aosp_15_r20/external/webrtc/examples/peerconnection/server/peer_channel.h (revision d9f758449e529ab9291ac668be2861e7a55c2422)
1*d9f75844SAndroid Build Coastguard Worker /*
2*d9f75844SAndroid Build Coastguard Worker  *  Copyright 2011 The WebRTC Project Authors. All rights reserved.
3*d9f75844SAndroid Build Coastguard Worker  *
4*d9f75844SAndroid Build Coastguard Worker  *  Use of this source code is governed by a BSD-style license
5*d9f75844SAndroid Build Coastguard Worker  *  that can be found in the LICENSE file in the root of the source
6*d9f75844SAndroid Build Coastguard Worker  *  tree. An additional intellectual property rights grant can be found
7*d9f75844SAndroid Build Coastguard Worker  *  in the file PATENTS.  All contributing project authors may
8*d9f75844SAndroid Build Coastguard Worker  *  be found in the AUTHORS file in the root of the source tree.
9*d9f75844SAndroid Build Coastguard Worker  */
10*d9f75844SAndroid Build Coastguard Worker 
11*d9f75844SAndroid Build Coastguard Worker #ifndef EXAMPLES_PEERCONNECTION_SERVER_PEER_CHANNEL_H_
12*d9f75844SAndroid Build Coastguard Worker #define EXAMPLES_PEERCONNECTION_SERVER_PEER_CHANNEL_H_
13*d9f75844SAndroid Build Coastguard Worker 
14*d9f75844SAndroid Build Coastguard Worker #include <time.h>
15*d9f75844SAndroid Build Coastguard Worker 
16*d9f75844SAndroid Build Coastguard Worker #include <queue>
17*d9f75844SAndroid Build Coastguard Worker #include <string>
18*d9f75844SAndroid Build Coastguard Worker #include <vector>
19*d9f75844SAndroid Build Coastguard Worker 
20*d9f75844SAndroid Build Coastguard Worker class DataSocket;
21*d9f75844SAndroid Build Coastguard Worker 
22*d9f75844SAndroid Build Coastguard Worker // Represents a single peer connected to the server.
23*d9f75844SAndroid Build Coastguard Worker class ChannelMember {
24*d9f75844SAndroid Build Coastguard Worker  public:
25*d9f75844SAndroid Build Coastguard Worker   explicit ChannelMember(DataSocket* socket);
26*d9f75844SAndroid Build Coastguard Worker   ~ChannelMember();
27*d9f75844SAndroid Build Coastguard Worker 
connected()28*d9f75844SAndroid Build Coastguard Worker   bool connected() const { return connected_; }
id()29*d9f75844SAndroid Build Coastguard Worker   int id() const { return id_; }
set_disconnected()30*d9f75844SAndroid Build Coastguard Worker   void set_disconnected() { connected_ = false; }
31*d9f75844SAndroid Build Coastguard Worker   bool is_wait_request(DataSocket* ds) const;
name()32*d9f75844SAndroid Build Coastguard Worker   const std::string& name() const { return name_; }
33*d9f75844SAndroid Build Coastguard Worker 
34*d9f75844SAndroid Build Coastguard Worker   bool TimedOut();
35*d9f75844SAndroid Build Coastguard Worker 
36*d9f75844SAndroid Build Coastguard Worker   std::string GetPeerIdHeader() const;
37*d9f75844SAndroid Build Coastguard Worker 
38*d9f75844SAndroid Build Coastguard Worker   bool NotifyOfOtherMember(const ChannelMember& other);
39*d9f75844SAndroid Build Coastguard Worker 
40*d9f75844SAndroid Build Coastguard Worker   // Returns a string in the form "name,id\n".
41*d9f75844SAndroid Build Coastguard Worker   std::string GetEntry() const;
42*d9f75844SAndroid Build Coastguard Worker 
43*d9f75844SAndroid Build Coastguard Worker   void ForwardRequestToPeer(DataSocket* ds, ChannelMember* peer);
44*d9f75844SAndroid Build Coastguard Worker 
45*d9f75844SAndroid Build Coastguard Worker   void OnClosing(DataSocket* ds);
46*d9f75844SAndroid Build Coastguard Worker 
47*d9f75844SAndroid Build Coastguard Worker   void QueueResponse(const std::string& status,
48*d9f75844SAndroid Build Coastguard Worker                      const std::string& content_type,
49*d9f75844SAndroid Build Coastguard Worker                      const std::string& extra_headers,
50*d9f75844SAndroid Build Coastguard Worker                      const std::string& data);
51*d9f75844SAndroid Build Coastguard Worker 
52*d9f75844SAndroid Build Coastguard Worker   void SetWaitingSocket(DataSocket* ds);
53*d9f75844SAndroid Build Coastguard Worker 
54*d9f75844SAndroid Build Coastguard Worker  protected:
55*d9f75844SAndroid Build Coastguard Worker   struct QueuedResponse {
56*d9f75844SAndroid Build Coastguard Worker     std::string status, content_type, extra_headers, data;
57*d9f75844SAndroid Build Coastguard Worker   };
58*d9f75844SAndroid Build Coastguard Worker 
59*d9f75844SAndroid Build Coastguard Worker   DataSocket* waiting_socket_;
60*d9f75844SAndroid Build Coastguard Worker   int id_;
61*d9f75844SAndroid Build Coastguard Worker   bool connected_;
62*d9f75844SAndroid Build Coastguard Worker   time_t timestamp_;
63*d9f75844SAndroid Build Coastguard Worker   std::string name_;
64*d9f75844SAndroid Build Coastguard Worker   std::queue<QueuedResponse> queue_;
65*d9f75844SAndroid Build Coastguard Worker   static int s_member_id_;
66*d9f75844SAndroid Build Coastguard Worker };
67*d9f75844SAndroid Build Coastguard Worker 
68*d9f75844SAndroid Build Coastguard Worker // Manages all currently connected peers.
69*d9f75844SAndroid Build Coastguard Worker class PeerChannel {
70*d9f75844SAndroid Build Coastguard Worker  public:
71*d9f75844SAndroid Build Coastguard Worker   typedef std::vector<ChannelMember*> Members;
72*d9f75844SAndroid Build Coastguard Worker 
PeerChannel()73*d9f75844SAndroid Build Coastguard Worker   PeerChannel() {}
74*d9f75844SAndroid Build Coastguard Worker 
~PeerChannel()75*d9f75844SAndroid Build Coastguard Worker   ~PeerChannel() { DeleteAll(); }
76*d9f75844SAndroid Build Coastguard Worker 
members()77*d9f75844SAndroid Build Coastguard Worker   const Members& members() const { return members_; }
78*d9f75844SAndroid Build Coastguard Worker 
79*d9f75844SAndroid Build Coastguard Worker   // Returns true if the request should be treated as a new ChannelMember
80*d9f75844SAndroid Build Coastguard Worker   // request.  Otherwise the request is not peerconnection related.
81*d9f75844SAndroid Build Coastguard Worker   static bool IsPeerConnection(const DataSocket* ds);
82*d9f75844SAndroid Build Coastguard Worker 
83*d9f75844SAndroid Build Coastguard Worker   // Finds a connected peer that's associated with the `ds` socket.
84*d9f75844SAndroid Build Coastguard Worker   ChannelMember* Lookup(DataSocket* ds) const;
85*d9f75844SAndroid Build Coastguard Worker 
86*d9f75844SAndroid Build Coastguard Worker   // Checks if the request has a "peer_id" parameter and if so, looks up the
87*d9f75844SAndroid Build Coastguard Worker   // peer for which the request is targeted at.
88*d9f75844SAndroid Build Coastguard Worker   ChannelMember* IsTargetedRequest(const DataSocket* ds) const;
89*d9f75844SAndroid Build Coastguard Worker 
90*d9f75844SAndroid Build Coastguard Worker   // Adds a new ChannelMember instance to the list of connected peers and
91*d9f75844SAndroid Build Coastguard Worker   // associates it with the socket.
92*d9f75844SAndroid Build Coastguard Worker   bool AddMember(DataSocket* ds);
93*d9f75844SAndroid Build Coastguard Worker 
94*d9f75844SAndroid Build Coastguard Worker   // Closes all connections and sends a "shutting down" message to all
95*d9f75844SAndroid Build Coastguard Worker   // connected peers.
96*d9f75844SAndroid Build Coastguard Worker   void CloseAll();
97*d9f75844SAndroid Build Coastguard Worker 
98*d9f75844SAndroid Build Coastguard Worker   // Called when a socket was determined to be closing by the peer (or if the
99*d9f75844SAndroid Build Coastguard Worker   // connection went dead).
100*d9f75844SAndroid Build Coastguard Worker   void OnClosing(DataSocket* ds);
101*d9f75844SAndroid Build Coastguard Worker 
102*d9f75844SAndroid Build Coastguard Worker   void CheckForTimeout();
103*d9f75844SAndroid Build Coastguard Worker 
104*d9f75844SAndroid Build Coastguard Worker  protected:
105*d9f75844SAndroid Build Coastguard Worker   void DeleteAll();
106*d9f75844SAndroid Build Coastguard Worker   void BroadcastChangedState(const ChannelMember& member,
107*d9f75844SAndroid Build Coastguard Worker                              Members* delivery_failures);
108*d9f75844SAndroid Build Coastguard Worker   void HandleDeliveryFailures(Members* failures);
109*d9f75844SAndroid Build Coastguard Worker 
110*d9f75844SAndroid Build Coastguard Worker   // Builds a simple list of "name,id\n" entries for each member.
111*d9f75844SAndroid Build Coastguard Worker   std::string BuildResponseForNewMember(const ChannelMember& member,
112*d9f75844SAndroid Build Coastguard Worker                                         std::string* content_type);
113*d9f75844SAndroid Build Coastguard Worker 
114*d9f75844SAndroid Build Coastguard Worker  protected:
115*d9f75844SAndroid Build Coastguard Worker   Members members_;
116*d9f75844SAndroid Build Coastguard Worker };
117*d9f75844SAndroid Build Coastguard Worker 
118*d9f75844SAndroid Build Coastguard Worker #endif  // EXAMPLES_PEERCONNECTION_SERVER_PEER_CHANNEL_H_
119