#include <ChatRoom.h>
Diagramma delle classi per ChatRoom


Game.
Questa classe e' un esempio di implementazione dell'interfaccia Game.
Permette di gestire una semplice ChatRoom con scambio di messaggi tra gli utenti presenti.
Per questo Game non e' stato necessario re-implementare la classe Player perche' essa risulta sufficiente per questo uso.
Definizione alla linea 31 del file ChatRoom.h.
Membri pubblici | |
| ChatRoom (void) | |
| Costruttore di default della Classe ChatRoom. | |
| ChatRoom (Player *) | |
| Costruttore overlodato della Classe ChatRoom. | |
| virtual | ~ChatRoom (void) |
| Distruttore della Classe ChatRoom. | |
| void | init (void) |
| Inizializzazione della ChatRoom. | |
| void | run (void) |
| Flusso di Controllo di ChatRoom. | |
| void | final (void) |
| Chiusura della ChatRoom. | |
| void | addPlayer (Player *) |
Aggiungi un Player alla ChatRoom. | |
| bool | delPlayer (const string &) |
Rimuovi un Player dalla ChatRoom (overloaded). | |
| int | getNumPlayers (void) const |
Ritorna il numero di Player presenti nella ChatRoom. | |
| void | printPlayersList (iostream *) |
Stampa la lista dei Player presenti nella ChatRoom. | |
| string | getName (void) const |
| Ritorna il nome del Game. | |
Membri protetti | |
| void | sayToAll (const string &, Player *=NULL) |
Invia un messaggio a tutti i Player della ChatRoom. | |
| void | delPlayer (Player *) |
Rimuovi un Player dalla ChatRoom (overloaded). | |
Attributi privati | |
| list< Player * > | playerList |
Lista dei Player presenti nella ChatRoom. | |
| Mutex | mutex |
Mutex (Semaforo) utile per le Sezioni Critiche. | |
|
|
Costruttore di default della Classe ChatRoom.
Definizione alla linea 11 del file ChatRoom.cc.
00011 {}
|
|
|
Costruttore overlodato della Classe ChatRoom.
Definizione alla linea 17 del file ChatRoom.cc. Riferimenti addPlayer().
00017 {
00018 addPlayer(firstPlayer);
00019 }
|
Questo è il grafo delle chiamate per questa funzione:

|
|
Distruttore della Classe ChatRoom.
Definizione alla linea 22 del file ChatRoom.cc.
00022 {exit();}
|
|
|
Aggiungi un Un messaggio di Benvenuto viene inviato all'utente e gli altri partecipanti alla ChatRoom vengono avvertiti dell'arrivo del nuovo Player.
Implementa Game. Definizione alla linea 131 del file ChatRoom.cc. Riferimenti Player::getName(), mutex, playerList, Player::say(), e sayToAll(). Referenziato da ChatRoom().
00131 {
00132 mutex.enterMutex();
00133
00134 playerList.push_back(newPlayer);
00135 /* Messaggi di Benvenuto */
00136 /* ...per il nuovo utente... */
00137 newPlayer->say("\n<----------------------------------------->\n");
00138 newPlayer->say(">>>>> Hello at MGS's ChatRoom <<<<<\n");
00139 newPlayer->say("<----------------------------------------->\n\n");
00140 newPlayer->say("[Users On-Line: ");
00141 newPlayer->say((int)(playerList.size() -1));
00142 newPlayer->say("]\n");
00143
00144 /* ...per i restanti... */
00145 sayToAll("<ChatRoom msg> " + newPlayer->getName() + " has joined at this ChatRoom\n",
00146 newPlayer);
00147 cout << "<ChatRoom msg> " << newPlayer->getName() << " has joined at this ChatRoom\n";
00148
00149 /* Riattiva o Avvia il Thread se l'utente appena inserito e'
00150 * l'unico */
00151 if ( playerList.size() == 1 ) {
00152 if ( isRunning() )
00153 resume();
00154 else
00155 start();
00156 }
00157
00158 mutex.leaveMutex();
00159 }
|
Questo è il grafo delle chiamate per questa funzione:

|
|
Rimuovi un Un messaggio di Arrivederci viene inviato all'utente e gli altri partecipanti alla ChatRoom vengono avvertiti.
Definizione alla linea 200 del file ChatRoom.cc. Riferimenti Player::getName(), mutex, playerList, Player::resumeConnHandler(), Player::say(), e sayToAll().
00200 {
00201 mutex.enterMutex();
00202
00203 toDelete->say("<ChatRoom msg> GoodBye. ;-)\n");
00204 sayToAll("<ChatRoom msg> " + toDelete->getName() + " has leaved this ChatRoom\n", toDelete);
00205 toDelete->resumeConnHandler();
00206 playerList.remove(toDelete);
00207
00208 mutex.leaveMutex();
00209 }
|
Questo è il grafo delle chiamate per questa funzione:

|
|
Rimuovi un Un messaggio di Arrivederci viene inviato all'utente e gli altri partecipanti alla ChatRoom vengono avvertiti.
Implementa Game. Definizione alla linea 169 del file ChatRoom.cc. Riferimenti mutex, playerList, e sayToAll(). Referenziato da run().
00169 {
00170 list<Player *>::iterator pli;
00171 mutex.enterMutex();
00172
00173 pli = playerList.begin();
00174 while ( pli != playerList.end() ) {
00175 if ( (*pli)->getName() == toDelete) {
00176 /* Se il player é presente:
00177 * 1) riceve un messaggio di arrivederci
00178 * 2) Viene riattivato il suo ConnectionHandler
00179 * 3) Viene eliminato dalla lista */
00180 (*pli)->say("<ChatRoom msg> GoodBye. ;-)\n");
00181 sayToAll("<ChatRoom msg> " + (*pli)->getName() + " has leaved this ChatRoom\n", *pli);
00182 (*pli)->resumeConnHandler();
00183 playerList.remove(*pli);
00184 mutex.leaveMutex();
00185 return true;
00186 }
00187 pli++;
00188 }
00189
00190 mutex.leaveMutex();
00191 return false;
00192 }
|
Questo è il grafo delle chiamate per questa funzione:

