udpdata.cpp

来自「iptux是linux下面能实现类似windows里面飞鸽传书的功能」· C++ 代码 · 共 505 行

CPP
505
字号
//// C++ Implementation: UdpData//// Description:////// Author: Jally <jallyx@163.com>, (C) 2008//// Copyright: See COPYING file that comes with this distribution////#include "UdpData.h"#include "SendFile.h"#include "Control.h"#include "Pal.h"#include "output.h"#include "baling.h"#include "utils.h"const char *UdpData::localip[] = {	"10.0.0.0",	"10.255.255.255",	"172.16.0.0",	"172.31.255.255",	"192.168.0.0",	"192.168.255.255",	"Others",	NULL}; UdpData::UdpData():pallist(NULL), msgqueue(NULL), pal_model(NULL){	pthread_mutex_init(&mutex, NULL);}UdpData::~UdpData(){	pthread_mutex_lock(&mutex);	g_slist_foreach(pallist, remove_foreach, GINT_TO_POINTER(PALINFO));	g_slist_free(pallist);	g_queue_clear(msgqueue);	g_queue_free(msgqueue);	pthread_mutex_unlock(&mutex);	pthread_mutex_destroy(&mutex);	g_object_unref(pal_model);}void UdpData::InitSelf(){	msgqueue = g_queue_new();	pal_model = CreatePalModel();	InitPalModel();}void UdpData::UdpDataEntry(in_addr_t ipv4, char *msg, size_t size){	extern Control ctr;	uint32_t commandno;	Pal *pal;	if (FLAG_ISSET(ctr.flags, 1) && (pal = (Pal *) Ipv4GetPal(ipv4))	    && FLAG_ISSET(pal->flags, 3))		return;	commandno = iptux_get_dec_number(msg, 4);	switch (GET_MODE(commandno)) {	case IPMSG_BR_ENTRY:		SomeoneEntry(ipv4, msg, size);		break;	case IPMSG_BR_EXIT:		SomeoneExit(ipv4, msg, size);		break;	case IPMSG_ANSENTRY:		SomeoneAnsentry(ipv4, msg, size);		break;	case IPMSG_BR_ABSENCE:		SomeoneAbsence(ipv4, msg, size);		break;	case IPMSG_SENDMSG:		SomeoneSendmsg(ipv4, msg, size);		break;	case IPMSG_RECVMSG:		SomeoneRecvmsg(ipv4, msg, size);		break;	case IPTUX_ASKSHARED:		SomeoneAskShared(ipv4, msg, size);		break;	case IPTUX_SENDICON:		SomeoneSendIcon(ipv4, msg, size);		break;	case IPTUX_SENDSIGN:		SomeoneSendSign(ipv4, msg, size);		break;	default:		break;	}}void UdpData::SublayerEntry(gpointer data, uint32_t command, const char *path){	Pal *pal;	pal = (Pal*)data;	switch (GET_OPT(command)) {	case IPTUX_ADPICOPT:		pal->RecvAdPic(path);		break;	case IPTUX_MSGPICOPT:		pal->RecvMsgPic(path);		break;	}}gpointer UdpData::Ipv4GetPal(in_addr_t ipv4){	extern UdpData udt;	GSList *tmp;	Pal *pal;	pthread_mutex_lock(&udt.mutex);	tmp = udt.pallist;	while (tmp) {		pal = (Pal *) tmp->data;		if (ipv4 == pal->ipv4) {			pthread_mutex_unlock(&udt.mutex);			return pal;		}		tmp = tmp->next;	}	pthread_mutex_unlock(&udt.mutex);	return NULL;}gpointer UdpData::Ipv4GetPalPos(in_addr_t ipv4){	extern UdpData udt;	GSList *tmp;	Pal *pal;	pthread_mutex_lock(&udt.mutex);	tmp = udt.pallist;	while (tmp) {		pal = (Pal *) tmp->data;		if (ipv4 == pal->ipv4) {			pthread_mutex_unlock(&udt.mutex);			return tmp;		}		tmp = tmp->next;	}	pthread_mutex_unlock(&udt.mutex);	return NULL;}gpointer UdpData::PalGetMsgPos(pointer data){	extern UdpData udt;	GList *tmp;	guint count, length;	pthread_mutex_lock(&udt.mutex);	tmp = udt.msgqueue->head;	length = udt.msgqueue->length;	count = 0;	while (count < length) {		if (tmp->data == data) {			pthread_mutex_unlock(&udt.mutex);			return tmp;		}		tmp = tmp->next;		count++;	}	pthread_mutex_unlock(&udt.mutex);	return NULL;}void UdpData::Ipv4GetParent(in_addr_t ipv4, GtkTreeIter * iter){	extern UdpData udt;	in_addr_t ip1, ip2;	uint8_t count;	gtk_tree_model_get_iter_first(udt.pal_model, iter);	count = 0, ipv4 = ntohl(ipv4);	do {		if (!udt.localip[count << 1] || !udt.localip[(count << 1) + 1])			break;		inet_pton(AF_INET, udt.localip[count << 1], &ip1);		ip1 = ntohl(ip1);		inet_pton(AF_INET, udt.localip[(count << 1) + 1], &ip2);		ip2 = ntohl(ip2);		data_order(&ip1, &ip2);		if (ip1 <= ipv4 && ip2 >= ipv4)			break;		count++;	} while (gtk_tree_model_iter_next(udt.pal_model, iter));}bool UdpData::PalGetModelIter(gpointer pal, GtkTreeIter * parent,			      GtkTreeIter * iter){	extern UdpData udt;	gpointer data;	if (!gtk_tree_model_iter_children(udt.pal_model, iter, parent))		return false;	do {		gtk_tree_model_get(udt.pal_model, iter, 7, &data, -1);		if (pal == data)			return true;	} while (gtk_tree_model_iter_next(udt.pal_model, iter));	return false;}//Panel 8,0 pixbuf,1 expand,2 nickname,3 font,4 visible,5 markup,6 visible,7 data/lastGtkTreeModel *UdpData::CreatePalModel(){	GtkTreeStore *model;	model = gtk_tree_store_new(8, GDK_TYPE_PIXBUF, G_TYPE_BOOLEAN,				   G_TYPE_STRING, G_TYPE_STRING, G_TYPE_BOOLEAN,				   G_TYPE_STRING, G_TYPE_BOOLEAN,				   G_TYPE_POINTER);	return GTK_TREE_MODEL(model);}void UdpData::InitPalModel(){	extern Control ctr;	gchar ipstr[32], buf[MAX_BUF];	GtkTreeIter iter;	GdkPixbuf *pixbuf;	uint8_t count;	pixbuf = gdk_pixbuf_new_from_file(__TIP_DIR "/hide.png", NULL);	count = 0;	while (localip[count << 1]) {		if (localip[(count << 1) + 1])			snprintf(ipstr, 32, "%s~%s", localip[count << 1],				 localip[(count << 1) + 1]);		else			snprintf(ipstr, 32, "%s", localip[count << 1]);		snprintf(buf, MAX_BUF,			 "<span style=\"italic\" underline=\"single\" size=\"small\" "			 "foreground=\"#52B838\" weight=\"bold\">%s</span>",			 ipstr);		gtk_tree_store_append(GTK_TREE_STORE(pal_model), &iter, NULL);		gtk_tree_store_set(GTK_TREE_STORE(pal_model), &iter, 0, pixbuf,				   1, FALSE, 4, FALSE, 5, buf, 6, TRUE, 7, NULL,				   -1);		if (!localip[(count << 1) + 1])			break;		count++;	}}void UdpData::SomeoneLost(in_addr_t ipv4, char *msg, size_t size){	extern Control ctr;	Pal *pal;	pal = new Pal;	pthread_mutex_lock(&mutex);	pallist = g_slist_append(pallist, pal);	pthread_mutex_unlock(&mutex);	pal->ipv4 = ipv4;	pal->iconfile = Strdup(ctr.palicon);	pal->encode = Strdup(ctr.encode);	pal->name = Strdup(_("mysterious"));	FLAG_SET(pal->flags, 2);	SomeoneAbsence(ipv4, msg, size);}void UdpData::SomeoneEntry(in_addr_t ipv4, char *msg, size_t size){	GtkTreeIter iter, parent;	Pal *pal;	pal = (Pal *) Ipv4GetPal(ipv4);	gdk_threads_enter();	if (!pal) {		pal = new Pal;		pthread_mutex_lock(&mutex);		pallist = g_slist_append(pallist, pal);		pthread_mutex_unlock(&mutex);		pal->CreateInfo(ipv4, msg, size, true);		Ipv4GetParent(ipv4, &parent);		gtk_tree_store_append(GTK_TREE_STORE(pal_model), &iter,				      &parent);	} else {		pal->UpdateInfo(msg, size, true);		Ipv4GetParent(ipv4, &parent);		if (!PalGetModelIter(pal, &parent, &iter))			gtk_tree_store_append(GTK_TREE_STORE(pal_model), &iter,					      &parent);	}	pal->SetPalmodelValue(pal_model, &iter);	gdk_threads_leave();	pal->SendAnsentry();	if (FLAG_ISSET(pal->flags, 0))		thread_create(ThreadFunc(Pal::SendFeature), pal, false);}void UdpData::SomeoneExit(in_addr_t ipv4, char *msg, size_t size){	GtkTreeIter iter, parent;	GSList *tmp1;	GList *tmp2;	tmp1 = (GSList *) Ipv4GetPalPos(ipv4);	if (!tmp1)		return;	gdk_threads_enter();	Ipv4GetParent(ipv4, &parent);	if (PalGetModelIter(tmp1->data, &parent, &iter))		gtk_tree_store_remove(GTK_TREE_STORE(pal_model), &iter);	gdk_threads_leave();	tmp2 = (GList *) PalGetMsgPos(tmp1->data);	if (tmp2) {		pthread_mutex_lock(&mutex);		g_queue_delete_link(msgqueue, tmp2);		pthread_mutex_unlock(&mutex);	}	FLAG_CLR(((Pal *) tmp1->data)->flags, 1);}void UdpData::SomeoneAnsentry(in_addr_t ipv4, char *msg, size_t size){	Pal *pal;	SomeoneAbsence(ipv4, msg, size);	if (!(pal = (Pal *) Ipv4GetPal(ipv4)))		return;	if (FLAG_ISSET(pal->flags, 0))		thread_create(ThreadFunc(Pal::SendFeature), pal, false);}void UdpData::SomeoneAbsence(in_addr_t ipv4, char *msg, size_t size){	GtkTreeIter iter, parent;	Pal *pal;	pal = (Pal *) Ipv4GetPal(ipv4);	gdk_threads_enter();	if (!pal) {		pal = new Pal;		pthread_mutex_lock(&mutex);		pallist = g_slist_append(pallist, pal);		pthread_mutex_unlock(&mutex);		pal->CreateInfo(ipv4, msg, size, false);		Ipv4GetParent(ipv4, &parent);		gtk_tree_store_append(GTK_TREE_STORE(pal_model), &iter,				      &parent);	} else {		pal->UpdateInfo(msg, size, false);		Ipv4GetParent(ipv4, &parent);		if (!PalGetModelIter(pal, &parent, &iter))			gtk_tree_store_append(GTK_TREE_STORE(pal_model), &iter,					      &parent);	}	pal->SetPalmodelValue(pal_model, &iter);	gdk_threads_leave();}void UdpData::SomeoneSendmsg(in_addr_t ipv4, char *msg, size_t size){	uint32_t commandno;	bool flag;	Pal *pal;	pal = (Pal *) Ipv4GetPal(ipv4);	if (!pal) {		SomeoneLost(ipv4, msg, size);		if (!(pal = (Pal *) Ipv4GetPal(ipv4)))			return;	}	flag = pal->RecvMessage(msg);	commandno = iptux_get_dec_number(msg, 4);	if (commandno & IPMSG_SENDCHECKOPT)		pal->SendReply(msg);	if (flag && (commandno & IPMSG_FILEATTACHOPT))		pal->RecvFile(msg, size);}void UdpData::SomeoneRecvmsg(in_addr_t ipv4, char *msg, size_t size){	Pal *pal;	pal = (Pal *) Ipv4GetPal(ipv4);	if (!pal)		return;	pal->RecvReply(msg);}void UdpData::SomeoneAskShared(in_addr_t ipv4, char *msg, size_t size){	Pal *pal;	pal = (Pal *) Ipv4GetPal(ipv4);	if (!pal)		return;	if (!pal->RecvAskShared(msg))		return;	thread_create(ThreadFunc(ThreadAskShared), pal, false);}void UdpData::SomeoneSendIcon(in_addr_t ipv4, char *msg, size_t size){	GtkTreeIter iter, parent;	Pal *pal;	bool flag;	pal = (Pal *) Ipv4GetPal(ipv4);	if (!pal)		return;	flag = pal->RecvIcon(msg, size);	gdk_threads_enter();	if (flag) {		Ipv4GetParent(ipv4, &parent);		PalGetModelIter(pal, &parent, &iter);		pal->SetPalmodelValue(pal_model, &iter);	}	gdk_threads_leave();}void UdpData::SomeoneSendSign(in_addr_t ipv4, char *msg, size_t size){	Pal *pal;	pal = (Pal *) Ipv4GetPal(ipv4);	if (!pal) {		SomeoneLost(ipv4, msg, size);		if (!(pal = (Pal *) Ipv4GetPal(ipv4)))			return;	}	pal->RecvSign(msg);}void UdpData::ThreadAskShared(gpointer data){	extern Control ctr;	extern SendFile sfl;	if (!FLAG_ISSET(ctr.flags, 0) || AllowAskShared(data))		sfl.SendSharedInfo(data);}bool UdpData::AllowAskShared(gpointer data){	extern struct interactive inter;	GtkWidget *dialog, *box;	GtkWidget *label, *image;	char ipstr[INET_ADDRSTRLEN], *ptr;	bool result;	gdk_threads_enter();	dialog = gtk_dialog_new_with_buttons(_("Request for shared resources"),					     GTK_WINDOW(inter.window),					     GTK_DIALOG_MODAL, _("Agree"),					     GTK_RESPONSE_ACCEPT, _("Refuse"),					     GTK_RESPONSE_CANCEL, NULL);	gtk_dialog_set_default_response(GTK_DIALOG(dialog),					GTK_RESPONSE_ACCEPT);	box = create_box(FALSE);	gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), box, TRUE, TRUE,			   0);	image = gtk_image_new_from_stock(GTK_STOCK_DIALOG_AUTHENTICATION,					 GTK_ICON_SIZE_DIALOG);	gtk_widget_show(image);	gtk_box_pack_start(GTK_BOX(box), image, FALSE, FALSE, 0);	inet_ntop(AF_INET, &((Pal *) data)->ipv4, ipstr, INET_ADDRSTRLEN);	ptr =	    g_strdup_printf	    (_	     ("The pal (%s)[%s]\nis requesting for your shared resources,\nagree or not?"),	     ((Pal *) data)->name, ipstr);	label = create_label(ptr);	free(ptr);	gtk_label_set_line_wrap(GTK_LABEL(label), TRUE);	gtk_label_set_line_wrap_mode(GTK_LABEL(label), PANGO_WRAP_WORD_CHAR);	gtk_box_pack_start(GTK_BOX(box), label, TRUE, TRUE, 4);	result = (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT);	gtk_widget_destroy(dialog);	gdk_threads_leave();	return result;}

⌨️ 快捷键说明

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