ResourceLayout::ResourceLayout(xml::ElementPtr _node, const std::string& _fileName) { // FIXME hardcoded version deserialization(_node, Version(1, 0, 0)); mResourceName = _fileName; }
void *master_connection_handler(void *socket_desc){ //Connection handler for TCP connections //Get the socket descriptor int client_id = clients-1; int sock = *(int*)socket_desc; int read_size; char client_message[BUFSIZE], *message; sleep(1); client_message[0] = (clients-1)+'0'; write(sock , client_message , strlen(client_message)); //Give client ID bzero(client_message,BUFSIZE); struct timeval tv; tv.tv_sec = 11; // 11 Secs Timeout tv.tv_usec = 0; setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO,(char *)&tv,sizeof(tv)); //Receive a message from client while( (read_size = recv(sock , client_message , BUFSIZE , 0)) > 0 ){ Message message_send,message_receive; message_receive = deserialization(client_message); switch(message_receive.type){ case BUTTON_CHECK: printf("Reciever Button floor & type: "); printf("%d ",message_receive.button.floor); printf("%d \n",message_receive.button.type); switch(message_receive.button.type){ case BUTTON_INSIDE: break; default: if(add_to_queue(message_receive.button.type, message_receive.button.floor)){ char server_message[BUFSIZE]; for(int i = 0;i<6;i++){ message_send.orders[i][0] = queue[i][0]; message_send.orders[i][1] = queue[i][1]; } message_send.ID = cost_function(message_receive.button.type, message_receive.button.floor); printf("Which client gets the order: %d",message_send.ID); message_send.elevator.new_floor_order=message_receive.button.floor; pthread_t order_counter_thread; char order_and_ID[2]; order_and_ID[1] = message_send.ID; if(message_receive.button.type==BUTTON_CALL_UP){ queue[message_receive.button.floor][1] = message_send.ID; queue[message_receive.button.floor][0] = 1; message_send.orders[message_receive.button.floor][1] = message_send.ID; order_and_ID[0] = message_receive.button.floor; pthread_create(&order_counter_thread, NULL, order_counter, (void*)order_and_ID); } else{ queue[message_receive.button.floor+2][1] = message_send.ID; queue[message_receive.button.floor+2][0] = 1; message_send.orders[message_receive.button.floor+2][1] = message_send.ID; order_and_ID[0] = message_receive.button.floor+2; pthread_create(&order_counter_thread, NULL, order_counter, (void*)order_and_ID); } serialization(ELEV_ORDER, message_send, server_message); for(int i = 0;i<clients;i++){ write(client_sockets[i], server_message, strlen(server_message)); } } } break; case ELEV_UPDATE: //Only updates elevator location printf("ELEV FLOOR UPDATE BY ELEVATOR #%d\n",client_id); elev_client[client_id].floor_current = message_receive.elevator.floor_current; elev_client[client_id].direction = message_receive.elevator.direction; for(int i = 0;i<clients;i++){ printf("Elevator #%d \t Floor current: %d \t Direction: %1d\n", i,elev_client[i].floor_current,(int)elev_client[i].direction); } break; case ORDER_UPDATE: //Clears orders that are done and sets lamps elev_client[client_id].floor_current = message_receive.elevator.floor_current; elev_client[client_id].direction = message_receive.elevator.direction; for(int i = 0;i<clients;i++){ printf("Elevator #%d \t Floor current: %d \t Direction: %1d\n", i,elev_client[i].floor_current,(int)elev_client[i].direction); } for(int i = 0;i<6;i++){ queue[i][0] &= message_receive.orders[i][0]; if(!(queue[i][0]&&message_receive.orders[i][0])) queue[i][1] = -1; } puts("\nNew queue"); for(int i = 0;i<6;i++){ printf("Order: %d \t ID: %d\n",queue[i][0],queue[i][1]); } message_send.ID = -1; for(int i = 0;i<6;i++){ message_send.orders[i][0] = queue[i][0]; message_send.orders[i][1] = queue[i][1]; } char server_message[BUFSIZE]; serialization(ELEV_ORDER, message_send, server_message); for(int i = 0;i<clients;i++){ write(client_sockets[i], server_message, strlen(server_message)); } break; case NETCHECK: client_checkin[client_id] = 1; break; case ID_UPDATE: client_id = message_receive.ID; break; } bzero(client_message,BUFSIZE); } if(read_size == 0){ puts("Client disconnected"); clients--; fflush(stdout); printf("#Clients: %d\n",clients); if(client_id == 0){ system("gnome-terminal -x ./elevator 0"); } else{ if((clients+1)==2 && client_id == 1){//Client 1 disconnected, client 2 will now be client 1 elev_client[1].floor_current = elev_client[2].floor_current; Message message_send; message_send.type = ID_UPDATE; message_send.ID = client_id; client_sockets[1] = client_sockets[2]; char server_message[BUFSIZE]; serialization(ID_UPDATE, message_send, server_message); write(client_sockets[1], server_message, strlen(server_message)); } reallocate_orders(clients); } } else if(read_size == -1){ clients--; perror("recv failed, handler"); printf("Client id: %d", client_id); printf("#Clients: %d\n",clients); if((clients+1)==2 && client_id == 1){//Client 1 disconnected, client 2 will now be client 1 elev_client[1].floor_current = elev_client[2].floor_current; Message message_send; message_send.type = ID_UPDATE; message_send.ID = client_id; client_sockets[1] = client_sockets[2]; char server_message[BUFSIZE]; serialization(ID_UPDATE, message_send, server_message); write(client_sockets[1], server_message, strlen(server_message)); } reallocate_orders(clients); } //Free the socket pointer free(socket_desc); return 0; }
void *master_connection_handler(void *socket_desc){ int client_id = clients-1; int sock = *(int*)socket_desc; int read_size; char client_message[BUFSIZE], *message; sleep(1); client_message[0] = (clients-1)+'0'; write(sock , client_message , strlen(client_message)); //Give client ID bzero(client_message,BUFSIZE); //Set up timed socket struct timeval tv; tv.tv_sec = 11; tv.tv_usec = 0; setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO,(char *)&tv,sizeof(tv)); while( (read_size = recv(sock , client_message , BUFSIZE , 0)) > 0 ){ Message message_send,message_receive; message_receive = deserialization(client_message); switch(message_receive.type){ case BUTTON_CHECK: if(add_to_queue(message_receive.button.type, message_receive.button.floor)){ char server_message[BUFSIZE]; for(int i = 0;i<6;i++){ message_send.orders[i][0] = queue[i][0]; message_send.orders[i][1] = queue[i][1]; } message_send.ID = cost_function(message_receive.button.type, message_receive.button.floor); message_send.elevator.new_floor_order=message_receive.button.floor; pthread_t order_counter_thread; char order_and_ID[2]; order_and_ID[1] = message_send.ID; //Starts counter on each order if(message_receive.button.type==BUTTON_CALL_UP){ queue[message_receive.button.floor][1] = message_send.ID; queue[message_receive.button.floor][0] = 1; message_send.orders[message_receive.button.floor][1] = message_send.ID; order_and_ID[0] = message_receive.button.floor; pthread_create(&order_counter_thread, NULL, order_counter, (void*)order_and_ID); } else{ queue[message_receive.button.floor+2][1] = message_send.ID; queue[message_receive.button.floor+2][0] = 1; message_send.orders[message_receive.button.floor+2][1] = message_send.ID; order_and_ID[0] = message_receive.button.floor+2; pthread_create(&order_counter_thread, NULL, order_counter, (void*)order_and_ID); } serialization(ELEV_ORDER, message_send, server_message); for(int i = 0;i<clients;i++){ write(client_sockets[i], server_message, strlen(server_message)); } } break; case ELEV_UPDATE: //Updates elevator location elev_client[client_id].floor_current = message_receive.elevator.floor_current; elev_client[client_id].direction = message_receive.elevator.direction; break; case ORDER_UPDATE: //Clears orders that are done and sets lamps elev_client[client_id].floor_current = message_receive.elevator.floor_current; elev_client[client_id].direction = message_receive.elevator.direction; for(int i = 0;i<6;i++){ queue[i][0] &= message_receive.orders[i][0]; if(!(queue[i][0]&&message_receive.orders[i][0])) queue[i][1] = -1; } puts("\nNew queue"); for(int i = 0;i<6;i++){ printf("Order: %d \t ID: %d\n",queue[i][0],queue[i][1]); } message_send.ID = -1; for(int i = 0;i<6;i++){ message_send.orders[i][0] = queue[i][0]; message_send.orders[i][1] = queue[i][1]; } char server_message[BUFSIZE]; serialization(ELEV_ORDER, message_send, server_message); for(int i = 0;i<clients;i++){ write(client_sockets[i], server_message, strlen(server_message)); } break; case NETCHECK: break; case ID_UPDATE: client_id = message_receive.ID; break; } bzero(client_message,BUFSIZE); } if(read_size == 0){ puts("Client disconnected, terminal exit"); clients--; fflush(stdout); printf("#Clients: %d\n",clients); if(client_id == 0){ system("gnome-terminal -x ./elevator 0"); } else{ if((clients+1)==2 && client_id == 1){//Client 1 disconnected, client 2 will now be client 1 elev_client[1].floor_current = elev_client[2].floor_current; Message message_send; message_send.type = ID_UPDATE; message_send.ID = client_id; client_sockets[1] = client_sockets[2]; char server_message[BUFSIZE]; serialization(ID_UPDATE, message_send, server_message); write(client_sockets[1], server_message, strlen(server_message)); } } sleep(1); reallocate_orders(clients); Message message_send; char server_message[BUFSIZE]; for(int i = 0;i<6;i++){ message_send.orders[i][0] = queue[i][0]; message_send.orders[i][1] = queue[i][1]; } serialization(ORDER_UPDATE, message_send, server_message); for(int i = 0;i<clients;i++){ write(client_sockets[i], server_message, strlen(server_message)); } } else if(read_size == -1){ clients--; perror("Network connection lost"); printf("Client id: %d", client_id); printf("#Clients: %d\n",clients); if((clients+1)==2 && client_id == 1){//Client 1 disconnected, client 2 will now be client 1 elev_client[1].floor_current = elev_client[2].floor_current; Message message_send; message_send.type = ID_UPDATE; message_send.ID = client_id; client_sockets[1] = client_sockets[2]; char server_message[BUFSIZE]; serialization(ID_UPDATE, message_send, server_message); write(client_sockets[1], server_message, strlen(server_message)); } sleep(1); reallocate_orders(clients); Message message_send; char server_message[BUFSIZE]; for(int i = 0;i<6;i++){ message_send.orders[i][0] = queue[i][0]; message_send.orders[i][1] = queue[i][1]; } serialization(ORDER_UPDATE, message_send, server_message); for(int i = 0;i<clients;i++){ write(client_sockets[i], server_message, strlen(server_message)); } } //Free the socket pointer free(socket_desc); return 0; }
int main() { Sleep(1000); char * filename = "saves.bin"; char check[50]; int memSize = 20; int numOfPl = 0; Planet * planets; planets = (Planet *)malloc(memSize*(sizeof(Planet))); memSize++; planets = realloc (planets, memSize*sizeof(Planet)); deserialization(planets, &numOfPl, filename); while(1) { printPlanets(planets, &numOfPl); putCursor(50, 1); puts("Enter your command"); putCursor(50, 2); printf(">>"); scanf("%s", check); if (!strcmp(check, "addPl")) addPlanet(planets, &numOfPl, &memSize); else if (!strcmp(check, "addSp")) addSputnik(planets, &numOfPl); else if (!strcmp(check, "removePl")) removePlanet(planets, &numOfPl); else if (!strcmp(check, "removeSp")) removeSputnik(planets, &numOfPl); else if (!strcmp(check, "changePl")) changePlanet(planets, &numOfPl); else if (!strcmp(check, "changeSp")) changeSputnik(planets, &numOfPl); else if (!strcmp(check, "help")) { putCursor(50, 3); puts("List of commands :"); putCursor(50, 4); puts("addPl - Adding a new planet"); putCursor(50, 5); puts("addPl - Adding a new sputnik"); putCursor(50, 6); puts("removePl - Removing some planet"); putCursor(50, 7); puts("removeSp - Removing some sputnik"); putCursor(50, 8); puts("changePl - Changing parameter of some planet"); putCursor(50, 9); puts("changeSp - Changing parameter of some sputnik"); putCursor(50, 10); puts("exit - Stop the program"); getch(); } else if (!strcmp(check, "exit")) { freeAll(planets, &numOfPl); exit(EXIT_SUCCESS); } else { putCursor(120, 3); puts("ERROR, enter correct command"); } save(planets, &numOfPl, filename); system("cls"); } freeAll(planets, &numOfPl); return 0; }
void* client_message_handler(void *msg_recv){ puts("Client message handler started"); pthread_mutex_init(&mutex,NULL); char receive[BUFSIZE]; bzero(receive,BUFSIZE); char *buf = (char*)msg_recv; for(int i = 0;i<BUFSIZE;i++){ receive[i] = buf[i]; } Message message_receive = deserialization(receive); switch(message_receive.type){ case ELEV_ORDER: puts("ELEV ORDER"); elev_set_button_lamp(BUTTON_CALL_UP, 0, message_receive.orders[0][0]); elev_set_button_lamp(BUTTON_CALL_UP, 1, message_receive.orders[1][0]); elev_set_button_lamp(BUTTON_CALL_UP, 2, message_receive.orders[2][0]); elev_set_button_lamp(BUTTON_CALL_DOWN, 1, message_receive.orders[3][0]); elev_set_button_lamp(BUTTON_CALL_DOWN, 2, message_receive.orders[4][0]); elev_set_button_lamp(BUTTON_CALL_DOWN, 3, message_receive.orders[5][0]); for(int i=0;i<6;i++){ //Global queue elev_orders[i][0] = message_receive.orders[i][0]; elev_orders[i][1] = message_receive.orders[i][1]; queue[i][0] = message_receive.orders[i][0]; queue[i][1] = message_receive.orders[i][1]; } puts("\nNew queue"); for(int i = 0;i<6;i++){ printf("Order: %d \t ID: %d\n",queue[i][0],queue[i][1]); } printf("Message_recieve.ID: %d\n", message_receive.ID); printf("My ID: %d\n", my_ID); if(message_receive.ID==my_ID){ //Sets local queue based on ID puts("Order recieved"); pthread_mutex_lock(&mutex); if(elevator.queue[elevator.floor_current]==0){ elevator.queue[message_receive.elevator.new_floor_order]=2; } pthread_mutex_unlock(&mutex); //elevator.new_floor_order=1; } break; case ORDER_UPDATE: puts("ORDER UPDATE"); for(int i=0;i<6;i++){ //Global queue elev_orders[i][0] = message_receive.orders[i][0]; elev_orders[i][1] = message_receive.orders[i][1]; if(my_ID == message_receive.orders[i][1]){ if(i == 0){ if(elevator.queue[0]==0){ elevator.queue[0] = 1; } } else if(i == 1 || i == 3){ if(elevator.queue[1]==0){ elevator.queue[1] = 1; } } else if(i == 2 || i == 4){ if(elevator.queue[2]==0){ elevator.queue[2] = 1; } } else if(i == 5) if(elevator.queue[3]==0){ elevator.queue[3] = 1; } } } printf("Elev queue: "); for(int i = 0;i<N_FLOORS;i++){ printf("%d ",elevator.queue[i]); } printf("\n"); break; case BUTTON_LAMP: puts("BUTTON LAMP"); elev_set_button_lamp(BUTTON_CALL_UP, 0, message_receive.orders[0][0]); elev_set_button_lamp(BUTTON_CALL_UP, 1, message_receive.orders[1][0]); elev_set_button_lamp(BUTTON_CALL_UP, 2, message_receive.orders[2][0]); elev_set_button_lamp(BUTTON_CALL_DOWN, 1, message_receive.orders[3][0]); elev_set_button_lamp(BUTTON_CALL_DOWN, 2, message_receive.orders[4][0]); elev_set_button_lamp(BUTTON_CALL_DOWN, 3, message_receive.orders[5][0]); break; case ID_UPDATE: puts("ID UPDATE"); my_ID = message_receive.ID; char id_upd[BUFSIZE]; Message message_send_ID; message_send_ID.ID = my_ID; serialization(ID_UPDATE, message_send_ID, id_upd); pthread_t message_send_thread_ID; pthread_create(&message_send_thread_ID, NULL , tcp_send, (void*)id_upd); break; case NETCHECK: puts("NETCHECK"); master_checkin = 1; char net_check[BUFSIZE]; Message message_send; serialization(NETCHECK, message_send, net_check); pthread_t message_send_thread; pthread_create(&message_send_thread, NULL , tcp_send, (void*)net_check); sleep(6); master_checkin = 0; sleep(5); if(master_checkin == 0){ puts("Master disconnected\n"); connection = 0; } break; } }