1
/********************************************************/
2
/* Module de gestion de messages pour le scruteur. v1.0 */
3
/********************************************************/
8
#if defined(SYSV) || defined(WIN32)
20
#include "formatage_messages.h"
21
#include "gestion_memoire.h"
23
#include "scr_liaisons.h"
24
#include "scr_applications.h"
25
#include "scr_messages.h"
29
typedef struct Actions_messages{
36
char *Identificateur_application=ID_SCRUTEUR;
38
static int lire_buffer_sur_pipe();
40
/* Table des messages reconnus par le scruteur */
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}};
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. */
59
void interpreter_message(message)
65
while(tb_messages[i].nb_parametres != 0) {
67
if (message.taille >= 3)
69
if (tb_messages[i].source == NULL ||
70
!strcmp(tb_messages[i].source,message.tableau[0]))
72
if (tb_messages[i].type_message == NULL ||
73
!strcmp(tb_messages[i].type_message,message.tableau[2])) {
75
if (!strcmp(message.tableau[1],Identificateur_application)) {
77
if (tb_messages[i].nb_parametres >= 0) {
79
if (message.taille == tb_messages[i].nb_parametres)
84
if (message.taille >= -tb_messages[i].nb_parametres)
92
(*tb_messages[i].action)(message);
95
void envoyer_message_var(va_alist)
101
va_start(parametres);
103
message=convertir_nombre_arbitraire_de_chaines_en_tableau(¶metres);
106
envoyer_message(message);
107
liberer_message(message);
110
void envoyer_message(message)
113
Message nouveau_message;
116
nouveau_message.tableau=allouer_type(char *,message.taille+1);
118
nouveau_message.tableau[0]=dupliquer_chaine(Identificateur_application);
120
for(compteur=0;compteur<message.taille;compteur++)
121
nouveau_message.tableau[compteur+1]=message.tableau[compteur];
122
nouveau_message.taille=message.taille+1;
124
envoyer_message_brut(nouveau_message);
126
liberer(nouveau_message.tableau[0]);
127
liberer(nouveau_message.tableau);
128
/* liberer_message(nouveau_message);*/
131
void envoyer_message_brut(message)
135
char *trame,*noyau_trame;
136
application *recherche_appli_destination;
137
char chaine_num[LONG];
139
noyau_trame=coller_chaines(message);
141
trame=concatenation_plusieurs_chaines(DEBUT_DE_TRAME," ",noyau_trame," ",FIN_DE_TRAME,NULL);
143
liberer(noyau_trame);
145
recherche_appli_destination = ldc_rechercher_objet(liste_applications,message.tableau[1]);
147
if (recherche_appli_destination == NULL)
148
Erreur_scruteur(concatener_deux_chaines("<rechercher_application>: bad parameters: ",message.tableau[1]));
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);
159
void envoyer_message_brut_directement(message,destinataire)
164
char *trame,*noyau_trame;
165
char chaine_num[LONG];
167
noyau_trame=coller_chaines(message);
169
trame=concatenation_plusieurs_chaines(DEBUT_DE_TRAME," ",noyau_trame," ",FIN_DE_TRAME,NULL);
171
liberer(noyau_trame);
173
longueur_trame=strlen(trame)+1;
175
sprintf(chaine_num,"%d",(int)longueur_trame);
176
chaine_num[LONG]='\0';
177
write(destinataire,chaine_num,LONG);
179
write(destinataire,trame,longueur_trame);
184
int recevoir_message(descripteur,message)
190
char chaine_num[LONG];
192
if (lire_buffer_sur_pipe(descripteur,chaine_num,LONG) == 0) return 0;
194
longueur=atol(chaine_num);
195
trame=allouer_type(char,longueur+1);
197
if (lire_buffer_sur_pipe(descripteur,trame,longueur) == 0) return 0;
198
trame[longueur]='\0';
199
*message=decouper_trame(trame);
204
static int lire_buffer_sur_pipe(descripteur,buffer,taille)
210
long caracteres_lus = 0;
211
long caracteres_a_lire;
212
long longueur_paquet;
215
caracteres_a_lire = taille - caracteres_lus;
216
while((longueur_paquet = read(descripteur,((char *)buffer)+caracteres_lus,caracteres_a_lire)) == -1)
218
if (longueur_paquet == 0) return 0;
219
caracteres_lus += longueur_paquet;
221
while(caracteres_lus < taille);
225
/* Methodes affectees au messages spontanes */
226
void erreur_message_actmsg(message)
229
Erreur_scruteur(concatener_deux_chaines("<erreur message>: bad message format: ",message.tableau[2]));