15976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org/* 25976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * libjingle 35976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * Copyright 2004--2013, Google Inc. 45976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * 55976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * Redistribution and use in source and binary forms, with or without 65976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * modification, are permitted provided that the following conditions are met: 75976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * 85976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * 1. Redistributions of source code must retain the above copyright notice, 95976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * this list of conditions and the following disclaimer. 105976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * 2. Redistributions in binary form must reproduce the above copyright notice, 115976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * this list of conditions and the following disclaimer in the documentation 125976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * and/or other materials provided with the distribution. 135976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * 3. The name of the author may not be used to endorse or promote products 145976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * derived from this software without specific prior written permission. 155976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * 165976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED 175976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 185976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO 195976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 205976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 215976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 225976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 235976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 245976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 255976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 265976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org */ 275976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 285976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// 295976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// A simple text chat application, largely copied from examples/call. 305976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// 315976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 325976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include <iostream> 335976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 345976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include "talk/base/logging.h" 355976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include "talk/base/ssladapter.h" 365976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 375976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#ifdef OSX 385976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include "talk/base/maccocoasocketserver.h" 395976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#elif defined(WIN32) 405976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include "talk/base/win32socketserver.h" 415976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#else 425976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include "talk/base/physicalsocketserver.h" 435976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#endif 445976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 455976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include "talk/xmpp/constants.h" 465976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include "talk/xmpp/xmppauth.h" 475976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include "talk/xmpp/xmppclientsettings.h" 485976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include "talk/xmpp/xmpppump.h" 495976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include "talk/xmpp/xmppsocket.h" 505976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 515976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include "talk/examples/chat/chatapp.h" 525976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include "talk/examples/chat/consoletask.h" 535976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 545976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgstatic const int kDefaultPort = 5222; 555976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 565976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgint main(int argc, char* argv[]) { 575976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // TODO(pmclean): Remove duplication of code with examples/call. 585976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Set up debugging. 595976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org bool debug = true; 605976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org if (debug) { 615976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org talk_base::LogMessage::LogToDebug(talk_base::LS_VERBOSE); 625976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 635976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 645976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Set up the crypto subsystem. 655976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org talk_base::InitializeSSL(); 665976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 675976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Parse username and password, if present. 685976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org buzz::Jid jid; 695976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org std::string username; 705976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org talk_base::InsecureCryptStringImpl pass; 715976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org if (argc > 1) { 725976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org username = argv[1]; 735976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org if (argc > 2) { 745976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org pass.password() = argv[2]; 755976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 765976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 775976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 785976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // ... else prompt for them 795976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org if (username.empty()) { 805976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org printf("JID: "); 815976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org std::cin >> username; 825976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 835976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org if (username.find('@') == std::string::npos) { 845976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org username.append("@localhost"); 855976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 865976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 875976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org jid = buzz::Jid(username); 885976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org if (!jid.IsValid() || jid.node() == "") { 895976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org printf("Invalid JID. JIDs should be in the form user@domain\n"); 905976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org return 1; 915976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 925976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 935976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org if (pass.password().empty()) { 945976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org buzz::ConsoleTask::SetEcho(false); 955976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org printf("Password: "); 965976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org std::cin >> pass.password(); 975976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org buzz::ConsoleTask::SetEcho(true); 985976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org printf("\n"); 995976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 1005976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1015976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // OTP (this can be skipped) 1025976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org std::string otp_token; 1035976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org printf("OTP: "); 1045976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org fflush(stdin); 1055976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org std::getline(std::cin, otp_token); 1065976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1075976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Setup the connection settings. 1085976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org buzz::XmppClientSettings xcs; 1095976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org xcs.set_user(jid.node()); 1105976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org xcs.set_resource("chat"); 1115976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org xcs.set_host(jid.domain()); 1125976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org bool allow_plain = false; 1135976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org xcs.set_allow_plain(allow_plain); 1145976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org xcs.set_use_tls(buzz::TLS_REQUIRED); 1155976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org xcs.set_pass(talk_base::CryptString(pass)); 1165976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org if (!otp_token.empty() && *otp_token.c_str() != '\n') { 1175976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org xcs.set_auth_token(buzz::AUTH_MECHANISM_OAUTH2, otp_token); 1185976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 1195976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1205976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Build the server spec 1215976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org std::string host; 1225976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org int port; 1235976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1245976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org std::string server = "talk.google.com"; 1255976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org int colon = server.find(':'); 1265976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org if (colon == -1) { 1275976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org host = server; 1285976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org port = kDefaultPort; 1295976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } else { 1305976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org host = server.substr(0, colon); 1315976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org port = atoi(server.substr(colon + 1).c_str()); 1325976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 1335976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org xcs.set_server(talk_base::SocketAddress(host, port)); 1345976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1355976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org talk_base::Thread* main_thread = talk_base::Thread::Current(); 1365976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#if WIN32 1375976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Need to pump messages on our main thread on Windows. 1385976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org talk_base::Win32Thread w32_thread; 1395976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org talk_base::ThreadManager::Instance()->SetCurrentThread(&w32_thread); 1405976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#elif defined(OSX) 1415976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org talk_base::MacCocoaSocketServer ss; 1425976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org talk_base::SocketServerScope ss_scope(&ss); 1435976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#else 1445976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org talk_base::PhysicalSocketServer ss; 1455976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#endif 1465976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1475976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org buzz::XmppPump* pump = new buzz::XmppPump(); 1485976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ChatApp *client = new ChatApp(pump->client(), main_thread); 1495976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1505976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Start pumping messages! 1515976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org pump->DoLogin(xcs, new buzz::XmppSocket(buzz::TLS_REQUIRED), new XmppAuth()); 1525976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1535976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org main_thread->Run(); 1545976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org pump->DoDisconnect(); 1555976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1565976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org delete client; 1575976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1585976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org return 0; 1595976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 160