~ubuntu-branches/ubuntu/hoary/scilab/hoary

« back to all changes in this revision

Viewing changes to geci/scr_messages.c

  • Committer: Bazaar Package Importer
  • Author(s): Torsten Werner
  • Date: 2005-01-09 22:58:21 UTC
  • mfrom: (1.1.1 upstream)
  • Revision ID: james.westby@ubuntu.com-20050109225821-473xr8vhgugxxx5j
Tags: 3.0-12
changed configure.in to build scilab's own malloc.o, closes: #255869

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
/********************************************************/
2
 
/* Module de gestion de messages pour le scruteur. v1.0 */
3
 
/********************************************************/
4
 
 
5
 
#include <varargs.h>
6
 
#include <stdio.h>
7
 
 
8
 
#if defined(SYSV) || defined(WIN32)
9
 
#include <string.h>
10
 
#else
11
 
#include <strings.h>
12
 
#endif
13
 
 
14
 
#ifdef __STDC__
15
 
#include <stdlib.h>
16
 
#include <unistd.h>
17
 
#endif 
18
 
 
19
 
#include "libCom.h"
20
 
#include "formatage_messages.h"
21
 
#include "gestion_memoire.h"
22
 
 
23
 
#include "scr_liaisons.h"
24
 
#include "scr_applications.h"
25
 
#include "scr_messages.h"
26
 
 
27
 
#define LONG 11
28
 
 
29
 
typedef struct Actions_messages{
30
 
  char *source;
31
 
  char *type_message;
32
 
  int nb_parametres;
33
 
  void (*action)();
34
 
} actions_messages;
35
 
 
36
 
char *Identificateur_application=ID_SCRUTEUR;
37
 
 
38
 
static int lire_buffer_sur_pipe();
39
 
 
40
 
/* Table des messages reconnus par le scruteur */
41
 
 
42
 
actions_messages tb_messages[]={
43
 
  {NULL, MSG_LANCER_APPLI, NBP_LANCER_APPLI, lancer_appli_actmsg},
44
 
  {NULL, MSG_LANCER_APPLI_SANS_COM, NBP_LANCER_APPLI_SANS_COM, lancer_appli_sans_comm_actmsg},
45
 
  {ID_XGeCI, MSG_FIN_XGeCI, NBP_FIN_XGeCI, fin_xgeci_actmsg},
46
 
  {NULL, MSG_FIN_APPLI, NBP_FIN_APPLI, fin_appli_actmsg},
47
 
  {NULL, MSG_QUITTER_APPLI, NBP_QUITTER_APPLI, quitter_appli_actmsg},
48
 
  {ID_GeCI_local, MSG_DESTRUCTION, NBP_DESTRUCTION, auto_destruction},
49
 
  {NULL, MSG_CREER_LIAISON, NBP_CREER_LIAISON, creer_liaison_actmsg},
50
 
  {NULL, MSG_DETRUIRE_LIAISON, NBP_DETRUIRE_LIAISON, detruire_liaison_actmsg},
51
 
  {NULL, MSG_POSTER_LISTE_ELMNT, NBP_POSTER_LISTE_ELMNT, poster_liste_elemnt_actmsg},
52
 
  {NULL, MSG_CHANGER_CHEMIN, NBP_CHANGER_CHEMIN, changer_repertoire_actmsg},
53
 
  {NULL, NULL, 0, erreur_message_actmsg}};
54
 
 
55
 
/* Cette procedure effectue une recherche dans la table des */
56
 
/* messages tb_messages. Si le message est trouve, la       */
57
 
/* fonction action correspondante est appelee.              */
58
 
 
59
 
void interpreter_message(message)
60
 
     Message message;
61
 
{
62
 
  int i;
63
 
  
64
 
  i=0;
65
 
  while(tb_messages[i].nb_parametres != 0) {
66
 
    
67
 
    if (message.taille >= 3)
68
 
      
69
 
      if (tb_messages[i].source == NULL || 
70
 
          !strcmp(tb_messages[i].source,message.tableau[0]))
71
 
        
72
 
        if (tb_messages[i].type_message == NULL || 
73
 
            !strcmp(tb_messages[i].type_message,message.tableau[2])) {
74
 
          
75
 
          if (!strcmp(message.tableau[1],Identificateur_application)) {
76
 
            
77
 
            if (tb_messages[i].nb_parametres >= 0) {
78
 
              
79
 
              if (message.taille == tb_messages[i].nb_parametres)
80
 
                
81
 
                break;
82
 
            }
83
 
            else {
84
 
              if (message.taille >= -tb_messages[i].nb_parametres)
85
 
                break;
86
 
            }
87
 
          }
88
 
        }
89
 
    i++;
90
 
  }
91
 
  
92
 
  (*tb_messages[i].action)(message);
93
 
}
94
 
 
95
 
void envoyer_message_var(va_alist)
96
 
     va_dcl
97
 
{
98
 
  Message message;
99
 
  va_list parametres;
100
 
  
101
 
  va_start(parametres);
102
 
  
103
 
  message=convertir_nombre_arbitraire_de_chaines_en_tableau(&parametres);
104
 
  
105
 
  va_end(parametres);
106
 
  envoyer_message(message);
107
 
  liberer_message(message);
108
 
}
109
 
 
110
 
