/* ----------------------------------------------------------------------------- * ipdcGui.c * * iPDC - Phasor Data Concentrator * * Copyright (C) 2011-2012 Nitesh Pandit * Copyright (C) 2011-2012 Kedar V. Khandeparkar * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * Authors: * Nitesh Pandit * Kedar V. Khandeparkar * * ----------------------------------------------------------------------------- */ #include #include #include #include #include #include #include #include #include #include #include #include "ipdcGui.h" #include "global.h" #include "connections.h" #include "new_pmu_or_pdc.h" #include "recreate.h" /* ------------------------------------------------------------------------------------ */ /* Functions in ipdcGui.c */ /* ------------------------------------------------------------------------------------ */ /* 1. int isNumber(char *s); */ /* 2. void destroy (GtkWidget *widget, gpointer udata); */ /* 3. GdkPixbuf *create_pixbuf(const gchar * filename); */ /* 4. void display_pdc_detail (GtkButton *widget, gpointer udata); */ /* 5. void about_ipdc (GtkButton *widget, gpointer udata); */ /* 6. void ipdc_help (GtkButton *but, gpointer udata); */ /* 7. void validation_result (char *msg); */ /* 8. void ipdc_colors(); */ /* 9. void final_pdc_setup_call(); */ /* 10. int validation_pdc_detail (GtkButton *button, gpointer udata); */ /* 11. void validation_setup_file_name (GtkWidget *widget, gpointer data); */ /* 12. int add_pmu_validation (GtkButton *but, gpointer udata); */ /* 13. int cmd_or_remove_pmu_validation (GtkButton *but, gpointer udata); */ /* 14. int new_pdc_validation (GtkButton *but, gpointer udata); */ /* 15. int remove_pdc_validation (GtkButton *but, gpointer udata); */ /* 16. void fill_pdc_details (char *filePath); */ /* 17. void add_pmu (GtkButton *but, gpointer udata); */ /* 18. void cmd_or_remove_pmu (GtkButton *but, gpointer udata); */ /* 19. void add_new_pdc (GtkButton *but, gpointer udata); */ /* 20. void remove_pdc (GtkButton *but, gpointer udata); */ /* 21. void connection_table (GtkButton *but, gpointer udata); */ /* 22. void ipdc_setup_fileSelector (GtkWidget *widget, gpointer udata); */ /* 23. void view_setup_file (GtkWidget *w, GtkFileChooser *fs); */ /* 24. void apply_ipdc_setup (GtkWidget *w, gpointer udata); */ /* 25. void* display_time(); */ /* */ /* ------------------------------------------------------------------------------------ */ /* ---------------------------------------------------------------------------- */ /* FUNCTION isNumber(char *s): */ /* It checks the passing character is a number or not, return 0 if its a */ /* otherwise returns 1. */ /* ---------------------------------------------------------------------------- */ int isNumber(char *s) { int dot=0, num=0, end=0; while(isspace(*s))s++; if(*s == '-')s++; if(! *s)return 0; while(*s) if(isspace(*s)) end=1, s++; else if(end) return 0; else if(isdigit(*s)) num=1, s++; else if(*s=='.') if(dot) return 0; else dot=1,s++; else return 0; return num; }; /* ---------------------------------------------------------------------------- */ /* FUNCTION destroy (GtkWidget *widget, gpointer udata): */ /* It Destroy(close) the iPDC main window with child (if any open) and */ /* also close the opened terminal. */ /* ---------------------------------------------------------------------------- */ void destroy (GtkWidget *widget, gpointer udata) { FILE *f; char name[20],*psid,*psname,psN[15]; g_print ("\niPDC Closing Now.\n\n"); gtk_main_quit(); exit(1); }; /* ---------------------------------------------------------------------------- */ /* FUNCTION GdkPixbuf *create_pixbuf(const gchar * filename) */ /* function creates a new pixbuf by loading an image from a file. */ /* The file format is detected automatically. If NULL, error will be set. */ /* ---------------------------------------------------------------------------- */ GdkPixbuf *create_pixbuf(const gchar * filename) { GdkPixbuf *pixbuf; GError *error = NULL; pixbuf = gdk_pixbuf_new_from_file(filename, &error); if(!pixbuf) { fprintf(stderr, "%s\n", error->message); g_error_free(error); } return pixbuf; }; /* ---------------------------------------------------------------------------- */ /* FUNCTION display_pdc_detail (GtkButton *widget, gpointer udata) */ /* It displays the details of running iPDC software on your machine */ /* to user at any time. */ /* ---------------------------------------------------------------------------- */ void display_pdc_detail (GtkButton *widget, gpointer udata) { /* local variables */ int rows=0; char line[20]; char *markup; GtkWidget *new_window, *table; GtkWidget *label, *ok_button; FILE *file_1; /* Open the file 'ipdc?.bin' in read mode */ file_1 = fopen (ipdcFilePath,"rb"); if (file_1 != NULL) { /* If its available, then create a new dialog window for displaying the iPDC details. */ new_window = gtk_dialog_new (); g_signal_connect (new_window, "destroy", G_CALLBACK (gtk_widget_destroy), new_window); gtk_window_set_title (GTK_WINDOW (new_window), "iPDC Details"); gtk_container_set_border_width (GTK_CONTAINER (new_window), 10); gtk_window_set_resizable ( GTK_WINDOW (new_window), FALSE); /* create a table of 8 by 2 squares. */ rows = 6; table = gtk_table_new (rows, 2, FALSE); /* set the spacing to 10 on x and 10 on y */ gtk_table_set_row_spacings (GTK_TABLE (table), 16); gtk_table_set_col_spacings (GTK_TABLE (table), 16); /* pack the table into the window */ gtk_box_pack_start (GTK_BOX (GTK_DIALOG(new_window)), table, TRUE, TRUE, 0); gtk_widget_show (table); /* Add a "close" button to the bottom of the dialog */ ok_button = gtk_button_new_from_stock (GTK_STOCK_OK);// or GTK_STOCK_APPLY); /* This simply creates a grid of labels on the table to demonstrate the window. g_markup_printf_escaped (): function to display diffrent color and font of text on label */ label = gtk_label_new (" "); markup = g_markup_printf_escaped ("iPDC Details"); gtk_label_set_markup (GTK_LABEL (label), markup); gtk_table_attach_defaults (GTK_TABLE (table), label, 0, 2, 0, 1); gtk_widget_show (label); g_free (markup); label = gtk_label_new ("iPDC ID Code"); gtk_misc_set_alignment (GTK_MISC(label),0,0); gtk_table_attach_defaults (GTK_TABLE (table), label, 0, 1, 1, 2); gtk_widget_show (label); label = gtk_label_new ("iPDC UDP Port"); gtk_misc_set_alignment (GTK_MISC(label),0,0); gtk_table_attach_defaults (GTK_TABLE (table), label, 0, 1, 2, 3); gtk_widget_show (label); label = gtk_label_new ("iPDC TCP Port"); gtk_misc_set_alignment (GTK_MISC(label),0,0); gtk_table_attach_defaults (GTK_TABLE (table), label, 0, 1, 3, 4); gtk_widget_show (label); label = gtk_label_new ("Database Server IP"); gtk_misc_set_alignment (GTK_MISC(label),0,0); gtk_table_attach_defaults (GTK_TABLE (table), label, 0, 1, 4, 5); gtk_widget_show (label); label = gtk_label_new ("Database Server Port"); gtk_misc_set_alignment (GTK_MISC(label),0,0); gtk_table_attach_defaults (GTK_TABLE (table), label, 0, 1, 5, 6); gtk_widget_show (label); /* This simply read from file and print on label in the table. */ memset(line,'\0',sizeof(line)); fgets (line, 20, file_1); memset(line,'\0',sizeof(line)); fgets(line,20,file_1); label = gtk_label_new (line); gtk_misc_set_alignment (GTK_MISC(label),0,0); gtk_table_attach_defaults (GTK_TABLE (table), label, 1, 2, 1, 2); gtk_widget_show (label); memset(line,'\0',sizeof(line)); fgets(line,20,file_1); label = gtk_label_new (line); gtk_misc_set_alignment (GTK_MISC(label),0,0); gtk_table_attach_defaults (GTK_TABLE (table), label, 1, 2, 2, 3); gtk_widget_show (label); memset(line,'\0',sizeof(line)); fgets (line, 20, file_1); label = gtk_label_new (line); gtk_misc_set_alignment (GTK_MISC(label),0,0); gtk_table_attach_defaults (GTK_TABLE (table), label, 1, 2, 3, 4); gtk_widget_show (label); memset(line,'\0',sizeof(line)); fgets (line, 20, file_1); label = gtk_label_new (line); gtk_misc_set_alignment (GTK_MISC(label),0,0); gtk_table_attach_defaults (GTK_TABLE (table), label, 1, 2, 4, 5); gtk_widget_show (label); fclose (file_1); /* This is print static text (9000) on label in the table. */ label = gtk_label_new ("9000"); gtk_misc_set_alignment (GTK_MISC(label),0,0); gtk_table_attach_defaults (GTK_TABLE (table), label, 1, 2, 5, 6); gtk_widget_show (label); /* Define signal on ok_button when it "clicked". */ g_signal_connect_swapped (ok_button, "clicked", G_CALLBACK (gtk_widget_destroy), new_window); /* This makes it so the ok_button is the default. */ gtk_widget_set_can_default (ok_button, TRUE); gtk_box_pack_start (gtk_dialog_get_action_area(new_window), ok_button, TRUE, TRUE, 0); /* This grabs this button to be the default button. Simply hitting the "Enter" key will cause this button to activate. */ gtk_widget_grab_default (ok_button); gtk_widget_show (ok_button); /* Finally show the new_window. */ gtk_widget_show (new_window); } }; /* ---------------------------------------------------------------------------- */ /* FUNCTION about_ipdc (GtkButton *widget, gpointer udata) */ /* It display the information about iPDC Software like authors, licensing, etc. */ /* ---------------------------------------------------------------------------- */ void about_ipdc (GtkButton *widget, gpointer udata) { /* local variables */ GtkWidget *about_dialog; const gchar *auth[] = {"\nDr. A.M. Kulkarni ", "\nNitesh Pandit ", "\nKedar V. Khandeparkar ", "\nGopal Gajjar ", NULL}; /* Create a about dialog for displaying about the iPDC. */ about_dialog = gtk_about_dialog_new (); /* Define the diffrent properties of about_dialog. */ gtk_about_dialog_set_program_name ((GtkAboutDialog *)about_dialog, " "); gtk_about_dialog_set_comments ((GtkAboutDialog *)about_dialog, "Authors :\nNitesh Pandit\nKedar Khandeparkar");//nWide Aera Measurement System\nDepartment of Electrical Engineering\nIndian Institute of Technology, Bombay\nMumbai, INDIA"); gtk_about_dialog_set_license ((GtkAboutDialog *)about_dialog, "iPDC - A Free Phasor Data Concentrator & PMU Simulator\n\nGeneral Public License (GPL)\n\nAuthors:\n\t\tNitesh Pandit \n\t\tKedar V. Khandeparkar \n\n\nThis program is free software; you can redistribute it and/or\nmodify it under the terms of the GNU General Public License\nas published by the Free Software Foundation; either version 2\nof the License, or (at your option) any later version.\n\nThis program is distributed in the hope that it will be useful,\nbut WITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\nGNU General Public License for more details.\n\nYou should have received a copy of the GNU General Public License\nalong with this program; if not, write to the Free Software\nFoundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\n"); gtk_about_dialog_set_logo ((GtkAboutDialog *)about_dialog, create_pixbuf("/usr/local/share/iPDC/ipdcLogo1.png")); gtk_about_dialog_set_website ((GtkAboutDialog *)about_dialog, "\nhttp://ipdc.codeplex.com/\n"); gtk_about_dialog_set_copyright ((GtkAboutDialog *)about_dialog, "Copyright (C) 2011-2012 GPL3"); gtk_about_dialog_set_authors ((GtkAboutDialog *)about_dialog, auth); gtk_about_dialog_set_logo ((GtkAboutDialog *)about_dialog, NULL); /* Ensure that the dialog box is destroyed when the user responds */ g_signal_connect_swapped (about_dialog, "response", G_CALLBACK (gtk_widget_destroy), about_dialog); /* Finally show the about_dialog. */ gtk_widget_show_all (about_dialog); }; /* ---------------------------------------------------------------------------- */ /* FUNCTION ipdc_help (GtkButton *but, gpointer udata) */ /* It shows the general guidelines to user to fill the entries for connecting, */ /* or disconnecting devices in iPDC Software. */ /* ---------------------------------------------------------------------------- */ void ipdc_help (GtkButton *but, gpointer udata) { /* local variables */ GtkWidget *help_dialog; /* Create a about dialog for displaying iPDC help. */ help_dialog = gtk_about_dialog_new (); /* Define the diffrent properties of about_dialog. */ gtk_about_dialog_set_program_name ((GtkAboutDialog *)help_dialog, "iPDC HELP\n"); gtk_about_dialog_set_comments ((GtkAboutDialog *)help_dialog, "1) ID Code should be integer i.e. 50, 60, etc.\n2) Port should be >1500 && < 65535.\t\t\n3) IP Address should be like 192.168.23.10. "); /* Ensure that the dialog box is destroyed when the user responds */ g_signal_connect_swapped (help_dialog, "response", G_CALLBACK (gtk_widget_destroy), help_dialog); /* Finally show the about_dialog. */ gtk_widget_show_all (help_dialog); }; /* ---------------------------------------------------------------------------- */ /* FUNCTION validation_result (char *msg) */ /* It displays the status message of last performed operation. */ /* ---------------------------------------------------------------------------- */ void validation_result (char *msg) { /* local variables */ GtkWidget *val_dialog; /* Create a new about dialog to displaying the status message of last performed operation. */ val_dialog = gtk_about_dialog_new (); /* Define the diffrent properties of val_dialog. */ // gtk_about_dialog_set_program_name ((GtkAboutDialog *)val_dialog, " "); gtk_about_dialog_set_comments ((GtkAboutDialog *)val_dialog, msg); /* Ensure that the dialog box is destroyed when the user responds */ g_signal_connect_swapped (val_dialog, "response", G_CALLBACK (gtk_widget_destroy), val_dialog); /* Finally show the val_dialog. */ gtk_widget_show_all (val_dialog); }; /* ---------------------------------------------------------------------------- */ /* FUNCTION ipdc_colors(): */ /* It fills the colors in text on lables and set the images on given buttons. */ /* It called in main only one time to initialized all the parameters. */ /* ---------------------------------------------------------------------------- */ void ipdc_colors() { GtkTextBuffer *buffer, *buffer1; GtkTextMark *cursor, *cursor1; GtkTextIter iter, iter1; char *markup11; markup11 = g_markup_printf_escaped ("Admin Operations"); gtk_label_set_markup (GTK_LABEL (data->admin_label), markup11); g_free (markup11); markup11 = g_markup_printf_escaped ("@All Rights Reserved"); gtk_label_set_markup (GTK_LABEL (data->rights_label), markup11); g_free (markup11); /* Set the image (iPDC-logo) on a specific textview1 */ buffer1 = gtk_text_view_get_buffer (GTK_TEXT_VIEW (data->text_view1)); cursor1 = gtk_text_buffer_get_insert (buffer1); gtk_text_buffer_get_iter_at_mark (buffer1, &iter1, cursor1); gtk_text_buffer_insert_pixbuf (buffer1, &iter1, create_pixbuf("/usr/local/share/iPDC/ipdcLogo.png")); gtk_widget_show (data->text_view1); /* Set the general image on a textview */ buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (data->text_view)); cursor = gtk_text_buffer_get_insert (buffer); gtk_text_buffer_get_iter_at_mark (buffer, &iter, cursor); gtk_text_buffer_insert_pixbuf (buffer, &iter, create_pixbuf("/usr/local/share/iPDC/PSLab.PNG")); gtk_widget_show (data->text_view); }; /* ---------------------------------------------------------------------------- */ /* FUNCTION validation_pdc_detail (GtkButton *button, gpointer udata) */ /* It Validates the user enterd details for iPDC device. It gives the */ /* successful message and go ahead with entered data if all entries */ /* were right, else it shows the validation error message to user. */ /* ---------------------------------------------------------------------------- */ int validation_pdc_detail (GtkButton *button, gpointer udata) { /* local variables */ char *errmsg1, ip[20]; const char *text, *text1, *text2, *text3; /* Get the text entries filled by user */ text = gtk_entry_get_text(GTK_ENTRY(p_id)); text1 = gtk_entry_get_text(GTK_ENTRY(p_udp)); text2 = gtk_entry_get_text(GTK_ENTRY(p_tcp)); text3 = gtk_entry_get_text(GTK_ENTRY(p_ip)); memset(ip,'\0',20); strcat(ip, text3); if(!isNumber((char *)text) || !(atoi(text) > 0) || (PDC_IDCODE == atoi(text))) { errmsg1 = " Not a valid iPDC ID value! Try again "; validation_result (errmsg1); /* Show the unsuccess message to user */ return 0; } else if(!isNumber((char *)text1) || !(atoi(text1) > 1500 && atoi(text1) < 65535) || (atoi(text1) == 9000)) { errmsg1 = " Not a valid iPDC UDP Port, must not be 9000! Try again "; validation_result (errmsg1); /* Show the unsuccess message to user */ return 0; } else if(!isNumber((char *)text2) || !(atoi(text2) > 1500 && atoi(text2) < 65535) || (atoi(text2) == atoi(text1)) || (atoi(text2) == 9000)) { errmsg1 = " Not a valid iPDC TCP Port!\nMust be different from UDP port & 9000. Try again "; validation_result (errmsg1); /* Show the unsuccess message to user */ return 0; } else if(!checkip(ip)) /* Check text_box entry for valid IP Address or not? */ { errmsg1 = " Not a valid IP Addess for iPDC-Database Server! Try again \n"; validation_result (errmsg1); /* Show the unsuccess message to user */ return 0; } else /* Only if all the text_box entries were right */ { PDC_IDCODE = atoi(text); UDPPORT = atoi(text1); TCPPORT = atoi(text2); memset(dbserver_ip, '\0', 20); strcpy(dbserver_ip, (char *) text3); FILE *fp_ptr; /* Open the file "ipdc?.bin" and write all the enterd informations */ memset(ipdcFilePath, '\0', 200); strcpy(ipdcFilePath, ipdcFolderPath); strcat(ipdcFilePath, "/"); strcat(ipdcFilePath, "ipdc"); strcat(ipdcFilePath, text); strcat(ipdcFilePath, ".bin"); ipdcFilePath[strlen(ipdcFilePath)] = '\0'; /* Close/destroy the pdc_detail_window */ gtk_widget_destroy (pdc_detail_window); fp_ptr = fopen (ipdcFilePath,"rb"); if(fp_ptr == NULL) { final_pdc_setup_call(); } else { /* Close the open iPDC Setup file */ fclose(fp_ptr); GtkWidget *table, *label, *yes, *no; /* Create a new dialog window for PMU Server Setup */ new_window = gtk_dialog_new (); gtk_window_set_title (GTK_WINDOW (new_window), "Warning!"); gtk_container_set_border_width (GTK_CONTAINER (new_window), 10); /* Create a table of 4 by 2 squares. */ table = gtk_table_new (4, 3, FALSE); /* Set the spacing to 50 on x and 5 on y */ gtk_table_set_row_spacings (GTK_TABLE (table), 15); gtk_table_set_col_spacings (GTK_TABLE (table), 5); /* Pack the table into the window */ gtk_box_pack_start (GTK_BOX (GTK_DIALOG(new_window)), table, TRUE, TRUE, 0); gtk_widget_show (table); /* Add few buttons to the bottom of the dialog */ yes = gtk_button_new_with_label ("YES"); no = gtk_button_new_with_label ("NO"); /* This simply creates a grid of toggle buttons on the table */ label = gtk_label_new (" "); markup = g_markup_printf_escaped ("Warning!"); gtk_label_set_markup (GTK_LABEL (label), markup); gtk_table_attach_defaults (GTK_TABLE (table), label, 1, 2, 0, 1); gtk_widget_show (label); g_free (markup); label = gtk_hseparator_new(); gtk_table_attach_defaults (GTK_TABLE (table), label, 0, 3, 1, 2); gtk_widget_show (label); label = gtk_label_new (" "); markup = g_markup_printf_escaped ("iPDC Setup File with the given ID code is alredy present\nin the system. Do you want to overwrite it?"); gtk_label_set_markup (GTK_LABEL (label), markup); gtk_table_attach_defaults (GTK_TABLE (table), label, 1, 2, 2, 3); gtk_widget_show (label); g_free (markup); label = gtk_hseparator_new(); gtk_table_attach_defaults (GTK_TABLE (table), label, 0, 3, 3, 4); gtk_widget_show (label); /* Signal handling for buttons on PMU Server Setup Window */ g_signal_connect (yes, "clicked", G_CALLBACK(validation_setup_file_name), (gpointer) "yes"); g_signal_connect (no, "clicked", G_CALLBACK(validation_setup_file_name), (gpointer) "no"); g_signal_connect (new_window, "destroy", G_CALLBACK(gtk_widget_destroy), new_window); g_signal_connect_swapped (new_window, "response", G_CALLBACK(gtk_widget_destroy), new_window); /* This makes it so the button is the default. */ gtk_widget_set_can_default (yes, TRUE); gtk_widget_set_can_default (no, TRUE); gtk_box_pack_start (gtk_dialog_get_action_area(new_window), yes, TRUE, TRUE, 0); gtk_box_pack_start (gtk_dialog_get_action_area(new_window), no, TRUE, TRUE, 0); /* This grabs this button to be the default button. Simply hitting the "Enter" key will cause this button to activate. */ gtk_widget_grab_default (yes); gtk_widget_show (yes); gtk_widget_grab_default (no); gtk_widget_show (no); /* Finally show the new_window */ gtk_widget_show (new_window); } return 1; } }; /* ---------------------------------------------------------------------------- */ /* FUNCTION validation_setup_file_name (GtkWidget *widget, gpointer data) */ /* It Validates the user's choice, whether he wants to go with new iPDC setup, */ /* or want to fill the new iPDC setup details? */ /* ---------------------------------------------------------------------------- */ void validation_setup_file_name (GtkWidget *widget, gpointer data) { char t[4]; strcpy(t, (char *) data); /* destroy the warning window */ gtk_widget_destroy (new_window); /* Match the user's choice and take appropiate action? */ if(!strcmp(t, "yes")) { /* User with ok with overwtithing new iPDC setup, then call the final setup call*/ final_pdc_setup_call(); } else { /* User do not want to overwtithing new iPDC setup, then again call iPDC setup window */ fill_pdc_details (NULL); } }; /* ---------------------------------------------------------------------------- */ /* FUNCTION final_pdc_setup_call() */ /* It will create the iPDC setup file and intialize the few global variable. */ /* ---------------------------------------------------------------------------- */ void final_pdc_setup_call() { /* local variables */ char buff[50]; FILE *fp_ptr; fp_ptr = fopen (ipdcFilePath,"wb"); fputs("ipdcServer", fp_ptr); fputs(" 1", fp_ptr); fputc('\n',fp_ptr); memset(buff, '\0', 50); sprintf(buff, "%d", PDC_IDCODE); fputs(buff, fp_ptr); fputc('\n',fp_ptr); memset(buff, '\0', 50); sprintf(buff, "%d", UDPPORT); fputs(buff, fp_ptr); fputc('\n',fp_ptr); memset(buff, '\0', 50); sprintf(buff, "%d", TCPPORT); fputs(buff, fp_ptr); fputc('\n',fp_ptr); fputs(dbserver_ip, fp_ptr); fputc('\n',fp_ptr); fputs("LowerDevices 0", fp_ptr); fputc('\n',fp_ptr); fputs("UpperDevices 0", fp_ptr); fputc('\n',fp_ptr); fputs("SourcesCFG 0", fp_ptr); fputc('\n',fp_ptr); fclose(fp_ptr); /* Enable all (mentioned) buttons on main ipdc window */ gtk_widget_set_sensitive(GTK_WIDGET(data->add_pmu_button), TRUE); gtk_widget_set_sensitive(GTK_WIDGET(data->remove_pmu_button), TRUE); gtk_widget_set_sensitive(GTK_WIDGET(data->cmd_data_off_button), TRUE); gtk_widget_set_sensitive(GTK_WIDGET(data->cmd_data_on_button), TRUE); gtk_widget_set_sensitive(GTK_WIDGET(data->cmd_cfg_button), TRUE); gtk_widget_set_sensitive(GTK_WIDGET(data->add_pdc_button), TRUE); gtk_widget_set_sensitive(GTK_WIDGET(data->remove_pdc_button), TRUE); gtk_widget_set_sensitive(GTK_WIDGET(data->display_conn_table_button), TRUE); // gtk_menu_attach_to_widget (GTK_MENU (data->menuitem2), GTK_WIDGET (data->ipdc), NULL); // gtk_widget_show (data->ipdc); gtk_widget_set_visible(GTK_WIDGET(data->menu_conn_table), TRUE); gtk_widget_set_visible(GTK_WIDGET(data->pdc_details_menuitem), TRUE); // /* Disable the menuitem for iPDC details entries */ gtk_widget_set_visible(GTK_WIDGET(data->enter_pdc_detail_menuitem), FALSE); gtk_widget_set_visible(GTK_WIDGET(data->open_ipdc_setup), FALSE); /* setup() call to stablish the connections at iPDC restart */ recreate_cfg_objects(); setup(); validation_result (" iPDC Setup is successfully done. "); }; /* ---------------------------------------------------------------------------- */ /* FUNCTION add_pmu_validation (GtkButton *but, gpointer udata) */ /* It Validates the user enterd details for add Source devices (PMU/PDC). */ /* It gives the successful message and go ahead with entered data if */ /* all entries were right, else it shows the validation error message to user. */ /* ---------------------------------------------------------------------------- */ int add_pmu_validation (GtkButton *but, gpointer udata) { /* local variables */ int ret; char *errmsg1, ip[20], tmp[4]; const char *text, *text1, *text2, *text3; /* Get the text entries filled by user */ text = gtk_entry_get_text(GTK_ENTRY(p_id)); text1 = gtk_entry_get_text(GTK_ENTRY(p_ip)); text2 = gtk_entry_get_text(GTK_ENTRY(p_port)); text3 = gtk_combo_box_text_get_active_text(GTK_COMBO_BOX(p_protocol)); memset(ip,'\0',20); strcat(ip, text1); strcpy (tmp, text3); if ((!isNumber((char *)text)) || !(atoi(text) > 0) || (atoi(text) == PDC_IDCODE)) /* Check text_box entry for valid integer or not? */ { errmsg1 = " Not a valid Source Device ID code! Try again "; validation_result (errmsg1); /* Show the unsuccess message to user */ return 0; } else if(!isNumber((char *)text2) || !(atoi(text2) > 1500 && atoi(text2) < 65535) || (atoi(text2) == TCPPORT) || (atoi(text2) == UDPPORT) || (atoi(text2) == DBPORT)) /* TCP and UDP port of iPDC should not match with it */ { errmsg1 = " Not a valid Port for Source Device! Try again "; validation_result (errmsg1); /* Show the unsuccess message to user */ return 0; } else if(!checkip(ip)) /* Check text_box entry for valid IP Address or not? */ { errmsg1 = " Not a valid IP Addess of Source Device! Try again "; validation_result (errmsg1); /* Show the unsuccess message to user */ return 0; } else /* Only if all the text_box entries were right */ { /* call add_PMU() to actual add pmu/pdc and start communication */ ret = add_PMU((char *)text, (char *)text1, (char *)text2, (char *)text3); if (ret == 0) { /* Close/destroy the add_pmu_window */ gtk_widget_destroy (add_pmu_window); errmsg1 = " Source Device Successfully Added. "; validation_result (errmsg1); /* Show the success message to user */ return 1; } else { errmsg1 = " Device details already exists! Try again "; validation_result (errmsg1); /* Show the unsuccess message to user */ return 0; } } }; /* ---------------------------------------------------------------------------- */ /* FUNCTION cmd_or_remove_pmu_validation (GtkButton *but, gpointer udata) */ /* It Validates the user enterd details for function Removes the Source devices */ /* or send command frames to Source devices. It gives the successful message */ /* and go ahead with entered data if all entries were right, */ /* else it shows the validation error message to user. */ /* ---------------------------------------------------------------------------- */ int cmd_or_remove_pmu_validation (GtkButton *but, gpointer udata) { /* local variables */ int ret; char *errmsg1, tmp[4]; /* Get the text entries filled by user */ if(gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (chkBtn)) == TRUE) { set_all = 1; if(!strcmp(find_butn, "1")) /* If function called by 'Remove source device' */ { /* call remove_Lower_Node() to remove source device */ ret = remove_Lower_Node(NULL, NULL); if (ret == 0) { /* Close/destroy the Source remove window */ gtk_widget_destroy (new_window); errmsg1 = " Source device successfully removed. "; validation_result (errmsg1); return 1; } else { errmsg1 = " Entered Source device not found! Try again "; validation_result (errmsg1); return 0; } } else if(!strcmp(find_butn, "2")) /* If function called by 'Send Data Transmission OFF' */ { /* call put_data_transmission_off() to put OFF data of source device */ ret = put_data_transmission_off(NULL, NULL); if (ret == 0) { /* Close/destroy the Send command frame window */ gtk_widget_destroy (new_window); errmsg1 = " Data Transmission OFF now for given device. "; validation_result (errmsg1); return 1; } else { errmsg1 = " Entered Source device not found! Try again "; validation_result (errmsg1); /* Show the unsuccess message to user */ return 0; } } else if(!strcmp(find_butn, "3")) /* If function called by 'Send Data Transmission ON' */ { /* call put_data_transmission_on() to put ON data of source device */ ret = put_data_transmission_on(NULL, NULL); if (ret == 0) { /* Close/destroy the Send command frame window */ gtk_widget_destroy (new_window); errmsg1 = " Data Transmission ON now for given device. "; validation_result (errmsg1); return 1; } else { errmsg1 = " Entered Source device not found! Try again "; validation_result (errmsg1); return 0; } } else if(!strcmp(find_butn, "4")) /* If function called by Send Configuration request */ { /* call configuration_request() to send Configuration request */ ret = configuration_request(NULL, NULL); if (ret == 0) { /* Close/destroy the Send command frame window */ gtk_widget_destroy (new_window); errmsg1 = " Configuration Frame request sent to given device "; validation_result (errmsg1); return 1; } else { errmsg1 = " Entered Source device not found! Try again "; validation_result (errmsg1); return 0; } } else { errmsg1 = " UNKNOWN FUNCTION CALL??? Try again"; validation_result (errmsg1); return 1; } } else { const char *text, *text1; text = gtk_entry_get_text(GTK_ENTRY(p_id)); text1 = gtk_combo_box_text_get_active_text(GTK_COMBO_BOX(p_protocol)); memset(tmp, '\0', 4); strcpy (tmp, text1); if ((!isNumber((char *)text)) || !(atoi(text) > 0) || (atoi(text) == PDC_IDCODE)) /* Check text_box entry for valid integer or not? */ { errmsg1 = " Not a valid Source Device ID code! Try again "; validation_result (errmsg1); return 0; } else /* Only if all the text_box entries were right */ { if(!strcmp(find_butn, "1")) /* If function called by 'Remove source device' */ { /* call remove_Lower_Node() to remove source device */ ret = remove_Lower_Node((char *)text, (char *)text1); if (ret == 0) { /* Close/destroy the Source remove window */ gtk_widget_destroy (new_window); errmsg1 = " Source device successfully removed. "; validation_result (errmsg1); /* Show the success message to user */ return 1; } else { errmsg1 = " Entered Source device not found! Try again "; validation_result (errmsg1); /* Show the unsuccess message to user */ return 0; } } else if(!strcmp(find_butn, "2")) /* If function called by 'Send Data Transmission OFF' */ { /* call put_data_transmission_off() to put OFF data of source device */ ret = put_data_transmission_off((char *)text, (char *)text1); if (ret == 0) { /* Close/destroy the Send command frame window */ gtk_widget_destroy (new_window); errmsg1 = " Data Transmission OFF now for given device. "; validation_result (errmsg1); /* Show the success message to user */ return 1; } else { errmsg1 = " Entered Source device not found! Try again "; validation_result (errmsg1); /* Show the unsuccess message to user */ return 0; } } else if(!strcmp(find_butn, "3")) /* If function called by 'Send Data Transmission ON' */ { /* call put_data_transmission_on() to put ON data of source device */ ret = put_data_transmission_on((char *)text, (char *)text1); if (ret == 0) { /* Close/destroy the Send command frame window */ gtk_widget_destroy (new_window); errmsg1 = " Data Transmission ON now for given device. "; validation_result (errmsg1); /* Show the success message to user */ return 1; } else { errmsg1 = " Entered Source device not found! Try again "; validation_result (errmsg1); /* Show the unsuccess message to user */ return 0; } } else if(!strcmp(find_butn, "4")) /* If function called by Send Configuration request */ { /* call configuration_request() to send Configuration request */ ret = configuration_request((char *)text, (char *)text1); if (ret == 0) { /* Close/destroy the Send command frame window */ gtk_widget_destroy (new_window); errmsg1 = " Configuration Frame request sent to given device "; validation_result (errmsg1); /* Show the success message to user */ return 1; } else { errmsg1 = " Entered Source device not found! Try again "; validation_result (errmsg1); /* Show the unsuccess message to user */ return 0; } } else { errmsg1 = " UNKNOWN FUNCTION CALL??? Try again"; validation_result (errmsg1); /* Show the unsuccess message to user */ return 1; } } } }; /* ---------------------------------------------------------------------------- */ /* FUNCTION new_pdc_validation (GtkButton *but, gpointer udata) */ /* It Validates the user enterd details for add Destination devices as PDC. */ /* It gives the successful message and go ahead with entered data if */ /* all entries were right, else it shows the validation error message to user. */ /* ---------------------------------------------------------------------------- */ int new_pdc_validation (GtkButton *but, gpointer udata) { /* local variables */ int ret; const char *text, *text1; char *errmsg1, ip[20], tmp[6]; /* Get the text entries for PDC, filled by user */ text = gtk_entry_get_text(GTK_ENTRY(p_ip)); text1 = gtk_combo_box_text_get_active_text(GTK_COMBO_BOX(p_protocol)); memset(ip,'\0',20); strcat(ip, text); strcpy (tmp, text1); if(!checkip(ip)) /* Check text_box entry for valid IP Address or not? */ { errmsg1 = " Not a valid IP Addess for Destination Device! Try again"; validation_result (errmsg1); /* Show the unsuccess message to user */ return 0; } else /* Only if all the text_box entries were right */ { /* call add_PDC() to actual add pdc and start communication */ ret = add_PDC((char *)text, (char *)text1); if (ret == 0) { gtk_widget_destroy (new_window); errmsg1 = " Destination device is successfully added. "; validation_result (errmsg1); /* Show the success message to user */ return 1; } else { errmsg1 = " Device details already exists! Try again "; validation_result (errmsg1); /* Show the unsuccess message to user */ return 0; } } }; /* ---------------------------------------------------------------------------- */ /* FUNCTION remove_pdc_validation (GtkButton *but, gpointer udata) */ /* It Validates the user enterd details for remove Destination devices as PDC. */ /* It gives the successful message and go ahead with entered data if */ /* all entries were right, else it shows the validation error message to user. */ /* ---------------------------------------------------------------------------- */ int remove_pdc_validation (GtkButton *but, gpointer udata) { /* local variables */ int ret; const char *text, *text1, *text2; char *errmsg1, ip[20], tmp[6]; /* Get the text entries for remove source device by user */ text = gtk_entry_get_text(GTK_ENTRY(p_ip)); text1 = gtk_entry_get_text(GTK_ENTRY(p_port)); text2 = gtk_combo_box_text_get_active_text(GTK_COMBO_BOX(p_protocol)); memset(ip,'\0',20); strcat(ip, text); strcpy (tmp, text2); if(!isNumber((char *)text) || !(atoi(text1) > 1500 || (atoi(text1) < 65535)) || (atoi(text) == PDC_IDCODE)) { errmsg1 = " Not a valid port of Destination Device! Try again"; validation_result (errmsg1); /* Show the unsuccess message to user */ return 0; } else if(!checkip(ip)) /* Check text_box entry for valid IP Address or not? */ { errmsg1 = " Not a valid IP Addess of Destination Device! Try again "; validation_result (errmsg1); /* Show the unsuccess message to user */ return 0; } else /* Only if all the text_box entries were right */ { /* Call remove_PDC() to remove PDC device entry as well as objects if it presents */ ret = remove_PDC((char *)text, (char *)text1, (char *)text2); if (ret == 0) { /* Close/destroy the remove PDC window */ gtk_widget_destroy (new_window); errmsg1 = " Destination device is successfully removed. "; validation_result (errmsg1); /* Show the success message to user */ return 1; } else { errmsg1 = "Entered destination device not found! Try again"; validation_result (errmsg1); /* Show the unsuccess message to user */ return 0; } } }; /* ---------------------------------------------------------------------------- */ /* FUNCTION fill_pdc_details () */ /* This function called by main once to accept the iPDC details from user */ /* on a 'iPDC Setup' window. If teher is already a file 'ipdcINFO.bin' available */ /* then it read the file and initialized them globally. */ /* ---------------------------------------------------------------------------- */ void fill_pdc_details (char *filePath) { if(filePath != NULL) { /* Open the file 'ipdcINFO.bin' in read mode */ FILE *file_1 = fopen (filePath,"rb"); if (file_1 != NULL) { char line[20]; /* If file is present initialize the global varialbes by details in file */ memset(line,'\0',sizeof(line)); fgets (line, 20, file_1); memset(line,'\0',sizeof(line)); fgets (line, 20, file_1); PDC_IDCODE = atoi(line); memset(line,'\0',sizeof(line)); fgets (line, 20, file_1); UDPPORT = atoi(line); memset(line,'\0',sizeof(line)); fgets (line, 20, file_1); TCPPORT = atoi(line); memset(line,'\0',sizeof(line)); fgets (line, 20, file_1); strcpy(dbserver_ip, line); fclose (file_1); /* Disable all the (mentioned) buttons on main ipdc window */ gtk_widget_set_sensitive(GTK_WIDGET(data->add_pmu_button), TRUE); gtk_widget_set_sensitive(GTK_WIDGET(data->remove_pmu_button), TRUE); gtk_widget_set_sensitive(GTK_WIDGET(data->cmd_data_off_button), TRUE); gtk_widget_set_sensitive(GTK_WIDGET(data->cmd_data_on_button), TRUE); gtk_widget_set_sensitive(GTK_WIDGET(data->cmd_cfg_button), TRUE); gtk_widget_set_sensitive(GTK_WIDGET(data->add_pdc_button), TRUE); gtk_widget_set_sensitive(GTK_WIDGET(data->remove_pdc_button), TRUE); gtk_widget_set_sensitive(GTK_WIDGET(data->display_conn_table_button), TRUE); // gtk_widget_set_visible(GTK_WIDGET(data->menuitem2), FALSE); gtk_widget_set_visible(GTK_WIDGET(data->menu_conn_table), TRUE); gtk_widget_set_visible(GTK_WIDGET(data->pdc_details_menuitem), TRUE); /* Desable the menuitem button if there is already enty for iPDC */ gtk_widget_set_visible(GTK_WIDGET(data->enter_pdc_detail_menuitem), FALSE); gtk_widget_set_visible(GTK_WIDGET(data->open_ipdc_setup), FALSE); /* Recreate the configuration objects and connection table */ recreate_cfg_objects(); recreate_Connection_Table(); /* setup() call to stablish the connections if any */ setup(); } } else { /* local variables for iPDC Detail windows */ char *markup15; GtkWidget *table, *label; GtkWidget *valdbutton, *help_button, *cancle_button; /* Create a new dialog window for iPDC Setup */ pdc_detail_window = gtk_dialog_new (); g_signal_connect (pdc_detail_window, "destroy", G_CALLBACK (gtk_widget_destroy), pdc_detail_window); gtk_window_set_title (GTK_WINDOW (pdc_detail_window), "iPDC Setup"); gtk_container_set_border_width (GTK_CONTAINER (pdc_detail_window), 10); /* Create a table of 6 by 2 squares. */ table = gtk_table_new (6, 2, FALSE); /* Set the spacing to 15 on x and 25 on y */ gtk_table_set_row_spacings (GTK_TABLE (table), 16); gtk_table_set_col_spacings (GTK_TABLE (table), 16); /* Pack the table into the window */ gtk_box_pack_start (GTK_BOX (gtk_dialog_get_content_area(pdc_detail_window)), table, TRUE, TRUE, 0); gtk_widget_show (table); /* Add few button to the bottom of the dialog */ valdbutton = gtk_button_new_with_label ("Add"); cancle_button = gtk_button_new_from_stock (GTK_STOCK_CANCEL); help_button = gtk_button_new_from_stock (GTK_STOCK_HELP);// or GTK_STOCK_APPLY); /* This simply creates a grid of toggle buttons on the table */ label = gtk_label_new (" "); markup15 = g_markup_printf_escaped ("Fill iPDC Details"); gtk_label_set_markup (GTK_LABEL (label), markup15); gtk_table_attach_defaults (GTK_TABLE (table), label, 0, 2, 0, 1); gtk_widget_show (label); g_free (markup15); label = gtk_label_new ("iPDC ID Code"); gtk_misc_set_alignment (GTK_MISC(label),0,0); gtk_table_attach_defaults (GTK_TABLE (table), label, 0, 1, 1, 2); gtk_widget_show (label); label = gtk_label_new ("iPDC UDP Port"); gtk_misc_set_alignment (GTK_MISC(label),0,0); gtk_table_attach_defaults (GTK_TABLE (table), label, 0, 1, 2, 3); gtk_widget_show (label); label = gtk_label_new ("iPDC TCP Port"); gtk_misc_set_alignment (GTK_MISC(label),0,0); gtk_table_attach_defaults (GTK_TABLE (table), label, 0, 1, 3, 4); gtk_widget_show (label); label = gtk_label_new ("Database Server IP "); gtk_misc_set_alignment (GTK_MISC(label),0,0); gtk_table_attach_defaults (GTK_TABLE (table), label, 0, 1, 4, 5); gtk_widget_show (label); label = gtk_label_new ("Database Server Port"); gtk_misc_set_alignment (GTK_MISC(label),0,0); gtk_table_attach_defaults (GTK_TABLE (table), label, 0, 1, 5, 6); gtk_widget_show (label); /* Create text boxes for user to enter appropriate values */ p_id = gtk_entry_new(); gtk_entry_set_max_length ((GtkEntry *)p_id, 5); gtk_table_attach_defaults (GTK_TABLE (table), p_id, 1, 2, 1, 2); gtk_widget_show (p_id); p_udp = gtk_entry_new(); gtk_entry_set_max_length ((GtkEntry *)p_udp, 5); gtk_table_attach_defaults (GTK_TABLE (table), p_udp, 1, 2, 2, 3); gtk_widget_show (p_udp); p_tcp = gtk_entry_new(); gtk_entry_set_max_length ((GtkEntry *)p_tcp, 5); gtk_table_attach_defaults (GTK_TABLE (table), p_tcp, 1, 2, 3, 4); gtk_widget_show (p_tcp); p_ip = gtk_entry_new(); gtk_entry_set_max_length ((GtkEntry *)p_ip, 15); gtk_table_attach_defaults (GTK_TABLE (table), p_ip, 1, 2, 4, 5); gtk_widget_show (p_ip); label = gtk_label_new (" "); markup15 = g_markup_printf_escaped ("9000"); gtk_label_set_markup (GTK_LABEL (label), markup15); gtk_misc_set_alignment (GTK_MISC(label),0,0); gtk_table_attach_defaults (GTK_TABLE (table), label, 1, 2, 5, 6); gtk_widget_show (label); /* Signal handling for buttons on iPDC Setup Window */ g_signal_connect_swapped (valdbutton, "clicked", G_CALLBACK (validation_pdc_detail), NULL); g_signal_connect_swapped (help_button, "clicked", G_CALLBACK (ipdc_help), NULL); g_signal_connect_swapped (cancle_button, "clicked", G_CALLBACK (gtk_widget_destroy), pdc_detail_window); g_signal_connect_swapped (pdc_detail_window, "destroy", G_CALLBACK (gtk_widget_destroy), pdc_detail_window); /* This makes it so the button is the default. */ gtk_widget_set_can_default (valdbutton, TRUE); gtk_widget_set_can_default (cancle_button, TRUE); gtk_widget_set_can_default (help_button, TRUE); gtk_box_pack_start (GTK_BOX (gtk_dialog_get_action_area(pdc_detail_window)), valdbutton, TRUE, TRUE, 0); gtk_box_pack_start (GTK_BOX (gtk_dialog_get_action_area(pdc_detail_window)), cancle_button, TRUE, TRUE, 0); gtk_box_pack_start (GTK_BOX (gtk_dialog_get_action_area(pdc_detail_window)), help_button, TRUE, TRUE, 0); /* This grabs this button to be the default button. Simply hitting the "Enter" key will cause this button to activate. */ gtk_widget_grab_default (valdbutton); gtk_widget_show (valdbutton); gtk_widget_grab_default (cancle_button); gtk_widget_show (cancle_button); gtk_widget_grab_default (help_button); gtk_widget_show (help_button); /* Finally show the pdc_detail_window */ gtk_widget_show (pdc_detail_window); } }; /* ---------------------------------------------------------------------------- */ /* FUNCTION add_pmu (GtkButton *but, gpointer udata) */ /* It open the add source device dialog window, and user have to enter */ /* the source device details of which he wants to connect. */ /* ---------------------------------------------------------------------------- */ void add_pmu (GtkButton *but, gpointer udata) { /* local variables */ char *markup1; GtkWidget *table, *close_button; GtkWidget *valdbutton, *help_button, *label; /* Create a new dialog window for Source Device Details */ add_pmu_window = gtk_dialog_new (); g_signal_connect (add_pmu_window, "destroy", G_CALLBACK (gtk_widget_destroy), add_pmu_window); gtk_window_set_title (GTK_WINDOW (add_pmu_window), "Add Source Device"); gtk_container_set_border_width (GTK_CONTAINER (add_pmu_window), 10); gtk_window_set_resizable ( GTK_WINDOW (add_pmu_window), FALSE); /* Create a table of 5 by 2 squares. */ table = gtk_table_new (5, 2, FALSE); /* Set the spacing to 20 on x and 30 on y */ gtk_table_set_row_spacings (GTK_TABLE (table), 16); gtk_table_set_col_spacings (GTK_TABLE (table), 16); /* Pack the table into the window */ gtk_box_pack_start (GTK_BOX (gtk_dialog_get_content_area(add_pmu_window)), table, FALSE, FALSE, 0); gtk_widget_show (table); /* Add few button to the bottom of the dialog */ close_button = gtk_button_new_with_label ("close"); valdbutton = gtk_button_new_with_label ("Add"); help_button = gtk_button_new_with_label ("Help"); /* This simply creates a grid of toggle buttons on the table */ label = gtk_label_new ("-"); markup1 = g_markup_printf_escaped ("Enter Source Device Details"); gtk_label_set_markup (GTK_LABEL (label), markup1); gtk_table_attach_defaults (GTK_TABLE (table), label, 0, 2, 0, 1); gtk_widget_show (label); g_free (markup1); label = gtk_label_new ("Source ID Code"); gtk_misc_set_alignment (GTK_MISC(label),0,0); gtk_table_attach_defaults (GTK_TABLE (table), label, 0, 1, 1, 2); gtk_widget_show (label); label = gtk_label_new ("Source IP Address"); gtk_misc_set_alignment (GTK_MISC(label),0,0); gtk_table_attach_defaults (GTK_TABLE (table), label, 0, 1, 2, 3); gtk_widget_show (label); label = gtk_label_new ("Source Port Number"); gtk_misc_set_alignment (GTK_MISC(label),0,0); gtk_table_attach_defaults (GTK_TABLE (table), label, 0, 1, 3, 4); gtk_widget_show (label); label = gtk_label_new ("Protocol"); gtk_misc_set_alignment (GTK_MISC(label),0,0); gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT); gtk_table_attach_defaults (GTK_TABLE (table), label, 0, 1, 4, 5); gtk_widget_show (label); /* Create text boxes for user to enter appropriate values */ p_id = gtk_entry_new(); gtk_entry_set_max_length ((GtkEntry *)p_id, 5); gtk_table_attach_defaults (GTK_TABLE (table), p_id, 1, 2, 1, 2); gtk_widget_show (p_id); p_ip = gtk_entry_new(); gtk_entry_set_max_length ((GtkEntry *)p_ip, 15); gtk_table_attach_defaults (GTK_TABLE (table), p_ip, 1, 2, 2, 3); gtk_widget_show (p_ip); p_port = gtk_entry_new(); gtk_entry_set_max_length ((GtkEntry *)p_port, 5); gtk_table_attach_defaults (GTK_TABLE (table), p_port, 1, 2, 3, 4); gtk_widget_show (p_port); /* Create combo boxe for user with some fixed values */ p_protocol = gtk_combo_box_text_new (); gtk_combo_box_text_append_text(GTK_COMBO_BOX(p_protocol), "UDP"); gtk_combo_box_text_append_text(GTK_COMBO_BOX(p_protocol), "TCP"); gtk_combo_box_set_active(GTK_COMBO_BOX(p_protocol), 0); gtk_table_attach_defaults (GTK_TABLE (table), p_protocol, 1, 2, 4, 5); gtk_widget_show (p_protocol); /* Signal handling for buttons on Source Device Details Window */ g_signal_connect_swapped (valdbutton, "clicked", G_CALLBACK (add_pmu_validation), valdbutton); g_signal_connect_swapped (help_button, "clicked", G_CALLBACK (ipdc_help), NULL); g_signal_connect_swapped (close_button, "clicked", G_CALLBACK (gtk_widget_destroy), add_pmu_window); /* This makes it so the button is the default. */ gtk_widget_set_can_default (close_button, TRUE); gtk_widget_set_can_default (valdbutton, TRUE); gtk_widget_set_can_default (help_button, TRUE); gtk_box_pack_start (gtk_dialog_get_action_area(add_pmu_window), valdbutton, TRUE, TRUE, 0); gtk_box_pack_start (gtk_dialog_get_action_area(add_pmu_window), help_button, TRUE, TRUE, 0); gtk_box_pack_start (gtk_dialog_get_action_area(add_pmu_window), close_button, TRUE, TRUE, 0); /* This grabs this button to be the default button. Simply hitting the "Enter" key will cause this button to activate. */ gtk_widget_grab_default (valdbutton); gtk_widget_show (valdbutton); gtk_widget_grab_default (help_button); gtk_widget_show (help_button); gtk_widget_grab_default (close_button); gtk_widget_show (close_button); /* Finally show the add_pmu_window */ gtk_widget_show (add_pmu_window); }; /* ---------------------------------------------------------------------------- */ /* FUNCTION cmd_or_remove_pmu (GtkButton *but, gpointer udata) */ /* It is a common function for Remove Source Device and Send Different command */ /* frames to Source devices. */ /* ---------------------------------------------------------------------------- */ void cmd_or_remove_pmu (GtkButton *but, gpointer udata) { /* local variables */ GtkWidget *scrolled_window, *window2, *hbox1; GtkWidget *table, *close_button; GtkWidget *valdbutton, *help_button, *label; int on_flag = 0, off_flag = 0, min_rows = 6; char *markup2; char *p_buff, tmp_str[20]; /* Copy the 'udata' that came along with signal to identifies which function should execute */ strcpy(find_butn,(char *) udata); memset(buff, '\0', strlen(buff)); /* Create a new dialog window for the scrolled window to be packed into */ new_window = gtk_dialog_new (); g_signal_connect (new_window, "destroy", G_CALLBACK (gtk_widget_destroy), new_window); /* Set the window title according to fired signal */ if(!strcmp(find_butn, "1")) { gtk_window_set_title (GTK_WINDOW (new_window), "Remove Source Device"); } else if(!strcmp(find_butn, "2")) { gtk_window_set_title (GTK_WINDOW (new_window), "Turn OFF Data Transmission"); } else if(!strcmp(find_butn, "3")) { gtk_window_set_title (GTK_WINDOW (new_window), "Turn ON Data Transmission"); } else { gtk_window_set_title (GTK_WINDOW (new_window), "Configuration Frame Request"); } gtk_container_set_border_width (GTK_CONTAINER (new_window), 10); /* Create a new scrolled window */ scrolled_window = gtk_scrolled_window_new (NULL, NULL); gtk_container_set_border_width (GTK_CONTAINER (scrolled_window), 10); gtk_widget_set_size_request (scrolled_window, -1, 350); /* The policy is one of GTK_POLICY AUTOMATIC, or GTK_POLICY_ALWAYS. */ gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC); /* The dialog window is created with a vbox packed into it */ gtk_box_pack_start (GTK_BOX (gtk_dialog_get_content_area(new_window)), scrolled_window, FALSE, TRUE, 0); gtk_widget_show (scrolled_window); hbox1 = gtk_hbox_new (FALSE, 16); gtk_box_pack_start (GTK_BOX (gtk_dialog_get_content_area(new_window)), hbox1, FALSE, TRUE, 0); gtk_widget_show (hbox1); window2 = gtk_alignment_new (0,0,0,0); gtk_box_pack_start (GTK_BOX (hbox1), window2, FALSE, TRUE, 0); gtk_widget_show (window2); /* create a table of 4 by 2 squares. */ table = gtk_table_new (20, 4, FALSE); /* Set the spacing to 15 on x and 25 on y */ gtk_table_set_row_spacings (GTK_TABLE (table), 4); gtk_table_set_col_spacings (GTK_TABLE (table), 8); /* Pack the table into the scrolled window */ gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (scrolled_window), table); gtk_widget_show (table); /* Open the file 'ipdcINFO.bin' in read mode */ set_all = 0; struct Lower_Layer_Details *t = LLfirst; if (t == NULL) { /* Place lable on a spacific position on table with text 'No records were found'*/ label = gtk_label_new (" "); markup2 = g_markup_printf_escaped ("No records were found.\n-------------------------------------------------------------------\n"); gtk_label_set_markup (GTK_LABEL (label), markup2); gtk_table_attach_defaults (GTK_TABLE (table), label, 1, 4, 1, 2); gtk_widget_show (label); g_free(markup2); } else { /* Check wether fired signal from remove source or send CFG request */ /* Add the button with title according to fired signal */ if(!strcmp(find_butn, "4")) { valdbutton = gtk_button_new_with_label ("Send"); } else if(!strcmp(find_butn, "1")) { valdbutton = gtk_button_new_with_label ("Remove"); } else if(!strcmp(find_butn, "2")) /* if signal fired from send Transmission OFF request to Source device */ { /* Add a "Send" button to the bottom of the dialog */ valdbutton = gtk_button_new_with_label ("Send"); } else if(!strcmp(find_butn, "3")) /* if signal fired from send Transmission ON request to Source device */ { /* Add a "Send" button to the bottom of the dialog */ valdbutton = gtk_button_new_with_label ("Send"); } t = LLfirst; int i = 2; while(t != NULL) { if((!strcmp(find_butn, "1")) || (!strcmp(find_butn, "4")) || (!strcmp(find_butn, "2") && (t->data_transmission_off == 0)) || (!strcmp(find_butn, "3") && (t->data_transmission_off == 1))) { /* Concate all the data into a big buffer */ memset(tmp_str,'\0',sizeof(tmp_str)); sprintf(tmp_str, "%d", t->pmuid); label = gtk_label_new (tmp_str); gtk_table_attach_defaults (GTK_TABLE (table), label, 0, 1, i, i+1); gtk_widget_show (label); memset(tmp_str,'\0',sizeof(tmp_str)); strcpy(tmp_str, t->ip); label = gtk_label_new (tmp_str); gtk_table_attach_defaults (GTK_TABLE (table), label, 1, 2, i, i+1); gtk_widget_show (label); memset(tmp_str,'\0',sizeof(tmp_str)); sprintf(tmp_str, "%d", t->port); label = gtk_label_new (tmp_str); gtk_table_attach_defaults (GTK_TABLE (table), label, 2, 3, i, i+1); gtk_widget_show (label); memset(tmp_str,'\0',sizeof(tmp_str)); strncpy(tmp_str, t->protocol,3); label = gtk_label_new (tmp_str); gtk_table_attach_defaults (GTK_TABLE (table), label, 3, 4, i, i+1); gtk_widget_show (label); i++; } t = t->next; } // while ends if (i != 2) { /* This simply creates a grid of toggle buttons on the table to demonstrate the scrolled window. */ label = gtk_label_new (" "); markup2 = g_markup_printf_escaped ("Connections Detail"); gtk_label_set_markup (GTK_LABEL (label), markup2); gtk_table_attach_defaults (GTK_TABLE (table), label, 0, 4, 0, 1); gtk_widget_show (label); g_free(markup2); label = gtk_label_new ("Source ID"); gtk_table_attach_defaults (GTK_TABLE (table), label, 0, 1, 1, 2); gtk_widget_show (label); label = gtk_label_new ("IP"); gtk_table_attach_defaults (GTK_TABLE (table), label, 1, 2, 1, 2); gtk_widget_show (label); label = gtk_label_new ("Port"); gtk_table_attach_defaults (GTK_TABLE (table), label, 2, 3, 1, 2); gtk_widget_show (label); label = gtk_label_new ("Protocol"); gtk_table_attach_defaults (GTK_TABLE (table), label, 3, 4, 1, 2); gtk_widget_show (label); } else { gtk_widget_set_sensitive (valdbutton, FALSE); if (!strcmp(find_butn, "2")) { /* Place lable on a spacific position on table with text 'No records were found'*/ label = gtk_label_new (" "); markup2 = g_markup_printf_escaped ("No records were found.\n"); gtk_label_set_markup (GTK_LABEL (label), markup2); gtk_table_attach_defaults (GTK_TABLE (table), label, 1, 2, 1, 2); gtk_widget_show (label); g_free(markup2); } else if (!strcmp(find_butn, "3")) /* Simply check for source objects whose Transmission is not ON (or OFF) */ { /* Place lable on a spacific position on table with text 'No records were found'*/ label = gtk_label_new (" "); markup2 = g_markup_printf_escaped ("No records were found.\n"); gtk_label_set_markup (GTK_LABEL (label), markup2); gtk_table_attach_defaults (GTK_TABLE (table), label, 1, 2, 1, 2); gtk_widget_show (label); g_free(markup2); } } if (i < min_rows) { int jj; for (jj = i; jj < min_rows; jj++) { label = gtk_label_new (" "); gtk_table_attach_defaults (GTK_TABLE (table), label, 0, 4, jj, jj+1); gtk_widget_show (label); } } /* Create combo boxe for user with some fixed values */ p_protocol = gtk_combo_box_text_new(); gtk_combo_box_text_append_text(GTK_COMBO_BOX(p_protocol), "UDP"); gtk_combo_box_text_append_text(GTK_COMBO_BOX(p_protocol), "TCP"); gtk_combo_box_set_active(GTK_COMBO_BOX(p_protocol), 0); gtk_box_pack_end (GTK_BOX (hbox1), p_protocol, FALSE, TRUE, 0); gtk_widget_show (p_protocol); label = gtk_label_new ("Protocol"); gtk_box_pack_end (GTK_BOX (hbox1), label, FALSE, TRUE, 0); gtk_widget_show (label); p_id = gtk_entry_new(); gtk_entry_set_max_length ((GtkEntry *)p_id, 5); gtk_box_pack_end (GTK_BOX (hbox1), p_id, FALSE, TRUE, 0); gtk_widget_show (p_id); label = gtk_label_new ("Source ID Code"); gtk_box_pack_end (GTK_BOX (hbox1), label, FALSE, TRUE, 0); gtk_widget_show (label); chkBtn = gtk_check_button_new_with_label("Select All"); gtk_box_pack_end (GTK_BOX (hbox1), chkBtn, FALSE, TRUE, 0); gtk_widget_show (chkBtn); /* Add a "Help" button to the bottom of the dialog */ help_button = gtk_button_new_with_label ("Help"); /* Signal handling for buttons on Window */ g_signal_connect_swapped (valdbutton, "clicked", G_CALLBACK (cmd_or_remove_pmu_validation), valdbutton); g_signal_connect_swapped (help_button, "clicked", G_CALLBACK (ipdc_help), NULL); g_signal_connect (chkBtn, "toggled", G_CALLBACK (select_function), NULL); /* This makes it so the button is the default. */ gtk_widget_set_can_default (valdbutton, TRUE); gtk_widget_set_can_default (help_button, TRUE); gtk_box_pack_start (gtk_dialog_get_action_area(new_window), valdbutton, TRUE, TRUE, 0); gtk_box_pack_start (gtk_dialog_get_action_area(new_window), help_button, TRUE, TRUE, 0); /* This grabs this button to be the default button. Simply hitting the "Enter" key will cause this button to activate. */ gtk_widget_grab_default (valdbutton); gtk_widget_show (valdbutton); gtk_widget_grab_default (help_button); gtk_widget_show (help_button); } /* Add a "Close" button to the bottom of the dialog */ close_button = gtk_button_new_with_label ("Close"); g_signal_connect_swapped (close_button, "clicked", G_CALLBACK (gtk_widget_destroy), new_window); gtk_widget_set_can_default (close_button, TRUE); gtk_box_pack_start (gtk_dialog_get_action_area(new_window), close_button, TRUE, TRUE, 0); gtk_widget_grab_default (close_button); gtk_widget_show (close_button); on_flag = 0, off_flag = 0; /* Finally show the new_window */ gtk_widget_show (new_window); }; /* ---------------------------------------------------------------------------- */ /* FUNCTION checkbox_function(GtkWidget *widget, gpointer data) */ /* This is called when checkboxes are selected, and do the appropriate */ /* changes in the other checkbox or widget? */ /* ---------------------------------------------------------------------------- */ void select_function(GtkWidget *widget, gpointer data) { if(gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (chkBtn)) == TRUE) { gtk_widget_set_sensitive(GTK_WIDGET(p_id), FALSE); gtk_widget_set_sensitive(GTK_WIDGET(p_protocol), FALSE); } else { gtk_widget_set_sensitive(GTK_WIDGET(p_protocol), TRUE); gtk_widget_set_sensitive(GTK_WIDGET(p_id), TRUE); gtk_entry_set_text(GTK_ENTRY(p_id), " "); } }; /* ---------------------------------------------------------------------------- */ /* FUNCTION add_new_pdc (GtkButton *but, gpointer udata) */ /* It open the Destination Details window, and user have to enter */ /* the Destination details of which he wants to connect. */ /* ---------------------------------------------------------------------------- */ void add_new_pdc (GtkButton *but, gpointer udata) { /* local variables */ char *markup3; GtkWidget *table, *close_button; GtkWidget *valdbutton, *help_button, *label; /* Create a new dialog window for Destination Detail */ new_window = gtk_dialog_new (); g_signal_connect (new_window, "destroy", G_CALLBACK (gtk_widget_destroy), new_window); gtk_window_set_title (GTK_WINDOW (new_window), "Add Destination"); gtk_container_set_border_width (GTK_CONTAINER (new_window), 10); gtk_window_set_resizable ( GTK_WINDOW (new_window), FALSE); /* Create a table of 4 by 2 squares. */ table = gtk_table_new (4, 2, FALSE); /* Set the spacing to 50 on x and 35 on y */ gtk_table_set_row_spacings (GTK_TABLE (table), 16); gtk_table_set_col_spacings (GTK_TABLE (table), 16); /* The dialog window is created with a vbox packed into it */ gtk_box_pack_start (gtk_dialog_get_content_area(new_window), table, FALSE, FALSE, 0); gtk_widget_show (table); /* Add few buttons to the bottom of the dialog */ close_button = gtk_button_new_with_label ("close"); valdbutton = gtk_button_new_with_label ("Add"); help_button = gtk_button_new_with_label ("Help"); /* this simply creates a grid of toggle buttons on the table to demonstrate the scrolled window. */ label = gtk_label_new (" "); markup3 = g_markup_printf_escaped ("Enter Destination Device Details"); gtk_label_set_markup (GTK_LABEL (label), markup3); gtk_table_attach_defaults (GTK_TABLE (table), label, 0, 2, 0, 1); gtk_widget_show (label); g_free(markup3); label = gtk_label_new ("Destination IP Address"); gtk_misc_set_alignment (GTK_MISC(label),0,0); gtk_table_attach_defaults (GTK_TABLE (table), label, 0, 1, 2, 3); gtk_widget_show (label); label = gtk_label_new ("Protocol"); gtk_misc_set_alignment (GTK_MISC(label),0,0); gtk_table_attach_defaults (GTK_TABLE (table), label, 0, 1, 3, 4); gtk_widget_show (label); /* Create text boxes for user to enter appropriate values */ p_ip = gtk_entry_new(); gtk_entry_set_max_length ((GtkEntry *)p_ip, 15); gtk_table_attach_defaults (GTK_TABLE (table), p_ip, 1, 2, 2, 3); gtk_widget_show (p_ip); /* Create combo boxe for user with some fixed values */ p_protocol = gtk_combo_box_text_new(); gtk_combo_box_text_append_text(GTK_COMBO_BOX(p_protocol), "UDP"); gtk_combo_box_text_append_text(GTK_COMBO_BOX(p_protocol), "TCP"); gtk_combo_box_set_active(GTK_COMBO_BOX(p_protocol), 0); gtk_table_attach_defaults (GTK_TABLE (table), p_protocol, 1, 2, 3, 4); gtk_widget_show (p_protocol); /* Signal handling for buttons on Destination Details Window */ g_signal_connect_swapped (valdbutton, "clicked", G_CALLBACK (new_pdc_validation), valdbutton); g_signal_connect_swapped (help_button, "clicked", G_CALLBACK (ipdc_help), NULL); g_signal_connect_swapped (close_button, "clicked", G_CALLBACK (gtk_widget_destroy), new_window); /* This makes it so the button is the default. */ gtk_widget_set_can_default (close_button, TRUE); gtk_widget_set_can_default (valdbutton, TRUE); gtk_widget_set_can_default (help_button, TRUE); gtk_box_pack_start (gtk_dialog_get_action_area(new_window), valdbutton, TRUE, TRUE, 0); gtk_box_pack_start (gtk_dialog_get_action_area(new_window), help_button, TRUE, TRUE, 0); gtk_box_pack_start (gtk_dialog_get_action_area(new_window), close_button, TRUE, TRUE, 0); /* This grabs this button to be the default button. Simply hitting the "Enter" key will cause this button to activate. */ gtk_widget_grab_default (valdbutton); gtk_widget_show (valdbutton); gtk_widget_grab_default (help_button); gtk_widget_show (help_button); gtk_widget_grab_default (close_button); gtk_widget_show (close_button); /* Finally show the new_window */ gtk_widget_show (new_window); }; /* ---------------------------------------------------------------------------- */ /* FUNCTION remove_pdc (GtkButton *but, gpointer udata) */ /* It open the Destination Details window, and user have to enter */ /* the Destination details of which he wants to remove. */ /* ---------------------------------------------------------------------------- */ void remove_pdc (GtkButton *but, gpointer udata) { /* local variables */ GtkWidget *scrolled_window, *label, *hbox1, *window2; GtkWidget *table, *close_button; GtkWidget *valdbutton, *help_button; char *markup4; char *p_buff, tmp_str[20]; int i, min_rows = 10; /* Create a new dialog window for the scrolled window to be packed into */ new_window = gtk_dialog_new (); g_signal_connect (new_window, "destroy", G_CALLBACK (gtk_widget_destroy), new_window); gtk_window_set_title (GTK_WINDOW (new_window), "Remove Destination"); gtk_container_set_border_width (GTK_CONTAINER (new_window), 10); /* Create a new scrolled window */ scrolled_window = gtk_scrolled_window_new (NULL, NULL); gtk_container_set_border_width (GTK_CONTAINER (scrolled_window), 10); gtk_widget_set_size_request (scrolled_window, -1, 350); /* The policy is one of GTK_POLICY AUTOMATIC, or GTK_POLICY_ALWAYS. */ gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC); /* The dialog window is created with a vbox packed into it. */ gtk_box_pack_start (gtk_dialog_get_content_area(new_window), scrolled_window, TRUE, TRUE, 0); gtk_widget_show (scrolled_window); hbox1 = gtk_hbox_new (FALSE, 16); gtk_box_pack_start (GTK_BOX (GTK_DIALOG(new_window)), hbox1, FALSE, TRUE, 0); gtk_widget_show (hbox1); window2 = gtk_alignment_new (0,0,0,0); gtk_box_pack_start (GTK_BOX (hbox1), window2, FALSE, TRUE, 0); gtk_widget_show (window2); /* create a table of 6 by 2 squares. */ table = gtk_table_new (20, 3, FALSE); /* Set the spacing to 15 on x and 25 on y */ gtk_table_set_row_spacings (GTK_TABLE (table), 8); gtk_table_set_col_spacings (GTK_TABLE (table), 16); /* Pack the table into the scrolled window */ gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (scrolled_window), table); gtk_widget_show (table); /* Add few buttons to the bottom of the dialog */ close_button = gtk_button_new_with_label ("close"); valdbutton = gtk_button_new_with_label ("Remove"); help_button = gtk_button_new_with_label ("Help"); struct Upper_Layer_Details *t1 = ULfirst; memset(buff, '\0', strlen(buff)); if (t1 == NULL) { /* Place lable on a spacific position on table with text 'No records were found'*/ label = gtk_label_new (" "); markup4 = g_markup_printf_escaped ("No Higher Level PDC is Registered With This iPDC."); gtk_label_set_markup (GTK_LABEL (label), markup4); gtk_table_attach_defaults (GTK_TABLE (table), label, 1, 3, 1, 2); gtk_widget_show (label); g_free(markup4); label = gtk_hseparator_new(); gtk_table_attach_defaults (GTK_TABLE (table), label, 0, 3, 2, 3); gtk_widget_show (label); } else { i = 4; while(t1 != NULL) { memset(tmp_str,'\0',sizeof(tmp_str)); strcat(tmp_str, t1->ip); label = gtk_label_new (tmp_str); gtk_table_attach_defaults (GTK_TABLE (table), label, 0, 1, i, i+1); gtk_widget_show (label); memset(tmp_str,'\0',sizeof(tmp_str)); sprintf(tmp_str, "%d", t1->port); label = gtk_label_new (tmp_str); gtk_table_attach_defaults (GTK_TABLE (table), label, 1, 2, i, i+1); gtk_widget_show (label); memset(tmp_str,'\0',sizeof(tmp_str)); strncat(tmp_str, t1->protocol, 3); label = gtk_label_new (tmp_str); gtk_table_attach_defaults (GTK_TABLE (table), label, 2, 3, i, i+1); gtk_widget_show (label); i++; t1 = t1->next; } if (i != 4) { /* This simply creates a grid of toggle buttons on the table to demonstrate the scrolled window. */ label = gtk_label_new (" "); markup4 = g_markup_printf_escaped ("Destination Connections Detail"); gtk_label_set_markup (GTK_LABEL (label), markup4); gtk_table_attach_defaults (GTK_TABLE (table), label, 0, 3, 0, 1); gtk_widget_show (label); g_free(markup4); label = gtk_hseparator_new(); gtk_table_attach_defaults (GTK_TABLE (table), label, 0, 3, 1, 2); gtk_widget_show (label); label = gtk_label_new ("IP"); gtk_table_attach_defaults (GTK_TABLE (table), label, 0, 1, 2, 3); gtk_widget_show (label); label = gtk_label_new ("Port"); gtk_table_attach_defaults (GTK_TABLE (table), label, 1, 2, 2, 3); gtk_widget_show (label); label = gtk_label_new ("Protocol"); gtk_table_attach_defaults (GTK_TABLE (table), label, 2, 3, 2, 3); gtk_widget_show (label); label = gtk_hseparator_new(); gtk_table_attach_defaults (GTK_TABLE (table), label, 0, 3, 3, 4); gtk_widget_show (label); } if (i < min_rows) { int jj; for (jj = i; jj < min_rows; jj++) { label = gtk_label_new (" "); gtk_table_attach_defaults (GTK_TABLE (table), label, 0, 3, jj, jj+1); gtk_widget_show (label); } } /* Create combo box for user with some fixed values */ p_protocol = gtk_combo_box_text_new(); gtk_combo_box_text_append_text(GTK_COMBO_BOX(p_protocol), "UDP"); gtk_combo_box_text_append_text(GTK_COMBO_BOX(p_protocol), "TCP"); gtk_combo_box_set_active(GTK_COMBO_BOX(p_protocol), 0); gtk_box_pack_end (GTK_BOX (hbox1), p_protocol, FALSE, TRUE, 0); gtk_widget_show (p_protocol); label = gtk_label_new ("Protocol"); gtk_box_pack_end (GTK_BOX (hbox1), label, FALSE, TRUE, 0); gtk_widget_show (label); /* Create text boxes for user to enter appropriate values */ p_port = gtk_entry_new(); gtk_box_pack_end (GTK_BOX (hbox1), p_port, FALSE, TRUE, 0); gtk_widget_show (p_port); label = gtk_label_new ("Port"); gtk_box_pack_end (GTK_BOX (hbox1), label, FALSE, TRUE, 0); gtk_widget_show (label); p_ip = gtk_entry_new(); gtk_box_pack_end (GTK_BOX (hbox1), p_ip, FALSE, TRUE, 0); gtk_widget_show (p_ip); label = gtk_label_new ("IP Address"); gtk_box_pack_end (GTK_BOX (hbox1), label, FALSE, TRUE, 0); gtk_widget_show (label); /* Signal handling for buttons on Remove PDC Window */ g_signal_connect_swapped (valdbutton, "clicked", G_CALLBACK (remove_pdc_validation), valdbutton); g_signal_connect_swapped (help_button, "clicked", G_CALLBACK (ipdc_help), NULL); /* This makes it so the button is the default. */ gtk_widget_set_can_default (valdbutton, TRUE); gtk_widget_set_can_default (help_button, TRUE); gtk_box_pack_start (gtk_dialog_get_action_area(new_window), valdbutton, TRUE, TRUE, 0); gtk_box_pack_start (gtk_dialog_get_action_area(new_window), help_button, TRUE, TRUE, 0); /* This grabs this button to be the default button. Simply hitting the "Enter" key will cause this button to activate. */ gtk_widget_grab_default (valdbutton); gtk_widget_show (valdbutton); gtk_widget_grab_default (help_button); gtk_widget_show (help_button); } g_signal_connect_swapped (close_button, "clicked", G_CALLBACK (gtk_widget_destroy), new_window); gtk_widget_set_can_default (close_button, TRUE); gtk_box_pack_start (gtk_dialog_get_action_area(new_window), close_button, TRUE, TRUE, 0); gtk_widget_grab_default (close_button); gtk_widget_show (close_button); /* Finally show the new_window */ gtk_widget_show (new_window); }; /* ---------------------------------------------------------------------------- */ /* FUNCTION connection_table (GtkButton *but, gpointer udata) */ /* It Displays the connection tables, first is Source device connection table, */ /* another one is Destination device connection table. */ /* ---------------------------------------------------------------------------- */ void connection_table (GtkButton *but, gpointer udata) { /* local variables */ GtkWidget *scrolled_window; GtkWidget *table, *close_button; GtkWidget *label; char *p_buff, tmp_str[20]; char *markup5, *markup6, *markup7, *markup8; int i = 1; /* Create a new dialog window for the scrolled window to be packed into */ new_window = gtk_dialog_new (); g_signal_connect (new_window, "destroy", G_CALLBACK (gtk_widget_destroy), new_window); gtk_window_set_title (GTK_WINDOW (new_window), "iPDC Connections"); gtk_container_set_border_width (GTK_CONTAINER (new_window), 10); /* Create a new scrolled window. */ scrolled_window = gtk_scrolled_window_new (NULL, NULL); gtk_container_set_border_width (GTK_CONTAINER (scrolled_window), 10); gtk_widget_set_size_request (scrolled_window, -1, 350); /* the policy is one of GTK_POLICY AUTOMATIC, or GTK_POLICY_ALWAYS. */ gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC); /* The dialog window is created with a vbox packed into it. */ gtk_box_pack_start (gtk_dialog_get_content_area(new_window), scrolled_window, FALSE, TRUE, 0); gtk_widget_show (scrolled_window); /* Create a table of 20 by 5 squares */ table = gtk_table_new (20, 5, FALSE); /* Set the spacing to 15 on x and 25 on y */ gtk_table_set_row_spacings (GTK_TABLE (table), 8); gtk_table_set_col_spacings (GTK_TABLE (table), 16); /* Pack the table into the scrolled window */ gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (scrolled_window), table); gtk_widget_show (table); /* Add a "close" button to the bottom of the dialog */ close_button = gtk_button_new_from_stock (GTK_STOCK_OK);// or GTK_STOCK_APPLY); /* Print some text on lable with color and proper font */ label = gtk_label_new ("-"); markup5 = g_markup_printf_escaped ("Source Devices Connection Table\t\t"); gtk_label_set_markup (GTK_LABEL (label), markup5); gtk_table_attach_defaults (GTK_TABLE (table), label, 0, 5, 0, 1); gtk_widget_show (label); label = gtk_hseparator_new(); gtk_table_attach_defaults (GTK_TABLE (table), label, 0, 5, 1, 2); gtk_widget_show (label); struct Lower_Layer_Details *t = LLfirst; memset(buff, '\0', strlen(buff)); if (t == NULL) { /* Place lable on a spacific position on table with text 'No records were found'*/ label = gtk_label_new (" "); markup6 = g_markup_printf_escaped ("No Lower Level PMU/PDC is Registered With This iPDC."); gtk_label_set_markup (GTK_LABEL (label), markup6); gtk_table_attach_defaults (GTK_TABLE (table), label, 0, 5, 2, 3); gtk_widget_show (label); g_free(markup6); label = gtk_hseparator_new(); gtk_table_attach_defaults (GTK_TABLE (table), label, 0, 5, 3, 4); gtk_widget_show (label); } else { i = 2; label = gtk_label_new ("ID Code"); gtk_table_attach_defaults (GTK_TABLE (table), label, 0, 1,i, i+1); gtk_widget_show (label); label = gtk_label_new ("IP"); gtk_table_attach_defaults (GTK_TABLE (table), label, 1, 2, i, i+1); gtk_widget_show (label); label = gtk_label_new ("Port"); gtk_table_attach_defaults (GTK_TABLE (table), label, 2, 3, i, i+1); gtk_widget_show (label); label = gtk_label_new ("Protocol"); gtk_table_attach_defaults (GTK_TABLE (table), label, 3, 4, i, i+1); gtk_widget_show (label); i++; label = gtk_hseparator_new(); gtk_table_attach_defaults (GTK_TABLE (table), label, 0, 5, i, i+1); gtk_widget_show (label); i++; while(t != NULL) { /* Concate all the data into a big buffer */ memset(tmp_str,'\0',sizeof(tmp_str)); sprintf(tmp_str, "%d", t->pmuid); label = gtk_label_new (tmp_str); gtk_table_attach_defaults (GTK_TABLE (table), label, 0, 1, i, i+1); gtk_widget_show (label); memset(tmp_str,'\0',sizeof(tmp_str)); strcpy(tmp_str, t->ip); label = gtk_label_new (tmp_str); gtk_table_attach_defaults (GTK_TABLE (table), label, 1, 2, i, i+1); gtk_widget_show (label); memset(tmp_str,'\0',sizeof(tmp_str)); sprintf(tmp_str, "%d", t->port); label = gtk_label_new (tmp_str); gtk_table_attach_defaults (GTK_TABLE (table), label, 2, 3, i, i+1); gtk_widget_show (label); memset(tmp_str,'\0',sizeof(tmp_str)); strncpy(tmp_str, t->protocol,3); label = gtk_label_new (tmp_str); gtk_table_attach_defaults (GTK_TABLE (table), label, 3, 4, i, i+1); gtk_widget_show (label); i++; t = t->next; } } /* Print some text on lable with color and proper font */ label = gtk_label_new ("-"); markup7 = g_markup_printf_escaped ("\nDestination Devices Connection Table"); gtk_label_set_markup (GTK_LABEL (label), markup7); gtk_table_attach_defaults (GTK_TABLE (table), label, 0, 5, i+2, i+3); gtk_widget_show (label); g_free (markup7); i = i+3; label = gtk_hseparator_new(); gtk_table_attach_defaults (GTK_TABLE (table), label, 0, 5, i, i+1); gtk_widget_show (label); i++; struct Upper_Layer_Details *t1 = ULfirst; memset(buff, '\0', strlen(buff)); if (t1 == NULL) { /* Place lable on a spacific position on table with text 'No records were found'*/ label = gtk_label_new (" "); markup8 = g_markup_printf_escaped ("No Higher Level PDC is Registered With This PDC."); gtk_label_set_markup (GTK_LABEL (label), markup8); gtk_table_attach_defaults (GTK_TABLE (table), label, 0, 4, i, i+1); gtk_widget_show (label); g_free(markup8); label = gtk_hseparator_new(); gtk_table_attach_defaults (GTK_TABLE (table), label, 0, 5, i, i+1); gtk_widget_show (label); i++; } else { label = gtk_label_new ("IP"); gtk_table_attach_defaults (GTK_TABLE (table), label, 0, 1, i, i+1); gtk_widget_show (label); label = gtk_label_new ("Port"); gtk_table_attach_defaults (GTK_TABLE (table), label, 1, 2, i, i+1); gtk_widget_show (label); label = gtk_label_new ("Protocol"); gtk_table_attach_defaults (GTK_TABLE (table), label, 2, 3, i, i+1); gtk_widget_show (label); i++; label = gtk_hseparator_new(); gtk_table_attach_defaults (GTK_TABLE (table), label, 0, 5, i, i+1); gtk_widget_show (label); i++; while(t1 != NULL) { memset(tmp_str,'\0',sizeof(tmp_str)); strcpy(tmp_str, t1->ip); label = gtk_label_new (tmp_str); gtk_table_attach_defaults (GTK_TABLE (table), label, 0, 1, i, i+1); gtk_widget_show (label); memset(tmp_str,'\0',sizeof(tmp_str)); sprintf(tmp_str, "%d", t1->port); label = gtk_label_new (tmp_str); gtk_table_attach_defaults (GTK_TABLE (table), label, 1, 2, i, i+1); gtk_widget_show (label); memset(tmp_str,'\0',sizeof(tmp_str)); strncpy(tmp_str, t1->protocol,3); label = gtk_label_new (tmp_str); gtk_table_attach_defaults (GTK_TABLE (table), label, 2, 3, i, i+1); gtk_widget_show (label); i++; t1 = t1->next; } } /* Signal handling when Window will distroy or closed */ g_signal_connect_swapped (close_button, "clicked", G_CALLBACK (gtk_widget_destroy), new_window); /* This makes it so the button is the default. */ gtk_widget_set_can_default (close_button, TRUE); gtk_box_pack_start (gtk_dialog_get_action_area(new_window), close_button, TRUE, TRUE, 0); /* This grabs this button to be the default button. Simply hitting the "Enter" key will cause this button to activate. */ gtk_widget_grab_default (close_button); gtk_widget_show (close_button); /* Finally show the new_window or Connection window */ gtk_widget_show (new_window); }; /* ---------------------------------------------------------------------------- */ /* FUNCTION ipdc_setup_fileSelector(GtkWidget *widget, gpointer udata) */ /* It will display a file selector window to the user. User have the */ /* responsibility to choose the correct previously saved file for iPDC Setup. */ /* ---------------------------------------------------------------------------- */ void ipdc_setup_fileSelector (GtkWidget *widget, gpointer udata) { strcat(ipdcFolderPath,"/"); gint res; /* Create a new file selection widget */ ipdc_setup_window = gtk_file_chooser_dialog_new("Open File", GTK_WINDOW(widget), GTK_FILE_CHOOSER_ACTION_OPEN, "_Cancel", GTK_RESPONSE_CANCEL, "_Open", GTK_RESPONSE_ACCEPT, NULL); res = gtk_dialog_run(GTK_DIALOG(ipdc_setup_window)); if(res == GTK_RESPONSE_ACCEPT) { char *filename; filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(ipdc_setup_window)); strcpy(ipdcFilePath, filename); view_setup_file(filename); g_free(filename); } /* Lets set the filename, as if this were a save dialog, and we are giving a default filename */ // gtk_file_selection_set_filename (GTK_FILE_SELECTION(ipdc_setup_window), ipdcFolderPath); // gtk_widget_show(ipdc_setup_window); } /* ---------------------------------------------------------------------------- */ /* FUNCTION view_setup_file(GtkWidget *w, GtkFileChooser *fs) */ /* This function displays the different attributes of selected iPDC Setup File. */ /* It will show the iPDC connectoin details before apply. */ /* ---------------------------------------------------------------------------- */ void view_setup_file (char *filename) { /* local variables */ GtkWidget *label, *hsep; GtkWidget *table, *scrolled_window; GtkWidget *apply_button, *cancel_button; int tempi, rowCount; int sDevices, dDevices, rowi; char *d1, buff[200], *s; char *markup,*rline = NULL; size_t len = 0; ssize_t read; FILE *fp1; strcpy(fptr, filename); gtk_widget_destroy(ipdc_setup_window); fp1 = fopen(s, "rb"); if (fp1 == NULL) { validation_result(" Setup file doesn't exist! Try again"); } else { rowCount = 11; sDevices = 0; dDevices = 0; tempi = 0; while(tempi < 6) //iPDCServer { read = getline(&rline, &len, fp1); tempi++; } if(read > 0) //LowerDevices { d1 = strtok (rline," "); d1 = strtok (NULL,"\n"); tempi = atoi(d1); sDevices = tempi; rowCount = rowCount + 5*sDevices; while (tempi > 0) { read = getline(&rline, &len, fp1); tempi--; } } read = getline(&rline, &len, fp1); //UpperDevices if(read > 0) { d1 = strtok (rline," "); d1 = strtok (NULL,"\n"); tempi = atoi(d1); dDevices = tempi; rowCount = rowCount + 4*dDevices; while (tempi > 0) { read = getline(&rline, &len, fp1); tempi--; } } fclose (fp1); /* Open the iPDC Setup File in read mode */ fp1 = fopen(s, "rb"); /* If its available, then create a new dialog window for displaying the iPDC details. */ setup_display_window = gtk_dialog_new (); g_signal_connect (setup_display_window, "destroy", G_CALLBACK (gtk_widget_destroy), setup_display_window); gtk_window_set_title (GTK_WINDOW (setup_display_window), "iPDC Setup"); gtk_container_set_border_width (GTK_CONTAINER (setup_display_window), 10); /* Create a new scrolled window */ scrolled_window = gtk_scrolled_window_new (NULL, NULL); gtk_container_set_border_width (GTK_CONTAINER (scrolled_window), 10); gtk_widget_set_size_request (scrolled_window, -1, 450); /* The policy is one of GTK_POLICY AUTOMATIC, or GTK_POLICY_ALWAYS. */ gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC); /* The dialog window is created with a vbox packed into it */ gtk_box_pack_start (GTK_BOX (GTK_DIALOG(setup_display_window)), scrolled_window, TRUE, TRUE, 0); gtk_widget_show (scrolled_window); /* Create a table of ? by 2 squares */ rowCount = dDevices + sDevices + 15; table = gtk_table_new (rowCount, 5, FALSE); /* set the spacing to 10 on x and 10 on y */ gtk_table_set_row_spacings (GTK_TABLE (table), 8); gtk_table_set_col_spacings (GTK_TABLE (table), 16); /* Pack the table into the window */ gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (scrolled_window), table); gtk_widget_show (table); /* Add a "close" button to the bottom of the dialog */ apply_button = gtk_button_new_from_stock (GTK_STOCK_APPLY); cancel_button = gtk_button_new_from_stock (GTK_STOCK_CANCEL); /* This simply creates a grid of labels on the table to demonstrate the window. g_markup_printf_escaped (): function to display diffrent color and font of text on label */ label = gtk_label_new (" "); markup = g_markup_printf_escaped ("iPDC Setup File Details"); gtk_label_set_markup (GTK_LABEL (label), markup); gtk_table_attach_defaults (GTK_TABLE (table), label, 0, 5, 0, 1); gtk_widget_show (label); g_free (markup); label = gtk_hseparator_new(); gtk_table_attach_defaults (GTK_TABLE (table), label, 0, 5, 1, 2); gtk_widget_show (label); label = gtk_label_new (" "); markup = g_markup_printf_escaped ("iPDC Server "); gtk_label_set_markup (GTK_LABEL (label), markup); gtk_table_attach_defaults (GTK_TABLE (table), label, 0, 5, 2, 3); gtk_widget_show (label); g_free (markup); label = gtk_label_new ("iPDC ID Code"); gtk_table_attach_defaults (GTK_TABLE (table), label, 0, 1, 3, 4); gtk_widget_show (label); label = gtk_label_new ("iPDC UDP Port"); gtk_table_attach_defaults (GTK_TABLE (table), label, 1, 2, 3, 4); gtk_widget_show (label); label = gtk_label_new ("iPDC TCP Port"); gtk_table_attach_defaults (GTK_TABLE (table), label, 2, 3, 3, 4); gtk_widget_show (label); label = gtk_label_new ("DB Server IP"); gtk_table_attach_defaults (GTK_TABLE (table), label, 3, 4, 3, 4); gtk_widget_show (label); label = gtk_label_new ("DB Server Port "); gtk_table_attach_defaults (GTK_TABLE (table), label, 4, 5, 3, 4); gtk_widget_show (label); label = gtk_hseparator_new(); gtk_table_attach_defaults (GTK_TABLE (table), label, 0, 5, 4, 5); gtk_widget_show (label); /* This simply read from file and print on label in the table. */ getline(&rline, &len, fp1); //To read 'ipdcServer 1' line getline(&rline, &len, fp1); label = gtk_label_new (rline); gtk_table_attach_defaults (GTK_TABLE (table), label, 0, 1, 5, 6); gtk_widget_show (label); getline(&rline, &len, fp1); label = gtk_label_new (rline); gtk_table_attach_defaults (GTK_TABLE (table), label, 1, 2, 5, 6); gtk_widget_show (label); getline(&rline, &len, fp1); label = gtk_label_new (rline); gtk_table_attach_defaults (GTK_TABLE (table), label, 2, 3, 5, 6); gtk_widget_show (label); getline(&rline, &len, fp1); label = gtk_label_new (rline); gtk_table_attach_defaults (GTK_TABLE (table), label, 3, 4, 5, 6); gtk_widget_show (label); /* This is print static text (9000) on label in the table. */ sprintf(buff, "9000"); label = gtk_label_new (buff); gtk_table_attach_defaults (GTK_TABLE (table), label, 4, 5, 5, 6); gtk_widget_show (label); label = gtk_hseparator_new(); gtk_table_attach_defaults (GTK_TABLE (table), label, 0, 5, 6, 7); gtk_widget_show (label); getline(&rline, &len, fp1); //To read 'LowerDevices' line label = gtk_label_new (" "); markup = g_markup_printf_escaped ("Source Devices "); gtk_label_set_markup (GTK_LABEL (label), markup); gtk_table_attach_defaults (GTK_TABLE (table), label, 0, 5, 7, 8); gtk_widget_show (label); g_free (markup); sprintf(buff, "Measurement Received From Total : %d Devices", sDevices); label = gtk_label_new (buff); gtk_table_attach_defaults (GTK_TABLE (table), label, 0, 5, 8, 9 ); gtk_widget_show (label); rowi = 9; if (sDevices > 0) { label = gtk_label_new ("Source ID"); gtk_table_attach_defaults (GTK_TABLE (table), label, 0, 1, rowi, rowi+1); gtk_widget_show (label); label = gtk_label_new ("Source IP"); gtk_table_attach_defaults (GTK_TABLE (table), label, 1, 2, rowi, rowi+1); gtk_widget_show (label); label = gtk_label_new ("Port"); gtk_table_attach_defaults (GTK_TABLE (table), label, 2, 3, rowi, rowi+1); gtk_widget_show (label); label = gtk_label_new ("Protocol"); gtk_table_attach_defaults (GTK_TABLE (table), label, 3, 4, rowi, rowi+1); gtk_widget_show (label); rowi = rowi+1; } label = gtk_hseparator_new(); gtk_table_attach_defaults (GTK_TABLE (table), label, 0, 5, rowi, rowi+1); gtk_widget_show (label); rowi = rowi+1; int i = 1; for(i; i <= sDevices; i++) { getline(&rline, &len, fp1); d1 = strtok (rline,","); label = gtk_label_new (d1); gtk_table_attach_defaults (GTK_TABLE (table), label, 0, 1, rowi, rowi+1); gtk_widget_show (label); d1 = strtok (NULL,","); label = gtk_label_new (d1); gtk_table_attach_defaults (GTK_TABLE (table), label, 1, 2, rowi, rowi+1); gtk_widget_show (label); d1 = strtok (NULL,","); label = gtk_label_new (d1); gtk_table_attach_defaults (GTK_TABLE (table), label, 2, 3, rowi, rowi+1); gtk_widget_show (label); d1 = strtok (NULL,"\n"); label = gtk_label_new (d1); gtk_table_attach_defaults (GTK_TABLE (table), label, 3, 4, rowi, rowi+1); gtk_widget_show (label); rowi = rowi + 1; } label = gtk_hseparator_new(); gtk_table_attach_defaults (GTK_TABLE (table), label, 0, 5, rowi, rowi+1); gtk_widget_show (label); rowi = rowi+1; getline(&rline, &len, fp1); //To read 'UpperDevices' line label = gtk_label_new (" "); markup = g_markup_printf_escaped ("Destination Devices"); gtk_label_set_markup (GTK_LABEL (label), markup); gtk_table_attach_defaults (GTK_TABLE (table), label, 0, 5, rowi, rowi+1); gtk_widget_show (label); g_free (markup); rowi = rowi + 1; sprintf(buff, "Consolidated Measurement Provided To Total : %d Devices", dDevices); label = gtk_label_new (buff); gtk_table_attach_defaults (GTK_TABLE (table), label, 0, 5, rowi, rowi+1); gtk_widget_show (label); rowi = rowi + 1; if (dDevices > 0) { label = gtk_label_new ("Destination IP"); gtk_table_attach_defaults (GTK_TABLE (table), label, 0, 1, rowi, rowi+1); gtk_widget_show (label); label = gtk_label_new ("Port"); gtk_table_attach_defaults (GTK_TABLE (table), label, 1, 2, rowi, rowi+1); gtk_widget_show (label); label = gtk_label_new ("Protocol"); gtk_table_attach_defaults (GTK_TABLE (table), label, 2, 3, rowi, rowi+1); gtk_widget_show (label); rowi = rowi + 1; } label = gtk_hseparator_new(); gtk_table_attach_defaults (GTK_TABLE (table), label, 0, 5, rowi, rowi+1); gtk_widget_show (label); rowi = rowi+1; for(i=0; i 0) { d3 = strtok (l1, " "); d4 = strtok (NULL, "\n"); if((!(strcmp(d3, "ipdcServer"))) && (atoi(d4) == 1)) { strcpy(ipdcFilePath, s); ipdcFilePath[strlen(ipdcFilePath)] = '\0'; flag = 1; } else { fclose(fp); validation_result(" Setup file data does not matched? Try a proper file "); } } else { fclose(fp); validation_result("Setup file is empty?? Try a proper file "); } } if(flag == 1) fill_pdc_details (ipdcFilePath); } /* ---------------------------------------------------------------------------- */ /* FUNCTION display_time() */ /* Display the time on time lable on main PMU Simulator window. */ /* ---------------------------------------------------------------------------- */ void* display_time() { struct timeval tv; struct tm* ptm; char time_string[40]; while(1) { /* Obtain the time of day, and convert it to a tm struct. */ gettimeofday (&tv, NULL); /* Format the date and time, down to a single second. */ memset(time_string, '\0', 40); ptm = localtime (&tv.tv_sec); strftime (time_string, sizeof (time_string), "%Y-%m-%d, %H:%M:%S", ptm); gtk_label_set_text(GTK_LABEL(data->time_lable), time_string); sleep(1); } /* Exit the display time thread at the time of PMU Closing */ pthread_exit(NULL); } /**************************************** End of File *******************************************************/