Ejemplo n.º 1
0
extern si_t send_window_activate_message(struct egui_uds* uds_ptr, union message* msg, si_t window_descripter)
{
    union message msg_to_be_sent;
    copy_message(msg, &msg_to_be_sent);
    message_set_window_activate(&msg_to_be_sent, window_descripter);
    return comm_send_message(uds_ptr, &msg_to_be_sent);
}
Ejemplo n.º 2
0
/**
 * 请求处理函数;这个函数是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;
}