diff options
| author | Bob Jamison <ishmalius@gmail.com> | 2006-05-15 15:06:21 +0000 |
|---|---|---|
| committer | ishmal <ishmal@users.sourceforge.net> | 2006-05-15 15:06:21 +0000 |
| commit | 8325c242bbc39df39b5b2260d3e2aac289d8a930 (patch) | |
| tree | 9a910be0c78883d9beec6cece07f7f800e0713ae /src/pedro/pedroxmpp.h | |
| parent | fix potential (though currently impossible) crash when spatial mode is used w... (diff) | |
| download | inkscape-8325c242bbc39df39b5b2260d3e2aac289d8a930.tar.gz inkscape-8325c242bbc39df39b5b2260d3e2aac289d8a930.zip | |
Move from the jabber_whiteboard directory to its own, so that it can be updated in parallel.
(bzr r846)
Diffstat (limited to 'src/pedro/pedroxmpp.h')
| -rw-r--r-- | src/pedro/pedroxmpp.h | 1040 |
1 files changed, 1040 insertions, 0 deletions
diff --git a/src/pedro/pedroxmpp.h b/src/pedro/pedroxmpp.h new file mode 100644 index 000000000..d938a25fd --- /dev/null +++ b/src/pedro/pedroxmpp.h @@ -0,0 +1,1040 @@ +#ifndef __XMPP_H__ +#define __XMPP_H__ +/* + * API for the Pedro mini-XMPP client. + * + * Authors: + * Bob Jamison + * + * Copyright (C) 2005 Bob Jamison + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include <stdio.h> +#include <vector> + +#include <string> + +#include "pedrodom.h" + +namespace Pedro +{ + +typedef std::string DOMString; + + +//######################################################################## +//# X M P P E V E N T +//######################################################################## +class XmppUser +{ +public: + XmppUser() + { + } + XmppUser(const DOMString &jidArg, const DOMString &nickArg) + { + jid = jidArg; + nick = nickArg; + } + XmppUser(const DOMString &jidArg, const DOMString &nickArg, + const DOMString &subscriptionArg, const DOMString &groupArg) + { + jid = jidArg; + nick = nickArg; + subscription = subscriptionArg; + group = groupArg; + } + XmppUser(const XmppUser &other) + { + jid = other.jid; + nick = other.nick; + subscription = other.subscription; + group = other.group; + show = other.show; + } + XmppUser &operator=(const XmppUser &other) + { + jid = other.jid; + nick = other.nick; + subscription = other.subscription; + group = other.group; + show = other.show; + return *this; + } + virtual ~XmppUser() + {} + DOMString jid; + DOMString nick; + DOMString subscription; + DOMString group; + DOMString show; +}; + +class XmppEvent +{ + +public: + +typedef enum + { + EVENT_NONE, + EVENT_STATUS, + EVENT_ERROR, + EVENT_CONNECTED, + EVENT_DISCONNECTED, + EVENT_PRESENCE, + EVENT_ROSTER, + EVENT_MESSAGE, + EVENT_MUC_JOIN, + EVENT_MUC_LEAVE, + EVENT_MUC_PRESENCE, + EVENT_MUC_MESSAGE, + EVENT_STREAM_RECEIVE_INIT, + EVENT_STREAM_RECEIVE, + EVENT_STREAM_RECEIVE_CLOSE, + EVENT_FILE_ACCEPTED, + EVENT_FILE_RECEIVE + } XmppEventType; + + + /** + * + */ + XmppEvent(int type); + + /** + * + */ + XmppEvent(const XmppEvent &other); + + /** + * + */ + virtual XmppEvent &operator=(const XmppEvent &other); + + /** + * + */ + virtual ~XmppEvent(); + + /** + * + */ + virtual void assign(const XmppEvent &other); + + /** + * + */ + virtual int getType() const; + + + /** + * + */ + virtual DOMString getIqId() const; + + + /** + * + */ + virtual void setIqId(const DOMString &val); + + /** + * + */ + virtual DOMString getStreamId() const; + + + /** + * + */ + virtual void setStreamId(const DOMString &val); + + /** + * + */ + virtual bool getPresence() const; + + + /** + * + */ + virtual void setPresence(bool val); + + /** + * + */ + virtual DOMString getShow() const; + + + /** + * + */ + virtual void setShow(const DOMString &val); + + /** + * + */ + virtual DOMString getStatus() const; + + /** + * + */ + virtual void setStatus(const DOMString &val); + + /** + * + */ + virtual DOMString getTo() const; + + /** + * + */ + virtual void setTo(const DOMString &val); + + /** + * + */ + virtual DOMString getFrom() const; + + /** + * + */ + virtual void setFrom(const DOMString &val); + + /** + * + */ + virtual DOMString getGroup() const; + + /** + * + */ + virtual void setGroup(const DOMString &val); + + /** + * + */ + virtual Element *getDOM() const; + + + /** + * + */ + virtual void setDOM(const Element *val); + + /** + * + */ + virtual std::vector<XmppUser> getUserList() const; + + /** + * + */ + virtual void setUserList(const std::vector<XmppUser> &userList); + + /** + * + */ + virtual DOMString getFileName() const; + + + /** + * + */ + virtual void setFileName(const DOMString &val); + + + /** + * + */ + virtual DOMString getFileDesc() const; + + + /** + * + */ + virtual void setFileDesc(const DOMString &val); + + + /** + * + */ + virtual long getFileSize() const; + + + /** + * + */ + virtual void setFileSize(long val); + + /** + * + */ + virtual DOMString getFileHash() const; + + /** + * + */ + virtual void setFileHash(const DOMString &val); + + /** + * + */ + virtual DOMString getData() const; + + + /** + * + */ + virtual void setData(const DOMString &val); + +private: + + int eventType; + + DOMString iqId; + + DOMString streamId; + + bool presence; + + DOMString show; + + DOMString status; + + DOMString to; + + DOMString from; + + DOMString group; + + DOMString data; + + DOMString fileName; + DOMString fileDesc; + long fileSize; + DOMString fileHash; + + Element *dom; + + std::vector<XmppUser>userList; + +}; + + +//######################################################################## +//# X M P P E V E N T L I S T E N E R +//######################################################################## + +class XmppEventListener +{ +public: + + /** + * + */ + XmppEventListener() + {} + + /** + * + */ + XmppEventListener(const XmppEventListener &other) + {} + + + /** + * + */ + virtual ~XmppEventListener() + {} + + /** + * + */ + virtual void processXmppEvent(const XmppEvent &event) + {} + +}; + + + +//######################################################################## +//# X M P P E V E N T T A R G E T +//######################################################################## + +class XmppEventTarget +{ +public: + + /** + * + */ + XmppEventTarget(); + + /** + * + */ + XmppEventTarget(const XmppEventTarget &other); + + /** + * + */ + virtual ~XmppEventTarget(); + + + //########################### + //# M E S S A G E S + //########################### + + + /** + * Send an error message to all subscribers + */ + void error(char *fmt, ...); + + + /** + * Send a status message to all subscribers + */ + void status(char *fmt, ...); + + //########################### + //# LISTENERS + //########################### + + /** + * + */ + virtual void dispatchXmppEvent(const XmppEvent &event); + + /** + * + */ + virtual void addXmppEventListener(const XmppEventListener &listener); + + /** + * + */ + virtual void removeXmppEventListener(const XmppEventListener &listener); + + /** + * + */ + virtual void clearXmppEventListeners(); + + /** + * + */ + void eventQueueEnable(bool val); + + /** + * + */ + int eventQueueAvailable(); + + /** + * + */ + XmppEvent eventQueuePop(); + + +private: + + std::vector<XmppEventListener *> listeners; + + std::vector<XmppEvent> eventQueue; + bool eventQueueEnabled; + + static const int targetWriteBufLen = 2048; + + char targetWriteBuf[targetWriteBufLen]; +}; + + + + + +//######################################################################## +//# X M P P C L I E N T +//######################################################################## + + +class TcpSocket; +class XmppChat; +class XmppGroupChat; +class XmppStream; + +class XmppClient : public XmppEventTarget +{ + +public: + + //########################### + //# CONSTRUCTORS + //########################### + + /** + * + */ + XmppClient(); + + /** + * + */ + XmppClient(const XmppClient &other); + + /** + * + */ + void assign(const XmppClient &other); + + /** + * + */ + virtual ~XmppClient(); + + + //########################### + //# UTILITY + //########################### + + /** + * + */ + virtual bool pause(unsigned long millis); + + /** + * + */ + DOMString toXml(const DOMString &str); + + //########################### + //# CONNECTION + //########################### + + /** + * + */ + virtual bool connect(); + + /** + * + */ + virtual bool connect(DOMString host, int port, + DOMString userName, + DOMString password, + DOMString resource); + + /** + * + */ + virtual bool disconnect(); + + + /** + * + */ + virtual bool write(char *fmt, ...); + + /** + * + */ + virtual bool isConnected() + { return connected; } + + /** + * + */ + virtual DOMString getHost() + { return host; } + + /** + * + */ + virtual void setHost(const DOMString &val) + { host = val; } + + /** + * + */ + virtual DOMString getRealm() + { return realm; } + + /** + * + */ + virtual void setRealm(const DOMString &val) + { realm = val; } + + /** + * + */ + virtual int getPort() + { return port; } + + /** + * + */ + virtual void setPort(int val) + { port = val; } + + /** + * + */ + virtual DOMString getUsername(); + + /** + * + */ + virtual void setUsername(const DOMString &val); + + /** + * + */ + virtual DOMString getPassword() + { return password; } + + /** + * + */ + virtual void setPassword(const DOMString &val) + { password = val; } + + /** + * + */ + virtual DOMString getResource() + { return resource; } + + /** + * + */ + virtual void setResource(const DOMString &val) + { resource = val; } + + /** + * + */ + virtual DOMString getJid() + { return jid; } + /** + * + */ + virtual int getMsgId() + { return msgId++; } + + /** + * + */ + bool processMessage(Element *root); + + /** + * + */ + bool processPresence(Element *root); + + /** + * + */ + bool processIq(Element *root); + + /** + * + */ + virtual bool receiveAndProcess(); + + /** + * + */ + virtual bool receiveAndProcessLoop(); + + //####################### + //# ROSTER + //####################### + + /** + * + */ + bool rosterAdd(const DOMString &rosterGroup, + const DOMString &otherJid, + const DOMString &name); + + /** + * + */ + bool rosterDelete(const DOMString &otherJid); + + /** + * + */ + std::vector<XmppUser> getRoster(); + + /** + * + */ + virtual void rosterShow(const DOMString &jid, const DOMString &show); + + //####################### + //# CHAT (individual) + //####################### + + /** + * + */ + virtual bool message(const DOMString &user, const DOMString &subj, + const DOMString &text); + + /** + * + */ + virtual bool message(const DOMString &user, const DOMString &text); + + /** + * + */ + virtual bool presence(const DOMString &presence); + + //####################### + //# GROUP CHAT + //####################### + + /** + * + */ + virtual bool groupChatCreate(const DOMString &groupJid); + + /** + * + */ + virtual void groupChatDelete(const DOMString &groupJid); + + /** + * + */ + bool groupChatExists(const DOMString &groupJid); + + /** + * + */ + virtual void groupChatsClear(); + + /** + * + */ + virtual void groupChatUserAdd(const DOMString &groupJid, + const DOMString &nick, + const DOMString &jid); + /** + * + */ + virtual void groupChatUserShow(const DOMString &groupJid, + const DOMString &nick, + const DOMString &show); + + /** + * + */ + virtual void groupChatUserDelete(const DOMString &groupJid, + const DOMString &nick); + + /** + * + */ + virtual std::vector<XmppUser> + XmppClient::groupChatGetUserList(const DOMString &groupJid); + + /** + * + */ + virtual bool groupChatJoin(const DOMString &groupJid, + const DOMString &nick, + const DOMString &pass); + + /** + * + */ + virtual bool groupChatLeave(const DOMString &groupJid, + const DOMString &nick); + + /** + * + */ + virtual bool groupChatMessage(const DOMString &groupJid, + const DOMString &msg); + + /** + * + */ + virtual bool groupChatPrivateMessage(const DOMString &groupJid, + const DOMString &toNick, + const DOMString &msg); + + /** + * + */ + virtual bool groupChatPresence(const DOMString &groupJid, + const DOMString &nick, + const DOMString &presence); + + + //####################### + //# STREAMS + //####################### + + typedef enum + { + STREAM_AVAILABLE, + STREAM_OPENING, + STREAM_OPEN, + STREAM_CLOSING, + STREAM_CLOSED, + STREAM_ERROR + } StreamStates; + + /** + * + */ + virtual int outputStreamOpen(const DOMString &jid, + const DOMString &streamId); + + /** + * + */ + virtual int outputStreamWrite(int streamId, + const unsigned char *buf, unsigned long len); + + /** + * + */ + virtual int outputStreamClose(int streamId); + + /** + * + */ + virtual int inputStreamOpen(const DOMString &jid, + const DOMString &streamId, + const DOMString &iqId); + + /** + * + */ + virtual int inputStreamAvailable(int streamId); + + /** + * + */ + virtual std::vector<unsigned char> inputStreamRead(int streamId); + + /** + * + */ + virtual bool inputStreamClosing(int streamId); + + /** + * + */ + virtual int inputStreamClose(int streamId); + + + //####################### + //# FILE TRANSFERS + //####################### + + /** + * + */ + virtual bool fileSend(const DOMString &destJid, + const DOMString &offeredName, + const DOMString &fileName, + const DOMString &description); + + /** + * + */ + virtual bool fileSendBackground(const DOMString &destJid, + const DOMString &offeredName, + const DOMString &fileName, + const DOMString &description); + + /** + * + */ + virtual bool fileReceive(const DOMString &fromJid, + const DOMString &iqId, + const DOMString &streamId, + const DOMString &fileName, + long fileSize, + const DOMString &fileHash); + /** + * + */ + virtual bool fileReceiveBackground(const DOMString &fromJid, + const DOMString &iqId, + const DOMString &streamId, + const DOMString &fileName, + long fileSize, + const DOMString &fileHash); + + +private: + + void init(); + + DOMString host; + + /** + * will be same as host, unless username is + * user@realm + */ + DOMString realm; + + int port; + + DOMString username; + + DOMString password; + + DOMString resource; + + DOMString jid; + + int msgId; + + TcpSocket *sock; + + bool connected; + + bool createSession(); + + bool checkConnect(); + + DOMString readStanza(); + + bool saslMd5Authenticate(); + + bool saslPlainAuthenticate(); + + bool saslAuthenticate(); + + bool iqAuthenticate(const DOMString &streamId); + + bool keepGoing; + + static const int writeBufLen = 2048; + + unsigned char writeBuf[writeBufLen]; + + std::vector<XmppGroupChat *>groupChats; + + static const int outputStreamCount = 16; + + XmppStream *outputStreams[outputStreamCount]; + + static const int inputStreamCount = 16; + + XmppStream *inputStreams[inputStreamCount]; + + static const int fileSendCount = 16; + + XmppStream *fileSends[fileSendCount]; + + std::vector<XmppUser>roster; +}; + + + + +//######################################################################## +//# X M P P G R O U P C H A T +//######################################################################## + +/** + * + */ +class XmppGroupChat +{ +public: + + /** + * + */ + XmppGroupChat(const DOMString &groupJid); + + /** + * + */ + XmppGroupChat(const XmppGroupChat &other); + + /** + * + */ + virtual ~XmppGroupChat(); + + /** + * + */ + virtual DOMString getGroupJid(); + + /** + * + */ + virtual void userAdd(const DOMString &nick, + const DOMString &jid); + /** + * + */ + virtual void userShow(const DOMString &nick, + const DOMString &show); + + /** + * + */ + virtual void userDelete(const DOMString &nick); + + /** + * + */ + virtual std::vector<XmppUser> getUserList() const; + + +private: + + DOMString groupJid; + + std::vector<XmppUser>userList; + +}; + + + + + + + + + + +} //namespace Pedro + +#endif /* __XMPP_H__ */ + +//######################################################################## +//# E N D O F F I L E +//######################################################################## + |
