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