void envoyer_message(message)
111
 
     Message message;
112
 
{
113
 
  Message nouveau_message;
114
 
  int compteur;
115
 
    
116
 
  nouveau_message.tableau=allouer_type(char *,message.taille+1);
117
 
    
118
 
  nouveau_message.tableau[0]=dupliquer_chaine(Identificateur_application);
119
 
    
120
 
  for(compteur=0;compteur<message.taille;compteur++)
121
 
    nouveau_message.tableau[compteur+1]=message.tableau[compteur];
122
 
  nouveau_message.taille=message.taille+1;
123
 
 
124
 
  envoyer_message_brut(nouveau_message);
125
 
    
126
 
  liberer(nouveau_message.tableau[0]);
127
 
  liberer(nouveau_message.tableau);
128
 
  /*    liberer_message(nouveau_message);*/
129
 
}
130
 
 
131
 
void envoyer_message_brut(message)
132
 
     Message message;
133
 
{
134
 
  long longueur_trame;
135
 
  char *trame,*noyau_trame;
136
 
  application *recherche_appli_destination;
137
 
  char chaine_num[LONG];
138
 
  
139
 
  noyau_trame=coller_chaines(message);
140
 
    
141
 
  trame=concatenation_plusieurs_chaines(DEBUT_DE_TRAME," ",noyau_trame," ",FIN_DE_TRAME,NULL);
142
 
   
143
 
  liberer(noyau_trame);
144
 
    
145
 
  recherche_appli_destination = ldc_rechercher_objet(liste_applications,message.tableau[1]);
146
 
    
147
 
  if (recherche_appli_destination == NULL)
148
 
    Erreur_scruteur(concatener_deux_chaines("<rechercher_application>: bad parameters: ",message.tableau[1]));
149
 
    
150
 
  longueur_trame=strlen(trame)+1;
151
 
  sprintf(chaine_num,"%010d",(int) longueur_trame);
152
 
  chaine_num[LONG]='\0';
153
 
  write(recherche_appli_destination->pipe_vers_appli,chaine_num,LONG);
154
 
  write(recherche_appli_destination->pipe_vers_appli,trame,longueur_trame);
155
 
    
156
 
  liberer(trame);
157
 
}
158
 
 
159
 
void envoyer_message_brut_directement(message,destinataire)
160
 
     Message message;
161
 
     int destinataire;
162
 
{
163
 
  long longueur_trame;
164
 
  char *trame,*noyau_trame;
165
 
  char chaine_num[LONG];
166
 
 
167
 
  noyau_trame=coller_chaines(message);
168
 
 
169
 
  trame=concatenation_plusieurs_chaines(DEBUT_DE_TRAME," ",noyau_trame," ",FIN_DE_TRAME,NULL);
170
 
    
171
 
  liberer(noyau_trame);
172
 
    
173
 
  longueur_trame=strlen(trame)+1;
174
 
 
175
 
  sprintf(chaine_num,"%d",(int)longueur_trame);
176
 
  chaine_num[LONG]='\0';
177
 
  write(destinataire,chaine_num,LONG);   
178
 
 
179
 
  write(destinataire,trame,longueur_trame);
180
 
   
181
 
  liberer(trame);
182
 
}
183
 
 
184
 
int recevoir_message(descripteur,message)
185
 
     int descripteur;
186
 
     Message *message;
187
 
{
188
 
  char *trame;
189
 
  long longueur;
190
 
  char chaine_num[LONG];
191
 
        
192
 
  if (lire_buffer_sur_pipe(descripteur,chaine_num,LONG) == 0) return 0;
193
 
 
194
 
  longueur=atol(chaine_num);
195
 
  trame=allouer_type(char,longueur+1);
196
 
 
197
 
  if (lire_buffer_sur_pipe(descripteur,trame,longueur) == 0) return 0;
198
 
  trame[longueur]='\0';
199
 
  *message=decouper_trame(trame);
200
 
  liberer(trame);
201
 
  return 1;
202
 
}
203
 
 
204
 
static int lire_buffer_sur_pipe(descripteur,buffer,taille)
205
 
     int descripteur;
206
 
     void *buffer;
207
 
     long taille;
208
 
{
209
 
 
210
 
  long caracteres_lus = 0;
211
 
  long caracteres_a_lire;
212
 
  long longueur_paquet;
213
 
  
214
 
  do  {
215
 
    caracteres_a_lire = taille - caracteres_lus;
216
 
    while((longueur_paquet = read(descripteur,((char *)buffer)+caracteres_lus,caracteres_a_lire)) == -1)
217
 
      ;
218
 
    if (longueur_paquet == 0) return 0;
219
 
    caracteres_lus += longueur_paquet;
220
 
  }
221
 
  while(caracteres_lus < taille);
222
 
  return 1;
223
 
}
224
 
 
225
 
/* Methodes affectees au messages spontanes */
226
 
void erreur_message_actmsg(message)
227
 
     Message message;
228
 
{
229
 
  Erreur_scruteur(concatener_deux_chaines("<erreur message>: bad message format: ",message.tableau[2]));
230
 
}