00001 #include <stdio.h>
00002 #include <unistd.h>
00003 #include <stdlib.h>
00004 #include <strings.h>
00005 #include <sys/socket.h>
00006 #include <sys/types.h>
00007 #include <arpa/inet.h>
00008 #include <netinet/in.h>
00009 #include <gtk/gtk.h>
00010 #include <glib.h>
00011 #include<string.h>
00012 #include <netdb.h>
00013 #include <signal.h>
00014 #include <poll.h>
00015 #include <pthread.h>
00016 #include <fcntl.h>
00017
00018 #define BUFFER 4096
00019 #define MSG_SIZE 80
00020 #define MAX_CLIENTS 95
00021 #define MYPORT 7400
00022
00023
00024 void display_row ();
00025 void LoginPage();
00026 void insertCombo();
00027 void chat_Page();
00028 void friends_Page();
00029 void newUser();
00030 void connectToServer();
00031
00035 char loginName[100],password[100],type[100];
00036 char history[500];
00037 char hostname[MSG_SIZE],Rmsg[MSG_SIZE];
00038 int friends[100],n,num=0;
00039 char fList[100][100];
00040 int opened[100];
00041 char pFriend[100];
00042 int fp,size=150,r;
00043 int status=-1;
00044 gchar file[100];
00045 GList *glist2=NULL;
00046
00047
00048 int sockfd;
00049 int myID;
00050 int port;
00051
00052
00053
00054 GtkWidget *windowSendPhoto;
00055 GtkWidget *label1;
00056 GtkWidget *windowNewPhoto;
00057 GtkWidget *image;
00058 GtkWidget *textMsg;
00059 GtkWidget *combo;
00060 GtkListStore *store;
00061 GtkTreeIter iter;
00062 GtkCellRenderer *cell;
00063 GtkWidget *window5;
00064 GtkWidget *window4;
00065 GtkWidget *Login;
00066 GtkWidget *window;
00067 GtkWidget *window2;
00068 GtkWidget *textName;
00069 GtkWidget *text2;
00070 GtkWidget *text3;
00071 GtkWidget *text4;
00072 GtkWidget *comboQuestion;
00073 GtkWidget *text6;
00074 GtkWidget *label;
00075 GtkWidget *window3;
00076 GtkTextIter iter2[20];
00077 GtkTextBuffer *buffer[20];
00078 GtkWidget *text1;
00079 GtkWidget *windowView;
00080 GtkWidget *window10;
00081 GtkTextBuffer *bufferView;
00082 GtkTextIter iterView;
00083
00084
00089 gint destroyapp (GtkWidget *widget, gpointer gdata)
00090 {
00091 g_print ("Quitting...\n");
00092 gtk_main_quit();
00093 return (FALSE);
00094 }
00095
00102 void createButton_clicked(GtkWidget *widget, gpointer gdata)
00103 {
00104 int n=1;
00105 int return_value;
00106 char name[100],password1[100],password2[100],question[1000],answer[100],statement[1000],loginName[100],msg[200];
00107 GtkWidget *dialog;
00108
00109
00110 connectToServer();
00111 strcpy(loginName,gtk_entry_get_text(GTK_ENTRY(textName)));
00112 strcpy(name,gtk_entry_get_text(GTK_ENTRY(text2)));
00113 strcpy(password1,gtk_entry_get_text(GTK_ENTRY(text3)));
00114 strcpy(password2,gtk_entry_get_text(GTK_ENTRY(text4)));
00115 strcpy(question,gtk_entry_get_text(GTK_ENTRY(GTK_COMBO(comboQuestion)->entry)));
00116 strcpy(answer,gtk_entry_get_text(GTK_ENTRY(text6)));
00117
00118 if(strcmp(password1,password2)!=0)
00119 {
00120 printf("\n Plz check the password");
00121 gtk_entry_set_text(GTK_ENTRY(textName),"");
00122 gtk_entry_set_text(GTK_ENTRY(text2),"");
00123 gtk_entry_set_text(GTK_ENTRY(text3),"");
00124 gtk_entry_set_text(GTK_ENTRY(text4),"");
00125 gtk_entry_set_text(GTK_ENTRY(text6),"");
00126 dialog = gtk_message_dialog_new (NULL,GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_INFO, GTK_BUTTONS_OK,"enter password correctly\n %s",type);
00127 gtk_dialog_run (GTK_DIALOG (dialog));
00128 gtk_widget_destroy (dialog);
00129
00130 }
00131 else
00132 {
00133 gtk_widget_hide(window2);
00134 while(1)
00135 {
00136 sprintf(statement,"NEWUSER&&insert into Login values(%d,'%s','%s','%s','%s','%s');",n++,name,loginName,password1,question,answer);
00137
00138 return_value = write(sockfd, statement, strlen(statement));
00139 if(return_value < 0)
00140 {
00141 perror("write() failed.");
00142 exit(1);
00143 }
00144 while(1)
00145 {
00146 return_value=read(sockfd,statement,20);
00147 if(return_value>0)
00148 {
00149
00150 if(strstr(statement,"success")!=NULL)
00151 {
00152 printf("\n New user created\n");
00153 sprintf(msg, "XClient is shutting down@@||");
00154 write(sockfd, msg, strlen(msg));
00155 LoginPage();
00156 return;
00157 }
00158 else if(strstr(statement,"Login")!=NULL)
00159 {
00160 printf("\n login name already exists:");
00161 newUser();
00162
00163 }
00164 else
00165 break;
00166 }
00167 }
00168
00169 }
00170
00171
00172 }
00173 }
00174
00182 void newUser()
00183 {
00184 gtk_widget_hide(window);
00185 GtkWidget *label1;
00186 GtkWidget *label2;
00187 GtkWidget *label3;
00188 GtkWidget *label4;
00189 GtkWidget *label5;
00190 GtkWidget *label6;
00191 GtkWidget *createButton;
00192 GtkWidget *vbox;
00193 GtkWidget *table;
00194 GList *glist1=NULL;
00195
00196
00197 window2 = gtk_window_new(GTK_WINDOW_TOPLEVEL);
00198 gtk_window_set_default_size(GTK_WINDOW(window2),340,100);
00199 gtk_window_set_title(GTK_WINDOW(window2), "New user ");
00200
00201 label1 = gtk_label_new("Name *");
00202 label2 = gtk_label_new("Login Name *");
00203 label3 = gtk_label_new("EnterPassword *");
00204 label4 = gtk_label_new("Re-enterPassword *");
00205 label5 = gtk_label_new("Secuirty question");
00206 label6 = gtk_label_new("Answer");
00207
00208
00209 createButton = gtk_button_new_with_label("Create");
00210
00211
00212
00213
00214 vbox = gtk_vbox_new(FALSE,0);
00215
00216
00217 textName=gtk_entry_new();
00218 text2=gtk_entry_new();
00219 text3=gtk_entry_new();
00220 text4=gtk_entry_new();
00221
00222 text6=gtk_entry_new();
00223
00224 comboQuestion=gtk_combo_new();
00225
00226
00227
00228 table = gtk_table_new(8, 3, TRUE);
00229 gtk_table_set_row_spacings(GTK_TABLE(table), 10);
00230 gtk_table_set_col_spacings(GTK_TABLE(table), 10);
00231
00232
00233
00234
00235 gtk_signal_connect(GTK_OBJECT(window2), "delete_event", GTK_SIGNAL_FUNC(destroyapp), NULL);
00236
00237
00238 gtk_signal_connect(GTK_OBJECT(createButton), "clicked", GTK_SIGNAL_FUNC(createButton_clicked), NULL);
00239
00240
00241 glist1=g_list_append(glist1,"what is ur 1st school name");
00242 glist1=g_list_append(glist1,"what is ur 2st school name");
00243 glist1=g_list_append(glist1,"what is ur 3st school name");
00244 glist1=g_list_append(glist1,"what is ur 4st school name");
00245
00246 gtk_combo_set_popdown_strings(GTK_COMBO(comboQuestion),glist1);
00247
00248 gtk_table_attach_defaults(GTK_TABLE(table), label1,0,1,0,1 );
00249 gtk_table_attach_defaults(GTK_TABLE(table), label2,0,1,1,2 );
00250 gtk_table_attach_defaults(GTK_TABLE(table), label3,0,1,2,3 );
00251 gtk_table_attach_defaults(GTK_TABLE(table), label4,0,1,3,4 );
00252 gtk_table_attach_defaults(GTK_TABLE(table), label5,0,1,4,5 );
00253 gtk_table_attach_defaults(GTK_TABLE(table), label6,0,1,5,6 );
00254 gtk_table_attach_defaults(GTK_TABLE(table), textName,1,2,0,1 );
00255 gtk_table_attach_defaults(GTK_TABLE(table), text2,1,2,1,2 );
00256 gtk_table_attach_defaults(GTK_TABLE(table), text3,1,2,2,3 );
00257 gtk_table_attach_defaults(GTK_TABLE(table), text4,1,2,3,4 );
00258 gtk_table_attach_defaults(GTK_TABLE(table), comboQuestion,1,2,4,5 );
00259 gtk_table_attach_defaults(GTK_TABLE(table), text6,1,2,5,6 );
00260 gtk_table_attach_defaults(GTK_TABLE(table), createButton,1,2,6,7 );
00261
00262
00263
00264 gtk_container_add(GTK_CONTAINER (window2), GTK_WIDGET(table));
00265
00266
00267 gtk_container_border_width (GTK_CONTAINER (window2), 15);
00268
00269
00270
00271 gtk_widget_show(label1);
00272 gtk_widget_show(label2);
00273 gtk_widget_show(label3);
00274 gtk_widget_show(label4);
00275 gtk_widget_show(label5);
00276 gtk_widget_show(label6);
00277 gtk_widget_show(textName);
00278 gtk_widget_show(text2);
00279 gtk_widget_show(text3);
00280 gtk_widget_show(text4);
00281 gtk_widget_show(comboQuestion);
00282 gtk_widget_show(text6);
00283 gtk_widget_show(createButton);
00284 gtk_widget_show(table);
00285 gtk_widget_show(window2);
00286
00287
00288
00289
00290
00291 }
00292
00293
00298 void newUserButton_clicked(GtkWidget *widget, gpointer gdata)
00299 {
00300 newUser();
00301
00302
00303 }
00304
00310 void send_clicked(GtkWidget *widget, gpointer gdata)
00311 {
00312
00313 int i;
00314 char MSG[200];
00315 char full[200],inter[100];
00316 printf("\n in sending a message:\n");
00317 for(i=0;i<num;i++)
00318 if(strcmp(fList[i],gdata)==0)
00319 break;
00320
00321 strcpy(inter,gtk_entry_get_text(GTK_ENTRY(textMsg)));
00322 sprintf(full,"%s:%s\n",loginName,inter);
00323
00324 gtk_text_buffer_insert(buffer[i],&iter2[i],full,strlen(full));
00325
00326 strcpy(MSG,"MSG");
00327 strcat(MSG,"##");
00328 strcat(MSG,loginName);
00329 strcat(MSG,"##");
00330 strcat(MSG,gdata);
00331 strcat(MSG,"##");
00332 strcat(MSG,inter);
00333 strcat(MSG,"\n");
00334
00335 write(sockfd,MSG,strlen(MSG));
00336 gtk_entry_set_text(GTK_ENTRY(textMsg)," ");
00337 fflush(stdout);
00338 }
00339
00351 void view_clicked(GtkWidget *widget, gpointer gdata)
00352 {
00353
00354 char msg[200],part[100];
00355 history[0]='\0';
00356 strcpy(part,gdata);
00357 sprintf(msg,"HISTORY!!!%s!!!%s",loginName,part);
00358 write(sockfd,msg,strlen(msg));
00359
00360 }
00361
00362
00368 void signout_clicked(GtkWidget *widget, gpointer gdata)
00369 {
00370 char msg[100];
00371 sprintf(msg, "XClient is shutting down@@%s",loginName);
00372 write(sockfd, msg, strlen(msg));
00373 close(sockfd);
00374 exit(0);
00375 }
00376
00377
00383 void sendPhoto(char fname[])
00384 {
00385 char msg[200],temp[200];
00386 int i;
00387 printf("\n Sending file:\n");
00388 r=read(fp,temp,size-1);
00389
00390 while(r)
00391 {
00392 msg[0]='\0';
00393 strcpy(msg,"PHOTO");
00394 strcat(msg,"|||||");
00395 strcat(msg,loginName);
00396 strcat(msg,"|||||");
00397 strcat(msg,fname);
00398 strcat(msg,"|||||");
00399
00400 i=0;
00401 n=strlen(msg);
00402 while(i<=r)
00403 msg[n++]=temp[i++];
00404 r=strlen(msg);
00405 n=write(sockfd,msg,n-1);
00406 sleep(1);
00407 r=read(fp,temp,size-1);
00408 }
00409 msg[0]='\0';
00410 strcpy(msg,"PHOTO");
00411 strcat(msg,"|||||");
00412 strcat(msg,loginName);
00413 strcat(msg,"|||||");
00414 strcat(msg,fname);
00415 strcat(msg,"|||||");
00416 strcat(msg,"ENDPHOTO");
00417 n=write(sockfd,msg,strlen(msg));
00418 close(fp);
00419
00420 }
00421
00422
00428 void sendReq_clicked(GtkWidget *widget, gpointer gdata)
00429 {
00430
00431 char path[200],msg[200],*part1,*part2,last[200];
00432
00433
00434 strcpy(path,file);
00435 part1=strtok(file,"/");
00436 while(part1!=NULL)
00437 {
00438 part2=part1;
00439 part1=strtok(NULL,"/");
00440 }
00441 strcpy(last,part2);
00442 strcpy(msg,"STARTPHT");
00443 strcat(msg,"|||||");
00444 strcat(msg,loginName);
00445 strcat(msg,"|||||");
00446 strcat(msg,gdata);
00447 strcat(msg,"|||||");
00448 strcat(msg,last);
00449 write(sockfd,msg,strlen(msg));
00450 fp=open(path,O_RDONLY);
00451 gtk_widget_hide(windowSendPhoto);
00452 sendPhoto(gdata);
00453 }
00454
00460 void getPath_clicked(GtkWidget *widget, gpointer gdata)
00461 {
00462 strcpy(file,gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(widget)));
00463 }
00464
00472 void sendPhoto_clicked(GtkWidget *widget, gpointer gdata)
00473 {
00474 GtkWidget *button;
00475 GtkWidget *button2;
00476 GtkWidget *box1;
00477 GtkFileFilter *filter1;
00478 printf("Send photo clicked:\n");
00479
00480 windowSendPhoto = gtk_window_new(GTK_WINDOW_TOPLEVEL);
00481 gtk_window_set_title(GTK_WINDOW(windowSendPhoto), "File Chooser Button");
00482
00483 g_signal_connect(G_OBJECT(windowSendPhoto), "delete_event",G_CALLBACK(destroyapp), NULL);
00484
00485 gtk_container_set_border_width(GTK_CONTAINER(windowSendPhoto), 10);
00486 button2=gtk_button_new_with_label("send");
00487 box1 = gtk_hbox_new(FALSE, 0);
00488
00489 gtk_container_add(GTK_CONTAINER(windowSendPhoto), box1);
00490
00491 button = gtk_file_chooser_button_new(("Select A File"), GTK_FILE_CHOOSER_ACTION_OPEN);
00492
00493 filter1 = gtk_file_filter_new();
00494 gtk_file_filter_set_name(filter1, "Files");
00495 gtk_file_filter_add_pattern(filter1, "*.png");
00496 gtk_file_filter_add_pattern(filter1, "*.gif");
00497 gtk_file_filter_add_pattern(filter1, "*.jpg");
00498 gtk_file_filter_add_pattern(filter1, "*.txt");
00499 gtk_file_filter_add_pattern(filter1, "*.*");
00500 gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(button), filter1);
00501
00502 gtk_box_pack_start(GTK_BOX(box1), button, TRUE, TRUE, 0);
00503 gtk_box_pack_start(GTK_BOX(box1), button2, TRUE, TRUE, 0);
00504 gtk_widget_set_size_request(button, 250, -1);
00505
00506 g_signal_connect((gpointer)button, "selection_changed", G_CALLBACK(getPath_clicked), gdata);
00507 gtk_signal_connect(GTK_OBJECT(button2), "clicked", GTK_SIGNAL_FUNC(sendReq_clicked), gdata);
00508 gtk_widget_show(button);
00509 gtk_widget_show(button2);
00510 gtk_widget_show(box1);
00511 gtk_widget_show(windowSendPhoto);
00512
00513 }
00514
00515
00521 static void cb_changed( GtkComboBox *combo,gpointer data )
00522 {
00523 GtkTreeIter iter;
00524 gchar *string = NULL;
00525 GtkTreeModel *model;
00526
00527
00528
00529
00530 if( gtk_combo_box_get_active_iter( combo, &iter ) )
00531 {
00532
00533 model = gtk_combo_box_get_model( combo );
00534
00535
00536 gtk_tree_model_get( model, &iter, 0, &string, -1 );
00537 chat_Page();
00538 }
00539
00540 }
00541
00542
00552 void chat_Page()
00553 {
00554
00555 int i;
00556 gchar *string = NULL;
00557 GtkWidget *box;
00558 GtkWidget *scroll;
00559 GtkWidget *viewhistory;
00560 GtkWidget *sendphoto;
00561 GtkWidget *table;
00562 GtkWidget *send;
00563 GtkTreeIter iter;
00564
00565 GtkTreeModel *model;
00566
00567 if( gtk_combo_box_get_active_iter( GTK_COMBO_BOX(combo), &iter ) )
00568 {
00569
00570 model = gtk_combo_box_get_model( GTK_COMBO_BOX(combo) );
00571
00572
00573 gtk_tree_model_get( model, &iter, 0, &string, -1 );
00574
00575 }
00576
00577 for(i=0;i<num;i++)
00578 if(strcmp(fList[i],string)==0)
00579 {
00580 opened[i]=1;
00581 break;
00582 }
00583
00584 if(strlen(string)==1)
00585 return;
00586
00587 window4= gtk_window_new(GTK_WINDOW_TOPLEVEL);
00588 buffer[i]=gtk_text_buffer_new(NULL);
00589 gtk_window_set_default_size(GTK_WINDOW(window4),340,100);
00590
00591 gtk_window_set_title(GTK_WINDOW(window4),loginName);
00592 text1=gtk_text_view_new_with_buffer(buffer[i]);
00593 textMsg=gtk_entry_new();
00594
00595 viewhistory = gtk_button_new_with_label("view History");
00596 sendphoto = gtk_button_new_with_label("send Photo");
00597 send = gtk_button_new_with_label("send");
00598
00599
00600 box=gtk_vbox_new(FALSE,0);
00601 scroll=gtk_scrolled_window_new(NULL,NULL);
00602 gtk_box_pack_start(GTK_BOX(box),scroll,TRUE,TRUE,0);
00603
00604 gtk_container_add(GTK_CONTAINER(scroll),text1);
00605
00606 table = gtk_table_new(4, 3, TRUE);
00607 gtk_table_set_row_spacings(GTK_TABLE(table), 10);
00608 gtk_table_set_col_spacings(GTK_TABLE(table), 10);
00609
00610
00611 gtk_table_attach_defaults(GTK_TABLE(table), viewhistory, 0,1,0,1 );
00612 gtk_table_attach_defaults(GTK_TABLE(table), sendphoto, 1,2,0,1 );
00613 gtk_table_attach_defaults(GTK_TABLE(table), box, 0,3,1,3 );
00614 gtk_table_attach_defaults(GTK_TABLE(table), textMsg,0,2,3,4 );
00615 gtk_table_attach_defaults(GTK_TABLE(table), send,2,3,3,4 );
00616
00617
00618
00619 label=gtk_label_new(string);
00620 fflush(stdout);
00621
00622
00623 gtk_container_add(GTK_CONTAINER (window4), GTK_WIDGET(table));
00624 gtk_table_attach_defaults(GTK_TABLE(table),label , 2,3,0,1 );
00625 gtk_signal_connect(GTK_OBJECT(send), "clicked", GTK_SIGNAL_FUNC(send_clicked), string);
00626 gtk_signal_connect(GTK_OBJECT(viewhistory), "clicked", GTK_SIGNAL_FUNC(view_clicked), string);
00627 gtk_signal_connect(GTK_OBJECT(sendphoto), "clicked", GTK_SIGNAL_FUNC(sendPhoto_clicked), string);
00628
00629 gtk_text_buffer_get_start_iter(buffer[i],&iter2[i]);
00630
00631
00632 gtk_container_border_width (GTK_CONTAINER (window4), 15);
00633
00634
00635
00636 gtk_widget_show(viewhistory);
00637 gtk_widget_show(sendphoto);
00638 gtk_widget_show(text1);
00639 gtk_widget_show(scroll);
00640 gtk_widget_show(box);
00641 gtk_widget_show(textMsg);
00642 gtk_widget_show(label);
00643 gtk_widget_show(send);
00644 gtk_widget_show(table);
00645 gtk_widget_show(window4);
00646
00647
00648
00649 }
00650
00656 void addList(char str[])
00657 {
00658 gtk_list_store_append( store, &iter );
00659 gtk_list_store_set( store, &iter, 0, str, -1 );
00660 }
00661
00662
00663 void insertAll()
00664 {
00665 int i;
00666 printf("\n In insert all fn\n");
00667 gtk_list_store_append( store, &iter );
00668 gtk_list_store_set( store, &iter, 0," ", -1 );
00669 for(i=0;i<num;i++)
00670 {
00671 gtk_list_store_append( store, &iter );
00672 gtk_list_store_set( store, &iter, 0, fList[i], -1 );
00673 }
00674 }
00675
00680 void removeFrnd(char *str)
00681 {
00682 int i,j;
00683 fflush(stdout);
00684 gtk_list_store_clear(store);
00685 for(i=0;i<num;i++)
00686 if(strcmp(str,fList[i])==0)
00687 break;
00688 for(j=i;j<num-1;j++)
00689 strcpy(fList[j],fList[j+1]);
00690 num--;
00691
00692
00693
00694 insertAll();
00695
00696
00697 }
00698
00699
00705 void newPhotoPage(char fname[],char last[])
00706 {
00707
00708 char str[100];
00709 fp=open(last,O_WRONLY|O_CREAT);
00710 sprintf(str,"chmod 777 %s",last);
00711 system(str);
00712
00713 }
00714
00719 void addtext(int n,char *msg,char *name)
00720 {
00721 char full[200];
00722 sprintf(full,"%s:%s",name,msg);
00723 gtk_text_buffer_insert(buffer[n],&iter2[n],full,strlen(full));
00724 }
00725
00737 void *cont()
00738 {
00739 int i,j,k,l;
00740 int return_value;
00741 char *part,*part2;
00742 char myname[100],fname[100],msg[200],last[100];
00743
00744 fflush(stdout);
00745 while(1)
00746 {
00747 return_value=read(sockfd,Rmsg,BUFFER-1);
00748 if(return_value>0)
00749 { Rmsg[return_value]='\0';
00750 printf("\n Received the message\n");
00751 fflush(stdout);
00752 if(strstr(Rmsg,"Friend")!=NULL)
00753 {
00754 part=strtok(Rmsg,"&&");
00755 part=strtok(NULL,"&&");
00756 addList(part);
00757 strcpy(fList[num],part);
00758 part2=strtok(Rmsg,"^^");
00759 part2=strtok(NULL,"^^");
00760 friends[num++]=atoi(part2);
00761 }
00762 else if(strstr(Rmsg,"MSG")!=NULL)
00763 {
00764 part=strtok(Rmsg,"##");
00765 part=strtok(NULL,"##");
00766 strcpy(fname,part);
00767 part=strtok(NULL,"##");
00768 strcpy(myname,part);
00769 part=strtok(NULL,"##");
00770 strcpy(msg,part);
00771 for(i=0;i<num;i++)
00772 if(strcmp(fList[i],fname)==0)
00773 addtext(i,msg,fname);
00774
00775 }
00776 else if(strstr(Rmsg,"XClient")!=NULL)
00777 {
00778 part=strtok(Rmsg,"@@");
00779 part=strtok(NULL,"@@");
00780 strcpy(fname,part);
00781 printf("%s signout\n",fname);
00782 fflush(stdout);
00783 for(i=0;i<num;i++)
00784 if(strcmp(fname,fList[i])==0)
00785 {
00786 removeFrnd(fname);
00787
00788 }
00789
00790 }
00791 else if(strstr(Rmsg,"HISTORY")!=NULL)
00792 {
00793
00794 part=strtok(Rmsg,"***");
00795 part=strtok(NULL,"***");
00796
00797 while(part!=NULL)
00798 {
00799 if(strcmp(part,"OVER")!=0)
00800 {
00801 strcat(history,part);
00802 }
00803 else
00804 {
00805 printf("\n HISTORY :\n\n%s",history);
00806 }
00807 part=strtok(NULL,"***");
00808 }
00809
00810
00811
00812 }
00813 else if(strstr(Rmsg,"STARTPHT")!=NULL)
00814 {
00815 part=strtok(Rmsg,"|||||");
00816 part=strtok(NULL,"|||||");
00817 strcpy(fname,part);
00818 part=strtok(NULL,"|||||");
00819 strcpy(myname,part);
00820 part=strtok(NULL,"|||||");
00821 strcpy(last,part);
00822 printf("\n file name is %s\n",last);
00823 newPhotoPage(fname,last);
00824 }
00825 else if(strstr(Rmsg,"PHOTO")!=NULL)
00826 {
00827
00828 i=0;
00829 k=0;
00830 j=0;
00831 l=0;
00832
00833 fflush(stdout);
00834 while(Rmsg[i]!='|')
00835 {
00836 i++;
00837 }
00838 i=i+5;
00839 while(Rmsg[i]!='|')
00840 fname[k++]=Rmsg[i++];
00841 fname[k]='\0';
00842 i=i+5;
00843 while(Rmsg[i]!='|')
00844 fname[j++]=Rmsg[i++];
00845 fname[j]='\0';
00846 while(Rmsg[i]=='|')
00847 i++;
00848 do
00849 {
00850 msg[l++]=Rmsg[i];
00851 i++;
00852 }
00853 while(i<strlen(Rmsg));
00854
00855 if(strstr(msg,"ENDPHOTO")==NULL)
00856 {
00857 write(fp,msg,l);
00858 }
00859 else
00860 {
00861 close(fp);
00862 printf("\n file is saved as %s in current directory",last);
00863 }
00864 }
00865
00866 }
00867
00868 if(return_value<0)
00869 pthread_exit(NULL);
00870 }
00871 }
00872
00873
00880 void mainPage()
00881 {
00882 int r;
00883 GtkWidget *label1;
00884 GtkWidget *vbox;
00885 GtkWidget *table;
00886 GtkWidget *inv1;
00887 GtkWidget *inv2;
00888 GtkWidget *inv3;
00889 GtkWidget *signout;
00890 GtkWidget *deleteItem;
00891 GtkWidget *addFriend;
00892 GtkWidget *frame;
00893 pthread_t child1;
00894
00895 r = pthread_create(&child1, NULL,cont, NULL);
00896 if(r!=0)
00897 {
00898 perror("Thread 1 creation failed");
00899 exit(EXIT_FAILURE);
00900 }
00901
00902
00903 window3 = gtk_window_new(GTK_WINDOW_TOPLEVEL);
00904 gtk_window_set_default_size(GTK_WINDOW(window3),220,150);
00905 gtk_window_set_title(GTK_WINDOW(window3),loginName);
00906
00907
00908 inv1 = gtk_button_new_with_label("inv1");
00909 inv2 = gtk_button_new_with_label("inv2");
00910 inv3 = gtk_button_new_with_label("inv3");
00911 signout = gtk_button_new_with_label("signout");
00912
00913 label1 = gtk_label_new("Name");
00914 vbox=gtk_vbox_new(FALSE,0);
00915 combo=gtk_combo_new();
00916
00917 frame = gtk_frame_new( "Online Friends LIst");
00918 gtk_box_pack_start( GTK_BOX( vbox ), frame, FALSE, FALSE, 0 );
00919
00920
00921 store = gtk_list_store_new( 1, G_TYPE_STRING );
00922
00923
00924 insertCombo();
00925
00926
00927 combo = gtk_combo_box_new_with_model( GTK_TREE_MODEL( store ) );
00928 gtk_container_add( GTK_CONTAINER( frame ), combo );
00929
00930
00931 g_object_unref( G_OBJECT( store ) );
00932
00933
00934 cell = gtk_cell_renderer_text_new();
00935
00936
00937 gtk_cell_layout_pack_start( GTK_CELL_LAYOUT( combo ), cell, TRUE );
00938
00939
00940 gtk_cell_layout_set_attributes( GTK_CELL_LAYOUT( combo ), cell, "text", 0, NULL );
00941
00942
00943 g_signal_connect( G_OBJECT( combo ), "changed",
00944 G_CALLBACK( cb_changed ), NULL );
00945
00946
00947
00948 gtk_signal_connect(GTK_OBJECT(window3), "delete_event", GTK_SIGNAL_FUNC(destroyapp), NULL);
00949
00950 deleteItem = gtk_button_new_with_mnemonic( "_Delete selected item" );
00951
00952
00953
00954 addFriend = gtk_button_new_with_label("Add friend");
00955
00956
00957
00958 gtk_signal_connect(GTK_OBJECT(signout), "clicked", GTK_SIGNAL_FUNC(signout_clicked), NULL);
00959
00960 table = gtk_table_new(3,4, TRUE);
00961 gtk_table_set_row_spacings(GTK_TABLE(table), 10);
00962 gtk_table_set_col_spacings(GTK_TABLE(table), 10);
00963
00964
00965 gtk_table_attach_defaults(GTK_TABLE(table), inv1, 0,1,0,1 );
00966 gtk_table_attach_defaults(GTK_TABLE(table), inv2, 1,2,0,1 );
00967 gtk_table_attach_defaults(GTK_TABLE(table), inv3, 2,3,0,1 );
00968 gtk_table_attach_defaults(GTK_TABLE(table), signout,3,4,0,1 );
00969
00970 gtk_table_attach_defaults(GTK_TABLE(table), vbox,0,4,1,2 );
00971 gtk_table_attach_defaults(GTK_TABLE(table),addFriend,0,2,2,3 );
00972 gtk_table_attach_defaults(GTK_TABLE(table),deleteItem,2,4,2,3 );
00973
00974
00975
00976
00977 gtk_container_add(GTK_CONTAINER (window3), GTK_WIDGET(table));
00978
00979
00980 gtk_container_border_width (GTK_CONTAINER (window3), 15);
00981
00982
00983
00984 gtk_widget_show(signout);
00985 gtk_widget_show(label1);
00986 gtk_widget_show(combo);
00987 gtk_widget_show(table);
00988 gtk_widget_show(frame);
00989
00990
00991 gtk_widget_show(vbox);
00992 gtk_widget_show(window3);
00993 gtk_main();
00994
00995
00996 }
00997
01003 void insertCombo()
01004 {
01005
01006 char * pch;
01007 pch = strtok (Rmsg,"^^");
01008 gtk_list_store_append( store, &iter );
01009 gtk_list_store_set( store, &iter, 0, " ", -1 );
01010 pch = strtok (NULL, "^^");
01011
01012 while(pch!=NULL)
01013 {
01014
01015 gtk_list_store_append( store, &iter );
01016 gtk_list_store_set( store, &iter, 0, pch, -1 );
01017 strcpy(fList[num++],pch);
01018 fflush(stdout);
01019 pch = strtok (NULL, "^^");
01020
01021 }
01022 return ;
01023 }
01024
01029 void Read()
01030 {
01031 int r;
01032 fflush(stdout);
01033 while(1)
01034 {
01035 r=read(sockfd,Rmsg,BUFFER-1);
01036 Rmsg[r]='\0';
01037 if(r>0)
01038 {
01039 if(strstr(Rmsg,"LIST")!=NULL)
01040 {
01041
01042 return;
01043 }
01044
01045 }
01046 }
01047 }
01048
01049
01065 void connectToServer()
01066 {
01067
01068
01069 fd_set clientfds;
01070
01071
01072
01073 struct hostent *hostinfo;
01074 struct sockaddr_in address;
01075
01076
01077
01078
01079
01080
01081
01082
01083 sockfd = socket(AF_INET, SOCK_STREAM, 0);
01084 printf("\n %s",hostname);
01085 fflush(stdout);
01086
01087
01088 hostinfo = gethostbyname(hostname);
01089 bzero(&address, sizeof(address));
01090 address.sin_addr = *(struct in_addr *)*hostinfo -> h_addr_list;
01091 address.sin_family = AF_INET;
01092 address.sin_port = htons(port);
01093
01094 if(inet_pton(AF_INET, hostname, &address.sin_addr) < 0)
01095 {
01096 fprintf(stderr, "the supplied ipv4 address is incorrect.\n");
01097 exit(1);
01098 }
01099
01100
01101
01102 if(connect(sockfd, (struct sockaddr *)&address, sizeof(address)) < 0)
01103 {
01104 perror("connecting");
01105 exit(1);
01106 }
01107
01108 fflush(stdout);
01109
01110 FD_ZERO(&clientfds);
01111 FD_SET(sockfd,&clientfds);
01112 FD_SET(0,&clientfds);
01113
01114
01115 return ;
01116 }
01117
01124 void subButton_clicked(GtkWidget *widget, gpointer gdata)
01125 {
01126 char msg[200],temp_line[200];
01127 int character_read, return_value;
01128 connectToServer();
01129 strcpy(loginName,gtk_entry_get_text(GTK_ENTRY(textName)));
01130 strcpy(password,gtk_entry_get_text(GTK_ENTRY(text2)));
01131
01132
01133 sprintf(msg,"LOGIN$$%s&&%s",loginName,password);
01134 return_value = write(sockfd, msg, strlen(msg));
01135
01136 if(return_value < 0)
01137 {
01138 perror("write() failed.");
01139 exit(1);
01140 }
01141 else
01142 printf("\n%s written to server\n",msg);
01143 while(1)
01144 {
01145 character_read = read(sockfd, temp_line, BUFFER-1);
01146 temp_line[character_read]='\0';
01147
01148 if(character_read>0)
01149 {
01150
01151 temp_line[character_read]='\0';
01152 if(strstr(temp_line,"correct")!=0)
01153 {
01154 myID=atoi(temp_line);
01155 printf("Login success");
01156 fflush(stdout);
01157 Read();
01158 gtk_widget_hide(window);
01159 gtk_main_quit();
01160 mainPage();
01161
01162 }
01163 else if(strcmp(temp_line,"check")==0)
01164 {
01165 printf("wrong password");
01166 gtk_widget_hide(window);
01167 LoginPage();
01168 }
01169 else
01170 {
01171 printf("Login failed");
01172 gtk_widget_hide(window);
01173 LoginPage();
01174 }
01175 }
01176
01177 if(character_read < 0)
01178 {
01179 printf("Read error\n");
01180 exit(1);
01181 }
01182 }
01183
01184 }
01185
01191 void LoginPage()
01192 {
01193
01194 GtkWidget *label1;
01195 GtkWidget *label2;
01196 GtkWidget *subButton;
01197
01198 GtkWidget *table;
01199 GtkWidget *newUserButton;
01200
01201 window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
01202 gtk_window_set_default_size(GTK_WINDOW(window),340,100);
01203 gtk_window_set_title(GTK_WINDOW(window), "Login");
01204 label1 = gtk_label_new("Name");
01205 label2 = gtk_label_new("Password");
01206
01207 subButton = gtk_button_new_with_label("Login");
01208 newUserButton = gtk_button_new_with_label( "New User");
01209
01210 textName=gtk_entry_new();
01211 text2=gtk_entry_new();
01212
01213 table = gtk_table_new(4, 3, TRUE);
01214 gtk_table_set_row_spacings(GTK_TABLE(table), 10);
01215 gtk_table_set_col_spacings(GTK_TABLE(table), 10);
01216
01217 gtk_signal_connect(GTK_OBJECT(window), "delete_event", GTK_SIGNAL_FUNC(destroyapp), NULL);
01218
01219 gtk_signal_connect(GTK_OBJECT(subButton), "clicked", GTK_SIGNAL_FUNC(subButton_clicked), NULL);
01220 gtk_signal_connect(GTK_OBJECT(newUserButton), "clicked", GTK_SIGNAL_FUNC(newUserButton_clicked),NULL);
01221
01222 gtk_table_attach_defaults(GTK_TABLE(table), label1,0,1,0,1 );
01223 gtk_table_attach_defaults(GTK_TABLE(table), label2,0,1,1,2 );
01224 gtk_table_attach_defaults(GTK_TABLE(table), textName,1,3,0,1 );
01225 gtk_table_attach_defaults(GTK_TABLE(table), text2,1,3,1,2 );
01226 gtk_table_attach_defaults(GTK_TABLE(table), subButton,1,2,2,3 );
01227 gtk_table_attach_defaults(GTK_TABLE(table), newUserButton,1,2,3,4 );
01228
01229 gtk_container_add(GTK_CONTAINER (window), GTK_WIDGET(table));
01230
01231 gtk_container_border_width (GTK_CONTAINER (window), 15);
01232
01233 gtk_widget_show(label1);
01234 gtk_widget_show(label2);
01235 gtk_widget_show(textName);
01236 gtk_widget_show(text2);
01237 gtk_widget_show(subButton);
01238 gtk_widget_show(newUserButton);
01239 gtk_widget_show(table);
01240 gtk_widget_show(window);
01241 gtk_main();
01242 exit(EXIT_SUCCESS);
01243
01244 }
01245
01254 int main(int argc, char *argv[])
01255 {
01256
01257 int i;
01258 for(i=0;i<100;i++)
01259 opened[i]=0;
01260 gtk_init (&argc, &argv);
01261 if(argc!=4)
01262 {
01263 printf("Invalid parameter.\nUsage: ./2Client -p portNumber IPAddress\n");
01264 exit(0);
01265 }
01266 if(argc==2 || argc==4)
01267 {
01268 if(!strcmp("-p",argv[1]))
01269 {
01270 if(argc==2)
01271 {
01272 printf("Invalid parameters.\nUsage: chat [-p PORT] HOSTNAME\n");
01273 exit(0);
01274 }
01275 else
01276 {
01277 sscanf(argv[2],"%i",&port);
01278 strcpy(hostname,argv[3]);
01279 }
01280 }
01281 else
01282 {
01283 port=MYPORT;
01284 strcpy(hostname,argv[1]);
01285 }
01286 printf("\n*** Client program starting : \n");
01287 fflush(stdout);
01288
01289 }
01290
01291 LoginPage();
01292 printf("\n At end");
01293 fflush(stdout);
01294 return 0;
01295 }