| OLD | NEW |
| 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "build/build_config.h" | 5 #include "build/build_config.h" |
| 6 | 6 |
| 7 #if !defined(OS_WIN) | 7 #if !defined(OS_WIN) |
| 8 extern "C" { | 8 extern "C" { |
| 9 #include <unistd.h> | 9 #include <unistd.h> |
| 10 } | 10 } |
| 11 #endif // !defined(OS_WIN) | 11 #endif // !defined(OS_WIN) |
| 12 | 12 |
| 13 #include <iostream> | 13 #include <iostream> |
| 14 #include <list> | 14 #include <list> |
| 15 | 15 |
| 16 #include "base/at_exit.h" | 16 #include "base/at_exit.h" |
| 17 #include "base/nss_util.h" |
| 18 #include "base/time.h" |
| 17 #include "media/base/data_buffer.h" | 19 #include "media/base/data_buffer.h" |
| 18 #include "remoting/base/constants.h" | 20 #include "remoting/base/constants.h" |
| 19 #include "remoting/jingle_glue/jingle_channel.h" | 21 #include "remoting/jingle_glue/jingle_channel.h" |
| 20 #include "remoting/jingle_glue/jingle_client.h" | 22 #include "remoting/jingle_glue/jingle_client.h" |
| 21 #include "remoting/jingle_glue/jingle_thread.h" | 23 #include "remoting/jingle_glue/jingle_thread.h" |
| 22 | 24 |
| 23 using remoting::JingleClient; | 25 using remoting::JingleClient; |
| 24 using remoting::JingleChannel; | 26 using remoting::JingleChannel; |
| 25 using remoting::kChromotingTokenServiceName; | 27 using remoting::kChromotingTokenServiceName; |
| 26 | 28 |
| 27 class JingleTestClient : public JingleChannel::Callback, | 29 class JingleTestClient : public JingleChannel::Callback, |
| 28 public JingleClient::Callback { | 30 public JingleClient::Callback, |
| 31 public base::RefCountedThreadSafe<JingleTestClient> { |
| 29 public: | 32 public: |
| 33 JingleTestClient() |
| 34 : closed_event_(true, false) { |
| 35 } |
| 36 |
| 30 virtual ~JingleTestClient() {} | 37 virtual ~JingleTestClient() {} |
| 31 | 38 |
| 32 void Run(const std::string& username, const std::string& auth_token, | 39 void Run(const std::string& username, const std::string& auth_token, |
| 33 const std::string& host_jid) { | 40 const std::string& host_jid) { |
| 34 // TODO(hclam): Fix the threading problem. | |
| 35 remoting::JingleThread jingle_thread; | 41 remoting::JingleThread jingle_thread; |
| 36 jingle_thread.Start(); | 42 jingle_thread.Start(); |
| 37 client_ = new JingleClient(&jingle_thread); | 43 client_ = new JingleClient(&jingle_thread); |
| 38 client_->Init(username, auth_token, kChromotingTokenServiceName, this); | 44 client_->Init(username, auth_token, kChromotingTokenServiceName, this); |
| 39 | 45 |
| 40 if (host_jid != "") { | 46 if (host_jid != "") { |
| 41 scoped_refptr<JingleChannel> channel = client_->Connect(host_jid, this); | 47 scoped_refptr<JingleChannel> channel = client_->Connect(host_jid, this); |
| 42 channels_.push_back(channel); | 48 channels_.push_back(channel); |
| 43 } | 49 } |
| 44 | 50 |
| (...skipping 11 matching lines...) Expand all Loading... |
| 56 memcpy(buf, line.c_str(), line.length()); | 62 memcpy(buf, line.c_str(), line.length()); |
| 57 (*it)->Write(new media::DataBuffer(buf, line.length())); | 63 (*it)->Write(new media::DataBuffer(buf, line.length())); |
| 58 } | 64 } |
| 59 } | 65 } |
| 60 | 66 |
| 61 if (line == "exit") | 67 if (line == "exit") |
| 62 break; | 68 break; |
| 63 } | 69 } |
| 64 | 70 |
| 65 while (!channels_.empty()) { | 71 while (!channels_.empty()) { |
| 66 channels_.front()->Close(); | 72 closed_event_.Reset(); |
| 73 channels_.front()->Close( |
| 74 NewRunnableMethod(this, &JingleTestClient::OnClosed)); |
| 75 // Wait until channel is closed. If it is not closed within 0.1 seconds |
| 76 // continue closing everything else. |
| 77 closed_event_.TimedWait(base::TimeDelta::FromMilliseconds(100)); |
| 67 channels_.pop_front(); | 78 channels_.pop_front(); |
| 68 } | 79 } |
| 69 | 80 |
| 70 client_->Close(); | 81 client_->Close(); |
| 71 jingle_thread.Stop(); | 82 jingle_thread.Stop(); |
| 72 } | 83 } |
| 73 | 84 |
| 74 // JingleChannel::Callback interface. | 85 // JingleChannel::Callback interface. |
| 75 void OnStateChange(JingleChannel* channel, JingleChannel::State state) { | 86 void OnStateChange(JingleChannel* channel, JingleChannel::State state) { |
| 76 LOG(INFO) << "State of " << channel->jid() << " changed to " << state; | 87 LOG(INFO) << "State of " << channel->jid() << " changed to " << state; |
| (...skipping 22 matching lines...) Expand all Loading... |
| 99 return true; | 110 return true; |
| 100 } | 111 } |
| 101 | 112 |
| 102 void OnNewConnection(JingleClient* client, | 113 void OnNewConnection(JingleClient* client, |
| 103 scoped_refptr<JingleChannel> channel) { | 114 scoped_refptr<JingleChannel> channel) { |
| 104 std::cerr << "Connected to " << channel->jid() << std::endl; | 115 std::cerr << "Connected to " << channel->jid() << std::endl; |
| 105 AutoLock auto_lock(channels_lock_); | 116 AutoLock auto_lock(channels_lock_); |
| 106 channels_.push_back(channel); | 117 channels_.push_back(channel); |
| 107 } | 118 } |
| 108 | 119 |
| 120 void OnClosed() { |
| 121 closed_event_.Signal(); |
| 122 } |
| 123 |
| 109 private: | 124 private: |
| 110 typedef std::list<scoped_refptr<JingleChannel> > ChannelsList; | 125 typedef std::list<scoped_refptr<JingleChannel> > ChannelsList; |
| 111 | 126 |
| 112 scoped_refptr<JingleClient> client_; | 127 scoped_refptr<JingleClient> client_; |
| 113 ChannelsList channels_; | 128 ChannelsList channels_; |
| 114 Lock channels_lock_; | 129 Lock channels_lock_; |
| 130 base::WaitableEvent closed_event_; |
| 115 }; | 131 }; |
| 116 | 132 |
| 117 int main(int argc, char** argv) { | 133 int main(int argc, char** argv) { |
| 118 if (argc > 2) | 134 if (argc > 2) |
| 119 std::cerr << "Usage: " << argv[0] << " [<host_jid>]" << std::endl; | 135 std::cerr << "Usage: " << argv[0] << " [<host_jid>]" << std::endl; |
| 120 | 136 |
| 121 base::AtExitManager exit_manager; | 137 base::AtExitManager exit_manager; |
| 122 | 138 |
| 139 base::EnsureNSPRInit(); |
| 140 base::EnsureNSSInit(); |
| 141 |
| 123 std::string host_jid = argc == 2 ? argv[1] : ""; | 142 std::string host_jid = argc == 2 ? argv[1] : ""; |
| 124 | 143 |
| 125 std::string username; | 144 std::string username; |
| 126 std::cout << "JID: "; | 145 std::cout << "JID: "; |
| 127 std::cin >> username; | 146 std::cin >> username; |
| 128 | 147 |
| 129 std::string auth_token; | 148 std::string auth_token; |
| 130 std::cout << "Auth token: "; | 149 std::cout << "Auth token: "; |
| 131 std::cin >> auth_token; | 150 std::cin >> auth_token; |
| 132 | 151 |
| 133 JingleTestClient client; | 152 scoped_refptr<JingleTestClient> client = new JingleTestClient(); |
| 134 | 153 |
| 135 client.Run(username, auth_token, host_jid); | 154 client->Run(username, auth_token, host_jid); |
| 136 | 155 |
| 137 return 0; | 156 return 0; |
| 138 } | 157 } |
| OLD | NEW |