/*
* retrieves the board of the request
*/
-static struct board *board_of_req(struct afb_req req)
+static inline struct board *board_of_req(struct afb_req req)
{
return afb_req_context(req, (void*)get_new_board, (void*)release_board);
}
board = board_of_req(req);
INFO(afbitf, "method 'move' called for boardid %d", board->id);
- /* retrieves the parameters of the move */
+ /* retrieves the arguments of the move */
index = afb_req_value(req, "index");
i = index == NULL ? -1 : atoi(index);
- /* checks validity of parameters */
+ /* checks validity of arguments */
if (i < 0 || i > 8) {
WARNING(afbitf, "can't move to %s: %s", index?:"?", index?"wrong value":"not set");
afb_req_fail(req, "error", "bad request");
board = board_of_req(req);
INFO(afbitf, "method 'level' called for boardid %d", board->id);
- /* retrieves the parameters */
+ /* retrieves the arguments */
level = afb_req_value(req, "level");
l = level == NULL ? -1 : atoi(level);
- /* check validity of parameters */
+ /* check validity of arguments */
if (l < 1 || l > 10) {
WARNING(afbitf, "can't set level to %s: %s", level?:"?", level?"wrong value":"not set");
afb_req_fail(req, "error", "bad request");
*/
static void join(struct afb_req req)
{
- struct board *board;
+ struct board *board, *new_board;
const char *id;
/* retrieves the context for the session */
board = board_of_req(req);
INFO(afbitf, "method 'join' called for boardid %d", board->id);
- /* retrieves the parameters */
- board = board_of_req(req);
+ /* retrieves the arguments */
id = afb_req_value(req, "boardid");
if (id == NULL)
goto bad_request;
- /* check validity of parameters */
+ /* none is a special id for joining a new session */
if (strcmp(id, "none") == 0) {
- board = get_new_board();
+ new_board = get_new_board();
goto success;
}
- board = search_board(atoi(id));
- if (board == NULL)
+
+ /* searchs the board to join */
+ new_board = search_board(atoi(id));
+ if (new_board == NULL)
goto bad_request;
- board->use_count++;
+ /*
+ * joining its board is stupid but possible
+ * however when called with the same stored pointer
+ * afb_req_context_set will not call the release
+ * function 'release_board'. So the use_count MUST not
+ * be incremented.
+ */
+ if (new_board != board)
+ new_board->use_count++;
+
success:
- afb_req_context_set(req, board, (void*)release_board);
+ /* set the new board (and leaves the previous one) */
+ afb_req_context_set(req, new_board, (void*)release_board);
/* replies */
afb_req_success(req, NULL, NULL);
{ .name= "move", .session= AFB_SESSION_NONE, .callback= move, .info= "Tells the client move" },
{ .name= "board", .session= AFB_SESSION_NONE, .callback= board, .info= "Get the current board" },
{ .name= "level", .session= AFB_SESSION_NONE, .callback= level, .info= "Set the server level" },
- { .name= "join", .session= AFB_SESSION_NONE, .callback= join, .info= "Join a board" },
+ { .name= "join", .session= AFB_SESSION_CHECK,.callback= join, .info= "Join a board" },
{ .name= "undo", .session= AFB_SESSION_NONE, .callback= undo, .info= "Undo the last move" },
{ .name= "wait", .session= AFB_SESSION_NONE, .callback= wait, .info= "Wait for a change" },
/* marker for end of the array */