00001
00002 #include <stdio.h>
00003 #include <unistd.h>
00004 #include <stdlib.h>
00005 #include <strings.h>
00006 #include <sys/socket.h>
00007 #include <sys/types.h>
00008 #include <arpa/inet.h>
00009 #include <netinet/in.h>
00010 #include<string.h>
00011 #include <gtk/gtk.h>
00012
00013 #define BUFFER 4096
00014 #define SERVER_PORT 8000
00015
00022 gint closewin(GtkWidget *widget,GdkEvent *event,gpointer data)
00023 {
00024 gtk_main_quit();
00025 return(FALSE);
00026 }
00027
00028 void button1(GtkWidget *widget1, gpointer data);
00029 void button2(GtkWidget *widget1, gpointer data);
00030 void button3(GtkWidget *widget1, gpointer data);
00031 void button4(GtkWidget *widget1, gpointer data);
00032 void question(char *);
00033 int submit(GtkWidget *widget1, gpointer data);
00034 void endexam(int,int);
00035
00036 int read_desc;
00037 int write_desc;
00038 gboolean radio1=TRUE,radio2=FALSE,radio3=FALSE,radio4=FALSE;
00039 GtkWidget *window,*group;
00040 GtkWidget *label1,*rad1,*rad2,*rad3,*rad4,*box,*button5;
00041
00047 void question(char que[])
00048 {
00049
00050 char *q,*op1,*op2,*op3,*op4,temp[BUFFER];
00051 int i=0,x,y;
00052
00053 fprintf(stderr,"%s\n",que);
00054
00055
00056
00057 gtk_signal_connect (GTK_OBJECT (window), "delete_event",
00058 GTK_SIGNAL_FUNC(closewin),
00059 NULL);
00060
00061
00062
00063
00064
00065 strcpy(temp,que);
00066 q=strtok(que,"|");
00067 if(strcmp(q,temp)==0)
00068 {
00069 q=strtok(q," ");
00070 q=strtok(NULL," ");
00071 x=atoi(q);
00072 q=strtok(NULL," ");
00073 y=atoi(q);
00074 endexam(x,y);
00075 }
00076 op1=strtok(NULL,"|");
00077 op2=strtok(NULL,"|");
00078 op3=strtok(NULL,"|");
00079 op4=strtok(NULL,"|");
00080
00081
00082 box = gtk_vbox_new (FALSE, 0);
00083 gtk_container_add (GTK_CONTAINER (window), box);
00084
00085 label1=gtk_label_new(q);
00086 gtk_box_pack_start (GTK_BOX (box), label1, TRUE, TRUE, 0);
00087
00088 gtk_window_set_title(GTK_WINDOW(window),"exam");
00089 gtk_window_set_default_size(GTK_WINDOW(window),440,300);
00090
00091 rad1 = gtk_radio_button_new_with_label(NULL,op1);
00092 group=gtk_radio_button_group(GTK_RADIO_BUTTON(rad1));
00093 rad2 = gtk_radio_button_new_with_label(group,op2);
00094 group=gtk_radio_button_group(GTK_RADIO_BUTTON(rad1));
00095 rad3 = gtk_radio_button_new_with_label(group,op3);
00096 group=gtk_radio_button_group(GTK_RADIO_BUTTON(rad1));
00097 rad4 = gtk_radio_button_new_with_label(group,op4);
00098
00099 button5 = gtk_button_new_with_label("submit");
00100
00101 gtk_box_pack_start (GTK_BOX (box), rad1, TRUE, TRUE, 0);
00102 gtk_box_pack_start (GTK_BOX (box), rad2, TRUE, TRUE, 0);
00103 gtk_box_pack_start (GTK_BOX (box), rad3, TRUE, TRUE, 0);
00104 gtk_box_pack_start (GTK_BOX (box), rad4, TRUE, TRUE, 0);
00105 gtk_box_pack_start (GTK_BOX (box), button5, TRUE, TRUE, 0);
00106
00107 g_signal_connect(G_OBJECT(rad1), "toggled", G_CALLBACK(button1), NULL);
00108 g_signal_connect(G_OBJECT(rad2), "toggled", G_CALLBACK(button2), NULL);
00109 g_signal_connect(G_OBJECT(rad3), "toggled", G_CALLBACK(button3), NULL);
00110 g_signal_connect(G_OBJECT(rad4), "toggled", G_CALLBACK(button4), NULL);
00111 g_signal_connect_swapped(G_OBJECT(button5), "clicked", G_CALLBACK(submit), GTK_OBJECT(window));
00112
00113 gtk_widget_show_all(window);
00114 gtk_main();
00115 }
00122 int submit(GtkWidget *wid, gpointer data)
00123 {
00124
00125 int ans=0;
00126 char str[1000];
00127 fprintf(stderr,"submit called");
00128 if(radio1==TRUE)
00129 {
00130 ans=1;
00131 }
00132 else if(radio2==TRUE)
00133 {
00134 ans=2;
00135 }
00136 else if(radio3==TRUE)
00137 {
00138 ans=3;
00139 }
00140 else if(radio4==TRUE)
00141 {
00142 ans=4;
00143 }
00144
00145 gtk_container_remove (GTK_CONTAINER (window), box);
00146 sprintf(str,"%d",ans);
00147 write(write_desc,str,strlen(str));
00148 int num;
00149 num=read(write_desc,str,BUFFER-1);
00150 str[num]='\0';
00151
00152 radio1=TRUE;
00153 radio2=FALSE;
00154 radio3=FALSE;
00155 radio4=FALSE;
00156 question(str);
00157 endexam(-1,-1);
00158 return ans;
00159 }
00166 void endexam(int score,int total)
00167 {
00168 GtkWidget *dialog;
00169 if(score!=-1)
00170 {
00171 dialog = gtk_message_dialog_new (NULL,GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_INFO, GTK_BUTTONS_OK, "YOUR EXAM IS SUCCESSFULLY COMPLETED. YOUR SCORE IS %d/%d",score,total);
00172 }
00173 else
00174 {
00175 dialog = gtk_message_dialog_new (NULL,GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_INFO, GTK_BUTTONS_OK, "YOU CLOSED THE EXAM ABRUPTLY, SO YOUR EXAM IS CANCELLED");
00176 }
00177 gtk_dialog_run (GTK_DIALOG (dialog));
00178 gtk_widget_destroy (dialog);
00179 gtk_main_quit();
00180 exit(1);
00181 }
00188 void button1(GtkWidget *widget1, gpointer data)
00189 {
00190 if(radio1==TRUE)
00191 radio1=FALSE;
00192 else
00193 {
00194 radio1=TRUE;
00195 }
00196 }
00203 void button2(GtkWidget *widget1, gpointer data)
00204 {
00205 if(radio2==TRUE)
00206 radio2=FALSE;
00207 else
00208 {
00209 radio2=TRUE;
00210 }
00211 }
00218 void button3(GtkWidget *widget1, gpointer data)
00219 {
00220 if(radio3==TRUE)
00221 radio3=FALSE;
00222 else
00223 {
00224 radio3=TRUE;
00225 }
00226 }
00233 void button4(GtkWidget *widget1, gpointer data)
00234 {
00235 if(radio4==TRUE)
00236 radio4=FALSE;
00237 else
00238 {
00239 radio4=TRUE;
00240 }
00241 }
00252 int main(int argc, char *argv[])
00253 {
00254
00255 char temp_line[BUFFER];
00256
00257 int character_read;
00258 int return_value;
00259 char echo_mssg[BUFFER];
00260 char return_mssg[BUFFER];
00261
00262
00263 struct sockaddr_in server_address,servaddr;
00264
00265
00266 if(argc != 2)
00267 {
00268 fprintf(stderr, "%s: usage: %s <server_ip_address> \n", argv[0], argv[0]);
00269 exit(1);
00270 }
00271 gtk_init(&argc, &argv);
00272 window=gtk_window_new(GTK_WINDOW_TOPLEVEL);
00273 gtk_signal_connect (GTK_OBJECT (window), "delete_event",
00274 GTK_SIGNAL_FUNC(closewin),
00275 NULL);
00276
00277 write_desc = socket(AF_INET, SOCK_STREAM, 0);
00278
00279 if(write_desc < 0)
00280 {
00281 fprintf(stderr, "%s: cannot open socket.\n", argv[0]);
00282 exit(1);
00283 }
00284
00285 bzero(&server_address, sizeof(servaddr));
00286
00287 server_address.sin_family = AF_INET;
00288
00289 server_address.sin_port = htons(SERVER_PORT);
00290
00291 if(inet_pton(AF_INET, argv[1], &server_address.sin_addr) <= 0)
00292 {
00293 fprintf(stderr, "%s: the supplied ipv4 address %s is incorrect.\n", argv[0], argv[1]);
00294 exit(1);
00295 }
00296
00297
00298 if(connect(write_desc, (struct sockaddr *) &server_address, sizeof(server_address)) < 0)
00299 {
00300 fprintf(stderr, "%s: cannot connect to server %s\n", argv[0], argv[1]);
00301 exit(1);
00302 }
00303 character_read=read(write_desc,return_mssg,BUFFER-1);
00304 return_mssg[character_read]='\0';
00305 question(return_mssg);
00306 endexam(-1,-1);
00307
00308 return EXIT_SUCCESS;
00309
00310 }