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