1 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2 %%% DP - Componente Network %%%
3 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5 \subsection{Classe Network
} %%%%%%
7 \subsubsection*
{\large{Descrizione generale
}}
8 Classe astratta. Presenta un'interfaccia semplice e di alto livello al sottosistema per la gestione della rete. L'implementazione è delegata alle sottoclassi concrete
\texttt{GameClient
} e
\texttt{GameServer
}, poiché il comportamento varia a seconda se l'applicazione funge da server oppure da client per la partita.
12 \subsubsection*
{\large{Attributi
}}
16 \texttt{private QWidget *
\_gui}
18 \item Puntatore alla finestra di dialogo per l'interazione con l'utente durante la fase di configurazione e avvio di una partita online.
19 \item Costruzione: copia del puntatore a partire del parametro
\texttt{gui
} del costruttore della classe; la creazione del
\textit{dialog
} è compito del componente
\textsl{GUI
}.
20 \item Distruzione: l'oggetto puntato verrà distrutto dal componente
\textsl{GUI
}; questa classe perciò non deve deallocare tale oggetto.
21 \item Note: non è possibile fare alcuna assunzione sulla validità del puntatore poiché l'oggetto puntato può venire deallocato in qualsiasi momento dal componente
\textsl{GUI
}.
26 \subsubsection*
{\large{Operazioni
}}
29 \subsubsection{Network
}
30 \texttt{public Network(QWidget *gui)
[constructor
]}
32 \item Parametri e precondizioni:
\texttt{gui
} deve essere un puntatore non nullo al componente della GUI che ha il compito di interfacciarsi con l'utente nella modalità online; dovrà essere in grado di gestire opportunamente (o ignorare) i segnali emessi dallo strato di rete descritti nel seguito.
33 \item Comportamento: assegna a
\texttt{\_gui} il valore del parametro
\texttt{gui
}.
37 \subsubsection{\~
{}Network
}
38 \texttt{public \~
{}Network()
[destructor, virtual
]}
40 \item Comportamento: il corpo di questo distruttore è vuoto.
44 \subsubsection{requestMove
}
45 \texttt{public Point requestMove()
[abstract
]}
47 \item Valore ritornato e sua semantica: restituisce la coordinata della casella su cui il giocatore remoto ha posizionato la propria pedina. Se il
\texttt{Point
} restituito è nullo significa che la mossa non è ancora stata ricevuta e quindi il chiamante, se ancora interessato, deve invocare il metodo
\texttt{SyncSharedCondition::waitForMove()
}, attendendo che lo strato di rete gli notifichi l'avvenuta ricezione della mossa.
51 \subsubsection{setupChat
}
52 \texttt{public void setupChat(ChatWidget *widget)
[abstract
]}
54 \item Parametri e precondizioni:
\texttt{widget
} è un puntatore valido ad un'istanza di
\texttt{ChatWidget
} che si occupa di interagire con l'utente, mostrandogli e ricevendo da lui i messaggi di chat.
55 \item Comportamento: collega opportunamente i
\textit{sockets
} di comunicazione client-server con la parte grafica dell'applicazione tramite segnali e slots. L'esatto comportamento verrà definito nelle sottoclassi che concretizzano questo metodo.
60 \subsection{Classe GameClient
} %%%%%%
62 \subsubsection*
{\large{Descrizione generale
}}
63 Implementa
\texttt{Network
}.
67 \subsubsection*
{\large{Attributi
}}
70 \subsubsection{\_localPlayer}
71 \texttt{private int
\_localPlayer}
73 \item Indica l'ID del
\uline{giocatore umano
} che sta usando quest'istanza dell'applicazione in una partita online. L'ID può essere assegnato esclusivamente dal
\uline{server di gioco
}. I valori possibili variano nell'intervallo $
[-
1,
2]$. Il valore $-
1$ ha un significato speciale ed è usato quando il server non ha ancora comunicato al client il proprio ID o nel caso in cui si stia partecipando ad una partita in
\uline{modalità spettatore
}.
74 \item Costruzione: è inizializzato a $-
1$ dal costruttore della classe.
78 \subsubsection{\_server}
79 \texttt{private ClientSocket *
\_server}
81 \item Rappresenta il canale di comunicazione con il
\uline{server di gioco
}.
82 \item Costruzione: allocato e inizializzato dal costruttore.
83 \item Distruzione: effettuata dal distruttore della classe.
88 \subsubsection*
{\large{Operazioni
}}
91 \subsubsection{GameClient
}
92 \texttt{public GameClient(QWidget *gui, QString serverAddress, quint16 serverPort)
[constructor
]}
94 \item Parametri e precondizioni:
96 \item \texttt{gui
} deve essere un puntatore non nullo al componente della GUI che ha il compito di interfacciarsi con l'utente nella modalità online; dovrà essere in grado di gestire opportunamente (o ignorare) i segnali emessi da
\texttt{\_server} descritti nel seguito.
97 \item \texttt{serverAddress
} è una stringa contenente l'indirizzo del server a cui connettersi; può essere sia in forma di
\textit{hostname
} sia in forma di indirizzo IP. Se l'indirizzo IP non è valido o l'
\textit{hostname
} è inesistente, verrà segnalato un errore.
98 \item \texttt{serverPort
} è la porta del server a cui connettersi.
102 \item invoca il costruttore della classe base
\texttt{Network(gui)
};
103 \item inizializza
\texttt{\_localPlayer} al valore $-
1$;
104 \item alloca sullo
\textit{heap
} un oggetto
\texttt{s
} di tipo
\texttt{QTcpSocket
};
105 \item inizializza il campo dati
\texttt{\_server} con un oggetto di tipo
\texttt{ClientSocket
}, passando
\texttt{s
} come parametro al costruttore;
106 \item connette il segnale
\texttt{s::hostFound()
} allo slot
\texttt{gui::TODO
};
107 \item connette il segnale
\texttt{s::connected()
} allo slot
\texttt{gui::TODO
};
108 \item invoca
\verb!s->connectToHost(serverAddress)!;
109 \item invoca
\verb!s->changeState(StreamSocket::Connecting)!.
114 \subsubsection{\~
{}GameClient
}
115 \texttt{public \~
{}GameClient()
[destructor, virtual
]}
117 \item Comportamento: dealloca
\texttt{\_server}, il cui distruttore si occuperà di chiudere lo
\textit{stream
}.
121 \subsubsection{requestMove
}
122 \texttt{public Point requestMove()
[virtual
]}
124 \item Comportamento:
\verb!_server->changeState(StreamSocket::AwaitingMove)!.
125 \item Valore ritornato e sua semantica: rispetta il contratto di \\
\texttt{Network::requestMove()
}.
126 \item Side effects:
\texttt{\_server} transita nello stato ``Awaiting Move''.
130 \subsubsection{setupChat
}
131 \texttt{public void setupChat(ChatWidget *widget)
[virtual
]}
133 \item Parametri e precondizioni:
\texttt{widget
} è un puntatore valido ad un'istanza di
\texttt{ChatWidget
} che si occupa di interagire con l'utente, mostrandogli e ricevendo da lui i messaggi di chat.
134 \item Comportamento: collega
\texttt{\_server::receivedChatMessage()
} a \\
\texttt{widget::displayText()
} e
\texttt{widget::textEntered()
} a \\
\texttt{\_server::sendChatMessage()
}.
138 \subsubsection{setLocalPlayer
}
139 \texttt{private void setLocalPlayer(int id)
[slot
]}
141 \item Parametri e precondizioni:
143 \item \texttt{id
} è un intero compreso nell'intervallo $
[-
1,
2]$;
144 \item \texttt{\_server} si trova nello stato ``Awaiting Game Start''.
146 \item Comportamento: il valore del parametro
\texttt{id
} viene assegnato a
\texttt{\_localPlayer}.
147 \item Note: questo metodo dovrebbe essere invocato solo come slot collegato al segnale
\texttt{ClientSocket::joinAccepted()
}.
152 \subsection{Classe GameServer
} %%%%%%
154 \subsubsection*
{\large{Descrizione generale
}}
155 Implementa ed estende
\texttt{Network
}.
159 \subsubsection*
{\large{Attributi
}}
162 \subsubsection{\_listener}
163 \texttt{private QTcpServer *
\_listener}
165 \item \textit{Socket
} in ascolto sull'indirizzo IPv4 ``
\texttt{0.0.0.0}'' che accetta le connessioni in entrata.
166 \item Costruzione: allocato dal costruttore della classe.
167 \item Distruzione: effettuata dal distruttore della classe.
168 \item Note: emette il segnale
\texttt{newConnection()
} ad ogni nuova connessione in entrata.
172 \subsubsection{\_pendingConnections}
173 \texttt{private QLinkedList<ServerSocket*>
\_pendingConnections}
175 \item Lista di tutte le connessioni con client che non hanno ancora richiesto di partecipare alla partita.
176 \item Costruzione: il costruttore della classe crea una lista vuota.
177 \item Note: tutti i
\textit{socket
} di questa lista possono trovarsi esclusivamente in uno dei seguenti stati: ``Opening Stream'', ``Fully Opened'', ``Awaiting Join Request''. Quando si riceve un messaggio
\texttt{<joinRequest>
} valido e accettabile da uno di questi
\textit{socket
}, è necessario spostare tale
\textit{socket
} in una delle due liste descritte nel seguito in base alla modalità di gioco richiesta.
181 \subsubsection{\_remotePlayers}
182 \texttt{private QList<ServerSocket*>
\_remotePlayers}
184 \item Lista delle connessioni con i client che partecipano alla partita come giocatori.
185 \item Costruzione: il costruttore della classe crea una lista vuota.
186 \item Note: tutti i
\textit{socket
} di questa lista possono trovarsi esclusivamente in uno dei seguenti stati: ``Awaiting Players'', ``Playing'', ``Awaiting Move''.
190 \subsubsection{\_spectators}
191 \texttt{private QList<ServerSocket*>
\_spectators}
193 \item Lista delle connessioni con i client che assistono alla partita in corso come spettatori.
194 \item Costruzione: il costruttore della classe crea una lista vuota.
195 \item Note: tutti i
\textit{socket
} di questa lista possono trovarsi esclusivamente in uno dei seguenti stati: ``Awaiting Players'', ``Playing'', ``Awaiting Move''.
199 \subsubsection{\_gameInProgress}
200 \texttt{private bool
\_gameInProgress}
202 \item Indica se è in corso una partita.
203 \item Costruzione: inizializzato a
\texttt{false
} dal costruttore della classe.
204 \item Note: verrà impostato a
\texttt{true
} quando inizia la partita.
208 \subsubsection{\_history}
209 \texttt{private HistoryModel *
\_history}
211 \item Costruzione: copia del puntatore passato al costruttore della classe.
212 \item Distruzione: l'oggetto puntato non deve essere distrutto poiché appartiene alla classe
\texttt{MainWindow
}, la quale si occuperà della sua deallocazione.
213 \item Note: utilizzato per ottenere lo storico delle mosse da inviare agli spettatori che si connettono al server quando la partita è già iniziata.
217 \subsubsection{\_names}
218 \texttt{private QStringList
\_names}
220 \item Contiene i nomi di tutti i giocatori e gli spettatori connessi.
221 \item Costruzione: inizializzato alla lista vuota dal costruttore della classe.
222 \item Note: vale la seguente relazione:
224 \item $
\forall i$ tale che $
0 \leq i <
\mbox{\texttt{\_numberOfPlayers}} \Rightarrow$
\texttt{\_names[}$i$
\texttt{]} è il nome del giocatore
\texttt{\_remotePlayers[}$i$
\texttt{]};
225 \item $
\forall i$ tale che $i
\geq \mbox{\texttt{\_numberOfPlayers}} \Rightarrow$
\texttt{\_names[}$i$
\texttt{]} è il nome dello spettatore
\texttt{\_spectators[}$i -
\mbox{\texttt{\_numberOfPlayers}}$
\texttt{]}.
230 \subsubsection{\_numberOfPlayers}
231 \texttt{private int
\_numberOfPlayers}
233 \item Indica il numero di giocatori impostato per la partita.
234 \item Costruzione: inizializzato dal costruttore della classe a \\
\verb!_settings->playersInfo().size()!.
238 \subsubsection{\_turn}
239 \texttt{private int
\_turn}
241 \item Indica l'ID del giocatore di cui è attualmente il turno.
242 \item Costruzione: inizializzato a $-
1$ dal costruttore della classe.
246 \subsubsection{\_settings}
247 \texttt{private ServerSettings *
\_settings}
249 \item Viene usato per caricare le opzioni impostate dall'utente in fase di configurazione del
\uline{server di gioco
}.
250 \item Costruzione: allocato dal costruttore della classe.
251 \item Distruzione: effettuata dal distruttore della classe.
256 \subsubsection*
{\large{Operazioni
}}
259 \subsubsection{GameServer
}
260 \texttt{public GameServer(QWidget *gui, HistoryModel *history)
[constructor
]}
262 \item Parametri e precondizioni:
264 \item \texttt{gui
} deve essere un puntatore non nullo al componente della GUI che ha il compito di interfacciarsi con l'utente nella modalità online; dovrà essere in grado di gestire opportunamente (o ignorare) i segnali emessi dai
\textit{socket
} di tipo
\texttt{ServerSocket
} descritti nel seguito.
265 \item \texttt{history
} è un puntatore non nullo a HistoryModel; la validità di questo puntatore deve essere assicurata durante tutta la vita dell'oggetto.
269 \item invoca il costruttore della classe base
\texttt{Network(gui)
};
270 \item inizializza i campi dati come precedentemente specificato;
271 \item connette il segnale
\texttt{\_listener::newConnection()
} allo slot \\
\texttt{this::handleIncomingConnection()
};
272 \item invoca
\texttt{\_listener->listen(QHostAddress::Any, \\
\_settings->serverPort())
}.
277 \subsubsection{\~
{}GameServer
}
278 \texttt{public \~
{}GameServer()
[destructor, virtual
]}
280 \item Comportamento: dealloca
\texttt{\_listener} e
\texttt{\_settings}.
284 \subsubsection{requestMove
}
285 \texttt{public Point requestMove()
[virtual
]}
287 \item Comportamento:
\verb!_remotePlayers
[_turn
]->changeState(StreamSocket::AwaitingMove)!.
288 \item Valore ritornato e sua semantica: rispetta il contratto di \\
\texttt{Network::requestMove()
}.
289 \item Side effects: il
\textit{socket
} \texttt{\_remotePlayers[\_turn]} transita nello stato ``Awaiting Move''.
293 \subsubsection{setupChat
}
294 \texttt{public void setupChat(ChatWidget *widget)
[virtual
]}
296 \item Parametri e precondizioni:
\texttt{widget
} è un puntatore valido ad un'istanza di
\texttt{ChatWidget
} che si occupa di interagire con l'utente, mostrandogli e ricevendo da lui i messaggi di chat.
297 \item Comportamento: per ogni
\textit{socket
} \texttt{s
} in
\texttt{\_remotePlayers} e in
\texttt{\_spectators}, collega
\texttt{s::receivedChatMessage()
} a
\texttt{widget::displayText()
} e \\
\texttt{widget::textEntered()
} a
\texttt{s::sendChatMessage()
}.
301 \subsubsection{handleIncomingConnection
}
302 \texttt{private void handleIncomingConnection()
[slot
]}
306 \item alloca sullo
\textit{heap
} un nuovo
\texttt{ServerSocket s
} a partire dal
\texttt{QTcpSocket
} restituito da
\verb!_listener->nextPendingConnection()!;
307 \item aggiunge
\texttt{s
} in coda alla lista
\texttt{\_pendingConnections}.
309 \item Note: questo metodo dovrebbe essere invocato solo come slot collegato al segnale
\texttt{\_listener::newConnection()
}.
313 \subsubsection{handleJoinRequest
}
314 \texttt{private void handleJoinRequest(QString mode, QString name)
[slot
]}
316 \item Parametri e precondizioni:
318 \item \texttt{mode
} e
\texttt{name
} sono due
\texttt{QString
} non nulle e non vuote;
319 \item la richiesta proviene da un
\texttt{ServerSocket
} che si trova nello stato ``Awaiting Join Request''.
321 \item Comportamento: vedere diagramma in Figura~
\ref{fig:handleJoinRequest
}.
322 \item Side effects: il
\texttt{ServerSocket
} da cui proviene la richiesta va nello stato ``Awaiting Players'' se la richiesta viene accettata, altrimenti rimane nello stato ``Awaiting Join Request''.
323 \item Note: questo metodo dovrebbe essere invocato solo come slot collegato al segnale
\texttt{s::joinRequested()
} per ogni
\texttt{s
} in
\texttt{\_pendingConnections}.
327 \subsubsection{setTurn
}
328 \texttt{private void setTurn(int playerId)
[slot
]}
330 \item Parametri e precondizioni:
332 \item \texttt{playerId
} è un intero compreso nell'intervallo $
[0,
2]$;
333 \item \texttt{\_gameInProgress} è
\texttt{true
}.
335 \item Comportamento: il valore del parametro
\texttt{playerId
} viene assegnato a
\texttt{\_turn}.
336 \item Note: questo metodo dovrebbe essere invocato solo come slot collegato al segnale
\texttt{GameLoop::turn()
}.
341 \subsection{Classe StreamSocket
} %%%%%%
343 \subsubsection*
{\large{Descrizione generale
}}
344 Derivata in modo protetto da
\texttt{QXmlStreamReader
} e
\texttt{QXmlStreamWriter
}. Implementa le funzionalità di basso livello necessarie a scambiare i messaggi del protocollo comuni a client e server. Il protocollo è basato su uno
\textit{stream
} XML bidirezionale trasmesso su una connessione TCP. Tutte le comunicazioni con l'host remoto vengono effettuate attraverso la classe
\texttt{QTcpSocket
}.
348 \subsubsection*
{\large{Attributi
}}
351 \subsubsection{\_supportedProtocolVersion}
352 \texttt{protected QString
\_supportedProtocolVersion [const, static
]}
354 \item Indica la versione del protocollo supportata da questa classe. La versione attuale è ``$
1.0$''.
355 \item Note: le sottoclassi possono scegliere di ignorare il valore di questo attributo qualora esse implementino delle estensioni del protocollo che ne cambiano la versione.
359 \subsubsection{\_socket}
360 \texttt{protected QTcpSocket *
\_socket}
362 \item Costruzione: ad opera del costruttore.
363 \item Distruzione: effettuata dal distruttore della classe.
364 \item Note: Tutte le comunicazioni con l'host remoto devono passare attraverso questa classe.
368 \subsubsection{\_buffer}
369 \texttt{private QLinkedList<Move>
\_buffer}
371 \item \`E una coda FIFO delle mosse ricevute dai giocatori remoti ma non ancora inoltrate a
\texttt{GameLoop
}.
372 \item Costruzione: il costruttore crea una lista vuota.
376 \subsubsection{\_state}
377 \texttt{private ProtocolState
\_state}
379 \item Indica lo stato in cui si trova il
\textit{socket
}.
380 \item Costruzione: inizializzato dal costruttore.
381 \item Note: può essere modificato solo dal metodo
\texttt{changeState()
}.
386 \subsubsection*
{\large{Operazioni
}}
389 \subsubsection{StreamSocket
}
390 \texttt{protected StreamSocket(QTcpSocket *socket)
[constructor
]}
392 \item Parametri e precondizioni:
\texttt{socket
} è un puntatore non nullo ad un
\texttt{QTcpSocket
}.
395 \item assegna
\texttt{socket
} al campo dati
\texttt{\_socket};
396 \item inizializza
\texttt{\_state} a
\texttt{Unconnected
};
397 \item collega
\texttt{\_socket::readyRead()
} a
\texttt{parseData()
} e
\texttt{\_socket::error()
} a
\texttt{handleError()
}.
399 \item Note: questo costruttore è protetto poiché la classe
\texttt{StreamSocket
} non può essere usata direttamente.
403 \subsubsection{\~
{}StreamSocket
}
404 \texttt{public \~
{}StreamSocket()
[destructor, virtual
]}
406 \item Comportamento: chiude lo
\textit{stream
} XML invocando
\texttt{closeStream()
} e successivamente dealloca
\texttt{\_socket}.
410 \subsubsection{state
}
411 \texttt{public ProtocolState state()
[const
]}
413 \item Comportamento: ritorna l'attuale valore di
\texttt{\_state}.
417 \subsubsection{changeState
}
418 \texttt{protected void changeState(ProtocolState state)
}
420 \item Parametri e precondizioni:
\texttt{state
} è lo stato
\textit{target
} della transizione.
421 \item Comportamento: assegna
\texttt{state
} a
\texttt{\_state}.
422 \item Note: questo è l'unico metodo da usare per effettuare transizioni di stato, in particolare per le sottoclassi.
426 \subsubsection{sendChatMessage
}
427 \texttt{public void sendChatMessage(QString msg)
[slot, virtual
]}
429 \item Parametri e precondizioni:
\texttt{msg
} è una stringa non nulla e non vuota.
430 \item Comportamento: crea e invia all'host remoto un messaggio XML di tipo
\texttt{<chatMessage>
} contenente
\texttt{msg
}.
434 \subsubsection{sendMove
}
435 \texttt{public void sendMove(Move move)
[slot, virtual
]}
437 \item Comportamento: crea e invia all'host remoto un messaggio XML di tipo
\texttt{<move>
} contenente la forma serializzata di
\texttt{move
}.
441 \subsubsection{openStream
}
442 \texttt{protected void openStream()
[slot, virtual
]}
444 \item Comportamento: apre l'elemento XML
\texttt{<stream>
} ponendo l'attributo
\texttt{version
} pari a
\texttt{\_supportedProtocolVersion} e invoca \\
\verb!changeState(StreamSocket::OpeningStream)!.
445 \item Note: eventuali sottoclassi che vogliono estendere il protocollo cambiandone la versione devono ridefinire questo metodo per poter inviare il numero di versione corretto.
449 \subsubsection{closeStream
}
450 \texttt{protected void closeStream()
[slot, virtual
]}
454 \item chiude tutti gli elementi XML precedentemente aperti, compreso l'elemento radice;
455 \item invoca
\verb!_socket->disconnectFromHost()!;
456 \item invoca
\verb!this->changeState(StreamSocket::Closed)!.
458 \item Side effects: l'oggetto effettua una transizione verso lo stato ``Closed''.
462 \subsubsection{handleError
}
463 \texttt{protected void handleError(QAbstractSocket::SocketError error)
[slot, virtual
]}
465 \item Comportamento: TODO.
466 \item Note: questo metodo dovrebbe essere invocato solo come slot collegato al segnale
\texttt{\_socket::error()
}.
470 \subsubsection{parseData
}
471 \texttt{protected void parseData()
[slot, virtual
]}
473 \item Comportamento: effettua il parsing dei messaggi provenienti dall'host remoto e si comporta come descritto in Tabella
%TODO.
474 \item Note: gestisce solo i messaggi presenti in Tabella~X. Deve essere ridefinito dalle classi derivate per estendere il protocollo o per poterne modificare il comportamento. Questo metodo dovrebbe essere invocato solo come slot collegato al segnale
\texttt{\_socket::readyRead()
}.
478 \subsubsection{playerJoined
}
479 \texttt{protected void playerJoined(int id, QString name, QString type)
[signal
]}
481 \item Note: emesso quando un nuovo giocatore remoto si è unito alla partita. I parametri del segnale rappresentano rispettivamente il suo ID ($-
1$ se è uno spettatore), il nome e il tipo (``player'' o ``spectator'').
485 \subsubsection{playerLeft
}
486 \texttt{protected void playerLeft(int id)
[signal
]}
488 \item Note: emesso quando il giocatore remoto con ID uguale al parametro
\texttt{id
} ha abbandonato la partita o non è più raggiungibile a causa di problemi nella rete.
492 \subsubsection{receivedChatMessage
}
493 \texttt{protected void receivedChatMessage(QString msg)
[signal
]}
495 \item Note: questo segnale viene emesso ogni volta che si riceve un messaggio di chat dall'host remoto.
499 \subsubsection{receivedMove
}
500 \texttt{protected void receivedMove(Move move)
[signal
]}
502 \item Note: emesso quando si riceve un messaggio di tipo
\texttt{<move>
}. Segnala che un giocatore remoto ha effettuato la mossa indicata dal parametro
\texttt{move
}.
506 \subsubsection{startGame
}
507 \texttt{protected void startGame()
[signal
]}
509 \item Note: emesso quando si riceve il messaggio
\texttt{<startGame>
} dal server. Indica che tutti i giocatori sono connessi e la partita può iniziare.
514 \subsection{Classe ClientSocket
} %%%%%%
516 \subsubsection*
{\large{Descrizione generale
}}
517 Estende
\texttt{StreamSocket
}.
521 \subsubsection*
{\large{Operazioni
}}
524 \subsubsection{ClientSocket
}
525 \texttt{public ClientSocket(QTcpSocket *socket)
[constructor
]}
527 \item Parametri e precondizioni:
\texttt{socket
} è un puntatore non nullo ad un
\texttt{QTcpSocket
}.
530 \item invoca il costruttore della classe base passando
\texttt{socket
} come parametro;
531 \item connette il segnale
\texttt{\_socket::connected()
} allo slot
\texttt{this::openStream()
}.
536 \subsubsection{joinGame
}
537 \texttt{public void joinGame(QString mode, QString name)
[slot
]}
539 \item Parametri e precondizioni:
541 \item \verb!mode == "player"! oppure
\verb!mode == "spectator"!;
542 \item \texttt{name
} è una
\texttt{QString
} non nulla e non vuota;
543 \item \verb!this->state() == Idle!.
547 \item invia un messaggio XML
\texttt{<joinRequest>
} il cui contenuto è il parametro
\texttt{name
} e il cui attributo
\texttt{gameMode
} è impostato al parametro
\texttt{mode
};
548 \item invoca
\verb!this->changeState(StreamSocket::AwaitingJoinAnswer)!.
550 \item Side effects: l'oggetto effettua una transizione verso lo stato ``Awaiting Join Answer''.
554 \subsubsection{cancelJoin
}
555 \texttt{public void cancelJoin()
[slot
]}
557 \item Comportamento: se l'oggetto si trova nello stato ``Awaiting Join Answer'' o ``Awaiting Game Start'':
559 \item invia un messaggio XML
\texttt{<playerLeft>
} impostandone il contenuto a $-
1$;
560 \item invoca
\verb!this->changeState(StreamSocket::Idle)!;
562 altrimenti non fa nulla.
563 \item Side effects: se l'oggetto si trova nello stato ``Awaiting Join Answer'' o ``Awaiting Game Start'', allora viene effettuata una transizione verso lo stato ``Idle''.
567 \subsubsection{parseData
}
568 \texttt{protected void parseData()
[slot, virtual
]}
570 \item Comportamento: effettua il parsing dei messaggi provenienti dall'host remoto e si comporta come descritto in Figura~
\ref{fig:clientPSM
}.
571 \item Note: per i messaggi
\texttt{<move>
} e
\texttt{<chatMessage>
} viene invocato il metodo della superclasse.
575 \subsubsection{joinAccepted
}
576 \texttt{protected void joinAccepted(int id)
[signal
]}
578 \item Note: emesso quando si riceve il messaggio
\texttt{<joinACK>
} dal server. Segnala che la richiesta è stata accettata e che l'utente può partecipare alla partita.
582 \subsubsection{joinRefused
}
583 \texttt{protected void joinRefused(int cause)
[signal
]}
585 \item Note: emesso quando si riceve il messaggio
\texttt{<joinNAK>
} dal server. Segnala che la richiesta non è stata accettata e quindi l'utente non può partecipare alla partita. Il parametro
\texttt{cause
} indica il motivo del rifiuto.
589 \subsubsection{receivedGameSettings
}
590 \texttt{protected void receivedGameSettings(int d1, int d2, int num, int timer, bool playing)
[signal
]}
592 \item Note: emesso quando si riceve il messaggio
\texttt{<settings>
} dal server. I primi quattro parametri rappresentano le impostazioni della partita, mentre
\texttt{playing
} indica se la partita è già iniziata o meno.
596 \subsubsection{receivedHistory
}
597 \texttt{protected void receivedHistory(QList<Move> history)
[signal
]}
599 \item Note: emesso quando si riceve il messaggio
\texttt{<history>
} dal server. Il parametro
\texttt{history
} contiene la sequenza di mosse giocate fino a quel momento nella partita in corso sul server.
604 \subsection{Classe ServerSocket
} %%%%%%
606 \subsubsection*
{\large{Descrizione generale
}}
607 Estende
\texttt{StreamSocket
}.
611 \subsubsection*
{\large{Operazioni
}}
614 \subsubsection{ServerSocket
}
615 \texttt{public ServerSocket(QTcpSocket *socket)
[constructor
]}
617 \item Parametri e precondizioni:
\texttt{socket
} è un puntatore non nullo ad un
\texttt{QTcpSocket
}.
618 \item Comportamento: invoca il costruttore della classe base passando
\texttt{socket
} come parametro e poi invoca
\verb!changeState(StreamSocket::Connected)!.
622 \subsubsection{acceptJoin
}
623 \texttt{public void acceptJoin(int id)
}
627 \item invia un messaggio XML
\texttt{<joinACK>
} avente contenuto uguale al parametro
\texttt{id
};
628 \item invoca
\verb!this->changeState(StreamSocket::AwaitingPlayers)!.
630 \item Side effects: l'oggetto effettua una transizione verso lo stato ``Awaiting Players''.
634 \subsubsection{refuseJoin
}
635 \texttt{public void refuseJoin(int cause)
}
637 \item Comportamento: invia un messaggio XML
\texttt{<joinNAK>
} avente contenuto uguale al parametro
\texttt{cause
}.
641 \subsubsection{sendGameSettings
}
642 \texttt{public void sendGameSettings(int d1, int d2, int num, int timer, bool playing)
[slot
]}
646 \item invia un messaggio XML
\texttt{<settings>
}, impostandone gli elementi interni come indicato dai parametri;
647 \item invoca
\verb!this->changeState(StreamSocket::AwaitingJoinRequest)!.
649 \item Side effects: l'oggetto effettua una transizione verso lo stato ``Awaiting Join Request''.
653 \subsubsection{sendHistory
}
654 \texttt{public void sendHistory(QList<Move> history)
[slot
]}
656 \item Comportamento: serializza la lista di mosse passata nel parametro
\texttt{history
} e la invia al client come messaggio XML
\texttt{<history>
}.
657 \item Note: questo metodo viene utilizzato solo qualora il client abbia precedentemente richiesto di connettersi alla partita come spettatore e la partita sia già iniziata.
661 \subsubsection{sendPlayerJoined
}
662 \texttt{public void sendPlayerJoined(int id, QString name, QString type)
[slot
]}
664 \item Comportamento: invia un messaggio XML
\texttt{<playerJoined>
} generato nel modo seguente:
666 \item l'attributo
\texttt{id
} viene posto uguale al parametro
\texttt{id
};
667 \item gli elementi
\texttt{<name>
} e
\texttt{<type>
} contengono rispettivamente il valore del parametro omonimo;
668 \item l'elemento
\texttt{<
color>
} non viene generato.
673 \subsubsection{sendPlayerLeft
}
674 \texttt{public void sendPlayerLeft(int id)
[slot
]}
676 \item Comportamento: invia un messaggio XML
\texttt{<playerLeft>
} avente contenuto uguale al parametro
\texttt{id
}.
680 \subsubsection{sendStartGame
}
681 \texttt{public void sendStartGame()
[slot
]}
683 \item Comportamento: invia un messaggio XML
\texttt{<startGame>
} vuoto.
687 \subsubsection{parseData
}
688 \texttt{protected void parseData()
[slot, virtual
]}
690 \item Comportamento: effettua il parsing dei messaggi provenienti dall'host remoto e si comporta come descritto in Figura~
\ref{fig:serverPSM
}.
691 \item Note: per i messaggi
\texttt{<move>
} e
\texttt{<chatMessage>
} viene invocato il metodo della superclasse.
695 \subsubsection{joinRequested
}
696 \texttt{protected void joinRequested(QString mode, QString name)
[signal
]}
698 \item Note: emesso quando si riceve un messaggio
\texttt{<joinRequest>
} da un client.
\texttt{mode
} e
\texttt{name
} sono rispettivamente modalità e nome con i quali il client intende connettersi alla partita.
703 \subsection{Diagrammi UML
} %%%%%%
707 \includegraphics[width=
13cm
]{GameServer_handleJoinRequest.png
}
708 \caption{Diagramma
\texttt{GameServer::handleJoinRequest
}}
709 \label{fig:handleJoinRequest
}
714 \includegraphics[width=
13cm
]{ClientPSM.png
}
715 \caption{Diagramma degli stati del protocollo di rete (lato client)
}
716 \label{fig:clientPSM
}
721 \includegraphics[width=
13cm
]{ServerPSM.png
}
722 \caption{Diagramma degli stati del protocollo di rete (lato server)
}
723 \label{fig:serverPSM
}