1 //
2 // DF Netplay Plugin
3 //
4 // Based on netSock 0.2 by linuzappz.
5 // The Plugin is free source code.
6 //
7 
8 #include <stdio.h>
9 #include <stdlib.h>
10 #include <string.h>
11 
12 #include <gdk/gdk.h>
13 #include <gtk/gtk.h>
14 #include <signal.h>
15 
16 #include "cfg.c"
17 
cfgSysMessage(const char * fmt,...)18 void cfgSysMessage(const char *fmt, ...) {
19 	GtkWidget *MsgDlg;
20 	va_list list;
21 	char msg[512];
22 
23 	va_start(list, fmt);
24 	vsprintf(msg, fmt, list);
25 	va_end(list);
26 
27 	if (msg[strlen(msg) - 1] == '\n') msg[strlen(msg) - 1] = 0;
28 
29 	MsgDlg = gtk_message_dialog_new(NULL, GTK_DIALOG_MODAL,
30 		GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE, _("NetPlay"));
31 	gtk_message_dialog_format_secondary_text(GTK_MESSAGE_DIALOG(MsgDlg), "%s", msg);
32 
33 	gtk_dialog_run(GTK_DIALOG(MsgDlg));
34 	gtk_widget_destroy(MsgDlg);
35 }
36 
CFGconfigure()37 void CFGconfigure() {
38 	cfgSysMessage(_("Nothing to configure"));
39 }
40 
41 #ifdef __linux__
42 
43 #include <sys/ioctl.h>
44 #include <linux/if.h>
45 
46 #define MAXINTERFACES 16
47 
sockGetIP(char * IPAddress)48 void sockGetIP(char *IPAddress) {
49 	int fd, intrface;
50 	struct ifreq buf[MAXINTERFACES];
51 	struct ifconf ifc;
52 	struct sockaddr_in addr;
53 
54 	strcpy(IPAddress, "127.0.0.1");
55 
56 	if ((fd = socket(AF_INET, SOCK_DGRAM, 0)) >= 0) {
57 		ifc.ifc_len = sizeof(buf);
58 		ifc.ifc_buf = (caddr_t)buf;
59 		if (!ioctl(fd, SIOCGIFCONF, (char *)&ifc)) {
60 			intrface = ifc.ifc_len / sizeof(struct ifreq);
61 			while (intrface-- > 0) {
62 				if (!(ioctl(fd, SIOCGIFADDR, (char *)&buf[intrface]))) {
63 					memcpy(&addr, &(buf[intrface].ifr_addr), sizeof(addr));
64 					strcpy(IPAddress, inet_ntoa(addr.sin_addr));
65 					break;
66 				}
67 			}
68 		}
69 		close(fd);
70 	}
71 }
72 
73 #else
74 
sockGetIP(char * IPAddress)75 void sockGetIP(char *IPAddress) {
76 	struct hostent *host;
77 	char str[256];
78 
79 	gethostname(str, 256);
80 	host = gethostbyname(str);
81 
82 	if (host != NULL)
83 		strcpy(IPAddress, inet_ntoa(*((struct in_addr *)host->h_addr_list[0])));
84 	else strcpy(IPAddress, "127.0.0.1");
85 }
86 
87 #endif
88 
OnCopyIP(GtkWidget * widget,gpointer user_data)89 void OnCopyIP(GtkWidget *widget, gpointer user_data) {
90 	char str[256];
91 
92 	sockGetIP(str);
93 	gtk_clipboard_set_text(gtk_clipboard_get(GDK_SELECTION_CLIPBOARD), str, strlen(str));
94 	cfgSysMessage(_("IP %s"), str);
95 }
96 
CFGopen()97 long CFGopen() {
98 	GtkBuilder *builder;
99 	GtkWidget *widget, *MainWindow;
100 	char buf[256];
101 
102 	LoadConf();
103 
104 	builder = gtk_builder_new();
105 
106 	if (!gtk_builder_add_from_resource(builder, "/org/pcsxr/dfnet/dfnet.ui", NULL)) {
107 		g_warning("We could not load the interface!");
108 		return 0;
109 	}
110 
111 	MainWindow = GTK_WIDGET(gtk_builder_get_object(builder, "dlgStart"));
112 	gtk_window_set_title(GTK_WINDOW(MainWindow), _("NetPlay"));
113 
114 	widget = GTK_WIDGET(gtk_builder_get_object(builder, "btnCopyIP"));
115 	g_signal_connect_data(G_OBJECT(widget), "clicked",
116 		G_CALLBACK(OnCopyIP), NULL, NULL, G_CONNECT_AFTER);
117 
118 	widget = GTK_WIDGET(gtk_builder_get_object(builder, "tbServerIP"));
119 	gtk_entry_set_text(GTK_ENTRY(widget), conf.ipAddress);
120 
121 	widget = GTK_WIDGET(gtk_builder_get_object(builder, "tbPort"));
122 	sprintf(buf, "%d", conf.PortNum);
123 	gtk_entry_set_text(GTK_ENTRY(widget), buf);
124 
125 	if (conf.PlayerNum == 1) {
126 		widget = GTK_WIDGET(gtk_builder_get_object(builder, "rbServer"));
127 		gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), TRUE);
128 	} else {
129 		widget = GTK_WIDGET(gtk_builder_get_object(builder, "rbClient"));
130 		gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), TRUE);
131 	}
132 
133 	if (gtk_dialog_run(GTK_DIALOG(MainWindow)) == GTK_RESPONSE_OK) {
134 		widget = GTK_WIDGET(gtk_builder_get_object(builder, "tbServerIP"));
135 		strcpy(conf.ipAddress, gtk_entry_get_text(GTK_ENTRY(widget)));
136 
137 		widget = GTK_WIDGET(gtk_builder_get_object(builder, "tbPort"));
138 		conf.PortNum = atoi(gtk_entry_get_text(GTK_ENTRY(widget)));
139 
140 		widget = GTK_WIDGET(gtk_builder_get_object(builder, "rbServer"));
141 		if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget))) {
142 			conf.PlayerNum = 1;
143 		} else {
144 			conf.PlayerNum = 2;
145 		}
146 
147 		SaveConf();
148 		gtk_widget_destroy(MainWindow);
149 		return 1;
150 	}
151 
152 	gtk_widget_destroy(MainWindow);
153 
154 	return 0;
155 }
156 
OnWaitDialog_Abort()157 void OnWaitDialog_Abort() {
158 	kill(getppid(), SIGUSR2);
159 }
160 
CFGwait()161 void CFGwait() {
162 	GtkWidget *WaitDlg;
163 
164 	WaitDlg = gtk_message_dialog_new(NULL, GTK_DIALOG_MODAL, GTK_MESSAGE_INFO,
165 		GTK_BUTTONS_CANCEL, _("Waiting for connection..."));
166 
167 	gtk_message_dialog_format_secondary_text(GTK_MESSAGE_DIALOG(WaitDlg),
168 		_("The Client should now Start a Connection, waiting..."));
169 
170 	gtk_dialog_run(GTK_DIALOG(WaitDlg));
171 	gtk_widget_destroy(WaitDlg);
172 
173 	OnWaitDialog_Abort();
174 }
175 
CFGpause()176 long CFGpause() {
177 	return 0;
178 }
179 
CFGabout()180 void CFGabout() {
181 	const char *authors[]= {"linuzappz <linuzappz@hotmail.com>", "Wei Mingzhi <whistler_wmz@users.sf.net>", NULL};
182 	GtkWidget *widget;
183 
184 	widget = gtk_about_dialog_new();
185 	gtk_about_dialog_set_logo_icon_name (GTK_ABOUT_DIALOG(widget), "help-about");
186 	gtk_about_dialog_set_program_name(GTK_ABOUT_DIALOG(widget), "Socket NetPlay Driver");
187 	gtk_about_dialog_set_version(GTK_ABOUT_DIALOG(widget), "0.21");
188 	gtk_about_dialog_set_authors(GTK_ABOUT_DIALOG(widget), authors);
189 	gtk_about_dialog_set_website(GTK_ABOUT_DIALOG(widget), "http://www.codeplex.com/pcsxr/");
190 
191 	gtk_dialog_run(GTK_DIALOG(widget));
192 	gtk_widget_destroy(widget);
193 }
194 
CFGmessage(char * args[],int num)195 long CFGmessage(char *args[], int num) {
196 	char msg[512];
197 
198 	memset(msg, 0, sizeof(msg));
199 	while (num) {
200 		strcat(msg, *args); strcat(msg, " ");
201 		num--; args++;
202 	}
203 	cfgSysMessage(msg);
204 
205 	return 0;
206 }
207 
main(int argc,char * argv[])208 int main(int argc, char *argv[]) {
209 #ifdef ENABLE_NLS
210 	setlocale(LC_ALL, "");
211 	bindtextdomain(GETTEXT_PACKAGE, LOCALE_DIR);
212 	bind_textdomain_codeset(GETTEXT_PACKAGE, "UTF-8");
213 	textdomain(GETTEXT_PACKAGE);
214 #endif
215 
216 	gtk_init(&argc, &argv);
217 
218 	if (argc < 2) {
219 		printf ("Usage: cfgDFNet {about | configure | open | wait | pause | message}\n");
220 		return 0;
221 	}
222 
223 	if (strcmp(argv[1], "about") != 0 &&
224 		strcmp(argv[1], "configure") != 0 &&
225 		strcmp(argv[1], "open") != 0 &&
226 		strcmp(argv[1], "wait") != 0 &&
227 		strcmp(argv[1], "pause") != 0 &&
228 		strcmp(argv[1], "message") != 0) {
229 		printf ("Usage: cfgDFNet {about | configure | open | wait | pause | message}\n");
230 		return 0;
231 	}
232 
233 	if(argc > 1) {
234 		if (!strcmp(argv[1], "configure")) {
235 			CFGconfigure();
236 		} else if (!strcmp(argv[1], "about")) {
237 			CFGabout();
238 		} else if (!strcmp(argv[1], "open")) {
239 			return CFGopen();
240 		} else if (!strcmp(argv[1], "wait")) {
241 			CFGwait();
242 		} else if (!strcmp(argv[1], "pause")) {
243 			return CFGpause();
244 		} else if (!strcmp(argv[1], "message")) {
245 			CFGmessage(&argv[2], argc - 2);
246 		}
247 	}
248 
249 	return 0;
250 }
251