| /* | |
| * Copyright 2012 The WebRTC Project Authors. All rights reserved. | |
| * | |
| * Use of this source code is governed by a BSD-style license | |
| * that can be found in the LICENSE file in the root of the source | |
| * tree. An additional intellectual property rights grant can be found | |
| * in the file PATENTS. All contributing project authors may | |
| * be found in the AUTHORS file in the root of the source tree. | |
| */ | |
| #include <glib.h> | |
| #include <gtk/gtk.h> | |
| #include <stdio.h> | |
| #include "absl/flags/parse.h" | |
| #include "api/scoped_refptr.h" | |
| #include "examples/peerconnection/client/conductor.h" | |
| #include "examples/peerconnection/client/flag_defs.h" | |
| #include "examples/peerconnection/client/linux/main_wnd.h" | |
| #include "examples/peerconnection/client/peer_connection_client.h" | |
| #include "rtc_base/physical_socket_server.h" | |
| #include "rtc_base/ref_counted_object.h" | |
| #include "rtc_base/ssl_adapter.h" | |
| #include "rtc_base/thread.h" | |
| #include "system_wrappers/include/field_trial.h" | |
| #include "test/field_trial.h" | |
| class CustomSocketServer : public rtc::PhysicalSocketServer { | |
| public: | |
| explicit CustomSocketServer(GtkMainWnd* wnd) | |
| : wnd_(wnd), conductor_(NULL), client_(NULL) {} | |
| virtual ~CustomSocketServer() {} | |
| void SetMessageQueue(rtc::Thread* queue) override { message_queue_ = queue; } | |
| void set_client(PeerConnectionClient* client) { client_ = client; } | |
| void set_conductor(Conductor* conductor) { conductor_ = conductor; } | |
| // Override so that we can also pump the GTK message loop. | |
| bool Wait(int cms, bool process_io) override { | |
| // Pump GTK events. | |
| // TODO(henrike): We really should move either the socket server or UI to a | |
| // different thread. Alternatively we could look at merging the two loops | |
| // by implementing a dispatcher for the socket server and/or use | |
| // g_main_context_set_poll_func. | |
| while (gtk_events_pending()) | |
| gtk_main_iteration(); | |
| if (!wnd_->IsWindow() && !conductor_->connection_active() && | |
| client_ != NULL && !client_->is_connected()) { | |
| message_queue_->Quit(); | |
| } | |
| return rtc::PhysicalSocketServer::Wait(0 /*cms == -1 ? 1 : cms*/, | |
| process_io); | |
| } | |
| protected: | |
| rtc::Thread* message_queue_; | |
| GtkMainWnd* wnd_; | |
| Conductor* conductor_; | |
| PeerConnectionClient* client_; | |
| }; | |
| int main(int argc, char* argv[]) { | |
| gtk_init(&argc, &argv); | |
| // g_type_init API is deprecated (and does nothing) since glib 2.35.0, see: | |
| // https://mail.gnome.org/archives/commits-list/2012-November/msg07809.html | |
| #if !GLIB_CHECK_VERSION(2, 35, 0) | |
| g_type_init(); | |
| #endif | |
| // g_thread_init API is deprecated since glib 2.31.0, see release note: | |
| // http://mail.gnome.org/archives/gnome-announce-list/2011-October/msg00041.html | |
| #if !GLIB_CHECK_VERSION(2, 31, 0) | |
| g_thread_init(NULL); | |
| #endif | |
| absl::ParseCommandLine(argc, argv); | |
| // InitFieldTrialsFromString stores the char*, so the char array must outlive | |
| // the application. | |
| const std::string forced_field_trials = | |
| absl::GetFlag(FLAGS_force_fieldtrials); | |
| webrtc::field_trial::InitFieldTrialsFromString(forced_field_trials.c_str()); | |
| // Abort if the user specifies a port that is outside the allowed | |
| // range [1, 65535]. | |
| if ((absl::GetFlag(FLAGS_port) < 1) || (absl::GetFlag(FLAGS_port) > 65535)) { | |
| printf("Error: %i is not a valid port.\n", absl::GetFlag(FLAGS_port)); | |
| return -1; | |
| } | |
| const std::string server = absl::GetFlag(FLAGS_server); | |
| GtkMainWnd wnd(server.c_str(), absl::GetFlag(FLAGS_port), | |
| absl::GetFlag(FLAGS_autoconnect), | |
| absl::GetFlag(FLAGS_autocall)); | |
| wnd.Create(); | |
| CustomSocketServer socket_server(&wnd); | |
| rtc::AutoSocketServerThread thread(&socket_server); | |
| rtc::InitializeSSL(); | |
| // Must be constructed after we set the socketserver. | |
| PeerConnectionClient client; | |
| rtc::scoped_refptr<Conductor> conductor( | |
| new rtc::RefCountedObject<Conductor>(&client, &wnd)); | |
| socket_server.set_client(&client); | |
| socket_server.set_conductor(conductor); | |
| thread.Run(); | |
| // gtk_main(); | |
| wnd.Destroy(); | |
| // TODO(henrike): Run the Gtk main loop to tear down the connection. | |
| /* | |
| while (gtk_events_pending()) { | |
| gtk_main_iteration(); | |
| } | |
| */ | |
| rtc::CleanupSSL(); | |
| return 0; | |
| } |