// vim: set sw=2: package socket.runtime.ipc import android.net.Uri /** * `Message` is a container for a parsed IPC message (ipc://...) */ open class Message (message: String? = null) { var uri: Uri? = if (message != null) { Uri.parse(message) } else { Uri.parse("ipc://") } var name: String get () = uri?.host ?: "" set (name) { uri = uri?.buildUpon()?.authority(name)?.build() } var domain: String get () { val parts = name.split(".") return parts.slice(0..(parts.size - 2)).joinToString(".") } set (_) {} var value: String get () = get("value") set (value) { set("value", value) } var seq: String get () = get("seq") set (seq) { set("seq", seq) } var bytes: ByteArray? = null fun get (key: String, defaultValue: String = ""): String { val value = uri?.getQueryParameter(key) if (value != null && value.isNotEmpty()) { return value } return defaultValue } fun has (key: String): Boolean { return get(key).isNotEmpty() } fun set (key: String, value: String): Boolean { uri = uri?.buildUpon()?.appendQueryParameter(key, value)?.build() return uri == null } fun delete (key: String): Boolean { if (uri?.getQueryParameter(key) == null) { return false } val params = uri?.queryParameterNames val tmp = uri?.buildUpon()?.clearQuery() if (params != null) { for (param: String in params) { if (!param.equals(key)) { val value = uri?.getQueryParameter(param) tmp?.appendQueryParameter(param, value) } } } uri = tmp?.build() return true } override fun toString(): String { return uri?.toString() ?: "" } }