From fb888db22e0b4b6ef2ad4e0bef749cab4d812269 Mon Sep 17 00:00:00 2001
From: Janne Koschinski <janne@kuschku.de>
Date: Mon, 14 Jan 2019 12:51:33 +0100
Subject: [PATCH] Fixed DateTimeSerializer

Qt actually has two TimeSpecs, one public and one private and only used
internally. It is this private one that is used to serialize DateTime
objects, though.
---
 .../serializer/DateTimeSerializer.kt          | 30 ++++++++++++-------
 .../serializer/DateTimeSerializerTest.kt      |  2 +-
 2 files changed, 21 insertions(+), 11 deletions(-)

diff --git a/lib/src/main/java/de/kuschku/libquassel/protocol/primitive/serializer/DateTimeSerializer.kt b/lib/src/main/java/de/kuschku/libquassel/protocol/primitive/serializer/DateTimeSerializer.kt
index 39af33ca9..d349868ca 100644
--- a/lib/src/main/java/de/kuschku/libquassel/protocol/primitive/serializer/DateTimeSerializer.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/protocol/primitive/serializer/DateTimeSerializer.kt
@@ -29,10 +29,11 @@ import java.nio.ByteBuffer
 
 object DateTimeSerializer : Serializer<Temporal> {
   enum class TimeSpec(val value: Byte) {
-    LocalTime(0),
-    UTC(1),
-    OffsetFromUTC(2),
-    TimeZone(3);
+    LocalUnknown(-1),
+    LocalStandard(0),
+    LocalDST(1),
+    UTC(2),
+    OffsetFromUTC(3);
 
     companion object {
       private val map = TimeSpec.values().associateBy(TimeSpec::value)
@@ -45,7 +46,7 @@ object DateTimeSerializer : Serializer<Temporal> {
       is LocalDateTime  -> {
         IntSerializer.serialize(buffer, data.getLong(JulianFields.JULIAN_DAY).toInt(), features)
         IntSerializer.serialize(buffer, data.getLong(ChronoField.MILLI_OF_DAY).toInt(), features)
-        ByteSerializer.serialize(buffer, TimeSpec.LocalTime.value, features)
+        ByteSerializer.serialize(buffer, TimeSpec.LocalUnknown.value, features)
       }
       is OffsetDateTime -> {
         IntSerializer.serialize(buffer, data.getLong(JulianFields.JULIAN_DAY).toInt(), features)
@@ -76,16 +77,25 @@ object DateTimeSerializer : Serializer<Temporal> {
     val julianDay = IntSerializer.deserialize(buffer, features).toLong()
     val milliOfDay = IntSerializer.deserialize(buffer, features).toLong()
     val timeSpec = TimeSpec.of(ByteSerializer.deserialize(buffer, features))
+                   ?: TimeSpec.LocalUnknown
     if (milliOfDay == -1L || julianDay == -1L)
       return Instant.EPOCH
     return when (timeSpec) {
-      TimeSpec.LocalTime ->
-        Instant.EPOCH.atZone(ZoneOffset.systemDefault())
+      TimeSpec.LocalStandard,
+      TimeSpec.LocalUnknown,
+      TimeSpec.LocalDST      ->
+        Instant.EPOCH
+          .atZone(ZoneOffset.systemDefault())
           .with(JulianFields.JULIAN_DAY, julianDay)
           .with(ChronoField.MILLI_OF_DAY, milliOfDay)
-          .toInstant()
-      else               ->
-        Instant.EPOCH.atOffset(ZoneOffset.UTC)
+      TimeSpec.OffsetFromUTC ->
+        Instant.EPOCH
+          .atOffset(ZoneOffset.ofTotalSeconds(IntSerializer.deserialize(buffer, features)))
+          .with(JulianFields.JULIAN_DAY, julianDay)
+          .with(ChronoField.MILLI_OF_DAY, milliOfDay)
+      TimeSpec.UTC           ->
+        Instant.EPOCH
+          .atOffset(ZoneOffset.UTC)
           .with(JulianFields.JULIAN_DAY, julianDay)
           .with(ChronoField.MILLI_OF_DAY, milliOfDay)
           .toInstant()
diff --git a/lib/src/test/java/de/kuschku/libquassel/protocol/primitive/serializer/DateTimeSerializerTest.kt b/lib/src/test/java/de/kuschku/libquassel/protocol/primitive/serializer/DateTimeSerializerTest.kt
index 761fcc6ef..cd01454a6 100644
--- a/lib/src/test/java/de/kuschku/libquassel/protocol/primitive/serializer/DateTimeSerializerTest.kt
+++ b/lib/src/test/java/de/kuschku/libquassel/protocol/primitive/serializer/DateTimeSerializerTest.kt
@@ -37,7 +37,7 @@ class DateTimeSerializerTest {
   fun testEpochAtTimezone() {
     val value = Instant.EPOCH.atOffset(ZoneOffset.ofTotalSeconds(1234))
     assertEquals(
-      value.atZoneSimilarLocal(ZoneOffset.UTC).toInstant(),
+      value,
       roundTrip(DateTimeSerializer, value)
     )
   }
-- 
GitLab