diff --git a/client/src/main/kotlin/org/hso/texturesyncclient/controller/net/Connection.kt b/client/src/main/kotlin/org/hso/texturesyncclient/controller/net/Connection.kt index f6c2c6a..d4a7eb8 100644 --- a/client/src/main/kotlin/org/hso/texturesyncclient/controller/net/Connection.kt +++ b/client/src/main/kotlin/org/hso/texturesyncclient/controller/net/Connection.kt @@ -2,9 +2,10 @@ package org.hso.texturesyncclient.controller.net import com.google.gson.* import java.io.* -import java.lang.Exception +import java.lang.RuntimeException import java.net.* + @Suppress("MemberVisibilityCanBePrivate") class Connection(val addr: InetAddress, val port: Int = 10796) : Closeable { @@ -42,10 +43,47 @@ class Connection(val addr: InetAddress, val port: Int = 10796) : Closeable { JsonPacket(obj).write(io.second) - when (Packet.read(io.first)) { + val pkg = Packet.read(io.first) + + when (pkg) { is JsonPacket -> return - is ErrorPacket -> throw Exception("TODO") - is BinaryPacket -> throw Exception("TODO") + is BinaryPacket -> throw ConnectionUnexpectedPacket() + is ErrorPacket -> throw ConnectionErrorException(pkg) + else -> throw RuntimeException("Unreachable") + } + } + + fun query(query : Array) : Array { + val io = getStreams() + + val obj = JsonObject() + obj.add("query", { + val inner = JsonObject(); + inner.add("query", { + val array = JsonArray() + for(queryString in query) { + array.add(queryString) + } + array + }()) + inner + }()) + + JsonPacket(obj).write(io.second) + + val pkg = Packet.read(io.first) + + when (pkg) { + is JsonPacket -> { + try { + return Gson().fromJson>(pkg.content, Array::class.java) + } catch (e : JsonSyntaxException ){ + throw ConnectionInvalidJsonException(e) + } + } + is BinaryPacket -> throw ConnectionUnexpectedPacket() + is ErrorPacket -> throw ConnectionErrorException(pkg) + else -> throw RuntimeException("Unreachable") } } diff --git a/client/src/main/kotlin/org/hso/texturesyncclient/controller/net/InternalDataModel.kt b/client/src/main/kotlin/org/hso/texturesyncclient/controller/net/InternalDataModel.kt new file mode 100644 index 0000000..787788c --- /dev/null +++ b/client/src/main/kotlin/org/hso/texturesyncclient/controller/net/InternalDataModel.kt @@ -0,0 +1,14 @@ +package org.hso.texturesyncclient.controller.net + +// These types will be converted to the model.DataModel + +@Suppress("ArrayInDataClass") +data class InternalTexture( + val id : String, + val name : String, + val tags : Array, + val format : String, + val resolution: Array, + val added_on : String, + val texture_hash: String +) \ No newline at end of file diff --git a/client/src/main/kotlin/org/hso/texturesyncclient/controller/net/Packet.kt b/client/src/main/kotlin/org/hso/texturesyncclient/controller/net/Packet.kt index 4b6b531..9be0562 100644 --- a/client/src/main/kotlin/org/hso/texturesyncclient/controller/net/Packet.kt +++ b/client/src/main/kotlin/org/hso/texturesyncclient/controller/net/Packet.kt @@ -1,17 +1,11 @@ package org.hso.texturesyncclient.controller.net -import com.google.gson.JsonObject +import com.google.gson.JsonElement import com.google.gson.JsonParseException import com.google.gson.JsonParser import java.io.DataInputStream import java.io.DataOutputStream import java.io.IOException -import java.lang.Exception - -open class PacketException(msg: String) : Exception(msg) -class PacketTooLongException : PacketException("The Package is too long.") -class PacketInvalidType : PacketException("The Package has an Invalid Type.") -class PacketInvalidData : PacketException("The Package has an Invalid Data. (e.g. Invalid Json.)") abstract class Packet { @@ -81,7 +75,7 @@ abstract class Packet { TYPE_JSON -> { try { - val obj = JsonParser().parse(String(payload)).asJsonObject + val obj = JsonParser().parse(String(payload)) return JsonPacket(obj) } catch (e: JsonParseException) { @@ -103,7 +97,7 @@ abstract class Packet { } -data class JsonPacket(val content: JsonObject) : Packet() { +data class JsonPacket(val content: JsonElement) : Packet() { override fun write(out: DataOutputStream) { val payload = content.toString().toByteArray() // Tag Byte @@ -124,8 +118,8 @@ data class JsonPacket(val content: JsonObject) : Packet() { } } -@Suppress("MemberVisibilityCanBePrivate") -class BinaryPacket(val content: ByteArray) : Packet() { +@Suppress("ArrayInDataClass") +data class BinaryPacket(val content: ByteArray) : Packet() { override fun write(out: DataOutputStream) { // Tag Byte out.writeByte(TYPE_BINARY.toInt()) diff --git a/client/src/main/kotlin/org/hso/texturesyncclient/controller/net/error.kt b/client/src/main/kotlin/org/hso/texturesyncclient/controller/net/error.kt new file mode 100644 index 0000000..7804f55 --- /dev/null +++ b/client/src/main/kotlin/org/hso/texturesyncclient/controller/net/error.kt @@ -0,0 +1,16 @@ +package org.hso.texturesyncclient.controller.net + +import com.google.gson.JsonSyntaxException +import java.lang.Exception + + + +sealed class ConnectionException(val msg : String) : Exception(msg) +class ConnectionErrorException(val error : ErrorPacket) : ConnectionException("${error.code} ${error.message}") +class ConnectionUnexpectedPacket() : ConnectionException("Got Unexpected Type of Packet") +class ConnectionInvalidJsonException(val jsonError : JsonSyntaxException) : ConnectionException("The Format of the Json Received is Unexpected.") + +sealed class PacketException(msg: String) : ConnectionException(msg) +class PacketTooLongException : PacketException("The Package is too long.") +class PacketInvalidType : PacketException("The Package has an Invalid Type.") +class PacketInvalidData : PacketException("The Package has an Invalid Data. (e.g. Invalid Json.)") diff --git a/client/src/main/kotlin/org/hso/texturesyncclient/controller/net/test.kt b/client/src/main/kotlin/org/hso/texturesyncclient/controller/net/test.kt index 1a1f0c9..6f3a6a0 100644 --- a/client/src/main/kotlin/org/hso/texturesyncclient/controller/net/test.kt +++ b/client/src/main/kotlin/org/hso/texturesyncclient/controller/net/test.kt @@ -9,5 +9,14 @@ fun main() { con.ping() + + println("Query:") + for (tex in con.query( + arrayOf("Red", "Food") + )) { + println(tex.toString()) + } + println() + con.close() } \ No newline at end of file