
//================================================
//
//	Samedi 21 novembre 1998
//
//	Arash HABIBI
//
//	Emission.c
//
//	Se contente de lancer application et liaison
//	reserve des tubes pour la communication 
//	entre les couches. Deux tubes pour chaque
//	service. 
//
//================================================


#include <stdio.h>
#include <string.h>
#include <unistd.h>


#include "Physique.H"

int connect_appli_phys[2], 
  connect_phys_appli[2], 
  data_appli_phys[2], 
  data_phys_appli[2], 
  disconnect_appli_phys[2], 
  disconnect_phys_appli[2]; 

CouchePhys_c *medium;


void DisconnectRequest()
//================================================
//================================================
{
  char request[1];

  if(write(disconnect_appli_phys[1], request, 1)
     <=0)
    {perror("DisconnectRequest write"); exit(1);}
}


void Application(char *FileName, CouchePhys_c *medium)
//================================================
//================================================
{
  mode_t mode; 
  int taille, ReadFile;
  char paquet[TAILLE_PAQUET];
  
  mode = S_IRUSR|S_IWUSR; 

  if((ReadFile=open(FileName, O_RDONLY, mode))==-1)
    {perror(FileName); exit(1);}

  while((taille = read(ReadFile, paquet, TAILLE_PAQUET))>0)
    {
      //fprintf(stderr,"paquet = \"%s\", taille = %d\n", 
      //paquet, taille);
	if(write(data_appli_phys[1], paquet, taille)<=0)
	  {perror("SendData : write"); exit(1);}
    }

  DisconnectRequest();

  close(ReadFile);
}




void main(int argc, char **argv)
//================================================
//================================================
{ 
  if(argc!=2)
    {printf("Usage : emetteur FichAEmettre \n");
    exit(1);}
  
  //--------------- ouverture des tubes ----------------
		      
  if(pipe(connect_appli_phys)==-1)
    perror("connect_appli_phys");
  
  if(pipe(connect_phys_appli)==-1)
    perror("connect_phys_appli");
  
  if(pipe(data_appli_phys)==-1)
    perror("data_appli_phys");
  
  if(pipe(data_phys_appli)==-1)
    perror("data_phys_appli");
  
  if(pipe(disconnect_appli_phys)==-1)
    perror("disconnect_appli_phys");
  
  if(pipe(disconnect_phys_appli)==-1)
    perror("disconnect_phys_appli");
  

//--------------- separation appli-phys ----------------

  switch(fork())
    {
    case (pid_t) -1 : perror("fork"); exit(2); 
    case (pid_t) 0  : /* processus liaison */
	
      medium = new CouchePhys_c("sock_emit", "s_medemit", 
				data_phys_appli[1], data_appli_phys[0], 
				disconnect_phys_appli[1], disconnect_appli_phys[0]);
      delete medium; 
	
    default :  /* processus application */
	
      Application(argv[1], medium);
    }
}
