/*** action for clientQueue[index] */ void handleReadBuf(int index){ struct clientMsg data; int retVal; //printf("readBuf:%s\n",ClientsQueue[index].readBuf); parseClientMsg(ClientsQueue[index].readBuf, &data); if(data.msg == 1){ ////printf("Read msg from client\n"); handleIncomingMsg(data, index); } else{ // client sent a move if(index != clientIndexTurn){ // it is not the client turn ////printf("Client played out of turn"); sendInvalidMoveToPlayer(index); return; } retVal = CheckAndMakeClientMove(data); clientIndexTurn = (clientIndexTurn+1) % (conPlayers); // keep the turn moving only between connected players if(retVal ==-1){ //printf("invalid client move\n"); sendInvalidMoveToPlayer(index); updateEveryoneOnMoveExceptIndex(index); notifyOnTurn(); } else{ //printf("valid client move\n"); updateEveryoneOnMove(index); if(retVal==0) { notifyOnTurn(); } } } // deleting read data from readBuf int i; for (i = 0; i < MSG_SIZE; ++i) { if (ClientsQueue[index].readBuf[i] == '}') { ClientsQueue[index].readBuf[i] = '\0'; if (ClientsQueue[index].readBuf[i+1] == '{') { //printf("in the if\n"); strcpy(ClientsQueue[index].readBuf, ClientsQueue[index].readBuf + i+1); break; } } ClientsQueue[index].readBuf[i] = '\0'; } //strcpy(ClientsQueue[index].readBuf, ClientsQueue[index].readBuf + CLIENT_MSG_SIZE); // const char *ptr = strchr(ClientsQueue[index].readBuf, ')'); // int ind = ptr - ClientsQueue[index].readBuf + 1; // strcpy(ClientsQueue[index].readBuf, ClientsQueue[index].readBuf + ind); }
/** fd - fd of client that was disconnected return value - 1 deleted client is a player, 0 for viewer, 2 for need to notify on new turn */ int delClientFromQueue(int fd){ int i,j; struct clientData delClient; //printf("in delClientFromQueue. clientIndexTurn=%d\n",clientIndexTurn); /* find and copy deleted client*/ for(i=0; i< conViewers+conPlayers; i++){ if(ClientsQueue[i].fd == fd){ delClient = ClientsQueue[i]; //printf("in for loop. found deleted index=%d\n",i); break; } } j=i; /* move clients after deleted client to the left*/ for(; j< conViewers+conPlayers - 1; j++){ ClientsQueue[j] = ClientsQueue[j+1]; //printf("copying to %d\n",j); } /* preserve global turn*/ if(i < clientIndexTurn){ clientIndexTurn--; //printf("decreasing clientIndexTurn\n"); } else if(i == clientIndexTurn && (ClientsQueue[i].isPlayer) ){ notifyOnTurn(); //printf("notifyOnTurn\n"); } /* update globals */ if(delClient.clientNum < minFreeClientNum){ minFreeClientNum = delClient.clientNum; } if(delClient.isPlayer){ conPlayers--; if(conViewers>0){ notifyOnTurningToPlayer(); conPlayers++; conViewers--; if(conPlayers-1==clientIndexTurn){ //printf("notifyOnTurn\n"); notifyOnTurn(); } } return 1; } else{ conViewers--; return 0; } }
void handleReadBuf(int index){ struct clientMsg data; int retVal; parseClientMsg(ClientsQueue[index].readBuf, &data); if (data.msg != 0) handleIncomingMsg(data, index); else{ // client sent a move if (index != clientIndexTurn){ // it is not the client turn, if didnt catch on the client side sendInvalidMoveToPlayer(index); return; } retVal = CheckAndMakeClientMove(data); clientIndexTurn = (clientIndexTurn + 1) % (conPlayers); // keep the turn moving only between connected players if (retVal == -1){ sendInvalidMoveToPlayer(index); LastTurnHeap = -1; //updateEveryoneOnMoveExceptIndex(index); notifyOnTurn(); } else if (retVal == 1) notifyOnDisconnectionToAll(index); else notifyOnTurn(); // if (retVal == 0) { // notifyOnTurn(); // } //} } // deleting read data from readBuf int i; for (i = 0; i < MSGTXT_SIZE; ++i) { if (ClientsQueue[index].readBuf[i] == '}') { ClientsQueue[index].readBuf[i] = '\0'; if (ClientsQueue[index].readBuf[i + 1] == '{') { //printf("in the if\n"); strcpy(ClientsQueue[index].readBuf, ClientsQueue[index].readBuf + i + 1); break; } } ClientsQueue[index].readBuf[i] = '\0'; } }