| /* |
| * 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 <gtk/gtk.h> |
| |
| #include "talk/examples/peerconnection/client/conductor.h" |
| #include "talk/examples/peerconnection/client/linux/main_wnd.h" |
| #include "talk/examples/peerconnection/client/peer_connection_client.h" |
| |
| #include "talk/base/thread.h" |
| |
| class CustomSocketServer : public talk_base::PhysicalSocketServer { |
| public: |
| CustomSocketServer(talk_base::Thread* thread, GtkMainWnd* wnd) |
| : thread_(thread), wnd_(wnd), conductor_(NULL), client_(NULL) {} |
| virtual ~CustomSocketServer() {} |
| |
| 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. |
| virtual bool Wait(int cms, bool process_io) { |
| // Pump GTK events. |
| // TODO: 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()) { |
| thread_->Quit(); |
| } |
| return talk_base::PhysicalSocketServer::Wait(0/*cms == -1 ? 1 : cms*/, |
| process_io); |
| } |
| |
| protected: |
| talk_base::Thread* thread_; |
| GtkMainWnd* wnd_; |
| Conductor* conductor_; |
| PeerConnectionClient* client_; |
| }; |
| |
| int main(int argc, char* argv[]) { |
| gtk_init(&argc, &argv); |
| g_type_init(); |
| g_thread_init(NULL); |
| |
| GtkMainWnd wnd; |
| wnd.Create(); |
| |
| talk_base::AutoThread auto_thread; |
| talk_base::Thread* thread = talk_base::Thread::Current(); |
| CustomSocketServer socket_server(thread, &wnd); |
| thread->set_socketserver(&socket_server); |
| |
| // Must be constructed after we set the socketserver. |
| PeerConnectionClient client; |
| Conductor conductor(&client, &wnd); |
| socket_server.set_client(&client); |
| socket_server.set_conductor(&conductor); |
| |
| thread->Run(); |
| |
| // gtk_main(); |
| wnd.Destroy(); |
| |
| thread->set_socketserver(NULL); |
| // TODO: Run the Gtk main loop to tear down the connection. |
| //while (gtk_events_pending()) { |
| // gtk_main_iteration(); |
| //} |
| |
| return 0; |
| } |
| |