socket.c

来自「CS架构的多平台的GUI系统」· C语言 代码 · 共 612 行 · 第 1/2 页

C
612
字号
/***************************************************************************    begin                : Sun Feb 2 2003    copyright            : (C) 2003 - 2005 by Alper Akcan    email                : distchx@yahoo.com ***************************************************************************//*************************************************************************** *                                                                         * *   This program is free software; you can redistribute it and/or modify  * *   it under the terms of the GNU Lesser General Public License as        * *   published by the Free Software Foundation; either version 2.1 of the  * *   License, or (at your option) any later version.                       * *                                                                         * ***************************************************************************/#include <sys/stat.h>#include "../lib/xynth_.h"#include "server.h"#if !defined(IPC_UDS) && !defined(IPC_TCP) && !defined(IPC_PIPE)	#error "You must select at least one of IPC_UDS, IPC_TCP, IPC_PIPE"#endif#define s_socket_recv(a, b, c)	if (s_socket_api_recv(a, b, c) != c) { return -1; }#define s_socket_send(a, b, c)	if (s_socket_api_send(a, b, c) != c) { return -1; }int s_server_socket_listen_new (int id){	int i;	int j;	s_pollfd_t *ip;	s_pollfd_t *jp;	s_socket_recv(server->client[id].soc, &server->client[id].type, sizeof(S_WINDOW));	s_socket_recv(server->client[id].soc, &server->client[id].pid, sizeof(int));	s_socket_recv(server->client[id].soc, &server->client[id].buf, sizeof(s_rect_t));	/* just to close childs before their parent, socket listen order is in pollfds list order.	 */	if (server->client[id].pid >= 0) {		ip = s_pollfd_find(server->window, server->client[id].soc);		jp = s_pollfd_find(server->window, server->client[server->client[id].pid].soc);		if ((ip != NULL) && (jp != NULL)) {			i = s_list_get_pos(server->window->pollfds->list, ip);			j = s_list_get_pos(server->window->pollfds->list, jp);			if (j < i) {				s_list_remove(server->window->pollfds->list, i);				s_list_add(server->window->pollfds->list, ip, j);			}		}	}	s_server_window_new(id);	s_socket_send(server->client[id].soc, &server->client[id].buf, sizeof(s_rect_t));	s_socket_send(server->client[id].soc, &server->client[id].win, sizeof(s_rect_t));	return 0;}int s_server_socket_listen_show (int id){	s_server_pri_set(SURFACE_FOCUS, id);	return 0;}int s_server_socket_listen_title (int id){	int i;	s_socket_recv(server->client[id].soc, &i, sizeof(int));	s_free(server->client[id].title.str);	server->client[id].title.str = (char *) s_malloc(sizeof(char) * (i + 1));	s_socket_recv(server->client[id].soc, server->client[id].title.str, sizeof(char) * (i + 1));	s_server_window_title(id, server->client[id].title.str);	if (s_server_id_pri(id) >= 0) {		s_rect_t *rtmp;		s_list_t *diff;		if (server->mh) {			server->mh = 0;		}		s_server_window_calculate(id);		diff = (s_list_t *) s_malloc(sizeof(s_list_t));		s_list_init(diff);		s_rect_difference(&(server->client[id].win), &(server->client[id].buf), diff);		while (!s_list_eol(diff, 0)) {			rtmp = (s_rect_t *) s_list_get(diff, 0);			s_server_pri_set(SURFACE_REDRAW, rtmp);			s_list_remove(diff, 0);			s_free(rtmp);		}		s_free(diff);		if (!(server->client[id].type & WINDOW_TEMP)) {			for (i = 0; i < S_CLIENTS_MAX; i++) {				if (server->client[i].type & WINDOW_DESKTOP) {					s_server_socket_request(SOC_DATA_DESKTOP, i);				}			}		}	}	return 0;}int s_server_socket_listen_display (int id){        int len;	unsigned int addr;	s_socket_send(server->client[id].soc, &server->window->surface->bytesperpixel, sizeof(int));	s_socket_send(server->client[id].soc, &server->window->surface->bitsperpixel, sizeof(int));	s_socket_send(server->client[id].soc, &server->window->surface->colors, sizeof(int));	s_socket_send(server->client[id].soc, &server->window->surface->blueoffset, sizeof(int));	s_socket_send(server->client[id].soc, &server->window->surface->greenoffset, sizeof(int));	s_socket_send(server->client[id].soc, &server->window->surface->redoffset, sizeof(int));	s_socket_send(server->client[id].soc, &server->window->surface->bluelength, sizeof(int));	s_socket_send(server->client[id].soc, &server->window->surface->greenlength, sizeof(int));	s_socket_send(server->client[id].soc, &server->window->surface->redlength, sizeof(int));	addr = (unsigned int) server->window->surface->linear_buf;	s_socket_send(server->client[id].soc, &addr, sizeof(unsigned int));	addr = (unsigned int) server->window->surface->matrix;	s_socket_send(server->client[id].soc, &addr, sizeof(unsigned int));	s_socket_send(server->client[id].soc, &server->window->surface->linear_mem_size, sizeof(unsigned int));	s_socket_send(server->client[id].soc, &server->window->surface->linear_mem_base, sizeof(unsigned int));	s_socket_send(server->client[id].soc, &server->window->surface->linear_buf_width, sizeof(int));	s_socket_send(server->client[id].soc, &server->window->surface->linear_buf_pitch, sizeof(int));	s_socket_send(server->client[id].soc, &server->window->surface->linear_buf_height, sizeof(int));	s_socket_send(server->client[id].soc, &server->window->surface->shm_mid, sizeof(int));	s_socket_send(server->client[id].soc, &id, sizeof(int));	s_socket_send(server->client[id].soc, &server->window->surface->shm_sid, sizeof(int));	s_socket_send(server->client[id].soc, &server->window->surface->need_expose, sizeof(int));	len = strlen(server->driver->device);	s_socket_send(server->client[id].soc, &len, sizeof(int));	s_socket_send(server->client[id].soc, server->driver->device, sizeof(char) * (len + 1));	len = strlen(server->driver->driver);	s_socket_send(server->client[id].soc, &len, sizeof(int));	s_socket_send(server->client[id].soc, server->driver->driver, sizeof(char) * (len + 1));	return 0;}int s_server_socket_listen_configure (int id){        int pri;        s_rect_t new;        S_WINDOW form;	pri = s_server_id_pri(id);	s_socket_recv(server->client[id].soc, &form, sizeof(S_WINDOW));	s_socket_recv(server->client[id].soc, &new, sizeof(s_rect_t));	s_socket_recv(server->client[id].soc, &server->client[id].resizeable, sizeof(int));	s_socket_recv(server->client[id].soc, &server->client[id].alwaysontop, sizeof(int));	if (form & NO_FORM) {		new.x += (server->client[id].win.x - server->client[id].buf.x);		new.y += (server->client[id].win.y - server->client[id].buf.y);		new.w += (server->client[id].win.w - server->client[id].buf.w);		new.h += (server->client[id].win.h - server->client[id].buf.h);	}	s_server_window_move_resize(id, &new);	return 0;}int s_server_socket_listen_desktop (int id){	int id_;	s_socket_recv(server->client[id].soc, &id_, sizeof(int));	if (s_server_id_pri(id_) > 0) {		s_server_pri_set(SURFACE_FOCUS, id_);	}	return 0;}int s_server_socket_listen_expose (int id){	s_rect_t coor;	s_socket_recv(server->client[id].soc, &coor, sizeof(s_rect_t));	s_server_surface_update(&coor);	return 0;}int s_server_socket_listen_stream (int id){	s_stream_t stream;	s_socket_recv(server->client[id].soc, &stream, sizeof(s_stream_t));	stream.buf = (char *) s_malloc(stream.blen);	s_socket_recv(server->client[id].soc, stream.buf, stream.blen);	bpp_putbox_o(server->window->surface, id, stream.rect.x, stream.rect.y, stream.rect.w, stream.rect.h, stream.buf, stream.rect.w);	s_free(stream.buf);	s_server_surface_update(&stream.rect);	return 0;}int s_server_socket_listen_close (int id){	if (server->client[id].type & WINDOW_DESKTOP) {		s_server_quit(server->window);	}	return 0;}int s_server_socket_listen_hide (int id){	s_server_window_hide_id(id);	return 0;}int s_server_socket_listen_window_close (int soc){        s_pollfd_t *pfd;	int id = s_server_id_find(soc);	s_socket_api_close(soc);	if (id >= 0) {		if ((pfd = s_pollfd_find(server->window, soc)) == NULL) {			debugf(DSER | DFAT, "Could not find any pollfd entry for Client[%d].soc[%d]", id, soc);		}		s_pollfd_del(server->window, pfd);		s_pollfd_uninit(pfd);		debugf(DSER, "Client[%d] closed the connection", id);		s_server_id_del(id);		s_server_pri_del(id);	}	return 0;}int s_server_socket_listen_parse (int soc){	S_SOC_DATA soc_data;	struct pollfd pollfd;	int id = s_server_id_find(soc);	if (id == -1) {		return -1;	}	pollfd.fd = soc;	pollfd.events = POLLIN;	pollfd.revents = 0;	if ((s_socket_api_poll(&pollfd, 1, 0) <= 0) ||	    (pollfd.revents != POLLIN)) {		goto end;	}	s_socket_recv(soc, &soc_data, sizeof(soc_data));	switch (soc_data) {		case SOC_DATA_NEW:			return s_server_socket_listen_new(id);		case SOC_DATA_SHOW:			return s_server_socket_listen_show(id);		case SOC_DATA_TITLE:			return s_server_socket_listen_title(id);		case SOC_DATA_DISPLAY:			return s_server_socket_listen_display(id);		case SOC_DATA_FORMDRAW:			s_server_window_form(id, &server->client[id].win);			return 0;		case SOC_DATA_CONFIGURE:		case SOC_DATA_CONFIGURE_NOFORM:			return s_server_socket_listen_configure(id);		case SOC_DATA_DESKTOP:			return s_server_socket_listen_desktop(id);		case SOC_DATA_EXPOSE:			return s_server_socket_listen_expose(id);		case SOC_DATA_HIDE:			return s_server_socket_listen_hide(id);		case SOC_DATA_STREAM:			return s_server_socket_listen_stream(id);		case SOC_DATA_CLOSE:			return s_server_socket_listen_close(id);		case SOC_DATA_EVENT:		case SOC_DATA_NOTHING:			break;	}end:	return 0;}int s_server_socket_client_in_f (s_window_t *window, int soc){	return s_server_socket_listen_parse(soc);}int s_server_socket_client_ierr_f (s_window_t *window, int soc){	return s_server_socket_listen_window_close(soc);}int s_server_socket_listen_accept (int soc){        int s;	int id;	s_pollfd_t *pfd;

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?