コード例 #1
0
ファイル: test_server.c プロジェクト: FangKuangKuang/egui
/**
 * 请求处理函数;这个函数是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;
}
コード例 #2
0
ファイル: server_lib.c プロジェクト: puresmw/egui
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;
}
コード例 #3
0
ファイル: server_lib.c プロジェクト: puresmw/egui
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;
}