Riferimenti per la classe ChatRoom

#include <ChatRoom.h>

Diagramma delle classi per ChatRoom

Inheritance graph
[legenda]
Diagramma di collaborazione per ChatRoom:

Collaboration graph
[legenda]
Lista di tutti i membri.

Descrizione Dettagliata

ChatRoom per MGS: un esempio di implementazione di 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.


Documentazione dei costruttori e dei distruttori

ChatRoom::ChatRoom void   ) 
 

Costruttore di default della Classe ChatRoom.

Definizione alla linea 11 del file ChatRoom.cc.

00011 {}

ChatRoom::ChatRoom Player firstPlayer  ) 
 

Costruttore overlodato della Classe ChatRoom.

Parametri:
firstPlayer Primo giocatore della nuova ChatRoom

Definizione alla linea 17 del file ChatRoom.cc.

Riferimenti addPlayer().

00017                                       {
00018    addPlayer(firstPlayer);
00019 }

Questo il grafo delle chiamate per questa funzione:

ChatRoom::~ChatRoom void   )  [virtual]
 

Distruttore della Classe ChatRoom.

Definizione alla linea 22 del file ChatRoom.cc.

00022 {exit();}


Documentazione delle funzioni membro

void ChatRoom::addPlayer Player newPlayer  )  [virtual]
 

Aggiungi un Player alla ChatRoom.

Un messaggio di Benvenuto viene inviato all'utente e gli altri partecipanti alla ChatRoom vengono avvertiti dell'arrivo del nuovo Player.

Parametri:
newPlayer Nuovo giocatore.

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:

void ChatRoom::delPlayer Player toDelete  )  [protected]
 

Rimuovi un Player dalla ChatRoom (overloaded).

Un messaggio di Arrivederci viene inviato all'utente e gli altri partecipanti alla ChatRoom vengono avvertiti.

Parametri:
toDelete Puntatore al Player da eliminare.

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:

bool ChatRoom::delPlayer const string &  toDelete  )  [virtual]
 

Rimuovi un Player dalla ChatRoom (overloaded).

Un messaggio di Arrivederci viene inviato all'utente e gli altri partecipanti alla ChatRoom vengono avvertiti.

Parametri:
toDelete Nome del Player da eliminare.
Restituisce:
true se il Player viene trovato e rimosso, false altrimenti

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:

void ChatRoom::final void   )  [virtual]
 

Chiusura della ChatRoom.

Metodo ereditato da Thread, richiamato (automaticamente dalla Librerie) alla fine del metodo run().
Gestisce la corretta chiusura della ChatRoom: viene richiamato al termine del metodo "run()" o del metodo "exit()".

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 }

string ChatRoom::getName void   )  const [virtual]
 

Ritorna il nome del Game.

Restituisce:
Ritorna il Nome del Game

Implementa Game.

Definizione alla linea 232 del file ChatRoom.cc.

00232 {return "ChatRoom - Simple Chat for MGS";}

int ChatRoom::getNumPlayers void   )  const [virtual]
 

Ritorna il numero di Player presenti nella ChatRoom.

Restituisce:
Ritorna il numero di Player presenti nella ChatRoom

Implementa Game.

Definizione alla linea 214 del file ChatRoom.cc.

Riferimenti playerList.

00214                                        {
00215    return playerList.size();
00216 }

void ChatRoom::init void   )  [virtual]
 

Inizializzazione della ChatRoom.

Metodo vuoto ereditato da Game.

Implementa Game.

Definizione alla linea 27 del file ChatRoom.cc.

00027 {}

void ChatRoom::printPlayersList iostream *  streamWherePrint  )  [virtual]
 

Stampa la lista dei Player presenti nella ChatRoom.

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 }

void ChatRoom::run void   )  [virtual]
 

Flusso di Controllo di ChatRoom.

Questo metodo rappresenta il Flusso di Controllo principale del Thread.
Qui' e' concentrato il funzionamento della ChatRoom.

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:

void ChatRoom::sayToAll const string &  message,
Player notSay = NULL
[protected]
 

Invia un messaggio a tutti i Player della ChatRoom.

Questo metodo e' utilizzato per "girare" i messaggi digitati da un Player a tutti gli altri Player presenti nella ChatRoom.

Parametri:
message Stringa del messaggio da Inviare
notSay Puntato del Player a cui NON INVIARE il messaggio (probabilmente e' colui che l'ha scritto).

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 }


Documentazione dei dati membri

Mutex ChatRoom::mutex [private]
 

Mutex (Semaforo) utile per le Sezioni Critiche.

Definizione alla linea 53 del file ChatRoom.h.

Referenziato da addPlayer(), delPlayer(), final(), e printPlayersList().

list<Player *> ChatRoom::playerList [private]
 

Lista dei Player presenti nella ChatRoom.

Definizione alla linea 51 del file ChatRoom.h.

Referenziato da addPlayer(), delPlayer(), final(), getNumPlayers(), printPlayersList(), run(), e sayToAll().


La documentazione per questa classe stata generata a partire dai seguenti file:
Generato il Sun Nov 28 13:27:24 2004 per MGS - Multithreaded Game Server da doxygen 1.3.4