00001 #include <string.h>
00002 #include "bcipc.h"
00003 #include "language.h"
00004 #include "messages.h"
00005 #include <stdio.h>
00006 #include <stdlib.h>
00007 #include <unistd.h>
00008
00009
00010 Messages::Messages(int input_flag, int output_flag, int id)
00011 {
00012 if(id == -1)
00013 {
00014 msgid = msgget(IPC_PRIVATE, IPC_CREAT | 0777);
00015 client = 0;
00016 }
00017 else
00018 {
00019 this->msgid = id;
00020 client = 1;
00021 }
00022
00023 this->input_flag = input_flag;
00024 this->output_flag = output_flag;
00025 bc_enter_msg_id(msgid);
00026 }
00027
00028 Messages::~Messages()
00029 {
00030 if(!client)
00031 {
00032 msgctl(msgid, IPC_RMID, NULL);
00033 bc_remove_msg_id(msgid);
00034 }
00035 }
00036
00037 char* Messages::get_message_buffer()
00038 {
00039 return buffer.text;
00040 }
00041
00042 int Messages::read_message(char *text)
00043 {
00044 buffer.mtype = input_flag;
00045
00046 if((msgrcv(msgid, (struct msgbuf*)&buffer, MESSAGESIZE, input_flag, 0)) < 0)
00047 {
00048 printf(_("recieve message failed\n"));
00049 sleep(1);
00050 return -1;
00051 }
00052
00053
00054 strcpy(text, buffer.text);
00055 return 0;
00056 }
00057
00058 long Messages::read_message()
00059 {
00060 buffer.mtype = input_flag;
00061
00062 if((msgrcv(msgid, (struct msgbuf*)&buffer, MESSAGESIZE, input_flag, 0)) < 0)
00063 {
00064 printf(_("recieve message failed\n"));
00065 sleep(1);
00066 return -1;
00067 }
00068 return atol(buffer.text);
00069 }
00070
00071 float Messages::read_message_f()
00072 {
00073 float value;
00074 char *data = read_message_raw();
00075 sscanf(data, "%f", &value);
00076 return value;
00077 }
00078
00079 char* Messages::read_message_raw()
00080 {
00081 buffer.mtype = input_flag;
00082
00083 if((msgrcv(msgid, (struct msgbuf*)&buffer, MESSAGESIZE, input_flag, 0)) < 0)
00084 {
00085 printf(_("recieve message failed\n"));
00086 sleep(1);
00087 return "RECIEVE MESSAGE FAILED";
00088 }
00089 else
00090 return buffer.text;
00091 }
00092
00093 int Messages::read_message(long *value1, long *value2)
00094 {
00095 char *data = read_message_raw();
00096 sscanf(data, "%ld %ld", value1, value2);
00097 return 0;
00098 }
00099
00100 int Messages::read_message_f(float *value1, float *value2)
00101 {
00102 char *data = read_message_raw();
00103 sscanf(data, "%f %f", value1, value2);
00104 return 0;
00105 }
00106
00107 int Messages::read_message(long *command, long *value1, long *value2)
00108 {
00109 char *data = read_message_raw();
00110 sscanf(data, "%ld %ld %ld", command, value1, value2);
00111 return 0;
00112 }
00113
00114 int Messages::read_message(long *command, long *value1, long *value2, long *value3)
00115 {
00116 char *data = read_message_raw();
00117 sscanf(data, "%ld %ld %ld %ld", command, value1, value2, value3);
00118 return 0;
00119 }
00120
00121 int Messages::read_message_f(float *value1, float *value2, float *value3)
00122 {
00123 char *data = read_message_raw();
00124 sscanf(data, "%f %f %f", value1, value2, value3);
00125 return 0;
00126 }
00127
00128 int Messages::read_message_f(float *value1, float *value2, float *value3, float *value4)
00129 {
00130 char *data = read_message_raw();
00131 sscanf(data, "%f %f %f %f", value1, value2, value3, value4);
00132 return 0;
00133 }
00134
00135 int Messages::read_message(int *command, char *text)
00136 {
00137 int i, j;
00138
00139 char *data = read_message_raw();
00140 sscanf(data, "%d", command);
00141
00142 for(i = 0; i < MESSAGESIZE && data[i] != ' '; i++) { ; }
00143
00144 i++;
00145
00146 for(j = 0; (text[j] = data[i]) != 0; i++, j++) { ; }
00147 return 0;
00148 }
00149
00150
00151 int Messages::write_message(char *text)
00152 {
00153 buffer.mtype = output_flag;
00154 strcpy(buffer.text, text);
00155
00156 if((msgsnd(msgid, (struct msgbuf*)&buffer, strlen(text) + 1, 0)) < 0) printf(_("send message failed\n"));
00157 return 0;
00158 }
00159
00160 int Messages::write_message_raw()
00161 {
00162 buffer.mtype = output_flag;
00163
00164 if((msgsnd(msgid, (struct msgbuf*)&buffer, strlen(buffer.text) + 1, 0)) < 0) printf(_("send message failed\n"));
00165 return 0;
00166 }
00167
00168 int Messages::write_message_flagged(int output_flag, int command)
00169 {
00170 buffer.mtype = output_flag;
00171 sprintf(buffer.text, "%d", command);
00172
00173 if((msgsnd(msgid, (struct msgbuf*)&buffer, strlen(buffer.text) + 1, 0)) < 0) printf(_("send message failed\n"));
00174 return 0;
00175 }
00176
00177 int Messages::write_message(int number)
00178 {
00179 sprintf(buffer.text, "%d", number);
00180 buffer.mtype = output_flag;
00181 if((msgsnd(msgid, (struct msgbuf*)&buffer, strlen(buffer.text) + 1, 0)) < 0) perror(_("Messages::write_message"));
00182 return 0;
00183 }
00184
00185 int Messages::write_message_f(float number)
00186 {
00187 sprintf(buffer.text, "%f", number);
00188 buffer.mtype = output_flag;
00189 if((msgsnd(msgid, (struct msgbuf*)&buffer, strlen(buffer.text) + 1, 0)) < 0) perror(_("Messages::write_message"));
00190 return 0;
00191 }
00192
00193 int Messages::write_message(int command, char *text)
00194 {
00195 sprintf(buffer.text, "%d %s", command, text);
00196 return write_message_raw();
00197 }
00198
00199 int Messages::write_message(long command, long value)
00200 {
00201 sprintf(buffer.text, "%ld %ld", command, value);
00202 return write_message_raw();
00203 }
00204
00205 int Messages::write_message_f(float value1, float value2)
00206 {
00207 sprintf(buffer.text, "%f %f", value1, value2);
00208 return write_message_raw();
00209 }
00210
00211 int Messages::write_message(long command, long value1, long value2)
00212 {
00213 sprintf(buffer.text, "%ld %ld %ld", command, value1, value2);
00214 return write_message_raw();
00215 }
00216
00217 int Messages::write_message(long command, long value1, long value2, long value3)
00218 {
00219 sprintf(buffer.text, "%ld %ld %ld %ld", command, value1, value2, value3);
00220 return write_message_raw();
00221 }
00222
00223 int Messages::write_message_f(float value1, float value2, float value3, float value4)
00224 {
00225 sprintf(buffer.text, "%f %f %f %f", value1, value2, value3, value4);
00226 return write_message_raw();
00227 }
00228
00229 int Messages::write_message_f(float value1, float value2, float value3)
00230 {
00231 sprintf(buffer.text, "%f %f %f", value1, value2, value3);
00232 return write_message_raw();
00233 }
00234
00235 int Messages::get_id()
00236 {
00237 return msgid;
00238 }