#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(). |