Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/lib/display/src/disp_srv.c

    r35cffea rcdd6fc9  
    11/*
    2  * Copyright (c) 2022 Jiri Svoboda
     2 * Copyright (c) 2023 Jiri Svoboda
    33 * All rights reserved.
    44 *
     
    6363        sysarg_t wnd_id;
    6464        ipc_call_t call;
     65        display_wnd_params_enc_t eparams;
    6566        display_wnd_params_t params;
     67        char *caption;
    6668        size_t size;
    6769        errno_t rc;
     
    7375        }
    7476
    75         if (size != sizeof(display_wnd_params_t)) {
    76                 async_answer_0(&call, EINVAL);
    77                 async_answer_0(icall, EINVAL);
    78                 return;
    79         }
    80 
    81         rc = async_data_write_finalize(&call, &params, size);
    82         if (rc != EOK) {
     77        if (size != sizeof(display_wnd_params_enc_t)) {
     78                async_answer_0(&call, EINVAL);
     79                async_answer_0(icall, EINVAL);
     80                return;
     81        }
     82
     83        rc = async_data_write_finalize(&call, &eparams, size);
     84        if (rc != EOK) {
     85                async_answer_0(&call, rc);
     86                async_answer_0(icall, rc);
     87                return;
     88        }
     89
     90        caption = calloc(eparams.caption_size + 1, 1);
     91        if (caption == NULL) {
     92                async_answer_0(icall, ENOMEM);
     93                return;
     94        }
     95
     96        if (!async_data_write_receive(&call, &size)) {
     97                free(caption);
     98                async_answer_0(&call, EREFUSED);
     99                async_answer_0(icall, EREFUSED);
     100                return;
     101        }
     102
     103        if (size != eparams.caption_size) {
     104                free(caption);
     105                async_answer_0(&call, EINVAL);
     106                async_answer_0(icall, EINVAL);
     107                return;
     108        }
     109
     110        rc = async_data_write_finalize(&call, caption, eparams.caption_size);
     111        if (rc != EOK) {
     112                free(caption);
    83113                async_answer_0(&call, rc);
    84114                async_answer_0(icall, rc);
     
    87117
    88118        if (srv->ops->window_create == NULL) {
    89                 async_answer_0(icall, ENOTSUP);
    90                 return;
    91         }
     119                free(caption);
     120                async_answer_0(icall, ENOTSUP);
     121                return;
     122        }
     123
     124        /* Decode the parameters from transport */
     125        params.rect = eparams.rect;
     126        params.caption = caption;
     127        params.min_size = eparams.min_size;
     128        params.pos = eparams.pos;
     129        params.flags = eparams.flags;
    92130
    93131        rc = srv->ops->window_create(srv->arg, &params, &wnd_id);
     
    203241
    204242        if (!async_data_read_receive(&call, &size)) {
     243                async_answer_0(&call, EREFUSED);
    205244                async_answer_0(icall, EREFUSED);
    206245                return;
     
    247286
    248287        if (!async_data_read_receive(&call, &size)) {
     288                async_answer_0(&call, EREFUSED);
    249289                async_answer_0(icall, EREFUSED);
    250290                return;
     
    353393}
    354394
     395static void display_window_minimize_srv(display_srv_t *srv, ipc_call_t *icall)
     396{
     397        sysarg_t wnd_id;
     398        errno_t rc;
     399
     400        wnd_id = ipc_get_arg1(icall);
     401
     402        if (srv->ops->window_minimize == NULL) {
     403                async_answer_0(icall, ENOTSUP);
     404                return;
     405        }
     406
     407        rc = srv->ops->window_minimize(srv->arg, wnd_id);
     408        async_answer_0(icall, rc);
     409}
     410
    355411static void display_window_maximize_srv(display_srv_t *srv, ipc_call_t *icall)
    356412{
     
    401457        rc = srv->ops->window_set_cursor(srv->arg, wnd_id, cursor);
    402458        async_answer_0(icall, rc);
     459}
     460
     461static void display_window_set_caption_srv(display_srv_t *srv,
     462    ipc_call_t *icall)
     463{
     464        sysarg_t wnd_id;
     465        ipc_call_t call;
     466        char *caption;
     467        size_t size;
     468        errno_t rc;
     469
     470        wnd_id = ipc_get_arg1(icall);
     471
     472        if (!async_data_write_receive(&call, &size)) {
     473                async_answer_0(&call, EREFUSED);
     474                async_answer_0(icall, EREFUSED);
     475                return;
     476        }
     477
     478        caption = calloc(size + 1, 1);
     479        if (caption == NULL) {
     480                async_answer_0(&call, ENOMEM);
     481                async_answer_0(icall, ENOMEM);
     482                return;
     483        }
     484
     485        rc = async_data_write_finalize(&call, caption, size);
     486        if (rc != EOK) {
     487                free(caption);
     488                async_answer_0(&call, rc);
     489                async_answer_0(icall, rc);
     490                return;
     491        }
     492
     493        if (srv->ops->window_set_caption == NULL) {
     494                free(caption);
     495                async_answer_0(icall, ENOTSUP);
     496                return;
     497        }
     498
     499        rc = srv->ops->window_set_caption(srv->arg, wnd_id, caption);
     500        async_answer_0(icall, rc);
     501        free(caption);
    403502}
    404503
     
    424523        /* Transfer event data */
    425524        if (!async_data_read_receive(&call, &size)) {
     525                async_answer_0(&call, EREFUSED);
    426526                async_answer_0(icall, EREFUSED);
    427527                return;
     
    458558        /* Transfer information */
    459559        if (!async_data_read_receive(&call, &size)) {
     560                async_answer_0(&call, EREFUSED);
    460561                async_answer_0(icall, EREFUSED);
    461562                return;
     
    530631                        display_window_resize_srv(srv, &call);
    531632                        break;
     633                case DISPLAY_WINDOW_MINIMIZE:
     634                        display_window_minimize_srv(srv, &call);
     635                        break;
    532636                case DISPLAY_WINDOW_MAXIMIZE:
    533637                        display_window_maximize_srv(srv, &call);
     
    538642                case DISPLAY_WINDOW_SET_CURSOR:
    539643                        display_window_set_cursor_srv(srv, &call);
     644                        break;
     645                case DISPLAY_WINDOW_SET_CAPTION:
     646                        display_window_set_caption_srv(srv, &call);
    540647                        break;
    541648                case DISPLAY_GET_EVENT:
Note: See TracChangeset for help on using the changeset viewer.