|
|
Chiusura della ChatRoom.
Metodo ereditato da Implementa Game. Definizione alla linea 101 del file ChatRoom.cc. Riferimenti mutex, e playerList.
00101 {
00102 if ( playerList.size() > 0 ) {
00103 list<Player *>::iterator pli;
00104 Player *temp;
00105 mutex.enterMutex();
00106
00107 while ( pli != playerList.end() ) {
00108 /* Se il player e' presente:
00109 * 1) riceve un messaggio di arrivederci
00110 * 2) Viene riattivato il suo ConnectionHandler
00111 * 3) Viene eliminato dalla lista */
00112 (*pli)->say("<ChatRoom msg> ChatRoom Terminated. Now exit.\n");
00113 (*pli)->resumeConnHandler();
00114 temp = *pli;
00115 pli++;
00116 playerList.remove(temp);
00117 }
00118
00119 mutex.leaveMutex();
00120 }
00121 }
|
|
|
Ritorna il nome del Game.
Implementa Game. Definizione alla linea 232 del file ChatRoom.cc.
00232 {return "ChatRoom - Simple Chat for MGS";}
|
|
|
Ritorna il numero di
Implementa Game. Definizione alla linea 214 del file ChatRoom.cc. Riferimenti playerList.
00214 {
00215 return playerList.size();
00216 }
|
|
|
Inizializzazione della ChatRoom.
Metodo vuoto ereditato da Implementa Game. Definizione alla linea 27 del file ChatRoom.cc.
00027 {}
|
|
|
Stampa la lista dei
Implementa Game. Definizione alla linea 219 del file ChatRoom.cc. Riferimenti mutex, e playerList.
00219 {
00220 list<Player *>::iterator pli;
00221 mutex.enterMutex();
00222
00223 pli = playerList.begin();
00224 while ( pli != playerList.end() ) {
00225 *streamWherePrint << "\t* " << (*pli)->getName() << endl;
00226 pli++;
00227 }
00228
00229 mutex.leaveMutex();
00230 }
|
|
|
Flusso di Controllo di ChatRoom.
Questo metodo rappresenta il Flusso di Controllo principale del Implementa Game. Definizione alla linea 34 del file ChatRoom.cc. Riferimenti delPlayer(), playerList, e sayToAll().
00034 {
00035 string message;
00036 string completeMessage;
00037
00038 list<Player *>::iterator pli;
00039 char time_buffer[64];
00040 int last;
00041 time_t t;
00042 tm *tbp;
00043 string now;
00044
00045 while (true) {
00046 if ( playerList.size() == 0 ) {
00047 cout << "<ChatRoom msg> ChatRoom Empty: Suspended." << endl;
00048 suspend();
00049 cout << "<ChatRoom msg> ChatRoom Resumed." << endl;
00050 }
00051 pli = playerList.begin();
00052
00053 while ( pli != playerList.end() ) {
00054 /* Recupera eventuale messaggio digitato dall'utente:
00055 * attende 5 decimi di secondo */
00056 message = (*pli)->hear(500);
00057
00058 /* Calcola l'ora e la data corrente. */
00059 t = std::time(NULL);
00060 tbp = std::localtime(&t);
00061 last = std::strftime(time_buffer, 64, "%Y-%m-%d %H:%M:%S", tbp);
00062 time_buffer[last] = '\0';
00063 now = time_buffer;
00064
00065 /* Costruisce il Messaggio */
00066 completeMessage = "[" + now + "] ";
00067 completeMessage += (*pli)->getName();
00068 completeMessage += " >>> " + message + "\n";
00069
00070 if ( !message.empty() ) {
00071 if ( !strcmp(message.data(), "\\quit") ) {
00072 delPlayer(*pli);
00073 break;
00074 }
00075 else {
00076 /* Invia il messaggio a tutti, tranne che
00077 * al Player "pli" */
00078 sayToAll(completeMessage, *pli);
00079 }
00080 }
00081 pli++;
00082
00083 /* e' necessario ripulire la stringa del messaggio dell'utente */
00084 message.clear();
00085 }
00086 /* Attendiamo 2 decimi di second prima di ricominciare
00087 * a trasmettere messaggi. */
00088 sleep(200);
00089 }
00090
00091 }
|
Questo è il grafo delle chiamate per questa funzione:

|
||||||||||||
|
Invia un messaggio a tutti i
Questo metodo e' utilizzato per "girare" i messaggi digitati da un
Definizione alla linea 243 del file ChatRoom.cc. Riferimenti playerList. Referenziato da addPlayer(), delPlayer(), e run().
00243 {
00244 list<Player *>::iterator pli;
00245
00246 pli = playerList.begin();
00247 while ( pli != playerList.end() ) {
00248 if ( notSay == NULL || (notSay != NULL && *pli != notSay) )
00249 (*pli)->say(message);
00250 pli++;
00251 }
00252 }
|
|
|
Definizione alla linea 53 del file ChatRoom.h. Referenziato da addPlayer(), delPlayer(), final(), e printPlayersList(). |
|
|
Lista dei
Definizione alla linea 51 del file ChatRoom.h. Referenziato da addPlayer(), delPlayer(), final(), getNumPlayers(), printPlayersList(), run(), e sayToAll(). |
1.3.4