ui/common/message.c

Fri, 12 Dec 2025 12:44:03 +0100

author
Olaf Wintermann <olaf.wintermann@gmail.com>
date
Fri, 12 Dec 2025 12:44:03 +0100
changeset 994
c9395b30e5c8
parent 982
9102a53c5385
permissions
-rw-r--r--

fix uic_store_app_properties

944
cc23aad6335e move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
1 /*
cc23aad6335e move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
2 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
cc23aad6335e move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
3 *
cc23aad6335e move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
4 * Copyright 2025 Olaf Wintermann. All rights reserved.
cc23aad6335e move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
5 *
cc23aad6335e move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
6 * Redistribution and use in source and binary forms, with or without
cc23aad6335e move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
7 * modification, are permitted provided that the following conditions are met:
cc23aad6335e move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
8 *
cc23aad6335e move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
9 * 1. Redistributions of source code must retain the above copyright
cc23aad6335e move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
10 * notice, this list of conditions and the following disclaimer.
cc23aad6335e move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
11 *
cc23aad6335e move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
12 * 2. Redistributions in binary form must reproduce the above copyright
cc23aad6335e move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
13 * notice, this list of conditions and the following disclaimer in the
cc23aad6335e move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
14 * documentation and/or other materials provided with the distribution.
cc23aad6335e move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
15 *
cc23aad6335e move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
16 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
cc23aad6335e move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
17 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
cc23aad6335e move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
cc23aad6335e move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
19 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
cc23aad6335e move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
20 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
cc23aad6335e move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
21 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
cc23aad6335e move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
22 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
cc23aad6335e move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
23 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
cc23aad6335e move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
24 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
cc23aad6335e move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
25 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
cc23aad6335e move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
26 * POSSIBILITY OF SUCH DAMAGE.
cc23aad6335e move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
27 */
cc23aad6335e move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
28
953
c98404829cd3 fix win32 build
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 945
diff changeset
29 #ifndef _WIN32
c98404829cd3 fix win32 build
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 945
diff changeset
30
944
cc23aad6335e move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
31 #include <stdio.h>
cc23aad6335e move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
32 #include <stdlib.h>
cc23aad6335e move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
33 #include <unistd.h>
cc23aad6335e move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
34
cc23aad6335e move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
35 #include "message.h"
cc23aad6335e move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
36
982
9102a53c5385 implement window (Server)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 981
diff changeset
37 int uic_message_send_(UiMessageHandler *handler, cxstring msg) {
9102a53c5385 implement window (Server)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 981
diff changeset
38 return handler->send(handler, msg);
9102a53c5385 implement window (Server)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 981
diff changeset
39 }
9102a53c5385 implement window (Server)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 981
diff changeset
40
944
cc23aad6335e move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
41 UiMessageHandler* uic_simple_msg_handler(int in, int out, msg_received_callback callback) {
cc23aad6335e move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
42 UiSimpleMessageHandler *handler = malloc(sizeof(UiSimpleMessageHandler));
cc23aad6335e move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
43 handler->handler.start = uic_simple_msg_handler_start;
cc23aad6335e move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
44 handler->handler.stop = uic_simple_msg_handler_stop;
cc23aad6335e move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
45 handler->handler.send = uic_simple_msg_handler_send;
cc23aad6335e move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
46 handler->handler.callback = callback;
cc23aad6335e move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
47 handler->in = in;
cc23aad6335e move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
48 handler->out = out;
cc23aad6335e move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
49 handler->outbuf = cxBufferCreate(NULL, 4096, NULL, CX_BUFFER_FREE_CONTENTS | CX_BUFFER_AUTO_EXTEND);
cc23aad6335e move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
50 handler->stop = 0;
cc23aad6335e move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
51 pthread_mutex_init(&handler->queue_lock, NULL);
cc23aad6335e move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
52 pthread_mutex_init(&handler->avlbl_lock, NULL);
cc23aad6335e move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
53 pthread_cond_init(&handler->available, NULL);
cc23aad6335e move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
54 return (UiMessageHandler*)handler;
cc23aad6335e move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
55 }
cc23aad6335e move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
56
cc23aad6335e move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
57 int uic_simple_msg_handler_start(UiMessageHandler *handler) {
cc23aad6335e move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
58 UiSimpleMessageHandler *sh = (UiSimpleMessageHandler*)handler;
cc23aad6335e move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
59 if(pthread_create(&sh->in_thread, NULL, uic_simple_msg_handler_in_thread, sh)) {
cc23aad6335e move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
60 return 1;
cc23aad6335e move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
61 }
cc23aad6335e move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
62 if(pthread_create(&sh->out_thread, NULL, uic_simple_msg_handler_out_thread, sh)) {
cc23aad6335e move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
63 return 1;
cc23aad6335e move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
64 }
cc23aad6335e move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
65 return 0;
cc23aad6335e move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
66 }
cc23aad6335e move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
67
cc23aad6335e move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
68 int uic_simple_msg_handler_stop(UiMessageHandler *handler) {
cc23aad6335e move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
69 UiSimpleMessageHandler *sh = (UiSimpleMessageHandler*)handler;
cc23aad6335e move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
70 pthread_mutex_lock(&sh->queue_lock);
cc23aad6335e move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
71 sh->stop = 0;
cc23aad6335e move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
72 pthread_cond_signal(&sh->available);
cc23aad6335e move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
73 pthread_mutex_unlock(&sh->queue_lock);
cc23aad6335e move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
74 close(sh->in);
cc23aad6335e move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
75 sh->in = -1;
cc23aad6335e move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
76
cc23aad6335e move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
77 pthread_join(sh->in_thread, NULL);
cc23aad6335e move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
78 pthread_join(sh->out_thread, NULL);
cc23aad6335e move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
79
cc23aad6335e move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
80 return 0;
cc23aad6335e move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
81 }
cc23aad6335e move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
82
cc23aad6335e move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
83 int uic_simple_msg_handler_send(UiMessageHandler *handler, cxstring msg) {
cc23aad6335e move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
84 UiSimpleMessageHandler *sh = (UiSimpleMessageHandler*)handler;
cc23aad6335e move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
85 pthread_mutex_lock(&sh->queue_lock);
982
9102a53c5385 implement window (Server)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 981
diff changeset
86 char header[32];
9102a53c5385 implement window (Server)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 981
diff changeset
87 snprintf(header, 32, "%zu\n", msg.length);
9102a53c5385 implement window (Server)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 981
diff changeset
88 cxBufferPutString(sh->outbuf, header);
944
cc23aad6335e move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
89 cxBufferWrite(msg.ptr, 1, msg.length, sh->outbuf);
cc23aad6335e move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
90 pthread_cond_signal(&sh->available);
cc23aad6335e move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
91 pthread_mutex_unlock(&sh->queue_lock);
cc23aad6335e move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
92 return 0;
cc23aad6335e move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
93 }
cc23aad6335e move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
94
cc23aad6335e move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
95 #define HEADERBUF_SIZE 64
cc23aad6335e move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
96
cc23aad6335e move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
97 void* uic_simple_msg_handler_in_thread(void *data) {
cc23aad6335e move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
98 UiSimpleMessageHandler *handler = data;
cc23aad6335e move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
99
cc23aad6335e move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
100 char *msg = NULL;
cc23aad6335e move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
101 size_t msg_size = 0;
cc23aad6335e move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
102 size_t msg_pos = 0; // currently received message length
cc23aad6335e move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
103
cc23aad6335e move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
104 char headerbuf[HEADERBUF_SIZE];
cc23aad6335e move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
105 size_t headerpos = 0;
cc23aad6335e move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
106
cc23aad6335e move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
107 char buf[2048];
cc23aad6335e move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
108 ssize_t r;
cc23aad6335e move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
109 while((r = read(handler->in, buf, 2024)) > 0) {
cc23aad6335e move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
110 char *buffer = buf;
cc23aad6335e move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
111 size_t available = r;
cc23aad6335e move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
112
cc23aad6335e move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
113 while(available > 0) {
cc23aad6335e move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
114 if(msg) {
cc23aad6335e move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
115 // read message
cc23aad6335e move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
116 size_t need = msg_size - msg_pos;
cc23aad6335e move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
117 size_t cplen = r > need ? need : available;
cc23aad6335e move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
118 memcpy(msg+msg_pos, buffer, cplen);
cc23aad6335e move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
119 buffer += cplen;
cc23aad6335e move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
120 available -= cplen;
cc23aad6335e move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
121 msg_pos += cplen;
cc23aad6335e move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
122 if(msg_pos == msg_size) {
cc23aad6335e move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
123 // message complete
cc23aad6335e move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
124 //fprintf(stderr, "send: %.*s\n", (int)msg_size, msg);
cc23aad6335e move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
125 if(handler->handler.callback) {
981
1d47e71f26b6 add server base structs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 953
diff changeset
126 handler->handler.callback(cx_strn(msg, msg_size));
944
cc23aad6335e move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
127 }
981
1d47e71f26b6 add server base structs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 953
diff changeset
128 free(msg);
944
cc23aad6335e move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
129 msg = NULL;
cc23aad6335e move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
130 msg_size = 0;
cc23aad6335e move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
131 msg_pos = 0;
cc23aad6335e move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
132 }
cc23aad6335e move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
133 } else {
cc23aad6335e move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
134 size_t header_max = HEADERBUF_SIZE - headerpos - 1;
cc23aad6335e move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
135 if(header_max > available) {
cc23aad6335e move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
136 header_max = available;
cc23aad6335e move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
137 }
cc23aad6335e move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
138 // search for line break
cc23aad6335e move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
139 int i;
cc23aad6335e move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
140 int header_complete = 0;
cc23aad6335e move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
141 for(i=0;i<header_max;i++) {
cc23aad6335e move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
142 if(buffer[i] == '\n') {
cc23aad6335e move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
143 header_complete = 1;
cc23aad6335e move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
144 break;
cc23aad6335e move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
145 }
cc23aad6335e move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
146 }
cc23aad6335e move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
147 i++;
cc23aad6335e move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
148 memcpy(headerbuf+headerpos, buffer, i);
cc23aad6335e move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
149 headerpos += i;
cc23aad6335e move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
150 buffer += i;
cc23aad6335e move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
151 available -= i;
cc23aad6335e move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
152
cc23aad6335e move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
153 if(header_complete) {
cc23aad6335e move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
154 headerbuf[headerpos-1] = 0; // terminate buffer
cc23aad6335e move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
155 char *end;
cc23aad6335e move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
156 long length = strtol(headerbuf, &end, 10);
cc23aad6335e move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
157 if(*end == '\0') {
cc23aad6335e move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
158 //fprintf(stderr, "header: %d\n", (int)length);
cc23aad6335e move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
159 msg = malloc(length);
cc23aad6335e move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
160 msg_size = length;
cc23aad6335e move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
161 headerpos = 0;
cc23aad6335e move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
162 } else {
cc23aad6335e move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
163 fprintf(stderr, "Error: invalid message {%s}\n", headerbuf);
cc23aad6335e move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
164 }
cc23aad6335e move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
165 } else if(headerpos+1 >= HEADERBUF_SIZE) {
cc23aad6335e move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
166 fprintf(stderr, "Error: message header too big\n");
cc23aad6335e move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
167 exit(-1);
cc23aad6335e move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
168 }
cc23aad6335e move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
169 }
cc23aad6335e move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
170 }
cc23aad6335e move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
171
cc23aad6335e move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
172
cc23aad6335e move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
173 }
cc23aad6335e move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
174 perror("error");
cc23aad6335e move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
175 fprintf(stderr, "stop simple_msg_handler_in_thread\n");
cc23aad6335e move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
176
cc23aad6335e move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
177 return NULL;
cc23aad6335e move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
178 }
cc23aad6335e move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
179
cc23aad6335e move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
180 void* uic_simple_msg_handler_out_thread(void *data) {
cc23aad6335e move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
181 UiSimpleMessageHandler *handler = data;
945
6055c7c677cf implement UiMessageHandler output thread
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 944
diff changeset
182 CxBuffer *buffer = handler->outbuf;
6055c7c677cf implement UiMessageHandler output thread
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 944
diff changeset
183
6055c7c677cf implement UiMessageHandler output thread
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 944
diff changeset
184 pthread_mutex_lock(&handler->queue_lock);
6055c7c677cf implement UiMessageHandler output thread
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 944
diff changeset
185
6055c7c677cf implement UiMessageHandler output thread
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 944
diff changeset
186 for(;;) {
6055c7c677cf implement UiMessageHandler output thread
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 944
diff changeset
187 if(buffer->pos == 0) {
6055c7c677cf implement UiMessageHandler output thread
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 944
diff changeset
188 pthread_cond_wait(&handler->available, &handler->queue_lock);
6055c7c677cf implement UiMessageHandler output thread
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 944
diff changeset
189 continue;
6055c7c677cf implement UiMessageHandler output thread
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 944
diff changeset
190 } else {
6055c7c677cf implement UiMessageHandler output thread
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 944
diff changeset
191 size_t n = buffer->pos;
6055c7c677cf implement UiMessageHandler output thread
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 944
diff changeset
192 size_t pos = 0;
6055c7c677cf implement UiMessageHandler output thread
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 944
diff changeset
193 while(n > 0) {
6055c7c677cf implement UiMessageHandler output thread
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 944
diff changeset
194 ssize_t w = write(handler->out, buffer->space + pos, n);
6055c7c677cf implement UiMessageHandler output thread
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 944
diff changeset
195 if(w <= 0) {
6055c7c677cf implement UiMessageHandler output thread
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 944
diff changeset
196 fprintf(stderr, "Error: output error\n");
6055c7c677cf implement UiMessageHandler output thread
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 944
diff changeset
197 break;
6055c7c677cf implement UiMessageHandler output thread
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 944
diff changeset
198 }
6055c7c677cf implement UiMessageHandler output thread
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 944
diff changeset
199 n -= w;
6055c7c677cf implement UiMessageHandler output thread
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 944
diff changeset
200 pos += w;
6055c7c677cf implement UiMessageHandler output thread
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 944
diff changeset
201 }
6055c7c677cf implement UiMessageHandler output thread
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 944
diff changeset
202 if(n > 0) {
6055c7c677cf implement UiMessageHandler output thread
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 944
diff changeset
203 break; // error
6055c7c677cf implement UiMessageHandler output thread
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 944
diff changeset
204 }
6055c7c677cf implement UiMessageHandler output thread
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 944
diff changeset
205 buffer->pos = 0;
6055c7c677cf implement UiMessageHandler output thread
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 944
diff changeset
206 }
6055c7c677cf implement UiMessageHandler output thread
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 944
diff changeset
207 }
6055c7c677cf implement UiMessageHandler output thread
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 944
diff changeset
208
6055c7c677cf implement UiMessageHandler output thread
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 944
diff changeset
209 pthread_mutex_unlock(&handler->queue_lock);
944
cc23aad6335e move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
210
cc23aad6335e move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
211 return NULL;
cc23aad6335e move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
212 }
953
c98404829cd3 fix win32 build
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 945
diff changeset
213
c98404829cd3 fix win32 build
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 945
diff changeset
214 #endif

mercurial