Exemple #1
0
/***
	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);
}
Exemple #2
0
/** 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;
	}
}
Exemple #3
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';
	}
}