/** * 请求处理函数;这个函数是comm_recv_request_and_send_respond()里面的回调函数 **/ si_t request_handler(addr_t body, si_t detail_type, union respond* respond_ptr, addr_t arg) { char* str = NULL; si_t ret = 0; si_t fd = 0; union message msg; struct queue* message_queue_ptr = (struct queue*)arg; switch(detail_type) { /** * 测试普通情况:发送的请求实质是客户端需要远程调用一个函数 **/ case REQUEST_TYPE_DRAW_LINE: ret = request_call_by_draw_line(body, fake_engine_draw_line); respond_set_normal(respond_ptr, RESPOND_TYPE_DRAW_LINE, ret); EGUI_PRINT_INFO("recieved draw line request!"); break; /** * 测试特殊情况:发送请求后产生消息,消息先放到队列中,稍后回处理 **/ case REQUEST_TYPE_REGISTER_WINDOW: /** 读取请求包中的窗口标题和父窗口的句柄 **/ request_get_register_window(body, &fd, &str, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); /** 返回的包是新窗口句柄,此处假设为父窗口句柄+1 **/ ret = fd + 1; respond_set_normal(respond_ptr, RESPOND_TYPE_REGISTER_WINDOW, ret); /** 此外,还会发送给客户端一个激活新窗口的消息 **/ message_set_window_activate(&msg, ret); queue_push(message_queue_ptr, &msg, sizeof(msg)); EGUI_PRINT_INFO("recieved register window request! title = %s", str); break; /** * 测试特殊情况:发送请求要求服务器退出循环 **/ case REQUEST_TYPE_WINDOW_MANAGER_QUIT: ret = EXIT_NUMBER; respond_set_normal(respond_ptr, RESPOND_TYPE_WINDOW_MANAGER_QUIT, 0); EGUI_PRINT_INFO("recived exit request! SERVER EXIT!"); break; default: break; } return ret; }
static si_t _server_lib_handle_graphics_ops(addr_t body, si_t detail_type, union respond* respond_ptr, addr_t app_addr) { /** 存储调用实际操作函数结果的变量 **/ si_t func_ret = 0; /** 存储_server_lib_handle_request()返回值的变量 **/ si_t handler_ret = SELECTER_RETURN_TYPE_CONTINUE; switch(detail_type) { case REQUEST_TYPE_CLEAR: func_ret = request_call_by_clear(body, engine_clear); respond_set_normal(respond_ptr, RESPOND_TYPE_CLEAR, func_ret); break; case REQUEST_TYPE_CLEAR_WHITE: func_ret = request_call_by_clear_white(body, engine_clear_white); respond_set_normal(respond_ptr, RESPOND_TYPE_CLEAR_WHITE, func_ret); break; case REQUEST_TYPE_CLEAR_BLACK: func_ret = request_call_by_clear_black(body, engine_clear_black); respond_set_normal(respond_ptr, RESPOND_TYPE_CLEAR_BLACK, func_ret); break; case REQUEST_TYPE_CPY_AREA: func_ret = request_call_by_cpy_area(body, engine_cpy_area); respond_set_normal(respond_ptr, RESPOND_TYPE_CPY_AREA, func_ret); break; case REQUEST_TYPE_DRAW_ARROW: func_ret = request_call_by_draw_arrow(body, engine_draw_arrow); respond_set_normal(respond_ptr, RESPOND_TYPE_DRAW_ARROW, func_ret); break; case REQUEST_TYPE_DRAW_BITMAP: func_ret = request_call_by_draw_bitmap(body, engine_draw_bitmap); respond_set_normal(respond_ptr, RESPOND_TYPE_DRAW_BITMAP, func_ret); break; case REQUEST_TYPE_DRAW_CIRCLE: func_ret = request_call_by_draw_circle(body, engine_draw_circle); respond_set_normal(respond_ptr, RESPOND_TYPE_DRAW_CIRCLE, func_ret); break; case REQUEST_TYPE_DRAW_ELLIPSE: func_ret = request_call_by_draw_ellipse(body, engine_draw_ellipse); respond_set_normal(respond_ptr, RESPOND_TYPE_DRAW_ELLIPSE, func_ret); break; case REQUEST_TYPE_DRAW_IMG: func_ret = request_call_by_draw_img(body, engine_draw_img); respond_set_normal(respond_ptr, RESPOND_TYPE_DRAW_IMG, func_ret); break; case REQUEST_TYPE_DRAW_LINE: func_ret = request_call_by_draw_line(body, engine_draw_line); respond_set_normal(respond_ptr, RESPOND_TYPE_DRAW_LINE, func_ret); break; case REQUEST_TYPE_DRAW_POINT: func_ret = request_call_by_draw_point(body, engine_draw_point); respond_set_normal(respond_ptr, RESPOND_TYPE_DRAW_POINT, func_ret); break; case REQUEST_TYPE_DRAW_POLYGON: func_ret = request_call_by_draw_polygon(body, engine_draw_polygon); respond_set_normal(respond_ptr, RESPOND_TYPE_DRAW_POLYGON, func_ret); break; case REQUEST_TYPE_DRAW_RECTANGLE: func_ret = request_call_by_draw_rectangle(body, engine_draw_rectangle); respond_set_normal(respond_ptr, RESPOND_TYPE_DRAW_RECTANGLE, func_ret); break; case REQUEST_TYPE_DRAW_X: func_ret = request_call_by_draw_x(body, engine_draw_x); respond_set_normal(respond_ptr, RESPOND_TYPE_DRAW_X, func_ret); break; case REQUEST_TYPE_FILL_ARROW: func_ret = request_call_by_fill_arrow(body, engine_fill_arrow); respond_set_normal(respond_ptr, RESPOND_TYPE_FILL_ARROW, func_ret); break; case REQUEST_TYPE_FILL_CIRCLE: func_ret = request_call_by_fill_circle(body, engine_fill_circle); respond_set_normal(respond_ptr, RESPOND_TYPE_FILL_CIRCLE, func_ret); break; case REQUEST_TYPE_FILL_ELLIPSE: func_ret = request_call_by_fill_ellipse(body, engine_fill_ellipse); respond_set_normal(respond_ptr, RESPOND_TYPE_FILL_ELLIPSE, func_ret); break; case REQUEST_TYPE_FILL_RECTANGLE: func_ret = request_call_by_fill_rectangle(body, engine_fill_rectangle); respond_set_normal(respond_ptr, RESPOND_TYPE_FILL_RECTANGLE, func_ret); break; case REQUEST_TYPE_FILL_X: func_ret = request_call_by_fill_x(body, engine_fill_x); respond_set_normal(respond_ptr, RESPOND_TYPE_FILL_X, func_ret); break; case REQUEST_TYPE_GET_COLOR_LIMIT: { struct color_limit func_ret = {0}; engine_get_color_limit(&func_ret); respond_set_color_limit(respond_ptr, RESPOND_TYPE_GET_COLOR_LIMIT, &func_ret); } break; case REQUEST_TYPE_GET_SCREEN_WIDTH: func_ret = screen_get_width(); respond_set_normal(respond_ptr, RESPOND_TYPE_GET_SCREEN_WIDTH, func_ret); break; case REQUEST_TYPE_GET_SCREEN_HEIGHT: func_ret = screen_get_height(); respond_set_normal(respond_ptr, RESPOND_TYPE_GET_SCREEN_HEIGHT, func_ret); break; case REQUEST_TYPE_GET_COLOR: { struct color* func_ret_ptr = request_call_by_get_color(body, engine_get_color); respond_set_color(respond_ptr, RESPOND_TYPE_GET_COLOR, func_ret_ptr); } break; case REQUEST_TYPE_GET_AREA: { struct rectangle* func_ret_ptr = request_call_by_get_area(body, engine_get_area); respond_set_rectangle(respond_ptr, RESPOND_TYPE_GET_AREA, func_ret_ptr); } break; case REQUEST_TYPE_GET_FONT_WIDTH: func_ret = request_call_by_get_font_width(body, engine_get_font_width); respond_set_normal(respond_ptr, RESPOND_TYPE_GET_FONT_WIDTH, func_ret); break; case REQUEST_TYPE_GET_FONT_HEIGHT: func_ret = request_call_by_get_font_height(body, engine_get_font_height); respond_set_normal(respond_ptr, RESPOND_TYPE_GET_FONT_HEIGHT, func_ret); break; case REQUEST_TYPE_SET_AREA: func_ret = request_call_by_set_area(body, engine_set_area); respond_set_normal(respond_ptr, RESPOND_TYPE_SET_AREA, func_ret); break; case REQUEST_TYPE_SET_COLOR: func_ret = request_call_by_set_color(body, engine_set_color); respond_set_normal(respond_ptr, RESPOND_TYPE_SET_COLOR, func_ret); break; case REQUEST_TYPE_SET_FONT: func_ret = request_call_by_set_font(body, engine_set_font); respond_set_normal(respond_ptr, RESPOND_TYPE_SET_FONT, func_ret); break; case REQUEST_TYPE_SHOW_TEXT: func_ret = request_call_by_show_text(body, engine_show_text); respond_set_normal(respond_ptr, RESPOND_TYPE_SHOW_TEXT, func_ret); break; default: /** * 不是绘制图形类的请求,接下来查看是否为窗口管理类请求 **/ handler_ret = -1; break; } return handler_ret; }
static si_t _server_lib_handle_request(addr_t body, si_t detail_type, union respond* respond_ptr, addr_t app_addr) { /** 存储调用实际操作函数结果的变量 **/ si_t func_ret = 0; /** 存储_server_lib_handle_request()返回值的变量 **/ si_t handler_ret = SELECTER_RETURN_TYPE_CONTINUE; switch(detail_type) { case REQUEST_TYPE_REGISTER_APPLICATION: { si_t video_access_mode = 0, application_type = 0; char* app_name = NULL; request_get_register_application(body, &video_access_mode, &application_type, &app_name, NULL); func_ret = register_application_handler(app_addr, video_access_mode, application_type, app_name); respond_set_normal(respond_ptr, RESPOND_TYPE_REGISTER_APPLICATION, func_ret); } break; case REQUEST_TYPE_CANCEL_APPLICATION: respond_set_normal(respond_ptr, RESPOND_TYPE_CANCEL_APPLICATION, 0); handler_ret = SELECTER_RETURN_TYPE_REMOVE_HANDLER; break; /** * 处理初始化/清理图形设备的请求: * 首先从请求包中获取必要参数, * 接着调用graph模块的函数对图形设备初始化/清理, * 接着将获得的参数和应用程序指针传递给上层的回调函数进行处理 * 最后将上层回调函数的返回值作为回应包的返回值 **/ case REQUEST_TYPE_GRAPHICS_DEVICE_INIT: { si_t gd = request_call_by_graphics_device_init(body, engine_graphics_device_init); func_ret = graphics_device_init_handler(app_addr, gd); respond_set_normal(respond_ptr, RESPOND_TYPE_GRAPHICS_DEVICE_INIT, gd); } break; case REQUEST_TYPE_GRAPHICS_DEVICE_EXIT: { si_t gd = 0; request_get_graphics_device_exit(body, &gd); func_ret = request_call_by_graphics_device_exit(body, engine_graphics_device_exit); func_ret = graphics_device_exit_handler(app_addr, gd); respond_set_normal(respond_ptr, RESPOND_TYPE_GRAPHICS_DEVICE_EXIT, func_ret); } break; /** * 接到window_manager_quit命令 若成功执行则返回退出循环的 **/ case REQUEST_TYPE_WINDOW_MANAGER_QUIT: func_ret = window_manager_exit_handler(app_addr); respond_set_normal(respond_ptr, RESPOND_TYPE_WINDOW_MANAGER_QUIT, func_ret); if(0 == func_ret) { handler_ret = SELECTER_RETURN_TYPE_END; } break; case REQUEST_TYPE_DESKTOP_DIRTY: func_ret = desktop_dirty_handler(app_addr); respond_set_normal(respond_ptr, RESPOND_TYPE_DESKTOP_DIRTY, func_ret); break; case REQUEST_TYPE_UPDATE: { si_t gd = 0; request_get_update(body, &gd); func_ret = update_handler(app_addr, gd); respond_set_normal(respond_ptr, RESPOND_TYPE_UPDATE, func_ret); } break; case REQUEST_TYPE_ACTIVATE_WINDOW: { si_t window_descripter = 0; request_get_activate_window(body, &window_descripter); func_ret = activate_window_handler(app_addr, window_descripter); respond_set_normal(respond_ptr, RESPOND_TYPE_ACTIVATE_WINDOW, func_ret); } break; case REQUEST_TYPE_REGISTER_WINDOW: { si_t window_descripter = 0, x_axis = 0, y_axis = 0, x_size = 0, y_size = 0, maxable = 0, minable = 0, model = 0; char* title = NULL; request_get_register_window(body, &window_descripter, &title, NULL, &x_axis, &y_axis, &x_size, &y_size, &minable, &maxable, &model); func_ret = register_window_handler(app_addr, window_descripter, title, x_axis, y_axis, x_size, y_size, minable, maxable, model); respond_set_normal(respond_ptr, RESPOND_TYPE_REGISTER_WINDOW, func_ret); } break; case REQUEST_TYPE_CANCEL_WINDOW: { si_t window_descripter = 0; request_get_cancel_window(body, &window_descripter); func_ret = cancel_window_handler(app_addr, window_descripter); respond_set_normal(respond_ptr, RESPOND_TYPE_CANCEL_WINDOW, func_ret); } break; case REQUEST_TYPE_MOVE_WINDOW: { si_t window_descripter = 0, x_axis = 0, y_axis = 0; request_get_move_window(body, &window_descripter, &x_axis, &y_axis); func_ret = move_window_handler(app_addr, window_descripter, x_axis, y_axis); respond_set_normal(respond_ptr, RESPOND_TYPE_MOVE_WINDOW, func_ret); } break; case REQUEST_TYPE_RESIZE_WINDOW: { si_t window_descripter = 0, x_axis = 0, y_axis = 0, x_size = 0, y_size = 0; request_get_resize_window(body, &window_descripter, &x_axis, &y_axis, &x_size, &y_size); func_ret = resize_window_handler(app_addr, window_descripter, x_axis, y_axis, x_size, y_size); respond_set_normal(respond_ptr, RESPOND_TYPE_RESIZE_WINDOW, func_ret); } break; case REQUEST_TYPE_MINIMIZE_WINDOW: { si_t window_descripter = 0; request_get_minimize_window(body, &window_descripter); func_ret = minimize_window_handler(app_addr, window_descripter); respond_set_normal(respond_ptr, RESPOND_TYPE_MINIMIZE_WINDOW, func_ret); } break; case REQUEST_TYPE_MAXIMIZE_WINDOW: { si_t window_descripter = 0; struct rectangle area; request_get_maximize_window(body, &window_descripter); func_ret = maximize_window_handler(app_addr, window_descripter, &area); respond_set_rectangle(respond_ptr, RESPOND_TYPE_MAXIMIZE_WINDOW, &area); } break; case REQUEST_TYPE_RESTORE_WINDOW: { si_t window_descripter = 0; struct rectangle area; request_get_restore_window(body, &window_descripter, &area.x, &area.y, &area.width, &area.height); func_ret = restore_window_handler(app_addr, window_descripter, &area); respond_set_normal(respond_ptr, RESPOND_TYPE_RESTORE_WINDOW, func_ret); } break; case REQUEST_TYPE_GET_WINDOW_TITLE: { si_t window_descripter = 0; char* title = NULL; request_get_window_title(body, &window_descripter); get_window_title(app_addr, window_descripter, &title); respond_set_va(respond_ptr, RESPOND_TYPE_GET_WINDOW_TITLE, title, strlen(title) + 1); } break; } return handler_ret; }