# HG changeset patch
# User František Kučera <franta-hg@frantovo.cz>
# 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 <fronta.h>
+#include <iostream>
+
+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 <string.h>
+#include <mqueue.h>
+
+/**
+ * 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 <program.h>
 #include <stdlib.h>
 #include <iostream>
-#include <mqueue.h>
 #include <readline/readline.h>
 #include <signal.h>
+#include <strings.h>
+
+#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 <franta-hg@frantovo.cz>
  */
 
-#include <mqueue.h>
+#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();
 
     /**