Denis' bug fixes
[asdcplib.git] / src / KM_util.cpp
index a07d33e3986e5616519b83a29564052230ead53b..339f78bd1003be77fa7f655851ce9b7277515a11 100755 (executable)
@@ -433,12 +433,12 @@ Kumu::GenRandomUUID(byte_t* buf)
 
 //
 void
-Kumu::GenRandomValue(SymmetricKey& ID)
+Kumu::GenRandomValue(SymmetricKey& Key)
 {
   byte_t tmp_buf[SymmetricKey_Length];
   FortunaRNG RNG;
   RNG.FillRandom(tmp_buf, SymmetricKey_Length);
-  ID.Set(tmp_buf);
+  Key.Set(tmp_buf);
 }
 
 
@@ -600,6 +600,20 @@ Kumu::Timestamp::operator<(const Timestamp& rhs) const
   return ( CompareFileTime(&lft, &rft) == -1 );
 }
 
+//
+bool
+Kumu::Timestamp::operator>(const Timestamp& rhs) const
+{
+  SYSTEMTIME lhst, rhst;
+  FILETIME lft, rft;
+
+  TIMESTAMP_TO_SYSTIME(*this, &lhst);
+  TIMESTAMP_TO_SYSTIME(rhs, &rhst);
+  SystemTimeToFileTime(&lhst, &lft);
+  SystemTimeToFileTime(&rhst, &rft);
+  return ( CompareFileTime(&lft, &rft) == 1 );
+}
+
 inline ui64_t
 seconds_to_ns100(ui32_t seconds)
 {
@@ -685,6 +699,16 @@ Kumu::Timestamp::operator<(const Timestamp& rhs) const
   return ( timegm(&lhtm) < timegm(&rhtm) );
 }
 
+//
+bool
+Kumu::Timestamp::operator>(const Timestamp& rhs) const
+{
+  struct tm lhtm, rhtm;
+  TIMESTAMP_TO_TM(*this, &lhtm);
+  TIMESTAMP_TO_TM(rhs, &rhtm);
+  return ( timegm(&lhtm) > timegm(&rhtm) );
+}
+
 //
 void
 Kumu::Timestamp::AddDays(i32_t days)
@@ -796,41 +820,73 @@ Kumu::Timestamp::EncodeString(char* str_buf, ui32_t buf_len) const
 bool
 Kumu::Timestamp::DecodeString(const char* datestr)
 {
+  Timestamp TmpStamp;
+
   if ( ! ( isdigit(datestr[0]) && isdigit(datestr[1]) && isdigit(datestr[2]) && isdigit(datestr[3]) )
        || datestr[4] != '-'
        || ! ( isdigit(datestr[5]) && isdigit(datestr[6]) )
        || datestr[7] != '-'
-       || ! ( isdigit(datestr[8]) && isdigit(datestr[9]) )
-       || datestr[10] != 'T'
-       || ! ( isdigit(datestr[11]) && isdigit(datestr[12]) )
-       || datestr[13] != ':'
-       || ! ( isdigit(datestr[14]) && isdigit(datestr[15]) )
-       || datestr[16] != ':'
-       || ! ( isdigit(datestr[17]) && isdigit(datestr[18]) )
-       || ! ( datestr[19] == '-' || datestr[19] == '+' )
-       || ! ( isdigit(datestr[20]) && isdigit(datestr[21]) )
-       || datestr[22] != ':'
-       || ! ( isdigit(datestr[23]) && isdigit(datestr[24]) ) )
+       || ! ( isdigit(datestr[8]) && isdigit(datestr[9]) ) )
     return false;
 
-  // TODO -- test this!
-  Year = atoi(datestr);
-  Month = atoi(datestr + 5);
-  Day = atoi(datestr + 8);
-  Hour = atoi(datestr + 11);
-  Minute = atoi(datestr + 14);
-  Second = atoi(datestr + 17);
+  TmpStamp.Year = atoi(datestr);
+  TmpStamp.Month = atoi(datestr + 5);
+  TmpStamp.Day = atoi(datestr + 8);
+  TmpStamp.Hour = TmpStamp.Minute = TmpStamp.Second = 0;
+  if ( datestr[10] == 'T' )
+    {
+      if ( ! ( isdigit(datestr[11]) && isdigit(datestr[12]) )
+          || datestr[13] != ':'
+          || ! ( isdigit(datestr[14]) && isdigit(datestr[15]) ) )
+       return false;
 
-  ui32_t TZ_hh = atoi(datestr + 20);
-  ui32_t TZ_mm = atoi(datestr + 23);
+      TmpStamp.Hour = atoi(datestr + 11);
+      TmpStamp.Minute = atoi(datestr + 14);
 
-  if ( TZ_mm != 0 )
-    DefaultLogSink().Error("Ignoring sub-hours timezone offset: %u\n", TZ_mm);
-  if ( TZ_hh > 12 )
-    DefaultLogSink().Error("Ignoring large timezone offset: %s\n", (datestr+19));
-  else 
-    AddHours(TZ_hh);
+      if ( datestr[16] == ':' )
+       {
+         if ( ! ( isdigit(datestr[17]) && isdigit(datestr[18]) ) )
+           return false;
+
+         TmpStamp.Second = atoi(datestr + 17);
+       }
+    }
+
+  if ( datestr[19] == '-' || datestr[19] == '+' )
+    {
+      if ( ! ( isdigit(datestr[20]) && isdigit(datestr[21]) )
+          || datestr[22] != ':'
+          || ! ( isdigit(datestr[23]) && isdigit(datestr[24]) ) )
+       return false;
+
+      ui32_t TZ_hh = atoi(datestr + 20);
+      ui32_t TZ_mm = atoi(datestr + 23);
+      
+      if ( TZ_mm != 0 )
+       DefaultLogSink().Error("Ignoring minutes in timezone offset: %u\n", TZ_mm);
+
+      if ( TZ_hh > 12 )
+       return false;
+
+      else 
+       AddHours( (datestr[19] == '-' ? (-TZ_hh) : TZ_hh));
+    }
+
+#ifdef KM_WIN32
+  SYSTEMTIME st;
+  FILETIME ft;
+  TIMESTAMP_TO_SYSTIME(TmpStamp, &st);
+  if ( SystemTimeToFileTime(&st, &ft) == 0 )
+    return false;
+  SYSTIME_TO_TIMESTAMP(&st, *this);
+#else
+  struct tm stm;
+  TIMESTAMP_TO_TM(TmpStamp, &stm);
+  if ( timegm(&stm) == 0 )
+    return false;
+  TM_TO_TIMESTAMP(&stm, *this);
+#endif
 
   return true;
 }