c++/POSIXoveFronty/Fronta/fronta.cpp
author František Kučera <franta-hg@frantovo.cz>
Fri, 08 May 2020 00:02:05 +0200
changeset 57 1b21c78d8706
parent 6 617fef4676b9
permissions -rw-r--r--
SQLite: demo modul – rozšíření přidávající pár funkcí do SQL
Vzniklo v rámci práce na článku: https://blog.frantovo.cz/c/383/Komplexita%3A%20%C5%99e%C5%A1en%C3%AD%20a%C2%A0prevence
franta-hg@6
     1
#include <fronta.h>
franta-hg@6
     2
#include <iostream>
franta-hg@6
     3
franta-hg@6
     4
using namespace std;
franta-hg@6
     5
franta-hg@6
     6
Fronta::Fronta() {
franta-hg@6
     7
    prijimaci = false;
franta-hg@6
     8
    odesilaci = false;
franta-hg@6
     9
    otevrena = false;
franta-hg@6
    10
}
franta-hg@6
    11
franta-hg@6
    12
Fronta::Fronta(char* nazev, bool prijimaci, bool odesilaci) {
franta-hg@6
    13
    this->nazev = nazev;
franta-hg@6
    14
    this->prijimaci = prijimaci;
franta-hg@6
    15
    this->odesilaci = odesilaci;
franta-hg@6
    16
franta-hg@6
    17
    /** Nastavíme vlastnosti fronty */
franta-hg@6
    18
    mq_vlastnosti.mq_maxmsg = POCET_ZPRAV_VE_FRONTE;
franta-hg@6
    19
    mq_vlastnosti.mq_msgsize = DELKA_ZPRAVY;
franta-hg@6
    20
franta-hg@6
    21
    /** Vytvoříme odesílací (obojetnou) nebo (pouze) čtecí frontu */
franta-hg@6
    22
    if (odesilaci) {
franta-hg@6
    23
        fronta = mq_open(nazev, O_RDWR | O_CREAT, S_IRWXU | S_IRWXG, &mq_vlastnosti);
franta-hg@6
    24
        otevrena = true;
franta-hg@6
    25
    } else if (prijimaci) {
franta-hg@6
    26
        fronta = mq_open(nazev, O_RDONLY);
franta-hg@6
    27
        otevrena = true;
franta-hg@6
    28
    } else {
franta-hg@6
    29
        otevrena = false;
franta-hg@6
    30
    }
franta-hg@6
    31
}
franta-hg@6
    32
franta-hg@6
    33
int Fronta::odesliZpravu(char* zprava) {
franta-hg@6
    34
    if (otevrena && odesilaci) {
franta-hg@6
    35
        return mq_send(fronta, zprava, strlen(zprava) + 1, 0);
franta-hg@6
    36
    } else {
franta-hg@6
    37
        return -1;
franta-hg@6
    38
    }
franta-hg@6
    39
}
franta-hg@6
    40
franta-hg@6
    41
char* Fronta::prijmiZpravu() {
franta-hg@6
    42
    if (otevrena && prijimaci) {
franta-hg@6
    43
        char zprava[DELKA_ZPRAVY + 1];
franta-hg@6
    44
        zprava[DELKA_ZPRAVY] = '\0';
franta-hg@6
    45
        if (mq_receive(fronta, zprava, DELKA_ZPRAVY, NULL) > 0) {
franta-hg@6
    46
            return zprava;
franta-hg@6
    47
        } else {
franta-hg@6
    48
            return NULL;
franta-hg@6
    49
        }
franta-hg@6
    50
    } else {
franta-hg@6
    51
        return NULL;
franta-hg@6
    52
    }
franta-hg@6
    53
}
franta-hg@6
    54
franta-hg@6
    55
void Fronta::zavriFrontu(bool zrusit) {
franta-hg@6
    56
    if (otevrena) {
franta-hg@6
    57
        if (zrusit) {
franta-hg@6
    58
            mq_unlink(nazev);
franta-hg@6
    59
        }
franta-hg@6
    60
        mq_close(fronta);
franta-hg@6
    61
        otevrena = false;
franta-hg@6
    62
    }
franta-hg@6
    63
}
franta-hg@6
    64
franta-hg@6
    65
franta-hg@6
    66