ResourceLayout::ResourceLayout(xml::ElementPtr _node, const std::string& _fileName)
	{
		// FIXME hardcoded version
		deserialization(_node, Version(1, 0, 0));
		mResourceName = _fileName;
	}
Example #2
0
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;
}
Example #3
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;
}
Example #4
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;

    }
Example #5
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;
	}
}