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