Advertisement
adibdoub

boum

Oct 12th, 2015
97
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 8.76 KB | None | 0 0
  1. void* fctThread (void *param)
  2. {
  3.     string containers[10];
  4.     struct inputTruckRequestParameters inputTruckStruct;
  5.     struct inputDoneRequestParameters inputDoneStruct;
  6.     struct outputReadyRequestParameters outputReadyStruct;
  7.     struct outputOneRequestParameters outputOneStruct;
  8.     ostringstream oss;
  9.     int socketSlot;
  10.     int receivedRequest, i, numberOfContainers;
  11.     bool quit = false;
  12.     Socket *serviceSocketToManage;
  13.     CMMPServer *cmmpServer;
  14.    
  15.     while (true) {
  16.         LOCK(&mutexThread);
  17.         while(actualClient == -1)
  18.             COND_WAIT(&clientCond, &mutexThread);
  19.        
  20.         //The thread is now supposed to manage a client (listen to CMMP requests)
  21.         serviceSocketToManage = clientSockets[actualClient];
  22.         socketSlot = actualClient; //We keep the socketSlot index to release it later
  23.         actualClient = -1;
  24.         UNLOCK(&mutexThread);
  25.        
  26.         //Now listen to CMMP requests
  27.         cmmpServer= new CMMPServer(serviceSocketToManage);
  28.        
  29.         while (!quit)
  30.         {
  31.             try {
  32.                 cmmpServer->listenRequest();
  33.                 receivedRequest = cmmpServer->getReceivedRequest();
  34.                
  35.                 if (receivedRequest == LOGIN && !cmmpServer->isClientLogged())
  36.                 {
  37.                     //replace that by a check in a CSV file
  38.                     if (strcmp(cmmpServer->getLoginStruct().login, "quentin") == 0 && strcmp(cmmpServer->getLoginStruct().password, "wiipower") == 0){
  39.                         cmmpServer->acceptRequest();
  40.                         cmmpServer->setClientLogged(true);
  41.                     }
  42.                     else
  43.                     {
  44.                         cmmpServer->denyRequest("Bad credentials");
  45.                         cmmpServer->setClientLogged(false);
  46.                     }
  47.                 }
  48.                 else if(cmmpServer->isClientLogged())
  49.                 {
  50.                     switch (receivedRequest)
  51.                     {
  52.                         case INPUTTRUCK :
  53.                             inputTruckStruct = cmmpServer->getInputTruckStruct();
  54.                             //Decide if respond to inputTruck or no (will be replaced with an exchange with SERveur traffic)
  55.                             if (cmmpServer->freePlace(inputTruckStruct.numberOfContainers, inputTruckStruct.containerID, fileName))
  56.                             {
  57.                                 //We need to send all containers and positions to the client
  58.                                 struct inputTruckContainer *containers = NULL;
  59.                                 struct positionStruct position;
  60.                                 containers = (struct inputTruckContainer*)malloc(inputTruckStruct.numberOfContainers * sizeof(struct inputTruckContainer));
  61.                                 if (containers == NULL) {
  62.                                     //Error during malloc
  63.                                     //Will close the client
  64.                                     quit = true;
  65.                                     break;
  66.                                 }
  67.                                
  68.                                 //GetPosition of container also modify the record (put on DESTINATED if necessary)
  69.                                 for (i=0; i<inputTruckStruct.numberOfContainers; i++) {
  70.                                     position = cmmpServer->getPostionOfContainer(inputTruckStruct.containerID[i], fileName);
  71.                                     containers[i].x = position.x;
  72.                                     containers[i].y = position.y;
  73.                                     strcpy(containers[i].containerID, inputTruckStruct.containerID[i]);
  74.                                 }
  75.                                 cmmpServer->replyToInputTruck(inputTruckStruct.numberOfContainers, containers);
  76.                                 cout<<"FICH-PARC after input truck request : "<<endl;
  77.                                 displayFICHPARC(fileName);
  78.            
  79.                                 cmmpServer->listenRequest(); //Supposed to be INPUT-DONE...
  80.                                 inputDoneStruct = cmmpServer->getInputDoneStruct();
  81.                                 if (inputDoneStruct.answer == OK) {
  82.                                    
  83.                                     //If the weight is not too big, we can write "BUSY" flag into FICH-PARC
  84.                                     if (inputDoneStruct.weight <= 100000) { //?? I don't know about that
  85.                                         //Request accepted
  86.                                         for (i=0; i<inputTruckStruct.numberOfContainers; i++) {
  87.                                             cmmpServer->writeBusyFlag(containers[i].containerID, fileName);
  88.                                         }
  89.                                         cmmpServer->acceptRequest();
  90.                                        
  91.                                         cout<<"FICH-PARC after INPUT-DONE request : "<<endl;
  92.                                         displayFICHPARC(fileName);
  93.                                     }
  94.                                     else
  95.                                     {
  96.                                         cmmpServer->denyRequest("Too heavy");
  97.                                     }
  98.                                 }
  99.                                 else
  100.                                 {
  101.                                     //The client sent KO in INPUT-DONE request
  102.                                     free(containers);
  103.                                     containers = NULL;
  104.                                     cmmpServer->acceptRequest();
  105.                                     quit = true;
  106.                                 }
  107.                             }
  108.                             else
  109.                             {
  110.                                 cmmpServer->denyRequest("Not enough place for all those containers");
  111.                             }
  112.                             break;
  113.                            
  114.                            
  115.                         case OUTPUTREADY:
  116.                             outputReadyStruct = cmmpServer->getOutputReadyStruct();
  117.                             numberOfContainers = cmmpServer->getContainersForDestination(containers, outputReadyStruct.destination, outputReadyStruct.capacity, fileName);
  118.          
  119.                             //Send back containers list
  120.                             if (numberOfContainers == 0) {
  121.                                 cmmpServer->denyRequest("There's no container awaiting for that destination");
  122.                             }
  123.                             else
  124.                             {
  125.                                 cmmpServer->replyToOutputReady(numberOfContainers, containers);
  126.                                 for (i=0; i<numberOfContainers; i++) {
  127.                                     cout<<"Waiting for outputone : "<<i<<endl;
  128.                                     cmmpServer->listenRequest(); //Listen to outputones
  129.                                     cout<<"outputone received"<<endl;
  130.                                     //Update fichParc
  131.                                     outputOneStruct = cmmpServer->getOutputOneStruct();
  132.                                     setFreeFlag(outputOneStruct.containerID, fileName);
  133.                                 }
  134.                                 cout<<"Waiting for output-done request"<<endl;
  135.                                 cmmpServer->listenRequest();
  136.                                 if (cmmpServer->getReceivedRequest() == INPUTDONE) {
  137.                                     cmmpServer->acceptRequest();
  138.                                 }
  139.                                 cout<<"FICH-PARC after output-done : "<<endl;
  140.                                 displayFICHPARC(fileName);
  141.                             }
  142.                            
  143.                             break;
  144.                            
  145.                         case LOGOUT:
  146.                             quit = true;
  147.                             break;
  148.                         default:
  149.                             break;
  150.                     }
  151.                 }
  152.             }
  153.             catch (SocketException exp)
  154.             {
  155.                 //Client failed, we should close the socket. And rollback operations ?
  156.                 std::cout<<exp.getExplanation()<<exp.getCode()<<std::endl;
  157.                
  158.                 //Freeing socketSlot
  159.                 LOCK(&mutexThread);
  160.                 clientSockets[socketSlot] = NULL;
  161.                 UNLOCK(&mutexThread);
  162.                
  163.                 delete cmmpServer;
  164.                 delete serviceSocketToManage;
  165.                 return NULL;
  166.                
  167.             }
  168.         }
  169.        
  170.         //Freeing socketSlot
  171.         LOCK(&mutexThread);
  172.         clientSockets[socketSlot] = NULL;
  173.         UNLOCK(&mutexThread);
  174.        
  175.         delete cmmpServer;
  176.         delete serviceSocketToManage;
  177.     }
  178.    
  179.     return NULL;
  180. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement