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.
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@4
    27
franta-hg@8
    28
    /** TODO: zeptat se na název fronty – readline */
franta-hg@6
    29
    //strcpy(nazevFronty, VYCHOZI_NAZEV_FRONTY);
franta-hg@6
    30
    nazevFronty = "/mojeFronta";
franta-hg@1
    31
franta-hg@5
    32
    /** Program pracuje buď v režimu přijímání nebo odesílání */
franta-hg@1
    33
    if (isOdesilaciRezim()) {
franta-hg@1
    34
        odesilej();
franta-hg@1
    35
    } else {
franta-hg@1
    36
        prijimej();
franta-hg@1
    37
    }
franta-hg@1
    38
franta-hg@8
    39
    /** Sem se nedostaneme, pokud metody poběží v cyklu – program končí, až když dostane patřičný signál. */
franta-hg@6
    40
    fronta.zavriFrontu(false);
franta-hg@1
    41
    return (EXIT_SUCCESS);
franta-hg@1
    42
}
franta-hg@1
    43
franta-hg@1
    44
bool isOdesilaciRezim() {
franta-hg@1
    45
franta-hg@1
    46
    cout << "Zvolte režim: (p)řijímací / (o)desílací" << endl;
franta-hg@1
    47
franta-hg@1
    48
    char odpoved = cin.get();
franta-hg@1
    49
    cin.get();
franta-hg@1
    50
franta-hg@1
    51
    if (odpoved == 'o') {
franta-hg@1
    52
        return true;
franta-hg@1
    53
    } else if (odpoved == 'p') {
franta-hg@1
    54
        return false;
franta-hg@1
    55
    } else {
franta-hg@1
    56
        return isOdesilaciRezim();
franta-hg@1
    57
    }
franta-hg@1
    58
}
franta-hg@1
    59
franta-hg@1
    60
void odesilej() {
franta-hg@5
    61
    cout << "Odesíláme…" << endl;
franta-hg@6
    62
    fronta = Fronta(nazevFronty, false, true);
franta-hg@1
    63
franta-hg@8
    64
    while (true) {
franta-hg@8
    65
        /** TODO: načítat pomocí readline */
franta-hg@8
    66
        char zprava[100];
franta-hg@8
    67
        cout << "Zadejte zprávu: \033[22;32m";
franta-hg@8
    68
        cin.getline(zprava, 100);
franta-hg@8
    69
        cout << "\033[0m\n";
franta-hg@1
    70
franta-hg@8
    71
        if (fronta.odesliZpravu(zprava) == 0) {
franta-hg@8
    72
            cout << "Zpráva odeslána." << endl;
franta-hg@8
    73
        } else {
franta-hg@8
    74
            cout << "Při odesílání zprávy došlo k chybě." << endl;
franta-hg@8
    75
        }
franta-hg@4
    76
    }
franta-hg@1
    77
}
franta-hg@1
    78
franta-hg@1
    79
void prijimej() {
franta-hg@5
    80
    cout << "Přijímáme…" << endl;
franta-hg@6
    81
    fronta = Fronta(nazevFronty, true, false);
franta-hg@1
    82
franta-hg@8
    83
    while (true) {
franta-hg@8
    84
        char* zprava = fronta.prijmiZpravu();
franta-hg@6
    85
franta-hg@8
    86
        if (zprava == NULL) {
franta-hg@8
    87
            cout << "Nepodařilo se přijmout zprávu." << endl;
franta-hg@8
    88
        } else {
franta-hg@8
    89
            printf("Přijatá zpráva: \033[22;32m%s\033[0m\n", zprava); // zelená
franta-hg@8
    90
        }
franta-hg@1
    91
    }
franta-hg@4
    92
}
franta-hg@1
    93
franta-hg@4
    94
void zpracujSignal(int signal) {
franta-hg@5
    95
    if (signal == SIGTERM || signal == SIGINT) {
franta-hg@8
    96
        fronta.zavriFrontu(false);
franta-hg@8
    97
        cout << endl << "\033[22;31m" << "Končím program na základě signálu " << signal << "." << "\033[0m" << endl; // červená
franta-hg@4
    98
        exit(1);
franta-hg@4
    99
    }
franta-hg@4
   100
}
franta-hg@1
   101