c++/POSIXoveFronty/Fronta/program.cpp
author František Kučera <franta-hg@frantovo.cz>
Tue, 07 Apr 2009 12:30:11 +0200
changeset 8 e1b7dbc6dc4a
parent 7 cd5d8916d983
child 10 18317e52d52b
permissions -rw-r--r--
Text zprávy pochází od uživatele. Přijímání i odesílání běží v nekonečných cyklech.
     1 /**
     2  * Program POSIXové Fronty
     3  * @autor František Kučera <franta-hg@frantovo.cz>
     4  */
     5 
     6 #include <program.h>
     7 #include <stdlib.h>
     8 #include <iostream>
     9 #include <readline/readline.h>
    10 #include <signal.h>
    11 #include <strings.h>
    12 
    13 #include "fronta.h"
    14 
    15 using namespace std;
    16 
    17 /**
    18  * Spuštění programu „POSIXovéFronty“
    19  */
    20 int main() {
    21 
    22     cout << "Vítejte v programu POSIXovéFronty" << endl;
    23 
    24     /** Nastavíme reakci na signál SIGTERM */
    25     signal(SIGTERM, zpracujSignal);
    26     signal(SIGINT, zpracujSignal);
    27 
    28     /** TODO: zeptat se na název fronty – readline */
    29     //strcpy(nazevFronty, VYCHOZI_NAZEV_FRONTY);
    30     nazevFronty = "/mojeFronta";
    31 
    32     /** Program pracuje buď v režimu přijímání nebo odesílání */
    33     if (isOdesilaciRezim()) {
    34         odesilej();
    35     } else {
    36         prijimej();
    37     }
    38 
    39     /** Sem se nedostaneme, pokud metody poběží v cyklu – program končí, až když dostane patřičný signál. */
    40     fronta.zavriFrontu(false);
    41     return (EXIT_SUCCESS);
    42 }
    43 
    44 bool isOdesilaciRezim() {
    45 
    46     cout << "Zvolte režim: (p)řijímací / (o)desílací" << endl;
    47 
    48     char odpoved = cin.get();
    49     cin.get();
    50 
    51     if (odpoved == 'o') {
    52         return true;
    53     } else if (odpoved == 'p') {
    54         return false;
    55     } else {
    56         return isOdesilaciRezim();
    57     }
    58 }
    59 
    60 void odesilej() {
    61     cout << "Odesíláme…" << endl;
    62     fronta = Fronta(nazevFronty, false, true);
    63 
    64     while (true) {
    65         /** TODO: načítat pomocí readline */
    66         char zprava[100];
    67         cout << "Zadejte zprávu: \033[22;32m";
    68         cin.getline(zprava, 100);
    69         cout << "\033[0m\n";
    70 
    71         if (fronta.odesliZpravu(zprava) == 0) {
    72             cout << "Zpráva odeslána." << endl;
    73         } else {
    74             cout << "Při odesílání zprávy došlo k chybě." << endl;
    75         }
    76     }
    77 }
    78 
    79 void prijimej() {
    80     cout << "Přijímáme…" << endl;
    81     fronta = Fronta(nazevFronty, true, false);
    82 
    83     while (true) {
    84         char* zprava = fronta.prijmiZpravu();
    85 
    86         if (zprava == NULL) {
    87             cout << "Nepodařilo se přijmout zprávu." << endl;
    88         } else {
    89             printf("Přijatá zpráva: \033[22;32m%s\033[0m\n", zprava); // zelená
    90         }
    91     }
    92 }
    93 
    94 void zpracujSignal(int signal) {
    95     if (signal == SIGTERM || signal == SIGINT) {
    96         fronta.zavriFrontu(false);
    97         cout << endl << "\033[22;31m" << "Končím program na základě signálu " << signal << "." << "\033[0m" << endl; // červená
    98         exit(1);
    99     }
   100 }
   101