Pre big refactor.
This commit is contained in:
		| @@ -38,20 +38,23 @@ void cmdLeave(const consolecmdexec_t *exec) { | ||||
|  | ||||
| void clientInit() { | ||||
|   memoryZero(&CLIENT, sizeof(client_t)); | ||||
|  | ||||
|   consoleRegCmd("join", cmdJoin); | ||||
|   consoleRegCmd("leave", cmdLeave); | ||||
| } | ||||
|  | ||||
| errorret_t clientConnect(const clientconnect_t connect) { | ||||
|   errorret_t ret; | ||||
|  | ||||
|   // Don't connect if already connected. | ||||
|   if(CLIENT.state != CLIENT_STATE_DISCONNECTED) { | ||||
|     return error("Client is already connected"); | ||||
|   } | ||||
|  | ||||
|   // Init the client. | ||||
|   CLIENT.type = connect.type; | ||||
|   packetQueueInit(&CLIENT.packetQueue); | ||||
|  | ||||
|   // Change how we connect based on the type. | ||||
|   switch(connect.type) { | ||||
|     case CLIENT_TYPE_NETWORKED: | ||||
|       ret = networkedClientConnect(&CLIENT, connect.networked); | ||||
| @@ -61,6 +64,7 @@ errorret_t clientConnect(const clientconnect_t connect) { | ||||
|       assertUnreachable("Invalid client type"); | ||||
|   } | ||||
|  | ||||
|   // Should be connected now. | ||||
|   if(ret != ERROR_OK) CLIENT.state = CLIENT_STATE_DISCONNECTED; | ||||
|   return ret; | ||||
| } | ||||
| @@ -70,24 +74,28 @@ void clientUpdate() { | ||||
|   int32_t ret; | ||||
|   errorret_t err; | ||||
|  | ||||
|   // Don't do anything if not connected | ||||
|   if(CLIENT.state == CLIENT_STATE_DISCONNECTED) return; | ||||
|    | ||||
|  | ||||
|   do { | ||||
|     // Pop the packet off the queue. | ||||
|     ret = packetQueuePopIn( | ||||
|       &CLIENT.packetQueue, | ||||
|       &packet | ||||
|     ); | ||||
|  | ||||
|     // No more packets to process, just break out. | ||||
|     if(ret == 0) break; | ||||
|  | ||||
|     // An error occured? | ||||
|     if(ret < 0) { | ||||
|       clientDisconnect(); | ||||
|       consolePrint("Failed to pop packet"); | ||||
|       return; | ||||
|     } | ||||
|  | ||||
|     // Process the packet | ||||
|     err = packetClientProcess(&packet, &CLIENT); | ||||
|      | ||||
|     if(err != ERROR_OK) { | ||||
|       clientDisconnect(); | ||||
|       consolePrint("Failed to process packet %s", errorString()); | ||||
| @@ -98,8 +106,10 @@ void clientUpdate() { | ||||
| } | ||||
|  | ||||
| void clientDisconnect() { | ||||
|   // Don't disconnect if already disconnected. | ||||
|   if(CLIENT.state == CLIENT_STATE_DISCONNECTED) return; | ||||
|  | ||||
|   // Disconnect the client. | ||||
|   switch(CLIENT.type) { | ||||
|     case CLIENT_TYPE_NETWORKED: | ||||
|       networkedClientDisconnect(&CLIENT); | ||||
| @@ -112,10 +122,6 @@ void clientDisconnect() { | ||||
|   consolePrint("Client disconnected"); | ||||
| } | ||||
|  | ||||
| void clientProcess() { | ||||
|   if(CLIENT.state == CLIENT_STATE_DISCONNECTED) return; | ||||
| } | ||||
|  | ||||
| void clientDispose() { | ||||
|   clientDisconnect(); | ||||
| } | ||||
| @@ -15,7 +15,7 @@ typedef enum { | ||||
| } clienttype_t; | ||||
|  | ||||
| typedef enum { | ||||
|   CLIENT_STATE_DISCONNECTED, | ||||
|   CLIENT_STATE_DISCONNECTED = 0, | ||||
|   CLIENT_STATE_CONNECTING, | ||||
|   CLIENT_STATE_CONNECTED, | ||||
|   CLIENT_STATE_DISCONNECTING, | ||||
| @@ -32,7 +32,6 @@ typedef struct client_s { | ||||
|   clientstate_t state; | ||||
|   clienttype_t type; | ||||
|   packetqueue_t packetQueue; | ||||
|  | ||||
|   union { | ||||
|     networkedclient_t networked; | ||||
|   }; | ||||
|   | ||||
| @@ -18,10 +18,12 @@ errorret_t networkedClientConnect( | ||||
|   errorret_t err; | ||||
|   char_t *ip = "127.0.0.1"; | ||||
|  | ||||
|   // Validate the params | ||||
|   assertNotNull(client, "Client is NULL"); | ||||
|   assertTrue(client->type == CLIENT_TYPE_NETWORKED, "Client is not networked"); | ||||
|   assertIsMainThread("Client connect must be on main thread"); | ||||
|  | ||||
|   // Set the state to connecting. | ||||
|   client->state = CLIENT_STATE_CONNECTING; | ||||
|   consolePrint("Connecting to server %s:%d", ip, connInfo.port); | ||||
|  | ||||
| @@ -38,7 +40,6 @@ errorret_t networkedClientConnect( | ||||
|   client->networked.address.sin_family = AF_INET; | ||||
|   client->networked.address.sin_port = htons(connInfo.port); | ||||
|   client->networked.address.sin_addr.s_addr = inet_addr(ip); | ||||
|  | ||||
|   ret = inet_pton(AF_INET, ip, &client->networked.address.sin_addr); | ||||
|   if(ret <= 0) { | ||||
|     close(client->networked.socket); | ||||
| @@ -69,11 +70,9 @@ errorret_t networkedClientConnect( | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   // Initialize mutex and condition variable | ||||
|   // Initialize mutexes and locks and condition variable | ||||
|   pthread_mutex_init(&client->networked.lock, NULL); | ||||
|   pthread_cond_init(&client->networked.cond, NULL); | ||||
|  | ||||
|   // Initialize read and write locks | ||||
|   pthread_mutex_init(&client->networked.readLock, NULL); | ||||
|   pthread_mutex_init(&client->networked.writeLock, NULL); | ||||
|  | ||||
| @@ -88,20 +87,20 @@ errorret_t networkedClientConnect( | ||||
|     ); | ||||
|   } | ||||
|  | ||||
|   // We should now receive a welcome packet | ||||
|   // We should now receive a welcome packet or a disconnect packet. | ||||
|   err = networkedClientReadPacket(client, &packet); | ||||
|   if(err) return err; | ||||
|   switch(packet.type) { | ||||
|     case PACKET_TYPE_WELCOME: | ||||
|       err = packetWelcomeClientProcess(&packet, client); | ||||
|       if(err) return err; | ||||
|       break; | ||||
|  | ||||
|     case PACKET_TYPE_DISCONNECT: | ||||
|       err = packetDisconnectClientProcess(&packet, client); | ||||
|       if(err) return err; | ||||
|       return error("Server disconnected"); | ||||
|      | ||||
|     case PACKET_TYPE_WELCOME: | ||||
|       err = packetWelcomeClient(&packet); | ||||
|       if(err) return err; | ||||
|       break; | ||||
|      | ||||
|     default: | ||||
|       return error("Server did not send welcome message."); | ||||
|   } | ||||
| @@ -113,7 +112,6 @@ errorret_t networkedClientConnect( | ||||
|     networkedClientReadThread, | ||||
|     client | ||||
|   ); | ||||
|  | ||||
|   if(ret != 0) { | ||||
|     close(client->networked.socket); | ||||
|     pthread_mutex_destroy(&client->networked.readLock); | ||||
| @@ -138,7 +136,6 @@ errorret_t networkedClientConnect( | ||||
|     networkedClientWriteThread, // Renamed from networkedClientRightThread | ||||
|     client | ||||
|   ); | ||||
|  | ||||
|   if(ret != 0) { | ||||
|     close(client->networked.socket); | ||||
|     pthread_mutex_destroy(&client->networked.readLock); | ||||
|   | ||||
| @@ -13,7 +13,7 @@ | ||||
|  | ||||
| packethandler_t PACKET_HANDLERS[] = { | ||||
|   { NULL, NULL }, | ||||
|   { NULL, NULL }, | ||||
|   { packetWelcomeClientProcess, NULL }, | ||||
|   { packetDisconnectClientProcess, NULL }, | ||||
|   { packetPingClientProcess, packetPingServerProcess }, | ||||
| }; | ||||
|   | ||||
| @@ -31,21 +31,22 @@ errorret_t packetDisconnectClientProcess( | ||||
|     return error("Disconnect packet length is not correct"); | ||||
|   } | ||||
|  | ||||
|   // TODO: Handle disconnect reasons better. | ||||
|   packetdisconnect_t *data = (packetdisconnect_t *)&packet->data; | ||||
|   switch(data->reason) { | ||||
|     case PACKET_DISCONNECT_REASON_UNKNOWN: | ||||
|       return error("Server disconnected: Unknown reason"); | ||||
|     case PACKET_DISCONNECT_REASON_INVALID_VERSION: | ||||
|       return error("Server disconnected: Invalid version"); | ||||
|     case PACKET_DISCONNECT_REASON_MALFORMED_PACKET: | ||||
|       return error("Server disconnected: Malformed packet"); | ||||
|     case PACKET_DISCONNECT_REASON_SERVER_FULL: | ||||
|       return error("Server disconnected: Server full"); | ||||
|     case PACKET_DISCONNECT_REASON_SERVER_SHUTDOWN: | ||||
|       return error("Server disconnected: Server shutdown"); | ||||
|     default: | ||||
|       return error("Server disconnected: Unknown reason"); | ||||
|   } | ||||
|   // switch(data->reason) { | ||||
|     // case PACKET_DISCONNECT_REASON_UNKNOWN: | ||||
|     //   return error("Server disconnected: Unknown reason"); | ||||
|     // case PACKET_DISCONNECT_REASON_INVALID_VERSION: | ||||
|     //   return error("Server disconnected: Invalid version"); | ||||
|     // case PACKET_DISCONNECT_REASON_MALFORMED_PACKET: | ||||
|     //   return error("Server disconnected: Malformed packet"); | ||||
|     // case PACKET_DISCONNECT_REASON_SERVER_FULL: | ||||
|     //   return error("Server disconnected: Server full"); | ||||
|     // case PACKET_DISCONNECT_REASON_SERVER_SHUTDOWN: | ||||
|     //   return error("Server disconnected: Server shutdown"); | ||||
|     // default: | ||||
|     //   return error("Server disconnected: Unknown reason"); | ||||
|   // } | ||||
|  | ||||
|   return ERROR_OK; | ||||
| } | ||||
| @@ -26,6 +26,10 @@ void packetWelcomeCreate(packet_t *packet); | ||||
|  * Handles a welcome packet received FROM a server INTO a client. | ||||
|  *  | ||||
|  * @param packet Pointer to the packet structure to handle. | ||||
|  * @param client Pointer to the client structure. | ||||
|  * @return ERROR_OK on success, or an error code on failure. | ||||
|  */ | ||||
| errorret_t packetWelcomeClient(packet_t *packet); | ||||
| errorret_t packetWelcomeClientProcess( | ||||
|   const packet_t *packet,  | ||||
|   client_t *client | ||||
| ); | ||||
		Reference in New Issue
	
	Block a user