source: mainline/uspace/lib/c/generic/io/input.c@ 5c38838

Last change on this file since 5c38838 was 984a9ba, checked in by Martin Decky <martin@…>, 7 years ago

do not expose the call capability handler from the async framework

Keep the call capability handler encapsulated within the async framework
and do not expose it explicitly via its API. Use the pointer to
ipc_call_t as the sole object identifying an IPC call in the code that
uses the async framework.

This plugs a major leak in the abstraction and also simplifies both the
async framework (slightly) and all IPC servers.

  • Property mode set to 100644
File size: 4.7 KB
RevLine 
[111d2d6]1/*
2 * Copyright (c) 2012 Jiri Svoboda
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 *
9 * - Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 * - Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
14 * - The name of the author may not be used to endorse or promote products
15 * derived from this software without specific prior written permission.
16 *
17 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 */
28
29/** @addtogroup libc
30 * @{
31 */
32/**
33 * @file
34 * @brief Input protocol client stub
35 */
36
37#include <async.h>
38#include <assert.h>
39#include <errno.h>
40#include <io/kbd_event.h>
41#include <io/input.h>
42#include <ipc/input.h>
43#include <stdlib.h>
44
[984a9ba]45static void input_cb_conn(ipc_call_t *icall, void *arg);
[111d2d6]46
[b7fd2a0]47errno_t input_open(async_sess_t *sess, input_ev_ops_t *ev_ops,
[111d2d6]48 void *arg, input_t **rinput)
49{
50 input_t *input = calloc(1, sizeof(input_t));
51 if (input == NULL)
52 return ENOMEM;
53
54 input->sess = sess;
55 input->ev_ops = ev_ops;
56 input->user = arg;
57
58 async_exch_t *exch = async_exchange_begin(sess);
59
[f9b2cb4c]60 port_id_t port;
[b7fd2a0]61 errno_t rc = async_create_callback_port(exch, INTERFACE_INPUT_CB, 0, 0,
[f9b2cb4c]62 input_cb_conn, input, &port);
[a35b458]63
[111d2d6]64 async_exchange_end(exch);
65
66 if (rc != EOK)
67 goto error;
68
69 *rinput = input;
70 return EOK;
71
72error:
73 if (input != NULL)
74 free(input);
75
76 return rc;
77}
78
79void input_close(input_t *input)
80{
81 /* XXX Synchronize with input_cb_conn */
82 free(input);
83}
84
[b7fd2a0]85errno_t input_activate(input_t *input)
[111d2d6]86{
87 async_exch_t *exch = async_exchange_begin(input->sess);
[b7fd2a0]88 errno_t rc = async_req_0_0(exch, INPUT_ACTIVATE);
[111d2d6]89 async_exchange_end(exch);
[a35b458]90
[111d2d6]91 return rc;
92}
93
[984a9ba]94static void input_ev_active(input_t *input, ipc_call_t *call)
[111d2d6]95{
[b7fd2a0]96 errno_t rc = input->ev_ops->active(input);
[984a9ba]97 async_answer_0(call, rc);
[593e023]98}
[111d2d6]99
[984a9ba]100static void input_ev_deactive(input_t *input, ipc_call_t *call)
[593e023]101{
[b7fd2a0]102 errno_t rc = input->ev_ops->deactive(input);
[984a9ba]103 async_answer_0(call, rc);
[111d2d6]104}
105
[984a9ba]106static void input_ev_key(input_t *input, ipc_call_t *call)
[111d2d6]107{
108 kbd_event_type_t type;
109 keycode_t key;
110 keymod_t mods;
111 wchar_t c;
[b7fd2a0]112 errno_t rc;
[111d2d6]113
114 type = IPC_GET_ARG1(*call);
115 key = IPC_GET_ARG2(*call);
116 mods = IPC_GET_ARG3(*call);
117 c = IPC_GET_ARG4(*call);
118
119 rc = input->ev_ops->key(input, type, key, mods, c);
[984a9ba]120 async_answer_0(call, rc);
[111d2d6]121}
122
[984a9ba]123static void input_ev_move(input_t *input, ipc_call_t *call)
[111d2d6]124{
125 int dx;
126 int dy;
[b7fd2a0]127 errno_t rc;
[111d2d6]128
129 dx = IPC_GET_ARG1(*call);
130 dy = IPC_GET_ARG2(*call);
131
132 rc = input->ev_ops->move(input, dx, dy);
[984a9ba]133 async_answer_0(call, rc);
[111d2d6]134}
135
[984a9ba]136static void input_ev_abs_move(input_t *input, ipc_call_t *call)
[111d2d6]137{
138 unsigned x;
139 unsigned y;
140 unsigned max_x;
141 unsigned max_y;
[b7fd2a0]142 errno_t rc;
[111d2d6]143
144 x = IPC_GET_ARG1(*call);
145 y = IPC_GET_ARG2(*call);
[6af521c]146 max_x = IPC_GET_ARG3(*call);
147 max_y = IPC_GET_ARG4(*call);
[111d2d6]148
149 rc = input->ev_ops->abs_move(input, x, y, max_x, max_y);
[984a9ba]150 async_answer_0(call, rc);
[111d2d6]151}
152
[984a9ba]153static void input_ev_button(input_t *input, ipc_call_t *call)
[111d2d6]154{
155 int bnum;
156 int press;
[b7fd2a0]157 errno_t rc;
[111d2d6]158
159 bnum = IPC_GET_ARG1(*call);
160 press = IPC_GET_ARG2(*call);
161
162 rc = input->ev_ops->button(input, bnum, press);
[984a9ba]163 async_answer_0(call, rc);
[111d2d6]164}
165
[984a9ba]166static void input_cb_conn(ipc_call_t *icall, void *arg)
[111d2d6]167{
[984a9ba]168 input_t *input = (input_t *) arg;
[111d2d6]169
170 while (true) {
171 ipc_call_t call;
[984a9ba]172 async_get_call(&call);
[111d2d6]173
174 if (!IPC_GET_IMETHOD(call)) {
175 /* TODO: Handle hangup */
176 return;
177 }
178
179 switch (IPC_GET_IMETHOD(call)) {
[593e023]180 case INPUT_EVENT_ACTIVE:
[984a9ba]181 input_ev_active(input, &call);
[593e023]182 break;
183 case INPUT_EVENT_DEACTIVE:
[984a9ba]184 input_ev_deactive(input, &call);
[593e023]185 break;
[111d2d6]186 case INPUT_EVENT_KEY:
[984a9ba]187 input_ev_key(input, &call);
[111d2d6]188 break;
189 case INPUT_EVENT_MOVE:
[984a9ba]190 input_ev_move(input, &call);
[111d2d6]191 break;
192 case INPUT_EVENT_ABS_MOVE:
[984a9ba]193 input_ev_abs_move(input, &call);
[111d2d6]194 break;
195 case INPUT_EVENT_BUTTON:
[984a9ba]196 input_ev_button(input, &call);
[111d2d6]197 break;
198 default:
[984a9ba]199 async_answer_0(&call, ENOTSUP);
[111d2d6]200 }
201 }
202}
203
204/** @}
205 */
Note: See TracBrowser for help on using the repository browser.