Sun, 30 Nov 2025 21:12:00 +0100
move message handler to ui common
|
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 | |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
29 | #include <stdio.h> |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
30 | #include <stdlib.h> |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
31 | #include <unistd.h> |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
32 | |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
33 | #include "message.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 | 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
|
36 | UiSimpleMessageHandler *handler = malloc(sizeof(UiSimpleMessageHandler)); |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
37 | handler->handler.start = uic_simple_msg_handler_start; |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
38 | handler->handler.stop = uic_simple_msg_handler_stop; |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
39 | handler->handler.send = uic_simple_msg_handler_send; |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
40 | handler->handler.callback = callback; |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
41 | handler->in = in; |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
42 | handler->out = out; |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
43 | 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
|
44 | handler->stop = 0; |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
45 | pthread_mutex_init(&handler->queue_lock, NULL); |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
46 | pthread_mutex_init(&handler->avlbl_lock, NULL); |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
47 | pthread_cond_init(&handler->available, NULL); |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
48 | return (UiMessageHandler*)handler; |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
49 | } |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
50 | |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
51 | int uic_simple_msg_handler_start(UiMessageHandler *handler) { |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
52 | UiSimpleMessageHandler *sh = (UiSimpleMessageHandler*)handler; |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
53 | 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
|
54 | return 1; |
|
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 | 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
|
57 | return 1; |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
58 | } |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
59 | return 0; |
|
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 | |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
62 | int uic_simple_msg_handler_stop(UiMessageHandler *handler) { |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
63 | UiSimpleMessageHandler *sh = (UiSimpleMessageHandler*)handler; |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
64 | pthread_mutex_lock(&sh->queue_lock); |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
65 | sh->stop = 0; |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
66 | pthread_cond_signal(&sh->available); |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
67 | pthread_mutex_unlock(&sh->queue_lock); |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
68 | close(sh->in); |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
69 | sh->in = -1; |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
70 | |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
71 | pthread_join(sh->in_thread, NULL); |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
72 | pthread_join(sh->out_thread, NULL); |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
73 | |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
74 | return 0; |
|
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 | |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
77 | 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
|
78 | UiSimpleMessageHandler *sh = (UiSimpleMessageHandler*)handler; |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
79 | pthread_mutex_lock(&sh->queue_lock); |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
80 | cxBufferWrite(msg.ptr, 1, msg.length, sh->outbuf); |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
81 | pthread_cond_signal(&sh->available); |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
82 | pthread_mutex_unlock(&sh->queue_lock); |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
83 | return 0; |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
84 | } |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
85 | |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
86 | #define HEADERBUF_SIZE 64 |
|
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 | 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
|
89 | UiSimpleMessageHandler *handler = data; |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
90 | |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
91 | char *msg = NULL; |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
92 | size_t msg_size = 0; |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
93 | 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
|
94 | |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
95 | char headerbuf[HEADERBUF_SIZE]; |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
96 | size_t headerpos = 0; |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
97 | |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
98 | char buf[2048]; |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
99 | ssize_t r; |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
100 | while((r = read(handler->in, buf, 2024)) > 0) { |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
101 | char *buffer = buf; |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
102 | size_t available = r; |
|
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 | while(available > 0) { |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
105 | if(msg) { |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
106 | // read message |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
107 | size_t need = msg_size - msg_pos; |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
108 | size_t cplen = r > need ? need : available; |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
109 | memcpy(msg+msg_pos, buffer, cplen); |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
110 | buffer += cplen; |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
111 | available -= cplen; |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
112 | msg_pos += cplen; |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
113 | if(msg_pos == msg_size) { |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
114 | // message complete |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
115 | //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
|
116 | if(handler->handler.callback) { |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
117 | handler->handler.callback(cx_mutstrn(msg, msg_size)); |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
118 | } |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
119 | msg = NULL; |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
120 | msg_size = 0; |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
121 | msg_pos = 0; |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
122 | } |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
123 | } else { |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
124 | size_t header_max = HEADERBUF_SIZE - headerpos - 1; |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
125 | if(header_max > available) { |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
126 | header_max = available; |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
127 | } |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
128 | // search for line break |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
129 | int i; |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
130 | int header_complete = 0; |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
131 | for(i=0;i<header_max;i++) { |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
132 | if(buffer[i] == '\n') { |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
133 | header_complete = 1; |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
134 | break; |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
135 | } |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
136 | } |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
137 | i++; |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
138 | memcpy(headerbuf+headerpos, buffer, i); |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
139 | headerpos += i; |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
140 | buffer += i; |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
141 | available -= i; |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
142 | |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
143 | if(header_complete) { |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
144 | headerbuf[headerpos-1] = 0; // terminate buffer |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
145 | char *end; |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
146 | long length = strtol(headerbuf, &end, 10); |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
147 | if(*end == '\0') { |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
148 | //fprintf(stderr, "header: %d\n", (int)length); |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
149 | msg = malloc(length); |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
150 | msg_size = length; |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
151 | headerpos = 0; |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
152 | } else { |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
153 | fprintf(stderr, "Error: invalid message {%s}\n", headerbuf); |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
154 | } |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
155 | } else if(headerpos+1 >= HEADERBUF_SIZE) { |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
156 | fprintf(stderr, "Error: message header too big\n"); |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
157 | exit(-1); |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
158 | } |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
159 | } |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
160 | } |
|
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 | perror("error"); |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
165 | 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
|
166 | |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
167 | return NULL; |
|
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 | 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
|
171 | UiSimpleMessageHandler *handler = data; |
|
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 | return NULL; |
|
cc23aad6335e
move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
174 | } |