⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pal.cpp

📁 iptux是linux下面能实现类似windows里面飞鸽传书的功能
💻 CPP
字号:
//// C++ Implementation: Pal//// Description:////// Author: Jally <jallyx@163.com>, (C) 2008//// Copyright: See COPYING file that comes with this distribution////#include "Pal.h"#include "Control.h"#include "Command.h"#include "UdpData.h"#include "RecvFile.h"#include "DialogPeer.h"#include "Log.h"#include "support.h"#include "baling.h"#include "utils.h" Pal::Pal():ipv4(0), version(NULL), packetn(0), user(NULL),host(NULL), name(NULL), ad(NULL), sign(NULL), iconfile(NULL),encode(NULL), flags(0), dialog(NULL), mypacketn(0), reply(true){	extern Control ctr;	record = gtk_text_buffer_new(ctr.table);}Pal::~Pal(){	SendExit();	free(version);	free(user);	free(host);	free(name);	free(ad);	free(sign);	free(iconfile);	free(encode);	if (dialog)		gtk_widget_destroy(((DialogPeer *) dialog)->dialog);	g_object_unref(record);}// //trans 是否转换编码,true 必须;false 情况而定void Pal::CreateInfo(in_addr_t ip, const char *msg, size_t size, bool trans){	extern Control ctr;	char *ptr;	ipv4 = ip;	if (!IptuxGetIcon(msg, size))		iconfile = Strdup(ctr.palicon);	if (!IptuxGetEncode(msg, size))		encode = Strdup(ctr.encode);	if (trans || !FLAG_ISSET(flags, 0))		ptr = transfer_encode(msg, ctr.encode, false);	else		ptr = Strdup(msg);	version = iptux_get_section_string(ptr, 0);	packetn = 0;	user = iptux_get_section_string(ptr, 2);	host = iptux_get_section_string(ptr, 3);	name = ipmsg_get_attach(ptr, 5);	free(ptr);	FLAG_SET(flags, 1);}void Pal::UpdateInfo(const char *msg, size_t size, bool trans){	extern Control ctr;	char *ptr;	bool cpt;	if (!FLAG_ISSET(flags, 2)) {		cpt = FLAG_ISSET(flags, 0);		ptr = iconfile;		if (IptuxGetIcon(msg, size))			free(ptr);		ptr = encode;		if (IptuxGetEncode(msg, size))			free(ptr);		if (cpt)	//如果以前兼容,则此次也兼容			FLAG_SET(flags, 0);	}	if (trans || !FLAG_ISSET(flags, 0))		ptr = transfer_encode(msg, ctr.encode, false);	else		ptr = Strdup(msg);	free(version);	version = iptux_get_section_string(ptr, 0);	packetn = 0;	free(user);	user = iptux_get_section_string(ptr, 2);	free(host);	host = iptux_get_section_string(ptr, 3);	if (!FLAG_ISSET(flags, 2)) {		free(name);		name = ipmsg_get_attach(ptr, 5);	}	free(ptr);	FLAG_SET(flags, 1);}void Pal::SetPalmodelValue(GtkTreeModel * model, GtkTreeIter * iter){	extern Control ctr;	GdkPixbuf *pixbuf;	char buf[MAX_BUF], ipstr[INET_ADDRSTRLEN];	pixbuf = gdk_pixbuf_new_from_file_at_size(iconfile,						  MAX_ICONSIZE, MAX_ICONSIZE,						  NULL);	if (!pixbuf)		pixbuf = gdk_pixbuf_new_from_file_at_size(ctr.palicon,							  MAX_ICONSIZE,							  MAX_ICONSIZE, NULL);	inet_ntop(AF_INET, &ipv4, ipstr, INET_ADDRSTRLEN);	snprintf(buf, MAX_BUF, "%s\n%s", name, ipstr);	gtk_tree_store_set(GTK_TREE_STORE(model), iter, 0, pixbuf, 2, buf, 3,			   ctr.font, 4, TRUE, 6, FALSE, 7, this, -1);	if (pixbuf)		g_object_unref(pixbuf);}bool Pal::CheckReply(uint32_t packetno, bool install){	if (install) {		mypacketn = packetno;		reply = false;		return true;	}	if (reply || mypacketn > packetno)		return true;	return false;}void Pal::BufferInsertData(GSList *chiplist, enum BELONG_TYPE type){	switch (type) {	case PAL:		gdk_threads_enter();		BufferInsertPal(chiplist);		gdk_threads_leave();		break;	case SELF:		BufferInsertSelf(chiplist);		break;	case ERROR:		gdk_threads_enter();		BufferInsertError();		gdk_threads_leave();		break;	default:		break;	}}//是否已经将消息存放在缓冲区中bool Pal::RecvMessage(const char *msg){	extern UdpData udt;	uint32_t packetno;	GSList *chiplist;	GList *tmp;	char *ptr;	packetno = iptux_get_dec_number(msg, 1);	if (packetno <= packetn)		return false;	packetn = packetno;	ptr = ipmsg_get_attach(msg, 5);	if (!ptr)		return true;	chiplist = g_slist_append(NULL, new ChipData(STRING, ptr));	BufferInsertData(chiplist, PAL);	g_slist_foreach(chiplist, remove_foreach, GINT_TO_POINTER(CHIPDATA));	g_slist_free(chiplist);	if (!dialog) {		tmp = (GList *) udt.PalGetMsgPos(this);		if (!tmp) {			pthread_mutex_lock(&udt.mutex);			g_queue_push_tail(udt.msgqueue, this);			pthread_mutex_unlock(&udt.mutex);		}	}	return true;}bool Pal::RecvAskShared(const char *msg){	uint32_t packetno;	packetno = iptux_get_dec_number(msg, 1);	if (packetno <= packetn)		return false;	packetn = packetno;	return true;}bool Pal::RecvIcon(const char *msg, size_t size){	char file[MAX_PATHBUF];	size_t len;	int fd;	if (FLAG_ISSET(flags, 2) || (len = strlen(msg) + 1) >= size)		return false;	snprintf(file, MAX_PATHBUF, "%s/.iptux/%x.ic", getenv("HOME"), ipv4);	if ((fd = Open(file, O_WRONLY | O_CREAT | O_TRUNC, 0644)) == -1)		return false;	Write(fd, msg + len, size - len);	close(fd);	free(iconfile);	iconfile = Strdup(file);	return true;}void Pal::RecvReply(const char *msg){	uint32_t oldpacket;	oldpacket = iptux_get_dec_number(msg, 5);	if (oldpacket == mypacketn)		reply = true;}void Pal::RecvFile(const char *msg, size_t size){	struct recvfile_para *para;	para = (struct recvfile_para *)Malloc(sizeof(struct recvfile_para));	para->data = this;	para->msg = Strndup(msg, size + 2);	memcpy(para->msg + size, "\0\0", 2);	//防止搜索超越合法区域	thread_create(ThreadFunc(RecvFile::RecvEntry), para, false);}void Pal::RecvSign(const char *msg){	char *ptr;	ptr = ipmsg_get_attach(msg, 5);	if (!FLAG_ISSET(flags, 0)) {		sign = transfer_encode(ptr, encode, false);		free(ptr);	} else		sign = ptr;}void Pal::RecvAdPic(const char *path){	ad = Strdup(path);}void Pal::RecvMsgPic(const char *path){	GSList *chiplist;	chiplist = g_slist_append(NULL, new ChipData(PICTURE, Strdup(path)));	BufferInsertData(chiplist, PAL);	g_slist_foreach(chiplist, remove_foreach, GINT_TO_POINTER(CHIPDATA));	g_slist_free(chiplist);}void Pal::SendAnsentry(){	extern struct interactive inter;	Command cmd;	cmd.SendAnsentry(inter.udpsock, this);}void Pal::SendReply(const char *msg){	extern struct interactive inter;	Command cmd;	uint32_t packetno;	packetno = iptux_get_dec_number(msg, 1);	cmd.SendReply(inter.udpsock, this, packetno);}void Pal::SendExit(){	extern struct interactive inter;	Command cmd;	cmd.SendExit(inter.udpsock, this);}//是否成功获得头像文件bool Pal::IptuxGetIcon(const char *msg, size_t size){	char file[MAX_PATHBUF], *ptr;	size_t len;	len = strlen(msg) + 1;	if (len >= size)		return false;	ptr = my_getline(msg + len);	snprintf(file, MAX_PATHBUF, __ICON_DIR "/%s", ptr);	free(ptr);	if (access(file, F_OK) != 0)		return false;	iconfile = Strdup(file);	return true;}//是否成功获得系统编码bool Pal::IptuxGetEncode(const char *msg, size_t size){	const char *ptr;	size_t len;	FLAG_CLR(flags, 0);	if ((len = strlen(msg) + 1) >= size ||	    (len += strlen(msg + len) + 1) >= size)		return false;	ptr = msg + len;	while (*ptr && !isalnum(*ptr))		ptr++;	if (*ptr == '\0')		return false;	FLAG_SET(flags, 0);	encode = Strdup(ptr);	return true;}void Pal::BufferInsertPal(GSList *chiplist){	extern Log mylog;	char *ptr, *pptr;	GSList *tmp;	GdkPixbuf *pixbuf;	GtkTextIter iter;	ptr = getformattime("%s", name);	gtk_text_buffer_get_end_iter(record, &iter);	gtk_text_buffer_insert_with_tags_by_name(record, &iter, ptr,				-1, "blue", NULL);	g_free(ptr);	tmp = chiplist;	while (tmp) {		gtk_text_buffer_get_end_iter(record, &iter);		ptr = ((ChipData*)tmp->data)->data;		switch (((ChipData*)tmp->data)->type) {		case STRING:			if (!FLAG_ISSET(flags, 0))				pptr = transfer_encode(ptr, encode, false);			else				pptr = Strdup(ptr);			gtk_text_buffer_insert(record, &iter, pptr, -1);			mylog.CommunicateLog(this, pptr);			free(pptr);			break;		case PICTURE:			pixbuf = gdk_pixbuf_new_from_file(ptr, NULL);			if (pixbuf) {				gtk_text_buffer_insert_pixbuf(record, &iter, pixbuf);				g_object_unref(pixbuf);			}			break;		default:			break;		}		tmp = tmp->next;	}	gtk_text_buffer_get_end_iter(record, &iter);	gtk_text_buffer_insert(record, &iter, "\n", -1);	ViewScroll();}void Pal::BufferInsertSelf(GSList *chiplist){	extern Control ctr;	extern Log mylog;	GdkPixbuf *pixbuf;	GtkTextIter iter;	GSList *tmp;	char *ptr;	ptr = getformattime("%s", ctr.myname);	gtk_text_buffer_get_end_iter(record, &iter);	gtk_text_buffer_insert_with_tags_by_name(record, &iter, ptr,						 -1, "green", NULL);	g_free(ptr);	tmp = chiplist;	while (tmp) {		gtk_text_buffer_get_end_iter(record, &iter);		ptr = ((ChipData*)tmp->data)->data;		switch (((ChipData*)tmp->data)->type) {		case STRING:			gtk_text_buffer_insert(record, &iter, ptr, -1);			mylog.CommunicateLog(NULL, ptr);			break;		case PICTURE:			pixbuf = gdk_pixbuf_new_from_file(ptr, NULL);			if (pixbuf) {				gtk_text_buffer_insert_pixbuf(record, &iter, pixbuf);				g_object_unref(pixbuf);			}			break;		default:			break;		}		tmp = tmp->next;	}	gtk_text_buffer_get_end_iter(record, &iter);	gtk_text_buffer_insert(record, &iter, "\n", -1);	ViewScroll();}void Pal::BufferInsertError(){	static char *tips[2] = {		_("<tips>"),		_("It isn't online,or not receive the data packet!\n")	};	extern Log mylog;	GtkTextIter iter;	char *ptr;	ptr = getformattime("%s", tips[0]);	gtk_text_buffer_get_end_iter(record, &iter);	gtk_text_buffer_insert_with_tags_by_name(record, &iter, ptr,						 -1, "red", NULL);	g_free(ptr);	gtk_text_buffer_get_end_iter(record, &iter);	gtk_text_buffer_insert_with_tags_by_name(record, &iter, tips[1],						 -1, "red", NULL);	mylog.SystemLog(_("send data packet fail!"));	ViewScroll();}void Pal::ViewScroll(){	GtkTextIter start, end;	GtkTextMark *mark;	if (!dialog)		return;	gtk_text_buffer_get_bounds(record, &start, &end);	if (gtk_text_iter_equal(&start, &end))		return;	mark = gtk_text_buffer_create_mark(record, NULL, &end, FALSE);	gtk_text_view_scroll_to_mark(GTK_TEXT_VIEW				     (((DialogPeer *) dialog)->scroll), mark,				     0.0, TRUE, 0.0, 0.0);	gtk_text_buffer_delete_mark(record, mark);	gtk_window_present(GTK_WINDOW(((DialogPeer *) dialog)->dialog));}void Pal::SendFeature(gpointer data){	extern struct interactive inter;	extern Control ctr;	char path[MAX_PATHBUF];	Command cmd;	int sock;	if (strncmp(ctr.myicon, __ICON_DIR, strlen(__ICON_DIR)))		cmd.SendMyIcon(inter.udpsock, data);	if (ctr.sign && *ctr.sign != '\0')		cmd.SendMySign(inter.udpsock, data);	snprintf(path, MAX_PATHBUF, "%s/.iptux/myad", getenv("HOME"));	if (access(path, F_OK) == 0) {		sock = Socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);		cmd.SendSublayer(sock, data, IPTUX_ADPICOPT, path);		close(sock);	}}

⌨️ 快捷键说明

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