OSSP CVS Repository

ossp - Check-in [3992]
Not logged in
[Honeypot]  [Browse]  [Home]  [Login]  [Reports
[Search]  [Ticket]  [Timeline
  [Patchset]  [Tagging/Branching

Check-in Number: 3992
Date: 2003-Feb-03 22:14:58 (local)
2003-Feb-03 21:14:58 (UTC)
User:ms
Branch:
Comment: Implemented a quality string class including CRC32 generation logic, used throghout for checksum computation, added automatic fake CRC field detection and correction on load operations, and backed out inconsistent date and time field format changes.
Tickets:
Inspections:
Files:
ossp-pkg/as/as-gui/Makefile.in      1.39 -> 1.40     2 inserted, 2 deleted
ossp-pkg/as/as-gui/as_crc.cpp      added-> 1.1
ossp-pkg/as/as-gui/as_crc.h      added-> 1.1
ossp-pkg/as/as-gui/as_dataop.cpp      1.40 -> 1.41     18 inserted, 4 deleted
ossp-pkg/as/as-gui/as_gui.h      1.68 -> 1.69     70 inserted, 0 deleted
ossp-pkg/as/as-gui/as_slot.cpp      1.106 -> 1.107     18 inserted, 13 deleted

ossp-pkg/as/as-gui/Makefile.in 1.39 -> 1.40

--- Makefile.in  2003/01/30 16:51:45     1.39
+++ Makefile.in  2003/02/03 21:14:58     1.40
@@ -72,9 +72,9 @@
 TARGET_PROGS    = as-gui
 TARGET_MANS     = as-gui.1 as-gui.conf.5
 
-SRCS            = as_main.cpp as_gui.cpp as_assist.cpp as_slot.cpp as_dataop.cpp as_except.cpp as_generic.cpp as_amount.cpp as_table.cpp as_pref.cpp as_user.cpp as_rand.cpp as_uuid.cpp as_version.cpp
+SRCS            = as_main.cpp as_gui.cpp as_assist.cpp as_slot.cpp as_dataop.cpp as_except.cpp as_generic.cpp as_amount.cpp as_table.cpp as_pref.cpp as_user.cpp as_rand.cpp as_crc.cpp as_uuid.cpp as_version.cpp
 
-OBJS            = as_main.o as_gui.o as_assist.o as_slot.o as_dataop.o as_except.o as_generic.o as_amount.o as_table.o as_pref.o as_user.o as_rand.o as_uuid.o as_version.o
+OBJS            = as_main.o as_gui.o as_assist.o as_slot.o as_dataop.o as_except.o as_generic.o as_amount.o as_table.o as_pref.o as_user.o as_rand.o as_crc.o as_uuid.o as_version.o
 
 GRAFX           = gfx/ossplogo.xpm
 


ossp-pkg/as/as-gui/as_crc.cpp -> 1.1

*** /dev/null    Sat Nov 23 06:19:51 2024
--- -    Sat Nov 23 06:20:07 2024
***************
*** 0 ****
--- 1,148 ----
+ //
+ //  OSSP asgui - Accounting system graphical user interface
+ //  Copyright (c) 2002-2003 The OSSP Project (http://www.ossp.org/)
+ //  Copyright (c) 2002-2003 Cable & Wireless Deutschland (http://www.cw.com/de/)
+ //  Copyright (c) 2002-2003 Ralf S. Engelschall <rse@engelschall.com>
+ //  Copyright (c) 2002-2003 Michael Schloh von Bennewitz <michael@schloh.com>
+ //
+ //  This file is part of OSSP asgui, an accounting system graphical user
+ //  interface which can be found at http://www.ossp.org/pkg/tool/asgui/.
+ //
+ //  Permission to use, copy, modify, and distribute this software for
+ //  any purpose with or without fee is hereby granted, provided that
+ //  the above copyright notice and this permission notice appear in all
+ //  copies.
+ //
+ //  THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ //  WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ //  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ //  IN NO EVENT SHALL THE AUTHORS AND COPYRIGHT HOLDERS AND THEIR
+ //  CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ //  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ //  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ //  USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ //  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ //  OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ //  OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ //  SUCH DAMAGE.
+ //
+ //  as_crc.cpp: ISO C++ implementation
+ //
+ 
+ #include "as_crc.h"
+ 
+ 
+ //
+ // Calculate a CRC32 value, as devised by Mark ADLER
+ // Returns 0xffffffff on empty or zero length strings
+ //
+ U32 Qualistring::getCrc(void)
+ {
+     U32 Hash = 0xffffffff;
+     unsigned int unLen = 0;
+     const char *pText = this->ascii();
+ 
+     unLen = this->length();
+ 
+     while (unLen-- > 0)
+         Hash = m_pkHash[(Hash ^ *pText++) & 0xff] ^ (Hash >> 8);
+ 
+     Hash ^= 0xffffffff;
+     return Hash;
+ }
+ 
+ //
+ // Overloaded equals operator, use with regular QString objects
+ //
+ Qualistring &Qualistring::operator=(const QString &Convertin)
+ {
+     this->setAscii((const char *)Convertin);    // This hack is a big loop
+     return *this;                               // to move data inefficiently
+ }
+ 
+ //
+ // Reflect the bits of Ref, just like a mirror
+ //
+ U32 Qualistring::mirrorBits(U32 Ref, U8 Bytes)
+ {
+     U32 unMirror = 0;
+ 
+     // Swap bits starting at 1 and moving up to Bytes
+     for(int nIter = 1; nIter < (Bytes + 1); nIter++) {
+         if (Ref & 1)
+             unMirror |= 1 << (Bytes - nIter);
+         Ref >>= 1;
+     }
+     return unMirror;
+ }
+ 
+ //
+ // Initialize the hash table for fast CRC32 value generation
+ //
+ void Qualistring::initCrc(void)
+ {
+     const unsigned long unPolynomial = 0x04c11db7;
+ 
+     // Match 256 values representing the ASCII character codes
+     for(int nOuter = 0; nOuter <= 0xFF; nOuter++) {
+         m_pkHash[nOuter] = mirrorBits(nOuter, 8) << 24;
+         for (int nInner = 0; nInner < 8; nInner++)
+             m_pkHash[nOuter] = (m_pkHash[nOuter] << 1) ^ (m_pkHash[nOuter] & (1 << 31) ? unPolynomial : 0);
+         m_pkHash[nOuter] = mirrorBits(m_pkHash[nOuter], 32);
+     }
+ 
+ /*    m_pkHash[256] = {
+         0x00000000L, 0x77073096L, 0xee0e612cL, 0x990951baL, 0x076dc419L,
+         0x706af48fL, 0xe963a535L, 0x9e6495a3L, 0x0edb8832L, 0x79dcb8a4L,
+         0xe0d5e91eL, 0x97d2d988L, 0x09b64c2bL, 0x7eb17cbdL, 0xe7b82d07L,
+         0x90bf1d91L, 0x1db71064L, 0x6ab020f2L, 0xf3b97148L, 0x84be41deL,
+         0x1adad47dL, 0x6ddde4ebL, 0xf4d4b551L, 0x83d385c7L, 0x136c9856L,
+         0x646ba8c0L, 0xfd62f97aL, 0x8a65c9ecL, 0x14015c4fL, 0x63066cd9L,
+         0xfa0f3d63L, 0x8d080df5L, 0x3b6e20c8L, 0x4c69105eL, 0xd56041e4L,
+         0xa2677172L, 0x3c03e4d1L, 0x4b04d447L, 0xd20d85fdL, 0xa50ab56bL,
+         0x35b5a8faL, 0x42b2986cL, 0xdbbbc9d6L, 0xacbcf940L, 0x32d86ce3L,
+         0x45df5c75L, 0xdcd60dcfL, 0xabd13d59L, 0x26d930acL, 0x51de003aL,
+         0xc8d75180L, 0xbfd06116L, 0x21b4f4b5L, 0x56b3c423L, 0xcfba9599L,
+         0xb8bda50fL, 0x2802b89eL, 0x5f058808L, 0xc60cd9b2L, 0xb10be924L,
+         0x2f6f7c87L, 0x58684c11L, 0xc1611dabL, 0xb6662d3dL, 0x76dc4190L,
+         0x01db7106L, 0x98d220bcL, 0xefd5102aL, 0x71b18589L, 0x06b6b51fL,
+         0x9fbfe4a5L, 0xe8b8d433L, 0x7807c9a2L, 0x0f00f934L, 0x9609a88eL,
+         0xe10e9818L, 0x7f6a0dbbL, 0x086d3d2dL, 0x91646c97L, 0xe6635c01L,
+         0x6b6b51f4L, 0x1c6c6162L, 0x856530d8L, 0xf262004eL, 0x6c0695edL,
+         0x1b01a57bL, 0x8208f4c1L, 0xf50fc457L, 0x65b0d9c6L, 0x12b7e950L,
+         0x8bbeb8eaL, 0xfcb9887cL, 0x62dd1ddfL, 0x15da2d49L, 0x8cd37cf3L,
+         0xfbd44c65L, 0x4db26158L, 0x3ab551ceL, 0xa3bc0074L, 0xd4bb30e2L,
+         0x4adfa541L, 0x3dd895d7L, 0xa4d1c46dL, 0xd3d6f4fbL, 0x4369e96aL,
+         0x346ed9fcL, 0xad678846L, 0xda60b8d0L, 0x44042d73L, 0x33031de5L,
+         0xaa0a4c5fL, 0xdd0d7cc9L, 0x5005713cL, 0x270241aaL, 0xbe0b1010L,
+         0xc90c2086L, 0x5768b525L, 0x206f85b3L, 0xb966d409L, 0xce61e49fL,
+         0x5edef90eL, 0x29d9c998L, 0xb0d09822L, 0xc7d7a8b4L, 0x59b33d17L,
+         0x2eb40d81L, 0xb7bd5c3bL, 0xc0ba6cadL, 0xedb88320L, 0x9abfb3b6L,
+         0x03b6e20cL, 0x74b1d29aL, 0xead54739L, 0x9dd277afL, 0x04db2615L,
+         0x73dc1683L, 0xe3630b12L, 0x94643b84L, 0x0d6d6a3eL, 0x7a6a5aa8L,
+         0xe40ecf0bL, 0x9309ff9dL, 0x0a00ae27L, 0x7d079eb1L, 0xf00f9344L,
+         0x8708a3d2L, 0x1e01f268L, 0x6906c2feL, 0xf762575dL, 0x806567cbL,
+         0x196c3671L, 0x6e6b06e7L, 0xfed41b76L, 0x89d32be0L, 0x10da7a5aL,
+         0x67dd4accL, 0xf9b9df6fL, 0x8ebeeff9L, 0x17b7be43L, 0x60b08ed5L,
+         0xd6d6a3e8L, 0xa1d1937eL, 0x38d8c2c4L, 0x4fdff252L, 0xd1bb67f1L,
+         0xa6bc5767L, 0x3fb506ddL, 0x48b2364bL, 0xd80d2bdaL, 0xaf0a1b4cL,
+         0x36034af6L, 0x41047a60L, 0xdf60efc3L, 0xa867df55L, 0x316e8eefL,
+         0x4669be79L, 0xcb61b38cL, 0xbc66831aL, 0x256fd2a0L, 0x5268e236L,
+         0xcc0c7795L, 0xbb0b4703L, 0x220216b9L, 0x5505262fL, 0xc5ba3bbeL,
+         0xb2bd0b28L, 0x2bb45a92L, 0x5cb36a04L, 0xc2d7ffa7L, 0xb5d0cf31L,
+         0x2cd99e8bL, 0x5bdeae1dL, 0x9b64c2b0L, 0xec63f226L, 0x756aa39cL,
+         0x026d930aL, 0x9c0906a9L, 0xeb0e363fL, 0x72076785L, 0x05005713L,
+         0x95bf4a82L, 0xe2b87a14L, 0x7bb12baeL, 0x0cb61b38L, 0x92d28e9bL,
+         0xe5d5be0dL, 0x7cdcefb7L, 0x0bdbdf21L, 0x86d3d2d4L, 0xf1d4e242L,
+         0x68ddb3f8L, 0x1fda836eL, 0x81be16cdL, 0xf6b9265bL, 0x6fb077e1L,
+         0x18b74777L, 0x88085ae6L, 0xff0f6a70L, 0x66063bcaL, 0x11010b5cL,
+         0x8f659effL, 0xf862ae69L, 0x616bffd3L, 0x166ccf45L, 0xa00ae278L,
+         0xd70dd2eeL, 0x4e048354L, 0x3903b3c2L, 0xa7672661L, 0xd06016f7L,
+         0x4969474dL, 0x3e6e77dbL, 0xaed16a4aL, 0xd9d65adcL, 0x40df0b66L,
+         0x37d83bf0L, 0xa9bcae53L, 0xdebb9ec5L, 0x47b2cf7fL, 0x30b5ffe9L,
+         0xbdbdf21cL, 0xcabac28aL, 0x53b39330L, 0x24b4a3a6L, 0xbad03605L,
+         0xcdd70693L, 0x54de5729L, 0x23d967bfL, 0xb3667a2eL, 0xc4614ab8L,
+         0x5d681b02L, 0x2a6f2b94L, 0xb40bbe37L, 0xc30c8ea1L, 0x5a05df1bL,
+         0x2d02ef8dL
+     };*/
+ }


ossp-pkg/as/as-gui/as_crc.h -> 1.1

*** /dev/null    Sat Nov 23 06:19:51 2024
--- -    Sat Nov 23 06:20:07 2024
***************
*** 0 ****
--- 1,60 ----
+ //
+ //  OSSP asgui - Accounting system graphical user interface
+ //  Copyright (c) 2002-2003 The OSSP Project (http://www.ossp.org/)
+ //  Copyright (c) 2002-2003 Cable & Wireless Deutschland (http://www.cw.com/de/)
+ //  Copyright (c) 2002-2003 Ralf S. Engelschall <rse@engelschall.com>
+ //  Copyright (c) 2002-2003 Michael Schloh von Bennewitz <michael@schloh.com>
+ //
+ //  This file is part of OSSP asgui, an accounting system graphical user
+ //  interface which can be found at http://www.ossp.org/pkg/tool/asgui/.
+ //
+ //  Permission to use, copy, modify, and distribute this software for
+ //  any purpose with or without fee is hereby granted, provided that
+ //  the above copyright notice and this permission notice appear in all
+ //  copies.
+ //
+ //  THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ //  WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ //  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ //  IN NO EVENT SHALL THE AUTHORS AND COPYRIGHT HOLDERS AND THEIR
+ //  CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ //  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ //  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ //  USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ //  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ //  OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ //  OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ //  SUCH DAMAGE.
+ //
+ //  as_crc.h: ISO C++ interface
+ //
+ 
+ #ifndef CRC_H
+ #define CRC_H
+ 
+ #include <string>       // For copy constructor using string
+ #include <qstring.h>    // For deriving from QString
+ 
+ #include "as_gui.h"     // General definitions like U32 typedefs
+ 
+ 
+ class Qualistring : public QString
+ {
+ private:
+     U32 m_pkHash[256];          // Used for CRC32 value generation
+ 
+ private:
+     U32 mirrorBits(U32, U8);    // Helper method, mirror a bitstream
+     void initCrc(void);         // Helper method, fill hash table
+ 
+ public:                                                                  // Constructors
+     Qualistring() : QString() {initCrc();};                              // Default
+     Qualistring(const QString &kCopy) : QString(kCopy) {initCrc();};     // Copy
+     Qualistring(const char *pkcCopy) : QString(pkcCopy) {initCrc();};    // Copy
+     Qualistring(const std::string &kCopy) : QString(kCopy) {initCrc();}; // Copy
+ 
+     U32 getCrc(void);                           // Generate and return a CRC32
+     Qualistring &operator=(const QString &);    // Overload equals operator
+ };
+ 
+ #endif // CRC_H


ossp-pkg/as/as-gui/as_dataop.cpp 1.40 -> 1.41

--- as_dataop.cpp        2003/02/03 14:12:09     1.40
+++ as_dataop.cpp        2003/02/03 21:14:58     1.41
@@ -37,6 +37,7 @@
 // User interface
 #include "as_gui.h"             // Main classes
 #include "as_tableitem.h"       // For class RtTableItem
+#include "as_crc.h"             // For quality strings
 
 // Icon pixel maps
 #include "as_gfx/statok.xpm"    // static const char *s_kpcStatokay_xpm[]
@@ -221,10 +222,7 @@
 
         Asline.skipWhiteSpace();    // Remove whitespaces
         Asline >> Crc;              // Copy the CRC field
-        if (!Crc.isEmpty())
-            m_pMaintable->setText(nIter, TITRAQ_IDXCRC, Crc);
-        else
-            bValid = false;
+        // Postpone actual text delivery, to autoinsert CRCs!
 
         Asline.skipWhiteSpace();    // Remove whitespaces
         Asline >> Rev;              // Copy the rev field
@@ -291,6 +289,21 @@
             m_pMaintable->setPixmap(nIter, TITRAQ_IDXSTATUS, Staterror);
         }
 
+        // Set the CRC text here, in case we need to generate a fresh value
+        if (!Crc.isEmpty()) {
+            if (Crc != ".") // This means, generate a fresh CRC value
+                m_pMaintable->setText(nIter, TITRAQ_IDXCRC, "0x" + Crc);
+            else {
+                // Make our long tuple to run through the CRC32 generator
+                Qualistring Testuple = User + Guid + Rev + Date + Start;
+                            Testuple += Finish + Amount + Account + Remark;
+                U32 Valcrc = Testuple.getCrc(); // Finally set the checksum to its new value
+                m_pMaintable->setText(nIter, TITRAQ_IDXCRC, "0x" + QString::number(Valcrc, 16));
+            }
+        }
+        else // if isEmpty()
+            bValid = false;
+
         nIter++;            // The big increment
         Line = QString(""); // Clear line for next round
 
@@ -365,6 +378,7 @@
             Tstream << trUtf8(" ") << Tempfield;                    // Save GUID field text
 
         Tempfield = m_pMaintable->text(nIter, TITRAQ_IDXCRC);       // Load CRC field text
+        Tempfield.remove("0x");
         if (Tempfield != NULL)
             Tstream << trUtf8(" ") << Tempfield;                    // Save CRC field text
 


ossp-pkg/as/as-gui/as_gui.h 1.68 -> 1.69

--- as_gui.h     2003/02/03 10:57:57     1.68
+++ as_gui.h     2003/02/03 21:14:58     1.69
@@ -62,6 +62,76 @@
 // Intentional no operation
 #define TITRAQ_NOP ((void)0)
 
+#ifdef HAVE_CONFIG_H
+#if (SIZEOF_CHAR == 1)
+typedef unsigned char        U8;
+#else
+?==Error: Undefined 8 bit type
+#endif // U8
+
+#if (SIZEOF_SHORT == 2)
+typedef unsigned short       U16;
+#elif (SIZEOF_INT == 2)
+typedef unsigned int         U16;
+#elif (SIZEOF_LONG == 2)
+typedef unsigned long        U16;
+#else
+?==Error: Undefined 16 bit type
+#endif // U16
+
+#if (SIZEOF_SHORT == 4)
+typedef unsigned short       U32;
+#elif (SIZEOF_INT == 4)
+typedef unsigned int         U32;
+#elif (SIZEOF_LONG == 4)
+typedef unsigned long        U32;
+#else
+?==Error: Undefined 32 bit type
+#endif // U32
+
+#if (SIZEOF_SHORT == 8)
+typedef unsigned short       U64;
+#elif (SIZEOF_INT == 8)
+typedef unsigned int         U64;
+#elif (SIZEOF_LONG == 8)
+typedef unsigned long        U64;
+#elif (SIZEOF_LONG_LONG == 8)
+typedef unsigned long long   U64;
+#else
+?==Error: Undefined 64 bit type
+#endif // U64
+
+#else // HAVE_CONFIG_H (not defined)
+typedef unsigned char        U8;
+#if (4 == 8)
+typedef unsigned int         U64;
+#elif (4 == 8)
+typedef unsigned long        U64;
+#elif (8 == 8)
+typedef unsigned long long   U64;
+#else
+?==Error: Undefined 64 bit type
+#endif
+
+#if (4 == 2)
+typedef unsigned int         U16;
+#elif (2 == 2)
+typedef unsigned short       U16;
+#else
+?==Error: Undefined 16 bit type
+#endif
+
+#if (4 == 4)
+typedef unsigned int         U32;
+#elif (4 == 4)
+typedef unsigned long        U32;
+#elif (2 == 4)
+typedef unsigned short       U32;
+#else
+?== Error: Undefined 32 bit type
+#endif
+#endif // HAVE_CONFIG_H
+
 
 // Main table size
 const int g_knBlocks = 32;


ossp-pkg/as/as-gui/as_slot.cpp 1.106 -> 1.107

--- as_slot.cpp  2003/02/03 14:12:09     1.106
+++ as_slot.cpp  2003/02/03 21:14:58     1.107
@@ -29,6 +29,9 @@
 //  titslot.cpp: ISO C++ implementation
 //
 
+// system headers
+#include <memory>
+
 // Qt headers
 #include <qfiledialog.h>
 #include <qcombobox.h>
@@ -43,6 +46,7 @@
 #include "as_generic.h"         // Generic classes
 #include "as_uuid.h"            // UUID classes
 #include "as_datedit.h"         // Derived from QDateEdit
+#include "as_crc.h"             // Useful qualistring class
 
 // RPC headers
 #ifdef HAVE_ESOAP
@@ -154,7 +158,7 @@
             m_pMaintable->setText(Select.topRow() + nIter, TITRAQ_IDXGUID, pGuid->getString());
             m_pMaintable->setText(Select.topRow() + nIter, TITRAQ_IDXCRC, "0"); // 0 = invalid entry
             m_pMaintable->setText(Select.topRow() + nIter, TITRAQ_IDXREV, "0"); // Entry not revised
-            m_pMaintable->setText(Select.topRow() + nIter, TITRAQ_IDXDATE, QDate::currentDate().toString("yyyy.MM.dd"));
+            m_pMaintable->setText(Select.topRow() + nIter, TITRAQ_IDXDATE, QDate::currentDate().toString(Qt::ISODate));
             m_pMaintable->setText(Select.topRow() + nIter, TITRAQ_IDXSTART, "00:00");
             m_pMaintable->setText(Select.topRow() + nIter, TITRAQ_IDXFINISH, "00:00");
             m_pMaintable->setText(Select.topRow() + nIter, TITRAQ_IDXAMOUNT, "00:00");
@@ -178,7 +182,7 @@
             m_pMaintable->setText(Select.bottomRow() + nIter, TITRAQ_IDXGUID, pGuid->getString());
             m_pMaintable->setText(Select.bottomRow() + nIter, TITRAQ_IDXCRC, "0");
             m_pMaintable->setText(Select.bottomRow() + nIter, TITRAQ_IDXREV, "0");
-            m_pMaintable->setText(Select.bottomRow() + nIter, TITRAQ_IDXDATE, QDate::currentDate().toString("yyyy.MM.dd"));
+            m_pMaintable->setText(Select.bottomRow() + nIter, TITRAQ_IDXDATE, QDate::currentDate().toString(Qt::ISODate));
             m_pMaintable->setText(Select.bottomRow() + nIter, TITRAQ_IDXSTART, "00:00");
             m_pMaintable->setText(Select.bottomRow() + nIter, TITRAQ_IDXFINISH, "00:00");
             m_pMaintable->setText(Select.bottomRow() + nIter, TITRAQ_IDXAMOUNT, "00:00");
@@ -763,20 +767,21 @@
 {
     if (nCol != TITRAQ_IDXSTATUS && nCol != TITRAQ_IDXLINE \
                                  && m_pMaintable->numRows() > 0) {
-        Q_UINT16 Valcrc, Testcrc;
-        QString Wholerow;
+        U32 Testcrc, Valcrc;
+        std::auto_ptr<Qualistring>pWholerow(new Qualistring);
         int nRealrow = -1;
-//        int nNewrev = -1;
 
         // Build the data that will be used in testing CRC calculation
         nRealrow = (nRow >= 0) ? nRow : m_pMaintable->currentRow();
-        Wholerow = m_pMaintable->text(nRealrow, TITRAQ_IDXUSER);
+        *pWholerow = m_pMaintable->text(nRealrow, TITRAQ_IDXUSER);
         for (int nIter = TITRAQ_IDXUSER + 1; nIter < TITRAQ_IDXTAIL; nIter++)
             if (nIter != TITRAQ_IDXCRC) // Don't checksum the checksum!
-                Wholerow += ' ' + m_pMaintable->text(nRealrow, nIter);
+                *pWholerow += m_pMaintable->text(nRealrow, nIter);
 
         // Update the checksum and revision only if necessary
-        Testcrc = qChecksum(Wholerow.ascii(), Wholerow.length());
+        Testcrc = pWholerow->getCrc();
+
+        // FIXME: This thing is not very unportable, because toUInt != U32
         if (Testcrc != m_pMaintable->text(nRealrow, TITRAQ_IDXCRC).toUInt()) {
 
 //            // Bump the revision number of our entry to control conflicts
@@ -784,14 +789,14 @@
 //            m_pMaintable->setText(nRealrow, TITRAQ_IDXREV, QString::number(nNewrev));
 
             // Build the data that will be used in setting CRC calculation
-            Wholerow = m_pMaintable->text(nRealrow, TITRAQ_IDXUSER);
+            *pWholerow = m_pMaintable->text(nRealrow, TITRAQ_IDXUSER);
             for (int nIter = TITRAQ_IDXUSER + 1; nIter < TITRAQ_IDXTAIL; nIter++)
                 if (nIter != TITRAQ_IDXCRC) // Don't checksum the checksum!
-                    Wholerow += ' ' + m_pMaintable->text(nRealrow, nIter);
+                    *pWholerow += m_pMaintable->text(nRealrow, nIter);
 
-            // Finally set the checksum to its new value
-            Valcrc = qChecksum(Wholerow.ascii(), Wholerow.length());
-            m_pMaintable->setText(nRealrow, TITRAQ_IDXCRC, QString::number(Valcrc));
+            Valcrc = pWholerow->getCrc(); // Finally set the checksum to its new value
+            m_pMaintable->setText(nRealrow, TITRAQ_IDXCRC, "0x" + QString::number(Valcrc, 16));
+            m_pCrcedit->setText("0x" + QString::number(Valcrc, 16));
         }
     }
 }

CVSTrac 2.0.1