Mon, 08 Dec 2025 18:11:54 +0100
add server base structs
|
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 | |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
37 | 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
|
38 | UiSimpleMessageHandler *handler = malloc(sizeof(UiSimpleMessageHandler)); |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
39 | handler->handler.start = uic_simple_msg_handler_start; |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
40 | handler->handler.stop = uic_simple_msg_handler_stop; |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
41 | handler->handler.send = uic_simple_msg_handler_send; |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
42 | handler->handler.callback = callback; |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
43 | handler->in = in; |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
44 | handler->out = out; |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
45 | 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
|
46 | handler->stop = 0; |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
47 | pthread_mutex_init(&handler->queue_lock, NULL); |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
48 | pthread_mutex_init(&handler->avlbl_lock, NULL); |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
49 | pthread_cond_init(&handler->available, NULL); |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
50 | return (UiMessageHandler*)handler; |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
51 | } |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
52 | |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
53 | int uic_simple_msg_handler_start(UiMessageHandler *handler) { |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
54 | UiSimpleMessageHandler *sh = (UiSimpleMessageHandler*)handler; |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
55 | 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
|
56 | return 1; |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
57 | } |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
58 | 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
|
59 | return 1; |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
60 | } |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
61 | return 0; |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
62 | } |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
63 | |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
64 | int uic_simple_msg_handler_stop(UiMessageHandler *handler) { |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
65 | UiSimpleMessageHandler *sh = (UiSimpleMessageHandler*)handler; |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
66 | pthread_mutex_lock(&sh->queue_lock); |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
67 | sh->stop = 0; |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
68 | pthread_cond_signal(&sh->available); |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
69 | pthread_mutex_unlock(&sh->queue_lock); |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
70 | close(sh->in); |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
71 | sh->in = -1; |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
72 | |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
73 | pthread_join(sh->in_thread, NULL); |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
74 | pthread_join(sh->out_thread, NULL); |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
75 | |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
76 | return 0; |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
77 | } |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
78 | |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
79 | 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
|
80 | UiSimpleMessageHandler *sh = (UiSimpleMessageHandler*)handler; |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
81 | pthread_mutex_lock(&sh->queue_lock); |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
82 | cxBufferWrite(msg.ptr, 1, msg.length, sh->outbuf); |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
83 | pthread_cond_signal(&sh->available); |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
84 | pthread_mutex_unlock(&sh->queue_lock); |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
85 | return 0; |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
86 | } |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
87 | |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
88 | #define HEADERBUF_SIZE 64 |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
89 | |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
90 | 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
|
91 | UiSimpleMessageHandler *handler = data; |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
92 | |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
93 | char *msg = NULL; |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
94 | size_t msg_size = 0; |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
95 | 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
|
96 | |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
97 | char headerbuf[HEADERBUF_SIZE]; |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
98 | size_t headerpos = 0; |
|
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 buf[2048]; |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
101 | ssize_t r; |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
102 | while((r = read(handler->in, buf, 2024)) > 0) { |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
103 | char *buffer = buf; |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
104 | size_t available = r; |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
105 | |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
106 | while(available > 0) { |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
107 | if(msg) { |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
108 | // read message |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
109 | size_t need = msg_size - msg_pos; |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
110 | size_t cplen = r > need ? need : available; |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
111 | memcpy(msg+msg_pos, buffer, cplen); |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
112 | buffer += cplen; |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
113 | available -= cplen; |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
114 | msg_pos += cplen; |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
115 | if(msg_pos == msg_size) { |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
116 | // message complete |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
117 | //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
|
118 | if(handler->handler.callback) { |
|
981
1d47e71f26b6
add server base structs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
953
diff
changeset
|
119 | 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
|
120 | } |
|
981
1d47e71f26b6
add server base structs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
953
diff
changeset
|
121 | free(msg); |
|
944
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
122 | msg = NULL; |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
123 | msg_size = 0; |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
124 | msg_pos = 0; |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
125 | } |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
126 | } else { |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
127 | size_t header_max = HEADERBUF_SIZE - headerpos - 1; |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
128 | if(header_max > available) { |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
129 | header_max = available; |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
130 | } |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
131 | // search for line break |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
132 | int i; |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
133 | int header_complete = 0; |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
134 | for(i=0;i<header_max;i++) { |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
135 | if(buffer[i] == '\n') { |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
136 | header_complete = 1; |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
137 | break; |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
138 | } |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
139 | } |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
140 | i++; |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
141 | memcpy(headerbuf+headerpos, buffer, i); |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
142 | headerpos += i; |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
143 | buffer += i; |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
144 | available -= i; |
|
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 | if(header_complete) { |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
147 | headerbuf[headerpos-1] = 0; // terminate buffer |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
148 | char *end; |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
149 | long length = strtol(headerbuf, &end, 10); |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
150 | if(*end == '\0') { |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
151 | //fprintf(stderr, "header: %d\n", (int)length); |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
152 | msg = malloc(length); |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
153 | msg_size = length; |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
154 | headerpos = 0; |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
155 | } else { |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
156 | fprintf(stderr, "Error: invalid message {%s}\n", headerbuf); |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
157 | } |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
158 | } else if(headerpos+1 >= HEADERBUF_SIZE) { |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
159 | fprintf(stderr, "Error: message header too big\n"); |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
160 | exit(-1); |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
161 | } |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
162 | } |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
163 | } |
|
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 | |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
166 | } |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
167 | perror("error"); |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
168 | 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
|
169 | |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
170 | return NULL; |
|
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 | 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
|
174 | UiSimpleMessageHandler *handler = data; |
|
945
6055c7c677cf
implement UiMessageHandler output thread
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
944
diff
changeset
|
175 | CxBuffer *buffer = handler->outbuf; |
|
6055c7c677cf
implement UiMessageHandler output thread
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
944
diff
changeset
|
176 | |
|
6055c7c677cf
implement UiMessageHandler output thread
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
944
diff
changeset
|
177 | pthread_mutex_lock(&handler->queue_lock); |
|
6055c7c677cf
implement UiMessageHandler output thread
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
944
diff
changeset
|
178 | |
|
6055c7c677cf
implement UiMessageHandler output thread
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
944
diff
changeset
|
179 | for(;;) { |
|
6055c7c677cf
implement UiMessageHandler output thread
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
944
diff
changeset
|
180 | if(buffer->pos == 0) { |
|
6055c7c677cf
implement UiMessageHandler output thread
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
944
diff
changeset
|
181 | pthread_cond_wait(&handler->available, &handler->queue_lock); |
|
6055c7c677cf
implement UiMessageHandler output thread
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
944
diff
changeset
|
182 | continue; |
|
6055c7c677cf
implement UiMessageHandler output thread
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
944
diff
changeset
|
183 | } else { |
|
6055c7c677cf
implement UiMessageHandler output thread
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
944
diff
changeset
|
184 | size_t n = buffer->pos; |
|
6055c7c677cf
implement UiMessageHandler output thread
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
944
diff
changeset
|
185 | size_t pos = 0; |
|
6055c7c677cf
implement UiMessageHandler output thread
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
944
diff
changeset
|
186 | while(n > 0) { |
|
6055c7c677cf
implement UiMessageHandler output thread
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
944
diff
changeset
|
187 | 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
|
188 | if(w <= 0) { |
|
6055c7c677cf
implement UiMessageHandler output thread
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
944
diff
changeset
|
189 | fprintf(stderr, "Error: output error\n"); |
|
6055c7c677cf
implement UiMessageHandler output thread
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
944
diff
changeset
|
190 | break; |
|
6055c7c677cf
implement UiMessageHandler output thread
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
944
diff
changeset
|
191 | } |
|
6055c7c677cf
implement UiMessageHandler output thread
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
944
diff
changeset
|
192 | n -= w; |
|
6055c7c677cf
implement UiMessageHandler output thread
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
944
diff
changeset
|
193 | pos += w; |
|
6055c7c677cf
implement UiMessageHandler output thread
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
944
diff
changeset
|
194 | } |
|
6055c7c677cf
implement UiMessageHandler output thread
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
944
diff
changeset
|
195 | if(n > 0) { |
|
6055c7c677cf
implement UiMessageHandler output thread
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
944
diff
changeset
|
196 | break; // error |
|
6055c7c677cf
implement UiMessageHandler output thread
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
944
diff
changeset
|
197 | } |
|
6055c7c677cf
implement UiMessageHandler output thread
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
944
diff
changeset
|
198 | buffer->pos = 0; |
|
6055c7c677cf
implement UiMessageHandler output thread
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
944
diff
changeset
|
199 | } |
|
6055c7c677cf
implement UiMessageHandler output thread
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
944
diff
changeset
|
200 | } |
|
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 | pthread_mutex_unlock(&handler->queue_lock); |
|
944
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
203 | |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
204 | return NULL; |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
205 | } |
|
953
c98404829cd3
fix win32 build
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
945
diff
changeset
|
206 | |
|
c98404829cd3
fix win32 build
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
945
diff
changeset
|
207 | #endif |