| Index: talk/examples/peerconnection/server/main.cc
|
| diff --git a/talk/examples/peerconnection/server/main.cc b/talk/examples/peerconnection/server/main.cc
|
| deleted file mode 100644
|
| index 0d0b98e2bcbdf37b9df6c7214a1a5856d526955f..0000000000000000000000000000000000000000
|
| --- a/talk/examples/peerconnection/server/main.cc
|
| +++ /dev/null
|
| @@ -1,190 +0,0 @@
|
| -/*
|
| - * libjingle
|
| - * Copyright 2011 Google Inc.
|
| - *
|
| - * Redistribution and use in source and binary forms, with or without
|
| - * modification, are permitted provided that the following conditions are met:
|
| - *
|
| - * 1. Redistributions of source code must retain the above copyright notice,
|
| - * this list of conditions and the following disclaimer.
|
| - * 2. Redistributions in binary form must reproduce the above copyright notice,
|
| - * this list of conditions and the following disclaimer in the documentation
|
| - * and/or other materials provided with the distribution.
|
| - * 3. The name of the author may not be used to endorse or promote products
|
| - * derived from this software without specific prior written permission.
|
| - *
|
| - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
|
| - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
| - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
|
| - * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
| - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
| - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
| - * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
| - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
| - * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
| - * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
| - */
|
| -
|
| -#include <stdio.h>
|
| -#include <stdlib.h>
|
| -#include <string.h>
|
| -
|
| -#include <vector>
|
| -
|
| -#include "talk/examples/peerconnection/server/data_socket.h"
|
| -#include "talk/examples/peerconnection/server/peer_channel.h"
|
| -#include "talk/examples/peerconnection/server/utils.h"
|
| -#include "webrtc/base/flags.h"
|
| -
|
| -DEFINE_bool(help, false, "Prints this message");
|
| -DEFINE_int(port, 8888, "The port on which to listen.");
|
| -
|
| -static const size_t kMaxConnections = (FD_SETSIZE - 2);
|
| -
|
| -void HandleBrowserRequest(DataSocket* ds, bool* quit) {
|
| - assert(ds && ds->valid());
|
| - assert(quit);
|
| -
|
| - const std::string& path = ds->request_path();
|
| -
|
| - *quit = (path.compare("/quit") == 0);
|
| -
|
| - if (*quit) {
|
| - ds->Send("200 OK", true, "text/html", "",
|
| - "<html><body>Quitting...</body></html>");
|
| - } else if (ds->method() == DataSocket::OPTIONS) {
|
| - // We'll get this when a browsers do cross-resource-sharing requests.
|
| - // The headers to allow cross-origin script support will be set inside
|
| - // Send.
|
| - ds->Send("200 OK", true, "", "", "");
|
| - } else {
|
| - // Here we could write some useful output back to the browser depending on
|
| - // the path.
|
| - printf("Received an invalid request: %s\n", ds->request_path().c_str());
|
| - ds->Send("500 Sorry", true, "text/html", "",
|
| - "<html><body>Sorry, not yet implemented</body></html>");
|
| - }
|
| -}
|
| -
|
| -int main(int argc, char** argv) {
|
| - rtc::FlagList::SetFlagsFromCommandLine(&argc, argv, true);
|
| - if (FLAG_help) {
|
| - rtc::FlagList::Print(NULL, false);
|
| - return 0;
|
| - }
|
| -
|
| - // Abort if the user specifies a port that is outside the allowed
|
| - // range [1, 65535].
|
| - if ((FLAG_port < 1) || (FLAG_port > 65535)) {
|
| - printf("Error: %i is not a valid port.\n", FLAG_port);
|
| - return -1;
|
| - }
|
| -
|
| - ListeningSocket listener;
|
| - if (!listener.Create()) {
|
| - printf("Failed to create server socket\n");
|
| - return -1;
|
| - } else if (!listener.Listen(FLAG_port)) {
|
| - printf("Failed to listen on server socket\n");
|
| - return -1;
|
| - }
|
| -
|
| - printf("Server listening on port %i\n", FLAG_port);
|
| -
|
| - PeerChannel clients;
|
| - typedef std::vector<DataSocket*> SocketArray;
|
| - SocketArray sockets;
|
| - bool quit = false;
|
| - while (!quit) {
|
| - fd_set socket_set;
|
| - FD_ZERO(&socket_set);
|
| - if (listener.valid())
|
| - FD_SET(listener.socket(), &socket_set);
|
| -
|
| - for (SocketArray::iterator i = sockets.begin(); i != sockets.end(); ++i)
|
| - FD_SET((*i)->socket(), &socket_set);
|
| -
|
| - struct timeval timeout = { 10, 0 };
|
| - if (select(FD_SETSIZE, &socket_set, NULL, NULL, &timeout) == SOCKET_ERROR) {
|
| - printf("select failed\n");
|
| - break;
|
| - }
|
| -
|
| - for (SocketArray::iterator i = sockets.begin(); i != sockets.end(); ++i) {
|
| - DataSocket* s = *i;
|
| - bool socket_done = true;
|
| - if (FD_ISSET(s->socket(), &socket_set)) {
|
| - if (s->OnDataAvailable(&socket_done) && s->request_received()) {
|
| - ChannelMember* member = clients.Lookup(s);
|
| - if (member || PeerChannel::IsPeerConnection(s)) {
|
| - if (!member) {
|
| - if (s->PathEquals("/sign_in")) {
|
| - clients.AddMember(s);
|
| - } else {
|
| - printf("No member found for: %s\n",
|
| - s->request_path().c_str());
|
| - s->Send("500 Error", true, "text/plain", "",
|
| - "Peer most likely gone.");
|
| - }
|
| - } else if (member->is_wait_request(s)) {
|
| - // no need to do anything.
|
| - socket_done = false;
|
| - } else {
|
| - ChannelMember* target = clients.IsTargetedRequest(s);
|
| - if (target) {
|
| - member->ForwardRequestToPeer(s, target);
|
| - } else if (s->PathEquals("/sign_out")) {
|
| - s->Send("200 OK", true, "text/plain", "", "");
|
| - } else {
|
| - printf("Couldn't find target for request: %s\n",
|
| - s->request_path().c_str());
|
| - s->Send("500 Error", true, "text/plain", "",
|
| - "Peer most likely gone.");
|
| - }
|
| - }
|
| - } else {
|
| - HandleBrowserRequest(s, &quit);
|
| - if (quit) {
|
| - printf("Quitting...\n");
|
| - FD_CLR(listener.socket(), &socket_set);
|
| - listener.Close();
|
| - clients.CloseAll();
|
| - }
|
| - }
|
| - }
|
| - } else {
|
| - socket_done = false;
|
| - }
|
| -
|
| - if (socket_done) {
|
| - printf("Disconnecting socket\n");
|
| - clients.OnClosing(s);
|
| - assert(s->valid()); // Close must not have been called yet.
|
| - FD_CLR(s->socket(), &socket_set);
|
| - delete (*i);
|
| - i = sockets.erase(i);
|
| - if (i == sockets.end())
|
| - break;
|
| - }
|
| - }
|
| -
|
| - clients.CheckForTimeout();
|
| -
|
| - if (FD_ISSET(listener.socket(), &socket_set)) {
|
| - DataSocket* s = listener.Accept();
|
| - if (sockets.size() >= kMaxConnections) {
|
| - delete s; // sorry, that's all we can take.
|
| - printf("Connection limit reached\n");
|
| - } else {
|
| - sockets.push_back(s);
|
| - printf("New connection...\n");
|
| - }
|
| - }
|
| - }
|
| -
|
| - for (SocketArray::iterator i = sockets.begin(); i != sockets.end(); ++i)
|
| - delete (*i);
|
| - sockets.clear();
|
| -
|
| - return 0;
|
| -}
|
|
|