00001
00009 #include "client.h"
00010
00016 void end_program(GtkWidget *widget1, gpointer data)
00017 {
00018 shutdown(socket_file_descriptor, 2);
00019 gtk_main_quit();
00020 }
00021
00027 void onExit(GtkWidget *window, gpointer data)
00028 {
00029 exit(0);
00030 }
00031
00037 void add_widget_with_label(GtkContainer *box, gchar *caption, GtkWidget *widget)
00038 {
00039 GtkWidget *label = gtk_label_new(caption);
00040 GtkWidget *hbox = gtk_hbox_new(TRUE, 4);
00041
00042 gtk_container_add(GTK_CONTAINER (hbox), label);
00043 gtk_container_add(GTK_CONTAINER (hbox), widget);
00044 gtk_container_add(box, hbox);
00045 }
00046
00050 void close_properly()
00051 {
00052 shutdown(socket_file_descriptor, 2);
00053 exit(0);
00054 }
00055
00062 void msg_func(GtkWidget *widget1, gpointer data)
00063 {
00064 int return_value;
00065 sprintf(msg, "%s", gtk_entry_get_text(GTK_ENTRY(entry)));
00066 gtk_entry_set_text( GTK_ENTRY(entry), "");
00067
00068 return_value = write(socket_file_descriptor, msg, strlen(msg));
00069 if(return_value < 0)
00070 {
00071 fprintf(stderr, "write() failed.");
00072 close_properly();
00073 }
00074 }
00075
00082 void connect_server(GtkWidget *widget1, gpointer data)
00083 {
00084 struct sockaddr_in server_address;
00085 struct client_data rcvd_blk;
00086
00087 int character_read;
00088 int return_value;
00089 int success = 1;
00090 char err_msg[BUFFER];
00091 GtkWidget *dialog;
00092
00093
00094 socket_file_descriptor = socket(AF_INET, SOCK_STREAM, 0);
00095
00096
00097 if(socket_file_descriptor < 0)
00098 {
00099 strcpy(err_msg, "Can't open socket.\n");
00100 success = 0;
00101 }
00102
00103 if(success == 1)
00104 {
00105 bzero(&server_address, sizeof(server_address));
00106 server_address.sin_family = AF_INET;
00107 server_address.sin_port = htons(atoi(gtk_entry_get_text(GTK_ENTRY(entry_port))));
00108 sprintf(ip, "%s", gtk_entry_get_text(GTK_ENTRY(entry_ipaddress)));
00109
00110 if(inet_pton(AF_INET, ip, &server_address.sin_addr) <= 0)
00111 {
00112 strcpy(err_msg, "The supplied ipv4 address is incorrect.\n");
00113 success = 0;
00114 }
00115 }
00116
00117
00118 if((success == 1) && connect(socket_file_descriptor, (struct sockaddr *) &server_address, sizeof(server_address)) < 0)
00119 {
00120 strcpy(err_msg, "Can't connect to server\n");
00121 success = 0;
00122 }
00123
00124
00125 if(success == 1)
00126 {
00127 sprintf(nick, "%s", gtk_entry_get_text(GTK_ENTRY(entry_nick)));
00128 return_value = write(socket_file_descriptor, nick, strlen(nick));
00129 if(return_value < 0)
00130 {
00131 strcpy(err_msg, "Can't connect to server...");
00132 success = 0;
00133 }
00134 }
00135
00136
00137 if((success == 1) && (character_read = read(socket_file_descriptor, &rcvd_blk, sizeof(struct client_data))) <= 0)
00138 {
00139 strcpy(err_msg, "Can't connect to server as nick might already exist or server LIMIT EXCEEDED\n");
00140 success = 0;
00141 }
00142
00143
00144 if(success == 1)
00145 {
00146 while(rcvd_blk.fd >= 0)
00147 {
00148 gtk_list_store_append(list_store, &t_iter);
00149 gtk_list_store_set (list_store, &t_iter, 0, rcvd_blk.nick, 1, rcvd_blk.ip, -1);
00150 read(socket_file_descriptor, &rcvd_blk, sizeof(struct client_data));
00151 }
00152 gtk_main_quit();
00153 }
00154 else
00155 {
00156
00157 dialog = gtk_message_dialog_new (NULL, GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_INFO, GTK_BUTTONS_OK,"%s", err_msg);
00158 gtk_dialog_run (GTK_DIALOG (dialog));
00159 gtk_widget_destroy (dialog);
00160 }
00161 }
00162
00167 void * start_client(void *arg)
00168 {
00169 char temp_line[BUFFER];
00170 int character_read;
00171 int isDuplicate;
00172 struct transmit_unit rcvd_blk;
00173 gboolean valid;
00174 gchar *nick_name;
00175
00176
00177 sprintf(temp_line, "Connected to IP %s\n", ip);
00178 gtk_text_buffer_insert_with_tags_by_name(buffer, &iter, temp_line, strlen(temp_line), "blue_fg", "lmarg", NULL);
00179 printf("connected..\n");
00180
00181 while(1)
00182 {
00183
00184 if((character_read = read(socket_file_descriptor, &rcvd_blk, sizeof(struct transmit_unit))) <= 0)
00185 {
00186 printf("Client Closed\n");
00187 close_properly();
00188 }
00189 else
00190 {
00191 if(strcmp(rcvd_blk.msg, "") != 0)
00192 {
00193 sprintf(temp_line, "[%s] <%s>:%s\n", rcvd_blk.time, rcvd_blk.nick, rcvd_blk.msg);
00194 gtk_text_buffer_insert_with_tags_by_name(buffer, &iter, temp_line, strlen(temp_line), "blue_fg", "lmarg", NULL);
00195 }
00196
00197 if(strcasecmp(rcvd_blk.msg, "disconnected..") == 0)
00198 {
00199
00200 valid = gtk_tree_model_get_iter_first(GTK_TREE_MODEL(list_store), &t_iter);
00201 while(valid)
00202 {
00203 gtk_tree_model_get(GTK_TREE_MODEL(list_store), &t_iter, 0, &nick_name, -1);
00204 if(strcmp(nick_name, rcvd_blk.nick) == 0)
00205 {
00206 gtk_list_store_remove(list_store, &t_iter);
00207 g_free(nick_name);
00208 break;
00209 }
00210 valid = gtk_tree_model_iter_next(GTK_TREE_MODEL(list_store), &t_iter);
00211 g_free(nick_name);
00212 }
00213 }
00214
00215
00216 if(strcasecmp(rcvd_blk.msg, "connected..") == 0)
00217 {
00218 isDuplicate = 0;
00219 valid = gtk_tree_model_get_iter_first(GTK_TREE_MODEL(list_store), &t_iter);
00220 while(valid)
00221 {
00222 gtk_tree_model_get(GTK_TREE_MODEL(list_store), &t_iter, 0, &nick_name, -1);
00223 if(strcmp(nick_name, rcvd_blk.nick) == 0)
00224 {
00225 isDuplicate = 1;
00226 g_free(nick_name);
00227 break;
00228 }
00229 valid = gtk_tree_model_iter_next(GTK_TREE_MODEL(list_store), &t_iter);
00230 g_free(nick_name);
00231 }
00232
00233 if(isDuplicate == 0)
00234 {
00235 gtk_list_store_append(list_store, &t_iter);
00236 gtk_list_store_set (list_store, &t_iter, 0, rcvd_blk.nick, 1, rcvd_blk.ip, -1);
00237 }
00238 }
00239 }
00240 }
00241
00242 pthread_exit(0);
00243
00244 }
00245
00255 int main(int argc, char *argv[])
00256 {
00257 int return_value;
00258 pthread_t child1;
00259 GtkWidget *window;
00260 GtkWidget *window1;
00261
00262
00263 GtkWidget *mainbox;
00264 GtkWidget *subbox;
00265 GtkWidget *view1;
00266 GtkWidget *view2;
00267 GtkWidget *scrolled_window1;
00268 GtkWidget *scrolled_window2;
00269 GtkCellRenderer *renderer;
00270
00271 GtkWidget *button_connect;
00272 GtkWidget *vbox;
00273
00274 gtk_init(&argc, &argv);
00275
00276
00277 window1 = gtk_window_new(GTK_WINDOW_TOPLEVEL);
00278 gtk_window_set_default_size(GTK_WINDOW(window1), 300, 200);
00279 g_signal_connect(GTK_OBJECT(window1), "delete_event", GTK_SIGNAL_FUNC(onExit), NULL);
00280
00281
00282
00283 view2 = gtk_tree_view_new ();
00284 renderer = gtk_cell_renderer_text_new ();
00285 gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (view2), -1, "Nick", renderer, "text", 0, NULL);
00286
00287 renderer = gtk_cell_renderer_text_new ();
00288 gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (view2), -1, "Ip Address", renderer, "text", 1, NULL);
00289
00290 list_store = gtk_list_store_new (2, G_TYPE_STRING, G_TYPE_STRING);
00291 gtk_tree_view_set_model (GTK_TREE_VIEW (view2), GTK_TREE_MODEL(list_store));
00292
00293
00294 vbox = gtk_vbox_new(TRUE, 5);
00295 entry_ipaddress = gtk_entry_new();
00296 entry_nick = gtk_entry_new();
00297 entry_port = gtk_entry_new();
00298 button_connect = gtk_button_new_with_label("Connect");
00299
00300 add_widget_with_label(GTK_CONTAINER(vbox), "IP Address : ", entry_ipaddress);
00301 add_widget_with_label(GTK_CONTAINER(vbox), "Nick Name : ", entry_nick);
00302 add_widget_with_label(GTK_CONTAINER(vbox), "Port : ", entry_port);
00303 gtk_box_pack_start(GTK_BOX(vbox), button_connect, TRUE, FALSE, 5);
00304 gtk_container_add(GTK_CONTAINER(window1), vbox);
00305 g_signal_connect(GTK_OBJECT(button_connect), "clicked", GTK_SIGNAL_FUNC(connect_server), NULL);
00306
00307 gtk_widget_show_all(window1);
00308 gtk_main();
00309
00310
00311 gtk_widget_destroy (window1);
00312
00313
00314 window=gtk_window_new(GTK_WINDOW_TOPLEVEL);
00315 gtk_window_set_title(GTK_WINDOW(window), "LAN-Messenger (Client)");
00316 gtk_window_set_default_size(GTK_WINDOW(window),800,400);
00317 g_signal_connect(G_OBJECT(window),"delete_event",G_CALLBACK(end_program),NULL);
00318
00319
00320
00321 mainbox = gtk_hbox_new (TRUE, 2);
00322
00323 scrolled_window1=gtk_scrolled_window_new(NULL, NULL);
00324 gtk_widget_set_usize(scrolled_window1, 250, 150);
00325
00326 view1 = gtk_text_view_new();
00327 gtk_text_view_set_editable(GTK_TEXT_VIEW(view1), FALSE);
00328 buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(view1));
00329 gtk_text_buffer_get_iter_at_offset(buffer, &iter, 0);
00330 gtk_text_buffer_create_tag(buffer, "blue_fg", "foreground", "blue", NULL);
00331 gtk_text_buffer_create_tag(buffer, "lmarg", "left_margin", 5, NULL);
00332
00333
00334 gtk_scrolled_window_add_with_viewport( GTK_SCROLLED_WINDOW(scrolled_window1), view1);
00335
00336 subbox = gtk_vbox_new(TRUE, 2);
00337
00338 entry = gtk_entry_new_with_max_length(50);
00339 gtk_signal_connect(GTK_OBJECT(entry), "activate", GTK_SIGNAL_FUNC(msg_func), entry);
00340
00341
00342 gtk_box_pack_start(GTK_BOX(subbox), scrolled_window1, TRUE, TRUE, 0);
00343 gtk_box_pack_start (GTK_BOX (subbox), entry, TRUE, TRUE, 2);
00344
00345
00346
00347 scrolled_window2=gtk_scrolled_window_new(NULL, NULL);
00348 gtk_widget_set_usize(scrolled_window2, 250, 150);
00349 gtk_scrolled_window_add_with_viewport( GTK_SCROLLED_WINDOW(scrolled_window2), view2);
00350
00351
00352 gtk_box_pack_start (GTK_BOX (mainbox), subbox, TRUE, TRUE, 2);
00353 gtk_box_pack_start (GTK_BOX (mainbox), scrolled_window2, TRUE, TRUE, 0);
00354
00355 gtk_container_add (GTK_CONTAINER (window), mainbox);
00356 gtk_widget_show_all (window);
00357
00358
00359 return_value = pthread_create(&child1, NULL, start_client, NULL);
00360 if(return_value !=0)
00361 {
00362 perror("Thread 1 creation failed");
00363 exit(EXIT_FAILURE);
00364 }
00365
00366 gtk_main();
00367 return 0;
00368 }