Merge CV, ver=5.1; ops/methods from HV, and interface from CV where possible
[goodguy/history.git] / cinelerra-5.1 / cinelerra / messages.C
diff --git a/cinelerra-5.1/cinelerra/messages.C b/cinelerra-5.1/cinelerra/messages.C
new file mode 100644 (file)
index 0000000..b29ccab
--- /dev/null
@@ -0,0 +1,259 @@
+
+/*
+ * CINELERRA
+ * Copyright (C) 2008 Adam Williams <broadcast at earthling dot net>
+ * 
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ * 
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ * 
+ */
+
+#include <string.h>
+#include "bcipc.h"
+#include "language.h"
+#include "messages.h"
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+
+
+Messages::Messages(int input_flag, int output_flag, int id)
+{
+       if(id == -1)
+       {
+               msgid = msgget(IPC_PRIVATE, IPC_CREAT | 0777);
+               client = 0;
+       }
+       else
+       {
+               this->msgid = id;
+               client = 1;
+       }
+       
+       this->input_flag = input_flag;
+       this->output_flag = output_flag;
+       bc_enter_msg_id(msgid);
+}
+
+Messages::~Messages()
+{
+       if(!client)
+       {
+               msgctl(msgid, IPC_RMID, NULL);
+               bc_remove_msg_id(msgid);
+       }
+}
+
+char* Messages::get_message_buffer()
+{
+       return buffer.text;
+}
+
+int Messages::read_message(char *text)
+{
+       buffer.mtype = input_flag;
+
+       if((msgrcv(msgid, (struct msgbuf*)&buffer, MESSAGESIZE, input_flag, 0)) < 0)
+       {
+               printf(_("recieve message failed\n"));
+               sleep(1);     // don't flood the screen during the loop
+               return -1;
+       }
+
+//printf("%d %d\n", buffer.text[0], buffer.mtype);
+       strcpy(text, buffer.text);
+       return 0;
+}
+
+long Messages::read_message()
+{
+       buffer.mtype = input_flag;
+       
+       if((msgrcv(msgid, (struct msgbuf*)&buffer, MESSAGESIZE, input_flag, 0)) < 0)
+       {
+               printf(_("recieve message failed\n"));
+               sleep(1);
+               return -1;
+       }
+       return atol(buffer.text);
+}
+
+float Messages::read_message_f()
+{
+       float value;
+       char *data = read_message_raw();
+       sscanf(data, "%f", &value);
+       return value;
+}
+
+char* Messages::read_message_raw()
+{
+       buffer.mtype = input_flag;
+       
+       if((msgrcv(msgid, (struct msgbuf*)&buffer, MESSAGESIZE, input_flag, 0)) < 0)
+       {
+               printf(_("recieve message failed\n"));
+               sleep(1);
+               return "RECIEVE MESSAGE FAILED";
+       }
+       else
+               return buffer.text;
+}
+
+int Messages::read_message(long *value1, long *value2)
+{
+       char *data = read_message_raw();
+       sscanf(data, "%ld %ld", value1, value2);
+       return 0;
+}
+
+int Messages::read_message_f(float *value1, float *value2)
+{
+       char *data = read_message_raw();
+       sscanf(data, "%f %f", value1, value2);
+       return 0;
+}
+
+int Messages::read_message(long *command, long *value1, long *value2)
+{
+       char *data = read_message_raw();
+       sscanf(data, "%ld %ld %ld", command, value1, value2);
+       return 0;
+}
+
+int Messages::read_message(long *command, long *value1, long *value2, long *value3)
+{
+       char *data = read_message_raw();
+       sscanf(data, "%ld %ld %ld %ld", command, value1, value2, value3);
+       return 0;
+}
+
+int Messages::read_message_f(float *value1, float *value2, float *value3)
+{
+       char *data = read_message_raw();
+       sscanf(data, "%f %f %f", value1, value2, value3);
+       return 0;
+}
+
+int Messages::read_message_f(float *value1, float *value2, float *value3, float *value4)
+{
+       char *data = read_message_raw();
+       sscanf(data, "%f %f %f %f", value1, value2, value3, value4);
+       return 0;
+}
+
+int Messages::read_message(int *command, char *text)
+{
+       int i, j;
+       
+       char *data = read_message_raw();
+       sscanf(data, "%d", command);
+// find the start of the text
+       for(i = 0; i < MESSAGESIZE && data[i] != ' '; i++) { ; }
+// get the space
+       i++;
+// copy the text part
+       for(j = 0; (text[j] = data[i]) != 0; i++, j++) { ; }
+       return 0;
+}
+
+
+int Messages::write_message(char *text)
+{
+       buffer.mtype = output_flag;
+       strcpy(buffer.text, text);
+
+       if((msgsnd(msgid, (struct msgbuf*)&buffer, strlen(text) + 1, 0)) < 0) printf(_("send message failed\n"));
+       return 0;
+}
+
+int Messages::write_message_raw()
+{
+       buffer.mtype = output_flag;
+
+       if((msgsnd(msgid, (struct msgbuf*)&buffer, strlen(buffer.text) + 1, 0)) < 0) printf(_("send message failed\n"));
+       return 0;
+}
+
+int Messages::write_message_flagged(int output_flag, int command)
+{
+       buffer.mtype = output_flag;
+       sprintf(buffer.text, "%d", command);
+       
+       if((msgsnd(msgid, (struct msgbuf*)&buffer, strlen(buffer.text) + 1, 0)) < 0) printf(_("send message failed\n"));
+       return 0;
+}
+
+int Messages::write_message(int number)
+{
+       sprintf(buffer.text, "%d", number);
+       buffer.mtype = output_flag;
+       if((msgsnd(msgid, (struct msgbuf*)&buffer, strlen(buffer.text) + 1, 0)) < 0) perror(_("Messages::write_message"));
+       return 0;
+}
+
+int Messages::write_message_f(float number)
+{
+       sprintf(buffer.text, "%f", number);
+       buffer.mtype = output_flag;
+       if((msgsnd(msgid, (struct msgbuf*)&buffer, strlen(buffer.text) + 1, 0)) < 0) perror(_("Messages::write_message"));
+       return 0;
+}
+
+int Messages::write_message(int command, char *text)
+{
+       sprintf(buffer.text, "%d %s", command, text);
+       return write_message_raw();
+}
+
+int Messages::write_message(long command, long value)
+{
+       sprintf(buffer.text, "%ld %ld", command, value);
+       return write_message_raw();
+}
+
+int Messages::write_message_f(float value1, float value2)
+{
+       sprintf(buffer.text, "%f %f", value1, value2);
+       return write_message_raw();
+}
+
+int Messages::write_message(long command, long value1, long value2)
+{
+       sprintf(buffer.text, "%ld %ld %ld", command, value1, value2);
+       return write_message_raw();
+}
+
+int Messages::write_message(long command, long value1, long value2, long value3)
+{
+       sprintf(buffer.text, "%ld %ld %ld %ld", command, value1, value2, value3);
+       return write_message_raw();
+}
+
+int Messages::write_message_f(float value1, float value2, float value3, float value4)
+{
+       sprintf(buffer.text, "%f %f %f %f", value1, value2, value3, value4);
+       return write_message_raw();
+}
+
+int Messages::write_message_f(float value1, float value2, float value3)
+{
+       sprintf(buffer.text, "%f %f %f", value1, value2, value3);
+       return write_message_raw();
+}
+
+int Messages::get_id()
+{
+       return msgid;
+}