Fri, 12 Dec 2025 12:44:03 +0100
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 |