Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007 #ifndef SIMPLECHATSERVER_H_
00008 #define SIMPLECHATSERVER_H_
00009
00010 #include <Wt/WObject>
00011 #include <Wt/WSignal>
00012 #include <Wt/WString>
00013
00014 #include <set>
00015 #include <boost/thread.hpp>
00016
00021
00024 class ChatEvent
00025 {
00026 public:
00029 enum Type { Login, Logout, Rename, Message };
00030
00033 Type type() const { return type_; }
00034
00037 const Wt::WString& user() const { return user_; }
00038
00041 const Wt::WString& message() const { return message_; }
00042
00045 const Wt::WString& data() const { return data_; }
00046
00049 const Wt::WString formattedHTML(const Wt::WString& user) const;
00050
00051 private:
00052 Type type_;
00053 Wt::WString user_;
00054 Wt::WString data_;
00055 Wt::WString message_;
00056
00057
00058
00059
00060 ChatEvent(const Wt::WString& user, const Wt::WString& message)
00061 : type_(Message), user_(user), message_(message)
00062 { }
00063
00064 ChatEvent(Type type, const Wt::WString& user,
00065 const Wt::WString& data = Wt::WString::Empty)
00066 : type_(type), user_(user), data_(data)
00067 { }
00068
00069 friend class SimpleChatServer;
00070 };
00071
00074 class SimpleChatServer : public Wt::WObject
00075 {
00076 public:
00079 SimpleChatServer();
00080
00085 bool login(const Wt::WString& user);
00086
00089 void logout(const Wt::WString& user);
00090
00093 bool changeName(const Wt::WString& user, const Wt::WString& newUser);
00094
00097 Wt::WString suggestGuest();
00098
00101 void sendMessage(const Wt::WString& user, const Wt::WString& message);
00102
00107 Wt::Signal<ChatEvent>& chatEvent() { return chatEvent_; }
00108
00111 typedef std::set<Wt::WString> UserSet;
00112
00115 UserSet users();
00116
00117 private:
00118 Wt::Signal<ChatEvent> chatEvent_;
00119 boost::recursive_mutex mutex_;
00120
00121 UserSet users_;
00122 };
00123
00126 #endif // SIMPLECHATSERVER_H_