Index: trunk/BNC/RTCM/GPSDecoder.cpp
===================================================================
--- trunk/BNC/RTCM/GPSDecoder.cpp	(revision 3528)
+++ trunk/BNC/RTCM/GPSDecoder.cpp	(revision 3528)
@@ -0,0 +1,81 @@
+// Part of BNC, a utility for retrieving decoding and
+// converting GNSS data streams from NTRIP broadcasters.
+//
+// Copyright (C) 2007
+// German Federal Agency for Cartography and Geodesy (BKG)
+// http://www.bkg.bund.de
+// Czech Technical University Prague, Department of Geodesy
+// http://www.fsv.cvut.cz
+//
+// Email: euref-ip@bkg.bund.de
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License
+// as published by the Free Software Foundation, version 2.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+/* -------------------------------------------------------------------------
+ * BKG NTRIP Client
+ * -------------------------------------------------------------------------
+ *
+ * Class:      GPSDecoder
+ *
+ * Purpose:    Decoder Base Class
+ *
+ * Author:     L. Mervart
+ *
+ * Created:    16-Dec-2011
+ *
+ * Changes:    
+ *
+ * -----------------------------------------------------------------------*/
+
+#include <iomanip>
+#include <cmath>
+
+#include "GPSDecoder.h"
+#include "bncsettings.h"
+
+using namespace std;
+
+// Constructor
+//////////////////////////////////////////////////////////////////////////////
+GPSDecoder::GPSDecoder() {
+  bncSettings settings;
+  if ( settings.value("rnxPath").toString().isEmpty() ) { 
+    _rnx = 0;
+  }
+  else {
+//    _rnx = new bncRinex(_staID, _mountPoint, _latitude, _longitude, 
+//                        _nmea, _ntripVersion);
+  }
+} 
+
+// Write RINEX Epoch
+//////////////////////////////////////////////////////////////////////////////
+void GPSDecoder::dumpRinexEpoch(const t_obs& obs, const QByteArray& format) {
+  if (_rnx) {
+    long iSec    = long(floor(obs.GPSWeeks+0.5));
+    long obsTime = obs.GPSWeek * 7*24*3600 + iSec;
+    if (_rnx->samplingRate() == 0 || iSec % _rnx->samplingRate() == 0) {
+      _rnx->deepCopy(obs);
+    }
+    _rnx->dumpEpoch(format, obsTime);
+  }
+} 
+
+// Set RINEX Reconnect Flag
+//////////////////////////////////////////////////////////////////////////////
+void GPSDecoder::setRinexReconnectFlag(bool flag) {
+  if (_rnx) {
+    _rnx->setReconnectFlag(flag);
+  }
+}
Index: trunk/BNC/RTCM/GPSDecoder.h
===================================================================
--- trunk/BNC/RTCM/GPSDecoder.h	(revision 3527)
+++ trunk/BNC/RTCM/GPSDecoder.h	(revision 3528)
@@ -33,4 +33,5 @@
 
 #include "bncconst.h"
