# HG changeset patch # User František Kučera # Date 1239059764 -7200 # Node ID 617fef4676b9774281abf3f8698b96e41bc62716 # Parent a6822e6dd2ca619daa2e3ad528e58300f64dfb5f OOP: obalující třída pro práci s frontou diff -r a6822e6dd2ca -r 617fef4676b9 c++/POSIXoveFronty/Fronta/Fronta.pro --- a/c++/POSIXoveFronty/Fronta/Fronta.pro Sun Apr 05 22:02:15 2009 +0200 +++ b/c++/POSIXoveFronty/Fronta/Fronta.pro Tue Apr 07 01:16:04 2009 +0200 @@ -1,12 +1,12 @@ ###################################################################### -# Automatically generated by qmake (2.01a) p dub 3 18:45:01 2009 +# Automatically generated by qmake (2.01a) ne dub 5 22:16:46 2009 ###################################################################### TEMPLATE = app TARGET = -DEPENDPATH += . +DEPENDPATH += . qtc-gdbmacros INCLUDEPATH += . # Input -HEADERS += program.h -SOURCES += program.cpp +HEADERS += fronta.h program.h +SOURCES += fronta.cpp program.cpp qtc-gdbmacros/gdbmacros.cpp diff -r a6822e6dd2ca -r 617fef4676b9 c++/POSIXoveFronty/Fronta/Makefile --- a/c++/POSIXoveFronty/Fronta/Makefile Sun Apr 05 22:02:15 2009 +0200 +++ b/c++/POSIXoveFronty/Fronta/Makefile Tue Apr 07 01:16:04 2009 +0200 @@ -1,9 +1,9 @@ ############################################################################# # Makefile for building: Fronta -# Generated by qmake (2.01a) (Qt 4.4.3) on: so dub 4 22:38:33 2009 +# Generated by qmake (2.01a) (Qt 4.4.3) on: ne dub 5 22:16:48 2009 # Project: Fronta.pro # Template: app -# Command: /usr/bin/qmake-qt4 -spec /usr/share/qt4/mkspecs/linux-g++ -unix -o Makefile Fronta.pro +# Command: /usr/bin/qmake -unix -o Makefile Fronta.pro ############################################################################# ####### Compiler, tools and options @@ -19,7 +19,7 @@ LIBS = $(SUBLIBS) -L/usr/lib -lQtGui -lQtCore -lpthread AR = ar cqs RANLIB = -QMAKE = /usr/bin/qmake-qt4 +QMAKE = /usr/bin/qmake TAR = tar -cf COMPRESS = gzip -9f COPY = cp -f @@ -42,8 +42,12 @@ ####### Files -SOURCES = program.cpp -OBJECTS = program.o +SOURCES = fronta.cpp \ + program.cpp \ + qtc-gdbmacros/gdbmacros.cpp +OBJECTS = fronta.o \ + program.o \ + gdbmacros.o DIST = /usr/share/qt4/mkspecs/common/g++.conf \ /usr/share/qt4/mkspecs/common/unix.conf \ /usr/share/qt4/mkspecs/common/linux.conf \ @@ -114,7 +118,7 @@ /usr/share/qt4/mkspecs/features/lex.prf \ /usr/lib/libQtGui.prl \ /usr/lib/libQtCore.prl - $(QMAKE) -spec /usr/share/qt4/mkspecs/linux-g++ -unix -o Makefile Fronta.pro + $(QMAKE) -unix -o Makefile Fronta.pro /usr/share/qt4/mkspecs/common/g++.conf: /usr/share/qt4/mkspecs/common/unix.conf: /usr/share/qt4/mkspecs/common/linux.conf: @@ -136,11 +140,11 @@ /usr/lib/libQtGui.prl: /usr/lib/libQtCore.prl: qmake: FORCE - @$(QMAKE) -spec /usr/share/qt4/mkspecs/linux-g++ -unix -o Makefile Fronta.pro + @$(QMAKE) -unix -o Makefile Fronta.pro dist: @$(CHK_DIR_EXISTS) .tmp/Fronta1.0.0 || $(MKDIR) .tmp/Fronta1.0.0 - $(COPY_FILE) --parents $(SOURCES) $(DIST) .tmp/Fronta1.0.0/ && $(COPY_FILE) --parents program.h .tmp/Fronta1.0.0/ && $(COPY_FILE) --parents program.cpp .tmp/Fronta1.0.0/ && (cd `dirname .tmp/Fronta1.0.0` && $(TAR) Fronta1.0.0.tar Fronta1.0.0 && $(COMPRESS) Fronta1.0.0.tar) && $(MOVE) `dirname .tmp/Fronta1.0.0`/Fronta1.0.0.tar.gz . && $(DEL_FILE) -r .tmp/Fronta1.0.0 + $(COPY_FILE) --parents $(SOURCES) $(DIST) .tmp/Fronta1.0.0/ && $(COPY_FILE) --parents fronta.h program.h .tmp/Fronta1.0.0/ && $(COPY_FILE) --parents fronta.cpp program.cpp qtc-gdbmacros/gdbmacros.cpp .tmp/Fronta1.0.0/ && (cd `dirname .tmp/Fronta1.0.0` && $(TAR) Fronta1.0.0.tar Fronta1.0.0 && $(COMPRESS) Fronta1.0.0.tar) && $(MOVE) `dirname .tmp/Fronta1.0.0`/Fronta1.0.0.tar.gz . && $(DEL_FILE) -r .tmp/Fronta1.0.0 clean:compiler_clean @@ -180,9 +184,15 @@ ####### Compile +fronta.o: fronta.cpp fronta.h + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o fronta.o fronta.cpp + program.o: program.cpp program.h $(CXX) -c $(CXXFLAGS) $(INCPATH) -o program.o program.cpp +gdbmacros.o: qtc-gdbmacros/gdbmacros.cpp + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o gdbmacros.o qtc-gdbmacros/gdbmacros.cpp + ####### Install install: FORCE diff -r a6822e6dd2ca -r 617fef4676b9 c++/POSIXoveFronty/Fronta/fronta.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/c++/POSIXoveFronty/Fronta/fronta.cpp Tue Apr 07 01:16:04 2009 +0200 @@ -0,0 +1,66 @@ +#include +#include + +using namespace std; + +Fronta::Fronta() { + prijimaci = false; + odesilaci = false; + otevrena = false; +} + +Fronta::Fronta(char* nazev, bool prijimaci, bool odesilaci) { + this->nazev = nazev; + this->prijimaci = prijimaci; + this->odesilaci = odesilaci; + + /** Nastavíme vlastnosti fronty */ + mq_vlastnosti.mq_maxmsg = POCET_ZPRAV_VE_FRONTE; + mq_vlastnosti.mq_msgsize = DELKA_ZPRAVY; + + /** Vytvoříme odesílací (obojetnou) nebo (pouze) čtecí frontu */ + if (odesilaci) { + fronta = mq_open(nazev, O_RDWR | O_CREAT, S_IRWXU | S_IRWXG, &mq_vlastnosti); + otevrena = true; + } else if (prijimaci) { + fronta = mq_open(nazev, O_RDONLY); + otevrena = true; + } else { + otevrena = false; + } +} + +int Fronta::odesliZpravu(char* zprava) { + if (otevrena && odesilaci) { + return mq_send(fronta, zprava, strlen(zprava) + 1, 0); + } else { + return -1; + } +} + +char* Fronta::prijmiZpravu() { + if (otevrena && prijimaci) { + char zprava[DELKA_ZPRAVY + 1]; + zprava[DELKA_ZPRAVY] = '\0'; + if (mq_receive(fronta, zprava, DELKA_ZPRAVY, NULL) > 0) { + return zprava; + } else { + return NULL; + } + } else { + return NULL; + } +} + +void Fronta::zavriFrontu(bool zrusit) { + if (otevrena) { + if (zrusit) { + mq_unlink(nazev); + } + mq_close(fronta); + otevrena = false; + } +} + + + diff -r a6822e6dd2ca -r 617fef4676b9 c++/POSIXoveFronty/Fronta/fronta.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/c++/POSIXoveFronty/Fronta/fronta.h Tue Apr 07 01:16:04 2009 +0200 @@ -0,0 +1,42 @@ +#ifndef _FRONTA_H +#define _FRONTA_H + +#include +#include + +/** + * Objektový obal pro POSIXovou frontu (mq). + */ +class Fronta { +public: + /** Vytvoří frontu (zapisovací umí i číst). */ + Fronta(char*, bool, bool); + Fronta(); + /** Přidá zprávu do fronty. */ + int odesliZpravu(char*); + /** Načte jednu zprávu z fronty. V případě chyby vrací NULL */ + char* prijmiZpravu(); + /** Zavře frontu. true = zruší frontu.*/ + void zavriFrontu(bool); + +private: + char* nazev; + bool prijimaci; + bool odesilaci; + bool otevrena; + mqd_t fronta; + + /** Vlastnosti fronty */ + struct mq_attr mq_vlastnosti; + + /** Maximální počet zpráv ve frontě (potom začne blokovat) */ + static const int POCET_ZPRAV_VE_FRONTE = 5; + + /** Délka jedné zprávy ve frontě */ + static const int DELKA_ZPRAVY = 100; + + +}; + +#endif /* _FRONTA_H */ + diff -r a6822e6dd2ca -r 617fef4676b9 c++/POSIXoveFronty/Fronta/program.cpp --- a/c++/POSIXoveFronty/Fronta/program.cpp Sun Apr 05 22:02:15 2009 +0200 +++ b/c++/POSIXoveFronty/Fronta/program.cpp Tue Apr 07 01:16:04 2009 +0200 @@ -6,9 +6,11 @@ #include #include #include -#include #include #include +#include + +#include "fronta.h" using namespace std; @@ -23,9 +25,9 @@ signal(SIGTERM, zpracujSignal); signal(SIGINT, zpracujSignal); - /** Nastavíme vlastnosti fronty */ - mq_vlastnosti.mq_maxmsg = POCET_ZPRAV_VE_FRONTE; - mq_vlastnosti.mq_msgsize = DELKA_ZPRAVY; + /** TODO: zeptat se na název fronty */ + //strcpy(nazevFronty, VYCHOZI_NAZEV_FRONTY); + nazevFronty = "/mojeFronta"; /** Program pracuje buď v režimu přijímání nebo odesílání */ if (isOdesilaciRezim()) { @@ -34,7 +36,9 @@ prijimej(); } - /** Sem se nedostaneme – program končí, až když dostane patřičný signál. */ + fronta.zavriFrontu(false); + + /** Sem se nedostaneme, pokud metody poběží v cyklu – program končí, až když dostane patřičný signál. */ return (EXIT_SUCCESS); } @@ -56,34 +60,29 @@ void odesilej() { cout << "Odesíláme…" << endl; + fronta = Fronta(nazevFronty, false, true); - mqd_t fronta = mq_open(NAZEV_FRONTY, O_RDWR | O_CREAT, S_IRWXU | S_IRWXG, &mq_vlastnosti); - + /** TODO: načíst ze standardního vstupu */ char zprava[] = "zpráva"; - int vysledek = mq_send(fronta, zprava, strlen(zprava) + 1, 0); - if (vysledek == 0) { + if (fronta.odesliZpravu(zprava) == 0) { cout << "Zpráva odeslána." << endl; } else { cout << "Při odesílání zprávy došlo k chybě." << endl; } - - mq_close(fronta); } void prijimej() { cout << "Přijímáme…" << endl; + fronta = Fronta(nazevFronty, true, false); - mqd_t fronta = mq_open(NAZEV_FRONTY, O_RDONLY); - char s[DELKA_ZPRAVY + 1]; - s[DELKA_ZPRAVY] = '\0'; - if (mq_receive(fronta, s, DELKA_ZPRAVY, NULL) > 0) { - printf("Přijatá zpráva: %s\n", s); + char* zprava = fronta.prijmiZpravu(); + + if (zprava == NULL) { + cout << "Nepodařilo se přijmout zprávu." << endl; } else { - cout << "Nepodařilo se přijmout zprávu." << endl; + printf("Přijatá zpráva: %s\n", zprava); } - - mq_close(fronta); } void zpracujSignal(int signal) { diff -r a6822e6dd2ca -r 617fef4676b9 c++/POSIXoveFronty/Fronta/program.h --- a/c++/POSIXoveFronty/Fronta/program.h Sun Apr 05 22:02:15 2009 +0200 +++ b/c++/POSIXoveFronty/Fronta/program.h Tue Apr 07 01:16:04 2009 +0200 @@ -3,7 +3,7 @@ * @autor František Kučera */ -#include +#include "fronta.h" #ifndef _PROGRAM_H #define _PROGRAM_H @@ -13,22 +13,19 @@ extern "C" { #endif - /** Název POSIXové fronty */ - const char* NAZEV_FRONTY = "/mojeFronta"; + /** Výchozé název POSIXové fronty. */ + const char* VYCHOZI_NAZEV_FRONTY = "/mojeFronta"; - /** Vlastnosti fronty */ - struct mq_attr mq_vlastnosti; + /** Název POSIXové fronty. */ + char* nazevFronty; - /** Maximální počet zpráv ve frontě (potom začne blokovat) */ - const int POCET_ZPRAV_VE_FRONTE = 5; + /** Objekt obalující POSIXovou frontu. */ + Fronta fronta; - /** Délka jedné zprávy ve frontě */ - const int DELKA_ZPRAVY = 100; - - /** Režim přijímání zpráv */ + /** Režim přijímání zpráv. */ void prijimej(); - /** Režim odesílání zpráv */ + /** Režim odesílání zpráv. */ void odesilej(); /**