Advertisement
patryk

SOP Client

Feb 9th, 2015
530
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 10.29 KB | None | 0 0
  1. #include <gtk/gtk.h>
  2. #include <ctype.h>
  3. #include <stdlib.h>
  4. #include <stdio.h>
  5. #include <ctype.h>
  6. #include <stdbool.h>
  7. #include <unistd.h>
  8. #include <sys/ipc.h>
  9. #include <sys/sem.h>
  10. #include <sys/types.h>
  11.  
  12. //----SEMAFORY----
  13. int clientReadySID, serverReadySID;
  14. struct sembuf clientReady;
  15. struct sembuf serverReady;
  16.  
  17.  
  18. //----STRUKTURY----
  19. struct prepareClient {
  20.     long mtype;
  21.     int CSQueueNumber;
  22.     int SCQueueNumber;
  23. };
  24.  
  25. struct clientStatus {
  26.     long mtype;
  27.     int surowce;
  28.     int lekka_piechota;
  29.     int ciezka_piechota;
  30.     int jazda;
  31.     int robotnicy;
  32.     int punkty;
  33. };
  34.  
  35. struct message {
  36.     long mtype;
  37.     int value;
  38. };
  39.  
  40. //----AZER_STAF-----
  41. char playerNumber = 0;
  42. int client_server_QID;
  43. int server_client_QID;
  44.  
  45. GtkWidget *progressBar;
  46. GtkWidget *waitingLabel;
  47. GtkWidget *lekkaPiechotaLabel;
  48. GtkWidget *ciezkaPiechotaLabel;
  49. GtkWidget *jazdaLabel;
  50. GtkWidget *robotnicyLabel;
  51. GtkWidget *surowceLabel;
  52. GtkWidget *punktyLabel;
  53.  
  54.  
  55. bool isInteger(const char *str) {
  56.    if (!*str || (int)*str == 48)
  57.       return false;
  58.  
  59.    while (*str)
  60.    {
  61.       if (!isdigit(*str))
  62.          return false;
  63.       else
  64.          ++str;
  65.    }
  66.  
  67.    return true;
  68. }
  69.  
  70. void closeClient(GtkWidget *widget, gpointer data) {
  71.     clientReady.sem_op = 1;
  72.     semop(clientReadySID, &clientReady, 1);
  73.     gtk_main_quit();
  74. }
  75.  
  76. //================--OBSŁUGA-BUTTONÓW--====================
  77.  
  78. void lekka_piechota_click(GtkWidget *widget, gpointer data) {
  79.     GtkEntry* entry = (GtkEntry*)data;
  80.     char *dane;
  81.     dane = (char*)gtk_entry_get_text(entry);
  82.     if(isInteger(dane)) {
  83.         struct message recruit;
  84.         int recruit_ID = msgget(client_server_QID, 0606 | IPC_CREAT);
  85.  
  86.         recruit.mtype = 3;
  87.         recruit.value = atoi(dane);
  88.  
  89.         msgsnd(recruit_ID, &recruit, 20, 0);   
  90.     }
  91. }
  92.  
  93. void ciezka_piechota_click(GtkWidget *widget, gpointer data) {
  94.     GtkEntry* entry = (GtkEntry*)data;
  95.     char *dane;
  96.     dane = (char*)gtk_entry_get_text(entry);
  97.     if(isInteger(dane)) {
  98.         struct message recruit;
  99.         int recruit_ID = msgget(client_server_QID, 0606 | IPC_CREAT);
  100.  
  101.         recruit.mtype = 4;
  102.         recruit.value = atoi(dane);
  103.  
  104.         msgsnd(recruit_ID, &recruit, 20, 0);
  105.     }
  106. }
  107.  
  108. void jazda_click(GtkWidget *widget, gpointer data) {
  109.     GtkEntry* entry = (GtkEntry*)data;
  110.     char *dane;
  111.     dane = (char*)gtk_entry_get_text(entry);
  112.     if(isInteger(dane)) {
  113.         struct message recruit;
  114.         int recruit_ID = msgget(client_server_QID, 0606 | IPC_CREAT);
  115.  
  116.         recruit.mtype = 5;
  117.         recruit.value = atoi(dane);
  118.  
  119.         msgsnd(recruit_ID, &recruit, 20, 0);
  120.     }
  121. }
  122.  
  123. void robotnicy_click(GtkWidget *widget, gpointer data) {
  124.     GtkEntry* entry = (GtkEntry*)data;
  125.     char *dane;
  126.     dane = (char*)gtk_entry_get_text(entry);
  127.     if(isInteger(dane)) {
  128.         struct message recruit;
  129.         int recruit_ID = msgget(client_server_QID, 0606 | IPC_CREAT);
  130.  
  131.         recruit.mtype = 6;
  132.         recruit.value = atoi(dane);
  133.  
  134.         msgsnd(recruit_ID, &recruit, 20, 0);
  135.     }
  136. }
  137.  
  138. void walka_click(GtkWidget *widget, gpointer data) {
  139.  
  140. }
  141.  
  142.  
  143. static gpointer serverIsReady(gpointer data) {
  144.  
  145.     struct prepareClient pC;
  146.     int pC_ID = msgget(1000, 0606 | IPC_CREAT);
  147.  
  148.     msgrcv(pC_ID, &pC, 10, 0, 0);
  149.     client_server_QID = pC.CSQueueNumber;
  150.     server_client_QID = pC.SCQueueNumber;
  151.  
  152.     serverReady.sem_num = 0;
  153.     serverReady.sem_flg = 0;
  154.     serverReady.sem_op = -1;
  155.     semop(serverReadySID, &serverReady, 1);
  156.     GtkWidget* window = (GtkWidget*)data;
  157.     gdk_threads_enter();
  158.     gtk_widget_show_all(window);
  159.     gtk_widget_hide(progressBar);
  160.     gtk_widget_hide(waitingLabel);
  161.     gdk_threads_leave();
  162.  
  163.     if(fork()) {
  164.         while (1) {
  165.  
  166.             struct clientStatus cS;
  167.             int cS_ID = msgget(server_client_QID, 0606 | IPC_CREAT);
  168.  
  169.             msgrcv(cS_ID, &cS, 50, 1, 0);  
  170.    
  171.             char LP_Status[10], CP_Status[10], J_Status[10], R_Status[10], S_Status[10], P_Status[10];
  172.             sprintf(LP_Status, "%d", cS.lekka_piechota);
  173.             sprintf(CP_Status, "%d", cS.ciezka_piechota);
  174.             sprintf(J_Status, "%d", cS.jazda);
  175.             sprintf(R_Status, "%d", cS.robotnicy);
  176.             sprintf(S_Status, "%d", cS.surowce);
  177.             sprintf(P_Status, "%d", cS.punkty);
  178.  
  179.             gdk_threads_enter();
  180.             gtk_label_set_text((GtkLabel*)lekkaPiechotaLabel, LP_Status);
  181.             gtk_label_set_text((GtkLabel*)ciezkaPiechotaLabel, CP_Status);
  182.             gtk_label_set_text((GtkLabel*)jazdaLabel, J_Status);
  183.             gtk_label_set_text((GtkLabel*)robotnicyLabel, R_Status);
  184.             gtk_label_set_text((GtkLabel*)surowceLabel, S_Status);
  185.             gtk_label_set_text((GtkLabel*)punktyLabel, P_Status);
  186.             gdk_threads_leave();
  187.         }
  188.     }
  189. }
  190.  
  191.  
  192. gboolean pulse(gpointer data) {
  193.     gtk_progress_bar_pulse(GTK_PROGRESS_BAR(data));
  194.     return TRUE;
  195. }
  196.  
  197. /**
  198.  Funkcja odpowiadająca za inicjalizacje całego GUI
  199.     @param window wskaźnik na okno
  200.     @param container wskaźnik na kontener przechowujący widgety
  201.     @param lekka_piechota wskaźnik na button dla lekkiej piechoty
  202.     @param ciezka_piechota wskaznik na button dla ciezkiej piechoty
  203.     @param jazda wskaźnik na button dla jazdy
  204.     @param robotnicy wskaźnik na button dla robotników
  205.     @param walka wskaźnik na button dla walki
  206. */
  207. void GTK_INIT(int argc, char* argv[], GtkWidget *window, GtkWidget *container, GtkWidget *lekka_piechota, GtkWidget *ciezka_piechota, GtkWidget *jazda, GtkWidget *robotnicy, GtkWidget *walka) {
  208.   GtkWidget *frame;
  209.     GtkWidget *lekka_piechota_label;
  210.     GtkWidget *lekka_piechota_entry;
  211.     GtkWidget *ciezka_piechota_entry;
  212.     GtkWidget *jazda_entry;
  213.     GtkWidget *robotnicy_entry;
  214.     GtkWidget *waitingContainer;
  215.  
  216.     GThread *waitForServer;
  217.     GError *error = NULL;
  218.  
  219.     if(!g_thread_supported())
  220.         g_thread_init(NULL);
  221.     gdk_threads_init();
  222.     gdk_threads_enter();
  223.   gtk_init(&argc, &argv);
  224.  
  225. //---------------TWORZENIE OBIEKTÓW----------------
  226.     window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
  227.     container = gtk_fixed_new();
  228.     lekka_piechota = gtk_button_new_with_label("Lekka Piechota");
  229.     ciezka_piechota = gtk_button_new_with_label("Ciężka Piechota");
  230.     jazda = gtk_button_new_with_label("Jazda");
  231.     robotnicy = gtk_button_new_with_label("Robotnicy");
  232.     walka = gtk_button_new_with_label("Walka");
  233.     frame = gtk_frame_new("    GAME INFO    ");
  234.     lekka_piechota_label = gtk_label_new("Lekka Piechota: \n\nCiezka Piechota: \n\nJazda: \n\nRobotnicy: \n\nSurowce: \n\nPunkty: ");
  235.     lekka_piechota_entry = gtk_entry_new();
  236.     ciezka_piechota_entry = gtk_entry_new();
  237.     jazda_entry = gtk_entry_new();
  238.     robotnicy_entry = gtk_entry_new();
  239.     progressBar = gtk_progress_bar_new();
  240.     waitingLabel = gtk_label_new("Waiting for second player.");
  241.     waitingContainer = gtk_fixed_new();
  242.     lekkaPiechotaLabel = gtk_label_new("0");
  243.     ciezkaPiechotaLabel = gtk_label_new("0");
  244.     jazdaLabel = gtk_label_new("0");
  245.     robotnicyLabel = gtk_label_new("0");
  246.     surowceLabel = gtk_label_new("0");
  247.     punktyLabel = gtk_label_new("0");
  248.  
  249. //--------------INICJALIZACJA OBIEKTÓW--------------
  250.   gtk_container_add(GTK_CONTAINER(window), container);
  251.  
  252.   gtk_window_set_default_size (GTK_WINDOW(window), 480, 350);
  253.   gtk_window_set_position (GTK_WINDOW(window), GTK_WIN_POS_CENTER);
  254.   gtk_window_set_title (GTK_WINDOW(window), "Gra");
  255.  
  256.     //-------------DODANIE BUTTONÓW------------
  257.   gtk_fixed_put(GTK_FIXED(container), lekka_piechota, 5, 305);
  258.   gtk_widget_set_size_request(lekka_piechota, 120, 35);
  259.  
  260.   gtk_fixed_put(GTK_FIXED(container), ciezka_piechota, 126, 305);
  261.   gtk_widget_set_size_request(ciezka_piechota, 122, 35);
  262.  
  263.   gtk_fixed_put(GTK_FIXED(container), jazda, 248, 305);
  264.   gtk_widget_set_size_request(jazda, 57, 35);
  265.  
  266.   gtk_fixed_put(GTK_FIXED(container), robotnicy, 305, 305);
  267.   gtk_widget_set_size_request(robotnicy, 83, 35);
  268.  
  269.   gtk_fixed_put(GTK_FIXED(container), walka, 405, 305);
  270.   gtk_widget_set_size_request(walka, 70, 35);
  271.  
  272.   gtk_frame_set_shadow_type(GTK_FRAME(frame), GTK_SHADOW_IN);
  273.   gtk_fixed_put(GTK_FIXED(container), frame, 10, 10);
  274.   gtk_widget_set_size_request(frame, 460, 250);
  275.  
  276.     gtk_fixed_put(GTK_FIXED(container), lekka_piechota_label, 130, 50);
  277.  
  278.     //----------DODANIE PÓL TYPU ENTRY-----------
  279.     gtk_fixed_put(GTK_FIXED(container), lekka_piechota_entry, 5, 270);
  280.     gtk_widget_set_size_request(lekka_piechota_entry, 120, 30);
  281.  
  282.     gtk_fixed_put(GTK_FIXED(container), ciezka_piechota_entry, 126, 270);
  283.     gtk_widget_set_size_request(ciezka_piechota_entry, 122, 30);
  284.  
  285.     gtk_fixed_put(GTK_FIXED(container), jazda_entry, 248, 270);
  286.     gtk_widget_set_size_request(jazda_entry, 57, 30);
  287.  
  288.     gtk_fixed_put(GTK_FIXED(container), robotnicy_entry, 305, 270);
  289.     gtk_widget_set_size_request(robotnicy_entry, 83, 30);
  290.  
  291.  
  292.     gtk_fixed_put(GTK_FIXED(container), progressBar, 162, 175);
  293.     g_timeout_add(90, ( GSourceFunc ) pulse, progressBar);
  294.     gtk_fixed_put(GTK_FIXED(container), waitingLabel, 148, 151);
  295.  
  296.     gtk_fixed_put(GTK_FIXED(container), lekkaPiechotaLabel, 250, 51);
  297.     gtk_fixed_put(GTK_FIXED(container), ciezkaPiechotaLabel, 250, 85);
  298.     gtk_fixed_put(GTK_FIXED(container), jazdaLabel, 250, 119);
  299.     gtk_fixed_put(GTK_FIXED(container), robotnicyLabel, 250, 153);
  300.     gtk_fixed_put(GTK_FIXED(container), surowceLabel, 250, 187);
  301.     gtk_fixed_put(GTK_FIXED(container), punktyLabel, 250, 221);
  302.  
  303. //------------DEKLARACJE FINALIZUJĄCE--------------
  304.   g_signal_connect(G_OBJECT(window), "destroy", G_CALLBACK(closeClient), NULL);
  305.  
  306.     g_signal_connect(lekka_piechota, "pressed", G_CALLBACK(lekka_piechota_click), (gpointer)lekka_piechota_entry);
  307.     g_signal_connect(ciezka_piechota, "pressed", G_CALLBACK(ciezka_piechota_click), (gpointer)ciezka_piechota_entry);
  308.     g_signal_connect(jazda, "pressed", G_CALLBACK(jazda_click), (gpointer)jazda_entry);
  309.     g_signal_connect(robotnicy, "pressed", G_CALLBACK(robotnicy_click), (gpointer)robotnicy_entry);
  310.     g_signal_connect(walka, "pressed", G_CALLBACK(walka_click), NULL);
  311.  
  312.   gtk_widget_show(window);
  313.     gtk_widget_show(container);
  314.     gtk_widget_show(progressBar);
  315.     gtk_widget_show(waitingLabel);
  316.    
  317.     waitForServer = g_thread_create(serverIsReady, (gpointer)window, FALSE, &error);
  318.  
  319.     gtk_main();
  320.     gdk_threads_leave();
  321. }
  322.  
  323. int main (int argc, char* argv[]) {
  324.   GtkWidget *window;
  325.   GtkWidget *container;
  326.   GtkWidget *lekka_piechota;
  327.   GtkWidget *ciezka_piechota;
  328.   GtkWidget *jazda;
  329.   GtkWidget *robotnicy;
  330.   GtkWidget *walka;
  331.    
  332.     clientReadySID = semget(7001, 1, 0600 | IPC_CREAT);
  333.     serverReadySID = semget(7002, 1, 0600 | IPC_CREAT);
  334.  
  335.     if(clientReadySID == -1 || serverReadySID == -1) {
  336.         exit(1);
  337.     }
  338.  
  339.     clientReady.sem_num = 0;
  340.     clientReady.sem_flg = 0;
  341.     clientReady.sem_op = 1;
  342.     semop(clientReadySID, &clientReady, 1);
  343.    
  344.     if(fork())
  345.   GTK_INIT(argc, argv, window, container, lekka_piechota, ciezka_piechota, jazda, robotnicy, walka);
  346.    
  347.   return 0;
  348. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement