chat.cpp
Go to the documentation of this file.
00001 #include <dashel/dashel.h>
00002 #include <iostream>
00003 #include <cassert>
00004 
00005 using namespace std;
00006 using namespace Dashel;
00007 
00008 string readLine(Stream* stream)
00009 {
00010         char c;
00011         string line;
00012         do
00013         {
00014                 stream->read(&c, 1);
00015                 line += c;
00016         }
00017         while (c != '\n' && c != '\r');
00018         return line;
00019 }
00020 
00021 void sendString(Stream* stream, const string& line)
00022 {
00023         stream->write(line.c_str(), line.length());
00024         stream->flush();
00025 }
00026 
00027 
00028 class ChatServer: public Hub
00029 {
00030 public:
00031         ChatServer()
00032         {
00033                 listenStream = connect("tcpin:port=8765");
00034         }
00035 
00036 protected:
00037         Stream* listenStream;
00038         map<Stream*, string> nicks;
00039         
00040 protected:
00041         void connectionCreated(Stream *stream)
00042         {
00043                 cout << "+ Incoming connection from " << stream->getTargetName() << " (" << stream << ")" << endl;
00044                 string nick = readLine(stream);
00045                 nick.erase(nick.length() - 1);
00046                 nicks[stream] = nick;
00047                 cout << "+ User " << nick << " is connected." << endl;
00048         }
00049         
00050         void incomingData(Stream *stream)
00051         {
00052                 string line = readLine(stream);
00053                 const string& nick = nicks[stream];
00054                 line = nick + " : " + line;
00055                 cout << "* Message from " << line;
00056                 
00057                 for (StreamsSet::iterator it = dataStreams.begin(); it != dataStreams.end(); ++it)
00058                         sendString((*it), line);
00059         }
00060         
00061         void connectionClosed(Stream *stream, bool abnormal)
00062         {
00063                 cout << "- Connection closed to " << stream->getTargetName() << " (" << stream << ")";
00064                 if (abnormal)
00065                         cout << " : " << stream->getFailReason();
00066                 cout << endl;
00067                 string nick = nicks[stream];
00068                 nicks.erase(stream);
00069                 cout << "- User " << nick << " is disconnected." << endl;
00070         }
00071 };
00072 
00073 class ChatClient: public Hub
00074 {
00075 public:
00076         ChatClient(string remoteTarget, const string& nick) :
00077                 nick(nick), inputStream(0)
00078         {
00079                 remoteTarget += ";port=8765";
00080                 inputStream = connect("stdin:");
00081                 remoteStream = connect(remoteTarget);
00082                 this->nick += '\n';
00083                 sendString(remoteStream, this->nick);
00084         }
00085         
00086 protected:
00087         Stream* inputStream;
00088         Stream* remoteStream;
00089         string nick;
00090         
00091         void connectionCreated(Stream *stream)
00092         {
00093                 cout << "Incoming connection " << stream->getTargetName() << " (" << stream << ")" << endl;
00094         }
00095         
00096         void incomingData(Stream *stream)
00097         {
00098                 assert(inputStream);
00099                 assert(remoteStream);
00100                 
00101                 if (stream == inputStream)
00102                 {
00103                         string line = readLine(inputStream);
00104                         sendString(remoteStream, line);
00105                 }
00106                 else
00107                 {
00108                         string line = readLine(remoteStream);
00109                         cout << line;
00110                         cout.flush();
00111                 }
00112         }
00113         
00114         void connectionClosed(Stream *stream, bool abnormal)
00115         {
00116                 cout << "Connection closed to " << stream->getTargetName() << " (" << stream << ")";
00117                 if (abnormal)
00118                         cout << " : " << stream->getFailReason();
00119                 cout << endl;
00120                 stop();
00121         }
00122 };
00123 
00124 int main(int argc, char* argv[])
00125 {
00126         try
00127         {
00128                 if (argc > 2)
00129                 {
00130                         ChatClient client(argv[1], argv[2]);
00131                         client.run();
00132                 }
00133                 else
00134                 {
00135                         ChatServer server;
00136                         server.run();
00137                 }
00138         }
00139         catch(DashelException e)
00140         {
00141                 std::cerr << e.what() << std::endl;
00142         }
00143         
00144         return 0;
00145 }


dashel
Author(s): Stéphane Magnenat
autogenerated on Thu Jan 2 2014 11:17:11