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