+#include "bncrinex.h"
 
 class t_obs {
@@ -119,9 +120,17 @@
 class GPSDecoder {
  public:
-  virtual t_irc Decode(char* buffer, int bufLen, std::vector<std::string>& errmsg) = 0;
+  GPSDecoder();
 
-  virtual ~GPSDecoder() {}
+  virtual ~GPSDecoder() {delete _rnx;}
+
+  virtual t_irc Decode(char* buffer, int bufLen, 
+                       std::vector<std::string>& errmsg) = 0;
+
 
   virtual int corrGPSEpochTime() const {return -1;}
+
+  void dumpRinexEpoch(const t_obs& obs, const QByteArray& format);
+
+  void setRinexReconnectFlag(bool flag);
 
   struct t_antInfo {
@@ -145,7 +154,8 @@
 
   QList<t_obs>     _obsList;
-  QList<int>       _typeList;  // RTCM   message types
-  QStringList      _antType;   // RTCM   antenna descriptor
-  QList<t_antInfo> _antList;   // RTCM   antenna XYZ
+  QList<int>       _typeList;  // RTCM message types
+  QStringList      _antType;   // RTCM antenna descriptor
+  QList<t_antInfo> _antList;   // RTCM antenna XYZ
+  bncRinex*        _rnx;       // RINEX writer
 };
 
Index: trunk/BNC/bnc.pro
===================================================================
--- trunk/BNC/bnc.pro	(revision 3527)
+++ trunk/BNC/bnc.pro	(revision 3528)
@@ -82,5 +82,5 @@
           upload/bncrtnetuploadcaster.cpp upload/bnccustomtrafo.cpp   \
           upload/bncephuploadcaster.cpp                               \
-          RTCM/RTCM2.cpp RTCM/RTCM2Decoder.cpp                        \
+          RTCM/GPSDecoder.cpp RTCM/RTCM2.cpp RTCM/RTCM2Decoder.cpp    \
           RTCM/RTCM2_2021.cpp RTCM/rtcm_utils.cpp                     \
           RTCM3/RTCM3Decoder.cpp RTCM3/rtcm3torinex/rtcm3torinex.c    \
Index: trunk/BNC/bncgetthread.cpp
===================================================================
--- trunk/BNC/bncgetthread.cpp	(revision 3527)
+++ trunk/BNC/bncgetthread.cpp	(revision 3528)
@@ -52,5 +52,4 @@
 #include "bncapp.h"
 #include "bncutils.h"
-#include "bncrinex.h"
 #include "bnczerodecoder.h"
 #include "bncnetqueryv0.h"
@@ -116,4 +115,6 @@
 void bncGetThread::initialize() {
 
+  bncSettings settings;
+
   setTerminationEnabled(true);
 
@@ -127,19 +128,5 @@
   _nextSleep     = 0;
   _PPPclient     = 0;
-
-  bncSettings settings;
-
-  _miscMount = settings.value("miscMount").toString();
-
-  // RINEX writer
-  // ------------
-  _samplingRate = settings.value("rnxSampl").toInt();
-  if ( settings.value("rnxPath").toString().isEmpty() ) { 
-    _rnx = 0;
-  }
-  else {
-    _rnx = new bncRinex(_staID, _mountPoint, _latitude, _longitude, 
-                        _nmea, _ntripVersion);
-  }
+  _miscMount     = settings.value("miscMount").toString();
 
   // Serial Port
@@ -364,5 +351,4 @@
     delete it.value();
   }
-  delete _rnx;
   delete _rawFile;
   delete _serialOutFile;
@@ -515,13 +501,6 @@
         _prnLastEpo[prn] = obsTime;
 
-        // RINEX Output
-        // ------------
-        if (_rnx) {
-          if (_samplingRate == 0 || iSec % _samplingRate == 0) {
-            _rnx->deepCopy(obs);
-          }
-          _rnx->dumpEpoch(_format, obsTime);
-        }
-      
+        decoder()->dumpRinexEpoch(obs, _format);
+
         // PPP Client
         // ----------
@@ -560,6 +539,9 @@
   if (_query && _query->status() == bncNetQuery::running) {
     _nextSleep = 0;
-    if (_rnx) {
-      _rnx->setReconnectFlag(false);
+    QMapIterator<QString, GPSDecoder*> itDec(_decoders);
+    while (itDec.hasNext()) {
+      itDec.next();
+      GPSDecoder* decoder = itDec.value();
+      decoder->setRinexReconnectFlag(false);
     }
     return success;
@@ -623,6 +605,9 @@
   }
 
-  if (_rnx) {
-    _rnx->setReconnectFlag(true);
+  QMapIterator<QString, GPSDecoder*> itDec(_decoders);
+  while (itDec.hasNext()) {
+    itDec.next();
+    GPSDecoder* decoder = itDec.value();
+    decoder->setRinexReconnectFlag(false);
   }
 
Index: trunk/BNC/bncgetthread.h
===================================================================
--- trunk/BNC/bncgetthread.h	(revision 3527)
+++ trunk/BNC/bncgetthread.h	(revision 3528)
@@ -38,5 +38,4 @@
 #include "bncrawfile.h"
 
-class bncRinex;
 class QextSerialPort;
 class latencyChecker;
@@ -117,6 +116,4 @@
    int                        _nextSleep;
    int                        _iMount;
-   int                        _samplingRate;
-   bncRinex*                  _rnx;
    bncRawFile*                _rawFile;
    QextSerialPort*            _serialPort;
Index: trunk/BNC/bncrinex.cpp
===================================================================
--- trunk/BNC/bncrinex.cpp	(revision 3527)
+++ trunk/BNC/bncrinex.cpp	(revision 3528)
@@ -101,4 +101,6 @@
 
   _approxPos[0] = _approxPos[1] = _approxPos[2] = 0.0;
+
+  _samplingRate = settings.value("rnxSampl").toInt();
 }
 
Index: trunk/BNC/bncrinex.h
===================================================================
--- trunk/BNC/bncrinex.h	(revision 3527)
+++ trunk/BNC/bncrinex.h	(revision 3528)
@@ -26,12 +26,10 @@
 #define BNCRINEX_H
 
-#include <QByteArray>
-#include <QDateTime>
-#include <QList>
-
+#include <QtCore>
 #include <fstream>
 
 #include "bncconst.h"
-#include "RTCM/GPSDecoder.h"
+
+class t_obs;
 
 class bncRinex {
@@ -47,4 +45,6 @@
                                const QString& intStr, 
                                QDateTime* nextEpoch = 0);
+
+   int samplingRate() const {return _samplingRate;}
 
    void setApproxPos(double stax, double stay, double staz) {
@@ -90,4 +90,5 @@
    bool          _reloadDone;
    double        _approxPos[3];
+   int           _samplingRate;
 
    QMap<QString, int>  _slip_cnt_L1;
