172 lines
6.2 KiB
C
172 lines
6.2 KiB
C
|
/*
|
||
|
* libjingle
|
||
|
* Copyright 2004--2013, 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.
|
||
|
*/
|
||
|
|
||
|
#ifndef TALK_EXAMPLES_CHAT_CHATAPP_H_
|
||
|
#define TALK_EXAMPLES_CHAT_CHATAPP_H_
|
||
|
|
||
|
#include "talk/base/thread.h"
|
||
|
#include "talk/base/scoped_ptr.h"
|
||
|
|
||
|
#include "talk/xmpp/jid.h"
|
||
|
#include "talk/xmpp/xmppclient.h"
|
||
|
|
||
|
namespace buzz {
|
||
|
class XmppClient;
|
||
|
class PresenceOutTask;
|
||
|
class PresenceReceiveTask;
|
||
|
class TextChatSendTask;
|
||
|
class TextChatReceiveTask;
|
||
|
class ConsoleTask;
|
||
|
class PresenceStatus;
|
||
|
}
|
||
|
|
||
|
// This is an example chat app for libjingle, showing how to use xmpp tasks,
|
||
|
// data, callbacks, etc. It has a simple text-based UI for logging in,
|
||
|
// sending and receiving messages, and printing the roster.
|
||
|
class ChatApp: public sigslot::has_slots<> {
|
||
|
public:
|
||
|
// Arguments:
|
||
|
// xmpp_client Points to the XmppClient for the communication channel
|
||
|
// (typically created by the XmppPump object).
|
||
|
// main_thread Wraps the application's main thread. Subsidiary threads
|
||
|
// for the various tasks will be forked off of this.
|
||
|
ChatApp(buzz::XmppClient* xmpp_client, talk_base::Thread* main_thread);
|
||
|
|
||
|
// Shuts down and releases all of the contained tasks/threads
|
||
|
~ChatApp();
|
||
|
|
||
|
// Shuts down the current thread and quits
|
||
|
void Quit();
|
||
|
|
||
|
private:
|
||
|
//
|
||
|
// Initialization
|
||
|
//
|
||
|
// Called explicitly after the connection to the chat server is established.
|
||
|
void OnXmppOpen();
|
||
|
|
||
|
//
|
||
|
// UI Stuff
|
||
|
//
|
||
|
// Prints the app main menu on the console.
|
||
|
// Called when ui_state_ == STATE_BASE.
|
||
|
void PrintMenu();
|
||
|
|
||
|
// Prints a numbered list of the logged-in user's roster on the console.
|
||
|
void PrintRoster();
|
||
|
|
||
|
// Prints a prompt for the user to enter either the index from the
|
||
|
// roster list of the user they wish to chat with, or a fully-qualified
|
||
|
// (user@server.ext) jid.
|
||
|
// Called when when ui_state_ == STATE_PROMPTJID.
|
||
|
void PromptJid();
|
||
|
|
||
|
// Prints a prompt on the console for the user to enter a message to send.
|
||
|
// Called when when ui_state_ == STATE_CHATTING.
|
||
|
void PromptChatMessage();
|
||
|
|
||
|
// Sends our presence state to the chat server (and on to your roster list).
|
||
|
// Arguments:
|
||
|
// state Specifies the presence state to show.
|
||
|
enum PresenceState {online, away};
|
||
|
void BroadcastPresence(PresenceState state);
|
||
|
|
||
|
// Returns the RosterItem associated with the specified index.
|
||
|
// Just a helper to select a roster item from a numbered list in the UI.
|
||
|
bool GetRosterItem(int index, buzz::PresenceStatus* status);
|
||
|
|
||
|
//
|
||
|
// Input Handling
|
||
|
//
|
||
|
// Receives input when ui_state_ == STATE_BASE. Handles choices from the
|
||
|
// main menu.
|
||
|
void HandleBaseInput(const std::string& message);
|
||
|
|
||
|
// Receives input when ui_state_ == STATE_PROMPTJID. Handles selection
|
||
|
// of a JID to chat to.
|
||
|
void HandleJidInput(const std::string& message);
|
||
|
|
||
|
// Receives input when ui_state_ == STATE_CHATTING. Handles text messages.
|
||
|
void HandleChatInput(const std::string& message);
|
||
|
|
||
|
//
|
||
|
// signal/slot Callbacks
|
||
|
//
|
||
|
// Connected to the XmppClient::SignalStateChange slot. Receives
|
||
|
// notifications of state changes of the connection.
|
||
|
void OnStateChange(buzz::XmppEngine::State state);
|
||
|
|
||
|
// Connected to the PresenceReceiveTask::PresenceUpdate slot.
|
||
|
// Receives status messages for the logged-in user's roster (i.e.
|
||
|
// an initial list from the server and people coming/going).
|
||
|
void OnPresenceUpdate(const buzz::PresenceStatus& status);
|
||
|
|
||
|
// Connected to the TextChatReceiveTask::SignalTextChatReceived slot.
|
||
|
// Called when we receive a text chat from someone else.
|
||
|
void OnTextMessage(const buzz::Jid& from, const buzz::Jid& to,
|
||
|
const std::string& message);
|
||
|
|
||
|
// Receives text input from the console task. This is where any input
|
||
|
// from the user comes in.
|
||
|
// Arguments:
|
||
|
// message What the user typed.
|
||
|
void OnConsoleMessage(const std::string &message);
|
||
|
|
||
|
// The XmppClient object associated with this chat application instance.
|
||
|
buzz::XmppClient* xmpp_client_;
|
||
|
|
||
|
// We send presence information through this object.
|
||
|
talk_base::scoped_ptr<buzz::PresenceOutTask> presence_out_task_;
|
||
|
|
||
|
// We receive others presence information through this object.
|
||
|
talk_base::scoped_ptr<buzz::PresenceReceiveTask> presence_receive_task_;
|
||
|
|
||
|
// We send text messages though this object.
|
||
|
talk_base::scoped_ptr<buzz::TextChatSendTask> message_send_task_;
|
||
|
|
||
|
// We receive messages through this object.
|
||
|
talk_base::scoped_ptr<buzz::TextChatReceiveTask> message_received_task_;
|
||
|
|
||
|
// UI gets drawn and receives input through this task.
|
||
|
talk_base::scoped_ptr< buzz::ConsoleTask> console_task_;
|
||
|
|
||
|
// The list of JIDs for the people in the logged-in users roster.
|
||
|
// RosterList roster_list_;
|
||
|
typedef std::map<std::string, buzz::PresenceStatus> RosterList;
|
||
|
RosterList roster_list_;
|
||
|
|
||
|
// The JID of the user currently being chatted with.
|
||
|
buzz::Jid chat_dest_jid_;
|
||
|
|
||
|
// UI State constants
|
||
|
enum UIState { STATE_BASE, STATE_PROMPTJID, STATE_CHATTING };
|
||
|
UIState ui_state_;
|
||
|
};
|
||
|
|
||
|
#endif // TALK_EXAMPLES_CHAT_CHATAPP_H_
|
||
|
|